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