Пример #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);
        }
Пример #2
0
        /// <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;
        }
Пример #3
0
        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);
        }
Пример #4
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);
        }
Пример #5
0
        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);
        }