Mercurial > hg > nginx
comparison src/mail/ngx_mail_smtp_handler.c @ 1479:2647950e047f
optimizations
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 13 Sep 2007 21:24:27 +0000 |
parents | 59e1caf2be94 |
children | a231e37a19ab |
comparison
equal
deleted
inserted
replaced
1478:d0cce8369848 | 1479:2647950e047f |
---|---|
282 | 282 |
283 | 283 |
284 static ngx_int_t | 284 static ngx_int_t |
285 ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c) | 285 ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c) |
286 { | 286 { |
287 u_char *p; | 287 ngx_int_t rc; |
288 ngx_str_t *arg, salt; | |
289 ngx_uint_t n; | |
290 ngx_mail_core_srv_conf_t *cscf; | 288 ngx_mail_core_srv_conf_t *cscf; |
289 | |
291 #if (NGX_MAIL_SSL) | 290 #if (NGX_MAIL_SSL) |
292 ngx_mail_ssl_conf_t *sslcf; | 291 if (ngx_mail_starttls_only(s, c)) { |
293 | 292 return NGX_MAIL_PARSE_INVALID_COMMAND; |
294 if (c->ssl == NULL) { | 293 } |
295 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); | |
296 | |
297 if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { | |
298 return NGX_MAIL_PARSE_INVALID_COMMAND; | |
299 } | |
300 } | |
301 | |
302 #endif | 294 #endif |
303 | 295 |
304 if (s->args.nelts == 0) { | 296 if (s->args.nelts == 0) { |
305 s->out.len = sizeof(smtp_invalid_argument) - 1; | 297 s->out.len = sizeof(smtp_invalid_argument) - 1; |
306 s->out.data = smtp_invalid_argument; | 298 s->out.data = smtp_invalid_argument; |
307 s->state = 0; | 299 s->state = 0; |
308 return NGX_OK; | 300 return NGX_OK; |
309 } | 301 } |
310 | 302 |
311 if (s->args.nelts != 1) { | 303 rc = ngx_mail_auth_parse(s, c); |
312 return NGX_MAIL_PARSE_INVALID_COMMAND; | 304 |
313 } | 305 switch (rc) { |
314 | 306 |
315 arg = s->args.elts; | 307 case NGX_MAIL_AUTH_LOGIN: |
316 | 308 |
317 if (arg[0].len == 5) { | 309 s->out.len = sizeof(smtp_username) - 1; |
318 | 310 s->out.data = smtp_username; |
319 if (ngx_strncasecmp(arg[0].data, (u_char *) "LOGIN", 5) == 0) { | 311 s->mail_state = ngx_smtp_auth_login_username; |
320 | 312 |
321 if (s->args.nelts != 1) { | 313 return NGX_OK; |
322 return NGX_MAIL_PARSE_INVALID_COMMAND; | 314 |
323 } | 315 case NGX_MAIL_AUTH_PLAIN: |
324 | 316 |
325 s->out.len = sizeof(smtp_username) - 1; | 317 s->out.len = sizeof(smtp_next) - 1; |
326 s->out.data = smtp_username; | 318 s->out.data = smtp_next; |
327 s->mail_state = ngx_smtp_auth_login_username; | 319 s->mail_state = ngx_smtp_auth_plain; |
328 | 320 |
329 return NGX_OK; | 321 return NGX_OK; |
330 | 322 |
331 } else if (ngx_strncasecmp(arg[0].data, (u_char *) "PLAIN", 5) == 0) { | 323 case NGX_MAIL_AUTH_CRAM_MD5: |
332 | |
333 s->out.len = sizeof(smtp_next) - 1; | |
334 s->out.data = smtp_next; | |
335 s->mail_state = ngx_smtp_auth_plain; | |
336 | |
337 return NGX_OK; | |
338 } | |
339 | |
340 } else if (arg[0].len == 8 | |
341 && ngx_strncasecmp(arg[0].data, (u_char *) "CRAM-MD5", 8) == 0) | |
342 { | |
343 if (s->args.nelts != 1) { | |
344 return NGX_MAIL_PARSE_INVALID_COMMAND; | |
345 } | |
346 | 324 |
347 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); | 325 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); |
348 | 326 |
349 if (!(cscf->smtp_auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { | 327 if (!(cscf->smtp_auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { |
350 return NGX_MAIL_PARSE_INVALID_COMMAND; | 328 return NGX_MAIL_PARSE_INVALID_COMMAND; |
351 } | 329 } |
352 | 330 |
353 p = ngx_palloc(c->pool, | 331 if (ngx_mail_auth_cram_md5_salt(s, c, "334 ", 4) == NGX_OK) { |
354 sizeof("334 " CRLF) - 1 | 332 s->mail_state = ngx_smtp_auth_cram_md5; |
355 + ngx_base64_encoded_length(s->salt.len)); | 333 return NGX_OK; |
356 if (p == NULL) { | 334 } |
357 return NGX_ERROR; | 335 |
358 } | 336 return NGX_ERROR; |
359 | 337 } |
360 p[0] = '3'; p[1]= '3'; p[2] = '4'; p[3]= ' '; | 338 |
361 salt.data = &p[4]; | 339 return rc; |
362 s->salt.len -= 2; | |
363 | |
364 ngx_encode_base64(&salt, &s->salt); | |
365 | |
366 s->salt.len += 2; | |
367 n = 4 + salt.len; | |
368 p[n++] = CR; p[n++] = LF; | |
369 | |
370 s->out.len = n; | |
371 s->out.data = p; | |
372 s->mail_state = ngx_smtp_auth_cram_md5; | |
373 | |
374 return NGX_OK; | |
375 } | |
376 | |
377 return NGX_MAIL_PARSE_INVALID_COMMAND; | |
378 } | 340 } |
379 | 341 |
380 | 342 |
381 static ngx_int_t | 343 static ngx_int_t |
382 ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c) | 344 ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c) |