~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Nginx/mail/ngx_mail_smtp_module.c

Version: ~ [ nginx-0.6.26 ] ~ [ nginx-0.5.35 ] ~ [ nginx-0.5.20 ] ~ [ nginx-0.5.19 ] ~

  1 
  2 /*
  3  * Copyright (C) Igor Sysoev
  4  */
  5 
  6 
  7 #include <ngx_config.h>
  8 #include <ngx_core.h>
  9 #include <ngx_event.h>
 10 #include <ngx_mail.h>
 11 #include <ngx_mail_smtp_module.h>
 12 
 13 
 14 static void *ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf);
 15 static char *ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent,
 16     void *child);
 17 
 18 
 19 static ngx_conf_bitmask_t  ngx_mail_smtp_auth_methods[] = {
 20     { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },
 21     { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED },
 22     { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },
 23     { ngx_null_string, 0 }
 24 };
 25 
 26 
 27 static ngx_str_t  ngx_mail_smtp_auth_methods_names[] = {
 28     ngx_string("PLAIN"),
 29     ngx_string("LOGIN"),
 30     ngx_null_string,  /* APOP */
 31     ngx_string("CRAM-MD5")
 32 };
 33 
 34 
 35 static ngx_mail_protocol_t  ngx_mail_smtp_protocol = {
 36     ngx_string("smtp"),
 37     { 25, 465, 587, 0 },
 38     NGX_MAIL_SMTP_PROTOCOL,
 39 
 40     ngx_mail_smtp_init_session,
 41     ngx_mail_smtp_init_protocol,
 42     ngx_mail_smtp_parse_command,
 43     ngx_mail_smtp_auth_state,
 44 
 45     ngx_string("451 4.3.2 Internal server error" CRLF)
 46 };
 47 
 48 
 49 static ngx_command_t  ngx_mail_smtp_commands[] = {
 50 
 51     { ngx_string("smtp_client_buffer"),
 52       NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
 53       ngx_conf_set_size_slot,
 54       NGX_MAIL_SRV_CONF_OFFSET,
 55       offsetof(ngx_mail_smtp_srv_conf_t, client_buffer_size),
 56       NULL },
 57 
 58     { ngx_string("smtp_greeting_delay"),
 59       NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
 60       ngx_conf_set_msec_slot,
 61       NGX_MAIL_SRV_CONF_OFFSET,
 62       offsetof(ngx_mail_smtp_srv_conf_t, greeting_delay),
 63       NULL },
 64 
 65     { ngx_string("smtp_capabilities"),
 66       NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
 67       ngx_mail_capabilities,
 68       NGX_MAIL_SRV_CONF_OFFSET,
 69       offsetof(ngx_mail_smtp_srv_conf_t, capabilities),
 70       NULL },
 71 
 72     { ngx_string("smtp_auth"),
 73       NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
 74       ngx_conf_set_bitmask_slot,
 75       NGX_MAIL_SRV_CONF_OFFSET,
 76       offsetof(ngx_mail_smtp_srv_conf_t, auth_methods),
 77       &ngx_mail_smtp_auth_methods },
 78 
 79       ngx_null_command
 80 };
 81 
 82 
 83 static ngx_mail_module_t  ngx_mail_smtp_module_ctx = {
 84     &ngx_mail_smtp_protocol,               /* protocol */
 85 
 86     NULL,                                  /* create main configuration */
 87     NULL,                                  /* init main configuration */
 88 
 89     ngx_mail_smtp_create_srv_conf,         /* create server configuration */
 90     ngx_mail_smtp_merge_srv_conf           /* merge server configuration */
 91 };
 92 
 93 
 94 ngx_module_t  ngx_mail_smtp_module = {
 95     NGX_MODULE_V1,
 96     &ngx_mail_smtp_module_ctx,             /* module context */
 97     ngx_mail_smtp_commands,                /* module directives */
 98     NGX_MAIL_MODULE,                       /* module type */
 99     NULL,                                  /* init master */
100     NULL,                                  /* init module */
101     NULL,                                  /* init process */
102     NULL,                                  /* init thread */
103     NULL,                                  /* exit thread */
104     NULL,                                  /* exit process */
105     NULL,                                  /* exit master */
106     NGX_MODULE_V1_PADDING
107 };
108 
109 
110 static void *
111 ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf)
112 {
113     ngx_mail_smtp_srv_conf_t  *sscf;
114 
115     sscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_smtp_srv_conf_t));
116     if (sscf == NULL) {
117         return NULL;
118     }
119 
120     sscf->client_buffer_size = NGX_CONF_UNSET_SIZE;
121     sscf->greeting_delay = NGX_CONF_UNSET_MSEC;
122 
123     if (ngx_array_init(&sscf->capabilities, cf->pool, 4, sizeof(ngx_str_t))
124         != NGX_OK)
125     {
126         return NULL;
127     }
128 
129     return sscf;
130 }
131 
132 
133 static char *
134 ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
135 {
136     ngx_mail_smtp_srv_conf_t *prev = parent;
137     ngx_mail_smtp_srv_conf_t *conf = child;
138 
139     u_char                    *p, *auth;
140     size_t                     size;
141     ngx_str_t                 *c;
142     ngx_uint_t                 i, m;
143     ngx_mail_core_srv_conf_t  *cscf;
144 
145     ngx_conf_merge_size_value(conf->client_buffer_size,
146                               prev->client_buffer_size,
147                               (size_t) ngx_pagesize);
148 
149     ngx_conf_merge_msec_value(conf->greeting_delay,
150                               prev->greeting_delay, 0);
151 
152     ngx_conf_merge_bitmask_value(conf->auth_methods,
153                               prev->auth_methods,
154                               (NGX_CONF_BITMASK_SET
155                                |NGX_MAIL_AUTH_PLAIN_ENABLED
156                                |NGX_MAIL_AUTH_LOGIN_ENABLED));
157 
158 
159     cscf = ngx_mail_conf_get_module_srv_conf(cf, ngx_mail_core_module);
160 
161     size = sizeof("220  ESMTP ready" CRLF) - 1 + cscf->server_name.len;
162 
163     p = ngx_palloc(cf->pool, size);
164     if (p == NULL) {
165         return NGX_CONF_ERROR;
166     }
167 
168     conf->greeting.len = size;
169     conf->greeting.data = p;
170 
171     *p++ = '2'; *p++ = '2'; *p++ = ''; *p++ = ' ';
172     p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);
173     ngx_memcpy(p, " ESMTP ready" CRLF, sizeof(" ESMTP ready" CRLF) - 1);
174 
175 
176     size = sizeof("250 " CRLF) - 1 + cscf->server_name.len;
177 
178     p = ngx_palloc(cf->pool, size);
179     if (p == NULL) {
180         return NGX_CONF_ERROR;
181     }
182 
183     conf->server_name.len = size;
184     conf->server_name.data = p;
185 
186     *p++ = '2'; *p++ = '5'; *p++ = ''; *p++ = ' ';
187     p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);
188     *p++ = CR; *p = LF;
189 
190 
191     if (conf->capabilities.nelts == 0) {
192         conf->capabilities = prev->capabilities;
193     }
194 
195     size = sizeof("250-") - 1 + cscf->server_name.len + sizeof(CRLF) - 1
196            + sizeof("250 AUTH") - 1 + sizeof(CRLF) - 1;
197 
198     c = conf->capabilities.elts;
199     for (i = 0; i < conf->capabilities.nelts; i++) {
200         size += sizeof("250 ") - 1 + c[i].len + sizeof(CRLF) - 1;
201     }
202 
203     for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
204          m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
205          m <<= 1, i++)
206     {
207         if (m & conf->auth_methods) {
208             size += 1 + ngx_mail_smtp_auth_methods_names[i].len;
209         }
210     }
211 
212     p = ngx_palloc(cf->pool, size);
213     if (p == NULL) {
214         return NGX_CONF_ERROR;
215     }
216 
217     conf->capability.len = size;
218     conf->capability.data = p;
219 
220     *p++ = '2'; *p++ = '5'; *p++ = ''; *p++ = '-';
221     p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);
222     *p++ = CR; *p++ = LF;
223 
224     for (i = 0; i < conf->capabilities.nelts; i++) {
225         *p++ = '2'; *p++ = '5'; *p++ = ''; *p++ = '-';
226         p = ngx_cpymem(p, c[i].data, c[i].len);
227         *p++ = CR; *p++ = LF;
228     }
229 
230     auth = p;
231 
232     *p++ = '2'; *p++ = '5'; *p++ = ''; *p++ = ' ';
233     *p++ = 'A'; *p++ = 'U'; *p++ = 'T'; *p++ = 'H';
234 
235     for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
236          m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
237          m <<= 1, i++)
238     {
239         if (m & conf->auth_methods) {
240             *p++ = ' ';
241             p = ngx_cpymem(p, ngx_mail_smtp_auth_methods_names[i].data,
242                            ngx_mail_smtp_auth_methods_names[i].len);
243         }
244     }
245 
246     *p++ = CR; *p = LF;
247 
248     size += sizeof("250 STARTTLS" CRLF) - 1;
249 
250     p = ngx_palloc(cf->pool, size);
251     if (p == NULL) {
252         return NGX_CONF_ERROR;
253     }
254 
255     conf->starttls_capability.len = size;
256     conf->starttls_capability.data = p;
257 
258     p = ngx_cpymem(p, conf->capability.data,
259                    conf->capability.len);
260 
261     p = ngx_cpymem(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1);
262     *p++ = CR; *p = LF;
263 
264     p = conf->starttls_capability.data
265         + (auth - conf->capability.data) + 3;
266     *p = '-';
267 
268     size = (auth - conf->capability.data)
269             + sizeof("250 STARTTLS" CRLF) - 1;
270 
271     p = ngx_palloc(cf->pool, size);
272     if (p == NULL) {
273         return NGX_CONF_ERROR;
274     }
275 
276     conf->starttls_only_capability.len = size;
277     conf->starttls_only_capability.data = p;
278 
279     p = ngx_cpymem(p, conf->capability.data,
280                    auth - conf->capability.data);
281 
282     ngx_memcpy(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1);
283 
284     return NGX_CONF_OK;
285 }
286 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.