Add a plugin method to allow updating stored passwords on master password change.
authorColin Leroy <colin@colino.net>
Thu, 11 Feb 2016 13:32:44 +0000 (14:32 +0100)
committerColin Leroy <colin@colino.net>
Thu, 11 Feb 2016 13:32:44 +0000 (14:32 +0100)
GData is still untested.

14 files changed:
src/common/plugin.c
src/common/plugin.h
src/password.c
src/plugins/gdata/cm_gdata_prefs.c
src/plugins/gdata/cm_gdata_prefs.h
src/plugins/gdata/gdata_plugin.c
src/plugins/spam_report/plugin.def
src/plugins/spam_report/spam_report.c
src/plugins/spam_report/spam_report_prefs.c
src/plugins/spam_report/spam_report_prefs.h
src/plugins/vcalendar/plugin.c
src/plugins/vcalendar/plugin.def
src/plugins/vcalendar/vcal_prefs.c
src/plugins/vcalendar/vcal_prefs.h

index ad3d27f4824b324bd61a1bd8deb642500123d857..b7282b860386c94e54c1a6dc91c4d82f66c5eb8d 100644 (file)
@@ -51,6 +51,7 @@ struct _Plugin
        const gchar *(*version) (void);
        const gchar *(*type) (void);
        const gchar *(*licence) (void);
        const gchar *(*version) (void);
        const gchar *(*type) (void);
        const gchar *(*licence) (void);
+       void (*master_password_change) (const gchar *oldp, const gchar *newp);
        struct PluginFeature *(*provides) (void);
        
        GSList *rdeps;
        struct PluginFeature *(*provides) (void);
        
        GSList *rdeps;
@@ -419,6 +420,8 @@ Plugin *plugin_load(const gchar *filename, gchar **error)
        const gchar *(*plugin_type)(void);
        const gchar *(*plugin_licence)(void);
        struct PluginFeature *(*plugin_provides)(void);
        const gchar *(*plugin_type)(void);
        const gchar *(*plugin_licence)(void);
        struct PluginFeature *(*plugin_provides)(void);
+       void (*plugin_master_password_change) (const gchar *oldp, const gchar *newp) = NULL;
+
        gint ok;
        START_TIMING((filename?filename:"NULL plugin"));
        cm_return_val_if_fail(filename != NULL, NULL);
        gint ok;
        START_TIMING((filename?filename:"NULL plugin"));
        cm_return_val_if_fail(filename != NULL, NULL);
@@ -474,6 +477,9 @@ init_plugin:
                g_free(plugin);
                return NULL;
        }
                g_free(plugin);
                return NULL;
        }
+
+       /* Optional methods */
+       g_module_symbol(plugin->module, "plugin_master_password_change", (gpointer)&plugin_master_password_change);
        
        if (plugin_licence_check(plugin_licence()) != TRUE) {
                *error = g_strdup(_("This module is not licensed under a GPL v3 or later compatible license."));
        
        if (plugin_licence_check(plugin_licence()) != TRUE) {
                *error = g_strdup(_("This module is not licensed under a GPL v3 or later compatible license."));
@@ -506,6 +512,7 @@ init_plugin:
        plugin->type = plugin_type;
        plugin->licence = plugin_licence;
        plugin->provides = plugin_provides;
        plugin->type = plugin_type;
        plugin->licence = plugin_licence;
        plugin->provides = plugin_provides;
+       plugin->master_password_change = plugin_master_password_change;
        plugin->filename = g_strdup(filename);
        plugin->error = NULL;
 
        plugin->filename = g_strdup(filename);
        plugin->error = NULL;
 
@@ -745,6 +752,17 @@ const gchar *plugin_get_error(Plugin *plugin)
        return plugin->error;
 }
 
        return plugin->error;
 }
 
