aboutsummaryrefslogtreecommitdiffstats
path: root/src/client/rspamc.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-09-04 15:28:28 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-09-04 15:28:28 +0100
commit7025b147cced04037ed0e7f7fea754aef495cea5 (patch)
tree58f1e2a43d0d7f8e091b3d1e05edf82b5a1ed774 /src/client/rspamc.c
parent5281989b8d889350570df72c05466212efb511ef (diff)
downloadrspamd-7025b147cced04037ed0e7f7fea754aef495cea5.tar.gz
rspamd-7025b147cced04037ed0e7f7fea754aef495cea5.zip
Always try to deliver message in --mime mode.
Diffstat (limited to 'src/client/rspamc.c')
-rw-r--r--src/client/rspamc.c127
1 files changed, 71 insertions, 56 deletions
diff --git a/src/client/rspamc.c b/src/client/rspamc.c
index 31075e8f3..2da12d346 100644
--- a/src/client/rspamc.c
+++ b/src/client/rspamc.c
@@ -852,7 +852,7 @@ rspamd_action_from_str (const gchar *data, gint *result)
}
static void
-rspamc_mime_output (FILE *out, ucl_object_t *result, GString *input)
+rspamc_mime_output (FILE *out, ucl_object_t *result, GString *input, GError *err)
{
GMimeStream *stream;
GByteArray ar;
@@ -880,48 +880,66 @@ rspamc_mime_output (FILE *out, ucl_object_t *result, GString *input)
return;
}
- metric = ucl_object_find_key (result, "default");
+ if (result) {
+ metric = ucl_object_find_key (result, "default");
- if (metric != NULL) {
- res = ucl_object_find_key (metric, "action");
+ if (metric != NULL) {
+ res = ucl_object_find_key (metric, "action");
- if (res) {
- action = ucl_object_tostring (res);
+ if (res) {
+ action = ucl_object_tostring (res);
+ }
}
- }
- rspamd_action_from_str (action, &act);
+ rspamd_action_from_str (action, &act);
- if (act < METRIC_ACTION_GREYLIST) {
- is_spam = TRUE;
- }
+ if (act < METRIC_ACTION_GREYLIST) {
+ is_spam = TRUE;
+ }
- hdr_scanned = "rspamc " RVERSION;
- g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam-Scanner",
- hdr_scanned);
- if (is_spam) {
- hdr_spam = "yes";
- g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam", hdr_spam);
- }
+ hdr_scanned = "rspamc " RVERSION;
+ g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam-Scanner",
+ hdr_scanned);
+ if (is_spam) {
+ hdr_spam = "yes";
+ g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam", hdr_spam);
+ }
+
+ g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam-Action",
+ action);
- g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam-Action",
- action);
+ if (json || raw) {
+ /* We also append json data as a specific header */
+ if (json) {
+ json_header = ucl_object_emit (result, UCL_EMIT_JSON);
+ }
+ else {
+ json_header = ucl_object_emit (result, UCL_EMIT_CONFIG);
+ }
- if (json || raw) {
- /* We also append json data as a specific header */
- if (json) {
- json_header = ucl_object_emit (result, UCL_EMIT_JSON);
+ json_header_encoded = rspamd_encode_base64_fold (json_header,
+ strlen (json_header), 60, NULL);
+ free (json_header);
+ g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam-Result",
+ json_header_encoded);
+ g_free (json_header_encoded);
+ }
+
+ ucl_object_unref (result);
+ }
+ else {
+ hdr_scanned = "rspamc " RVERSION;
+ g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam-Scanner",
+ hdr_scanned);
+
+ if (err && err->message) {
+ g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam-Error",
+ err->message);
}
else {
- json_header = ucl_object_emit (result, UCL_EMIT_CONFIG);
+ g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam-Error",
+ "Unknown error");
}
-
- json_header_encoded = rspamd_encode_base64_fold (json_header,
- strlen (json_header), 60, NULL);
- free (json_header);
- g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam-Result",
- json_header_encoded);
- g_free (json_header_encoded);
}
/* Write message */
@@ -935,11 +953,11 @@ rspamc_mime_output (FILE *out, ucl_object_t *result, GString *input)
static void
rspamc_client_execute_cmd (struct rspamc_command *cmd, ucl_object_t *result,
- GString *input)
+ GString *input, GError *err)
{
gchar **eargv;
gint eargc, infd, outfd, errfd;
- GError *err = NULL;
+ GError *exec_err = NULL;
GPid cld;
FILE *out;
gchar *ucl_out;
@@ -953,40 +971,37 @@ rspamc_client_execute_cmd (struct rspamc_command *cmd, ucl_object_t *result,
if (!g_spawn_async_with_pipes (NULL, eargv, NULL,
G_SPAWN_SEARCH_PATH|G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &cld,
- &infd, &outfd, &errfd, &err)) {
+ &infd, &outfd, &errfd, &exec_err)) {
- rspamd_fprintf (stderr, "Cannot execute %s: %e", execute, err);
- g_error_free (err);
+ rspamd_fprintf (stderr, "Cannot execute %s: %e", execute, exec_err);
+ g_error_free (exec_err);
}
else {
children = g_list_prepend (children, GSIZE_TO_POINTER (cld));
out = fdopen (infd, "w");
- if (result != NULL) {
-
- if (cmd->cmd == RSPAMC_COMMAND_SYMBOLS && mime_output && input) {
- rspamc_mime_output (out, result, input);
- }
- else {
- if (raw || cmd->command_output_func == NULL) {
- if (json) {
- ucl_out = ucl_object_emit (result, UCL_EMIT_JSON);
- }
- else {
- ucl_out = ucl_object_emit (result, UCL_EMIT_CONFIG);
- }
- rspamd_fprintf (out, "%s", ucl_out);
- free (ucl_out);
+ if (cmd->cmd == RSPAMC_COMMAND_SYMBOLS && mime_output && input) {
+ rspamc_mime_output (out, result, input, err);
+ }
+ else if (result) {
+ if (raw || cmd->command_output_func == NULL) {
+ if (json) {
+ ucl_out = ucl_object_emit (result, UCL_EMIT_JSON);
}
else {
- cmd->command_output_func (out, result);
+ ucl_out = ucl_object_emit (result, UCL_EMIT_CONFIG);
}
+ rspamd_fprintf (out, "%s", ucl_out);
+ free (ucl_out);
+ }
+ else {
+ cmd->command_output_func (out, result);
}
ucl_object_unref (result);
}
- else if (err != NULL) {
- rspamd_fprintf (out, "%s\n", err->message);
+ else {
+ rspamd_fprintf (out, "%e\n", err);
}
fflush (out);
@@ -1012,7 +1027,7 @@ rspamc_client_cb (struct rspamd_client_connection *conn,
if (execute) {
/* Pass all to the external command */
- rspamc_client_execute_cmd (cmd, result, input);
+ rspamc_client_execute_cmd (cmd, result, input, err);
}
else {
if (cmd->need_input) {