Mercurial > hg > nginx
annotate src/mail/ngx_mail_smtp_handler.c @ 4192:61e4af19df9f
Autoindex: escape '?' in file names.
For files with '?' in their names autoindex generated links with '?' not
escaped. This resulted in effectively truncated links as '?' indicates
query string start.
This is an updated version of the patch originally posted at [1]. It
introduces generic NGX_ESCAPE_URI_COMPONENT which escapes everything but
unreserved characters as per RFC 3986. This approach also renders unneeded
special colon processing (as colon is percent-encoded now), it's dropped
accordingly.
[1] http://nginx.org/pipermail/nginx-devel/2010-February/000112.html
Reported by Konstantin Leonov.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Tue, 11 Oct 2011 17:56:51 +0000 |
parents | dd1570b6f237 |
children | d620f497c50f |
rev | line source |
---|---|
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
1 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
2 /* |
444
42d11f017717
nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents:
441
diff
changeset
|
3 * Copyright (C) Igor Sysoev |
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
4 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
5 |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
6 |
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
7 #include <ngx_config.h> |
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
8 #include <ngx_core.h> |
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
9 #include <ngx_event.h> |
1136 | 10 #include <ngx_mail.h> |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
11 #include <ngx_mail_smtp_module.h> |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
12 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
13 |
1892
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
14 static void ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx); |
2488
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
15 static void ngx_mail_smtp_resolve_name(ngx_event_t *rev); |
1892
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
16 static void ngx_mail_smtp_resolve_name_handler(ngx_resolver_ctx_t *ctx); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
17 static void ngx_mail_smtp_greeting(ngx_mail_session_t *s, ngx_connection_t *c); |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
18 static void ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev); |
1483
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
19 static ngx_int_t ngx_mail_smtp_create_buffer(ngx_mail_session_t *s, |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
20 ngx_connection_t *c); |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
21 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
22 static ngx_int_t ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c); |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
23 static ngx_int_t ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c); |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
24 static ngx_int_t ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c); |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
25 static ngx_int_t ngx_mail_smtp_starttls(ngx_mail_session_t *s, |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
26 ngx_connection_t *c); |
2309 | 27 static ngx_int_t ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c); |
28 static ngx_int_t ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c); | |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
29 |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
30 static ngx_int_t ngx_mail_smtp_discard_command(ngx_mail_session_t *s, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
31 ngx_connection_t *c, char *err); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
32 static void ngx_mail_smtp_log_rejected_command(ngx_mail_session_t *s, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
33 ngx_connection_t *c, char *err); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
34 |
527 | 35 |
1136 | 36 static u_char smtp_ok[] = "250 2.0.0 OK" CRLF; |
37 static u_char smtp_bye[] = "221 2.0.0 Bye" CRLF; | |
1762 | 38 static u_char smtp_starttls[] = "220 2.0.0 Start TLS" CRLF; |
1136 | 39 static u_char smtp_next[] = "334 " CRLF; |
40 static u_char smtp_username[] = "334 VXNlcm5hbWU6" CRLF; | |
41 static u_char smtp_password[] = "334 UGFzc3dvcmQ6" CRLF; | |
42 static u_char smtp_invalid_command[] = "500 5.5.1 Invalid command" CRLF; | |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
43 static u_char smtp_invalid_pipelining[] = |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
44 "503 5.5.0 Improper use of SMTP command pipelining" CRLF; |
1136 | 45 static u_char smtp_invalid_argument[] = "501 5.5.4 Invalid argument" CRLF; |
46 static u_char smtp_auth_required[] = "530 5.7.1 Authentication required" CRLF; | |
2309 | 47 static u_char smtp_bad_sequence[] = "503 5.5.1 Bad sequence of commands" CRLF; |
1136 | 48 |
521 | 49 |
1892
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
50 static ngx_str_t smtp_unavailable = ngx_string("[UNAVAILABLE]"); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
51 static ngx_str_t smtp_tempunavail = ngx_string("[TEMPUNAVAIL]"); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
52 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
53 |
521 | 54 void |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
55 ngx_mail_smtp_init_session(ngx_mail_session_t *s, ngx_connection_t *c) |
413
de9d4726e28a
nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
56 { |
1892
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
57 struct sockaddr_in *sin; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
58 ngx_resolver_ctx_t *ctx; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
59 ngx_mail_core_srv_conf_t *cscf; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
60 |
1896
4c060e30476b
do not resolve SMTP clients by default
Igor Sysoev <igor@sysoev.ru>
parents:
1892
diff
changeset
|
61 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); |
1892
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
62 |
1896
4c060e30476b
do not resolve SMTP clients by default
Igor Sysoev <igor@sysoev.ru>
parents:
1892
diff
changeset
|
63 if (cscf->resolver == NULL) { |
4c060e30476b
do not resolve SMTP clients by default
Igor Sysoev <igor@sysoev.ru>
parents:
1892
diff
changeset
|
64 s->host = smtp_unavailable; |
4c060e30476b
do not resolve SMTP clients by default
Igor Sysoev <igor@sysoev.ru>
parents:
1892
diff
changeset
|
65 ngx_mail_smtp_greeting(s, c); |
4c060e30476b
do not resolve SMTP clients by default
Igor Sysoev <igor@sysoev.ru>
parents:
1892
diff
changeset
|
66 return; |
4c060e30476b
do not resolve SMTP clients by default
Igor Sysoev <igor@sysoev.ru>
parents:
1892
diff
changeset
|
67 } |
4c060e30476b
do not resolve SMTP clients by default
Igor Sysoev <igor@sysoev.ru>
parents:
1892
diff
changeset
|
68 |
2855
a96a8c916b0c
mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents:
2495
diff
changeset
|
69 if (c->sockaddr->sa_family != AF_INET) { |
a96a8c916b0c
mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents:
2495
diff
changeset
|
70 s->host = smtp_tempunavail; |
a96a8c916b0c
mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents:
2495
diff
changeset
|
71 ngx_mail_smtp_greeting(s, c); |
a96a8c916b0c
mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents:
2495
diff
changeset
|
72 return; |
a96a8c916b0c
mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents:
2495
diff
changeset
|
73 } |
a96a8c916b0c
mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents:
2495
diff
changeset
|
74 |
1896
4c060e30476b
do not resolve SMTP clients by default
Igor Sysoev <igor@sysoev.ru>
parents:
1892
diff
changeset
|
75 c->log->action = "in resolving client address"; |
1892
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
76 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
77 ctx = ngx_resolve_start(cscf->resolver, NULL); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
78 if (ctx == NULL) { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
79 ngx_mail_close_connection(c); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
80 return; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
81 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
82 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
83 /* AF_INET only */ |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
84 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
85 sin = (struct sockaddr_in *) c->sockaddr; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
86 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
87 ctx->addr = sin->sin_addr.s_addr; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
88 ctx->handler = ngx_mail_smtp_resolve_addr_handler; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
89 ctx->data = s; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
90 ctx->timeout = cscf->resolver_timeout; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
91 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
92 if (ngx_resolve_addr(ctx) != NGX_OK) { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
93 ngx_mail_close_connection(c); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
94 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
95 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
96 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
97 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
98 static void |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
99 ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx) |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
100 { |
2488
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
101 ngx_connection_t *c; |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
102 ngx_mail_session_t *s; |
1892
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
103 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
104 s = ctx->data; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
105 c = s->connection; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
106 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
107 if (ctx->state) { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
108 ngx_log_error(NGX_LOG_ERR, c->log, 0, |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
109 "%V could not be resolved (%i: %s)", |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
110 &c->addr_text, ctx->state, |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
111 ngx_resolver_strerror(ctx->state)); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
112 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
113 if (ctx->state == NGX_RESOLVE_NXDOMAIN) { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
114 s->host = smtp_unavailable; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
115 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
116 } else { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
117 s->host = smtp_tempunavail; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
118 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
119 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
120 ngx_resolve_addr_done(ctx); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
121 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
122 ngx_mail_smtp_greeting(s, s->connection); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
123 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
124 return; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
125 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
126 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
127 c->log->action = "in resolving client hostname"; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
128 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
129 s->host.data = ngx_pstrdup(c->pool, &ctx->name); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
130 if (s->host.data == NULL) { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
131 ngx_resolve_addr_done(ctx); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
132 ngx_mail_close_connection(c); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
133 return; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
134 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
135 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
136 s->host.len = ctx->name.len; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
137 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
138 ngx_resolve_addr_done(ctx); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
139 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
140 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
141 "address resolved: %V", &s->host); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
142 |
2488
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
143 c->read->handler = ngx_mail_smtp_resolve_name; |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
144 |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
145 ngx_post_event(c->read, &ngx_posted_events); |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
146 } |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
147 |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
148 |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
149 static void |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
150 ngx_mail_smtp_resolve_name(ngx_event_t *rev) |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
151 { |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
152 ngx_connection_t *c; |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
153 ngx_mail_session_t *s; |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
154 ngx_resolver_ctx_t *ctx; |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
155 ngx_mail_core_srv_conf_t *cscf; |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
156 |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
157 c = rev->data; |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
158 s = c->data; |
ac695b3e981c
avoid deep nested calls, flatten call tree
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
159 |
1892
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
160 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
161 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
162 ctx = ngx_resolve_start(cscf->resolver, NULL); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
163 if (ctx == NULL) { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
164 ngx_mail_close_connection(c); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
165 return; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
166 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
167 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
168 ctx->name = s->host; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
169 ctx->type = NGX_RESOLVE_A; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
170 ctx->handler = ngx_mail_smtp_resolve_name_handler; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
171 ctx->data = s; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
172 ctx->timeout = cscf->resolver_timeout; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
173 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
174 if (ngx_resolve_name(ctx) != NGX_OK) { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
175 ngx_mail_close_connection(c); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
176 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
177 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
178 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
179 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
180 static void |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
181 ngx_mail_smtp_resolve_name_handler(ngx_resolver_ctx_t *ctx) |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
182 { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
183 in_addr_t addr; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
184 ngx_uint_t i; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
185 ngx_connection_t *c; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
186 struct sockaddr_in *sin; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
187 ngx_mail_session_t *s; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
188 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
189 s = ctx->data; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
190 c = s->connection; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
191 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
192 if (ctx->state) { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
193 ngx_log_error(NGX_LOG_ERR, c->log, 0, |
3299
0b6277a58a2d
*) fix resolving an empty name ("."),
Igor Sysoev <igor@sysoev.ru>
parents:
3298
diff
changeset
|
194 "\"%V\" could not be resolved (%i: %s)", |
1892
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
195 &ctx->name, ctx->state, |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
196 ngx_resolver_strerror(ctx->state)); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
197 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
198 if (ctx->state == NGX_RESOLVE_NXDOMAIN) { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
199 s->host = smtp_unavailable; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
200 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
201 } else { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
202 s->host = smtp_tempunavail; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
203 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
204 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
205 } else { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
206 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
207 /* AF_INET only */ |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
208 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
209 sin = (struct sockaddr_in *) c->sockaddr; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
210 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
211 for (i = 0; i < ctx->naddrs; i++) { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
212 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
213 addr = ctx->addrs[i]; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
214 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
215 ngx_log_debug4(NGX_LOG_DEBUG_MAIL, c->log, 0, |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
216 "name was resolved to %ud.%ud.%ud.%ud", |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
217 (ntohl(addr) >> 24) & 0xff, |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
218 (ntohl(addr) >> 16) & 0xff, |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
219 (ntohl(addr) >> 8) & 0xff, |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
220 ntohl(addr) & 0xff); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
221 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
222 if (addr == sin->sin_addr.s_addr) { |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
223 goto found; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
224 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
225 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
226 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
227 s->host = smtp_unavailable; |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
228 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
229 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
230 found: |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
231 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
232 ngx_resolve_name_done(ctx); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
233 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
234 ngx_mail_smtp_greeting(s, c); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
235 } |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
236 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
237 |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
238 static void |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
239 ngx_mail_smtp_greeting(ngx_mail_session_t *s, ngx_connection_t *c) |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
240 { |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
241 ngx_msec_t timeout; |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
242 ngx_mail_core_srv_conf_t *cscf; |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
243 ngx_mail_smtp_srv_conf_t *sscf; |
641 | 244 |
1892
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
245 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
246 "smtp greeting for \"%V\"", &s->host); |
057d362ee50e
resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents:
1762
diff
changeset
|
247 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
248 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
249 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); |
541 | 250 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
251 timeout = sscf->greeting_delay ? sscf->greeting_delay : cscf->timeout; |
1486
0e7074ef7303
style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents:
1485
diff
changeset
|
252 ngx_add_timer(c->read, timeout); |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
253 |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2309
diff
changeset
|
254 if (ngx_handle_read_event(c->read, 0) != NGX_OK) { |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
255 ngx_mail_close_connection(c); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
256 } |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
257 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
258 if (sscf->greeting_delay) { |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
259 c->read->handler = ngx_mail_smtp_invalid_pipelining; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
260 return; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
261 } |
1480
a231e37a19ab
move event handling to protocol specific code,
Igor Sysoev <igor@sysoev.ru>
parents:
1479
diff
changeset
|
262 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
263 c->read->handler = ngx_mail_smtp_init_protocol; |
583 | 264 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
265 s->out = sscf->greeting; |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
266 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
267 ngx_mail_send(c->write); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
268 } |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
269 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
270 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
271 static void |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
272 ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev) |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
273 { |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
274 ngx_connection_t *c; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
275 ngx_mail_session_t *s; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
276 ngx_mail_core_srv_conf_t *cscf; |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
277 ngx_mail_smtp_srv_conf_t *sscf; |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
278 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
279 c = rev->data; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
280 s = c->data; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
281 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
282 c->log->action = "in delay pipelining state"; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
283 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
284 if (rev->timedout) { |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
285 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
286 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "delay greeting"); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
287 |
1484 | 288 rev->timedout = 0; |
289 | |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
290 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); |
1480
a231e37a19ab
move event handling to protocol specific code,
Igor Sysoev <igor@sysoev.ru>
parents:
1479
diff
changeset
|
291 |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
292 c->read->handler = ngx_mail_smtp_init_protocol; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
293 |
1486
0e7074ef7303
style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents:
1485
diff
changeset
|
294 ngx_add_timer(c->read, cscf->timeout); |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
295 |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2309
diff
changeset
|
296 if (ngx_handle_read_event(c->read, 0) != NGX_OK) { |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
297 ngx_mail_close_connection(c); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
298 return; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
299 } |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
300 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
301 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
302 |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
303 s->out = sscf->greeting; |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
304 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
305 } else { |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
306 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
307 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "invalid pipelining"); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
308 |
1483
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
309 if (s->buffer == NULL) { |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
310 if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) { |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
311 return; |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
312 } |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
313 } |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
314 |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
315 if (ngx_mail_smtp_discard_command(s, c, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
316 "client was rejected before greeting: \"%V\"") |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
317 != NGX_OK) |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
318 { |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
319 return; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
320 } |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
321 |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
322 ngx_str_set(&s->out, smtp_invalid_pipelining); |
1480
a231e37a19ab
move event handling to protocol specific code,
Igor Sysoev <igor@sysoev.ru>
parents:
1479
diff
changeset
|
323 } |
539 | 324 |
1136 | 325 ngx_mail_send(c->write); |
539 | 326 } |
327 | |
328 | |
329 void | |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
330 ngx_mail_smtp_init_protocol(ngx_event_t *rev) |
539 | 331 { |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
332 ngx_connection_t *c; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
333 ngx_mail_session_t *s; |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
334 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
335 c = rev->data; |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
336 |
541 | 337 c->log->action = "in auth state"; |
338 | |
423
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
339 if (rev->timedout) { |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
340 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); |
577 | 341 c->timedout = 1; |
1136 | 342 ngx_mail_close_connection(c); |
423
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
343 return; |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
344 } |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
345 |
539 | 346 s = c->data; |
521 | 347 |
1483
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
348 if (s->buffer == NULL) { |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
349 if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) { |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
350 return; |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
351 } |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
352 } |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
353 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
354 s->mail_state = ngx_smtp_start; |
1477 | 355 c->read->handler = ngx_mail_smtp_auth_state; |
1136 | 356 |
1477 | 357 ngx_mail_smtp_auth_state(rev); |
521 | 358 } |
359 | |
360 | |
1483
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
361 static ngx_int_t |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
362 ngx_mail_smtp_create_buffer(ngx_mail_session_t *s, ngx_connection_t *c) |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
363 { |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
364 ngx_mail_smtp_srv_conf_t *sscf; |
1483
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
365 |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
366 if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) == NGX_ERROR) { |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
367 ngx_mail_session_internal_server_error(s); |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
368 return NGX_ERROR; |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
369 } |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
370 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
371 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); |
1483
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
372 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
373 s->buffer = ngx_create_temp_buf(c->pool, sscf->client_buffer_size); |
1483
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
374 if (s->buffer == NULL) { |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
375 ngx_mail_session_internal_server_error(s); |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
376 return NGX_ERROR; |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
377 } |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
378 |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
379 return NGX_OK; |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
380 } |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
381 |
46f364406994
ngx_mail_smtp_create_buffer()
Igor Sysoev <igor@sysoev.ru>
parents:
1482
diff
changeset
|
382 |
527 | 383 void |
1477 | 384 ngx_mail_smtp_auth_state(ngx_event_t *rev) |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
385 { |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
386 ngx_int_t rc; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
387 ngx_connection_t *c; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
388 ngx_mail_session_t *s; |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
389 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
390 c = rev->data; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
391 s = c->data; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
392 |
1136 | 393 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp auth state"); |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
394 |
423
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
395 if (rev->timedout) { |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
396 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); |
577 | 397 c->timedout = 1; |
1136 | 398 ngx_mail_close_connection(c); |
423
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
399 return; |
fda5987b188d
nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
400 } |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
401 |
539 | 402 if (s->out.len) { |
1136 | 403 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp send handler busy"); |
539 | 404 s->blocked = 1; |
405 return; | |
406 } | |
407 | |
408 s->blocked = 0; | |
409 | |
1482 | 410 rc = ngx_mail_read_command(s, c); |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
411 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
412 if (rc == NGX_AGAIN || rc == NGX_ERROR) { |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
413 return; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
414 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
415 |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
416 ngx_str_set(&s->out, smtp_ok); |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
417 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
418 if (rc == NGX_OK) { |
1136 | 419 switch (s->mail_state) { |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
420 |
1136 | 421 case ngx_smtp_start: |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
422 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
423 switch (s->command) { |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
424 |
1136 | 425 case NGX_SMTP_HELO: |
426 case NGX_SMTP_EHLO: | |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
427 rc = ngx_mail_smtp_helo(s, c); |
809 | 428 break; |
429 | |
1136 | 430 case NGX_SMTP_AUTH: |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
431 rc = ngx_mail_smtp_auth(s, c); |
800 | 432 break; |
433 | |
1136 | 434 case NGX_SMTP_QUIT: |
539 | 435 s->quit = 1; |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
436 ngx_str_set(&s->out, smtp_bye); |
527 | 437 break; |
438 | |
1136 | 439 case NGX_SMTP_MAIL: |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
440 rc = ngx_mail_smtp_mail(s, c); |
583 | 441 break; |
442 | |
2309 | 443 case NGX_SMTP_RCPT: |
444 rc = ngx_mail_smtp_rcpt(s, c); | |
445 break; | |
446 | |
447 case NGX_SMTP_RSET: | |
448 rc = ngx_mail_smtp_rset(s, c); | |
449 break; | |
450 | |
1136 | 451 case NGX_SMTP_NOOP: |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
452 break; |
1322 | 453 |
454 case NGX_SMTP_STARTTLS: | |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
455 rc = ngx_mail_smtp_starttls(s, c); |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
456 ngx_str_set(&s->out, smtp_starttls); |
1322 | 457 break; |
458 | |
459 default: | |
460 rc = NGX_MAIL_PARSE_INVALID_COMMAND; | |
461 break; | |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
462 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
463 |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
464 break; |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
465 |
1136 | 466 case ngx_smtp_auth_login_username: |
2495
a59b26eee816
compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents:
2488
diff
changeset
|
467 rc = ngx_mail_auth_login_username(s, c, 0); |
809 | 468 |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
469 ngx_str_set(&s->out, smtp_password); |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
470 s->mail_state = ngx_smtp_auth_login_password; |
809 | 471 break; |
472 | |
1136 | 473 case ngx_smtp_auth_login_password: |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
474 rc = ngx_mail_auth_login_password(s, c); |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
475 break; |
809 | 476 |
1136 | 477 case ngx_smtp_auth_plain: |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
478 rc = ngx_mail_auth_plain(s, c, 0); |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
479 break; |
809 | 480 |
1136 | 481 case ngx_smtp_auth_cram_md5: |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
482 rc = ngx_mail_auth_cram_md5(s, c); |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
483 break; |
421
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
484 } |
01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
420
diff
changeset
|
485 } |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
486 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
487 switch (rc) { |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
488 |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
489 case NGX_DONE: |
1482 | 490 ngx_mail_auth(s, c); |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
491 return; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
492 |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
493 case NGX_ERROR: |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
494 ngx_mail_session_internal_server_error(s); |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
495 return; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
496 |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
497 case NGX_MAIL_PARSE_INVALID_COMMAND: |
1136 | 498 s->mail_state = ngx_smtp_start; |
1486
0e7074ef7303
style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents:
1485
diff
changeset
|
499 s->state = 0; |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
500 ngx_str_set(&s->out, smtp_invalid_command); |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
501 |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
502 /* fall through */ |
539 | 503 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
504 case NGX_OK: |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
505 s->args.nelts = 0; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
506 s->buffer->pos = s->buffer->start; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
507 s->buffer->last = s->buffer->start; |
810 | 508 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
509 if (s->state) { |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
510 s->arg_start = s->buffer->start; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
511 } |
539 | 512 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
513 ngx_mail_send(c->write); |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
514 } |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
515 } |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
516 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
517 |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
518 static ngx_int_t |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
519 ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c) |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
520 { |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
521 ngx_str_t *arg; |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
522 ngx_mail_smtp_srv_conf_t *sscf; |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
523 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
524 if (s->args.nelts != 1) { |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
525 ngx_str_set(&s->out, smtp_invalid_argument); |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
526 s->state = 0; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
527 return NGX_OK; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
528 } |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
529 |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
530 arg = s->args.elts; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
531 |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
532 s->smtp_helo.len = arg[0].len; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
533 |
2049 | 534 s->smtp_helo.data = ngx_pnalloc(c->pool, arg[0].len); |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
535 if (s->smtp_helo.data == NULL) { |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
536 return NGX_ERROR; |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
537 } |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
538 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
539 ngx_memcpy(s->smtp_helo.data, arg[0].data, arg[0].len); |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
540 |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
541 ngx_str_null(&s->smtp_from); |
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
542 ngx_str_null(&s->smtp_to); |
2309 | 543 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
544 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
545 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
546 if (s->command == NGX_SMTP_HELO) { |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
547 s->out = sscf->server_name; |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
548 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
549 } else { |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
550 s->esmtp = 1; |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
551 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
552 #if (NGX_MAIL_SSL) |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
553 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
554 if (c->ssl == NULL) { |
1704
e584e946e198
move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents:
1493
diff
changeset
|
555 ngx_mail_ssl_conf_t *sslcf; |
e584e946e198
move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents:
1493
diff
changeset
|
556 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
557 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
558 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
559 if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) { |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
560 s->out = sscf->starttls_capability; |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
561 return NGX_OK; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
562 } |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
563 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
564 if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
565 s->out = sscf->starttls_only_capability; |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
566 return NGX_OK; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
567 } |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
568 } |
894
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
569 #endif |
4f7dca9c37f0
workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
570 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
571 s->out = sscf->capability; |
420
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
572 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
573 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
574 return NGX_OK; |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
575 } |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
576 |
33a8253115b4
nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
419
diff
changeset
|
577 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
578 static ngx_int_t |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
579 ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c) |
525 | 580 { |
1479 | 581 ngx_int_t rc; |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
582 ngx_mail_core_srv_conf_t *cscf; |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
583 ngx_mail_smtp_srv_conf_t *sscf; |
525 | 584 |
1479 | 585 #if (NGX_MAIL_SSL) |
586 if (ngx_mail_starttls_only(s, c)) { | |
587 return NGX_MAIL_PARSE_INVALID_COMMAND; | |
539 | 588 } |
589 #endif | |
590 | |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
591 if (s->args.nelts == 0) { |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
592 ngx_str_set(&s->out, smtp_invalid_argument); |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
593 s->state = 0; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
594 return NGX_OK; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
595 } |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
596 |
1479 | 597 rc = ngx_mail_auth_parse(s, c); |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
598 |
1479 | 599 switch (rc) { |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
600 |
1479 | 601 case NGX_MAIL_AUTH_LOGIN: |
1472
32450a2bbdf4
decrement active connection counter in mail proxy
Igor Sysoev <igor@sysoev.ru>
parents:
1323
diff
changeset
|
602 |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
603 ngx_str_set(&s->out, smtp_username); |
1479 | 604 s->mail_state = ngx_smtp_auth_login_username; |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
605 |
1479 | 606 return NGX_OK; |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
607 |
2495
a59b26eee816
compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents:
2488
diff
changeset
|
608 case NGX_MAIL_AUTH_LOGIN_USERNAME: |
a59b26eee816
compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents:
2488
diff
changeset
|
609 |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
610 ngx_str_set(&s->out, smtp_password); |
2495
a59b26eee816
compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents:
2488
diff
changeset
|
611 s->mail_state = ngx_smtp_auth_login_password; |
a59b26eee816
compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents:
2488
diff
changeset
|
612 |
a59b26eee816
compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents:
2488
diff
changeset
|
613 return ngx_mail_auth_login_username(s, c, 1); |
a59b26eee816
compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents:
2488
diff
changeset
|
614 |
1479 | 615 case NGX_MAIL_AUTH_PLAIN: |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
616 |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
617 ngx_str_set(&s->out, smtp_next); |
1479 | 618 s->mail_state = ngx_smtp_auth_plain; |
543 | 619 |
1479 | 620 return NGX_OK; |
621 | |
622 case NGX_MAIL_AUTH_CRAM_MD5: | |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
623 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
624 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
625 |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
626 if (!(sscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
627 return NGX_MAIL_PARSE_INVALID_COMMAND; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
628 } |
479 | 629 |
1485
b3488fc2675a
create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents:
1484
diff
changeset
|
630 if (s->salt.data == NULL) { |
1487
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
631 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); |
f69493e8faab
ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents:
1486
diff
changeset
|
632 |
1485
b3488fc2675a
create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents:
1484
diff
changeset
|
633 if (ngx_mail_salt(s, c, cscf) != NGX_OK) { |
b3488fc2675a
create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents:
1484
diff
changeset
|
634 return NGX_ERROR; |
b3488fc2675a
create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents:
1484
diff
changeset
|
635 } |
b3488fc2675a
create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents:
1484
diff
changeset
|
636 } |
b3488fc2675a
create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents:
1484
diff
changeset
|
637 |
1479 | 638 if (ngx_mail_auth_cram_md5_salt(s, c, "334 ", 4) == NGX_OK) { |
639 s->mail_state = ngx_smtp_auth_cram_md5; | |
640 return NGX_OK; | |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
641 } |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
642 |
1479 | 643 return NGX_ERROR; |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
644 } |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
645 |
1479 | 646 return rc; |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
647 } |
539 | 648 |
649 | |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
650 static ngx_int_t |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
651 ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c) |
541 | 652 { |
2309 | 653 u_char ch; |
654 ngx_str_t l; | |
655 ngx_uint_t i; | |
656 ngx_mail_smtp_srv_conf_t *sscf; | |
657 | |
658 sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); | |
659 | |
660 if (!(sscf->auth_methods & NGX_MAIL_AUTH_NONE_ENABLED)) { | |
661 ngx_mail_smtp_log_rejected_command(s, c, "client was rejected: \"%V\""); | |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
662 ngx_str_set(&s->out, smtp_auth_required); |
2309 | 663 return NGX_OK; |
664 } | |
665 | |
666 /* auth none */ | |
667 | |
668 if (s->smtp_from.len) { | |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
669 ngx_str_set(&s->out, smtp_bad_sequence); |
2309 | 670 return NGX_OK; |
671 } | |
672 | |
673 l.len = s->buffer->last - s->buffer->start; | |
674 l.data = s->buffer->start; | |
675 | |
676 for (i = 0; i < l.len; i++) { | |
677 ch = l.data[i]; | |
678 | |
679 if (ch != CR && ch != LF) { | |
680 continue; | |
681 } | |
682 | |
683 l.data[i] = ' '; | |
684 } | |
685 | |
686 while (i) { | |
687 if (l.data[i - 1] != ' ') { | |
688 break; | |
689 } | |
690 | |
691 i--; | |
692 } | |
693 | |
694 l.len = i; | |
695 | |
696 s->smtp_from.len = l.len; | |
697 | |
698 s->smtp_from.data = ngx_pnalloc(c->pool, l.len); | |
699 if (s->smtp_from.data == NULL) { | |
700 return NGX_ERROR; | |
701 } | |
702 | |
703 ngx_memcpy(s->smtp_from.data, l.data, l.len); | |
704 | |
705 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, | |
706 "smtp mail from:\"%V\"", &s->smtp_from); | |
707 | |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
708 ngx_str_set(&s->out, smtp_ok); |
2309 | 709 |
710 return NGX_OK; | |
711 } | |
577 | 712 |
2309 | 713 |
714 static ngx_int_t | |
715 ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c) | |
716 { | |
717 u_char ch; | |
718 ngx_str_t l; | |
719 ngx_uint_t i; | |
720 | |
721 if (s->smtp_from.len == 0) { | |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
722 ngx_str_set(&s->out, smtp_bad_sequence); |
2309 | 723 return NGX_OK; |
724 } | |
725 | |
726 l.len = s->buffer->last - s->buffer->start; | |
727 l.data = s->buffer->start; | |
728 | |
729 for (i = 0; i < l.len; i++) { | |
730 ch = l.data[i]; | |
731 | |
732 if (ch != CR && ch != LF) { | |
733 continue; | |
734 } | |
735 | |
736 l.data[i] = ' '; | |
737 } | |
738 | |
739 while (i) { | |
740 if (l.data[i - 1] != ' ') { | |
741 break; | |
742 } | |
743 | |
744 i--; | |
745 } | |
746 | |
747 l.len = i; | |
748 | |
749 s->smtp_to.len = l.len; | |
750 | |
751 s->smtp_to.data = ngx_pnalloc(c->pool, l.len); | |
752 if (s->smtp_to.data == NULL) { | |
753 return NGX_ERROR; | |
754 } | |
755 | |
756 ngx_memcpy(s->smtp_to.data, l.data, l.len); | |
757 | |
758 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, | |
759 "smtp rcpt to:\"%V\"", &s->smtp_to); | |
760 | |
761 s->auth_method = NGX_MAIL_AUTH_NONE; | |
762 | |
763 return NGX_DONE; | |
764 } | |
765 | |
766 | |
767 static ngx_int_t | |
768 ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c) | |
769 { | |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
770 ngx_str_null(&s->smtp_from); |
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
771 ngx_str_null(&s->smtp_to); |
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
772 ngx_str_set(&s->out, smtp_ok); |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
773 |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
774 return NGX_OK; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
775 } |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
776 |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
777 |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
778 static ngx_int_t |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
779 ngx_mail_smtp_starttls(ngx_mail_session_t *s, ngx_connection_t *c) |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
780 { |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
781 #if (NGX_MAIL_SSL) |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
782 ngx_mail_ssl_conf_t *sslcf; |
541 | 783 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
784 if (c->ssl == NULL) { |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
785 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
786 if (sslcf->starttls) { |
541 | 787 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
788 /* |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
789 * RFC3207 requires us to discard any knowledge |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
790 * obtained from client before STARTTLS. |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
791 */ |
541 | 792 |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
793 ngx_str_null(&s->smtp_helo); |
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
794 ngx_str_null(&s->smtp_from); |
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3299
diff
changeset
|
795 ngx_str_null(&s->smtp_to); |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
796 |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
797 c->read->handler = ngx_mail_starttls_handler; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
798 return NGX_OK; |
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
799 } |
541 | 800 } |
801 | |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
802 #endif |
541 | 803 |
1476
67578e966dcc
split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents:
1472
diff
changeset
|
804 return NGX_MAIL_PARSE_INVALID_COMMAND; |
541 | 805 } |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
806 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
807 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
808 static ngx_int_t |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
809 ngx_mail_smtp_discard_command(ngx_mail_session_t *s, ngx_connection_t *c, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
810 char *err) |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
811 { |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
812 ssize_t n; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
813 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
814 n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
815 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
816 if (n == NGX_ERROR || n == 0) { |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
817 ngx_mail_close_connection(c); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
818 return NGX_ERROR; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
819 } |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
820 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
821 if (n > 0) { |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
822 s->buffer->last += n; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
823 } |
1486
0e7074ef7303
style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents:
1485
diff
changeset
|
824 |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
825 if (n == NGX_AGAIN) { |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2309
diff
changeset
|
826 if (ngx_handle_read_event(c->read, 0) != NGX_OK) { |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
827 ngx_mail_session_internal_server_error(s); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
828 return NGX_ERROR; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
829 } |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
830 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
831 return NGX_AGAIN; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
832 } |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
833 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
834 ngx_mail_smtp_log_rejected_command(s, c, err); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
835 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
836 s->buffer->pos = s->buffer->start; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
837 s->buffer->last = s->buffer->start; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
838 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
839 return NGX_OK; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
840 } |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
841 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
842 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
843 static void |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
844 ngx_mail_smtp_log_rejected_command(ngx_mail_session_t *s, ngx_connection_t *c, |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
845 char *err) |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
846 { |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
847 u_char ch; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
848 ngx_str_t cmd; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
849 ngx_uint_t i; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
850 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
851 if (c->log->log_level < NGX_LOG_INFO) { |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
852 return; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
853 } |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
854 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
855 cmd.len = s->buffer->last - s->buffer->start; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
856 cmd.data = s->buffer->start; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
857 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
858 for (i = 0; i < cmd.len; i++) { |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
859 ch = cmd.data[i]; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
860 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
861 if (ch != CR && ch != LF) { |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
862 continue; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
863 } |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
864 |
1493
3c4111e07b58
use "_" instead of " " as new line substitute, do not delete trailing new line
Igor Sysoev <igor@sysoev.ru>
parents:
1487
diff
changeset
|
865 cmd.data[i] = '_'; |
1481
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
866 } |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
867 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
868 cmd.len = i; |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
869 |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
870 ngx_log_error(NGX_LOG_INFO, c->log, 0, err, &cmd); |
b58ce1cf66da
smtp_client_buffer and smtp_greeting_delay
Igor Sysoev <igor@sysoev.ru>
parents:
1480
diff
changeset
|
871 } |