diff options
author | Diego Escalante Urrelo <descalante@igalia.com> | 2010-12-07 03:49:27 +0800 |
---|---|---|
committer | Diego Escalante Urrelo <descalante@igalia.com> | 2010-12-07 19:20:02 +0800 |
commit | 4a8a0f51849d8414cadfdeb5527820c4a689343a (patch) | |
tree | 6e56e92032376059f5578e67176a70ce62c221fe /lib | |
parent | e691b408355ec7789fe07c93f6c2376660c44486 (diff) | |
download | gsoc2013-epiphany-4a8a0f51849d8414cadfdeb5527820c4a689343a.tar gsoc2013-epiphany-4a8a0f51849d8414cadfdeb5527820c4a689343a.tar.gz gsoc2013-epiphany-4a8a0f51849d8414cadfdeb5527820c4a689343a.tar.bz2 gsoc2013-epiphany-4a8a0f51849d8414cadfdeb5527820c4a689343a.tar.lz gsoc2013-epiphany-4a8a0f51849d8414cadfdeb5527820c4a689343a.tar.xz gsoc2013-epiphany-4a8a0f51849d8414cadfdeb5527820c4a689343a.tar.zst gsoc2013-epiphany-4a8a0f51849d8414cadfdeb5527820c4a689343a.zip |
ephy-profile-migration: separate migration code into another binary
The migration code is now in the ephy-profile-migrator binary, this means:
- epiphany is not linking to NSS anymore
- lib/ephy-profile-migration.c was split into:
+ lib/ephy-profile-migrator.c: the new ephy-profile-migrator binary
+ lib/ephy-profile-utils.c: convenience _ephy_profile_*_form_auth_data functions.
- testing for migration is done without running ephy-profile-migrator
Bug #636685
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Makefile.am | 42 | ||||
-rw-r--r-- | lib/ephy-profile-migration.h | 45 | ||||
-rw-r--r-- | lib/ephy-profile-migrator.c (renamed from lib/ephy-profile-migration.c) | 188 | ||||
-rw-r--r-- | lib/ephy-profile-utils.c | 186 | ||||
-rw-r--r-- | lib/ephy-profile-utils.h | 49 |
5 files changed, 303 insertions, 207 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am index b98c1b37b..f56e59128 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -19,7 +19,7 @@ NOINST_H_FILES = \ ephy-node-common.h \ ephy-object-helpers.h \ ephy-prefs.h \ - ephy-profile-migration.h \ + ephy-profile-utils.h \ ephy-print-utils.h \ ephy-shlib-loader.h \ ephy-signal-accumulator.h \ @@ -57,7 +57,8 @@ libephymisc_la_SOURCES = \ ephy-node-db.c \ ephy-object-helpers.c \ ephy-prefs.h \ - ephy-profile-migration.c \ + ephy-profile-utils.c \ + ephy-profile-utils.h \ ephy-print-utils.c \ ephy-settings.c \ ephy-shlib-loader.c \ @@ -100,18 +101,39 @@ libephymisc_la_LIBADD += \ $(SPELLCHECKER_LIBS) endif -if ENABLE_NSS -NOINST_H_FILES += \ - ephy-nss-glue.h \ - $(NULL) -libephymisc_la_SOURCES += \ - ephy-nss-glue.c - $(NULL) +bin_PROGRAMS = ephy-profile-migrator +ephy_profile_migrator_SOURCES = \ + ephy-profile-migrator.c \ + ephy-profile-utils.c \ + ephy-profile-utils.h \ + ephy-debug.c \ + ephy-debug.h \ + ephy-file-helpers.c \ + ephy-file-helpers.h \ + ephy-settings.c \ + ephy-string.c + +ephy_profile_migrator_CFLAGS = \ + $(DEPENDENCIES_CFLAGS) \ + $(NSS_CFLAGS) \ + $(AM_CFLAGS) + +ephy_profile_migrator_LDADD = \ + $(DEPENDENCIES_LIBS) -libephymisc_la_CFLAGS += $(NSS_CFLAGS) +if ENABLE_NSS +ephy_profile_migrator_SOURCES += \ + ephy-nss-glue.c \ + ephy-nss-glue.h +ephy_profile_migrator_LDADD += $(NSS_LIBS) endif # ENABLE_NSS +ephy_profile_migrator_CPPFLAGS = \ + -I$(top_builddir)/lib \ + -DSHARE_DIR=\"$(pkgdatadir)\" \ + $(AM_CPPFLAGS) + BUILT_SOURCES = \ ephy-lib-type-builtins.c \ ephy-lib-type-builtins.h \ diff --git a/lib/ephy-profile-migration.h b/lib/ephy-profile-migration.h deleted file mode 100644 index 3716f24f0..000000000 --- a/lib/ephy-profile-migration.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright © 2009 Xan López - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef EPHY_PROFILE_MIGRATION_H -#define EPHY_PROFILE_MIGRATION_H - -#include <glib.h> -#include <gnome-keyring.h> - -#define FORM_USERNAME_KEY "form_username" -#define FORM_PASSWORD_KEY "form_password" - -void _ephy_profile_migrate (void); - -void _ephy_profile_store_form_auth_data (const char *uri, - const char *form_username, - const char *form_password, - const char *username, - const char *password); - -void -_ephy_profile_query_form_auth_data (const char *uri, - const char *form_username, - const char *form_password, - GnomeKeyringOperationGetListCallback callback, - gpointer data, - GDestroyNotify destroy_data); - -#endif diff --git a/lib/ephy-profile-migration.c b/lib/ephy-profile-migrator.c index 73584ef44..b64a73383 100644 --- a/lib/ephy-profile-migration.c +++ b/lib/ephy-profile-migrator.c @@ -32,10 +32,9 @@ #include "config.h" -#include "ephy-profile-migration.h" - #include "ephy-debug.h" #include "ephy-file-helpers.h" +#include "ephy-profile-utils.h" #ifdef ENABLE_NSS #include "ephy-nss-glue.h" #endif @@ -46,12 +45,10 @@ /* * What to do to add new migration steps: - * - Bump PROFILE_MIGRATION_VERSION + * - Bump EPHY_PROFILE_MIGRATION_VERSION in lib/ephy-profile-utils.h * - Add your function at the end of the 'migrators' array */ -#define PROFILE_MIGRATION_VERSION 4 - typedef void (*EphyProfileMigrator) (void); static void @@ -103,7 +100,7 @@ migrate_cookies () g_object_unref (txt); g_object_unref (sqlite); } - + out: g_free (src_sqlite); g_free (src_txt); @@ -198,7 +195,7 @@ parse_and_decrypt_signons (const char *signons, /* A block has at least five lines */ if (end - begin < 5) continue; - + /* The first line is the site URL. * For HTTP authentication logins, the URL may contain http realm, * which will be in bracket: @@ -299,11 +296,11 @@ parse_and_decrypt_signons (const char *signons, !g_str_equal (form_password, "*")) { char *u = soup_uri_to_string (uri, FALSE); /* We skip the '*' at the beginning of form_password. */ - _ephy_profile_store_form_auth_data (u, - form_username, - form_password+1, - username, - password); + _ephy_profile_utils_store_form_auth_data (u, + form_username, + form_password+1, + username, + password); g_free (u); } else if (!handle_forms && realm && username && password && @@ -316,7 +313,7 @@ parse_and_decrypt_signons (const char *signons, NULL, uri->scheme, NULL, - uri->port, + uri->port, password, &item_id); } @@ -426,146 +423,20 @@ const EphyProfileMigrator migrators[] = { }; static void -store_form_password_cb (GnomeKeyringResult result, - guint32 id, - gpointer data) -{ - /* FIXME: should we do anything if the operation failed? */ -} - -static void -normalize_and_prepare_uri (SoupURI *uri, - const char *form_username, - const char *form_password) +ephy_migrator () { - g_return_if_fail (uri != NULL); - - /* We normalize https? schemes here so that we use passwords - * we stored in https sites in their http counterparts, and - * vice-versa. */ - if (g_str_equal (uri->scheme, SOUP_URI_SCHEME_HTTPS)) - soup_uri_set_scheme (uri, SOUP_URI_SCHEME_HTTP); - - soup_uri_set_path (uri, NULL); - - /* Store the form login and password names encoded in the - * URL. A bit of an abuse of keyring, but oh well */ - soup_uri_set_query_from_fields (uri, - FORM_USERNAME_KEY, - form_username, - FORM_PASSWORD_KEY, - form_password, - NULL); -} - -void -_ephy_profile_store_form_auth_data (const char *uri, - const char *form_username, - const char *form_password, - const char *username, - const char *password) -{ - SoupURI *fake_uri; - char *fake_uri_str; - - g_return_if_fail (uri); - g_return_if_fail (form_username); - g_return_if_fail (form_password); - g_return_if_fail (username); - g_return_if_fail (password); - - fake_uri = soup_uri_new (uri); - if (fake_uri == NULL) - return; - - normalize_and_prepare_uri (fake_uri, form_username, form_password); - fake_uri_str = soup_uri_to_string (fake_uri, FALSE); - - gnome_keyring_set_network_password (NULL, - username, - NULL, - fake_uri_str, - NULL, - fake_uri->scheme, - NULL, - fake_uri->port, - password, - (GnomeKeyringOperationGetIntCallback)store_form_password_cb, - NULL, - NULL); - soup_uri_free (fake_uri); - g_free (fake_uri_str); -} + int latest, i; -void -_ephy_profile_query_form_auth_data (const char *uri, - const char *form_username, - const char *form_password, - GnomeKeyringOperationGetListCallback callback, - gpointer data, - GDestroyNotify destroy_data) -{ - SoupURI *key; - char *key_str; - - g_return_if_fail (uri); - g_return_if_fail (form_username); - g_return_if_fail (form_password); - - key = soup_uri_new (uri); - g_return_if_fail (key); - - normalize_and_prepare_uri (key, form_username, form_password); - - key_str = soup_uri_to_string (key, FALSE); - - LOG ("Querying Keyring: %s", key_str); - gnome_keyring_find_network_password (NULL, - NULL, - key_str, - NULL, - NULL, - NULL, - 0, - callback, - data, - destroy_data); - soup_uri_free (key); - g_free (key_str); -} + latest = ephy_profile_utils_get_migration_version (); -#define PROFILE_MIGRATION_FILE ".migrated" + LOG ("Running migrators up to version %d, current migration version is %d.", + EPHY_PROFILE_MIGRATION_VERSION, latest); -void -_ephy_profile_migrate () -{ - int latest, i; - char *migrated_file, *contents; - - /* Figure out the latest migration that occured */ - migrated_file = g_build_filename (ephy_dot_dir (), - PROFILE_MIGRATION_FILE, - NULL); - if (g_file_test (migrated_file, G_FILE_TEST_EXISTS)) { - gsize size; - int result; - - g_file_get_contents (migrated_file, &contents, &size, NULL); - result = sscanf(contents, "%d", &latest); - g_free (contents); - - if (result != 1) { - g_warning (_("Failed to read latest migration marker, aborting profile migration.")); - g_free (migrated_file); - return; - } - } else - /* Never migrated */ - latest = 0; - - for (i = latest; i < PROFILE_MIGRATION_VERSION; i++) { + for (i = latest; i < EPHY_PROFILE_MIGRATION_VERSION; i++) { EphyProfileMigrator m; + LOG ("Running migrator: %d of %d", i, EPHY_PROFILE_MIGRATION_VERSION); + /* No need to run the password migration twice in a row. It appears twice in the list for the benefit of people that were using the development snapshots, since an early version didn't @@ -577,10 +448,23 @@ _ephy_profile_migrate () m(); } - /* Write down the latest migration */ - contents = g_strdup_printf ("%d", PROFILE_MIGRATION_VERSION); - g_file_set_contents (migrated_file, contents, -1, NULL); - g_free (contents); - g_free (migrated_file); + if (ephy_profile_utils_set_migration_version (EPHY_PROFILE_MIGRATION_VERSION) != TRUE) + LOG ("Failed to store the current migration version"); } +int +main (int argc, char *argv[]) +{ + g_thread_init (NULL); + + ephy_debug_init (); + + if (!ephy_file_helpers_init (NULL, FALSE, FALSE, NULL)) { + LOG ("Something wrong happened with ephy_file_helpers_init()"); + return -1; + } + + ephy_migrator (); + + return 0; +} diff --git a/lib/ephy-profile-utils.c b/lib/ephy-profile-utils.c new file mode 100644 index 000000000..3f8e0922a --- /dev/null +++ b/lib/ephy-profile-utils.c @@ -0,0 +1,186 @@ +/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* vim: set sw=2 ts=2 sts=2 et: */ +/* + * Copyright © 2009 Xan López + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "config.h" + +#include "ephy-debug.h" +#include "ephy-file-helpers.h" +#include "ephy-profile-utils.h" +#include <libsoup/soup.h> + +#define PROFILE_MIGRATION_FILE ".migrated" + +int +ephy_profile_utils_get_migration_version () +{ + char *migrated_file, *contents; + gsize size; + int result; + int latest = 0; + + migrated_file = g_build_filename (ephy_dot_dir (), + PROFILE_MIGRATION_FILE, + NULL); + + if (g_file_test (migrated_file, G_FILE_TEST_EXISTS)) { + g_file_get_contents (migrated_file, &contents, &size, NULL); + result = sscanf(contents, "%d", &latest); + + g_free (contents); + g_free (migrated_file); + + if (result != 1) + latest = 0; + } + + return latest; +} + +gboolean +ephy_profile_utils_set_migration_version (int version) +{ + char *migrated_file, *contents; + gboolean result = FALSE; + + migrated_file = g_build_filename (ephy_dot_dir (), + PROFILE_MIGRATION_FILE, + NULL); + contents = g_strdup_printf ("%d", version); + result = g_file_set_contents (migrated_file, contents, -1, NULL); + + if (result == FALSE) + LOG ("Couldn't store migration version %d in %s (%s, %s)", + version, migrated_file, ephy_dot_dir (), PROFILE_MIGRATION_FILE); + + g_free (contents); + g_free (migrated_file); + + return result; +} + +static void +store_form_password_cb (GnomeKeyringResult result, + guint32 id, + gpointer data) +{ + /* FIXME: should we do anything if the operation failed? */ +} + +static void +normalize_and_prepare_uri (SoupURI *uri, + const char *form_username, + const char *form_password) +{ + g_return_if_fail (uri != NULL); + + /* We normalize https? schemes here so that we use passwords + * we stored in https sites in their http counterparts, and + * vice-versa. */ + if (g_str_equal (uri->scheme, SOUP_URI_SCHEME_HTTPS)) + soup_uri_set_scheme (uri, SOUP_URI_SCHEME_HTTP); + + soup_uri_set_path (uri, NULL); + + /* Store the form login and password names encoded in the + * URL. A bit of an abuse of keyring, but oh well */ + soup_uri_set_query_from_fields (uri, + FORM_USERNAME_KEY, + form_username, + FORM_PASSWORD_KEY, + form_password, + NULL); +} + +void +_ephy_profile_utils_store_form_auth_data (const char *uri, + const char *form_username, + const char *form_password, + const char *username, + const char *password) +{ + SoupURI *fake_uri; + char *fake_uri_str; + + g_return_if_fail (uri); + g_return_if_fail (form_username); + g_return_if_fail (form_password); + g_return_if_fail (username); + g_return_if_fail (password); + + fake_uri = soup_uri_new (uri); + if (fake_uri == NULL) + return; + + normalize_and_prepare_uri (fake_uri, form_username, form_password); + fake_uri_str = soup_uri_to_string (fake_uri, FALSE); + + gnome_keyring_set_network_password (NULL, + username, + NULL, + fake_uri_str, + NULL, + fake_uri->scheme, + NULL, + fake_uri->port, + password, + (GnomeKeyringOperationGetIntCallback)store_form_password_cb, + NULL, + NULL); + soup_uri_free (fake_uri); + g_free (fake_uri_str); +} + +void +_ephy_profile_utils_query_form_auth_data (const char *uri, + const char *form_username, + const char *form_password, + GnomeKeyringOperationGetListCallback callback, + gpointer data, + GDestroyNotify destroy_data) +{ + SoupURI *key; + char *key_str; + + g_return_if_fail (uri); + g_return_if_fail (form_username); + g_return_if_fail (form_password); + + key = soup_uri_new (uri); + g_return_if_fail (key); + + normalize_and_prepare_uri (key, form_username, form_password); + + key_str = soup_uri_to_string (key, FALSE); + + LOG ("Querying Keyring: %s", key_str); + gnome_keyring_find_network_password (NULL, + NULL, + key_str, + NULL, + NULL, + NULL, + 0, + callback, + data, + destroy_data); + soup_uri_free (key); + g_free (key_str); +} diff --git a/lib/ephy-profile-utils.h b/lib/ephy-profile-utils.h new file mode 100644 index 000000000..7ea679734 --- /dev/null +++ b/lib/ephy-profile-utils.h @@ -0,0 +1,49 @@ +/* + * Copyright © 2009 Xan López + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef EPHY_PROFILE_UTILS_H +#define EPHY_PROFILE_UTILS_H + +#include <glib.h> +#include <gnome-keyring.h> + +#define FORM_USERNAME_KEY "form_username" +#define FORM_PASSWORD_KEY "form_password" + +#define EPHY_PROFILE_MIGRATION_VERSION 4 + +int ephy_profile_utils_get_migration_version (void); + +gboolean ephy_profile_utils_set_migration_version (int version); + +void _ephy_profile_utils_store_form_auth_data (const char *uri, + const char *form_username, + const char *form_password, + const char *username, + const char *password); + +void +_ephy_profile_utils_query_form_auth_data (const char *uri, + const char *form_username, + const char *form_password, + GnomeKeyringOperationGetListCallback callback, + gpointer data, + GDestroyNotify destroy_data); + +#endif |