user-accounts: Convert UmPasswordDialog to GtkTemplate

This commit is contained in:
Robert Ancell 2018-11-06 15:42:06 +13:00
parent ae90438bc8
commit ad44ad4367
7 changed files with 222 additions and 302 deletions

View file

@ -99,7 +99,6 @@ struct _CcUserPanel {
GPermission *permission; GPermission *permission;
CcLanguageChooser *language_chooser; CcLanguageChooser *language_chooser;
UmPasswordDialog *password_dialog;
UmPhotoDialog *photo_dialog; UmPhotoDialog *photo_dialog;
UmHistoryDialog *history_dialog; UmHistoryDialog *history_dialog;
@ -1044,12 +1043,17 @@ static void
change_password (CcUserPanel *self) change_password (CcUserPanel *self)
{ {
ActUser *user; ActUser *user;
UmPasswordDialog *dialog;
GtkWindow *parent;
user = get_selected_user (self); user = get_selected_user (self);
dialog = um_password_dialog_new (user);
um_password_dialog_set_user (self->password_dialog, user); parent = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)));
um_password_dialog_show (self->password_dialog, gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (GTK_WIDGET (dialog));
} }
static void static void
@ -1372,7 +1376,6 @@ cc_user_panel_init (CcUserPanel *self)
self->login_screen_settings = settings_or_null ("org.gnome.login-screen"); self->login_screen_settings = settings_or_null ("org.gnome.login-screen");
self->password_dialog = um_password_dialog_new ();
self->photo_dialog = um_photo_dialog_new (GTK_WIDGET (self->user_icon_button)); self->photo_dialog = um_photo_dialog_new (GTK_WIDGET (self->user_icon_button));
self->history_dialog = um_history_dialog_new (); self->history_dialog = um_history_dialog_new ();
setup_main_window (self); setup_main_window (self);
@ -1388,7 +1391,6 @@ cc_user_panel_dispose (GObject *object)
g_clear_object (&self->login_screen_settings); g_clear_object (&self->login_screen_settings);
g_clear_pointer (&self->password_dialog, um_password_dialog_free);
g_clear_pointer (&self->history_dialog, um_history_dialog_free); g_clear_pointer (&self->history_dialog, um_history_dialog_free);
if (self->account_dialog) { if (self->account_dialog) {
gtk_dialog_response (GTK_DIALOG (self->account_dialog), GTK_RESPONSE_DELETE_EVENT); gtk_dialog_response (GTK_DIALOG (self->account_dialog), GTK_RESPONSE_DELETE_EVENT);

View file

@ -120,8 +120,8 @@ resource_data = files(
'data/carousel.ui', 'data/carousel.ui',
'data/history-dialog.ui', 'data/history-dialog.ui',
'data/join-dialog.ui', 'data/join-dialog.ui',
'data/password-dialog.ui',
'data/user-accounts-dialog.css', 'data/user-accounts-dialog.css',
'um-password-dialog.ui',
) )
common_sources += gnome.compile_resources( common_sources += gnome.compile_resources(

View file

@ -31,36 +31,42 @@
#include <act/act.h> #include <act/act.h>
#include "um-password-dialog.h" #include "um-password-dialog.h"
#include "um-resources.h"
#include "um-utils.h" #include "um-utils.h"
#include "run-passwd.h" #include "run-passwd.h"
#include "pw-utils.h" #include "pw-utils.h"
#define PASSWORD_CHECK_TIMEOUT 600 #define PASSWORD_CHECK_TIMEOUT 600
struct _UmPasswordDialog { struct _UmPasswordDialog
GtkWidget *dialog; {
GtkWidget *action_radio_box; GtkDialog parent_instance;
GtkWidget *action_now_radio;
GtkWidget *action_login_radio; GtkBox *action_radio_box;
GtkWidget *password_entry; GtkRadioButton *action_now_radio;
GtkWidget *verify_entry; GtkRadioButton *action_login_radio;
GtkButton *ok_button;
GtkLabel *old_password_label;
GtkEntry *old_password_entry;
GtkEntry *password_entry;
GtkLabel *password_hint_label;
GtkLevelBar *strength_indicator;
GtkEntry *verify_entry;
GtkLabel *verify_hint_label;
gint password_entry_timeout_id; gint password_entry_timeout_id;
GtkWidget *strength_indicator;
GtkWidget *ok_button;
GtkWidget *password_hint;
GtkWidget *verify_hint;
ActUser *user; ActUser *user;
ActUserPasswordMode password_mode; ActUserPasswordMode password_mode;
GtkWidget *old_password_label;
GtkWidget *old_password_entry;
gboolean old_password_ok; gboolean old_password_ok;
gint old_password_entry_timeout_id; gint old_password_entry_timeout_id;
PasswdHandler *passwd_handler; PasswdHandler *passwd_handler;
}; };
G_DEFINE_TYPE (UmPasswordDialog, um_password_dialog, GTK_TYPE_DIALOG)
static gint static gint
update_password_strength (UmPasswordDialog *um) update_password_strength (UmPasswordDialog *um)
{ {
@ -71,63 +77,32 @@ update_password_strength (UmPasswordDialog *um)
const gchar *hint; const gchar *hint;
const gchar *verify; const gchar *verify;
if (um->user == NULL) { password = gtk_entry_get_text (um->password_entry);
return 0; old_password = gtk_entry_get_text (um->old_password_entry);
}
password = gtk_entry_get_text (GTK_ENTRY (um->password_entry));
old_password = gtk_entry_get_text (GTK_ENTRY (um->old_password_entry));
username = act_user_get_user_name (um->user); username = act_user_get_user_name (um->user);
pw_strength (password, old_password, username, pw_strength (password, old_password, username,
&hint, &strength_level); &hint, &strength_level);
gtk_level_bar_set_value (GTK_LEVEL_BAR (um->strength_indicator), strength_level); gtk_level_bar_set_value (um->strength_indicator, strength_level);
gtk_label_set_label (GTK_LABEL (um->password_hint), hint); gtk_label_set_label (um->password_hint_label, hint);
if (strength_level > 1) { if (strength_level > 1) {
set_entry_validation_checkmark (GTK_ENTRY (um->password_entry)); set_entry_validation_checkmark (um->password_entry);
} else if (strlen (password) == 0) { } else if (strlen (password) == 0) {
set_entry_generation_icon (GTK_ENTRY (um->password_entry)); set_entry_generation_icon (um->password_entry);
} else { } else {
clear_entry_validation_error (GTK_ENTRY (um->password_entry)); clear_entry_validation_error (um->password_entry);
} }
verify = gtk_entry_get_text (GTK_ENTRY (um->verify_entry)); verify = gtk_entry_get_text (um->verify_entry);
if (strlen (verify) == 0) { if (strlen (verify) == 0) {
gtk_widget_set_sensitive (um->verify_entry, strength_level > 1); gtk_widget_set_sensitive (GTK_WIDGET (um->verify_entry), strength_level > 1);
} }
return strength_level; return strength_level;
} }
static void
finish_password_change (UmPasswordDialog *um)
{
gtk_widget_hide (um->dialog);
gtk_entry_set_text (GTK_ENTRY (um->password_entry), " ");
gtk_entry_set_text (GTK_ENTRY (um->verify_entry), "");
gtk_entry_set_text (GTK_ENTRY (um->old_password_entry), "");
um_password_dialog_set_user (um, NULL);
}
static void
cancel_password_dialog (GtkButton *button,
UmPasswordDialog *um)
{
finish_password_change (um);
}
static void
dialog_closed (GtkWidget *dialog,
gint response_id,
UmPasswordDialog *um)
{
gtk_widget_destroy (dialog);
}
static void static void
password_changed_cb (PasswdHandler *handler, password_changed_cb (PasswdHandler *handler,
GError *error, GError *error,
@ -137,11 +112,11 @@ password_changed_cb (PasswdHandler *handler,
const gchar *primary_text; const gchar *primary_text;
const gchar *secondary_text; const gchar *secondary_text;
gtk_widget_set_sensitive (um->dialog, TRUE); gtk_widget_set_sensitive (GTK_WIDGET (um), TRUE);
gdk_window_set_cursor (gtk_widget_get_window (um->dialog), NULL); gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (um)), NULL);
if (!error) { if (!error) {
finish_password_change (um); gtk_dialog_response (GTK_DIALOG (um), GTK_RESPONSE_ACCEPT);
return; return;
} }
@ -149,43 +124,40 @@ password_changed_cb (PasswdHandler *handler,
primary_text = error->message; primary_text = error->message;
secondary_text = _("Please choose another password."); secondary_text = _("Please choose another password.");
gtk_entry_set_text (GTK_ENTRY (um->password_entry), ""); gtk_entry_set_text (um->password_entry, "");
gtk_widget_grab_focus (um->password_entry); gtk_widget_grab_focus (GTK_WIDGET (um->password_entry));
gtk_entry_set_text (GTK_ENTRY (um->verify_entry), ""); gtk_entry_set_text (um->verify_entry, "");
} }
else if (error->code == PASSWD_ERROR_AUTH_FAILED) { else if (error->code == PASSWD_ERROR_AUTH_FAILED) {
primary_text = error->message; primary_text = error->message;
secondary_text = _("Please type your current password again."); secondary_text = _("Please type your current password again.");
gtk_entry_set_text (GTK_ENTRY (um->old_password_entry), ""); gtk_entry_set_text (um->old_password_entry, "");
gtk_widget_grab_focus (um->old_password_entry); gtk_widget_grab_focus (GTK_WIDGET (um->old_password_entry));
} }
else { else {
primary_text = _("Password could not be changed"); primary_text = _("Password could not be changed");
secondary_text = error->message; secondary_text = error->message;
} }
dialog = gtk_message_dialog_new (GTK_WINDOW (um->dialog), dialog = gtk_message_dialog_new (GTK_WINDOW (um),
GTK_DIALOG_MODAL, GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR, GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE, GTK_BUTTONS_CLOSE,
"%s", primary_text); "%s", primary_text);
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
"%s", secondary_text); "%s", secondary_text);
g_signal_connect (dialog, "response", gtk_dialog_run (GTK_DIALOG (dialog));
G_CALLBACK (dialog_closed), um); gtk_widget_destroy (dialog);
gtk_window_present (GTK_WINDOW (dialog));
} }
static void static void
accept_password_dialog (GtkButton *button, ok_button_clicked_cb (UmPasswordDialog *um)
UmPasswordDialog *um)
{ {
const gchar *password; const gchar *password;
password = gtk_entry_get_text (GTK_ENTRY (um->password_entry)); password = gtk_entry_get_text (um->password_entry);
switch (um->password_mode) { switch (um->password_mode) {
case ACT_USER_PASSWORD_MODE_REGULAR: case ACT_USER_PASSWORD_MODE_REGULAR:
@ -199,10 +171,10 @@ accept_password_dialog (GtkButton *button,
*/ */
passwd_change_password (um->passwd_handler, password, passwd_change_password (um->passwd_handler, password,
(PasswdCallback) password_changed_cb, um); (PasswdCallback) password_changed_cb, um);
gtk_widget_set_sensitive (um->dialog, FALSE); gtk_widget_set_sensitive (GTK_WIDGET (um), FALSE);
display = gtk_widget_get_display (um->dialog); display = gtk_widget_get_display (GTK_WIDGET (um));
cursor = gdk_cursor_new_for_display (display, GDK_WATCH); cursor = gdk_cursor_new_for_display (display, GDK_WATCH);
gdk_window_set_cursor (gtk_widget_get_window (um->dialog), cursor); gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (um)), cursor);
gdk_display_flush (display); gdk_display_flush (display);
g_object_unref (cursor); g_object_unref (cursor);
return; return;
@ -221,7 +193,7 @@ accept_password_dialog (GtkButton *button,
g_assert_not_reached (); g_assert_not_reached ();
} }
finish_password_change (um); gtk_dialog_response (GTK_DIALOG (um), GTK_RESPONSE_ACCEPT);
} }
static void static void
@ -231,19 +203,19 @@ update_sensitivity (UmPasswordDialog *um)
gboolean can_change; gboolean can_change;
int strength; int strength;
password = gtk_entry_get_text (GTK_ENTRY (um->password_entry)); password = gtk_entry_get_text (um->password_entry);
verify = gtk_entry_get_text (GTK_ENTRY (um->verify_entry)); verify = gtk_entry_get_text (um->verify_entry);
if (um->password_mode == ACT_USER_PASSWORD_MODE_REGULAR) { if (um->password_mode == ACT_USER_PASSWORD_MODE_REGULAR) {
strength = update_password_strength (um); strength = update_password_strength (um);
can_change = strength > 1 && strcmp (password, verify) == 0 && can_change = strength > 1 && strcmp (password, verify) == 0 &&
(um->old_password_ok || !gtk_widget_get_visible (um->old_password_entry)); (um->old_password_ok || !gtk_widget_get_visible (GTK_WIDGET (um->old_password_entry)));
} }
else { else {
can_change = TRUE; can_change = TRUE;
} }
gtk_widget_set_sensitive (um->ok_button, can_change); gtk_widget_set_sensitive (GTK_WIDGET (um->ok_button), can_change);
} }
static void static void
@ -253,10 +225,10 @@ mode_change (UmPasswordDialog *um,
gboolean active; gboolean active;
active = (mode == ACT_USER_PASSWORD_MODE_REGULAR); active = (mode == ACT_USER_PASSWORD_MODE_REGULAR);
gtk_widget_set_sensitive (um->password_entry, active); gtk_widget_set_sensitive (GTK_WIDGET (um->password_entry), active);
gtk_widget_set_sensitive (um->verify_entry, active); gtk_widget_set_sensitive (GTK_WIDGET (um->verify_entry), active);
gtk_widget_set_sensitive (um->old_password_entry, active); gtk_widget_set_sensitive (GTK_WIDGET (um->old_password_entry), active);
gtk_widget_set_sensitive (um->password_hint, active); gtk_widget_set_sensitive (GTK_WIDGET (um->password_hint_label), active);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (um->action_now_radio), active); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (um->action_now_radio), active);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (um->action_login_radio), !active); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (um->action_login_radio), !active);
@ -265,13 +237,12 @@ mode_change (UmPasswordDialog *um,
} }
static void static void
action_changed (GtkRadioButton *radio, action_now_radio_toggled_cb (UmPasswordDialog *um)
UmPasswordDialog *um)
{ {
gint active; gint active;
ActUserPasswordMode mode; ActUserPasswordMode mode;
active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)); active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (um->action_now_radio));
mode = active ? ACT_USER_PASSWORD_MODE_REGULAR : ACT_USER_PASSWORD_MODE_SET_AT_LOGIN; mode = active ? ACT_USER_PASSWORD_MODE_REGULAR : ACT_USER_PASSWORD_MODE_SET_AT_LOGIN;
mode_change (um, mode); mode_change (um, mode);
} }
@ -283,18 +254,18 @@ update_password_match (UmPasswordDialog *um)
const char *verify; const char *verify;
const char *message = ""; const char *message = "";
password = gtk_entry_get_text (GTK_ENTRY (um->password_entry)); password = gtk_entry_get_text (um->password_entry);
verify = gtk_entry_get_text (GTK_ENTRY (um->verify_entry)); verify = gtk_entry_get_text (um->verify_entry);
if (strlen (verify) > 0) { if (strlen (verify) > 0) {
if (strcmp (password, verify) != 0) { if (strcmp (password, verify) != 0) {
message = _("The passwords do not match."); message = _("The passwords do not match.");
} }
else { else {
set_entry_validation_checkmark (GTK_ENTRY (um->verify_entry)); set_entry_validation_checkmark (um->verify_entry);
} }
} }
gtk_label_set_label (GTK_LABEL (um->verify_hint), message); gtk_label_set_label (um->verify_hint_label, message);
} }
static gboolean static gboolean
@ -310,9 +281,9 @@ password_entry_timeout (UmPasswordDialog *um)
} }
static void static void
password_entry_changed (GtkEntry *entry, password_entry_changed (UmPasswordDialog *um,
GParamSpec *pspec, GParamSpec *pspec,
UmPasswordDialog *um) GtkEntry *entry)
{ {
const char *password; const char *password;
@ -321,13 +292,13 @@ password_entry_changed (GtkEntry *entry,
um->password_entry_timeout_id = 0; um->password_entry_timeout_id = 0;
} }
clear_entry_validation_error (GTK_ENTRY (entry)); clear_entry_validation_error (entry);
clear_entry_validation_error (GTK_ENTRY (um->verify_entry)); clear_entry_validation_error (um->verify_entry);
gtk_widget_set_sensitive (um->ok_button, FALSE); gtk_widget_set_sensitive (GTK_WIDGET (um->ok_button), FALSE);
password = gtk_entry_get_text (GTK_ENTRY (um->password_entry)); password = gtk_entry_get_text (um->password_entry);
if (strlen (password) == 0) { if (strlen (password) == 0) {
gtk_entry_set_visibility (GTK_ENTRY (um->password_entry), FALSE); gtk_entry_set_visibility (um->password_entry, FALSE);
} }
um->password_entry_timeout_id = g_timeout_add (PASSWORD_CHECK_TIMEOUT, um->password_entry_timeout_id = g_timeout_add (PASSWORD_CHECK_TIMEOUT,
@ -336,9 +307,7 @@ password_entry_changed (GtkEntry *entry,
} }
static gboolean static gboolean
password_entry_focus_out (GtkWidget *entry, password_entry_focus_out_cb (UmPasswordDialog *um)
GdkEventFocus *event,
UmPasswordDialog *um)
{ {
if (um->password_entry_timeout_id != 0) { if (um->password_entry_timeout_id != 0) {
g_source_remove (um->password_entry_timeout_id); g_source_remove (um->password_entry_timeout_id);
@ -351,9 +320,8 @@ password_entry_focus_out (GtkWidget *entry,
} }
static gboolean static gboolean
password_key_press (GtkEntry *entry, password_entry_key_press_cb (UmPasswordDialog *um,
GdkEvent *event, GdkEvent *event)
UmPasswordDialog *um)
{ {
GdkEventKey *key = (GdkEventKey *)event; GdkEventKey *key = (GdkEventKey *)event;
@ -373,7 +341,7 @@ auth_cb (PasswdHandler *handler,
} }
else { else {
um->old_password_ok = TRUE; um->old_password_ok = TRUE;
set_entry_validation_checkmark (GTK_ENTRY (um->old_password_entry)); set_entry_validation_checkmark (um->old_password_entry);
} }
update_sensitivity (um); update_sensitivity (um);
@ -386,7 +354,7 @@ old_password_entry_timeout (UmPasswordDialog *um)
update_sensitivity (um); update_sensitivity (um);
text = gtk_entry_get_text (GTK_ENTRY (um->old_password_entry)); text = gtk_entry_get_text (um->old_password_entry);
if (!um->old_password_ok) { if (!um->old_password_ok) {
passwd_authenticate (um->passwd_handler, text, (PasswdCallback)auth_cb, um); passwd_authenticate (um->passwd_handler, text, (PasswdCallback)auth_cb, um);
} }
@ -397,9 +365,7 @@ old_password_entry_timeout (UmPasswordDialog *um)
} }
static gboolean static gboolean
old_password_entry_focus_out (GtkWidget *entry, old_password_entry_focus_out_cb (UmPasswordDialog *um)
GdkEventFocus *event,
UmPasswordDialog *um)
{ {
if (um->old_password_entry_timeout_id != 0) { if (um->old_password_entry_timeout_id != 0) {
g_source_remove (um->old_password_entry_timeout_id); g_source_remove (um->old_password_entry_timeout_id);
@ -412,17 +378,15 @@ old_password_entry_focus_out (GtkWidget *entry,
} }
static void static void
old_password_entry_changed (GtkEntry *entry, old_password_entry_changed (UmPasswordDialog *um)
GParamSpec *pspec,
UmPasswordDialog *um)
{ {
if (um->old_password_entry_timeout_id != 0) { if (um->old_password_entry_timeout_id != 0) {
g_source_remove (um->old_password_entry_timeout_id); g_source_remove (um->old_password_entry_timeout_id);
um->old_password_entry_timeout_id = 0; um->old_password_entry_timeout_id = 0;
} }
clear_entry_validation_error (GTK_ENTRY (entry)); clear_entry_validation_error (um->old_password_entry);
gtk_widget_set_sensitive (um->ok_button, FALSE); gtk_widget_set_sensitive (GTK_WIDGET (um->ok_button), FALSE);
um->old_password_ok = FALSE; um->old_password_ok = FALSE;
um->old_password_entry_timeout_id = g_timeout_add (PASSWORD_CHECK_TIMEOUT, um->old_password_entry_timeout_id = g_timeout_add (PASSWORD_CHECK_TIMEOUT,
@ -431,10 +395,7 @@ old_password_entry_changed (GtkEntry *entry,
} }
static void static void
on_generate (GtkEntry *entry, password_entry_icon_press_cb (UmPasswordDialog *um)
GtkEntryIconPosition pos,
GdkEventButton *event,
UmPasswordDialog *um)
{ {
gchar *pwd; gchar *pwd;
@ -442,107 +403,25 @@ on_generate (GtkEntry *entry,
if (pwd == NULL) if (pwd == NULL)
return; return;
gtk_entry_set_text (GTK_ENTRY (um->password_entry), pwd); gtk_entry_set_text (um->password_entry, pwd);
gtk_entry_set_text (GTK_ENTRY (um->verify_entry), pwd); gtk_entry_set_text (um->verify_entry, pwd);
gtk_entry_set_visibility (GTK_ENTRY (um->password_entry), TRUE); gtk_entry_set_visibility (um->password_entry, TRUE);
gtk_widget_set_sensitive (um->verify_entry, TRUE); gtk_widget_set_sensitive (GTK_WIDGET (um->verify_entry), TRUE);
g_free (pwd); g_free (pwd);
} }
UmPasswordDialog * static void
um_password_dialog_new (void) um_password_dialog_dispose (GObject *object)
{ {
GtkBuilder *builder; UmPasswordDialog *um = UM_PASSWORD_DIALOG (object);
GError *error;
UmPasswordDialog *um;
GtkWidget *widget;
builder = gtk_builder_new ();
error = NULL;
if (!gtk_builder_add_from_resource (builder,
"/org/gnome/control-center/user-accounts/password-dialog.ui",
&error)) {
g_error ("%s", error->message);
g_error_free (error);
return NULL;
}
um = g_new0 (UmPasswordDialog, 1);
um->action_radio_box = (GtkWidget *) gtk_builder_get_object (builder, "action-radio-box");
widget = (GtkWidget *) gtk_builder_get_object (builder, "action-now-radio");
g_signal_connect (widget, "toggled", G_CALLBACK (action_changed), um);
um->action_now_radio = widget;
um->action_login_radio = (GtkWidget *) gtk_builder_get_object (builder, "action-login-radio");
widget = (GtkWidget *) gtk_builder_get_object (builder, "dialog");
g_signal_connect (widget, "delete-event",
G_CALLBACK (gtk_widget_hide_on_delete), NULL);
um->dialog = widget;
widget = (GtkWidget *) gtk_builder_get_object (builder, "cancel-button");
g_signal_connect (widget, "clicked",
G_CALLBACK (cancel_password_dialog), um);
widget = (GtkWidget *) gtk_builder_get_object (builder, "ok-button");
g_signal_connect (widget, "clicked",
G_CALLBACK (accept_password_dialog), um);
gtk_widget_grab_default (widget);
um->ok_button = widget;
widget = (GtkWidget *) gtk_builder_get_object (builder, "password-entry");
g_signal_connect (widget, "notify::text",
G_CALLBACK (password_entry_changed), um);
g_signal_connect_after (widget, "focus-out-event",
G_CALLBACK (password_entry_focus_out), um);
g_signal_connect (widget, "key-press-event",
G_CALLBACK (password_key_press), um);
g_signal_connect_swapped (widget, "activate", G_CALLBACK (password_entry_timeout), um);
gtk_entry_set_visibility (GTK_ENTRY (widget), FALSE);
um->password_entry = widget;
g_signal_connect (widget, "icon-press", G_CALLBACK (on_generate), um);
widget = (GtkWidget *) gtk_builder_get_object (builder, "old-password-entry");
g_signal_connect_after (widget, "focus-out-event",
G_CALLBACK (old_password_entry_focus_out), um);
g_signal_connect (widget, "notify::text",
G_CALLBACK (old_password_entry_changed), um);
g_signal_connect_swapped (widget, "activate", G_CALLBACK (password_entry_timeout), um);
um->old_password_entry = widget;
um->old_password_label = (GtkWidget *) gtk_builder_get_object (builder, "old-password-label");
widget = (GtkWidget *) gtk_builder_get_object (builder, "verify-entry");
g_signal_connect (widget, "notify::text",
G_CALLBACK (password_entry_changed), um);
g_signal_connect_after (widget, "focus-out-event",
G_CALLBACK (password_entry_focus_out), um);
g_signal_connect_swapped (widget, "activate", G_CALLBACK (password_entry_timeout), um);
um->verify_entry = widget;
um->strength_indicator = (GtkWidget *) gtk_builder_get_object (builder, "strength-indicator");
widget = (GtkWidget *)gtk_builder_get_object (builder, "password-hint");
um->password_hint = widget;
widget = (GtkWidget *)gtk_builder_get_object (builder, "verify-hint");
um->verify_hint = widget;
g_object_unref (builder);
return um;
}
void
um_password_dialog_free (UmPasswordDialog *um)
{
gtk_widget_destroy (um->dialog);
g_clear_object (&um->user); g_clear_object (&um->user);
if (um->passwd_handler) if (um->passwd_handler) {
passwd_destroy (um->passwd_handler); passwd_destroy (um->passwd_handler);
um->passwd_handler = NULL;
}
if (um->old_password_entry_timeout_id != 0) { if (um->old_password_entry_timeout_id != 0) {
g_source_remove (um->old_password_entry_timeout_id); g_source_remove (um->old_password_entry_timeout_id);
@ -554,63 +433,91 @@ um_password_dialog_free (UmPasswordDialog *um)
um->password_entry_timeout_id = 0; um->password_entry_timeout_id = 0;
} }
g_free (um); G_OBJECT_CLASS (um_password_dialog_parent_class)->dispose (object);
} }
void static void
um_password_dialog_set_user (UmPasswordDialog *um, um_password_dialog_class_init (UmPasswordDialogClass *klass)
ActUser *user)
{ {
gboolean visible; GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
if (um->user) { object_class->dispose = um_password_dialog_dispose;
g_object_unref (um->user);
um->user = NULL; gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/user-accounts/um-password-dialog.ui");
gtk_widget_class_bind_template_child (widget_class, UmPasswordDialog, action_radio_box);
gtk_widget_class_bind_template_child (widget_class, UmPasswordDialog, action_now_radio);
gtk_widget_class_bind_template_child (widget_class, UmPasswordDialog, action_login_radio);
gtk_widget_class_bind_template_child (widget_class, UmPasswordDialog, ok_button);
gtk_widget_class_bind_template_child (widget_class, UmPasswordDialog, old_password_label);
gtk_widget_class_bind_template_child (widget_class, UmPasswordDialog, old_password_entry);
gtk_widget_class_bind_template_child (widget_class, UmPasswordDialog, password_entry);
gtk_widget_class_bind_template_child (widget_class, UmPasswordDialog, password_hint_label);
gtk_widget_class_bind_template_child (widget_class, UmPasswordDialog, strength_indicator);
gtk_widget_class_bind_template_child (widget_class, UmPasswordDialog, verify_entry);
gtk_widget_class_bind_template_child (widget_class, UmPasswordDialog, verify_hint_label);
gtk_widget_class_bind_template_callback (widget_class, action_now_radio_toggled_cb);
gtk_widget_class_bind_template_callback (widget_class, old_password_entry_changed);
gtk_widget_class_bind_template_callback (widget_class, old_password_entry_focus_out_cb);
gtk_widget_class_bind_template_callback (widget_class, ok_button_clicked_cb);
gtk_widget_class_bind_template_callback (widget_class, password_entry_changed);
gtk_widget_class_bind_template_callback (widget_class, password_entry_focus_out_cb);
gtk_widget_class_bind_template_callback (widget_class, password_entry_icon_press_cb);
gtk_widget_class_bind_template_callback (widget_class, password_entry_key_press_cb);
gtk_widget_class_bind_template_callback (widget_class, password_entry_timeout);
} }
if (user) {
static void
um_password_dialog_init (UmPasswordDialog *um)
{
g_resources_register (um_get_resource ());
gtk_widget_init_template (GTK_WIDGET (um));
}
UmPasswordDialog *
um_password_dialog_new (ActUser *user)
{
UmPasswordDialog *um;
g_return_val_if_fail (ACT_IS_USER (user), NULL);
um = g_object_new (UM_TYPE_PASSWORD_DIALOG,
"use-header-bar", 1,
NULL);
um->user = g_object_ref (user); um->user = g_object_ref (user);
gtk_entry_set_text (GTK_ENTRY (um->password_entry), "");
gtk_entry_set_text (GTK_ENTRY (um->verify_entry), "");
gtk_entry_set_text (GTK_ENTRY (um->old_password_entry), "");
gtk_entry_set_visibility (GTK_ENTRY (um->password_entry), FALSE);
gtk_entry_set_visibility (GTK_ENTRY (um->verify_entry), FALSE);
if (act_user_get_uid (um->user) == getuid ()) { if (act_user_get_uid (um->user) == getuid ()) {
gboolean visible;
mode_change (um, ACT_USER_PASSWORD_MODE_REGULAR); mode_change (um, ACT_USER_PASSWORD_MODE_REGULAR);
gtk_widget_hide (um->action_radio_box); gtk_widget_hide (GTK_WIDGET (um->action_radio_box));
visible = (act_user_get_password_mode (user) != ACT_USER_PASSWORD_MODE_NONE); visible = (act_user_get_password_mode (user) != ACT_USER_PASSWORD_MODE_NONE);
gtk_widget_set_visible (um->old_password_label, visible); gtk_widget_set_visible (GTK_WIDGET (um->old_password_label), visible);
gtk_widget_set_visible (um->old_password_entry, visible); gtk_widget_set_visible (GTK_WIDGET (um->old_password_entry), visible);
um->old_password_ok = !visible; um->old_password_ok = !visible;
um->passwd_handler = passwd_init ();
} }
else { else {
mode_change (um, ACT_USER_PASSWORD_MODE_SET_AT_LOGIN); mode_change (um, ACT_USER_PASSWORD_MODE_SET_AT_LOGIN);
gtk_widget_show (um->action_radio_box); gtk_widget_show (GTK_WIDGET (um->action_radio_box));
gtk_widget_hide (um->old_password_label); gtk_widget_hide (GTK_WIDGET (um->old_password_label));
gtk_widget_hide (um->old_password_entry); gtk_widget_hide (GTK_WIDGET (um->old_password_entry));
um->old_password_ok = TRUE; um->old_password_ok = TRUE;
} }
if (act_user_get_uid (um->user) == getuid()) {
if (um->passwd_handler != NULL)
passwd_destroy (um->passwd_handler);
um->passwd_handler = passwd_init ();
}
}
}
void
um_password_dialog_show (UmPasswordDialog *um,
GtkWindow *parent)
{
gtk_window_set_transient_for (GTK_WINDOW (um->dialog), parent);
gtk_window_present (GTK_WINDOW (um->dialog));
if (um->old_password_ok == FALSE) if (um->old_password_ok == FALSE)
gtk_widget_grab_focus (um->old_password_entry); gtk_widget_grab_focus (GTK_WIDGET (um->old_password_entry));
else else
gtk_widget_grab_focus (um->password_entry); gtk_widget_grab_focus (GTK_WIDGET (um->password_entry));
}
gtk_widget_grab_default (GTK_WIDGET (um->ok_button));
return um;
}

View file

@ -25,13 +25,9 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _UmPasswordDialog UmPasswordDialog; #define UM_TYPE_PASSWORD_DIALOG (um_password_dialog_get_type ())
G_DECLARE_FINAL_TYPE (UmPasswordDialog, um_password_dialog, UM, PASSWORD_DIALOG, GtkDialog)
UmPasswordDialog *um_password_dialog_new (void); UmPasswordDialog *um_password_dialog_new (ActUser *user);
void um_password_dialog_free (UmPasswordDialog *dialog);
void um_password_dialog_set_user (UmPasswordDialog *dialog,
ActUser *user);
void um_password_dialog_show (UmPasswordDialog *dialog,
GtkWindow *parent);
G_END_DECLS G_END_DECLS

View file

@ -2,7 +2,7 @@
<interface> <interface>
<!-- interface-requires gtk+ 2.12 --> <!-- interface-requires gtk+ 2.12 -->
<!-- interface-naming-policy toplevel-contextual --> <!-- interface-naming-policy toplevel-contextual -->
<object class="GtkDialog" id="dialog"> <template class="UmPasswordDialog" parent="GtkDialog">
<property name="border_width">6</property> <property name="border_width">6</property>
<property name="title" translatable="yes">Change Password</property> <property name="title" translatable="yes">Change Password</property>
<property name="resizable">False</property> <property name="resizable">False</property>
@ -10,14 +10,13 @@
<property name="window_position">center-on-parent</property> <property name="window_position">center-on-parent</property>
<property name="icon_name">system-users</property> <property name="icon_name">system-users</property>
<property name="type_hint">dialog</property> <property name="type_hint">dialog</property>
<property name="use_header_bar">1</property>
<child internal-child="headerbar"> <child internal-child="headerbar">
<object class="GtkHeaderBar" id="dialog-header-bar"> <object class="GtkHeaderBar" id="dialog-header-bar">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="show_close_button">False</property> <property name="show_close_button">False</property>
<child> <child>
<object class="GtkButton" id="cancel-button"> <object class="GtkButton" id="cancel_button">
<property name="label" translatable="yes">_Cancel</property> <property name="label" translatable="yes">_Cancel</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="visible">True</property> <property name="visible">True</property>
@ -34,7 +33,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkButton" id="ok-button"> <object class="GtkButton" id="ok_button">
<property name="label" translatable="yes">Ch_ange</property> <property name="label" translatable="yes">Ch_ange</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
@ -42,6 +41,7 @@
<property name="receives_default">True</property> <property name="receives_default">True</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="valign">center</property> <property name="valign">center</property>
<signal name="clicked" handler="ok_button_clicked_cb" object="UmPasswordDialog" swapped="yes"/>
<style> <style>
<class name="text-button"/> <class name="text-button"/>
<class name="suggested-action"/> <class name="suggested-action"/>
@ -54,32 +54,35 @@
</object> </object>
</child> </child>
<child internal-child="vbox"> <child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox1"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkBox" id="vbox7"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="border_width">6</property> <property name="border_width">6</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkGrid" id="table4"> <object class="GtkGrid">
<property name="visible">True</property> <property name="visible">True</property>
<property name="column_spacing">6</property> <property name="column_spacing">6</property>
<property name="row_spacing">6</property> <property name="row_spacing">6</property>
<property name="hexpand">True</property> <property name="hexpand">True</property>
<child> <child>
<object class="GtkEntry" id="verify-entry"> <object class="GtkEntry" id="verify_entry">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="visibility">False</property> <property name="visibility">False</property>
<property name="hexpand">True</property> <property name="hexpand">True</property>
<property name="activates_default">True</property> <property name="activates_default">True</property>
<property name="input_purpose">password</property> <property name="input_purpose">password</property>
<signal name="notify::text" handler="password_entry_changed" object="UmPasswordDialog" swapped="yes"/>
<signal name="activate" handler="password_entry_timeout" object="UmPasswordDialog" swapped="yes"/>
<signal name="focus-out-event" handler="password_entry_focus_out_cb" after="yes" object="UmPasswordDialog" swapped="yes"/>
</object> </object>
<packing> <packing>
<property name="left_attach">1</property> <property name="left_attach">1</property>
@ -87,7 +90,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="password-hint"> <object class="GtkLabel" id="password_hint_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
@ -112,7 +115,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="verify-hint"> <object class="GtkLabel" id="verify_hint_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
@ -136,12 +139,12 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="password-normal-verify-label"> <object class="GtkLabel">
<property name="visible">True</property> <property name="visible">True</property>
<property name="xalign">1</property> <property name="xalign">1</property>
<property name="label" translatable="yes">_Confirm New Password</property> <property name="label" translatable="yes">_Confirm New Password</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="mnemonic_widget">verify-entry</property> <property name="mnemonic_widget">verify_entry</property>
<property name="margin_start">25</property> <property name="margin_start">25</property>
<style> <style>
<class name="dim-label"/> <class name="dim-label"/>
@ -153,12 +156,12 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="password-normal-password-label"> <object class="GtkLabel">
<property name="visible">True</property> <property name="visible">True</property>
<property name="xalign">1</property> <property name="xalign">1</property>
<property name="label" translatable="yes">_New Password</property> <property name="label" translatable="yes">_New Password</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="mnemonic_widget">password-entry</property> <property name="mnemonic_widget">password_entry</property>
<property name="margin_start">25</property> <property name="margin_start">25</property>
<style> <style>
<class name="dim-label"/> <class name="dim-label"/>
@ -170,13 +173,18 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkEntry" id="password-entry"> <object class="GtkEntry" id="password_entry">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="visibility">False</property> <property name="visibility">False</property>
<property name="hexpand">True</property> <property name="hexpand">True</property>
<property name="activates_default">True</property> <property name="activates_default">True</property>
<property name="input_purpose">password</property> <property name="input_purpose">password</property>
<signal name="notify::text" handler="password_entry_changed" object="UmPasswordDialog" swapped="yes"/>
<signal name="activate" handler="password_entry_timeout" object="UmPasswordDialog" swapped="yes"/>
<signal name="focus-out-event" handler="password_entry_focus_out_cb" after="yes" object="UmPasswordDialog" swapped="yes"/>
<signal name="key-press-event" handler="password_entry_key_press_cb" object="UmPasswordDialog" swapped="yes"/>
<signal name="icon-press" handler="password_entry_icon_press_cb" object="UmPasswordDialog" swapped="yes"/>
</object> </object>
<packing> <packing>
<property name="left_attach">1</property> <property name="left_attach">1</property>
@ -184,7 +192,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLevelBar" id="strength-indicator"> <object class="GtkLevelBar" id="strength_indicator">
<property name="visible">True</property> <property name="visible">True</property>
<property name="mode">discrete</property> <property name="mode">discrete</property>
<property name="max-value">5</property> <property name="max-value">5</property>
@ -202,12 +210,12 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="old-password-label"> <object class="GtkLabel" id="old_password_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="xalign">1</property> <property name="xalign">1</property>
<property name="label" translatable="yes">Current _Password</property> <property name="label" translatable="yes">Current _Password</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="mnemonic_widget">old-password-entry</property> <property name="mnemonic_widget">old_password_entry</property>
<property name="margin_start">25</property> <property name="margin_start">25</property>
<property name="margin_bottom">12</property> <property name="margin_bottom">12</property>
<style> <style>
@ -220,7 +228,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkEntry" id="old-password-entry"> <object class="GtkEntry" id="old_password_entry">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="visibility">False</property> <property name="visibility">False</property>
@ -228,6 +236,9 @@
<property name="activates_default">True</property> <property name="activates_default">True</property>
<property name="margin_bottom">12</property> <property name="margin_bottom">12</property>
<property name="input_purpose">password</property> <property name="input_purpose">password</property>
<signal name="notify::text" handler="old_password_entry_changed" object="UmPasswordDialog" swapped="yes"/>
<signal name="activate" handler="password_entry_timeout" object="UmPasswordDialog" swapped="yes"/>
<signal name="focus-out-event" handler="old_password_entry_focus_out_cb" after="yes" object="UmPasswordDialog" swapped="yes"/>
</object> </object>
<packing> <packing>
<property name="left_attach">1</property> <property name="left_attach">1</property>
@ -235,11 +246,11 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkBox" id="action-radio-box"> <object class="GtkBox" id="action_radio_box">
<property name="visible">True</property> <property name="visible">True</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkRadioButton" id="action-login-radio"> <object class="GtkRadioButton" id="action_login_radio">
<property name="label" translatable="yes">Allow user to change their password on next login</property> <property name="label" translatable="yes">Allow user to change their password on next login</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
@ -252,14 +263,15 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkRadioButton" id="action-now-radio"> <object class="GtkRadioButton" id="action_now_radio">
<property name="label" translatable="yes">Set a password now</property> <property name="label" translatable="yes">Set a password now</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="active">True</property> <property name="active">True</property>
<property name="draw_indicator">True</property> <property name="draw_indicator">True</property>
<property name="group">action-login-radio</property> <property name="group">action_login_radio</property>
<signal name="toggled" handler="action_now_radio_toggled_cb" object="UmPasswordDialog" swapped="yes"/>
</object> </object>
<packing> <packing>
<property name="position">1</property> <property name="position">1</property>
@ -286,5 +298,8 @@
</child> </child>
</object> </object>
</child> </child>
</object> <action-widgets>
<action-widget response="0">cancel_button</action-widget>
</action-widgets>
</template>
</interface> </interface>

View file

@ -6,7 +6,6 @@
<file alias="avatar-chooser.ui" preprocess="xml-stripblanks">data/avatar-chooser.ui</file> <file alias="avatar-chooser.ui" preprocess="xml-stripblanks">data/avatar-chooser.ui</file>
<file alias="join-dialog.ui" preprocess="xml-stripblanks">data/join-dialog.ui</file> <file alias="join-dialog.ui" preprocess="xml-stripblanks">data/join-dialog.ui</file>
<file alias="account-fingerprint.ui" preprocess="xml-stripblanks">data/account-fingerprint.ui</file> <file alias="account-fingerprint.ui" preprocess="xml-stripblanks">data/account-fingerprint.ui</file>
<file alias="password-dialog.ui" preprocess="xml-stripblanks">data/password-dialog.ui</file>
<file alias="history-dialog.ui" preprocess="xml-stripblanks">data/history-dialog.ui</file> <file alias="history-dialog.ui" preprocess="xml-stripblanks">data/history-dialog.ui</file>
<file alias="user-accounts-dialog.css">data/user-accounts-dialog.css</file> <file alias="user-accounts-dialog.css">data/user-accounts-dialog.css</file>
<file alias="carousel.ui" preprocess="xml-stripblanks">data/carousel.ui</file> <file alias="carousel.ui" preprocess="xml-stripblanks">data/carousel.ui</file>
@ -23,5 +22,6 @@
<file alias="right-little-finger.png">data/icons/right-little-finger.png</file> <file alias="right-little-finger.png">data/icons/right-little-finger.png</file>
<file alias="right-ring-finger.png">data/icons/right-ring-finger.png</file> <file alias="right-ring-finger.png">data/icons/right-ring-finger.png</file>
<file alias="right-thumb.png">data/icons/right-thumb.png</file> <file alias="right-thumb.png">data/icons/right-thumb.png</file>
<file preprocess="xml-stripblanks">um-password-dialog.ui</file>
</gresource> </gresource>
</gresources> </gresources>

View file

@ -201,7 +201,6 @@ panels/user-accounts/data/avatar-chooser.ui
panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in
panels/user-accounts/data/history-dialog.ui panels/user-accounts/data/history-dialog.ui
panels/user-accounts/data/join-dialog.ui panels/user-accounts/data/join-dialog.ui
panels/user-accounts/data/password-dialog.ui
panels/user-accounts/org.gnome.controlcenter.user-accounts.policy.in panels/user-accounts/org.gnome.controlcenter.user-accounts.policy.in
panels/user-accounts/pw-utils.c panels/user-accounts/pw-utils.c
panels/user-accounts/run-passwd.c panels/user-accounts/run-passwd.c
@ -210,6 +209,7 @@ panels/user-accounts/um-account-type.c
panels/user-accounts/um-fingerprint-dialog.c panels/user-accounts/um-fingerprint-dialog.c
panels/user-accounts/um-history-dialog.c panels/user-accounts/um-history-dialog.c
panels/user-accounts/um-password-dialog.c panels/user-accounts/um-password-dialog.c
panels/user-accounts/um-password-dialog.ui
panels/user-accounts/um-photo-dialog.c panels/user-accounts/um-photo-dialog.c
panels/user-accounts/um-realm-manager.c panels/user-accounts/um-realm-manager.c
panels/user-accounts/um-utils.c panels/user-accounts/um-utils.c