aboutsummaryrefslogtreecommitdiff
path: root/src/imap/ngx_imap_core_module.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/imap/ngx_imap_core_module.c')
-rw-r--r--src/imap/ngx_imap_core_module.c84
1 files changed, 68 insertions, 16 deletions
diff --git a/src/imap/ngx_imap_core_module.c b/src/imap/ngx_imap_core_module.c
index 6408e5401..e805a8161 100644
--- 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 *cf, void *parent, void *child)
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 *cf, void *parent, void *child)
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;
+ }
+
+ *p++ = '.'; *p++ = CR; *p = LF;
+
+
+ size += sizeof("STLS" CRLF) - 1;
+
+ p = ngx_palloc(cf->pool, size);
+ if (p == NULL) {
+ return NGX_CONF_ERROR;
}
- *b->last++ = '.'; *b->last++ = CR; *b->last++ = LF;
+ 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));
- conf->pop3_capability = b;
+ 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 *cf, void *parent, void *child)
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;
}
- b->last = ngx_cpymem(b->last, "* CAPABILITY", sizeof("* CAPABILITY") - 1);
+ 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++) {
- *b->last++ = ' ';
- b->last = ngx_cpymem(b->last, c[i].data, c[i].len);
+ *p++ = ' ';
+ p = ngx_cpymem(p, c[i].data, c[i].len);
}
- *b->last++ = CR; *b->last++ = LF;
+ *p++ = CR; *p = LF;
+
+
+ size += sizeof(" STARTTLS") - 1;
+
+ p = ngx_palloc(cf->pool, size);
+ if (p == NULL) {
+ return NGX_CONF_ERROR;
+ }
+
+ conf->imap_starttls_capability.len = size;
+ conf->imap_starttls_capability.data = p;
+
+ 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;
+ }
+
+ conf->imap_starttls_only_capability.len = size;
+ conf->imap_starttls_only_capability.data = p;
+
+ 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;
- conf->imap_capability = b;
return NGX_CONF_OK;
}