~ubuntu-branches/ubuntu/jaunty/nginx/jaunty-updates

« back to all changes in this revision

Viewing changes to src/mail/ngx_mail_smtp_module.c

  • Committer: Bazaar Package Importer
  • Author(s): Jose Parrella
  • Date: 2007-12-08 11:27:54 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20071208112754-23ohg2b1zshkdayw
Tags: 0.5.33-1
* New stable upstream release (Closes: #451173)
* nginx now provides httpd, httpd-cgi virtual packages
  (Closes: #439468, #452025)
* sites-enabled/default link is now provided only on fresh 
  installations (Closes: #432961)
* Updated code for online upgrading of nginx (Closes: #445246)
* Reviewed maintainer scripts for correct behaviour on updates
  (Closes: #452787, #435965)
* Removed debian/nginx.links and debian/preinst.
* Changing Maintainer address to bureado@debian.org.
* Welcoming Fabio Tranchitella <kobold@debian.org> as an nginx 
  uploader for Debian. Thanks for your patches.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
/*
 
3
 * Copyright (C) Igor Sysoev
 
4
 */
 
5
 
 
6
 
 
7
#include <ngx_config.h>
 
8
#include <ngx_core.h>
 
9
#include <ngx_event.h>
 
10
#include <ngx_mail.h>
 
11
#include <ngx_mail_smtp_module.h>
 
12
 
 
13
 
 
14
static void *ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf);
 
15
static char *ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent,
 
16
    void *child);
 
17
 
 
18
 
 
19
static ngx_conf_bitmask_t  ngx_mail_smtp_auth_methods[] = {
 
20
    { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },
 
21
    { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED },
 
22
    { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },
 
23
    { ngx_null_string, 0 }
 
24
};
 
25
 
 
26
 
 
27
static ngx_str_t  ngx_mail_smtp_auth_methods_names[] = {
 
28
    ngx_string("PLAIN"),
 
29
    ngx_string("LOGIN"),
 
30
    ngx_null_string,  /* APOP */
 
31
    ngx_string("CRAM-MD5")
 
32
};
 
33
 
 
34
 
 
35
static ngx_mail_protocol_t  ngx_mail_smtp_protocol = {
 
36
    ngx_string("smtp"),
 
37
    { 25, 465, 587, 0 },
 
38
    NGX_MAIL_SMTP_PROTOCOL,
 
39
 
 
40
    ngx_mail_smtp_init_session,
 
41
    ngx_mail_smtp_init_protocol,
 
42
    ngx_mail_smtp_parse_command,
 
43
    ngx_mail_smtp_auth_state,
 
44
 
 
45
    ngx_string("451 4.3.2 Internal server error" CRLF)
 
46
};
 
47
 
 
48
 
 
49
static ngx_command_t  ngx_mail_smtp_commands[] = {
 
50
 
 
51
    { ngx_string("smtp_client_buffer"),
 
52
      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
 
53
      ngx_conf_set_size_slot,
 
54
      NGX_MAIL_SRV_CONF_OFFSET,
 
55
      offsetof(ngx_mail_smtp_srv_conf_t, client_buffer_size),
 
56
      NULL },
 
57
 
 
58
    { ngx_string("smtp_greeting_delay"),
 
59
      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
 
60
      ngx_conf_set_msec_slot,
 
61
      NGX_MAIL_SRV_CONF_OFFSET,
 
62
      offsetof(ngx_mail_smtp_srv_conf_t, greeting_delay),
 
63
      NULL },
 
64
 
 
65
    { ngx_string("smtp_capabilities"),
 
66
      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
 
67
      ngx_mail_capabilities,
 
68
      NGX_MAIL_SRV_CONF_OFFSET,
 
69
      offsetof(ngx_mail_smtp_srv_conf_t, capabilities),
 
70
      NULL },
 
71
 
 
72
    { ngx_string("smtp_auth"),
 
73
      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,
 
74
      ngx_conf_set_bitmask_slot,
 
75
      NGX_MAIL_SRV_CONF_OFFSET,
 
76
      offsetof(ngx_mail_smtp_srv_conf_t, auth_methods),
 
77
      &ngx_mail_smtp_auth_methods },
 
78
 
 
79
      ngx_null_command
 
80
};
 
81
 
 
82
 
 
83
static ngx_mail_module_t  ngx_mail_smtp_module_ctx = {
 
84
    &ngx_mail_smtp_protocol,               /* protocol */
 
85
 
 
86
    NULL,                                  /* create main configuration */
 
87
    NULL,                                  /* init main configuration */
 
88
 
 
89
    ngx_mail_smtp_create_srv_conf,         /* create server configuration */
 
90
    ngx_mail_smtp_merge_srv_conf           /* merge server configuration */
 
91
};
 
92
 
 
93
 
 
94
ngx_module_t  ngx_mail_smtp_module = {
 
95
    NGX_MODULE_V1,
 
96
    &ngx_mail_smtp_module_ctx,             /* module context */
 
97
    ngx_mail_smtp_commands,                /* module directives */
 
98
    NGX_MAIL_MODULE,                       /* module type */
 
99
    NULL,                                  /* init master */
 
100
    NULL,                                  /* init module */
 
101
    NULL,                                  /* init process */
 
102
    NULL,                                  /* init thread */
 
103
    NULL,                                  /* exit thread */
 
104
    NULL,                                  /* exit process */
 
105
    NULL,                                  /* exit master */
 
106
    NGX_MODULE_V1_PADDING
 
107
};
 
108
 
 
109
 
 
110
static void *
 
111
ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf)
 
112
{
 
113
    ngx_mail_smtp_srv_conf_t  *sscf;
 
114
 
 
115
    sscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_smtp_srv_conf_t));
 
116
    if (sscf == NULL) {
 
117
        return NULL;
 
118
    }
 
119
 
 
120
    sscf->client_buffer_size = NGX_CONF_UNSET_SIZE;
 
121
    sscf->greeting_delay = NGX_CONF_UNSET_MSEC;
 
122
 
 
123
    if (ngx_array_init(&sscf->capabilities, cf->pool, 4, sizeof(ngx_str_t))
 
124
        != NGX_OK)
 
125
    {
 
126
        return NULL;
 
127
    }
 
128
 
 
129
    return sscf;
 
130
}
 
