X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Feasysetup%2Fmodest-easysetup-wizard.c;h=95b36ae61ae8138927589e1334d472869d52f038;hp=c4b95fc32f5e5eb8c8105c30eb2c68a19777bf90;hb=33c3eb5090ad317e0a565578f4eff4c7ead35a11;hpb=9debe7691a9b21b9b911978c7f3ce0e569166b7f;ds=sidebyside diff --git a/src/maemo/easysetup/modest-easysetup-wizard.c b/src/maemo/easysetup/modest-easysetup-wizard.c index c4b95fc..95b36ae 100644 --- a/src/maemo/easysetup/modest-easysetup-wizard.c +++ b/src/maemo/easysetup/modest-easysetup-wizard.c @@ -146,7 +146,7 @@ set_default_custom_servernames(ModestEasysetupWizardDialog *dialog); static void on_combo_servertype_changed(GtkComboBox *combobox, gpointer user_data); static gint get_serverport_incoming(ModestPresetsServerType servertype_incoming, - ModestPresetsSecurity security_incoming) + ModestPresetsSecurity security_incoming) { int serverport_incoming = 0; /* We don't check for SMTP here as that is impossible for an incoming server. */ @@ -160,6 +160,52 @@ static gint get_serverport_incoming(ModestPresetsServerType servertype_incoming, return serverport_incoming; } +static GList* check_for_supported_auth_methods(ModestEasysetupWizardDialog* account_wizard) +{ + GError *error = NULL; + const ModestTransportStoreProtocol protocol = + easysetup_servertype_combo_box_get_active_servertype ( + EASYSETUP_SERVERTYPE_COMBO_BOX (account_wizard->combo_incoming_servertype)); + const gchar* hostname = gtk_entry_get_text(GTK_ENTRY(account_wizard->entry_incomingserver)); + const gchar* username = gtk_entry_get_text(GTK_ENTRY(account_wizard->entry_user_username)); + const ModestConnectionProtocol protocol_security_incoming = + modest_serversecurity_combo_box_get_active_serversecurity ( + MODEST_SERVERSECURITY_COMBO_BOX ( + account_wizard->combo_incoming_security)); + int port_num = get_serverport_incoming(protocol, protocol_security_incoming); + GList *list_auth_methods = + modest_maemo_utils_get_supported_secure_authentication_methods ( + protocol, + hostname, port_num, username, GTK_WINDOW (account_wizard), &error); + if (list_auth_methods) { + /* TODO: Select the correct method */ + GList* list = NULL; + GList* method; + for (method = list_auth_methods; method != NULL; method = g_list_next(method)) { + ModestAuthProtocol auth = (ModestAuthProtocol) (GPOINTER_TO_INT(method->data)); + if (modest_protocol_info_auth_is_secure(auth)) { + list = g_list_append(list, GINT_TO_POINTER(auth)); + } + } + g_list_free(list_auth_methods); + if (list) + return list; + } + + if(error == NULL || error->domain != modest_maemo_utils_get_supported_secure_authentication_error_quark() || + error->code != MODEST_MAEMO_UTILS_GET_SUPPORTED_SECURE_AUTHENTICATION_ERROR_CANCELED) + { + GtkWidget* error_dialog = gtk_message_dialog_new(GTK_WINDOW(account_wizard), + GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, (error != NULL) ? error->message : _("Server does not support secure authentication!")); + gtk_dialog_run(GTK_DIALOG(error_dialog)); + gtk_widget_destroy(error_dialog); + } + + if(error != NULL) g_error_free(error); + return NULL; +} + static void invoke_enable_buttons_vfunc (ModestEasysetupWizardDialog *wizard_dialog) { @@ -258,10 +304,10 @@ on_combo_account_country (GtkComboBox *widget, gpointer user_data) ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE (self); /* Fill the providers combo, based on the selected country: */ - gint mcc_id = easysetup_country_combo_box_get_active_country_id ( + GSList *list_mcc_ids = easysetup_country_combo_box_get_active_country_ids ( EASYSETUP_COUNTRY_COMBO_BOX (self->combo_account_country)); easysetup_provider_combo_box_fill ( - EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider), priv->presets, mcc_id); + EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider), priv->presets, list_mcc_ids); } static void @@ -890,18 +936,42 @@ on_response (ModestWizardDialog *wizard_dialog, gpointer user_data) { ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (wizard_dialog); - if (response_id == GTK_RESPONSE_CANCEL) { /* Remove any temporarily-saved account that will not actually be needed: */ if (self->saved_account_name) { modest_account_mgr_remove_account (self->account_manager, self->saved_account_name, FALSE); - } + } } - + invoke_enable_buttons_vfunc (self); } +static void +on_response_before (ModestWizardDialog *wizard_dialog, + gint response_id, + gpointer user_data) +{ + ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (wizard_dialog); + if (response_id == GTK_RESPONSE_CANCEL) { + /* This is mostly copied from + * src/maemo/modest-account-settings-dialog.c */ + GtkDialog *dialog = GTK_DIALOG (hildon_note_new_confirmation (GTK_WINDOW (self), + _("imum_nc_wizard_confirm_lose_changes"))); + /* TODO: These button names will be ambiguous, and not specified in the UI specification. */ + + const gint dialog_response = gtk_dialog_run (dialog); + gtk_widget_destroy (GTK_WIDGET (dialog)); + + if (dialog_response != GTK_RESPONSE_OK) + { + /* This is a nasty hack. murrayc. */ + /* Don't let the dialog close */ + g_signal_stop_emission_by_name (wizard_dialog, "response"); + } + } +} + static void modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) { @@ -975,6 +1045,10 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) g_signal_connect_after (G_OBJECT (self), "response", G_CALLBACK (on_response), self); + /* This is to show a confirmation dialog when the user hits cancel */ + g_signal_connect (G_OBJECT (self), "response", + G_CALLBACK (on_response_before), self); + /* When this window is shown, hibernation should not be possible, * because there is no sensible way to save the state: */ modest_window_mgr_prevent_hibernation_while_window_is_shown ( @@ -1180,7 +1254,7 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget * if (name_in_use) { /* Warn the user via a dialog: */ - show_error (GTK_WINDOW (account_wizard), _("mail_ib_account_name_already_existing")); + hildon_banner_show_information(NULL, NULL, _("mail_ib_account_name_already_existing")); return FALSE; } @@ -1193,11 +1267,12 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget * if (!modest_text_utils_validate_email_address (email_address)) { /* Warn the user via a dialog: */ - show_error (GTK_WINDOW (account_wizard), _("mcen_ib_invalid_email")); + hildon_banner_show_information (NULL, NULL, _("mcen_ib_invalid_email")); /* Return focus to the email address entry: */ gtk_widget_grab_focus (account_wizard->entry_user_email); - + gtk_editable_select_region (GTK_EDITABLE (account_wizard->entry_user_email), 0, -1); + return FALSE; } @@ -1214,36 +1289,23 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget * } else if (next_page == account_wizard->page_custom_outgoing) { set_default_custom_servernames (account_wizard); - /* Check if the server support secure authentication */ - if (gtk_toggle_button_get_active ( - GTK_TOGGLE_BUTTON (account_wizard->checkbox_incoming_auth))) { - const ModestTransportStoreProtocol protocol = - easysetup_servertype_combo_box_get_active_servertype ( - EASYSETUP_SERVERTYPE_COMBO_BOX (account_wizard->combo_incoming_servertype)); - const gchar* hostname = gtk_entry_get_text(GTK_ENTRY(account_wizard->entry_incomingserver)); - const ModestConnectionProtocol protocol_security_incoming = - modest_serversecurity_combo_box_get_active_serversecurity ( - MODEST_SERVERSECURITY_COMBO_BOX ( - account_wizard->combo_incoming_security)); - int port_num = get_serverport_incoming(protocol, protocol_security_incoming); - GList *list_auth_methods = - modest_maemo_utils_get_supported_secure_authentication_methods ( - protocol, - hostname, port_num, GTK_WINDOW (account_wizard)); - if (list_auth_methods) { - /* TODO: Select the correct method */ - g_list_free (list_auth_methods); - } - else - { - GtkWidget* error_dialog = gtk_message_dialog_new(GTK_WINDOW(dialog), - GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, _("Server does not support secure authentication!")); - gtk_dialog_run(GTK_DIALOG(error_dialog)); - gtk_widget_destroy(error_dialog); - return FALSE; - } - } + /* Check if the server supports secure authentication */ + const ModestConnectionProtocol security_incoming = + modest_serversecurity_combo_box_get_active_serversecurity ( + MODEST_SERVERSECURITY_COMBO_BOX ( + account_wizard->combo_incoming_security)); + if (gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON (account_wizard->checkbox_incoming_auth)) + && !modest_protocol_info_is_secure(security_incoming)) + { + GList* methods = check_for_supported_auth_methods(account_wizard); + if (!methods) + { + g_list_free(methods); + return FALSE; + } + g_list_free(methods); + } } /* If this is the last page, and this is a click on Finish, @@ -1401,7 +1463,6 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) /* username and password (for both incoming and outgoing): */ const gchar* username = gtk_entry_get_text (GTK_ENTRY (self->entry_user_username)); const gchar* password = gtk_entry_get_text (GTK_ENTRY (self->entry_user_password)); - /* Incoming server: */ /* Note: We need something as default for the ModestTransportStoreProtocol* values, * or modest_account_mgr_add_server_account will fail. */ @@ -1410,7 +1471,7 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) ModestTransportStoreProtocol protocol_incoming = MODEST_PROTOCOL_STORE_POP; ModestConnectionProtocol protocol_security_incoming = MODEST_PROTOCOL_CONNECTION_NORMAL; ModestAuthProtocol protocol_authentication_incoming = MODEST_PROTOCOL_AUTH_NONE; - + /* Get details from the specified presets: */ gchar* provider_id = easysetup_provider_combo_box_get_active_provider_id ( EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider)); @@ -1455,11 +1516,19 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) /* The UI spec says: * If secure authentication is unchecked, allow sending username and password also as plain text. * If secure authentication is checked, require one of the secure methods during connection: SSL, TLS, CRAM-MD5 etc. - * TODO: Do we need to discover which of these (SSL, TLS, CRAM-MD5) is supported? */ - protocol_authentication_incoming = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->checkbox_incoming_auth)) - ? MODEST_PROTOCOL_AUTH_CRAMMD5 - : MODEST_PROTOCOL_AUTH_PASSWORD; + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->checkbox_incoming_auth)) && + !modest_protocol_info_is_secure(protocol_security_incoming)) + { + GList* methods = check_for_supported_auth_methods(self); + if (!methods) + return FALSE; + else + protocol_authentication_incoming = (ModestAuthProtocol) (GPOINTER_TO_INT(methods->data)); + } + else + protocol_authentication_incoming = MODEST_PROTOCOL_AUTH_PASSWORD; } /* First we add the 2 server accounts, and then we add the account that uses them. @@ -1511,15 +1580,19 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) ModestPresetsSecurity security_outgoing = modest_presets_get_info_server_security (priv->presets, provider_id, FALSE /* incoming */); - + + /* TODO: There is no SMTP authentication enum for presets, + so we should probably check what the server supports. */ protocol_security_outgoing = MODEST_PROTOCOL_CONNECTION_NORMAL; if (security_outgoing & MODEST_PRESETS_SECURITY_SECURE_SMTP) { + /* printf("DEBUG: %s: using secure SMTP\n", __FUNCTION__); */ protocol_security_outgoing = MODEST_PROTOCOL_CONNECTION_SSL; /* TODO: Is this what we want? */ serverport_outgoing = 465; protocol_authentication_outgoing = MODEST_PROTOCOL_AUTH_PASSWORD; - } else + } else { + /* printf("DEBUG: %s: using non-secure SMTP\n", __FUNCTION__); */ protocol_authentication_outgoing = MODEST_PROTOCOL_AUTH_NONE; - /* TODO: There is no SMTP authentication enum for presets. */ + } } else { /* Use custom pages because no preset was specified: */ @@ -1571,20 +1644,13 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) return FALSE; } - /* Sanity check: */ /* There must be at least one account now: */ /* Note, when this fails is is caused by a Maemo gconf bug that has been * fixed in versions after 3.1. */ - GSList *account_names = modest_account_mgr_account_names (self->account_manager, FALSE); - if(!account_names) - { + if(!modest_account_mgr_has_accounts (self->account_manager, FALSE)) g_warning ("modest_account_mgr_account_names() returned NULL after adding an account."); - } - g_slist_free (account_names); - - - + /* The user name and email address must be set additionally: */ const gchar* user_name = gtk_entry_get_text (GTK_ENTRY (self->entry_user_name)); modest_account_mgr_set_string (self->account_manager, account_name,