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(); }
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); }