Exemplo n.º 1
0
        private static void ProcessControlDirective(DnsZoneParseContext context)
        {
            var token     = context.Tokens.Dequeue();
            var directive = token.StringValue;

            switch (directive.ToUpperInvariant())
            {
            case "ORIGIN":
                context.Origin = context.ReadAndResolveDomainName();
                break;

            case "INCLUDE":
                var firstToken  = context.Tokens.Dequeue();
                var secondToken = context.Tokens.Dequeue();
                if (secondToken.Type == TokenType.NewLine)
                {
                    ProcessIncludeDirective(context, context.Origin, firstToken.StringValue);
                }
                else
                {
                    context.Tokens.Dequeue();     //end of line
                    ProcessIncludeDirective(context, secondToken.StringValue, firstToken.StringValue);
                }
                break;

            case "TTL":
                context.DefaultTtl = context.ReadTimeSpan();
                break;

            default:
                throw new NotSupportedException($"Unknown control directive '{directive}'");
            }
        }
Exemplo n.º 2
0
        private static void Process(DnsZoneParseContext context)
        {
            while (!context.IsEof)
            {
                var token = context.Tokens.Peek();
                switch (token.Type)
                {
                case TokenType.NewLine:
                    context.Tokens.Dequeue();
                    break;

                case TokenType.Control:
                    ProcessControlDirective(context);
                    break;

                case TokenType.Whitespace:
                case TokenType.Literal:
                    ParseResourceRecord(context);
                    break;

                default:
                    throw new NotSupportedException($"not supported type {token.Type}");
                }
            }
        }
Exemplo n.º 3
0
        private static void ProcessIncludeDirective(DnsZoneParseContext context, string origin, string fileName)
        {
            var childContext = context.CreateChildContext(fileName);

            childContext.Origin = context.ResolveDomainName(origin);
            Process(childContext);
            context.Zone.Add(childContext.Zone);
        }
Exemplo n.º 4
0
        public static DnsZoneFile Parse(IDnsSource source)
        {
            var tokenizer  = new Tokenizer();
            var fileSource = new FileSource {
                Content = source.LoadContent(null)
            };
            var tokens  = tokenizer.Read(fileSource).ToArray();
            var context = new DnsZoneParseContext(tokens, source);

            Process(context);
            return(context.Zone);
        }
Exemplo n.º 5
0
        private static void ParseResourceRecord(DnsZoneParseContext context)
        {
            string   @class;
            TimeSpan?ttl;

            var nameToken = context.Tokens.Dequeue();
            var name      = nameToken.Type != TokenType.Whitespace ? nameToken.StringValue : "";

            if (context.TryParseClass(out @class))
            {
                context.TryParseTtl(out ttl);
            }
            else if (context.TryParseTtl(out ttl))
            {
                context.TryParseClass(out @class);
            }

            var type = context.ReadResourceRecordType();

            //An RRT.NULL return  indicates we encountered some kind of
            //whitespace instead of the ReadResourceRecordType.
            if (type == ResourceRecordType.NULL)
            {
                return;
            }

            string domainName;

            try {
                domainName = context.ResolveDomainName(!string.IsNullOrWhiteSpace(name) ? name : context.PrevName);
            } catch (ArgumentException exc) {
                throw new TokenException(exc.Message, nameToken);
            }
            var record = DnsZoneUtils.CreateRecord(type);

            record.Name  = domainName;
            record.Class = !string.IsNullOrWhiteSpace(@class) ? @class : context.PrevClass;
            record.Ttl   = context.GetTimeSpan(ttl);

            record.AcceptVistor(_reader, context);

            context.Zone.Records.Add(record);

            context.PrevName = name;

            if (!string.IsNullOrWhiteSpace(@class))
            {
                context.PrevClass = @class;
            }
        }
Exemplo n.º 6
0
        private static void ParseResourceRecord(DnsZoneParseContext context)
        {
            string   @class;
            TimeSpan?ttl;

            var nameToken = context.Tokens.Dequeue();
            var name      = nameToken.Type != TokenType.Whitespace ? nameToken.StringValue : "";

            if (context.TryParseClass(out @class))
            {
                context.TryParseTtl(out ttl);
            }
            else if (context.TryParseTtl(out ttl))
            {
                context.TryParseClass(out @class);
            }

            var type = context.ReadResourceRecordType();

            var record = DnsZoneUtils.CreateRecord(type);

            record.Name  = context.ResolveDomainName(!string.IsNullOrWhiteSpace(name) ? name : context.PrevName);
            record.Class = !string.IsNullOrWhiteSpace(@class) ? @class : context.PrevClass;
            record.Ttl   = context.GetTimeSpan(ttl);

            record.AcceptVistor(_reader, context);

            context.Zone.Records.Add(record);

            context.PrevName = name;

            if (!string.IsNullOrWhiteSpace(@class))
            {
                context.PrevClass = @class;
            }
        }
Exemplo n.º 7
0
        private static void ParseResourceRecord(DnsZoneParseContext context)
        {
            string   @class = null;
            TimeSpan?ttl    = null;

            if (context.Tokens.Count == 0)
            {
                return;
            }

            string name      = null;
            var    nameToken = context.Tokens.Dequeue();

            if (nameToken.Type == TokenType.Literal)
            {
                name = nameToken.StringValue;
            }
            else if (nameToken.Type == TokenType.Whitespace)
            {
                var preview = context.Tokens.Peek();
                if (preview.Type == TokenType.NewLine || preview.Type == TokenType.NewLine)
                {
                    context.Tokens.Dequeue();
                    return;
                }
                name = "";
            }
            else if (nameToken.Type == TokenType.Comments)
            {
                return;
            }
            else if (nameToken.Type == TokenType.NewLine)
            {
                return;
            }

            while (@class == null || ttl == null)
            {
                if (context.Tokens.Count == 0)
                {
                    if (string.IsNullOrWhiteSpace(name))
                    {
                        return;
                    }
                    else
                    {
                        throw new TokenException("missing record type", nameToken);
                    }
                }
                var token = context.Tokens.Peek();
                if (token.Type == TokenType.Literal)
                {
                    if (@class == null)
                    {
                        if (context.TryParseClass(out @class))
                        {
                            continue;
                        }
                    }
                    if (@ttl == null)
                    {
                        if (context.TryParseTtl(out ttl))
                        {
                            continue;
                        }
                    }
                    break;
                }
                else if (token.Type == TokenType.Comments || token.Type == TokenType.NewLine)
                {
                    throw new TokenException("missing record type", token);
                }
                else
                {
                    throw new TokenException("unexpected token", token);
                }
            }

            var type = context.ReadResourceRecordType();

            string domainName;

            try {
                domainName = context.ResolveDomainName(!string.IsNullOrWhiteSpace(name) ? name : context.PrevName);
            } catch (ArgumentException exc) {
                throw new TokenException(exc.Message, nameToken);
            }
            var record = DnsZoneUtils.CreateRecord(type);

            record.Name  = domainName;
            record.Class = !string.IsNullOrWhiteSpace(@class) ? @class : context.PrevClass;
            record.Ttl   = context.GetTimeSpan(ttl);

            record.AcceptVistor(_reader, context);

            context.Zone.Records.Add(record);

            if (!string.IsNullOrWhiteSpace(name))
            {
                context.PrevName = name;
            }

            if (!string.IsNullOrWhiteSpace(@class))
            {
                context.PrevClass = @class;
            }
        }