Added new to initialise the config listener. (update_state) : Now updates

2005-06-10  Sarfraaz Ahmed <asarfraaz@novell.com>

        * exchange-account-setup.c (e_plugin_lib_enable)
        (free_exchange_listener)(e_plugin_lib_enable) : Added new to
        initialise the config listener.
        (update_state) : Now updates the state directly from the server and not
        from the file as earlier.
        (owa_authenticate_user) : Authenticates and validates directly from
        the server instead of using the camel APIs as earlier.
        (set_oof_info) : Sets the state directly on the server
        * Makefile.am : Use CAMEL_EXCHANGE CFLAGS and LIBS

svn path=/trunk/; revision=29486
This commit is contained in:
Sarfraaz Ahmed
2005-06-10 13:23:48 +00:00
committed by Ahmed Sarfraaz
parent 9af7cd15e5
commit 8a19aef396
3 changed files with 110 additions and 93 deletions

View File

@ -1,3 +1,15 @@
2005-06-10 Sarfraaz Ahmed <asarfraaz@novell.com>
* exchange-account-setup.c (e_plugin_lib_enable)
(free_exchange_listener)(e_plugin_lib_enable) : Added new to
initialise the config listener.
(update_state) : Now updates the state directly from the server and not
from the file as earlier.
(owa_authenticate_user) : Authenticates and validates directly from
the server instead of using the camel APIs as earlier.
(set_oof_info) : Sets the state directly on the server
* Makefile.am : Use CAMEL_EXCHANGE CFLAGS and LIBS
2005-05-21 Sarfraaz Ahmed <asarfraaz@novell.com>
Added a bunch of files to create exchange plugins for UI changes

View File

@ -1,6 +1,7 @@
INCLUDES = -I . \
-I$(top_srcdir) \
$(EVOLUTION_MAIL_CFLAGS) \
$(CAMEL_EXCHANGE_CFLAGS) \
$(CAMEL_CFLAGS) \
-DEVOLUTION_GLADEDIR=\""$(gladedir)"\"
@ -15,6 +16,8 @@ liborg_gnome_exchange_account_settings_la_SOURCES = \
liborg_gnome_exchange_account_settings_la_LIBADD = \
$(top_builddir)/e-util/libeutil.la \
$(top_builddir)/widgets/misc/libemiscwidgets.la \
$(CAMEL_EXCHANGE_LIBS) \
$(LDAP_LIBS) \
$(CAMEL_LIBS)
liborg_gnome_exchange_account_settings_la_LDFLAGS = -module -avoid-version

View File

