public static RecordType ParseShortString(string s)
        {
            if (String.IsNullOrEmpty(s))
            {
                throw new ArgumentOutOfRangeException(nameof(s));
            }

            RecordType recordType;

            if (EnumHelper <RecordType> .TryParse(s, true, out recordType))
            {
                return(recordType);
            }

            if (s.StartsWith("TYPE", NetStandardExtensionFixes.GetDefaultIgnoreCaseComparison()))
            {
                ushort classValue;
                if (UInt16.TryParse(s.Substring(4), out classValue))
                {
                    return((RecordType)classValue);
                }
            }

            throw new ArgumentOutOfRangeException(nameof(s));
        }
        public static bool TryParseShortString(string s, out RecordType recordType)
        {
            if (String.IsNullOrEmpty(s))
            {
                recordType = RecordType.Invalid;
                return(false);
            }

            if (EnumHelper <RecordType> .TryParse(s, true, out recordType))
            {
                return(true);
            }

            if (s.StartsWith("TYPE", NetStandardExtensionFixes.GetDefaultIgnoreCaseComparison()))
            {
                ushort classValue;
                if (UInt16.TryParse(s.Substring(4), out classValue))
                {
                    recordType = (RecordType)classValue;
                    return(true);
                }
            }
            recordType = RecordType.Invalid;
            return(false);
        }
Exemple #3
0
        public static bool TryParseShortString(string s, out RecordClass recordClass, bool allowAny = true)
        {
            if (String.IsNullOrEmpty(s))
            {
                recordClass = RecordClass.Invalid;
                return(false);
            }

            switch (s.ToUpperInvariant())
            {
            case "IN":
                recordClass = RecordClass.INet;
                return(true);

            case "CH":
                recordClass = RecordClass.Chaos;
                return(true);

            case "HS":
                recordClass = RecordClass.Hesiod;
                return(true);

            case "NONE":
                recordClass = RecordClass.None;
                return(true);

            case "*":
                if (allowAny)
                {
                    recordClass = RecordClass.Any;
                    return(true);
                }
                else
                {
                    recordClass = RecordClass.Invalid;
                    return(false);
                }

            default:
                if (s.StartsWith("CLASS", NetStandardExtensionFixes.GetDefaultIgnoreCaseComparison()))
                {
                    ushort classValue;
                    if (UInt16.TryParse(s.Substring(5), out classValue))
                    {
                        recordClass = (RecordClass)classValue;
                        return(true);
                    }
                }
                recordClass = RecordClass.Invalid;
                return(false);
            }
        }
        internal override void ParseRecordData(DomainName origin, string[] stringRepresentation)
        {
            if (stringRepresentation.Length != 1)
            {
                throw new FormatException();
            }

            if (!stringRepresentation[0].StartsWith("0x", NetStandardExtensionFixes.GetDefaultIgnoreCaseComparison()))
            {
                throw new FormatException();
            }

            RecordData = stringRepresentation[0].Substring(2).Replace(".", String.Empty).FromBase16String();
        }
Exemple #5
0
        internal override void ParseRecordData(DomainName origin, string[] stringRepresentation)
        {
            var groups = _parserRegex
                         .Match(String.Join(" ", stringRepresentation))
                         .Groups;

            bool latNegative = groups["lat"].Value.Equals("S", NetStandardExtensionFixes.GetDefaultIgnoreCaseComparison());

            Latitude = new Degree(latNegative, groups["latd"].Value, groups["latm"].Value, groups["lats"].Value, groups["latms"].Value);

            bool longNegative = groups["long"].Value.Equals("W", NetStandardExtensionFixes.GetDefaultIgnoreCaseComparison());

            Longitude = new Degree(longNegative, groups["longd"].Value, groups["longm"].Value, groups["longs"].Value, groups["longms"].Value);

            Altitude            = Double.Parse(groups["alt"].Value, CultureInfo.InvariantCulture);
            Size                = String.IsNullOrEmpty(groups["size"].Value) ? 1 : Double.Parse(groups["size"].Value, CultureInfo.InvariantCulture);
            HorizontalPrecision = String.IsNullOrEmpty(groups["hp"].Value) ? 10000 : Double.Parse(groups["hp"].Value, CultureInfo.InvariantCulture);
            VerticalPrecision   = String.IsNullOrEmpty(groups["vp"].Value) ? 10 : Double.Parse(groups["vp"].Value, CultureInfo.InvariantCulture);
        }
