ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Проброс AUTH PLAIN в SMTP-прокси



Встала задача сделать SMTP-прокси с поддержкой TLS на незащищенный сервер с 
пробросом AUTH PLAIN

Готового решения не нашел, налабал маленький патчик для nginx для поддержки 
этой возможности.
Сильно в идеологию не вникал, так что ногами не бить.

Где прикрепляется файл не нашел, постю прямо сюда.
Патч к версии 0.7.64. Воможно в нем некорректно отдается клиенту ошибка 
авторизации на сервере, но мне это не требовалось.


--- ngx_mail.h.orig     2010-01-31 11:49:35.000000000 +0300
+++ ngx_mail.h  2010-01-31 12:47:40.000000000 +0300
@@ -209,6 +209,7 @@ typedef struct {
 
     ngx_str_t               login;
     ngx_str_t               passwd;
+    ngx_str_t               auth_plain;
 
     ngx_str_t               salt;
     ngx_str_t               tag;
--- ngx_mail_handler.c~ 2009-06-22 13:31:33.000000000 +0400
+++ ngx_mail_handler.c  2010-01-31 12:55:38.000000000 +0300
@@ -345,6 +345,7 @@ ngx_mail_auth_plain(ngx_mail_session_t *
                    "mail auth plain: \"%V\"", &arg);
 #endif
 
+
     plain.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg.len));
     if (plain.data == NULL){
         return NGX_ERROR;
@@ -382,6 +383,15 @@ ngx_mail_auth_plain(ngx_mail_session_t *
     s->passwd.len = last - p;
     s->passwd.data = p;
 
+    /* Saving AUTH PLAIN arg for later use in SMTP proxy */
+    s->auth_plain.len = arg.len;
+    s->auth_plain.data = ngx_pnalloc(c->pool, s->auth_plain.len);
+    if(s->auth_plain.data == NULL) {
+       return NGX_ERROR;
+    }
+
+    ngx_cpystrn(s->auth_plain.data, arg.data, s->auth_plain.len);
+
 #if (NGX_DEBUG_MAIL_PASSWD)
     ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,
                    "mail auth plain: \"%V\" \"%V\"", &s->login, &s->passwd);
--- ngx_mail_proxy_module.c.orig        2010-01-31 12:16:37.000000000 +0300
+++ ngx_mail_proxy_module.c     2010-01-31 13:03:46.000000000 +0300
@@ -527,6 +527,9 @@ ngx_mail_proxy_smtp_handler(ngx_event_t 
         } else if (s->auth_method == NGX_MAIL_AUTH_NONE) {
             s->mail_state = ngx_smtp_helo_from;
 
+       } else if (s->auth_method == NGX_MAIL_AUTH_PLAIN) {
+           s->mail_state = ngx_smtp_auth_plain;
+
         } else {
             s->mail_state = ngx_smtp_helo;
         }
@@ -632,6 +635,29 @@ ngx_mail_proxy_smtp_handler(ngx_event_t 
 
         break;
 
+    case ngx_smtp_auth_plain:
+       ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "SMTP plain auth send");
+
+       s->connection->log->action = "sending plain auth to upstream";
+       if(s->auth_plain.data == NULL || s->auth_plain.len == 0) {
+               ngx_mail_proxy_internal_server_error(s);
+       }
+
+       line.len = sizeof("AUTH PLAIN" CRLF) + s->auth_plain.len;
+       line.data = ngx_pnalloc(c->pool, line.len);
+
+       if (line.data == NULL) {
+           ngx_mail_proxy_internal_server_error(s);
+           return;
+       }
+
+       p = ngx_cpymem(line.data, "AUTH PLAIN ", sizeof("AUTH PLAIN ") - 1);
+       p = ngx_cpymem(p, s->auth_plain.data, s->auth_plain.len);
+       *p++ = CR; *p = LF;
+
+       s->mail_state = ngx_smtp_to;
+       break;
+
     case ngx_smtp_helo:
     case ngx_smtp_xclient:
     case ngx_smtp_to:
@@ -793,6 +819,7 @@ ngx_mail_proxy_read_response(ngx_mail_se
         case ngx_smtp_helo_xclient:
         case ngx_smtp_helo_from:
         case ngx_smtp_from:
+       case ngx_smtp_auth_plain:
             if (p[0] == '2' && p[1] == '5' && p[2] == '0') {
                 return NGX_OK;
             }


Posted at Nginx Forum: http://forum.nginx.org/read.php?21,48060,48060#msg-48060


_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.