~ubuntu-branches/ubuntu/trusty/nginx/trusty-proposed

« back to all changes in this revision

Viewing changes to src/mail/ngx_mail_smtp_module.c

  • Committer: Package Import Robot
  • Author(s): Kartik Mistry
  • Date: 2013-04-25 12:51:45 UTC
  • mfrom: (1.3.28)
  • mto: (1.3.29) (15.1.2 experimental)
  • mto: This revision was merged to the branch mainline in revision 64.
  • Revision ID: package-import@ubuntu.com-20130425125145-ugl0wor6bq0u5eae
Tags: upstream-1.4.0
ImportĀ upstreamĀ versionĀ 1.4.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
 
2
2
/*
3
3
 * Copyright (C) Igor Sysoev
 
4
 * Copyright (C) Nginx, Inc.
4
5
 */
5
6
 
6
7
 
20
21
    { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },
21
22
    { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED },
22
23
    { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },
 
24
    { ngx_string("none"), NGX_MAIL_AUTH_NONE_ENABLED },
23
25
    { ngx_null_string, 0 }
24
26
};
25
27
 
28
30
    ngx_string("PLAIN"),
29
31
    ngx_string("LOGIN"),
30
32
    ngx_null_string,  /* APOP */
31
 
    ngx_string("CRAM-MD5")
 
33
    ngx_string("CRAM-MD5"),
 
34
    ngx_null_string   /* NONE */
32
35
};
33
36
 
34
37
 
136
139
    ngx_mail_smtp_srv_conf_t *prev = parent;
137
140
    ngx_mail_smtp_srv_conf_t *conf = child;
138
141
 
139
 
    u_char                    *p, *auth;
 
142
    u_char                    *p, *auth, *last;
140
143
    size_t                     size;
141
144
    ngx_str_t                 *c;
142
 
    ngx_uint_t                 i, m;
 
145
    ngx_uint_t                 i, m, auth_enabled;
143
146
    ngx_mail_core_srv_conf_t  *cscf;
144
147
 
145
148
    ngx_conf_merge_size_value(conf->client_buffer_size,
160
163
 
161
164
    size = sizeof("220  ESMTP ready" CRLF) - 1 + cscf->server_name.len;
162
165
 
163
 
    p = ngx_palloc(cf->pool, size);
 
166
    p = ngx_pnalloc(cf->pool, size);
164
167
    if (p == NULL) {
165
168
        return NGX_CONF_ERROR;
166
169
    }
175
178
 
176
179
    size = sizeof("250 " CRLF) - 1 + cscf->server_name.len;
177
180
 
178
 
    p = ngx_palloc(cf->pool, size);
 
181
    p = ngx_pnalloc(cf->pool, size);
179
182
    if (p == NULL) {
180
183
        return NGX_CONF_ERROR;
181
184
    }
192
195
        conf->capabilities = prev->capabilities;
193
196
    }
194
197
 
195
 
    size = sizeof("250-") - 1 + cscf->server_name.len + sizeof(CRLF) - 1
196
 
           + sizeof("250 AUTH") - 1 + sizeof(CRLF) - 1;
 
198
    size = sizeof("250-") - 1 + cscf->server_name.len + sizeof(CRLF) - 1;
197
199
 
198
200
    c = conf->capabilities.elts;
199
201
    for (i = 0; i < conf->capabilities.nelts; i++) {
200
202
        size += sizeof("250 ") - 1 + c[i].len + sizeof(CRLF) - 1;
201
203
    }
202
204
 
 
205
    auth_enabled = 0;
 
206
 
203
207
    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
204
208
         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
205
209
         m <<= 1, i++)
206
210
    {
207
211
        if (m & conf->auth_methods) {
208
212
            size += 1 + ngx_mail_smtp_auth_methods_names[i].len;
 
213
            auth_enabled = 1;
209
214
        }
210
215
    }
211
216
 
212
 
    p = ngx_palloc(cf->pool, size);
 
217
    if (auth_enabled) {
 
218
        size += sizeof("250 AUTH") - 1 + sizeof(CRLF) - 1;
 
219
    }
 