+void plugins_master_password_change(const gchar *oldp, const gchar *newp) {
+       Plugin *plugin = NULL;
+       GSList *cur;
+       for (cur = plugin_get_list(); cur; cur = g_slist_next(cur)) {
+               plugin = (Plugin *)cur->data;
+               if (plugin->master_password_change != NULL) {
+                       plugin->master_password_change(oldp, newp);
+               }
+       }
+}
+
 /* Generally called in plugin_init() function of each plugin. It check the
  * minimal and compiled version of claws binary required by the plugin.
  * If (@minimum_claws_version == 0 || @compiled_claws_version == 0), don't
 /* Generally called in plugin_init() function of each plugin. It check the
  * minimal and compiled version of claws binary required by the plugin.
  * If (@minimum_claws_version == 0 || @compiled_claws_version == 0), don't
index cc727462090f8cfb5e85a221dd2808f9267c127c..446df5e4be6496aaed53c370c01dde60a9d23da1 100644 (file)
@@ -59,6 +59,8 @@ void plugin_unload_all                (const gchar     *type);
 void plugin_save_list          (void);
 void plugin_load_standard_plugins (void);
 
 void plugin_save_list          (void);
 void plugin_load_standard_plugins (void);
 
+void plugins_master_password_change(const gchar *oldp, const gchar *newp);
+
 GSList *plugin_get_list                (void);
 GSList *plugin_get_unloaded_list(void);
 const gchar *plugin_get_name   (Plugin          *plugin);
 GSList *plugin_get_list                (void);
 GSList *plugin_get_unloaded_list(void);
 const gchar *plugin_get_name   (Plugin          *plugin);
index dba5ef20bc3c68da5aa08e7d1e02b64e48fcfd5a..4f9ee16e38646d9aa7bc690bd04b97a5fc5da1fd 100644 (file)
@@ -36,6 +36,7 @@
 #endif
 
 #include "common/passcrypt.h"
 #endif
 
 #include "common/passcrypt.h"
+#include "common/plugin.h"
 #include "common/utils.h"
 #include "account.h"
 #include "alertpanel.h"
 #include "common/utils.h"
 #include "account.h"
 #include "alertpanel.h"
@@ -210,6 +211,11 @@ void master_password_change(const gchar *newp)
                }
        }
 
                }
        }
 
+       /* Now reencrypt all plugins passwords fields 
+        * FIXME: Unloaded plugins won't be able to update their stored passwords
+        */
+       plugins_master_password_change(oldp, newp);
+
        master_password_forget();
 }
 #endif
        master_password_forget();
 }
 #endif
index 1e0614357665083029493ce9b55a97e7242ef133..a24349e9aebdf30665d0a88ac3e630209ef086f6 100644 (file)
@@ -151,3 +151,16 @@ void cm_gdata_prefs_done(void)
     prefs_gtk_unregister_page((PrefsPage*) &gdata_page);
   }
 }
     prefs_gtk_unregister_page((PrefsPage*) &gdata_page);
   }
 }
+
+void cm_gdata_master_password_change(const gchar *oldp, const gchar *newp) {
+       gchar *pass;
+       int i;
+
+       pass = password_decrypt(cm_gdata_config.oauth2_refresh_token, oldp);
+       if (pass != NULL) {
+               g_free(cm_gdata_config.oauth2_refresh_token);
+               cm_gdata_config.oauth2_refresh_token = password_encrypt(pass, newp);
+               memset(pass, 0, strlen(pass));
+       }
+       g_free(pass);
+}
index adb767617bc4430fa4f2eb8b0e5571cbac29e8c4..396d83f424075e86fee3fc478bf3d8cadb8832f4 100644 (file)
@@ -33,5 +33,6 @@ extern PrefParam    cm_gdata_param[];
 
 void cm_gdata_prefs_init(void);
 void cm_gdata_prefs_done(void);
 
 void cm_gdata_prefs_init(void);
 void cm_gdata_prefs_done(void);
+void cm_gdata_master_password_change(const gchar *oldp, const gchar *newp);
 
 #endif /* CM_GDATA_PREFS_H_ */
 
 #endif /* CM_GDATA_PREFS_H_ */
index 3f0b4c3f5dbeb4f3444e0cbbda44844f6071e25a..b383770ecfff3a321cfeb5059d8bd2c96c83dcdd 100644 (file)
@@ -181,6 +181,11 @@ const gchar *plugin_version(void)
   return VERSION;
 }
 
   return VERSION;
 }
 
+void plugin_master_password_change (const gchar *oldp, const gchar *newp)
+{
+       cm_gdata_prefs_master_password_change(oldp, newp);
+}
+
 struct PluginFeature *plugin_provides(void)
 {
   static struct PluginFeature features[] =
 struct PluginFeature *plugin_provides(void)
 {
   static struct PluginFeature features[] =
index 8916a5d7c3b8ef989dcd1513fc5dd7405b7a57e1..47b05d7571eb8a2ff88f953e59f503bf642db92d 100644 (file)
@@ -7,4 +7,4 @@ EXPORTS
         plugin_type
        plugin_provides
         plugin_version
         plugin_type
        plugin_provides
         plugin_version
-
+       plugin_master_password_change
index 701ffb0c3d9113bf32ead83a3955c6b4edf34063..0d2e22c781444c99866781d6a1897c733e7b4ed2 100644 (file)
@@ -407,6 +407,11 @@ const gchar *plugin_version(void)
        return VERSION;
 }
 
        return VERSION;
 }
 
