build up the list of supported auth_methods.
2003-01-09 Chris Toshok <toshok@ximian.com> * backend/pas/pas-backend-ldap.c (query_ldap_root_dse): build up the list of supported auth_methods. (pas_backend_ldap_process_get_supported_auth_methods): respond with the list of auth methods we've built up. (pas_backend_ldap_dispose): unref the auth_method list. (pas_backend_ldap_class_init): hook up pas_backend_ldap_process_get_supported_auth_methods. * backend/pas/pas-backend.c (pas_backend_get_supported_auth_methods): new function. (process_client_requests): add clause for GetSupportedAuthMethods. * backend/pas/pas-backend.h: add prototype for pas_backend_get_supported_auth_methods, and add it to the class vtable. * backend/pas/pas-book.h: add GetSupportedAuthMethods enum member and PASGetSupportedAuthMethodsRequest. and add prototype for pas_book_respond_get_supported_auth_methods. * backend/pas/pas-book.c (pas_book_queue_get_supported_auth_methods): new function. (impl_GNOME_Evolution_Addressbook_Book_getSupportedAuthMethods): new function. (pas_book_respond_get_supported_auth_methods): new function. (pas_book_free_request): add clause for GetSupportedAuthMethods. (pas_book_class_init): hook up getSupportedAuthMethods. * backend/ebook/e-book-listener.c (e_book_listener_queue_get_supported_fields_response): fields -> list. (e_book_listener_queue_get_supported_auth_methods_response): new function. (impl_BookListener_response_get_supported_auth_methods): new function. (e_book_listener_class_init): hook up epv->notifySupportedAuthMethods. * backend/ebook/e-book-listener.h: add GetSupportedAuthMethodsResponse enum member, and change the field name from "fields" to list (and use it for both GetSupportedFields and GetSupportedAuthMethods) * backend/ebook/e-book.c (e_book_get_supported_auth_methods): new function. (e_book_do_response_get_supported_auth_methods): new function. * backend/ebook/e-book.h: add prototype for e_book_get_supported_auth_methods. * backend/idl/addressbook.idl: add getSupportedAuthMethods IDL call. svn path=/trunk/; revision=19386
This commit is contained in:

committed by
Chris Toshok