220
 
 
221
    p = ngx_pnalloc(cf->pool, size);
213
222
    if (p == NULL) {
214
223
        return NGX_CONF_ERROR;
215
224
    }
217
226
    conf->capability.len = size;
218
227
    conf->capability.data = p;
219
228
 
 
229
    last = p;
 
230
 
220
231
    *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-';
221
232
    p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);
222
233
    *p++ = CR; *p++ = LF;
223
234
 
224
235
    for (i = 0; i < conf->capabilities.nelts; i++) {
 
236
        last = p;
225
237
        *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-';
226
238
        p = ngx_cpymem(p, c[i].data, c[i].len);
227
239
        *p++ = CR; *p++ = LF;
229
241
 
230
242
    auth = p;
231
243
 
232
 
    *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' ';
233
 
    *p++ = 'A'; *p++ = 'U'; *p++ = 'T'; *p++ = 'H';
234
 
 
235
 
    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
236
 
         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
237
 
         m <<= 1, i++)
238
 
    {
239
 
        if (m & conf->auth_methods) {
240
 
            *p++ = ' ';
241
 
            p = ngx_cpymem(p, ngx_mail_smtp_auth_methods_names[i].data,
242
 
                           ngx_mail_smtp_auth_methods_names[i].len);
 
244
    if (auth_enabled) {
 
245
        last = p;
 
246
 
 
247
        *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' ';
 
248
        *p++ = 'A'; *p++ = 'U'; *p++ = 'T'; *p++ = 'H';
 
249
 
 
250
        for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
 
251
             m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
 
252
             m <<= 1, i++)
 
253
        {
 
254
            if (m & conf->auth_methods) {
 
255
                *p++ = ' ';
 
256
                p = ngx_cpymem(p, ngx_mail_smtp_auth_methods_names[i].data,
 
257
                               ngx_mail_smtp_auth_methods_names[i].len);
 
258
            }
243
259
        }
 
260
 
 
261
        *p++ = CR; *p = LF;
 
262
 
 
263
    } else {
 
264
        last[3] = ' ';
244
265
    }
245
266
 
246
 
    *p++ = CR; *p = LF;
247
 
 
248
267
    size += sizeof("250 STARTTLS" CRLF) - 1;
249
268
 
250
 
    p = ngx_palloc(cf->pool, size);
 
269
    p = ngx_pnalloc(cf->pool, size);
251
270
    if (p == NULL) {
252
271
        return NGX_CONF_ERROR;
253
272
    }
255
274
    conf->starttls_capability.len = size;
256
275
    conf->starttls_capability.data = p;
257
276
 
258
 
    p = ngx_cpymem(p, conf->capability.data,
259
 
                   conf->capability.len);
 
277
    p = ngx_cpymem(p, conf->capability.data, conf->capability.len);
260
278
 
261
279
    p = ngx_cpymem(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1);
262
280
    *p++ = CR; *p = LF;
263
281
 
264
282
    p = conf->starttls_capability.data
265
 
        + (auth - conf->capability.data) + 3;
 
283
        + (last - conf->capability.data) + 3;
266
284
    *p = '-';
267
285
 
268
286
    size = (auth - conf->capability.data)
269
287
            + sizeof("250 STARTTLS" CRLF) - 1;
270
288
 
271
 
    p = ngx_palloc(cf->pool, size);
 
289
    p = ngx_pnalloc(cf->pool, size);
272
290
    if (p == NULL) {
273
291
        return NGX_CONF_ERROR;
274
292
    }
276
294
    conf->starttls_only_capability.len = size;
277
295
    conf->starttls_only_capability.data = p;
278
296
 
279
 
    p = ngx_cpymem(p, conf->capability.data,
280
 
                   auth - conf->capability.data);
 
297
    p = ngx_cpymem(p, conf->capability.data, auth - conf->capability.data);
281
298
 
282
299
    ngx_memcpy(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1);
283
300
 
 
301
    if (last < auth) {
 
302
        p = conf->starttls_only_capability.data
 
303
            + (last - conf->capability.data) + 3;
 
304
        *p = '-';
 
305
    }
 
306
 
284
307
    return NGX_CONF_OK;
285
308
}