+void plugin_master_password_change (const gchar *oldp, const gchar *newp)
+{
+       spamreport_master_password_change(oldp, newp);
+}
+
 struct PluginFeature *plugin_provides(void)
 {
        static struct PluginFeature features[] = 
 struct PluginFeature *plugin_provides(void)
 {
        static struct PluginFeature features[] = 
index 7d0e88d1a5385622149187978f808d1c66370a22..ec7ae8b56788c3c86dc66bd7f4981323c30e7d7e 100644 (file)
@@ -232,3 +232,18 @@ static void save_spamreport_prefs(PrefsPage *page)
        } else
                prefs_file_close(pref_file);
 }
        } else
                prefs_file_close(pref_file);
 }
+
+void spamreport_master_password_change(const gchar *oldp, const gchar *newp) {
+       gchar *pass;
+       int i;
+
+       for (i = 0; i < INTF_LAST; i++) {
+               pass = password_decrypt(spamreport_prefs.pass[i], oldp);
+               if (pass != NULL) {
+                       g_free(spamreport_prefs.pass[i]);
+                       spamreport_prefs.pass[i] = password_encrypt(pass, newp);
+                       memset(pass, 0, strlen(pass));
+               }
+               g_free(pass);
+       }
+}
index 08027f498d8af4c4f7ad337b306d9749229d07dc..2667a3cd61382fb2631639bb7de2cf2dfc198485 100644 (file)
@@ -65,5 +65,6 @@ extern SpamReportPrefs spamreport_prefs;
 
 void spamreport_prefs_init(void);
 void spamreport_prefs_done(void);
 
 void spamreport_prefs_init(void);
 void spamreport_prefs_done(void);
+void spamreport_master_password_change(const gchar *oldp, const gchar *newp);
 
 #endif
 
 #endif
index 575181d847f021faf375f0d078d31402a2dacefd..8c1e4e5d59e8ff2c882fbf1b8447c8cc0179f8b1 100644 (file)
@@ -99,6 +99,11 @@ const gchar *plugin_version(void)
        return VERSION;
 }
 
        return VERSION;
 }
 
+void plugin_master_password_change (const gchar *oldp, const gchar *newp)
+{
+       vcal_prefs_master_password_change(oldp, newp);
+}
+
 struct PluginFeature *plugin_provides(void)
 {
        static struct PluginFeature features[] = 
 struct PluginFeature *plugin_provides(void)
 {
        static struct PluginFeature features[] = 
index 8916a5d7c3b8ef989dcd1513fc5dd7405b7a57e1..17417b251d359f7d1dd2a4ae1e0d470ce99df376 100644 (file)
@@ -7,4 +7,5 @@ EXPORTS
         plugin_type
        plugin_provides
         plugin_version
         plugin_type
        plugin_provides
         plugin_version
+       plugin_master_password_change
 
 
index a039d3f08b867fd59df81356365701a5f9c8aeb2..680e807e26b30ad0ddb86e33e04771bc71c81a0f 100644 (file)
@@ -723,6 +723,24 @@ static void vcal_prefs_save_func(PrefsPage * _page)
        vcal_folder_export(NULL);
 }
 
        vcal_folder_export(NULL);
 }
 
+void vcal_prefs_master_password_change(const gchar *oldp, const gchar *newp) {
+       gchar *pass;
+       pass = password_decrypt(vcalprefs.export_pass, oldp);
+       if (pass != NULL) {
+               g_free(vcalprefs.export_pass);
+               vcalprefs.export_pass = password_encrypt(pass, newp);
+               memset(pass, 0, strlen(pass));
+       }
+       g_free(pass);
+       pass = password_decrypt(vcalprefs.export_freebusy_pass, oldp);
+       if (pass != NULL) {
+               g_free(vcalprefs.export_freebusy_pass);
+               vcalprefs.export_freebusy_pass = password_encrypt(pass, newp);
+               memset(pass, 0, strlen(pass));
+       }
+       g_free(pass);
+}
+
 void vcal_prefs_init(void)
 {
        static gchar *path[3];
 void vcal_prefs_init(void)
 {
        static gchar *path[3];
index 11475fa046474df06935cf0dec7b7b04428906a0..9fcb96d283e71a765b0d21cf8d023a5ae418dea3 100644 (file)
@@ -51,4 +51,6 @@ extern VcalendarPrefs vcalprefs;
 void vcal_prefs_init   (void);
 void vcal_prefs_done   (void);
 void vcal_prefs_save   (void);
 void vcal_prefs_init   (void);
 void vcal_prefs_done   (void);
 void vcal_prefs_save   (void);
+void vcal_prefs_master_password_change(const gchar *oldp, const gchar *newp);
+
 #endif
 #endif