evolution-data-server r9230 - in trunk: camel servers/exchange servers/exchange/lib servers/exchange/storage



Author: mcrha
Date: Wed Jul 30 10:33:24 2008
New Revision: 9230
URL: http://svn.gnome.org/viewvc/evolution-data-server?rev=9230&view=rev

Log:
2008-07-30  Milan Crha  <mcrha redhat com>

	** Part of fix for bug #500389

	* camel/camel-provider.h: (enum CamelProviderConfType): New type 'OPTIONS'.

	* servers/exchange/lib/actest.c: (test_main):
	* servers/exchange/lib/test-utils.c: (test_get_gc):
	* servers/exchange/lib/e2k-validate.h: (enum E2kAutoconfigGalAuthPref),
	(struct ExchangeParams): New enum to setup GAL authentication method.
	* servers/exchange/storage/exchange-account.c: (struct _ExchangeAccountPrivate),
	(exchange_account_connect), (exchange_account_new):
	* servers/exchange/lib/e2k-autoconfig.c: (e2k_autoconfig_new),
	(e2k_autoconfig_set_owa_uri), (e2k_autoconfig_set_gc_server),
	(e2k_autoconfig_get_global_catalog), (set_account_uri_string):
	* servers/exchange/lib/e2k-autoconfig.h: (struct E2kAutoconfig),
	(e2k_autoconfig_set_gc_server):
	* servers/exchange/lib/e2k-global-catalog.h: (e2k_global_catalog_new):
	* servers/exchange/lib/e2k-global-catalog.c: (struct _E2kGlobalCatalogPrivate),
	(connect_ldap), (e2k_global_catalog_new):
	New ability to set different authentication type to GAL and OWA.

	* servers/exchange/lib/e2k-context.c: (e2k_soup_message_new_full):
	Do not crash on invalid uri.



Modified:
   trunk/camel/ChangeLog
   trunk/camel/camel-provider.h
   trunk/servers/exchange/ChangeLog
   trunk/servers/exchange/lib/actest.c
   trunk/servers/exchange/lib/e2k-autoconfig.c
   trunk/servers/exchange/lib/e2k-autoconfig.h
   trunk/servers/exchange/lib/e2k-context.c
   trunk/servers/exchange/lib/e2k-global-catalog.c
   trunk/servers/exchange/lib/e2k-global-catalog.h
   trunk/servers/exchange/lib/e2k-validate.h
   trunk/servers/exchange/lib/test-utils.c
   trunk/servers/exchange/storage/exchange-account.c

Modified: trunk/camel/camel-provider.h
==============================================================================
--- trunk/camel/camel-provider.h	(original)
+++ trunk/camel/camel-provider.h	Wed Jul 30 10:33:24 2008
@@ -129,7 +129,8 @@
 	CAMEL_PROVIDER_CONF_CHECKSPIN,
 	CAMEL_PROVIDER_CONF_ENTRY,
 	CAMEL_PROVIDER_CONF_LABEL,
