Changeset 6773:73b451d304c0 in nginx


Ignore:
Timestamp:
10/18/16 16:38:46 (3 years ago)
Author:
Maxim Dounin <mdounin@…>
Branch:
default
Phase:
public
Message:

Mail: extensible auth methods in pop3 module.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/mail/ngx_mail_pop3_module.c

    r5989 r6773  
    3434
    3535
    36 static ngx_str_t  ngx_mail_pop3_auth_plain_capability =
    37     ngx_string("+OK methods supported:" CRLF
    38                "LOGIN" CRLF
    39                "PLAIN" CRLF
    40                "." CRLF);
    41 
    42 
    43 static ngx_str_t  ngx_mail_pop3_auth_cram_md5_capability =
    44     ngx_string("+OK methods supported:" CRLF
    45                "LOGIN" CRLF
    46                "PLAIN" CRLF
    47                "CRAM-MD5" CRLF
    48                "." CRLF);
     36static ngx_str_t  ngx_mail_pop3_auth_methods_names[] = {
     37    ngx_string("PLAIN"),
     38    ngx_string("LOGIN"),
     39    ngx_null_string,  /* APOP */
     40    ngx_string("CRAM-MD5"),
     41    ngx_null_string   /* NONE */
     42};
    4943
    5044
     
    141135    size_t       size, stls_only_size;
    142136    ngx_str_t   *c, *d;
    143     ngx_uint_t   i;
     137    ngx_uint_t   i, m;
    144138
    145139    ngx_conf_merge_bitmask_value(conf->auth_methods,
     
    147141                                 (NGX_CONF_BITMASK_SET
    148142                                  |NGX_MAIL_AUTH_PLAIN_ENABLED));
     143
     144    if (conf->auth_methods & NGX_MAIL_AUTH_PLAIN_ENABLED) {
     145        conf->auth_methods |= NGX_MAIL_AUTH_LOGIN_ENABLED;
     146    }
    149147
    150148    if (conf->capabilities.nelts == 0) {
     
    180178    }
    181179
    182     if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {
    183         size += sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1;
    184 
    185     } else {
    186         size += sizeof("SASL LOGIN PLAIN" CRLF) - 1;
     180    size += sizeof("SASL") - 1 + sizeof(CRLF) - 1;
     181
     182    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
     183         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
     184         m <<= 1, i++)
     185    {
     186        if (m & conf->auth_methods) {
     187            size += 1 + ngx_mail_pop3_auth_methods_names[i].len;
     188        }
    187189    }
    188190
     
    203205    }
    204206
    205     if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {
    206         p = ngx_cpymem(p, "SASL LOGIN PLAIN CRAM-MD5" CRLF,
    207                        sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1);
    208 
    209     } else {
    210         p = ngx_cpymem(p, "SASL LOGIN PLAIN" CRLF,
    211                        sizeof("SASL LOGIN PLAIN" CRLF) - 1);
    212     }
     207    p = ngx_cpymem(p, "SASL", sizeof("SASL") - 1);
     208
     209    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
     210         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
     211         m <<= 1, i++)
     212    {
     213        if (m & conf->auth_methods) {
     214            *p++ = ' ';
     215            p = ngx_cpymem(p, ngx_mail_pop3_auth_methods_names[i].data,
     216                           ngx_mail_pop3_auth_methods_names[i].len);
     217        }
     218    }
     219
     220    *p++ = CR; *p++ = LF;
    213221
    214222    *p++ = '.'; *p++ = CR; *p = LF;
     
    232240
    233241
    234     if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {
    235         conf->auth_capability = ngx_mail_pop3_auth_cram_md5_capability;
    236 
    237     } else {
    238         conf->auth_capability = ngx_mail_pop3_auth_plain_capability;
    239     }
     242    size = sizeof("+OK methods supported:" CRLF) - 1
     243           + sizeof("." CRLF) - 1;
     244
     245    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
     246         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
     247         m <<= 1, i++)
     248    {
     249        if (m & conf->auth_methods) {
     250            size += ngx_mail_pop3_auth_methods_names[i].len
     251                    + sizeof(CRLF) - 1;
     252        }
     253    }
     254
     255    p = ngx_pnalloc(cf->pool, size);
     256    if (p == NULL) {
     257        return NGX_CONF_ERROR;
     258    }
     259
     260    conf->auth_capability.data = p;
     261    conf->auth_capability.len = size;
     262
     263    p = ngx_cpymem(p, "+OK methods supported:" CRLF,
     264                   sizeof("+OK methods supported:" CRLF) - 1);
     265
     266    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;
     267         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;
     268         m <<= 1, i++)
     269    {
     270        if (m & conf->auth_methods) {
     271            p = ngx_cpymem(p, ngx_mail_pop3_auth_methods_names[i].data,
     272                           ngx_mail_pop3_auth_methods_names[i].len);
     273            *p++ = CR; *p++ = LF;
     274        }
     275    }
     276
     277    *p++ = '.'; *p++ = CR; *p = LF;
    240278
    241279
Note: See TracChangeset for help on using the changeset viewer.