From f886f3af72148b4efcdfa018168e3e646fc348ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakob=20Aar=C3=B8e=20Dam?= Date: Thu, 30 Apr 2015 14:31:18 +0200 Subject: [PATCH] SMS sending --- server/RDSFactor.vb | 53 ++++++++++++--------------- server/RDSFactor.vbproj | 20 +++++++++- server/exceptions/MissingEmail.vb | 9 +++++ server/exceptions/MissingLdapField.vb | 9 +++++ server/exceptions/MissingNumber.vb | 9 +++++ server/exceptions/SMSSendException.vb | 9 +++++ server/packages.config | 5 +++ web/RDSFactorWeb.sln | 7 +++- web/RDWeb/Pages/Web.config | 4 +- 9 files changed, 91 insertions(+), 34 deletions(-) create mode 100644 server/exceptions/MissingEmail.vb create mode 100644 server/exceptions/MissingLdapField.vb create mode 100644 server/exceptions/MissingNumber.vb create mode 100644 server/exceptions/SMSSendException.vb create mode 100644 server/packages.config diff --git a/server/RDSFactor.vb b/server/RDSFactor.vb index bee8d08..5774273 100644 --- a/server/RDSFactor.vb +++ b/server/RDSFactor.vb @@ -7,12 +7,14 @@ Imports System.Security.Cryptography Imports System.Text Imports System Imports System.Net.Mail +Imports System.Net.Http +Imports System.Web Imports RADAR Public Class RDSFactor Public Shared LDAPDomain As String = "" - Public Shared ADField As String = "" + Public Shared ADMobileField As String = "" Public Shared ADMailField As String = "" Public Shared EnableOTP As Boolean Public Shared secrets As New NASAuthList @@ -149,8 +151,8 @@ Public Class RDSFactor ADMailField = RConfig.GetKeyValue("RDSFactor", "ADMailField") End If - ADField = RConfig.GetKeyValue("RDSFactor", "ADField") - If ADField.Length = 0 Then + ADMobileField = RConfig.GetKeyValue("RDSFactor", "ADField") + If ADMobileField.Length = 0 Then LogInfo("ERROR: ADField can not be empty") ConfOk = False End If @@ -217,40 +219,31 @@ Public Class RDSFactor modem = Nothing Return "Ok" Else + LogDebug("Sending OTP: " & passcode & " to: " & number) + ' TODO: Use HttpUtility UrlEncode when + ' we figure out how to add the dll!!! + Dim url As String = Provider + url = url.Replace("***TEXTMESSAGE***", passcode) + url = url.Replace("***NUMBER***", number) - 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. + Dim client As New HttpClient - client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR1.0.3705;)") + Dim response = client.GetAsync(url).Result + Dim content = response.Content.ReadAsStringAsync().Result - Dim parameters As String = Provider.Split("?")(1) - Dim pary As String() = parameters.Split("&") + If response.IsSuccessStatusCode Then - 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)) + If Not url.IndexOf("cpsms.dk") = -1 Then + ' NOTE: Yes cpsms does indeed return HTTP 200 on errors!?! + If Not content.IndexOf("error") = -1 Then + Throw New SMSSendException(content) + End If 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) + Else + Throw New SMSSendException(content) + End If End If - End Function Public Shared Function SendEmail(email As String, passcode As String) As String diff --git a/server/RDSFactor.vbproj b/server/RDSFactor.vbproj index 925f839..7d8a83b 100644 --- a/server/RDSFactor.vbproj +++ b/server/RDSFactor.vbproj @@ -1,5 +1,5 @@  - + Debug x86 @@ -14,7 +14,7 @@ RDSFactor 512 Console - v4.0 + v4.5.1 publish\ @@ -42,6 +42,7 @@ bin\Debug\ RDSFactor.xml 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + false x86 @@ -52,6 +53,7 @@ bin\Release\ RDSFactor.xml 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + false On @@ -69,12 +71,21 @@ My Project\app.manifest + + False + ..\web\packages\Newtonsoft.Json.6.0.4\lib\net45\Newtonsoft.Json.dll + + + + False + ..\web\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + @@ -94,8 +105,12 @@ + + + + @@ -157,6 +172,7 @@ My Settings.Designer.vb + diff --git a/server/exceptions/MissingEmail.vb b/server/exceptions/MissingEmail.vb new file mode 100644 index 0000000..fdffbf5 --- /dev/null +++ b/server/exceptions/MissingEmail.vb @@ -0,0 +1,9 @@ +Public Class MissingEmail + + Inherits Exception + + Public Sub New(ByVal user As String) + MyBase.New("User: " & user & " has no email") + End Sub + +End Class diff --git a/server/exceptions/MissingLdapField.vb b/server/exceptions/MissingLdapField.vb new file mode 100644 index 0000000..68e2218 --- /dev/null +++ b/server/exceptions/MissingLdapField.vb @@ -0,0 +1,9 @@ +Public Class MissingLdapField + + Inherits Exception + + Public Sub New(field As String, username As String) + MyBase.New("No " & field & " entry in LDAP for " & username) + End Sub + +End Class diff --git a/server/exceptions/MissingNumber.vb b/server/exceptions/MissingNumber.vb new file mode 100644 index 0000000..2d101ab --- /dev/null +++ b/server/exceptions/MissingNumber.vb @@ -0,0 +1,9 @@ +Public Class MissingNumber + + Inherits Exception + + Public Sub New(ByVal user As String) + MyBase.New("User: " & user & " has no mobile number") + End Sub + +End Class diff --git a/server/exceptions/SMSSendException.vb b/server/exceptions/SMSSendException.vb new file mode 100644 index 0000000..9a776e6 --- /dev/null +++ b/server/exceptions/SMSSendException.vb @@ -0,0 +1,9 @@ +Public Class SMSSendException + + Inherits Exception + + Public Sub New(ByVal message As String) + MyBase.New("SMS send error: " & message) + End Sub + +End Class diff --git a/server/packages.config b/server/packages.config new file mode 100644 index 0000000..e665af9 --- /dev/null +++ b/server/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/web/RDSFactorWeb.sln b/web/RDSFactorWeb.sln index 1bd8d9a..13eb16e 100644 --- a/web/RDSFactorWeb.sln +++ b/web/RDSFactorWeb.sln @@ -10,7 +10,8 @@ EndProject Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "Pages", "http://localhost/RDWeb/Pages", "{B31FB884-C42E-417D-AF0D-409FE7D30351}" ProjectSection(WebsiteProperties) = preProject UseIISExpress = "false" - TargetFrameworkMoniker = ".NETFramework,Version%3Dv4.5" + TargetFrameworkMoniker = ".NETFramework,Version%3Dv4.5.1" + ProjectReferences = "{3ab08a4e-c4fa-4571-a5d4-32bba807c31d}|RADAR.dll;" Debug.AspNetCompiler.VirtualPath = "/Pages" Debug.AspNetCompiler.PhysicalPath = "RDWeb\Pages\" Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\Pages\" @@ -27,6 +28,10 @@ Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "Pages", "http://localhost/R Release.AspNetCompiler.Debug = "False" SlnRelativePath = "RDWeb\Pages\" EndProjectSection + ProjectSection(ProjectDependencies) = postProject + {04C6C533-9FEA-41B2-B554-A166C7C7FE32} = {04C6C533-9FEA-41B2-B554-A166C7C7FE32} + {3AB08A4E-C4FA-4571-A5D4-32BBA807C31D} = {3AB08A4E-C4FA-4571-A5D4-32BBA807C31D} + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/web/RDWeb/Pages/Web.config b/web/RDWeb/Pages/Web.config index 1bb9a1a..1753245 100644 --- a/web/RDWeb/Pages/Web.config +++ b/web/RDWeb/Pages/Web.config @@ -85,8 +85,10 @@ - + + +