Fix a bug in error-setting code. (pop3_connect): Don't re-prompt for

* providers/pop3/camel-pop3-store.c (camel_pop3_command): Fix a
	bug in error-setting code.
	(pop3_connect): Don't re-prompt for password in the KPOP case.
	(pop3_get_response): New function, split out from
	camel_pop3_command.
	(connect_to_server): Use pop3_get_response to parse the greeting
	message, and error out appropriately if it's -ERR.

svn path=/trunk/; revision=3869
This commit is contained in:
Dan Winship
2000-07-03 14:36:40 +00:00
parent 9ec7ff026c
commit bd3e2e1b65
2 changed files with 48 additions and 22 deletions

View File

@ -1,3 +1,13 @@
2000-07-03 Dan Winship <danw@helixcode.com>
* providers/pop3/camel-pop3-store.c (camel_pop3_command): Fix a
bug in error-setting code.
(pop3_connect): Don't re-prompt for password in the KPOP case.
(pop3_get_response): New function, split out from
camel_pop3_command.
(connect_to_server): Use pop3_get_response to parse the greeting
message, and error out appropriately if it's -ERR.
2000-07-02 Dan Winship <danw@helixcode.com>
* camel-folder.c (camel_folder_freeze, camel_folder_thaw): New

View File

@ -70,6 +70,8 @@ static char *get_folder_name (CamelStore *store, const char *folder_name,
CamelException *ex);
static char *get_root_folder_name (CamelStore *store, CamelException *ex);
static int pop3_get_response (CamelPop3Store *store, char **ret);
static void
camel_pop3_store_class_init (CamelPop3StoreClass *camel_pop3_store_class)
@ -252,16 +254,19 @@ connect_to_server (CamelService *service, gboolean real, CamelException *ex)
store->istream = camel_stream_buffer_new (store->ostream,
CAMEL_STREAM_BUFFER_READ);
/* Read the greeting, note APOP timestamp, if any. */
buf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (store->istream));
if (!buf) {
/* Read the greeting, check status */
status = pop3_get_response (store, &buf);
if (status != CAMEL_POP3_OK) {
camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
"Could not read greeting from POP "
"server: %s",
camel_exception_get_description (ex));
"%s: %s", status == CAMEL_POP3_ERR ?
"Error connecting to POP server" :
"Error reading greeting from POP server",
buf);
g_free (buf);
pop3_disconnect (service, ex);
return FALSE;
}
apoptime = strchr (buf, '<');
apopend = apoptime ? strchr (apoptime, '>') : NULL;
if (apopend) {
@ -292,6 +297,7 @@ connect_to_server (CamelService *service, gboolean real, CamelException *ex)
while (*p) {
len = strcspn (p, "\n");
if (!strncmp (p, "IMPLEMENTATION ", 15)) {
g_free (store->implementation);
store->implementation =
g_strndup (p + 15, len - 15);
} else if (len == 3 && !strncmp (p, "TOP", 3))
@ -407,10 +413,11 @@ pop3_connect (CamelService *service, CamelException *ex)
char *msg, *errbuf = NULL;
gboolean authenticated = FALSE;
gboolean auth_supported = TRUE;
gboolean kpop = FALSE;
#ifdef HAVE_KRB4
gboolean kpop = (service->url->authmech &&
!strcmp (service->url->authmech, "+KPOP"));
kpop = (service->url->authmech &&
!strcmp (service->url->authmech, "+KPOP"));
if (kpop && service->url->port == 0)
service->url->port = KPOP_PORT;
@ -420,11 +427,6 @@ pop3_connect (CamelService *service, CamelException *ex)
return FALSE;
while (auth_supported && !authenticated) {
/* The KPOP code will have set the password to be the username
* in connect_to_server. Password and APOP are the only other
* cases, and they both need a password.
*/
if (errbuf) {
/* We need to un-cache the password before prompting again */
camel_session_query_authenticator (camel_service_get_session (service),
@ -434,6 +436,10 @@ pop3_connect (CamelService *service, CamelException *ex)
service->url->passwd = NULL;
}
/* The KPOP code will have set the password to be the username
* in connect_to_server. Password and APOP are the only other
* cases, and they both need a password.
*/
if (!service->url->passwd) {
char *prompt;
@ -455,9 +461,12 @@ pop3_connect (CamelService *service, CamelException *ex)
}
}
if (!service->url->authmech || !strcmp (service->url->authmech, "+KPOP")) {
if (!service->url->authmech || kpop) {
status = camel_pop3_command (store, &msg, "USER %s", service->url->user);
if (status != CAMEL_POP3_OK) {
if (kpop)
goto lose;
errbuf = g_strdup_printf ("Unable to connect to POP server.\n"
"Error sending username: %s\n\n",
msg ? msg : "(Unknown)");
@ -606,16 +615,14 @@ get_root_folder_name (CamelStore *store, CamelException *ex)
int
camel_pop3_command (CamelPop3Store *store, char **ret, char *fmt, ...)
{
CamelService *service = CAMEL_SERVICE (store);
char *cmdbuf, *respbuf;
char *cmdbuf;
va_list ap;
int status;
if (!store->ostream) {
CamelException ex;
camel_exception_init (&ex);
if (!camel_service_connect (service, &ex)) {
if (!camel_service_connect (CAMEL_SERVICE (store), &ex)) {
if (ret)
*ret = g_strdup (camel_exception_get_description (&ex));
camel_exception_clear (&ex);
@ -636,10 +643,19 @@ camel_pop3_command (CamelPop3Store *store, char **ret, char *fmt, ...)
}
g_free (cmdbuf);
/* Read the response */
respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (store->istream));
return pop3_get_response (store, ret);
}
static int
pop3_get_response (CamelPop3Store *store, char **ret)
{
char *respbuf;
int status;
respbuf = camel_stream_buffer_read_line (
CAMEL_STREAM_BUFFER (store->istream));
if (respbuf == NULL) {
if (*ret)
if (ret)
*ret = g_strdup(strerror(errno));
return CAMEL_POP3_FAIL;
}