Exemplo n.º 1
0
        private static void ParseValue(MimeStringList list, out DateTime utcDateTime, out TimeSpan timeZoneOffset)
        {
            MimeStringList mimeStringList = default(MimeStringList);
            ValueParser    valueParser    = new ValueParser(list, false);

            DateHeader.ParseStage parseStage = DateHeader.ParseStage.DayOfWeek;
            int[] array = new int[8];
            byte  b     = 32;

            while (parseStage != DateHeader.ParseStage.Count)
            {
                valueParser.ParseCFWS(false, ref mimeStringList, true);
                byte b2 = valueParser.ParseGet();
                if (b2 == 0)
                {
                    break;
                }
                if (!MimeScan.IsToken(b2) || b2 == 45 || b2 == 43)
                {
                    b = b2;
                    valueParser.ParseCFWS(false, ref mimeStringList, true);
                }
                else
                {
                    if (MimeScan.IsDigit(b2))
                    {
                        if (parseStage == DateHeader.ParseStage.DayOfWeek)
                        {
                            parseStage = DateHeader.ParseStage.DayOfMonth;
                        }
                        if (parseStage == DateHeader.ParseStage.Second && b != 58)
                        {
                            parseStage = DateHeader.ParseStage.Zone;
                        }
                        int num = 0;
                        do
                        {
                            num++;
                            array[(int)parseStage] *= 10;
                            array[(int)parseStage] += (int)(b2 - 48);
                            b2 = valueParser.ParseGet();
                        }while (b2 != 0 && MimeScan.IsDigit(b2));
                        if (b2 != 0)
                        {
                            valueParser.ParseUnget();
                        }
                        if (parseStage == DateHeader.ParseStage.Year && num <= 2)
                        {
                            array[(int)parseStage] += ((array[(int)parseStage] < 30) ? 2000 : 1900);
                        }
                        if (parseStage == DateHeader.ParseStage.Zone && num <= 2)
                        {
                            array[(int)parseStage] *= 100;
                        }
                        if (parseStage == DateHeader.ParseStage.Zone && b == 45)
                        {
                            array[(int)parseStage] = -array[(int)parseStage];
                        }
                        parseStage++;
                    }
                    else if (MimeScan.IsAlpha(b2))
                    {
                        valueParser.ParseUnget();
                        MimeString mimeString = valueParser.ParseToken(MimeScan.Token.Alpha);
                        if (parseStage == DateHeader.ParseStage.DayOfWeek)
                        {
                            parseStage = DateHeader.ParseStage.DayOfMonth;
                        }
                        else if (parseStage == DateHeader.ParseStage.Month)
                        {
                            array[(int)parseStage] = DateHeader.MapMonthToInt(mimeString.Data, mimeString.Offset, mimeString.Length);
                            parseStage             = DateHeader.ParseStage.Year;
                        }
                        else if (parseStage >= DateHeader.ParseStage.Second)
                        {
                            if (mimeString.Length == 2 && 65 == DateHeader.MakeUpper(mimeString[0]) && 77 == DateHeader.MakeUpper(mimeString[1]))
                            {
                                if (array[4] == 12)
                                {
                                    array[4] = 0;
                                }
                                parseStage = DateHeader.ParseStage.Zone;
                            }
                            else if (mimeString.Length == 2 && 80 == DateHeader.MakeUpper(mimeString[0]) && 77 == DateHeader.MakeUpper(mimeString[1]))
                            {
                                if (array[4] < 12)
                                {
                                    array[4] += 12;
                                }
                                parseStage = DateHeader.ParseStage.Zone;
                            }
                            else
                            {
                                array[7]   = (int)DateHeader.MapZoneToInt(mimeString.Data, mimeString.Offset, mimeString.Length);
                                parseStage = DateHeader.ParseStage.Count;
                            }
                        }
                    }
                    b = 32;
                }
            }
            if (parseStage > DateHeader.ParseStage.Year)
            {
                int num2 = array[3];
                int num3 = array[2];
                int num4 = array[1];
                int num5 = array[4];
                int num6 = array[5];
                int num7 = array[6];
                if (num5 == 23 && num6 == 59 && num7 == 60)
                {
                    num7 = 59;
                }
                if (num2 >= 1900 && num2 <= 9999 && num3 >= 1 && num3 <= 12 && num4 >= 1 && num4 <= DateTime.DaysInMonth(num2, num3) && num5 >= 0 && num5 < 24 && num6 >= 0 && num6 < 60 && num7 >= 0 && num7 < 60)
                {
                    try
                    {
                        utcDateTime = new DateTime(num2, num3, num4, num5, num6, num7, 0, DateTimeKind.Utc);
                        goto IL_319;
                    }
                    catch (ArgumentException)
                    {
                        utcDateTime = DateHeader.minDateTime;
                        goto IL_319;
                    }
                }
                utcDateTime = DateHeader.minDateTime;
            }
            else
            {
                utcDateTime = DateHeader.minDateTime;
            }
IL_319:
            if (parseStage != DateHeader.ParseStage.Count || !(utcDateTime > DateHeader.minDateTime))
            {
                timeZoneOffset = TimeSpan.Zero;
                return;
            }
            int num8 = array[7] / 100;
            int num9 = array[7] % 100;

            if (num8 > 99 || num8 < -99)
            {
                num8 = 0;
                num9 = 0;
            }
            if (num9 > 59 || num9 < -59)
            {
                num9 = 0;
            }
            timeZoneOffset = new TimeSpan(num8, num9, 0);
            if (utcDateTime.Ticks >= timeZoneOffset.Ticks && DateTime.MaxValue.Ticks >= utcDateTime.Ticks - timeZoneOffset.Ticks)
            {
                utcDateTime -= timeZoneOffset;
                return;
            }
            utcDateTime    = DateHeader.minDateTime;
            timeZoneOffset = TimeSpan.Zero;
        }
        // Token: 0x06000246 RID: 582 RVA: 0x0000A13C File Offset: 0x0000833C
        public static bool IsValidDomain(string address, int offset, bool checkLength, bool allowUTF8 = false)
        {
            if (string.IsNullOrEmpty(address) || (checkLength && address.Length - offset > 255))
            {
                return(false);
            }
            MimeAddressParser.ValidationStage validationStage = MimeAddressParser.ValidationStage.DOMAIN;
            int  num  = 0;
            int  num2 = 0;
            int  num3 = 0;
            bool flag = false;
            int  num4 = 0;

            while (offset < address.Length && validationStage != MimeAddressParser.ValidationStage.ERROR)
            {
                char c = address[offset];
                offset++;
                switch (validationStage)
                {
                case MimeAddressParser.ValidationStage.DOMAIN:
                    if (c == '[')
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL;
                        continue;
                    }
                    if ((c < '\u0080' && MimeScan.IsAlphaOrDigit((byte)c)) || (c >= '\u0080' && allowUTF8) || c == '-' || c == '_')
                    {
                        num4            = offset;
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_SUB;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_SUB:
                    if (c == '.')
                    {
                        if (checkLength && offset - num4 > 63)
                        {
                            return(false);
                        }
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_DOT;
                        continue;
                    }
                    else if ((c < '\u0080' && MimeScan.IsAlphaOrDigit((byte)c)) || (c >= '\u0080' && allowUTF8) || c == '-' || c == '_')
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_SUB;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_DOT:
                    if ((c < '\u0080' && MimeScan.IsAlphaOrDigit((byte)c)) || (c >= '\u0080' && allowUTF8) || c == '-' || c == '_')
                    {
                        num4            = offset;
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_SUB;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL:
                    if (c < '\u0080' && MimeScan.IsDigit((byte)c))
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV4;
                        num             = 1;
                        num2            = 1;
                        num3            = (int)(c - '0');
                        continue;
                    }
                    if (c == 'I' || c == 'i')
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_I;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV4:
                    if (c < '\u0080' && MimeScan.IsDigit((byte)c) && num2 < 3)
                    {
                        num2++;
                        num3 = num3 * 10 + (int)(c - '0');
                        if (num3 <= 255)
                        {
                            validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV4;
                            continue;
                        }
                    }
                    else
                    {
                        if (c == '.')
                        {
                            validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV4_DOT;
                            continue;
                        }
                        if (c == ']' && num == 4)
                        {
                            validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_END;
                            continue;
                        }
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV4_DOT:
                    if (c < '\u0080' && MimeScan.IsDigit((byte)c) && num < 4)
                    {
                        num++;
                        num2            = 1;
                        num3            = (int)(c - '0');
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV4;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_I:
                    if (c == 'P' || c == 'p')
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IP;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IP:
                    if (c == 'v' || c == 'V')
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV:
                    if (c == '6')
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6:
                    if (c == ':')
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_:
                    if (c < '\u0080' && MimeScan.IsHex((byte)c))
                    {
                        flag            = false;
                        num             = 1;
                        num2            = 1;
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_GRP;
                        continue;
                    }
                    if (c == ':')
                    {
                        num             = 0;
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_STARTCOLON;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_STARTCOLON:
                    if (c == ':')
                    {
                        flag            = true;
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_COMP;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_GRP:
                    if (c < '\u0080' && MimeScan.IsHex((byte)c) && num2 < 4)
                    {
                        num2++;
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_GRP;
                        continue;
                    }
                    if (c == ':')
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_COLON;
                        continue;
                    }
                    if (c == ']' && ((!flag && num == 8) || (flag && num <= 6)))
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_END;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_V4GRP:
                    if (c < '\u0080' && MimeScan.IsDigit((byte)c) && num2 < 3)
                    {
                        num2++;
                        num3            = num3 * 10 + (int)(c - '0');
                        validationStage = ((num3 <= 255) ? MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_V4GRP : MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_GRP);
                        continue;
                    }
                    if (c < '\u0080' && MimeScan.IsHex((byte)c) && num2 < 4)
                    {
                        num2++;
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_GRP;
                        continue;
                    }
                    if (c == ':')
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_COLON;
                        continue;
                    }
                    if (c == '.')
                    {
                        num             = 1;
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV4_DOT;
                        continue;
                    }
                    if (c == ']' && flag && num <= 6)
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_END;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_COLON:
                    if ((c < '\u0080' && MimeScan.IsDigit((byte)c) && !flag && num == 6) || (flag && num <= 4))
                    {
                        num++;
                        num2            = 1;
                        num3            = (int)(c - '0');
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_V4GRP;
                        continue;
                    }
                    if ((c < '\u0080' && MimeScan.IsHex((byte)c) && !flag && num < 8) || (flag && num < 6))
                    {
                        num++;
                        num2            = 1;
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_GRP;
                        continue;
                    }
                    if (c == ':' && !flag && num <= 6)
                    {
                        flag            = true;
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_COMP;
                        continue;
                    }
                    break;

                case MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_COMP:
                    if (c < '\u0080' && MimeScan.IsHex((byte)c) && num < 6)
                    {
                        num++;
                        num2            = 1;
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_IPV6_GRP;
                        continue;
                    }
                    if (c == ']')
                    {
                        validationStage = MimeAddressParser.ValidationStage.DOMAIN_LITERAL_END;
                        continue;
                    }
                    break;
                }
                validationStage = MimeAddressParser.ValidationStage.ERROR;
            }
            return(validationStage == MimeAddressParser.ValidationStage.DOMAIN_LITERAL_END || (validationStage == MimeAddressParser.ValidationStage.DOMAIN_SUB && (!checkLength || offset - num4 < 63)));
        }