Mercurial > hg > nginx
comparison src/mail/ngx_mail_imap_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 |
---|---|
175 rc = ngx_mail_imap_login(s, c); | 175 rc = ngx_mail_imap_login(s, c); |
176 break; | 176 break; |
177 | 177 |
178 case NGX_IMAP_AUTHENTICATE: | 178 case NGX_IMAP_AUTHENTICATE: |
179 rc = ngx_mail_imap_authenticate(s, c); | 179 rc = ngx_mail_imap_authenticate(s, c); |
180 | 180 tag = (rc != NGX_OK); |
181 if (rc == NGX_OK) { | |
182 tag = 0; | |
183 } | |
184 | |
185 break; | 181 break; |
186 | 182 |
187 case NGX_IMAP_CAPABILITY: | 183 case NGX_IMAP_CAPABILITY: |
188 rc = ngx_mail_imap_capability(s, c); | 184 rc = ngx_mail_imap_capability(s, c); |
189 break; | 185 break; |
305 | 301 |
306 static ngx_int_t | 302 static ngx_int_t |
307 ngx_mail_imap_login(ngx_mail_session_t *s, ngx_connection_t *c) | 303 ngx_mail_imap_login(ngx_mail_session_t *s, ngx_connection_t *c) |
308 { | 304 { |
309 ngx_str_t *arg; | 305 ngx_str_t *arg; |
306 | |
310 #if (NGX_MAIL_SSL) | 307 #if (NGX_MAIL_SSL) |
311 ngx_mail_ssl_conf_t *sslcf; | 308 if (ngx_mail_starttls_only(s, c)) { |
312 | 309 return NGX_MAIL_PARSE_INVALID_COMMAND; |
313 if (c->ssl == NULL) { | |
314 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); | |
315 | |
316 if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { | |
317 return NGX_MAIL_PARSE_INVALID_COMMAND; | |
318 } | |
319 } | 310 } |
320 #endif | 311 #endif |
321 | 312 |
322 arg = s->args.elts; | 313 arg = s->args.elts; |
323 | 314 |
355 | 346 |
356 | 347 |
357 static ngx_int_t | 348 static ngx_int_t |
358 ngx_mail_imap_authenticate(ngx_mail_session_t *s, ngx_connection_t *c) | 349 ngx_mail_imap_authenticate(ngx_mail_session_t *s, ngx_connection_t *c) |
359 { | 350 { |
360 u_char *p; | 351 ngx_int_t rc; |
361 ngx_str_t *arg, salt; | |
362 ngx_uint_t n; | |
363 ngx_mail_core_srv_conf_t *cscf; | 352 ngx_mail_core_srv_conf_t *cscf; |
353 | |
364 #if (NGX_MAIL_SSL) | 354 #if (NGX_MAIL_SSL) |
365 ngx_mail_ssl_conf_t *sslcf; | 355 if (ngx_mail_starttls_only(s, c)) { |
366 | |
367 if (c->ssl == NULL) { | |
368 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); | |
369 | |
370 if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { | |
371 return NGX_MAIL_PARSE_INVALID_COMMAND; | |
372 } | |
373 } | |
374 #endif | |
375 | |
376 if (s->args.nelts != 1) { | |
377 return NGX_MAIL_PARSE_INVALID_COMMAND; | 356 return NGX_MAIL_PARSE_INVALID_COMMAND; |
378 } | 357 } |
379 | 358 #endif |
380 arg = s->args.elts; | 359 |
381 | 360 rc = ngx_mail_auth_parse(s, c); |
382 if (arg[0].len == 5) { | 361 |
383 | 362 switch (rc) { |
384 if (ngx_strncasecmp(arg[0].data, (u_char *) "LOGIN", 5) == 0) { | 363 |
385 | 364 case NGX_MAIL_AUTH_LOGIN: |
386 s->out.len = sizeof(imap_username) - 1; | 365 |
387 s->out.data = imap_username; | 366 s->out.len = sizeof(imap_username) - 1; |
388 s->mail_state = ngx_imap_auth_login_username; | 367 s->out.data = imap_username; |
389 | 368 s->mail_state = ngx_imap_auth_login_username; |
390 return NGX_OK; | 369 |
391 | 370 return NGX_OK; |
392 } else if (ngx_strncasecmp(arg[0].data, (u_char *) "PLAIN", 5) == 0) { | 371 |
393 | 372 case NGX_MAIL_AUTH_PLAIN: |
394 s->out.len = sizeof(imap_plain_next) - 1; | 373 |
395 s->out.data = imap_plain_next; | 374 s->out.len = sizeof(imap_plain_next) - 1; |
396 s->mail_state = ngx_imap_auth_plain; | 375 s->out.data = imap_plain_next; |
397 | 376 s->mail_state = ngx_imap_auth_plain; |
398 return NGX_OK; | 377 |
399 } | 378 return NGX_OK; |
400 | 379 |
401 } else if (arg[0].len == 8 | 380 case NGX_MAIL_AUTH_CRAM_MD5: |
402 && ngx_strncasecmp(arg[0].data, (u_char *) "CRAM-MD5", 8) == 0) | |
403 { | |
404 if (s->args.nelts != 1) { | |
405 return NGX_MAIL_PARSE_INVALID_COMMAND; | |
406 } | |
407 | 381 |
408 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); | 382 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); |
409 | 383 |
410 if (!(cscf->imap_auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { | 384 if (!(cscf->imap_auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { |
411 return NGX_MAIL_PARSE_INVALID_COMMAND; | 385 return NGX_MAIL_PARSE_INVALID_COMMAND; |
412 } | 386 } |
413 | 387 |
414 p = ngx_palloc(c->pool, | 388 if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) { |
415 sizeof("+ " CRLF) - 1 | 389 s->mail_state = ngx_imap_auth_cram_md5; |
416 + ngx_base64_encoded_length(s->salt.len)); | 390 return NGX_OK; |
417 if (p == NULL) { | 391 } |
418 return NGX_ERROR; | 392 |
419 } | 393 return NGX_ERROR; |
420 | 394 } |
421 p[0] = '+'; p[1]= ' '; | 395 |
422 salt.data = &p[2]; | 396 return rc; |
423 s->salt.len -= 2; | |
424 | |
425 ngx_encode_base64(&salt, &s->salt); | |
426 | |
427 s->salt.len += 2; | |
428 n = 2 + salt.len; | |
429 p[n++] = CR; p[n++] = LF; | |
430 | |
431 s->out.len = n; | |
432 s->out.data = p; | |
433 s->mail_state = ngx_imap_auth_cram_md5; | |
434 | |
435 return NGX_OK; | |
436 } | |
437 | |
438 return NGX_MAIL_PARSE_INVALID_COMMAND; | |
439 } | 397 } |
440 | 398 |
441 | 399 |
442 static ngx_int_t | 400 static ngx_int_t |
443 ngx_mail_imap_capability(ngx_mail_session_t *s, ngx_connection_t *c) | 401 ngx_mail_imap_capability(ngx_mail_session_t *s, ngx_connection_t *c) |