Imports Microsoft.VisualBasic
Imports System.Collections.Generic

Namespace Utilities
    Public Class IPRestriction

        '######################################################################################
        'MODIFICATION   ROD COPELAND    JUNE 30, 2008   ISSUE ID 2366
        '######################################################################################
        'ON CERTAIN MYACCOUNT PAGES WE NEED TO BLOCK CERTAIN IPS FROM CHANGING ANYTHING IN 
        'THE MYACCOUNT SECTION.  THE ONLY EXCEPTION TO THIS AT THIS POINT IS THE LINK TO 
        'THE BILL VENDOR SITE (CHARTEREPAY.APSX).  PEOPLE MAY BE IN A COUNTRY THAT IS 
        'BLACKLISTED, CHARTER STILL WANTS TO COLLECT THEIR PAYMENT MONEY, JUST NOT ALLOW 
        'THE TO CHANGE ANY OF THE MYACCOUNT SETTINGS.
        '######################################################################################
        Function BlockIPFromMyAccountAccess() As Boolean
            Try
                Dim sourceIPAddress As String = Me.getF5SourceIP()
                If sourceIPAddress Is Nothing Then
                    Select Case True
                        Case HttpContext.Current.Request.Url.ToString().ToLower().Contains("cc2uat")
                            '####################################################################
                            'SKIP OVER AS THE F5 PROVIDED SOURCE IP SHOULD BE USED IN THIS CASE
                            '####################################################################
                        Case HttpContext.Current.Request.Url.ToString().ToLower().Contains("charter.com")
                            '####################################################################
                            'SKIP OVER AS THE F5 PROVIDED SOURCE IP SHOULD BE USED IN THIS CASE
                            '####################################################################
                        Case Else
                            '###########################################################################
                            'THIS SHOULD BE WE APPROACHING THE BOXES DIRECTLY, IN THAT CASE, 
                            'WE DONT NEED THE F5 PROVIDED SOURCE IP, JUST USE THE NORMAL REMOTE ADDRESS.
                            '###########################################################################
                            sourceIPAddress = HttpContext.Current.Request.ServerVariables("REMOTE_ADDR")
                    End Select
                End If

                If Not (sourceIPAddress Is Nothing) Then
                    '#################################################################
                    'BUILD THE RESTRICTED IP COLLECTIONS IN THE EVENT THEY DONT EXSIT
                    '#################################################################
                    Select Case True
                        Case System.Web.HttpContext.Current.Application("MYACCOUNT_BLOCKED_FULL_IP_COLLECTION") Is Nothing
                            '######################################################################
                            'LIKELY FIRST TIME THROUGH HERE ONLY, VALUE GETS SET INTERNALLY IN SUB
                            '######################################################################
                            Me.buildSpecificAndRangeBlockedIPCollections()
                        Case System.Web.HttpContext.Current.Application("MYACCOUNT_BLOCKED_FULL_IP_COLLECTION").ToString().ToLower().Trim() = "placeholdervalue"
                            '######################################################################
                            'LIKELY FIRST TIME THROUGH HERE ONLY, VALUE GETS SET INTERNALLY IN SUB
                            '######################################################################
                            Me.buildSpecificAndRangeBlockedIPCollections()
                        Case System.Web.HttpContext.Current.Application("MYACCOUNT_BLOCKED_IP_RANGE_COLLECTION") Is Nothing
                            '######################################################################
                            'LIKELY FIRST TIME THROUGH HERE ONLY, VALUE GETS SET INTERNALLY IN SUB
                            '######################################################################
                            Me.buildSpecificAndRangeBlockedIPCollections()
                        Case System.Web.HttpContext.Current.Application("MYACCOUNT_BLOCKED_IP_RANGE_COLLECTION").ToString().ToLower().Trim() = "placeholdervalue"
                            '######################################################################
                            'LIKELY FIRST TIME THROUGH HERE ONLY, VALUE GETS SET INTERNALLY IN SUB
                            '######################################################################
                            Me.buildSpecificAndRangeBlockedIPCollections()
                        Case Else
                            '######################################
                            'SHOULD HAVE A GOOD VALUE, NO CHANGE
                            '######################################
                    End Select


                    '######################################################################
                    'VALUE GETS SET INTERNALLY IN buildSpecificAndRangeBlockedIPCollections
                    '######################################################################
                    Dim ipRangeCollection As List(Of String) = System.Web.HttpContext.Current.Application("MYACCOUNT_BLOCKED_IP_RANGE_COLLECTION")
                    Dim specificIPCollection As List(Of String) = System.Web.HttpContext.Current.Application("MYACCOUNT_BLOCKED_FULL_IP_COLLECTION")


                    '###########################################
                    'DO A RANGE COMPARISION ON THE SOURCE IP
                    '###########################################
                    If Not (ipRangeCollection Is Nothing) Then
                        If Not (sourceIPAddress Is Nothing) Then
                            If sourceIPAddress.Length > 1 Then
                                Dim startDot As Integer = sourceIPAddress.IndexOf(".")
                                If startDot > 0 Then
                                    If ipRangeCollection.Contains(sourceIPAddress.Substring(0, startDot) & ".") Then
                                        Return True
                                    End If
                                End If
                            End If
                        End If
                    End If

                    '###########################################
                    'DO A DIRECT MATCH ON THE SOURCE IP
                    '###########################################
                    If Not (specificIPCollection Is Nothing) Then
                        If specificIPCollection.Contains(sourceIPAddress) Then
                            Return True
                        End If
                    End If

                End If

            Catch ex As Exception
                '####################################################################################
                'CURRENT STATE, DONT FAIL THE REQUEST JUST BECAUSE THIS FUNCTIONALITY DOESNT WORK.
                '####################################################################################
            End Try



        End Function

        Function getF5SourceIP() As String
            '########################################################################################
            'TO AVOID PICKING UP THE VIP AS THE SOURCE IP, THE F5 IS PASSING ON THE ACTUAL SOURCE 
            'IP IN THE REQUEST HEADER, WE JUST NEED TO USE THIS TO CONDITION OFF OF.
            '########################################################################################
            Dim headerElement() As String = System.Web.HttpContext.Current.Request.Headers.GetValues("X-BigIP-Orig-Src-IP")
            If Not (headerElement Is Nothing) Then
                '################################
                'RETURN VALUE SENT FROM THE F5
                '################################
                Return headerElement(0)
            Else
                Return Nothing
            End If
        End Function

        '######################################################################################
        'MODIFICATION   ROD COPELAND    JUNE 30, 2008   ISSUE ID 2366
        '######################################################################################
        'ON CERTAIN MYACCOUNT PAGES WE NEED TO BLOCK CERTAIN IPS FROM CHANGING ANYTHING IN 
        'THE MYACCOUNT SECTION.  THE ONLY EXCEPTION TO THIS AT THIS POINT IS THE LINK TO 
        'THE BILL VENDOR SITE (CHARTEREPAY.APSX).  PEOPLE MAY BE IN A COUNTRY THAT IS 
        'BLACKLISTED, CHARTER STILL WANTS TO COLLECT THEIR PAYMENT MONEY, JUST NOT ALLOW 
        'THE TO CHANGE ANY OF THE MYACCOUNT SETTINGS.
        '######################################################################################
        Private Sub buildSpecificAndRangeBlockedIPCollections()
            Try
                If System.Web.HttpContext.Current.Application("MYACCOUNT_BLOCKED_IP_LIST") Is Nothing Then
                    Exit Sub
                End If

                Dim IPCollection() As String
                Dim ipRangeCollection As New List(Of String)
                Dim specificIPCollection As New List(Of String)

                '##################################################################################################
                'THIS IS AN EXAMPLE OF WHAT Application("MYACCOUNT_BLOCKED_IP_LIST") VALUE SHOULD BE LOOKING LIKE.
                'THE VALUE IS ADDED ON APPLICATION START FROM THE CONFIG TABLE.
                '25:*,41:*,43:*,51:*,58:*,218:*,219:*,220:*,221:*,222:*,25.168.162.87,25.168.162.89
                '##################################################################################################
                '25:* INDICATES THE RANGE OF 25.0.0.0 TO 25.255.255.255 SHOULD BE BLOCKED FOR EXAMPLE.
                'EACH RANGE OR IP IS COMMA DELIMITED
                '25.168.162.87 IS JUST AN IP TO BLOCK FOR EXAMPLE.
                '##################################################################################################
                Dim fullIPList As String = System.Web.HttpContext.Current.Application("MYACCOUNT_BLOCKED_IP_LIST")

                IPCollection = fullIPList.Split(",")
                For i As Integer = 0 To IPCollection.GetUpperBound(0)
                    Dim IPRange() As String = IPCollection(i).Split(":")

                    If IPRange.Length > 1 Then
                        If IPRange(1).Contains("*") Then
                            '#################################################
                            'DO A GENERAL CHECK WITH IN THE FIRST SET OF NUMBERS OF IP
                            '#################################################
                            ipRangeCollection.Add(IPRange(0).Trim() & ".")
                        Else
                            '##################################
                            'ADD SPECIFIC IP TO THE COLLECTION
                            '##################################
                            specificIPCollection.Add(IPRange(0).Trim())
                        End If
                    Else
                        '##################################
                        'ADD SPECIFIC IP TO THE COLLECTION
                        '##################################
                        specificIPCollection.Add(IPRange(0).Trim())
                    End If
                Next

                '###########################################
                'PERSIST THE SPECIFIC BLOCKED IPs COLLECTION
                '###########################################
                System.Web.HttpContext.Current.Application("MYACCOUNT_BLOCKED_FULL_IP_COLLECTION") = specificIPCollection

                '###########################################
                'PERSIST THE RANGE OF BLOCKED IPs COLLECTION
                '###########################################
                System.Web.HttpContext.Current.Application("MYACCOUNT_BLOCKED_IP_RANGE_COLLECTION") = ipRangeCollection

            Catch ex As Exception
                '####################################################################################
                'CURRENT STATE, DONT FAIL THE REQUEST JUST BECAUSE THIS FUNCTIONALITY DOESNT WORK.
                '####################################################################################
            End Try

        End Sub

    End Class

    Public Class CPNIPageRedirection
        Function ForceMyAccountUpdate(ByVal lRequestURL As String) As Boolean
            '###########################################################################################
            'THESE CONDITIONS OF FORCING AN UPDATE WITHOUT GOING TO ANY OTHER PAGE ONLY APPLIES 
            'TO MYACCOUNT PAGES, THE USER SHOULD BE ABLE TO NAVIGATE TO THE HOME PAGE AND SUPPORT 
            'PAGES FOR EXAMPLE.  UNTIL CARE SAYES OTHERWISE.
            '###########################################################################################
            If lRequestURL.ToLower().Contains("account/charterepay.aspx") Then Return True
            If lRequestURL.ToLower().Contains("account/checkout.aspx") Then Return True
            If lRequestURL.ToLower().Contains("account/highspeedsecurity.aspx") Then Return True
            If lRequestURL.ToLower().Contains("account/manageemailaccounts.aspx") Then Return True
            If lRequestURL.ToLower().Contains("account/managelogin.aspx") Then Return True
            If lRequestURL.ToLower().Contains("account/managewebspace.aspx") Then Return True
            If lRequestURL.ToLower().Contains("account/myaccount.aspx") Then Return True
            If lRequestURL.ToLower().Contains("account/mywebspace.aspx") Then Return True
            If lRequestURL.ToLower().Contains("account/quickpay.aspx") Then Return True
            If lRequestURL.ToLower().Contains("account/upgrades.aspx") Then Return True
            If lRequestURL.ToLower().Contains("account/internettools.aspx") Then Return True

            Return False

        End Function
    End Class

End Namespace