-	CAMEL_PROVIDER_CONF_HIDDEN
+	CAMEL_PROVIDER_CONF_HIDDEN,
+	CAMEL_PROVIDER_CONF_OPTIONS
 } CamelProviderConfType;
 
 typedef struct {

Modified: trunk/servers/exchange/lib/actest.c
==============================================================================
--- trunk/servers/exchange/lib/actest.c	(original)
+++ trunk/servers/exchange/lib/actest.c	Wed Jul 30 10:33:24 2008
@@ -94,7 +94,7 @@
 	printf ("\n");
 
 	if (gc_server)
-		e2k_autoconfig_set_gc_server (ac, gc_server, -1);
+		e2k_autoconfig_set_gc_server (ac, gc_server, -1, E2K_AUTOCONFIG_USE_GAL_DEFAULT);
 
 	result = e2k_autoconfig_check_exchange (ac, &op);
 	if (result != E2K_AUTOCONFIG_OK) {

Modified: trunk/servers/exchange/lib/e2k-autoconfig.c
==============================================================================
--- trunk/servers/exchange/lib/e2k-autoconfig.c	(original)
+++ trunk/servers/exchange/lib/e2k-autoconfig.c	Wed Jul 30 10:33:24 2008
@@ -106,7 +106,10 @@
 		ac->auth_pref = auth_pref;
 
 	e2k_autoconfig_set_owa_uri (ac, owa_uri);
-	e2k_autoconfig_set_gc_server (ac, NULL, -1);
+	/* use same auth for gal as for the server */
+	e2k_autoconfig_set_gc_server (ac, NULL, -1, ac->auth_pref == E2K_AUTOCONFIG_USE_BASIC ? E2K_AUTOCONFIG_USE_GAL_BASIC :
+						    ac->auth_pref == E2K_AUTOCONFIG_USE_NTLM  ? E2K_AUTOCONFIG_USE_GAL_NTLM  :
+						    E2K_AUTOCONFIG_USE_GAL_DEFAULT);
 	e2k_autoconfig_set_username (ac, username);
 	e2k_autoconfig_set_password (ac, password);
 
@@ -209,7 +212,7 @@
 {
 	reset_owa_derived (ac);
 	if (ac->gc_server_autodetected)
-		e2k_autoconfig_set_gc_server (ac, NULL, -1);
+		e2k_autoconfig_set_gc_server (ac, NULL, -1, ac->gal_auth);
 	g_free (ac->owa_uri);
 
 	if (owa_uri) {
@@ -226,6 +229,7 @@
  * @ac: an autoconfig context
  * @gc_server: the new GC server, or %NULL
  * @gal_limit: GAL search size limit, or -1 for no limit
+ * @gal_auth: Preferred authentication method for gal
  *
  * Sets @ac's #gc_server field to @gc_server (or the default if
  * @gc_server is %NULL) and the #gal_limit field to @gal_limit, and
@@ -234,7 +238,7 @@
  **/
 void
 e2k_autoconfig_set_gc_server (E2kAutoconfig *ac, const char *gc_server,
-			      int gal_limit)
+			      int gal_limit, E2kAutoconfigGalAuthPref gal_auth)
 {
 	const char *default_gal_limit;
 
@@ -253,6 +257,7 @@
 			gal_limit = atoi (default_gal_limit);
 	}
 	ac->gal_limit = gal_limit;
+	ac->gal_auth = gal_auth;
 }
 
 /**
@@ -899,7 +904,7 @@
 
 	return e2k_global_catalog_new (ac->gc_server, ac->gal_limit,
 				       ac->username, ac->nt_domain,
-				       ac->password);
+				       ac->password, ac->gal_auth);
 }
 
 /*
@@ -1000,6 +1005,18 @@
 	e2k_uri_append_encoded (uri, ac->gc_server, FALSE, ";?");
 	if (ac->gal_limit != -1)
 		g_string_append_printf (uri, ";ad_limit=%d", ac->gal_limit);
+	if (ac->gal_auth != E2K_AUTOCONFIG_USE_GAL_DEFAULT) {
+		const char *value = NULL;
+
+		switch (ac->gal_auth) {
+		case E2K_AUTOCONFIG_USE_GAL_BASIC: value = "basic"; break;
+		case E2K_AUTOCONFIG_USE_GAL_NTLM:  value = "ntlm";  break;
+		case E2K_AUTOCONFIG_USE_GAL_DEFAULT: /* should not get here */ break;
+		}
+
+		if (value)
+			g_string_append_printf (uri, ";ad_auth=%s", value);
+	}
 
 	path = g_strdup (home_uri->path + 1);
 	mailbox = strrchr (path, '/');

Modified: trunk/servers/exchange/lib/e2k-autoconfig.h
==============================================================================
--- trunk/servers/exchange/lib/e2k-autoconfig.h	(original)
+++ trunk/servers/exchange/lib/e2k-autoconfig.h	Wed Jul 30 10:33:24 2008
@@ -32,6 +32,7 @@
 	char *owa_uri, *gc_server;
 	char *username, *password;
 	int gal_limit;
+	E2kAutoconfigGalAuthPref gal_auth;
 
 	/* Output data */
 	E2kExchangeVersion version;
