if (cmd->privilleged && !session->authorized) {
r = snprintf (out_buf, sizeof (out_buf), "not authorized" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return 0;
}
int r;
r = snprintf (out_buf, sizeof (out_buf), "%s: %llu" CRLF, name, (unsigned long long int)cd->value);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, TRUE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, TRUE, FALSE);
}
static void
if (!arg || *arg == '\0') {
msg_debug ("process_command: empty password passed");
r = snprintf (out_buf, sizeof (out_buf), "password command requires one argument" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return;
}
if (password == NULL) {
r = snprintf (out_buf, sizeof (out_buf), "password command disabled in config, authorized access unallowed" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return;
}
if (strncmp (arg, password, strlen (arg)) == 0) {
session->authorized = 1;
r = snprintf (out_buf, sizeof (out_buf), "password accepted" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
}
else {
session->authorized = 0;
r = snprintf (out_buf, sizeof (out_buf), "password NOT accepted" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
}
break;
case COMMAND_QUIT:
case COMMAND_RELOAD:
if (check_auth (cmd, session)) {
r = snprintf (out_buf, sizeof (out_buf), "reload request sent" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
kill (getppid (), SIGHUP);
}
break;
(long int)mem_st.chunks_freed);
r += snprintf (out_buf + r, sizeof (out_buf) - r, "Oversized chunks: %ld" CRLF,
(long int)mem_st.oversized_chunks);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
}
break;
case COMMAND_SHUTDOWN:
if (check_auth (cmd, session)) {
r = snprintf (out_buf, sizeof (out_buf), "shutdown request sent" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
kill (getppid (), SIGTERM);
}
break;
minutes, minutes > 1 ? "s" : " ",
(int)uptime, uptime > 1 ? "s" : " ");
}
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
}
break;
case COMMAND_LEARN:
if (!arg || *arg == '\0') {
msg_debug ("process_command: no statfile specified in learn command");
r = snprintf (out_buf, sizeof (out_buf), "learn command requires at least two arguments: stat filename and its size" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return;
}
arg = *(cmd_args + 1);
if (arg == NULL || *arg == '\0') {
msg_debug ("process_command: no statfile size specified in learn command");
r = snprintf (out_buf, sizeof (out_buf), "learn command requires at least two arguments: stat filename and its size" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return;
}
size = strtoul (arg, &err_str, 10);
if (err_str && *err_str != '\0') {
msg_debug ("process_command: statfile size is invalid: %s", arg);
r = snprintf (out_buf, sizeof (out_buf), "learn size is invalid" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return;
}
statfile = g_hash_table_lookup (session->cfg->statfiles, *cmd_args);
if (statfile == NULL) {
r = snprintf (out_buf, sizeof (out_buf), "statfile %s is not defined" CRLF, *cmd_args);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return;
}
arg = *(cmd_args + 1);
if (!arg || *arg == '\0') {
r = snprintf (out_buf, sizeof (out_buf), "recipient is not defined" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return;
}
session->learn_rcpt = memory_pool_strdup (session->session_pool, arg);
arg = *(cmd_args + 1);
if (!arg || *arg == '\0') {
r = snprintf (out_buf, sizeof (out_buf), "from is not defined" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return;
}
session->learn_from = memory_pool_strdup (session->session_pool, arg);
break;
default:
r = snprintf (out_buf, sizeof (out_buf), "tokenizer is not defined" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return;
}
}
if (statfile_pool_create (session->worker->srv->statfile_pool,
session->learn_filename, statfile->size / sizeof (struct stat_file_block)) == -1) {
r = snprintf (out_buf, sizeof (out_buf), "cannot create statfile %s" CRLF, session->learn_filename);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return;
}
if (statfile_pool_open (session->worker->srv->statfile_pool, session->learn_filename) == -1) {
r = snprintf (out_buf, sizeof (out_buf), "cannot open statfile %s" CRLF, session->learn_filename);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
return;
}
}
" stat - show different rspamd stat" CRLF
" counters - show rspamd counters" CRLF
" uptime - rspamd uptime" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
break;
case COMMAND_COUNTERS:
rspamd_hash_foreach (counters, counter_write_callback, session);
case 0:
msg_debug ("Unknown command: '%s'", cmd);
i = snprintf (out_buf, sizeof (out_buf), "Unknown command" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE, FALSE);
break;
default:
msg_debug ("Ambigious command: '%s'", cmd);
i = snprintf (out_buf, sizeof (out_buf), "Ambigious command" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE, FALSE);
break;
}
}
session->state = STATE_REPLY;
}
if (session->state != STATE_LEARN) {
- rspamd_dispatcher_write (session->dispatcher, END, sizeof (END) - 1, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, END, sizeof (END) - 1, FALSE, TRUE);
}
g_strfreev (params);
if (!session->learn_tokenizer->tokenize_func (session->learn_tokenizer,
session->session_pool, &c, &tokens)) {
i = snprintf (out_buf, sizeof (out_buf), "learn fail, tokenizer error" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE, FALSE);
session->state = STATE_REPLY;
return;
}
session->learn_filename, tokens, session->in_class);
session->worker->srv->stat->messages_learned ++;
i = snprintf (out_buf, sizeof (out_buf), "learn ok" CRLF);
- rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE);
+ rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE, FALSE);
/* Clean learned parts */
while ((cur = g_list_first (session->parts))) {
new_session->dispatcher = rspamd_create_dispatcher (nfd, BUFFER_LINE, controller_read_socket,
controller_write_socket, controller_err_socket, &io_tv,
(void *)new_session);
- rspamd_dispatcher_write (new_session->dispatcher, greetingbuf, strlen (greetingbuf), FALSE);
+ rspamd_dispatcher_write (new_session->dispatcher, greetingbuf, strlen (greetingbuf), FALSE, FALSE);
}
void
else {
r = snprintf (outbuf, OUTBUFSIZ, "%d %s %s\r\n", code, rcode, msg);
}
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
}
int
else {
r = snprintf (outbuf, sizeof (outbuf), "HELO %s" CRLF, hostbuf);
}
- rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
cd->state = LMTP_WANT_MAIL;
break;
case LMTP_WANT_MAIL:
return;
}
r = snprintf (outbuf, sizeof (outbuf), "MAIL FROM: <%s>" CRLF, cd->task->from);
- rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
cd->state = LMTP_WANT_RCPT;
break;
case LMTP_WANT_RCPT:
cur = g_list_next (cur);
}
- rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
cd->state = LMTP_WANT_DATA;
break;
case LMTP_WANT_DATA:
return;
}
r = snprintf (outbuf, sizeof (outbuf), "DATA" CRLF);
- rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
cd->state = LMTP_WANT_DOT;
break;
case LMTP_WANT_DOT:
}
c = g_mime_object_to_string ((GMimeObject *)cd->task->message);
r = strlen (c);
- rspamd_dispatcher_write (cd->task->dispatcher, c, r, TRUE);
- g_free (c);
+ rspamd_dispatcher_write (cd->task->dispatcher, c, r, TRUE, TRUE);
+ memory_pool_add_destructor (cd->task->task_pool, (pool_destruct_func)g_free, c);
r = snprintf (outbuf, sizeof (outbuf), CRLF "." CRLF);
- rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
cd->state = LMTP_WANT_CLOSING;
case LMTP_WANT_CLOSING:
if (!parse_mta_str (in, cd)) {
urls_command_handler (struct worker_task *task)
{
GList *cur;
- char outbuf[16384], *urlstr;
- int r, num = 0;
+ char *outbuf, *urlstr;
+ int r, num = 0, buflen;
struct uri *url;
GError *err = NULL;
GTree *url_tree;
url_tree = g_tree_new ((GCompareFunc)g_ascii_strcasecmp);
- r = snprintf (outbuf, sizeof (outbuf), "%s 0 %s" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER, "OK");
+ /* First calculate buffer length */
+ cur = g_list_first (task->urls);
+ buflen = 0;
+ while (cur) {
+ url = cur->data;
+ buflen += strlen (struri (url)) + url->hostlen + sizeof (" <\"\">, ") - 1;
+ cur = g_list_next (cur);
+ }
+
+ buflen += sizeof (RSPAMD_REPLY_BANNER " 0 OK" CRLF CRLF);
+
+ outbuf = memory_pool_alloc (task->task_pool, buflen * sizeof (char));
+
+ r = snprintf (outbuf, buflen, "%s 0 %s" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER, "OK");
- r += snprintf (outbuf + r, sizeof (outbuf) - r - 2, "URLs: ");
+ r += snprintf (outbuf + r, buflen - r - 2, "URLs: ");
cur = g_list_first (task->urls);
f.len = url->hostlen;
if ((urlstr = format_surbl_request (task->task_pool, &f, NULL, &host_end, FALSE, &err)) != NULL) {
if (g_list_next (cur) != NULL) {
- r += snprintf (outbuf + r, sizeof (outbuf) - r - 2, "%s, ", (char *)urlstr);
+ r += snprintf (outbuf + r, buflen - r - 2, "%s <\"%s\">, ", (char *)urlstr, struri (url));
}
else {
- r += snprintf (outbuf + r, sizeof (outbuf) - r - 2, "%s", (char *)urlstr);
+ r += snprintf (outbuf + r, buflen - r - 2, "%s <\"%s\">", (char *)urlstr, struri (url));
}
}
}
outbuf[r++] = '\r'; outbuf[r++] = '\n';
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, TRUE);
msg_info ("process_message: msg ok, id: <%s>, %d urls extracted", task->message_id, num);
g_tree_destroy (url_tree);
/* Do header folding */
if (host.len + r >= OUTBUFSIZ - 3) {
outbuf[r ++] = '\r'; outbuf[r ++] = '\n'; outbuf[r] = ' ';
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE, FALSE);
r = 0;
}
/* Write url host to buf */
}
cur = g_list_next (cur);
}
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
}
static void
cd->log_offset += snprintf (cd->log_buf + cd->log_offset, cd->log_size - cd->log_offset,
"%s,", (char *)key);
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
}
static void
cur = g_list_next (cur);
}
g_list_free (symbols);
- rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
}
else {
g_hash_table_foreach (metric_res->symbols, metric_symbols_callback, cd);
#endif
}
else {
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
if (task->cmd == CMD_SYMBOLS && metric_value != NULL) {
show_metric_symbols (metric_res, cd);
struct metric_callback_data cd;
r = snprintf (outbuf, sizeof (outbuf), "%s 0 %s" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER, "OK");
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE, FALSE);
cd.task = task;
cd.log_buf = logbuf;
show_url_header (task);
}
msg_info ("%s", logbuf);
- rspamd_dispatcher_write (task->dispatcher, CRLF, sizeof (CRLF) - 1, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, CRLF, sizeof (CRLF) - 1, FALSE, TRUE);
return 0;
}
outmsg = g_mime_object_to_string (GMIME_OBJECT (task->message));
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE);
- rspamd_dispatcher_write (task->dispatcher, outmsg, strlen (outmsg), FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outmsg, strlen (outmsg), FALSE, TRUE);
- g_free (outmsg);
+ memory_pool_add_destructor (task->task_pool, (pool_destruct_func)g_free, outmsg);
return 0;
}
msg_debug ("write_reply: writing error: %s", outbuf);
}
/* Write to bufferevent error message */
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
}
else {
switch (task->cmd) {
case CMD_SKIP:
r = snprintf (outbuf, sizeof (outbuf), "%s 0 %s" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER,
SPAMD_OK);
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
break;
case CMD_PING:
r = snprintf (outbuf, sizeof (outbuf), "%s 0 PONG" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER);
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
break;
case CMD_OTHER:
return task->custom_cmd->func (task);