aboutsummaryrefslogtreecommitdiffstats
path: root/src/libserver/protocol.h
blob: 460e70fd6d7aedb68bcc78004751217ed1cccafe (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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/**
 * @file protocol.h
 * Rspamd protocol definition
 */

#ifndef RSPAMD_PROTOCOL_H
#define RSPAMD_PROTOCOL_H

#include "config.h"
#include "scan_result.h"
#include "libserver/http/http_connection.h"
#include "task.h"

#ifdef  __cplusplus
extern "C" {
#endif

#define RSPAMD_BASE_ERROR 500
#define RSPAMD_FILTER_ERROR RSPAMD_BASE_ERROR + 1
#define RSPAMD_NETWORK_ERROR RSPAMD_BASE_ERROR + 2
#define RSPAMD_PROTOCOL_ERROR RSPAMD_BASE_ERROR + 3
#define RSPAMD_LENGTH_ERROR RSPAMD_BASE_ERROR + 4
#define RSPAMD_STATFILE_ERROR RSPAMD_BASE_ERROR + 5

struct rspamd_protocol_log_symbol_result {
	guint32 id;
	float score;
};
struct rspamd_protocol_log_message_sum {
	guint32 nresults;
	guint32 nextra;
	guint32 settings_id;
	gdouble score;
	gdouble required_score;
	struct rspamd_protocol_log_symbol_result results[];
};

struct rspamd_metric;

/**
 * Process headers into HTTP message and set appropriate task fields
 * @param task
 * @param msg
 * @return
 */
gboolean rspamd_protocol_handle_headers (struct rspamd_task *task,
										 struct rspamd_http_message *msg);

/**
 * Process control chunk and update task structure accordingly
 * @param task
 * @param control
 * @return
 */
gboolean rspamd_protocol_handle_control (struct rspamd_task *task,
										 const ucl_object_t *control);

/**
 * Process HTTP request to the task structure
 * @param task
 * @param msg
 * @return
 */
gboolean rspamd_protocol_handle_request (struct rspamd_task *task,
										 struct rspamd_http_message *msg);

/**
 * Write task results to http message
 * @param msg
 * @param task
 */
void rspamd_protocol_http_reply (struct rspamd_http_message *msg,
								 struct rspamd_task *task, ucl_object_t **pobj);

/**
 * Write data to log pipes
 * @param task
 */
void rspamd_protocol_write_log_pipe (struct rspamd_task *task);

enum rspamd_protocol_flags {
	RSPAMD_PROTOCOL_BASIC = 1 << 0,
	RSPAMD_PROTOCOL_METRICS = 1 << 1,
	RSPAMD_PROTOCOL_MESSAGES = 1 << 2,
	RSPAMD_PROTOCOL_RMILTER = 1 << 3,
	RSPAMD_PROTOCOL_DKIM = 1 << 4,
	RSPAMD_PROTOCOL_URLS = 1 << 5,
	RSPAMD_PROTOCOL_EXTRA = 1 << 6,
};

#define RSPAMD_PROTOCOL_DEFAULT (RSPAMD_PROTOCOL_BASIC| \
        RSPAMD_PROTOCOL_METRICS| \
        RSPAMD_PROTOCOL_MESSAGES| \
        RSPAMD_PROTOCOL_RMILTER| \
        RSPAMD_PROTOCOL_DKIM| \
        RSPAMD_PROTOCOL_EXTRA)

/**
 * Write reply to ucl object filling log buffer
 * @param task
 * @param logbuf
 * @return
 */
ucl_object_t *rspamd_protocol_write_ucl (struct rspamd_task *task,
										 enum rspamd_protocol_flags flags);

/**
 * Write reply for specified task command
 * @param task task object
 * @return 0 if we wrote reply and -1 if there was some error
 */
void rspamd_protocol_write_reply (struct rspamd_task *task, ev_tstamp timeout);

/**
 * Convert rspamd output to legacy protocol reply
 * @param task
 * @param top
 * @param out
 */
void rspamd_ucl_torspamc_output (const ucl_object_t *top,
								 rspamd_fstring_t **out);

void rspamd_ucl_tospamc_output (const ucl_object_t *top,
								rspamd_fstring_t **out);

#ifdef  __cplusplus
}
#endif

#endif