[gnome-control-center/gnome-3-8] user-accounts: prevent the only admin from being deleted or disabled
- From: Thomas Wood <thos src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center/gnome-3-8] user-accounts: prevent the only admin from being deleted or disabled
- Date: Wed, 5 Jun 2013 16:00:18 +0000 (UTC)
commit 945d6e0686394c335a695e4d53edc24bc7cad49e
Author: Thomas Wood <thomas wood intel com>
Date: Tue Jun 4 16:53:22 2013 +0100
user-accounts: prevent the only admin from being deleted or disabled
https://bugzilla.gnome.org/show_bug.cgi?id=690246
panels/user-accounts/um-password-dialog.c | 3 +-
panels/user-accounts/um-user-panel.c | 43 +++--------------------------
panels/user-accounts/um-utils.c | 38 +++++++++++++++++++++++++
panels/user-accounts/um-utils.h | 2 +
4 files changed, 46 insertions(+), 40 deletions(-)
---
diff --git a/panels/user-accounts/um-password-dialog.c b/panels/user-accounts/um-password-dialog.c
index 014614c..62efdb0 100644
--- a/panels/user-accounts/um-password-dialog.c
+++ b/panels/user-accounts/um-password-dialog.c
@@ -644,7 +644,8 @@ visible_func (GtkTreeModel *model,
* as this can lead to them being 'locked out'.
*/
if (mode == UM_PASSWORD_DIALOG_MODE_LOCK_ACCOUNT &&
- (locked || act_user_get_uid (um->user) == getuid ()))
+ (locked || act_user_get_uid (um->user) == getuid ()
+ || would_demote_only_admin (um->user)))
return FALSE;
if (mode == UM_PASSWORD_DIALOG_MODE_UNLOCK_ACCOUNT && !locked)
diff --git a/panels/user-accounts/um-user-panel.c b/panels/user-accounts/um-user-panel.c
index 31f366c..99b448c 100644
--- a/panels/user-accounts/um-user-panel.c
+++ b/panels/user-accounts/um-user-panel.c
@@ -1043,42 +1043,6 @@ remove_unlock_tooltip (GtkWidget *button)
G_CALLBACK (show_tooltip_now), NULL);
}
-static guint
-get_num_admin (ActUserManager *um)
-{
- GSList *list;
- GSList *l;
- guint num_admin = 0;
-
- list = act_user_manager_list_users (um);
- for (l = list; l != NULL; l = l->next) {
- ActUser *u = l->data;
- if (act_user_get_account_type (u) == ACT_USER_ACCOUNT_TYPE_ADMINISTRATOR) {
- num_admin++;
- }
- }
- g_slist_free (list);
-
- return num_admin;
-}
-
-static gboolean
-would_demote_only_admin (ActUser *user,
- ActUserManager *um)
-{
- /* Prevent the user from demoting the only admin account.
- * Returns TRUE when user is an administrator and there is only
- * one administrator */
-
- if (act_user_get_account_type (user) == ACT_USER_ACCOUNT_TYPE_STANDARD)
- return FALSE;
-
- if (get_num_admin (um) > 1)
- return FALSE;
-
- return TRUE;
-}
-
static void
on_permission_changed (GPermission *permission,
GParamSpec *pspec,
@@ -1119,7 +1083,8 @@ on_permission_changed (GPermission *permission,
}
widget = get_widget (d, "remove-user-toolbutton");
- gtk_widget_set_sensitive (widget, is_authorized && !self_selected);
+ gtk_widget_set_sensitive (widget, is_authorized && !self_selected
+ && !would_demote_only_admin (user));
if (is_authorized) {
setup_tooltip_with_embedded_icon (widget, _("Delete the selected user account"), NULL, NULL);
}
@@ -1146,7 +1111,7 @@ on_permission_changed (GPermission *permission,
remove_unlock_tooltip (get_widget (d, "autologin-switch"));
} else if (is_authorized && act_user_is_local_account (user)) {
- if (would_demote_only_admin (user, d->um)) {
+ if (would_demote_only_admin (user)) {
um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d,
"account-type-combo")), FALSE);
} else {
um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d,
"account-type-combo")), TRUE);
@@ -1158,7 +1123,7 @@ on_permission_changed (GPermission *permission,
}
else {
um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d, "account-type-combo")),
FALSE);
- if (would_demote_only_admin (user, d->um)) {
+ if (would_demote_only_admin (user)) {
remove_unlock_tooltip (get_widget (d, "account-type-combo"));
} else {
add_unlock_tooltip (get_widget (d, "account-type-combo"));
diff --git a/panels/user-accounts/um-utils.c b/panels/user-accounts/um-utils.c
index 9c45b34..80be727 100644
--- a/panels/user-accounts/um-utils.c
+++ b/panels/user-accounts/um-utils.c
@@ -1033,3 +1033,41 @@ set_user_icon_data (ActUser *user,
g_free (path);
}
+
+static guint
+get_num_admin (ActUserManager *um)
+{
+ GSList *list;
+ GSList *l;
+ guint num_admin = 0;
+
+ list = act_user_manager_list_users (um);
+ for (l = list; l != NULL; l = l->next) {
+ ActUser *u = l->data;
+ if (act_user_get_account_type (u) == ACT_USER_ACCOUNT_TYPE_ADMINISTRATOR) {
+ num_admin++;
+ }
+ }
+ g_slist_free (list);
+
+ return num_admin;
+}
+
+gboolean
+would_demote_only_admin (ActUser *user)
+{
+
+ ActUserManager *um = act_user_manager_get_default ();
+
+ /* Prevent the user from demoting the only admin account.
+ * Returns TRUE when user is an administrator and there is only
+ * one administrator */
+
+ if (act_user_get_account_type (user) == ACT_USER_ACCOUNT_TYPE_STANDARD)
+ return FALSE;
+
+ if (get_num_admin (um) > 1)
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/panels/user-accounts/um-utils.h b/panels/user-accounts/um-utils.h
index 7c30627..71f712a 100644
--- a/panels/user-accounts/um-utils.h
+++ b/panels/user-accounts/um-utils.h
@@ -81,6 +81,8 @@ GdkPixbuf * render_user_icon (ActUser *user,
void set_user_icon_data (ActUser *user,
GdkPixbuf *pixbuf);
+gboolean would_demote_only_admin (ActUser *user);
+
G_END_DECLS
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]