Example #1
0
        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);
        }
Example #2
0
        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);
        }