borrow some code from the imap provider to query the user for their

2000-10-04  Chris Toshok  <toshok@helixcode.com>

	* providers/nntp/camel-nntp-auth.c (camel_nntp_auth_authenticate):
	borrow some code from the imap provider to query the user for
	their password, and pass the user/passwd to nntp.  be extra
	paranoid and zero out the password before freeing it.

	* providers/nntp/camel-nntp-store.c (camel_nntp_store_init): add
	ALLOW_USER/ALLOW_PASSWORD/ALLOW_AUTH to the url flags.
	(nntp_store_query_auth_types_generic): return our list of
	auth_types.
	(nntp_store_query_auth_types_connected): broken, return same as in
	query_auth_types_generic.

svn path=/trunk/; revision=5716
This commit is contained in:
Chris Toshok
2000-10-04 20:36:10 +00:00
committed by Chris Toshok
parent 032dceebc5
commit aedfd03572
3 changed files with 123 additions and 30 deletions

View File

@ -1,3 +1,17 @@
2000-10-04 Chris Toshok <toshok@helixcode.com>
* providers/nntp/camel-nntp-auth.c (camel_nntp_auth_authenticate):
borrow some code from the imap provider to query the user for
their password, and pass the user/passwd to nntp. be extra
paranoid and zero out the password before freeing it.
* providers/nntp/camel-nntp-store.c (camel_nntp_store_init): add
ALLOW_USER/ALLOW_PASSWORD/ALLOW_AUTH to the url flags.
(nntp_store_query_auth_types_generic): return our list of
auth_types.
(nntp_store_query_auth_types_connected): broken, return same as in
query_auth_types_generic.
2000-10-04 Dan Winship <danw@helixcode.com>
* providers/imap/camel-imap-store.c (imap_connect): IMAP4

View File

@ -26,33 +26,65 @@
#include <camel-nntp-store.h>
#include <camel-nntp-resp-codes.h>
#include <camel-exception.h>
#include <camel-session.h>
int
camel_nntp_auth_authenticate (CamelNNTPStore *store, CamelException *ex)
{
CamelService *service = CAMEL_SERVICE (store);
CamelSession *session = camel_service_get_session (service);
int resp;
if (!service->url->authmech && !service->url->passwd) {
gchar *prompt;
prompt = g_strdup_printf ("Please enter the NNTP password for %s@%s",
service->url->user, service->url->host);
service->url->passwd =
camel_session_query_authenticator (session,
CAMEL_AUTHENTICATOR_ASK, prompt,
TRUE, service, "password", ex);
g_free (prompt);
if (!service->url->passwd) {
camel_exception_set (ex, CAMEL_EXCEPTION_USER_CANCEL,
"You didn\'t enter a password.");
resp = 666;
goto done;
}
}
/* first send username */
resp = camel_nntp_command (store, ex, NULL, "AUTHINFO USER %s", "username"); /* XXX */
resp = camel_nntp_command (store, ex, NULL, "AUTHINFO USER %s", service->url->user);
if (resp == NNTP_AUTH_REJECTED) {
camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
"Server rejected username");
return resp;
goto done;
}
else if (resp != NNTP_AUTH_CONTINUE) {
camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
"Failed to send username to server");
return resp;
goto done;
}
/* then send the username if the server asks for it */
resp = camel_nntp_command (store, ex, NULL, "AUTHINFO PASS %s", "password"); /* XXX */
resp = camel_nntp_command (store, ex, NULL, "AUTHINFO PASS %s", service->url->passwd);
if (resp == NNTP_AUTH_REJECTED) {
camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
"Server rejected username/password");
return resp;
goto done;
}
done:
if (service->url->passwd) {
/* let's be paranoid */
memset (service->url->passwd, 0, strlen (service->url->passwd));
g_free (service->url->passwd);
service->url->passwd = NULL;
}
return resp;
}

View File

