Beispiel #1
0
        internal override void ParseRecordData(DomainName origin, string[] stringRepresentation)
        {
            if (stringRepresentation.Length < 9)
            {
                throw new FormatException();
            }

            TypeCovered         = RecordTypeHelper.ParseShortString(stringRepresentation[0]);
            Algorithm           = (DnsSecAlgorithm)Byte.Parse(stringRepresentation[1]);
            Labels              = Byte.Parse(stringRepresentation[2]);
            OriginalTimeToLive  = Int32.Parse(stringRepresentation[3]);
            SignatureExpiration = DateTime.ParseExact(stringRepresentation[4], "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
            SignatureInception  = DateTime.ParseExact(stringRepresentation[5], "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
            KeyTag              = UInt16.Parse(stringRepresentation[6]);
            SignersName         = ParseDomainName(origin, stringRepresentation[7]);
            Signature           = String.Join(String.Empty, stringRepresentation.Skip(8)).FromBase64String();
        }
Beispiel #2
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", StringComparison.InvariantCultureIgnoreCase))
                    {
                        origin = DomainName.ParseFromMasterfile(parts[1]);
                    }
                    if (parts[0].Equals("$ttl", StringComparison.InvariantCultureIgnoreCase))
                    {
                        ttl = Int32.Parse(parts[1]);
                    }
                    if (parts[0].Equals("$include", StringComparison.InvariantCultureIgnoreCase))
                    {
                        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;

                        using (StreamReader includeReader = new StreamReader(path))
                        {
                            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);
        }