summaryrefslogtreecommitdiffstats
path: root/src/imap-login/imap-login-client.h
blob: 002829ba3a8340f54365ddd7b61cd7b2f9c69c44 (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#ifndef IMAP_LOGIN_CLIENT_H
#define IMAP_LOGIN_CLIENT_H

#include "net.h"
#include "imap-id.h"
#include "client-common.h"

/* Master prefix is: <1|0><imap tag><NUL> */
#define IMAP_TAG_MAX_LEN (LOGIN_MAX_MASTER_PREFIX_LEN-2)

/* maximum length for IMAP command line. */
#define IMAP_LOGIN_MAX_LINE_LENGTH 8192

enum imap_client_id_state {
	IMAP_CLIENT_ID_STATE_LIST = 0,
	IMAP_CLIENT_ID_STATE_KEY,
	IMAP_CLIENT_ID_STATE_VALUE
};

/* Multiple commands can be sent pipelined, so the sent_state is a bitmask */
enum imap_proxy_sent_state {
	IMAP_PROXY_SENT_STATE_ID		= 0x01,
	IMAP_PROXY_SENT_STATE_STARTTLS		= 0x02,
	IMAP_PROXY_SENT_STATE_CAPABILITY	= 0x04,
	IMAP_PROXY_SENT_STATE_AUTHENTICATE	= 0x08,
	IMAP_PROXY_SENT_STATE_AUTH_CONTINUE	= 0x10,
	IMAP_PROXY_SENT_STATE_LOGIN		= 0x20,

	IMAP_PROXY_SENT_STATE_COUNT = 6
};

enum imap_proxy_rcvd_state {
	IMAP_PROXY_RCVD_STATE_NONE,
	IMAP_PROXY_RCVD_STATE_BANNER,
	IMAP_PROXY_RCVD_STATE_ID,
	IMAP_PROXY_RCVD_STATE_STARTTLS,
	IMAP_PROXY_RCVD_STATE_CAPABILITY,
	IMAP_PROXY_RCVD_STATE_AUTH_CONTINUE,
	IMAP_PROXY_RCVD_STATE_LOGIN,

	IMAP_PROXY_RCVD_STATE_COUNT
};

struct imap_client_cmd_id {
	struct imap_parser *parser;

	enum imap_client_id_state state;
	char key[IMAP_ID_KEY_MAX_LEN+1];

	char **log_keys;
	string_t *log_reply;
};

struct imap_client {
	struct client common;

	const struct imap_login_settings *set;
	struct imap_parser *parser;
	char *proxy_backend_capability;

	const char *cmd_tag, *cmd_name;
	struct imap_client_cmd_id *cmd_id;

	enum imap_proxy_sent_state proxy_sent_state;
	enum imap_proxy_rcvd_state proxy_rcvd_state;

	bool cmd_finished:1;
	bool proxy_sasl_ir:1;
	bool proxy_logindisabled:1;
	bool proxy_seen_banner:1;
	bool skip_line:1;
	bool id_logged:1;
	bool proxy_capability_request_sent:1;
	bool client_ignores_capability_resp_code:1;
	bool auth_mech_name_parsed:1;
};

bool client_skip_line(struct imap_client *client);

enum imap_cmd_reply {
	IMAP_CMD_REPLY_OK,
	IMAP_CMD_REPLY_NO,
	IMAP_CMD_REPLY_BAD,
	IMAP_CMD_REPLY_BYE
};

void client_send_reply(struct client *client,
		       enum imap_cmd_reply reply, const char *text);
void client_send_reply_code(struct client *client,
			    enum imap_cmd_reply reply, const char *resp_code,
			    const char *text) ATTR_NULL(3);
bool client_handle_parser_error(struct imap_client *client,
				struct imap_parser *parser);

int cmd_id(struct imap_client *client);

#endif