131
 
 
132
 
 
133
static char *
 
134
ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
 
135
{
 
136
    ngx_mail_smtp_srv_conf_t *prev = parent;
 
137
    ngx_mail_smtp_srv_conf_t *conf = child;
 
138
 
 
139
    u_char                    *p, *auth;
 
140
    size_t                     size;
 
141
    ngx_str_t                 *c;
 
142
    ngx_uint_t                 i, m;
 
143
    ngx_mail_core_srv_conf_t  *cscf;
 
144
 
 
145
    ngx_conf_merge_size_value(conf->client_buffer_size,
 
146
                              prev->client_buffer_size,
 
147
                              (size_t) ngx_pagesize);
 
148
 
 
149
    ngx_conf_merge_msec_value(conf->greeting_delay,
 
150
                              prev->greeting_delay, 0);
 
151
 
 
152
    ngx_conf_merge_bitmask_value(conf->auth_methods,
 
153
                              prev->auth_methods,
 
154
                              (NGX_CONF_BITMASK_SET
 
155
                               |NGX_MAIL_AUTH_PLAIN_ENABLED
 
156
                               |NGX_MAIL_AUTH_LOGIN_ENABLED));
 
157
 
 
158
 
 
159
    cscf = ngx_mail_conf_get_module_srv_conf(cf, ngx_mail_core_module);
 
160
 
 
161
    size = sizeof("220  ESMTP ready" CRLF) - 1 + cscf->server_name.len;
 
162
 
 
163
    p = ngx_palloc(cf->pool, size);
 
164
    if (p == NULL) {
 
165
        return NGX_CONF_ERROR;
 
166
    }
 
167
 
 
168
    conf->greeting.len = size;
 
169
    conf->greeting.data = p;
 
170
 
 
171
    *p++ = '2'; *p++ = '2'; *p++ = '0'; *p++ = ' ';
 
172
    p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);
 