@@ -59,7 +60,8 @@
 							  const char *owa_uri);
 void                 e2k_autoconfig_set_gc_server        (E2kAutoconfig *ac,
 							  const char *gc_server,
-							  int gal_limit);
+							  int gal_limit,
+							  E2kAutoconfigGalAuthPref gal_auth);
 void                 e2k_autoconfig_set_username         (E2kAutoconfig *ac,
 							  const char *username);
 void                 e2k_autoconfig_set_password         (E2kAutoconfig *ac,

Modified: trunk/servers/exchange/lib/e2k-context.c
==============================================================================
--- trunk/servers/exchange/lib/e2k-context.c	(original)
+++ trunk/servers/exchange/lib/e2k-context.c	Wed Jul 30 10:33:24 2008
@@ -830,6 +830,7 @@
 	SoupMessage *msg;
 
 	msg = e2k_soup_message_new (ctx, uri, method);
+	g_return_val_if_fail (msg != NULL, NULL);
 	soup_message_set_request (msg, content_type, use, body, length);
 
 	return msg;

Modified: trunk/servers/exchange/lib/e2k-global-catalog.c
==============================================================================
--- trunk/servers/exchange/lib/e2k-global-catalog.c	(original)
+++ trunk/servers/exchange/lib/e2k-global-catalog.c	Wed Jul 30 10:33:24 2008
@@ -49,6 +49,7 @@
 	GHashTable *entry_cache, *server_cache;
 
 	char *server, *user, *nt_domain, *password;
+	E2kAutoconfigGalAuthPref auth;
 };
 
 #define PARENT_TYPE G_TYPE_OBJECT
@@ -314,12 +315,25 @@
 
 	/* authenticate */
 #ifdef HAVE_LDAP_NTLM_BIND
