diff src/imap/ngx_imap_core_module.c @ 583:4e296b7d25bf release-0.3.13

nginx-0.3.13-RELEASE import *) Feature: the IMAP/POP3 proxy supports STARTTLS and STLS. *) Bugfix: the IMAP/POP3 proxy did not work with the select, poll, and /dev/poll methods. *) Bugfix: in SSI handling. *) Bugfix: now Solaris sendfilev() is not used to transfer the client request body to FastCGI-server via the unix domain socket. *) Bugfix: the "auth_basic" directive did not disable the authorization; the bug had appeared in 0.3.11.
author Igor Sysoev <igor@sysoev.ru>
date Mon, 05 Dec 2005 13:18:09 +0000
parents 4d9ea73a627a
children 284cc140593b
line wrap: on
line diff
--- a/src/imap/ngx_imap_core_module.c
+++ b/src/imap/ngx_imap_core_module.c
@@ -181,8 +181,8 @@ ngx_imap_core_merge_srv_conf(ngx_conf_t 
     ngx_imap_core_srv_conf_t *prev = parent;
     ngx_imap_core_srv_conf_t *conf = child;
 
+    u_char      *p;
     size_t       size;
-    ngx_buf_t   *b;
     ngx_str_t   *c, *d;
     ngx_uint_t   i;
 
@@ -218,22 +218,40 @@ ngx_imap_core_merge_srv_conf(ngx_conf_t 
         size += c[i].len + sizeof(CRLF) - 1;
     }
 
-    b = ngx_create_temp_buf(cf->pool, size);
-    if (b == NULL) {
+    p = ngx_palloc(cf->pool, size);
+    if (p == NULL) {
         return NGX_CONF_ERROR;
     }
 
-    b->last = ngx_cpymem(b->last, "+OK Capability list follows" CRLF,
-                         sizeof("+OK Capability list follows" CRLF) - 1);
+    conf->pop3_capability.len = size;
+    conf->pop3_capability.data = p;
+
+    p = ngx_cpymem(p, "+OK Capability list follows" CRLF,
+                   sizeof("+OK Capability list follows" CRLF) - 1);
 
     for (i = 0; i < conf->pop3_capabilities.nelts; i++) {
-        b->last = ngx_cpymem(b->last, c[i].data, c[i].len);
-        *b->last++ = CR; *b->last++ = LF;
+        p = ngx_cpymem(p, c[i].data, c[i].len);
+        *p++ = CR; *p++ = LF;
     }
 
-    *b->last++ = '.'; *b->last++ = CR; *b->last++ = LF;
+    *p++ = '.'; *p++ = CR; *p = LF;
+
+
+    size += sizeof("STLS" CRLF) - 1;
 
-    conf->pop3_capability = b;
+    p = ngx_palloc(cf->pool, size);
+    if (p == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+    conf->pop3_starttls_capability.len = size;
+    conf->pop3_starttls_capability.data = p;
+
+    p = ngx_cpymem(p, conf->pop3_capability.data,
+                   conf->pop3_capability.len - (sizeof("." CRLF) - 1));
+
+    p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1);
+    *p++ = '.'; *p++ = CR; *p = LF;
 
 
     if (conf->imap_capabilities.nelts == 0) {
@@ -259,21 +277,55 @@ ngx_imap_core_merge_srv_conf(ngx_conf_t 
         size += 1 + c[i].len;
     }
 
-    b = ngx_create_temp_buf(cf->pool, size);
-    if (b == NULL) {
+    p = ngx_palloc(cf->pool, size);
+    if (p == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+    conf->imap_capability.len = size;
+    conf->imap_capability.data = p;
+
+    p = ngx_cpymem(p, "* CAPABILITY", sizeof("* CAPABILITY") - 1);
+
+    for (i = 0; i < conf->imap_capabilities.nelts; i++) {
+        *p++ = ' ';
+        p = ngx_cpymem(p, c[i].data, c[i].len);
+    }
+
+    *p++ = CR; *p = LF;
+
+
+    size += sizeof(" STARTTLS") - 1;
+
+    p = ngx_palloc(cf->pool, size);
+    if (p == NULL) {
         return NGX_CONF_ERROR;
     }
 
-    b->last = ngx_cpymem(b->last, "* CAPABILITY", sizeof("* CAPABILITY") - 1);
+    conf->imap_starttls_capability.len = size;
+    conf->imap_starttls_capability.data = p;
 
-    for (i = 0; i < conf->imap_capabilities.nelts; i++) {
-        *b->last++ = ' ';
-        b->last = ngx_cpymem(b->last, c[i].data, c[i].len);
+    p = ngx_cpymem(p, conf->imap_capability.data,
+                   conf->imap_capability.len - (sizeof(CRLF) - 1));
+    p = ngx_cpymem(p, " STARTTLS", sizeof(" STARTTLS") - 1);
+    *p++ = CR; *p = LF;
+
+
+    size += sizeof(" LOGINDISABLED") - 1;
+
+    p = ngx_palloc(cf->pool, size);
+    if (p == NULL) {
+        return NGX_CONF_ERROR;
     }
 
-    *b->last++ = CR; *b->last++ = LF;
+    conf->imap_starttls_only_capability.len = size;
+    conf->imap_starttls_only_capability.data = p;
 
-    conf->imap_capability = b;
+    p = ngx_cpymem(p, conf->imap_starttls_capability.data,
+                   conf->imap_starttls_capability.len - (sizeof(CRLF) - 1));
+    p = ngx_cpymem(p, " LOGINDISABLED", sizeof(" LOGINDISABLED") - 1);
+    *p++ = CR; *p = LF;
+
 
     return NGX_CONF_OK;
 }