commit 249ae5818b2201e01fec41260883cace18b79ddd Author: Claus Isager Date: Fri Mar 27 08:39:50 2015 +0100 Imported Claus Isager's CICRadarR diff --git a/CICRadarR.sln b/CICRadarR.sln new file mode 100644 index 0000000..1aca4ac --- /dev/null +++ b/CICRadarR.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "CICRadarR", "CICRadarR\CICRadarR.vbproj", "{04C6C533-9FEA-41B2-B554-A166C7C7FE32}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {04C6C533-9FEA-41B2-B554-A166C7C7FE32}.Debug|x86.ActiveCfg = Debug|x86 + {04C6C533-9FEA-41B2-B554-A166C7C7FE32}.Debug|x86.Build.0 = Debug|x86 + {04C6C533-9FEA-41B2-B554-A166C7C7FE32}.Release|x86.ActiveCfg = Release|x86 + {04C6C533-9FEA-41B2-B554-A166C7C7FE32}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/CICRadarR.suo b/CICRadarR.suo new file mode 100644 index 0000000..8efd3e1 Binary files /dev/null and b/CICRadarR.suo differ diff --git a/CICRadarR/CICRadarR.Designer.vb b/CICRadarR/CICRadarR.Designer.vb new file mode 100644 index 0000000..d08ba86 --- /dev/null +++ b/CICRadarR/CICRadarR.Designer.vb @@ -0,0 +1,60 @@ +Imports System.ServiceProcess + + _ +Partial Class CICRadarR + Inherits System.ServiceProcess.ServiceBase + + 'UserService overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + ' The main entry point for the process + _ + _ + Shared Sub Main() + Dim ServicesToRun() As System.ServiceProcess.ServiceBase + + ' More than one NT Service may run within the same process. To add + ' another service to this process, change the following line to + ' create a second service object. For example, + ' + ' ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService} + ' + ServicesToRun = New System.ServiceProcess.ServiceBase() {New CICRadarR} + + System.ServiceProcess.ServiceBase.Run(ServicesToRun) + End Sub + + 'Required by the Component Designer + Private components As System.ComponentModel.IContainer + + ' NOTE: The following procedure is required by the Component Designer + ' It can be modified using the Component Designer. + ' Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.TimerCleanUpHash = New System.Timers.Timer() + CType(Me.TimerCleanUpHash, System.ComponentModel.ISupportInitialize).BeginInit() + ' + 'TimerCleanUpHash + ' + Me.TimerCleanUpHash.Enabled = True + Me.TimerCleanUpHash.Interval = 60000.0R + ' + 'CICRadarR + ' + Me.ServiceName = "Service1" + CType(Me.TimerCleanUpHash, System.ComponentModel.ISupportInitialize).EndInit() + + End Sub + Friend WithEvents TimerCleanUpHash As System.Timers.Timer + +End Class diff --git a/CICRadarR/CICRadarR.resx b/CICRadarR/CICRadarR.resx new file mode 100644 index 0000000..ed70530 --- /dev/null +++ b/CICRadarR/CICRadarR.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + False + + \ No newline at end of file diff --git a/CICRadarR/CICRadarR.suo b/CICRadarR/CICRadarR.suo new file mode 100644 index 0000000..41b922e Binary files /dev/null and b/CICRadarR/CICRadarR.suo differ diff --git a/CICRadarR/CICRadarR.vb b/CICRadarR/CICRadarR.vb new file mode 100644 index 0000000..9a53e96 --- /dev/null +++ b/CICRadarR/CICRadarR.vb @@ -0,0 +1,1174 @@ +Imports System.DirectoryServices +Imports System.IO +Imports System.Reflection +Imports CICRadarR.SMS +Imports CICRadarR.LogFile +Imports System.Security.Cryptography +Imports System.Text +Imports System +Imports System.Net.Mail + +Public Class CICRadarR + + Private DEBUG As Boolean + Private EnableOTP As Boolean + Private Log As New LogWriter + Private UserAccessLog As New LogWriter + Private secrets As NASAuthList + Private radius1812 As RADIUSServer + Private radius1645 As RADIUSServer + Private userHash As New Hashtable + Private packetHash As New Hashtable + Private clientHash As New Hashtable + Private NetBiosDomain As String = "" + Private LDAPDomain As String = "" + Private Provider As String = "" + Private ADField As String = "" + Private ADMailField As String = "" + Private ModemType As String = "" + Private ComPort As String = "" + Private SmsC As String = "" + Private MailServer As String = "" + Private SenderEmail As String = "" + Private encCode As String = "gewsyy#sjs2!" + Private TSGW As String = "" + Private TSGWSessionIdHash As New Hashtable + Private TSGWSessionIdTimeStampHash As New Hashtable + Private TSGWLaunchIdTimeStampHash As New Hashtable + Private TSGWFirstLoginHash As New Hashtable ' Ensure that only one sms is send even if radius need to re-authenticate. + Private TSGWFirstLoginTimeStampHash As New Hashtable ' Ensure that only one sms is send even if radius need to re-authenticate. + Private SessionTimeOut As Integer = 30 ' in minutes + Private LaunchTimeOut As Integer = 30 ' in seconds + Private EnableSMS As Boolean = False + Private EnableEmail As Boolean = False + + + Protected Overrides Sub OnStart(ByVal args() As String) + + Log.filePath = ApplicationPath() & "\log.txt" + UserAccessLog.filePath = ApplicationPath() & "\UserAccessLog.txt" + + Log.WriteLog("---------------------------------------------------------------------------------------------------") + Log.WriteLog(Now & ":" & "Starting Service") + + Log.WriteLog(Now & ":" & "Loading Configuration...") + Call loadConfiguration() + Log.WriteLog(Now & ":" & "Starting Radius listner ports...") + Call StartUpServer() + End Sub + + Public Sub OnstartTest() + Log.filePath = ApplicationPath() & "\log.txt" + UserAccessLog.filePath = ApplicationPath() & "\UserAccessLog.txt" + + Log.WriteLog("---------------------------------------------------------------------------------------------------") + Log.WriteLog(Now & ":" & "Starting Service") + + Log.WriteLog(Now & ":" & "Loading Configuration...") + Call loadConfiguration() + Log.WriteLog(Now & ":" & "Starting Radius listner ports...") + Call StartUpServer() + End Sub + + Protected Overrides Sub OnStop() + Log.WriteLog(Now & ":" & "Stopping Radius listner ports...") + + End Sub + + Public Sub OnStopTest() + Log.WriteLog(Now & ":" & "Stopping Radius listner ports...") + + End Sub + + Public Sub StartUpServer() + + ' First, let's load a list of RADIUS shared secrets + ' in a NASAuthList object (a glorified Dictionary, basically) + secrets = New NASAuthList + ' Populate from DB, I suppose ... + + For Each cl As DictionaryEntry In clientHash + Log.WriteLog(Now & ":" & "Adding Shared Secret to Radius Server") + secrets.AddSharedSecret(cl.Key, cl.Value) + Next + ' Then, we just create a RADIUS server ... + Try + Log.WriteLog(Now & ":" & "Starting Radius Server on Port 1812...") + radius1812 = New RADIUSServer(1812, AddressOf ProcessPacket1812, secrets) + Log.WriteLog(Now & ":" & "Starting Radius Server on Port 1812...OK") + Catch + Log.WriteLog(Now & ":" & "Starting Radius Server on Port 1812...FAILED") + + End Try + + Try + Log.WriteLog(Now & ":" & "Starting Radius Server on Port 1645...") + radius1645 = New RADIUSServer(1645, AddressOf ProcessPacket1645, secrets) + Log.WriteLog(Now & ":" & "Starting Radius Server on Port 1645...OK") + Catch + Log.WriteLog(Now & ":" & "Starting Radius Server on Port 1645...FAILED") + + End Try + + + + + + End Sub + + + ' Every valid RADIUS request generated by the server(s) we created earlier + ' will fire up the callback procedure. Invalid requests are dropped, per RFC. + Private Sub ProcessPacket1812(ByVal packet As RADIUSPacket) + 'Console.WriteLine("packet " & Now) + ProcessPacket(radius1812, packet) + End Sub + + Private Sub ProcessPacket1645(ByVal packet As RADIUSPacket) + ProcessPacket(radius1645, packet) + End Sub + + + + Private Sub ProcessPacket(ByVal server As RADIUSServer, ByVal packet As RADIUSPacket) + Dim muuh As New VendorSpecificAttribute(VendorSpecificType.Generic, "LAUNCH") + + Dim atts As New RADIUSAttributes + muuh.SetRADIUSAttribute(atts) + + + 'For i As Integer = 0 To muuh. + ' Dim att As RADIUSAttribute + ' att = atts(i) + ' Dim ged As String + ' ged = att.GetVendorSpecific().VendorValue.ToString() + + + 'Next + + ' Dim att As New VendorSpecificAttribute(VendorSpecificType.Generic, "LAUNCH") + + ' Dim ost As New RADIUSAttribute(RadiusAttributeType.VendorSpecific, att.VendorName & att.VendorType & att.VendorValue) + If TSGW = "1" Then + ProcessPacketTSGW(server, packet) + Else + ProcessPacketCSG(server, packet) + End If + End Sub + + + Sub ProcessPacketTSGW(ByVal server As RADIUSServer, ByVal packet As RADIUSPacket) + + ' Let's take a look at just authentication requests, + ' and drop other requests silently ... + + If packet.Code <> RadiusPacketCode.AccessRequest Then + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Not a valid radius packet.. Drop!") + + End If + Exit Sub + Else + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Radius packet recived") + End If + End If + + Dim LaunchApp As String = "" + Dim launchTSGW As String = "" + If packet.Attributes.AttributeExists(RadiusAttributeType.VendorSpecific) Then + Dim VSAtt As RADIUSAttribute = packet.Attributes.GetFirstAttribute(RadiusAttributeType.VendorSpecific) + Dim VSAtts As RADIUSAttributes = packet.Attributes.GetAllAttributes(RadiusAttributeType.VendorSpecific) + For Each atts As RADIUSAttribute In VSAtts + 'Dim opt As String = atts.GetHex().Trim + 'Console.WriteLine(atts.GetVendorSpecific.VendorValue.ToString) + 'Select Case opt + ' Case "4C 41 55 4E 43 48" ' ok, I was lasy. Need to write code to resolve value in (26) Vendor specific. + ' LaunchApp = "LAUNCH" + ' Case "00 00 01 37 2F 06 00 00 00 01" + ' launchTSGW = "LAUNCH" + 'End Select + 'Console.WriteLine(atts.GetHex()) + + Dim opt As String = atts.GetVendorSpecific.VendorValue.ToString + + Select Case UCase(opt) + Case "LAUNCH" + LaunchApp = "LAUNCH" + Case "TSGATEWAY" + launchTSGW = "LAUNCH" + End Select + Next + ' LaunchApp = VSAtt.GetString + End If + + ' Let's see if we have a username present ... + Dim username As RADIUSAttribute = packet.Attributes.GetFirstAttribute(RadiusAttributeType.UserName) + Dim pass As RADIUSAttribute = packet.Attributes.GetFirstAttribute(RadiusAttributeType.UserPassword) + + + If LaunchApp = "LAUNCH" Then ' handle RadiusSession when application launches. Store it and check when connection is made through TS Gateway + + Dim sRadiusSessionId = packet.UserPassword + Dim attributes As New RADIUSAttributes + Dim SessionId_Ok As Boolean = False + Dim sUserName As String = username.GetString.ToLower + + If TSGWSessionIdHash.Contains(sUserName) And TSGWSessionIdTimeStampHash.Contains(sUserName) Then ' user has a session lets check if it valid + Dim hashTime As DateTime = DirectCast(TSGWSessionIdTimeStampHash(sUserName), DateTime) + Dim tValid = DateDiff(DateInterval.Minute, hashTime, Now) + If tValid < SessionTimeOut Then + ' check session id + If sRadiusSessionId = DirectCast(TSGWSessionIdHash(sUserName), String) Then ' Session id match + SessionId_Ok = True ' Session ok now add launch hash key + If TSGWLaunchIdTimeStampHash.Contains(sUserName) Then + TSGWLaunchIdTimeStampHash(sUserName) = Now + Else + TSGWLaunchIdTimeStampHash.Add(sUserName, Now) + End If + Console.WriteLine(sUserName) + End If + End If + + End If + + If SessionId_Ok Then ' found match in hash table' Return ok + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessAccept, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + Else + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessReject, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + End If + + + ElseIf launchTSGW = "LAUNCH" Then ' TSGateWay Connection + Dim sRadiusSessionId = packet.UserPassword + Dim attributes As New RADIUSAttributes + Dim proxyState As String + Dim LaunchId_Ok As Boolean = False + Dim sUserName As String = username.GetString.ToLower + + Dim existProxyState As Boolean = packet.Attributes.AttributeExists(RadiusAttributeType.ProxyState) + If existProxyState = True Then + proxyState = packet.Attributes.GetFirstAttribute(RadiusAttributeType.ProxyState).GetString + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Packet contains a state attribute ProxyState=" & proxyState) + End If + attributes.Add(packet.Attributes.GetFirstAttribute(RadiusAttributeType.ProxyState)) + End If + + 'Check launchHash to see if user hash a valid launch window (default 30 sec.) + Console.WriteLine(sUserName) + If TSGWLaunchIdTimeStampHash.Contains(sUserName) = True Then ' user has a launch id lets check if it valid + Dim hashTime As DateTime = DirectCast(TSGWLaunchIdTimeStampHash(sUserName), DateTime) + Dim tValid = DateDiff(DateInterval.Second, hashTime, Now) + If tValid < LaunchTimeOut Then + LaunchId_Ok = True ' Launch ok now add launch hash key + TSGWLaunchIdTimeStampHash.Remove(sUserName) + End If + End If + + + + If LaunchId_Ok Then ' found match in hash table' Return ok + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessAccept, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + Else + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessReject, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + End If + + Else + Dim sid As String = "" + Dim mobile As String = "" + Dim email As String = "" + Dim smsCode As String = "" + + + + ' If an attribute of a particular type is not found, the function + ' will return Nothing. + If username Is Nothing Then + ' Technically, this case is against RFC, so ... drop. + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Not a valid radius packet.. No username pressent.. Drop!") + End If + Exit Sub + End If + + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Processing packet for user: " & username.GetString) + End If + + + Dim existState As Boolean = packet.Attributes.AttributeExists(RadiusAttributeType.State) + Dim existProxyState As Boolean = packet.Attributes.AttributeExists(RadiusAttributeType.ProxyState) + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Packet contains a state attribute? State=" & existState.ToString) + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Packet contains a proxy-state attribute? Proxy-State=" & existState.ToString) + End If + + If existState = True Then ' Ok we have at packet with the State attribute set. Check if we can identify the authtentication packet. (User provides the sms token) + Dim state As String + Dim proxyState As String + + state = packet.Attributes.GetFirstAttribute(RadiusAttributeType.State).GetString + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Packet contains a state attribute State=" & state) + End If + + + If existProxyState = True Then + proxyState = packet.Attributes.GetFirstAttribute(RadiusAttributeType.ProxyState).GetString + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Packet contains a state attribute State=" & proxyState) + End If + End If + + + Dim UserDomain As String = "" + 'lets see if user login using upd or UPN name + Dim sUserName As String = username.GetString.ToLower + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Username = " & sUserName) + End If + Dim sPassword As String = packet.UserPassword + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: SMSToken supplied by the user = " & sPassword) + End If + sid = "" + If InStr(sUserName, "@") > 0 Then 'UPN + UserDomain = sUserName + Else 'UPD + 'read domain from Hashtable + UserDomain = sUserName + End If + + sid = EncDec.Encrypt(UserDomain & "_" & packet.UserPassword, encCode) + + Dim attributes As New RADIUSAttributes + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Checking for userHash " & sid) + End If + + If sid = state Then ' All good allow user access to the Web Interface + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: State and Sid match. Sending accept packet to Netscaler") + End If + If existProxyState = True Then + attributes.Add(packet.Attributes.GetFirstAttribute(RadiusAttributeType.ProxyState)) + End If + + + Dim sGUID As String + sGUID = System.Guid.NewGuid.ToString() + + ' Add the user and guid to the access master list. This hash will be chech each time an application is launched. This prevents access through TS gateway without going through the Webinterface first. + + If TSGWSessionIdHash.Contains(UserDomain) Then + TSGWSessionIdHash(UserDomain) = sGUID + Else + TSGWSessionIdHash.Add(UserDomain, sGUID) + End If + + If TSGWSessionIdTimeStampHash.Contains(UserDomain) Then + TSGWSessionIdTimeStampHash(UserDomain) = Now + Else + TSGWSessionIdTimeStampHash.Add(UserDomain, Now) + End If + + + + Dim guidAttribute As New RADIUSAttribute(RadiusAttributeType.ReplyMessage, sGUID) + attributes.Add(guidAttribute) + ' send accept packet to the user + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessAccept, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + UserAccessLog.WriteLog(Now & ":" & "User " & UserDomain & " has successfully authenticated with Token") + Else + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: State and Sid does not match. Sending reject packet to Netscaler") + End If + + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessReject, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + UserAccessLog.WriteLog(Now & ":" & "User " & UserDomain & " has failed to authenticate. Incorrect Token") + + End If + + If TSGWFirstLoginTimeStampHash.Contains(UserDomain) Then ' Clean first login hash table + TSGWFirstLoginTimeStampHash.Remove(UserDomain) + TSGWFirstLoginHash.Remove(UserDomain) + End If + + Else ' process the first login (sending sms token) + + + + 'Now lets get some information from ad if password is valid + Dim success As Boolean = False + Dim UserDomain As String = "" + 'lets see if user login using upd or UPN name + Dim sUserName As String = username.GetString.ToLower + Dim sPassword As String = packet.UserPassword + If InStr(sUserName, "@") > 0 Then 'UPN + UserDomain = sUserName + Else 'UPD + 'read domain from Hashtable + ' UserDomain = NetBiosDomain & "\" & sUserName + UserDomain = sUserName + End If + + UserAccessLog.WriteLog(Now & ":" & "User " & UserDomain & " is trying to log in ...") + + + Try + Dim dirEntry As New DirectoryEntry("LDAP://" & LDAPDomain, UserDomain, sPassword) + + Dim obj As Object = dirEntry.NativeObject + Dim search As New DirectorySearcher(dirEntry) + + If InStr(sUserName, "@") > 0 Then + search.Filter = "(userPrincipalName=" + sUserName + ")" + Else + search.Filter = "(SAMAccountName=" + Split(sUserName, "\")(1) + ")" + End If + 'Load the Properties we need from AD + search.PropertiesToLoad.Add("distinguishedName") + 'search.PropertiesToLoad.Add("primaryTelexNumber") + If EnableOTP = True Then + search.PropertiesToLoad.Add(ADField) + search.PropertiesToLoad.Add(ADMailField) + End If + ' Time to find out if user entered the correct username and pasword + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Trying to authenticate user agains Active Directory using te following parameters: " & "LDAPPAth: " & "LDAP://" & LDAPDomain & ", Username: " & UserDomain & ", Password: " & sPassword) + End If + Dim result As SearchResult = search.FindOne() + 'Get the setting form AD. Yes we uses the field primaryTelexNumber, for who the f... still users telex. (I bet half the people reading this code don't even know what a telex is!) + 'Dim code As String = DirectCast(result.Properties("primaryTelexNumber")(0), String) + 'Dim aCode As String() = code.Split("/") + + 'Dim userLdap As String = "LDAP://" & LDAPPath & "/" & result.Properties("distinguishedName")(0) + 'Dim userEntry As New DirectoryEntry(userLdap, UserDomain, sPassword) + If EnableOTP = True Then + ' smsCode = GenerateCode() + + ' REMEMBER to put at check for empty phone string + Try + If EnableSMS = True Then + mobile = DirectCast(result.Properties(ADField)(0), String) + mobile = Replace(mobile, "+", "") + If mobile.Trim.Length = 0 Then + success = False + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Unable to find correct phone number for user " & UserDomain) + End If + Else + success = True + End If + End If + + If EnableEmail = True Then + email = DirectCast(result.Properties(ADMailField)(0), String) + + If InStr(email, "@") = 0 Then + success = False + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Unable to find correct email for user " & UserDomain) + End If + Else + success = True + End If + End If + Catch + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Unable to find correct phone number or email for user " & UserDomain) + End If + success = False + End Try + + + ' sid = EncDec.Encrypt(UserDomain & "_" & smsCode, encCode) 'generate unique code + Else + + End If + ' sid = UserDomain & "_" & smsCode + 'userEntry.Properties("primaryTelexNumber").Value = aCode(0) & "/" & smsCode & "/" & aCode(2) & "/" & aCode(3) + 'userEntry.CommitChanges() + 'userEntry.Dispose() + If 1 = 1 Then ' check if smscode is disabled for the user (Need to write this code) + 'If userHash.ContainsKey(sid) Then + ' userHash(sid) = sPassword + ' If DEBUG = True Then + ' UserAccessLog.WriteLog(Now & ":" & "DEBUG: Updating userHash " & sid) + ' End If + 'Else + ' userHash.Add(sid, sPassword) + ' If DEBUG = True Then + ' UserAccessLog.WriteLog(Now & ":" & "DEBUG: Adding userHash " & sid) + ' End If + 'End If + ' new code stored in AD now send it to the users phone + ' Console.WriteLine(smsCode) + + success = True + Else + success = False + End If + Catch + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Failed to authenticate user agains Active Directory using the following parameters: " & "LDAPPAth: " & "LDAP://" & LDAPDomain & ", Username: " & UserDomain & ", Password: " & sPassword) + End If + success = False + 'Console.WriteLine("fu...") + 'Console.WriteLine(ex.Message) + End Try + + + + Dim attributes As New RADIUSAttributes + If success Then ' Yay! Someone guess the password ... + Dim sendType As String = "" + UserAccessLog.WriteLog(Now & ":" & "User " & UserDomain & " authenticated agains Active Directory") + If EnableOTP = True Then + If packet.Attributes.AttributeExists(RadiusAttributeType.VendorSpecific) Then + Dim VSAtts As RADIUSAttributes = packet.Attributes.GetAllAttributes(RadiusAttributeType.VendorSpecific) + For Each atts As RADIUSAttribute In VSAtts + + Dim opt As String = atts.GetVendorSpecific.VendorValue.ToString + + Select Case UCase(opt) + Case "SMS" + sendType = "SMS" + Case "EMAIL" + sendType = "EMAIL" + End Select + Next + Else + sendType = "SMS" + End If + + If TSGWFirstLoginTimeStampHash.Contains(UserDomain) Then + Dim hTime As DateTime = DirectCast(TSGWFirstLoginTimeStampHash(UserDomain), DateTime) + Dim tValid = DateDiff(DateInterval.Second, hTime, Now) + If tValid >= 5 Then + TSGWFirstLoginTimeStampHash.Remove(UserDomain) + TSGWFirstLoginHash.Remove(UserDomain) + End If + End If + + If TSGWFirstLoginHash.Contains(UserDomain) Then + sid = TSGWFirstLoginHash(UserDomain).ToString + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Access token already send to phonenumber " & mobile) + End If + Else + smsCode = GenerateCode() + sid = EncDec.Encrypt(UserDomain & "_" & smsCode, encCode) 'generate unique code + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Sending access token: " & smsCode & " to phonenumber " & mobile) + End If + TSGWFirstLoginHash.Add(UserDomain, sid) + TSGWFirstLoginTimeStampHash.Add(UserDomain, Now) + + + If sendType = "SMS" Then + Call SendSMS(mobile, smsCode) + Else + Call SendEmail(email, smsCode) + End If + End If + + Dim attr As New RADIUSAttribute(RadiusAttributeType.ReplyMessage, "SMS Token") + attributes.Add(attr) + Dim state As New RADIUSAttribute(RadiusAttributeType.State, sid) + ' Dim state As New RADIUSAttribute(RadiusAttributeType.State, "julegris") ' test + attributes.Add(state) + ' Console.WriteLine("len " & packet.Authenticator.Length.ToString) + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessChallenge, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + ' If DEBUG = True Then + 'UserAccessLog.WriteLog(Now & ":" & "DEBUG: Sending access token: " & smsCode & " to phonenumber " & mobile) + 'End If + ' Call SendSMS(mobile, smsCode) + ' Console.WriteLine(smsCode) + Else ' One time Password not enabled, so we let the user in + ' add session key so user can access applications. + + Dim sGUID As String + sGUID = System.Guid.NewGuid.ToString() + If TSGWSessionIdHash.Contains(UserDomain) Then + TSGWSessionIdHash(UserDomain) = sGUID + Else + TSGWSessionIdHash.Add(UserDomain, sGUID) + End If + + If TSGWSessionIdTimeStampHash.Contains(UserDomain) Then + TSGWSessionIdTimeStampHash(UserDomain) = Now + Else + TSGWSessionIdTimeStampHash.Add(UserDomain, Now) + End If + + Dim guidAttribute As New RADIUSAttribute(RadiusAttributeType.ReplyMessage, sGUID) + attributes.Add(guidAttribute) + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessAccept, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + + End If + ' packetHash.Remove(username.GetString & "_" & pass.GetString) + Else ' Wrong username / password ... + + UserAccessLog.WriteLog(Now & ":" & "User " & UserDomain & " failed to authenticate agains Active Directory") + Dim pk As New RADIUSPacket(RadiusPacketCode.AccessReject, packet.Identifier, Nothing, packet.EndPoint) + server.SendAsResponse(pk, packet.Authenticator) + ' FYI ... if no additional attributes need to be added + ' to the response, you can sepcify Nothing instead of + ' creating an empty RADIUSAttributes object. + ' packetHash.Remove(username.GetString & "_" & pass.GetString) + End If + + + + End If + End If + + End Sub + + + + Private Sub ProcessPacketCSG(ByVal server As RADIUSServer, ByVal packet As RADIUSPacket) + + ' Let's take a look at just authentication requests, + ' and drop other requests silently ... + + If packet.Code <> RadiusPacketCode.AccessRequest Then + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Not a valid radius packet.. Drop!") + End If + Exit Sub + + End If + + + + ' Let's see if we have a username present ... + Dim username As RADIUSAttribute = packet.Attributes.GetFirstAttribute(RadiusAttributeType.UserName) + Dim pass As RADIUSAttribute = packet.Attributes.GetFirstAttribute(RadiusAttributeType.UserPassword) + Dim sid As String = "" + Dim mobile As String = "" + Dim smsCode As String = "" + Dim UserEmail As String = "" + + + ' If an attribute of a particular type is not found, the function + ' will return Nothing. + If username Is Nothing Then + ' Technically, this case is against RFC, so ... drop. + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Not a valid radius packet.. No username pressent.. Drop!") + End If + Exit Sub + End If + + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Processing packet for user: " & username.GetString) + End If + + 'If packetHash.ContainsKey(username.GetString & "_" & pass.GetString) Then + ' Exit Sub + 'End If + + + + Dim existState As Boolean = packet.Attributes.AttributeExists(RadiusAttributeType.State) + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Packet contains a state attribute? State=" & existState.ToString) + End If + If existState = True Then ' Ok we have at packet with the State attribute set. Check if we can identify the authtentication packet. + Dim state As String = packet.Attributes.GetFirstAttribute(RadiusAttributeType.State).GetString + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Packet contains a state attribute State=" & state) + End If + Dim UserDomain As String = "" + 'lets see if user login using upd or UPN name + Dim sUserName As String = username.GetString + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Username = " & sUserName) + End If + Dim sPassword As String = packet.UserPassword + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: SMSToken supplied by the user = " & sPassword) + End If + sid = "" + If InStr(sUserName, "@") > 0 Then 'UPN + UserDomain = sUserName + Else 'UPD + 'read domain from Hashtable + UserDomain = NetBiosDomain & "\" & sUserName + End If + + sid = EncDec.Encrypt(UserDomain & "_" & packet.UserPassword, encCode) + ' sid = UserDomain & "_" & packet.UserPassword + Dim attributes As New RADIUSAttributes + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Checking for userHash " & sid) + End If + If sid = state Then + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: State and Sid match. Sending accept packet to Netscaler") + End If + + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessAccept, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + UserAccessLog.WriteLog(Now & ":" & "User " & UserDomain & " has successfully authenticated with Token") + Else + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: State and Sid does not match. Sending reject packet to Netscaler") + End If + + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessReject, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + UserAccessLog.WriteLog(Now & ":" & "User " & UserDomain & " has failed to authenticate. Incorrect Token") + + End If + Else ' process the first login + + ' packetHash.Add(username.GetString & "_" & pass.GetString, 0) + + ' Console.WriteLine(username.GetString & " is trying to log in ... ") + ' Note that an attribute can represent a string, number, IP, etc. + ' RADAR will not guess that automatically, so use the appropriate + ' function according to the attribute you're trying to read. Otherwise, + ' the Value property is just a bunch of bytes as received in the + ' RADIUS packet. + + + 'Now lets get some information from ad if password is valid + Dim success As Boolean = False + Dim UserDomain As String = "" + 'lets see if user login using upd or UPN name + Dim sUserName As String = username.GetString + Dim sPassword As String = packet.UserPassword + If InStr(sUserName, "@") > 0 Then 'UPN + UserDomain = sUserName + Else 'UPD + 'read domain from Hashtable + UserDomain = NetBiosDomain & "\" & sUserName + End If + + UserAccessLog.WriteLog(Now & ":" & "User " & UserDomain & " is trying to log in ...") + + + + Try + Dim dirEntry As New DirectoryEntry("LDAP://" & LDAPDomain, UserDomain, sPassword) + + Dim obj As Object = dirEntry.NativeObject + Dim search As New DirectorySearcher(dirEntry) + + If InStr(sUserName, "@") > 0 Then + search.Filter = "(userPrincipalName=" + sUserName + ")" + Else + search.Filter = "(SAMAccountName=" + sUserName + ")" + End If + 'Load the Properties we need from AD + search.PropertiesToLoad.Add("distinguishedName") + 'search.PropertiesToLoad.Add("primaryTelexNumber") + If EnableOTP = True Then + If EnableEmail = True Then + search.PropertiesToLoad.Add(ADMailField) + End If + If EnableSMS = True Then + search.PropertiesToLoad.Add(ADField) + End If + + End If + ' Time to find out if user entered the correct username and pasword + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Trying to authenticate user agains Active Directory using te following parameters: " & "LDAPPAth: " & "LDAP://" & LDAPDomain & ", Username: " & UserDomain & ", Password: " & sPassword) + End If + Dim result As SearchResult = search.FindOne() + 'Get the setting form AD. Yes we uses the field primaryTelexNumber, for who the f... still users telex. (I bet half the people reading this code don't even know what a telex is!) + 'Dim code As String = DirectCast(result.Properties("primaryTelexNumber")(0), String) + 'Dim aCode As String() = code.Split("/") + + 'Dim userLdap As String = "LDAP://" & LDAPPath & "/" & result.Properties("distinguishedName")(0) + 'Dim userEntry As New DirectoryEntry(userLdap, UserDomain, sPassword) + If EnableOTP = True Then + smsCode = GenerateCode() + + ' REMEMBER to put at check for empty phone string + If EnableEmail = True Then + Try + UserEmail = DirectCast(result.Properties(ADMailField)(0), String) + + If UserEmail.Trim.Length = 0 Or InStr(UserEmail, "@") = 0 Then + success = False + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Unable to find correct email for user " & UserDomain) + End If + Else + success = True + End If + Catch + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Unable to find correct email for user " & UserDomain) + End If + success = False + End Try + End If + If EnableSMS = True Then + Try + mobile = DirectCast(result.Properties(ADField)(0), String) + mobile = Replace(mobile, "+", "") + If mobile.Trim.Length = 0 Then + success = False + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Unable to find correct phone number for user " & UserDomain) + End If + Else + success = True + End If + Catch + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Unable to find correct phone number for user " & UserDomain) + End If + success = False + End Try + + End If + + sid = EncDec.Encrypt(UserDomain & "_" & smsCode, encCode) 'generate unique code + End If + ' sid = UserDomain & "_" & smsCode + 'userEntry.Properties("primaryTelexNumber").Value = aCode(0) & "/" & smsCode & "/" & aCode(2) & "/" & aCode(3) + 'userEntry.CommitChanges() + 'userEntry.Dispose() + If 1 = 1 Then ' check if smscode is disabled for the user (Need to write this code) + 'If userHash.ContainsKey(sid) Then + ' userHash(sid) = sPassword + ' If DEBUG = True Then + ' UserAccessLog.WriteLog(Now & ":" & "DEBUG: Updating userHash " & sid) + ' End If + 'Else + ' userHash.Add(sid, sPassword) + ' If DEBUG = True Then + ' UserAccessLog.WriteLog(Now & ":" & "DEBUG: Adding userHash " & sid) + ' End If + 'End If + ' new code stored in AD now send it to the users phone + ' Console.WriteLine(smsCode) + + success = True + Else + success = False + End If + Catch + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Failed to authenticate user agains Active Directory using the following parameters: " & "LDAPPAth: " & "LDAP://" & LDAPDomain & ", Username: " & UserDomain & ", Password: " & sPassword) + End If + success = False + + End Try + + + Dim attributes As New RADIUSAttributes + If success Then ' Yay! Someone guess the password ... + + UserAccessLog.WriteLog(Now & ":" & "User " & UserDomain & " authenticated agains Active Directory") + If EnableOTP = True Then + Dim attr As New RADIUSAttribute(RadiusAttributeType.ReplyMessage, "SMS Token") + attributes.Add(attr) + Dim state As New RADIUSAttribute(RadiusAttributeType.State, sid) + attributes.Add(state) + ' Console.WriteLine("len " & packet.Authenticator.Length.ToString) + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessChallenge, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + If EnableSMS = True Then + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Sending access token: " & smsCode & " to phonenumber " & mobile) + End If + + Call SendSMS(mobile, smsCode) + End If + If EnableEmail = True Then + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ":" & "DEBUG: Sending access token: " & smsCode & " to email " & UserEmail) + End If + + Call SendEmail(UserEmail, smsCode) + End If + Else ' One time Password not enabled, so we let the user in + server.SendAsResponse( _ + New RADIUSPacket(RadiusPacketCode.AccessAccept, _ + packet.Identifier, attributes, _ + packet.EndPoint), _ + packet.Authenticator) + End If + ' packetHash.Remove(username.GetString & "_" & pass.GetString) + Else ' Wrong username / password ... + + UserAccessLog.WriteLog(Now & ":" & "User " & UserDomain & " failed to authenticate agains Active Directory") + Dim pk As New RADIUSPacket(RadiusPacketCode.AccessReject, packet.Identifier, Nothing, packet.EndPoint) + server.SendAsResponse(pk, packet.Authenticator) + ' FYI ... if no additional attributes need to be added + ' to the response, you can sepcify Nothing instead of + ' creating an empty RADIUSAttributes object. + ' packetHash.Remove(username.GetString & "_" & pass.GetString) + End If + + + + End If + End Sub + + + + + Public Function GenerateCode() As String + + + Dim dummy As Integer = 0 + + Dim ordRand As New System.Random() + Dim temp As New System.Collections.ArrayList() + While temp.Count < 6 + dummy = ordRand.[Next](1, 9) + If Not temp.Contains(dummy) Then + temp.Add(dummy) + End If + End While + Dim strVar As String = temp(0).ToString() + temp(1).ToString() + temp(2).ToString() + temp(3).ToString() + temp(4).ToString() + temp(5).ToString() + Return strVar + + End Function + + Public Sub loadConfiguration() + Dim ConfOk As Boolean = True + Dim RConfig As New IniFile + Try + RConfig.Load(ApplicationPath() & "\CICRadarR.ini") + DEBUG = RConfig.GetKeyValue("CICRadarR", "Debug") + NetBiosDomain = RConfig.GetKeyValue("CICRadarR", "NetBiosDomain") + If NetBiosDomain.Length = 0 Then + Log.WriteLog(Now & ":" & "ERROR: NetBiosDomain can not be empty") + ConfOk = False + End If + LDAPDomain = RConfig.GetKeyValue("CICRadarR", "LDAPDomain") + If LDAPDomain.Length = 0 Then + Log.WriteLog(Now & ":" & "ERROR: LDAPDomain can not be empty") + ConfOk = False + End If + + TSGW = RConfig.GetKeyValue("CICRadarR", "TSGW") + + EnableOTP = RConfig.GetKeyValue("CICRadarR", "EnableOTP") + + If EnableOTP = True Then + If RConfig.GetKeyValue("CICRadarR", "EnableEmail") = "1" Then + EnableEmail = True + SenderEmail = RConfig.GetKeyValue("CICRadarR", "SenderEmail") + MailServer = RConfig.GetKeyValue("CICRadarR", "MailServer") + ADMailField = RConfig.GetKeyValue("CICRadarR", "ADMailField") + End If + + ADField = RConfig.GetKeyValue("CICRadarR", "ADField") + If ADField.Length = 0 Then + Log.WriteLog(Now & ":" & "ERROR: ADField can not be empty") + ConfOk = False + End If + + If RConfig.GetKeyValue("CICRadarR", "EnableSMS") = "1" Then + EnableSMS = True + ModemType = RConfig.GetKeyValue("CICRadarR", "USELOCALMODEM") + Select Case ModemType + Case "0" + Provider = RConfig.GetKeyValue("CICRadarR", "Provider") + If Provider.Length = 0 Then + Log.WriteLog(Now & ":" & "ERROR: Provider can not be empty") + ConfOk = False + End If + Case "1" + ComPort = RConfig.GetKeyValue("CICRadarR", "COMPORT") + If ComPort.Length = 0 Then + Log.WriteLog(Now & ":" & "ERROR: ComPort can not be empty") + ConfOk = False + End If + SmsC = RConfig.GetKeyValue("CICRadarR", "SMSC") + If SmsC.Length = 0 Then + Log.WriteLog(Now & ":" & "ERROR: SMSC can not be empty. See http://smsclist.com/downloads/default.txt for valid values") + ConfOk = False + End If + Case Else + Log.WriteLog(Now & ":" & "ERROR: USELOCALMODEM contain invalid configuration. Correct value are 1 or 0") + ConfOk = False + End Select + End If + + End If + + Dim ClientList As String = "" + ClientList = RConfig.GetKeyValue("CICRadarR", "ClientList") + + Dim ClientArray() As String + ClientArray = Split(ClientList, ",") + + For i As Integer = 0 To ClientArray.Length - 1 + Log.WriteLog(Now & ":" & "Loading Shared Secret for Client: " & ClientArray(i)) + clientHash.Add(ClientArray(i), EncDec.Decrypt(RConfig.GetKeyValue("Clients", ClientArray(i)), encCode)) + Next + + If ConfOk = True Then + Log.WriteLog(Now & ":" & "Loading Configuration...OK") + Else + Log.WriteLog(Now & ":" & "Loading Configuration...FAILED") + End If + Catch + Log.WriteLog(Now & ":" & "ERROR: Missing CICRadarR.ini from startup path or CICRadarR.ini contains invalid configuration") + Log.WriteLog(Now & ":" & "Loading Configuration...FAILED") + End + End Try + End Sub + + Public Function ApplicationPath() As String + Return Path.GetDirectoryName([Assembly].GetExecutingAssembly().Location) + End Function + + Public Function SendSMS(ByVal number As String, ByVal passcode As String) As String + + ' test if using online sms provider or local modem + If ModemType = 1 Then ' local modem + Dim modem As New SmsClass(ComPort) + modem.Opens() + modem.sendSms(number, passcode, SmsC) + modem.Closes() + modem = Nothing + Return "Ok" + Else + + + Dim baseurl As String = Provider.Split("?")(0) + Dim client As New System.Net.WebClient() + ' Add a user agent header in case the requested URI contains a query. + + client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR1.0.3705;)") + + Dim parameters As String = Provider.Split("?")(1) + Dim pary As String() = parameters.Split("&") + + For i As Integer = 0 To pary.Length - 1 + If pary(i).IndexOf("***TEXTMESSAGE***") > 0 Then + Dim qpar As String() = pary(i).Split("=") + client.QueryString.Add(qpar(0), passcode) + ElseIf pary(i).IndexOf("***NUMBER***") > 0 Then + Dim qpar As String() = pary(i).Split("=") + client.QueryString.Add(qpar(0), number) + Else + + Dim qpar As String() = pary(i).Split("=") + client.QueryString.Add(qpar(0), qpar(1)) + End If + Next + + + Dim data As Stream = client.OpenRead(baseurl) + Dim reader As New StreamReader(data) + Dim s As String = reader.ReadToEnd() + data.Close() + reader.Close() + Return (s) + End If + + End Function + + Public Function SendEmail(email As String, passcode As String) As String + + + Dim mail As New MailMessage() + mail.To.Add(email) + mail.From = New MailAddress(SenderEmail) + mail.Subject = "Token: " & passcode + mail.Body = "Subject contains the token code to login to you site" + mail.IsBodyHtml = False + Dim smtp As New SmtpClient(MailServer) + + + Try + smtp.Send(mail) + If DEBUG = True Then + UserAccessLog.WriteLog(Now & ": Mail send to: " & email) + End If + Return "SEND" + Catch e As InvalidCastException + + If DEBUG = True Then + UserAccessLog.WriteLog(Now & " : Debug: " & e.Message) + UserAccessLog.WriteLog(Now & " : Unable to send mail to: " & email & " ## Check that MAILSERVER and SENDEREMAIL are configured correctly in smscode.conf. Also check that your Webinterface server is allowed to relay through the mail server specified") + End If + Return "FAILED" + End Try + + + + End Function + + Private Sub TimerCleanUpHash_Elapsed(sender As System.Object, e As System.Timers.ElapsedEventArgs) Handles TimerCleanUpHash.Elapsed + ' Clean Session and Launch hash for TSGW + Try + Dim Item As DictionaryEntry + For Each Item In TSGWSessionIdTimeStampHash + Dim hTime As DateTime = DirectCast(Item.Value, DateTime) + Dim tValid = DateDiff(DateInterval.Minute, hTime, Now) + If tValid >= SessionTimeOut Then + TSGWSessionIdTimeStampHash.Remove(Item.Key) + If TSGWSessionIdHash.Contains(Item.Key) Then + TSGWSessionIdHash.Remove(Item.Key) + End If + End If + Next + + For Each Item In TSGWLaunchIdTimeStampHash + Dim hTime As DateTime = DirectCast(Item.Value, DateTime) + Dim tValid = DateDiff(DateInterval.Second, hTime, Now) + If tValid >= LaunchTimeOut Then + TSGWLaunchIdTimeStampHash.Remove(Item.Key) + End If + Next + Catch + End Try + End Sub +End Class diff --git a/CICRadarR/CICRadarR.vbproj b/CICRadarR/CICRadarR.vbproj new file mode 100644 index 0000000..304b975 --- /dev/null +++ b/CICRadarR/CICRadarR.vbproj @@ -0,0 +1,162 @@ + + + + Debug + x86 + + + + + {04C6C533-9FEA-41B2-B554-A166C7C7FE32} + WinExe + CICRadarR.CICRadarR + CICRadarR + CICRadarR + 512 + Console + v4.0 + Client + + + x86 + true + full + true + true + bin\Debug\ + CICRadarR.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + x86 + pdbonly + false + true + true + bin\Release\ + CICRadarR.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + My Project\app.manifest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + + + Component + + + CICRadarR.vb + + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + ProjectInstaller.vb + + + Component + + + + + + + TestService.vb + + + Form + + + + + + CICRadarR.vb + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + ProjectInstaller.vb + + + TestService.vb + + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + \ No newline at end of file diff --git a/CICRadarR/CICRadarR.vbproj.user b/CICRadarR/CICRadarR.vbproj.user new file mode 100644 index 0000000..695b5c7 --- /dev/null +++ b/CICRadarR/CICRadarR.vbproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/CICRadarR/Conversion.vb b/CICRadarR/Conversion.vb new file mode 100644 index 0000000..6c05cc3 --- /dev/null +++ b/CICRadarR/Conversion.vb @@ -0,0 +1,56 @@ + + +Friend Class Conversion + Friend Shared Function ConvertToString(ByRef bytes() As Byte) As String + Dim k As New System.Text.StringBuilder + Dim i As Integer + For i = 0 To bytes.Length - 1 : k.Append(Chr(bytes(i))) : Next + Return k.ToString + End Function + + Friend Shared Function ConvertToBytes(ByVal str As String) As Byte() + Dim res() As Byte = {} + Array.Resize(Of Byte)(res, str.Length) + Dim i As Integer + For i = 0 To res.Length - 1 + res(i) = Convert.ToByte(str.Chars(i)) + Next + Return res + End Function + + Friend Shared Function ConvertToDateTime(ByVal value As String) As DateTime + Dim ret As DateTime + value = LCase(value) + Try + value = Replace(value, "utc", "") + value = Replace(value, "mon", "") + value = Replace(value, "tue", "") + value = Replace(value, "wed", "") + value = Replace(value, "thu", "") + value = Replace(value, "fri", "") + value = Replace(value, "sat", "") + value = Replace(value, "sun", "") + value = Replace(value, "jan", "1/") + value = Replace(value, "feb", "2/") + value = Replace(value, "mar", "3/") + value = Replace(value, "apr", "4/") + value = Replace(value, "may", "5/") + value = Replace(value, "jun", "6/") + value = Replace(value, "jul", "7/") + value = Replace(value, "aug", "8/") + value = Replace(value, "sep", "9/") + value = Replace(value, "oct", "10/") + value = Replace(value, "nov", "11/") + value = Replace(value, "dec", "12/") + Do While InStr(value, " ") <> 0 + value = Replace(value, " ", " ") + Loop + value = Replace(value, "/ ", "/") + + ret = Convert.ToDateTime(value) + Catch ex As Exception + ret = Nothing + End Try + Return ret + End Function +End Class diff --git a/CICRadarR/Crypto.vb b/CICRadarR/Crypto.vb new file mode 100644 index 0000000..e9afa98 --- /dev/null +++ b/CICRadarR/Crypto.vb @@ -0,0 +1,344 @@ +Imports System +Imports System.IO +Imports System.Security.Cryptography + +' +' encrypt/decrypt functions +' Parameter checks and error handling +' are ommited for better readability +' + +Public Class EncDec + ' Encrypt a byte array into a byte array using a key and an IV + Public Shared Function Encrypt(ByVal clearData As Byte(), ByVal Key As Byte(), ByVal IV As Byte()) As Byte() + ' Create a MemoryStream to accept the encrypted bytes + Dim ms As New MemoryStream() + + ' Create a symmetric algorithm. + ' We are going to use Rijndael because it is strong and + ' available on all platforms. + ' You can use other algorithms, to do so substitute the + ' next line with something like + ' TripleDES alg = TripleDES.Create(); + Dim alg As Rijndael = Rijndael.Create() + + ' Now set the key and the IV. + ' We need the IV (Initialization Vector) because + ' the algorithm is operating in its default + ' mode called CBC (Cipher Block Chaining). + ' The IV is XORed with the first block (8 byte) + ' of the data before it is encrypted, and then each + ' encrypted block is XORed with the + ' following block of plaintext. + ' This is done to make encryption more secure. + + ' There is also a mode called ECB which does not need an IV, + ' but it is much less secure. + alg.Key = Key + alg.IV = IV + + ' Create a CryptoStream through which we are going to be + ' pumping our data. + ' CryptoStreamMode.Write means that we are going to be + ' writing data to the stream and the output will be written + ' in the MemoryStream we have provided. + Dim cs As New CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write) + + ' Write the data and make it do the encryption + cs.Write(clearData, 0, clearData.Length) + + ' Close the crypto stream (or do FlushFinalBlock). + ' This will tell it that we have done our encryption and + ' there is no more data coming in, + ' and it is now a good time to apply the padding and + ' finalize the encryption process. + cs.Close() + + ' Now get the encrypted data from the MemoryStream. + ' Some people make a mistake of using GetBuffer() here, + ' which is not the right way. + Dim encryptedData As Byte() = ms.ToArray() + + Return encryptedData + End Function + + ' Encrypt a string into a string using a password + ' Uses Encrypt(byte[], byte[], byte[]) + + Public Shared Function Encrypt(ByVal clearText As String, ByVal Password As String) As String + ' First we need to turn the input string into a byte array. + Dim clearBytes As Byte() = System.Text.Encoding.Unicode.GetBytes(clearText) + + ' Then, we need to turn the password into Key and IV + ' We are using salt to make it harder to guess our key + ' using a dictionary attack - + ' trying to guess a password by enumerating all possible words. + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + + ' Now get the key/IV and do the encryption using the + ' function that accepts byte arrays. + ' Using PasswordDeriveBytes object we are first getting + ' 32 bytes for the Key + ' (the default Rijndael key length is 256bit = 32bytes) + ' and then 16 bytes for the IV. + ' IV should always be the block size, which is by default + ' 16 bytes (128 bit) for Rijndael. + ' If you are using DES/TripleDES/RC2 the block size is + ' 8 bytes and so should be the IV size. + ' You can also read KeySize/BlockSize properties off + ' the algorithm to find out the sizes. + Dim encryptedData As Byte() = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16)) + + ' Now we need to turn the resulting byte array into a string. + ' A common mistake would be to use an Encoding class for that. + 'It does not work because not all byte values can be + ' represented by characters. + ' We are going to be using Base64 encoding that is designed + 'exactly for what we are trying to do. + Return Convert.ToBase64String(encryptedData) + + End Function + + ' Encrypt bytes into bytes using a password + ' Uses Encrypt(byte[], byte[], byte[]) + + Public Shared Function Encrypt(ByVal clearData As Byte(), ByVal Password As String) As Byte() + ' We need to turn the password into Key and IV. + ' We are using salt to make it harder to guess our key + ' using a dictionary attack - + ' trying to guess a password by enumerating all possible words. + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + + ' Now get the key/IV and do the encryption using the function + ' that accepts byte arrays. + ' Using PasswordDeriveBytes object we are first getting + ' 32 bytes for the Key + ' (the default Rijndael key length is 256bit = 32bytes) + ' and then 16 bytes for the IV. + ' IV should always be the block size, which is by default + ' 16 bytes (128 bit) for Rijndael. + ' If you are using DES/TripleDES/RC2 the block size is 8 + ' bytes and so should be the IV size. + ' You can also read KeySize/BlockSize properties off the + ' algorithm to find out the sizes. + Return Encrypt(clearData, pdb.GetBytes(32), pdb.GetBytes(16)) + + End Function + + ' Encrypt a file into another file using a password + Public Shared Sub Encrypt(ByVal fileIn As String, ByVal fileOut As String, ByVal Password As String) + + ' First we are going to open the file streams + Dim fsIn As New FileStream(fileIn, FileMode.Open, FileAccess.Read) + Dim fsOut As New FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write) + + ' Then we are going to derive a Key and an IV from the + ' Password and create an algorithm + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + + Dim alg As Rijndael = Rijndael.Create() + alg.Key = pdb.GetBytes(32) + alg.IV = pdb.GetBytes(16) + + ' Now create a crypto stream through which we are going + ' to be pumping data. + ' Our fileOut is going to be receiving the encrypted bytes. + Dim cs As New CryptoStream(fsOut, alg.CreateEncryptor(), CryptoStreamMode.Write) + + ' Now will will initialize a buffer and will be processing + ' the input file in chunks. + ' This is done to avoid reading the whole file (which can + ' be huge) into memory. + Dim bufferLen As Integer = 4096 + Dim buffer As Byte() = New Byte(bufferLen - 1) {} + Dim bytesRead As Integer + + Do + ' read a chunk of data from the input file + bytesRead = fsIn.Read(buffer, 0, bufferLen) + + ' encrypt it + cs.Write(buffer, 0, bytesRead) + Loop While bytesRead <> 0 + + ' close everything + + ' this will also close the unrelying fsOut stream + cs.Close() + fsIn.Close() + End Sub + + ' Decrypt a byte array into a byte array using a key and an IV + Public Shared Function Decrypt(ByVal cipherData As Byte(), ByVal Key As Byte(), ByVal IV As Byte()) As Byte() + ' Create a MemoryStream that is going to accept the + ' decrypted bytes + Dim ms As New MemoryStream() + + ' Create a symmetric algorithm. + ' We are going to use Rijndael because it is strong and + ' available on all platforms. + ' You can use other algorithms, to do so substitute the next + ' line with something like + ' TripleDES alg = TripleDES.Create(); + Dim alg As Rijndael = Rijndael.Create() + + ' Now set the key and the IV. + ' We need the IV (Initialization Vector) because the algorithm + ' is operating in its default + ' mode called CBC (Cipher Block Chaining). The IV is XORed with + ' the first block (8 byte) + ' of the data after it is decrypted, and then each decrypted + ' block is XORed with the previous + ' cipher block. This is done to make encryption more secure. + ' There is also a mode called ECB which does not need an IV, + ' but it is much less secure. + alg.Key = Key + alg.IV = IV + + ' Create a CryptoStream through which we are going to be + ' pumping our data. + ' CryptoStreamMode.Write means that we are going to be + ' writing data to the stream + ' and the output will be written in the MemoryStream + ' we have provided. + Dim cs As New CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write) + + ' Write the data and make it do the decryption + cs.Write(cipherData, 0, cipherData.Length) + + ' Close the crypto stream (or do FlushFinalBlock). + ' This will tell it that we have done our decryption + ' and there is no more data coming in, + ' and it is now a good time to remove the padding + ' and finalize the decryption process. + cs.Close() + + ' Now get the decrypted data from the MemoryStream. + ' Some people make a mistake of using GetBuffer() here, + ' which is not the right way. + Dim decryptedData As Byte() = ms.ToArray() + + Return decryptedData + End Function + + ' Decrypt a string into a string using a password + ' Uses Decrypt(byte[], byte[], byte[]) + + Public Shared Function Decrypt(ByVal cipherText As String, ByVal Password As String) As String + ' First we need to turn the input string into a byte array. + ' We presume that Base64 encoding was used + Dim cipherBytes As Byte() = Convert.FromBase64String(cipherText) + + ' Then, we need to turn the password into Key and IV + ' We are using salt to make it harder to guess our key + ' using a dictionary attack - + ' trying to guess a password by enumerating all possible words. + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + + ' Now get the key/IV and do the decryption using + ' the function that accepts byte arrays. + ' Using PasswordDeriveBytes object we are first + ' getting 32 bytes for the Key + ' (the default Rijndael key length is 256bit = 32bytes) + ' and then 16 bytes for the IV. + ' IV should always be the block size, which is by + ' default 16 bytes (128 bit) for Rijndael. + ' If you are using DES/TripleDES/RC2 the block size is + ' 8 bytes and so should be the IV size. + ' You can also read KeySize/BlockSize properties off + ' the algorithm to find out the sizes. + Dim decryptedData As Byte() = Decrypt(cipherBytes, pdb.GetBytes(32), pdb.GetBytes(16)) + + ' Now we need to turn the resulting byte array into a string. + ' A common mistake would be to use an Encoding class for that. + ' It does not work + ' because not all byte values can be represented by characters. + ' We are going to be using Base64 encoding that is + ' designed exactly for what we are trying to do. + Return System.Text.Encoding.Unicode.GetString(decryptedData) + End Function + + ' Decrypt bytes into bytes using a password + ' Uses Decrypt(byte[], byte[], byte[]) + + Public Shared Function Decrypt(ByVal cipherData As Byte(), ByVal Password As String) As Byte() + ' We need to turn the password into Key and IV. + ' We are using salt to make it harder to guess our key + ' using a dictionary attack - + ' trying to guess a password by enumerating all possible words. + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + + ' Now get the key/IV and do the Decryption using the + 'function that accepts byte arrays. + ' Using PasswordDeriveBytes object we are first getting + ' 32 bytes for the Key + ' (the default Rijndael key length is 256bit = 32bytes) + ' and then 16 bytes for the IV. + ' IV should always be the block size, which is by default + ' 16 bytes (128 bit) for Rijndael. + ' If you are using DES/TripleDES/RC2 the block size is + ' 8 bytes and so should be the IV size. + + ' You can also read KeySize/BlockSize properties off the + ' algorithm to find out the sizes. + Return Decrypt(cipherData, pdb.GetBytes(32), pdb.GetBytes(16)) + End Function + + ' Decrypt a file into another file using a password + Public Shared Sub Decrypt(ByVal fileIn As String, ByVal fileOut As String, ByVal Password As String) + + ' First we are going to open the file streams + Dim fsIn As New FileStream(fileIn, FileMode.Open, FileAccess.Read) + Dim fsOut As New FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write) + + ' Then we are going to derive a Key and an IV from + ' the Password and create an algorithm + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + Dim alg As Rijndael = Rijndael.Create() + + alg.Key = pdb.GetBytes(32) + alg.IV = pdb.GetBytes(16) + + ' Now create a crypto stream through which we are going + ' to be pumping data. + ' Our fileOut is going to be receiving the Decrypted bytes. + Dim cs As New CryptoStream(fsOut, alg.CreateDecryptor(), CryptoStreamMode.Write) + + ' Now will will initialize a buffer and will be + ' processing the input file in chunks. + ' This is done to avoid reading the whole file (which can be + ' huge) into memory. + Dim bufferLen As Integer = 4096 + Dim buffer As Byte() = New Byte(bufferLen - 1) {} + Dim bytesRead As Integer + + Do + ' read a chunk of data from the input file + bytesRead = fsIn.Read(buffer, 0, bufferLen) + + ' Decrypt it + + cs.Write(buffer, 0, bytesRead) + Loop While bytesRead <> 0 + + ' close everything + cs.Close() + ' this will also close the unrelying fsOut stream + fsIn.Close() + End Sub +End Class + + + diff --git a/CICRadarR/IniFileVb.vb b/CICRadarR/IniFileVb.vb new file mode 100644 index 0000000..6485eab --- /dev/null +++ b/CICRadarR/IniFileVb.vb @@ -0,0 +1,376 @@ +' Programmer: Ludvik Jerabek +' Date: 08\23\2010 +' Purpose: Allow INI manipulation in .NET + +Imports System.IO +Imports System.Text.RegularExpressions +Imports System.Collections +Imports System.Diagnostics + +' IniFile class used to read and write ini files by loading the file into memory +Public Class IniFile + ' List of IniSection objects keeps track of all the sections in the INI file + Private m_sections As Hashtable + + ' Public constructor + Public Sub New() + m_sections = New Hashtable(StringComparer.InvariantCultureIgnoreCase) + End Sub + + ' Loads the Reads the data in the ini file into the IniFile object + Public Sub Load(ByVal sFileName As String, Optional ByVal bMerge As Boolean = False) + If Not bMerge Then + RemoveAllSections() + End If + ' Clear the object... + Dim tempsection As IniSection = Nothing + Dim oReader As New StreamReader(sFileName) + Dim regexcomment As New Regex("^([\s]*#.*)", (RegexOptions.Singleline Or RegexOptions.IgnoreCase)) + ' Broken but left for history + 'Dim regexsection As New Regex("\[[\s]*([^\[\s].*[^\s\]])[\s]*\]", (RegexOptions.Singleline Or RegexOptions.IgnoreCase)) + Dim regexsection As New Regex("^[\s]*\[[\s]*([^\[\s].*[^\s\]])[\s]*\][\s]*$", (RegexOptions.Singleline Or RegexOptions.IgnoreCase)) + Dim regexkey As New Regex("^\s*([^=\s]*)[^=]*=(.*)", (RegexOptions.Singleline Or RegexOptions.IgnoreCase)) + While Not oReader.EndOfStream + Dim line As String = oReader.ReadLine() + If line <> String.Empty Then + Dim m As Match = Nothing + If regexcomment.Match(line).Success Then + m = regexcomment.Match(line) + Trace.WriteLine(String.Format("Skipping Comment: {0}", m.Groups(0).Value)) + ElseIf regexsection.Match(line).Success Then + m = regexsection.Match(line) + Trace.WriteLine(String.Format("Adding section [{0}]", m.Groups(1).Value)) + tempsection = AddSection(m.Groups(1).Value) + ElseIf regexkey.Match(line).Success AndAlso tempsection IsNot Nothing Then + m = regexkey.Match(line) + Trace.WriteLine(String.Format("Adding Key [{0}]=[{1}]", m.Groups(1).Value, m.Groups(2).Value)) + tempsection.AddKey(m.Groups(1).Value).Value = m.Groups(2).Value + ElseIf tempsection IsNot Nothing Then + ' Handle Key without value + Trace.WriteLine(String.Format("Adding Key [{0}]", line)) + tempsection.AddKey(line) + Else + ' This should not occur unless the tempsection is not created yet... + Trace.WriteLine(String.Format("Skipping unknown type of data: {0}", line)) + End If + End If + End While + oReader.Close() + End Sub + + ' Used to save the data back to the file or your choice + Public Sub Save(ByVal sFileName As String) + Dim oWriter As New StreamWriter(sFileName, False) + For Each s As IniSection In Sections + Trace.WriteLine(String.Format("Writing Section: [{0}]", s.Name)) + oWriter.WriteLine(String.Format("[{0}]", s.Name)) + For Each k As IniSection.IniKey In s.Keys + If k.Value <> String.Empty Then + Trace.WriteLine(String.Format("Writing Key: {0}={1}", k.Name, k.Value)) + oWriter.WriteLine(String.Format("{0}={1}", k.Name, k.Value)) + Else + Trace.WriteLine(String.Format("Writing Key: {0}", k.Name)) + oWriter.WriteLine(String.Format("{0}", k.Name)) + End If + Next + Next + oWriter.Close() + End Sub + + ' Gets all the sections + Public ReadOnly Property Sections() As System.Collections.ICollection + Get + Return m_sections.Values + End Get + End Property + + ' Adds a section to the IniFile object, returns a IniSection object to the new or existing object + Public Function AddSection(ByVal sSection As String) As IniSection + Dim s As IniSection = Nothing + sSection = sSection.Trim() + ' Trim spaces + If m_sections.ContainsKey(sSection) Then + s = DirectCast(m_sections(sSection), IniSection) + Else + s = New IniSection(Me, sSection) + m_sections(sSection) = s + End If + Return s + End Function + + ' Removes a section by its name sSection, returns trus on success + Public Function RemoveSection(ByVal sSection As String) As Boolean + sSection = sSection.Trim() + Return RemoveSection(GetSection(sSection)) + End Function + + ' Removes section by object, returns trus on success + Public Function RemoveSection(ByVal Section As IniSection) As Boolean + If Section IsNot Nothing Then + Try + m_sections.Remove(Section.Name) + Return True + Catch ex As Exception + Trace.WriteLine(ex.Message) + End Try + End If + Return False + End Function + + ' Removes all existing sections, returns trus on success + Public Function RemoveAllSections() As Boolean + m_sections.Clear() + Return (m_sections.Count = 0) + End Function + + ' Returns an IniSection to the section by name, NULL if it was not found + Public Function GetSection(ByVal sSection As String) As IniSection + sSection = sSection.Trim() + ' Trim spaces + If m_sections.ContainsKey(sSection) Then + Return DirectCast(m_sections(sSection), IniSection) + End If + Return Nothing + End Function + + ' Returns a KeyValue in a certain section + Public Function GetKeyValue(ByVal sSection As String, ByVal sKey As String) As String + Dim s As IniSection = GetSection(sSection) + If s IsNot Nothing Then + Dim k As IniSection.IniKey = s.GetKey(sKey) + If k IsNot Nothing Then + Return k.Value + End If + End If + Return String.Empty + End Function + + ' Sets a KeyValuePair in a certain section + Public Function SetKeyValue(ByVal sSection As String, ByVal sKey As String, ByVal sValue As String) As Boolean + Dim s As IniSection = AddSection(sSection) + If s IsNot Nothing Then + Dim k As IniSection.IniKey = s.AddKey(sKey) + If k IsNot Nothing Then + k.Value = sValue + Return True + End If + End If + Return False + End Function + + ' Renames an existing section returns true on success, false if the section didn't exist or there was another section with the same sNewSection + Public Function RenameSection(ByVal sSection As String, ByVal sNewSection As String) As Boolean + ' Note string trims are done in lower calls. + Dim bRval As Boolean = False + Dim s As IniSection = GetSection(sSection) + If s IsNot Nothing Then + bRval = s.SetName(sNewSection) + End If + Return bRval + End Function + + ' Renames an existing key returns true on success, false if the key didn't exist or there was another section with the same sNewKey + Public Function RenameKey(ByVal sSection As String, ByVal sKey As String, ByVal sNewKey As String) As Boolean + ' Note string trims are done in lower calls. + Dim s As IniSection = GetSection(sSection) + If s IsNot Nothing Then + Dim k As IniSection.IniKey = s.GetKey(sKey) + If k IsNot Nothing Then + Return k.SetName(sNewKey) + End If + End If + Return False + End Function + + ' Remove a key by section name and key name + Public Function RemoveKey(ByVal sSection As String, ByVal sKey As String) As Boolean + Dim s As IniSection = GetSection(sSection) + If s IsNot Nothing Then + Return s.RemoveKey(sKey) + End If + Return False + End Function + + ' IniSection class + Public Class IniSection + ' IniFile IniFile object instance + Private m_pIniFile As IniFile + ' Name of the section + Private m_sSection As String + ' List of IniKeys in the section + Private m_keys As Hashtable + + ' Constuctor so objects are internally managed + Protected Friend Sub New(ByVal parent As IniFile, ByVal sSection As String) + m_pIniFile = parent + m_sSection = sSection + m_keys = New Hashtable(StringComparer.InvariantCultureIgnoreCase) + End Sub + + ' Returns all the keys in a section + Public ReadOnly Property Keys() As System.Collections.ICollection + Get + Return m_keys.Values + End Get + End Property + + ' Returns the section name + Public ReadOnly Property Name() As String + Get + Return m_sSection + End Get + End Property + + ' Adds a key to the IniSection object, returns a IniKey object to the new or existing object + Public Function AddKey(ByVal sKey As String) As IniKey + sKey = sKey.Trim() + Dim k As IniSection.IniKey = Nothing + If sKey.Length <> 0 Then + If m_keys.ContainsKey(sKey) Then + k = DirectCast(m_keys(sKey), IniKey) + Else + k = New IniSection.IniKey(Me, sKey) + m_keys(sKey) = k + End If + End If + Return k + End Function + + ' Removes a single key by string + Public Function RemoveKey(ByVal sKey As String) As Boolean + Return RemoveKey(GetKey(sKey)) + End Function + + ' Removes a single key by IniKey object + Public Function RemoveKey(ByVal Key As IniKey) As Boolean + If Key IsNot Nothing Then + Try + m_keys.Remove(Key.Name) + Return True + Catch ex As Exception + Trace.WriteLine(ex.Message) + End Try + End If + Return False + End Function + + ' Removes all the keys in the section + Public Function RemoveAllKeys() As Boolean + m_keys.Clear() + Return (m_keys.Count = 0) + End Function + + ' Returns a IniKey object to the key by name, NULL if it was not found + Public Function GetKey(ByVal sKey As String) As IniKey + sKey = sKey.Trim() + If m_keys.ContainsKey(sKey) Then + Return DirectCast(m_keys(sKey), IniKey) + End If + Return Nothing + End Function + + ' Sets the section name, returns true on success, fails if the section + ' name sSection already exists + Public Function SetName(ByVal sSection As String) As Boolean + sSection = sSection.Trim() + If sSection.Length <> 0 Then + ' Get existing section if it even exists... + Dim s As IniSection = m_pIniFile.GetSection(sSection) + If s IsNot Me AndAlso s IsNot Nothing Then + Return False + End If + Try + ' Remove the current section + m_pIniFile.m_sections.Remove(m_sSection) + ' Set the new section name to this object + m_pIniFile.m_sections(sSection) = Me + ' Set the new section name + m_sSection = sSection + Return True + Catch ex As Exception + Trace.WriteLine(ex.Message) + End Try + End If + Return False + End Function + + ' Returns the section name + Public Function GetName() As String + Return m_sSection + End Function + + ' IniKey class + Public Class IniKey + ' Name of the Key + Private m_sKey As String + ' Value associated + Private m_sValue As String + ' Pointer to the parent CIniSection + Private m_section As IniSection + + ' Constuctor so objects are internally managed + Protected Friend Sub New(ByVal parent As IniSection, ByVal sKey As String) + m_section = parent + m_sKey = sKey + End Sub + + ' Returns the name of the Key + Public ReadOnly Property Name() As String + Get + Return m_sKey + End Get + End Property + + ' Sets or Gets the value of the key + Public Property Value() As String + Get + Return m_sValue + End Get + Set(ByVal value As String) + m_sValue = value + End Set + End Property + + ' Sets the value of the key + Public Sub SetValue(ByVal sValue As String) + m_sValue = sValue + End Sub + ' Returns the value of the Key + Public Function GetValue() As String + Return m_sValue + End Function + + ' Sets the key name + ' Returns true on success, fails if the section name sKey already exists + Public Function SetName(ByVal sKey As String) As Boolean + sKey = sKey.Trim() + If sKey.Length <> 0 Then + Dim k As IniKey = m_section.GetKey(sKey) + If k IsNot Me AndAlso k IsNot Nothing Then + Return False + End If + Try + ' Remove the current key + m_section.m_keys.Remove(m_sKey) + ' Set the new key name to this object + m_section.m_keys(sKey) = Me + ' Set the new key name + m_sKey = sKey + Return True + Catch ex As Exception + Trace.WriteLine(ex.Message) + End Try + End If + Return False + End Function + + ' Returns the name of the Key + Public Function GetName() As String + Return m_sKey + End Function + End Class + ' End of IniKey class + End Class + ' End of IniSection class +End Class +' End of IniFile class \ No newline at end of file diff --git a/CICRadarR/Log.vb b/CICRadarR/Log.vb new file mode 100644 index 0000000..5db80c0 --- /dev/null +++ b/CICRadarR/Log.vb @@ -0,0 +1,44 @@ +Imports System +Imports System.IO +Imports System.Data + +Namespace LogFile + Public Class LogWriter + + + Public filePath As String + Private fileStream As FileStream + Private streamWriter As StreamWriter + + Public Sub OpenFile() + Try + Dim strPath As String + strPath = filePath + If System.IO.File.Exists(strPath) Then + fileStream = New FileStream(strPath, FileMode.Append, FileAccess.Write) + Else + fileStream = New FileStream(strPath, FileMode.Create, FileAccess.Write) + End If + streamWriter = New StreamWriter(fileStream) + Catch + End Try + End Sub + + Public Sub WriteLog(ByVal strComments As String) + Try + OpenFile() + streamWriter.WriteLine(strComments) + CloseFile() + Catch + End Try + End Sub + + Public Sub CloseFile() + Try + streamWriter.Close() + fileStream.Close() + Catch + End Try + End Sub + End Class +End Namespace diff --git a/CICRadarR/My Project/Application.Designer.vb b/CICRadarR/My Project/Application.Designer.vb new file mode 100644 index 0000000..cdf76c6 --- /dev/null +++ b/CICRadarR/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1008 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/CICRadarR/My Project/Application.myapp b/CICRadarR/My Project/Application.myapp new file mode 100644 index 0000000..ee022ac --- /dev/null +++ b/CICRadarR/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + true + TestService + false + 0 + true + 0 + true + \ No newline at end of file diff --git a/CICRadarR/My Project/AssemblyInfo.vb b/CICRadarR/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..871b919 --- /dev/null +++ b/CICRadarR/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/CICRadarR/My Project/Resources.Designer.vb b/CICRadarR/My Project/Resources.Designer.vb new file mode 100644 index 0000000..1ad07d3 --- /dev/null +++ b/CICRadarR/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1008 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("CICRadarR.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/CICRadarR/My Project/Resources.resx b/CICRadarR/My Project/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/CICRadarR/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CICRadarR/My Project/Settings.Designer.vb b/CICRadarR/My Project/Settings.Designer.vb new file mode 100644 index 0000000..e652f20 --- /dev/null +++ b/CICRadarR/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1008 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.CICRadarR.My.MySettings + Get + Return Global.CICRadarR.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/CICRadarR/My Project/Settings.settings b/CICRadarR/My Project/Settings.settings new file mode 100644 index 0000000..377f56d --- /dev/null +++ b/CICRadarR/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/CICRadarR/My Project/app.manifest b/CICRadarR/My Project/app.manifest new file mode 100644 index 0000000..cbe08de --- /dev/null +++ b/CICRadarR/My Project/app.manifest @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CICRadarR/NASAuthList.vb b/CICRadarR/NASAuthList.vb new file mode 100644 index 0000000..e0d1b47 --- /dev/null +++ b/CICRadarR/NASAuthList.vb @@ -0,0 +1,17 @@ +Public Class NASAuthList + Inherits System.Collections.Generic.Dictionary(Of String, String) + + Public Sub AddSharedSecret(ByVal nasIP As String, ByVal secret As String) + If MyBase.ContainsKey(nasIP) Then + MyBase.Item(nasIP) = secret + Else + MyBase.Add(nasIP, secret) + End If + End Sub + + Public Function GetSharedSecret(ByVal nasIP As String) As String + Dim res As String = "" + MyBase.TryGetValue(nasIP, res) + Return res + End Function +End Class \ No newline at end of file diff --git a/CICRadarR/ProjectInstaller.Designer.vb b/CICRadarR/ProjectInstaller.Designer.vb new file mode 100644 index 0000000..f720e44 --- /dev/null +++ b/CICRadarR/ProjectInstaller.Designer.vb @@ -0,0 +1,48 @@ + Partial Class ProjectInstaller + Inherits System.Configuration.Install.Installer + + 'Installer overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Component Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Component Designer + 'It can be modified using the Component Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.ServiceProcessInstaller1 = New System.ServiceProcess.ServiceProcessInstaller() + Me.ServiceInstaller1 = New System.ServiceProcess.ServiceInstaller() + ' + 'ServiceProcessInstaller1 + ' + Me.ServiceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem + Me.ServiceProcessInstaller1.Password = Nothing + Me.ServiceProcessInstaller1.Username = Nothing + ' + 'ServiceInstaller1 + ' + Me.ServiceInstaller1.Description = "Radius Server for SMS Token" + Me.ServiceInstaller1.DisplayName = "CIC Radius Server" + Me.ServiceInstaller1.ServiceName = "CICRadiusR" + Me.ServiceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic + ' + 'ProjectInstaller + ' + Me.Installers.AddRange(New System.Configuration.Install.Installer() {Me.ServiceProcessInstaller1, Me.ServiceInstaller1}) + + End Sub + Friend WithEvents ServiceProcessInstaller1 As System.ServiceProcess.ServiceProcessInstaller + Friend WithEvents ServiceInstaller1 As System.ServiceProcess.ServiceInstaller + +End Class diff --git a/CICRadarR/ProjectInstaller.resx b/CICRadarR/ProjectInstaller.resx new file mode 100644 index 0000000..f8a01d0 --- /dev/null +++ b/CICRadarR/ProjectInstaller.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 188, 17 + + + False + + \ No newline at end of file diff --git a/CICRadarR/ProjectInstaller.vb b/CICRadarR/ProjectInstaller.vb new file mode 100644 index 0000000..f06aca7 --- /dev/null +++ b/CICRadarR/ProjectInstaller.vb @@ -0,0 +1,16 @@ +Imports System.ComponentModel +Imports System.Configuration.Install + +Public Class ProjectInstaller + + Public Sub New() + MyBase.New() + + 'This call is required by the Component Designer. + InitializeComponent() + + 'Add initialization code after the call to InitializeComponent + + End Sub + +End Class diff --git a/CICRadarR/RADIUSAttributes.vb b/CICRadarR/RADIUSAttributes.vb new file mode 100644 index 0000000..6239c30 --- /dev/null +++ b/CICRadarR/RADIUSAttributes.vb @@ -0,0 +1,312 @@ +Imports Microsoft.VisualBasic.Conversion +Imports CICRadarR.Conversion + +Public Class RADIUSAttributes + Inherits List(Of RADIUSAttribute) + + Friend Function LoadAttributes(ByRef data() As Byte) As Boolean + Dim offset As Integer = 20 + Dim attr As RADIUSAttribute + Dim result As Boolean = True + + Do While offset < data.Length And result + If offset + 1 > data.Length Then result = False + If result Then + If data(offset + 1) < 3 Then result = False + End If + If result Then + If offset + data(offset + 1) > data.Length Then result = False + End If + If result Then + attr = New RADIUSAttribute(data, offset) + Me.Add(attr) + offset += data(offset + 1) + End If + Loop + + Return result + End Function + + Public ReadOnly Property Length() As Integer + Get + Dim result As Integer = 0 + For Each attr In Me + result += attr.Length + Next + Return result + End Get + End Property + + Friend ReadOnly Property Bytes() As Byte() + Get + Dim result() As Byte = {} + Dim offset As Integer = 0 + Array.Resize(result, Me.Length) + For Each attr In Me + Array.Copy(attr.Bytes, 0, result, offset, attr.Length) + offset += attr.Length + Next + Return result + End Get + End Property + + ' fixed function so it return correct value (CI) + Public Function AttributeExists(ByVal type As RadiusAttributeType) As Boolean + Dim attr As RADIUSAttribute + Dim result As Boolean = False + For Each attr In Me + result = (attr.Type = type) + + If result = True Then + Return True + End If + Next + Return False + End Function + + Public Function GetFirstAttribute(ByVal type As RadiusAttributeType) As RADIUSAttribute + Dim atr As RADIUSAttribute + For Each atr In Me + If atr.Type = type Then Return atr + Next + Return Nothing + End Function + + Public Function GetAllAttributes(ByVal type As RadiusAttributeType) As RADIUSAttributes + Dim ret As New RADIUSAttributes + Dim atr As RADIUSAttribute + For Each atr In Me + If atr.Type = type Then ret.Add(atr) + Next + Return ret + End Function + + 'Public Function GetAllVSAs() As RADIUSAttributes + ' Dim ret As New RADIUSAttributes + ' Dim atr As RADIUSAttribute + ' For Each atr In Me + ' If atr.Type = RadiusAttributeType.VendorSpecific Then ret.Add(atr) + ' Next + ' Return ret + 'End Function + + 'Public Function GetAllCiscoAVPairs() As RADIUSAttributes + ' Dim ret As New RADIUSAttributes + ' Dim atr As RADIUSAttribute + ' For Each atr In Me + ' If atr.GetCiscoAVPair IsNot Nothing Then ret.Add(atr) + ' Next + ' Return ret + 'End Function + + 'Public Function GetFirstCiscoAVPair(ByVal type As CiscoAVPairType) As CiscoAVPair + ' Dim atr As RADIUSAttribute + ' Dim avpair As CiscoAVPair + ' For Each atr In Me + ' If atr.Type = RadiusAttributeType.VendorSpecific Then + ' avpair = atr.GetCiscoAVPair + ' If avpair IsNot Nothing Then + ' If avpair.VendorType = type Then Return avpair + ' End If + ' End If + ' Next + ' Return Nothing + 'End Function + + 'Public Function GetFirstCiscoAVPair(ByVal name As String) As CiscoAVPair + ' Dim atr As RADIUSAttribute + ' Dim avpair As CiscoAVPair + ' For Each atr In Me + ' If atr.Type = RadiusAttributeType.VendorSpecific Then + ' avpair = atr.GetCiscoAVPair + ' If avpair IsNot Nothing Then + ' If avpair.VendorName = name Then Return avpair + ' End If + ' End If + ' Next + ' Return Nothing + 'End Function +End Class + +Public Class RADIUSAttribute + Private mType As Byte + Private mLength As Byte + Private mValue() As Byte = {0} + + Friend Sub New(ByRef data() As Byte, ByVal offset As Integer) + mLength = data(offset + 1) + Array.Resize(mValue, mLength - 2) + Array.Copy(data, offset + 2, mValue, 0, mLength - 2) + mType = data(offset) + End Sub + + Public Sub New(ByVal type As RadiusAttributeType, ByVal data() As Byte) + CommonNew(type, data) + End Sub + + Public Sub New(ByVal type As RadiusAttributeType, ByVal data As String) + Dim newdata() As Byte = ConvertToBytes(data) + CommonNew(type, newdata) + End Sub + + Public Sub New(ByVal type As RadiusAttributeType, ByVal data As Long) + Dim newdata() As Byte = {data \ 16777216, _ + (data Mod 16777216) \ 65536, _ + (data Mod 65536) \ 256, _ + (data Mod 256)} + CommonNew(type, newdata) + End Sub + + Private Sub CommonNew(ByVal type As Byte, ByRef data() As Byte) + If data.Length > 253 Then + mType = 0 + mLength = 3 + Else + mType = type + Array.Resize(mValue, data.Length) + Array.Copy(data, 0, mValue, 0, data.Length) + mLength = mValue.Length + 2 + End If + End Sub + + Public ReadOnly Property Length() As Byte + Get + Return mLength + End Get + End Property + + Public ReadOnly Property Type() As RadiusAttributeType + Get + Return mType + End Get + End Property + + Friend ReadOnly Property Bytes() As Byte() + Get + Dim result() As Byte = {} + Array.Resize(result, mLength) + Array.Copy(mValue, 0, result, 2, mLength - 2) + result(0) = mType + result(1) = mLength + Return result + End Get + End Property + + Public ReadOnly Property Value() As Byte() + Get + Return mValue + End Get + End Property + + Public Function GetString() As String + Return ConvertToString(mValue) + End Function + + Public Function GetLong() As Long + If mLength <> 6 Then Return 0 + Return mValue(0) * 16777216 + _ + mValue(1) * 65536 + _ + mValue(2) * 256 + _ + mValue(3) + End Function + + Public Function GetIPAddress() As String + If mLength <> 6 Then Return "0.0.0.0" + Return mValue(0) & "." & mValue(1) & "." & mValue(2) & "." & mValue(3) + End Function + + Public Function GetHex() As String + Dim i As Integer + Dim result As String = "" + Dim k As String + For i = 0 To mLength - 3 + k = Hex(mValue(i)) + If k.Length = 1 Then k = "0" & k + result = result & k & " " + Next + Return result + End Function + + Public Function GetTrimHex() As String + Return Replace(GetHex, " ", "") + End Function + + Public Function GetVendorSpecific() As VendorSpecificAttribute + Return New VendorSpecificAttribute(mValue) + End Function + + 'Public Function GetCiscoAVPair() As CiscoAVPair + ' Return New CiscoAVPair(mValue) + 'End Function + + 'Public Function GetVendorSpecific() As CiscoAVPair + ' Return New CiscoAVPair(mValue) + 'End Function + + 'Public Function CiscoAVPairTypeLookahead() As CiscoAVPairType + ' If mLength < 8 Then Return CiscoAVPairType.Invalid + ' If mValue(3) <> 9 Then Return CiscoAVPairType.Invalid + ' If mValue(2) <> 0 Then Return CiscoAVPairType.Invalid + ' If mValue(1) <> 0 Then Return CiscoAVPairType.Invalid + ' If mValue(0) <> 0 Then Return CiscoAVPairType.Invalid + ' Return mValue(4) + 'End Function +End Class + +Public Enum RadiusAttributeType As Byte + Invalid = 0 + UserName = 1 + UserPassword = 2 + CHAPPassword = 3 + NASIPAddress = 4 + NASPort = 5 + ServiceType = 6 + FramedProtocol = 7 + FramedIPAddress = 8 + FramedIPNetmask = 9 + FramedRouting = 10 + FilterId = 11 + FramedMTU = 12 + FramedCompression = 13 + LoginIPHost = 14 + LoginService = 15 + LoginTCPPort = 16 + ReplyMessage = 18 + CallbackNumber = 19 + CallbackId = 20 + FramedRoute = 22 + FramedIPXNetwork = 23 + State = 24 + [Class] = 25 + VendorSpecific = 26 + SessionTimeout = 27 + IdleTimeout = 28 + TerminationAction = 29 + CalledStationId = 30 + CallingStationId = 31 + NASIdentifier = 32 + ProxyState = 33 + LoginLATService = 34 + LoginLATNode = 35 + LoginLATGroup = 36 + FramedAppleTalkLink = 37 + FramedAppleTalkNetwork = 38 + FramedAppleTalkZone = 39 + AcctStatusType = 40 + AcctDelayTime = 41 + AcctInputOctets = 42 + AcctOutputOctets = 43 + AcctSessionId = 44 + AcctAuthentic = 45 + AcctSessionTime = 46 + AcctInputPackets = 47 + AcctOutputPackets = 48 + AcctTerminateCause = 49 + AcctMultiSessionId = 50 + AcctLinkCount = 51 + CHAPChallenge = 60 + NASPortType = 61 + PortLimit = 62 + LoginLATPort = 63 + MessageAuthenticator = 80 +End Enum \ No newline at end of file diff --git a/CICRadarR/RADIUSPacket.vb b/CICRadarR/RADIUSPacket.vb new file mode 100644 index 0000000..4f6f008 --- /dev/null +++ b/CICRadarR/RADIUSPacket.vb @@ -0,0 +1,249 @@ +Imports System.Net +Imports System.Security.Cryptography +Imports CICRadarR.Conversion + +Public Class RADIUSPacket + Private mCode As RadiusPacketCode + Private mIdentifier As Byte + Private mAuthenticator() As Byte = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + Private mAttributes As New RADIUSAttributes + Private mEndPoint As IPEndPoint + Private mIsValid As Boolean + Private mServer As RADIUSServer + + Friend Sub New(ByRef data() As Byte, ByVal endPoint As IPEndPoint, ByRef server As RADIUSServer) + 'Check validity ... + mIsValid = mAttributes.LoadAttributes(data) + If mIsValid Then + mCode = data(0) + mIdentifier = data(1) + Array.Copy(data, 4, mAuthenticator, 0, 16) + mEndPoint = endPoint + mServer = server + End If + End Sub + + Public Sub New(ByVal code As RadiusPacketCode, ByVal identifier As Byte, ByVal attributes As RADIUSAttributes, ByVal endPoint As IPEndPoint) + mCode = code + mIdentifier = identifier + If attributes Is Nothing Then + mAttributes = New RADIUSAttributes + Else + mAttributes = attributes + End If + If endPoint Is Nothing Then + mIsValid = False + Else + mEndPoint = endPoint + mIsValid = True + End If + End Sub + + Public ReadOnly Property IsValid() As Boolean + Get + Return mIsValid + End Get + End Property + + Public ReadOnly Property Code() As RadiusPacketCode + Get + Return mCode + End Get + End Property + + Public ReadOnly Property Identifier() As Byte + Get + Return mIdentifier + End Get + End Property + + Public ReadOnly Property Attributes() As RADIUSAttributes + Get + Return mAttributes + End Get + End Property + + Public ReadOnly Property Authenticator() As Byte() + Get + Return mAuthenticator + End Get + End Property + + Public ReadOnly Property EndPoint() As IPEndPoint + Get + Return mEndPoint + End Get + End Property + + ''' + ''' Returns the username supplied in an Access Request. Returns + ''' Nothing if a User-Name attribute is missing or the packet is not an + ''' Access Request. + ''' + ''' + ''' + ''' + Public ReadOnly Property UserName() As String + Get + If mCode <> RadiusPacketCode.AccessRequest Then Return Nothing + If mAttributes.GetFirstAttribute(RadiusAttributeType.UserName) Is Nothing Then Return Nothing + Return mAttributes.GetFirstAttribute(RadiusAttributeType.UserName).GetString + End Get + End Property + + ''' + ''' Returns the password supplied in an Access Request. Returns + ''' Nothing is a User-Password attribute is missing or the packet is not + ''' an Access Request. + ''' + ''' + ''' + ''' + Public ReadOnly Property UserPassword() As String + Get + If mCode <> RadiusPacketCode.AccessRequest Then Return Nothing + + If mAttributes.GetFirstAttribute(RadiusAttributeType.UserPassword) Is Nothing Then Return Nothing + + Dim secret As String = mServer.NASList.GetSharedSecret(mEndPoint.Address.ToString) + If secret = "" Then Return Nothing + Dim userpass As Byte() = mAttributes.GetFirstAttribute(RadiusAttributeType.UserPassword).Value + If userpass.Length Mod 16 > 0 Then Return Nothing + + Dim hasher As MD5 = MD5.Create + Dim decoded As Byte() = {} + Array.Resize(decoded, userpass.Length) + Dim temp As Byte() = {} + Array.Resize(temp, secret.Length + 16) + Dim segment As Byte() = {} + Array.Resize(segment, 16) + ConvertToBytes(secret).CopyTo(temp, 0) + Dim i As Integer + For i = 0 To userpass.Length \ 16 - 1 + If i = 0 Then + mAuthenticator.CopyTo(temp, secret.Length) + Else + Array.Copy(userpass, (i - 1) * 16, temp, secret.Length, 16) + End If + Array.Copy(userpass, i * 16, segment, 0, 16) + Array.Copy(XorBytes(hasher.ComputeHash(temp), segment), 0, decoded, i * 16, 16) + Next + hasher = Nothing + + Return ConvertToString(decoded).Trim(Chr(0)) + End Get + End Property + + Friend Function Bytes() As Byte() + Dim mLength = 20 + mAttributes.Length + Dim result() As Byte = {} + Array.Resize(result, mLength) + result(0) = mCode + result(1) = mIdentifier + result(2) = mLength \ 256 + result(3) = mLength Mod 256 + mAuthenticator.CopyTo(result, 4) + If mLength > 20 Then mAttributes.Bytes.CopyTo(result, 20) + Return result + End Function + + ''' + ''' Deprecated. User the UserName and UserPassword properties instead. + ''' + ''' + ''' + ''' + ''' + Public Function AuthenticateAccessRequest(ByRef authList As NASAuthList, ByRef nasList As NASAuthList) As Boolean + If authList Is Nothing Then Return False + If nasList Is Nothing Then Return False + If Not mIsValid Then Return False + If mCode <> RadiusPacketCode.AccessRequest Then Return True + + Dim secret As String = nasList.GetSharedSecret(mEndPoint.Address.ToString) + If secret = "" Then Return False + Dim username As RADIUSAttribute = mAttributes.GetFirstAttribute(RadiusAttributeType.UserName) + If username Is Nothing Then Return False + Dim userpass As RADIUSAttribute = mAttributes.GetFirstAttribute(RadiusAttributeType.UserPassword) + If userpass Is Nothing Then Return False + Dim password As String = authList.GetSharedSecret(username.GetString) + If password = "" Then Return False + + Dim passlen As Integer = password.Length \ 16 + If password.Length Mod 16 > 0 Then + passlen += 1 + password = password & StrDup(16 - (password.Length Mod 16), Chr(0)) + End If + + Dim hasher As MD5 = MD5.Create + Dim expect() As Byte = {} + Array.Resize(expect, passlen * 16) + Dim temp() As Byte = {} + Array.Resize(temp, secret.Length + 16) + ConvertToBytes(secret).CopyTo(temp, 0) + Dim i As Integer + For i = 0 To passlen - 1 + If i = 0 Then + mAuthenticator.CopyTo(temp, secret.Length) + Else + Array.Copy(expect, (i - 1) * 16, temp, secret.Length, 16) + End If + Array.Copy(XorBytes(hasher.ComputeHash(temp), ConvertToBytes(password.Substring(i * 16, 16))), 0, expect, i * 16, 16) + Next + + hasher = Nothing + + Return (ConvertToString(expect) = userpass.GetString) + End Function + + ''' + ''' Accept the access request. + ''' + ''' + Public Sub AcceptAccessRequest() + AcceptAccessRequest(Nothing) + End Sub + + ''' + ''' Accept the access request and include the specified attributes in the RADIUS response. + ''' + ''' The RADIUS attributes to include with the response. + ''' + Public Sub AcceptAccessRequest(ByVal attributes As RADIUSAttributes) + If mCode <> RadiusPacketCode.AccessRequest Then Exit Sub + mServer.SendAsResponse(New RADIUSPacket(RadiusPacketCode.AccessAccept, mIdentifier, attributes, mEndPoint), mAuthenticator) + End Sub + + ''' + ''' Reject the access request. + ''' + ''' + Public Sub RejectAccessRequest() + If mCode <> RadiusPacketCode.AccessRequest Then Exit Sub + mServer.SendAsResponse(New RADIUSPacket(RadiusPacketCode.AccessReject, mIdentifier, Nothing, mEndPoint), mAuthenticator) + End Sub + + Private Function XorBytes(ByVal oper1() As Byte, ByVal oper2() As Byte) As Byte() + Dim res() As Byte = {} + If oper1.Length <> oper2.Length Then Return res + Dim i As Integer + Array.Resize(res, oper1.Length) + For i = 0 To oper1.Length - 1 + res(i) = oper1(i) Xor oper2(i) + Next + Return res + End Function + +End Class + +Public Enum RadiusPacketCode As Byte + AccessRequest = 1 + AccessAccept = 2 + AccessReject = 3 + AccountingRequest = 4 + AccountingResponse = 5 + AccessChallenge = 11 + StatusServer = 12 + StatusClient = 13 + Reserved = 255 +End Enum \ No newline at end of file diff --git a/CICRadarR/RADIUSServer.vb b/CICRadarR/RADIUSServer.vb new file mode 100644 index 0000000..690dfce --- /dev/null +++ b/CICRadarR/RADIUSServer.vb @@ -0,0 +1,156 @@ +Imports System.Net +Imports CICRadarR.Conversion + +Public Class RADIUSServer + + Private mSocket As UDPServer + Private mSecrets As NASAuthList + Private mLastAuthenticator() As Byte = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + + Public Delegate Sub RADIUSHandler(ByVal packet As RADIUSPacket) + + Private HandlePacket As RADIUSHandler + + Public Sub New(ByVal portNumber As Integer, ByVal onRADIUSPacket As RADIUSHandler, ByRef secrets As NASAuthList) + mSocket = New UDPServer(portNumber, AddressOf SocketData) + HandlePacket = onRADIUSPacket + mSecrets = secrets + End Sub + + Public Sub New(ByVal ipAddress As String, ByVal portNumber As Integer, ByVal onRADIUSPacket As RADIUSHandler, ByRef secrets As NASAuthList) + mSocket = New UDPServer(ipAddress, portNumber, AddressOf SocketData) + HandlePacket = onRADIUSPacket + mSecrets = secrets + End Sub + + Friend ReadOnly Property NASList() As NASAuthList + Get + Return mSecrets + End Get + End Property + + Public Sub SendAsRequest(ByVal packet As RADIUSPacket) + If packet Is Nothing Then Exit Sub + If Not packet.IsValid Then Exit Sub + Dim data() As Byte = packet.Bytes + Dim hasher As System.Security.Cryptography.MD5 = System.Security.Cryptography.MD5.Create + Dim hash() As Byte = {} + Dim secret As String = mSecrets.GetSharedSecret(packet.EndPoint.Address.ToString) + Array.Resize(hash, data.Length + secret.Length) + data.CopyTo(hash, 0) + ConvertToBytes(secret).CopyTo(hash, data.Length) + hash = hasher.ComputeHash(hash) + hash.CopyTo(data, 4) + hash.CopyTo(mLastAuthenticator, 0) + mSocket.Send(data, packet.EndPoint) + End Sub + + Public Sub SendAsResponse(ByVal packet As RADIUSPacket, ByVal requestAuth() As Byte) + Try + If packet Is Nothing Then + Exit Sub + End If + + If Not packet.IsValid Then + Exit Sub + End If + + If requestAuth Is Nothing Then + Exit Sub + End If + + If requestAuth.Length <> 16 Then + Exit Sub + End If + + Dim data() As Byte = packet.Bytes + Dim hasher As System.Security.Cryptography.MD5 = System.Security.Cryptography.MD5.Create + Dim hash() As Byte = {} + Dim secret As String = mSecrets.GetSharedSecret(packet.EndPoint.Address.ToString) + Array.Resize(hash, data.Length + secret.Length) + data.CopyTo(hash, 0) + ConvertToBytes(secret).CopyTo(hash, data.Length) + Array.Copy(requestAuth, 0, hash, 4, 16) + hash = hasher.ComputeHash(hash) + hash.CopyTo(data, 4) + mSocket.Send(data, packet.EndPoint) + + Catch ex As Exception + Console.WriteLine(ex.Message) + End Try + + End Sub + + Private Sub SocketData(ByRef data() As Byte, ByRef ep As IPEndPoint) + 'Verify validity ... + If data.Length < 20 Then + Exit Sub + End If + + Dim len As Integer = data(2) * 256 + data(3) + If data.Length <> len Then + Exit Sub + End If + + Dim code As RadiusPacketCode = data(0) + Dim auth As Boolean + If code = RadiusPacketCode.AccessRequest Or code = RadiusPacketCode.AccountingRequest Then + auth = AuthenticateRequest(data, mSecrets.GetSharedSecret(ep.Address.ToString)) + Else + auth = AuthenticateResponse(data, mSecrets.GetSharedSecret(ep.Address.ToString)) + End If + If Not auth Then + Exit Sub + End If + + + Dim packet As New RADIUSPacket(data, ep, Me) + HandlePacket(packet) + End Sub + + Private Function AuthenticateRequest(ByRef dataBytes() As Byte, ByVal secret As String) As Boolean + If dataBytes Is Nothing Then Return False + If dataBytes(0) = RadiusPacketCode.AccessRequest Then Return True + If secret Is Nothing Then Return False + Dim res As Boolean = True + Dim i As Integer + Dim hasher As System.Security.Cryptography.MD5 = System.Security.Cryptography.MD5.Create + Dim expectedHash() As Byte = {} + + Array.Resize(Of Byte)(expectedHash, dataBytes.Length + secret.Length) + dataBytes.CopyTo(expectedHash, 0) + ConvertToBytes(secret).CopyTo(expectedHash, dataBytes.Length) + + For i = 4 To 19 : expectedHash(i) = 0 : Next ' Setting authenticator to zero... + + expectedHash = hasher.ComputeHash(expectedHash) + + ' Compare ... + i = 4 : Do While res And i <= 19 : If dataBytes(i) <> expectedHash(i - 4) Then : res = False : End If : i += 1 : Loop + + Return res + End Function + + Private Function AuthenticateResponse(ByRef dataBytes() As Byte, ByVal secret As String) As Boolean + If secret Is Nothing Then Return False + If secret = "" Then Return False + Dim res As Boolean = True + Dim i As Integer + Dim hasher As System.Security.Cryptography.MD5 = System.Security.Cryptography.MD5.Create + Dim expectedHash() As Byte = {} + + Array.Resize(Of Byte)(expectedHash, dataBytes.Length + secret.Length) + dataBytes.CopyTo(expectedHash, 0) + ConvertToBytes(secret).CopyTo(expectedHash, dataBytes.Length) + + For i = 4 To 19 : expectedHash(i) = mLastAuthenticator(i - 4) : Next ' Setting authenticator to zero... + + expectedHash = hasher.ComputeHash(expectedHash) + + ' Compare ... + i = 4 : Do While res And i <= 19 : If dataBytes(i) <> expectedHash(i - 4) Then : res = False : End If : i += 1 : Loop + + Return res + End Function + +End Class diff --git a/CICRadarR/SmsClass.vb b/CICRadarR/SmsClass.vb new file mode 100644 index 0000000..f636330 --- /dev/null +++ b/CICRadarR/SmsClass.vb @@ -0,0 +1,66 @@ +Imports System +Imports System.Collections.Generic +Imports System.Text +Imports System.Threading +Imports System.IO.Ports +Imports System.Windows.Forms +Namespace SMS + Class SmsClass + Private serialPort As SerialPort + Public Sub New(ByVal comPort As String) + Me.serialPort = New SerialPort() + Me.serialPort.PortName = comPort + Me.serialPort.BaudRate = 38400 + Me.serialPort.Parity = Parity.None + Me.serialPort.DataBits = 8 + Me.serialPort.StopBits = StopBits.One + Me.serialPort.Handshake = Handshake.RequestToSend + Me.serialPort.DtrEnable = True + Me.serialPort.RtsEnable = True + Me.serialPort.NewLine = System.Environment.NewLine + End Sub + Public Function sendSms(ByVal cellNo As String, ByVal sms As String, ByVal SMSC As String) As Boolean + Dim messages As String = Nothing + messages = sms + If Me.serialPort.IsOpen = True Then + Try + Me.serialPort.WriteLine("AT" + Chr(13)) + Thread.Sleep(4) + Me.serialPort.WriteLine("AT+CSCA=""" + SMSC + """" + Chr(13)) + Thread.Sleep(30) + Me.serialPort.WriteLine(Chr(13)) + Thread.Sleep(30) + Me.serialPort.WriteLine("AT+CMGS=""" + cellNo + """") + + Thread.Sleep(30) + Me.serialPort.WriteLine(messages + Chr(26)) + Catch ex As Exception + MessageBox.Show(ex.Source) + End Try + Return True + Else + Return False + End If + End Function + + Public Sub Opens() + + If Me.serialPort.IsOpen = False Then + Try + 'bool ok =this.serialPort.IsOpen //does not work between 2 treads + + Me.serialPort.Open() + Catch + Thread.Sleep(1000) + 'wait for the port to get ready if + Opens() + End Try + End If + End Sub + Public Sub Closes() + If Me.serialPort.IsOpen = True Then + Me.serialPort.Close() + End If + End Sub + End Class +End Namespace diff --git a/CICRadarR/TestService.Designer.vb b/CICRadarR/TestService.Designer.vb new file mode 100644 index 0000000..2a5077b --- /dev/null +++ b/CICRadarR/TestService.Designer.vb @@ -0,0 +1,73 @@ + _ +Partial Class TestService + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.btnStart = New System.Windows.Forms.Button() + Me.btnStop = New System.Windows.Forms.Button() + Me.Button1 = New System.Windows.Forms.Button() + Me.SuspendLayout() + ' + 'btnStart + ' + Me.btnStart.Location = New System.Drawing.Point(38, 41) + Me.btnStart.Name = "btnStart" + Me.btnStart.Size = New System.Drawing.Size(75, 23) + Me.btnStart.TabIndex = 0 + Me.btnStart.Text = "Start" + Me.btnStart.UseVisualStyleBackColor = True + ' + 'btnStop + ' + Me.btnStop.Location = New System.Drawing.Point(38, 95) + Me.btnStop.Name = "btnStop" + Me.btnStop.Size = New System.Drawing.Size(75, 23) + Me.btnStop.TabIndex = 1 + Me.btnStop.Text = "Stop" + Me.btnStop.UseVisualStyleBackColor = True + ' + 'Button1 + ' + Me.Button1.Location = New System.Drawing.Point(175, 40) + Me.Button1.Name = "Button1" + Me.Button1.Size = New System.Drawing.Size(75, 23) + Me.Button1.TabIndex = 2 + Me.Button1.Text = "Button1" + Me.Button1.UseVisualStyleBackColor = True + ' + 'TestService + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(292, 273) + Me.Controls.Add(Me.Button1) + Me.Controls.Add(Me.btnStop) + Me.Controls.Add(Me.btnStart) + Me.Name = "TestService" + Me.Text = "TestService" + Me.ResumeLayout(False) + + End Sub + Friend WithEvents btnStart As System.Windows.Forms.Button + Friend WithEvents btnStop As System.Windows.Forms.Button + Friend WithEvents Button1 As System.Windows.Forms.Button +End Class diff --git a/CICRadarR/TestService.resx b/CICRadarR/TestService.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/CICRadarR/TestService.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CICRadarR/TestService.vb b/CICRadarR/TestService.vb new file mode 100644 index 0000000..cc00252 --- /dev/null +++ b/CICRadarR/TestService.vb @@ -0,0 +1,44 @@ +Imports CICRadarR + +Public Class TestService + + Private Radius_Service As New CICRadarR + Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click + btnStart.Enabled = False + Call Radius_Service.OnstartTest() + End Sub + + + Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click + Call Radius_Service.OnStopTest() + End + End Sub + + Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click + Button1.Enabled = False + Dim SessionTimeOut As Integer = 1 + Dim TSGWSessionIdTimeStampHash As New Hashtable + Dim TSGWSessionIdHash As New Hashtable + TSGWSessionIdTimeStampHash.Add("ged", Now) + Threading.Thread.Sleep(65000) + Dim timeValid As Long = 0 + Dim hashTime As DateTime = DirectCast(TSGWSessionIdTimeStampHash("ged"), DateTime) + timeValid = DateDiff(DateInterval.Second, hashTime, Now) + MsgBox(timeValid) + + + Dim Item As DictionaryEntry + + + For Each Item In TSGWSessionIdTimeStampHash + Dim hTime As DateTime = DirectCast(Item.Value, DateTime) + Dim tValid = DateDiff(DateInterval.Minute, hTime, Now) + If tValid >= SessionTimeOut Then + TSGWSessionIdTimeStampHash.Remove(Item.Key) + If TSGWSessionIdHash.Contains(Item.Key) Then + TSGWSessionIdHash.Remove(Item.Key) + End If + End If + Next + End Sub +End Class \ No newline at end of file diff --git a/CICRadarR/UDPServer.vb b/CICRadarR/UDPServer.vb new file mode 100644 index 0000000..84783f3 --- /dev/null +++ b/CICRadarR/UDPServer.vb @@ -0,0 +1,57 @@ +Imports System.Net +Imports System.Net.Sockets + +Friend Class UDPServer + + Private mSocket As UdpClient + Private mAsyncResult As IAsyncResult + + Friend Delegate Sub UDPPacketHandler(ByRef data() As Byte, ByRef endPoint As IPEndPoint) + + Private HandlePacket As UDPPacketHandler + + Friend Sub New(ByVal portNumber As Integer, ByVal onDataArrived As UDPPacketHandler) + mSocket = New UdpClient(portNumber) + HandlePacket = onDataArrived + commonNew() + End Sub + + Friend Sub New(ByVal ipAddress As String, ByVal portNumber As Integer, ByVal onDataArrived As UDPPacketHandler) + Dim ep As New IPEndPoint(System.Net.IPAddress.Parse(ipAddress), portNumber) + mSocket = New UdpClient(ep) + HandlePacket = onDataArrived + commonNew() + End Sub + + Private Sub commonNew() + mAsyncResult = mSocket.BeginReceive(New AsyncCallback(AddressOf DataReceived), Nothing) + End Sub + + + + Private Sub DataReceived(ByVal ar As IAsyncResult) + Dim ep As New IPEndPoint(0, 0) + Dim ef As Boolean = False + Dim data() As Byte = {} + Try + data = mSocket.EndReceive(mAsyncResult, ep) + Catch ex As System.Net.Sockets.SocketException + If ex.SocketErrorCode = 10054 Then ' Client killed connection + ef = False + Else + ef = True + End If + + End Try + If Not ef Then + mAsyncResult = mSocket.BeginReceive(New AsyncCallback(AddressOf DataReceived), Nothing) + HandlePacket(data, ep) + + End If + End Sub + + Friend Sub Send(ByRef data() As Byte, ByRef endPoint As IPEndPoint) + mSocket.Send(data, data.Length, endPoint) + End Sub + +End Class diff --git a/CICRadarR/VSA.vb b/CICRadarR/VSA.vb new file mode 100644 index 0000000..ea0cc4d --- /dev/null +++ b/CICRadarR/VSA.vb @@ -0,0 +1,131 @@ +'Copyright (C) 2008-2011 Nikolay Semov + +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. + +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +' GNU General Public License for more details. + +' You should have received a copy of the GNU General Public License +' along with this program. If not, see . + +Imports CICRadarR.Conversion + +Public Class CiscoAVPair + + Private mVendorType As CiscoAVPairType + Private mVendorName As String + Private mVendorValue As String + + Public ReadOnly Property VendorType() As CiscoAVPairType + Get + Return mVendorType + End Get + End Property + + Public ReadOnly Property VendorName() As String + Get + Return mVendorName + End Get + End Property + + Public ReadOnly Property VendorValue() As String + Get + Return mVendorValue + End Get + End Property + + Public Function GetTimeStamp() As DateTime + Return ConvertToDateTime(mVendorValue) + End Function + + Friend Sub New(ByRef value() As Byte) + mVendorType = CiscoAVPairType.Invalid + mVendorName = "" + mVendorValue = "" + If value.Length < 6 Then Exit Sub + If Not (value(0) = 0 And value(1) = 0 And value(2) = 0 And value(3) = 9) Then Exit Sub + If value.Length <> value(5) + 4 Then Exit Sub + mVendorType = value(4) + mVendorName = "generic" + Dim v() As Byte = {} + Array.Resize(v, value.Length - 6) + Array.Copy(value, 6, v, 0, v.Length) + mVendorValue = ConvertToString(v) + If VendorValue.Contains("=") Then + mVendorName = Left(VendorValue, InStr(VendorValue, "=") - 1) + mVendorValue = Right(VendorValue, VendorValue.Length - VendorName.Length - 1) + End If + If VendorName = "h323-ivr-in" Then mVendorType = CiscoAVPairType.IVR_In + If VendorName = "h323-ivr-out" Then mVendorType = CiscoAVPairType.IVR_Out + End Sub + + Public Sub New(ByVal type As CiscoAVPairType, ByVal value As String) + mVendorType = type + If type = CiscoAVPairType.Invalid Then + mVendorName = "" + mVendorValue = "" + ElseIf type = CiscoAVPairType.Generic Then + mVendorName = "generic" + mVendorValue = value + Else + mVendorName = "h323-" & Replace(LCase(type.ToString), "_", "-") + mVendorValue = value + End If + End Sub + + Public Sub New(ByVal name As String, ByVal value As String) + mVendorType = CiscoAVPairType.Generic + mVendorName = name + mVendorValue = value + End Sub + + Public Sub GetRADIUSAttribute(ByRef attributes As RADIUSAttributes) + If attributes Is Nothing Then Exit Sub + If mVendorType = CiscoAVPairType.Invalid Then Exit Sub + Dim data() As Byte = {} + Dim len As Byte = 6 + Dim lvt As Byte = mVendorType + If lvt = CiscoAVPairType.IVR_In Or lvt = CiscoAVPairType.IVR_Out Then lvt = 1 + If VendorName = "generic" Then + len += VendorValue.Length + Array.Resize(data, len) + ConvertToBytes(VendorValue).CopyTo(data, 6) + Else + len += VendorName.Length + 1 + VendorValue.Length + Array.Resize(data, len) + ConvertToBytes(VendorName & "=" & VendorValue).CopyTo(data, 6) + End If + + data(4) = lvt + data(5) = len - 4 + data(0) = 0 + data(1) = 0 + data(2) = 0 + data(3) = 9 + Dim attr As New RADIUSAttribute(RadiusAttributeType.VendorSpecific, data) + attributes.Add(attr) + End Sub + +End Class + +Public Enum CiscoAVPairType As Byte + Invalid = 0 + Generic = 1 + Remote_Address = 23 + Conf_Id = 24 + Setup_Time = 25 + Call_Origin = 26 + Call_Type = 27 + Connect_Time = 28 + Disconnect_Time = 29 + Disconnect_Cause = 30 + Voice_Quality = 31 + GW_Id = 33 + IVR_In = 201 + IVR_Out = 202 +End Enum \ No newline at end of file diff --git a/CICRadarR/VendorSpefic.vb b/CICRadarR/VendorSpefic.vb new file mode 100644 index 0000000..9cf121f --- /dev/null +++ b/CICRadarR/VendorSpefic.vb @@ -0,0 +1,142 @@ + + +Imports CICRadarR.Conversion + +Public Class VendorSpecificAttribute + + Private mVendorType As VendorSpecificType + Private mVendorName As String + Private mVendorValue As String + + Public ReadOnly Property VendorType() As VendorSpecificType + Get + Return mVendorType + End Get + End Property + + Public ReadOnly Property VendorName() As String + Get + Return mVendorName + End Get + End Property + + Public ReadOnly Property VendorValue() As String + Get + Return mVendorValue + End Get + End Property + + Public Function GetTimeStamp() As DateTime + Return ConvertToDateTime(mVendorValue) + End Function + + Friend Sub New(ByRef value() As Byte) + mVendorType = VendorSpecificType.Invalid + mVendorName = "" + mVendorValue = "" + If value.Length < 6 Then + Exit Sub + End If + + If value.Length <> value(5) + 4 Then + Exit Sub + End If + + mVendorType = value(4) + If mVendorType = 47 Then + mVendorName = "generic" + mVendorValue = "TSGateway" + Else + + mVendorName = "generic" + Dim v() As Byte = {} + Array.Resize(v, value.Length - 6) + Array.Copy(value, 6, v, 0, v.Length) + mVendorValue = ConvertToString(v) + End If + End Sub + + Public Sub New(ByVal type As VendorSpecificType, ByVal value As String) + mVendorType = type + If type = VendorSpecificType.Invalid Then + mVendorName = "" + mVendorValue = "" + ElseIf type = VendorSpecificType.Generic Then + mVendorName = "generic" + mVendorValue = value + + End If + End Sub + + + + Public Sub New(ByVal name As String, ByVal value As String) + mVendorType = VendorSpecificType.Generic + mVendorName = name + mVendorValue = value + End Sub + + Public Function ToBytes(data As String) As Byte() + Dim newdata() As Byte = ConvertToBytes(data) + Return newdata + End Function + + Public Sub GetRADIUSAttribute(ByRef attributes As RADIUSAttributes) + If attributes Is Nothing Then Exit Sub + If mVendorType = VendorSpecificType.Invalid Then + Exit Sub + End If + + Dim data() As Byte = {} + Dim len As Byte = 6 + Dim lvt As Byte = mVendorType + ' If lvt = CiscoAVPairType.IVR_In Or lvt = CiscoAVPairType.IVR_Out Then lvt = 1 + If VendorName = "generic" Then + len += VendorValue.Length + Array.Resize(data, len) + ConvertToBytes(VendorValue).CopyTo(data, 6) + Else + len += VendorName.Length + 1 + VendorValue.Length + Array.Resize(data, len) + ConvertToBytes(VendorName & "=" & VendorValue).CopyTo(data, 6) + End If + + data(4) = lvt + data(5) = len - 4 + data(0) = 0 + data(1) = 0 + data(2) = 0 + data(3) = 9 + Dim attr As New RADIUSAttribute(RadiusAttributeType.VendorSpecific, data) + attributes.Add(attr) + End Sub + + Public Sub SetRADIUSAttribute(ByRef attributes As RADIUSAttributes) + + If mVendorType = VendorSpecificType.Invalid Then Exit Sub + Dim data() As Byte = {} + Dim len As Byte = 6 + Dim lvt As Byte = mVendorType + + + len += VendorValue.Length + Array.Resize(data, len) + ConvertToBytes(VendorValue).CopyTo(data, 6) + + data(4) = lvt + data(5) = len - 4 + data(0) = 0 + data(1) = 0 + data(2) = 2 ' Generic value 666. Not sure if this confilct with other vendor, but RFC does not list existing vendor id's + data(3) = 154 + Dim attr As New RADIUSAttribute(RadiusAttributeType.VendorSpecific, data) + attributes.Add(attr) + End Sub + +End Class + +Public Enum VendorSpecificType As Byte + Invalid = 0 + Generic = 1 + +End Enum \ No newline at end of file diff --git a/CICRadarR/bin/Debug/CICRadarR.InstallLog b/CICRadarR/bin/Debug/CICRadarR.InstallLog new file mode 100644 index 0000000..2dc50e2 --- /dev/null +++ b/CICRadarR/bin/Debug/CICRadarR.InstallLog @@ -0,0 +1,97 @@ +Installing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +No public installers with the RunInstallerAttribute.Yes attribute could be found in the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly. +Committing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +No public installers with the RunInstallerAttribute.Yes attribute could be found in the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly. +Remove InstallState file because there are no installers. +Installing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +No public installers with the RunInstallerAttribute.Yes attribute could be found in the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly. +Committing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +No public installers with the RunInstallerAttribute.Yes attribute could be found in the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly. +Remove InstallState file because there are no installers. +Installing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +Installing service CICRadiusR... +Creating EventLog source CICRadiusR in log Application... +Rolling back assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +Restoring event log to previous state for source CICRadiusR. +Installing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +No public installers with the RunInstallerAttribute.Yes attribute could be found in the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly. +Committing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +No public installers with the RunInstallerAttribute.Yes attribute could be found in the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly. +Remove InstallState file because there are no installers. +Installing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +No public installers with the RunInstallerAttribute.Yes attribute could be found in the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly. +Committing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +No public installers with the RunInstallerAttribute.Yes attribute could be found in the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly. +Remove InstallState file because there are no installers. +Installing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +Rolling back assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +Installing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +Installing service CICRadiusR... +Service CICRadiusR has been successfully installed. +Creating EventLog source CICRadiusR in log Application... +Committing assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +Uninstalling assembly 'C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe'. +Affected parameters are: + logtoconsole = + logfile = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog + assemblypath = C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +Removing EventLog source CICRadiusR. +Service CICRadiusR is being removed from the system... +Service CICRadiusR was successfully removed from the system. +Attempt to stop service CICRadiusR. diff --git a/CICRadarR/bin/Debug/CICRadarR.exe b/CICRadarR/bin/Debug/CICRadarR.exe new file mode 100644 index 0000000..aa75e40 Binary files /dev/null and b/CICRadarR/bin/Debug/CICRadarR.exe differ diff --git a/CICRadarR/bin/Debug/CICRadarR.ini b/CICRadarR/bin/Debug/CICRadarR.ini new file mode 100644 index 0000000..73fb786 --- /dev/null +++ b/CICRadarR/bin/Debug/CICRadarR.ini @@ -0,0 +1,23 @@ +[CICRadarR] +USELOCALMODEM=0 +SMSC=+4540390999 +Debug=1 +ADField=telephoneNumber +COMPORT=com1 +NetBiosDomain=isager +ClientList=10.10.10.47,192.168.1.139,192.168.1.101,192.168.1.61,192.168.1.44 +LDAPDomain=isager.lan +Provider=https://www.cpsms.dk/sms/?username=myuser&password=mypassword&recipient=***NUMBER***&message=***TEXTMESSAGE***&from=CPSMS +EnableOTP=1 +TSGW=1 +EnableSMS=1 +EnableEmail=1 +MailServer=192.168.1.25 +SenderEmail=noreply@isager.dk +ADMailfield=mail +[Clients] +10.10.10.47=iirseiKUQCWnjfg1ZLhF+w== +192.168.1.101=eXA0YJxFrgfaDtOFApCifbPtJYrEL0RjpDzymPKlw6c= +192.168.1.61=p2fyLMddDfH8aLYwMyDbhQ1l3MY9hAJxx6DyiUOhjXw= +192.168.1.139=eXA0YJxFrgfaDtOFApCifbPtJYrEL0RjpDzymPKlw6c= +192.168.1.44=eXA0YJxFrgfaDtOFApCifbPtJYrEL0RjpDzymPKlw6c= \ No newline at end of file diff --git a/CICRadarR/bin/Debug/CICRadarR.pdb b/CICRadarR/bin/Debug/CICRadarR.pdb new file mode 100644 index 0000000..ff578c0 Binary files /dev/null and b/CICRadarR/bin/Debug/CICRadarR.pdb differ diff --git a/CICRadarR/bin/Debug/CICRadarR.vshost.exe b/CICRadarR/bin/Debug/CICRadarR.vshost.exe new file mode 100644 index 0000000..bb84a51 Binary files /dev/null and b/CICRadarR/bin/Debug/CICRadarR.vshost.exe differ diff --git a/CICRadarR/bin/Debug/CICRadarR.vshost.exe.manifest b/CICRadarR/bin/Debug/CICRadarR.vshost.exe.manifest new file mode 100644 index 0000000..cbe08de --- /dev/null +++ b/CICRadarR/bin/Debug/CICRadarR.vshost.exe.manifest @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CICRadarR/bin/Debug/CICRadarR.xml b/CICRadarR/bin/Debug/CICRadarR.xml new file mode 100644 index 0000000..202a90a --- /dev/null +++ b/CICRadarR/bin/Debug/CICRadarR.xml @@ -0,0 +1,66 @@ + + + + +CICRadarR + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + Returns the username supplied in an Access Request. Returns + Nothing if a User-Name attribute is missing or the packet is not an + Access Request. + + + + + + + Returns the password supplied in an Access Request. Returns + Nothing is a User-Password attribute is missing or the packet is not + an Access Request. + + + + + + + Deprecated. User the UserName and UserPassword properties instead. + + + + + + + + Accept the access request. + + + + + Accept the access request and include the specified attributes in the RADIUS response. + + The RADIUS attributes to include with the response. + + + + Reject the access request. + + + + + \ No newline at end of file diff --git a/CICRadarR/bin/Debug/InstallUtil.InstallLog b/CICRadarR/bin/Debug/InstallUtil.InstallLog new file mode 100644 index 0000000..5acbc53 --- /dev/null +++ b/CICRadarR/bin/Debug/InstallUtil.InstallLog @@ -0,0 +1,111 @@ + +Running a transacted installation. + +Beginning the Install phase of the installation. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Install phase completed successfully, and the Commit phase is beginning. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Commit phase completed successfully. + +The transacted install has completed. + +Running a transacted installation. + +Beginning the Install phase of the installation. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Install phase completed successfully, and the Commit phase is beginning. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Commit phase completed successfully. + +The transacted install has completed. + +Running a transacted installation. + +Beginning the Install phase of the installation. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +An exception occurred during the Install phase. +System.InvalidOperationException: Installation failed due to the absence of a ServiceProcessInstaller. The ServiceProcessInstaller must either be the containing installer, or it must be present in the Installers collection on the same installer as the ServiceInstaller. + +The Rollback phase of the installation is beginning. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Rollback phase completed successfully. + +The transacted install has completed. + +Running a transacted installation. + +Beginning the Install phase of the installation. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Install phase completed successfully, and the Commit phase is beginning. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Commit phase completed successfully. + +The transacted install has completed. + +Running a transacted installation. + +Beginning the Install phase of the installation. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Install phase completed successfully, and the Commit phase is beginning. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Commit phase completed successfully. + +The transacted install has completed. + +Running a transacted installation. + +Beginning the Install phase of the installation. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +An exception occurred during the Install phase. +System.InvalidOperationException: User has canceled installation of services in executable C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe. + +The Rollback phase of the installation is beginning. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Rollback phase completed successfully. + +The transacted install has completed. + +Running a transacted installation. + +Beginning the Install phase of the installation. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Install phase completed successfully, and the Commit phase is beginning. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The Commit phase completed successfully. + +The transacted install has completed. + + +The uninstall is beginning. +See the contents of the log file for the C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe assembly's progress. +The file is located at C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.InstallLog. + +The uninstall has completed. diff --git a/CICRadarR/bin/Release/CICRadarR.exe b/CICRadarR/bin/Release/CICRadarR.exe new file mode 100644 index 0000000..f292636 Binary files /dev/null and b/CICRadarR/bin/Release/CICRadarR.exe differ diff --git a/CICRadarR/bin/Release/CICRadarR.pdb b/CICRadarR/bin/Release/CICRadarR.pdb new file mode 100644 index 0000000..9c160ba Binary files /dev/null and b/CICRadarR/bin/Release/CICRadarR.pdb differ diff --git a/CICRadarR/bin/Release/CICRadarR.vshost.exe b/CICRadarR/bin/Release/CICRadarR.vshost.exe new file mode 100644 index 0000000..bb84a51 Binary files /dev/null and b/CICRadarR/bin/Release/CICRadarR.vshost.exe differ diff --git a/CICRadarR/bin/Release/CICRadarR.vshost.exe.manifest b/CICRadarR/bin/Release/CICRadarR.vshost.exe.manifest new file mode 100644 index 0000000..cbe08de --- /dev/null +++ b/CICRadarR/bin/Release/CICRadarR.vshost.exe.manifest @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CICRadarR/bin/Release/CICRadarR.xml b/CICRadarR/bin/Release/CICRadarR.xml new file mode 100644 index 0000000..202a90a --- /dev/null +++ b/CICRadarR/bin/Release/CICRadarR.xml @@ -0,0 +1,66 @@ + + + + +CICRadarR + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + Returns the username supplied in an Access Request. Returns + Nothing if a User-Name attribute is missing or the packet is not an + Access Request. + + + + + + + Returns the password supplied in an Access Request. Returns + Nothing is a User-Password attribute is missing or the packet is not + an Access Request. + + + + + + + Deprecated. User the UserName and UserPassword properties instead. + + + + + + + + Accept the access request. + + + + + Accept the access request and include the specified attributes in the RADIUS response. + + The RADIUS attributes to include with the response. + + + + Reject the access request. + + + + + \ No newline at end of file diff --git a/CICRadarR/obj/x86/Debug/CICRadarR.CICRadarR.resources b/CICRadarR/obj/x86/Debug/CICRadarR.CICRadarR.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/CICRadarR/obj/x86/Debug/CICRadarR.CICRadarR.resources differ diff --git a/CICRadarR/obj/x86/Debug/CICRadarR.ProjectInstaller.resources b/CICRadarR/obj/x86/Debug/CICRadarR.ProjectInstaller.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/CICRadarR/obj/x86/Debug/CICRadarR.ProjectInstaller.resources differ diff --git a/CICRadarR/obj/x86/Debug/CICRadarR.Resources.resources b/CICRadarR/obj/x86/Debug/CICRadarR.Resources.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/CICRadarR/obj/x86/Debug/CICRadarR.Resources.resources differ diff --git a/CICRadarR/obj/x86/Debug/CICRadarR.TestService.resources b/CICRadarR/obj/x86/Debug/CICRadarR.TestService.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/CICRadarR/obj/x86/Debug/CICRadarR.TestService.resources differ diff --git a/CICRadarR/obj/x86/Debug/CICRadarR.exe b/CICRadarR/obj/x86/Debug/CICRadarR.exe new file mode 100644 index 0000000..aa75e40 Binary files /dev/null and b/CICRadarR/obj/x86/Debug/CICRadarR.exe differ diff --git a/CICRadarR/obj/x86/Debug/CICRadarR.pdb b/CICRadarR/obj/x86/Debug/CICRadarR.pdb new file mode 100644 index 0000000..ff578c0 Binary files /dev/null and b/CICRadarR/obj/x86/Debug/CICRadarR.pdb differ diff --git a/CICRadarR/obj/x86/Debug/CICRadarR.vbproj.FileListAbsolute.txt b/CICRadarR/obj/x86/Debug/CICRadarR.vbproj.FileListAbsolute.txt new file mode 100644 index 0000000..e7e0065 --- /dev/null +++ b/CICRadarR/obj/x86/Debug/CICRadarR.vbproj.FileListAbsolute.txt @@ -0,0 +1,21 @@ +C:\CICRadarR\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +C:\CICRadarR\CICRadarR\CICRadarR\bin\Debug\CICRadarR.pdb +C:\CICRadarR\CICRadarR\CICRadarR\bin\Debug\CICRadarR.xml +C:\CICRadarR\CICRadarR\CICRadarR\obj\x86\Debug\ResolveAssemblyReference.cache +C:\CICRadarR\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.Resources.resources +C:\CICRadarR\CICRadarR\CICRadarR\obj\x86\Debug\GenerateResource.read.1.tlog +C:\CICRadarR\CICRadarR\CICRadarR\obj\x86\Debug\GenerateResource.write.1.tlog +C:\CICRadarR\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.exe +C:\CICRadarR\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.xml +C:\CICRadarR\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.pdb +C:\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.exe +C:\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.xml +C:\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.pdb +C:\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.Resources.resources +C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.exe +C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.pdb +C:\CICRadarR\CICRadarR\bin\Debug\CICRadarR.xml +C:\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.TestService.resources +C:\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.CICRadarR.resources +C:\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.ProjectInstaller.resources +C:\CICRadarR\CICRadarR\obj\x86\Debug\CICRadarR.vbproj.GenerateResource.Cache diff --git a/CICRadarR/obj/x86/Debug/CICRadarR.vbproj.GenerateResource.Cache b/CICRadarR/obj/x86/Debug/CICRadarR.vbproj.GenerateResource.Cache new file mode 100644 index 0000000..4b7edf7 Binary files /dev/null and b/CICRadarR/obj/x86/Debug/CICRadarR.vbproj.GenerateResource.Cache differ diff --git a/CICRadarR/obj/x86/Debug/CICRadarR.xml b/CICRadarR/obj/x86/Debug/CICRadarR.xml new file mode 100644 index 0000000..202a90a --- /dev/null +++ b/CICRadarR/obj/x86/Debug/CICRadarR.xml @@ -0,0 +1,66 @@ + + + + +CICRadarR + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + Returns the username supplied in an Access Request. Returns + Nothing if a User-Name attribute is missing or the packet is not an + Access Request. + + + + + + + Returns the password supplied in an Access Request. Returns + Nothing is a User-Password attribute is missing or the packet is not + an Access Request. + + + + + + + Deprecated. User the UserName and UserPassword properties instead. + + + + + + + + Accept the access request. + + + + + Accept the access request and include the specified attributes in the RADIUS response. + + The RADIUS attributes to include with the response. + + + + Reject the access request. + + + + + \ No newline at end of file diff --git a/CICRadarR/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache b/CICRadarR/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000..bf2bc8a Binary files /dev/null and b/CICRadarR/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache differ diff --git a/CICRadarR/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/CICRadarR/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..2f1608c Binary files /dev/null and b/CICRadarR/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/CICRadarR/obj/x86/Debug/TempPE/My Project.Resources.Designer.vb.dll b/CICRadarR/obj/x86/Debug/TempPE/My Project.Resources.Designer.vb.dll new file mode 100644 index 0000000..6d7cfaf Binary files /dev/null and b/CICRadarR/obj/x86/Debug/TempPE/My Project.Resources.Designer.vb.dll differ diff --git a/CICRadarR/obj/x86/Release/CICRadarR.CICRadarR.resources b/CICRadarR/obj/x86/Release/CICRadarR.CICRadarR.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/CICRadarR/obj/x86/Release/CICRadarR.CICRadarR.resources differ diff --git a/CICRadarR/obj/x86/Release/CICRadarR.ProjectInstaller.resources b/CICRadarR/obj/x86/Release/CICRadarR.ProjectInstaller.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/CICRadarR/obj/x86/Release/CICRadarR.ProjectInstaller.resources differ diff --git a/CICRadarR/obj/x86/Release/CICRadarR.Resources.resources b/CICRadarR/obj/x86/Release/CICRadarR.Resources.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/CICRadarR/obj/x86/Release/CICRadarR.Resources.resources differ diff --git a/CICRadarR/obj/x86/Release/CICRadarR.TestService.resources b/CICRadarR/obj/x86/Release/CICRadarR.TestService.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/CICRadarR/obj/x86/Release/CICRadarR.TestService.resources differ diff --git a/CICRadarR/obj/x86/Release/CICRadarR.exe b/CICRadarR/obj/x86/Release/CICRadarR.exe new file mode 100644 index 0000000..f292636 Binary files /dev/null and b/CICRadarR/obj/x86/Release/CICRadarR.exe differ diff --git a/CICRadarR/obj/x86/Release/CICRadarR.pdb b/CICRadarR/obj/x86/Release/CICRadarR.pdb new file mode 100644 index 0000000..9c160ba Binary files /dev/null and b/CICRadarR/obj/x86/Release/CICRadarR.pdb differ diff --git a/CICRadarR/obj/x86/Release/CICRadarR.vbproj.FileListAbsolute.txt b/CICRadarR/obj/x86/Release/CICRadarR.vbproj.FileListAbsolute.txt new file mode 100644 index 0000000..a79e0e7 --- /dev/null +++ b/CICRadarR/obj/x86/Release/CICRadarR.vbproj.FileListAbsolute.txt @@ -0,0 +1,13 @@ +C:\CICRadarR\CICRadarR\bin\Release\CICRadarR.exe +C:\CICRadarR\CICRadarR\bin\Release\CICRadarR.pdb +C:\CICRadarR\CICRadarR\bin\Release\CICRadarR.xml +C:\CICRadarR\CICRadarR\obj\x86\Release\ResolveAssemblyReference.cache +C:\CICRadarR\CICRadarR\obj\x86\Release\CICRadarR.CICRadarR.resources +C:\CICRadarR\CICRadarR\obj\x86\Release\CICRadarR.Resources.resources +C:\CICRadarR\CICRadarR\obj\x86\Release\CICRadarR.ProjectInstaller.resources +C:\CICRadarR\CICRadarR\obj\x86\Release\CICRadarR.TestService.resources +C:\CICRadarR\CICRadarR\obj\x86\Release\GenerateResource.read.1.tlog +C:\CICRadarR\CICRadarR\obj\x86\Release\GenerateResource.write.1.tlog +C:\CICRadarR\CICRadarR\obj\x86\Release\CICRadarR.exe +C:\CICRadarR\CICRadarR\obj\x86\Release\CICRadarR.xml +C:\CICRadarR\CICRadarR\obj\x86\Release\CICRadarR.pdb diff --git a/CICRadarR/obj/x86/Release/CICRadarR.xml b/CICRadarR/obj/x86/Release/CICRadarR.xml new file mode 100644 index 0000000..202a90a --- /dev/null +++ b/CICRadarR/obj/x86/Release/CICRadarR.xml @@ -0,0 +1,66 @@ + + + + +CICRadarR + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + Returns the username supplied in an Access Request. Returns + Nothing if a User-Name attribute is missing or the packet is not an + Access Request. + + + + + + + Returns the password supplied in an Access Request. Returns + Nothing is a User-Password attribute is missing or the packet is not + an Access Request. + + + + + + + Deprecated. User the UserName and UserPassword properties instead. + + + + + + + + Accept the access request. + + + + + Accept the access request and include the specified attributes in the RADIUS response. + + The RADIUS attributes to include with the response. + + + + Reject the access request. + + + + + \ No newline at end of file diff --git a/CICRadarR/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache b/CICRadarR/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..08a8e7f Binary files /dev/null and b/CICRadarR/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/CICRadarR/obj/x86/Release/GenerateResource.read.1.tlog b/CICRadarR/obj/x86/Release/GenerateResource.read.1.tlog new file mode 100644 index 0000000..ed124fc Binary files /dev/null and b/CICRadarR/obj/x86/Release/GenerateResource.read.1.tlog differ diff --git a/CICRadarR/obj/x86/Release/GenerateResource.write.1.tlog b/CICRadarR/obj/x86/Release/GenerateResource.write.1.tlog new file mode 100644 index 0000000..f28e113 Binary files /dev/null and b/CICRadarR/obj/x86/Release/GenerateResource.write.1.tlog differ diff --git a/CICRadarR/obj/x86/Release/TempPE/My Project.Resources.Designer.vb.dll b/CICRadarR/obj/x86/Release/TempPE/My Project.Resources.Designer.vb.dll new file mode 100644 index 0000000..1b67377 Binary files /dev/null and b/CICRadarR/obj/x86/Release/TempPE/My Project.Resources.Designer.vb.dll differ diff --git a/CICRadarR/random.vb b/CICRadarR/random.vb new file mode 100644 index 0000000..c68f37d --- /dev/null +++ b/CICRadarR/random.vb @@ -0,0 +1,135 @@ + +Imports System +Imports System.Security.Cryptography + + +Namespace Security + Public Enum RandomPasswordOptions + Alpha = 1 + Numeric = 2 + AlphaNumeric = Alpha + Numeric + AlphaNumericSpecial = 4 + End Enum + + Public Class RandomPasswordGenerator + ' Define default password length. + Private Shared DEFAULT_PASSWORD_LENGTH As Integer = 2 + + 'No characters that are confusing: i, I, l, L, o, O, 0, 1, u, v + + Private Shared PASSWORD_CHARS_Alpha As String = "abcdefghjkmnpqrstwxyzABCDEFGHJKMNPQRSTWXYZ" + Private Shared PASSWORD_CHARS_NUMERIC As String = "23456789" + Private Shared PASSWORD_CHARS_SPECIAL As String = "" + +#Region "Overloads" + + ''' + ''' Generates a random password with the default length. + ''' + ''' Randomly generated password. + Public Shared Function Generate() As String + Return Generate(DEFAULT_PASSWORD_LENGTH, RandomPasswordOptions.AlphaNumericSpecial) + End Function + + ''' + ''' Generates a random password with the default length. + ''' + ''' Randomly generated password. + Public Shared Function Generate(ByVal [option] As RandomPasswordOptions) As String + Return Generate(DEFAULT_PASSWORD_LENGTH, [option]) + End Function + + ''' + ''' Generates a random password with the default length. + ''' + ''' Randomly generated password. + Public Shared Function Generate(ByVal passwordLength As Integer) As String + Return Generate(DEFAULT_PASSWORD_LENGTH, RandomPasswordOptions.AlphaNumericSpecial) + End Function + + ''' + ''' Generates a random password. + ''' + ''' Randomly generated password. + Public Shared Function Generate(ByVal passwordLength As Integer, ByVal [option] As RandomPasswordOptions) As String + Return GeneratePassword(passwordLength, [option]) + End Function + +#End Region + + + ''' + ''' Generates the password. + ''' + ''' + Private Shared Function GeneratePassword(ByVal passwordLength As Integer, ByVal [option] As RandomPasswordOptions) As String + If passwordLength < 0 Then + Return Nothing + End If + + Dim passwordChars = GetCharacters([option]) + + If String.IsNullOrEmpty(passwordChars) Then + Return Nothing + End If + + Dim password = New Char(passwordLength - 1) {} + + Dim random = GetRandom() + + For i As Integer = 0 To passwordLength - 1 + Dim index = random.[Next](passwordChars.Length) + Dim passwordChar = passwordChars(index) + + password(i) = passwordChar + Next + + Return New String(password) + End Function + + + + ''' + ''' Gets the characters selected by the option + ''' + ''' + Private Shared Function GetCharacters(ByVal [option] As RandomPasswordOptions) As String + Select Case [option] + Case RandomPasswordOptions.Alpha + Return PASSWORD_CHARS_Alpha + Case RandomPasswordOptions.Numeric + Return PASSWORD_CHARS_NUMERIC + Case RandomPasswordOptions.AlphaNumeric + Return PASSWORD_CHARS_Alpha + PASSWORD_CHARS_NUMERIC + Case RandomPasswordOptions.AlphaNumericSpecial + Return PASSWORD_CHARS_Alpha + PASSWORD_CHARS_NUMERIC + PASSWORD_CHARS_SPECIAL + Case Else + Exit Select + End Select + Return String.Empty + End Function + + ''' + ''' Gets a random object with a real random seed + ''' + ''' + Private Shared Function GetRandom() As Random + ' Use a 4-byte array to fill it with random bytes and convert it then + ' to an integer value. + Dim randomBytes As Byte() = New Byte(3) {} + + ' Generate 4 random bytes. + Dim rng As New RNGCryptoServiceProvider() + rng.GetBytes(randomBytes) + + ' Convert 4 bytes into a 32-bit integer value. + Dim seed As Integer = (randomBytes(0) And &H7F) << 24 Or randomBytes(1) << 16 Or randomBytes(2) << 8 Or randomBytes(3) + + ' Now, this is real randomization. + Return New Random(seed) + End Function + + + End Class +End Namespace + diff --git a/Console/CICRadarRConfig/CICRadarRConfig.sln b/Console/CICRadarRConfig/CICRadarRConfig.sln new file mode 100644 index 0000000..d956e49 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "CICRadarRConfig", "CICRadarRConfig\CICRadarRConfig.vbproj", "{698299A4-5778-4EE0-9C46-445A9B66F645}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {698299A4-5778-4EE0-9C46-445A9B66F645}.Debug|x86.ActiveCfg = Debug|x86 + {698299A4-5778-4EE0-9C46-445A9B66F645}.Debug|x86.Build.0 = Debug|x86 + {698299A4-5778-4EE0-9C46-445A9B66F645}.Release|x86.ActiveCfg = Release|x86 + {698299A4-5778-4EE0-9C46-445A9B66F645}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Console/CICRadarRConfig/CICRadarRConfig.suo b/Console/CICRadarRConfig/CICRadarRConfig.suo new file mode 100644 index 0000000..1390b30 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig.suo differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/CICRadarRConfig.vbproj b/Console/CICRadarRConfig/CICRadarRConfig/CICRadarRConfig.vbproj new file mode 100644 index 0000000..25673ac --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/CICRadarRConfig.vbproj @@ -0,0 +1,177 @@ + + + + Debug + x86 + + + 2.0 + {698299A4-5778-4EE0-9C46-445A9B66F645} + WinExe + CICRadarRConfig.My.MyApplication + CICRadarRConfig + CICRadarRConfig + 512 + WindowsForms + v4.0 + + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + x86 + true + full + true + true + bin\Debug\ + CICRadarRConfig.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + x86 + pdbonly + false + true + true + bin\Release\ + CICRadarRConfig.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + lock.ico + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + Main.vb + Form + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + + Main.vb + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + + + + False + Microsoft .NET Framework 4 Client Profile %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 3.1 + true + + + + + \ No newline at end of file diff --git a/Console/CICRadarRConfig/CICRadarRConfig/CICRadarRConfig.vbproj.user b/Console/CICRadarRConfig/CICRadarRConfig/CICRadarRConfig.vbproj.user new file mode 100644 index 0000000..1f4a1d7 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/CICRadarRConfig.vbproj.user @@ -0,0 +1,13 @@ + + + + publish\ + + + + + + en-US + false + + \ No newline at end of file diff --git a/Console/CICRadarRConfig/CICRadarRConfig/Crypto.vb b/Console/CICRadarRConfig/CICRadarRConfig/Crypto.vb new file mode 100644 index 0000000..e9afa98 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/Crypto.vb @@ -0,0 +1,344 @@ +Imports System +Imports System.IO +Imports System.Security.Cryptography + +' +' encrypt/decrypt functions +' Parameter checks and error handling +' are ommited for better readability +' + +Public Class EncDec + ' Encrypt a byte array into a byte array using a key and an IV + Public Shared Function Encrypt(ByVal clearData As Byte(), ByVal Key As Byte(), ByVal IV As Byte()) As Byte() + ' Create a MemoryStream to accept the encrypted bytes + Dim ms As New MemoryStream() + + ' Create a symmetric algorithm. + ' We are going to use Rijndael because it is strong and + ' available on all platforms. + ' You can use other algorithms, to do so substitute the + ' next line with something like + ' TripleDES alg = TripleDES.Create(); + Dim alg As Rijndael = Rijndael.Create() + + ' Now set the key and the IV. + ' We need the IV (Initialization Vector) because + ' the algorithm is operating in its default + ' mode called CBC (Cipher Block Chaining). + ' The IV is XORed with the first block (8 byte) + ' of the data before it is encrypted, and then each + ' encrypted block is XORed with the + ' following block of plaintext. + ' This is done to make encryption more secure. + + ' There is also a mode called ECB which does not need an IV, + ' but it is much less secure. + alg.Key = Key + alg.IV = IV + + ' Create a CryptoStream through which we are going to be + ' pumping our data. + ' CryptoStreamMode.Write means that we are going to be + ' writing data to the stream and the output will be written + ' in the MemoryStream we have provided. + Dim cs As New CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write) + + ' Write the data and make it do the encryption + cs.Write(clearData, 0, clearData.Length) + + ' Close the crypto stream (or do FlushFinalBlock). + ' This will tell it that we have done our encryption and + ' there is no more data coming in, + ' and it is now a good time to apply the padding and + ' finalize the encryption process. + cs.Close() + + ' Now get the encrypted data from the MemoryStream. + ' Some people make a mistake of using GetBuffer() here, + ' which is not the right way. + Dim encryptedData As Byte() = ms.ToArray() + + Return encryptedData + End Function + + ' Encrypt a string into a string using a password + ' Uses Encrypt(byte[], byte[], byte[]) + + Public Shared Function Encrypt(ByVal clearText As String, ByVal Password As String) As String + ' First we need to turn the input string into a byte array. + Dim clearBytes As Byte() = System.Text.Encoding.Unicode.GetBytes(clearText) + + ' Then, we need to turn the password into Key and IV + ' We are using salt to make it harder to guess our key + ' using a dictionary attack - + ' trying to guess a password by enumerating all possible words. + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + + ' Now get the key/IV and do the encryption using the + ' function that accepts byte arrays. + ' Using PasswordDeriveBytes object we are first getting + ' 32 bytes for the Key + ' (the default Rijndael key length is 256bit = 32bytes) + ' and then 16 bytes for the IV. + ' IV should always be the block size, which is by default + ' 16 bytes (128 bit) for Rijndael. + ' If you are using DES/TripleDES/RC2 the block size is + ' 8 bytes and so should be the IV size. + ' You can also read KeySize/BlockSize properties off + ' the algorithm to find out the sizes. + Dim encryptedData As Byte() = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16)) + + ' Now we need to turn the resulting byte array into a string. + ' A common mistake would be to use an Encoding class for that. + 'It does not work because not all byte values can be + ' represented by characters. + ' We are going to be using Base64 encoding that is designed + 'exactly for what we are trying to do. + Return Convert.ToBase64String(encryptedData) + + End Function + + ' Encrypt bytes into bytes using a password + ' Uses Encrypt(byte[], byte[], byte[]) + + Public Shared Function Encrypt(ByVal clearData As Byte(), ByVal Password As String) As Byte() + ' We need to turn the password into Key and IV. + ' We are using salt to make it harder to guess our key + ' using a dictionary attack - + ' trying to guess a password by enumerating all possible words. + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + + ' Now get the key/IV and do the encryption using the function + ' that accepts byte arrays. + ' Using PasswordDeriveBytes object we are first getting + ' 32 bytes for the Key + ' (the default Rijndael key length is 256bit = 32bytes) + ' and then 16 bytes for the IV. + ' IV should always be the block size, which is by default + ' 16 bytes (128 bit) for Rijndael. + ' If you are using DES/TripleDES/RC2 the block size is 8 + ' bytes and so should be the IV size. + ' You can also read KeySize/BlockSize properties off the + ' algorithm to find out the sizes. + Return Encrypt(clearData, pdb.GetBytes(32), pdb.GetBytes(16)) + + End Function + + ' Encrypt a file into another file using a password + Public Shared Sub Encrypt(ByVal fileIn As String, ByVal fileOut As String, ByVal Password As String) + + ' First we are going to open the file streams + Dim fsIn As New FileStream(fileIn, FileMode.Open, FileAccess.Read) + Dim fsOut As New FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write) + + ' Then we are going to derive a Key and an IV from the + ' Password and create an algorithm + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + + Dim alg As Rijndael = Rijndael.Create() + alg.Key = pdb.GetBytes(32) + alg.IV = pdb.GetBytes(16) + + ' Now create a crypto stream through which we are going + ' to be pumping data. + ' Our fileOut is going to be receiving the encrypted bytes. + Dim cs As New CryptoStream(fsOut, alg.CreateEncryptor(), CryptoStreamMode.Write) + + ' Now will will initialize a buffer and will be processing + ' the input file in chunks. + ' This is done to avoid reading the whole file (which can + ' be huge) into memory. + Dim bufferLen As Integer = 4096 + Dim buffer As Byte() = New Byte(bufferLen - 1) {} + Dim bytesRead As Integer + + Do + ' read a chunk of data from the input file + bytesRead = fsIn.Read(buffer, 0, bufferLen) + + ' encrypt it + cs.Write(buffer, 0, bytesRead) + Loop While bytesRead <> 0 + + ' close everything + + ' this will also close the unrelying fsOut stream + cs.Close() + fsIn.Close() + End Sub + + ' Decrypt a byte array into a byte array using a key and an IV + Public Shared Function Decrypt(ByVal cipherData As Byte(), ByVal Key As Byte(), ByVal IV As Byte()) As Byte() + ' Create a MemoryStream that is going to accept the + ' decrypted bytes + Dim ms As New MemoryStream() + + ' Create a symmetric algorithm. + ' We are going to use Rijndael because it is strong and + ' available on all platforms. + ' You can use other algorithms, to do so substitute the next + ' line with something like + ' TripleDES alg = TripleDES.Create(); + Dim alg As Rijndael = Rijndael.Create() + + ' Now set the key and the IV. + ' We need the IV (Initialization Vector) because the algorithm + ' is operating in its default + ' mode called CBC (Cipher Block Chaining). The IV is XORed with + ' the first block (8 byte) + ' of the data after it is decrypted, and then each decrypted + ' block is XORed with the previous + ' cipher block. This is done to make encryption more secure. + ' There is also a mode called ECB which does not need an IV, + ' but it is much less secure. + alg.Key = Key + alg.IV = IV + + ' Create a CryptoStream through which we are going to be + ' pumping our data. + ' CryptoStreamMode.Write means that we are going to be + ' writing data to the stream + ' and the output will be written in the MemoryStream + ' we have provided. + Dim cs As New CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write) + + ' Write the data and make it do the decryption + cs.Write(cipherData, 0, cipherData.Length) + + ' Close the crypto stream (or do FlushFinalBlock). + ' This will tell it that we have done our decryption + ' and there is no more data coming in, + ' and it is now a good time to remove the padding + ' and finalize the decryption process. + cs.Close() + + ' Now get the decrypted data from the MemoryStream. + ' Some people make a mistake of using GetBuffer() here, + ' which is not the right way. + Dim decryptedData As Byte() = ms.ToArray() + + Return decryptedData + End Function + + ' Decrypt a string into a string using a password + ' Uses Decrypt(byte[], byte[], byte[]) + + Public Shared Function Decrypt(ByVal cipherText As String, ByVal Password As String) As String + ' First we need to turn the input string into a byte array. + ' We presume that Base64 encoding was used + Dim cipherBytes As Byte() = Convert.FromBase64String(cipherText) + + ' Then, we need to turn the password into Key and IV + ' We are using salt to make it harder to guess our key + ' using a dictionary attack - + ' trying to guess a password by enumerating all possible words. + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + + ' Now get the key/IV and do the decryption using + ' the function that accepts byte arrays. + ' Using PasswordDeriveBytes object we are first + ' getting 32 bytes for the Key + ' (the default Rijndael key length is 256bit = 32bytes) + ' and then 16 bytes for the IV. + ' IV should always be the block size, which is by + ' default 16 bytes (128 bit) for Rijndael. + ' If you are using DES/TripleDES/RC2 the block size is + ' 8 bytes and so should be the IV size. + ' You can also read KeySize/BlockSize properties off + ' the algorithm to find out the sizes. + Dim decryptedData As Byte() = Decrypt(cipherBytes, pdb.GetBytes(32), pdb.GetBytes(16)) + + ' Now we need to turn the resulting byte array into a string. + ' A common mistake would be to use an Encoding class for that. + ' It does not work + ' because not all byte values can be represented by characters. + ' We are going to be using Base64 encoding that is + ' designed exactly for what we are trying to do. + Return System.Text.Encoding.Unicode.GetString(decryptedData) + End Function + + ' Decrypt bytes into bytes using a password + ' Uses Decrypt(byte[], byte[], byte[]) + + Public Shared Function Decrypt(ByVal cipherData As Byte(), ByVal Password As String) As Byte() + ' We need to turn the password into Key and IV. + ' We are using salt to make it harder to guess our key + ' using a dictionary attack - + ' trying to guess a password by enumerating all possible words. + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + + ' Now get the key/IV and do the Decryption using the + 'function that accepts byte arrays. + ' Using PasswordDeriveBytes object we are first getting + ' 32 bytes for the Key + ' (the default Rijndael key length is 256bit = 32bytes) + ' and then 16 bytes for the IV. + ' IV should always be the block size, which is by default + ' 16 bytes (128 bit) for Rijndael. + ' If you are using DES/TripleDES/RC2 the block size is + ' 8 bytes and so should be the IV size. + + ' You can also read KeySize/BlockSize properties off the + ' algorithm to find out the sizes. + Return Decrypt(cipherData, pdb.GetBytes(32), pdb.GetBytes(16)) + End Function + + ' Decrypt a file into another file using a password + Public Shared Sub Decrypt(ByVal fileIn As String, ByVal fileOut As String, ByVal Password As String) + + ' First we are going to open the file streams + Dim fsIn As New FileStream(fileIn, FileMode.Open, FileAccess.Read) + Dim fsOut As New FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write) + + ' Then we are going to derive a Key and an IV from + ' the Password and create an algorithm + Dim pdb As New PasswordDeriveBytes(Password, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _ + &H65, &H64, &H76, &H65, &H64, &H65, _ + &H76}) + Dim alg As Rijndael = Rijndael.Create() + + alg.Key = pdb.GetBytes(32) + alg.IV = pdb.GetBytes(16) + + ' Now create a crypto stream through which we are going + ' to be pumping data. + ' Our fileOut is going to be receiving the Decrypted bytes. + Dim cs As New CryptoStream(fsOut, alg.CreateDecryptor(), CryptoStreamMode.Write) + + ' Now will will initialize a buffer and will be + ' processing the input file in chunks. + ' This is done to avoid reading the whole file (which can be + ' huge) into memory. + Dim bufferLen As Integer = 4096 + Dim buffer As Byte() = New Byte(bufferLen - 1) {} + Dim bytesRead As Integer + + Do + ' read a chunk of data from the input file + bytesRead = fsIn.Read(buffer, 0, bufferLen) + + ' Decrypt it + + cs.Write(buffer, 0, bytesRead) + Loop While bytesRead <> 0 + + ' close everything + cs.Close() + ' this will also close the unrelying fsOut stream + fsIn.Close() + End Sub +End Class + + + diff --git a/Console/CICRadarRConfig/CICRadarRConfig/IniFileVb.vb b/Console/CICRadarRConfig/CICRadarRConfig/IniFileVb.vb new file mode 100644 index 0000000..6485eab --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/IniFileVb.vb @@ -0,0 +1,376 @@ +' Programmer: Ludvik Jerabek +' Date: 08\23\2010 +' Purpose: Allow INI manipulation in .NET + +Imports System.IO +Imports System.Text.RegularExpressions +Imports System.Collections +Imports System.Diagnostics + +' IniFile class used to read and write ini files by loading the file into memory +Public Class IniFile + ' List of IniSection objects keeps track of all the sections in the INI file + Private m_sections As Hashtable + + ' Public constructor + Public Sub New() + m_sections = New Hashtable(StringComparer.InvariantCultureIgnoreCase) + End Sub + + ' Loads the Reads the data in the ini file into the IniFile object + Public Sub Load(ByVal sFileName As String, Optional ByVal bMerge As Boolean = False) + If Not bMerge Then + RemoveAllSections() + End If + ' Clear the object... + Dim tempsection As IniSection = Nothing + Dim oReader As New StreamReader(sFileName) + Dim regexcomment As New Regex("^([\s]*#.*)", (RegexOptions.Singleline Or RegexOptions.IgnoreCase)) + ' Broken but left for history + 'Dim regexsection As New Regex("\[[\s]*([^\[\s].*[^\s\]])[\s]*\]", (RegexOptions.Singleline Or RegexOptions.IgnoreCase)) + Dim regexsection As New Regex("^[\s]*\[[\s]*([^\[\s].*[^\s\]])[\s]*\][\s]*$", (RegexOptions.Singleline Or RegexOptions.IgnoreCase)) + Dim regexkey As New Regex("^\s*([^=\s]*)[^=]*=(.*)", (RegexOptions.Singleline Or RegexOptions.IgnoreCase)) + While Not oReader.EndOfStream + Dim line As String = oReader.ReadLine() + If line <> String.Empty Then + Dim m As Match = Nothing + If regexcomment.Match(line).Success Then + m = regexcomment.Match(line) + Trace.WriteLine(String.Format("Skipping Comment: {0}", m.Groups(0).Value)) + ElseIf regexsection.Match(line).Success Then + m = regexsection.Match(line) + Trace.WriteLine(String.Format("Adding section [{0}]", m.Groups(1).Value)) + tempsection = AddSection(m.Groups(1).Value) + ElseIf regexkey.Match(line).Success AndAlso tempsection IsNot Nothing Then + m = regexkey.Match(line) + Trace.WriteLine(String.Format("Adding Key [{0}]=[{1}]", m.Groups(1).Value, m.Groups(2).Value)) + tempsection.AddKey(m.Groups(1).Value).Value = m.Groups(2).Value + ElseIf tempsection IsNot Nothing Then + ' Handle Key without value + Trace.WriteLine(String.Format("Adding Key [{0}]", line)) + tempsection.AddKey(line) + Else + ' This should not occur unless the tempsection is not created yet... + Trace.WriteLine(String.Format("Skipping unknown type of data: {0}", line)) + End If + End If + End While + oReader.Close() + End Sub + + ' Used to save the data back to the file or your choice + Public Sub Save(ByVal sFileName As String) + Dim oWriter As New StreamWriter(sFileName, False) + For Each s As IniSection In Sections + Trace.WriteLine(String.Format("Writing Section: [{0}]", s.Name)) + oWriter.WriteLine(String.Format("[{0}]", s.Name)) + For Each k As IniSection.IniKey In s.Keys + If k.Value <> String.Empty Then + Trace.WriteLine(String.Format("Writing Key: {0}={1}", k.Name, k.Value)) + oWriter.WriteLine(String.Format("{0}={1}", k.Name, k.Value)) + Else + Trace.WriteLine(String.Format("Writing Key: {0}", k.Name)) + oWriter.WriteLine(String.Format("{0}", k.Name)) + End If + Next + Next + oWriter.Close() + End Sub + + ' Gets all the sections + Public ReadOnly Property Sections() As System.Collections.ICollection + Get + Return m_sections.Values + End Get + End Property + + ' Adds a section to the IniFile object, returns a IniSection object to the new or existing object + Public Function AddSection(ByVal sSection As String) As IniSection + Dim s As IniSection = Nothing + sSection = sSection.Trim() + ' Trim spaces + If m_sections.ContainsKey(sSection) Then + s = DirectCast(m_sections(sSection), IniSection) + Else + s = New IniSection(Me, sSection) + m_sections(sSection) = s + End If + Return s + End Function + + ' Removes a section by its name sSection, returns trus on success + Public Function RemoveSection(ByVal sSection As String) As Boolean + sSection = sSection.Trim() + Return RemoveSection(GetSection(sSection)) + End Function + + ' Removes section by object, returns trus on success + Public Function RemoveSection(ByVal Section As IniSection) As Boolean + If Section IsNot Nothing Then + Try + m_sections.Remove(Section.Name) + Return True + Catch ex As Exception + Trace.WriteLine(ex.Message) + End Try + End If + Return False + End Function + + ' Removes all existing sections, returns trus on success + Public Function RemoveAllSections() As Boolean + m_sections.Clear() + Return (m_sections.Count = 0) + End Function + + ' Returns an IniSection to the section by name, NULL if it was not found + Public Function GetSection(ByVal sSection As String) As IniSection + sSection = sSection.Trim() + ' Trim spaces + If m_sections.ContainsKey(sSection) Then + Return DirectCast(m_sections(sSection), IniSection) + End If + Return Nothing + End Function + + ' Returns a KeyValue in a certain section + Public Function GetKeyValue(ByVal sSection As String, ByVal sKey As String) As String + Dim s As IniSection = GetSection(sSection) + If s IsNot Nothing Then + Dim k As IniSection.IniKey = s.GetKey(sKey) + If k IsNot Nothing Then + Return k.Value + End If + End If + Return String.Empty + End Function + + ' Sets a KeyValuePair in a certain section + Public Function SetKeyValue(ByVal sSection As String, ByVal sKey As String, ByVal sValue As String) As Boolean + Dim s As IniSection = AddSection(sSection) + If s IsNot Nothing Then + Dim k As IniSection.IniKey = s.AddKey(sKey) + If k IsNot Nothing Then + k.Value = sValue + Return True + End If + End If + Return False + End Function + + ' Renames an existing section returns true on success, false if the section didn't exist or there was another section with the same sNewSection + Public Function RenameSection(ByVal sSection As String, ByVal sNewSection As String) As Boolean + ' Note string trims are done in lower calls. + Dim bRval As Boolean = False + Dim s As IniSection = GetSection(sSection) + If s IsNot Nothing Then + bRval = s.SetName(sNewSection) + End If + Return bRval + End Function + + ' Renames an existing key returns true on success, false if the key didn't exist or there was another section with the same sNewKey + Public Function RenameKey(ByVal sSection As String, ByVal sKey As String, ByVal sNewKey As String) As Boolean + ' Note string trims are done in lower calls. + Dim s As IniSection = GetSection(sSection) + If s IsNot Nothing Then + Dim k As IniSection.IniKey = s.GetKey(sKey) + If k IsNot Nothing Then + Return k.SetName(sNewKey) + End If + End If + Return False + End Function + + ' Remove a key by section name and key name + Public Function RemoveKey(ByVal sSection As String, ByVal sKey As String) As Boolean + Dim s As IniSection = GetSection(sSection) + If s IsNot Nothing Then + Return s.RemoveKey(sKey) + End If + Return False + End Function + + ' IniSection class + Public Class IniSection + ' IniFile IniFile object instance + Private m_pIniFile As IniFile + ' Name of the section + Private m_sSection As String + ' List of IniKeys in the section + Private m_keys As Hashtable + + ' Constuctor so objects are internally managed + Protected Friend Sub New(ByVal parent As IniFile, ByVal sSection As String) + m_pIniFile = parent + m_sSection = sSection + m_keys = New Hashtable(StringComparer.InvariantCultureIgnoreCase) + End Sub + + ' Returns all the keys in a section + Public ReadOnly Property Keys() As System.Collections.ICollection + Get + Return m_keys.Values + End Get + End Property + + ' Returns the section name + Public ReadOnly Property Name() As String + Get + Return m_sSection + End Get + End Property + + ' Adds a key to the IniSection object, returns a IniKey object to the new or existing object + Public Function AddKey(ByVal sKey As String) As IniKey + sKey = sKey.Trim() + Dim k As IniSection.IniKey = Nothing + If sKey.Length <> 0 Then + If m_keys.ContainsKey(sKey) Then + k = DirectCast(m_keys(sKey), IniKey) + Else + k = New IniSection.IniKey(Me, sKey) + m_keys(sKey) = k + End If + End If + Return k + End Function + + ' Removes a single key by string + Public Function RemoveKey(ByVal sKey As String) As Boolean + Return RemoveKey(GetKey(sKey)) + End Function + + ' Removes a single key by IniKey object + Public Function RemoveKey(ByVal Key As IniKey) As Boolean + If Key IsNot Nothing Then + Try + m_keys.Remove(Key.Name) + Return True + Catch ex As Exception + Trace.WriteLine(ex.Message) + End Try + End If + Return False + End Function + + ' Removes all the keys in the section + Public Function RemoveAllKeys() As Boolean + m_keys.Clear() + Return (m_keys.Count = 0) + End Function + + ' Returns a IniKey object to the key by name, NULL if it was not found + Public Function GetKey(ByVal sKey As String) As IniKey + sKey = sKey.Trim() + If m_keys.ContainsKey(sKey) Then + Return DirectCast(m_keys(sKey), IniKey) + End If + Return Nothing + End Function + + ' Sets the section name, returns true on success, fails if the section + ' name sSection already exists + Public Function SetName(ByVal sSection As String) As Boolean + sSection = sSection.Trim() + If sSection.Length <> 0 Then + ' Get existing section if it even exists... + Dim s As IniSection = m_pIniFile.GetSection(sSection) + If s IsNot Me AndAlso s IsNot Nothing Then + Return False + End If + Try + ' Remove the current section + m_pIniFile.m_sections.Remove(m_sSection) + ' Set the new section name to this object + m_pIniFile.m_sections(sSection) = Me + ' Set the new section name + m_sSection = sSection + Return True + Catch ex As Exception + Trace.WriteLine(ex.Message) + End Try + End If + Return False + End Function + + ' Returns the section name + Public Function GetName() As String + Return m_sSection + End Function + + ' IniKey class + Public Class IniKey + ' Name of the Key + Private m_sKey As String + ' Value associated + Private m_sValue As String + ' Pointer to the parent CIniSection + Private m_section As IniSection + + ' Constuctor so objects are internally managed + Protected Friend Sub New(ByVal parent As IniSection, ByVal sKey As String) + m_section = parent + m_sKey = sKey + End Sub + + ' Returns the name of the Key + Public ReadOnly Property Name() As String + Get + Return m_sKey + End Get + End Property + + ' Sets or Gets the value of the key + Public Property Value() As String + Get + Return m_sValue + End Get + Set(ByVal value As String) + m_sValue = value + End Set + End Property + + ' Sets the value of the key + Public Sub SetValue(ByVal sValue As String) + m_sValue = sValue + End Sub + ' Returns the value of the Key + Public Function GetValue() As String + Return m_sValue + End Function + + ' Sets the key name + ' Returns true on success, fails if the section name sKey already exists + Public Function SetName(ByVal sKey As String) As Boolean + sKey = sKey.Trim() + If sKey.Length <> 0 Then + Dim k As IniKey = m_section.GetKey(sKey) + If k IsNot Me AndAlso k IsNot Nothing Then + Return False + End If + Try + ' Remove the current key + m_section.m_keys.Remove(m_sKey) + ' Set the new key name to this object + m_section.m_keys(sKey) = Me + ' Set the new key name + m_sKey = sKey + Return True + Catch ex As Exception + Trace.WriteLine(ex.Message) + End Try + End If + Return False + End Function + + ' Returns the name of the Key + Public Function GetName() As String + Return m_sKey + End Function + End Class + ' End of IniKey class + End Class + ' End of IniSection class +End Class +' End of IniFile class \ No newline at end of file diff --git a/Console/CICRadarRConfig/CICRadarRConfig/Main.Designer.vb b/Console/CICRadarRConfig/CICRadarRConfig/Main.Designer.vb new file mode 100644 index 0000000..f2dc6a2 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/Main.Designer.vb @@ -0,0 +1,1048 @@ + _ +Partial Class CICRadiusRConfig + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(CICRadiusRConfig)) + Dim ListViewItem1 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem("Setup", 0) + Dim ListViewItem2 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem("Active Directory", 1) + Dim ListViewItem3 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem("SMS Setup", 2) + Dim ListViewItem4 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem("Mail Setup", 3) + Dim ListViewItem5 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem("Radius Clients", 4) + Me.btnRestart = New System.Windows.Forms.Button() + Me.ImageList1 = New System.Windows.Forms.ImageList(Me.components) + Me.lvConfig = New System.Windows.Forms.ListView() + Me.MenuBar = New System.Windows.Forms.MenuStrip() + Me.ToolStripMenuItem1 = New System.Windows.Forms.ToolStripMenuItem() + Me.SaveConfigurationToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ExitToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.FileToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.RestartRadiusServerToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.TestModemConfigurationToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.TestMailConfigurationToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.HelpToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.AboutToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.StatusBar = New System.Windows.Forms.StatusStrip() + Me.ToolStripStatusLabel1 = New System.Windows.Forms.ToolStripStatusLabel() + Me.Panel1 = New System.Windows.Forms.Panel() + Me.MenuLabel = New System.Windows.Forms.Label() + Me.Panel2 = New System.Windows.Forms.Panel() + Me.PanelSetup = New System.Windows.Forms.Panel() + Me.TextBox3 = New System.Windows.Forms.TextBox() + Me.TextBox2 = New System.Windows.Forms.TextBox() + Me.rbCitrixNetscaler = New System.Windows.Forms.RadioButton() + Me.rbRDGateway = New System.Windows.Forms.RadioButton() + Me.TextBox1 = New System.Windows.Forms.TextBox() + Me.Label6 = New System.Windows.Forms.Label() + Me.ckEnableMail = New System.Windows.Forms.CheckBox() + Me.ckEnableSMS = New System.Windows.Forms.CheckBox() + Me.ckEnableOTP = New System.Windows.Forms.CheckBox() + Me.ckDebug = New System.Windows.Forms.CheckBox() + Me.PanelActiveDirectory = New System.Windows.Forms.Panel() + Me.txtADMailField = New System.Windows.Forms.TextBox() + Me.Label8 = New System.Windows.Forms.Label() + Me.TextBox5 = New System.Windows.Forms.TextBox() + Me.TextBox4 = New System.Windows.Forms.TextBox() + Me.txtADField = New System.Windows.Forms.TextBox() + Me.Label1 = New System.Windows.Forms.Label() + Me.txtLdapDomain = New System.Windows.Forms.TextBox() + Me.txtNetBios = New System.Windows.Forms.TextBox() + Me.lblLdapDomain = New System.Windows.Forms.Label() + Me.lblNetBios = New System.Windows.Forms.Label() + Me.Panel4 = New System.Windows.Forms.Panel() + Me.Label3 = New System.Windows.Forms.Label() + Me.PanelSMSSetup = New System.Windows.Forms.Panel() + Me.TextBox9 = New System.Windows.Forms.TextBox() + Me.TextBox8 = New System.Windows.Forms.TextBox() + Me.rbLocalSMS = New System.Windows.Forms.RadioButton() + Me.rbOnlineSMS = New System.Windows.Forms.RadioButton() + Me.TextBox7 = New System.Windows.Forms.TextBox() + Me.btnTestModem = New System.Windows.Forms.Button() + Me.txtSMSC = New System.Windows.Forms.TextBox() + Me.txtComPort = New System.Windows.Forms.TextBox() + Me.lblSMSC = New System.Windows.Forms.Label() + Me.lblComPort = New System.Windows.Forms.Label() + Me.txtProvider = New System.Windows.Forms.TextBox() + Me.lblProvider = New System.Windows.Forms.Label() + Me.Panel5 = New System.Windows.Forms.Panel() + Me.Label7 = New System.Windows.Forms.Label() + Me.PanelRadiusClients = New System.Windows.Forms.Panel() + Me.TextBox10 = New System.Windows.Forms.TextBox() + Me.Label2 = New System.Windows.Forms.Label() + Me.txtSecret = New System.Windows.Forms.TextBox() + Me.lblSecret = New System.Windows.Forms.Label() + Me.btnRemoveClient = New System.Windows.Forms.Button() + Me.ListClients = New System.Windows.Forms.ListBox() + Me.btnAddClient = New System.Windows.Forms.Button() + Me.txtClient = New System.Windows.Forms.TextBox() + Me.lblClient = New System.Windows.Forms.Label() + Me.Panel7 = New System.Windows.Forms.Panel() + Me.Label4 = New System.Windows.Forms.Label() + Me.PanelMailSetup = New System.Windows.Forms.Panel() + Me.Button1 = New System.Windows.Forms.Button() + Me.TextBox13 = New System.Windows.Forms.TextBox() + Me.txtSenderEmail = New System.Windows.Forms.TextBox() + Me.txtMailServer = New System.Windows.Forms.TextBox() + Me.Label10 = New System.Windows.Forms.Label() + Me.Label9 = New System.Windows.Forms.Label() + Me.Panel6 = New System.Windows.Forms.Panel() + Me.Label5 = New System.Windows.Forms.Label() + Me.MenuBar.SuspendLayout() + Me.StatusBar.SuspendLayout() + Me.Panel1.SuspendLayout() + Me.Panel2.SuspendLayout() + Me.PanelSetup.SuspendLayout() + Me.PanelActiveDirectory.SuspendLayout() + Me.Panel4.SuspendLayout() + Me.PanelSMSSetup.SuspendLayout() + Me.Panel5.SuspendLayout() + Me.PanelRadiusClients.SuspendLayout() + Me.Panel7.SuspendLayout() + Me.PanelMailSetup.SuspendLayout() + Me.Panel6.SuspendLayout() + Me.SuspendLayout() + ' + 'btnRestart + ' + Me.btnRestart.Location = New System.Drawing.Point(15, 475) + Me.btnRestart.Name = "btnRestart" + Me.btnRestart.Size = New System.Drawing.Size(86, 23) + Me.btnRestart.TabIndex = 16 + Me.btnRestart.Text = "Restart Radius" + Me.btnRestart.UseVisualStyleBackColor = True + ' + 'ImageList1 + ' + Me.ImageList1.ImageStream = CType(resources.GetObject("ImageList1.ImageStream"), System.Windows.Forms.ImageListStreamer) + Me.ImageList1.TransparentColor = System.Drawing.Color.Transparent + Me.ImageList1.Images.SetKeyName(0, "gear.png") + Me.ImageList1.Images.SetKeyName(1, "branch_element.png") + Me.ImageList1.Images.SetKeyName(2, "mobilephone3.png") + Me.ImageList1.Images.SetKeyName(3, "mail.png") + Me.ImageList1.Images.SetKeyName(4, "server_id_card.png") + Me.ImageList1.Images.SetKeyName(5, "mobilephone3_gray.png") + Me.ImageList1.Images.SetKeyName(6, "mail_gray.png") + ' + 'lvConfig + ' + Me.lvConfig.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.lvConfig.Items.AddRange(New System.Windows.Forms.ListViewItem() {ListViewItem1, ListViewItem2, ListViewItem3, ListViewItem4, ListViewItem5}) + Me.lvConfig.LargeImageList = Me.ImageList1 + Me.lvConfig.Location = New System.Drawing.Point(8, 13) + Me.lvConfig.MultiSelect = False + Me.lvConfig.Name = "lvConfig" + Me.lvConfig.Size = New System.Drawing.Size(97, 500) + Me.lvConfig.TabIndex = 28 + Me.lvConfig.UseCompatibleStateImageBehavior = False + ' + 'MenuBar + ' + Me.MenuBar.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripMenuItem1, Me.FileToolStripMenuItem, Me.HelpToolStripMenuItem}) + Me.MenuBar.Location = New System.Drawing.Point(0, 0) + Me.MenuBar.Name = "MenuBar" + Me.MenuBar.Size = New System.Drawing.Size(1775, 24) + Me.MenuBar.TabIndex = 29 + Me.MenuBar.Text = "MenuBar" + ' + 'ToolStripMenuItem1 + ' + Me.ToolStripMenuItem1.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.SaveConfigurationToolStripMenuItem, Me.ExitToolStripMenuItem}) + Me.ToolStripMenuItem1.Name = "ToolStripMenuItem1" + Me.ToolStripMenuItem1.Size = New System.Drawing.Size(35, 20) + Me.ToolStripMenuItem1.Text = "File" + ' + 'SaveConfigurationToolStripMenuItem + ' + Me.SaveConfigurationToolStripMenuItem.Name = "SaveConfigurationToolStripMenuItem" + Me.SaveConfigurationToolStripMenuItem.Size = New System.Drawing.Size(164, 22) + Me.SaveConfigurationToolStripMenuItem.Text = "Save configuration" + ' + 'ExitToolStripMenuItem + ' + Me.ExitToolStripMenuItem.Name = "ExitToolStripMenuItem" + Me.ExitToolStripMenuItem.Size = New System.Drawing.Size(164, 22) + Me.ExitToolStripMenuItem.Text = "Exit" + ' + 'FileToolStripMenuItem + ' + Me.FileToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.RestartRadiusServerToolStripMenuItem, Me.TestModemConfigurationToolStripMenuItem, Me.TestMailConfigurationToolStripMenuItem}) + Me.FileToolStripMenuItem.Name = "FileToolStripMenuItem" + Me.FileToolStripMenuItem.Size = New System.Drawing.Size(44, 20) + Me.FileToolStripMenuItem.Text = "Tools" + ' + 'RestartRadiusServerToolStripMenuItem + ' + Me.RestartRadiusServerToolStripMenuItem.Name = "RestartRadiusServerToolStripMenuItem" + Me.RestartRadiusServerToolStripMenuItem.Size = New System.Drawing.Size(198, 22) + Me.RestartRadiusServerToolStripMenuItem.Text = "Restart radius server" + ' + 'TestModemConfigurationToolStripMenuItem + ' + Me.TestModemConfigurationToolStripMenuItem.Name = "TestModemConfigurationToolStripMenuItem" + Me.TestModemConfigurationToolStripMenuItem.Size = New System.Drawing.Size(198, 22) + Me.TestModemConfigurationToolStripMenuItem.Text = "Test modem configuration" + ' + 'TestMailConfigurationToolStripMenuItem + ' + Me.TestMailConfigurationToolStripMenuItem.Name = "TestMailConfigurationToolStripMenuItem" + Me.TestMailConfigurationToolStripMenuItem.Size = New System.Drawing.Size(198, 22) + Me.TestMailConfigurationToolStripMenuItem.Text = "Test mail configuration" + ' + 'HelpToolStripMenuItem + ' + Me.HelpToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.AboutToolStripMenuItem}) + Me.HelpToolStripMenuItem.Name = "HelpToolStripMenuItem" + Me.HelpToolStripMenuItem.Size = New System.Drawing.Size(40, 20) + Me.HelpToolStripMenuItem.Text = "Help" + ' + 'AboutToolStripMenuItem + ' + Me.AboutToolStripMenuItem.Name = "AboutToolStripMenuItem" + Me.AboutToolStripMenuItem.Size = New System.Drawing.Size(103, 22) + Me.AboutToolStripMenuItem.Text = "About" + ' + 'StatusBar + ' + Me.StatusBar.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripStatusLabel1}) + Me.StatusBar.Location = New System.Drawing.Point(0, 851) + Me.StatusBar.Name = "StatusBar" + Me.StatusBar.Size = New System.Drawing.Size(1775, 22) + Me.StatusBar.SizingGrip = False + Me.StatusBar.TabIndex = 30 + Me.StatusBar.Text = "StatusStrip1" + ' + 'ToolStripStatusLabel1 + ' + Me.ToolStripStatusLabel1.Name = "ToolStripStatusLabel1" + Me.ToolStripStatusLabel1.Size = New System.Drawing.Size(45, 17) + Me.ToolStripStatusLabel1.Text = "Status: " + ' + 'Panel1 + ' + Me.Panel1.AutoScroll = True + Me.Panel1.BackColor = System.Drawing.SystemColors.ButtonHighlight + Me.Panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D + Me.Panel1.Controls.Add(Me.lvConfig) + Me.Panel1.Location = New System.Drawing.Point(5, 27) + Me.Panel1.Name = "Panel1" + Me.Panel1.Size = New System.Drawing.Size(125, 357) + Me.Panel1.TabIndex = 31 + ' + 'MenuLabel + ' + Me.MenuLabel.AutoSize = True + Me.MenuLabel.BackColor = System.Drawing.Color.SteelBlue + Me.MenuLabel.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.MenuLabel.ForeColor = System.Drawing.Color.White + Me.MenuLabel.Location = New System.Drawing.Point(12, 1) + Me.MenuLabel.Name = "MenuLabel" + Me.MenuLabel.Size = New System.Drawing.Size(73, 25) + Me.MenuLabel.TabIndex = 32 + Me.MenuLabel.Text = "Setup" + ' + 'Panel2 + ' + Me.Panel2.BackColor = System.Drawing.Color.SteelBlue + Me.Panel2.Controls.Add(Me.MenuLabel) + Me.Panel2.Location = New System.Drawing.Point(-2, 0) + Me.Panel2.Name = "Panel2" + Me.Panel2.Size = New System.Drawing.Size(474, 32) + Me.Panel2.TabIndex = 33 + ' + 'PanelSetup + ' + Me.PanelSetup.BackColor = System.Drawing.Color.White + Me.PanelSetup.Controls.Add(Me.TextBox3) + Me.PanelSetup.Controls.Add(Me.TextBox2) + Me.PanelSetup.Controls.Add(Me.rbCitrixNetscaler) + Me.PanelSetup.Controls.Add(Me.rbRDGateway) + Me.PanelSetup.Controls.Add(Me.TextBox1) + Me.PanelSetup.Controls.Add(Me.Label6) + Me.PanelSetup.Controls.Add(Me.ckEnableMail) + Me.PanelSetup.Controls.Add(Me.ckEnableSMS) + Me.PanelSetup.Controls.Add(Me.Panel2) + Me.PanelSetup.Controls.Add(Me.ckEnableOTP) + Me.PanelSetup.Controls.Add(Me.ckDebug) + Me.PanelSetup.Location = New System.Drawing.Point(136, 27) + Me.PanelSetup.Name = "PanelSetup" + Me.PanelSetup.Size = New System.Drawing.Size(474, 357) + Me.PanelSetup.TabIndex = 34 + ' + 'TextBox3 + ' + Me.TextBox3.BackColor = System.Drawing.Color.White + Me.TextBox3.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.TextBox3.Location = New System.Drawing.Point(25, 249) + Me.TextBox3.Multiline = True + Me.TextBox3.Name = "TextBox3" + Me.TextBox3.ReadOnly = True + Me.TextBox3.Size = New System.Drawing.Size(426, 32) + Me.TextBox3.TabIndex = 41 + Me.TextBox3.Text = "To troubleshoot configuration errors enable debugging. This will record addition " & _ + "information to the logs." + ' + 'TextBox2 + ' + Me.TextBox2.BackColor = System.Drawing.Color.White + Me.TextBox2.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.TextBox2.Location = New System.Drawing.Point(25, 127) + Me.TextBox2.Multiline = True + Me.TextBox2.Name = "TextBox2" + Me.TextBox2.ReadOnly = True + Me.TextBox2.Size = New System.Drawing.Size(426, 31) + Me.TextBox2.TabIndex = 40 + Me.TextBox2.Text = "Two factor authentication can be enable by sending a one-time password as an emai" & _ + "l or SMS message." + ' + 'rbCitrixNetscaler + ' + Me.rbCitrixNetscaler.AutoSize = True + Me.rbCitrixNetscaler.Location = New System.Drawing.Point(25, 95) + Me.rbCitrixNetscaler.Name = "rbCitrixNetscaler" + Me.rbCitrixNetscaler.Size = New System.Drawing.Size(95, 17) + Me.rbCitrixNetscaler.TabIndex = 39 + Me.rbCitrixNetscaler.Text = "Citrix Netscaler" + Me.rbCitrixNetscaler.UseVisualStyleBackColor = True + ' + 'rbRDGateway + ' + Me.rbRDGateway.AutoSize = True + Me.rbRDGateway.Checked = True + Me.rbRDGateway.Location = New System.Drawing.Point(25, 77) + Me.rbRDGateway.Name = "rbRDGateway" + Me.rbRDGateway.Size = New System.Drawing.Size(150, 17) + Me.rbRDGateway.TabIndex = 38 + Me.rbRDGateway.TabStop = True + Me.rbRDGateway.Text = "Remote Desktop Gateway" + Me.rbRDGateway.UseVisualStyleBackColor = True + ' + 'TextBox1 + ' + Me.TextBox1.BackColor = System.Drawing.Color.White + Me.TextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.TextBox1.Location = New System.Drawing.Point(25, 40) + Me.TextBox1.Multiline = True + Me.TextBox1.Name = "TextBox1" + Me.TextBox1.ReadOnly = True + Me.TextBox1.Size = New System.Drawing.Size(427, 56) + Me.TextBox1.TabIndex = 37 + Me.TextBox1.Text = "This page configures the CIC Radar to support either Remote Desktop Gateway or Ci" & _ + "trix Netscaler. " + ' + 'Label6 + ' + Me.Label6.AutoSize = True + Me.Label6.Location = New System.Drawing.Point(-2, 51) + Me.Label6.Name = "Label6" + Me.Label6.Size = New System.Drawing.Size(0, 13) + Me.Label6.TabIndex = 36 + ' + 'ckEnableMail + ' + Me.ckEnableMail.AutoSize = True + Me.ckEnableMail.Location = New System.Drawing.Point(47, 212) + Me.ckEnableMail.Name = "ckEnableMail" + Me.ckEnableMail.Size = New System.Drawing.Size(79, 17) + Me.ckEnableMail.TabIndex = 35 + Me.ckEnableMail.Text = "Mail Token" + Me.ckEnableMail.UseVisualStyleBackColor = True + ' + 'ckEnableSMS + ' + Me.ckEnableSMS.AutoSize = True + Me.ckEnableSMS.Location = New System.Drawing.Point(47, 190) + Me.ckEnableSMS.Name = "ckEnableSMS" + Me.ckEnableSMS.Size = New System.Drawing.Size(83, 17) + Me.ckEnableSMS.TabIndex = 34 + Me.ckEnableSMS.Text = "SMS Token" + Me.ckEnableSMS.UseVisualStyleBackColor = True + ' + 'ckEnableOTP + ' + Me.ckEnableOTP.AutoSize = True + Me.ckEnableOTP.Location = New System.Drawing.Point(25, 164) + Me.ckEnableOTP.Name = "ckEnableOTP" + Me.ckEnableOTP.Size = New System.Drawing.Size(187, 17) + Me.ckEnableOTP.TabIndex = 10 + Me.ckEnableOTP.Text = "Enable Two Factor Authentication" + Me.ckEnableOTP.UseVisualStyleBackColor = True + ' + 'ckDebug + ' + Me.ckDebug.AutoSize = True + Me.ckDebug.Location = New System.Drawing.Point(25, 287) + Me.ckDebug.Name = "ckDebug" + Me.ckDebug.Size = New System.Drawing.Size(149, 17) + Me.ckDebug.TabIndex = 8 + Me.ckDebug.Text = "Enable Debug Information" + Me.ckDebug.UseVisualStyleBackColor = True + ' + 'PanelActiveDirectory + ' + Me.PanelActiveDirectory.BackColor = System.Drawing.Color.White + Me.PanelActiveDirectory.Controls.Add(Me.txtADMailField) + Me.PanelActiveDirectory.Controls.Add(Me.Label8) + Me.PanelActiveDirectory.Controls.Add(Me.TextBox5) + Me.PanelActiveDirectory.Controls.Add(Me.TextBox4) + Me.PanelActiveDirectory.Controls.Add(Me.txtADField) + Me.PanelActiveDirectory.Controls.Add(Me.Label1) + Me.PanelActiveDirectory.Controls.Add(Me.txtLdapDomain) + Me.PanelActiveDirectory.Controls.Add(Me.txtNetBios) + Me.PanelActiveDirectory.Controls.Add(Me.lblLdapDomain) + Me.PanelActiveDirectory.Controls.Add(Me.lblNetBios) + Me.PanelActiveDirectory.Controls.Add(Me.Panel4) + Me.PanelActiveDirectory.Location = New System.Drawing.Point(136, 403) + Me.PanelActiveDirectory.Name = "PanelActiveDirectory" + Me.PanelActiveDirectory.Size = New System.Drawing.Size(474, 357) + Me.PanelActiveDirectory.TabIndex = 35 + Me.PanelActiveDirectory.Visible = False + ' + 'txtADMailField + ' + Me.txtADMailField.Location = New System.Drawing.Point(115, 208) + Me.txtADMailField.Name = "txtADMailField" + Me.txtADMailField.Size = New System.Drawing.Size(152, 20) + Me.txtADMailField.TabIndex = 43 + ' + 'Label8 + ' + Me.Label8.AutoSize = True + Me.Label8.Location = New System.Drawing.Point(25, 214) + Me.Label8.Name = "Label8" + Me.Label8.Size = New System.Drawing.Size(51, 13) + Me.Label8.TabIndex = 42 + Me.Label8.Text = "Mail Field" + ' + 'TextBox5 + ' + Me.TextBox5.BackColor = System.Drawing.Color.White + Me.TextBox5.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.TextBox5.Location = New System.Drawing.Point(25, 137) + Me.TextBox5.Multiline = True + Me.TextBox5.Name = "TextBox5" + Me.TextBox5.ReadOnly = True + Me.TextBox5.Size = New System.Drawing.Size(426, 33) + Me.TextBox5.TabIndex = 41 + Me.TextBox5.Text = "Different field in Active Directory can be used for email and phone number. Use A" & _ + "dsiedit to find the desired field name if deviating for the default configuratio" & _ + "n." + ' + 'TextBox4 + ' + Me.TextBox4.BackColor = System.Drawing.Color.White + Me.TextBox4.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.TextBox4.Location = New System.Drawing.Point(25, 40) + Me.TextBox4.Multiline = True + Me.TextBox4.Name = "TextBox4" + Me.TextBox4.ReadOnly = True + Me.TextBox4.Size = New System.Drawing.Size(426, 34) + Me.TextBox4.TabIndex = 40 + Me.TextBox4.Text = "To authenticate users specify the FQDN and Netbios name of the domain where the u" & _ + "sers reside." + ' + 'txtADField + ' + Me.txtADField.Location = New System.Drawing.Point(115, 179) + Me.txtADField.Name = "txtADField" + Me.txtADField.Size = New System.Drawing.Size(152, 20) + Me.txtADField.TabIndex = 34 + ' + 'Label1 + ' + Me.Label1.AutoSize = True + Me.Label1.Location = New System.Drawing.Point(25, 185) + Me.Label1.Name = "Label1" + Me.Label1.Size = New System.Drawing.Size(63, 13) + Me.Label1.TabIndex = 39 + Me.Label1.Text = "Phone Field" + ' + 'txtLdapDomain + ' + Me.txtLdapDomain.Location = New System.Drawing.Point(115, 77) + Me.txtLdapDomain.Name = "txtLdapDomain" + Me.txtLdapDomain.Size = New System.Drawing.Size(152, 20) + Me.txtLdapDomain.TabIndex = 36 + ' + 'txtNetBios + ' + Me.txtNetBios.Location = New System.Drawing.Point(115, 103) + Me.txtNetBios.Name = "txtNetBios" + Me.txtNetBios.Size = New System.Drawing.Size(152, 20) + Me.txtNetBios.TabIndex = 35 + ' + 'lblLdapDomain + ' + Me.lblLdapDomain.AutoSize = True + Me.lblLdapDomain.Location = New System.Drawing.Point(25, 80) + Me.lblLdapDomain.Name = "lblLdapDomain" + Me.lblLdapDomain.Size = New System.Drawing.Size(74, 13) + Me.lblLdapDomain.TabIndex = 38 + Me.lblLdapDomain.Text = "Domain Name" + ' + 'lblNetBios + ' + Me.lblNetBios.AutoSize = True + Me.lblNetBios.Location = New System.Drawing.Point(25, 106) + Me.lblNetBios.Name = "lblNetBios" + Me.lblNetBios.Size = New System.Drawing.Size(83, 13) + Me.lblNetBios.TabIndex = 37 + Me.lblNetBios.Text = "NetBios Domain" + ' + 'Panel4 + ' + Me.Panel4.BackColor = System.Drawing.Color.SteelBlue + Me.Panel4.Controls.Add(Me.Label3) + Me.Panel4.Location = New System.Drawing.Point(-2, 0) + Me.Panel4.Name = "Panel4" + Me.Panel4.Size = New System.Drawing.Size(474, 32) + Me.Panel4.TabIndex = 33 + ' + 'Label3 + ' + Me.Label3.AutoSize = True + Me.Label3.BackColor = System.Drawing.Color.SteelBlue + Me.Label3.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Label3.ForeColor = System.Drawing.Color.White + Me.Label3.Location = New System.Drawing.Point(12, 1) + Me.Label3.Name = "Label3" + Me.Label3.Size = New System.Drawing.Size(179, 25) + Me.Label3.TabIndex = 32 + Me.Label3.Text = "Active Directory" + ' + 'PanelSMSSetup + ' + Me.PanelSMSSetup.BackColor = System.Drawing.Color.White + Me.PanelSMSSetup.Controls.Add(Me.TextBox9) + Me.PanelSMSSetup.Controls.Add(Me.TextBox8) + Me.PanelSMSSetup.Controls.Add(Me.rbLocalSMS) + Me.PanelSMSSetup.Controls.Add(Me.rbOnlineSMS) + Me.PanelSMSSetup.Controls.Add(Me.TextBox7) + Me.PanelSMSSetup.Controls.Add(Me.btnTestModem) + Me.PanelSMSSetup.Controls.Add(Me.txtSMSC) + Me.PanelSMSSetup.Controls.Add(Me.txtComPort) + Me.PanelSMSSetup.Controls.Add(Me.lblSMSC) + Me.PanelSMSSetup.Controls.Add(Me.lblComPort) + Me.PanelSMSSetup.Controls.Add(Me.txtProvider) + Me.PanelSMSSetup.Controls.Add(Me.lblProvider) + Me.PanelSMSSetup.Controls.Add(Me.Panel5) + Me.PanelSMSSetup.Location = New System.Drawing.Point(666, 29) + Me.PanelSMSSetup.Name = "PanelSMSSetup" + Me.PanelSMSSetup.Size = New System.Drawing.Size(474, 357) + Me.PanelSMSSetup.TabIndex = 36 + Me.PanelSMSSetup.Visible = False + ' + 'TextBox9 + ' + Me.TextBox9.BackColor = System.Drawing.Color.White + Me.TextBox9.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.TextBox9.Location = New System.Drawing.Point(25, 225) + Me.TextBox9.Multiline = True + Me.TextBox9.Name = "TextBox9" + Me.TextBox9.ReadOnly = True + Me.TextBox9.Size = New System.Drawing.Size(423, 29) + Me.TextBox9.TabIndex = 46 + Me.TextBox9.Text = "If using a locally attached modem be sure to get the correct SMSC number for your" & _ + " Telco. See http://smsclist.com/downloads/default.txt." + ' + 'TextBox8 + ' + Me.TextBox8.BackColor = System.Drawing.Color.White + Me.TextBox8.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.TextBox8.Location = New System.Drawing.Point(25, 114) + Me.TextBox8.Multiline = True + Me.TextBox8.Name = "TextBox8" + Me.TextBox8.ReadOnly = True + Me.TextBox8.Size = New System.Drawing.Size(423, 39) + Me.TextBox8.TabIndex = 45 + Me.TextBox8.Text = "If using an online provider be sure to replace the parameter for phone number and" & _ + " message with ***NUMBER*** and ***TEXTMESSAGE***." + ' + 'rbLocalSMS + ' + Me.rbLocalSMS.AutoSize = True + Me.rbLocalSMS.Location = New System.Drawing.Point(25, 84) + Me.rbLocalSMS.Name = "rbLocalSMS" + Me.rbLocalSMS.Size = New System.Drawing.Size(115, 17) + Me.rbLocalSMS.TabIndex = 44 + Me.rbLocalSMS.Text = "Local SMS Modem" + Me.rbLocalSMS.UseVisualStyleBackColor = True + ' + 'rbOnlineSMS + ' + Me.rbOnlineSMS.AutoSize = True + Me.rbOnlineSMS.Checked = True + Me.rbOnlineSMS.Location = New System.Drawing.Point(25, 65) + Me.rbOnlineSMS.Name = "rbOnlineSMS" + Me.rbOnlineSMS.Size = New System.Drawing.Size(123, 17) + Me.rbOnlineSMS.TabIndex = 43 + Me.rbOnlineSMS.TabStop = True + Me.rbOnlineSMS.Text = "Online SMS Provider" + Me.rbOnlineSMS.UseVisualStyleBackColor = True + ' + 'TextBox7 + ' + Me.TextBox7.BackColor = System.Drawing.Color.White + Me.TextBox7.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.TextBox7.Location = New System.Drawing.Point(25, 40) + Me.TextBox7.Multiline = True + Me.TextBox7.Name = "TextBox7" + Me.TextBox7.ReadOnly = True + Me.TextBox7.Size = New System.Drawing.Size(423, 24) + Me.TextBox7.TabIndex = 42 + Me.TextBox7.Text = "SMS token can be send by either an online SMS provider or a locally attached mode" & _ + "m. " + ' + 'btnTestModem + ' + Me.btnTestModem.BackColor = System.Drawing.Color.SteelBlue + Me.btnTestModem.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.btnTestModem.ForeColor = System.Drawing.Color.White + Me.btnTestModem.Location = New System.Drawing.Point(25, 320) + Me.btnTestModem.Name = "btnTestModem" + Me.btnTestModem.Size = New System.Drawing.Size(120, 23) + Me.btnTestModem.TabIndex = 37 + Me.btnTestModem.Text = "Test SMS Setup" + Me.btnTestModem.UseVisualStyleBackColor = False + ' + 'txtSMSC + ' + Me.txtSMSC.Location = New System.Drawing.Point(143, 287) + Me.txtSMSC.Name = "txtSMSC" + Me.txtSMSC.Size = New System.Drawing.Size(130, 20) + Me.txtSMSC.TabIndex = 36 + ' + 'txtComPort + ' + Me.txtComPort.Location = New System.Drawing.Point(143, 260) + Me.txtComPort.Name = "txtComPort" + Me.txtComPort.Size = New System.Drawing.Size(130, 20) + Me.txtComPort.TabIndex = 35 + ' + 'lblSMSC + ' + Me.lblSMSC.AutoSize = True + Me.lblSMSC.Location = New System.Drawing.Point(25, 287) + Me.lblSMSC.Name = "lblSMSC" + Me.lblSMSC.Size = New System.Drawing.Size(37, 13) + Me.lblSMSC.TabIndex = 40 + Me.lblSMSC.Text = "SMSC" + ' + 'lblComPort + ' + Me.lblComPort.AutoSize = True + Me.lblComPort.Location = New System.Drawing.Point(25, 264) + Me.lblComPort.Name = "lblComPort" + Me.lblComPort.Size = New System.Drawing.Size(53, 13) + Me.lblComPort.TabIndex = 39 + Me.lblComPort.Text = "COM Port" + ' + 'txtProvider + ' + Me.txtProvider.AccessibleDescription = "" + Me.txtProvider.Location = New System.Drawing.Point(143, 152) + Me.txtProvider.Multiline = True + Me.txtProvider.Name = "txtProvider" + Me.txtProvider.Size = New System.Drawing.Size(305, 65) + Me.txtProvider.TabIndex = 34 + Me.txtProvider.Tag = "" + ' + 'lblProvider + ' + Me.lblProvider.AutoSize = True + Me.lblProvider.Location = New System.Drawing.Point(25, 152) + Me.lblProvider.Name = "lblProvider" + Me.lblProvider.Size = New System.Drawing.Size(105, 13) + Me.lblProvider.TabIndex = 38 + Me.lblProvider.Text = "Online SMS Provider" + ' + 'Panel5 + ' + Me.Panel5.BackColor = System.Drawing.Color.SteelBlue + Me.Panel5.Controls.Add(Me.Label7) + Me.Panel5.Location = New System.Drawing.Point(-2, 0) + Me.Panel5.Name = "Panel5" + Me.Panel5.Size = New System.Drawing.Size(474, 32) + Me.Panel5.TabIndex = 33 + ' + 'Label7 + ' + Me.Label7.AutoSize = True + Me.Label7.BackColor = System.Drawing.Color.SteelBlue + Me.Label7.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Label7.ForeColor = System.Drawing.Color.White + Me.Label7.Location = New System.Drawing.Point(12, 1) + Me.Label7.Name = "Label7" + Me.Label7.Size = New System.Drawing.Size(129, 25) + Me.Label7.TabIndex = 32 + Me.Label7.Text = "SMS Setup" + ' + 'PanelRadiusClients + ' + Me.PanelRadiusClients.BackColor = System.Drawing.Color.White + Me.PanelRadiusClients.Controls.Add(Me.TextBox10) + Me.PanelRadiusClients.Controls.Add(Me.Label2) + Me.PanelRadiusClients.Controls.Add(Me.txtSecret) + Me.PanelRadiusClients.Controls.Add(Me.lblSecret) + Me.PanelRadiusClients.Controls.Add(Me.btnRemoveClient) + Me.PanelRadiusClients.Controls.Add(Me.ListClients) + Me.PanelRadiusClients.Controls.Add(Me.btnAddClient) + Me.PanelRadiusClients.Controls.Add(Me.txtClient) + Me.PanelRadiusClients.Controls.Add(Me.lblClient) + Me.PanelRadiusClients.Controls.Add(Me.Panel7) + Me.PanelRadiusClients.Location = New System.Drawing.Point(1164, 31) + Me.PanelRadiusClients.Name = "PanelRadiusClients" + Me.PanelRadiusClients.Size = New System.Drawing.Size(474, 357) + Me.PanelRadiusClients.TabIndex = 37 + Me.PanelRadiusClients.Visible = False + ' + 'TextBox10 + ' + Me.TextBox10.BackColor = System.Drawing.Color.White + Me.TextBox10.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.TextBox10.Location = New System.Drawing.Point(25, 40) + Me.TextBox10.Multiline = True + Me.TextBox10.Name = "TextBox10" + Me.TextBox10.ReadOnly = True + Me.TextBox10.Size = New System.Drawing.Size(439, 20) + Me.TextBox10.TabIndex = 42 + Me.TextBox10.Text = "This page configures the radius clients allowed to authenticate against this radi" & _ + "us server." + ' + 'Label2 + ' + Me.Label2.AutoSize = True + Me.Label2.Location = New System.Drawing.Point(25, 173) + Me.Label2.Name = "Label2" + Me.Label2.Size = New System.Drawing.Size(89, 13) + Me.Label2.TabIndex = 41 + Me.Label2.Text = "Current Client List" + ' + 'txtSecret + ' + Me.txtSecret.Location = New System.Drawing.Point(132, 93) + Me.txtSecret.Name = "txtSecret" + Me.txtSecret.Size = New System.Drawing.Size(100, 20) + Me.txtSecret.TabIndex = 35 + ' + 'lblSecret + ' + Me.lblSecret.AutoSize = True + Me.lblSecret.Location = New System.Drawing.Point(25, 98) + Me.lblSecret.Name = "lblSecret" + Me.lblSecret.Size = New System.Drawing.Size(74, 13) + Me.lblSecret.TabIndex = 40 + Me.lblSecret.Text = "Radius Secret" + ' + 'btnRemoveClient + ' + Me.btnRemoveClient.BackColor = System.Drawing.Color.SteelBlue + Me.btnRemoveClient.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.btnRemoveClient.ForeColor = System.Drawing.Color.White + Me.btnRemoveClient.Location = New System.Drawing.Point(132, 279) + Me.btnRemoveClient.Name = "btnRemoveClient" + Me.btnRemoveClient.Size = New System.Drawing.Size(100, 23) + Me.btnRemoveClient.TabIndex = 38 + Me.btnRemoveClient.Text = "Remove Client" + Me.btnRemoveClient.UseVisualStyleBackColor = False + ' + 'ListClients + ' + Me.ListClients.FormattingEnabled = True + Me.ListClients.Location = New System.Drawing.Point(132, 173) + Me.ListClients.Name = "ListClients" + Me.ListClients.Size = New System.Drawing.Size(306, 95) + Me.ListClients.TabIndex = 37 + ' + 'btnAddClient + ' + Me.btnAddClient.BackColor = System.Drawing.Color.SteelBlue + Me.btnAddClient.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.btnAddClient.ForeColor = System.Drawing.Color.White + Me.btnAddClient.Location = New System.Drawing.Point(132, 121) + Me.btnAddClient.Name = "btnAddClient" + Me.btnAddClient.Size = New System.Drawing.Size(100, 23) + Me.btnAddClient.TabIndex = 36 + Me.btnAddClient.Text = "Add Client" + Me.btnAddClient.UseVisualStyleBackColor = False + ' + 'txtClient + ' + Me.txtClient.Location = New System.Drawing.Point(132, 66) + Me.txtClient.Name = "txtClient" + Me.txtClient.Size = New System.Drawing.Size(100, 20) + Me.txtClient.TabIndex = 34 + ' + 'lblClient + ' + Me.lblClient.AutoSize = True + Me.lblClient.Location = New System.Drawing.Point(25, 70) + Me.lblClient.Name = "lblClient" + Me.lblClient.Size = New System.Drawing.Size(94, 13) + Me.lblClient.TabIndex = 39 + Me.lblClient.Text = "New Radius Client" + ' + 'Panel7 + ' + Me.Panel7.BackColor = System.Drawing.Color.SteelBlue + Me.Panel7.Controls.Add(Me.Label4) + Me.Panel7.Location = New System.Drawing.Point(-2, 0) + Me.Panel7.Name = "Panel7" + Me.Panel7.Size = New System.Drawing.Size(474, 32) + Me.Panel7.TabIndex = 33 + ' + 'Label4 + ' + Me.Label4.AutoSize = True + Me.Label4.BackColor = System.Drawing.Color.SteelBlue + Me.Label4.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Label4.ForeColor = System.Drawing.Color.White + Me.Label4.Location = New System.Drawing.Point(12, 1) + Me.Label4.Name = "Label4" + Me.Label4.Size = New System.Drawing.Size(165, 25) + Me.Label4.TabIndex = 32 + Me.Label4.Text = "Radius Clients" + ' + 'PanelMailSetup + ' + Me.PanelMailSetup.BackColor = System.Drawing.Color.White + Me.PanelMailSetup.Controls.Add(Me.Button1) + Me.PanelMailSetup.Controls.Add(Me.TextBox13) + Me.PanelMailSetup.Controls.Add(Me.txtSenderEmail) + Me.PanelMailSetup.Controls.Add(Me.txtMailServer) + Me.PanelMailSetup.Controls.Add(Me.Label10) + Me.PanelMailSetup.Controls.Add(Me.Label9) + Me.PanelMailSetup.Controls.Add(Me.Panel6) + Me.PanelMailSetup.Location = New System.Drawing.Point(683, 428) + Me.PanelMailSetup.Name = "PanelMailSetup" + Me.PanelMailSetup.Size = New System.Drawing.Size(474, 357) + Me.PanelMailSetup.TabIndex = 38 + Me.PanelMailSetup.Visible = False + ' + 'Button1 + ' + Me.Button1.BackColor = System.Drawing.Color.SteelBlue + Me.Button1.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Button1.ForeColor = System.Drawing.Color.White + Me.Button1.Location = New System.Drawing.Point(25, 136) + Me.Button1.Name = "Button1" + Me.Button1.Size = New System.Drawing.Size(120, 23) + Me.Button1.TabIndex = 42 + Me.Button1.Text = "Test Email Setup" + Me.Button1.UseVisualStyleBackColor = False + ' + 'TextBox13 + ' + Me.TextBox13.BackColor = System.Drawing.Color.White + Me.TextBox13.BorderStyle = System.Windows.Forms.BorderStyle.None + Me.TextBox13.Location = New System.Drawing.Point(25, 40) + Me.TextBox13.Multiline = True + Me.TextBox13.Name = "TextBox13" + Me.TextBox13.ReadOnly = True + Me.TextBox13.Size = New System.Drawing.Size(426, 34) + Me.TextBox13.TabIndex = 41 + Me.TextBox13.Text = "Sending the access token as an email requires a mail server and an email address " & _ + "from which the mail is send. Be sure to allow the radius server to relay through" & _ + " your mail server." + ' + 'txtSenderEmail + ' + Me.txtSenderEmail.Location = New System.Drawing.Point(115, 103) + Me.txtSenderEmail.Name = "txtSenderEmail" + Me.txtSenderEmail.Size = New System.Drawing.Size(152, 20) + Me.txtSenderEmail.TabIndex = 37 + ' + 'txtMailServer + ' + Me.txtMailServer.Location = New System.Drawing.Point(115, 77) + Me.txtMailServer.Name = "txtMailServer" + Me.txtMailServer.Size = New System.Drawing.Size(152, 20) + Me.txtMailServer.TabIndex = 36 + ' + 'Label10 + ' + Me.Label10.AutoSize = True + Me.Label10.Location = New System.Drawing.Point(25, 105) + Me.Label10.Name = "Label10" + Me.Label10.Size = New System.Drawing.Size(61, 13) + Me.Label10.TabIndex = 35 + Me.Label10.Text = "Reply email" + ' + 'Label9 + ' + Me.Label9.AutoSize = True + Me.Label9.Location = New System.Drawing.Point(25, 78) + Me.Label9.Name = "Label9" + Me.Label9.Size = New System.Drawing.Size(60, 13) + Me.Label9.TabIndex = 34 + Me.Label9.Text = "Mail Server" + ' + 'Panel6 + ' + Me.Panel6.BackColor = System.Drawing.Color.SteelBlue + Me.Panel6.Controls.Add(Me.Label5) + Me.Panel6.Location = New System.Drawing.Point(-2, 0) + Me.Panel6.Name = "Panel6" + Me.Panel6.Size = New System.Drawing.Size(474, 32) + Me.Panel6.TabIndex = 33 + ' + 'Label5 + ' + Me.Label5.AutoSize = True + Me.Label5.BackColor = System.Drawing.Color.SteelBlue + Me.Label5.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Label5.ForeColor = System.Drawing.Color.White + Me.Label5.Location = New System.Drawing.Point(12, 1) + Me.Label5.Name = "Label5" + Me.Label5.Size = New System.Drawing.Size(124, 25) + Me.Label5.TabIndex = 32 + Me.Label5.Text = "Mail Setup" + ' + 'CICRadiusRConfig + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(1775, 873) + Me.Controls.Add(Me.PanelMailSetup) + Me.Controls.Add(Me.PanelRadiusClients) + Me.Controls.Add(Me.PanelSMSSetup) + Me.Controls.Add(Me.PanelActiveDirectory) + Me.Controls.Add(Me.PanelSetup) + Me.Controls.Add(Me.Panel1) + Me.Controls.Add(Me.StatusBar) + Me.Controls.Add(Me.btnRestart) + Me.Controls.Add(Me.MenuBar) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.MainMenuStrip = Me.MenuBar + Me.MaximizeBox = False + Me.Name = "CICRadiusRConfig" + Me.Text = "Radius Configuration" + Me.MenuBar.ResumeLayout(False) + Me.MenuBar.PerformLayout() + Me.StatusBar.ResumeLayout(False) + Me.StatusBar.PerformLayout() + Me.Panel1.ResumeLayout(False) + Me.Panel2.ResumeLayout(False) + Me.Panel2.PerformLayout() + Me.PanelSetup.ResumeLayout(False) + Me.PanelSetup.PerformLayout() + Me.PanelActiveDirectory.ResumeLayout(False) + Me.PanelActiveDirectory.PerformLayout() + Me.Panel4.ResumeLayout(False) + Me.Panel4.PerformLayout() + Me.PanelSMSSetup.ResumeLayout(False) + Me.PanelSMSSetup.PerformLayout() + Me.Panel5.ResumeLayout(False) + Me.Panel5.PerformLayout() + Me.PanelRadiusClients.ResumeLayout(False) + Me.PanelRadiusClients.PerformLayout() + Me.Panel7.ResumeLayout(False) + Me.Panel7.PerformLayout() + Me.PanelMailSetup.ResumeLayout(False) + Me.PanelMailSetup.PerformLayout() + Me.Panel6.ResumeLayout(False) + Me.Panel6.PerformLayout() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + Friend WithEvents btnRestart As System.Windows.Forms.Button + Friend WithEvents ImageList1 As System.Windows.Forms.ImageList + Friend WithEvents lvConfig As System.Windows.Forms.ListView + Friend WithEvents MenuBar As System.Windows.Forms.MenuStrip + Friend WithEvents ToolStripMenuItem1 As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents FileToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents SaveConfigurationToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents ExitToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents RestartRadiusServerToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents TestModemConfigurationToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents TestMailConfigurationToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents HelpToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents AboutToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents StatusBar As System.Windows.Forms.StatusStrip + Friend WithEvents ToolStripStatusLabel1 As System.Windows.Forms.ToolStripStatusLabel + Friend WithEvents Panel1 As System.Windows.Forms.Panel + Friend WithEvents MenuLabel As System.Windows.Forms.Label + Friend WithEvents Panel2 As System.Windows.Forms.Panel + Friend WithEvents PanelSetup As System.Windows.Forms.Panel + Friend WithEvents ckEnableOTP As System.Windows.Forms.CheckBox + Friend WithEvents ckDebug As System.Windows.Forms.CheckBox + Friend WithEvents PanelActiveDirectory As System.Windows.Forms.Panel + Friend WithEvents txtADField As System.Windows.Forms.TextBox + Friend WithEvents Label1 As System.Windows.Forms.Label + Friend WithEvents txtLdapDomain As System.Windows.Forms.TextBox + Friend WithEvents txtNetBios As System.Windows.Forms.TextBox + Friend WithEvents lblLdapDomain As System.Windows.Forms.Label + Friend WithEvents lblNetBios As System.Windows.Forms.Label + Friend WithEvents Panel4 As System.Windows.Forms.Panel + Friend WithEvents Label3 As System.Windows.Forms.Label + Friend WithEvents PanelSMSSetup As System.Windows.Forms.Panel + Friend WithEvents btnTestModem As System.Windows.Forms.Button + Friend WithEvents txtSMSC As System.Windows.Forms.TextBox + Friend WithEvents txtComPort As System.Windows.Forms.TextBox + Friend WithEvents lblSMSC As System.Windows.Forms.Label + Friend WithEvents lblComPort As System.Windows.Forms.Label + Friend WithEvents txtProvider As System.Windows.Forms.TextBox + Friend WithEvents lblProvider As System.Windows.Forms.Label + Friend WithEvents Panel5 As System.Windows.Forms.Panel + Friend WithEvents Label7 As System.Windows.Forms.Label + Friend WithEvents PanelRadiusClients As System.Windows.Forms.Panel + Friend WithEvents Label2 As System.Windows.Forms.Label + Friend WithEvents txtSecret As System.Windows.Forms.TextBox + Friend WithEvents lblSecret As System.Windows.Forms.Label + Friend WithEvents btnRemoveClient As System.Windows.Forms.Button + Friend WithEvents ListClients As System.Windows.Forms.ListBox + Friend WithEvents btnAddClient As System.Windows.Forms.Button + Friend WithEvents txtClient As System.Windows.Forms.TextBox + Friend WithEvents lblClient As System.Windows.Forms.Label + Friend WithEvents Panel7 As System.Windows.Forms.Panel + Friend WithEvents Label4 As System.Windows.Forms.Label + Friend WithEvents PanelMailSetup As System.Windows.Forms.Panel + Friend WithEvents Panel6 As System.Windows.Forms.Panel + Friend WithEvents Label5 As System.Windows.Forms.Label + Friend WithEvents TextBox1 As System.Windows.Forms.TextBox + Friend WithEvents Label6 As System.Windows.Forms.Label + Friend WithEvents ckEnableMail As System.Windows.Forms.CheckBox + Friend WithEvents ckEnableSMS As System.Windows.Forms.CheckBox + Friend WithEvents rbCitrixNetscaler As System.Windows.Forms.RadioButton + Friend WithEvents rbRDGateway As System.Windows.Forms.RadioButton + Friend WithEvents TextBox2 As System.Windows.Forms.TextBox + Friend WithEvents TextBox3 As System.Windows.Forms.TextBox + Friend WithEvents TextBox4 As System.Windows.Forms.TextBox + Friend WithEvents txtADMailField As System.Windows.Forms.TextBox + Friend WithEvents Label8 As System.Windows.Forms.Label + Friend WithEvents TextBox5 As System.Windows.Forms.TextBox + Friend WithEvents TextBox7 As System.Windows.Forms.TextBox + Friend WithEvents TextBox8 As System.Windows.Forms.TextBox + Friend WithEvents rbLocalSMS As System.Windows.Forms.RadioButton + Friend WithEvents rbOnlineSMS As System.Windows.Forms.RadioButton + Friend WithEvents TextBox9 As System.Windows.Forms.TextBox + Friend WithEvents TextBox10 As System.Windows.Forms.TextBox + Friend WithEvents TextBox13 As System.Windows.Forms.TextBox + Friend WithEvents txtSenderEmail As System.Windows.Forms.TextBox + Friend WithEvents txtMailServer As System.Windows.Forms.TextBox + Friend WithEvents Label10 As System.Windows.Forms.Label + Friend WithEvents Label9 As System.Windows.Forms.Label + Friend WithEvents Button1 As System.Windows.Forms.Button + +End Class diff --git a/Console/CICRadarRConfig/CICRadarRConfig/Main.resx b/Console/CICRadarRConfig/CICRadarRConfig/Main.resx new file mode 100644 index 0000000..636c1d5 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/Main.resx @@ -0,0 +1,1254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABQ + nAAAAk1TRnQBSQFMAgEBBwEAAVgBAAFYAQABMAEAATABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAHA + AwABYAMAAQEBAAEQBgABkP8AtwAB/wF/AfsBVgG2ASEBdQEZAXUBGQGWARkBlQEdAZYBHQGWAR0BdQEZ + AXUBGQFUAREBNAERATEBRgFSAUoBUgFKAVIBSgFzAU4BcwFOAXMBTgGUAVIBlAFSAbUBVgG1AVYBtQFW + AdYBWgE5AWcB3gF7JAABnAFzAVIBSgGtATUB7wE9ATEBRgGUAVIB9wFeATkBZwF7AW8BvQF3Ad4BewH/ + AX8B/wF//AAB3gF7AfMBPQH0AT0BlwFSARoBYwF8AW8BvQF3AVkBOgEZASoB3gE6Ad4BOgG+ATYBvQEy + Ab0BMgGdAS4BnAEuAXwBKgF7ASoBewEmAVsBIgFaAWsBOQFnARgBYwEYAWMBGAFjARgBYwH3AV4B9wFe + AfcBXgH3AV4B9wFeAdYBWgHWAVoBtQFWAc4BOQG9AXcgAAE5AWcBrQE1ATEBRgFSAUoBMQFGARABQgHv + AT0BzgE5Aa0BNQFrAS0BawEtAUoCKQElAUoBKQGtATUBEAFCAZQBUgE5AWcB/wF/IgAB9wFeAbUBVgEY + AWMBWgFrAZwBcwG9AXcB3gF7Af8BfwH/AX+8AAHeAXsB0wE5ARYBQgFxAS0BcQEtAXEBLQGSATEBFgE2 + AToBLgH+AToB3gE2Ab0BNgG9ATIBnQEyAZ0BLgGdAS4BfQEqAXwBJgF8ASYBXAEiATwBHgF7AW8BWgFr + AVoBawE5AWcBOQFnATkBZwE5AWcBOQFnATkBZwE5AWcBGAFjARgBYwE5AWcBWgFrARgBYwExAUYeAAFa + AWsBzgE5AbUBVgGUAlIBSgFSAUoBMQFGATEBRgExAUYBMQFGARABQgEQAUIBEAFCARABQgHvAT0BzgE5 + Aa0BNQGMATEBKQElAa0BNQH/AX8gAAGUAVIBMQFGAbUBVgGUAVIBcwFOAVIBSgExAUYBEAFCAXMBTgG1 + AVYB9wFeAVoBawF7AW8BvQF3Ad4BewH/AX8B/wF/qgAB3gF7AdMBOQEWAUIBmgFSAZIBMQFyAS0BcgEt + AfQBPQFZAToBvAE6Ad4BOgG+ATYBvQE2Ab0BMgGdATIBnQEuAZ0BLgF8ASoBfAEqAXwBJgFcASIBPAEe + AXsBbwF6AW8B9wFeAdYBWgHWAVoBtQFWAbUBVgGUAVIBlAFSAXMBTgFzAU4BUgFKAZQBUgFaAWsBWgFr + Aa0BNRwAAd4BewHOATkBlAFSAbUBVgFzAU4BUgFKAVIBSgFSAUoBMQFGATEBRgExAUYBEAFCARABQgEQ + AUIB7wE9Ae8BPQHvAT0B7wE9Ac4BOQHOATkBKQElARgBYyAAAZQBUgGUAVIBcwFOAVoBawFaAWsBOQFn + ATkBZwE5AWcBGAFjAdYBWgG1AVYBlAFSAXMBTgExAUYBEAFCAe8BPQExAUYBlAFSAfcBXgE5AWcBewFv + Ab0BdwHeAXsB/wF/Af8Bf5gAAf8BfwH0AT0BFgFCAXkBTgGaAVIBkgExAZMBMQGSATEB9AE9AZsBQgHd + AUIB3gE6Ad4BNgG9ATYBvQEyAZ0BMgGdAS4BnQEuAXwBKgF8ASoBfAEmAVwBJgE8AR4BOgFjAXsBbwFa + AWsBWgFrAVoBawFaAWsBWgFrAVoBawFaAWsBWgFrATkBZwE5AWcBOQFnAVoBawFaAWsBrQE1HAABOQFn + ARABQgHWAVoBtQFWAXMBTgFSAUoBUgFKARABQgHvAT0BEAFCATEBRgEQAUIB7wE9ARABQgEQAUIB7wE9 + Ae8BPQHvAT0BzgE5Ac4BOQGMATEBzgE5IAABlAFSAVoBawFzAU4B1gJaAWsBWgFrAVoBawFaAWsBWgFr + AVoBawFaAWsBOQFnAVoBawFaAWsBOQFnATkBZwEYAWMB1gFaAbUBVgFzAU4BUgFKARABQgHvAT0BzgE5 + ARABQgFzAU4B1gFaARgBYwFaAWsBnAFzAd4BewH/AX8B/wF/hgAB/wF/ARUBQgEXAUIBeQFOAXkBTgGa + AVIBkwExAZMBMQGTATEBFQFCAdwBSgH9AUIB3gE6Ad4BOgG+ATYBvQEyAb0BMgGdAS4BnQEuAX0BKgF8 + ASoBfAEmAVwBJgE8AR4BOgFnAXsBbwFaAWsBWgFrATkBZwE5AWcBOQFnATkBZwE5AWcBOQFnARgBYwEY + AWMBGAFjAVoBawFaAWsBrQE1HAABtQFWAXMBTgHWAVoBtQFWAXMBTgFSAUoBUgFKAc4BOQH3AV4BlAFS + ARABQgHOATkBlAJSAUoB7wE9Aa0BNQExAUYBMQFGAe8BPQHOATkBzgE5AQgBIQH/AX8eAAGUAVIBWgFr + Ab0BdwEQAUIBOQFnAXsBbwFaAWsBWgFrAVoBawFaAWsBWgFrAVoBawFaAWsBWgFrAVoBawFaAWsBWgFr + ATkBZwE5AWcBWgFrATkBZwE5AWcBOQFnATkBZwH3AV4B1gFaAZQBUgFzAU4BMQFGARABQgHOATkBzgE5 + Ae8BPQFSAUoBtQFWAfcBXgFaAWsBnAFzAb0BdwHeAXsB/wF/Af8Bf3IAAf8BfwEVAUIBFwFCAXkBTgF5 + AU4BeQFOAboBVgGzATUBswE1AbMBNQEVAUIB/AFOAf0BRgG/AS4BnQEiAd0BPgHdAT4B3QE+Ad0BPgG9 + AT4BvQE6Ab0BOgG9AToBvQE+AX0BJgE6AWcBewFzAfcBXgHWAVoB1gFaAbUBVgG1AVYBlAFSAZQBUgFz + AU4BcwFOAVIBSgFzAU4BewFvAXsBbwGtATUcAAFSAUoBlAFSAdYBWgG1AVYBcwFOAXMBTgFSAUoBUgFK + AZwBcwFaAWsBzgE5ATEBRgF7AW8BOQFnAc4BOQExAUYBWgFrARgBYwHOATkBzgE5Ac4BOQEIASEBvQF3 + HgABlAFSAVoBawH/AX8BOQFnATEBRgGcAXMBewFvAXsBbwF7AW8BewFvAXsBbwF7AW8BWgFrAVoBawFa + AWsBWgFrAVoBawFaAWsBWgFrAVoBawFaAWsBWgFrAVoBawFaAWsBOQFnAVoBawE5AWcBOQFnATkBZwE5 + AWcBOQFnATkBZwH3AV4BtQFWAZQCUgFKATEBRgHvAT0BrQE1Aa0BNQHOATkBlAFScAAB/wF/ARUBQgE3 + AUYBmgFSAXkBTgF5AU4BeQFOAboBVgGzATUBswE1AbMBNQEVAUIB/AFOAf0BRgHfASYB0wEAAfQBAAEU + AQUBNQEFAVUBCQFWAQkBVgEJAVUBCQE1AQUBFAEJAZ0BLgFbAWcBnAFzAXsBbwF7AW8BewFvAXsBbwF7 + AW8BewFvAXsBbwF7AW8BewFvAXsBbwF7AW8BewFvAXsBbwGtATUaAAH/AX8BEAFCAdYBWgHWAVoBtQFW + AXMBTgFzAU4BUgFKAWsBLQExAUYBMQFGAe8BPQGMATEBtQFWAdYBWgGtATUBzgE5AXsBbwF7AW8BzgE5 + Ac4BOQHOATkBKQElAXsBbx4AAZQBUgFaAWsB3gF7Ad4BewG1AVYBtQFWAZwBcwGcAXMBnAFzAXsBbwF7 + AW8BewFvAXsBbwF7AW8BewFvAXsBbwF7AW8BewFvAXsBbwFaAWsBWgFrAVoBawFaAWsBWgFrAVoBawFa + AWsBWgFrAVoBawFaAWsBWgFrATkBZwE5AWcBOQFnATkBZwE5AWcBOQFnATkBZwE5AWcBWgFrAXMBTgGt + ATUBEAFCbgAB/wF/ARUBQgE3AUYBmgFSAZkBUgGZAVIBeQFOAXkBTgG6AVYB0wE5AdMBOQHTATkBNQFG + Af0BTgH9AUYB3wEmAXUBEQFVAQkBlwENAdgBEQF2AQ0B1wEdAXYBEQHYAREBtwERAZcBGQGdAS4BWwFr + AZwBcwGcAXMBnAFzAZwBcwGcAXMBnAFzAZwBcwF7AW8BewFvAXsBbwF7AW8BewFvAXsBbwGcAXMBrQE1 + GgAB/wF/ARABQgHWAVoB1gFaAbUBVgFzAU4BcwFOAXMBTgEQAUIBEAFCATEBRgFSAUoBEAFCAc4BOQHO + ATkBEAFCAc4BOQFrAS0BawEtAc4BOQHvAT0B7wE9AUoBKQEYAWMeAAGUAVIBWgFrAd4BewG9AXcBvQF3 + AVIBSgEYAWMBvQF3AZwBcwGcAXMBnAFzAZwBcwGcAXMBnAFzAZwBcwGcAXMBewFvAXsBbwF7AW8BewFv + AXsBbwF7AW8BewFvAXsBbwF7AW8BewFvAVoBawFaAWsBWgFrAVoBawFaAWsBWgFrAVoBawFaAWsBWgFr + AVoBawFaAWsBWgFrAdYBWgHOATkBlAFSARABQmwAAd8BewE1AUYBNwFGAboBVgGaAVIBmgFSAZoBUgGa + AVIBmgFSAdoBWgHTATkB0wE5AdMBOQE2AUYBHQFTAf4BRgG/ASIBuQFKARQBAQG3AQ0B2AERAdgBHQGf + AVMBuwE6AbcBDQGXAQ0BWQE+AZ0BKgFbAWsBvQF3AfcBXgHWAVoBtQFWAXMBTgFaAWsBnAFzAZwBcwGc + AXMBewFvAXsBbwF7AW8BewFvAZwBcwGtATUaAAHeAXsBEAFCAfcBXgH3AV4BtQFWAXMBTgFzAU4B7wE9 + AXMBTgG1AVYBUgFKARABQgHOATkBcwFOAVIBSgEQAUIBrQE1ATEBRgExAUYB7wE9Ae8BPQHvAT0BawEt + AbUBVh4AAZQBUgFaAWsB3gF7Ab0BdwG9AXcBewFvARABQgF7AW8BvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9 + AXcBnAFzAZwBcwGcAXMBnAFzAZwBcwGcAXMBnAFzAZwBcwGcAXMBewFvAXsBbwF7AW8BewFvAXsBbwF7 + AW8BewFvAXsBbwF7AW8BewFvAVoBawFaAWsBWgFrAXsBbwEYAWMBrQE1ARgBYwG1AVYBEAFCagAB/wF/ + ATUBRgFXAUoBugFWAboBVgG6AVYBugFWAZoBUgGaAVIBmgFSAfoBXgH0AT0B0wE9AdQBPQFWAUoBHQFT + Af0BSgGfAR4BnAFzARcBMgFXAQUBVQEFARsBSwGbAWcBuwE+AXcBBQF1ARUB3gF7AZ0BKgF8AW8BvQF3 + AVoBawE5AWcBOQFnARgBYwF7AW8BnAFzAZwBcwGcAXMBnAFzAZwBcwGcAXMBnAFzAZwBcwGtATUaAAG9 + AXcBMQFGAfcBXgH3AV4BtQFWAXMBTgFzAU4BjAExAXsBbwF7AW8B9wFeAc4BOQFzAU4BewFvATkBZwHv + AT0BzgE5AVoBawEYAWMBMQFGAe8BPQHvAT0BjAIxAUYeAAGUAVIBWgFrAd4BewG9AXcBvQF3AZwBcwEY + AWMBMQFGAd4BewHeAXsBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwGc + AXMBnAFzAZwBcwGcAXMBnAFzAZwBcwGcAXMBnAFzAZwBcwF7AW8BewFvAXsBbwF7AW8BewFvAXsBbwFa + AWsBzgE5AbUBVgFaAWsBtQFWARABQmoAAXcBTgFXAUoB2wFaAboBVgG6AVYBugFWAboBVgG6AVYBugFW + AZoBTgGbAT4B1wEdAbYBHQHWASUBNwE+AR0BUwEeAUsBnwEeAXwBbwGaAXcBpQFFAYABUQGGAX4BqQF+ + AYgBfgESAUoB3gF7Ab4BdwGdASoBfAFvAb0BdwHeAXsB3gF7Ad4BewG9AXcBvQF3Ab0BdwG9AXcBvQF3 + AZwBcwGcAXMBnAFzAZwBcwG9AXcBrQE1GgABnAFzAVIBSgEYAWMB9wFeAbUBVgFzAU4BcwFOAc4BOQEQ + AUIBcwFOATEBRgHvAT0B7wE9AfcBXgH3AV4BzgE5AYwBMQGcAXMBewFvAVIBSgHvAT0B7wE9Aa0BNQGt + ATUeAAGUAVIBWgFrAf8BfwHeAXsBvQF3AZwBcwGcAXMBtQFWAZQBUgH/AX8B3gF7Ad4BewHeAXsB3gF7 + Ad4BewHeAXsB3gF7Ad4BewG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBnAFz + AZwBcwGcAXMBnAFzAZwBcwGcAXMBnAFzAXsBbwHvAT0BlAFSATkBZwFaAWsB1gFaARABQmoAARUBQgG6 + AVYB2wFaAdoBWgHaAVoB2gFaAboBWgHaAVoBmgFOAfoBDQF7ASoBuQEFAZkBAQGZAQECGgEeAUsBHgFL + Ab8BHgGcAW8BwQFRAcABVQElAWIBDgF/AQ4BfwEOAX8BqQF+Ab0BdwG+AXMBnQEqAZwBcwHeAXsB9wFe + AdYBWgHWAVoBtQFWAZQBUgGUAVIBcwFOAVIBSgHWAVoBvQF3AZwBcwGcAXMBvQF3Aa0BNRoAAXsBbwFz + AU4BGAFjAfcBXgG1AVYBlAFSAXMBTgFzAU4BEAFCARABQgExAUYBUgFKAe8BPQHOATkBrQE1ARABQgHO + ATkBSgEpAWsBLQGtATUB7wE9Ae8BPQHOATkBawEtHgABlAFSAVoBawH/AX8B3gF7Ab0BdwG9AXcBnAFz + AZwCcwFOAfcBXgH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHe + AXsB3gF7Ad4BewG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBEAFCAXMBTgE5 + AWcBWgFrAVoBawHWAVoBMQFGagABNQFGAdoBWgHbAVoB2wFaAdsBWgHbAVoB2wFeAZoBQgG5AQEBugEF + AZsBMgH6AQ0BmQEBAZkBAQIaAR4BSwEeAUsBvwEeARYBZwGgAVEB4AFVAUcBZgEvAX8BUQF/ATEBfwHM + AX4BVwF3Ab0BcwGdASoBnQFvAd4BewFaAWsBWgFrAVoBawFaAWsBWgFrAVoBawE5AWcBOQFnAVoBawG9 + AXcBvQF3Ab0BdwG9AXcBrQE1GgABWgFrAZQBUgEYAWMBGAFjAbUBVgGUAVIBlAFSAc4BOQG1AVYBlAFS + ATEBRgEQAUIB7wE9AVIBSgFSAUoBEAFCAa0BNQEQAUIBMQFGARABQgHvAT0B7wE9Ae8BPQEpASUB/wF/ + HAABlAFSAXsBbwH/AX8B3gF7Ab0BdwG9AXcBnAFzAZwBcwF7AW8BUgFKATkBZwH/AX8B/wF/Af8BfwH/ + AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHe + AXsB3gF7Ad4BewHeAXsB3gF7ATEBRgFzAU4BWgFrAVoBawFaAWsBewFvAfcBXgExAUZqAAE1AUYB2gFa + AdsBWgHbAVoB+wFeAfsBXgF6AToBugEBAbkBAQG6AQEB+wFOARcBMgHXAR0B1wEVAToBJgE+AU8BHgFL + Ab8BGgE3AWsBoAFRAQABWgHiAVkBMQF/AXMBfwFzAX8B7QF+ATUBdwGdAW8BnQEuAZ4BbwHeAXsB3gF7 + Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsBvQF3Ab0BdwG9AXcB3gF7Aa0BNRoAATkBZwGU + AVIBGAFjARgBYwG1AVYBlAFSAZQBUgHOATkBnAFzAVoBawGUAVIBrQE1AdYBWgF7AW8BGAFjARABQgGt + ATUBewFvATkBZwGUAVIB7wE9Ae8BPQHvAT0BCAEhAf8BfxwAAZQBUgF7AW8B/wF/Ad4BewHeAXsBvQF3 + Ab0BdwGcAXMBnAFzAVoBawExAUYBewFvAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Ad4BewH/AX8B3gF7ATEBRgFSAUoBewFv + AVoBawFaAWsBewFvAZwBcwH3AV4BMQFGagABNQFGAfsBXgH7AV4B+wFeAfsBYgF7ATYB2gEJAdoBCQHa + AQUBegFCATwBawE1AUoBFAFGARQBRgF3AVIBPgFbAR4BTwG/AR4BfAFvAeMBUQEAAVoBAAFeAeEBWQEk + AV4BAwFeAQMBYgFZAXMBnQFvAZ4BLgG+AW8B/wF/Ad4BewHeAXsB3gF7Ab0BdwG9AXcBvQF3Ab0BdwG9 + AXcBnAFzAZwBcwGcAXMBnAFzAd4BewGtATUaAAEYAWMBtQFWATkBZwEYAWMBtQFWAZQBUgGUAVIBawEt + AZQBUgG1AVYBEAFCAc4BOQFSAUoBOQFnATkBZwHvAT0BSgEpAb0BdwGcAXMBGAFjAc4BOQHvAT0B7wE9 + AQgBIQHeAXscAAG1AVYBewFvAf8BfwH/AX8B3gF7Ad4BewG9AXcBvQF3AZwBcwGcAXMBWgFrATEBRgGc + AXMB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/ + AX8B/wF/Af8BfwH/AX8B/wF/ATEBRgFzAU4BewFvAXsBbwF7AW8BewFvAZwBcwGcAXMBGAFjATEBRmoA + ATUBRgH7AV4B+wFiAfsBYgF7ATIBGwEWARsBEgH6AREB2wFSAfsBYgE8AWcBVQFKATUBRgE1AUYBlwFS + AV4BWwEeAU8BvwEaAVoBbwE4AWcBwAFRASABXgFAAWYBYAFmAUABZgHAAVUBOAFrAZwBbwG+AS4BvgF3 + Af8BfwHWAVoB1gFaAdYBWgG1AVYBtQFWAZQBUgGUAVIBcwFOAXMBTgFSAUoBUgFKAZQBUgH/AX8BrQE1 + GgAB9wFeAdYBWgE5AWcBGAFjAbUBVgGUAVIBlAFSAXMBTgFSAUoBMQFGAVIBSgFzAU4B7wE9Aa0BNQGt + ATUBEAFCAe8BPQFKASkBawEtAYwBMQHvAT0B7wE9Ae8BPQEpASUB3gF7HAABlAFSAXsBbwH/AX8B/wF/ + Af8BfwHeAXsBvQF3Ab0BdwGcAXMBnAFzAZwBcwE5AWcBMQFGAb0BdwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ATEBRgGUAVIBnAFz + AXsBbwGcAXMBnAFzAZwBcwGcAXMBvQF3ARgBYwExAUZqAAFVAUoB+wFiARwBXwGcAS4BXAEiATsBGgFb + ASIB+wFaARsBYwH7AWIBXAFrAXYBTgE1AUoBNQFKAZcBUgFeAVsBPgFTAb8BHgFZAXMBegFvAVkBbwFK + AV4BAgFeAQEBXgEmAV4B9AFqAZwBdwF8AW8BvgEyAd4BewH/AX8BvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9 + AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcB/wF/Aa0BORoAAdYBWgH3AV4BOQFnATkBZwHWAVoBlAFS + AZQBUgGUAVIBlAJSAUoBEAFCAe8BPQHvAT0BEAFCARABQgEQAUIBEAFCATEBRgEQAUIBEAFCARABQgHv + AT0B7wE9ASkBJQG9AXccAAGUAVIBewFvAf8BfwH/AX8B/wF/Ad4BewHeAXsBvQF3Ab0BdwG9AXcBnAFz + AZwBcwE5AWcBMQFGAZwBcwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8B/wF/Ad4BewEQAUIB1gFaAb0BdwG9AXcBnAFzAb0BdwG9AXcBvQF3Ab0BdwHeAXsBOQFn + ATEBRmoAAVYBSgH7AVoBvQEyAX0BKgF8ASYBnAE2ARwBYwEcAWMBHAFnAbsBSgHbAUYBGQEeAdcBGQH3 + ASEBeAE+AV8BWwE+AU8BvwEiAd0BLgHdAS4B3QEuAd4BLgH/AS4B/wEyAf8BMgHeATIB3QEyAR4BQwG+ + ATIBvgFzAf8BewH/AXsB/wF7Ad8BewHfAXsB3wF3Ad8BdwHfAXcB3wF3Ad8BdwHeAXcB3wF3Ad4BdwHf + AXcBcAElGgABtQFWAfcBXgE5AWcBOQFnAdYBWgGUAVIBlAFSAXMBTgHOATkBlAFSATkBZwGcAXMBvQF3 + AZwBcwF7AW8BOQFnAdYBWgFzAU4BMQFGARABQgEQAUIB7wE9ARABQgFKASkBnAFzHAABtQFWAXsBbwH/ + AX8B/wF/Af8BfwH/AX8B3gF7Ad4BewHeAXsBvQF3Ab0BdwGcAXMBnAFzAVoBawExAUYBewFvAf8BfwH/ + AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/AXsBbwHvAT0BGAFjAd4BewG9 + AXcBvQF3Ab0BdwG9AXcBvQF3Ad4BewHeAXsB/wF/AVoBawExAUZqAAFWAU4BvQE6Ab0BMgGdAS4B3AFG + ATwBawE8AWcBPAFrAVsBMgHaAQkBuwE+ARoBFgGZAQEBmQEBARsBHgFfAVcBPgFPAR8BSwEfAUcBHwFH + Af8BQgH+AUIB/gE+Ad4BPgHeAToB3gE6Ad4BNgG9ATYBvQE2AZ0BLgGdAS4BnQEuAX0BKgF9ASoBfQEq + AX0BJgF8ASYBfQEmAXwBJgF8ASYBXAEmAXwBIgFcASIBXAEmAVQBFRgAAf8BfwGUAVIBGAFjATkBZwE5 + AWcBtQFWAZQBUgGUAlIBSgHvAT0BWgFrAf8BfwH/AX8B3gF7Ab0BdwF7AW8BWgFrARgBYwG1AVYBUgFK + ARABQgEQAUIBEAFCARABQgFKASkBewFvHAABtQFWAXsBbwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwHe + AXsB3gF7Ab0BdwG9AXcBvQF3Ab0BdwF7AW8BMQFGATkBZwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/ + AX8B/wF/Af8BfwH/AX8B1gFaARABQgGcAXMB/wF/Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Af8BfwH/ + AX8B/wF/AVoBawExAUZqAAF2AU4B3gE+Ad4BNgEdAVcBPAFrATwBawE8AWMB+gEZAZkBAQHaAQkB2wFC + AToBGgGZAQEBmQEBAhoBPwFTAT4BTwEfAUcBHwFHAR8BRwH/AUIB/gFCAf4BPgH+AT4B3gE+Ad4BOgHe + AToB3gE6Ab0BNgG9ATYBvQE2Ab0BMgG9ATIBnQEyAZ0BLgGdAS4BnQEuAZ0BLgGdAS4BnQEuAZ0BKgGd + ASoBnQEqAVwBJgH2AS0YAAH/AX8BlAFSARgBYwE5AWcBOQFnAbUBVgGUAVIBlAFSAZQBUgFzAU4B7wE9 + Aa0BNQHvAT0BMQFGATEBRgExAUYBMQFGARABQgEQAUIBEAFCARABQgEQAUIBEAFCARABQgFKASkBewFv + HAABtQFWAXsBbwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B3gF7Ad4BewHeAXsB3gF7Ad4BewFa + AWsBcwFOAVIBSgGUAVIB3gF7Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/AXsBbwExAUYBEAFCAd4BewH/ + AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/AVoBawExAUZqAAF2AU4B/gFC + AT0BYwFcAWsBXQFrARwBWwH6AREBugEFAbkBAQH6AREBPAFfAXgBQgEXASoB9wEhARgBIgHcAT4BfwFf + AT8BTwEfAUcBHwFHAR8BQwH/AUIB/gE+Af4BPgHeAToB3gE6Ad4BOgHeATYBvgE2Ab4BNgG9ATYBvQEy + Ab0BMgGdATIBnQEuAZ0BLgGdAS4BnQEuAZ0BLgGdAS4BnQEuAZ0BLgGcAS4B2AEdAVwBaxgAAf8BfwFz + AU4BOQFnAVoBawE5AWcBtQFWAbUBVgGUAVIBlAFSAZQBUgGUAVIBcwFOAXMBTgFzAU4BUgFKAVIBSgFS + AUoBMQFGATEBRgExAUYBEAFCARABQgEQAUIBEAFCAWsBLQF7AW8cAAG1AVYBewFvAf8BfwH/AX8B/wF/ + Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwG9AXcBtQFWAZQBUgF7AW8BnAFzAdYBWgExAUYB9wFe + Ab0BdwH/AX8B3gF7AVoBawFzAU4BMQFGATkBZwHWAVoBEAFCATkBZwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8B/wF/Af8BfwH/AX8BWgFrATEBRmoAAXYBTgE8AWcBXQFvAX0BbwHcAUoBGwESAfoBDQHa + AQkBOwEiATwBZwF9AXMBtwFWAXYBTgF2AVIBdgFSAZcBVgEaAV8BXQFjAZ8BYwGfAWcBnwFnAZ8BZwGf + AWcBnwFjAX8BYwF/AV8BfwFfAX8BXwF/AVsBfwFbAX8BWwFfAVcBXwFXAV8BVwFfAVcBXwFTAT8BUwE+ + AVMBPgFTAT4BUwEeAU8BvAFCAbsBQgF9AWsB/wF/GAAB3gF7AZQBUgE5AWcBWgFrAVoBawHWAVoBtQFW + AXMBTgFSAUoBUgFKAXMBTgFzAU4BcwFOAXMBTgFzAU4BcwFOAXMBTgFzAU4BcwFOAVIBSgFSAUoBMQFG + ARABQgEQAUIBawEtAVoBaxwAAbUBVgF7AW8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/ + AX8BWgFrAXMBTgEYAWMBvQF3AZwBcwGcAXMBnAFzAZwBcwHWAVoBUgFKARABQgEQAUIBlAFSATkBZwG9 + AXcBnAFzAb0BdwF7AW8BcwFOAVIBSgG9AXcB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwFa + AWsBMQFGagABdgFOAVwBawF9AW8BvAE+ATwBGgE7ARoBGwESAbwBPgFdAW8BXAFrAX0BbwG3AVYBdgFO + AXYBTgF2AU4BdgFOAZYBUgG4AVYB2AFaAdgBWgHYAVoBuAFaAbgBWgG4AVYBtwFWAbcBVgGXAVYBlwFS + AZgBTgF4AUYBeAE+AXkBNgF5ATIBegEqAXoBJgFbASIBWwEeATUBRiYAAd4BewGUAVIBWgFrAVoBawFa + AWsB1gFaAZQBUgHvAT0BUgFKAVIBSgFSAUoBUgFKAXMBTgFzAU4BlAFSAZQBUgG1AVYB1gFaAdYBWgH3 + AV4B9wFeARgBYwGUAVIBEAFCAWsBLQFaAWscAAG1AVYBewFvAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8BtQFWAZQBUgF7AW8BvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3 + Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwEYAWMBEAFCAdYBWgH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8BWgFrAVIBSmoAAZYBUgFdAWcBvQE2AXwBJgFcASIBXAEiAR0BWwF9AXMBXQFvAV0BawGd + AXMB2AFeAZYBVgGWAVIBlgFSAZYBUgGWAVIBdgFOAXYBTgF2AU4BdgFOAVYBSgFVAUoBVQFKAVUBSgE1 + AUYBNQFGATUBRgE1AUYBFQFCARQBQgEUAUIB9AFBAfQBQQH0AUEB0wE9AdMBOQGzATUmAAHeAXsBtQFW + AVoBawFaAWsBWgFrAdYBWgFSAUoBEAFCAXMBTgFSAUoBUgFKAVIBSgFzAU4BcwFOAXMBTgGUAVIBlAFS + AbUBVgG1AVYB1gFaAfcBXgH3AV4BGAFjARABQgFrAS0BOQFnHAABtQFWAXsBbwH/AX8B/wF/Af8BfwH/ + AX8B/wF/Af8BfwFaAWsBcwFOARgBYwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9 + AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG1AVYBEAFCAVoBawH/ + AX8B/wF/Af8BfwH/AX8B/wF/AVoBawFSAUpqAAGWAVIBvQE6Ab0BMgGdASoBvQE2AX0BbwF9AXMBfQFv + AZ0BcwHcAU4B/AFKAToBJgHYAREB+AEZAfgBIQEYASoBNwEyATcBOgFXAUIBdgFGAXYBTgF2AVIBdQFS + AVUBTgFVAU4BVQFKATUBSgE1AUoBNQFGATUBRgEUAUIBFAFCAfQBPQH0AT0B9AE9AfQBPQHUATkBswE1 + JgABvQF3AbUBVgFaAWsBWgFrAVoBawHWAVoBUgFKAe8BPQFSAUoBMQFGATEBRgExAUYBUgFKAVIBSgFz + AU4BcwFOAZQBUgGUAVIBtQFWAbUBVgHWAVoB9wFeAfcBXgEQAUIBjAExATkBZxwAAbUBVgGcAXMB/wF/ + Af8BfwH/AX8B/wF/Ad4BewG1AVYBtQFWAZwBcwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3 + Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcB3gJ7 + AW8BUgFKAXMBTgHeAXsB/wF/Af8BfwH/AX8BWgFrAVIBSmoAAZYBVgHdAT4BvgEyAR0BTwGeAXcBnQFz + AZ4BcwF9AWsBOgEiAdoBCQH8AUYBWgEiAZkBAQGZAQEBmQEBAZkBAQGZAQEBmQEBAZkBAQGZAQEBmQEB + AbkBAQHZAQUB2QENAfgBFQH4ARkBGAEiARcBKgEXAS4BFgE2ARUBOgEVAUIBFAFCAfQBQQH0AUEB9AE9 + AdQBPQGzATUmAAG9AXcBtQFWAXsBbwFaAWsBWgFrAdYBWgExAUYB7wE9AXMBTgGUAVIBlAFSAZQCUgFK + ATEBRgFSAUoBUgFKAXMBTgGUAVIBlAFSAbUBVgHWAVoB1gFaAdYBWgEQAUIBjAExAVoBaxwAAbUBVgGc + AXMB/wF/Af8BfwH/AX8BWgFrAXMBTgE5AWcB3gF7Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9 + AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9AXcBvQF3Ab0BdwG9 + AXcBvQF3Ad4BewHeAXsBGAFjARABQgEYAWMB/wF/Af8BfwFaAWsBUgFKagABtwFWAf4BQgF+AWMBvgF3 + Ab4BdwG+AXsB/AFOAbkBBQGZAQEB2gEJARwBTwFbASYBmQEBAZkBAQGZAQEBmQEBAZkBAQGZAQEBmQEB + AZkBAQG5AQEBuQEBAbkBAQG5AQEB2gEBAdoBAQHaAQEB2gEBAfoBAQH6AQEB+gEBAfsBAQH6AQEB+gEB + AfkBCQH5AQ0B9wEVAbMBOSYAAb0BdwHWAVoBewFvAXsBbwF7AW8B1gFaATEBRgExAUYBGAFjARgBYwEY + AWMBGAFjARgBYwH3AV4BtQFWAVIBSgFSAUoBcwFOAZQBUgGUAVIBtQFWAdYBWgG1AVYBEAFCAYwBMQFa + AWscAAG1AVYBnAFzAf8BfwHeAXsBtQFWAXMBTgG1AVYB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7 + Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7 + Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewExAUYBUgFKATEBRgGcAXMBewFvAVIBSmoAAbcBVgGe + AW8BvgF3Ab4BewGeAXMBfAEuAdoBCQHaAQUBugEBAfoBEQGdAWsB+QFWAXcBPgFYATYBOAEuARgBJgH4 + AR0B2QEVAdkBCQG5AQUBuQEBAbkBAQG6AQEBuQEBAboBAQHaAQEB2gEBAdoBAQH6AQEB+gEBAfoBAQH6 + AQEB+gEBAfoBAQH6AQEB+gEBAfkBAQGzATkmAAG9AXcB1gFaAXsBbwF7AW8BewFvAdYBWgEQAUIBMQFG + ARgBYwEYAWMBGAFjARgBYwEYAWMBGAFjARgBYwEYAWMBtQFWAXMBTgFzAU4BlAFSAbUBVgG1AVYBlAFS + ARABQgGMATEBWgFrHAABtQFWAZwBcwFaAWsBcwFOAZQBUgGUAVIBlAFSAf8BfwHeAXsB3gF7Ad4BewHe + AXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHe + AXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsBMQFGAfcBXgG1AVYBEAFCAVIBSgFz + AU5qAAG3AVYBvgF3Ad4BfwFeAV8BPAEeARsBFgH7AREB2gEJAZsBMgGdAXMBvgF3ARkBYwHXAVoB1wFa + AdcBWgHXAVoBtwFaAbcBWgG3AVoBtgFaAZYBVgGWAU4BdwFGAVcBPgE3ATYBNwEuARgBJgEYAR4B+AEV + AfkBDQH5AQUB+gEBAfoBAQH6AQEB+gEBAfoBAQHZAQEB0wE5JgABvQF3AfcBXgGcAXMBewFvAXsBbwHW + AVoB7wE9ATEBRgEYAWMBGAFjARgBYwEYAWMBGAFjARgBYwEYAWMBGAFjARgBYwEYAWMB1gFaAdYBWgHW + AVoB1gFaAZQBUgExAUYBawEtAXsBbxwAAbUBVgGUAVIBcwFOAZQBUgG1AVYBlAFSAbUBVgH/AX8B3gF7 + Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7 + Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB/wF/AVIBSgH3AV4B9wFe + AfcBXgFSAUoBlAFSagABtwFWAb4BdwH9AUYBXAEiAVwBIgE7ARoBOwEeAV0BXwG+AXsBngFzAb4BdwEZ + AWMB1wFaAdcBWgHXAVoBtwFWAbcBVgG3AVYBtwFWAbcBVgGXAVIBlgFSAZYBUgF2AVIBdgFSAXYBTgF1 + AU4BVQFOAVUBTgE1AUoBNQFKATUBSgEVAUIBFQE+AfUBNQH2AS0B9gEpAdMBOSYAAZwBcwH3AV4BnAFz + AXsBbwF7AW8B1gFaAe8BPQFSAUoBOQFnATkBZwE5AWcBOQFnATkBZwEYAWMBGAFjARgBYwEYAWMBGAFj + ARgBYwEYAWMBGAFjAfcBXgFzAU4BMQFGAWsBLQF7AW8cAAH3AV4BcwFOAZQBUgGUAVIBtQFWAZQBUgG1 + AVYB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/ + AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwFS + AUoB9wFeAfcBXgG1AVYBMQFGAd4Be2oAAdcBWgHdAToBnQEuAX0BKgFcASIB/QFGAd4BewG+AXcBvgF3 + AZ4BcwG+AXcBOgFnAdgBWgHYAVoB1wFaAdcBWgHXAVoBtwFWAbcBVgG3AVYBtwFWAZcBUgGWAVIBlgFS + AXYBTgF2AU4BdgFOAVYBSgFVAUoBNQFGATUBRgE1AUYBFQFGARQBQgEUAUIB9AFBAfQBPQHUATkmAAG9 + AXcB9wFeAZwBcwF7AW8BewFvAdYBWgHOATkBUgFKATkBZwE5AWcBOQFnATkBZwE5AWcBOQFnARgBYwEY + AWMBGAFjARgBYwEYAWMBGAFjARgBYwH3AV4BUgFKATEBRgFrAS0BnAFzHAAB/wF/AdYBWgFzAU4BtQFW + AbUBVgGUAVIBtQFWAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8BUgFKARgBYwHWAVoBEAFCAb0Bd2wAAdcBWgHdAT4BvQEyAb0BNgGeAW8B3wF/Ad8BewG+ + AXcBvgF3AZ4BcwG+AXcBOgFnAfgBXgH4AV4B2AFaAdgBWgHXAVoB1wFaAbcBVgG3AVYBtwFWAZcBUgGW + AVIBlgFSAXYBTgF2AU4BdgFOAVYBSgFVAUoBVQFKATUBRgE1AUYBNQFGARUBQgEUAUIB9AE9AfQBPQHU + ATkmAAG9AXcBGAFjAZwBcwGcAXMBewFvAfcBXgGtATUBUgFKATkBZwFaAWsBWgFrAVoBawE5AWcBOQFn + ATkBZwEYAWMBGAFjARgBYwEYAWMBGAFjARgBYwHWAVoBUgFKATEBRgFrAS0BvQF3HgAB/wF/AfcBXgFz + AU4BtQFWAZQBUgHWAVoB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/ + AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/ + AX8B/wF/Af8BfwFSAUoB1gFaARABQgG9AXduAAHXAV4B/gE+AV8BWwH/AX8B/wF/Ad8BewHeAXsBvgF3 + Ab4BdwGeAXMBvgF3AVoBawH4AV4B+AFeAfgBXgHYAVoB2AFaAdcBWgHXAVoBtwFWAbcBVgG3AVYBlwFS + AZYBUgGWAVIBdgFOAXYBTgFWAUoBVQFKAVUBSgE1AUYBNQFGATUBRgEVAUIBFAFCARQBQgH0AT0B1AE5 + JgABvQF3ARgBYwGcAXMBnAFzAZwBcwH3AV4BrQE1AVIBSgE5AWcBWgFrAVoBawFaAWsBOQFnATkBZwE5 + AWcBGAFjARgBYwEYAWMBGAFjARgBYwEYAWMB1gFaATEBRgExAUYBawEtAd4BeyAAAf8BfwE5AWcBcwFO + AZQBUgHWAVoB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwFzAU4BMQFGAb0Bd3AAAdcBWgG/AXMB/wF/Af8BfwH/AX8B3wF7Ad4BewG+AXcBvgF3AZ4BcwG+ + AXcBWgFrAfgBXgH4AV4B+AFeAfgBXgHYAVoB1wFaAdcBWgG3AVYBtwFWAbcBVgGXAVIBlgFSAZYBUgF2 + AU4BdgFOAXYBTgFWAUoBVQFKATUBRgE1AUYBNQFGARUBQgEUAUIBFAFCAfQBPQHUATkmAAG9AXcBGAFj + AZwBcwGcAXMBnAFzAfcBXgGMATEBzgE5AVoBawFaAWsBWgFrAVoBawE5AWcBOQFnATkBZwEYAWMBGAFj + ARgBYwEYAWMBGAFjARgBYwGUAVIBMQFGAVICSgEpAf8BfyIAAf8BfwF7AW8BcwFOAdYBWgHeAXsBvQF3 + Ab0BdwG9AXcBnAFzAZwBcwF7AW8BewFvAXsBbwFaAWsBWgFrATkBZwE5AWcBOQFnARgBYwEYAWMBGAFj + AfcBXgH3AV4B1gFaAdYBWgHWAVoBtQFWAbUBVgG1AVYBlAFSAZQBUgGUAVIBlAFSAXMBTgG9AXdyAAHX + AVoB3gF7Af8BfwH/AX8B3wF7Ad8BewHeAXsBvgF3Ab4BdwGeAXMBvgF3AVsBawEYAWMB+AFeAfgBXgH4 + AV4B+AFeAdgBWgHXAVoB1wFaAbcBVgG3AVYBlwFSAZYBUgGWAVIBdgFOAXYBTgF2AU4BVgFKAVUBSgFV + AUoBNQFGATUBRgEVAUIBFAFCARQBQgH0AT0B1AE5JgABvQF3ARgBYwGcAXMBnAFzAZwBcwH3AV4BlAFS + AQgBIQHnARwBCAEhAQgBIQEpASUBKQElAUoBKQFrAS0BawEtAYwBMQGtATUBrQE1Ac4BOQHvAT0BEAFC + ATEBRgExAUYBawEtAf8BfyYAAZwCcwFOAVIBSgFzAU4BcwFOAXMBTgFzAU4BcwFOAXMBTgGUAVIBlAFS + AZQBUgGUAVIBtQFWAbUBVgG1AVYB1gFaAdYBWgHWAVoB1gFaAfcBXgH3AV4B9wFeAfcBXgEYAWMBGAFj + ARgBYwEYAWMBGAFjAdYBWgExAUYBvQF3Af8Bf3IAAfgBXgHeAXsB3wF7Ad8BewHfAXsB3gF7Ab4BdwG+ + AXcBvgF3AZ4BcwG+AXcBewFvARgBYwEYAWMB+AFeAfgBXgH4AV4B2AFaAdcBWgHXAVoBtwFWAbcBVgG3 + AVYBlwFSAZYBUgF2AU4BdgFOAXYBTgFWAUoBVQFKAVUBSgE1AUYBNQFGARUBQgEUAUIBFAFCAfQBPQHU + ATkmAAHeAXsBGAFjAb0BdwGcAXMBnAFzAfcBXgH3AV4B9wFeAbUBVgG1AVYBtQFWAbUBVgG1AVYBlAFS + AZQBUgGUAVIBlAFSAXMBTgFzAU4BcwFOAVIBSgFSAUoBUgFKATEBRgGtATUqAAHeAXsBlAFSAZQBUgHW + AVoB1gFaAfcBXgH3AV4B9wFeAfcBXgH3AV4BGAFjARgBYwEYAWMBGAFjATkBZwE5AWcBOQFnATkBZwFa + AWsBWgFrAVoBawFaAWsBWgFrAVoBawFaAWsBOQFnATkBZwHWAVoBMQFGAb0Bd3YAAfgBXgG+AXcB3wF7 + Ad8BewHeAXsBvgF3Ab4BdwG+AXcBngFzAZ4BcwG+AXcBewFvARgBYwEYAWMB+AFeAfgBXgH4AV4B2AFa + AdcBWgHXAVoBtwFWAbcBVgG3AVYBlwFSAZYBUgF2AU4BdgFOAXYBTgFWAUoBVQFKAVUBSgE1AUYBNQFG + ARUBQgEUAUIBFAFCAfQBPQHUATkmAAHeAXsBGAFjAb0BdwG9AXcBvQF3AfcBXgH3AV4B1gFaAdYBWgHW + AVoB1gFaAbUBVgG1AVYBlAFSAZQBUgGUAVIBlAFSAXMBTgFzAU4BcwFOAVIBSgFSAUoBUgFKARABQgFS + AUosAAH/AX8B9wFeAXMBTgHWAVoB9wFeAfcBXgH3AV4B9wFeAfcBXgEYAWMBGAFjARgBYwEYAWMBGAFj + ATkBZwE5AWcBOQFnATkBZwFaAWsBWgFrAVoBawFaAWsBWgFrAVoBawFaAWsBtQFWAVIBSgHeAXt4AAH4 + AV4BvgF3Ab4BdwG+AXcBvgF3Ab4BdwG+AXcBngFzAZ4BcwGeAXMB3gF7Ad4BewG9AXcBnAFzAZwBcwF7 + AW8BWgFrAToBZwEZAWMB+AFeAdgBWgG3AVYBlgFSAZYBUgGWAVIBdgFOAXYBTgF2AU4BVQFKAVUBSgE1 + AUYBNQFGATUBRgEVAUIBFAFCARQBQgH0AT0B1AE5JgAB/wF/ARgBYwGcAXMBvQF3Ab0BdwH3AV4B9wFe + AdYBWgHWAVoB1gFaAbUBVgG1AVYBtQFWAbUBVgG1AVYBtQFWAZQBUgFzAU4BcwFOAXMBTgFzAU4BUgFK + AVIBSgHvAT0B9wFeLgAB/wF/AVoBawFzAU4B1gFaAfcBXgH3AV4B9wFeAfcBXgEYAWMBGAFjARgBYwEY + AWMBGAFjATkBZwE5AWcBOQFnATkBZwFaAWsBWgFrAVoBawFaAWsBWgFrAVoBawGUAVIBlAFSAd4Be3oA + AfgBXgGeAXMBvgF3Ab4BdwG+AXcBvgF3AZ4BcwG+AXcB3gF7Ad4BewGeAXMBfQFvAX0BbwF9AW8BfQFv + AX0BbwF9AW8BfQFvAX0BbwF9AW8BfQFvAX0BbwF9AW8BXAFrAVsBawE7AWcBGgFjAfkBXgHYAVoBuAFW + AbcBVgF2AU4BVgFKATUBRgEUAUIBFAFCAfQBPQHUATkoAAF7AW8BewFvAb0BdwG9AXcBGAFjAfcBXgH3 + AV4B1gFaAXMBTgG1AVYB1gFaAdYBWgH3AV4B1gFaAbUBVgGUAVIBcwFOATEBRgEQAUIBcwFOAVIBSgFS + AUoBrQE1AVoBazIAAb0BdwGUAVIBlAFSAfcBXgH3AV4B9wFeARgBYwEYAWMBGAFjARgBYwEYAWMBOQFn + ATkBZwE5AWcBOQFnATkBZwFaAWsBWgFrAVoBawFaAWsBcwFOAdYBWgH/AX98AAH4AV4BnQFzAZ4BcwGe + AXMBngFzAb4BdwHfAXsBvgF3Ab4BdwGeAXMBngFzAZ0BcwF9AW8BfQFvAX0BbwFdAWsBXQFrAVwBawE8 + AWcBPAFnARwBYwEcAWMBHAFjAfsBXgH7AV4B+wFeAdsBWgHbAVoB2wFaAboBVgG6AVYBugFWAboBVgG6 + AVYBuQFWATcBRgHUATkBFQFCKAABnAFzAVoBawG9AXcBvQF3ATkBZwH3AV4B9wFeAdYBWgFzAU4BlAFS + AfcBXgEYAWMBGAFjARgBYwH3AV4BtQFWAXMBTgFSAUoBUgFKAXMBTgFSAUoBcwFOAYwBMQG9AXc0AAH/ + AX8B9wFeAXMBTgHWAVoBGAFjARgBYwEYAWMBGAFjARgBYwEYAWMBOQFnATkBZwE5AWcBOQFnAVoBawFa + AWsBWgFrARgBYwFSAUoBWgFrAf8Bf34AAfgBXgF9AW8BngFzAd8BewHfAXsB3wF7Ab4BdwG+AXcBvgF3 + AZ4BcwGeAXMBnQFzAX0BbwF9AW8BfQFvAV0BawFdAWsBXAFrATwBZwE8AWcBPAFnARwBYwEcAWMBGwFj + AfsBXgH7AV4B2wFaAdsBWgHbAVoB2wFaAbsBVgGaAVIBVwFKARUBQgH0AT0BuQFWAXwBbwH/AX8oAAHe + AXsBGAFjAb0BdwG9AXcBewFvAfcBXgH3AV4B1gFaAdYBWgG1AVYBcwFOAZQBUgG1AVYBtQFWAZQBUgGU + AVIBcwFOAZQBUgFzAU4BcwFOAXMBTgExAUYBzgE5Af8BfzYAAf8BfwGcAnMBTgGUAVIB9wFeARgBYwEY + AWMBGAFjARgBYwEYAWMBOQFnATkBZwE5AWcBOQFnAVoBawG1AVYBcwFOAb0Bd4IAAfgBXgFbAWsBnAFz + AZ0BcwG9AXcBvgF3Ab4BdwG+AXcBvgF3Ab4BdwGeAXMBngFzAZ4BcwF9AW8BfQFvAX0BbwFdAWsBXQFr + ATwBZwE8AWcBPAFnARwBYwEcAWMBHAFjAfsBXgH7AV4B+wFeAfsBXgG6AVYBVwFKARUBQgE1AUYBGgFj + AZ0BcwH/AX8wAAGcAXMBOQFnAb0BdwG9AXcBGAFjAfcBXgH3AV4B1gFaAdYBWgHWAVoB1gFaAbUBVgG1 + AVYBlAFSAZQBUgGUAVIBlAFSAXMBTgFzAU4BcwFOAa0BNQE5AWc8AAH/AX8BOQFnAXMBTgG1AVYBGAFj + ARgBYwEYAWMBGAFjATkBZwE5AWcBOQFnAfcBXgFSAUoBGAFjAf8Bf4QAAb0BdwF8AW8BewFvAVsBawFa + AWsBOgFnATkBZwH4AV4B1wFaAdcBWgHYAVoB2AFaAdgBWgH5AV4B+QFeAfkBXgH5AV4B+gFeAfoBXgH6 + AV4B+wFeAfsBXgEbAWMBGwFjARwBYwG6AVYBdwFOATUBRgF3AU4BOwFnAb4BdwH/AX82AAH/AX8BWgFr + ARgBYwGcAXMBvQF3ATkBZwH3AV4B1gFaAdYBWgHWAVoB1gFaAbUBVgG1AVYBtQFWAZQBUgGUAVIBlAFS + AZQCUgFKAc4BOQFSAUoB/wF/QAAB3gF7ARgBYwFSAUoBlAFSAdYBWgEYAWMBGAFjAdYBWgFzAU4BtQFW + Ab0Bd5YAAf8BfwH/AX8B/wF/Af8BfwHeAXsB3gF7Ab0BdwGdAXMBnAFzAXsBbwFbAWsBOgFnARkBYwH4 + AV4BtwFWAZcBUgFVAUoBNQFGAbcBVgFbAWsB3gF7Af8Bfz4AAf8BfwGcAXMBGAFjAfcBXgEYAWMBGAFj + AfcBXgHWAVoB1gFaAdYBWgG1AVYBtQFWAZQBUgFzAU4BMQFGARABQgGtATUB7wE9ATkBZwH/AX9GAAH/ + AX8BewFvAfcBXgGUAVIBtQFWATkBZwG9AXcB/wF//wAHAAH/AX8BvQF3AXsBbwEYAWMB1gFaAZQBUgFz + AU4BUgFKATEBRgFSAUoBcwFOAbUBVgEYAWMBewFvAd4BewH/AX//AP8A/wD/AMQAAZwBcwFSAUoBrQE1 + Ae8BPQExAUYBlAFSAfcBXgE5AWcBewFvAb0BdwHeAXsB/wF/Af8Bf64AAXcBTgEOASEBcAEtAfMBPQF2 + AU4B3gF7qgABOQFnAa0BNQEzAUYBVQFKATMBRgESAUIB8AE9Ac8BOQGtATUBbAEtAWsBLQFKAikBJQFK + ASkBrQE1ARABQgGUAVIBOQFnAf8BfyIAAfoBXgG6AVYBGwFjAVwBawF9AW8BvgF3Ad4BewH/AX8B/wF/ + bgABnQFzAQ8BIQEWAUIB1AE5AZIBMQEvASUBdgFOqAABWgFrAc4BOQG3AVYBlgFSAVUBSgFUAUoBNAFG + ATQBRgEzAUYBMwFGARIBQgESAUIBEgFCAfEBPQHwAT0BzwE5Aa4BNQGMATEBKgElAa0BNQH/AX8gAAF4 + AU4BGAFCAZwBUgGbAVIBegFOATgBRgEXAUIBFwFCAVgBSgG5AVYB+gFeATsBZwF8AW8BvQF3Ad4BewH/ + AX8B/wF/XgABlwFSARYBQgE4AUYB9QE9AdQBOQGTATEBDgEhAf8Bfw4AAf8BfwH/AX+SAAHeAXsBzgE5 + AZcBUgG4AVYBdgFOAVUBSgFUAUoBNAFGATQBRgEzAUYBEwFCARIBQgESAUIBEQFCAfEBPQHxAT0B8AE9 + AfABPQHPATkBzwE5ASoBJQEYAWMgAAGYAVIBeQFOAVoBSgFfAWsBPwFnAT8BZwE/AWcBHwFjAf4BXgHd + AVoBuwFWAXoBTgFZAUoBNwFGAfUBPQH0AT0BNQFGAZgBUgH5AV4BOgFnAXwBbwG9AXcB3gF7Af8BfwH/ + AX9OAAHTATkBmgFSATcBRgHUATkBswE1AbMBNQEvASUBGgFjDAAB3gF7AXABLQEOASEBWwFrAf8Bf44A + AToBZwESAUIBuAFWAbgBVgFVAUoBVQFKAVUBSgESAUIB8AE9AREBQgEzAUYBEQFCAfEBPQERAUIB8QE9 + AfEBPQHwAT0B8AE9Ac8BOQHPATkBjQExAc4BOSAAAZkBUgFdAWsBegFOAbwBVgFfAWsBPwFnAT8BZwE/ + AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwE/AWcBPwFnAR8BYwH+AV4B3AFaAZsBUgF5AU4BNwFGARUBQgHz + AT0B0gE5ARMBQgF2AU4B1wFaARkBYwFbAWsBnAFzAd4BewH/AX8B/wF/LAAB/wF/AZ0BcwH/AX8KAAH/ + AX8BDwEhAf0BXgF5AU4BVwFKATcBRgGzATUBcQEtAZEBMQH/AX8IAAF8AW8BDgEhARcBQgHVATkB7gEc + AVUBSgH/AX9MAAFcAWcBEgEZAdEBFAHRARQB0QEUAdEBFAHQARQB0AEUAdABFAHQARQBsAEUAbABFAGv + ARQBrwEUAa8BFAGvARQB8AEcAXwBbxwAAbYBVgF1AU4B2AFaAbgCVgFKAVUBSgFVAUoB0AE5AdsBWgGX + AVIBEQFCAc8BOQF2AU4BVAFKAfABPQGuATUBMwFGATIBRgHvAT0BzwE5Ac8BOQEIASEB/wF/HgABmQFS + AV0BawG/AXcBGAFCAT4BZwFfAWsBXwFrAV8BawFfAWsBXwFrAV8BawE/AWcBPwFnAT8BZwE/AWcBPwFn + AT8BZwE/AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwEfAWMB/gFeAbwBVgGaAVIBWAFKATYBRgETAUIB0QE5 + AbABNQHRATkBUwFKAbYBVgH4AV4BWgFrAZwBcwG9AXcB3gF7Af8BfwH/AX8YAAHeAXsBkgExAS8BJQHz + AT0BvQF3CAAB3gF7AQ8BIQE/AWcB+wFeAfsBXgH7AV4BNgFGAZMBMQEPASEBfAFvAf8BfwIAAf8BfwEa + AWMB7QEcAXoBTgFfAWsB1QE5AfUBPQEwASUBsgE1TAAB0QEMAbYBHQHYAR0BuAEVAbgBEQGYAQkBmAEF + AZgBBQGYAQUBmAEFAZkBAQGZAQEBmQEBAbkBAQG6AQEBugEBATYBAQERASEcAAFTAUoBlwFSAdgBWgG4 + AlYBSgFVAUoBNAFGATQBRgGfAXMBXwFrAc8BOQETAUIBfwFvAT4BZwHPATkBEwFCAV8BawEdAWMBzgE5 + Ac8BOQHPATkBCAEhAb0Bdx4AAZkBUgFdAWsB3wF7AT0BZwE5AUYBfwFvAX8BbwF/AW8BfwFvAV8BawFf + AWsBXwFrAV8BawFfAWsBXwFrAV8BawFfAWsBXwFrAT8BZwE/AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwE/ + AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwEfAWMB/QFeAbsBVgF5AU4BVwFKARQBQgHyAT0BrwE1Aa4BNQGv + ATUBlAFSFgABvQF3AVABKQH1AT0BFgFCAZIBMQEwASUBdwFOAd4BewIAAd4BewG3AVYBcQEtAR4BYwH7 + AV4B+wFeAfsBXgHaAVoBkgExAXEBLQEOASEBcQEtAVUBSgE1AUYBLwElAdwBWgE/AWcBPwFnAbMBNQHU + ATkB1QE5AQ8BIQH/AX9KAAGQAQQBWgEuAXsBKgFbASIBOwEaARsBEgEbAQ4BGwEKARwBBgEcAQYBHAEC + AR0BAgEdAQIBPQECAT4BAgFeAQIB2gEBAa8BFBoAAf8BfwERAUIBuAFWAdkBWgG4AVYBdgFOAVUBSgFV + AUoBbAEtATIBRgETAUIB8AE9AW0BLQG3AVYBuQFWAa4BNQGvATUBfgFvAV8BawGuATUBzwE5Ac8BOQEp + ASUBewFvHgABmQFSAV0BawHfAXsB3wF7AZsBUgGbAVIBnwFzAZ8BcwF/AW8BfwFvAX8BbwF/AW8BfwFv + AX8BbwF/AW8BfwFvAV8BawFfAWsBXwFrAV8BawFfAWsBXwFrAV8BawFfAWsBXwFrAT8BZwE/AWcBPwFn + AT8BZwE/AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwE/AWcBVwFKAa4BNQERAUIUAAHe + AXsBUAEpAVcBSgH8AV4B1AE5AdQBOQHUATkBcgEtAVABKQHTATkBLwElAZIBMQGaAVIB/QFeAfsBXgH7 + AV4B+wFeAfsBXgH1AT0B1AE5ARYBQgH1AT0BtAE1AdQBOQH+AV4BHgFjAf4BXgHbAVoBugFWAfUBPQG0 + ATUB7gEcAf8Bf0oAAZABBAE6AS4BWwEuATsBIgIaAfoBEQH6AQ0B+wEJAfsBCQH7AQUB/AEFAfwBAQEc + AQIBHQECAR0BAgE+AQIBugEBAbABFBoAAf8BfwERAUIB2QFaAdkBWgG4AVYBdgFOAXYBTgF1AU4BEgFC + ARIBQgEyAUYBNAFGARIBQgHPATkBzwE5ARIBQgGvATUBawEtAWsBLQHPATkB0AE5Ac8BOQFLASkBGAFj + HgABmQFSAV0BawHfAXsBvwF3Ab8BdwE5AUYBHQFjAb8BdwGfAXMBnwFzAZ8BcwGfAXMBnwFzAZ8BcwF/ + AW8BfwFvAX8BbwF/AW8BfwFvAX8BbwF/AW8BfwFvAX8BbwFfAWsBXwFrAV8BawFfAWsBXwFrAV8BawFf + AWsBXwFrAV8BawE/AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwG6AVYB0AE5AZgBUgERAUIUAAHZAVoB9AE9 + AV0BawEcAWMBtAE1AbMBNQHUATkB1AE5AdQBOQE3AUYBmgFSAdwBWgHdAVoB/AFeAfsBXgH7AV4B+wFe + AfsBXgGZAVIBswE1AdUBOQH2AT0BFwFCAZsBUgH9AV4B/QFeAdsBWgHaAVoBugFWAdsBWgE3AUYBDwEh + Af8Bf0QAAb4BdwF2AU4B8wE9AZEBBAFaATIBWwEuAToBJgEaAR4B+gEVAfoBDQH6AQkB+wEJAfsBBQH7 + AQUB/AEFAfwBAQEcAQIBHQECAT0BBgG6AQEB0AEUGgAB3gF7ARIBQgH6AV4B2QFaAbgBVgF2AU4BdgFO + AfEBPQF2AU4BuQFWAVUBSgESAUIB0AE5AXUBTgFUAUoBEQFCAa4BNQESAUIBMgFGAfABPQHwAT0B8AE9 + AWwBLQG1AVYeAAGaAVIBXQFrAd8BewG/AXcBvwF3AV8BawEZAUIBfgFvAb8BdwG/AXcBvwF3AZ8BcwGf + AXMBnwFzAZ8BcwGfAXMBnwFzAZ8BcwGfAXMBnwFzAZ8BcwF/AW8BfwFvAX8BbwF/AW8BfwFvAX8BbwF/ + AW8BfwFvAX8BbwFfAWsBXwFrAV8BawFfAWsBXwFrAV8BawFfAWsBHQFjAa8BNQH+AV4BugFWAREBQhIA + Af8BfwGRATEBGwFjAV0BawEcAWMBPAFnAXgBTgGzATUBtAE1AdQBOQG7AVYBuwFWAdwBWgH9AV4B/AFe + AfsBXgH7AV4B+wFeAfsBXgEbAWMB1AE5AbMBNQHVATkB9gE9AZsBUgHcAVoB2wFaAdsBWgHaAVoB2wFa + AdsBWgH1AT0BFAFCRAABnQFzAZIBMQFxAS0BsgE1AbEBBAFZATIBegEyAToBJgEaAR4B+gEVAfoBDQHa + AQ0B+gEJAfsBCQH7AQUB+wEFAfwBBQEcAQYBHAEGAT0BBgG5AQUB0AEUGgABvQF3ATMBRgH6AV4B+QFe + AbgBVgF2AU4BdgFOAY4BMQFfAWsBfwFvAdsBWgHPATkBdwFOAV8BawEdAWMB8AE9AdEBOQFfAWsBHQFj + ATIBRgHwAT0B0AE5AY0CMQFGHgABmgFSAV0BawHfAXsBvwF3Ab8BdwGfAXMBHQFjATkBRgG/AXcB3wF7 + Ab8BdwG/AXcBvwF3Ab8BdwG/AXcBvwF3Ab8BdwG/AXcBvwF3AZ8BcwGfAXMBnwFzAZ8BcwGfAXMBnwFz + AZ8BcwGfAXMBnwFzAX8BbwF/AW8BfwFvAX8BbwF/AW8BfwFvAX8BbwF/AW8BXgFrAbABNQG7AVYBPwFn + AboBVgERAUISAAGdAXMBcQEtAZ4BcwEcAWMBHAFjARwBYwE8AWcBHAFjAVcBSgG0ATUB3AFaAdwBWgH8 + AV4BHAFjARsBYwH7AV4B+wFeAfsBXgH7AV4B+wFeARwBYwHbAVoBeQFOATcBRgG7AVYB2wFaAdsBWgHb + AVoB2wFaAdsBWgHbAVoBDwEhAZ0Bc0QAAZgBUgH1AT0BswE1AfQBPQGyAQQBWQE2AXoBNgFaASoBOgEi + AhoB+gEVAdoBDQHaAQ0B2gEJAfoBCQH7AQkB+wEFAfwBBQEcAQYBPQEKAbkBBQHRARQaAAGcAXMBVAFK + AfoBXgH6AV4BuAFWAXcBTgF2AU4BsAE1AREBQgF1AU4BMwFGAfABPQHwAT0B+gFeAfsBXgHPATkBjQEx + AZ8BcwF/AW8BNAFGAfABPQHwAT0BrgE1Aa0BNR4AAZoBUgFdAWsB/wF/Ab8BdwG/AXcBnwFzAZ8BcwG8 + AVYBegFOAf8BfwHfAXsB3wF7Ad8BewHfAXsB3wF7Ad8BewG/AXcBvwF3Ab8BdwG/AXcBvwF3Ab8BdwG/ + AXcBvwF3Ab8BdwG/AXcBnwFzAZ8BcwGfAXMBnwFzAZ8BcwGfAXMBnwFzAZ8BcwGfAXMBfwFvAdEBOQGZ + AVIBPwFnAV8BawG6AVYBEgFCEgAB3gF7AVEBKQH7AV4BPAFnARwBYwEcAWMBHAFjARwBYwE8AWcB+wFe + ARwBYwEcAWMBHAFjARwBYwEbAWMBGwFjARsBYwH7AV4B+wFeAfsBXgH7AV4B+wFeAfsBXgH7AV4B+wFe + AfsBXgHbAVoB2wFaAdsBWgHbAVoB9QE9ARQBQgH/AX9EAAH7AV4BeQFOARYBQgEVAUIB0gEEAXoBOgF6 + AToBWgEuAToBKgEaASIB+QEZAfkBEQHaAQ0B2gENAfoBCQH6AQkB+wEJAfsBCQEcAQoBHAEKAbkBCQHx + ARQaAAF7AW8BdQFOARsBYwH6AV4BuAFWAXcBTgF2AU4BVgFKARIBQgESAUIBMwFGAVUBSgHxAT0BrwE1 + Aa8BNQESAUIB0AE5AUsBKQFsAS0BrgE1AfABPQHwAT0BzwE5AWsBLR4AAZoBUgFdAWsB/wF/Ad8BewG/ + AXcBnwFzAZ8BcwGfAXMBewFOAdwBWgH/AX8B/wF/Af8BfwH/AX8B3wF7Ad8BewHfAXsB3wF7Ad8BewHf + AXsB3wF7Ad8BewHfAXsB3wF7Ab8BdwG/AXcBvwF3Ab8BdwG/AXcBvwF3Ab8BdwG/AXcBvwF3Ab8BdwGf + AXMB8wE9AXgBTgE/AWcBPwFnAV8BawHaAVoBEgFCFAAB+QFeAbMBNQFdAWsBPAFnATwBZwEcAWMBHAFj + ARwBYwEcAWMBHAFjARwBYwEcAWMBHAFjATwBZwE8AWcBPAFnAVwBawFcAWsBXAFrATwBZwEcAWMB+wFe + AfsBXgH7AV4B+wFeAdsBWgHbAVoB2wFaAfsBXgGSATEBsgE1Af8Bf0QAAb4BdwG8AVYBWAFKATYBRgHT + AQQBegE+AZoBPgF6ATYBWgEuAToBJgEZAR4B+QEZAfkBEQHaAQ0B2gENAfoBDQH6AQkB+wEJARsBCgEc + AQ4BuQEJAfIBFBoAAVoBawF2AU4BGwFjAfoBXgG4AVYBdwFOAXcBTgGvATUBuQFWAZcBUgEzAUYBEgFC + AfABPQFUAUoBUwFKAREBQgGuATUBEgFCARIBQgERAUIB8AE9AfABPQHQATkBKQElAf8BfxwAAZoBUgFe + AWsB/wF/Ad8BewG/AXcBvwF3AZ8BcwF/AW8BfwFvAToBRgE9AWcB/wF/Af8BfwH/AX8B/wF/Af8BfwH/ + AX8B/wF/Af8BfwH/AX8B/wF/Ad8BewHfAXsB3wF7Ad8BewHfAXsB3wF7Ad8BewHfAXsB3wF7Ad8BewG/ + AXcBvwF3Ad8BewEUAUIBWAFKAT8BZwE/AWcBXwFrAX8BbwHaAVoBMgFGFAAB/wF/AdMBOQGYAVIBXAFr + ATwBZwE8AWcBPAFnATwBZwE8AWcBHAFjARwBYwE8AWcBPAFnARwBYwEcAWMBHAFjARwBYwEcAWMBHAFj + ARwBYwFcAWsBXQFrATwBZwH7AV4B+wFeAfsBXgHbAVoB2wFaAboBVgHUATkBUAEpAZcBUgH/AX8B/wF/ + Af8Bfz4AAb4BdwHRARgB2QFaAXcBTgHTAQQBmgFCAZsBQgF6AToBWgEyAToBKgE6ASYBGQEeAfkBGQH6 + ARUB+gERAfoBEQH6AQ0B+wENARsBDgEcAQ4BuQENAfIBFBoAAToBZwGXAVIBGwFjARoBYwG4AVYBdwFO + AXcBTgHQATkBnwFzAV8BawGXAVIBrwE1AdoBWgFfAWsBHQFjARIBQgGuATUBXwFrAT4BZwGXAVIB7wE9 + AfABPQHwAT0BCAEhAf8BfxwAAZoBUgFeAWsB/wF/Ad8BewHfAXsBvwF3AZ8BcwGfAXMBfwFvAV8BawEZ + AUIBfQFvAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/ + AX8B/wF/Af8BfwH/AX8B3wF7Ad8BewHfAXsB3wF7ATUBRgFXAUoBXwFrAV8BawFfAWsBfwFvAX8BbwH6 + AV4BMwFGFgABnQFzAXEBLQE8AWcBPAFnATwBZwE8AWcBPAFnATwBZwEcAWMBHAFjARwBYwEcAWMBHAFj + ARwBYwEcAWMBHAFjARwBYwEbAWMBGwFjAfsBXgEbAWMBPAFnAV0BawH7AV4B+wFeAfsBXgH7AV4BeAFO + AbQBNQHUATkBDwEhAQ4BIQEOASEBLgElAVABKQGSATEBvQF3OAABmAFSAXMBLQQAAdMBBAG6AUYBuwFK + AZoBQgF6AToBWgEyAToBLgE6ASYBGgEiARoBHgUaARYBGwEWARsBFgE8ARoB2QERAfIBFBoAARkBYwG4 + AVYBGwFjARsBYwG5AVYBlwFSAZcBUgFsAS0BlQFSAZcBUgESAUIB0AE5AVQBSgE8AWcBPQFnAfEBPQFM + ASkBvwF3AZ8BcwEdAWMBzgE5AfABPQHwAT0BCAEhAd4BexwAAZsBUgFeAWsB/wF/Af8BfwHfAXsBvwF3 + Ab8BdwGfAXMBnwFzAX8BbwE/AWcBGQFCAZ4BcwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BNQFGAVgBSgF/AW8BfwFv + AX8BbwF/AW8BfwFvAZ8BcwH6AV4BMwFGFAAB/wF/Af8BfwEVAUIBFQFCAV0BawE8AWcBPAFnATwBZwEb + AWMBHAFjATwBZwE8AWcBPAFnARwBYwEcAWMBHAFjARwBYwEcAWMBHAFjARsBYwEbAWMB+wFeAfsBXgEc + AWMBXQFrARwBYwH7AV4B+wFeAboBVgGzATUBtAE1AVgBSgG7AVYBuwFWAbsBVgHcAVoB1AE5AXcBTjYA + Af8BfwHQARgB+gFeBAABFAENAVkBPgGaAUIBeQE6AVkBNgE5ATIBGQEqARgBJgH4ASEB+AEdAdgBHQH4 + ARkB+QEZAfkBGQH5ARkB+QEZAZcBFQFUASEaAAH5AV4BuQFWARsBYwEbAWMBuQFWAZcBUgGXAVIBdwFO + ATQBRgEzAUYBVAFKAXYBTgHRATkBrwE1Aa8BNQESAUIB8QE9AUsBKQFrAS0BjQExAfEBPQHwAT0B8QE9 + ASkBJQHeAXscAAGbAVIBfgFvAf8BfwH/AX8B3wF7Ad8BewG/AXcBvwF3AZ8BcwGfAXMBnwFzAT4BZwEZ + AUIBvgF3Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/ + AX8B/wF/Af8BfwH/AX8BNQFGAZgBUgGfAXMBfwFvAX8BbwGfAXMBnwFzAZ8BcwG/AXcBGwFjATMBRgwA + Af8BfwFbAWsB2QFaAXcBTgHTATkBkgExAZIBMQE2AUYBXQFrATwBZwE8AWcB+wFeARwBYwE8AWcBPAFn + ATwBZwE8AWcBPAFnATwBZwEcAWMBHAFjARwBYwEcAWMBHAFjARwBYwEbAWMBGwFjAfsBXgEbAWMBXQFr + ARsBYwH7AV4B+wFeAXgBTgGSATEBeQFOAZsBUgG8AVYB3QFaAR8BYwH1AT0BUAEpAf8BfzQAAb0BdwEN + AQAB3gF7BAABXAFnATQBEQEUAQ0BEwENARQBDQEUAQ0BFAENARQBDQEUAQ0BEwENARMBDQETAQ0BEwEN + AfMBDAHzAQwB8gEMARMBEQF8AWsaAAHYAVoB2gFaATsBZwEbAWMBuQFWAZgBUgGXAVIBdwFOAXcBTgFV + AUoBEgFCAfABPQHwAT0BEQFCAREBQgERAUIBEQFCARIBQgESAUIBEgFCAfEBPQHxAT0B8QE9ASoBJQG9 + AXccAAGbAVIBfgFvAf8BfwH/AX8B/wF/Ad8BewHfAXsBvwF3Ab8BdwGfAXMBnwFzAZ8BcwE+AWcBGQFC + AZ4BcwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Ad4BewH1AT0BugFWAb8BdwGfAXMBnwFzAZ8BcwGfAXMBvwF3Ab8BdwHfAXsBGwFjATMBRgwAAfoBXgHU + ATkBFgFCATcBRgE3AUYB9gE9AbMBNQGZAVIBXQFrAVwBawEcAWMBHAFjATwBZwE8AWcBPAFnATwBZwE8 + AWcBPAFnATwBZwE8AWcBPAFnATwBZwEcAWMBHAFjARwBYwEcAWMBGwFjARsBYwH7AV4BHAFjAV0BawH7 + AV4B+wFeAfsBXgEWAUIBeQFOAZoBUgG7AVYB2wFaAdsBWgHUATkBLwElAZ0BczQAAXgBTgFzAS1EAAG4 + AVYB+gFeATwBZwE7AWcBuQFWAZgBUgGXAVIBdgFOAdABOQGWAVIBOwFnAZ8BcwGfAXMBnwFzAV8BawEe + AWMBugFWAXUBTgEyAUYBEQFCAREBQgHxAT0B8QE9AUoBKQGcAXMcAAGbAVIBfgFvAf8BfwH/AX8B/wF/ + Af8BfwHfAXsB3wF7Ab8BdwG/AXcBvwF3AZ8BcwGfAXMBPgFnARkBQgF+AW8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BfQFvAdUBOQEbAWMB3wF7Ab8BdwG/AXcBvwF3 + Ab8BdwG/AXcB3wF7Ad8BewH/AX8BOwFnATQBRgoAAf8BfwHTATkBuwFWAdwBWgF6AU4BWAFKARYBQgHV + ATkBXQFrAV0BawE8AWcB+wFeAVwBawFcAWsBPAFnATwBZwE8AWcBPAFnAVwBawEcAWMB2gFaAboBVgG6 + AVYB2wFaAfwBXgEcAWMBHAFjARwBYwEbAWMBGwFjAfsBXgE8AWcBPAFnAfsBXgH7AV4B+wFeAfsBXgHb + AVoB2wFaAdsBWgG6AVYBswE1AXEBLQHYAVoyAAH/AX8BrwEUARoBY0IAAf8BfwF2AU4BGwFjATwBZwE7 + AWcBuQFWAZgBUgGYAVIBVQFKAfABPQE8AWcB/wF/Af8BfwHfAXsBnwFzAX8BbwFfAWsB/QFeAbkBVgFU + AUoBEQFCARIBQgHxAT0B8QE9AUoBKQF7AW8cAAGcAVIBfgFvAf8BfwH/AX8B/wF/Af8BfwH/AX8B3wF7 + Ad8BewHfAXsBvwF3Ab8BdwG/AXcBvwF3AX8BbwE6AUYBHQFjAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8B/wF/Af8BfwHaAVoB9gE9AZ4BcwH/AX8B3wF7Ad8BewHfAXsB3wF7Ad8BewHfAXsB3wF7 + Af8BfwH/AX8BWwFrATQBRgoAAZ0BcwG0ATUBPwFnAfwBXgHbAVoB2gFaAdoBWgH7AV4BfQFvAV0BawH7 + AV4BHAFjAV0BawFcAWsBXAFrAVwBawFcAWsBXQFrAZkBUgEXAUIB+wFeAX0BbwGdAXMBfQFvAfwBXgHc + AVoBHAFjARwBYwEcAWMBGwFjARsBYwH7AV4BXAFrAfsBXgH7AV4B+wFeAdsBWgHbAVoB2wFaAdsBWgH7 + AV4B9QE9AXEBLQEaAWMyAAGdAXMBDQEAAd8Be0IAAf8BfwF2AU4BGwFjATwBZwE8AWcBuQFWAZgBUgGY + AVIBmAFSAXcBTgHxAT0BrwE1AfABPQEyAUYBMwFGATMBRgEzAUYBEQFCAfEBPQERAUIBEgFCARIBQgER + AUIBEQFCAUsBKQF7AW8cAAGcAVIBfgFvAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwHfAXsB3wF7 + Ad8BewG/AXcB3wF7AT0BZwF6AUoBWQFKAZsBUgHfAXsB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BfQFv + ATgBRgH3AT0B3wF7Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BWwFr + ATQBRgoAAdkBWgF4AU4BfQFvAX0BbwF9AW8BfQFvAX0BbwF9AW8BXQFrAV0BawHbAVoBXQFrAV0BawFd + AWsBXQFrAVwBawFdAWsBdwFOAVcBSgHeAXsIAAH/AX8BngFzAdwBWgEcAWMBHAFjARwBYwEbAWMB+wFe + ATwBZwE8AWcB+wFeAfsBXgH7AV4B2wFaAdsBWgHbAVoB2wFaAZkBUgEwASUBvgF3MgABdwFOAXMBLUQA + Af8BfwF3AU4BPAFnATwBZwE8AWcBuQFWAZgBUgGYAVIBmAFSAZgBTgF3AU4BdwFOAXYBTgFWAUoBVQFK + AVUBSgE0AUYBNAFGATMBRgEzAUIBEgFCARIBQgERAUIBEQFCAWsBLQF7AW8cAAGcAVIBfwFvAf8BfwH/ + AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwG/AXcBuwFWAXkBUgFVAXsBlAF/AdcBYgEa + AUIB/AFeAb4BdwH/AX8B3wF7AV0BawFZAUoBFwFGARUBbwHXAV4BGQFCATwBZwH/AX8B/wF/Af8BfwH/ + AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8BXAFrATUBRgoAAbgBVgG5AVYBfQFvAX0BbwF9AW8BfQFv + AX0BbwF9AW8BfQFvAVwBawHbAVoBfQFvAV0BawFdAWsBXQFrAV0BawEbAWMBswE1Ad8Bew4AAX0BbwHb + AVoBHAFjARwBYwEbAWMBGwFjARsBYwE8AWcB+wFeAfsBXgH7AV4B+wFeAfsBXgH7AV4B/AFeATYBRgFx + AS0B/wF/BgABXAFnARIBGQHRARQB0QEUAdEBFAHRARQB0AEUAdABFAHQARQB0AEUAbABFAGwARQBrwEU + Aa8BFAGvARQBrwEUAfABHAF8AW8GAAH/AX8BrwEUARoBY0QAAd4BewGXAVIBPAFnAVwBawFcAWsBuQFW + AbkBUgF0AVIBUAFSAVABUgFQAVIBUAFSAXEBUgFxAVIBcQFWAXEBUgFxAVIBcQFSAVEBUgFRAVIBUQFO + ATEBSgESAT4BEQFCAWwBLQFaAWscAAGcAVIBfwFvAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/ + AX8B/wF/AV4BawFbAUoB+AFmAZUBfwGVAX8BlQF/AZUBfwF2AX8B1wFeATkBRgH5AT0BGAFCAXcBUgEW + AW8BtQF/AZUBfwGVAX8BdgF7AVgBTgFZAUoBvgF3Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/ + AX8BXAFrATUBRgoAAZgBUgG5AVYBfQFvAX0BbwF9AW8BfQFvAX0BbwF9AW8BfQFvATwBZwH7AV4BfQFv + AV0BawFdAWsBXQFrAX0BbwFXAUoB2QFaEAAB/wF/AZoBUgEcAWMBHAFjARwBYwEbAWMB+wFeATwBZwH7 + AV4B+wFeAfsBXgH7AV4B/AFeAVcBSgFQASkB0wE5AZ0BcwgAAdEBDAG2AR0B2AEdAbgBFQG4AREBmAEJ + AZgBBQGYAQUBmAEFAZgBBQGZAQEBmQEBAZkBAQG5AQEBugEBAboBAQE2AQEBEQEhBgABnQFzAQ0BAAHf + AXtEAAHeAXsBmAFSAV0BawFcAWsBXAFrAboBVgF1AVIB6AFNAQgBagEIAWYBKAFqASgBagFIAWoBSQFq + AWkBbgFpAW4BigFuAaoBcgGqAXIBywF2AesBdgELAXsBjgFiARIBPgFsAS0BWgFrHAABnQFSAX8BbwH/ + AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF7AbwBVgGaAVIBdwF7AbYBfwGWAX8BlgF/AZYBfwGW + AX8BlgF/AbYBfwG2AX8BlgF/AbYBfwG2AX8BtgF/AZYBfwGWAX8BlgF/AbYBfwG2AX8BFwFrARgBQgHb + AVoB/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/AVwBawE1AUYKAAF3AU4B+gFeAZ4BcwF9AW8BfQFv + AX0BbwF9AW8BfQFvAX0BbwE8AWcB+wFeAX0BbwF9AW8BXQFrAV0BawGeAXMBswE1ARoBYxAAAf8BfwGa + AVIBHAFjARwBYwEcAWMBHAFjARsBYwE8AWcBGwFjAfsBXgEcAWMBVwFKAXEBLQHTATkBfAFvAf8BfwoA + AZABBAFaAS4BewEqAVsBIgE7ARoBGwESARsBDgEbAQoBHAEGARwBBgEcAQIBHQECAR0BAgE9AQIBPgEC + AV4BAgHaAQEBrwEUBgABVwFKAZMBMUYAAd4BewGZAVIBXQFrAV0BawFcAWsBugFWAVIBTgHnAVkBBgF+ + AQYBfgEGAX4BBgF+AQYBfgEHAX4BJwF+AUcBfgFIAX4BaAF+AYkBfgGJAX4BqgF+AcsBfgHsAXYBEgFC + AWwBLQE5AWccAAGdAVIBfwFvAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/AV4BawFcAUoBGQFrAbcBfwG3 + AX8BtwF/AbcBfwG3AX8BtwF/AbcBfwG3AX8BtwF/AbcBfwG3AX8BtwF/AbcBfwG3AX8BtwF/AbcBfwG3 + AX8BtwF/AbcBfwG3AX8BtwF/AZgBWgEYAUIBXQFrAf8BfwH/AX8B/wF/Af8BfwH/AX8BXAFrATYBRgoA + AZcBUgE2AUYBGwFjAZ4BcwGeAXMBnQFzAX0BbwF9AW8BfQFvATwBZwH7AV4BfQFvAX0BbwF9AW8BfQFv + AZ4BcwFRASkBdwFOEAAB3wF7AVgBSgE8AWcBHAFjARwBYwEcAWMBHAFjATwBZwEbAWMB+wFeAfsBXgEP + ASEBtwFWAf8Bfw4AAZABBAE6AS4BWwEuATsBIgIaAfoBEQH6AQ0B+wEJAfsBCQH7AQUB/AEFAfwBAQEc + AQIBHQECAR0BAgE+AQIBugEBAbABFAQAAf8BfwGPARABGwFjRgABvgF3AbkBVgFdAWsBXQFrAV0BawG6 + AVYBMgFKAccBWQHlAX0BxQF9AcUBfQHlAX0B5gF9AeYBfQEGAX4BJwF+AScBfgFIAX4BaAF+AYkBfgGp + AX4BygF+AcwBcgESAUIBjAExATkBZxwAAZ0BUgF/AW8B/wF/Af8BfwH/AX8B/wF/Ad8BewG9AVYBmwFW + AZgBewG4AX8BuAF/AbgBfwG4AX8BuAF/AbgBfwG4AX8BuAF/AbgBfwG4AX8BuAF/AbgBfwG4AX8BuAF/ + AbgBfwG4AX8BuAF/AbgBfwG4AX8BuAF/AbgBfwG4AX8B2AF/AXgBdwE3AUYBeQFOAd8BewH/AX8B/wF/ + Af8BfwFcAWsBNgFGCgAB3wF7ATsBZwE1AUYB1AE5AVcBSgEbAWMBngFzAZ4BcwF9AW8BXQFrAdsBWgGd + AXMBfQFvAX0BbwF9AW8BngFzAZMBMQEwASUBnQFzDAAB/wF/AdoBWgGZAVIBPAFnARwBYwEcAWMBHAFj + ARwBYwEcAWMBGwFjAfsBXgH7AV4BcQEtAXABLQE6AWcB/wF/DAABkQEEAVoBMgFbAS4BOgEmARoBHgH6 + ARUB+gENAfoBCQH7AQkB+wEFAfsBBQH8AQUB/AEBARwBAgEdAQIBPQEGAboBAQHQARQB9AE9AZcBUgE7 + AWcBLQEEAf8Bf0YAAb4BdwG6AVYBfQFvAV0BawFdAWsBugFWATEBSgHHAVkBKQF+ASoBfgEqAX4BKgF+ + AQcBfgHFAX0B5QF9AQYBfgEHAX4BJwF+AUgBfgFoAX4BiQF+AaoBfgHMAW4BEwFCAYwBMQFaAWscAAGd + AVIBfwFvAf8BfwH/AX8B/wF/AV8BawFdAUoBOwFrAdkBfwG5AX8BuQF/AbkBfwG5AX8BuQF/AbkBfwG5 + AX8BuQF/AbkBfwG5AX8BuQF/AbkBfwG5AX8BuQF/AbkBfwG5AX8BuQF/AbkBfwG5AX8BuQF/AbkBfwG5 + AX8BuQF/AbkBfwG5AX8B2QF/AfgBZgH3AT0BGwFfAf8BfwH/AX8BXAFrAVYBSg4AAf8BfwHeAXsBOwFn + ATYBRgH1AT0BngFzAZ0BcwGdAXMBmgFSAZ0BcwF9AW8BfQFvAX0BbwGeAXMBVwFKAXEBLQFQASkBOwFn + Af8BfwYAAd4BewG5AVYBNwFGAVwBawE8AWcBPAFnARwBYwEcAWMBHAFjARwBYwEbAWMBGwFjAdoBWgGS + ATEBswE1AVEBKQGXAVIB/wF/CgABsQEEAVkBMgF6ATIBOgEmARoBHgH6ARUB+gENAdoBDQH6AQkB+wEJ + AfsBBQH7AQUB/AEFARwBBgEcAQYBPQEGAbkBBQHQARQB0wE5AXIBLQFxAS0BkwExSAABvgF3AboBVgF9 + AW8BfQFvAX0BbwHaAVoBEQFGASwBWgHyAX4B0gF+AdIBfgHSAX4B8gF+AdEBfgFLAX4B5gF9AQYBfgEn + AX4BJwF+AUgBfgFpAX4BiQF+AasBZgETAUIBjAExAVoBaxwAAZ0BUgF/AW8B/wF/Ad8BewG+AVYBWwFK + AZIBWgHaAX8BugF/AboBfwG6AX8BugF/AboBfwG6AX8BugF/AboBfwG6AX8BugF/AboBfwG6AX8BugF/ + AboBfwG6AX8BugF/AboBfwG6AX8BugF/AboBfwG6AX8BugF/AboBfwG6AX8BugF/AboBfwHaAX8B+gF/ + AS8BSgE5AUYBOAFGAZ4BcwF9AW8BVwFKFAAB/wF/ATYBRgEbAWMBngFzAZ4BcwHbAVoBPAFnAZ0BcwF9 + AW8BfQFvAX0BbwF9AW8BswE1AbQBNQFQASkBcQEtAVYBSgGYAVIBNgFGAZMBMQF4AU4BvwF3ATwBZwE8 + AWcBPAFnATwBZwEcAWMBHAFjARwBYwEbAWMBHAFjAboBVgFyAS0BtAE1AdQBOQFxAS0BGgFjCgABsgEE + AVkBNgF6ATYBWgEqAToBIgIaAfoBFQHaAQ0B2gENAdoBCQH6AQkB+wEJAfsBBQH8AQUBHAEGAT0BCgG5 + AQUB0QEUATYBRgH1AT0BswE1AfIBOUgAAb4BdwHbAVoBfgFvAX0BbwF9AW8B2wFaARABRgEMAVoB0wF+ + AdMBfgHTAX4B0wF+AdIBfgHSAX4B0gF+AdEBfgFLAX4BBgF+ASYBfgFHAX4BaAF+AYkBegGLAWYBEwFC + AYwBMQFaAWscAAGeAVIBnwFzAT8BZwFeAUoBegFOAXYBUgGSAVoB+wF/AdsBfwHbAX8B2wF/AdsBfwHb + AX8B2wF/AdsBfwHbAX8B2wF/AdsBfwHbAX8B2wF/AdsBfwHbAX8B2wF/AdsBfwHbAX8B2wF/AdsBfwHb + AX8B2wF/AdsBfwHbAX8B2wF/AdsBfwHbAX8B2wF/AdwBfwEvAUoB/AFeAbsBVgEXAUIBWAFKAVcBShQA + Af8BfwGYAVIBeAFOAb4BdwGeAXMBXQFrAboBVgGeAXMBnQFzAX0BbwF9AW8BnQFzATwBZwH2AT0BNwFG + ATgBRgE3AUYBWAFKAbsBVgF/AW8BnwFzAVwBawE8AWcBPAFnATwBZwE8AWcBPAFnARwBYwEcAWMBHAFj + ARsBYwEcAWMBugFWAdQBOQHUATkBswE1AXcBTgoAAdIBBAF6AToBegE6AVoBLgE6ASoBGgEiAfkBGQH5 + AREB2gENAdoBDQH6AQkB+gEJAfsBCQH7AQkBHAEKARwBCgG5AQkB8QEUAboBVgF5AU4BFgFCAa8BKQG9 + AXcKAAGZAWcBRgEaASUBFgElARYBJQEWASUBFgEFARYBBQEWAQUBFgEFARYBBQEWAQUBFgEFARYB5QEV + AeUBFQHlARUBBwEeAZsBbxgAAZ4BcwHbAVoBfgFvAX0BbwF9AW8B2wFaAfABQQENAVoB8wF+AfQBfgH0 + AX4B8wF+AfMBfgHTAX4B0gF+AdIBfgHSAX4B0QF+Aa0BfgGMAX4BiwF+AawBegFrAV4BEwFCAWwBLQF7 + AW8cAAG+AVYBfwFOAX0BTgGYAVIBmAFSAZYBUgGzAVoB/AF/AdwBfwHcAX8B3AF/AdwBfwHcAX8B3AF/ + AdwBfwHcAX8B3AF/AdwBfwHcAX8B3AF/AdwBfwHcAX8B3AF/AdwBfwHcAX8B3AF/AdwBfwHcAX8B3AF/ + AdwBfwHcAX8B3AF/AdwBfwHcAX8B3AF/AfwBfwFQAUoB/AFeAfwBXgH8AV4BWAFKAXgBThIAAf8BfwHZ + AVoBFgFCAfwBXgG+AXcBngFzAb4BdwG6AVYBPAFnAZ4BcwF9AW8BfQFvAX0BbwF9AW8BfQFvAdoBWgG6 + AVYB3AFaAR4BYwFfAWsBXgFrAVwBawE8AWcBPAFnATwBZwE8AWcBPAFnARwBYwH7AV4BHAFjARwBYwEb + AWMBHAFjARwBYwEcAWMBVwFKAbQBNQHUATkKAAHTAQQBegE+AZoBPgF6ATYBWgEuAToBJgEZAR4B+QEZ + AfkBEQHaAQ0B2gENAfoBDQH6AQkB+wEJARsBCgEcAQ4BuQEJAfIBFAEeAWMBvAFWAVgBSgGzAUYB5QEV + Af8BfwgAASMBDgHJAS4BCgEzAegBLgHnAS4B5gEqAeYBKgHmASoB5gEuAQYBLwEGAS8BBgEvAQYBLwEH + ATMBJwEzASgBMwGlASIBKAEiGAABngFzAfsBXgF+AW8BfQFvAX0BbwHbAVoBzwE9AS0BWgH0AX4B9AF+ + AfQBfgH0AX4B9AF+AfMBfgHzAX4B0gF+AdEBfgHRAX4B0AF+AdABfgHwAX4BzgF6AWsBWgE0AUIBbAEt + AXsBbxwAAf0BXgFcAUoBlwFSAZgBUgGZAVIBlwFSAbQBWgH9AX8B3QF/Ad0BfwHdAX8B3QF/Ad0BfwHd + AX8B3QF/Ad0BfwHdAX8B3QF/Ad0BfwHdAX8B3QF/Ad0BfwHdAX8B3QF/Ad0BfwHdAX8B3QF/Ad0BfwHd + AX8B3QF/Ad0BfwHdAX8B3QF/Ad0BfwHdAX8B/QF/AVEBSgH8AV4B/AFeAboBVgEVAUIB3gF7EAAB/wF/ + AZgBUgFXAUoBXgFrAV0BawG+AXcBngFzAZ4BcwF9AW8BmgFSAX0BbwGeAXMBfQFvAX0BbwF9AW8BfQFv + AX0BbwF9AW8BfQFvAX0BbwFdAWsBXQFrAVwBawFcAWsBPAFnATwBZwE8AWcBPAFnAfsBXgEcAWMBHAFj + ARwBYwEcAWMBGwFjAfsBXgH7AV4BHAFjAXgBTgHTATkB/wF/CAAB0wEEAZoBQgGbAUIBegE6AVoBMgE6 + ASoBOgEmARkBHgH5ARkB+gEVAfoBEQH6AREB+gENAfsBDQEbAQ4BHAEOAbkBDQHyARQBHAFjATwBZwHe + AXsB/wF/AWsBLgGNATYB/wF/BgABAQEGAS4BQwFuAUcBTAFDAUoBPwFJATsBSAE7AUkBPwFIATsBaQE/ + AWgBPwFoAT8BiQE/AYkBQwGpAUMBygFHAUgBNwHlARUYAAGeAXMB/AFeAZ4BcwF+AW8BfgFvAdsBWgHP + AT0BLgFaAfUBfgEVAX8BFQF/ARUBfwH1AX4B9AF+AfMBfgHSAX4B0gF+AdEBfgHQAX4B0AF+AfABfgHO + AXoBSwFWATQBRgFsAS0BnAFzHAAB/wF/AdwCWgFKAZgBUgGZAVIBlwFSAbUBWgH+AX8B/gF/Af4BfwH+ + AX8B/gF/Af4BfwH+AX8B/gF/Af4BfwH+AX8B/gF/Af4BfwH+AX8B/gF/Af4BfwH+AX8B/gF/Af4BfwH+ + AX8B/gF/Af4BfwH+AX8B/gF/Af4BfwH+AX8B/gF/Af4BfwH+AX8B/gF/AVIBSgH9AV4B2wFaARUBQgG+ + AXcSAAG+AXcBFgFCAb8BdwGeAXMBvgF3Ab4BdwGeAXMBngFzAb4BdwE8AWcBmgFSAX0BbwGeAXMBfQFv + AX0BbwF9AW8BfQFvAX0BbwF9AW8BXQFrAV0BawFdAWsBXQFrAVwBawE8AWcBPAFnATwBZwH7AV4BGwFj + ATwBZwEcAWMBHAFjARwBYwEbAWMBGwFjAfsBXgEcAWMBkgExAVsBawoAAdMBBAG6AUYBuwFKAZoBQgF6 + AToBWgEyAToBLgE6ASYBGgEiARoBHgUaARYBGwEWARsBFgE8ARoB2QERAfIBFAgAAd4BewHkAREBNQFX + BgABAQEGAS0BQwFOAUcBTAE/ASoBOwEpATsBKAE7AUgBOwFIATsBSAE7AUgBOwFoATsBaAE/AYkBPwGJ + AT8BqgFDASgBMwEFARYYAAGeAXMB/AFeAZ4BcwF+AW8BfgFvAdwBWgGuATUBLwFeARUBfwEWAX8BNwF/ + ARYBfwEVAX8B9AF+AfQBfgHzAX4B0gF+AdEBfgHRAX4B0AF+AfABfgGuAXYBKwFWATQBRgFrAS0BvQF3 + HgAB/wF/Af0BXgFbAUoBuQFWAZcBUgHVAVoB/wF/Af4BfwH+AX8B/gF/Af4BfwH+AX8B/gF/Af4BfwH+ + AX8B/gF/Af4BfwH+AX8B/gF/Af4BfwH+AX8B/gF/Af4BfwH+AX8B/gF/Af4BfwH+AX8B/gF/Af4BfwH+ + AX8B/gF/Af4BfwH+AX8B/gF/Af8BfwFSAUoB2wFaARUBQgG+AXcUAAF9AW8BeAFOAd8BewG+AXcBvgF3 + Ab4BdwG+AXcBngFzAZ4BcwG+AXcBPAFnAXkBTgFdAWsBngFzAZ0BcwF9AW8BfQFvAX0BbwF9AW8BfQFv + AV0BawFdAWsBXQFrAVwBawFdAWsBPAFnAfsBXgH7AV4BPAFnATwBZwE8AWcBPAFnARwBYwEcAWMBHAFj + ARwBYwGZAVIBsgE1Af8BfwoAARQBDQFZAT4BmgFCAXkBOgFZATYBOQEyARkBKgEYASYB+AEhAfgBHQHY + AR0B+AEZAfkBGQH5ARkB+QEZAfkBGQGXARUBVAEhCgABvAFzAaEBBQGbAW8BdwFfAYsBLgEhAQYBLgE/ + AU4BRwFMAT8BKgE7ASkBNwEoATcBKAE3ASgBOwFIATsBSAE7AUgBOwFoATsBaAE/AYkBPwGKAUMBJwEz + AQUBFhgAAb4BdwH8AV4BngFzAZ4BcwGeAXMB3AFaAa0BNQEvAV4BFgF/ARYBfwE3AX8BNwF/ARYBfwH1 + AX4B9AF+AfMBfgHSAX4B0QF+AdEBfgHQAX4B8AF+Aa0BdgErAVIBNAFGAWsBLQHeAXsgAAH/AX8BPQFn + AVsBSgGXAVIB1gFaAf8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/Af8BfwH/AX8B/wF/ + Af8BfwH/AX8BcgFOARYBQgG9AXcWAAE8AWcB2gFaAd8BewG+AXcBvgF3Ab4BdwG+AXcBvgF3Ab4BdwG+ + AXcBvgF3AX0BbwGaAVIB2wFaAX0BbwGeAXMBnQFzAX0BbwF9AW8BfQFvAX0BbwF9AW8BXQFrAV0BawEc + AWMB2wFaAfsBXgE8AWcBPAFnATwBZwFXAUoBNgFGAXgBTgHaAVoBGwFjAT0BZwGzATUBWwFrDAABXAFn + ATQBEQEUAQ0BEwENARQBDQEUAQ0BFAENARQBDQEUAQ0BEwENARMBDQETAQ0BEwENAfMBDAHzAQwB8gEM + ARMBEQF8AWsMAAFXAV8BMwFPASABAgFEARIBIQEGAS4BQwFOAUcBLAE/ASsBOwEpATcBKAE3ASgBNwEo + ATcBKAE3AUgBOwFIATsBSAE7AWgBPwFpAT8BigFDAScBMwElARYYAAG+AXcBHQFjAZ4BcwGeAXMBngFz + AdwBWgGNATEBqgFRARYBfwE2AX8BNwF/ATYBfwEVAX8BFQF/AfQBfgHzAX4B0gF+AdEBfgHQAX4B0AF+ + Ac8BfgFrAWoBDAFOATQBRgFKASkB/wF/IgAB/wF/AX4BbwFaAUoB1QFaAd4BewG9AXcBvQF3Ab0BdwGc + AXMBnAFzAXsBbwF7AW8BegFvAVoBawFaAWsBOQFnATkBZwE5AWcBGAFjARgBYwEXAWMB9wFeAfcBXgHW + AVoB1gFaAdUBWgG1AVYBtQFWAbQBVgGUAVIBlAFSAZMBUgGUAVIBcwFOAb0BdxgAAb0BdwEXAUIBvgF3 + Ad8BewG+AXcBvgF3Ab4BdwHfAXsB3gF7Ab4BdwG+AXcBngFzAZ4BcwEcAWMBmQFSAboBVgEcAWMBXAFr + AV0BawFdAWsBXAFrATwBZwH7AV4BugFWAdsBWgE8AWcBXAFrAV0BawHaAVoBswE1AZcBUgEaAWMBmAFS + AfQBPQFxAS0BkgExAdMBOQH/AX8+AAEtATsBgQEKAYQBEgFBAQYBLgFDAU8BRwEtAT8BKwE7ASoBNwEp + ATcBKAEzASgBNwEoATcBKAE3AUgBOwFIATsBSAE7AWkBPwFqAUMBBwEzASUBFhgAAb4BdwEdAWMBngFz + AZ4BcwGeAXMB3AFaAZgBUgEHASEB5QEgAQUBJQEGASUBJgEpASYBLQFGATEBZwExAWcBNQGHATkBhwE9 + AacBPQHIAUEByAFFAeoBSQEyAUoBNAFGAWsBLQH/AX8mAAGdAnMBTgFTAUoBcwFOAXMBTgF0AU4BdAFO + AXQBTgF1AU4BlQFSAZYBUgGWAVIBlgFSAZcBUgG3AVYBuAFWAbgBVgHZAVoB2gFaAdoBWgHbAVoB+wFe + AfsBXgH8AV4B/AFeAfwBXgH8AV4B/QFeAR0BYwHbAVoBNgFGAb0BdwH/AX8aAAE8AWcBVwFKAd8BewH/ + AX8BvgF3ARsBYwGZAVIBFwFCAdoBWgG+AXcBvgF3AZ4BcwGeAXMBngFzAV0BawH7AV4BugFWAboBVgGa + AVIBugFWAdsBWgEcAWMBXAFrAV0BawFdAWsBXAFrAV0BawHUATkBOwFnAf8BfwQAAf8BfwH/AX8BvgF3 + Ad8Be0AAAXABSwEFASMBxgEaAUEBBgFPAUMBTwFHAU4BQwEsAT8BKwE7ASkBNwEoATMBKAEzASgBMwEo + ATcBKAE3AUgBOwFIATsBSQE/AWoBPwEHAS8BJQEWGAAB3gF7AR0BYwG+AXcBngFzAZ4BcwHbAVoB2wFa + AdsBWgG5AVYBuQFWAbkBVgG5AVIBmAFSAZgBUgGYAVIBlwFOAXcBTgF2AU4BdgFOAXYBSgFVAUoBVQFK + AVQBSgEzAUYBrQE1KgAB3gF7AZ0BUgGbAVIB2wFaAdsBWgHbAVoB3AFaAfwBXgH8AV4B/QFeAf0BXgEd + AWMBHgFjAR4BYwEeAWMBHwFjAT8BZwE/AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwE/ + AWcB3AFaATcBRgG+AXceAAH/AX8B2QFaAXkBTgF4AU4BFwFCAdoBWgF9AW8BvgF3AdoBWgE3AUYBGwFj + Ab4BdwGeAXMBngFzAZ4BcwGdAXMBngFzAZ0BcwF9AW8BfQFvAX0BbwF9AW8BXQFrAV0BawFcAWsBXAFr + ATwBZwG0ATUBfAFvTgAB2gFvAWgBMwHnASIBYQEGAVABRwFQAUsBTgFDAS0BPwEsATsBKgE7ASkBNwEo + ATMBKAEzASgBNwEoATcBKAE7AUgBOwFJAT8BaQE/AQcBLwFFARYYAAHfAXsBHQFjAb8BdwGeAXMBngFz + AdwBWgHbAVoB2wFaAdoBWgG6AVYBugFWAbkBVgGZAVIBmAFSAZgBUgGXAVIBdwFOAXYBTgF2AU4BVgFK + AVUBSgFVAUoBVAFKARIBQgFSAUosAAH/AX8B3AFaAXsBTgHbAVoB2wFaAdsBWgH8AV4B/AFeAfwBXgH9 + AV4B/QFeAR0BYwEeAWMBHgFjAR4BYwE/AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwE/ + AWcBvAFWAVcBSgHeAXsiAAH/AX8BXAFrAb0BdwH/AX8IAAG9AXcBFgFCAb4BdwGeAXMBngFzAZ4BcwGe + AXMBnQFzAZ0BcwGdAXMBnQFzAX0BbwF9AW8BXQFrAV0BawFcAWsBXAFrAVwBawGzATUBGwFjTgAB/wF/ + AbgBZwELATMBYQEGAVEBRwFRAUsBTwFHAS4BQwEtAT8BLAE7ASsBOwEqATcBKQE3ASgBNwEoATcBKAE3 + ASkBOwFJAT8BSgE/AQcBLwFFARYYAAH/AX8BHQFjAZ4BcwG+AXcBvgF3AfwBXgHbAVoB2wFaAdoBWgHa + AVoBuQFWAbkBVgG5AVYBuQFWAbgBVgGYAVIBlwFSAXYBTgF2AU4BdgFOAVUBSgFVAUoBVQFKAfABPQH2 + AV4uAAH/AX8BXQFrAVwBSgG7AVYB+wFeAfwBXgH8AV4B/AFeAf0BXgH9AV4BHQFjAR4BYwEeAWMBHgFj + AT8BZwE/AWcBPwFnAT8BZwE/AWcBPwFnAT8BZwE/AWcBXwFrAZsBUgF5AU4B3wF7NAAB/wF/ARcBQgG+ + AXcBngFzAZ4BcwGeAXMBngFzAX0BbwHaAVoBuQFWAXgBTgE3AUYBGwFjAX0BbwFdAWsBXAFrAV0BawFd + AWsB1AE5AdkBWlQAAWEBBgFSAU8BcwFTAVEBSwFQAUcBTgFDAS0BPwEsAT8BKwE7ASsBOwEqATsBKgE7 + ASoBOwFKAT8BSgE/AWsBRwEIATMBRQEWGgABfwFvAX4BbwG/AXcBvgF3ARwBYwHcAVoB2wFaAdsBWgF3 + AU4BuQFWAbkBVgHaAVoB2gFaAdkBWgG5AVYBlwFSAXYBTgETAUIBEgFCAXUBTgFVAUoBVQFKAa4BNQFa + AWsyAAG+AXcBfAFOAZsBUgH8AV4B/AFeAfwBXgH9AV4B/QFeAR0BYwEeAWMBHgFjAR4BYwEfAWMBPwFn + AT8BZwE/AWcBPwFnAT8BZwE/AWcBPwFnAVoBSgHaAVoB/wF/NgAB/wF/ARcBQgG+AXcBngFzAZ4BcwGe + AXMBvgF3AVcBSgG5AVYBOwFnAVwBawE8AWcB9QE9ATwBZwFdAWsBXQFrAVwBawF9AW8BFgFCAVcBSlQA + AYMBDgEMATMBLQE7AQwBNwELATMBCgEvAeoBLgHpAS4B6QEqAegBKgHoASoBCAEvAQgBLwEIAS8BCAEz + AQkBNwHFASIBiAEiGgABngFzAV4BawG/AXcBvwF3AT0BZwHcAVoB2wFaAdsBWgF3AU4BmAFSAdoBWgEb + AWMBGwFjARoBYwH6AV4BuAFWAXcBTgFVAUoBVQFKAXYBTgFVAUoBVQFKAYwBMQG9AXc0AAH/AX8B/QFe + AVwBSgHcAVoB/AFeAf0BXgH9AV4BHQFjAR4BYwEeAWMBHgFjAR8BYwE/AWcBPwFnAT8BZwE/AWcBPwFn + AR4BYwE5AUYBXAFrAf8BfzgAAf8BfwE3AUYBvgF3Ab4BdwGeAXMBngFzAfsBXgF4AU4B/wF/BgABXAFr + AfUBPQFdAWsBXQFrAV0BawEbAWMB1AE5AZgBUlQAAZkBZwGEARIBgwEOAYMBDgGDAQ4BgwEOAYMBDgGD + AQ4BgwEOAYMBDgFjAQ4BYwEOAWMBDgFjAQ4BYwEOAWMBDgFkARIBmgFrGgAB3wF7AR4BYwG/AXcBvwF3 + AX4BbwHcAVoB2wFaAdsBWgHbAVoBmQFSAXcBTgGXAVIBuAFWAbgBVgGXAVIBlwFSAXcBTgF3AU4BdgFO + AXYBTgFVAUoBNAFGAc4BOQH/AX82AAH/AX8BngFzAXwBTgGcAVIB/QFeAR0BYwH9AV4BHQFjAR4BYwEe + AWMBHgFjAR8BYwE/AWcBPwFnAT8BZwG8AVYBWQFKAb4BdzwAAf8BfwE4AUYB3wF7Ab4BdwG+AXcBngFz + ATcBRgG+AXcIAAH/AX8BGgFjARYBQgFcAWsBVwFKAdQBOQFbAWsB/wF/lAABfgFvAT4BZwG/AXcBvwF3 + AR0BYwHcAVoB2wFaAdsBWgHaAVoBugFWAboBVgG5AVYBmQFSAZgBUgGYAVIBlwFSAXcBTgF2AU4BdgFO + AXYBTgGuATUBOQFnPAAB/wF/AT0BZwFcAUoBvAFWAR0BYwEdAWMBHgFjAR4BYwEeAWMBPgFnAT8BZwH9 + AV4BWgFKARwBYwH/AX8+AAH/AX8BeQFOAXgBTgG6AVYBGwFjAZkBUgEbAWMMAAH/AX8BuQFWAdQBOQHZ + AVoB3wF7mAAB/wF/AT0BZwEdAWMBngFzAb8BdwEdAWMB2wFaAdsBWgHaAVoBugFWAboBVgG5AVYBuQFW + AZgBUgGYAVIBmAFSAZcBUgF3AU4BVQFKAc8BOQFSAUoB/wF/QAAB3gF7AR0BYwFbAUoBnAFSAd0BWgEe + AWMB/gFeAb0BVgFbAUoBuwFWAb4Bd0QAAf8BfwG+AXcBXAFrAdoBWgGZAVIB/wF/DgAB/wF/Ad4Be54A + Af8BfwGeAXMB/AFeAfsBXgEcAWMBGwFjAdsBWgHbAVoB2gFaAboBVgG5AVYBmQFSAZcBUgF2AU4BMwFG + AfEBPQGuATUB7wE9ATkBZwH/AX9GAAH/AX8BfQFvAfwBXgF7AU4BmwFSARwBYwG+AXcB/wF//wAHAAH/ + AX8BvgF3AXwBbwEbAWMB2QFaAZcBUgF1AU4BVAFKATMBRgFTAUoBdAFOAbUBVgEYAWMBewFvAd4BewH/ + AX//AP8AAgABQgFNAT4HAAE+AwABKAMAAcADAAFgAwABAQEAAQEGAAEJFgAD/wEAEv8GAAL/AcACAAED + Av8BAAEHCP8GAAH/AeADAAEBAf8B/gIAAT8B/wHgAQ8E/wYAAf8BwAMAAQEB/wH8AgABHwH/AeABAAEP + A/8GAAH/AYADAAEBAf8B+AIAAR8B/wHgAgABDwL/BgAB/wQAAQEB/wH4AgABHwH/AeADAAEPAf8GAAH+ + BAABAQH/AfgCAAEPAf8B4AQAAQcGAAH8BAABAQH/AfgCAAEPAf8B4AQAAQcGAAH4BAABAQH/AfACAAEP + Af8B4AQAAQcGAAHwBAABAQH/AfACAAEPAf8B4AQAAQcGAAHgBAABAQH/AfACAAEPAf8B4AQAAQcGAAHA + BAABAQH/AfACAAEPAf8B4AQAAQcGAAHABAABAQH/AfACAAEPAf8B4AQAAQcGAAHABAABAQH/AfACAAEP + Af8B4AQAAQcGAAHABAABAQH/AfACAAEHAf8B4AQAAQcGAAHABAABAQH/AfACAAEHAf8B4AQAAQcGAAHA + BAABAQH/AfACAAEHAf8B4AQAAQcGAAHABAABAQH/AfACAAEHAf8B4AQAAQcGAAHABAABAQH/AfACAAEH + Af8B4AQAAQcGAAHABAABAQH/AfACAAEHAf8B4AQAAQcGAAHABAABAQH/AeACAAEHAf8B4AQAAQcGAAHA + BAABAQH/AeACAAEHAf8B4AQAAQcGAAHABAABAQH/AeACAAEHAf8B4AQAAQcGAAHABAABAQH/AeACAAEH + Af8B4AQAAQcGAAHABAAC/wHgAgABBwH/AeAEAAEHBgABwAQAAv8B4AIAAQcB/wHgBAABBwYAAcAEAAL/ + AeACAAEHAf8B4AQAAQcGAAHABAAC/wHgAgABBwH/AeAEAAEHBgABwAQAAv8B4AIAAQcB/wHgBAABBwYA + AcAEAAL/AeACAAEHAf8B4AQAAQcGAAHABAAC/wHgAgABBwH/AeAEAAEHBgABwAQAAv8B4AIAAQcB/wHg + BAABBwYAAcAEAAL/AeACAAEHAf8B4AQAAQ8GAAHABAAC/wHgAgABBwH/AfAEAAEfBgABwAQAAv8B4AIA + AQcB/wH4BAABPwYAAcAEAAL/AeACAAEHAf8B/AQAAX8GAAHABAAC/wHgAgABBwL/BAABfwYAAcAEAAL/ + AeACAAEPAv8BgAIAAQEB/wYAAcAEAAL/AeACAAEPAv8BwAIAAQMB/wYAAcAEAAL/AeACAAEPAv8B4AIA + AQcB/wYAAcAEAAL/AfACAAEPAv8B+AIAAQ8B/wYAAcAEAAL/AfACAAEPAv8B/AIAAR8B/wYAAcAEAAL/ + AfACAAEPAv8B/gIAAX8B/wYAAcADAAEHAv8B+AIAAR8D/wGAAQAC/wYAAcADAAE/Av8B+AIAAR8D/wHg + AQMC/wYAAf8BgAEAAQED/wH8AgABPwP/AfgBBwL/BgAI/wIACP8GABL/BgAm/wEAAQcK/wHwAT8J/wH+ + AgABPwH/AeABDwb/AeABPwn/AfwCAAEfAf8B4AEAAQ8F/wHgAR8Bzwj/AfgCAAEfAf8B4AIAAQ8E/wHg + AR8Bgwj/AfgCAAEfAf8B4AMAAQ8C/wHHAcABDwEBBP8B+AEAAQEB/wH4AgABDwH/AeAEAAEHAf8BgwHA + AQQBAQT/AfgBAAEBAf8B+AIAAQ8B/wHgBAABBwH/AQABgAIABP8B+AEAAQEB/wHwAgABDwH/AeAEAAEH + Af4EAAT/AfgBAAEBAf8B8AIAAQ8B/wHgBAABBwH+BAAE/wHAAQABAQH/AfACAAEPAf8B4AQAAQcB/AMA + AQEE/wGAAQABAQH/AfACAAEPAf8B4AQAAQcB/AMAAQEE/wGAAQABAQH/AfACAAEPAf8B4AQAAQcB/AMA + AQEE/wGAAQABAQH/AfACAAEPAf8B4AQAAQcB/gMAAQEE/wGAAQABAQH/AfACAAEHAf8B4AQAAQcB/gQA + AT8D/wGAAQABAQH/AfACAAEHAf8B4AQAAQcB/wQAAQcD/wGYAQABAQH/AfACAAEHAf8B4AQAAQcB/gQA + AQcD/wEYAQABAQH/AfACAAEHAf8B4AQAAQcB4AQAAQMD/wEYAQABAQH/AfACAAEHAf8B4AQAAQcB4AQA + AQMD/wE/A/8B8AIAAQcB/wHgBAABBwHABAABAwL/Af4BPwP/AeACAAEHAf8B4AQAAQcBwAQAAQMC/wH+ + AT8D/wHgAgABBwH/AeAEAAEHAcABAAEDAcABAAEDAv8B/gF/A/8B4AIAAQcB/wHgBAABBwHAAQABBwHw + AQABAwGAAQABHAF/A/8B4AIAAQcB/wHgBAABBwHAAQABDwHwAQABBwGAAQABHAF/A/8B4AIAAQcB/wHg + BAABBwHAAQABDwHwAQABDwGAAQABHAT/AeACAAEHAf8B4AQAAQcBwAEAAQ8B8AEAAT8BgAEAARgE/wHg + AgABBwH/AeAEAAEHAcABAAEHAeABAAEfAYACAAT/AeACAAEHAf8B4AQAAQcB8AEAAQEBwAEAAQ8BgAEA + AQEE/wHgAgABBwH/AeAEAAEHAf4EAAEPAYABAAEBBP8B4AIAAQcB/wHgBAABBwH+BAABDwGAAgAB+AEA + AQEB/wHgAgABBwH/AeAEAAEHAfwEAAEPAYACAAF4AQABAQH/AeACAAEHAf8B4AQAAQcB+AQAAQcBgAIA + ATgBAAEBAf8B4AIAAQcB/wHgBAABDwH4BAABDwGAAQABHgE4AQABAQH/AeACAAEHAf8B8AQAAR8B+AQA + AQ8BgAEAAR8CAAEBAf8B4AIAAQcB/wH4BAABPwH4BAABHwGAAQABHwGAAQABAQH/AeACAAEHAf8B/AQA + AX8B+AQAAR8D/wHAAQABAQH/AeACAAEHAv8EAAF/AfwDAAEMAT8D/wHAAQABAQH/AeACAAEPAv8BgAIA + AQEB/wH8AwABHwT/AcABAAEBAf8B4AIAAQ8C/wHAAgABAwH/Af4BHgIAAR8E/wHAAQABAQH/AeACAAEP + Av8B4AIAAQcC/wH+AgABHwT/AfgBAAEBAf8B8AIAAQ8C/wH4AgABDwL/Af4CAAEfBP8B+AEAAQEB/wHw + AgABDwL/AfwCAAEfAv8B/gEAAeABHwT/AfgBAAEBAf8B8AIAAQ8C/wH+AgABfwL/Af4BAQHgAR8I/wH4 + AgABHwP/AYABAAP/Af4BAwHwAX8I/wH4AgABHwP/AeABAwT/AQMB+Qn/AfwCAAE/A/8B+AEHEP8CACD/ + Cw== + + + + 123, 17 + + + 231, 17 + + + + + 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 + kgBh//8AT0lHAAL9/wAKbpEAycnJAFulvQC0//8AcHBwADjF5AA3h6kAAMz9ADD//wBry8wAsLCwAGqM + jgARiLYA4ODgAEnj/wA5p8oASHyLABvl/wAXweYAdp+wAH///wCDg4MAYGBgAFBreAAAk8cAT8fZAFqT + qwAAuOwAIbDWAB6bwAA11vgAAOX/AAJ/pwA0lLsAo6OjAL+8vAAdgKcAXOv/ANTU1ACOjo4AHM7zAA6f + 0ABJ9f8AObHYAELT7wA55P8AWqOrAHp6egCyoqAADqzaAA6XwwBomrIAW87UAB+JswBY4PcAMrjiAML/ + /wAs3/8ATo2rAFlYWABZUEwATOv1AACv4gAat94AR77cAI+GgwBnZ2cAnJycAA18qwAAw/UAEsvtAADZ + /wBl9P8AD7nkABPd/wAnzPMAQsrkADGr0wAA8P8At7e3AACMvwCXlZUAqqqqAEDd/ABT5v8AMZCyABOC + rwASkb0AAoGwAAeGqgAA1fcAxMTEAHV1dQCJiYkASMrdAFHy/wAAy/QAMsDmABjs/wAVw+0AWp+5AHj/ + /wDQ0NAAa2trAH5+fgBh+PsAkomIAJKSkgAAtOcAE36qAACh1QCnlpMAvP//AADT/wAZvOEAA5fKAMDA + wAAAvPAAAKveALS0tACgoKAAmZmZAD/h/wAA6v8AXP//AADB8ABY6P8AjYeHADbE4AAA+f8AAMX5ABrA + 6QAA4vwAEZrDABGEsgActNwAAN3/AJ6WlACPiooAEIGtAMfHxwB4eHgArq6uAICAgACQkJAAH7LYAJSU + lAAAlskAFH2tAFLp/wA44f8AGL7mALn//wAA8/8AfP//ABjD6AAE//8AALruAACx5AAAqdwAAKTXAFDn + /wBGyN0AC3uqAFnq/gA6xuMAAM3/AA17qQARgrEASOX/AMD//wC+//8AAOP/AADX/wAu//8AX///ANPT + 0wDR0dEAampqAMXFxQC/v78As7OzAIGBgQCMiIgAioqKAKKiogCfn58AlpaWAJCPjwAAxPYAAK7hAACj + 1gARh7UAOeL/AEDg/wDB//8AA///AH7//wB9//8Aef//AC///wBd//8AALzvAAC67QAAs+cAWen+AEjk + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAaygkjDlePA0hAAAAAAAAAAAAAAAAAFQMRA+jiIKPeInFH5s6AAAA + AAAAAAAAFnCfBLUGVbO0DsTRc0VXQQAAAAAAAAAAI87Kg7UGVbO0DkzSpaYCqgAAAAAAAAAAmKE/g7UG + VbO0DkzSpaanrgAAAAAAAAAAjqGxg7UGVbO0DkzSpaanSwAAAAAAAAAARs2yg7UGVbO0DkzSpaankgAA + AAAAAAAAeRuy0LUGVbO0DkzSpaanrwAAAAAAAAAAnsx3ts/LoCZOrcSkpabGjQAAAAAAAAAAomwKMWmL + YWeEfNIi032nxwAAAAAAAAAAahhRGYdTM1olUoo4epp1EwAAAAAAAAAALz1cHgcg1KjVgZ1AUCdfXQAA + AAAAAAAAqU12SBdPLFsVycgwcQVgdAAAAAAAAAAAABA3hjVmq4WcsDRHA0MrGgAAAAAAAAAAAAAqkRI7 + ZaxoPjIJkEIAAAAAAAAAAAAAAACTw74AAAAAAAAAWB0AAAAAAAAAAAAAAAAIwb0AAAAAAAAALkkAAAAA + AAAAAAAAAAC3urkAAAAAAAB/ZG4AAAAAAAAAAAAAAABiFMJjAAAAAIAccgsAAAAAAAAAAAAAAAAALbd/ + lDZvlnJKv5kAAAAAAAAAAAAAAAAAu224e7yVWSmXwgAAAAAAAAAAAAAAAAAAAABWfhHAwnIAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/gD/APgAHwDwAA8A8AAPAPAADwDwAA8A8AAPAPAA + DwDwAA8A8AAPAPAADwDwAA8A8AAPAPgADwD8AD8A/H8/APx/PwD8fj8A/Dw/AP4APwD+AH8A/4H/AP// + /wAoAAAAGAAAADAAAAABACAAAAAAAGAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKfeLwCPxnwAi8OyAJjF0wCa + yOUAlsfqAI/A5ACCttEAdqmuAHapfABupTwAi4ICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACw8RYAq+S3Ocfm/kzr9f8w////BP///wD5//8A6v//AN3//wDT//8Axfn/AK7h/wCT + x/8AeK/hAH26ZwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACl2axh+Pv/uf///2H/ + //8u////Av3//wDw//8A4///ANf//wDM/f8AxPb/ALzv/wC05/8Ar+L/AI7B/gB0qY0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACx4c95////wf///1z///8u////Av3//wDw//8A4///ANf//wDM + /f8Aw/X/ALrt/wCx5P8Aqdz/AKbZ/wB5rO4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1 + 49F8////wv///1z///8u////Av3//wDw//8A4///ANf//wDM/f8Aw/X/ALrt/wCx5P8Aqdz/AKTX/wB4 + q+sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC359V8////wP///1z///8u////Av3//wDw + //8A4///ANf//wDM/f8Aw/X/ALrt/wCx5P8Aqdz/AKTX/wB6resAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAG76dh9////vv///1z///8u////Av3//wDw//8A4///ANf//wDM/f8Aw/X/ALrt/wCx + 5P8Aqdz/AKTX/wB+r+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALA7Nt/////vv///13/ + //8u////Av3//wDw//8A4///ANf//wDM/f8Aw/X/ALrt/wCx5P8Aqdz/AKTX/wB+s+YAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC8N5+////vP///1////8v////A////wDz//8A5f//ANn//wDN + //8AxPb/ALru/wCx5P8Aqdz/AKPW/wCBtOYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbI + 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 + //8A6v//AOH//wDZ//8A0P//AMj7/wDC9f8AvO//ALbp/wCw4/8Aqt3/AKTX/wCf0v8AbqHmAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACo4sI+8vr/q////7n///9p////Rf///yP/ + //8C/f//APT//wDq//8A4f//ANn//wDQ//8AyPv/AML1/wC87/8Atun/ALDj/wCq3f8ApNf/AJ7R/wBv + o+MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3ixT31+/+u////uP///2n/ + //9F////I////wL9//8A9P//AOr//wDh//8A2f//AND//wDI+/8AwvX/ALzv/wC26f8AsOP/AKrd/wCk + 1/8AntH/AHGk4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAreTIQPb8/6// + //+2////af///0X///8j////Av3//wD0//8A6v//AOH//wDZ//8A0P//AMj7/wDC9f8AvO//ALbp/wCw + 4/8Aqt3/AKTX/wCe0f8Ac6bfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACv + 6Ms/+f3/sP///7b///9q////Rf///yP///8C/f//APT//wDq//8A4f//ANn//wDQ//8AyPv/AML1/wC8 + 7/8Atun/ALDj/wCq3f8ApNf/AJ7R/wB1qN0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAALPpz0D5/P+y////s////2j///9F////I////wL9//8A9P//AOr//wDh//8A2f//AND//wDI + +/8AwvX/ALzv/wC26f8AsOP/AKrd/wCk1/8AntH/AHiq3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAtOzRQvz+/7H///+x////aP///0X///8j////Av7//wD1//8A6v//AOH//wDZ + //8A0P//AMj7/wDC9f8AvO//ALbp/wCw4/8Aqt3/AKTX/wCd0P8AeK3dAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC37tZE/P3/rf///7L///9u////Sv///yb//v8D////APf//wDq + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD/AQCWvhkAj8I3AIm8VgCLvWYAh7pxAIO5egCDtXoAgbV0AICzbgB+s1wAf69EAHqsKABh + pwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAKjnLwCf1nkAm9G1AJbE6gCTxP4Cos3+AKzS/wCx1v8Atdn/ALTa/wCx2v8Aqtb/AKTS/wCa + zP8Aj8P/AIG0/gB6rvkAfbTUAH60pwB+tGkAfr4kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAMDuBgCl4GYAoNvSBaDR/inB4P843u3/Nvf6/yb///8M////AP///wD4//8A8v//AOr//wDm + //8A3///ANn//wDT//8Az///AMv+/wDC9f8As+X/AJ/S/wCMvv8AeK39AHat1wB3sIAAe7QeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAtewqAJ7U0xm03P5v5/P/i////2////9U////O////yP///8M/v//APr//wD0 + //8A7v//AOf//wDi//8A3P//ANb//wDQ//8Ay/3/AMb5/wDC9f8Av/L/ALzv/wC57P8Atej/AKLV/wCI + u/8AcaX5AHSqmwB7rRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC79CMApNnqONvv/4H///+k////gv///2r///9S////Ov///yP/ + //8M/v//APr//wD0//8A7v//AOf//wDi//8A3P//ANb//wDQ//8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC2 + 6f8AsuX/AK/i/wCt4P8Apdj/AIW4/wBuoecAdbI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACx6Z8f0ez/XP///5j////V////gv///2r/ + //9S////Ov///yP///8M/v//APr//wD0//8A7v//AOf//wDi//8A3P//ANb//wDQ//8Ay/3/AMb5/wDC + 9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq3f8Ap9r/AKXY/wCSxf8AbqLyAHW0KQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACy7MIu6/f/Wv///6P/ + ///V////if///2r///9S////Ov///yP///8M/v//APr//wD0//8A7v//AOf//wDi//8A3P//ANb//wDQ + //8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq3f8Aptn/AKLV/wCg0/8Ahrn/AHWpogAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACy + 7Mkv7ff/W////6n////S////jf///2r///9S////Ov///yP///8M/v//APr//wD0//8A7v//AOf//wDi + //8A3P//ANb//wDQ//8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq3f8Aptn/AKLV/wCf + 0v8AksX/AHWrxwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACz7cwv7fj/Xf///6n////S////jv///2r///9S////Ov///yP///8M/v//APr//wD0 + //8A7v//AOf//wDi//8A3P//ANb//wDQ//8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq + 3f8Aptn/AKLV/wCf0v8AjsH/AHasuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC078ww7/n/Xv///6v////Q////jv///2r///9S////Ov///yP/ + //8M/v//APr//wD0//8A7v//AOf//wDi//8A3P//ANb//wDQ//8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC2 + 6f8AsuX/AK7h/wCq3f8Aptn/AKLV/wCf0v8Aj8L/AHetuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC38NQy8fn/Xv///6z////P////kP///2r/ + //9S////Ov///yP///8M/v//APr//wD0//8A7v//AOf//wDi//8A3P//ANb//wDQ//8Ay/3/AMb5/wDC + 9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq3f8Aptn/AKLV/wCf0v8Aj8L/AHmwuAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC58dUx8fr/X////63/ + ///Q////jv///2r///9S////Ov///yP///8M/v//APr//wD0//8A7v//AOf//wDi//8A3P//ANb//wDQ + //8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq3f8Aptn/AKLV/wCf0v8Aj8L/AHmvuAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5 + 8tY09fv/X////67////O////j////2r///9S////Ov///yP///8M/v//APr//wD0//8A7v//AOf//wDi + //8A3P//ANb//wDQ//8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq3f8Aptn/AKLV/wCf + 0v8AkMP/AHqwtQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAC79N4z9fv/X////7H////N////jf///2r///9S////Ov///yP///8M/v//APr//wD0 + //8A7v//AOf//wDi//8A3P//ANb//wDQ//8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq + 3f8Aptn/AKLV/wCf0v8AkMP/AH20rwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC999419vz/YP///7H////M////jP///2r///9S////Ov///yP/ + //8M/v//APr//wD0//8A7v//AOf//wDi//8A3P//ANb//wDQ//8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC2 + 6f8AsuX/AK7h/wCq3f8Aptn/AKLV/wCf0v8AkcT/AH60rwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC++OA1+f3/YP///7P////L////jf///2r/ + //9S////Ov///yP///8M/v//APr//wD0//8A7v//AOf//wDi//8A3P//ANb//wDQ//8Ay/3/AMb5/wDC + 9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq3f8Aptn/AKLV/wCf0v8AkcT/AH+1rwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADB+uc2+P3/X////7X/ + ///J////i////2r///9S////Ov///yP///8M/v//APr//wD0//8A7v//AOf//wDi//8A3P//ANb//wDQ + //8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq3f8Aptn/AKLV/wCf0v8AkcT/AIG4rwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADB + ++c3/P7/XP///7b////I////if///2r///9S////Ov///yP///8M/v//APr//wD0//8A7v//AOf//wDi + //8A3P//ANb//wDQ//8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq3f8Aptn/AKLV/wCf + 0v8AkcT/AIG4rwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAADA+uo3+/7/Wf///7T////I////h////2r///9S////Ov///yP///8M////APv//wD1 + //8A7///AOj//wDj//8A3P//ANb//wDQ//8Ay/3/AMb5/wDC9f8AvvH/ALrt/wC26f8AsuX/AK7h/wCq + 3f8Aptn/AKLV/wCf0v8AkMP/AIK5rwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP//AQC28e85/f7/WP///6X////I////hP///27///9W////Pf/+/yX/ + /v8M////APf9/wDw/v8A5/3/AOD8/wDd/P8A2Pz/ANX9/wDR//8AzP//AMj7/wDE9/8Av/L/ALvu/wC2 + 6f8AsuX/AK7h/wCq3f8Aptn/AKLV/wCf0v8AksX/AIW7rwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AQC28e85/v7/XP///4T///+d/v//XfH//y/k + /v8S2v//AtH//wDI/f8AxPv/AsP3/wfC9P8IwPL/Cr7u/wa46/8FtOb/AK3h/wCo3f8Ap9v/AKjb/wCq + 3f8Ard//ALDj/wC16P8AtOf/AK/i/wCr3v8Aptn/AKLV/wCf0v8AkcT/AIW8rwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGrAwC99fI9////P/H//xjc + //8A0P//Edj//y7d/v86zuj/SMvh/1HN4P9W0uL/VtPm/1LY7P9Q2/H/T+L6/03m//9J5f//ReT//z7g + //802Pz/KdD1/xzD7f8TtuT/CaXW/wCSxf8AkcT/AJfK/wCg0/8Ap9r/AKPW/wCf0v8AkcT/AIi/rQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKjkBQDE + +PUK2///CdX//0fo//939///Y+b6/zqpv/8yn7X/QrHD/1TE0v9Rxtf/T8vd/07O4v9P3fT/UOb//0vk + //9H4///Q+H//z/g//884P//ON7//zXe//8w3v//LNz//yjb//8cyfT/Dq/e/wSPwv8AgbX/AI/D/wCf + 0v8Ak8b/AIm/pQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAADa/9ct4P//g/f//2fn+P8Mp9f/Inua/0R2hv87dIn/A3Wa/xKLrf9SwdD/T8XX/1bg + 9f9W6P//Ueb//03l//9J4///ReL//0Hh//883///ON7//zTc//8w2///Ldv//yja//8l3v//HMXq/xSh + v/8QqtD/BZLD/wB2qv8Aibz/AIzDpQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh/+Jy8v//gvj//wCc0P9mkaD/k4uI/4mFhP9rZmX/aHJy/wB0 + nf9Et8r/X+f6/1zq//9X6P//U+f//0/l//9L5P//RuL//0Lh//8+4P//Ot7//zXd//8x3P//Ldz//xO7 + 6f8FlcH/F2N9/xBlg/8AcZX/CY+y/wmk0P8Ac6f/AIa9pQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADn/4wg4///gPX//xWWw/+ek5D/np6d/56e + nv9vb2//aGFf/x+Pr/9o8f//Yuz//13q//9Z6f//VOf//1Dm//9M5P//SOP//0Ph//8/4P//O9///zbd + //803v//BqbX/yuhyP+bl5b/bmln/1dRT/85U1r/AG2T/wuYuv8Fncz/AHWrqAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv/wYA7P+ZCOv//ULU + 5f+elZP/pqam/56env9ubm7/Zl9d/2/n9f9o7///Y+z//17r//9a6f//Vuj//1Hm//9N5f//SeP//0Ti + //9A4P//PN///zfd//8x2v3/AJPL/6jBxv+npKP/bW1t/1ZVVf9RSkj/F2qF/w7G8v8Dibv/AH6zmgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD//8A///8AAP/4AAD//wAA/8AAAB// + AAD/gAAAB/8AAP8AAAAD/wAA/gAAAAH/AAD+AAAAAP8AAP4AAAAA/wAA/gAAAAD/AAD+AAAAAP8AAP4A + AAAA/wAA/gAAAAD/AAD+AAAAAP8AAP4AAAAA/wAA/gAAAAD/AAD+AAAAAP8AAP4AAAAA/wAA/gAAAAD/ + AAD+AAAAAP8AAP4AAAAA/wAA/gAAAAD/AAD+AAAAAP8AAP4AAAAA/wAA/gAAAAD/AAD+AAAAAP8AAP4A + AAAA/wAA/wAAAAD/AAD/wAAAAf8AAP/gAAAH/wAA/+AAAAf/AAD/4P/+B/8AAP/g//4H/wAA/+D//gf/ + AAD/4P/+B/8AAP/gf/4H/wAA/+B//gf/AAD/4H/8D/8AAP/gP/gP/wAA//AP8A//AAD/8AAAH/8AAP/4 + AAAf/wAA//gAAD//AAD//AAAf/8AAP//AAD//wAA///AA///AAD///////8AAP///////wAA + + + \ No newline at end of file diff --git a/Console/CICRadarRConfig/CICRadarRConfig/Main.vb b/Console/CICRadarRConfig/CICRadarRConfig/Main.vb new file mode 100644 index 0000000..8971cd0 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/Main.vb @@ -0,0 +1,529 @@ +Imports CICRadarRConfig.SMS +Imports System.ServiceProcess +Imports System.IO +Imports System.Net.Mail +Public Class CICRadiusRConfig + Private ConfigFile As New IniFile + Private encCode As String = "gewsyy#sjs2!" + Private Sub CICRadiusRConfig_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load + Me.Height = 440 + Me.Width = 620 + + + PanelSetup.Location = New Point(136, 27) + PanelSetup.Height = 357 + PanelSetup.Width = 470 + + PanelActiveDirectory.Location = New Point(136, 27) + PanelActiveDirectory.Height = 357 + PanelActiveDirectory.Width = 470 + + PanelRadiusClients.Location = New Point(136, 27) + PanelRadiusClients.Height = 357 + PanelRadiusClients.Width = 470 + + PanelSMSSetup.Location = New Point(136, 27) + PanelSMSSetup.Height = 357 + PanelSMSSetup.Width = 470 + + PanelMailSetup.Location = New Point(136, 27) + PanelMailSetup.Height = 357 + PanelMailSetup.Width = 470 + Try + ConfigFile.Load(Application.StartupPath & "\CICRadarR.ini") + txtNetBios.Text = ConfigFile.GetKeyValue("CICRadarR", "NetBiosDomain") + txtLdapDomain.Text = ConfigFile.GetKeyValue("CICRadarR", "LDAPDomain") + txtProvider.Text = ConfigFile.GetKeyValue("CICRadarR", "Provider") + txtADField.Text = ConfigFile.GetKeyValue("CICRadarR", "ADField") + txtADMailField.Text = ConfigFile.GetKeyValue("CICRadarR", "ADMailField") + Dim ModemType As String + ModemType = ConfigFile.GetKeyValue("CICRadarR", "USELOCALMODEM") + If ModemType = "1" Then + rbLocalSMS.Checked = True + Else + rbLocalSMS.Checked = False + End If + + Dim EnableOTP As String + EnableOTP = ConfigFile.GetKeyValue("CICRadarR", "EnableOTP") + If EnableOTP = "1" Then + ckEnableOTP.Checked = True + Dim EnableSMS As String + Dim EnableEmail As String + EnableSMS = ConfigFile.GetKeyValue("CICRadarR", "EnableSMS") + EnableEmail = ConfigFile.GetKeyValue("CICRadarR", "EnableEmail") + If EnableEmail = "1" Then + ckEnableMail.Checked = True + Else + TestMailConfigurationToolStripMenuItem.Enabled = False + lvConfig.Items.Item(3).ImageIndex = 6 + ckEnableMail.Checked = False + + End If + + If EnableSMS = "1" Then + ckEnableSMS.Checked = True + Else + lvConfig.Items.Item(2).ImageIndex = 5 + ckEnableSMS.Checked = False + TestModemConfigurationToolStripMenuItem.Enabled = False + End If + Else + lvConfig.Items.Item(2).ImageIndex = 5 + lvConfig.Items.Item(3).ImageIndex = 6 + TestMailConfigurationToolStripMenuItem.Enabled = False + TestModemConfigurationToolStripMenuItem.Enabled = False + ckEnableSMS.Checked = False + ckEnableMail.Checked = False + ckEnableOTP.Checked = False + End If + + txtMailServer.Text = ConfigFile.GetKeyValue("CICRadarR", "MailServer") + txtSenderEmail.Text = ConfigFile.GetKeyValue("CICRadarR", "SenderEmail") + + txtComPort.Text = ConfigFile.GetKeyValue("CICRadarR", "COMPORT") + txtSMSC.Text = ConfigFile.GetKeyValue("CICRadarR", "SMSC") + Dim Debug As String + Debug = ConfigFile.GetKeyValue("CICRadarR", "Debug") + If Debug = "1" Then + ckDebug.Checked = True + Else + ckDebug.Checked = False + End If + + Dim RDGateway As String + RDGateway = ConfigFile.GetKeyValue("CICRadarR", "TSGW") + If RDGateway = "1" Then + rbRDGateway.Checked = True + rbCitrixNetscaler.Checked = False + Else + rbRDGateway.Checked = False + rbCitrixNetscaler.Checked = True + End If + + Dim ClientList() As String + ClientList = Split(ConfigFile.GetKeyValue("CICRadarR", "ClientList"), ",") + + For i As Integer = 0 To ClientList.Length - 1 + ListClients.Items.Add(ClientList(i) & " ( " & ConfigFile.GetKeyValue("Clients", ClientList(i)) & " )") + Next + + + + + Catch + End Try + + Dim tt As New ToolTip() + + tt.ShowAlways = True + + tt.SetToolTip(txtADField, "Type the Active Directory field where phonenumbers are stored." & vbCrLf & "Ex: mobile or telephoneNumber" & vbCrLf & "Use Adsiedit.msc to find the correct field.") + tt.SetToolTip(txtSMSC, "See http://smsclist.com/downloads/default.txt for your provider" & vbCrLf & "Ex: +4540390999") + tt.SetToolTip(txtComPort, "Ex: com1") + tt.SetToolTip(txtProvider, "Type the https address of your SMS provider." & vbCrLf & "Replace the message field of the url with ***TEXTMESSAGE***" & vbCrLf & "Replace the recipient field of the url with ***NUMBER***" & vbCrLf & "Ex: https://www.cpsms.dk/sms/?username=myuser&password=mypassword&recipient=***NUMBER***&message=&from=CPSMS") + tt.SetToolTip(txtNetBios, "Set NetBios Domain name" & vbCrLf & "Ex: MYDOMAIN") + tt.SetToolTip(txtLdapDomain, "Set LDAP Domain" & vbCrLf & "Ex: test.lan") + tt.SetToolTip(ckEnableOTP, "Enable SMS Magic.") + + ToolStripStatusLabel1.Text = "Status: " & "Configuration loaded" + End Sub + + + + + + + + + + + + Private Sub btnRemoveClient_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) + If ListClients.SelectedIndex > -1 Then + + ListClients.Items.RemoveAt(ListClients.SelectedIndex) + + End If + End Sub + + Private Sub btnAddClient_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) + If Not ListClients.Items.Contains(txtClient.Text & " ( " & EncDec.Encrypt(txtSecret.Text, encCode) & " )") Then + ListClients.Items.Add(txtClient.Text & " ( " & EncDec.Encrypt(txtSecret.Text, encCode) & " )") + End If + End Sub + + + Private Sub btnRestart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRestart.Click + Dim ok As MsgBoxResult + btnRestart.Enabled = False + ok = MsgBox("Restart CICRadiusR Service?", MsgBoxStyle.YesNo, "Restart Service") + If ok = vbYes Then + ToolStripStatusLabel1.Text = "Status: " & "Radius server restarting..." + Dim controller As New ServiceController("CICRadiusR") + controller.Stop() + controller.WaitForStatus(ServiceControllerStatus.Stopped) + ToolStripStatusLabel1.Text = "Status: " & "Radius server stopped" + controller.Start() + controller.WaitForStatus(ServiceControllerStatus.Running) + ToolStripStatusLabel1.Text = "Status: " & "Radius server started" + MsgBox("CICRadiusR Service restarted", MsgBoxStyle.Information, "Information") + End If + btnRestart.Enabled = True + End Sub + + + Private Sub lvConfig_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles lvConfig.SelectedIndexChanged + Dim ele As ListViewItem + If lvConfig.SelectedIndices.Count > 0 Then + Select lvConfig.SelectedItems(0).Text.ToUpper + + Case "SETUP" + PanelSetup.Visible = True + PanelActiveDirectory.Visible = False + PanelSMSSetup.Visible = False + PanelMailSetup.Visible = False + PanelRadiusClients.Visible = False + Case "ACTIVE DIRECTORY" + PanelSetup.Visible = False + PanelActiveDirectory.Visible = True + PanelSMSSetup.Visible = False + PanelMailSetup.Visible = False + PanelRadiusClients.Visible = False + Case "SMS SETUP" + If ckEnableSMS.Checked = True Then + PanelSetup.Visible = False + PanelActiveDirectory.Visible = False + PanelSMSSetup.Visible = True + PanelMailSetup.Visible = False + PanelRadiusClients.Visible = False + End If + Case "MAIL SETUP" + If ckEnableMail.Checked = True Then + PanelSetup.Visible = False + PanelActiveDirectory.Visible = False + PanelSMSSetup.Visible = False + PanelMailSetup.Visible = True + PanelRadiusClients.Visible = False + End If + Case "RADIUS CLIENTS" + PanelSetup.Visible = False + PanelActiveDirectory.Visible = False + PanelSMSSetup.Visible = False + PanelMailSetup.Visible = False + PanelRadiusClients.Visible = True + Panel1.AutoScrollPosition = New Point(0, 130) + End Select + + End If + End Sub + + Private Sub rbRDGateway_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbRDGateway.CheckedChanged + If rbRDGateway.Checked = True Then + rbCitrixNetscaler.Checked = False + End If + End Sub + + Private Sub rbCitrixNetscaler_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbCitrixNetscaler.CheckedChanged + If rbCitrixNetscaler.Checked = True Then + rbRDGateway.Checked = False + End If + End Sub + + + + + Private Sub rbOnlineSMS_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbOnlineSMS.CheckedChanged + If rbOnlineSMS.Checked = True Then + rbLocalSMS.Checked = False + txtComPort.Enabled = False + txtSMSC.Enabled = False + txtProvider.Enabled = True + txtSMSC.BackColor = Color.White + txtComPort.BackColor = Color.White + End If + End Sub + + Private Sub rbLocalSMS_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbLocalSMS.CheckedChanged + If rbLocalSMS.Checked = True Then + rbOnlineSMS.Checked = False + txtComPort.Enabled = True + txtSMSC.Enabled = True + txtProvider.Enabled = False + txtProvider.BackColor = Color.White + End If + End Sub + + + + Private Sub btnTestModem_Click(sender As System.Object, e As System.EventArgs) Handles btnTestModem.Click + Call TestModem() + + End Sub + + + Private Sub ckEnableOTP_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles ckEnableOTP.CheckedChanged + If ckEnableOTP.Checked = True Then + ckEnableMail.Enabled = True + ckEnableSMS.Enabled = True + 'If ckEnableSMS.Checked = True Then + ' lvConfig.Items.Item(2).ImageIndex = 2 + 'Else + ' lvConfig.Items.Item(2).ImageIndex = 5 + 'End If + 'If ckEnableMail.Checked = True Then + ' lvConfig.Items.Item(3).ImageIndex = 3 + 'Else + ' lvConfig.Items.Item(3).ImageIndex = 6 + 'End If + + 'txtADField.Enabled = True + 'txtComPort.Enabled = True + 'txtSMSC.Enabled = True + 'If rbLocalSMS.Checked = True Then + ' txtComPort.Enabled = True + ' txtSMSC.Enabled = True + ' txtProvider.Enabled = False + + 'Else + ' txtComPort.Enabled = False + ' txtSMSC.Enabled = False + ' txtProvider.Enabled = True + + 'End If + 'btnTestModem.Enabled = True + Else + ckEnableMail.Enabled = False + ckEnableSMS.Enabled = False + lvConfig.Items.Item(2).ImageIndex = 5 + lvConfig.Items.Item(3).ImageIndex = 6 + 'txtADField.Enabled = False + 'txtComPort.Enabled = False + 'txtSMSC.Enabled = False + 'txtProvider.Enabled = False + 'btnTestModem.Enabled = False + End If + End Sub + + Private Sub ckEnableSMS_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles ckEnableSMS.CheckedChanged + If ckEnableSMS.Checked = True Then + lvConfig.Items.Item(2).ImageIndex = 2 + TestModemConfigurationToolStripMenuItem.Enabled = True + Else + TestModemConfigurationToolStripMenuItem.Enabled = False + lvConfig.Items.Item(2).ImageIndex = 5 + End If + End Sub + + Private Sub ckEnableMail_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles ckEnableMail.CheckedChanged + If ckEnableMail.Checked = True Then + lvConfig.Items.Item(3).ImageIndex = 3 + TestMailConfigurationToolStripMenuItem.Enabled = True + Else + lvConfig.Items.Item(3).ImageIndex = 6 + TestMailConfigurationToolStripMenuItem.Enabled = False + End If + End Sub + + Private Sub SaveConfigurationToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles SaveConfigurationToolStripMenuItem.Click + Call save() + End Sub + + Private Sub RestartRadiusServerToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles RestartRadiusServerToolStripMenuItem.Click + Dim ok As MsgBoxResult + RestartRadiusServerToolStripMenuItem.Enabled = False + ok = MsgBox("Restart CICRadiusR Service?", MsgBoxStyle.YesNo + MsgBoxStyle.Information, "Restart Service") + If ok = vbYes Then + + Dim controller As New ServiceController("CICRadiusR") + controller.Stop() + controller.WaitForStatus(ServiceControllerStatus.Stopped) + controller.Start() + controller.WaitForStatus(ServiceControllerStatus.Running) + MsgBox("CICRadiusR Service restarted", MsgBoxStyle.Information, "Information") + End If + RestartRadiusServerToolStripMenuItem.Enabled = True + End Sub + + Sub Save() + ConfigFile.SetKeyValue("CICRadarR", "NetBiosDomain", txtNetBios.Text) + ConfigFile.SetKeyValue("CICRadarR", "LDAPDomain", txtLdapDomain.Text) + ConfigFile.SetKeyValue("CICRadarR", "Provider", txtProvider.Text) + ConfigFile.SetKeyValue("CICRadarR", "ADField", txtADField.Text) + ConfigFile.SetKeyValue("CICRadarR", "ADMailField", txtADMailField.Text) + + ConfigFile.SetKeyValue("CICRadarR", "SenderEmail", txtSenderEmail.Text) + ConfigFile.SetKeyValue("CICRadarR", "MailServer", txtMailServer.Text) + + If rbLocalSMS.Checked = True Then + ConfigFile.SetKeyValue("CICRadarR", "USELOCALMODEM", "1") + Else + ConfigFile.SetKeyValue("CICRadarR", "USELOCALMODEM", "0") + End If + + ConfigFile.SetKeyValue("CICRadarR", "COMPORT", txtComPort.Text) + ConfigFile.SetKeyValue("CICRadarR", "SMSC", txtSMSC.Text) + + If ckDebug.Checked = True Then + ConfigFile.SetKeyValue("CICRadarR", "Debug", "1") + Else + ConfigFile.SetKeyValue("CICRadarR", "Debug", "0") + End If + + If ckEnableOTP.Checked = True Then + ConfigFile.SetKeyValue("CICRadarR", "EnableOTP", "1") + Else + ConfigFile.SetKeyValue("CICRadarR", "EnableOTP", "0") + End If + + If rbRDGateway.Checked = True Then + ConfigFile.SetKeyValue("CICRadarR", "TSGW", "1") + Else + ConfigFile.SetKeyValue("CICRadarR", "TSGW", "0") + End If + + If ckEnableMail.Checked = True Then + ConfigFile.SetKeyValue("CICRadarR", "EnableEmail", "1") + Else + ConfigFile.SetKeyValue("CICRadarR", "EnableEmail", "0") + End If + + If ckEnableSMS.Checked = True Then + ConfigFile.SetKeyValue("CICRadarR", "EnableSMS", "1") + Else + ConfigFile.SetKeyValue("CICRadarR", "EnableSMS", "0") + End If + ConfigFile.RemoveSection("Clients") + Dim ClientList As String = "" + For i As Integer = 0 To ListClients.Items.Count - 1 + Dim Client As String + Dim Secret As String + Client = Split(ListClients.Items(i), " ( ")(0) + Secret = Replace(Split(ListClients.Items(i), " ( ")(1), " )", "") + ConfigFile.SetKeyValue("Clients", Client, Secret) + + If i = ListClients.Items.Count - 1 Then + ClientList = ClientList & Client + Else + ClientList = ClientList & Client & "," + End If + + Next + ConfigFile.SetKeyValue("CICRadarR", "ClientList", ClientList) + + + ConfigFile.Save(Application.StartupPath & "\CICRadarR.ini") + End Sub + + Private Sub ExitToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles ExitToolStripMenuItem.Click + + Select Case MsgBox("Save configuration before exit?", MsgBoxStyle.YesNoCancel + MsgBoxStyle.Information, "Configuration") + Case vbYes + Call Save() + ToolStripStatusLabel1.Text = "Status: " & "Configuration saved" + MsgBox("Configuration saved", vbOKOnly + MsgBoxStyle.Information, "Configuration") + End + Case vbNo + End + Case vbCancel + End Select + + End Sub + + Private Sub AboutToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles AboutToolStripMenuItem.Click + MsgBox("Configuration tool for CICRadar." & vbCrLf & vbCrLf & "Version 1.1", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "About") + End Sub + + Sub TestModem() + Dim number As String + number = InputBox("Type the phone number to send the test sms to" & vbCrLf & vbCrLf & "Ex: +4512345678", "Phone Number", "", Me.Left + 150, Me.Top + 100) + If rbLocalSMS.Checked = True Then + Dim testsms As New SmsClass(txtComPort.Text) + testsms.Opens() + testsms.sendSms(number, "Test SMS Service", txtSMSC.Text) + testsms.Closes() + Else + Dim baseurl As String = txtProvider.Text.Split("?")(0) + Dim client As New System.Net.WebClient() + ' Add a user agent header in case the requested URI contains a query. + + client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR1.0.3705;)") + + Dim parameters As String = txtProvider.Text.Split("?")(1) + Dim pary As String() = parameters.Split("&") + + For i As Integer = 0 To pary.Length - 1 + If pary(i).IndexOf("***TEXTMESSAGE***") > 0 Then + Dim qpar As String() = pary(i).Split("=") + client.QueryString.Add(qpar(0), "Test SMS Service") + ElseIf pary(i).IndexOf("***NUMBER***") > 0 Then + Dim qpar As String() = pary(i).Split("=") + client.QueryString.Add(qpar(0), number) + Else + + Dim qpar As String() = pary(i).Split("=") + client.QueryString.Add(qpar(0), qpar(1)) + End If + Next + + + Dim data As Stream = client.OpenRead(baseurl) + Dim reader As New StreamReader(data) + Dim s As String = reader.ReadToEnd() + data.Close() + reader.Close() + + End If + End Sub + + Sub TestEmail() + Dim email As String + email = InputBox("Type the email address to send the test email to" & vbCrLf & vbCrLf & "Ex: test@my.mail.com", "Email", "", Me.Left + 150, Me.Top + 100) + Dim mail As New MailMessage() + mail.To.Add(email) + mail.From = New MailAddress(txtSenderEmail.Text) + mail.Subject = "Test mail from CICRadar" + mail.Body = "Just a test." + mail.IsBodyHtml = False + Dim smtp As New SmtpClient(txtMailServer.Text) + + + Try + smtp.Send(mail) + + ToolStripStatusLabel1.Text = "Status: Mail send" + Catch e As InvalidCastException + + ToolStripStatusLabel1.Text = "Status: Failed to send mail" + End Try + + + End Sub + + Private Sub TestModemConfigurationToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles TestModemConfigurationToolStripMenuItem.Click + Call TestModem() + End Sub + + Private Sub TestMailConfigurationToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles TestMailConfigurationToolStripMenuItem.Click + Call TestEmail() + End Sub + + Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click + Call TestEmail() + End Sub + + + Private Sub btnRemoveClient_Click(sender As System.Object, e As System.EventArgs) Handles btnRemoveClient.Click + If ListClients.SelectedIndex > -1 Then + + ListClients.Items.RemoveAt(ListClients.SelectedIndex) + + End If + End Sub + + Private Sub btnAddClient_Click(sender As System.Object, e As System.EventArgs) Handles btnAddClient.Click + If Not ListClients.Items.Contains(txtClient.Text & " ( " & EncDec.Encrypt(txtSecret.Text, encCode) & " )") Then + ListClients.Items.Add(txtClient.Text & " ( " & EncDec.Encrypt(txtSecret.Text, encCode) & " )") + End If + End Sub +End Class diff --git a/Console/CICRadarRConfig/CICRadarRConfig/My Project/Application.Designer.vb b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Application.Designer.vb new file mode 100644 index 0000000..9054d8a --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Application.Designer.vb @@ -0,0 +1,38 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1008 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'NOTE: This file is auto-generated; do not modify it directly. To make changes, + ' or if you encounter build errors in this file, go to the Project Designer + ' (go to Project Properties or double-click the My Project node in + ' Solution Explorer), and make changes on the Application tab. + ' + Partial Friend Class MyApplication + + _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = false + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = true + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.CICRadarRConfig.CICRadiusRConfig + End Sub + End Class +End Namespace diff --git a/Console/CICRadarRConfig/CICRadarRConfig/My Project/Application.myapp b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Application.myapp new file mode 100644 index 0000000..0b94b4c --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + true + CICRadiusRConfig + false + 0 + true + 0 + true + \ No newline at end of file diff --git a/Console/CICRadarRConfig/CICRadarRConfig/My Project/AssemblyInfo.vb b/Console/CICRadarRConfig/CICRadarRConfig/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..4541ba2 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/Console/CICRadarRConfig/CICRadarRConfig/My Project/Resources.Designer.vb b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Resources.Designer.vb new file mode 100644 index 0000000..c4f51e8 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1008 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("CICRadarRConfig.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/Console/CICRadarRConfig/CICRadarRConfig/My Project/Resources.resx b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Console/CICRadarRConfig/CICRadarRConfig/My Project/Settings.Designer.vb b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Settings.Designer.vb new file mode 100644 index 0000000..41757c2 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1008 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.CICRadarRConfig.My.MySettings + Get + Return Global.CICRadarRConfig.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/Console/CICRadarRConfig/CICRadarRConfig/My Project/Settings.settings b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Settings.settings new file mode 100644 index 0000000..377f56d --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Console/CICRadarRConfig/CICRadarRConfig/SmsClass.vb b/Console/CICRadarRConfig/CICRadarRConfig/SmsClass.vb new file mode 100644 index 0000000..f636330 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/SmsClass.vb @@ -0,0 +1,66 @@ +Imports System +Imports System.Collections.Generic +Imports System.Text +Imports System.Threading +Imports System.IO.Ports +Imports System.Windows.Forms +Namespace SMS + Class SmsClass + Private serialPort As SerialPort + Public Sub New(ByVal comPort As String) + Me.serialPort = New SerialPort() + Me.serialPort.PortName = comPort + Me.serialPort.BaudRate = 38400 + Me.serialPort.Parity = Parity.None + Me.serialPort.DataBits = 8 + Me.serialPort.StopBits = StopBits.One + Me.serialPort.Handshake = Handshake.RequestToSend + Me.serialPort.DtrEnable = True + Me.serialPort.RtsEnable = True + Me.serialPort.NewLine = System.Environment.NewLine + End Sub + Public Function sendSms(ByVal cellNo As String, ByVal sms As String, ByVal SMSC As String) As Boolean + Dim messages As String = Nothing + messages = sms + If Me.serialPort.IsOpen = True Then + Try + Me.serialPort.WriteLine("AT" + Chr(13)) + Thread.Sleep(4) + Me.serialPort.WriteLine("AT+CSCA=""" + SMSC + """" + Chr(13)) + Thread.Sleep(30) + Me.serialPort.WriteLine(Chr(13)) + Thread.Sleep(30) + Me.serialPort.WriteLine("AT+CMGS=""" + cellNo + """") + + Thread.Sleep(30) + Me.serialPort.WriteLine(messages + Chr(26)) + Catch ex As Exception + MessageBox.Show(ex.Source) + End Try + Return True + Else + Return False + End If + End Function + + Public Sub Opens() + + If Me.serialPort.IsOpen = False Then + Try + 'bool ok =this.serialPort.IsOpen //does not work between 2 treads + + Me.serialPort.Open() + Catch + Thread.Sleep(1000) + 'wait for the port to get ready if + Opens() + End Try + End If + End Sub + Public Sub Closes() + If Me.serialPort.IsOpen = True Then + Me.serialPort.Close() + End If + End Sub + End Class +End Namespace diff --git a/Console/CICRadarRConfig/CICRadarRConfig/app.config b/Console/CICRadarRConfig/CICRadarRConfig/app.config new file mode 100644 index 0000000..457ec03 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/app.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarR.ini b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarR.ini new file mode 100644 index 0000000..9b804c0 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarR.ini @@ -0,0 +1,24 @@ +[CICRadarR] +ClientList=10.10.10.47,192.168.1.139,192.168.1.101,192.168.1.61,192.168.1.44,188.244.24.22 +SenderEmail=noreply2@isager.dk +EnableOTP=1 +Provider=https://www.cpsms.dk/sms/?username=myuser&password=mypassword&recipient=***NUMBER***&message=***TEXTMESSAGE***&from=CPSMS +Debug=0 +EnableSMS=1 +ADField=telephoneNumber +NetBiosDomain=isager +TSGW=1 +LDAPDomain=isager.lan +EnableEmail=1 +USELOCALMODEM=0 +SMSC=+4540390999 +COMPORT=com1 +MailServer=192.168.1.25 +ADMailfield=mail +[Clients] +188.244.24.22=/pkahxdoI69d+omeup3YZA== +192.168.1.139=eXA0YJxFrgfaDtOFApCifbPtJYrEL0RjpDzymPKlw6c= +10.10.10.47=iirseiKUQCWnjfg1ZLhF+w== +192.168.1.101=eXA0YJxFrgfaDtOFApCifbPtJYrEL0RjpDzymPKlw6c= +192.168.1.61=p2fyLMddDfH8aLYwMyDbhQ1l3MY9hAJxx6DyiUOhjXw= +192.168.1.44=eXA0YJxFrgfaDtOFApCifbPtJYrEL0RjpDzymPKlw6c= diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.exe b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.exe new file mode 100644 index 0000000..f8d737b Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.exe differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.exe.config b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.exe.config new file mode 100644 index 0000000..457ec03 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.exe.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.pdb b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.pdb new file mode 100644 index 0000000..41ad121 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.pdb differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.vshost.exe b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.vshost.exe new file mode 100644 index 0000000..bb84a51 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.vshost.exe differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.vshost.exe.config b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.vshost.exe.config new file mode 100644 index 0000000..457ec03 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.vshost.exe.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.vshost.exe.manifest b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.vshost.exe.manifest new file mode 100644 index 0000000..f96b1d6 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.vshost.exe.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.xml b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.xml new file mode 100644 index 0000000..871744c --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/bin/Debug/CICRadarRConfig.xml @@ -0,0 +1,24 @@ + + + + +CICRadarRConfig + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + \ No newline at end of file diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.exe b/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.exe new file mode 100644 index 0000000..f18b1a8 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.exe differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.pdb b/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.pdb new file mode 100644 index 0000000..52951bd Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.pdb differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.vshost.exe b/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.vshost.exe new file mode 100644 index 0000000..bb84a51 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.vshost.exe differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.vshost.exe.manifest b/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.vshost.exe.manifest new file mode 100644 index 0000000..f96b1d6 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.vshost.exe.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.xml b/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.xml new file mode 100644 index 0000000..871744c --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/bin/Release/CICRadarRConfig.xml @@ -0,0 +1,24 @@ + + + + +CICRadarRConfig + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + \ No newline at end of file diff --git a/Console/CICRadarRConfig/CICRadarRConfig/lock.ico b/Console/CICRadarRConfig/CICRadarRConfig/lock.ico new file mode 100644 index 0000000..34c2ace Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/lock.ico differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.CICRadiusRConfig.resources b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.CICRadiusRConfig.resources new file mode 100644 index 0000000..e0183a1 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.CICRadiusRConfig.resources differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.Resources.resources b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.Resources.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.Resources.resources differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.exe b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.exe new file mode 100644 index 0000000..f8d737b Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.exe differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.pdb b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.pdb new file mode 100644 index 0000000..41ad121 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.pdb differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.vbproj.FileListAbsolute.txt b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.vbproj.FileListAbsolute.txt new file mode 100644 index 0000000..a8a1b02 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.vbproj.FileListAbsolute.txt @@ -0,0 +1,12 @@ +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\bin\Debug\CICRadarRConfig.exe +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\bin\Debug\CICRadarRConfig.pdb +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\bin\Debug\CICRadarRConfig.xml +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Debug\ResolveAssemblyReference.cache +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Debug\CICRadarRConfig.CICRadiusRConfig.resources +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Debug\CICRadarRConfig.Resources.resources +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Debug\GenerateResource.read.1.tlog +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Debug\GenerateResource.write.1.tlog +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Debug\CICRadarRConfig.exe +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Debug\CICRadarRConfig.xml +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Debug\CICRadarRConfig.pdb +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\bin\Debug\CICRadarRConfig.exe.config diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.xml b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.xml new file mode 100644 index 0000000..871744c --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/CICRadarRConfig.xml @@ -0,0 +1,24 @@ + + + + +CICRadarRConfig + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + \ No newline at end of file diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000..6a1fe31 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..dcbc012 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/GenerateResource.read.1.tlog b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/GenerateResource.read.1.tlog new file mode 100644 index 0000000..fdb078b Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/GenerateResource.read.1.tlog differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/GenerateResource.write.1.tlog b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/GenerateResource.write.1.tlog new file mode 100644 index 0000000..26441f7 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/GenerateResource.write.1.tlog differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/TempPE/My Project.Resources.Designer.vb.dll b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/TempPE/My Project.Resources.Designer.vb.dll new file mode 100644 index 0000000..52efb0f Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Debug/TempPE/My Project.Resources.Designer.vb.dll differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.CICRadiusRConfig.resources b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.CICRadiusRConfig.resources new file mode 100644 index 0000000..dc4a016 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.CICRadiusRConfig.resources differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.Resources.resources b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.Resources.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.Resources.resources differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.exe b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.exe new file mode 100644 index 0000000..f18b1a8 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.exe differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.pdb b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.pdb new file mode 100644 index 0000000..52951bd Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.pdb differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.vbproj.FileListAbsolute.txt b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.vbproj.FileListAbsolute.txt new file mode 100644 index 0000000..1f42367 --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.vbproj.FileListAbsolute.txt @@ -0,0 +1,11 @@ +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\bin\Release\CICRadarRConfig.exe +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\bin\Release\CICRadarRConfig.pdb +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\bin\Release\CICRadarRConfig.xml +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Release\ResolveAssemblyReference.cache +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Release\CICRadarRConfig.CICRadiusRConfig.resources +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Release\CICRadarRConfig.Resources.resources +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Release\GenerateResource.read.1.tlog +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Release\GenerateResource.write.1.tlog +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Release\CICRadarRConfig.exe +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Release\CICRadarRConfig.xml +C:\CICRadarR\Console\CICRadarRConfig\CICRadarRConfig\obj\x86\Release\CICRadarRConfig.pdb diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.xml b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.xml new file mode 100644 index 0000000..871744c --- /dev/null +++ b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/CICRadarRConfig.xml @@ -0,0 +1,24 @@ + + + + +CICRadarRConfig + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + \ No newline at end of file diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..111b22a Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/GenerateResource.read.1.tlog b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/GenerateResource.read.1.tlog new file mode 100644 index 0000000..965d930 Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/GenerateResource.read.1.tlog differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/GenerateResource.write.1.tlog b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/GenerateResource.write.1.tlog new file mode 100644 index 0000000..fe956ad Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/GenerateResource.write.1.tlog differ diff --git a/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/TempPE/My Project.Resources.Designer.vb.dll b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/TempPE/My Project.Resources.Designer.vb.dll new file mode 100644 index 0000000..bedd63d Binary files /dev/null and b/Console/CICRadarRConfig/CICRadarRConfig/obj/x86/Release/TempPE/My Project.Resources.Designer.vb.dll differ diff --git a/RadiusClient/RadiusClient.sln b/RadiusClient/RadiusClient.sln new file mode 100644 index 0000000..e095a2f --- /dev/null +++ b/RadiusClient/RadiusClient.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "RadiusClient", "RadiusClient\RadiusClient.vbproj", "{46907543-4F8C-4757-8C85-0B2EAD7EFF29}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {46907543-4F8C-4757-8C85-0B2EAD7EFF29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {46907543-4F8C-4757-8C85-0B2EAD7EFF29}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46907543-4F8C-4757-8C85-0B2EAD7EFF29}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46907543-4F8C-4757-8C85-0B2EAD7EFF29}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/RadiusClient/RadiusClient.suo b/RadiusClient/RadiusClient.suo new file mode 100644 index 0000000..df53063 Binary files /dev/null and b/RadiusClient/RadiusClient.suo differ diff --git a/RadiusClient/RadiusClient/My Project/Application.Designer.vb b/RadiusClient/RadiusClient/My Project/Application.Designer.vb new file mode 100644 index 0000000..2d2f4a0 --- /dev/null +++ b/RadiusClient/RadiusClient/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.296 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/RadiusClient/RadiusClient/My Project/Application.myapp b/RadiusClient/RadiusClient/My Project/Application.myapp new file mode 100644 index 0000000..0167050 --- /dev/null +++ b/RadiusClient/RadiusClient/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 1 + true + diff --git a/RadiusClient/RadiusClient/My Project/AssemblyInfo.vb b/RadiusClient/RadiusClient/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..8f82d76 --- /dev/null +++ b/RadiusClient/RadiusClient/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/RadiusClient/RadiusClient/My Project/Resources.Designer.vb b/RadiusClient/RadiusClient/My Project/Resources.Designer.vb new file mode 100644 index 0000000..1fcdf75 --- /dev/null +++ b/RadiusClient/RadiusClient/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.296 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("RadiusClient.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/RadiusClient/RadiusClient/My Project/Resources.resx b/RadiusClient/RadiusClient/My Project/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/RadiusClient/RadiusClient/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RadiusClient/RadiusClient/My Project/Settings.Designer.vb b/RadiusClient/RadiusClient/My Project/Settings.Designer.vb new file mode 100644 index 0000000..ed67945 --- /dev/null +++ b/RadiusClient/RadiusClient/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.296 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.RadiusClient.My.MySettings + Get + Return Global.RadiusClient.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/RadiusClient/RadiusClient/My Project/Settings.settings b/RadiusClient/RadiusClient/My Project/Settings.settings new file mode 100644 index 0000000..377f56d --- /dev/null +++ b/RadiusClient/RadiusClient/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/RadiusClient/RadiusClient/RadiusClient.vbproj b/RadiusClient/RadiusClient/RadiusClient.vbproj new file mode 100644 index 0000000..cf7715b --- /dev/null +++ b/RadiusClient/RadiusClient/RadiusClient.vbproj @@ -0,0 +1,111 @@ + + + + Debug + AnyCPU + + + + + {46907543-4F8C-4757-8C85-0B2EAD7EFF29} + Library + RadiusClient + RadiusClient + 512 + Windows + v2.0 + + + + true + full + true + true + bin\Debug\ + RadiusClient.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + pdbonly + false + true + true + bin\Release\ + RadiusClient.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + + + + + + + + + + + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + + + + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + \ No newline at end of file diff --git a/RadiusClient/RadiusClient/RadiusClient.vbproj.user b/RadiusClient/RadiusClient/RadiusClient.vbproj.user new file mode 100644 index 0000000..695b5c7 --- /dev/null +++ b/RadiusClient/RadiusClient/RadiusClient.vbproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/RadiusClient/RadiusClient/Radius_Attributes.vb b/RadiusClient/RadiusClient/Radius_Attributes.vb new file mode 100644 index 0000000..d21157a --- /dev/null +++ b/RadiusClient/RadiusClient/Radius_Attributes.vb @@ -0,0 +1,256 @@ + + +Imports Microsoft.VisualBasic.Conversion + + +Public Class RADIUSAttributes + Inherits List(Of RADIUSAttribute) + + Friend Function LoadAttributes(ByRef data() As Byte) As Boolean + Dim offset As Integer = 20 + Dim attr As RADIUSAttribute + Dim result As Boolean = True + + Do While offset < data.Length And result + If offset + 1 > data.Length Then result = False + If result Then + If data(offset + 1) < 3 Then result = False + End If + If result Then + If offset + data(offset + 1) > data.Length Then result = False + End If + If result Then + attr = New RADIUSAttribute(data, offset) + Me.Add(attr) + offset += data(offset + 1) + End If + Loop + + Return result + End Function + + Public ReadOnly Property Length() As Integer + Get + Dim result As Integer = 0 + For Each attr In Me + result += attr.Length + Next + Return result + End Get + End Property + + Friend ReadOnly Property Bytes() As Byte() + Get + Dim result() As Byte = {} + Dim offset As Integer = 0 + Array.Resize(result, Me.Length) + For Each attr In Me + Array.Copy(attr.Bytes, 0, result, offset, attr.Length) + offset += attr.Length + Next + Return result + End Get + End Property + + ' fixed function so it return correct value (CI) + Public Function AttributeExists(ByVal type As RadiusAttributeType) As Boolean + Dim attr As RADIUSAttribute + Dim result As Boolean = False + For Each attr In Me + result = (attr.Type = type) + + If result = True Then + Return True + End If + Next + Return False + End Function + + Public Function GetFirstAttribute(ByVal type As RadiusAttributeType) As RADIUSAttribute + Dim atr As RADIUSAttribute + For Each atr In Me + If atr.Type = type Then Return atr + Next + Return Nothing + End Function + + Public Function GetAllAttributes(ByVal type As RadiusAttributeType) As RADIUSAttributes + Dim ret As New RADIUSAttributes + Dim atr As RADIUSAttribute + For Each atr In Me + If atr.Type = type Then ret.Add(atr) + Next + Return ret + End Function + + + + + + + +End Class + +Public Class RADIUSAttribute + Private mType As Byte + Private mLength As Byte + Private mValue() As Byte = {0} + + Friend Sub New(ByRef data() As Byte, ByVal offset As Integer) + mLength = data(offset + 1) + Array.Resize(mValue, mLength - 2) + Array.Copy(data, offset + 2, mValue, 0, mLength - 2) + mType = data(offset) + End Sub + + Public Sub New(ByVal type As RadiusAttributeType, ByVal data() As Byte) + CommonNew(type, data) + End Sub + + Public Sub New(ByVal type As RadiusAttributeType, ByVal data As String) + Dim newdata() As Byte = Conversion.ConvertToBytes(data) + CommonNew(type, newdata) + End Sub + + Public Sub New(ByVal type As RadiusAttributeType, ByVal data As Long) + Dim newdata() As Byte = {data \ 16777216, _ + (data Mod 16777216) \ 65536, _ + (data Mod 65536) \ 256, _ + (data Mod 256)} + CommonNew(type, newdata) + End Sub + + Private Sub CommonNew(ByVal type As Byte, ByRef data() As Byte) + If data.Length > 253 Then + mType = 0 + mLength = 3 + Else + mType = type + Array.Resize(mValue, data.Length) + Array.Copy(data, 0, mValue, 0, data.Length) + mLength = mValue.Length + 2 + End If + End Sub + + Public ReadOnly Property Length() As Byte + Get + Return mLength + End Get + End Property + + Public ReadOnly Property Type() As RadiusAttributeType + Get + Return mType + End Get + End Property + + Friend ReadOnly Property Bytes() As Byte() + Get + Dim result() As Byte = {} + Array.Resize(result, mLength) + Array.Copy(mValue, 0, result, 2, mLength - 2) + result(0) = mType + result(1) = mLength + Return result + End Get + End Property + + Public ReadOnly Property Value() As Byte() + Get + Return mValue + End Get + End Property + + Public Function GetString() As String + Return Conversion.ConvertToString(mValue) + End Function + + Public Function GetLong() As Long + If mLength <> 6 Then Return 0 + Return mValue(0) * 16777216 + _ + mValue(1) * 65536 + _ + mValue(2) * 256 + _ + mValue(3) + End Function + + Public Function GetIPAddress() As String + If mLength <> 6 Then Return "0.0.0.0" + Return mValue(0) & "." & mValue(1) & "." & mValue(2) & "." & mValue(3) + End Function + + Public Function GetHex() As String + Dim i As Integer + Dim result As String = "" + Dim k As String + For i = 0 To mLength - 3 + k = Hex(mValue(i)) + If k.Length = 1 Then k = "0" & k + result = result & k & " " + Next + Return result + End Function + + Public Function GetTrimHex() As String + Return Replace(GetHex, " ", "") + End Function + + +End Class + +Public Enum RadiusAttributeType As Byte + Invalid = 0 + UserName = 1 + UserPassword = 2 + CHAPPassword = 3 + NASIPAddress = 4 + NASPort = 5 + ServiceType = 6 + FramedProtocol = 7 + FramedIPAddress = 8 + FramedIPNetmask = 9 + FramedRouting = 10 + FilterId = 11 + FramedMTU = 12 + FramedCompression = 13 + LoginIPHost = 14 + LoginService = 15 + LoginTCPPort = 16 + ReplyMessage = 18 + CallbackNumber = 19 + CallbackId = 20 + FramedRoute = 22 + FramedIPXNetwork = 23 + State = 24 + [Class] = 25 + VendorSpecific = 26 + SessionTimeout = 27 + IdleTimeout = 28 + TerminationAction = 29 + CalledStationId = 30 + CallingStationId = 31 + NASIdentifier = 32 + ProxyState = 33 + LoginLATService = 34 + LoginLATNode = 35 + LoginLATGroup = 36 + FramedAppleTalkLink = 37 + FramedAppleTalkNetwork = 38 + FramedAppleTalkZone = 39 + AcctStatusType = 40 + AcctDelayTime = 41 + AcctInputOctets = 42 + AcctOutputOctets = 43 + AcctSessionId = 44 + AcctAuthentic = 45 + AcctSessionTime = 46 + AcctInputPackets = 47 + AcctOutputPackets = 48 + AcctTerminateCause = 49 + AcctMultiSessionId = 50 + AcctLinkCount = 51 + CHAPChallenge = 60 + NASPortType = 61 + PortLimit = 62 + LoginLATPort = 63 + MessageAuthenticator = 80 +End Enum diff --git a/RadiusClient/RadiusClient/Radius_Client.vb b/RadiusClient/RadiusClient/Radius_Client.vb new file mode 100644 index 0000000..4e4b037 --- /dev/null +++ b/RadiusClient/RadiusClient/Radius_Client.vb @@ -0,0 +1,126 @@ +Imports System +Imports System.Text +Imports System.Security.Cryptography +Imports System.Collections +Imports System.IO +Imports System.Net +Imports System.Reflection + + + +Public Class Radius_Client + Private Const UDP_TTL As Integer = 10 + Private pSSecret As String = Nothing + Private pUsername As String = Nothing + Private pPassword As String = Nothing + Private pServer As String = Nothing + Private pRadiusPort As Integer = 1812 + Private pUDPTimeout As Integer = 5000 + Private pDebug As Boolean = False + Private pRA As Byte() = New Byte(15) {} + Private pClientIdentifier As Integer + + + Public Sub New(server As String, port As Integer) + pServer = Server + pRadiusPort = Port + End Sub + + Public Property UDPTimeout() As Integer + Get + Return pUDPTimeout + End Get + Set(value As Integer) + pUDPTimeout = value + End Set + End Property + + Public Property Debug() As Boolean + Get + Return pDebug + End Get + Set(value As Boolean) + pDebug = value + End Set + End Property + + Public Function Authenticate(SharedSecret As String, Username As String, Password As String, pAttributes As RADIUSAttributes) As RADIUSPacket + + Dim pRandonNumber As New Random() + + Dim pCode As Byte = RadiusPacketCode.AccessRequest + GenerateRA() + Dim pIdentifier As Byte = Convert.ToByte(pRandonNumber.[Next](0, 32000) Mod 256) + + Dim pUserAttribute As New RADIUSAttribute(RadiusAttributeType.UserName, Username) + Dim pPassAttribute As New RADIUSAttribute(RadiusAttributeType.UserPassword, Crypto.GeneratePAP_PW(Password, SharedSecret, pRA)) + + pAttributes.Add(pUserAttribute) + pAttributes.Add(pPassAttribute) + + Dim rp As RADIUSPacket = New RADIUSPacket(pCode, pIdentifier, pAttributes, pRA) + + For i As Integer = 0 To 10 + Try + Dim myRadiusClient As New Sockets.UdpClient() + myRadiusClient.Client.SendTimeout = pUDPTimeout + myRadiusClient.Client.ReceiveTimeout = pUDPTimeout + + myRadiusClient.Ttl = UDP_TTL + myRadiusClient.Connect(pServer, pRadiusPort) + Threading.Thread.Sleep(200) + DebugOutput("Sending data to radius server" & Encoding.Default.GetString(rp.Bytes)) + myRadiusClient.Send(rp.Bytes, rp.Bytes.Length) + Threading.Thread.Sleep(200) + Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0) + + Dim receiveBytes As [Byte]() = myRadiusClient.Receive(RemoteIpEndPoint) + DebugOutput("Receive data to radius server" & Encoding.Default.GetString(receiveBytes)) + myRadiusClient.Close() + + + rp = New RADIUSPacket(receiveBytes) + Exit For + Catch e As Exception + DebugOutput("Exception Error: " + e.ToString()) + If i = 5 Then + Return Nothing + End If + End Try + Next + Return rp + End Function + + Private Sub GenerateRA() + Dim pRandonNumber As New Random() + For i As Integer = 0 To 14 + pRA(i) = Convert.ToByte(1 + pRandonNumber.[Next]() Mod 255) + pRandonNumber.[Next]() + Next + + End Sub + + + Private Sub DebugOutput(Output As String) + If pDebug Then + + Dim path As String = (New System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath + + path = Replace(Replace(path.ToLower, "/bin/radiusclient.dll", "/log/"), "/", "\") + ' Console.WriteLine("[DEBUG] " + Output) + Dim myDebugWriter As New StreamWriter(path & "Radius_Debug.txt", True) + + myDebugWriter.WriteLine(Now.ToString & ": " & "[DEBUG] " + Output) + + myDebugWriter.Close() + End If + + End Sub + + + + +End Class + + + diff --git a/RadiusClient/RadiusClient/Radius_ClientCrypto.vb b/RadiusClient/RadiusClient/Radius_ClientCrypto.vb new file mode 100644 index 0000000..3dcea7a --- /dev/null +++ b/RadiusClient/RadiusClient/Radius_ClientCrypto.vb @@ -0,0 +1,77 @@ +Imports System +Imports System.Collections.Generic +Imports System.Text +Imports System.Security.Cryptography + + +Partial Friend NotInheritable Class Crypto + Private Sub New() + End Sub + Public Shared Function GeneratePAP_PW(ClearTextPW As String, SharedSecret As String, RequestAuthenticator As Byte()) As Byte() + + Dim pKeyRA As String = SharedSecret & Encoding.[Default].GetString(RequestAuthenticator) + Dim md5 As MD5 = New MD5CryptoServiceProvider() + Dim pMD5Sum As Byte() = md5.ComputeHash(System.Text.Encoding.[Default].GetBytes(pKeyRA)) + Dim pMD5String As String = Utils.ToHexString(pMD5Sum) + + ' Determine how many rounds are needed for authentication + Dim pCrounds As Integer = ClearTextPW.Length \ 16 + If ClearTextPW.Length Mod 16 <> 0 Then + pCrounds += 1 + End If + + + Dim Result As Byte() = New Byte(pCrounds * 16 - 1) {} + For j As Integer = 0 To pCrounds - 1 + Dim pm As Integer + Dim pp As Integer + + 'Split the password in 16byte + Dim pRoundPW As String = "" + If ClearTextPW.Length < (j + 1) * 16 Then + pRoundPW = ClearTextPW.Substring(j * 16, ClearTextPW.Length - j * 16) + Else + pRoundPW = ClearTextPW.Substring(j * 16, 16) + End If + + For i As Integer = 0 To 15 + If 2 * i > pMD5String.Length Then + pm = 0 + Else + pm = System.Convert.ToInt32(pMD5String.Substring(2 * i, 2), 16) + End If + If i >= pRoundPW.Length Then + pp = 0 + Else + pp = AscW(pRoundPW(i)) + End If + Dim pc As Integer = pm Xor pp + Result((j * 16) + i) = CByte(pc) + Next + + + 'Determine the next MD5 Sum MD5(S + cn-1) + Dim pCN1 As Byte() = New Byte(15) {} + Array.Copy(Result, j * 16, pCN1, 0, 16) + Dim pKeyCN1 As String = SharedSecret & Encoding.[Default].GetString(pCN1) + md5 = New MD5CryptoServiceProvider() + pMD5Sum = md5.ComputeHash(System.Text.Encoding.[Default].GetBytes(pKeyCN1)) + pMD5String = Utils.ToHexString(pMD5Sum) + Next + + Return Result + End Function + + Public Shared Function CalcResponseAuth(ReceivedBytes As Byte()) As Byte() + Dim temp As Byte() = New Byte(2) {} + + Return temp + End Function + + +End Class + + + + + diff --git a/RadiusClient/RadiusClient/Radius_ClientUtils.vb b/RadiusClient/RadiusClient/Radius_ClientUtils.vb new file mode 100644 index 0000000..bd288e2 --- /dev/null +++ b/RadiusClient/RadiusClient/Radius_ClientUtils.vb @@ -0,0 +1,49 @@ +Imports System.Net +Imports System.Net.Dns + +Partial Friend NotInheritable Class Utils + Private Sub New() + End Sub + Public Shared Function GetCurrentIP() As IPAddress + + Dim IPBytes As Byte() = New Byte(3) {} + Dim HostName As String = Dns.GetHostEntry("127.0.0.1").HostName + Dim local As IPHostEntry = Dns.GetHostEntry(HostName) + + If local.AddressList.Length > 0 Then + IPBytes = local.AddressList(0).GetAddressBytes() + Else + IPBytes = IPAddress.Loopback.GetAddressBytes() + End If + + Dim returnIP As New IPAddress(IPBytes) + Return returnIP + End Function + + Public Shared Function ToHexString(bytes As Byte()) As String + + Dim hexDigits As Char() = {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, _ + "6"c, "7"c, "8"c, "9"c, "A"c, "B"c, _ + "C"c, "D"c, "E"c, "F"c} + + + Dim chars As Char() = New Char(bytes.Length * 2 - 1) {} + For i As Integer = 0 To bytes.Length - 1 + Dim b As Integer = bytes(i) + chars(i * 2) = hexDigits(b >> 4) + chars(i * 2 + 1) = hexDigits(b And &HF) + Next + Return New String(chars) + End Function + + Public Shared Function intToByteArray(value As Integer) As Byte() + Dim littleendian As Byte() = BitConverter.GetBytes(CShort(value)) + Return New Byte() {littleendian(1), littleendian(0)} + End Function + + +End Class + + + + diff --git a/RadiusClient/RadiusClient/Radius_Conversions.vb b/RadiusClient/RadiusClient/Radius_Conversions.vb new file mode 100644 index 0000000..e591209 --- /dev/null +++ b/RadiusClient/RadiusClient/Radius_Conversions.vb @@ -0,0 +1,56 @@ + +Friend Class Conversion + Friend Shared Function ConvertToString(ByRef bytes() As Byte) As String + Dim k As New System.Text.StringBuilder + Dim i As Integer + For i = 0 To bytes.Length - 1 : k.Append(Chr(bytes(i))) : Next + Return k.ToString + End Function + + Friend Shared Function ConvertToBytes(ByVal str As String) As Byte() + Dim res() As Byte = {} + Array.Resize(Of Byte)(res, str.Length) + Dim i As Integer + For i = 0 To res.Length - 1 + res(i) = Convert.ToByte(str.Chars(i)) + Next + Return res + End Function + + Friend Shared Function ConvertToDateTime(ByVal value As String) As DateTime + Dim ret As DateTime + value = LCase(value) + Try + value = Replace(value, "utc", "") + value = Replace(value, "mon", "") + value = Replace(value, "tue", "") + value = Replace(value, "wed", "") + value = Replace(value, "thu", "") + value = Replace(value, "fri", "") + value = Replace(value, "sat", "") + value = Replace(value, "sun", "") + value = Replace(value, "jan", "1/") + value = Replace(value, "feb", "2/") + value = Replace(value, "mar", "3/") + value = Replace(value, "apr", "4/") + value = Replace(value, "may", "5/") + value = Replace(value, "jun", "6/") + value = Replace(value, "jul", "7/") + value = Replace(value, "aug", "8/") + value = Replace(value, "sep", "9/") + value = Replace(value, "oct", "10/") + value = Replace(value, "nov", "11/") + value = Replace(value, "dec", "12/") + Do While InStr(value, " ") <> 0 + value = Replace(value, " ", " ") + Loop + value = Replace(value, "/ ", "/") + + ret = Convert.ToDateTime(value) + Catch ex As Exception + ret = Nothing + End Try + Return ret + End Function +End Class + diff --git a/RadiusClient/RadiusClient/Radius_Packet.vb b/RadiusClient/RadiusClient/Radius_Packet.vb new file mode 100644 index 0000000..748ff6c --- /dev/null +++ b/RadiusClient/RadiusClient/Radius_Packet.vb @@ -0,0 +1,134 @@ + + +Imports System.Net +Imports System.Security.Cryptography + + +Public Class RADIUSPacket + Private mCode As RadiusPacketCode + Private mIdentifier As Byte + Private mAuthenticator() As Byte = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + Private mAttributes As New RADIUSAttributes + Private mEndPoint As IPEndPoint + Private mIsValid As Boolean + + + Friend Sub New(ByRef data() As Byte) + 'Check validity ... + mIsValid = mAttributes.LoadAttributes(data) + If mIsValid Then + mCode = data(0) + mIdentifier = data(1) + Array.Copy(data, 4, mAuthenticator, 0, 16) + ' mEndPoint = endPoint + + End If + End Sub + + Public Sub New(ByVal code As RadiusPacketCode, ByVal identifier As Byte, ByVal attributes As RADIUSAttributes, authenticator As Byte()) + mCode = code + mIdentifier = identifier + If attributes Is Nothing Then + mAttributes = New RADIUSAttributes + Else + mAttributes = attributes + End If + + mAuthenticator = authenticator + 'If endPoint Is Nothing Then + ' mIsValid = False + 'Else + ' mEndPoint = endPoint + ' mIsValid = True + 'End If + End Sub + + Public ReadOnly Property IsValid() As Boolean + Get + Return mIsValid + End Get + End Property + + Public ReadOnly Property Code() As RadiusPacketCode + Get + Return mCode + End Get + + + + End Property + + Public ReadOnly Property Identifier() As Byte + Get + Return mIdentifier + End Get + End Property + + Public ReadOnly Property Attributes() As RADIUSAttributes + Get + Return mAttributes + End Get + End Property + + Public ReadOnly Property Authenticator() As Byte() + Get + Return mAuthenticator + End Get + End Property + + Public ReadOnly Property EndPoint() As IPEndPoint + Get + Return mEndPoint + End Get + End Property + + Public ReadOnly Property UserName() As String + Get + If mCode <> RadiusPacketCode.AccessRequest Then Return Nothing + If mAttributes.GetFirstAttribute(RadiusAttributeType.UserName) Is Nothing Then Return Nothing + Return mAttributes.GetFirstAttribute(RadiusAttributeType.UserName).GetString + End Get + End Property + + + + Friend Function Bytes() As Byte() + Dim mLength = 20 + mAttributes.Length + Dim result() As Byte = {} + Array.Resize(result, mLength) + result(0) = mCode + result(1) = mIdentifier + result(2) = mLength \ 256 + result(3) = mLength Mod 256 + mAuthenticator.CopyTo(result, 4) + If mLength > 20 Then mAttributes.Bytes.CopyTo(result, 20) + Return result + End Function + + + + + Private Function XorBytes(ByVal oper1() As Byte, ByVal oper2() As Byte) As Byte() + Dim res() As Byte = {} + If oper1.Length <> oper2.Length Then Return res + Dim i As Integer + Array.Resize(res, oper1.Length) + For i = 0 To oper1.Length - 1 + res(i) = oper1(i) Xor oper2(i) + Next + Return res + End Function + +End Class + +Public Enum RadiusPacketCode As Byte + AccessRequest = 1 + AccessAccept = 2 + AccessReject = 3 + AccountingRequest = 4 + AccountingResponse = 5 + AccessChallenge = 11 + StatusServer = 12 + StatusClient = 13 + Reserved = 255 +End Enum diff --git a/RadiusClient/RadiusClient/Radius_VendorSpefic.vb b/RadiusClient/RadiusClient/Radius_VendorSpefic.vb new file mode 100644 index 0000000..c450b9e --- /dev/null +++ b/RadiusClient/RadiusClient/Radius_VendorSpefic.vb @@ -0,0 +1,120 @@ + +Imports RadiusClient.Conversion + +Public Class VendorSpecificAttribute + + Private mVendorType As VendorSpecificType + Private mVendorName As String + Private mVendorValue As String + + Public ReadOnly Property VendorType() As VendorSpecificType + Get + Return mVendorType + End Get + End Property + + Public ReadOnly Property VendorName() As String + Get + Return mVendorName + End Get + End Property + + Public ReadOnly Property VendorValue() As String + Get + Return mVendorValue + End Get + End Property + + Public Function GetTimeStamp() As DateTime + Return ConvertToDateTime(mVendorValue) + End Function + + Friend Sub New(ByRef value() As Byte) + mVendorType = VendorSpecificType.Invalid + mVendorName = "" + mVendorValue = "" + If value.Length < 6 Then Exit Sub + If value.Length <> value(5) + 4 Then Exit Sub + mVendorType = value(4) + mVendorName = "generic" + Dim v() As Byte = {} + Array.Resize(v, value.Length - 6) + Array.Copy(value, 6, v, 0, v.Length) + mVendorValue = ConvertToString(v) + + End Sub + + Public Sub New(ByVal type As VendorSpecificType, ByVal value As String) + mVendorType = type + If type = VendorSpecificType.Invalid Then + mVendorName = "" + mVendorValue = "" + ElseIf type = VendorSpecificType.Generic Then + mVendorName = "generic" + mVendorValue = value + + End If + End Sub + + Public Sub New(ByVal name As String, ByVal value As String) + mVendorType = VendorSpecificType.Generic + mVendorName = name + mVendorValue = value + End Sub + + Public Sub GetRADIUSAttribute(ByRef attributes As RADIUSAttributes) + If attributes Is Nothing Then Exit Sub + If mVendorType = VendorSpecificType.Invalid Then Exit Sub + Dim data() As Byte = {} + Dim len As Byte = 6 + Dim lvt As Byte = mVendorType + + If VendorName = "generic" Then + len += VendorValue.Length + Array.Resize(data, len) + ConvertToBytes(VendorValue).CopyTo(data, 6) + Else + len += VendorName.Length + 1 + VendorValue.Length + Array.Resize(data, len) + ConvertToBytes(VendorName & "=" & VendorValue).CopyTo(data, 6) + End If + + data(4) = lvt + data(5) = len - 4 + data(0) = 0 + data(1) = 0 + data(2) = 0 + data(3) = 9 + Dim attr As New RADIUSAttribute(RadiusAttributeType.VendorSpecific, data) + attributes.Add(attr) + End Sub + + Public Sub SetRADIUSAttribute(ByRef attributes As RADIUSAttributes) + + If mVendorType = VendorSpecificType.Invalid Then Exit Sub + Dim data() As Byte = {} + Dim len As Byte = 6 + Dim lvt As Byte = mVendorType + + + len += VendorValue.Length + Array.Resize(data, len) + ConvertToBytes(VendorValue).CopyTo(data, 6) + + data(4) = lvt + data(5) = len - 4 + data(0) = 0 + data(1) = 0 + data(2) = 0 ' Generic value 666. Not sure if this confilct with other vendor, but RFC does not list existing vendor id's + data(3) = 9 + Dim attr As New RADIUSAttribute(RadiusAttributeType.VendorSpecific, data) + attributes.Add(attr) + End Sub + +End Class + +Public Enum VendorSpecificType As Byte + Invalid = 0 + Generic = 1 + +End Enum \ No newline at end of file diff --git a/RadiusClient/RadiusClient/bin/Debug/RadiusClient.dll b/RadiusClient/RadiusClient/bin/Debug/RadiusClient.dll new file mode 100644 index 0000000..3d761d6 Binary files /dev/null and b/RadiusClient/RadiusClient/bin/Debug/RadiusClient.dll differ diff --git a/RadiusClient/RadiusClient/bin/Debug/RadiusClient.pdb b/RadiusClient/RadiusClient/bin/Debug/RadiusClient.pdb new file mode 100644 index 0000000..bc6aa1b Binary files /dev/null and b/RadiusClient/RadiusClient/bin/Debug/RadiusClient.pdb differ diff --git a/RadiusClient/RadiusClient/bin/Debug/RadiusClient.xml b/RadiusClient/RadiusClient/bin/Debug/RadiusClient.xml new file mode 100644 index 0000000..beb73de --- /dev/null +++ b/RadiusClient/RadiusClient/bin/Debug/RadiusClient.xml @@ -0,0 +1,24 @@ + + + + +RadiusClient + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + \ No newline at end of file diff --git a/RadiusClient/RadiusClient/bin/Debug/vsF77B.tmp b/RadiusClient/RadiusClient/bin/Debug/vsF77B.tmp new file mode 100644 index 0000000..beb73de --- /dev/null +++ b/RadiusClient/RadiusClient/bin/Debug/vsF77B.tmp @@ -0,0 +1,24 @@ + + + + +RadiusClient + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + \ No newline at end of file diff --git a/RadiusClient/RadiusClient/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/RadiusClient/RadiusClient/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..f8f8b1d Binary files /dev/null and b/RadiusClient/RadiusClient/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/RadiusClient/RadiusClient/obj/Debug/RadiusClient.Resources.resources b/RadiusClient/RadiusClient/obj/Debug/RadiusClient.Resources.resources new file mode 100644 index 0000000..06c24d0 Binary files /dev/null and b/RadiusClient/RadiusClient/obj/Debug/RadiusClient.Resources.resources differ diff --git a/RadiusClient/RadiusClient/obj/Debug/RadiusClient.dll b/RadiusClient/RadiusClient/obj/Debug/RadiusClient.dll new file mode 100644 index 0000000..3d761d6 Binary files /dev/null and b/RadiusClient/RadiusClient/obj/Debug/RadiusClient.dll differ diff --git a/RadiusClient/RadiusClient/obj/Debug/RadiusClient.pdb b/RadiusClient/RadiusClient/obj/Debug/RadiusClient.pdb new file mode 100644 index 0000000..bc6aa1b Binary files /dev/null and b/RadiusClient/RadiusClient/obj/Debug/RadiusClient.pdb differ diff --git a/RadiusClient/RadiusClient/obj/Debug/RadiusClient.vbproj.FileListAbsolute.txt b/RadiusClient/RadiusClient/obj/Debug/RadiusClient.vbproj.FileListAbsolute.txt new file mode 100644 index 0000000..04af567 --- /dev/null +++ b/RadiusClient/RadiusClient/obj/Debug/RadiusClient.vbproj.FileListAbsolute.txt @@ -0,0 +1,10 @@ +C:\Users\Administrator\documents\visual studio 2010\Projects\RadiusClient\RadiusClient\bin\Debug\RadiusClient.dll +C:\Users\Administrator\documents\visual studio 2010\Projects\RadiusClient\RadiusClient\bin\Debug\RadiusClient.pdb +C:\Users\Administrator\documents\visual studio 2010\Projects\RadiusClient\RadiusClient\bin\Debug\RadiusClient.xml +C:\Users\Administrator\documents\visual studio 2010\Projects\RadiusClient\RadiusClient\obj\Debug\ResolveAssemblyReference.cache +C:\Users\Administrator\documents\visual studio 2010\Projects\RadiusClient\RadiusClient\obj\Debug\RadiusClient.Resources.resources +C:\Users\Administrator\documents\visual studio 2010\Projects\RadiusClient\RadiusClient\obj\Debug\RadiusClient.dll +C:\Users\Administrator\documents\visual studio 2010\Projects\RadiusClient\RadiusClient\obj\Debug\RadiusClient.xml +C:\Users\Administrator\documents\visual studio 2010\Projects\RadiusClient\RadiusClient\obj\Debug\RadiusClient.pdb +C:\Users\Administrator\documents\visual studio 2010\Projects\RadiusClient\RadiusClient\obj\Debug\ResGen.read.1.tlog +C:\Users\Administrator\documents\visual studio 2010\Projects\RadiusClient\RadiusClient\obj\Debug\ResGen.write.1.tlog diff --git a/RadiusClient/RadiusClient/obj/Debug/RadiusClient.xml b/RadiusClient/RadiusClient/obj/Debug/RadiusClient.xml new file mode 100644 index 0000000..beb73de --- /dev/null +++ b/RadiusClient/RadiusClient/obj/Debug/RadiusClient.xml @@ -0,0 +1,24 @@ + + + + +RadiusClient + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + \ No newline at end of file diff --git a/RadiusClient/RadiusClient/obj/Debug/ResGen.read.1.tlog b/RadiusClient/RadiusClient/obj/Debug/ResGen.read.1.tlog new file mode 100644 index 0000000..e4aaa87 Binary files /dev/null and b/RadiusClient/RadiusClient/obj/Debug/ResGen.read.1.tlog differ diff --git a/RadiusClient/RadiusClient/obj/Debug/ResGen.write.1.tlog b/RadiusClient/RadiusClient/obj/Debug/ResGen.write.1.tlog new file mode 100644 index 0000000..dcb497c Binary files /dev/null and b/RadiusClient/RadiusClient/obj/Debug/ResGen.write.1.tlog differ diff --git a/RadiusClient/RadiusClient/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll b/RadiusClient/RadiusClient/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll new file mode 100644 index 0000000..42e4133 Binary files /dev/null and b/RadiusClient/RadiusClient/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll differ