annotate src/mail/ngx_mail_imap_handler.c @ 9234:c690a902bfec

Mail: handling of read buffer filled with commands. If the whole read buffer was filled with commands during authentication, exactly matching the buffer boundary, this did not cause the "client sent too long command" error, but might result in read events being disabled for the connection, notably with level-triggered event methods, leading to a connection hang. Fix is to ensure that s->blocked is set in case of c->read->ready, so command reading is resumed after sending responses to previous commands.
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 30 Mar 2024 05:05:05 +0300
parents b38728495e1a
children d7fd0acdea64
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3516
diff changeset
4 * Copyright (C) Nginx, Inc.
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
5 */
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
6
413
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_event.h>
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
11 #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
12 #include <ngx_mail_imap_module.h>
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
13
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
14
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
15 static ngx_int_t ngx_mail_imap_login(ngx_mail_session_t *s,
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
16 ngx_connection_t *c);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
17 static ngx_int_t ngx_mail_imap_authenticate(ngx_mail_session_t *s,
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
18 ngx_connection_t *c);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
19 static ngx_int_t ngx_mail_imap_capability(ngx_mail_session_t *s,
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
20 ngx_connection_t *c);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
21 static ngx_int_t ngx_mail_imap_starttls(ngx_mail_session_t *s,
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
22 ngx_connection_t *c);
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
23
413
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
25 static u_char imap_greeting[] = "* OK IMAP4 ready" CRLF;
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
26 static u_char imap_star[] = "* ";
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
27 static u_char imap_ok[] = "OK completed" CRLF;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
28 static u_char imap_next[] = "+ OK" CRLF;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
29 static u_char imap_plain_next[] = "+ " CRLF;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
30 static u_char imap_username[] = "+ VXNlcm5hbWU6" CRLF;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
31 static u_char imap_password[] = "+ UGFzc3dvcmQ6" CRLF;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
32 static u_char imap_bye[] = "* BYE" CRLF;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
33 static u_char imap_invalid_command[] = "BAD invalid command" CRLF;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
34
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
35
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
36 void
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
37 ngx_mail_imap_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
38 {
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
39 ngx_mail_core_srv_conf_t *cscf;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
40
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
41 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
42
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
43 ngx_str_set(&s->out, imap_greeting);
1480
a231e37a19ab move event handling to protocol specific code,
Igor Sysoev <igor@sysoev.ru>
parents: 1479
diff changeset
44
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
45 c->read->handler = ngx_mail_imap_init_protocol;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
46
1486
0e7074ef7303 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1485
diff changeset
47 ngx_add_timer(c->read, cscf->timeout);
1480
a231e37a19ab move event handling to protocol specific code,
Igor Sysoev <igor@sysoev.ru>
parents: 1479
diff changeset
48
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
49 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
1480
a231e37a19ab move event handling to protocol specific code,
Igor Sysoev <igor@sysoev.ru>
parents: 1479
diff changeset
50 ngx_mail_close_connection(c);
a231e37a19ab move event handling to protocol specific code,
Igor Sysoev <igor@sysoev.ru>
parents: 1479
diff changeset
51 }
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
52
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
53 ngx_mail_send(c->write);
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
54 }
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
55
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
56
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
57 void
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
58 ngx_mail_imap_init_protocol(ngx_event_t *rev)
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
59 {
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
60 ngx_connection_t *c;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
61 ngx_mail_session_t *s;
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1486
diff changeset
62 ngx_mail_imap_srv_conf_t *iscf;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
63
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
64 c = rev->data;
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
65
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
66 c->log->action = "in auth state";
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
67
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
68 if (rev->timedout) {
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
69 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
70 c->timedout = 1;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
71 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
72 return;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
73 }
420
33a8253115b4 nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
74
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
75 s = c->data;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
76
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
77 if (s->buffer == NULL) {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
78 if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t))
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
79 == NGX_ERROR)
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
80 {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
81 ngx_mail_session_internal_server_error(s);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
82 return;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
83 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
84
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1486
diff changeset
85 iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
86
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1486
diff changeset
87 s->buffer = ngx_create_temp_buf(c->pool, iscf->client_buffer_size);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
88 if (s->buffer == NULL) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
89 ngx_mail_session_internal_server_error(s);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
90 return;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
91 }
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
92 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
93
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
94 s->mail_state = ngx_imap_start;
1477
59e1caf2be94 style fix and optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1476
diff changeset
95 c->read->handler = ngx_mail_imap_auth_state;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
96
1477
59e1caf2be94 style fix and optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1476
diff changeset
97 ngx_mail_imap_auth_state(rev);
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
98 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
99
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
100
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
101 void
1477
59e1caf2be94 style fix and optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1476
diff changeset
102 ngx_mail_imap_auth_state(ngx_event_t *rev)
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
103 {
7841
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7790
diff changeset
104 u_char *p;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
105 ngx_int_t rc;
7841
ccdf83bee8c1 Mail: fixed backslash handling in IMAP literals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7790
diff changeset
106 ngx_uint_t tag;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
107 ngx_connection_t *c;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
108 ngx_mail_session_t *s;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
109
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
110 c = rev->data;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
111 s = c->data;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
112
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
113 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth state");
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
114
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
115 if (rev->timedout) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
116 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
117 c->timedout = 1;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
118 ngx_mail_close_connection(c);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
119 return;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
120 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
121
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
122 if (s->out.len) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
123 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap send handler busy");
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
124 s->blocked = 1;
7789
ab6257dac2a8 Mail: added missing event handling after blocking events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6869
diff changeset
125
ab6257dac2a8 Mail: added missing event handling after blocking events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6869
diff changeset
126 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
ab6257dac2a8 Mail: added missing event handling after blocking events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6869
diff changeset
127 ngx_mail_close_connection(c);
ab6257dac2a8 Mail: added missing event handling after blocking events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6869
diff changeset
128 return;
ab6257dac2a8 Mail: added missing event handling after blocking events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6869
diff changeset
129 }
ab6257dac2a8 Mail: added missing event handling after blocking events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6869
diff changeset
130
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
131 return;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
132 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
133
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
134 s->blocked = 0;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
135
1482
4606dce4f416 optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1480
diff changeset
136 rc = ngx_mail_read_command(s, c);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
137
7790
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
138 if (rc == NGX_AGAIN) {
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
139 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
140 ngx_mail_session_internal_server_error(s);
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
141 return;
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
142 }
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
143
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
144 return;
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
145 }
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
146
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
147 if (rc == NGX_ERROR) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
148 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
149 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
150
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
151 tag = 1;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
152 s->text.len = 0;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
153 ngx_str_set(&s->out, imap_ok);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
154
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
155 if (rc == NGX_OK) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
156
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
157 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth command: %i",
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
158 s->command);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
159
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
160 switch (s->mail_state) {
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
161
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
162 case ngx_imap_start:
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
163
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
164 switch (s->command) {
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
165
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
166 case NGX_IMAP_LOGIN:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
167 rc = ngx_mail_imap_login(s, c);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
168 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
169
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
170 case NGX_IMAP_AUTHENTICATE:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
171 rc = ngx_mail_imap_authenticate(s, c);
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
172 tag = (rc != NGX_OK);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
173 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
174
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
175 case NGX_IMAP_CAPABILITY:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
176 rc = ngx_mail_imap_capability(s, c);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
177 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
178
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
179 case NGX_IMAP_LOGOUT:
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
180 s->quit = 1;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
181 ngx_str_set(&s->text, imap_bye);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
182 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
183
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
184 case NGX_IMAP_NOOP:
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
185 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
186
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
187 case NGX_IMAP_STARTTLS:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
188 rc = ngx_mail_imap_starttls(s, c);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
189 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
190
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
191 default:
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
192 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
193 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
194 }
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
195
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
196 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
197
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
198 case ngx_imap_auth_login_username:
2495
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
199 rc = ngx_mail_auth_login_username(s, c, 0);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
200
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
201 tag = 0;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
202 ngx_str_set(&s->out, imap_password);
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
203 s->mail_state = ngx_imap_auth_login_password;
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
204
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
205 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
206
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
207 case ngx_imap_auth_login_password:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
208 rc = ngx_mail_auth_login_password(s, c);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
209 break;
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
210
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
211 case ngx_imap_auth_plain:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
212 rc = ngx_mail_auth_plain(s, c, 0);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
213 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
214
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
215 case ngx_imap_auth_cram_md5:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
216 rc = ngx_mail_auth_cram_md5(s, c);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
217 break;
6774
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
218
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
219 case ngx_imap_auth_external:
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
220 rc = ngx_mail_auth_external(s, c, 0);
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
221 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
222 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
223
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
224 } else if (rc == NGX_IMAP_NEXT) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
225 tag = 0;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
226 ngx_str_set(&s->out, imap_next);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
227 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
228
9234
c690a902bfec Mail: handling of read buffer filled with commands.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7843
diff changeset
229 if (s->buffer->pos < s->buffer->last || c->read->ready) {
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
230 s->blocked = 1;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
231 }
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
232
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
233 switch (rc) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
234
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
235 case NGX_DONE:
1482
4606dce4f416 optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1480
diff changeset
236 ngx_mail_auth(s, c);
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
237 return;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
238
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
239 case NGX_ERROR:
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
240 ngx_mail_session_internal_server_error(s);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
241 return;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
242
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
243 case NGX_MAIL_PARSE_INVALID_COMMAND:
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
244 s->state = 0;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
245 ngx_str_set(&s->out, imap_invalid_command);
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
246 s->mail_state = ngx_imap_start;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
247 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
248 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
249
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
250 if (tag) {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
251 if (s->tag.len == 0) {
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
252 ngx_str_set(&s->tag, imap_star);
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
253 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
254
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
255 if (s->tagged_line.len < s->tag.len + s->text.len + s->out.len) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
256 s->tagged_line.len = s->tag.len + s->text.len + s->out.len;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
257 s->tagged_line.data = ngx_pnalloc(c->pool, s->tagged_line.len);
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
258 if (s->tagged_line.data == NULL) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
259 ngx_mail_close_connection(c);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
260 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
261 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
262 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
263
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
264 p = s->tagged_line.data;
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
265
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
266 if (s->text.len) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
267 p = ngx_cpymem(p, s->text.data, s->text.len);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
268 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
269
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
270 p = ngx_cpymem(p, s->tag.data, s->tag.len);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
271 ngx_memcpy(p, s->out.data, s->out.len);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
272
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
273 s->out.len = s->text.len + s->tag.len + s->out.len;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
274 s->out.data = s->tagged_line.data;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
275 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
276
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
277 if (rc != NGX_IMAP_NEXT) {
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
278 s->args.nelts = 0;
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
279
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
280 if (s->state) {
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
281 /* preserve tag */
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
282 s->arg_start = s->buffer->pos;
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
283
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
284 } else {
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
285 if (s->buffer->pos == s->buffer->last) {
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
286 s->buffer->pos = s->buffer->start;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
287 s->buffer->last = s->buffer->start;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
288 }
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
289
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
290 s->tag.len = 0;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
291 }
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
292 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
293
7790
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
294 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
295 ngx_mail_session_internal_server_error(s);
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
296 return;
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
297 }
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
298
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
299 ngx_mail_send(c->write);
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
300 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
301
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
302
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
303 static ngx_int_t
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
304 ngx_mail_imap_login(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
305 {
1704
e584e946e198 move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents: 1487
diff changeset
306 ngx_str_t *arg;
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
307
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
308 #if (NGX_MAIL_SSL)
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
309 if (ngx_mail_starttls_only(s, c)) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
310 return NGX_MAIL_PARSE_INVALID_COMMAND;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
311 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
312 #endif
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
313
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
314 arg = s->args.elts;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
315
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
316 if (s->args.nelts != 2 || arg[0].len == 0) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
317 return NGX_MAIL_PARSE_INVALID_COMMAND;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
318 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
319
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
320 s->login.len = arg[0].len;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
321 s->login.data = ngx_pnalloc(c->pool, s->login.len);
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
322 if (s->login.data == NULL) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
323 return NGX_ERROR;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
324 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
325
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
326 ngx_memcpy(s->login.data, arg[0].data, s->login.len);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
327
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
328 s->passwd.len = arg[1].len;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
329 s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len);
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
330 if (s->passwd.data == NULL) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
331 return NGX_ERROR;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
332 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
333
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
334 ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
335
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
336 #if (NGX_DEBUG_MAIL_PASSWD)
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
337 ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
338 "imap login:\"%V\" passwd:\"%V\"",
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
339 &s->login, &s->passwd);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
340 #else
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
341 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
342 "imap login:\"%V\"", &s->login);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
343 #endif
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
344
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
345 return NGX_DONE;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
346 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
347
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
348
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
349 static ngx_int_t
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
350 ngx_mail_imap_authenticate(ngx_mail_session_t *s, ngx_connection_t *c)
420
33a8253115b4 nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
351 {
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
352 ngx_int_t rc;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
353 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
354 ngx_mail_imap_srv_conf_t *iscf;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
355
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
356 #if (NGX_MAIL_SSL)
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
357 if (ngx_mail_starttls_only(s, c)) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
358 return NGX_MAIL_PARSE_INVALID_COMMAND;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
359 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
360 #endif
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
361
6869
b2915d99ee8d Mail: make it possible to disable SASL EXTERNAL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6774
diff changeset
362 iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);
b2915d99ee8d Mail: make it possible to disable SASL EXTERNAL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6774
diff changeset
363
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
364 rc = ngx_mail_auth_parse(s, c);
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
365
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
366 switch (rc) {
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
367
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
368 case NGX_MAIL_AUTH_LOGIN:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
369
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
370 ngx_str_set(&s->out, imap_username);
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
371 s->mail_state = ngx_imap_auth_login_username;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
372
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
373 return NGX_OK;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
374
2495
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
375 case NGX_MAIL_AUTH_LOGIN_USERNAME:
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
376
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
377 ngx_str_set(&s->out, imap_password);
2495
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
378 s->mail_state = ngx_imap_auth_login_password;
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
379
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
380 return ngx_mail_auth_login_username(s, c, 1);
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
381
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
382 case NGX_MAIL_AUTH_PLAIN:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
383
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
384 ngx_str_set(&s->out, imap_plain_next);
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
385 s->mail_state = ngx_imap_auth_plain;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
386
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
387 return NGX_OK;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
388
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
389 case NGX_MAIL_AUTH_CRAM_MD5:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
390
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1486
diff changeset
391 if (!(iscf->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
392 return NGX_MAIL_PARSE_INVALID_COMMAND;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
393 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
394
1485
b3488fc2675a create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents: 1482
diff changeset
395 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
396 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
397
1485
b3488fc2675a create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents: 1482
diff changeset
398 if (ngx_mail_salt(s, c, cscf) != NGX_OK) {
b3488fc2675a create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents: 1482
diff changeset
399 return NGX_ERROR;
b3488fc2675a create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents: 1482
diff changeset
400 }
b3488fc2675a create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents: 1482
diff changeset
401 }
b3488fc2675a create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents: 1482
diff changeset
402
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
403 if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
404 s->mail_state = ngx_imap_auth_cram_md5;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
405 return NGX_OK;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
406 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
407
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
408 return NGX_ERROR;
6774
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
409
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
410 case NGX_MAIL_AUTH_EXTERNAL:
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
411
6869
b2915d99ee8d Mail: make it possible to disable SASL EXTERNAL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6774
diff changeset
412 if (!(iscf->auth_methods & NGX_MAIL_AUTH_EXTERNAL_ENABLED)) {
b2915d99ee8d Mail: make it possible to disable SASL EXTERNAL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6774
diff changeset
413 return NGX_MAIL_PARSE_INVALID_COMMAND;
b2915d99ee8d Mail: make it possible to disable SASL EXTERNAL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6774
diff changeset
414 }
b2915d99ee8d Mail: make it possible to disable SASL EXTERNAL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6774
diff changeset
415
6774
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
416 ngx_str_set(&s->out, imap_username);
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
417 s->mail_state = ngx_imap_auth_external;
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
418
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
419 return NGX_OK;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
420 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
421
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
422 return rc;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
423 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
424
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
425
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
426 static ngx_int_t
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
427 ngx_mail_imap_capability(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
428 {
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1486
diff changeset
429 ngx_mail_imap_srv_conf_t *iscf;
420
33a8253115b4 nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
430
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1486
diff changeset
431 iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);
809
da9c1521319d AUTH PLAIN LOGIN CRAM-MD5
Igor Sysoev <igor@sysoev.ru>
parents: 800
diff changeset
432
1322
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1286
diff changeset
433 #if (NGX_MAIL_SSL)
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1286
diff changeset
434
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
435 if (c->ssl == NULL) {
1704
e584e946e198 move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents: 1487
diff changeset
436 ngx_mail_ssl_conf_t *sslcf;
e584e946e198 move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents: 1487
diff changeset
437
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
438 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);
809
da9c1521319d AUTH PLAIN LOGIN CRAM-MD5
Igor Sysoev <igor@sysoev.ru>
parents: 800
diff changeset
439
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
440 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
441 s->text = iscf->starttls_capability;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
442 return NGX_OK;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
443 }
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
444
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
445 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
446 s->text = iscf->starttls_only_capability;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
447 return NGX_OK;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
448 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
449 }
1322
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1286
diff changeset
450 #endif
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1286
diff changeset
451
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1486
diff changeset
452 s->text = iscf->capability;
894
4f7dca9c37f0 workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
453
4f7dca9c37f0 workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
454 return NGX_OK;
4f7dca9c37f0 workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
455 }
4f7dca9c37f0 workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
456
4f7dca9c37f0 workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
457
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
458 static ngx_int_t
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
459 ngx_mail_imap_starttls(ngx_mail_session_t *s, ngx_connection_t *c)
420
33a8253115b4 nginx-0.0.10-2004-09-09-22:55:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
460 {
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
461 #if (NGX_MAIL_SSL)
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
462 ngx_mail_ssl_conf_t *sslcf;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
463
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
464 if (c->ssl == NULL) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
465 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
466 if (sslcf->starttls) {
7843
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
467 s->buffer->pos = s->buffer->start;
b38728495e1a Mail: IMAP pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7841
diff changeset
468 s->buffer->last = s->buffer->start;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
469 c->read->handler = ngx_mail_starttls_handler;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
470 return NGX_OK;
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
471 }
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
472 }
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
473
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
474 #endif
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
475
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
476 return NGX_MAIL_PARSE_INVALID_COMMAND;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
477 }