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)