Ejemplo n.º 1
0
        internal SmtpCommand MakeRcpt(TokenEnumerator enumerator)
        {
            enumerator.Consume(1);
            enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
            if (enumerator.Consume(1) != new Token(TokenKind.Text, "TO") || enumerator.Consume(1) != new Token(TokenKind.Punctuation, ":"))
            {
                return(MakeInvalid(SmtpReplyCode.SyntaxError, "missing the TO:"));
            }
            enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
            MailAddress address;

            return(!_parser.TryMakePath(enumerator, out address) ? MakeInvalid(SmtpReplyCode.SyntaxError, ""): new RcptCommand(address, _server.ValidateRecipient));
        }
Ejemplo n.º 2
0
 internal bool TryMakeAddressLiteral(TokenEnumerator enumerator, out string address)
 {
     address = null;
     if (enumerator.Consume(1) != new Token(TokenKind.Punctuation, "["))
     {
         return(false);
     }
     enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
     if (!TryMake <string>(enumerator, new TryMakeDelegate <string>(TryMakeIpv4AddressLiteral), out address))
     {
         return(false);
     }
     enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
     return(!(enumerator.Consume(1) != new Token(TokenKind.Punctuation, "]")) && address != null);
 }
Ejemplo n.º 3
0
        internal SmtpCommand MakeHelo(TokenEnumerator enumerator)
        {
            enumerator.Consume(1);
            enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
            string domain;

            return(!_parser.TryMakeDomain(enumerator, out domain)? MakeInvalid(SmtpReplyCode.SyntaxError, "") : new HeloCommand(domain));
        }
Ejemplo n.º 4
0
 internal SmtpCommand MakeStartTls(TokenEnumerator enumerator)
 {
     enumerator.Consume(1);
     enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
     if (enumerator.Count > 1)
     {
         return(MakeInvalid(SmtpReplyCode.SyntaxError, ""));
     }
     return(new StartTlsCommand(_server.ServerCertificate));
 }
Ejemplo n.º 5
0
 internal SmtpCommand MakeDbug(TokenEnumerator enumerator)
 {
     enumerator.Consume(1);
     enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
     if (enumerator.Count > 1)
     {
         return(MakeInvalid(SmtpReplyCode.SyntaxError, ""));
     }
     return(new DbugCommand());
 }
Ejemplo n.º 6
0
 internal bool TryMakeMailParameters(TokenEnumerator enumerator, out IDictionary <string, string> parameters)
 {
     parameters = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);
     while (enumerator.Peek(0).Kind != TokenKind.None)
     {
         KeyValuePair <string, string> item;
         if (!TryMake <KeyValuePair <string, string> >(enumerator, new TryMakeDelegate <KeyValuePair <string, string> >(TryMakeEsmtpParameter), out item))
         {
             return(false);
         }
         parameters.Add(item);
         enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
     }
     return(parameters.Count > 0);
 }
Ejemplo n.º 7
0
        internal SmtpCommand MakeMail(TokenEnumerator enumerator)
        {
            enumerator.Consume(1);
            enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
            if (enumerator.Consume(1) != new Token(TokenKind.Text, "FROM") || enumerator.Consume(1) != new Token(TokenKind.Punctuation, ":"))
            {
                return(MakeInvalid(SmtpReplyCode.SyntaxError, "missing the FROM:"));
            }
            enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);

            MailAddress address;

            if (!_parser.TryMakeReversePath(enumerator, out address))
            {
                return(MakeInvalid(SmtpReplyCode.SyntaxError, ""));
            }
            IDictionary <string, string> parameters;

            if (!_parser.TryMakeMailParameters(enumerator, out parameters))
            {
                parameters = new Dictionary <string, string>();
            }
            return(new MailCommand(address, parameters, _server.ValidateFrom, 0));
        }
Ejemplo n.º 8
0
        internal SmtpCommand MakeEhlo(TokenEnumerator enumerator)
        {
            enumerator.Consume(1);
            enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
            string domainOrAddress;

            if (_parser.TryMakeDomain(enumerator, out domainOrAddress))
            {
                return(new EhloCommand(domainOrAddress, _server));
            }
            string domainOrAddress2;

            if (_parser.TryMakeAddressLiteral(enumerator, out domainOrAddress2))
            {
                return(new EhloCommand(domainOrAddress2, _server));
            }
            return(MakeInvalid(SmtpReplyCode.SyntaxError, ""));
        }
Ejemplo n.º 9
0
        internal SmtpCommand MakeAuth(TokenEnumerator enumerator)
        {
            enumerator.Consume(1);
            enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
            AuthenticationMethod method;

            if (!Enum.TryParse(enumerator.Peek(0).Text, true, out method))
            {
                return(MakeInvalid(SmtpReplyCode.SyntaxError, ""));
            }
            enumerator.Consume(1);
            string parameter = null;

            if (enumerator.Count > 0 && !_parser.TryMakeBase64(enumerator, out parameter))
            {
                return(MakeInvalid(SmtpReplyCode.SyntaxError, ""));
            }
            return(new AuthCommand(_server.UserAuthenticator, method, parameter));
        }
Ejemplo n.º 10
0
 internal SmtpCommand MakeRset(TokenEnumerator enumerator)
 {
     enumerator.Consume(1);
     enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
     return(enumerator.Count > 1 ? MakeInvalid(SmtpReplyCode.SyntaxError, ""): new RsetCommand());
 }
Ejemplo n.º 11
0
 internal SmtpCommand MakeData(TokenEnumerator enumerator)
 {
     enumerator.Consume(1);
     enumerator.ConsumeWhile((Token t) => t.Kind == TokenKind.Space);
     return(enumerator.Count > 1 ? MakeInvalid(SmtpReplyCode.SyntaxError, ""): new DataCommand(_server.OnMessageArrived));
 }