Exemple #6
0
        private static List <DnsRecordBase> ParseRecords(StreamReader reader, DomainName origin, int ttl, DnsRecordBase lastRecord)
        {
            List <DnsRecordBase> records = new List <DnsRecordBase>();

            while (!reader.EndOfStream)
            {
                string line = ReadRecordLine(reader);

                if (!String.IsNullOrEmpty(line))
                {
                    string[] parts = _lineSplitterRegex.Matches(line).Cast <Match>().Select(x => x.Groups.Cast <Group>().Last(g => g.Success).Value.FromMasterfileLabelRepresentation()).ToArray();

                    if (parts[0].Equals("$origin", NetStandardExtensionFixes.GetDefaultIgnoreCaseComparison()))
                    {
                        origin = DomainName.ParseFromMasterfile(parts[1]);
                    }
                    if (parts[0].Equals("$ttl", NetStandardExtensionFixes.GetDefaultIgnoreCaseComparison()))
                    {
                        ttl = Int32.Parse(parts[1]);
                    }
                    if (parts[0].Equals("$include", NetStandardExtensionFixes.GetDefaultIgnoreCaseComparison()))
                    {
                        FileStream fileStream = reader.BaseStream as FileStream;

                        if (fileStream == null)
                        {
                            throw new NotSupportedException("Includes only supported when loading files");
                        }

                        // ReSharper disable once AssignNullToNotNullAttribute
                        string path = Path.Combine(new FileInfo(fileStream.Name).DirectoryName, parts[1]);

                        DomainName includeOrigin = (parts.Length > 2) ? DomainName.ParseFromMasterfile(parts[2]) : origin;

#if NETSTANDARD
                        using (var newFileStreamPath = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
                            using (StreamReader includeReader = new StreamReader(newFileStreamPath))
#else
                        using (StreamReader includeReader = new StreamReader(path))
#endif
                            {
                                records.AddRange(ParseRecords(includeReader, includeOrigin, ttl, lastRecord));
                            }
                    }
                    else
                    {
                        string      domainString;
                        RecordType  recordType;
                        RecordClass recordClass;
                        int         recordTtl;
                        string[]    rrData;

                        if (Int32.TryParse(parts[0], out recordTtl))
                        {
                            // no domain, starts with ttl
                            if (RecordClassHelper.TryParseShortString(parts[1], out recordClass, false))
                            {
                                // second is record class
                                domainString = null;
                                recordType   = RecordTypeHelper.ParseShortString(parts[2]);
                                rrData       = parts.Skip(3).ToArray();
                            }
                            else
                            {
                                // no record class
                                domainString = null;
                                recordClass  = RecordClass.Invalid;
                                recordType   = RecordTypeHelper.ParseShortString(parts[1]);
                                rrData       = parts.Skip(2).ToArray();
                            }
                        }
                        else if (RecordClassHelper.TryParseShortString(parts[0], out recordClass, false))
                        {
                            // no domain, starts with record class
                            if (Int32.TryParse(parts[1], out recordTtl))
                            {
                                // second is ttl
                                domainString = null;
                                recordType   = RecordTypeHelper.ParseShortString(parts[2]);
                                rrData       = parts.Skip(3).ToArray();
                            }
                            else
                            {
                                // no ttl
                                recordTtl    = 0;
                                domainString = null;
                                recordType   = RecordTypeHelper.ParseShortString(parts[1]);
                                rrData       = parts.Skip(2).ToArray();
                            }
                        }
                        else if (RecordTypeHelper.TryParseShortString(parts[0], out recordType))
                        {
                            // no domain, start with record type
                            recordTtl    = 0;
                            recordClass  = RecordClass.Invalid;
                            domainString = null;
                            rrData       = parts.Skip(2).ToArray();
                        }
                        else
                        {
                            domainString = parts[0];

                            if (Int32.TryParse(parts[1], out recordTtl))
                            {
                                // domain, second is ttl
                                if (RecordClassHelper.TryParseShortString(parts[2], out recordClass, false))
                                {
                                    // third is record class
                                    recordType = RecordTypeHelper.ParseShortString(parts[3]);
                                    rrData     = parts.Skip(4).ToArray();
                                }
                                else
                                {
                                    // no record class
                                    recordClass = RecordClass.Invalid;
                                    recordType  = RecordTypeHelper.ParseShortString(parts[2]);
                                    rrData      = parts.Skip(3).ToArray();
                                }
                            }
                            else if (RecordClassHelper.TryParseShortString(parts[1], out recordClass, false))
                            {
                                // domain, second is record class
                                if (Int32.TryParse(parts[2], out recordTtl))
                                {
                                    // third is ttl
                                    recordType = RecordTypeHelper.ParseShortString(parts[3]);
                                    rrData     = parts.Skip(4).ToArray();
                                }
                                else
                                {
                                    // no ttl
                                    recordTtl  = 0;
                                    recordType = RecordTypeHelper.ParseShortString(parts[2]);
                                    rrData     = parts.Skip(3).ToArray();
                                }
                            }
                            else
                            {
                                // domain with record type
                                recordType  = RecordTypeHelper.ParseShortString(parts[1]);
                                recordTtl   = 0;
                                recordClass = RecordClass.Invalid;
                                rrData      = parts.Skip(2).ToArray();
                            }
                        }

                        DomainName domain;
                        if (String.IsNullOrEmpty(domainString))
                        {
                            domain = lastRecord.Name;
                        }
                        else if (domainString == "@")
                        {
                            domain = origin;
                        }
                        else if (domainString.EndsWith("."))
                        {
                            domain = DomainName.ParseFromMasterfile(domainString);
                        }
                        else
                        {
                            domain = DomainName.ParseFromMasterfile(domainString) + origin;
                        }

                        if (recordClass == RecordClass.Invalid)
                        {
                            recordClass = lastRecord.RecordClass;
                        }

                        if (recordType == RecordType.Invalid)
                        {
                            recordType = lastRecord.RecordType;
                        }

                        if (recordTtl == 0)
                        {
                            recordTtl = ttl;
                        }
                        else
                        {
                            ttl = recordTtl;
                        }

                        lastRecord             = DnsRecordBase.Create(recordType);
                        lastRecord.RecordType  = recordType;
                        lastRecord.Name        = domain;
                        lastRecord.RecordClass = recordClass;
                        lastRecord.TimeToLive  = recordTtl;

                        if ((rrData.Length > 0) && (rrData[0] == @"\#"))
                        {
                            lastRecord.ParseUnknownRecordData(rrData);
                        }
                        else
                        {
                            lastRecord.ParseRecordData(origin, rrData);
                        }

                        records.Add(lastRecord);
                    }
                }
            }

            return(records);
        }