annotate src/mail/ngx_mail_pop3_module.c @ 434:375518f786db

Mail: don't drop connection when RCPT TO fails. Always pass reply for RCPT TO back to client and establish proxied connection. There is no real reason to close connection here.
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 10 Sep 2008 21:27:57 +0400
parents 984bb0b1399b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_event.h>
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10 #include <ngx_mail.h>
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11 #include <ngx_mail_pop3_module.h>
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 static void *ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 static char *ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 void *child);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 static ngx_str_t ngx_mail_pop3_default_capabilities[] = {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 ngx_string("TOP"),
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 ngx_string("USER"),
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 ngx_string("UIDL"),
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 ngx_null_string
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 };
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 static ngx_conf_bitmask_t ngx_mail_pop3_auth_methods[] = {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28 { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29 { ngx_string("apop"), NGX_MAIL_AUTH_APOP_ENABLED },
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30 { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31 { ngx_null_string, 0 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32 };
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 static ngx_str_t ngx_mail_pop3_auth_plain_capability =
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 ngx_string("+OK methods supported:" CRLF
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 "LOGIN" CRLF
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 "PLAIN" CRLF
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 "." CRLF);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 static ngx_str_t ngx_mail_pop3_auth_cram_md5_capability =
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 ngx_string("+OK methods supported:" CRLF
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 "LOGIN" CRLF
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45 "PLAIN" CRLF
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46 "CRAM-MD5" CRLF
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 "." CRLF);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50 static ngx_mail_protocol_t ngx_mail_pop3_protocol = {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 ngx_string("pop3"),
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52 { 110, 995, 0, 0 },
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 NGX_MAIL_POP3_PROTOCOL,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 ngx_mail_pop3_init_session,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 ngx_mail_pop3_init_protocol,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 ngx_mail_pop3_parse_command,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58 ngx_mail_pop3_auth_state,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 ngx_string("-ERR internal server error" CRLF)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 };
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 static ngx_command_t ngx_mail_pop3_commands[] = {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66 { ngx_string("pop3_capabilities"),
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 ngx_mail_capabilities,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69 NGX_MAIL_SRV_CONF_OFFSET,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 offsetof(ngx_mail_pop3_srv_conf_t, capabilities),
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 NULL },
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 { ngx_string("pop3_auth"),
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 ngx_conf_set_bitmask_slot,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 NGX_MAIL_SRV_CONF_OFFSET,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77 offsetof(ngx_mail_pop3_srv_conf_t, auth_methods),
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78 &ngx_mail_pop3_auth_methods },
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 ngx_null_command
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 };
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 static ngx_mail_module_t ngx_mail_pop3_module_ctx = {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 &ngx_mail_pop3_protocol, /* protocol */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 NULL, /* create main configuration */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 NULL, /* init main configuration */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 ngx_mail_pop3_create_srv_conf, /* create server configuration */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 ngx_mail_pop3_merge_srv_conf /* merge server configuration */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92 };
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95 ngx_module_t ngx_mail_pop3_module = {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96 NGX_MODULE_V1,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97 &ngx_mail_pop3_module_ctx, /* module context */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98 ngx_mail_pop3_commands, /* module directives */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99 NGX_MAIL_MODULE, /* module type */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 NULL, /* init master */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 NULL, /* init module */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 NULL, /* init process */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 NULL, /* init thread */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104 NULL, /* exit thread */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105 NULL, /* exit process */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 NULL, /* exit master */
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 NGX_MODULE_V1_PADDING
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 };
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 static void *
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 ngx_mail_pop3_srv_conf_t *pscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 pscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_pop3_srv_conf_t));
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 if (pscf == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118 return NULL;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121 if (ngx_array_init(&pscf->capabilities, cf->pool, 4, sizeof(ngx_str_t))
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122 != NGX_OK)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 return NULL;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127 return pscf;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 static char *
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132 ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 ngx_mail_pop3_srv_conf_t *prev = parent;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135 ngx_mail_pop3_srv_conf_t *conf = child;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137 u_char *p;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138 size_t size, stls_only_size;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139 ngx_str_t *c, *d;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 ngx_uint_t i;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 ngx_conf_merge_bitmask_value(conf->auth_methods,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143 prev->auth_methods,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144 (NGX_CONF_BITMASK_SET
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 |NGX_MAIL_AUTH_PLAIN_ENABLED));
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 if (conf->capabilities.nelts == 0) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148 conf->capabilities = prev->capabilities;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
151 if (conf->capabilities.nelts == 0) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153 for (d = ngx_mail_pop3_default_capabilities; d->len; d++) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
154 c = ngx_array_push(&conf->capabilities);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 if (c == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 return NGX_CONF_ERROR;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159 *c = *d;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163 size = sizeof("+OK Capability list follows" CRLF) - 1
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 + sizeof("." CRLF) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166 stls_only_size = size + sizeof("STLS" CRLF) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 c = conf->capabilities.elts;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169 for (i = 0; i < conf->capabilities.nelts; i++) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170 size += c[i].len + sizeof(CRLF) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173 continue;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176 stls_only_size += c[i].len + sizeof(CRLF) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180 size += sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182 } else {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 size += sizeof("SASL LOGIN PLAIN" CRLF) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
186 p = ngx_pnalloc(cf->pool, size);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187 if (p == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 return NGX_CONF_ERROR;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 conf->capability.len = size;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 conf->capability.data = p;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 p = ngx_cpymem(p, "+OK Capability list follows" CRLF,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195 sizeof("+OK Capability list follows" CRLF) - 1);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 for (i = 0; i < conf->capabilities.nelts; i++) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198 p = ngx_cpymem(p, c[i].data, c[i].len);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 *p++ = CR; *p++ = LF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202 if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 p = ngx_cpymem(p, "SASL LOGIN PLAIN CRAM-MD5" CRLF,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204 sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206 } else {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 p = ngx_cpymem(p, "SASL LOGIN PLAIN" CRLF,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208 sizeof("SASL LOGIN PLAIN" CRLF) - 1);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211 *p++ = '.'; *p++ = CR; *p = LF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
213
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
214 size += sizeof("STLS" CRLF) - 1;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
216 p = ngx_pnalloc(cf->pool, size);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217 if (p == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218 return NGX_CONF_ERROR;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
221 conf->starttls_capability.len = size;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222 conf->starttls_capability.data = p;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224 p = ngx_cpymem(p, conf->capability.data,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225 conf->capability.len - (sizeof("." CRLF) - 1));
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228 *p++ = '.'; *p++ = CR; *p = LF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 conf->auth_capability = ngx_mail_pop3_auth_cram_md5_capability;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234 } else {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235 conf->auth_capability = ngx_mail_pop3_auth_plain_capability;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
236 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
239 p = ngx_pnalloc(cf->pool, stls_only_size);
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 if (p == NULL) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241 return NGX_CONF_ERROR;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 conf->starttls_only_capability.len = stls_only_size;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245 conf->starttls_only_capability.data = p;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 p = ngx_cpymem(p, "+OK Capability list follows" CRLF,
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 sizeof("+OK Capability list follows" CRLF) - 1);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 for (i = 0; i < conf->capabilities.nelts; i++) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 continue;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 p = ngx_cpymem(p, c[i].data, c[i].len);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 *p++ = CR; *p++ = LF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 }
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259 p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260 *p++ = '.'; *p++ = CR; *p = LF;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
262 return NGX_CONF_OK;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263 }