summaryrefslogtreecommitdiffstats
path: root/WebKit/gtk/webkit/webkitsoupauthdialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/gtk/webkit/webkitsoupauthdialog.c')
-rw-r--r--WebKit/gtk/webkit/webkitsoupauthdialog.c375
1 files changed, 0 insertions, 375 deletions
diff --git a/WebKit/gtk/webkit/webkitsoupauthdialog.c b/WebKit/gtk/webkit/webkitsoupauthdialog.c
deleted file mode 100644
index 2eefcc5..0000000
--- a/WebKit/gtk/webkit/webkitsoupauthdialog.c
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * Copyright (C) 2009 Igalia S.L.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-
-#define LIBSOUP_I_HAVE_READ_BUG_594377_AND_KNOW_SOUP_PASSWORD_MANAGER_MIGHT_GO_AWAY
-
-#include <glib/gi18n-lib.h>
-#include <gtk/gtk.h>
-#include <libsoup/soup.h>
-
-#include "GtkVersioning.h"
-#include "webkitmarshal.h"
-#include "webkitsoupauthdialog.h"
-
-/**
- * SECTION:webkitsoupauthdialog
- * @short_description: A #SoupSessionFeature to provide a simple
- * authentication dialog for HTTP basic auth support.
- *
- * #WebKitSoupAuthDialog is a #SoupSessionFeature that you can attach to your
- * #SoupSession to provide a simple authentication dialog while
- * handling HTTP basic auth. It is built as a simple C-only module
- * to ease reuse.
- */
-
-static void webkit_soup_auth_dialog_session_feature_init(SoupSessionFeatureInterface* feature_interface, gpointer interface_data);
-static void attach(SoupSessionFeature* manager, SoupSession* session);
-static void detach(SoupSessionFeature* manager, SoupSession* session);
-
-enum {
- CURRENT_TOPLEVEL,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE_WITH_CODE(WebKitSoupAuthDialog, webkit_soup_auth_dialog, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE(SOUP_TYPE_SESSION_FEATURE,
- webkit_soup_auth_dialog_session_feature_init))
-
-static void webkit_soup_auth_dialog_class_init(WebKitSoupAuthDialogClass* klass)
-{
- GObjectClass* object_class = G_OBJECT_CLASS(klass);
-
- /**
- * WebKitSoupAuthDialog::current-toplevel:
- * @authDialog: the object on which the signal is emitted
- * @message: the #SoupMessage being used in the authentication process
- *
- * This signal is emitted by the @authDialog when it needs to know
- * the current toplevel widget in order to correctly set the
- * transiency for the authentication dialog.
- *
- * Return value: (transfer none): the current toplevel #GtkWidget or %NULL if there's none
- *
- * Since: 1.1.1
- */
- signals[CURRENT_TOPLEVEL] =
- g_signal_new("current-toplevel",
- G_OBJECT_CLASS_TYPE(object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(WebKitSoupAuthDialogClass, current_toplevel),
- NULL, NULL,
- webkit_marshal_OBJECT__OBJECT,
- GTK_TYPE_WIDGET, 1,
- SOUP_TYPE_MESSAGE);
-}
-
-static void webkit_soup_auth_dialog_init(WebKitSoupAuthDialog* instance)
-{
-}
-
-static void webkit_soup_auth_dialog_session_feature_init(SoupSessionFeatureInterface *feature_interface,
- gpointer interface_data)
-{
- feature_interface->attach = attach;
- feature_interface->detach = detach;
-}
-
-typedef struct _WebKitAuthData {
- SoupMessage* msg;
- SoupAuth* auth;
- SoupSession* session;
- SoupSessionFeature* manager;
- GtkWidget* loginEntry;
- GtkWidget* passwordEntry;
- GtkWidget* checkButton;
- char *username;
- char *password;
-} WebKitAuthData;
-
-static void free_authData(WebKitAuthData* authData)
-{
- g_object_unref(authData->msg);
- g_free(authData->username);
- g_free(authData->password);
- g_slice_free(WebKitAuthData, authData);
-}
-
-#ifdef SOUP_TYPE_PASSWORD_MANAGER
-static void save_password_callback(SoupMessage* msg, WebKitAuthData* authData)
-{
- /* Anything but 401 and 5xx means the password was accepted */
- if (msg->status_code != 401 && msg->status_code < 500)
- soup_auth_save_password(authData->auth, authData->username, authData->password);
-
- /* Disconnect the callback. If the authentication succeeded we are
- * done, and if it failed we'll create a new authData and we'll
- * connect to 'got-headers' again in response_callback */
- g_signal_handlers_disconnect_by_func(msg, save_password_callback, authData);
-
- free_authData(authData);
-}
-#endif
-
-static void response_callback(GtkDialog* dialog, gint response_id, WebKitAuthData* authData)
-{
- gboolean freeAuthData = TRUE;
-
- if (response_id == GTK_RESPONSE_OK) {
- authData->username = g_strdup(gtk_entry_get_text(GTK_ENTRY(authData->loginEntry)));
- authData->password = g_strdup(gtk_entry_get_text(GTK_ENTRY(authData->passwordEntry)));
-
- soup_auth_authenticate(authData->auth, authData->username, authData->password);
-
-#ifdef SOUP_TYPE_PASSWORD_MANAGER
- if (authData->checkButton &&
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(authData->checkButton))) {
- g_signal_connect(authData->msg, "got-headers", G_CALLBACK(save_password_callback), authData);
- freeAuthData = FALSE;
- }
-#endif
- }
-
- soup_session_unpause_message(authData->session, authData->msg);
- if (freeAuthData)
- free_authData(authData);
- gtk_widget_destroy(GTK_WIDGET(dialog));
-}
-
-static GtkWidget *
-table_add_entry(GtkWidget* table,
- int row,
- const char* label_text,
- const char* value,
- gpointer user_data)
-{
- GtkWidget* entry;
- GtkWidget* label;
-
- label = gtk_label_new(label_text);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-
- entry = gtk_entry_new();
- gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
-
- if (value)
- gtk_entry_set_text(GTK_ENTRY(entry), value);
-
- gtk_table_attach(GTK_TABLE(table), label,
- 0, 1, row, row + 1,
- GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
- gtk_table_attach_defaults(GTK_TABLE(table), entry,
- 1, 2, row, row + 1);
-
- return entry;
-}
-
-static gboolean session_can_save_passwords(SoupSession* session)
-{
-#ifdef SOUP_TYPE_PASSWORD_MANAGER
- return soup_session_get_feature(session, SOUP_TYPE_PASSWORD_MANAGER) != NULL;
-#else
- return FALSE;
-#endif
-}
-
-static void show_auth_dialog(WebKitAuthData* authData, const char* login, const char* password)
-{
- GtkWidget* toplevel;
- GtkWidget* widget;
- GtkDialog* dialog;
- GtkWindow* window;
- GtkWidget* entryContainer;
- GtkWidget* hbox;
- GtkWidget* mainVBox;
- GtkWidget* vbox;
- GtkWidget* icon;
- GtkWidget* table;
- GtkWidget* serverMessageDescriptionLabel;
- GtkWidget* serverMessageLabel;
- GtkWidget* descriptionLabel;
- char* description;
- const char* realm;
- gboolean hasRealm;
- SoupURI* uri;
- GtkWidget* rememberBox;
- GtkWidget* checkButton;
-
- /* From GTK+ gtkmountoperation.c, modified and simplified. LGPL 2 license */
-
- widget = gtk_dialog_new();
- window = GTK_WINDOW(widget);
- dialog = GTK_DIALOG(widget);
-
- gtk_dialog_add_buttons(dialog,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
-
- /* Set the dialog up with HIG properties */
-#ifdef GTK_API_VERSION_2
- gtk_dialog_set_has_separator(dialog, FALSE);
-#endif
- gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
- gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_content_area(dialog)), 2); /* 2 * 5 + 2 = 12 */
- gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_action_area(dialog)), 5);
- gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_action_area(dialog)), 6);
-
- gtk_window_set_resizable(window, FALSE);
- gtk_window_set_title(window, "");
- gtk_window_set_icon_name(window, GTK_STOCK_DIALOG_AUTHENTICATION);
-
- gtk_dialog_set_default_response(dialog, GTK_RESPONSE_OK);
-
- /* Get the current toplevel */
- g_signal_emit(authData->manager, signals[CURRENT_TOPLEVEL], 0, authData->msg, &toplevel);
-
- if (toplevel)
- gtk_window_set_transient_for(window, GTK_WINDOW(toplevel));
-
- /* Build contents */
- hbox = gtk_hbox_new(FALSE, 12);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
- gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(dialog)), hbox, TRUE, TRUE, 0);
-
- icon = gtk_image_new_from_stock(GTK_STOCK_DIALOG_AUTHENTICATION,
- GTK_ICON_SIZE_DIALOG);
-
- gtk_misc_set_alignment(GTK_MISC(icon), 0.5, 0.0);
- gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0);
-
- mainVBox = gtk_vbox_new(FALSE, 18);
- gtk_box_pack_start(GTK_BOX(hbox), mainVBox, TRUE, TRUE, 0);
-
- uri = soup_message_get_uri(authData->msg);
- description = g_strdup_printf(_("A username and password are being requested by the site %s"), uri->host);
- descriptionLabel = gtk_label_new(description);
- g_free(description);
- gtk_misc_set_alignment(GTK_MISC(descriptionLabel), 0.0, 0.5);
- gtk_label_set_line_wrap(GTK_LABEL(descriptionLabel), TRUE);
- gtk_box_pack_start(GTK_BOX(mainVBox), GTK_WIDGET(descriptionLabel),
- FALSE, FALSE, 0);
-
- vbox = gtk_vbox_new(FALSE, 6);
- gtk_box_pack_start(GTK_BOX(mainVBox), vbox, FALSE, FALSE, 0);
-
- /* The table that holds the entries */
- entryContainer = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
-
- gtk_alignment_set_padding(GTK_ALIGNMENT(entryContainer),
- 0, 0, 0, 0);
-
- gtk_box_pack_start(GTK_BOX(vbox), entryContainer,
- FALSE, FALSE, 0);
-
- realm = soup_auth_get_realm(authData->auth);
- // Checking that realm is not an empty string
- hasRealm = (realm && (strlen(realm) > 0));
-
- table = gtk_table_new(hasRealm ? 3 : 2, 2, FALSE);
- gtk_table_set_col_spacings(GTK_TABLE(table), 12);
- gtk_table_set_row_spacings(GTK_TABLE(table), 6);
- gtk_container_add(GTK_CONTAINER(entryContainer), table);
-
- if (hasRealm) {
- serverMessageDescriptionLabel = gtk_label_new(_("Server message:"));
- serverMessageLabel = gtk_label_new(realm);
- gtk_misc_set_alignment(GTK_MISC(serverMessageDescriptionLabel), 0.0, 0.5);
- gtk_label_set_line_wrap(GTK_LABEL(serverMessageDescriptionLabel), TRUE);
- gtk_misc_set_alignment(GTK_MISC(serverMessageLabel), 0.0, 0.5);
- gtk_label_set_line_wrap(GTK_LABEL(serverMessageLabel), TRUE);
-
- gtk_table_attach_defaults(GTK_TABLE(table), serverMessageDescriptionLabel,
- 0, 1, 0, 1);
- gtk_table_attach_defaults(GTK_TABLE(table), serverMessageLabel,
- 1, 2, 0, 1);
- }
-
- authData->loginEntry = table_add_entry(table, hasRealm ? 1 : 0, _("Username:"),
- login, NULL);
- authData->passwordEntry = table_add_entry(table, hasRealm ? 2 : 1, _("Password:"),
- password, NULL);
-
- gtk_entry_set_visibility(GTK_ENTRY(authData->passwordEntry), FALSE);
-
- if (session_can_save_passwords(authData->session)) {
- rememberBox = gtk_vbox_new(FALSE, 6);
- gtk_box_pack_start(GTK_BOX(vbox), rememberBox,
- FALSE, FALSE, 0);
- checkButton = gtk_check_button_new_with_mnemonic(_("_Remember password"));
- if (login && password)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkButton), TRUE);
- gtk_label_set_line_wrap(GTK_LABEL(gtk_bin_get_child(GTK_BIN(checkButton))), TRUE);
- gtk_box_pack_start(GTK_BOX(rememberBox), checkButton, FALSE, FALSE, 0);
- authData->checkButton = checkButton;
- }
-
- g_signal_connect(dialog, "response", G_CALLBACK(response_callback), authData);
- gtk_widget_show_all(widget);
-}
-
-static void session_authenticate(SoupSession* session, SoupMessage* msg, SoupAuth* auth, gboolean retrying, gpointer user_data)
-{
- SoupURI* uri;
- WebKitAuthData* authData;
- SoupSessionFeature* manager = (SoupSessionFeature*)user_data;
-#ifdef SOUP_TYPE_PASSWORD_MANAGER
- GSList* users;
-#endif
- const char *login, *password;
-
- soup_session_pause_message(session, msg);
- /* We need to make sure the message sticks around when pausing it */
- g_object_ref(msg);
-
- uri = soup_message_get_uri(msg);
- authData = g_slice_new0(WebKitAuthData);
- authData->msg = msg;
- authData->auth = auth;
- authData->session = session;
- authData->manager = manager;
-
- login = password = NULL;
-
-#ifdef SOUP_TYPE_PASSWORD_MANAGER
- users = soup_auth_get_saved_users(auth);
- if (users) {
- login = users->data;
- password = soup_auth_get_saved_password(auth, login);
- g_slist_free(users);
- }
-#endif
-
- show_auth_dialog(authData, login, password);
-}
-
-static void attach(SoupSessionFeature* manager, SoupSession* session)
-{
- g_signal_connect(session, "authenticate", G_CALLBACK(session_authenticate), manager);
-}
-
-static void detach(SoupSessionFeature* manager, SoupSession* session)
-{
- g_signal_handlers_disconnect_by_func(session, session_authenticate, manager);
-}
-
-