+2004-10-13 Not Zed <NotZed@Ximian.com>
+
+ * providers/imap4/camel-imap4-folder.c (camel_imap4_folder_new)
+ (imap4_sync_changes, imap4_sync):
+ * providers/imap4/camel-imap4-summary.c (untagged_fetch_all): kill
+ cast as lvalue warning.
+
+ * camel-string-utils.h: add prototype for camel_toupper.
+
+ * providers/imap4/camel-imap4-utils.c:
+ * providers/imap4/camel-imap4-summary.c:
+ * providers/imap4/camel-imap4-folder.c:
+ * providers/imap4/camel-imap4-engine.c:
+ * providers/imap4/camel-imap4-command.c:
+ * providers/imap4/camel-imap4-store.c: include camel-i18n.h.
+
+2004-10-12 Not Zed <NotZed@Ximian.com>
+
+ ** See bug ???
+
+ * providers/nntp/camel-nntp-store.c (connect_to_server): if we
+ have a username, try to authenticate before doing anything else.
+
+ ** See bug #67895.
+
+ * providers/nntp/camel-nntp-summary.c (add_range_xover)
+ (add_range_head): use raw_command_auth since we might need auth
+ here.
+
+ * providers/nntp/camel-nntp-store.c (camel_nntp_raw_command_auth):
+ new almost-raw command that also does auth.
+ (xover_setup, connect_to_server, camel_nntp_command): use
+ raw_command_auth since we might need auth here.
+
+2004-10-12 Not Zed <NotZed@Ximian.com>
+
+ ** See bug #67898 and probably others.
+
+ * providers/imapp/camel-imapp-store.c (connect_to_server):
+ * providers/pop3/camel-pop3-store.c (connect_to_server_wrapper):
+ * providers/imap4/camel-imap4-store.c (connect_to_server_wrapper):
+ * providers/imap/camel-imap-store.c (connect_to_server_wrapper):
+ * providers/nntp/camel-nntp-store.c (connect_to_server_wrapper):
+ * providers/smtp/camel-smtp-transport.c (connect_to_server_wrapper):
+ Fallback to hard-coded port number if the name lookup fails and no
+ port was supplied.
+
2004-10-11 Not Zed <NotZed@Ximian.com>
** See bug #67211.
const char *camel_strdown (char *str);
char camel_tolower(char c);
+char camel_toupper(char c);
#ifdef __cplusplus
}
#define d(x)
/* Specified in RFC 2060 */
-#define IMAP_PORT 143
-#define SIMAP_PORT 993
+#define IMAP_PORT "143"
+#define IMAPS_PORT "993"
static CamelDiscoStoreClass *parent_class = NULL;
static struct {
char *value;
char *serv;
+ char *port;
int mode;
} ssl_options[] = {
- { "", "imaps", MODE_SSL }, /* really old (1.x) */
- { "always", "imaps", MODE_SSL },
- { "when-possible", "imap", MODE_TLS },
- { "never", "imap", MODE_CLEAR },
- { NULL, "imap", MODE_CLEAR },
+ { "", "imaps", IMAPS_PORT, MODE_SSL }, /* really old (1.x) */
+ { "always", "imaps", IMAPS_PORT, MODE_SSL },
+ { "when-possible", "imap", IMAP_PORT, MODE_TLS },
+ { "never", "imap", IMAP_PORT, MODE_CLEAR },
+ { NULL, "imap", IMAP_PORT, MODE_CLEAR },
};
static gboolean
struct addrinfo hints, *ai;
int mode, ret, i;
char *serv;
-
+ const char *port;
+
if ((command = camel_url_get_param (service->url, "command")))
return connect_to_server_process (service, command, ex);
break;
mode = ssl_options[i].mode;
serv = ssl_options[i].serv;
+ port = ssl_options[i].port;
} else {
mode = MODE_CLEAR;
serv = "imap";
+ port = IMAP_PORT;
}
if (service->url->port) {
serv = g_alloca (16);
sprintf (serv, "%d", service->url->port);
+ port = NULL;
}
memset (&hints, 0, sizeof (hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = PF_UNSPEC;
- if (!(ai = camel_getaddrinfo (service->url->host, serv, &hints, ex)))
+ ai = camel_getaddrinfo(service->url->host, serv, &hints, ex);
+ if (ai == NULL && port != NULL && camel_exception_get_id(ex) != CAMEL_EXCEPTION_USER_CANCEL) {
+ camel_exception_clear (ex);
+ ai = camel_getaddrinfo(service->url->host, port, &hints, ex);
+ }
+ if (ai == NULL)
return FALSE;
-
+
ret = connect_to_server (service, ai, mode, ex);
camel_freeaddrinfo (ai);
#include <camel/camel-stream-null.h>
#include <camel/camel-stream-filter.h>
#include <camel/camel-mime-filter-crlf.h>
+#include <camel/camel-i18n.h>
#include "camel-imap4-stream.h"
#include "camel-imap4-engine.h"
#include <camel/camel-sasl.h>
#include <camel/camel-stream-buffer.h>
+#include <camel/camel-i18n.h>
#include "camel-imap4-summary.h"
#include "camel-imap4-command.h"
#include <camel/camel-stream-mem.h>
#include <camel/camel-stream-filter.h>
#include <camel/camel-mime-filter-crlf.h>
+#include <camel/camel-i18n.h>
#include "camel-imap4-utils.h"
#include "camel-imap4-store.h"
utf7_name = camel_utf8_utf7 (utf7_name);
- folder = (CamelFolder *) imap_folder = (CamelIMAP4Folder *) camel_object_new (CAMEL_TYPE_IMAP4_FOLDER);
+ folder = (CamelFolder *) (imap_folder = (CamelIMAP4Folder *)camel_object_new (CAMEL_TYPE_IMAP4_FOLDER));
camel_folder_construct (folder, store, full_name, name);
imap_folder->utf7_name = utf7_name;
continue;
for (j = 0; j < sync->len; j++) {
- iinfo = (CamelIMAP4MessageInfo *) info = sync->pdata[j];
+ iinfo = (CamelIMAP4MessageInfo *) (info = sync->pdata[j]);
camel_imap4_flags_diff (&diff, iinfo->server_flags, info->flags);
if (diff.changed & imap4_flags[i].flag) {
if (diff.bits & imap4_flags[i].flag) {
return-1;
for (i = 0; i < sync->len; i++) {
- iinfo = (CamelIMAP4MessageInfo *) info = sync->pdata[i];
+ iinfo = (CamelIMAP4MessageInfo *) (info = sync->pdata[i]);
info->flags &= ~CAMEL_MESSAGE_FOLDER_FLAGGED;
iinfo->server_flags = info->flags & folder->permanent_flags;
}
sync = g_ptr_array_new ();
max = camel_folder_summary_count (folder->summary);
for (i = 0; i < max; i++) {
- iinfo = (CamelIMAP4MessageInfo *) info = camel_folder_summary_index (folder->summary, i);
+ iinfo = (CamelIMAP4MessageInfo *) (info = camel_folder_summary_index (folder->summary, i));
if (info->flags & CAMEL_MESSAGE_FOLDER_FLAGGED) {
camel_imap4_flags_diff (&diff, iinfo->server_flags, info->flags);
diff.changed &= folder->permanent_flags;
#include <camel/camel-private.h>
+#include <camel/camel-i18n.h>
+
#include "camel-imap4-store.h"
#include "camel-imap4-engine.h"
#include "camel-imap4-folder.h"
static struct {
char *value;
char *serv;
+ char *port;
int mode;
} ssl_options[] = {
- { "", "imaps", MODE_SSL }, /* really old (1.x) */
- { "always", "imaps", MODE_SSL },
- { "when-possible", "imap", MODE_TLS },
- { "never", "imap", MODE_CLEAR },
- { NULL, "imap", MODE_CLEAR },
+ { "", "imaps", "993", MODE_SSL }, /* really old (1.x) */
+ { "always", "imaps", "993", MODE_SSL },
+ { "when-possible", "imap", "143", MODE_TLS },
+ { "never", "imap", "143", MODE_CLEAR },
+ { NULL, "imap", "143", MODE_CLEAR },
};
static gboolean
const char *ssl_mode;
int mode, ret, i;
char *serv;
-
+ const char *port;
+
if ((ssl_mode = camel_url_get_param (service->url, "use_ssl"))) {
for (i = 0; ssl_options[i].value; i++)
if (!strcmp (ssl_options[i].value, ssl_mode))
break;
mode = ssl_options[i].mode;
serv = ssl_options[i].serv;
+ port = ssl_options[i].port;
} else {
mode = MODE_CLEAR;
serv = "imap";
+ port = "143";
}
if (service->url->port) {
serv = g_alloca (16);
sprintf (serv, "%d", service->url->port);
+ port = NULL;
}
memset (&hints, 0, sizeof (hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = PF_UNSPEC;
- if (!(ai = camel_getaddrinfo (service->url->host, serv, &hints, ex)))
+ ai = camel_getaddrinfo (service->url->host, serv, &hints, ex);
+ if (ai == NULL && port != NULL && camel_exception_get_id(ex) != CAMEL_EXCEPTION_USER_CANCEL) {
+ camel_exception_clear (ex);
+ ai = camel_getaddrinfo (service->url->host, port, &hints, ex);
+ }
+ if (ai == NULL)
return FALSE;
ret = connect_to_server (engine, ai, mode, ex);
#include <e-util/md5-utils.h>
#include <camel/camel-file-utils.h>
+#include <camel/camel-i18n.h>
#include "camel-imap4-store.h"
#include "camel-imap4-engine.h"
* server is probably notifying us of a FLAGS change
* by another client? */
g_assert (index < summary->messages->len);
- iinfo = (CamelIMAP4MessageInfo *) info = summary->messages->pdata[index - 1];
+ iinfo = (CamelIMAP4MessageInfo *)(info = summary->messages->pdata[index - 1]);
g_assert (info != NULL);
} else {
if (index > (added->len + fetch->first - 1))
g_ptr_array_set_size (added, index - fetch->first + 1);
if (!(envelope = added->pdata[index - fetch->first])) {
- iinfo = (CamelIMAP4MessageInfo *) info = camel_folder_summary_info_new (summary);
+ iinfo = (CamelIMAP4MessageInfo *) (info = camel_folder_summary_info_new (summary));
envelope = g_new (struct imap4_envelope_t, 1);
added->pdata[index - fetch->first] = envelope;
envelope->info = info;
envelope->changed = 0;
} else {
- iinfo = (CamelIMAP4MessageInfo *) info = envelope->info;
+ iinfo = (CamelIMAP4MessageInfo *) (info = envelope->info);
}
}
#include <errno.h>
#include <camel/camel-store.h>
+#include <camel/camel-i18n.h>
#include "camel-imap4-engine.h"
#include "camel-imap4-stream.h"
ex = camel_exception_new();
CAMEL_TRY {
char *serv;
+ const char *port = NULL;
struct addrinfo *ai, hints = { 0 };
/* parent class connect initialization */
if (service->url->port) {
serv = g_alloca(16);
sprintf(serv, "%d", service->url->port);
- } else
+ } else {
serv = "imap";
+ port = "143";
+ }
#ifdef HAVE_SSL
if (camel_url_get_param (service->url, "use_ssl")) {
if (try_starttls)
tcp_stream = camel_tcp_stream_ssl_new_raw (service->session, service->url->host, STARTTLS_FLAGS);
else {
- if (service->url->port == 0)
+ if (service->url->port == 0) {
serv = "imaps";
+ port = "993";
+ }
tcp_stream = camel_tcp_stream_ssl_new (service->session, service->url->host, SSL_PORT_FLAGS);
}
} else {
hints.ai_socktype = SOCK_STREAM;
ai = camel_getaddrinfo(service->url->host, serv, &hints, ex);
+ if (ex->id && ex->id != CAMEL_EXCEPTION_USER_CANCEL && port != NULL) {
+ camel_exception_clear(ex);
+ ai = camel_getaddrinfo(service->url->host, port, &hints, ex);
+ }
+
if (ex->id)
camel_exception_throw_ex(ex);
extern int camel_verbose_debug;
#define dd(x) (camel_verbose_debug?(x):0)
-#define NNTP_PORT 119
-#define NNTPS_PORT 563
+#define NNTP_PORT "119"
+#define NNTPS_PORT "563"
#define DUMP_EXTENSIONS
#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
#define CNNTPF_CLASS(so) CAMEL_NNTP_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
+static int camel_nntp_try_authenticate (CamelNNTPStore *store, CamelException *ex);
+
static void nntp_construct (CamelService *service, CamelSession *session,
CamelProvider *provider, CamelURL *url,
CamelException *ex);
if (store->xover || getenv("CAMEL_NNTP_DISABLE_XOVER") != NULL)
return 0;
- ret = camel_nntp_raw_command(store, ex, &line, "list overview.fmt");
+ ret = camel_nntp_raw_command_auth(store, ex, &line, "list overview.fmt");
if (ret == -1) {
camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM,
_("NNTP Command failed: %s"), g_strerror(errno));
goto fail;
}
-
- /* set 'reader' mode & ignore return code, also ping the server, inn goes offline very quickly otherwise */
- if (camel_nntp_raw_command (store, ex, (char **) &buf, "mode reader") == -1
- || camel_nntp_raw_command (store, ex, (char **) &buf, "date") == -1)
+
+ /* if we have username, try it here */
+ if (service->url->user != NULL
+ && camel_nntp_try_authenticate(store, ex) != NNTP_AUTH_ACCEPTED)
goto fail;
+
+ /* set 'reader' mode & ignore return code, also ping the server, inn goes offline very quickly otherwise */
+ if (camel_nntp_raw_command_auth (store, ex, (char **) &buf, "mode reader") == -1
+ || camel_nntp_raw_command_auth (store, ex, (char **) &buf, "date") == -1)
+ goto fail;
if (xover_setup(store, ex) == -1)
goto fail;
static struct {
char *value;
char *serv;
+ char *port;
int mode;
} ssl_options[] = {
- { "", "nntps", MODE_SSL }, /* really old (1.x) */
- { "always", "nntps", MODE_SSL },
- { "when-possible", "nntp", MODE_TLS },
- { "never", "nntp", MODE_CLEAR },
- { NULL, "nntp", MODE_CLEAR },
+ { "", "nntps", NNTPS_PORT, MODE_SSL }, /* really old (1.x) */
+ { "always", "nntps", NNTPS_PORT, MODE_SSL },
+ { "when-possible", "nntp", NNTP_PORT, MODE_TLS },
+ { "never", "nntp", NNTP_PORT, MODE_CLEAR },
+ { NULL, "nntp", NNTP_PORT, MODE_CLEAR },
};
static gboolean
const char *ssl_mode;
int mode, ret, i;
char *serv;
+ const char *port;
if ((ssl_mode = camel_url_get_param (service->url, "use_ssl"))) {
for (i = 0; ssl_options[i].value; i++)
break;
mode = ssl_options[i].mode;
serv = ssl_options[i].serv;
+ port = ssl_options[i].port;
} else {
mode = MODE_CLEAR;
serv = "nntp";
+ port = NNTP_PORT;
}
if (service->url->port) {
serv = g_alloca (16);
sprintf (serv, "%d", service->url->port);
+ port = NULL;
}
memset (&hints, 0, sizeof (hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = PF_UNSPEC;
- if (!(ai = camel_getaddrinfo (service->url->host, serv, &hints, ex)))
+ ai = camel_getaddrinfo(service->url->host, serv, &hints, ex);
+ if (ai == NULL && port != NULL && camel_exception_get_id(ex) != CAMEL_EXCEPTION_USER_CANCEL) {
+ camel_exception_clear (ex);
+ ai = camel_getaddrinfo(service->url->host, port, &hints, ex);
+ }
+ if (ai == NULL)
return FALSE;
ret = connect_to_server (service, ai, mode, ex);
return ret;
}
+/* use this where you also need auth to be handled, i.e. most cases where you'd try raw command */
+int
+camel_nntp_raw_command_auth(CamelNNTPStore *store, CamelException *ex, char **line, const char *fmt, ...)
+{
+ int ret, retry, go;
+ va_list ap;
+
+ retry = 0;
+
+ do {
+ go = FALSE;
+ retry++;
+
+ va_start(ap, fmt);
+ ret = camel_nntp_raw_commandv(store, ex, line, fmt, ap);
+ va_end(ap);
+
+ if (ret == NNTP_AUTH_REQUIRED) {
+ if (camel_nntp_try_authenticate(store, ex) != NNTP_AUTH_ACCEPTED)
+ return -1;
+ go = TRUE;
+ }
+ } while (retry < 3 && go);
+
+ return ret;
+}
+
int
camel_nntp_command (CamelNNTPStore *store, CamelException *ex, CamelNNTPFolder *folder, char **line, const char *fmt, ...)
{
if (folder != NULL
&& (store->current_folder == NULL || strcmp(store->current_folder, ((CamelFolder *)folder)->full_name) != 0)) {
- ret = camel_nntp_raw_command(store, ex, line, "group %s", ((CamelFolder *)folder)->full_name);
+ ret = camel_nntp_raw_command_auth(store, ex, line, "group %s", ((CamelFolder *)folder)->full_name);
if (ret == 211) {
g_free(store->current_folder);
store->current_folder = g_strdup(((CamelFolder *)folder)->full_name);
int camel_nntp_raw_commandv (CamelNNTPStore *store, struct _CamelException *ex, char **line, const char *fmt, va_list ap);
int camel_nntp_raw_command(CamelNNTPStore *store, struct _CamelException *ex, char **line, const char *fmt, ...);
+int camel_nntp_raw_command_auth(CamelNNTPStore *store, struct _CamelException *ex, char **line, const char *fmt, ...);
int camel_nntp_command (CamelNNTPStore *store, struct _CamelException *ex, struct _CamelNNTPFolder *folder, char **line, const char *fmt, ...);
#ifdef __cplusplus
camel_operation_start(NULL, _("%s: Scanning new messages"), ((CamelService *)store)->url->host);
- ret = camel_nntp_raw_command(store, ex, &line, "xover %r", low, high);
+ ret = camel_nntp_raw_command_auth(store, ex, &line, "xover %r", low, high);
if (ret != 224) {
camel_operation_end(NULL);
if (ret != -1)
for (i=low;i<high+1;i++) {
camel_operation_progress(NULL, (count * 100) / total);
count++;
- ret = camel_nntp_raw_command(store, ex, &line, "head %u", i);
+ ret = camel_nntp_raw_command_auth(store, ex, &line, "head %u", i);
/* unknown article, ignore */
if (ret == 423)
continue;
#include "camel-i18n.h"
/* Specified in RFC 1939 */
-#define POP3_PORT 110
+#define POP3_PORT "110"
+#define POP3S_PORT "995"
static CamelStoreClass *parent_class = NULL;
static struct {
char *value;
char *serv;
+ char *port;
int mode;
} ssl_options[] = {
- { "", "pop3s", MODE_SSL }, /* really old (1.x) */
- { "always", "pop3s", MODE_SSL },
- { "when-possible", "pop3", MODE_TLS },
- { "never", "pop3", MODE_CLEAR },
- { NULL, "pop3", MODE_CLEAR },
+ { "", "pop3s", POP3S_PORT, MODE_SSL }, /* really old (1.x) */
+ { "always", "pop3s", POP3S_PORT, MODE_SSL },
+ { "when-possible", "pop3", POP3S_PORT, MODE_TLS },
+ { "never", "pop3", POP3S_PORT, MODE_CLEAR },
+ { NULL, "pop3", POP3S_PORT, MODE_CLEAR },
};
static gboolean
const char *ssl_mode;
int mode, ret, i;
char *serv;
-
+ const char *port;
+
if ((ssl_mode = camel_url_get_param (service->url, "use_ssl"))) {
for (i = 0; ssl_options[i].value; i++)
if (!strcmp (ssl_options[i].value, ssl_mode))
break;
mode = ssl_options[i].mode;
serv = ssl_options[i].serv;
+ port = ssl_options[i].port;
} else {
mode = MODE_CLEAR;
serv = "pop3";
+ port = POP3S_PORT;
}
if (service->url->port) {
serv = g_alloca (16);
sprintf (serv, "%d", service->url->port);
+ port = NULL;
}
memset (&hints, 0, sizeof (hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = PF_UNSPEC;
- if (!(ai = camel_getaddrinfo (service->url->host, serv, &hints, ex)))
+ ai = camel_getaddrinfo(service->url->host, serv, &hints, ex);
+ if (ai == NULL && port != NULL && camel_exception_get_id(ex) != CAMEL_EXCEPTION_USER_CANCEL) {
+ camel_exception_clear (ex);
+ ai = camel_getaddrinfo(service->url->host, port, &hints, ex);
+ }
+ if (ai == NULL)
return FALSE;
ret = connect_to_server (service, ai, mode, ex);
#define d(x) (camel_verbose_debug ? (x) : 0)
/* Specified in RFC 821 */
-#define SMTP_PORT 25
+#define SMTP_PORT "25"
+#define SMTPS_PORT "465"
/* camel smtp transport class prototypes */
static gboolean smtp_send_to (CamelTransport *transport, CamelMimeMessage *message,
static struct {
char *value;
char *serv;
+ char *port;
int mode;
} ssl_options[] = {
- { "", "smtps", MODE_SSL }, /* really old (1.x) */
- { "always", "smtps", MODE_SSL },
- { "when-possible", "smtp", MODE_TLS },
- { "never", "smtp", MODE_CLEAR },
- { NULL, "smtp", MODE_CLEAR },
+ { "", "smtps", SMTPS_PORT, MODE_SSL }, /* really old (1.x) */
+ { "always", "smtps", SMTPS_PORT, MODE_SSL },
+ { "when-possible", "smtp", SMTP_PORT, MODE_TLS },
+ { "never", "smtp", SMTP_PORT, MODE_CLEAR },
+ { NULL, "smtp", SMTP_PORT, MODE_CLEAR },
};
static gboolean
const char *ssl_mode;
int mode, ret, i;
char *serv;
+ const char *port;
if ((ssl_mode = camel_url_get_param (service->url, "use_ssl"))) {
for (i = 0; ssl_options[i].value; i++)
break;
mode = ssl_options[i].mode;
serv = ssl_options[i].serv;
+ port = ssl_options[i].port;
} else {
mode = MODE_CLEAR;
serv = "smtp";
+ port = SMTP_PORT;
}
if (service->url->port) {
serv = g_alloca (16);
sprintf (serv, "%d", service->url->port);
+ port = NULL;
}
memset (&hints, 0, sizeof (hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = PF_UNSPEC;
- if (!(ai = camel_getaddrinfo (service->url->host, serv, &hints, ex)))
+ ai = camel_getaddrinfo(service->url->host, serv, &hints, ex);
+ if (ai == NULL && port != NULL && camel_exception_get_id(ex) != CAMEL_EXCEPTION_USER_CANCEL) {
+ camel_exception_clear (ex);
+ ai = camel_getaddrinfo(service->url->host, port, &hints, ex);
+ }
+ if (ai == NULL)
return FALSE;
-
+
ret = connect_to_server (service, ai, mode, ex);
camel_freeaddrinfo (ai);