173
    ngx_memcpy(p, " ESMTP ready" CRLF, sizeof(" ESMTP ready" CRLF) - 1);
 
174
 
 
175
 
 
176
    size = sizeof("250 " CRLF) - 1 + cscf->server_name.len;
 
177
 
 
178
    p = ngx_palloc(cf->pool, size);
 
179
    if (p == NULL) {
 
180
        return NGX_CONF_ERROR;
 
181
    }
 
182
 
 
183
    conf->server_name.len = size;
 
184
    conf->server_name.data = p;
 
185
 
 
186
    *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' ';
 
187
    p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);
 
188
    *p++ = CR; *p = LF;
 
189
 
 
190
 
 
191
    if (conf->capabilities.nelts == 0) {
 
192
        conf->capabilities = prev->capabilities;
 
193
    }
 
194
 
 
195
    size = sizeof("250-") - 1 + cscf->server_name.len + sizeof(CRLF) - 1
 
196
           + sizeof("250 AUTH") - 1 + sizeof(CRLF) - 1;
 
197
 
 
198
    c = conf->capabilities.elts;
 
199
    for (i = 0; i < conf->capabilities.nelts; i++) {
 
200
        size += sizeof("250 ") - 1 + c[i].len + sizeof(CRLF) - 1;
 
201
    }
 
202
 
 
203
    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
 
204
         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
 
205
         m <<= 1, i++)
 
206
    {
 
207
        if (m & conf->auth_methods) {
 
208
            size += 1 + ngx_mail_smtp_auth_methods_names[i].len;
 
209
        }
 
210
    }
 
211
 
 
212
    p = ngx_palloc(cf->pool, size);
 
213
    if (p == NULL) {
 
214
        return NGX_CONF_ERROR;
 
215
    }
 
216
 
 
217
    conf->capability.len = size;
 
218
    conf->capability.data = p;
 
219
 
 
220
    *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-';
 
221
    p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);
 
222
    *p++ = CR; *p++ = LF;
 
223
 
 
224
    for (i = 0; i < conf->capabilities.nelts; i++) {
 
225
        *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-';
 
226
        p = ngx_cpymem(p, c[i].data, c[i].len);
 
227
        *p++ = CR; *p++ = LF;
 
228
    }
 
229
 
 
230
    auth = p;
 
231
 
 
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);
 
243
        }
 
244
    }
 
245
 
 
246
    *p++ = CR; *p = LF;
 
247
 
 
248
    size += sizeof("250 STARTTLS" CRLF) - 1;
 
249
 
 
250
    p = ngx_palloc(cf->pool, size);
 
251
    if (p == NULL) {
 
252
        return NGX_CONF_ERROR;
 
253
    }
 
254
 
 
255
    conf->starttls_capability.len = size;
 
256
    conf->starttls_capability.data = p;
 
257
 
 
258
    p = ngx_cpymem(p, conf->capability.data,
 
259
                   conf->capability.len);
 
260
 
 
261
    p = ngx_cpymem(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1);
 
262
    *p++ = CR; *p = LF;
 
263
 
 
264
    p = conf->starttls_capability.data
 
265
        + (auth - conf->capability.data) + 3;
 
266
    *p = '-';
 
267
 
 
268
    size = (auth - conf->capability.data)
 
269
            + sizeof("250 STARTTLS" CRLF) - 1;
 
270
 
 
271
    p = ngx_palloc(cf->pool, size);
 
272
    if (p == NULL) {
 
273
        return NGX_CONF_ERROR;
 
274
    }
 
275
 
 
276
    conf->starttls_only_capability.len = size;
 
277
    conf->starttls_only_capability.data = p;
 
278
 
 
279
    p = ngx_cpymem(p, conf->capability.data,
 
280
                   auth - conf->capability.data);
 
281
 
 
282
    ngx_memcpy(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1);
 
283
 
 
284
    return NGX_CONF_OK;
 
285
}