aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/exchange-operations/exchange-ask-password.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/exchange-operations/exchange-ask-password.c')
-rw-r--r--plugins/exchange-operations/exchange-ask-password.c357
1 files changed, 357 insertions, 0 deletions
diff --git a/plugins/exchange-operations/exchange-ask-password.c b/plugins/exchange-operations/exchange-ask-password.c
new file mode 100644
index 0000000000..c21bd67c07
--- /dev/null
+++ b/plugins/exchange-operations/exchange-ask-password.c
@@ -0,0 +1,357 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Sushma Rai <rsushma@novell.com>
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <string.h>
+#include <libgnome/gnome-i18n.h>
+#include <glade/glade.h>
+#include <gtk/gtk.h>
+#include <gtk/gtkdialog.h>
+#include <camel/camel-provider.h>
+#include <camel/camel-url.h>
+#include "mail/em-account-editor.h"
+#include "mail/em-config.h"
+#include "e-util/e-account.h"
+#include "e-util/e-passwords.h"
+#include "e-util/e-config.h"
+
+int e_plugin_lib_enable (EPluginLib *ep, int enable);
+void exchange_options_commit (EPlugin *epl, EConfigHookItemFactoryData *data);
+GtkWidget *org_gnome_exchange_read_url (EPlugin *epl, EConfigHookItemFactoryData *data);
+gboolean org_gnome_exchange_check_options (EPlugin *epl, EConfigHookPageCheckData *data);
+
+const char *owa_entry_text = NULL;
+
+typedef gboolean (CamelProviderValidateUserFunc) (CamelURL *camel_url, const char *url, gboolean *remember_password, CamelException *ex);
+
+typedef struct {
+ CamelProviderValidateUserFunc *validate_user;
+}CamelProviderValidate;
+
+int
+e_plugin_lib_enable (EPluginLib *ep, int enable)
+{
+ if (enable) {
+ }
+ return 0;
+}
+
+void
+exchange_options_commit (EPlugin *epl, EConfigHookItemFactoryData *data)
+{
+ return;
+}
+
+static gboolean
+validate_exchange_user (void *data)
+{
+ EMConfigTargetAccount *target_account = data;
+ CamelProviderValidate *validate;
+ CamelURL *url=NULL;
+ CamelProvider *provider = NULL;
+ gboolean valid = FALSE, *remember_password;
+ char *account_url, *url_string;
+ const char *source_url, *id_name;
+ static int count = 0;
+ char *at, *user;
+
+ if (count)
+ return valid;
+
+ source_url = e_account_get_string (target_account->account,
+ E_ACCOUNT_SOURCE_URL);
+ account_url = g_strdup (source_url);
+ provider = camel_provider_get (account_url, NULL);
+ if (!provider) {
+ return FALSE; /* This should never happen */
+ }
+ url = camel_url_new_with_base (NULL, account_url);
+ validate = provider->priv;
+ if (validate) {
+
+ if (url->user == NULL) {
+ id_name = e_account_get_string (target_account->account,
+ E_ACCOUNT_ID_ADDRESS);
+ if (id_name) {
+ at = strchr(id_name, '@');
+ user = g_alloca(at-id_name+1);
+ memcpy(user, id_name, at-id_name);
+ user[at-id_name] = 0;
+
+ camel_url_set_user (url, user);
+ }
+ }
+ valid = validate->validate_user (url, owa_entry_text,
+ remember_password, NULL);
+ }
+
+ /* FIXME: need to check for return value */
+ if (valid) {
+ count ++;
+ 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);
+ target_account->account->source->save_passwd = *remember_password;
+ }
+
+ camel_url_free (url);
+ g_free (account_url);
+ return valid;
+}
+
+static void
+ok_button_clicked (GtkWidget *button, void *data)
+{
+ gboolean valid = FALSE;
+
+ valid = validate_exchange_user (data); // FIXME: return value
+}
+
+static void
+owa_entry_changed (GtkWidget *entry, void *data)
+{
+ GtkWidget *button = data;
+
+ /* FIXME: return owa_entry_text instead of making it global */
+ owa_entry_text = gtk_entry_get_text (GTK_ENTRY (entry));
+ if (owa_entry_text)
+ gtk_widget_set_sensitive (button, TRUE);
+}
+
+static GtkWidget *
+add_owa_entry (GtkWidget *parent,
+ EConfig *config,
+ EMConfigTargetAccount *target_account)
+{
+ GtkWidget *section, *owa_entry;
+ GtkWidget *hbox, *hbox_inner, *label, *button;
+ GList *container_list, *l;
+ GValue rows = { 0, };
+ GValue cols = { 0, };
+ gint n_rows, n_cols;
+
+ /* Since configure section in the receive page is not plugin enabled
+ * traversing through the container hierarchy to get the reference
+ * to the table, to which owa_url entry has to be added.
+ * This needs to be changed once we can access configure section from
+ * the plugin.
+ */
+
+ container_list = gtk_container_get_children (GTK_CONTAINER (parent));
+ l = g_list_nth (container_list, 1); /* vboxsourceborder */
+ container_list = gtk_container_get_children (GTK_CONTAINER (l->data));
+ l = g_list_nth (container_list, 0); /* sourcevbox */
+ container_list = gtk_container_get_children (GTK_CONTAINER (l->data));
+ l = g_list_nth (container_list, 2); /* source frame */
+ container_list = gtk_container_get_children (GTK_CONTAINER (l->data));
+ l = g_list_nth (container_list, 1); /* hbox173 */
+ container_list = gtk_container_get_children (GTK_CONTAINER (l->data));
+ l = g_list_nth (container_list, 1); /* table 13 */
+ container_list = gtk_container_get_children (GTK_CONTAINER (l->data));
+ l = g_list_nth (container_list, 0); /* table 4*/
+
+ g_value_init (&rows, G_TYPE_INT);
+ g_value_init (&cols, G_TYPE_INT);
+ g_object_get_property (G_OBJECT (l->data), "n-rows", &rows);
+ g_object_get_property (G_OBJECT (l->data), "n-columns", &cols);
+ n_rows = g_value_get_int (&rows);
+ n_cols = g_value_get_int (&cols);
+
+ hbox = gtk_hbox_new (FALSE, 6);
+ gtk_widget_show (hbox);
+
+ hbox_inner = gtk_hbox_new (FALSE, 6);
+ gtk_widget_show (hbox_inner);
+
+ owa_entry = gtk_entry_new ();
+ gtk_widget_show (owa_entry);
+
+ button = gtk_button_new_with_mnemonic (_("A_uthenticate"));
+ gtk_widget_set_sensitive (button, FALSE);
+ gtk_widget_show (button);
+
+ gtk_box_pack_start (GTK_BOX (hbox_inner), owa_entry, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox_inner), button, TRUE, TRUE, 0);
+
+ label = gtk_label_new_with_mnemonic(_("_OWA Url:"));
+ gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ gtk_widget_show (label);
+
+ gtk_box_pack_start (GTK_BOX (hbox), hbox_inner, TRUE, TRUE, 0);
+
+ gtk_table_attach (GTK_TABLE (l->data), label, 0, n_cols-1, n_rows, n_rows+1, GTK_FILL, GTK_FILL, 0, 0);
+ gtk_table_attach (GTK_TABLE (l->data), hbox, n_cols-1, n_cols, n_rows, n_rows+1, GTK_FILL, GTK_FILL, 0, 0);
+
+ gtk_widget_show (GTK_WIDGET (l->data));
+
+ g_signal_connect (owa_entry, "changed",
+ G_CALLBACK (owa_entry_changed), button);
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (ok_button_clicked), target_account);
+
+ section = gtk_vbox_new (FALSE, 0);
+ gtk_widget_hide (section);
+ return section; /* FIXME: return entry */
+}
+
+GtkWidget *
+org_gnome_exchange_read_url (EPlugin *epl, EConfigHookItemFactoryData *data)
+{
+ EMConfigTargetAccount *target_account;
+ EConfig *config;
+ char *account_url = NULL, *exchange_url = NULL;
+ const char *source_url;
+ GtkWidget *owa_entry = NULL, *parent;
+
+ config = data->config;
+ target_account = (EMConfigTargetAccount *)data->config->target;
+
+ source_url = e_account_get_string (target_account->account,
+ E_ACCOUNT_SOURCE_URL);
+ account_url = g_strdup (source_url);
+ exchange_url = g_strrstr (account_url, "exchange");
+
+ if (exchange_url) {
+ if (data->old)
+ return data->old;
+
+ parent = data->parent;
+ owa_entry = add_owa_entry (parent, config, target_account);
+ }
+ g_free (account_url);
+ return owa_entry;
+}
+
+
+GtkWidget *
+org_gnome_exchange_handle_auth (EPlugin *epl, EConfigHookItemFactoryData *data)
+{
+ EMConfigTargetAccount *target_account;
+ EConfig *config;
+ char *account_url = NULL, *exchange_url = NULL, *url_string;
+ const char *source_url;
+ char *auth_type;
+ GtkWidget *auth_section=NULL, *parent, *section;
+
+ config = data->config;
+ target_account = (EMConfigTargetAccount *)data->config->target;
+
+ source_url = e_account_get_string (target_account->account,
+ E_ACCOUNT_SOURCE_URL);
+ account_url = g_strdup (source_url);
+ exchange_url = g_strrstr (account_url, "exchange");
+
+ if (exchange_url) {
+ parent = data->parent;
+
+ /* We don't need auth section while creating the account. But
+ * we need that in the Editor. And since we get the child vbox
+ * from the plugin, we are finding the parent section and
+ * hiding it. This is a temporary fix and this needs to be handled
+ * in the proper way. */
+ section = gtk_widget_get_parent (gtk_widget_get_parent (parent));
+ gtk_widget_hide (section);
+ }
+ auth_section = gtk_entry_new ();
+ gtk_widget_hide (auth_section);
+ return auth_section;
+}
+
+GtkWidget *
+org_gnome_exchange_handle_send_auth_option (EPlugin *epl, EConfigHookItemFactoryData *data)
+{
+ EMConfigTargetAccount *target_account;
+ EConfig *config;
+ char *account_url = NULL, *exchange_url = NULL, *url_string;
+ const char *source_url;
+ char *auth_type;
+ GtkWidget *auth_section=NULL, *parent, *section;
+
+ config = data->config;
+ target_account = (EMConfigTargetAccount *)data->config->target;
+
+ source_url = e_account_get_string (target_account->account,
+ E_ACCOUNT_SOURCE_URL);
+ account_url = g_strdup (source_url);
+ exchange_url = g_strrstr (account_url, "exchange");
+
+ if (exchange_url) {
+ parent = data->parent;
+ /* We don't need auth section while creating the account. But
+ * we need that in the Editor. And since we get the child vbox
+ * from the plugin, we are finding the parent section and
+ * hiding it. This is a temporary fix and this needs to be handled
+ * in the proper way. */
+ section = gtk_widget_get_parent (
+ gtk_widget_get_parent (gtk_widget_get_parent(parent)));
+ gtk_widget_hide (section);
+ }
+ auth_section = gtk_entry_new ();
+ gtk_widget_hide (auth_section);
+ return auth_section;
+}
+
+gboolean
+org_gnome_exchange_check_options (EPlugin *epl, EConfigHookPageCheckData *data)
+{
+ EMConfigTargetAccount *target_account;
+ EConfig *config;
+ char *account_url = NULL, *exchange_url = NULL, *url_string;
+ char *use_ssl = NULL;
+ static int page_check_count = 0;
+ CamelURL *url;
+
+ if ((strcmp (data->pageid, "20.receive_options")) || page_check_count)
+ return TRUE;
+
+ config = data->config;
+ target_account = (EMConfigTargetAccount *)data->config->target;
+ account_url = g_strdup (target_account->account->source->url);
+ exchange_url = g_strrstr (account_url, "exchange");
+
+ if (exchange_url) {
+ page_check_count ++;
+
+ if (owa_entry_text){
+ if (!strncmp (owa_entry_text, "https:", 6))
+ use_ssl = "always";
+
+ url = camel_url_new_with_base (NULL, account_url);
+
+ if (use_ssl)
+ camel_url_set_param (url, "use_ssl", use_ssl);
+ camel_url_set_param (url, "owa_url", owa_entry_text);
+
+ url_string = camel_url_to_string (url, 0);
+ e_account_set_string (target_account->account,
+ E_ACCOUNT_SOURCE_URL, url_string);
+ camel_url_free (url);
+ }
+ }
+ return TRUE;
+}