📄 ngx_mail_parse.c
字号:
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 + -