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

📄 ngx_mail_parse.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
            switch (ch) {            case '"':                if (!s->quoted) {                    break;                }                s->quoted = 0;                /* fall through */            case ' ':            case CR:            case LF:                arg = ngx_array_push(&s->args);                if (arg == NULL) {                    return NGX_ERROR;                }                arg->len = p - s->arg_start;                arg->data = s->arg_start;                s->arg_start = NULL;                switch (ch) {                case '"':                case ' ':                    state = sw_spaces_before_argument;                    break;                case CR:                    state = sw_almost_done;                    break;                case LF:                    goto done;                }                break;            case '\\':                if (s->quoted) {                    s->backslash = 1;                    state = sw_backslash;                }                break;            }            break;        case sw_backslash:            switch (ch) {            case CR:            case LF:                goto invalid;            default:                state = sw_argument;            }            break;        case sw_literal:            if (ch >= '0' && ch <= '9') {                s->literal_len = s->literal_len * 10 + (ch - '0');                break;            }            if (ch == '}') {                state = sw_start_literal_argument;                break;            }            if (ch == '+') {                state = sw_no_sync_literal_argument;                break;            }            goto invalid;        case sw_no_sync_literal_argument:            if (ch == '}') {                s->no_sync_literal = 1;                state = sw_start_literal_argument;                break;            }            goto invalid;        case sw_start_literal_argument:            switch (ch) {            case CR:                break;            case LF:                s->buffer->pos = p + 1;                s->arg_start = p + 1;                if (s->no_sync_literal == 0) {                    s->state = sw_literal_argument;                    return NGX_IMAP_NEXT;                }                state = sw_literal_argument;                s->no_sync_literal = 0;                break;            default:                goto invalid;            }            break;        case sw_literal_argument:            if (s->literal_len && --s->literal_len) {                break;            }            arg = ngx_array_push(&s->args);            if (arg == NULL) {                return NGX_ERROR;            }            arg->len = p + 1 - s->arg_start;            arg->data = s->arg_start;            s->arg_start = NULL;            state = sw_end_literal_argument;            break;        case sw_end_literal_argument:            switch (ch) {            case '{':                if (s->args.nelts <= 2) {                    state = sw_literal;                    break;                }                goto invalid;            case CR:                state = sw_almost_done;                break;            case LF:                goto done;            default:                state = sw_spaces_before_argument;                break;            }            break;        case sw_almost_done:            switch (ch) {            case LF:                goto done;            default:                goto invalid;            }        }    }    s->buffer->pos = p;    s->state = state;    return NGX_AGAIN;done:    s->buffer->pos = p + 1;    if (s->arg_start) {        arg = ngx_array_push(&s->args);        if (arg == NULL) {            return NGX_ERROR;        }        arg->len = s->arg_end - s->arg_start;        arg->data = s->arg_start;        s->arg_start = NULL;        s->cmd_start = NULL;        s->quoted = 0;        s->no_sync_literal = 0;        s->literal_len = 0;    }    s->state = (s->command != NGX_IMAP_AUTHENTICATE) ? sw_start : sw_argument;    return NGX_OK;invalid:    s->state = sw_start;    s->quoted = 0;    s->no_sync_literal = 0;    s->literal_len = 0;    return NGX_MAIL_PARSE_INVALID_COMMAND;}ngx_int_tngx_mail_smtp_parse_command(ngx_mail_session_t *s){    u_char      ch, *p, *c, c0, c1, c2, c3;    ngx_str_t  *arg;    enum {        sw_start = 0,        sw_spaces_before_argument,        sw_argument,        sw_almost_done    } state;    state = s->state;    for (p = s->buffer->pos; p < s->buffer->last; p++) {        ch = *p;        switch (state) {        /* SMTP command */        case sw_start:            if (ch == ' ' || ch == CR || ch == LF) {                c = s->buffer->start;                if (p - c == 4) {                    c0 = ngx_toupper(c[0]);                    c1 = ngx_toupper(c[1]);                    c2 = ngx_toupper(c[2]);                    c3 = ngx_toupper(c[3]);                    if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'O')                    {                        s->command = NGX_SMTP_HELO;                    } else if (c0 == 'E' && c1 == 'H' && c2 == 'L' && c3 == 'O')                    {                        s->command = NGX_SMTP_EHLO;                    } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T')                    {                        s->command = NGX_SMTP_QUIT;                    } else if (c0 == 'A' && c1 == 'U' && c2 == 'T' && c3 == 'H')                    {                        s->command = NGX_SMTP_AUTH;                    } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P')                    {                        s->command = NGX_SMTP_NOOP;                    } else if (c0 == 'M' && c1 == 'A' && c2 == 'I' && c3 == 'L')                    {                        s->command = NGX_SMTP_MAIL;                    } else if (c0 == 'R' && c1 == 'S' && c2 == 'E' && c3 == 'T')                    {                        s->command = NGX_SMTP_RSET;                    } else if (c0 == 'R' && c1 == 'C' && c2 == 'P' && c3 == 'T')                    {                        s->command = NGX_SMTP_RCPT;                    } else if (c0 == 'V' && c1 == 'R' && c2 == 'F' && c3 == 'Y')                    {                        s->command = NGX_SMTP_VRFY;                    } else if (c0 == 'E' && c1 == 'X' && c2 == 'P' && c3 == 'N')                    {                        s->command = NGX_SMTP_EXPN;                    } else if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'P')                    {                        s->command = NGX_SMTP_HELP;                    } else {                        goto invalid;                    }#if (NGX_MAIL_SSL)                } else if (p - c == 8) {                    if ((c[0] == 'S'|| c[0] == 's')                        && (c[1] == 'T'|| c[1] == 't')                        && (c[2] == 'A'|| c[2] == 'a')                        && (c[3] == 'R'|| c[3] == 'r')                        && (c[4] == 'T'|| c[4] == 't')                        && (c[5] == 'T'|| c[5] == 't')                        && (c[6] == 'L'|| c[6] == 'l')                        && (c[7] == 'S'|| c[7] == 's'))                    {                        s->command = NGX_SMTP_STARTTLS;                    } else {                        goto invalid;                    }#endif                } else {                    goto invalid;                }                switch (ch) {                case ' ':                    state = sw_spaces_before_argument;                    break;                case CR:                    state = sw_almost_done;                    break;                case LF:                    goto done;                }                break;            }            if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) {                goto invalid;            }            break;        case sw_spaces_before_argument:            switch (ch) {            case ' ':                break;            case CR:                state = sw_almost_done;                s->arg_end = p;                break;            case LF:                s->arg_end = p;                goto done;            default:                if (s->args.nelts <= 2) {                    state = sw_argument;                    s->arg_start = p;                    break;                }                goto invalid;            }            break;        case sw_argument:            switch (ch) {            case ' ':            case CR:            case LF:                arg = ngx_array_push(&s->args);                if (arg == NULL) {                    return NGX_ERROR;                }                arg->len = p - s->arg_start;                arg->data = s->arg_start;                s->arg_start = NULL;                switch (ch) {                case ' ':                    state = sw_spaces_before_argument;                    break;                case CR:                    state = sw_almost_done;                    break;                case LF:                    goto done;                }                break;            default:                break;            }            break;        case sw_almost_done:            switch (ch) {            case LF:                goto done;            default:                goto invalid;            }        }    }    s->buffer->pos = p;    s->state = state;    return NGX_AGAIN;done:    s->buffer->pos = p + 1;    if (s->arg_start) {        arg = ngx_array_push(&s->args);        if (arg == NULL) {            return NGX_ERROR;        }        arg->len = s->arg_end - s->arg_start;        arg->data = s->arg_start;        s->arg_start = NULL;    }    s->state = (s->command != NGX_SMTP_AUTH) ? sw_start : sw_argument;    return NGX_OK;invalid:    s->state = sw_start;    s->arg_start = NULL;    return NGX_MAIL_PARSE_INVALID_COMMAND;}ngx_int_tngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c){    ngx_str_t                 *arg;#if (NGX_MAIL_SSL)    if (ngx_mail_starttls_only(s, c)) {        return NGX_MAIL_PARSE_INVALID_COMMAND;    }#endif    arg = s->args.elts;    if (arg[0].len == 5) {        if (ngx_strncasecmp(arg[0].data, (u_char *) "LOGIN", 5) == 0) {            if (s->args.nelts == 1) {                return NGX_MAIL_AUTH_LOGIN;            }            return NGX_MAIL_PARSE_INVALID_COMMAND;        }        if (ngx_strncasecmp(arg[0].data, (u_char *) "PLAIN", 5) == 0) {            if (s->args.nelts == 1) {                return NGX_MAIL_AUTH_PLAIN;            }            if (s->args.nelts == 2) {                return ngx_mail_auth_plain(s, c, 1);            }        }        return NGX_MAIL_PARSE_INVALID_COMMAND;    }    if (arg[0].len == 8) {        if (s->args.nelts != 1) {            return NGX_MAIL_PARSE_INVALID_COMMAND;        }        if (ngx_strncasecmp(arg[0].data, (u_char *) "CRAM-MD5", 8) == 0) {            return NGX_MAIL_AUTH_CRAM_MD5;        }    }    return NGX_MAIL_PARSE_INVALID_COMMAND;}

⌨️ 快捷键说明

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