[Commits] [SCM] claws branch, master, updated. 3.13.2-62-g1b12986
ticho at claws-mail.org
ticho at claws-mail.org
Tue Mar 1 19:44:49 CET 2016
The branch, master has been updated
via 1b1298656654a49f69f538e89021fc77749c8e9b (commit)
from d349134c99f4cdfce9efd3558c48d03c53c19393 (commit)
Summary of changes:
src/password.c | 14 ++++++------
src/password.h | 14 +++++++++++-
src/password_gtk.c | 61 ++++++++++++++++++++++++++++++++++++++++++----------
src/prefs_other.c | 2 +-
4 files changed, 71 insertions(+), 20 deletions(-)
- Log -----------------------------------------------------------------
commit 1b1298656654a49f69f538e89021fc77749c8e9b
Author: Andrej Kacian <ticho at claws-mail.org>
Date: Tue Mar 1 19:44:25 2016 +0100
Upon master password change, ask for old password immediately.
diff --git a/src/password.c b/src/password.c
index 7e37e28..6119db2 100644
--- a/src/password.c
+++ b/src/password.c
@@ -137,18 +137,18 @@ void master_password_forget()
_master_password = NULL;
}
-void master_password_change(const gchar *newp)
+void master_password_change(const gchar *oldp, const gchar *newp)
{
gchar *pwd, *newpwd;
- const gchar *oldp;
GList *cur;
PrefsAccount *acc;
- /* Make sure the user has to enter the master password before
- * being able to change it. */
- master_password_forget();
-
- oldp = master_password();
+ if (oldp == NULL) {
+ /* If oldp is NULL, make sure the user has to enter the
+ * current master password before being able to change it. */
+ master_password_forget();
+ oldp = master_password();
+ }
g_return_if_fail(oldp != NULL);
/* Update master password hash in prefs */
diff --git a/src/password.h b/src/password.h
index 4123f5a..8423f4e 100644
--- a/src/password.h
+++ b/src/password.h
@@ -27,11 +27,23 @@
#include <glib.h>
#ifndef PASSWORD_CRYPTO_OLD
+/* Returns TRUE if there is a master password set in preferences. */
const gboolean master_password_is_set();
+/* Returns TRUE if input contains correct master password, as set
+ * in preferences. */
const gboolean master_password_is_correct(const gchar *input);
+/* Returns TRUE if master password is entered (unlocked). */
gboolean master_password_is_entered();
+/* Removes (locks) master password, if it was entered previously
+ * in current session. */
void master_password_forget();
-void master_password_change(const gchar *newp);
+
+/* Changes master password. Also triggers reencryption of all stored
+ * password using the new master password.
+ * oldp - old master password; if NULL, it will be retrieved using
+ * master_password()
+ * newp - new master password */
+void master_password_change(const gchar *oldp, const gchar *newp);
#endif
/* Wrapper around the old, DES-CBC-broken implementation which
diff --git a/src/password_gtk.c b/src/password_gtk.c
index 41bb7f5..77ec142 100644
--- a/src/password_gtk.c
+++ b/src/password_gtk.c
@@ -36,7 +36,7 @@
#include "password.h"
#include "prefs_common.h"
-static void entry_new1_activated(GtkEntry *entry, gpointer user_data)
+static void entry_activated(GtkEntry *entry, gpointer user_data)
{
const gchar *text = gtk_entry_get_text(entry);
@@ -47,6 +47,7 @@ static void entry_new1_activated(GtkEntry *entry, gpointer user_data)
struct _ctx {
gboolean done;
GtkWidget *dialog;
+ GtkWidget *entry_old;
GtkWidget *entry_new1;
GtkWidget *entry_new2;
};
@@ -54,6 +55,7 @@ struct _ctx {
static void ok_button_clicked(GtkButton *button, gpointer user_data)
{
struct _ctx *ctx = (struct _ctx *)user_data;
+ const gchar *old = NULL;
const gchar *new1 = gtk_entry_get_text(GTK_ENTRY(ctx->entry_new1));
const gchar *new2 = gtk_entry_get_text(GTK_ENTRY(ctx->entry_new2));
@@ -69,7 +71,19 @@ static void ok_button_clicked(GtkButton *button, gpointer user_data)
return;
}
- master_password_change(new1);
+ /* If there is an existing master password, check for its correctness
+ * in entry_old. */
+ if (master_password_is_set()
+ && ((old = gtk_entry_get_text(GTK_ENTRY(ctx->entry_old))) == NULL
+ || strlen(old) == 0 || !master_password_is_correct(old))) {
+ debug_print("old password incorrect\n");
+ alertpanel_warning(_("Incorrect old master password entered, try again."));
+ gtk_entry_set_text(GTK_ENTRY(ctx->entry_old), "");
+ gtk_widget_grab_focus(ctx->entry_old);
+ return;
+ }
+
+ master_password_change(old, new1);
ctx->done = TRUE;
gtk_widget_destroy(ctx->dialog);
@@ -98,7 +112,7 @@ void master_password_change_dialog()
GtkWidget *vbox, *hbox;
GtkWidget *icon, *table, *label;
GtkWidget *msg_title;
- GtkWidget *entry_new1, *entry_new2;
+ GtkWidget *entry_old, *entry_new1, *entry_new2;
GtkWidget *confirm_area;
GtkWidget *ok_button, *cancel_button;
struct _ctx *ctx;
@@ -149,37 +163,55 @@ void master_password_change_dialog()
label = gtk_label_new(
_("If a master password is currently active the\n"
- "current password is required to change password.\n"
- "After pressing the 'Ok' button you will be prompted.")
+ "current password is required to change password.")
);
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
- table = gtk_table_new(2, 2, FALSE);
+ table = gtk_table_new(4, 2, FALSE);
- label = gtk_label_new(_("New password:"));
+ /* Old password */
+ label = gtk_label_new(_("Old password:"));
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
GTK_EXPAND | GTK_FILL, 0, 0, 0);
+ entry_old = gtk_entry_new();
+ gtk_entry_set_visibility(GTK_ENTRY(entry_old), FALSE);
+ gtk_table_attach(GTK_TABLE(table), entry_old, 1, 2, 0, 1,
+ GTK_FILL | GTK_EXPAND, 0, 0, 0);
+
+ /* Separator */
+ gtk_table_attach(GTK_TABLE(table),
+ gtk_hseparator_new(), 0, 2, 1, 2,
+ GTK_FILL | GTK_EXPAND, 0, 0, 5);
+
+ /* New password */
+ label = gtk_label_new(_("New password:"));
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+ gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3,
+ GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
entry_new1 = gtk_entry_new();
gtk_entry_set_visibility(GTK_ENTRY(entry_new1), FALSE);
- gtk_table_attach(GTK_TABLE(table), entry_new1, 1, 2, 0, 1,
+ gtk_table_attach(GTK_TABLE(table), entry_new1, 1, 2, 2, 3,
GTK_FILL | GTK_EXPAND, 0, 0, 0);
+ /* New password again */
label = gtk_label_new(_("Confirm password:"));
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
- gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
+ gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4,
GTK_EXPAND | GTK_FILL, 0, 0, 0);
entry_new2 = gtk_entry_new();
gtk_entry_set_visibility(GTK_ENTRY(entry_new2), FALSE);
- gtk_table_attach(GTK_TABLE(table), entry_new2, 1, 2, 1, 2,
+ gtk_table_attach(GTK_TABLE(table), entry_new2, 1, 2, 3, 4,
GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
+ /* Dialog buttons */
gtkut_stock_button_set_create(&confirm_area,
&cancel_button, GTK_STOCK_CANCEL,
&ok_button, GTK_STOCK_OK,
@@ -191,13 +223,20 @@ void master_password_change_dialog()
gtk_widget_grab_default(ok_button);
+ /* If no master password is set, disable the "old password" entry */
+ if (!master_password_is_set())
+ gtk_widget_set_sensitive(entry_old, FALSE);
+
+ g_signal_connect(G_OBJECT(entry_old), "activate",
+ G_CALLBACK(entry_activated), entry_new1);
g_signal_connect(G_OBJECT(entry_new1), "activate",
- G_CALLBACK(entry_new1_activated), entry_new2);
+ G_CALLBACK(entry_activated), entry_new2);
gtk_entry_set_activates_default(GTK_ENTRY(entry_new2), TRUE);
ctx = g_new(struct _ctx, 1);
ctx->done = FALSE;
ctx->dialog = dialog;
+ ctx->entry_old = entry_old;
ctx->entry_new1 = entry_new1;
ctx->entry_new2 = entry_new2;
diff --git a/src/prefs_other.c b/src/prefs_other.c
index 405a374..2b7a93f 100644
--- a/src/prefs_other.c
+++ b/src/prefs_other.c
@@ -715,7 +715,7 @@ static void prefs_other_save(PrefsPage *_page)
if (!gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(page->checkbtn_use_password))
&& master_password_is_set()) {
- master_password_change(NULL);
+ master_password_change(NULL, NULL);
/* In case user did not finish the password change process
* (e.g. did not enter a correct current master password),
-----------------------------------------------------------------------
hooks/post-receive
--
Claws Mail
More information about the Commits
mailing list