comparison src/mail/ngx_mail_core_module.c @ 1323:c4b2c893989d

IMAP AUTHENTICATE patch by Maxim Dounin
author Igor Sysoev <igor@sysoev.ru>
date Fri, 20 Jul 2007 19:38:08 +0000
parents 27f2299e0d80
children b58ce1cf66da ed9cd1702f7a
comparison
equal deleted inserted replaced
1322:27f2299e0d80 1323:c4b2c893989d
52 { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, 52 { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },
53 { ngx_null_string, 0 } 53 { ngx_null_string, 0 }
54 }; 54 };
55 55
56 56
57 static ngx_conf_bitmask_t ngx_imap_auth_methods[] = {
58 { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },
59 { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED },
60 { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },
61 { ngx_null_string, 0 }
62 };
63
64
57 static ngx_conf_bitmask_t ngx_smtp_auth_methods[] = { 65 static ngx_conf_bitmask_t ngx_smtp_auth_methods[] = {
58 { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, 66 { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },
59 { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED }, 67 { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED },
60 { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, 68 { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },
61 { ngx_null_string, 0 } 69 { ngx_null_string, 0 }
70 };
71
72
73 static ngx_str_t ngx_imap_auth_methods_names[] = {
74 ngx_string("AUTH=PLAIN"),
75 ngx_string("AUTH=LOGIN"),
76 ngx_null_string, /* APOP */
77 ngx_string("AUTH=CRAM-MD5")
62 }; 78 };
63 79
64 80
65 static ngx_str_t ngx_smtp_auth_methods_names[] = { 81 static ngx_str_t ngx_smtp_auth_methods_names[] = {
66 ngx_string("PLAIN"), 82 ngx_string("PLAIN"),
169 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, 185 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
170 ngx_conf_set_bitmask_slot, 186 ngx_conf_set_bitmask_slot,
171 NGX_MAIL_SRV_CONF_OFFSET, 187 NGX_MAIL_SRV_CONF_OFFSET,
172 offsetof(ngx_mail_core_srv_conf_t, pop3_auth_methods), 188 offsetof(ngx_mail_core_srv_conf_t, pop3_auth_methods),
173 &ngx_pop3_auth_methods }, 189 &ngx_pop3_auth_methods },
190
191 { ngx_string("imap_auth"),
192 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
193 ngx_conf_set_bitmask_slot,
194 NGX_MAIL_SRV_CONF_OFFSET,
195 offsetof(ngx_mail_core_srv_conf_t, imap_auth_methods),
196 &ngx_imap_auth_methods },
174 197
175 { ngx_string("smtp_auth"), 198 { ngx_string("smtp_auth"),
176 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, 199 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
177 ngx_conf_set_bitmask_slot, 200 ngx_conf_set_bitmask_slot,
178 NGX_MAIL_SRV_CONF_OFFSET, 201 NGX_MAIL_SRV_CONF_OFFSET,
295 ngx_conf_merge_bitmask_value(conf->pop3_auth_methods, 318 ngx_conf_merge_bitmask_value(conf->pop3_auth_methods,
296 prev->pop3_auth_methods, 319 prev->pop3_auth_methods,
297 (NGX_CONF_BITMASK_SET 320 (NGX_CONF_BITMASK_SET
298 |NGX_MAIL_AUTH_PLAIN_ENABLED)); 321 |NGX_MAIL_AUTH_PLAIN_ENABLED));
299 322
323 ngx_conf_merge_bitmask_value(conf->imap_auth_methods,
324 prev->imap_auth_methods,
325 (NGX_CONF_BITMASK_SET
326 |NGX_MAIL_AUTH_PLAIN_ENABLED));
327
300 ngx_conf_merge_bitmask_value(conf->smtp_auth_methods, 328 ngx_conf_merge_bitmask_value(conf->smtp_auth_methods,
301 prev->smtp_auth_methods, 329 prev->smtp_auth_methods,
302 (NGX_CONF_BITMASK_SET 330 (NGX_CONF_BITMASK_SET
303 |NGX_MAIL_AUTH_PLAIN_ENABLED 331 |NGX_MAIL_AUTH_PLAIN_ENABLED
304 |NGX_MAIL_AUTH_LOGIN_ENABLED)); 332 |NGX_MAIL_AUTH_LOGIN_ENABLED));
461 c = conf->imap_capabilities.elts; 489 c = conf->imap_capabilities.elts;
462 for (i = 0; i < conf->imap_capabilities.nelts; i++) { 490 for (i = 0; i < conf->imap_capabilities.nelts; i++) {
463 size += 1 + c[i].len; 491 size += 1 + c[i].len;
464 } 492 }
465 493
494 for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
495 m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
496 m <<= 1, i++)
497 {
498 if (m & conf->imap_auth_methods) {
499 size += 1 + ngx_imap_auth_methods_names[i].len;
500 }
501 }
502
466 p = ngx_palloc(cf->pool, size); 503 p = ngx_palloc(cf->pool, size);
467 if (p == NULL) { 504 if (p == NULL) {
468 return NGX_CONF_ERROR; 505 return NGX_CONF_ERROR;
469 } 506 }
470 507
474 p = ngx_cpymem(p, "* CAPABILITY", sizeof("* CAPABILITY") - 1); 511 p = ngx_cpymem(p, "* CAPABILITY", sizeof("* CAPABILITY") - 1);
475 512
476 for (i = 0; i < conf->imap_capabilities.nelts; i++) { 513 for (i = 0; i < conf->imap_capabilities.nelts; i++) {
477 *p++ = ' '; 514 *p++ = ' ';
478 p = ngx_cpymem(p, c[i].data, c[i].len); 515 p = ngx_cpymem(p, c[i].data, c[i].len);
516 }
517
518 auth = p;
519
520 for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
521 m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
522 m <<= 1, i++)
523 {
524 if (m & conf->imap_auth_methods) {
525 *p++ = ' ';
526 p = ngx_cpymem(p, ngx_imap_auth_methods_names[i].data,
527 ngx_imap_auth_methods_names[i].len);
528 }
479 } 529 }
480 530
481 *p++ = CR; *p = LF; 531 *p++ = CR; *p = LF;
482 532
483 533
495 conf->imap_capability.len - (sizeof(CRLF) - 1)); 545 conf->imap_capability.len - (sizeof(CRLF) - 1));
496 p = ngx_cpymem(p, " STARTTLS", sizeof(" STARTTLS") - 1); 546 p = ngx_cpymem(p, " STARTTLS", sizeof(" STARTTLS") - 1);
497 *p++ = CR; *p = LF; 547 *p++ = CR; *p = LF;
498 548
499 549
500 size += sizeof(" LOGINDISABLED") - 1; 550 size = (auth - conf->imap_capability.data) + sizeof(CRLF) - 1
551 + sizeof(" STARTTLS LOGINDISABLED") - 1;
501 552
502 p = ngx_palloc(cf->pool, size); 553 p = ngx_palloc(cf->pool, size);
503 if (p == NULL) { 554 if (p == NULL) {
504 return NGX_CONF_ERROR; 555 return NGX_CONF_ERROR;
505 } 556 }
506 557
507 conf->imap_starttls_only_capability.len = size; 558 conf->imap_starttls_only_capability.len = size;
508 conf->imap_starttls_only_capability.data = p; 559 conf->imap_starttls_only_capability.data = p;
509 560
510 p = ngx_cpymem(p, conf->imap_starttls_capability.data, 561 p = ngx_cpymem(p, conf->imap_capability.data,
511 conf->imap_starttls_capability.len - (sizeof(CRLF) - 1)); 562 auth - conf->imap_capability.data);
512 p = ngx_cpymem(p, " LOGINDISABLED", sizeof(" LOGINDISABLED") - 1); 563 p = ngx_cpymem(p, " STARTTLS LOGINDISABLED",
564 sizeof(" STARTTLS LOGINDISABLED") - 1);
513 *p++ = CR; *p = LF; 565 *p++ = CR; *p = LF;
514 566
515 567
516 size = sizeof("220 ESMTP ready" CRLF) - 1 + conf->server_name.len; 568 size = sizeof("220 ESMTP ready" CRLF) - 1 + conf->server_name.len;
517 569