From dd1a7a7936c0f482e4eb5b474300429e95c726bf Mon Sep 17 00:00:00 2001 From: Bob Everland Date: Wed, 8 May 2013 08:45:43 -0400 Subject: [PATCH] Added ability to use plain authentication. In order to use plain authentication you must pass an admin username and password. --- ImapClient.cs | 25 ++++++++++++++++++++++--- Pop3Client.cs | 2 +- TextClient.cs | 13 ++++++++++++- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/ImapClient.cs b/ImapClient.cs index 1fa5a90..1578b30 100644 --- a/ImapClient.cs +++ b/ImapClient.cs @@ -26,11 +26,17 @@ public ImapClient(string host, string username, string password, AuthMethods met AuthMethod = method; Login(username, password); } - + public ImapClient(string host, string username, string authUsername, string authPassword, AuthMethods method = AuthMethods.Plain, int port = 143, bool secure = false, bool skipSslValidation = false) + { + Connect(host, port, secure, skipSslValidation); + AuthMethod = method; + Login(username, authUsername, authPassword); + } public enum AuthMethods { Login, CRAMMD5, - SaslOAuth + SaslOAuth, + Plain } public virtual AuthMethods AuthMethod { get; set; } @@ -500,7 +506,7 @@ public virtual Mailbox[] ListSuscribesMailboxes(string reference, string pattern return x.ToArray(); } - internal override void OnLogin(string login, string password) { + internal override void OnLogin(string login, string password, string authUsername = "") { string command = String.Empty; string result = String.Empty; string tag = GetTag(); @@ -527,6 +533,19 @@ internal override void OnLogin(string login, string password) { result = SendCommandGetResponse(command); break; + case AuthMethods.Plain: + command = tag + "AUTHENTICATE PLAIN"; + result = SendCommandGetResponse(command); + // Null character + char nullChar = '\0'; + // Set string for authentication + string authenticationString = String.Format("{0}{3}{1}{3}{2}", login, authUsername, password, nullChar); + // String must be converted to base64 + byte[] toEncodeAsBytes = ASCIIEncoding.ASCII.GetBytes(authenticationString); + string returnValue = System.Convert.ToBase64String(toEncodeAsBytes); + result = SendCommandGetResponse(returnValue); + break; + case AuthMethods.SaslOAuth: string sasl = "user=" + login + "\x01" + "auth=Bearer " + password + "\x01" + "\x01"; string base64 = Convert.ToBase64String(Encoding.GetBytes(sasl)); diff --git a/Pop3Client.cs b/Pop3Client.cs index 8398578..4f9f979 100644 --- a/Pop3Client.cs +++ b/Pop3Client.cs @@ -9,7 +9,7 @@ public Pop3Client(string host, string username, string password, int port = 110, Login(username, password); } - internal override void OnLogin(string username, string password) { + internal override void OnLogin(string username, string password, string authUsername = "") { SendCommandCheckOK("USER " + username); SendCommandCheckOK("PASS " + password); } diff --git a/TextClient.cs b/TextClient.cs index 31181bd..0acf1e3 100644 --- a/TextClient.cs +++ b/TextClient.cs @@ -28,7 +28,7 @@ public TextClient() { Encoding = System.Text.Encoding.GetEncoding(1252); } - internal abstract void OnLogin(string username, string password); + internal abstract void OnLogin(string username, string password, string authPassword = ""); internal abstract void OnLogout(); internal abstract void CheckResultOK(string result); @@ -45,6 +45,17 @@ public virtual void Login(string username, string password) { IsAuthenticated = true; } + public virtual void Login(string username, string authUsername, string authPassword) + { + if (!IsConnected) + { + throw new Exception("You must connect first!"); + } + IsAuthenticated = false; + OnLogin(username, authPassword, authUsername); + IsAuthenticated = true; + } + public virtual void Logout() { IsAuthenticated = false; OnLogout();