annotate src/mail/ngx_mail_imap_handler.c @ 7790:da0a85e91587

Mail: added missing event handling after reading data. If we need to be notified about further events, ngx_handle_read_event() needs to be called after a read event is processed. Without this, an event can be removed from the kernel and won't be reported again, notably when using oneshot event methods, such as eventport on Solaris. For consistency, existing ngx_handle_read_event() call removed from ngx_mail_read_command(), as this call only covers one of the code paths where ngx_mail_read_command() returns NGX_AGAIN. Instead, appropriate processing added to the callers, covering all code paths where NGX_AGAIN is returned.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 05 Mar 2021 17:16:17 +0300
parents ab6257dac2a8
children ccdf83bee8c1
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 {
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
104 u_char *p, *dst, *src, *end;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
105 ngx_str_t *arg;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
106 ngx_int_t rc;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
107 ngx_uint_t tag, i;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
108 ngx_connection_t *c;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
109 ngx_mail_session_t *s;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
110
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
111 c = rev->data;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
112 s = c->data;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
113
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
114 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
115
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
116 if (rev->timedout) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
117 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
118 c->timedout = 1;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
119 ngx_mail_close_connection(c);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
120 return;
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
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
123 if (s->out.len) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
124 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
125 s->blocked = 1;
7789
ab6257dac2a8 Mail: added missing event handling after blocking events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6869
diff changeset
126
ab6257dac2a8 Mail: added missing event handling after blocking events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6869
diff changeset
127 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
128 ngx_mail_close_connection(c);
ab6257dac2a8 Mail: added missing event handling after blocking events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6869
diff changeset
129 return;
ab6257dac2a8 Mail: added missing event handling after blocking events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6869
diff changeset
130 }
ab6257dac2a8 Mail: added missing event handling after blocking events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6869
diff changeset
131
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
132 return;
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
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
135 s->blocked = 0;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
136
1482
4606dce4f416 optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1480
diff changeset
137 rc = ngx_mail_read_command(s, c);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
138
7790
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
139 if (rc == NGX_AGAIN) {
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
140 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
141 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
142 return;
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
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
145 return;
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
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
148 if (rc == NGX_ERROR) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
149 return;
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
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
152 tag = 1;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
153 s->text.len = 0;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
154 ngx_str_set(&s->out, imap_ok);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
155
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
156 if (rc == NGX_OK) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
157
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
158 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
159 s->command);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
160
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
161 if (s->backslash) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
162
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
163 arg = s->args.elts;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
164
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
165 for (i = 0; i < s->args.nelts; i++) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
166 dst = arg[i].data;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
167 end = dst + arg[i].len;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
168
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
169 for (src = dst; src < end; dst++) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
170 *dst = *src;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
171 if (*src++ == '\\') {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
172 *dst = *src++;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
173 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
174 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
175
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
176 arg[i].len = dst - arg[i].data;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
177 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
178
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
179 s->backslash = 0;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
180 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
181
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
182 switch (s->mail_state) {
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_start:
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
185
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
186 switch (s->command) {
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
187
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
188 case NGX_IMAP_LOGIN:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
189 rc = ngx_mail_imap_login(s, c);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
190 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
191
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
192 case NGX_IMAP_AUTHENTICATE:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
193 rc = ngx_mail_imap_authenticate(s, c);
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
194 tag = (rc != NGX_OK);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
195 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
196
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
197 case NGX_IMAP_CAPABILITY:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
198 rc = ngx_mail_imap_capability(s, c);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
199 break;
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 case NGX_IMAP_LOGOUT:
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
202 s->quit = 1;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
203 ngx_str_set(&s->text, imap_bye);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
204 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
205
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
206 case NGX_IMAP_NOOP:
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
207 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
208
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
209 case NGX_IMAP_STARTTLS:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
210 rc = ngx_mail_imap_starttls(s, c);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
211 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
212
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
213 default:
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
214 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
215 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
216 }
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
217
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
218 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
219
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
220 case ngx_imap_auth_login_username:
2495
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
221 rc = ngx_mail_auth_login_username(s, c, 0);
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
222
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
223 tag = 0;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
224 ngx_str_set(&s->out, imap_password);
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
225 s->mail_state = ngx_imap_auth_login_password;
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
226
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
227 break;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
228
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
229 case ngx_imap_auth_login_password:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
230 rc = ngx_mail_auth_login_password(s, c);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
231 break;
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
232
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
233 case ngx_imap_auth_plain:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
234 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
235 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
236
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
237 case ngx_imap_auth_cram_md5:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
238 rc = ngx_mail_auth_cram_md5(s, c);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
239 break;
6774
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
240
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
241 case ngx_imap_auth_external:
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
242 rc = ngx_mail_auth_external(s, c, 0);
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
243 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
244 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
245
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
246 } else if (rc == NGX_IMAP_NEXT) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
247 tag = 0;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
248 ngx_str_set(&s->out, imap_next);
527
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
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
251 switch (rc) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
252
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
253 case NGX_DONE:
1482
4606dce4f416 optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1480
diff changeset
254 ngx_mail_auth(s, c);
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
255 return;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
256
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
257 case NGX_ERROR:
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
258 ngx_mail_session_internal_server_error(s);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
259 return;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
260
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
261 case NGX_MAIL_PARSE_INVALID_COMMAND:
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
262 s->state = 0;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
263 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
264 s->mail_state = ngx_imap_start;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
265 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
266 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
267
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
268 if (tag) {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
269 if (s->tag.len == 0) {
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
270 ngx_str_set(&s->tag, imap_star);
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
271 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
272
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
273 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
274 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
275 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
276 if (s->tagged_line.data == NULL) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
277 ngx_mail_close_connection(c);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
278 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
279 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
280 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
281
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
282 p = s->tagged_line.data;
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
283
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
284 if (s->text.len) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
285 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
286 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
287
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
288 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
289 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
290
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
291 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
292 s->out.data = s->tagged_line.data;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
293 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
294
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
295 if (rc != NGX_IMAP_NEXT) {
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
296 s->args.nelts = 0;
1323
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
297
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
298 if (s->state) {
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
299 /* preserve tag */
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
300 s->arg_start = s->buffer->start + s->tag.len;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
301 s->buffer->pos = s->arg_start;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
302 s->buffer->last = s->arg_start;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
303
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
304 } else {
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
305 s->buffer->pos = s->buffer->start;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
306 s->buffer->last = s->buffer->start;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
307 s->tag.len = 0;
c4b2c893989d IMAP AUTHENTICATE
Igor Sysoev <igor@sysoev.ru>
parents: 1322
diff changeset
308 }
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
309 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
310
7790
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
311 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
312 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
313 return;
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
314 }
da0a85e91587 Mail: added missing event handling after reading data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7789
diff changeset
315
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
316 ngx_mail_send(c->write);
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
317 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
318
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
319
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
320 static ngx_int_t
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
321 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
322 {
1704
e584e946e198 move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents: 1487
diff changeset
323 ngx_str_t *arg;
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
324
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
325 #if (NGX_MAIL_SSL)
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
326 if (ngx_mail_starttls_only(s, c)) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
327 return NGX_MAIL_PARSE_INVALID_COMMAND;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
328 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
329 #endif
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
330
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
331 arg = s->args.elts;
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 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
334 return NGX_MAIL_PARSE_INVALID_COMMAND;
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
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
337 s->login.len = arg[0].len;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
338 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
339 if (s->login.data == NULL) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
340 return NGX_ERROR;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
341 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
342
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
343 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
344
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
345 s->passwd.len = arg[1].len;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
346 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
347 if (s->passwd.data == NULL) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
348 return NGX_ERROR;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
349 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
350
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
351 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
352
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
353 #if (NGX_DEBUG_MAIL_PASSWD)
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
354 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
355 "imap login:\"%V\" passwd:\"%V\"",
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
356 &s->login, &s->passwd);
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
357 #else
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
358 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
359 "imap login:\"%V\"", &s->login);
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
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
362 return NGX_DONE;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
363 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
364
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
365
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
366 static ngx_int_t
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
367 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
368 {
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
369 ngx_int_t rc;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
370 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
371 ngx_mail_imap_srv_conf_t *iscf;
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 #if (NGX_MAIL_SSL)
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
374 if (ngx_mail_starttls_only(s, c)) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
375 return NGX_MAIL_PARSE_INVALID_COMMAND;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
376 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
377 #endif
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
378
6869
b2915d99ee8d Mail: make it possible to disable SASL EXTERNAL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6774
diff changeset
379 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
380
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
381 rc = ngx_mail_auth_parse(s, c);
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
382
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
383 switch (rc) {
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
384
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
385 case NGX_MAIL_AUTH_LOGIN:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
386
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
387 ngx_str_set(&s->out, imap_username);
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
388 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
389
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
390 return NGX_OK;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
391
2495
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
392 case NGX_MAIL_AUTH_LOGIN_USERNAME:
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
393
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
394 ngx_str_set(&s->out, imap_password);
2495
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
395 s->mail_state = ngx_imap_auth_login_password;
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
396
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
397 return ngx_mail_auth_login_username(s, c, 1);
a59b26eee816 compatibility with Microsoft's
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
398
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
399 case NGX_MAIL_AUTH_PLAIN:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
400
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2495
diff changeset
401 ngx_str_set(&s->out, imap_plain_next);
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
402 s->mail_state = ngx_imap_auth_plain;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
403
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
404 return NGX_OK;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
405
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
406 case NGX_MAIL_AUTH_CRAM_MD5:
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
407
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1486
diff changeset
408 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
409 return NGX_MAIL_PARSE_INVALID_COMMAND;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
410 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
411
1485
b3488fc2675a create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents: 1482
diff changeset
412 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
413 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
414
1485
b3488fc2675a create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents: 1482
diff changeset
415 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
416 return NGX_ERROR;
b3488fc2675a create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents: 1482
diff changeset
417 }
b3488fc2675a create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents: 1482
diff changeset
418 }
b3488fc2675a create salt just before it will be used
Igor Sysoev <igor@sysoev.ru>
parents: 1482
diff changeset
419
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
420 if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) {
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
421 s->mail_state = ngx_imap_auth_cram_md5;
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
422 return NGX_OK;
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
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
425 return NGX_ERROR;
6774
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
426
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
427 case NGX_MAIL_AUTH_EXTERNAL:
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
428
6869
b2915d99ee8d Mail: make it possible to disable SASL EXTERNAL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6774
diff changeset
429 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
430 return NGX_MAIL_PARSE_INVALID_COMMAND;
b2915d99ee8d Mail: make it possible to disable SASL EXTERNAL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6774
diff changeset
431 }
b2915d99ee8d Mail: make it possible to disable SASL EXTERNAL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6774
diff changeset
432
6774
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
433 ngx_str_set(&s->out, imap_username);
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
434 s->mail_state = ngx_imap_auth_external;
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
435
bcb107bb89cd Mail: support SASL EXTERNAL (RFC 4422).
Rob N ★ <robn@fastmail.com>
parents: 4412
diff changeset
436 return NGX_OK;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
437 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
438
1479
2647950e047f optimizations
Igor Sysoev <igor@sysoev.ru>
parents: 1477
diff changeset
439 return rc;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
440 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
441
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
442
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
443 static ngx_int_t
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
444 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
445 {
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 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
447
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1486
diff changeset
448 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
449
1322
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1286
diff changeset
450 #if (NGX_MAIL_SSL)
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1286
diff changeset
451
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
452 if (c->ssl == NULL) {
1704
e584e946e198 move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents: 1487
diff changeset
453 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
454
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
455 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
456
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
457 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
458 s->text = iscf->starttls_capability;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
459 return NGX_OK;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
460 }
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
461
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
462 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
463 s->text = iscf->starttls_only_capability;
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
464 return NGX_OK;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
465 }
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
466 }
1322
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1286
diff changeset
467 #endif
27f2299e0d80 SMTP STARTTLS
Igor Sysoev <igor@sysoev.ru>
parents: 1286
diff changeset
468
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1486
diff changeset
469 s->text = iscf->capability;
894
4f7dca9c37f0 workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
470
4f7dca9c37f0 workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
471 return NGX_OK;
4f7dca9c37f0 workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
472 }
4f7dca9c37f0 workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
473
4f7dca9c37f0 workaround for Eudora for Mac: it sends
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
474
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
475 static ngx_int_t
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
476 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
477 {
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
478 #if (NGX_MAIL_SSL)
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
479 ngx_mail_ssl_conf_t *sslcf;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 1111
diff changeset
480
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
481 if (c->ssl == NULL) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
482 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
483 if (sslcf->starttls) {
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
484 c->read->handler = ngx_mail_starttls_handler;
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
485 return NGX_OK;
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
486 }
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
487 }
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
488
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
489 #endif
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
490
1476
67578e966dcc split pop3, imap, and smtp handlers
Igor Sysoev <igor@sysoev.ru>
parents: 1472
diff changeset
491 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
492 }