aboutsummaryrefslogtreecommitdiff
path: root/src/imap/ngx_imap_parse.c
blob: 08ff863551991d8042338810b9ac542b6589c838 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>
#include <ngx_imap.h>


ngx_int_t ngx_pop3_parse_command(ngx_imap_request_t *r)
{
    u_char  ch, *p, *c;
    enum {
        sw_start = 0,
        sw_done
    } state;

    while (p < r->buf->last && state < sw_done) {
        ch = *p++;

        switch (state) {

        /* POP3 commands */
        case sw_start:
            if (ch == ' ') {
                c = r->buf->start;

                if (p - 1 - m == 4) {

                    if (*c == 'U' && *(c + 1) == 'S'
                        && *(c + 2) == 'E' && *(c + 3) == 'R')
                    {
                        r->command = NGX_POP3_USER;

                    } else if (*c == 'P' && *(c + 1) == 'A'
                               && *(c + 2) == 'A' && *(c + 3) == 'S')
                    {
                        r->method = NGX_POP3_PASS;

                    } else if (*c == 'Q' && *(c + 1) == 'U'
                               && *(c + 2) == 'I' && *(c + 3) == 'T')
                    {
                        r->method = NGX_POP3_QUIT;

                    } else if (*c == 'N' && *(c + 1) == 'O'
                               && *(c + 2) == 'O' && *(c + 3) == 'P')
                    {
                        r->method = NGX_POP3_NOOP;
                    }
                }

                state = sw_spaces_before_arg;
                break;
            }

            if (ch < 'A' || ch > 'Z') {
                return NGX_IMAP_PARSE_INVALID_COMMAND;
            }

            break;
        }

        /* suppress warning */
        case sw_done:
            break;
        }
    }

    return NGX_OK;
}