⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_mail_handler.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) Igor Sysoev */#include <ngx_config.h>#include <ngx_core.h>#include <ngx_event.h>#include <ngx_mail.h>static void ngx_mail_init_session(ngx_connection_t *c);#if (NGX_MAIL_SSL)static void ngx_mail_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c);static void ngx_mail_ssl_handshake_handler(ngx_connection_t *c);#endifvoidngx_mail_init_connection(ngx_connection_t *c){    in_addr_t             in_addr;    socklen_t             len;    ngx_uint_t            i;    struct sockaddr_in    sin;    ngx_mail_log_ctx_t   *ctx;    ngx_mail_in_port_t   *imip;    ngx_mail_in_addr_t   *imia;    ngx_mail_session_t   *s;    /* find the server configuration for the address:port */    /* AF_INET only */    imip = c->listening->servers;    imia = imip->addrs;    i = 0;    if (imip->naddrs > 1) {        /*         * There are several addresses on this port and one of them         * is the "*:port" wildcard so getsockname() is needed to determine         * the server address.         *         * AcceptEx() already gave this address.         */#if (NGX_WIN32)        if (c->local_sockaddr) {            in_addr =                   ((struct sockaddr_in *) c->local_sockaddr)->sin_addr.s_addr;        } else#endif        {            len = sizeof(struct sockaddr_in);            if (getsockname(c->fd, (struct sockaddr *) &sin, &len) == -1) {                ngx_connection_error(c, ngx_socket_errno,                                     "getsockname() failed");                ngx_mail_close_connection(c);                return;            }            in_addr = sin.sin_addr.s_addr;        }        /* the last address is "*" */        for ( /* void */ ; i < imip->naddrs - 1; i++) {            if (in_addr == imia[i].addr) {                break;            }        }    }    s = ngx_pcalloc(c->pool, sizeof(ngx_mail_session_t));    if (s == NULL) {        ngx_mail_close_connection(c);        return;    }    s->main_conf = imia[i].ctx->main_conf;    s->srv_conf = imia[i].ctx->srv_conf;    s->addr_text = &imia[i].addr_text;    c->data = s;    s->connection = c;    ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%ui client %V connected to %V",                  c->number, &c->addr_text, s->addr_text);    ctx = ngx_palloc(c->pool, sizeof(ngx_mail_log_ctx_t));    if (ctx == NULL) {        ngx_mail_close_connection(c);        return;    }    ctx->client = &c->addr_text;    ctx->session = s;    c->log->connection = c->number;    c->log->handler = ngx_mail_log_error;    c->log->data = ctx;    c->log->action = "sending client greeting line";    c->log_error = NGX_ERROR_INFO;#if (NGX_MAIL_SSL)    {    ngx_mail_ssl_conf_t  *sslcf;    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);    if (sslcf->enable) {        ngx_mail_ssl_init_connection(&sslcf->ssl, c);        return;    }    }#endif    ngx_mail_init_session(c);}#if (NGX_MAIL_SSL)voidngx_mail_starttls_handler(ngx_event_t *rev){    ngx_connection_t     *c;    ngx_mail_session_t   *s;    ngx_mail_ssl_conf_t  *sslcf;    c = rev->data;    s = c->data;    s->starttls = 1;    c->log->action = "in starttls state";    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);    ngx_mail_ssl_init_connection(&sslcf->ssl, c);}static voidngx_mail_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c){    ngx_mail_session_t        *s;    ngx_mail_core_srv_conf_t  *cscf;    if (ngx_ssl_create_connection(ssl, c, 0) == NGX_ERROR) {        ngx_mail_close_connection(c);        return;    }    if (ngx_ssl_handshake(c) == NGX_AGAIN) {        s = c->data;        cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);        ngx_add_timer(c->read, cscf->timeout);        c->ssl->handler = ngx_mail_ssl_handshake_handler;        return;    }    ngx_mail_ssl_handshake_handler(c);}static voidngx_mail_ssl_handshake_handler(ngx_connection_t *c){    ngx_mail_session_t        *s;    ngx_mail_core_srv_conf_t  *cscf;    if (c->ssl->handshaked) {        s = c->data;        if (s->starttls) {            cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);            c->read->handler = cscf->protocol->init_protocol;            c->write->handler = ngx_mail_send;            cscf->protocol->init_protocol(c->read);            return;        }        ngx_mail_init_session(c);        return;    }    ngx_mail_close_connection(c);}#endifstatic voidngx_mail_init_session(ngx_connection_t *c){    ngx_mail_session_t        *s;    ngx_mail_core_srv_conf_t  *cscf;    s = c->data;    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);    s->protocol = cscf->protocol->type;    s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_mail_max_module);    if (s->ctx == NULL) {        ngx_mail_session_internal_server_error(s);        return;    }    c->write->handler = ngx_mail_send;    cscf->protocol->init_session(s, c);}ngx_int_tngx_mail_salt(ngx_mail_session_t *s, ngx_connection_t *c,    ngx_mail_core_srv_conf_t *cscf){    s->salt.data = ngx_palloc(c->pool,                              sizeof(" <18446744073709551616.@>" CRLF) - 1                              + NGX_TIME_T_LEN                              + cscf->server_name.len);    if (s->salt.data == NULL) {        return NGX_ERROR;    }    s->salt.len = ngx_sprintf(s->salt.data, "<%ul.%T@%V>" CRLF,                              ngx_random(), ngx_time(), &cscf->server_name)                  - s->salt.data;    return NGX_OK;}#if (NGX_MAIL_SSL)ngx_int_tngx_mail_starttls_only(ngx_mail_session_t *s, ngx_connection_t *c){    ngx_mail_ssl_conf_t  *sslcf;    if (c->ssl) {        return 0;    }    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);    if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {        return 1;    }    return 0;}#endifngx_int_tngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c, ngx_uint_t n){    u_char     *p, *last;    ngx_str_t  *arg, plain;    arg = s->args.elts;#if (NGX_DEBUG_MAIL_PASSWD)    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,                   "mail auth plain: \"%V\"", &arg[n]);#endif    plain.data = ngx_palloc(c->pool, ngx_base64_decoded_length(arg[n].len));    if (plain.data == NULL){        return NGX_ERROR;    }    if (ngx_decode_base64(&plain, &arg[n]) != NGX_OK) {        ngx_log_error(NGX_LOG_INFO, c->log, 0,            "client sent invalid base64 encoding in AUTH PLAIN command");        return NGX_MAIL_PARSE_INVALID_COMMAND;    }    p = plain.data;    last = p + plain.len;    while (p < last && *p++) { /* void */ }    if (p == last) {        ngx_log_error(NGX_LOG_INFO, c->log, 0,                      "client sent invalid login in AUTH PLAIN command");        return NGX_MAIL_PARSE_INVALID_COMMAND;    }    s->login.data = p;    while (p < last && *p) { p++; }    if (p == last) {        ngx_log_error(NGX_LOG_INFO, c->log, 0,                      "client sent invalid password in AUTH PLAIN command");        return NGX_MAIL_PARSE_INVALID_COMMAND;    }    s->login.len = p++ - s->login.data;    s->passwd.len = last - p;    s->passwd.data = p;#if (NGX_DEBUG_MAIL_PASSWD)    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,                   "mail auth plain: \"%V\" \"%V\"", &s->login, &s->passwd);#endif    return NGX_DONE;}ngx_int_tngx_mail_auth_login_username(ngx_mail_session_t *s, ngx_connection_t *c){    ngx_str_t  *arg;    arg = s->args.elts;    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,                   "mail auth login username: \"%V\"", &arg[0]);    s->login.data = ngx_palloc(c->pool, ngx_base64_decoded_length(arg[0].len));    if (s->login.data == NULL){        return NGX_ERROR;    }    if (ngx_decode_base64(&s->login, &arg[0]) != NGX_OK) {        ngx_log_error(NGX_LOG_INFO, c->log, 0,            "client sent invalid base64 encoding in AUTH LOGIN command");        return NGX_MAIL_PARSE_INVALID_COMMAND;    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -