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

📄 ngx_mail_auth_http_module.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 3 页
字号:
                c = (u_char) (ch | 0x20);                if (c >= 'a' && c <= 'z') {                    hash = c;                    break;                }                if (ch >= '0' && ch <= '9') {                    hash = ch;                    break;                }                return NGX_ERROR;            }            break;        /* header name */        case sw_name:            c = (u_char) (ch | 0x20);            if (c >= 'a' && c <= 'z') {                hash += c;                break;            }            if (ch == ':') {                ctx->header_name_end = p;                state = sw_space_before_value;                break;            }            if (ch == '-') {                hash += ch;                break;            }            if (ch >= '0' && ch <= '9') {                hash += ch;                break;            }            if (ch == CR) {                ctx->header_name_end = p;                ctx->header_start = p;                ctx->header_end = p;                state = sw_almost_done;                break;            }            if (ch == LF) {                ctx->header_name_end = p;                ctx->header_start = p;                ctx->header_end = p;                goto done;            }            return NGX_ERROR;        /* space* before header value */        case sw_space_before_value:            switch (ch) {            case ' ':                break;            case CR:                ctx->header_start = p;                ctx->header_end = p;                state = sw_almost_done;                break;            case LF:                ctx->header_start = p;                ctx->header_end = p;                goto done;            default:                ctx->header_start = p;                state = sw_value;                break;            }            break;        /* header value */        case sw_value:            switch (ch) {            case ' ':                ctx->header_end = p;                state = sw_space_after_value;                break;            case CR:                ctx->header_end = p;                state = sw_almost_done;                break;            case LF:                ctx->header_end = p;                goto done;            }            break;        /* space* before end of header line */        case sw_space_after_value:            switch (ch) {            case ' ':                break;            case CR:                state = sw_almost_done;                break;            case LF:                goto done;            default:                state = sw_value;                break;            }            break;        /* end of header line */        case sw_almost_done:            switch (ch) {            case LF:                goto done;            default:                return NGX_ERROR;            }        /* end of header */        case sw_header_almost_done:            switch (ch) {            case LF:                goto header_done;            default:                return NGX_ERROR;            }        }    }    ctx->response->pos = p;    ctx->state = state;    ctx->hash = hash;    return NGX_AGAIN;done:    ctx->response->pos = p + 1;    ctx->state = sw_start;    ctx->hash = hash;    return NGX_OK;header_done:    ctx->response->pos = p + 1;    ctx->state = sw_start;    return NGX_DONE;}static voidngx_mail_auth_http_block_read(ngx_event_t *rev){    ngx_connection_t          *c;    ngx_mail_session_t        *s;    ngx_mail_auth_http_ctx_t  *ctx;    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,                   "mail auth http block read");    if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {        c = rev->data;        s = c->data;        ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module);        ngx_close_connection(ctx->peer.connection);        ngx_destroy_pool(ctx->pool);        ngx_mail_session_internal_server_error(s);    }}static voidngx_mail_auth_http_dummy_handler(ngx_event_t *ev){    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, ev->log, 0,                   "mail auth http dummy handler");}static ngx_buf_t *ngx_mail_auth_http_create_request(ngx_mail_session_t *s, ngx_pool_t *pool,    ngx_mail_auth_http_conf_t *ahcf){    size_t                     len;    ngx_buf_t                 *b;    ngx_str_t                  login, passwd;    ngx_mail_core_srv_conf_t  *cscf;    if (ngx_mail_auth_http_escape(pool, &s->login, &login) != NGX_OK) {        return NULL;    }    if (ngx_mail_auth_http_escape(pool, &s->passwd, &passwd) != NGX_OK) {        return NULL;    }    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);    len = sizeof("GET ") - 1 + ahcf->uri.len + sizeof(" HTTP/1.0" CRLF) - 1          + sizeof("Host: ") - 1 + ahcf->host_header.len + sizeof(CRLF) - 1          + sizeof("Auth-Method: ") - 1                + ngx_mail_auth_http_method[s->auth_method].len                + sizeof(CRLF) - 1          + sizeof("Auth-User: ") - 1 + login.len + sizeof(CRLF) - 1          + sizeof("Auth-Pass: ") - 1 + passwd.len + sizeof(CRLF) - 1          + sizeof("Auth-Salt: ") - 1 + s->salt.len          + sizeof("Auth-Protocol: ") - 1 + cscf->protocol->name.len                + sizeof(CRLF) - 1          + sizeof("Auth-Login-Attempt: ") - 1 + NGX_INT_T_LEN                + sizeof(CRLF) - 1          + sizeof("Client-IP: ") - 1 + s->connection->addr_text.len                + sizeof(CRLF) - 1          + ahcf->header.len          + sizeof(CRLF) - 1;    b = ngx_create_temp_buf(pool, len);    if (b == NULL) {        return NULL;    }    b->last = ngx_cpymem(b->last, "GET ", sizeof("GET ") - 1);    b->last = ngx_copy(b->last, ahcf->uri.data, ahcf->uri.len);    b->last = ngx_cpymem(b->last, " HTTP/1.0" CRLF,                         sizeof(" HTTP/1.0" CRLF) - 1);    b->last = ngx_cpymem(b->last, "Host: ", sizeof("Host: ") - 1);    b->last = ngx_copy(b->last, ahcf->host_header.data,                         ahcf->host_header.len);    *b->last++ = CR; *b->last++ = LF;    b->last = ngx_cpymem(b->last, "Auth-Method: ",                         sizeof("Auth-Method: ") - 1);    b->last = ngx_cpymem(b->last,                         ngx_mail_auth_http_method[s->auth_method].data,                         ngx_mail_auth_http_method[s->auth_method].len);    *b->last++ = CR; *b->last++ = LF;    b->last = ngx_cpymem(b->last, "Auth-User: ", sizeof("Auth-User: ") - 1);    b->last = ngx_copy(b->last, login.data, login.len);    *b->last++ = CR; *b->last++ = LF;    b->last = ngx_cpymem(b->last, "Auth-Pass: ", sizeof("Auth-Pass: ") - 1);    b->last = ngx_copy(b->last, passwd.data, passwd.len);    *b->last++ = CR; *b->last++ = LF;    if (s->auth_method != NGX_MAIL_AUTH_PLAIN && s->salt.len) {        b->last = ngx_cpymem(b->last, "Auth-Salt: ", sizeof("Auth-Salt: ") - 1);        b->last = ngx_copy(b->last, s->salt.data, s->salt.len);        s->passwd.data = NULL;    }    b->last = ngx_cpymem(b->last, "Auth-Protocol: ",                         sizeof("Auth-Protocol: ") - 1);    b->last = ngx_cpymem(b->last, cscf->protocol->name.data,                         cscf->protocol->name.len);    *b->last++ = CR; *b->last++ = LF;    b->last = ngx_sprintf(b->last, "Auth-Login-Attempt: %ui" CRLF,                          s->login_attempt);    b->last = ngx_cpymem(b->last, "Client-IP: ", sizeof("Client-IP: ") - 1);    b->last = ngx_copy(b->last, s->connection->addr_text.data,                         s->connection->addr_text.len);    *b->last++ = CR; *b->last++ = LF;    if (ahcf->header.len) {        b->last = ngx_copy(b->last, ahcf->header.data, ahcf->header.len);    }    /* add "\r\n" at the header end */    *b->last++ = CR; *b->last++ = LF;#if (NGX_DEBUG_MAIL_PASSWD)    {    ngx_str_t  l;    l.len = b->last - b->pos;    l.data = b->pos;    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,                   "mail auth http header:\n\"%V\"", &l);    }#endif    return b;}static ngx_int_tngx_mail_auth_http_escape(ngx_pool_t *pool, ngx_str_t *text, ngx_str_t *escaped){    u_char     *p;    uintptr_t   n;    n = ngx_escape_uri(NULL, text->data, text->len, NGX_ESCAPE_MAIL_AUTH);    if (n == 0) {        *escaped = *text;        return NGX_OK;    }    escaped->len = text->len + n * 2;    p = ngx_palloc(pool, escaped->len);    if (p == NULL) {        return NGX_ERROR;    }    (void) ngx_escape_uri(p, text->data, text->len, NGX_ESCAPE_MAIL_AUTH);    escaped->data = p;    return NGX_OK;}static void *ngx_mail_auth_http_create_conf(ngx_conf_t *cf){    ngx_mail_auth_http_conf_t  *ahcf;    ahcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_auth_http_conf_t));    if (ahcf == NULL) {        return NGX_CONF_ERROR;    }    ahcf->timeout = NGX_CONF_UNSET_MSEC;    ahcf->file = cf->conf_file->file.name.data;    ahcf->line = cf->conf_file->line;    return ahcf;}static char *ngx_mail_auth_http_merge_conf(ngx_conf_t *cf, void *parent, void *child){    ngx_mail_auth_http_conf_t *prev = parent;    ngx_mail_auth_http_conf_t *conf = child;    u_char           *p;    size_t            len;    ngx_uint_t        i;    ngx_table_elt_t  *header;    if (conf->peer == NULL) {        conf->peer = prev->peer;        conf->host_header = prev->host_header;        conf->uri = prev->uri;        if (conf->peer == NULL) {            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,                          "no \"http_auth\" is defined for server in %s:%ui",                          conf->file, conf->line);            return NGX_CONF_ERROR;        }    }    ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000);    if (conf->headers == NULL) {        conf->headers = prev->headers;        conf->header = prev->header;    }    if (conf->headers && conf->header.len == 0) {        len = 0;        header = conf->headers->elts;        for (i = 0; i < conf->headers->nelts; i++) {            len += header[i].key.len + 2 + header[i].value.len + 2;        }        p = ngx_palloc(cf->pool, len);        if (p == NULL) {            return NGX_CONF_ERROR;        }        conf->header.len = len;        conf->header.data = p;        for (i = 0; i < conf->headers->nelts; i++) {            p = ngx_cpymem(p, header[i].key.data, header[i].key.len);            *p++ = ':'; *p++ = ' ';            p = ngx_cpymem(p, header[i].value.data, header[i].value.len);            *p++ = CR; *p++ = LF;        }    }    return NGX_CONF_OK;}static char *ngx_mail_auth_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){    ngx_mail_auth_http_conf_t *ahcf = conf;    ngx_str_t  *value;    ngx_url_t   u;    value = cf->args->elts;    ngx_memzero(&u, sizeof(ngx_url_t));    u.url = value[1];    u.default_port = 80;    u.uri_part = 1;    u.one_addr = 1;    if (ngx_strncmp(u.url.data, "http://", 7) == 0) {        u.url.len -= 7;        u.url.data += 7;    }    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {        if (u.err) {            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                               "%s in auth_http \"%V\"", u.err, &u.url);        }        return NGX_CONF_ERROR;    }    ahcf->peer = u.addrs;    ahcf->host_header = u.host;    ahcf->uri = u.uri;    if (ahcf->uri.len == 0) {        ahcf->uri.len = sizeof("/") - 1;        ahcf->uri.data = (u_char *) "/";    }    return NGX_CONF_OK;}static char *ngx_mail_auth_http_header(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){    ngx_mail_auth_http_conf_t *ahcf = conf;    ngx_str_t        *value;    ngx_table_elt_t  *header;    if (ahcf->headers == NULL) {        ahcf->headers = ngx_array_create(cf->pool, 1, sizeof(ngx_table_elt_t));        if (ahcf->headers == NULL) {            return NGX_CONF_ERROR;        }    }    header = ngx_array_push(ahcf->headers);    if (header == NULL) {        return NGX_CONF_ERROR;    }    value = cf->args->elts;    header->key = value[1];    header->value = value[2];    return NGX_CONF_OK;}

⌨️ 快捷键说明

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