-	if (ntlm_bind (gc, op, ldap) == LDAP_SUCCESS) {
-		E2K_GC_DEBUG_MSG(("GC: connected via NTLM\n\n"));
-		return LDAP_SUCCESS;
+	printf ("can NTLM bind\n");
+	if ((gc->priv->auth == E2K_AUTOCONFIG_USE_GAL_DEFAULT || gc->priv->auth == E2K_AUTOCONFIG_USE_GAL_NTLM)) {
+		ldap_error = ntlm_bind (gc, op, ldap);
+		if (ldap_error == LDAP_SUCCESS) {
+			E2K_GC_DEBUG_MSG(("GC: connected via NTLM\n\n"));
+			return LDAP_SUCCESS;
+		} else if (gc->priv->auth == E2K_AUTOCONFIG_USE_GAL_NTLM) {
+			E2K_GC_DEBUG_MSG(("GC: user setup NTLM, but it failed 0x%02x\n", ldap_error));
+			return ldap_error;
+		}
 	}
 #endif
 
+	if (gc->priv->auth == E2K_AUTOCONFIG_USE_GAL_NTLM) {
+		E2K_GC_DEBUG_MSG(("GC: user setup NTLM, but we do not have it\n"));
+		/* a little hack */
+		return LDAP_AUTH_METHOD_NOT_SUPPORTED;
+	}
+
 	nt_name = gc->priv->nt_domain ?
 		g_strdup_printf ("%s\\%s", gc->priv->nt_domain, gc->priv->user) :
 		g_strdup (gc->priv->user);
@@ -335,7 +349,7 @@
 	auth.Password = g_utf8_to_utf16 (gc->priv->password, -1, NULL, NULL, NULL);
 	auth.PasswordLength = wcslen (auth.Password);
 	auth.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
-	ldap_error = ldap_bind_s (ldap, nt_name, &auth, LDAP_AUTH_NTLM);
+	ldap_error = ldap_bind_s (ldap, nt_name, &auth, gc->priv->auth == E2K_AUTOCONFIG_USE_GAL_BASIC ? LDAP_AUTH_SIMPLE : LDAP_AUTH_NTLM);
 	g_free (auth.Password);
 	g_free (auth.Domain);
 	g_free (auth.User);
@@ -439,12 +453,13 @@
 E2kGlobalCatalog *
 e2k_global_catalog_new (const char *server, int response_limit,
 			const char *user, const char *domain,
-			const char *password)
+			const char *password, E2kAutoconfigGalAuthPref use_auth)
 {
 	E2kGlobalCatalog *gc;
 
 	gc = g_object_new (E2K_TYPE_GLOBAL_CATALOG, NULL);
 	gc->priv->server = g_strdup (server);
+	gc->priv->auth = use_auth;
 	gc->priv->user = g_strdup (user);
 	gc->priv->nt_domain = g_strdup (domain);
 	gc->priv->password = g_strdup (password);

Modified: trunk/servers/exchange/lib/e2k-global-catalog.h
==============================================================================
--- trunk/servers/exchange/lib/e2k-global-catalog.h	(original)
+++ trunk/servers/exchange/lib/e2k-global-catalog.h	Wed Jul 30 10:33:24 2008
@@ -7,6 +7,7 @@
 #include <glib-object.h>
 #include "e2k-types.h"
 #include "e2k-operation.h"
+#include "e2k-validate.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -38,7 +39,8 @@
 						      int response_limit,
 						      const char *user,
 						      const char *domain,
-						      const char *password);
+						      const char *password,
+						      E2kAutoconfigGalAuthPref use_auth);
 
 
 typedef enum {

Modified: trunk/servers/exchange/lib/e2k-validate.h
==============================================================================
--- trunk/servers/exchange/lib/e2k-validate.h	(original)
+++ trunk/servers/exchange/lib/e2k-validate.h	Wed Jul 30 10:33:24 2008
@@ -11,9 +11,18 @@
 #pragma }
 #endif /* __cplusplus */
 
+typedef enum {
+	E2K_AUTOCONFIG_USE_GAL_DEFAULT, /* try ntlm if available and then basic if not or failed */
+
+	E2K_AUTOCONFIG_USE_GAL_BASIC,
+	/*E2K_AUTOCONFIG_USE_GAL_SASL,*/
+	E2K_AUTOCONFIG_USE_GAL_NTLM
+} E2kAutoconfigGalAuthPref;
+
 typedef struct {
         char *host;
         char *ad_server;
+	E2kAutoconfigGalAuthPref ad_auth;
         char *mailbox;
         char *owa_path;
 	gboolean is_ntlm;

Modified: trunk/servers/exchange/lib/test-utils.c
==============================================================================
--- trunk/servers/exchange/lib/test-utils.c	(original)
+++ trunk/servers/exchange/lib/test-utils.c	Wed Jul 30 10:33:24 2008
@@ -181,7 +181,7 @@
 		user = g_strdup (g_get_user_name ());
 
 	password = test_get_password (user, server);
-	gc = e2k_global_catalog_new (server, -1, user, NULL, password);
+	gc = e2k_global_catalog_new (server, -1, user, NULL, password, E2K_AUTOCONFIG_USE_GAL_DEFAULT);
 	if (!gc) {
 		fprintf (stderr, "Could not create GC\n");
 		exit (1);

Modified: trunk/servers/exchange/storage/exchange-account.c
==============================================================================
--- trunk/servers/exchange/storage/exchange-account.c	(original)
+++ trunk/servers/exchange/storage/exchange-account.c	Wed Jul 30 10:33:24 2008
@@ -79,6 +79,7 @@
 	char *owa_url;
 	E2kAutoconfigAuthPref auth_pref;
 	int ad_limit, passwd_exp_warn_period, quota_limit;
+	E2kAutoconfigGalAuthPref ad_auth;
 
 	EAccountList *account_list;
 	EAccount *account;
@@ -1446,7 +1447,7 @@
 	g_free (user_name);
 
 	e2k_autoconfig_set_gc_server (ac, account->priv->ad_server,
-				      account->priv->ad_limit);
+				      account->priv->ad_limit, account->priv->ad_auth);
 
 	if (!pword) {
 		account->priv->connecting = FALSE;
@@ -2282,6 +2283,15 @@
 		param = e2k_uri_get_param (uri, "ad_limit");
 		if (param)
 			account->priv->ad_limit = atoi (param);
+		param = e2k_uri_get_param (uri, "ad_auth");
+		if (!param || g_ascii_strcasecmp (param, "default") == 0)
+			account->priv->ad_auth = E2K_AUTOCONFIG_USE_GAL_DEFAULT;
+		else if (g_ascii_strcasecmp (param, "basic") == 0)
+			account->priv->ad_auth = E2K_AUTOCONFIG_USE_GAL_BASIC;
+		else if (g_ascii_strcasecmp (param, "ntlm") == 0)
+			account->priv->ad_auth = E2K_AUTOCONFIG_USE_GAL_NTLM;
+		else
+			account->priv->ad_auth = E2K_AUTOCONFIG_USE_GAL_DEFAULT;
 	}
 
 	passwd_exp_warn_period = e2k_uri_get_param (uri, "passwd_exp_warn_period");



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]