@ -272,6 +272,33 @@ nntp_store_get_name (CamelService *service, gboolean brief)
return g_strdup_printf ("USENET news via %s", service->url->host);
}
static CamelServiceAuthType password_authtype = {
"Password",
"This option will authenticate with the NNTP server using a "
"plaintext password.",
"",
TRUE
};
static GList *
nntp_store_query_auth_types_generic (CamelService *service, CamelException *ex)
{
GList *prev;
prev = CAMEL_SERVICE_CLASS (remote_store_class)->query_auth_types_generic (service, ex);
return g_list_prepend (prev, &password_authtype);
}
static GList *
nntp_store_query_auth_types_connected (CamelService *service, CamelException *ex)
{
g_warning ("nntp::query_auth_types_connected: not implemented. Defaulting.");
/* FIXME: use the classfunc instead of the local? */
return nntp_store_query_auth_types_generic (service, ex);
}
static CamelFolder *
nntp_store_get_folder (CamelStore *store, const gchar *folder_name,
gboolean get_folder, CamelException *ex)
@ -301,43 +328,58 @@ nntp_store_get_folder_info (CamelStore *store, const char *top,
gboolean fast, gboolean recursive,
CamelException *ex)
{
CamelURL *url = CAMEL_SERVICE (store)->url;
CamelNNTPStore *nntp_store = (CamelNNTPStore *)store;
GPtrArray *names;
CamelFolderInfo *topfi, *last = NULL, *fi;
CamelFolderInfo *groups = NULL, *last = NULL, *fi;
int i;
/* if we haven't already read our .newsrc, read it now */
if (!nntp_store->newsrc)
nntp_store->newsrc =
camel_nntp_newsrc_read_for_server (CAMEL_SERVICE(store)->url->host);
if (!nntp_store->newsrc) {
camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
"Unable to open or create .newsrc file for %s: %s",
CAMEL_SERVICE(store)->url->host,
strerror(errno));
return NULL;
}
topfi = g_new0 (CamelFolderInfo, 1);
topfi->name = g_strdup (top);
topfi->full_name = g_strdup (top);
if (*top)
topfi->url = g_strdup_printf ("news:%s", top);
/* FIXME: message_count if top != "" */
topfi->message_count = topfi->unread_message_count = -1;
if (top == NULL) {
/* return the list of groups */
names = camel_nntp_newsrc_get_subscribed_group_names (nntp_store->newsrc);
for (i = 0; i < names->len; i++) {
fi = g_new0 (CamelFolderInfo, 1);
fi->name = g_strdup (names->pdata[i]);
fi->full_name = g_strdup (names->pdata[i]);
fi->url = g_strdup_printf ("news://%s/%s", url->host, (char *)names->pdata[i]);
/* FIXME */
fi->message_count = fi->unread_message_count = -1;
if (!recursive || *top)
return topfi;
if (last)
last->sibling = fi;
else
groups = fi;
last = fi;
}
camel_nntp_newsrc_free_group_names (nntp_store->newsrc, names);
return groups;
}
else {
/* getting a specific group */
names = camel_nntp_newsrc_get_subscribed_group_names (nntp_store->newsrc);
for (i = 0; i < names->len; i++) {
fi = g_new0 (CamelFolderInfo, 1);
fi->name = g_strdup (names->pdata[i]);
fi->full_name = g_strdup (names->pdata[i]);
fi->url = g_strdup_printf ("news:%s", (char *)names->pdata[i]);
fi->name = g_strdup (top);
fi->full_name = g_strdup (top);
fi->url = g_strdup_printf ("news://%s/%s", url->host, top);
/* FIXME */
fi->message_count = fi->unread_message_count = -1;
if (last)
last->sibling = fi;
else
topfi->child = fi;
last = fi;
return fi;
}
camel_nntp_newsrc_free_group_names (nntp_store->newsrc, names);
return topfi;
}
static char *
@ -372,6 +414,8 @@ camel_nntp_store_class_init (CamelNNTPStoreClass *camel_nntp_store_class)
/* virtual method overload */
camel_service_class->connect = nntp_store_connect;
camel_service_class->disconnect = nntp_store_disconnect;
camel_service_class->query_auth_types_generic = nntp_store_query_auth_types_generic;
camel_service_class->query_auth_types_connected = nntp_store_query_auth_types_connected;
camel_service_class->get_name = nntp_store_get_name;
camel_store_class->get_folder = nntp_store_get_folder;
@ -388,8 +432,11 @@ camel_nntp_store_init (gpointer object, gpointer klass)
CamelService *service = CAMEL_SERVICE (object);
CamelRemoteStore *remote_store = CAMEL_REMOTE_STORE (object);
service->url_flags = CAMEL_SERVICE_URL_NEED_HOST;
remote_store->default_port = 119;
service->url_flags = (CAMEL_SERVICE_URL_NEED_HOST
| CAMEL_SERVICE_URL_ALLOW_USER
| CAMEL_SERVICE_URL_ALLOW_PASSWORD
| CAMEL_SERVICE_URL_ALLOW_AUTH);
remote_store->default_port = NNTP_PORT;
}
CamelType