| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | using InABox.Core;using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Text;using System.Threading.Tasks;using System.Xml;namespace InABox.API{    public class ASPSMSProvider : ISMSProvider    {        private static int aspPort = 5061;        private static string aspHost = "xml3.aspsms.com";        private static string aspUrl = "/xmlsvr.asp";        private static HttpClient httpClient;        public SMSProviderType ProviderType => SMSProviderType.ASPSMS;        public TwoFactorAuthenticationType TwoFactorAuthenticationType => TwoFactorAuthenticationType.SMS;        public string UserKey { get; set; }        public string Password { get; set; }                public ASPSMSProvider(string userKey, string password)        {            UserKey = userKey;            Password = password;        }        static ASPSMSProvider()        {            httpClient = new HttpClient();        }        private Dictionary<string, string> ReadASPResponse(HttpResponseMessage response)        {            var xmlReader = XmlReader.Create(response.Content.ReadAsStream());            var results = new Dictionary<string, string>();            if (xmlReader.ReadToFollowing("aspsms"))            {                if (!xmlReader.Read())                {                    return results;                }                while (true)                {                    switch (xmlReader.NodeType)                    {                        case XmlNodeType.Element:                            var name = xmlReader.Name;                            if(name == "DeliveryNotification")                            {                                xmlReader.Skip();                            }                            else                            {                                results[xmlReader.Name] = xmlReader.ReadElementContentAsString();                            }                            break;                        default:                            if (!xmlReader.Read())                            {                                return results;                            }                            break;                    }                }            }            return results;        }        public bool SendMessage(string recipient, string message)        {            try            {                var outputStream = new MemoryStream();                var xmlTextWriter = XmlWriter.Create(outputStream);                xmlTextWriter.WriteStartDocument();                xmlTextWriter.WriteStartElement("aspsms");                xmlTextWriter.WriteStartElement("Userkey");                xmlTextWriter.WriteString(UserKey);                xmlTextWriter.WriteEndElement();                xmlTextWriter.WriteStartElement("Password");                xmlTextWriter.WriteString(Password);                xmlTextWriter.WriteEndElement();                xmlTextWriter.WriteStartElement("Recipient");                xmlTextWriter.WriteStartElement("PhoneNumber");                xmlTextWriter.WriteString(recipient);                xmlTextWriter.WriteEndElement();                xmlTextWriter.WriteEndElement();                xmlTextWriter.WriteStartElement("MessageData");                xmlTextWriter.WriteString(message);                xmlTextWriter.WriteEndElement();                xmlTextWriter.WriteStartElement("Action");                xmlTextWriter.WriteString("SendTextSMS");                xmlTextWriter.WriteEndElement();                xmlTextWriter.WriteEndElement();                xmlTextWriter.WriteEndDocument();                xmlTextWriter.Flush();                outputStream.Position = 0;                var content = new StreamContent(outputStream);                var task = httpClient.PostAsync($"http://{aspHost}:{aspPort}{aspUrl}", content);                task.Wait();                var results = ReadASPResponse(task.Result);                var errorCode = results.GetValueOrDefault("ErrorCode") ?? "1";                if(errorCode != "1")                {                    Logger.Send(LogType.Information, "", $"Error while sending SMS code: {results.GetValueOrDefault("ErrorDescription", "Unknown Error")}");                    return false;                }                return true;            }            catch(Exception e)            {                Logger.Send(LogType.Information, "", $"Error while sending SMS code: {CoreUtils.FormatException(e)}");                return false;            }        }    }}
 |