summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2009-05-18 15:58:46 +0000
committerIgor Sysoev <igor@sysoev.ru>2009-05-18 15:58:46 +0000
commit6e574b051840946aedbdda548f2b0e4bd54f4b9c (patch)
treea14c634355af29268fda21e6697c4caa5755fa38
parenta948e1f3216cd529eefd11fb4548b3dcb16d9178 (diff)
downloadnginx-6e574b051840946aedbdda548f2b0e4bd54f4b9c.tar.gz
r2496, r2749 merge:
compatibility with Microsoft's AUTH LOGIN [base64 encoded user name ] patch by Maxim Dounin
-rw-r--r--src/mail/ngx_mail.h13
-rw-r--r--src/mail/ngx_mail_auth_http_module.c1
-rw-r--r--src/mail/ngx_mail_handler.c9
-rw-r--r--src/mail/ngx_mail_imap_handler.c10
-rw-r--r--src/mail/ngx_mail_parse.c4
-rw-r--r--src/mail/ngx_mail_pop3_handler.c10
-rw-r--r--src/mail/ngx_mail_smtp_handler.c10
7 files changed, 44 insertions, 13 deletions
diff --git a/src/mail/ngx_mail.h b/src/mail/ngx_mail.h
index 1efff5b51..4e6453270 100644
--- a/src/mail/ngx_mail.h
+++ b/src/mail/ngx_mail.h
@@ -164,7 +164,7 @@ typedef struct {
unsigned no_sync_literal:1;
unsigned starttls:1;
unsigned esmtp:1;
- unsigned auth_method:2;
+ unsigned auth_method:3;
unsigned auth_wait:1;
ngx_str_t login;
@@ -243,10 +243,11 @@ typedef struct {
#define NGX_SMTP_STARTTLS 13
-#define NGX_MAIL_AUTH_PLAIN 0
-#define NGX_MAIL_AUTH_LOGIN 1
-#define NGX_MAIL_AUTH_APOP 2
-#define NGX_MAIL_AUTH_CRAM_MD5 3
+#define NGX_MAIL_AUTH_PLAIN 0
+#define NGX_MAIL_AUTH_LOGIN 1
+#define NGX_MAIL_AUTH_LOGIN_USERNAME 2
+#define NGX_MAIL_AUTH_APOP 3
+#define NGX_MAIL_AUTH_CRAM_MD5 4
#define NGX_MAIL_AUTH_PLAIN_ENABLED 0x0002
@@ -329,7 +330,7 @@ ngx_int_t ngx_mail_salt(ngx_mail_session_t *s, ngx_connection_t *c,
ngx_int_t ngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c,
ngx_uint_t n);
ngx_int_t ngx_mail_auth_login_username(ngx_mail_session_t *s,
- ngx_connection_t *c);
+ ngx_connection_t *c, ngx_uint_t n);
ngx_int_t ngx_mail_auth_login_password(ngx_mail_session_t *s,
ngx_connection_t *c);
ngx_int_t ngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s,
diff --git a/src/mail/ngx_mail_auth_http_module.c b/src/mail/ngx_mail_auth_http_module.c
index 17e7861c0..cee5faafc 100644
--- a/src/mail/ngx_mail_auth_http_module.c
+++ b/src/mail/ngx_mail_auth_http_module.c
@@ -140,6 +140,7 @@ ngx_module_t ngx_mail_auth_http_module = {
static ngx_str_t ngx_mail_auth_http_method[] = {
ngx_string("plain"),
ngx_string("plain"),
+ ngx_string("plain"),
ngx_string("apop"),
ngx_string("cram-md5")
};
diff --git a/src/mail/ngx_mail_handler.c b/src/mail/ngx_mail_handler.c
index 0cb67a237..6b514972d 100644
--- a/src/mail/ngx_mail_handler.c
+++ b/src/mail/ngx_mail_handler.c
@@ -335,21 +335,22 @@ ngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c, ngx_uint_t n)
ngx_int_t
-ngx_mail_auth_login_username(ngx_mail_session_t *s, ngx_connection_t *c)
+ngx_mail_auth_login_username(ngx_mail_session_t *s, ngx_connection_t *c,
+ ngx_uint_t n)
{
ngx_str_t *arg;
arg = s->args.elts;
ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,
- "mail auth login username: \"%V\"", &arg[0]);
+ "mail auth login username: \"%V\"", &arg[n]);
- s->login.data = ngx_palloc(c->pool, ngx_base64_decoded_length(arg[0].len));
+ s->login.data = ngx_palloc(c->pool, ngx_base64_decoded_length(arg[n].len));
if (s->login.data == NULL){
return NGX_ERROR;
}
- if (ngx_decode_base64(&s->login, &arg[0]) != NGX_OK) {
+ if (ngx_decode_base64(&s->login, &arg[n]) != NGX_OK) {
ngx_log_error(NGX_LOG_INFO, c->log, 0,
"client sent invalid base64 encoding in AUTH LOGIN command");
return NGX_MAIL_PARSE_INVALID_COMMAND;
diff --git a/src/mail/ngx_mail_imap_handler.c b/src/mail/ngx_mail_imap_handler.c
index 62ba17da8..e176469fe 100644
--- a/src/mail/ngx_mail_imap_handler.c
+++ b/src/mail/ngx_mail_imap_handler.c
@@ -205,7 +205,7 @@ ngx_mail_imap_auth_state(ngx_event_t *rev)
break;
case ngx_imap_auth_login_username:
- rc = ngx_mail_auth_login_username(s, c);
+ rc = ngx_mail_auth_login_username(s, c, 0);
tag = 0;
s->out.len = sizeof(imap_password) - 1;
@@ -370,6 +370,14 @@ ngx_mail_imap_authenticate(ngx_mail_session_t *s, ngx_connection_t *c)
return NGX_OK;
+ case NGX_MAIL_AUTH_LOGIN_USERNAME:
+
+ s->out.len = sizeof(imap_password) - 1;
+ s->out.data = imap_password;
+ s->mail_state = ngx_imap_auth_login_password;
+
+ return ngx_mail_auth_login_username(s, c, 1);
+
case NGX_MAIL_AUTH_PLAIN:
s->out.len = sizeof(imap_plain_next) - 1;
diff --git a/src/mail/ngx_mail_parse.c b/src/mail/ngx_mail_parse.c
index e558d2f48..693abfdc3 100644
--- a/src/mail/ngx_mail_parse.c
+++ b/src/mail/ngx_mail_parse.c
@@ -848,6 +848,10 @@ ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c)
return NGX_MAIL_AUTH_LOGIN;
}
+ if (s->args.nelts == 2) {
+ return NGX_MAIL_AUTH_LOGIN_USERNAME;
+ }
+
return NGX_MAIL_PARSE_INVALID_COMMAND;
}
diff --git a/src/mail/ngx_mail_pop3_handler.c b/src/mail/ngx_mail_pop3_handler.c
index c486fbebd..668f0525b 100644
--- a/src/mail/ngx_mail_pop3_handler.c
+++ b/src/mail/ngx_mail_pop3_handler.c
@@ -226,7 +226,7 @@ ngx_mail_pop3_auth_state(ngx_event_t *rev)
break;
case ngx_pop3_auth_login_username:
- rc = ngx_mail_auth_login_username(s, c);
+ rc = ngx_mail_auth_login_username(s, c, 0);
s->out.len = sizeof(pop3_password) - 1;
s->out.data = pop3_password;
@@ -474,6 +474,14 @@ ngx_mail_pop3_auth(ngx_mail_session_t *s, ngx_connection_t *c)
return NGX_OK;
+ case NGX_MAIL_AUTH_LOGIN_USERNAME:
+
+ s->out.len = sizeof(pop3_password) - 1;
+ s->out.data = pop3_password;
+ s->mail_state = ngx_pop3_auth_login_password;
+
+ return ngx_mail_auth_login_username(s, c, 1);
+
case NGX_MAIL_AUTH_PLAIN:
s->out.len = sizeof(pop3_next) - 1;
diff --git a/src/mail/ngx_mail_smtp_handler.c b/src/mail/ngx_mail_smtp_handler.c
index 307ec697d..f4cb69fb1 100644
--- a/src/mail/ngx_mail_smtp_handler.c
+++ b/src/mail/ngx_mail_smtp_handler.c
@@ -452,7 +452,7 @@ ngx_mail_smtp_auth_state(ngx_event_t *rev)
break;
case ngx_smtp_auth_login_username:
- rc = ngx_mail_auth_login_username(s, c);
+ rc = ngx_mail_auth_login_username(s, c, 0);
s->out.len = sizeof(smtp_password) - 1;
s->out.data = smtp_password;
@@ -596,6 +596,14 @@ ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c)
return NGX_OK;
+ case NGX_MAIL_AUTH_LOGIN_USERNAME:
+
+ s->out.len = sizeof(smtp_password) - 1;
+ s->out.data = smtp_password;
+ s->mail_state = ngx_smtp_auth_login_password;
+
+ return ngx_mail_auth_login_username(s, c, 1);
+
case NGX_MAIL_AUTH_PLAIN:
s->out.len = sizeof(smtp_next) - 1;