
/*
 * 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_ */
