static async Task CapaHandler(Pop3Engine engine, Pop3Command pc, string text, bool doAsync) { if (pc.Status != Pop3CommandStatus.Ok) { return; } string response; do { if ((response = await engine.ReadLineAsync(doAsync, pc.CancellationToken).ConfigureAwait(false)) == ".") { break; } int index = response.IndexOf(' '); string token, data; int value; if (index != -1) { token = response.Substring(0, index); while (index < response.Length && char.IsWhiteSpace(response[index])) { index++; } if (index < response.Length) { data = response.Substring(index); } else { data = string.Empty; } } else { data = string.Empty; token = response; } switch (token) { case "EXPIRE": engine.Capabilities |= Pop3Capabilities.Expire; var tokens = data.Split(' '); if (int.TryParse(tokens[0], NumberStyles.None, CultureInfo.InvariantCulture, out value)) { engine.ExpirePolicy = value; } else if (tokens[0] == "NEVER") { engine.ExpirePolicy = -1; } break; case "IMPLEMENTATION": engine.Implementation = data; break; case "LOGIN-DELAY": if (int.TryParse(data, NumberStyles.None, CultureInfo.InvariantCulture, out value)) { engine.Capabilities |= Pop3Capabilities.LoginDelay; engine.LoginDelay = value; } break; case "PIPELINING": engine.Capabilities |= Pop3Capabilities.Pipelining; break; case "RESP-CODES": engine.Capabilities |= Pop3Capabilities.ResponseCodes; break; case "SASL": engine.Capabilities |= Pop3Capabilities.Sasl; foreach (var authmech in data.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) { engine.AuthenticationMechanisms.Add(authmech); } break; case "STLS": engine.Capabilities |= Pop3Capabilities.StartTLS; break; case "TOP": engine.Capabilities |= Pop3Capabilities.Top; break; case "UIDL": engine.Capabilities |= Pop3Capabilities.UIDL; break; case "USER": engine.Capabilities |= Pop3Capabilities.User; break; case "UTF8": engine.Capabilities |= Pop3Capabilities.UTF8; foreach (var item in data.Split(' ')) { if (item == "USER") { engine.Capabilities |= Pop3Capabilities.UTF8User; } } break; case "LANG": engine.Capabilities |= Pop3Capabilities.Lang; break; } } while (true); }
/// <summary> /// Initializes a new instance of the <see cref="MailKit.Net.Pop3.Pop3Client"/> class. /// </summary> /// <remarks> /// Before you can retrieve messages with the <see cref="Pop3Client"/>, you /// must first call the <see cref="Connect"/> method and authenticate with /// the <see cref="Authenticate"/> method. /// </remarks> /// <param name="protocolLogger">The protocol logger.</param> /// <exception cref="System.ArgumentNullException"> /// <paramref name="protocolLogger"/> is <c>null</c>. /// </exception> public Pop3Client(IProtocolLogger protocolLogger) { if (protocolLogger == null) throw new ArgumentNullException ("protocolLogger"); // FIXME: should this take a ParserOptions argument? engine = new Pop3Engine (); logger = protocolLogger; }
static void CapaHandler(Pop3Engine engine, Pop3Command pc, string text) { // clear all CAPA response capabilities (except the APOP capability) engine.Capabilities &= Pop3Capabilities.Apop; engine.AuthenticationMechanisms.Clear (); engine.Implementation = null; engine.ExpirePolicy = 0; engine.LoginDelay = 0; if (pc.Status != Pop3CommandStatus.Ok) return; string response; do { if ((response = engine.ReadLine (pc.CancellationToken).TrimEnd ()) == ".") break; int index = response.IndexOf (' '); string token, data; int value; if (index != -1) { token = response.Substring (0, index); while (index < response.Length && char.IsWhiteSpace (response[index])) index++; if (index < response.Length) data = response.Substring (index); else data = string.Empty; } else { data = string.Empty; token = response; } switch (token) { case "EXPIRE": engine.Capabilities |= Pop3Capabilities.Expire; var tokens = data.Split (' '); if (int.TryParse (tokens[0], out value)) engine.ExpirePolicy = value; else if (tokens[0] == "NEVER") engine.ExpirePolicy = -1; break; case "IMPLEMENTATION": engine.Implementation = data; break; case "LOGIN-DELAY": if (int.TryParse (data, out value)) { engine.Capabilities |= Pop3Capabilities.LoginDelay; engine.LoginDelay = value; } break; case "PIPELINING": engine.Capabilities |= Pop3Capabilities.Pipelining; break; case "RESP-CODES": engine.Capabilities |= Pop3Capabilities.ResponseCodes; break; case "SASL": engine.Capabilities |= Pop3Capabilities.Sasl; foreach (var authmech in data.Split (new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) engine.AuthenticationMechanisms.Add (authmech); break; case "STLS": engine.Capabilities |= Pop3Capabilities.StartTLS; break; case "TOP": engine.Capabilities |= Pop3Capabilities.Top; break; case "UIDL": engine.Capabilities |= Pop3Capabilities.UIDL; break; case "USER": engine.Capabilities |= Pop3Capabilities.User; break; } } while (true); }
static async Task CapaHandler(Pop3Engine engine, Pop3Command pc, string text, bool doAsync) { if (pc.Status != Pop3CommandStatus.Ok) { return; } string response; do { if ((response = await engine.ReadLineAsync(doAsync, pc.CancellationToken).ConfigureAwait(false)) == ".") { break; } int index = response.IndexOf(' '); int startIndex, length, value; if (index == -1) { index = response.Length; } if (IsCapability("EXPIRE", response, index, true)) { engine.Capabilities |= Pop3Capabilities.Expire; if (ReadNextToken(response, ref index, out startIndex, out length)) { if (IsToken("NEVER", response, startIndex, length)) { engine.ExpirePolicy = -1; } else if (TryParseInt32(response, startIndex, length, out value)) { engine.ExpirePolicy = value; } } } else if (IsCapability("IMPLEMENTATION", response, index, true)) { engine.Implementation = response.Substring(index + 1); } else if (IsCapability("LANG", response, index)) { engine.Capabilities |= Pop3Capabilities.Lang; } else if (IsCapability("LOGIN-DELAY", response, index, true)) { if (ReadNextToken(response, ref index, out startIndex, out length)) { if (TryParseInt32(response, startIndex, length, out value)) { engine.Capabilities |= Pop3Capabilities.LoginDelay; engine.LoginDelay = value; } } } else if (IsCapability("PIPELINING", response, index)) { engine.Capabilities |= Pop3Capabilities.Pipelining; } else if (IsCapability("RESP-CODES", response, index)) { engine.Capabilities |= Pop3Capabilities.ResponseCodes; } else if (IsCapability("SASL", response, index, true)) { engine.Capabilities |= Pop3Capabilities.Sasl; engine.AddAuthenticationMechanisms(response, index); } else if (IsCapability("STLS", response, index)) { engine.Capabilities |= Pop3Capabilities.StartTLS; } else if (IsCapability("TOP", response, index)) { engine.Capabilities |= Pop3Capabilities.Top; } else if (IsCapability("UIDL", response, index)) { engine.Capabilities |= Pop3Capabilities.UIDL; } else if (IsCapability("USER", response, index)) { engine.Capabilities |= Pop3Capabilities.User; } else if (IsCapability("UTF8", response, index, true)) { engine.Capabilities |= Pop3Capabilities.UTF8; while (ReadNextToken(response, ref index, out startIndex, out length)) { if (IsToken("USER", response, startIndex, length)) { engine.Capabilities |= Pop3Capabilities.UTF8User; } } } } while (true); }
static void CapaHandler(Pop3Engine engine, Pop3Command pc, string text) { // clear all CAPA response capabilities (except the APOP capability) engine.Capabilities &= Pop3Capabilities.Apop; engine.AuthenticationMechanisms.Clear(); engine.Implementation = null; engine.ExpirePolicy = 0; engine.LoginDelay = 0; if (pc.Status != Pop3CommandStatus.Ok) { return; } string response; do { if ((response = engine.ReadLine(pc.CancellationToken).TrimEnd()) == ".") { break; } int index = response.IndexOf(' '); string token, data; int value; if (index != -1) { token = response.Substring(0, index); while (index < response.Length && char.IsWhiteSpace(response[index])) { index++; } if (index < response.Length) { data = response.Substring(index); } else { data = string.Empty; } } else { data = string.Empty; token = response; } switch (token) { case "EXPIRE": engine.Capabilities |= Pop3Capabilities.Expire; var tokens = data.Split(' '); if (int.TryParse(tokens[0], out value)) { engine.ExpirePolicy = value; } else if (tokens[0] == "NEVER") { engine.ExpirePolicy = -1; } break; case "IMPLEMENTATION": engine.Implementation = data; break; case "LOGIN-DELAY": if (int.TryParse(data, out value)) { engine.Capabilities |= Pop3Capabilities.LoginDelay; engine.LoginDelay = value; } break; case "PIPELINING": engine.Capabilities |= Pop3Capabilities.Pipelining; break; case "RESP-CODES": engine.Capabilities |= Pop3Capabilities.ResponseCodes; break; case "SASL": engine.Capabilities |= Pop3Capabilities.Sasl; foreach (var authmech in data.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) { engine.AuthenticationMechanisms.Add(authmech); } break; case "STLS": engine.Capabilities |= Pop3Capabilities.StartTLS; break; case "TOP": engine.Capabilities |= Pop3Capabilities.Top; break; case "UIDL": engine.Capabilities |= Pop3Capabilities.UIDL; break; case "USER": engine.Capabilities |= Pop3Capabilities.User; break; case "UTF8": engine.Capabilities |= Pop3Capabilities.UTF8; foreach (var item in data.Split(' ')) { if (item == "USER") { engine.Capabilities |= Pop3Capabilities.UTF8User; } } break; case "LANG": engine.Capabilities |= Pop3Capabilities.Lang; break; } } while (true); }