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

📄 ngx_mail_handler.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,                   "mail auth login username: \"%V\"", &s->login);    return NGX_OK;}ngx_int_tngx_mail_auth_login_password(ngx_mail_session_t *s, ngx_connection_t *c){    ngx_str_t  *arg;    arg = s->args.elts;#if (NGX_DEBUG_MAIL_PASSWD)    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,                   "mail auth login password: \"%V\"", &arg[0]);#endif    s->passwd.data = ngx_palloc(c->pool, ngx_base64_decoded_length(arg[0].len));    if (s->passwd.data == NULL){        return NGX_ERROR;    }    if (ngx_decode_base64(&s->passwd, &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;    }#if (NGX_DEBUG_MAIL_PASSWD)    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,                   "mail auth login password: \"%V\"", &s->passwd);#endif    return NGX_DONE;}ngx_int_tngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s, ngx_connection_t *c,    char *prefix, size_t len){    u_char      *p;    ngx_str_t    salt;    ngx_uint_t   n;    p = ngx_palloc(c->pool, len + ngx_base64_encoded_length(s->salt.len) + 2);    if (p == NULL) {        return NGX_ERROR;    }    salt.data = ngx_cpymem(p, prefix, len);    s->salt.len -= 2;    ngx_encode_base64(&salt, &s->salt);    s->salt.len += 2;    n = len + salt.len;    p[n++] = CR; p[n++] = LF;    s->out.len = n;    s->out.data = p;    return NGX_OK;}ngx_int_tngx_mail_auth_cram_md5(ngx_mail_session_t *s, ngx_connection_t *c){    u_char     *p, *last;    ngx_str_t  *arg;    arg = s->args.elts;    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,                   "mail auth cram-md5: \"%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 CRAM-MD5 command");        return NGX_MAIL_PARSE_INVALID_COMMAND;    }    p = s->login.data;    last = p + s->login.len;    while (p < last) {        if (*p++ == ' ') {            s->login.len = p - s->login.data - 1;            s->passwd.len = last - p;            s->passwd.data = p;            break;        }    }    if (s->passwd.len != 32) {        ngx_log_error(NGX_LOG_INFO, c->log, 0,            "client sent invalid CRAM-MD5 hash in AUTH CRAM-MD5 command");        return NGX_MAIL_PARSE_INVALID_COMMAND;    }    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,                   "mail auth cram-md5: \"%V\" \"%V\"", &s->login, &s->passwd);    s->auth_method = NGX_MAIL_AUTH_CRAM_MD5;    return NGX_DONE;}voidngx_mail_send(ngx_event_t *wev){    ngx_int_t                  n;    ngx_connection_t          *c;    ngx_mail_session_t        *s;    ngx_mail_core_srv_conf_t  *cscf;    c = wev->data;    s = c->data;    if (wev->timedout) {        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");        c->timedout = 1;        ngx_mail_close_connection(c);        return;    }    if (s->out.len == 0) {        if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) {            ngx_mail_close_connection(c);        }        return;    }    n = c->send(c, s->out.data, s->out.len);    if (n > 0) {        s->out.len -= n;        if (wev->timer_set) {            ngx_del_timer(wev);        }        if (s->quit) {            ngx_mail_close_connection(c);            return;        }        if (s->blocked) {            c->read->handler(c->read);        }        return;    }    if (n == NGX_ERROR) {        ngx_mail_close_connection(c);        return;    }    /* n == NGX_AGAIN */    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);    ngx_add_timer(c->write, cscf->timeout);    if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) {        ngx_mail_close_connection(c);        return;    }}ngx_int_tngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c){    ssize_t                    n;    ngx_int_t                  rc;    ngx_str_t                  l;    ngx_mail_core_srv_conf_t  *cscf;    n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last);    if (n == NGX_ERROR || n == 0) {        ngx_mail_close_connection(c);        return NGX_ERROR;    }    if (n > 0) {        s->buffer->last += n;    }    if (n == NGX_AGAIN) {        if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) {            ngx_mail_session_internal_server_error(s);            return NGX_ERROR;        }        return NGX_AGAIN;    }    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);    rc = cscf->protocol->parse_command(s);    if (rc == NGX_AGAIN) {        if (s->buffer->last < s->buffer->end) {            return rc;        }        l.len = s->buffer->last - s->buffer->start;        l.data = s->buffer->start;        ngx_log_error(NGX_LOG_INFO, c->log, 0,                      "client sent too long command \"%V\"", &l);        s->quit = 1;        return NGX_MAIL_PARSE_INVALID_COMMAND;    }    if (rc == NGX_IMAP_NEXT || rc == NGX_MAIL_PARSE_INVALID_COMMAND) {        return rc;    }    if (rc == NGX_ERROR) {        ngx_mail_close_connection(c);        return NGX_ERROR;    }    return NGX_OK;}voidngx_mail_auth(ngx_mail_session_t *s, ngx_connection_t *c){    s->args.nelts = 0;    s->buffer->pos = s->buffer->start;    s->buffer->last = s->buffer->start;    s->state = 0;    if (c->read->timer_set) {        ngx_del_timer(c->read);    }    s->login_attempt++;    ngx_mail_auth_http_init(s);}voidngx_mail_session_internal_server_error(ngx_mail_session_t *s){    ngx_mail_core_srv_conf_t  *cscf;    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);    s->out = cscf->protocol->internal_server_error;    s->quit = 1;    ngx_mail_send(s->connection->write);}voidngx_mail_close_connection(ngx_connection_t *c){    ngx_pool_t  *pool;    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,                   "close mail connection: %d", c->fd);#if (NGX_MAIL_SSL)    if (c->ssl) {        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {            c->ssl->handler = ngx_mail_close_connection;            return;        }    }#endif#if (NGX_STAT_STUB)    ngx_atomic_fetch_add(ngx_stat_active, -1);#endif    c->destroyed = 1;    pool = c->pool;    ngx_close_connection(c);    ngx_destroy_pool(pool);}u_char *ngx_mail_log_error(ngx_log_t *log, u_char *buf, size_t len){    u_char              *p;    ngx_mail_session_t  *s;    ngx_mail_log_ctx_t  *ctx;    if (log->action) {        p = ngx_snprintf(buf, len, " while %s", log->action);        len -= p - buf;        buf = p;    }    ctx = log->data;    p = ngx_snprintf(buf, len, ", client: %V", ctx->client);    len -= p - buf;    buf = p;    s = ctx->session;    if (s == NULL) {        return p;    }    p = ngx_snprintf(buf, len, "%s, server: %V",                     s->starttls ? " using starttls" : "",                     s->addr_text);    len -= p - buf;    buf = p;    if (s->login.len == 0) {        return p;    }    p = ngx_snprintf(buf, len, ", login: \"%V\"", &s->login);    len -= p - buf;    buf = p;    if (s->proxy == NULL) {        return p;    }    p = ngx_snprintf(buf, len, ", upstream: %V", s->proxy->upstream.name);    return p;}

⌨️ 快捷键说明

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