aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-migrate.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/em-migrate.c')
-rw-r--r--mail/em-migrate.c98
1 files changed, 97 insertions, 1 deletions
diff --git a/mail/em-migrate.c b/mail/em-migrate.c
index 303be22a6d..40dcea652d 100644
--- a/mail/em-migrate.c
+++ b/mail/em-migrate.c
@@ -39,6 +39,7 @@
#include <gtk/gtk.h>
#include <gconf/gconf-client.h>
+#include <libgnome/gnome-config.h>
#include <camel/camel.h>
#include <camel/camel-session.h>
@@ -691,6 +692,100 @@ em_upgrade_xml_1_2 (xmlDocPtr doc)
return upgrade_xml_1_2_rec (root);
}
+/* converts passwords from ~/evolution/private/config.xmldb to gnome_private() */
+static int
+upgrade_passwords_1_2(void)
+{
+ xmlNodePtr root, entry;
+ char *filename;
+ xmlDocPtr priv_doc;
+ struct stat st;
+ int work = 0, res = -1;
+
+ filename = g_build_filename(g_get_home_dir(), "evolution/private/config.xmldb", NULL);
+ if (lstat(filename, &st) == 0 && S_ISREG(st.st_mode))
+ priv_doc = xmlParseFile(filename);
+ g_free(filename);
+
+ if (priv_doc == NULL)
+ return 0;
+
+ root = priv_doc->children;
+ if (strcmp(root->name, "bonobo-config") != 0) {
+ xmlFreeDoc(priv_doc);
+ return 0;
+ }
+
+ root = root->children;
+ while (root) {
+ if (!strcmp(root->name, "section")) {
+ char *path = xmlGetProp(root, "path");
+
+ /* All sections of form
+ <section path="/Passwords/COMPONENT">
+ <entry name="base64name" value="hexvalue">
+ Are converted to:
+ /Evolution/Passwords-COMPONENT/name = value
+ */
+
+ if (path && !strncmp(path, "/Passwords/", 11)) {
+ entry = root->children;
+ while (entry) {
+ if (!strcmp(entry->name, "entry")) {
+ char *namep = xmlGetProp(entry, "name"), *valuep = xmlGetProp(entry, "value");
+
+ if (namep && valuep) {
+ char *value = e_bconf_hex_decode(valuep);
+ char *p, *new;
+ size_t len;
+
+ len = camel_base64_decode_simple(namep, strlen(namep));
+ namep[len] = 0;
+ p = namep;
+
+ d(printf("Found password entry '%s' = '%s'\n", namep, value));
+
+ while (*p) {
+ if (*p == '/' || *p == '=')
+ *p = '_';
+ p++;
+ }
+
+ p = g_strdup_printf("/Evolution/Passwords-%s/%s", path+11, namep);
+ new = gnome_config_private_get_string_with_default(p, NULL);
+ if (new == NULL) {
+ d(printf("password not there, setting '%s' = '%s'\n", p, value));
+ gnome_config_private_set_string(p, value);
+ work = TRUE;
+ } else {
+ d(printf("password already there, leaving\n"));
+ }
+ g_free(p);
+ g_free(value);
+ }
+ xmlFree(namep);
+ xmlFree(valuep);
+ }
+ entry = entry->next;
+ }
+ }
+ xmlFree(path);
+ }
+ root = root->next;
+ }
+
+ xmlFreeDoc(priv_doc);
+
+ if (work) {
+ if (gnome_config_private_sync_file("/Evolution"))
+ res = 0;
+ } else {
+ res = 0;
+ }
+
+ return res;
+}
+
/* ********************************************************************** */
/* Tables for converting flat bonobo conf -> gconf xml blob */
/* ********************************************************************** */
@@ -986,7 +1081,8 @@ em_migrate_1_2(const char *evolution_dir, xmlDocPtr config_xmldb, xmlDocPtr filt
em_upgrade_xml_1_2(filters);
em_upgrade_xml_1_2(vfolders);
-
+ upgrade_passwords_1_2();
+
return 0;
}