@ -22,6 +22,9 @@
#include "config.h"
#endif
#include "e-util/e-account.h"
#include "e-util/e-error.h"
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
@ -34,11 +37,17 @@
#include <camel/camel-url.h>
#include <camel/camel-service.h>
#include <libedataserver/e-xml-hash-utils.h>
#include <exchange/e2k-validate.h>
#include <exchange/exchange-oof.h>
#include <e-util/e-dialog-utils.h>
#include <exchange/exchange-config-listener.h>
#include "mail/em-account-editor.h"
#include "mail/em-config.h"
#include "e-util/e-account.h"
#include "e-util/e-error.h"
static ExchangeConfigListener *exchange_global_config_listener = NULL;
int e_plugin_lib_enable (EPluginLib *eplib, int enable);
GtkWidget* org_gnome_exchange_settings(EPlugin *epl, EConfigHookItemFactoryData *data);
GtkWidget *org_gnome_exchange_owa_url(EPlugin *epl, EConfigHookItemFactoryData *data);
gboolean org_gnome_exchange_check_options(EPlugin *epl, EConfigHookPageCheckData *data);
@ -79,12 +88,29 @@ CamelServiceAuthType camel_exchange_password_authtype = {
typedef struct {
gboolean state;
char *account_name, *message;
char *message;
GtkWidget *text_view;
}OOFData;
OOFData *oof_data;
static void
free_exchange_listener (void)
{
g_object_unref (exchange_global_config_listener);
}
int
e_plugin_lib_enable (EPluginLib *eplib, int enable)
{
if (!exchange_global_config_listener) {
exchange_global_config_listener = exchange_config_listener_new ();
g_atexit (free_exchange_listener);
}
return 0;
}
static void
update_state (GtkTextBuffer *buffer, gpointer data)
{
@ -128,9 +154,12 @@ org_gnome_exchange_settings(EPlugin *epl, EConfigHookItemFactoryData *data)
GtkWidget *textview_oof;
GtkTextBuffer *buffer;
GtkTextIter start, end;
char *txt, *oof_message, *oof_info_file, *base_dir;
GHashTable *oof_props;
xmlDoc *doc;
char *txt, *oof_message;
gboolean oof_state;
ExchangeAccount *account = NULL;
GSList *accounts = NULL;
GSList *acc = NULL;
gchar *message = NULL;
target_account = (EMConfigTargetAccount *)data->config->target;
source_url = e_account_get_string (target_account->account, E_ACCOUNT_SOURCE_URL);
@ -147,44 +176,33 @@ org_gnome_exchange_settings(EPlugin *epl, EConfigHookItemFactoryData *data)
return data->old;
}
accounts = exchange_config_listener_get_accounts (exchange_global_config_listener);
for (acc = accounts; acc; acc = acc->next) {
printf ("Inside loop\n");
account = acc->data;
}
oof_data = g_new0 (OOFData, 1);
/* See if oof info found already */
oof_data->account_name = g_strdup_printf ("%s@%s", url->user, url->host);
base_dir = g_strdup_printf ("%s/.evolution/exchange/%s",
g_get_home_dir (), oof_data->account_name);
oof_info_file = g_build_filename (base_dir, OOF_INFO_FILE_NAME, NULL);
g_free(base_dir);
oof_data->state = FALSE;
oof_data->message = NULL;
oof_data->text_view = NULL;
if (g_file_test (oof_info_file, G_FILE_TEST_EXISTS)) {
doc = xmlParseFile (oof_info_file);
if (doc) {
char *status, *message;
oof_props = e_xml_to_hash (doc, E_XML_HASH_TYPE_PROPERTY);
xmlFreeDoc (doc);
status = g_hash_table_lookup (oof_props, "oof-state");
if (!strcmp (status, "oof")) {
oof_data->state = TRUE;
message = g_hash_table_lookup (oof_props, "oof-message");
if (message && *message)
oof_data->message = g_strdup (message);
else
oof_data->message = NULL;
}
g_hash_table_destroy (oof_props);
}
}
g_free (oof_info_file);
/* See if oof info found already */
/* construct page */
if (!exchange_oof_get (account, &oof_state, &message)) {
e_notice (NULL, GTK_MESSAGE_ERROR,
_("Could not read out-of-office state"));
return NULL;
}
if (message && *message)
oof_data->message = g_strdup (message);
else
oof_data->message = NULL;
oof_data->state = oof_state;
/* construct page */
oof_page = gtk_vbox_new (FALSE, 6);
gtk_container_set_border_width (GTK_CONTAINER (oof_page), 12);
@ -289,7 +307,6 @@ org_gnome_exchange_settings(EPlugin *epl, EConfigHookItemFactoryData *data)
gtk_text_view_set_buffer (GTK_TEXT_VIEW (textview_oof), buffer);
}
gtk_text_buffer_set_modified (buffer, FALSE);
if (!oof_data->state)
gtk_widget_set_sensitive (textview_oof, FALSE);
oof_data->text_view = textview_oof;
@ -307,23 +324,25 @@ static void
owa_authenticate_user(GtkWidget *button, EConfig *config)
{
EMConfigTargetAccount *target_account = (EMConfigTargetAccount *)config->target;
CamelProviderValidate *validate;
CamelURL *url=NULL;
CamelProvider *provider = NULL;
gboolean remember_password;
char *url_string;
const char *source_url, *id_name;
char *at, *user;
gboolean valid = FALSE;
ExchangeParams *exchange_params;
exchange_params = g_new0 (ExchangeParams, 1);
exchange_params->host = NULL;
exchange_params->ad_server = NULL;
exchange_params->mailbox = NULL;
exchange_params->owa_path = NULL;
exchange_params->is_ntlm = TRUE;
source_url = e_account_get_string (target_account->account, E_ACCOUNT_SOURCE_URL);
provider = camel_provider_get (source_url, NULL);
if (!provider || provider->priv == NULL) {
/* can't happen? */
return;
}
url = camel_url_new(source_url, NULL);
validate = provider->priv;
if (url->user == NULL) {
id_name = e_account_get_string (target_account->account, E_ACCOUNT_ID_ADDRESS);
if (id_name) {
@ -342,14 +361,27 @@ owa_authenticate_user(GtkWidget *button, EConfig *config)
It must use camel_session_ask_password, and it should return an exception for any problem,
which should then be shown using e-error */
if (validate->validate_user(url, camel_url_get_param(url, "owa_url"), &remember_password, NULL)) {
valid = e2k_validate_user ((const char *)camel_url_get_param (url, "owa_url"),
url->user, exchange_params, &remember_password);
camel_url_set_host (url, valid ? exchange_params->host : "");
if (valid)
camel_url_set_authmech (url, exchange_params->is_ntlm ? "NTLM" : "Basic");
camel_url_set_param (url, "ad_server", valid ? exchange_params->ad_server: NULL);
camel_url_set_param (url, "mailbox", valid ? exchange_params->mailbox : NULL);
camel_url_set_param (url, "owa_path", valid ? exchange_params->owa_path : NULL);
g_free (exchange_params->owa_path);
g_free (exchange_params->mailbox);
g_free (exchange_params);
if (valid) {
url_string = camel_url_to_string (url, 0);
e_account_set_string(target_account->account, E_ACCOUNT_SOURCE_URL, url_string);
e_account_set_string(target_account->account, E_ACCOUNT_TRANSPORT_URL, url_string);
e_account_set_bool(target_account->account, E_ACCOUNT_SOURCE_SAVE_PASSWD, remember_password);
g_free(url_string);
e_account_set_string (target_account->account, E_ACCOUNT_SOURCE_URL, url_string);
e_account_set_string (target_account->account, E_ACCOUNT_TRANSPORT_URL, url_string);
e_account_set_bool (target_account->account, E_ACCOUNT_SOURCE_SAVE_PASSWD, remember_password);
g_free (url_string);
}
camel_url_free (url);
}
@ -550,56 +582,26 @@ org_gnome_exchange_check_options(EPlugin *epl, EConfigHookPageCheckData *data)
}
static void
store_oof_info ()
set_oof_info ()
{
char *oof_storage_base_dir, *oof_storage_file, *status;
xmlDocPtr doc;
int result;
GHashTable *oof_props;
GSList *accounts, *acc;
ExchangeAccount *account = NULL;
/* oof information is entered at editor need to be written to the
* server, dump it to the file */
oof_storage_base_dir = g_strdup_printf ("%s/.evolution/exchange/%s",
g_get_home_dir (), oof_data->account_name);
accounts = exchange_config_listener_get_accounts (exchange_global_config_listener);
for (acc = accounts; acc; acc = acc->next) {
account = acc->data;
}
if (!g_file_test (oof_storage_base_dir, G_FILE_TEST_EXISTS)) {
if (mkdir (oof_storage_base_dir, 0755)) {
/* Failed to create file */
g_free (oof_storage_base_dir);
return;
}
if (!exchange_oof_set (account, oof_data->state, oof_data->message)) {
e_notice (NULL, GTK_MESSAGE_ERROR,
_("Could not update out-of-office state"));
}
oof_storage_file = g_build_filename (oof_storage_base_dir,
OOF_INFO_FILE_NAME, NULL);
if (g_file_test (oof_storage_file, G_FILE_TEST_EXISTS))
unlink (oof_storage_file);
if (oof_data->state)
status = g_strdup ("oof");
else
status = g_strdup ("in-office");
oof_props = g_hash_table_new (g_str_hash, g_str_equal);
g_hash_table_insert (oof_props, "oof-state", status);
g_hash_table_insert (oof_props, "sync-state", g_strdup("0"));
g_hash_table_insert (oof_props, "oof-message", oof_data->message);
doc = e_xml_from_hash (oof_props, E_XML_HASH_TYPE_PROPERTY, "oof-info");
result = xmlSaveFile (oof_storage_file, doc);
xmlFreeDoc (doc);
if (result < 0)
unlink (oof_storage_file);
g_hash_table_destroy (oof_props);
g_free (status);
g_free (oof_storage_file);
g_free (oof_storage_base_dir);
}
static void
destroy_oof_data ()
{
if (oof_data->account_name)
g_free (oof_data->account_name);
if (oof_data->message)
g_free (oof_data->message);
g_free (oof_data);
@ -627,8 +629,8 @@ org_gnome_exchange_commit (EPlugin *epl, EConfigHookItemFactoryData *data)
return;
}
/* dump oof data so that can be set in exchange account */
store_oof_info ();
/* Set oof data in exchange account */
set_oof_info ();
destroy_oof_data ();
return;
}