parent
50a352b367
commit
2a174936f4
@ -1,3 +1,58 @@
|
||||
2003-01-09 Chris Toshok <toshok@ximian.com>
|
||||
|
||||
* backend/pas/pas-backend-ldap.c (query_ldap_root_dse): build up
|
||||
the list of supported auth_methods.
|
||||
(pas_backend_ldap_process_get_supported_auth_methods): respond
|
||||
with the list of auth methods we've built up.
|
||||
(pas_backend_ldap_dispose): unref the auth_method list.
|
||||
(pas_backend_ldap_class_init): hook up
|
||||
pas_backend_ldap_process_get_supported_auth_methods.
|
||||
|
||||
* backend/pas/pas-backend.c
|
||||
(pas_backend_get_supported_auth_methods): new function.
|
||||
(process_client_requests): add clause for GetSupportedAuthMethods.
|
||||
|
||||
* backend/pas/pas-backend.h: add prototype for
|
||||
pas_backend_get_supported_auth_methods, and add it to the class
|
||||
vtable.
|
||||
|
||||
* backend/pas/pas-book.h: add GetSupportedAuthMethods enum member
|
||||
and PASGetSupportedAuthMethodsRequest. and add prototype for
|
||||
pas_book_respond_get_supported_auth_methods.
|
||||
|
||||
* backend/pas/pas-book.c
|
||||
(pas_book_queue_get_supported_auth_methods): new function.
|
||||
(impl_GNOME_Evolution_Addressbook_Book_getSupportedAuthMethods):
|
||||
new function.
|
||||
(pas_book_respond_get_supported_auth_methods): new function.
|
||||
(pas_book_free_request): add clause for GetSupportedAuthMethods.
|
||||
(pas_book_class_init): hook up getSupportedAuthMethods.
|
||||
|
||||
* backend/ebook/e-book-listener.c
|
||||
(e_book_listener_queue_get_supported_fields_response): fields ->
|
||||
list.
|
||||
(e_book_listener_queue_get_supported_auth_methods_response): new
|
||||
function.
|
||||
(impl_BookListener_response_get_supported_auth_methods): new
|
||||
function.
|
||||
(e_book_listener_class_init): hook up
|
||||
epv->notifySupportedAuthMethods.
|
||||
|
||||
* backend/ebook/e-book-listener.h: add
|
||||
GetSupportedAuthMethodsResponse enum member, and change the field
|
||||
name from "fields" to list (and use it for both GetSupportedFields
|
||||
and GetSupportedAuthMethods)
|
||||
|
||||
* backend/ebook/e-book.c (e_book_get_supported_auth_methods): new
|
||||
function.
|
||||
(e_book_do_response_get_supported_auth_methods): new function.
|
||||
|
||||
* backend/ebook/e-book.h: add prototype for
|
||||
e_book_get_supported_auth_methods.
|
||||
|
||||
* backend/idl/addressbook.idl: add getSupportedAuthMethods IDL
|
||||
call.
|
||||
|
||||
2003-01-09 Chris Toshok <toshok@ximian.com>
|
||||
|
||||
* backend/pas/pas-book-factory.c (backend_last_client_gone_cb):
|
||||
|
@ -360,10 +360,34 @@ e_book_listener_queue_get_supported_fields_response (EBookListener *listener,
|
||||
|
||||
resp->op = GetSupportedFieldsResponse;
|
||||
resp->status = status;
|
||||
resp->fields = e_list_new ((EListCopyFunc)g_strdup, (EListFreeFunc)g_free, NULL);
|
||||
resp->list = e_list_new ((EListCopyFunc)g_strdup, (EListFreeFunc)g_free, NULL);
|
||||
|
||||
for (i = 0; i < fields->_length; i ++) {
|
||||
e_list_append (resp->fields, fields->_buffer[i]);
|
||||
e_list_append (resp->list, fields->_buffer[i]);
|
||||
}
|
||||
|
||||
e_book_listener_queue_response (listener, resp);
|
||||
}
|
||||
|
||||
static void
|
||||
e_book_listener_queue_get_supported_auth_methods_response (EBookListener *listener,
|
||||
EBookStatus status,
|
||||
const GNOME_Evolution_Addressbook_stringlist *auth_methods)
|
||||
{
|
||||
EBookListenerResponse *resp;
|
||||
int i;
|
||||
|
||||
if (listener->priv->stopped)
|
||||
return;
|
||||
|
||||
resp = g_new0 (EBookListenerResponse, 1);
|
||||
|
||||
resp->op = GetSupportedAuthMethodsResponse;
|
||||
resp->status = status;
|
||||
resp->list = e_list_new ((EListCopyFunc)g_strdup, (EListFreeFunc)g_free, NULL);
|
||||
|
||||
for (i = 0; i < auth_methods->_length; i ++) {
|
||||
e_list_append (resp->list, auth_methods->_buffer[i]);
|
||||
}
|
||||
|
||||
e_book_listener_queue_response (listener, resp);
|
||||
@ -544,6 +568,18 @@ impl_BookListener_response_get_supported_fields (PortableServer_Servant servant,
|
||||
listener, status, fields);
|
||||
}
|
||||
|
||||
static void
|
||||
impl_BookListener_response_get_supported_auth_methods (PortableServer_Servant servant,
|
||||
const GNOME_Evolution_Addressbook_BookListener_CallStatus status,
|
||||
const GNOME_Evolution_Addressbook_stringlist *auth_methods,
|
||||
CORBA_Environment *ev)
|
||||
{
|
||||
EBookListener *listener = E_BOOK_LISTENER (bonobo_object (servant));
|
||||
|
||||
e_book_listener_queue_get_supported_auth_methods_response (
|
||||
listener, status, auth_methods);
|
||||
}
|
||||
|
||||
static void
|
||||
impl_BookListener_report_connection_status (PortableServer_Servant servant,
|
||||
const CORBA_boolean connected,
|
||||
@ -745,6 +781,7 @@ e_book_listener_class_init (EBookListenerClass *klass)
|
||||
epv->notifyCardModified = impl_BookListener_respond_modify_card;
|
||||
epv->notifyAuthenticationResult = impl_BookListener_respond_authentication_result;
|
||||
epv->notifySupportedFields = impl_BookListener_response_get_supported_fields;
|
||||
epv->notifySupportedAuthMethods = impl_BookListener_response_get_supported_auth_methods;
|
||||
epv->notifyCardRequested = impl_BookListener_respond_get_vcard;
|
||||
epv->notifyCursorRequested = impl_BookListener_respond_get_cursor;
|
||||
epv->notifyViewRequested = impl_BookListener_respond_get_view;
|
||||
|
@ -57,6 +57,7 @@ typedef enum {
|
||||
GetChangesResponse,
|
||||
AuthenticationResponse,
|
||||
GetSupportedFieldsResponse,
|
||||
GetSupportedAuthMethodsResponse,
|
||||
|
||||
/* Async events */
|
||||
LinkStatusEvent,
|
||||
@ -79,8 +80,8 @@ typedef struct {
|
||||
/* For GetBookViewReponse */
|
||||
GNOME_Evolution_Addressbook_BookView book_view;
|
||||
|
||||
/* For GetSupportedFields */
|
||||
EList *fields;
|
||||
/* For GetSupportedFields/GetSupportedAuthMethods */
|
||||
EList *list;
|
||||
|
||||
/* For OpenProgressEvent */
|
||||
char *msg;
|
||||
|
@ -481,12 +481,38 @@ e_book_do_response_get_supported_fields (EBook *book,
|
||||
|
||||
if (op->cb) {
|
||||
if (op->active)
|
||||
((EBookFieldsCallback) op->cb) (book, resp->status, resp->fields, op->closure);
|
||||
((EBookFieldsCallback) op->cb) (book, resp->status, resp->list, op->closure);
|
||||
else
|
||||
((EBookFieldsCallback) op->cb) (book, E_BOOK_STATUS_CANCELLED, NULL, op->closure);
|
||||
}
|
||||
|
||||
g_object_unref(resp->fields);
|
||||
g_object_unref(resp->list);
|
||||
|
||||
e_book_op_free (op);
|
||||
}
|
||||
|
||||
static void
|
||||
e_book_do_response_get_supported_auth_methods (EBook *book,
|
||||
EBookListenerResponse *resp)
|
||||
{
|
||||
EBookOp *op;
|
||||
|
||||
op = e_book_pop_op (book);
|
||||
|
||||
if (op == NULL) {
|
||||
g_warning ("e_book_do_response_get_supported_auth_methods: Cannot find operation "
|
||||
"in local op queue!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (op->cb) {
|
||||
if (op->active)
|
||||
((EBookAuthMethodsCallback) op->cb) (book, resp->status, resp->list, op->closure);
|
||||
else
|
||||
((EBookAuthMethodsCallback) op->cb) (book, E_BOOK_STATUS_CANCELLED, NULL, op->closure);
|
||||
}
|
||||
|
||||
g_object_unref(resp->list);
|
||||
|
||||
e_book_op_free (op);
|
||||
}
|
||||
@ -531,6 +557,9 @@ e_book_check_listener_queue (EBookListener *listener, EBook *book)
|
||||
case GetSupportedFieldsResponse:
|
||||
e_book_do_response_get_supported_fields (book, resp);
|
||||
break;
|
||||
case GetSupportedAuthMethodsResponse:
|
||||
e_book_do_response_get_supported_auth_methods (book, resp);
|
||||
break;
|
||||
|
||||
case OpenProgressEvent:
|
||||
e_book_do_progress_event (book, resp);
|
||||
@ -870,6 +899,38 @@ e_book_get_supported_fields (EBook *book,
|
||||
return tag;
|
||||
}
|
||||
|
||||
guint
|
||||
e_book_get_supported_auth_methods (EBook *book,
|
||||
EBookAuthMethodsCallback cb,
|
||||
gpointer closure)
|
||||
{
|
||||
CORBA_Environment ev;
|
||||
guint tag;
|
||||
|
||||
CORBA_exception_init (&ev);
|
||||
|
||||
if (book->priv->load_state != URILoaded) {
|
||||
g_warning ("e_book_unload_uri: No URI is loaded!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
tag = e_book_queue_op (book, cb, closure, NULL);
|
||||
|
||||
GNOME_Evolution_Addressbook_Book_getSupportedAuthMethods(book->priv->corba_book, &ev);
|
||||
|
||||
if (ev._major != CORBA_NO_EXCEPTION) {
|
||||
g_warning ("e_book_get_supported_auth_methods: Exception "
|
||||
"during get_supported_auth_methods!\n");
|
||||
CORBA_exception_free (&ev);
|
||||
e_book_unqueue_op (book);
|
||||
return 0;
|
||||
}
|
||||
|
||||
CORBA_exception_free (&ev);
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
e_book_construct (EBook *book)
|
||||
{
|
||||
|
@ -60,6 +60,7 @@ typedef void (*EBookCardCallback) (EBook *book, EBookStatus status, ECard *c
|
||||
typedef void (*EBookCursorCallback) (EBook *book, EBookStatus status, ECardCursor *cursor, gpointer closure);
|
||||
typedef void (*EBookBookViewCallback) (EBook *book, EBookStatus status, EBookView *book_view, gpointer closure);
|
||||
typedef void (*EBookFieldsCallback) (EBook *book, EBookStatus status, EList *fields, gpointer closure);
|
||||
typedef void (*EBookAuthMethodsCallback) (EBook *book, EBookStatus status, EList *auth_methods, gpointer closure);
|
||||
|
||||
/* Creating a new addressbook. */
|
||||
EBook *e_book_new (void);
|
||||
@ -78,6 +79,9 @@ guint e_book_get_supported_fields (EBook *book,
|
||||
EBookFieldsCallback cb,
|
||||
gpointer closure);
|
||||
|
||||
guint e_book_get_supported_auth_methods (EBook *book,
|
||||
EBookAuthMethodsCallback cb,
|
||||
gpointer closure);
|
||||
|
||||
/* User authentication. */
|
||||
void e_book_authenticate_user (EBook *book,
|
||||
|
@ -103,6 +103,30 @@ module Addressbook {
|
||||
|
||||
void getSupportedFields ();
|
||||
|
||||
/*
|
||||
* This function returns a list of strings
|
||||
* representing the auth methods (e.g. SASL mechs)
|
||||
* that a backend/server supports.
|
||||
*
|
||||
* Some examples are:
|
||||
*
|
||||
* "ldap/simple-email|By email Address"
|
||||
* "sasl/CRAM-MD5|CRAM-MD5(SASL)"
|
||||
*
|
||||
* The format should be:
|
||||
*
|
||||
* <class>/<type>|<i18nized string>
|
||||
*
|
||||
* "i18nized string" is shown in the UI, and should be
|
||||
* a user friendly representation of the auth method.
|
||||
*
|
||||
* in the case of SASL auth mechs, the text trailing
|
||||
* the '/' should be the proper name of the mechanism,
|
||||
* as it will be passed unchanged to the backend auth
|
||||
* function (eg. ldap_sasl_bind)
|
||||
*/
|
||||
void getSupportedAuthMethods ();
|
||||
|
||||
string getStaticCapabilities ();
|
||||
|
||||
string getName ();
|
||||
@ -120,6 +144,7 @@ module Addressbook {
|
||||
AuthenticationFailed,
|
||||
AuthenticationRequired,
|
||||
UnsupportedField,
|
||||
UnsupportedAuthenticationMethod,
|
||||
TLSNotAvailable,
|
||||
NoSuchBook,
|
||||
|
||||
@ -148,6 +173,8 @@ module Addressbook {
|
||||
|
||||
void notifySupportedFields (in CallStatus status, in stringlist fields);
|
||||
|
||||
void notifySupportedAuthMethods (in CallStatus status, in stringlist fields);
|
||||
|
||||
/**
|
||||
* notifyConnectionStatus:
|
||||
*
|
||||
|
@ -44,6 +44,9 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/* this is broken currently, don't enable it */
|
||||
/*#define ENABLE_SASL_BINDS*/
|
||||
|
||||
typedef enum {
|
||||
PAS_BACKEND_LDAP_TLS_NO,
|
||||
PAS_BACKEND_LDAP_TLS_ALWAYS,
|
||||
@ -109,6 +112,7 @@ struct _PASBackendLDAPPrivate {
|
||||
LDAP *ldap;
|
||||
|
||||
EList *supported_fields;
|
||||
EList *supported_auth_methods;
|
||||
|
||||
/* whether or not there's support for the objectclass we need
|
||||
to store all our additional fields */
|
||||
@ -585,8 +589,25 @@ query_ldap_root_dse (PASBackendLDAP *bl)
|
||||
|
||||
values = ldap_get_values (ldap, resp, "supportedSASLMechanisms");
|
||||
if (values) {
|
||||
for (i = 0; values[i]; i++)
|
||||
char *auth_method;
|
||||
if (bl->priv->supported_auth_methods)
|
||||
g_object_unref (bl->priv->supported_auth_methods);
|
||||
bl->priv->supported_auth_methods = e_list_new ((EListCopyFunc)g_strdup, (EListFreeFunc)g_free, NULL);
|
||||
|
||||
auth_method = g_strdup_printf ("ldap/simple-binddn|%s", _());
|
||||
e_list_append (bl->priv->supported_auth_methods, auth_method);
|
||||
g_free (auth_method);
|
||||
|
||||
auth_method = g_strdup_printf ("ldap/simple-email|%s");
|
||||
e_list_append (bl->priv->supported_auth_methods, auth_method);
|
||||
g_free (auth_method);
|
||||
|
||||
for (i = 0; values[i]; i++) {
|
||||
auth_method = g_strdup_printf ("sasl/%s|%s", values[i], values[i]);
|
||||
e_list_append (bl->priv->supported_auth_methods, auth_method);
|
||||
g_free (auth_method);
|
||||
g_message ("supported SASL mechanism: %s", values[i]);
|
||||
}
|
||||
ldap_value_free (values);
|
||||
}
|
||||
|
||||
@ -3129,6 +3150,9 @@ pas_backend_ldap_process_check_connection (PASBackend *backend,
|
||||
pas_book_report_connection (book, bl->priv->connected);
|
||||
}
|
||||
|
||||
#define LDAP_SIMPLE_PREFIX "ldap/simple-"
|
||||
#define SASL_PREFIX "sasl/"
|
||||
|
||||
static void
|
||||
pas_backend_ldap_process_authenticate_user (PASBackend *backend,
|
||||
PASBook *book,
|
||||
@ -3138,51 +3162,78 @@ pas_backend_ldap_process_authenticate_user (PASBackend *backend,
|
||||
int ldap_error;
|
||||
char *dn = NULL;
|
||||
|
||||
if (!strcmp (req->auth_method, "ldap/simple-email")) {
|
||||
LDAPMessage *res, *e;
|
||||
char *query = g_strdup_printf ("(mail=%s)", req->user);
|
||||
if (!strncasecmp (req->auth_method, LDAP_SIMPLE_PREFIX, strlen (LDAP_SIMPLE_PREFIX))) {
|
||||
|
||||
if (!strcmp (req->auth_method, "ldap/simple-email")) {
|
||||
LDAPMessage *res, *e;
|
||||
char *query = g_strdup_printf ("(mail=%s)", req->user);
|
||||
|
||||
ldap_error = ldap_search_s (bl->priv->ldap,
|
||||
bl->priv->ldap_rootdn,
|
||||
bl->priv->ldap_scope,
|
||||
query,
|
||||
NULL, 0, &res);
|
||||
g_free (query);
|
||||
ldap_error = ldap_search_s (bl->priv->ldap,
|
||||
bl->priv->ldap_rootdn,
|
||||
bl->priv->ldap_scope,
|
||||
query,
|
||||
NULL, 0, &res);
|
||||
g_free (query);
|
||||
|
||||
if (ldap_error == LDAP_SUCCESS) {
|
||||
char *entry_dn;
|
||||
if (ldap_error == LDAP_SUCCESS) {
|
||||
char *entry_dn;
|
||||
|
||||
e = ldap_first_entry (bl->priv->ldap, res);
|
||||
e = ldap_first_entry (bl->priv->ldap, res);
|
||||
|
||||
entry_dn = ldap_get_dn (bl->priv->ldap, e);
|
||||
dn = g_strdup(entry_dn);
|
||||
entry_dn = ldap_get_dn (bl->priv->ldap, e);
|
||||
dn = g_strdup(entry_dn);
|
||||
|
||||
ldap_memfree (entry_dn);
|
||||
ldap_msgfree (res);
|
||||
ldap_memfree (entry_dn);
|
||||
ldap_msgfree (res);
|
||||
}
|
||||
else {
|
||||
pas_book_respond_authenticate_user (book,
|
||||
GNOME_Evolution_Addressbook_BookListener_PermissionDenied);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
else if (!strcmp (req->auth_method, "ldap/simple-binddn")) {
|
||||
dn = g_strdup (req->user);
|
||||
}
|
||||
|
||||
/* now authenticate against the DN we were either supplied or queried for */
|
||||
printf ("simple auth as %s\n", dn);
|
||||
ldap_error = ldap_simple_bind_s(bl->priv->ldap,
|
||||
dn,
|
||||
req->passwd);
|
||||
|
||||
pas_book_respond_authenticate_user (book,
|
||||
ldap_error_to_response (ldap_error));
|
||||
}
|
||||
#ifdef ENABLE_SASL_BINDS
|
||||
else if (!strncasecmp (req->auth_method, SASL_PREFIX, strlen (SASL_PREFIX))) {
|
||||
g_print ("sasl bind (mech = %s) as %s", req->auth_method + strlen (SASL_PREFIX), req->user);
|
||||
ldap_error = ldap_sasl_bind_s (bl->priv->ldap,
|
||||
NULL,
|
||||
req->auth_method + strlen (SASL_PREFIX),
|
||||
req->passwd,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
if (ldap_error == LDAP_NOT_SUPPORTED)
|
||||
pas_book_respond_authenticate_user (book,
|
||||
GNOME_Evolution_Addressbook_BookListener_PermissionDenied);
|
||||
return;
|
||||
}
|
||||
GNOME_Evolution_Addressbook_BookListener_UnsupportedAuthenticationMethod);
|
||||
else
|
||||
pas_book_respond_authenticate_user (book,
|
||||
ldap_error_to_response (ldap_error));
|
||||
}
|
||||
else if (!strcmp (req->auth_method, "ldap/simple-binddn")) {
|
||||
dn = g_strdup (req->user);
|
||||
#endif
|
||||
else {
|
||||
pas_book_respond_authenticate_user (book,
|
||||
GNOME_Evolution_Addressbook_BookListener_UnsupportedAuthenticationMethod);
|
||||
return;
|
||||
}
|
||||
|
||||
/* now authenticate against the DN we were either supplied or queried for */
|
||||
printf ("authenticating as %s\n", dn);
|
||||
ldap_error = ldap_simple_bind_s(bl->priv->ldap,
|
||||
dn,
|
||||
req->passwd);
|
||||
|
||||
bl->priv->auth_dn = dn;
|
||||
bl->priv->auth_passwd = g_strdup (req->passwd);
|
||||
|
||||
pas_book_respond_authenticate_user (book,
|
||||
ldap_error_to_response (ldap_error));
|
||||
|
||||
if (ldap_error == LDAP_SUCCESS) {
|
||||
bl->priv->auth_dn = dn;
|
||||
bl->priv->auth_passwd = g_strdup (req->passwd);
|
||||
|
||||
pas_backend_set_is_writable (backend, TRUE);
|
||||
|
||||
/* force a requery on the root dse since some ldap
|
||||
@ -3218,6 +3269,19 @@ pas_backend_ldap_process_get_supported_fields (PASBackend *backend,
|
||||
bl->priv->supported_fields);
|
||||
}
|
||||
|
||||
static void
|
||||
pas_backend_ldap_process_get_supported_auth_methods (PASBackend *backend,
|
||||
PASBook *book,
|
||||
PASGetSupportedAuthMethodsRequest *req)
|
||||
|
||||
{
|
||||
PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend);
|
||||
|
||||
pas_book_respond_get_supported_auth_methods (book,
|
||||
GNOME_Evolution_Addressbook_BookListener_Success,
|
||||
bl->priv->supported_auth_methods);
|
||||
}
|
||||
|
||||
static GNOME_Evolution_Addressbook_BookListener_CallStatus
|
||||
pas_backend_ldap_load_uri (PASBackend *backend,
|
||||
const char *uri)
|
||||
@ -3377,6 +3441,9 @@ pas_backend_ldap_dispose (GObject *object)
|
||||
if (bl->priv->supported_fields)
|
||||
g_object_unref (bl->priv->supported_fields);
|
||||
|
||||
if (bl->priv->supported_auth_methods)
|
||||
g_object_unref (bl->priv->supported_auth_methods);
|
||||
|
||||
g_free (bl->priv->uri);
|
||||
|
||||
g_free (bl->priv);
|
||||
@ -3416,6 +3483,7 @@ pas_backend_ldap_class_init (PASBackendLDAPClass *klass)
|
||||
parent_class->get_changes = pas_backend_ldap_process_get_changes;
|
||||
parent_class->authenticate_user = pas_backend_ldap_process_authenticate_user;
|
||||
parent_class->get_supported_fields = pas_backend_ldap_process_get_supported_fields;
|
||||
parent_class->get_supported_auth_methods = pas_backend_ldap_process_get_supported_auth_methods;
|
||||
|
||||
object_class->dispose = pas_backend_ldap_dispose;
|
||||
}
|
||||
|
@ -220,6 +220,20 @@ pas_backend_get_supported_fields (PASBackend *backend,
|
||||
return (* PAS_BACKEND_GET_CLASS (backend)->get_supported_fields) (backend, book, req);
|
||||
}
|
||||
|
||||
void
|
||||
pas_backend_get_supported_auth_methods (PASBackend *backend,
|
||||
PASBook *book,
|
||||
PASGetSupportedAuthMethodsRequest *req)
|
||||
{
|
||||
g_return_if_fail (PAS_IS_BACKEND (backend));
|
||||
g_return_if_fail (PAS_IS_BOOK (book));
|
||||
g_return_if_fail (req != NULL);
|
||||
|
||||
g_assert (PAS_BACKEND_GET_CLASS (backend)->get_supported_auth_methods != NULL);
|
||||
|
||||
return (* PAS_BACKEND_GET_CLASS (backend)->get_supported_auth_methods) (backend, book, req);
|
||||
}
|
||||
|
||||
static void
|
||||
process_client_requests (PASBook *book, gpointer user_data)
|
||||
{
|
||||
@ -276,6 +290,10 @@ process_client_requests (PASBook *book, gpointer user_data)
|
||||
case GetSupportedFields:
|
||||
pas_backend_get_supported_fields (backend, book, &req->get_supported_fields);
|
||||
break;
|
||||
|
||||
case GetSupportedAuthMethods:
|
||||
pas_backend_get_supported_auth_methods (backend, book, &req->get_supported_auth_methods);
|
||||
break;
|
||||
}
|
||||
|
||||
pas_book_free_request (req);
|
||||
|
@ -64,6 +64,7 @@ typedef struct {
|
||||
void (*get_changes) (PASBackend *backend, PASBook *book, PASGetChangesRequest *req);
|
||||
void (*authenticate_user) (PASBackend *backend, PASBook *book, PASAuthenticateUserRequest *req);
|
||||
void (*get_supported_fields) (PASBackend *backend, PASBook *book, PASGetSupportedFieldsRequest *req);
|
||||
void (*get_supported_auth_methods) (PASBackend *backend, PASBook *book, PASGetSupportedAuthMethodsRequest *req);
|
||||
|
||||
/* Notification signals */
|
||||
void (* last_client_gone) (PASBackend *backend);
|
||||
@ -121,6 +122,9 @@ void pas_backend_authenticate_user (PASBackend *backen
|
||||
void pas_backend_get_supported_fields (PASBackend *backend,
|
||||
PASBook *book,
|
||||
PASGetSupportedFieldsRequest *req);
|
||||
void pas_backend_get_supported_auth_methods (PASBackend *backend,
|
||||
PASBook *book,
|
||||
PASGetSupportedAuthMethodsRequest *req);
|
||||
|
||||
|
||||
GType pas_backend_get_type (void);
|
||||
|
@ -153,6 +153,17 @@ pas_book_queue_get_supported_fields (PASBook *book)
|
||||
pas_book_queue_request (book, req);
|
||||
}
|
||||
|
||||
static void
|
||||
pas_book_queue_get_supported_auth_methods (PASBook *book)
|
||||
{
|
||||
PASRequest *req;
|
||||
|
||||
req = g_new0 (PASRequest, 1);
|
||||
req->op = GetSupportedAuthMethods;
|
||||
|
||||
pas_book_queue_request (book, req);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pas_book_queue_get_book_view (PASBook *book, const GNOME_Evolution_Addressbook_BookViewListener listener, const char *search)
|
||||
@ -365,6 +376,15 @@ impl_GNOME_Evolution_Addressbook_Book_getSupportedFields (PortableServer_Servant
|
||||
pas_book_queue_get_supported_fields (book);
|
||||
}
|
||||
|
||||
static void
|
||||
impl_GNOME_Evolution_Addressbook_Book_getSupportedAuthMethods (PortableServer_Servant servant,
|
||||
CORBA_Environment *ev)
|
||||
{
|
||||
PASBook *book = PAS_BOOK (bonobo_object (servant));
|
||||
|
||||
pas_book_queue_get_supported_auth_methods (book);
|
||||
}
|
||||
|
||||
/**
|
||||
* pas_book_get_backend:
|
||||
*/
|
||||
@ -584,6 +604,43 @@ pas_book_respond_get_supported_fields (PASBook *book,
|
||||
CORBA_free(stringlist._buffer);
|
||||
}
|
||||
|
||||
void
|
||||
pas_book_respond_get_supported_auth_methods (PASBook *book,
|
||||
GNOME_Evolution_Addressbook_BookListener_CallStatus status,
|
||||
EList *auth_methods)
|
||||
{
|
||||
CORBA_Environment ev;
|
||||
GNOME_Evolution_Addressbook_stringlist stringlist;
|
||||
int num_auth_methods;
|
||||
EIterator *iter;
|
||||
int i;
|
||||
|
||||
CORBA_exception_init (&ev);
|
||||
|
||||
num_auth_methods = e_list_length (auth_methods);
|
||||
|
||||
stringlist._buffer = CORBA_sequence_CORBA_string_allocbuf (num_auth_methods);
|
||||
stringlist._maximum = num_auth_methods;
|
||||
stringlist._length = num_auth_methods;
|
||||
|
||||
iter = e_list_get_iterator (auth_methods);
|
||||
|
||||
for (i = 0; e_iterator_is_valid (iter); e_iterator_next (iter), i ++) {
|
||||
stringlist._buffer[i] = CORBA_string_dup (e_iterator_get(iter));
|
||||
}
|
||||
|
||||
g_object_unref (auth_methods);
|
||||
|
||||
GNOME_Evolution_Addressbook_BookListener_notifySupportedAuthMethods (
|
||||
book->priv->listener, status,
|
||||
&stringlist,
|
||||
&ev);
|
||||
|
||||
CORBA_exception_free (&ev);
|
||||
|
||||
CORBA_free(stringlist._buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* pas_book_respond_get_cursor:
|
||||
*/
|
||||
@ -861,6 +918,9 @@ pas_book_free_request (PASRequest *req)
|
||||
case GetSupportedFields:
|
||||
/* nothing to free */
|
||||
break;
|
||||
case GetSupportedAuthMethods:
|
||||
/* nothing to free */
|
||||
break;
|
||||
}
|
||||
|
||||
g_free (req);
|
||||
@ -927,18 +987,19 @@ pas_book_class_init (PASBookClass *klass)
|
||||
|
||||
epv = &klass->epv;
|
||||
|
||||
epv->getVCard = impl_GNOME_Evolution_Addressbook_Book_getVCard;
|
||||
epv->authenticateUser = impl_GNOME_Evolution_Addressbook_Book_authenticateUser;
|
||||
epv->addCard = impl_GNOME_Evolution_Addressbook_Book_addCard;
|
||||
epv->removeCard = impl_GNOME_Evolution_Addressbook_Book_removeCard;
|
||||
epv->modifyCard = impl_GNOME_Evolution_Addressbook_Book_modifyCard;
|
||||
epv->checkConnection = impl_GNOME_Evolution_Addressbook_Book_checkConnection;
|
||||
epv->getStaticCapabilities = impl_GNOME_Evolution_Addressbook_Book_getStaticCapabilities;
|
||||
epv->getSupportedFields = impl_GNOME_Evolution_Addressbook_Book_getSupportedFields;
|
||||
epv->getCursor = impl_GNOME_Evolution_Addressbook_Book_getCursor;
|
||||
epv->getBookView = impl_GNOME_Evolution_Addressbook_Book_getBookView;
|
||||
epv->getCompletionView = impl_GNOME_Evolution_Addressbook_Book_getCompletionView;
|
||||
epv->getChanges = impl_GNOME_Evolution_Addressbook_Book_getChanges;
|
||||
epv->getVCard = impl_GNOME_Evolution_Addressbook_Book_getVCard;
|
||||
epv->authenticateUser = impl_GNOME_Evolution_Addressbook_Book_authenticateUser;
|
||||
epv->addCard = impl_GNOME_Evolution_Addressbook_Book_addCard;
|
||||
epv->removeCard = impl_GNOME_Evolution_Addressbook_Book_removeCard;
|
||||
epv->modifyCard = impl_GNOME_Evolution_Addressbook_Book_modifyCard;
|
||||
epv->checkConnection = impl_GNOME_Evolution_Addressbook_Book_checkConnection;
|
||||
epv->getStaticCapabilities = impl_GNOME_Evolution_Addressbook_Book_getStaticCapabilities;
|
||||
epv->getSupportedFields = impl_GNOME_Evolution_Addressbook_Book_getSupportedFields;
|
||||
epv->getSupportedAuthMethods = impl_GNOME_Evolution_Addressbook_Book_getSupportedAuthMethods;
|
||||
epv->getCursor = impl_GNOME_Evolution_Addressbook_Book_getCursor;
|
||||
epv->getBookView = impl_GNOME_Evolution_Addressbook_Book_getBookView;
|
||||
epv->getCompletionView = impl_GNOME_Evolution_Addressbook_Book_getCompletionView;
|
||||
epv->getChanges = impl_GNOME_Evolution_Addressbook_Book_getChanges;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -41,7 +41,8 @@ typedef enum {
|
||||
GetChanges,
|
||||
CheckConnection,
|
||||
AuthenticateUser,
|
||||
GetSupportedFields
|
||||
GetSupportedFields,
|
||||
GetSupportedAuthMethods
|
||||
} PASOperation;
|
||||
|
||||
typedef struct {
|
||||
@ -103,20 +104,25 @@ typedef struct {
|
||||
PASOperation op;
|
||||
} PASGetSupportedFieldsRequest;
|
||||
|
||||
typedef union {
|
||||
PASOperation op;
|
||||
typedef struct {
|
||||
PASOperation op;
|
||||
} PASGetSupportedAuthMethodsRequest;
|
||||
|
||||
PASCreateCardRequest create;
|
||||
PASRemoveCardRequest remove;
|
||||
PASModifyCardRequest modify;
|
||||
PASGetVCardRequest get_vcard;
|
||||
PASGetCursorRequest get_cursor;
|
||||
PASGetBookViewRequest get_book_view;
|
||||
PASGetCompletionViewRequest get_completion_view;
|
||||
PASGetChangesRequest get_changes;
|
||||
PASCheckConnectionRequest check_connection;
|
||||
PASAuthenticateUserRequest auth_user;
|
||||
PASGetSupportedFieldsRequest get_supported_fields;
|
||||
typedef union {
|
||||
PASOperation op;
|
||||
|
||||
PASCreateCardRequest create;
|
||||
PASRemoveCardRequest remove;
|
||||
PASModifyCardRequest modify;
|
||||
PASGetVCardRequest get_vcard;
|
||||
PASGetCursorRequest get_cursor;
|
||||
PASGetBookViewRequest get_book_view;
|
||||
PASGetCompletionViewRequest get_completion_view;
|
||||
PASGetChangesRequest get_changes;
|
||||
PASCheckConnectionRequest check_connection;
|
||||
PASAuthenticateUserRequest auth_user;
|
||||
PASGetSupportedFieldsRequest get_supported_fields;
|
||||
PASGetSupportedAuthMethodsRequest get_supported_auth_methods;
|
||||
} PASRequest;
|
||||
|
||||
struct _PASBook {
|
||||
@ -158,6 +164,9 @@ void pas_book_respond_authenticate_user (PASBook
|
||||
void pas_book_respond_get_supported_fields (PASBook *book,
|
||||
GNOME_Evolution_Addressbook_BookListener_CallStatus status,
|
||||
EList *fields);
|
||||
void pas_book_respond_get_supported_auth_methods (PASBook *book,
|
||||
GNOME_Evolution_Addressbook_BookListener_CallStatus status,
|
||||
EList *fields);
|
||||
|
||||
void pas_book_respond_get_cursor (PASBook *book,
|
||||
GNOME_Evolution_Addressbook_BookListener_CallStatus status,
|
||||
|
Reference in New Issue
Block a user