comparison src/mail/ngx_mail_handler.c @ 1322:27f2299e0d80

SMTP STARTTLS patch by Maxim Dounin
author Igor Sysoev <igor@sysoev.ru>
date Fri, 20 Jul 2007 18:36:04 +0000
parents a9c361479430
children c4b2c893989d
comparison
equal deleted inserted replaced
1321:8eb4dfcb89a6 1322:27f2299e0d80
1227 ngx_str_t *arg, salt, l; 1227 ngx_str_t *arg, salt, l;
1228 ngx_uint_t i; 1228 ngx_uint_t i;
1229 ngx_connection_t *c; 1229 ngx_connection_t *c;
1230 ngx_mail_session_t *s; 1230 ngx_mail_session_t *s;
1231 ngx_mail_core_srv_conf_t *cscf; 1231 ngx_mail_core_srv_conf_t *cscf;
1232 #if (NGX_MAIL_SSL)
1233 ngx_mail_ssl_conf_t *sslcf;
1234 #endif
1232 1235
1233 c = rev->data; 1236 c = rev->data;
1234 s = c->data; 1237 s = c->data;
1235 1238
1236 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp auth state"); 1239 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp auth state");
1293 size = cscf->smtp_server_name.len; 1296 size = cscf->smtp_server_name.len;
1294 text = cscf->smtp_server_name.data; 1297 text = cscf->smtp_server_name.data;
1295 1298
1296 } else { 1299 } else {
1297 s->esmtp = 1; 1300 s->esmtp = 1;
1301
1302 #if (NGX_MAIL_SSL)
1303
1304 if (c->ssl == NULL) {
1305 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);
1306
1307 if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) {
1308 size = cscf->smtp_starttls_capability.len;
1309 text = cscf->smtp_starttls_capability.data;
1310 break;
1311 }
1312
1313 if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {
1314 size = cscf->smtp_starttls_only_capability.len;
1315 text = cscf->smtp_starttls_only_capability.data;
1316 break;
1317 }
1318 }
1319 #endif
1320
1298 size = cscf->smtp_capability.len; 1321 size = cscf->smtp_capability.len;
1299 text = cscf->smtp_capability.data; 1322 text = cscf->smtp_capability.data;
1300 } 1323 }
1301 1324
1302 break; 1325 break;
1303 1326
1304 case NGX_SMTP_AUTH: 1327 case NGX_SMTP_AUTH:
1328
1329 #if (NGX_MAIL_SSL)
1330
1331 if (c->ssl == NULL) {
1332 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);
1333
1334 if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {
1335 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
1336 break;
1337 }
1338 }
1339 #endif
1305 1340
1306 if (s->args.nelts == 0) { 1341 if (s->args.nelts == 0) {
1307 text = smtp_invalid_argument; 1342 text = smtp_invalid_argument;
1308 size = sizeof(smtp_invalid_argument) - 1; 1343 size = sizeof(smtp_invalid_argument) - 1;
1309 s->state = 0; 1344 s->state = 0;
1451 case NGX_SMTP_NOOP: 1486 case NGX_SMTP_NOOP:
1452 case NGX_SMTP_RSET: 1487 case NGX_SMTP_RSET:
1453 text = smtp_ok; 1488 text = smtp_ok;
1454 size = sizeof(smtp_ok) - 1; 1489 size = sizeof(smtp_ok) - 1;
1455 break; 1490 break;
1491
1492 #if (NGX_MAIL_SSL)
1493
1494 case NGX_SMTP_STARTTLS:
1495 if (c->ssl == NULL) {
1496 sslcf = ngx_mail_get_module_srv_conf(s,
1497 ngx_mail_ssl_module);
1498 if (sslcf->starttls) {
1499 c->read->handler = ngx_mail_starttls_handler;
1500
1501 /*
1502 * RFC3207 requires us to discard any knowledge
1503 * obtained from client before STARTTLS.
1504 */
1505
1506 s->smtp_helo.len = 0;
1507 s->smtp_helo.data = NULL;
1508
1509 text = smtp_ok;
1510 size = sizeof(smtp_ok) - 1;
1511
1512 break;
1513 }
1514 }
1515
1516 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
1517 break;
1518 #endif
1519
1520 default:
1521 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
1522 break;
1456 } 1523 }
1457 1524
1458 break; 1525 break;
1459 1526
1460 case ngx_smtp_auth_login_username: 1527 case ngx_smtp_auth_login_username: