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:
committed by
Chris Toshok
parent
032dceebc5
commit
aedfd03572
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user