commit cf75891c808c2c9052a05776917eae0ef429ce8b
parent 8e72324cbcafe6bdbe04edd83dacc4f99636d3e1
Author: Charles Lehner <cel@celehner.com>
Date: Thu, 16 Jul 2015 17:58:47 -0400
managesieve: handle lines starting with "OK"
Count octets instead of waiting for OK
Diffstat:
2 files changed, 25 insertions(+), 17 deletions(-)
diff --git a/src/plugins/managesieve/managesieve.c b/src/plugins/managesieve/managesieve.c
@@ -20,6 +20,7 @@
#include <glib.h>
#include <glib/gi18n.h>
+#include <ctype.h>
#include "claws.h"
#include "account.h"
@@ -439,22 +440,22 @@ static void unquote_inplace(gchar *str)
static void parse_response(gchar *msg, SieveResult *result)
{
+ gchar *end;
+
/* response status */
- gchar *end = strchr(msg, ' ');
- if (end)
- *end++ = '\0';
- result->success = strcmp(msg, "OK") == 0;
- result->has_status = TRUE;
- if (!end) {
- result->code = SIEVE_CODE_NONE;
- result->description = NULL;
- result->has_octets = FALSE;
- result->octets = 0;
- return;
+ if (isalpha(msg[0])) {
+ end = strchr(msg, ' ');
+ if (end) {
+ *end++ = '\0';
+ while (*end == ' ')
+ end++;
+ }
+ result->success = strcmp(msg, "OK") == 0;
+ result->has_status = TRUE;
+ msg = end;
+ } else {
+ result->has_status = FALSE;
}
- while (*end == ' ')
- end++;
- msg = end;
/* response code */
if (msg[0] == '(' && (end = strchr(msg, ')'))) {
@@ -673,17 +674,23 @@ static gint sieve_session_recv_msg(Session *session, const gchar *msg)
} else {
parse_response((gchar *)msg, &result);
sieve_session->state = SIEVE_GETSCRIPT_DATA;
+ /* account for newline */
+ sieve_session->octets_remaining = result.octets + 1;
}
ret = SE_OK;
break;
case SIEVE_GETSCRIPT_DATA:
- if (response_is_ok(msg)) {
+ if (sieve_session->octets_remaining > 0) {
+ sieve_session->current_cmd->cb(sieve_session,
+ (gchar *)msg,
+ sieve_session->current_cmd->data);
+ sieve_session->octets_remaining -= strlen(msg) + 1;
+ } else if (response_is_ok(msg)) {
sieve_session->state = SIEVE_READY;
sieve_session->current_cmd->cb(sieve_session, NULL,
sieve_session->current_cmd->data);
} else {
- sieve_session->current_cmd->cb(sieve_session, (gchar *)msg,
- sieve_session->current_cmd->data);
+ log_warning(LOG_PROTOCOL, _("error occurred on SIEVE session\n"));
}
ret = SE_OK;
break;
diff --git a/src/plugins/managesieve/managesieve.h b/src/plugins/managesieve/managesieve.h
@@ -114,6 +114,7 @@ struct SieveSession
GSList *send_queue;
SieveErrorValue error;
SieveCommand *current_cmd;
+ guint octets_remaining;
gboolean use_auth;
SieveAuthType avail_auth_type;