
/*
 * Copyright (C) Igor Sysoev
 */


#ifndef _NGX_IMAP_H_INCLUDED_
#define _NGX_IMAP_H_INCLUDED_


#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>
#include <ngx_event_connect.h>

#if (NGX_IMAP_SSL)
#include <ngx_imap_ssl_module.h>
#endif



typedef struct {
    void                  **main_conf;
    void                  **srv_conf;
} ngx_imap_conf_ctx_t;


typedef struct {
    in_addr_t               addr;
    in_port_t               port;
    int                     family;

    /* server ctx */
    ngx_imap_conf_ctx_t    *ctx;

    unsigned                bind:1;
} ngx_imap_listen_t;


typedef struct {
    in_addr_t               addr;
    ngx_imap_conf_ctx_t    *ctx;
    ngx_str_t               addr_text;
} ngx_imap_in_addr_t;


typedef struct {
    ngx_imap_in_addr_t     *addrs;       /* array of ngx_imap_in_addr_t */
    ngx_uint_t              naddrs;
} ngx_imap_in_port_t;


typedef struct {
    in_port_t               port;
    ngx_array_t             addrs;       /* array of ngx_imap_conf_in_addr_t */
} ngx_imap_conf_in_port_t;


typedef struct {
    in_addr_t               addr;
    ngx_imap_conf_ctx_t    *ctx;
    unsigned                bind:1;
} ngx_imap_conf_in_addr_t;


typedef struct {
    ngx_array_t             servers;     /* ngx_imap_core_srv_conf_t */
    ngx_array_t             listen;      /* ngx_imap_listen_t */
} ngx_imap_core_main_conf_t;


#define NGX_IMAP_POP3_PROTOCOL  0
#define NGX_IMAP_IMAP_PROTOCOL  1

typedef struct {
    ngx_msec_t              timeout;

    size_t                  imap_client_buffer_size;

    ngx_uint_t              protocol;

    ngx_flag_t              so_keepalive;

    ngx_str_t               pop3_capability;
    ngx_str_t               pop3_starttls_capability;
    ngx_str_t               imap_capability;
    ngx_str_t               imap_starttls_capability;
    ngx_str_t               imap_starttls_only_capability;

    ngx_array_t             pop3_capabilities;
    ngx_array_t             imap_capabilities;

    /* server ctx */
    ngx_imap_conf_ctx_t    *ctx;
} ngx_imap_core_srv_conf_t;


typedef struct {
    void                 *(*create_main_conf)(ngx_conf_t *cf);
    char                 *(*init_main_conf)(ngx_conf_t *cf, void *conf);

    void                 *(*create_srv_conf)(ngx_conf_t *cf);
    char                 *(*merge_srv_conf)(ngx_conf_t *cf, void *prev,
                                void *conf);
} ngx_imap_module_t;


typedef enum {
    ngx_imap_start = 0,
    ngx_imap_login,
    ngx_imap_user,
    ngx_imap_passwd,
} ngx_imap_state_e;


typedef enum {
    ngx_pop3_start = 0,
    ngx_pop3_user,
    ngx_pop3_passwd
} ngx_po3_state_e;


typedef struct {
    ngx_peer_connection_t   upstream;
    ngx_buf_t              *buffer;
} ngx_imap_proxy_ctx_t;


typedef struct {
    uint32_t                signature;         /* "IMAP" */

    ngx_connection_t       *connection;

    ngx_str_t               out;
    ngx_buf_t              *buffer;

    void                  **ctx;
    void                  **main_conf;
    void                  **srv_conf;

    ngx_imap_proxy_ctx_t   *proxy;

    ngx_uint_t              imap_state;

    unsigned                blocked:1;
    unsigned                quit:1;
    unsigned                protocol:1;
    unsigned                quoted:1;
    unsigned                backslash:1;
    unsigned                no_sync_literal:1;
    unsigned                starttls:1;

    ngx_str_t               login;
    ngx_str_t               passwd;

    ngx_str_t               tag;
    ngx_str_t               tagged_line;

    ngx_str_t              *addr_text;

    ngx_uint_t              command;
    ngx_array_t             args;

    ngx_uint_t              login_attempt;

    /* used to parse IMAP/POP3 command */

    ngx_uint_t              state;
    u_char                 *cmd_start;
    u_char                 *arg_start;
    u_char                 *arg_end;
    ngx_uint_t              literal_len;
} ngx_imap_session_t;


typedef struct {
    ngx_str_t              *client;
    ngx_imap_session_t     *session;
} ngx_imap_log_ctx_t;


#define NGX_POP3_USER       1
#define NGX_POP3_PASS       2
#define NGX_POP3_CAPA       3
#define NGX_POP3_QUIT       4
#define NGX_POP3_NOOP       5
#define NGX_POP3_STLS       6
#define NGX_POP3_APOP       7
#define NGX_POP3_STAT       8
#define NGX_POP3_LIST       9
#define NGX_POP3_RETR       10
#define NGX_POP3_DELE       11
#define NGX_POP3_RSET       12
#define NGX_POP3_TOP        13
#define NGX_POP3_UIDL       14


#define NGX_IMAP_LOGIN      1
#define NGX_IMAP_LOGOUT     2
#define NGX_IMAP_CAPABILITY 3
#define NGX_IMAP_NOOP       4
#define NGX_IMAP_STARTTLS   5

#define NGX_IMAP_NEXT       6


#define NGX_IMAP_PARSE_INVALID_COMMAND  20


#define NGX_IMAP_MODULE      0x50414D49     /* "IMAP" */

#define NGX_IMAP_MAIN_CONF   0x02000000
#define NGX_IMAP_SRV_CONF    0x04000000


#define NGX_IMAP_MAIN_CONF_OFFSET  offsetof(ngx_imap_conf_ctx_t, main_conf)
#define NGX_IMAP_SRV_CONF_OFFSET   offsetof(ngx_imap_conf_ctx_t, srv_conf)


#define ngx_imap_get_module_ctx(s, module)     (s)->ctx[module.ctx_index]
#define ngx_imap_set_ctx(s, c, module)         s->ctx[module.ctx_index] = c;
#define ngx_imap_delete_ctx(s, module)         s->ctx[module.ctx_index] = NULL;


#define ngx_imap_get_module_main_conf(s, module)                             \
    (s)->main_conf[module.ctx_index]
#define ngx_imap_get_module_srv_conf(s, module)  (s)->srv_conf[module.ctx_index]

#define ngx_imap_conf_get_module_main_conf(cf, module)                       \
    ((ngx_imap_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index]


void ngx_imap_init_connection(ngx_connection_t *c);
void ngx_imap_send(ngx_event_t *wev);
void ngx_imap_auth_state(ngx_event_t *rev);
void ngx_pop3_auth_state(ngx_event_t *rev);
void ngx_imap_close_connection(ngx_connection_t *c);
void ngx_imap_session_internal_server_error(ngx_imap_session_t *s);

ngx_int_t ngx_imap_parse_command(ngx_imap_session_t *s);
ngx_int_t ngx_pop3_parse_command(ngx_imap_session_t *s);


/* STUB */
void ngx_imap_proxy_init(ngx_imap_session_t *s, ngx_peers_t *peers);
void ngx_imap_auth_http_init(ngx_imap_session_t *s);
/**/


extern ngx_uint_t    ngx_imap_max_module;
extern ngx_module_t  ngx_imap_core_module;


#endif /* _NGX_IMAP_H_INCLUDED_ */
