Merge lp:~seb128/unity-control-center/users-backport-commits into lp:unity-control-center

Proposed by Sebastien Bacher
Status: Merged
Approved by: Iain Lane
Approved revision: 12729
Merged at revision: 12731
Proposed branch: lp:~seb128/unity-control-center/users-backport-commits
Merge into: lp:unity-control-center
Diff against target: 6301 lines (+1896/-2469)
38 files modified
configure.ac (+2/-18)
debian/control (+1/-1)
debian/rules (+1/-2)
panels/user-accounts/Makefile.am (+15/-15)
panels/user-accounts/data/Makefile.am (+1/-12)
panels/user-accounts/data/account-dialog.ui (+3/-1)
panels/user-accounts/data/account-fingerprint.ui (+1/-1)
panels/user-accounts/data/history-dialog.ui (+175/-0)
panels/user-accounts/data/icons/Makefile.am (+0/-32)
panels/user-accounts/data/password-dialog.ui (+7/-2)
panels/user-accounts/data/photo-dialog.ui (+1/-0)
panels/user-accounts/data/user-accounts-dialog.ui (+129/-65)
panels/user-accounts/frob-account-dialog.c (+3/-3)
panels/user-accounts/um-account-dialog.c (+110/-43)
panels/user-accounts/um-account-dialog.h (+3/-2)
panels/user-accounts/um-fingerprint-dialog.c (+10/-16)
panels/user-accounts/um-fingerprint-dialog.h (+2/-2)
panels/user-accounts/um-history-dialog.c (+377/-0)
panels/user-accounts/um-history-dialog.h (+41/-0)
panels/user-accounts/um-password-dialog.c (+125/-62)
panels/user-accounts/um-password-dialog.h (+2/-2)
panels/user-accounts/um-photo-dialog.c (+15/-16)
panels/user-accounts/um-photo-dialog.h (+2/-2)
panels/user-accounts/um-realm-manager.c (+13/-4)
panels/user-accounts/um-realm-manager.h (+1/-0)
panels/user-accounts/um-user-manager.c (+0/-734)
panels/user-accounts/um-user-manager.h (+0/-121)
panels/user-accounts/um-user-module.c (+1/-1)
panels/user-accounts/um-user-panel.c (+331/-189)
panels/user-accounts/um-user-panel.h (+13/-15)
panels/user-accounts/um-user.c (+0/-991)
panels/user-accounts/um-user.h (+0/-109)
panels/user-accounts/um-utils.c (+332/-6)
panels/user-accounts/um-utils.h (+18/-0)
panels/user-accounts/user-accounts.gresource.xml (+23/-0)
po/POTFILES.in (+2/-1)
shell/cc-editable-entry.c (+127/-1)
shell/cc-editable-entry.h (+9/-0)
To merge this branch: bzr merge lp:~seb128/unity-control-center/users-backport-commits
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Iain Lane Approve
Unity Control Center development team Pending
Review via email: mp+207686@code.launchpad.net

Commit message

update to the GNOME 3.8 codebase, remove quite some custom code to use
libaccountsservice. The update also includes a view of the login history
informations and bugfixes.

Description of the change

update to the GNOME 3.8 codebase, remove quite some custom code to use
libaccountsservice. The update also includes a view of the login history
informations and bugfixes.

To post a comment you must log in.
Revision history for this message
Sebastien Bacher (seb128) wrote :

The changes are a bit much to review, but that's basically the list of commits on https://git.gnome.org/browse/gnome-control-center/log/panels/user-accounts?h=gnome-3-8 (first 2 screens).

That features quite some fixes and dropping code in favor of using accountsservice
diffstat: 37 files changed, 1757 insertions(+), 2467 deletions(-)

I've tested the update, builds/works fine here

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Iain Lane (laney) wrote :

Is login history meant to work? It's just blank for my user.

Also, I get some Gtk warnings:

(unity-control-center:15501): Gtk-WARNING **: Unknown property: CcEditableEntry.width-chars

(unity-control-center:15501): Gtk-WARNING **: Unknown property: CcEditableEntry.max-width-chars

(unity-control-center:15501): Gtk-WARNING **: Unknown property: CcEditableEntry.ellipsize

I think you need de1fc65ab3f843d6525e07c5a32661a2dd5feb5e for those?

review: Needs Fixing
Revision history for this message
Sebastien Bacher (seb128) wrote :

> Is login history meant to work? It's just blank for my user.

it's supposed to be working yet, it has entries here for my user and test users (though the log seems incomplete)

Do you have an history if you go check the LoginHistory priority for your user in d-feet?

> I think you need de1fc65ab3f843d6525e07c5a32661a2dd5feb5e for those?

Thanks, I'm having a look to that

12726. By Sebastien Bacher

updated translations template

12727. By Sebastien Bacher

backport commit needed to fix warnings

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
12728. By Sebastien Bacher

Include "pty" sessions in the login history, that's the type lightdm uses

Revision history for this message
Sebastien Bacher (seb128) wrote :

> Is login history meant to work? It's just blank for my user.

Seems like wtmp is not really well described, our session types use "pty", I've added that to the sessions to list, which seems to work

The merge request should be good to go now

12729. By Sebastien Bacher

the type is "pts" not "pty", should be correct this time

Revision history for this message
Iain Lane (laney) wrote :

Looks good now, thanks for that!

(be nice to forward the change upstream, even if they then decide to reject it)

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Sebastien Bacher (seb128) wrote :

> (be nice to forward the change upstream, even if they then decide to reject it)

https://bugzilla.gnome.org/show_bug.cgi?id=725053

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'configure.ac'
--- configure.ac 2014-02-21 18:46:14 +0000
+++ configure.ac 2014-02-24 09:46:44 +0000
@@ -70,17 +70,6 @@
7070
71AC_CHECK_LIB(m, floor)71AC_CHECK_LIB(m, floor)
7272
73AC_ARG_ENABLE([systemd],
74 AS_HELP_STRING([--enable-systemd], [Use systemd]),
75 [with_systemd=$enableval],
76 [with_systemd=no])
77if test "$with_systemd" = "yes" ; then
78 SYSTEMD=libsystemd-login
79 AC_DEFINE(HAVE_SYSTEMD, 1, [Define to 1 if systemd is available])
80else
81 SYSTEMD=
82fi
83
84# IBus support73# IBus support
85IBUS_REQUIRED_VERSION=1.4.9974IBUS_REQUIRED_VERSION=1.4.99
8675
@@ -115,6 +104,7 @@
115LIBWACOM_REQUIRED_VERSION=0.7104LIBWACOM_REQUIRED_VERSION=0.7
116CLUTTER_REQUIRED_VERSION=1.11.3105CLUTTER_REQUIRED_VERSION=1.11.3
117GOA_REQUIRED_VERSION=3.5.90106GOA_REQUIRED_VERSION=3.5.90
107ACCOUNTSSERVICE_REQUIRED_VERSION=0.6.30
118108
119COMMON_MODULES="gtk+-3.0 >= $GTK_REQUIRED_VERSION109COMMON_MODULES="gtk+-3.0 >= $GTK_REQUIRED_VERSION
120 glib-2.0 >= $GLIB_REQUIRED_VERSION110 glib-2.0 >= $GLIB_REQUIRED_VERSION
@@ -163,7 +153,7 @@
163 gnome-desktop-3.0153 gnome-desktop-3.0
164 gdk-pixbuf-2.0 >= $GDKPIXBUF_REQUIRED_VERSION154 gdk-pixbuf-2.0 >= $GDKPIXBUF_REQUIRED_VERSION
165 pwquality155 pwquality
166 $SYSTEMD)156 accountsservice >= $ACCOUNTSSERVICE_REQUIRED_VERSION)
167157
168AM_PROG_VALAC([0.20.0])158AM_PROG_VALAC([0.20.0])
169159
@@ -480,7 +470,6 @@
480panels/user-accounts/Makefile470panels/user-accounts/Makefile
481panels/user-accounts/data/Makefile471panels/user-accounts/data/Makefile
482panels/user-accounts/data/unity-user-accounts-panel.desktop.in472panels/user-accounts/data/unity-user-accounts-panel.desktop.in
483panels/user-accounts/data/icons/Makefile
484panels/wacom/Makefile473panels/wacom/Makefile
485panels/wacom/calibrator/Makefile474panels/wacom/calibrator/Makefile
486panels/wacom/unity-wacom-panel.desktop.in475panels/wacom/unity-wacom-panel.desktop.in
@@ -516,11 +505,6 @@
516else505else
517 AC_MSG_NOTICE([ Appearance panel Flickr support disabled])506 AC_MSG_NOTICE([ Appearance panel Flickr support disabled])
518fi507fi
519if test "x$with_systemd" = "xyes"; then
520 AC_MSG_NOTICE([** systemd (Systemd session tracking)])
521else
522 AC_MSG_NOTICE([ Using ConsoleKit for session tracking])
523fi
524if test "x$have_wacom" = "xyes"; then508if test "x$have_wacom" = "xyes"; then
525 AC_MSG_NOTICE([** wacom (Wacom tablet panel)])509 AC_MSG_NOTICE([** wacom (Wacom tablet panel)])
526else510else
527511
=== modified file 'debian/control'
--- debian/control 2014-02-21 18:46:14 +0000
+++ debian/control 2014-02-24 09:46:44 +0000
@@ -15,6 +15,7 @@
15 gsettings-desktop-schemas-dev (>= 3.7.2.2),15 gsettings-desktop-schemas-dev (>= 3.7.2.2),
16 hardening-wrapper,16 hardening-wrapper,
17 intltool (>= 0.37.1),17 intltool (>= 0.37.1),
18 libaccountsservice-dev (>= 0.6.30),
18 libcanberra-gtk3-dev,19 libcanberra-gtk3-dev,
19 libcheese-gtk-dev (>= 2.91.91.1),20 libcheese-gtk-dev (>= 2.91.91.1),
20 libcolord-dev,21 libcolord-dev,
@@ -40,7 +41,6 @@
40 libpulse-dev (>= 1:2.0),41 libpulse-dev (>= 1:2.0),
41 libpwquality-dev,42 libpwquality-dev,
42 libupower-glib-dev (>= 0.9.1),43 libupower-glib-dev (>= 0.9.1),
43 libsystemd-login-dev,
44 libtimezonemap1-dev,44 libtimezonemap1-dev,
45 libwacom-dev (>= 0.7),45 libwacom-dev (>= 0.7),
46 libx11-dev,46 libx11-dev,
4747
=== modified file 'debian/rules'
--- debian/rules 2014-02-21 18:17:40 +0000
+++ debian/rules 2014-02-24 09:46:44 +0000
@@ -11,8 +11,7 @@
1111
12DEB_CONFIGURE_SCRIPT := ./autogen.sh12DEB_CONFIGURE_SCRIPT := ./autogen.sh
13DEB_CONFIGURE_EXTRA_FLAGS += --libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH) \13DEB_CONFIGURE_EXTRA_FLAGS += --libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH) \
14 --disable-update-mimedb \14 --disable-update-mimedb
15 --enable-systemd
1615
17DEB_DH_MAKESHLIBS_ARGS_unity-control-center = --no-act16DEB_DH_MAKESHLIBS_ARGS_unity-control-center = --no-act
1817
1918
=== modified file 'panels/user-accounts/Makefile.am'
--- panels/user-accounts/Makefile.am 2013-11-29 06:28:37 +0000
+++ panels/user-accounts/Makefile.am 2014-02-24 09:46:44 +0000
@@ -8,9 +8,6 @@
8ccpanels_LTLIBRARIES = libuser-accounts.la8ccpanels_LTLIBRARIES = libuser-accounts.la
99
10AM_CPPFLAGS = \10AM_CPPFLAGS = \
11 -DDATADIR=\""$(datadir)"\" \
12 -DUIDIR=\""$(pkgdatadir)/ui/user-accounts"\" \
13 -DLIBLOCALEDIR=\""$(prefix)/lib/locale"\" \
14 -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \11 -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
15 -DUM_PIXMAP_DIR=\""$(pkgdatadir)/pixmaps"\" \12 -DUM_PIXMAP_DIR=\""$(pkgdatadir)/pixmaps"\" \
16 -DHAVE_LIBPWQUALITY \13 -DHAVE_LIBPWQUALITY \
@@ -24,16 +21,14 @@
24endif21endif
2522
26BUILT_SOURCES = \23BUILT_SOURCES = \
27 um-realm-generated.c \24 um-realm-generated.c \
28 um-realm-generated.h25 um-realm-generated.h \
26 um-resources.c \
27 um-resources.h
2928
30libuser_accounts_la_SOURCES = \29libuser_accounts_la_SOURCES = \
31 um-account-type.h \30 um-account-type.h \
32 um-account-type.c \31 um-account-type.c \
33 um-user.h \
34 um-user.c \
35 um-user-manager.h \
36 um-user-manager.c \
37 um-account-dialog.h \32 um-account-dialog.h \
38 um-account-dialog.c \33 um-account-dialog.c \
39 um-password-dialog.h \34 um-password-dialog.h \
@@ -60,6 +55,8 @@
60 um-user-module.c \55 um-user-module.c \
61 um-realm-manager.c \56 um-realm-manager.c \
62 um-realm-manager.h \57 um-realm-manager.h \
58 um-history-dialog.h \
59 um-history-dialog.c \
63 $(BUILT_SOURCES)60 $(BUILT_SOURCES)
6461
65libuser_accounts_la_LIBADD = \62libuser_accounts_la_LIBADD = \
@@ -83,6 +80,12 @@
83 --c-generate-object-manager $<80 --c-generate-object-manager $<
84um-realm-generated.h: um-realm-generated.c81um-realm-generated.h: um-realm-generated.c
8582
83resource_files = $(shell glib-compile-resources --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/user-accounts.gresource.xml)
84um-resources.c: user-accounts.gresource.xml $(resource_files)
85 $(AM_V_GEN) glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate-source --c-name um $<
86um-resources.h: user-accounts.gresource.xml $(resource_files)
87 $(AM_V_GEN) glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate-header --c-name um $<
88
86noinst_PROGRAMS = frob-account-dialog89noinst_PROGRAMS = frob-account-dialog
8790
88frob_account_dialog_SOURCES = \91frob_account_dialog_SOURCES = \
@@ -91,10 +94,6 @@
91 um-account-dialog.c \94 um-account-dialog.c \
92 um-realm-manager.c \95 um-realm-manager.c \
93 um-realm-manager.h \96 um-realm-manager.h \
94 um-user.h \
95 um-user.c \
96 um-user-manager.c \
97 um-user-manager.h \
98 um-utils.h \97 um-utils.h \
99 um-utils.c \98 um-utils.c \
100 $(BUILT_SOURCES)99 $(BUILT_SOURCES)
@@ -103,8 +102,7 @@
103 $(libuser_accounts_la_LIBADD)102 $(libuser_accounts_la_LIBADD)
104103
105frob_account_dialog_CFLAGS = \104frob_account_dialog_CFLAGS = \
106 $(AM_CFLAGS) \105 $(AM_CFLAGS)
107 -DUIDIR=\""$(pkgdatadir)/ui/user-accounts"\"
108106
109polkitdir = $(datadir)/polkit-1/actions107polkitdir = $(datadir)/polkit-1/actions
110polkit_in_files = com.canonical.controlcenter.user-accounts.policy.in108polkit_in_files = com.canonical.controlcenter.user-accounts.policy.in
@@ -114,6 +112,8 @@
114112
115EXTRA_DIST = \113EXTRA_DIST = \
116 $(polkit_in_files) \114 $(polkit_in_files) \
115 $(resource_files) \
116 user-accounts.gresource.xml \
117 $(NULL)117 $(NULL)
118118
119CLEANFILES = \119CLEANFILES = \
120120
=== modified file 'panels/user-accounts/data/Makefile.am'
--- panels/user-accounts/data/Makefile.am 2013-11-29 06:28:37 +0000
+++ panels/user-accounts/data/Makefile.am 2014-02-24 09:46:44 +0000
@@ -1,13 +1,3 @@
1SUBDIRS = icons
2
3uidir = $(pkgdatadir)/ui/user-accounts
4ui_DATA = \
5 account-dialog.ui \
6 password-dialog.ui \
7 photo-dialog.ui \
8 user-accounts-dialog.ui \
9 account-fingerprint.ui
10
11@INTLTOOL_DESKTOP_RULE@1@INTLTOOL_DESKTOP_RULE@
122
13desktopdir = $(datadir)/applications3desktopdir = $(datadir)/applications
@@ -16,8 +6,7 @@
166
17EXTRA_DIST = \7EXTRA_DIST = \
18 unity-user-accounts-panel.desktop.in.in \8 unity-user-accounts-panel.desktop.in.in \
19 org.freedesktop.realmd.xml \9 org.freedesktop.realmd.xml
20 $(ui_DATA)
2110
22CLEANFILES = \11CLEANFILES = \
23 unity-user-accounts-panel.desktop \12 unity-user-accounts-panel.desktop \
2413
=== modified file 'panels/user-accounts/data/account-dialog.ui'
--- panels/user-accounts/data/account-dialog.ui 2012-09-16 20:15:22 +0000
+++ panels/user-accounts/data/account-dialog.ui 2014-02-24 09:46:44 +0000
@@ -1,6 +1,6 @@
1<?xml version="1.0"?>1<?xml version="1.0"?>
2<interface>2<interface>
3 <!-- interface-requires gtk+ 2.12 -->3 <!-- interface-requires gtk+ 3.8 -->
4 <!-- interface-naming-policy toplevel-contextual -->4 <!-- interface-naming-policy toplevel-contextual -->
5 <object class="GtkListStore" id="username-model">5 <object class="GtkListStore" id="username-model">
6 <columns>6 <columns>
@@ -285,6 +285,7 @@
285 <child internal-child="entry">285 <child internal-child="entry">
286 <object class="GtkEntry" id="combobox-entry">286 <object class="GtkEntry" id="combobox-entry">
287 <property name="can_focus">True</property>287 <property name="can_focus">True</property>
288 <property name="activates_default">True</property>
288 </object>289 </object>
289 </child>290 </child>
290 </object>291 </object>
@@ -322,6 +323,7 @@
322 <property name="can_focus">True</property>323 <property name="can_focus">True</property>
323 <property name="hexpand">True</property>324 <property name="hexpand">True</property>
324 <property name="invisible_char">●</property>325 <property name="invisible_char">●</property>
326 <property name="activates_default">True</property>
325 <property name="invisible_char_set">True</property>327 <property name="invisible_char_set">True</property>
326 </object>328 </object>
327 <packing>329 <packing>
328330
=== modified file 'panels/user-accounts/data/account-fingerprint.ui'
--- panels/user-accounts/data/account-fingerprint.ui 2011-08-25 16:31:16 +0000
+++ panels/user-accounts/data/account-fingerprint.ui 2014-02-24 09:46:44 +0000
@@ -1,6 +1,6 @@
1<?xml version="1.0"?>1<?xml version="1.0"?>
2<interface>2<interface>
3 <requires lib="gtk+" version="2.16"/>3 <!-- interface-requires gtk+ 3.8 -->
4 <!-- interface-naming-policy toplevel-contextual -->4 <!-- interface-naming-policy toplevel-contextual -->
5 <object class="GtkListStore" id="model1">5 <object class="GtkListStore" id="model1">
6 <columns>6 <columns>
77
=== added file 'panels/user-accounts/data/history-dialog.ui'
--- panels/user-accounts/data/history-dialog.ui 1970-01-01 00:00:00 +0000
+++ panels/user-accounts/data/history-dialog.ui 2014-02-24 09:46:44 +0000
@@ -0,0 +1,175 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<interface>
3 <!-- interface-requires gtk+ 3.8 -->
4 <object class="GtkDialog" id="dialog">
5 <property name="can_focus">False</property>
6 <property name="title" translatable="yes">Login History</property>
7 <property name="resizable">False</property>
8 <property name="modal">True</property>
9 <property name="window_position">center-on-parent</property>
10 <property name="icon_name">system-users</property>
11 <property name="type_hint">dialog</property>
12 <child internal-child="vbox">
13 <object class="GtkBox" id="dialog-vbox1">
14 <property name="can_focus">False</property>
15 <property name="orientation">vertical</property>
16 <property name="spacing">2</property>
17 <child internal-child="action_area">
18 <object class="GtkButtonBox" id="dialog-action_area1">
19 <property name="can_focus">False</property>
20 <property name="layout_style">end</property>
21 <child>
22 <object class="GtkButton" id="close-button">
23 <property name="label" translatable="yes">Close</property>
24 <property name="visible">True</property>
25 <property name="can_focus">True</property>
26 <property name="receives_default">True</property>
27 </object>
28 <packing>
29 <property name="expand">False</property>
30 <property name="fill">True</property>
31 <property name="position">1</property>
32 </packing>
33 </child>
34 </object>
35 <packing>
36 <property name="expand">False</property>
37 <property name="fill">True</property>
38 <property name="pack_type">end</property>
39 <property name="position">0</property>
40 </packing>
41 </child>
42 <child>
43 <object class="GtkBox" id="box1">
44 <property name="visible">True</property>
45 <property name="can_focus">False</property>
46 <property name="orientation">vertical</property>
47 <child>
48 <object class="GtkBox" id="box3">
49 <property name="visible">True</property>
50 <property name="can_focus">False</property>
51 <property name="margin_left">6</property>
52 <property name="margin_right">6</property>
53 <property name="spacing">6</property>
54 <child>
55 <object class="GtkButton" id="previous-button">
56 <property name="visible">True</property>
57 <property name="can_focus">True</property>
58 <property name="receives_default">True</property>
59 <child internal-child="accessible">
60 <object class="AtkObject" id="previous-button-atkobject">
61 <property name="accessible-name" translatable="yes">Previous Week</property>
62 </object>
63 </child>
64 <child>
65 <object class="GtkArrow" id="arrow1">
66 <property name="visible">True</property>
67 <property name="can_focus">False</property>
68 <property name="arrow_type">left</property>
69 </object>
70 </child>
71 </object>
72 <packing>
73 <property name="expand">False</property>
74 <property name="fill">True</property>
75 <property name="position">0</property>
76 </packing>
77 </child>
78 <child>
79 <object class="GtkLabel" id="week-label">
80 <property name="visible">True</property>
81 <property name="can_focus">False</property>
82 <attributes>
83 <attribute name="weight" value="bold"/>
84 </attributes>
85 </object>
86 <packing>
87 <property name="expand">True</property>
88 <property name="fill">True</property>
89 <property name="position">1</property>
90 </packing>
91 </child>
92 <child>
93 <object class="GtkButton" id="next-button">
94 <property name="visible">True</property>
95 <property name="can_focus">True</property>
96 <property name="receives_default">True</property>
97 <child internal-child="accessible">
98 <object class="AtkObject" id="next-button-atkobject">
99 <property name="accessible-name" translatable="yes">Next Week</property>
100 </object>
101 </child>
102 <child>
103 <object class="GtkArrow" id="arrow2">
104 <property name="visible">True</property>
105 <property name="can_focus">False</property>
106 <child internal-child="accessible">
107 <object class="AtkObject" id="arrow2-atkobject">
108 <property name="accessible-name" translatable="yes">Next week</property>
109 </object>
110 </child>
111 </object>
112 </child>
113 </object>
114 <packing>
115 <property name="expand">False</property>
116 <property name="fill">True</property>
117 <property name="position">2</property>
118 </packing>
119 </child>
120 </object>
121 <packing>
122 <property name="expand">False</property>
123 <property name="fill">True</property>
124 <property name="position">0</property>
125 </packing>
126 </child>
127 <child>
128 <object class="GtkScrolledWindow" id="scrolledwindow1">
129 <property name="width_request">350</property>
130 <property name="height_request">300</property>
131 <property name="visible">True</property>
132 <property name="can_focus">True</property>
133 <property name="hexpand">True</property>
134 <property name="vexpand">True</property>
135 <property name="border_width">6</property>
136 <property name="hscrollbar_policy">never</property>
137 <property name="shadow_type">in</property>
138 <child>
139 <object class="GtkViewport" id="viewport1">
140 <property name="visible">True</property>
141 <property name="can_focus">False</property>
142 <child>
143 <object class="GtkGrid" id="history-grid">
144 <property name="visible">True</property>
145 <property name="can_focus">False</property>
146 <property name="hexpand">True</property>
147 <property name="border_width">12</property>
148 <property name="row_spacing">12</property>
149 <property name="column_spacing">12</property>
150 <property name="column_homogeneous">True</property>
151 </object>
152 </child>
153 </object>
154 </child>
155 </object>
156 <packing>
157 <property name="expand">True</property>
158 <property name="fill">True</property>
159 <property name="position">1</property>
160 </packing>
161 </child>
162 </object>
163 <packing>
164 <property name="expand">True</property>
165 <property name="fill">True</property>
166 <property name="position">1</property>
167 </packing>
168 </child>
169 </object>
170 </child>
171 <action-widgets>
172 <action-widget response="0">close-button</action-widget>
173 </action-widgets>
174 </object>
175</interface>
0176
=== removed file 'panels/user-accounts/data/icons/Makefile.am'
--- panels/user-accounts/data/icons/Makefile.am 2012-03-08 15:09:09 +0000
+++ panels/user-accounts/data/icons/Makefile.am 1970-01-01 00:00:00 +0000
@@ -1,32 +0,0 @@
1pixmapsdir = $(pkgdatadir)/pixmaps
2pixmaps_DATA = \
3 gnome-about-me-lock.png \
4 gnome-about-me-lock-open.png \
5 left-index-finger.svg \
6 left-little-finger.svg \
7 left-middle-finger.svg \
8 left-ring-finger.svg \
9 left-thumb.svg \
10 print_error.svg \
11 print_ok.svg \
12 right-index-finger.svg \
13 right-little-finger.svg \
14 right-middle-finger.svg \
15 right-ring-finger.svg \
16 right-thumb.svg \
17 left-index-finger.png \
18 left-middle-finger.png \
19 left-little-finger.png \
20 left-ring-finger.png \
21 left-thumb.png \
22 print_error.png \
23 print_ok.png \
24 right-index-finger.png \
25 right-middle-finger.png \
26 right-little-finger.png \
27 right-ring-finger.png \
28 right-thumb.png
29
30EXTRA_DIST = $(pixmaps_DATA)
31
32-include $(top_srcdir)/git.mk
330
=== removed file 'panels/user-accounts/data/icons/gnome-about-me-lock-open.png'
34Binary files panels/user-accounts/data/icons/gnome-about-me-lock-open.png 2010-10-30 22:04:15 +0000 and panels/user-accounts/data/icons/gnome-about-me-lock-open.png 1970-01-01 00:00:00 +0000 differ1Binary files panels/user-accounts/data/icons/gnome-about-me-lock-open.png 2010-10-30 22:04:15 +0000 and panels/user-accounts/data/icons/gnome-about-me-lock-open.png 1970-01-01 00:00:00 +0000 differ
=== removed file 'panels/user-accounts/data/icons/gnome-about-me-lock.png'
35Binary files panels/user-accounts/data/icons/gnome-about-me-lock.png 2010-10-30 22:04:15 +0000 and panels/user-accounts/data/icons/gnome-about-me-lock.png 1970-01-01 00:00:00 +0000 differ2Binary files panels/user-accounts/data/icons/gnome-about-me-lock.png 2010-10-30 22:04:15 +0000 and panels/user-accounts/data/icons/gnome-about-me-lock.png 1970-01-01 00:00:00 +0000 differ
=== modified file 'panels/user-accounts/data/password-dialog.ui'
--- panels/user-accounts/data/password-dialog.ui 2012-07-16 10:29:25 +0000
+++ panels/user-accounts/data/password-dialog.ui 2014-02-24 09:46:44 +0000
@@ -1,6 +1,6 @@
1<?xml version="1.0"?>1<?xml version="1.0"?>
2<interface>2<interface>
3 <!-- interface-requires gtk+ 2.12 -->3 <!-- interface-requires gtk+ 3.8 -->
4 <!-- interface-naming-policy toplevel-contextual -->4 <!-- interface-naming-policy toplevel-contextual -->
5 <object class="GtkListStore" id="action-model">5 <object class="GtkListStore" id="action-model">
6 <columns>6 <columns>
@@ -133,6 +133,7 @@
133 <property name="visible">True</property>133 <property name="visible">True</property>
134 <property name="can_focus">True</property>134 <property name="can_focus">True</property>
135 <property name="visibility">False</property>135 <property name="visibility">False</property>
136 <property name="activates_default">True</property>
136 </object>137 </object>
137 <packing>138 <packing>
138 <property name="left_attach">1</property>139 <property name="left_attach">1</property>
@@ -208,6 +209,7 @@
208 <property name="visibility">False</property>209 <property name="visibility">False</property>
209 <property name="secondary-icon-name">system-run-symbolic</property>210 <property name="secondary-icon-name">system-run-symbolic</property>
210 <property name="secondary-icon-tooltip-text" translatable="yes">Generate a password</property>211 <property name="secondary-icon-tooltip-text" translatable="yes">Generate a password</property>
212 <property name="activates_default">True</property>
211 </object>213 </object>
212 <packing>214 <packing>
213 <property name="position">0</property>215 <property name="position">0</property>
@@ -249,7 +251,7 @@
249 <object class="GtkLabel" id="strength-indicator-label">251 <object class="GtkLabel" id="strength-indicator-label">
250 <property name="visible">True</property>252 <property name="visible">True</property>
251 <property name="xalign">0</property>253 <property name="xalign">0</property>
252 <property name="label" translatable="yes">Fair</property>254 <property name="label"></property>
253 </object>255 </object>
254 <packing>256 <packing>
255 <property name="position">1</property>257 <property name="position">1</property>
@@ -289,6 +291,7 @@
289 <property name="visible">True</property>291 <property name="visible">True</property>
290 <property name="can_focus">True</property>292 <property name="can_focus">True</property>
291 <property name="visibility">False</property>293 <property name="visibility">False</property>
294 <property name="activates_default">True</property>
292 </object>295 </object>
293 <packing>296 <packing>
294 <property name="left_attach">1</property>297 <property name="left_attach">1</property>
@@ -394,6 +397,8 @@
394 <object class="GtkLabel" id="user-name">397 <object class="GtkLabel" id="user-name">
395 <property name="visible">True</property>398 <property name="visible">True</property>
396 <property name="xalign">0</property>399 <property name="xalign">0</property>
400 <property name="ellipsize">end</property>
401 <property name="max_width_chars">30</property>
397 <attributes>402 <attributes>
398 <attribute name="weight" value="bold"/>403 <attribute name="weight" value="bold"/>
399 <attribute name="scale" value="1.200000"/>404 <attribute name="scale" value="1.200000"/>
400405
=== modified file 'panels/user-accounts/data/photo-dialog.ui'
--- panels/user-accounts/data/photo-dialog.ui 2010-10-30 22:04:15 +0000
+++ panels/user-accounts/data/photo-dialog.ui 2014-02-24 09:46:44 +0000
@@ -1,5 +1,6 @@
1<?xml version="1.0"?>1<?xml version="1.0"?>
2<interface>2<interface>
3 <!-- interface-requires gtk+ 3.8 -->
3 <object class="GtkAdjustment" id="browse-scale-adjustment">4 <object class="GtkAdjustment" id="browse-scale-adjustment">
4 <property name="lower">0</property>5 <property name="lower">0</property>
5 <property name="upper">100</property>6 <property name="upper">100</property>
67
=== modified file 'panels/user-accounts/data/user-accounts-dialog.ui'
--- panels/user-accounts/data/user-accounts-dialog.ui 2014-02-14 03:32:04 +0000
+++ panels/user-accounts/data/user-accounts-dialog.ui 2014-02-24 09:46:44 +0000
@@ -1,6 +1,5 @@
1
2<interface>1<interface>
3 <requires lib="gtk+" version="2.16"/>2 <!-- interface-requires gtk+ 3.8 -->
4 <!-- interface-naming-policy toplevel-contextual -->3 <!-- interface-naming-policy toplevel-contextual -->
5 <object class="GtkListStore" id="shortname-model">4 <object class="GtkListStore" id="shortname-model">
6 <columns>5 <columns>
@@ -50,7 +49,7 @@
50 <child>49 <child>
51 <object class="GtkHBox" id="hbox2">50 <object class="GtkHBox" id="hbox2">
52 <property name="visible">True</property>51 <property name="visible">True</property>
53 <property name="spacing">12</property>52 <property name="spacing">18</property>
54 <child>53 <child>
55 <object class="GtkVBox" id="userlist-vbox">54 <object class="GtkVBox" id="userlist-vbox">
56 <property name="visible">True</property>55 <property name="visible">True</property>
@@ -131,16 +130,16 @@
131 <property name="orientation">vertical</property>130 <property name="orientation">vertical</property>
132 <property name="spacing">6</property>131 <property name="spacing">6</property>
133 <child>132 <child>
134 <object class="GtkTable" id="table1">133 <object class="GtkGrid" id="grid1">
135 <property name="visible">True</property>134 <property name="visible">True</property>
136 <property name="n_rows">7</property>135 <property name="can_focus">False</property>
137 <property name="n_columns">2</property>
138 <property name="column_spacing">10</property>136 <property name="column_spacing">10</property>
139 <child>137 <child>
140 <object class="GtkNotebook" id="account-fingerprint-notebook">138 <object class="GtkNotebook" id="account-fingerprint-notebook">
141 <property name="visible">True</property>139 <property name="visible">True</property>
142 <property name="show_tabs">False</property>140 <property name="show_tabs">False</property>
143 <property name="show_border">False</property>141 <property name="show_border">False</property>
142 <property name="hexpand">True</property>
144 <child>143 <child>
145 <object class="GtkLabel" id="account-fingerprint-value-label">144 <object class="GtkLabel" id="account-fingerprint-value-label">
146 <property name="visible">True</property>145 <property name="visible">True</property>
@@ -167,10 +166,9 @@
167 </object>166 </object>
168 <packing>167 <packing>
169 <property name="left_attach">1</property>168 <property name="left_attach">1</property>
170 <property name="right_attach">2</property>
171 <property name="top_attach">6</property>169 <property name="top_attach">6</property>
172 <property name="bottom_attach">7</property>170 <property name="width">1</property>
173 <property name="y_options">0</property>171 <property name="height">1</property>
174 </packing>172 </packing>
175 </child>173 </child>
176 <child>174 <child>
@@ -178,13 +176,13 @@
178 <property name="visible">True</property>176 <property name="visible">True</property>
179 <property name="model">account-type-model</property>177 <property name="model">account-type-model</property>
180 <property name="text-column">0</property>178 <property name="text-column">0</property>
179 <property name="hexpand">True</property>
181 </object>180 </object>
182 <packing>181 <packing>
183 <property name="left_attach">1</property>182 <property name="left_attach">1</property>
184 <property name="right_attach">2</property>
185 <property name="top_attach">1</property>183 <property name="top_attach">1</property>
186 <property name="bottom_attach">2</property>184 <property name="width">1</property>
187 <property name="y_options">0</property>185 <property name="height">1</property>
188 </packing>186 </packing>
189 </child>187 </child>
190 <child>188 <child>
@@ -199,10 +197,10 @@
199 </style>197 </style>
200 </object>198 </object>
201 <packing>199 <packing>
200 <property name="left_attach">0</property>
202 <property name="top_attach">1</property>201 <property name="top_attach">1</property>
203 <property name="bottom_attach">2</property>202 <property name="width">1</property>
204 <property name="x_options">GTK_FILL</property>203 <property name="height">1</property>
205 <property name="y_options">0</property>
206 </packing>204 </packing>
207 </child>205 </child>
208 <child>206 <child>
@@ -214,9 +212,11 @@
214 <property name="visible">True</property>212 <property name="visible">True</property>
215 <property name="scale">1.2</property>213 <property name="scale">1.2</property>
216 <property name="weight">700</property>214 <property name="weight">700</property>
215 <property name="width-chars">30</property>
216 <property name="max-width-chars">30</property>
217 <property name="ellipsize">PANGO_ELLIPSIZE_END</property>
217 </object>218 </object>
218 <packing>219 <packing>
219 <property name="expand">True</property>
220 <property name="fill">True</property>220 <property name="fill">True</property>
221 <property name="position">1</property>221 <property name="position">1</property>
222 </packing>222 </packing>
@@ -224,8 +224,9 @@
224 </object>224 </object>
225 <packing>225 <packing>
226 <property name="left_attach">1</property>226 <property name="left_attach">1</property>
227 <property name="right_attach">2</property>227 <property name="top_attach">0</property>
228 <property name="y_options">0</property>228 <property name="width">1</property>
229 <property name="height">1</property>
229 </packing>230 </packing>
230 </child>231 </child>
231 <child>232 <child>
@@ -239,10 +240,10 @@
239 </attributes>240 </attributes>
240 </object>241 </object>
241 <packing>242 <packing>
243 <property name="left_attach">0</property>
242 <property name="top_attach">3</property>244 <property name="top_attach">3</property>
243 <property name="bottom_attach">4</property>245 <property name="width">1</property>
244 <property name="x_options">GTK_FILL</property>246 <property name="height">1</property>
245 <property name="y_options">0</property>
246 </packing>247 </packing>
247 </child>248 </child>
248 <child>249 <child>
@@ -257,22 +258,22 @@
257 </style>258 </style>
258 </object>259 </object>
259 <packing>260 <packing>
261 <property name="left_attach">0</property>
260 <property name="top_attach">4</property>262 <property name="top_attach">4</property>
261 <property name="bottom_attach">5</property>263 <property name="width">1</property>
262 <property name="x_options">GTK_FILL</property>264 <property name="height">1</property>
263 <property name="y_options">0</property>
264 </packing>265 </packing>
265 </child>266 </child>
266 <child>267 <child>
267 <object class="UmEditableButton" id="account-password-button">268 <object class="UmEditableButton" id="account-password-button">
268 <property name="visible">True</property>269 <property name="visible">True</property>
270 <property name="hexpand">True</property>
269 </object>271 </object>
270 <packing>272 <packing>
271 <property name="left_attach">1</property>273 <property name="left_attach">1</property>
272 <property name="right_attach">2</property>
273 <property name="top_attach">4</property>274 <property name="top_attach">4</property>
274 <property name="bottom_attach">5</property>275 <property name="width">1</property>
275 <property name="y_options">0</property>276 <property name="height">1</property>
276 </packing>277 </packing>
277 </child>278 </child>
278 <child>279 <child>
@@ -287,10 +288,10 @@
287 </style>288 </style>
288 </object>289 </object>
289 <packing>290 <packing>
291 <property name="left_attach">0</property>
290 <property name="top_attach">5</property>292 <property name="top_attach">5</property>
291 <property name="bottom_attach">6</property>293 <property name="width">1</property>
292 <property name="x_options">GTK_FILL</property>294 <property name="height">1</property>
293 <property name="y_options">0</property>
294 </packing>295 </packing>
295 </child>296 </child>
296 <child>297 <child>
@@ -312,10 +313,9 @@
312 </object>313 </object>
313 <packing>314 <packing>
314 <property name="left_attach">1</property>315 <property name="left_attach">1</property>
315 <property name="right_attach">2</property>
316 <property name="top_attach">5</property>316 <property name="top_attach">5</property>
317 <property name="bottom_attach">6</property>317 <property name="width">1</property>
318 <property name="y_options">0</property>318 <property name="height">1</property>
319 </packing>319 </packing>
320 </child>320 </child>
321 <child>321 <child>
@@ -330,10 +330,10 @@
330 </style>330 </style>
331 </object>331 </object>
332 <packing>332 <packing>
333 <property name="left_attach">0</property>
333 <property name="top_attach">6</property>334 <property name="top_attach">6</property>
334 <property name="bottom_attach">7</property>335 <property name="width">1</property>
335 <property name="x_options">GTK_FILL</property>336 <property name="height">1</property>
336 <property name="y_options">0</property>
337 </packing>337 </packing>
338 </child>338 </child>
339 <child>339 <child>
@@ -342,6 +342,7 @@
342 <child>342 <child>
343 <object class="GtkLabel" id="label4">343 <object class="GtkLabel" id="label4">
344 <property name="visible">True</property>344 <property name="visible">True</property>
345 <property name="hexpand">True</property>
345 </object>346 </object>
346 <packing>347 <packing>
347 <property name="expand">True</property>348 <property name="expand">True</property>
@@ -399,8 +400,10 @@
399 </child>400 </child>
400 </object>401 </object>
401 <packing>402 <packing>
402 <property name="x_options">GTK_FILL</property>403 <property name="left_attach">0</property>
403 <property name="y_options">0</property>404 <property name="top_attach">0</property>
405 <property name="width">1</property>
406 <property name="height">1</property>
404 </packing>407 </packing>
405 </child>408 </child>
406 <child>409 <child>
@@ -415,10 +418,10 @@
415 </style>418 </style>
416 </object>419 </object>
417 <packing>420 <packing>
421 <property name="left_attach">0</property>
418 <property name="top_attach">2</property>422 <property name="top_attach">2</property>
419 <property name="bottom_attach">3</property>423 <property name="width">1</property>
420 <property name="x_options">GTK_FILL</property>424 <property name="height">1</property>
421 <property name="y_options">0</property>
422 </packing>425 </packing>
423 </child>426 </child>
424 <child>427 <child>
@@ -426,42 +429,76 @@
426 <property name="visible">True</property>429 <property name="visible">True</property>
427 <property name="model">language-model</property>430 <property name="model">language-model</property>
428 <property name="text-column">1</property>431 <property name="text-column">1</property>
432 <property name="hexpand">True</property>
429 </object>433 </object>
430 <packing>434 <packing>
431 <property name="left_attach">1</property>435 <property name="left_attach">1</property>
432 <property name="right_attach">2</property>
433 <property name="top_attach">2</property>436 <property name="top_attach">2</property>
434 <property name="bottom_attach">3</property>437 <property name="width">1</property>
435 <property name="x_options">GTK_FILL</property>438 <property name="height">1</property>
436 <property name="y_options">0</property>
437 </packing>439 </packing>
438 </child>440 </child>
439 <child>441 <child>
440 <object class="GtkLabel" id="show-login-name-spacer">442 <object class="GtkLabel" id="last-login-label">
441 <property name="visible">True</property>443 <property name="visible">True</property>
442 </object>444 <property name="xalign">1</property>
443 <packing>445 <property name="label" translatable="yes">Last Login</property>
444 <property name="right_attach">2</property>
445 <property name="top_attach">7</property>
446 <property name="bottom_attach">8</property>
447 </packing>
448 </child>
449 <child>
450 <object class="GtkCheckButton" id="show-login-name-checkbutton">
451 <property name="label" translatable="yes">_Show my login name in the menu bar</property>
452 <property name="use_underline">True</property>446 <property name="use_underline">True</property>
447 <property name="mnemonic_widget">last-login-value-label</property>
448 <style>
449 <class name="dim-label"/>
450 </style>
451 </object>
452 <packing>
453 <property name="left_attach">0</property>
454 <property name="top_attach">7</property>
455 <property name="width">1</property>
456 <property name="height">1</property>
457 </packing>
458 </child>
459 <child>
460 <object class="GtkGrid" id="last-login-grid">
453 <property name="visible">True</property>461 <property name="visible">True</property>
454 <property name="can_focus">True</property>462 <property name="can_focus">False</property>
455 <property name="receives_default">False</property>463 <child>
456 <property name="xalign">0</property>464 <object class="GtkLabel" id="last-login-value-label">
457 <property name="draw_indicator">True</property>465 <property name="visible">True</property>
466 <property name="can_focus">False</property>
467 <property name="margin_left">6</property>
468 <property name="margin_right">6</property>
469 <property name="margin_top">6</property>
470 <property name="margin_bottom">6</property>
471 <property name="hexpand">True</property>
472 <property name="xalign">0</property>
473 </object>
474 <packing>
475 <property name="left_attach">0</property>
476 <property name="top_attach">0</property>
477 <property name="width">1</property>
478 <property name="height">1</property>
479 </packing>
480 </child>
481 <child>
482 <object class="GtkButton" id="last-login-history-button">
483 <property name="label" translatable="yes">History</property>
484 <property name="visible">True</property>
485 <property name="can_focus">True</property>
486 <property name="receives_default">True</property>
487 <property name="xalign">1</property>
488 </object>
489 <packing>
490 <property name="left_attach">1</property>
491 <property name="top_attach">0</property>
492 <property name="width">1</property>
493 <property name="height">1</property>
494 </packing>
495 </child>
458 </object>496 </object>
459 <packing>497 <packing>
460 <property name="right_attach">2</property>498 <property name="left_attach">1</property>
461 <property name="top_attach">8</property>499 <property name="top_attach">7</property>
462 <property name="bottom_attach">9</property>500 <property name="width">1</property>
463 <property name="x_options">GTK_FILL</property>501 <property name="height">1</property>
464 <property name="y_options">0</property>
465 </packing>502 </packing>
466 </child>503 </child>
467 </object>504 </object>
@@ -471,6 +508,33 @@
471 <property name="position">0</property>508 <property name="position">0</property>
472 </packing>509 </packing>
473 </child>510 </child>
511 <child>
512 <object class="GtkLabel" id="show-login-name-spacer">
513 <property name="visible">True</property>
514 <property name="can_focus">False</property>
515 </object>
516 <packing>
517 <property name="expand">True</property>
518 <property name="fill">True</property>
519 <property name="position">1</property>
520 </packing>
521 </child>
522 <child>
523 <object class="GtkCheckButton" id="show-login-name-checkbutton">
524 <property name="label" translatable="yes">_Show my login name in the menu bar</property>
525 <property name="visible">True</property>
526 <property name="can_focus">True</property>
527 <property name="receives_default">False</property>
528 <property name="use_underline">True</property>
529 <property name="xalign">0</property>
530 <property name="draw_indicator">True</property>
531 </object>
532 <packing>
533 <property name="expand">False</property>
534 <property name="fill">True</property>
535 <property name="position">2</property>
536 </packing>
537 </child>
474 </object>538 </object>
475 <packing>539 <packing>
476 <property name="expand">True</property>540 <property name="expand">True</property>
477541
=== modified file 'panels/user-accounts/frob-account-dialog.c'
--- panels/user-accounts/frob-account-dialog.c 2012-06-12 10:03:29 +0000
+++ panels/user-accounts/frob-account-dialog.c 2014-02-24 09:46:44 +0000
@@ -27,13 +27,13 @@
27 gpointer user_data)27 gpointer user_data)
28{28{
29 GMainLoop *loop = user_data;29 GMainLoop *loop = user_data;
30 UmUser *user;30 ActUser *user;
3131
32 user = um_account_dialog_finish (UM_ACCOUNT_DIALOG (object), result);32 user = um_account_dialog_finish (UM_ACCOUNT_DIALOG (object), result);
33 if (user == NULL) {33 if (user == NULL) {
34 g_printerr ("No user created\n");34 g_printerr ("No user created\n");
35 } else {35 } else {
36 g_printerr ("User created: %s\n", um_user_get_user_name (user));36 g_printerr ("User created: %s\n", act_user_get_user_name (user));
37 g_object_unref (user);37 g_object_unref (user);
38 }38 }
3939
@@ -52,7 +52,7 @@
52 dialog = um_account_dialog_new ();52 dialog = um_account_dialog_new ();
53 loop = g_main_loop_new (NULL, FALSE);53 loop = g_main_loop_new (NULL, FALSE);
5454
55 um_account_dialog_show (dialog, NULL, on_dialog_complete, loop);55 um_account_dialog_show (dialog, NULL, NULL, on_dialog_complete, loop);
5656
57 g_main_loop_run (loop);57 g_main_loop_run (loop);
58 g_main_loop_unref (loop);58 g_main_loop_unref (loop);
5959
=== modified file 'panels/user-accounts/um-account-dialog.c'
--- panels/user-accounts/um-account-dialog.c 2012-12-12 11:57:06 +0000
+++ panels/user-accounts/um-account-dialog.c 2014-02-24 09:46:44 +0000
@@ -24,10 +24,10 @@
24#include <glib.h>24#include <glib.h>
25#include <glib/gi18n.h>25#include <glib/gi18n.h>
26#include <gtk/gtk.h>26#include <gtk/gtk.h>
27#include <act/act.h>
2728
28#include "um-account-dialog.h"29#include "um-account-dialog.h"
29#include "um-realm-manager.h"30#include "um-realm-manager.h"
30#include "um-user-manager.h"
31#include "um-utils.h"31#include "um-utils.h"
3232
33typedef enum {33typedef enum {
@@ -49,6 +49,9 @@
49 GAsyncResult *result,49 GAsyncResult *result,
50 gpointer user_data);50 gpointer user_data);
5151
52static void um_account_dialog_response (GtkDialog *dialog,
53 gint response_id);
54
52#define UM_ACCOUNT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UM_TYPE_ACCOUNT_DIALOG, \55#define UM_ACCOUNT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UM_TYPE_ACCOUNT_DIALOG, \
53 UmAccountDialogClass))56 UmAccountDialogClass))
54#define UM_IS_ACCOUNT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UM_TYPE_ACCOUNT_DIALOG))57#define UM_IS_ACCOUNT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UM_TYPE_ACCOUNT_DIALOG))
@@ -60,6 +63,7 @@
60 GtkWidget *container_widget;63 GtkWidget *container_widget;
61 GSimpleAsyncResult *async;64 GSimpleAsyncResult *async;
62 GCancellable *cancellable;65 GCancellable *cancellable;
66 GPermission *permission;
63 GtkSpinner *spinner;67 GtkSpinner *spinner;
6468
65 /* Buttons to switch modes between local/enterprise */69 /* Buttons to switch modes between local/enterprise */
@@ -149,7 +153,7 @@
149153
150static void154static void
151complete_dialog (UmAccountDialog *self,155complete_dialog (UmAccountDialog *self,
152 UmUser *user)156 ActUser *user)
153{157{
154 if (user != NULL) {158 if (user != NULL) {
155 g_simple_async_result_set_op_res_gpointer (self->async,159 g_simple_async_result_set_op_res_gpointer (self->async,
@@ -162,34 +166,48 @@
162}166}
163167
164static void168static void
165create_user_done (UmUserManager *manager,169user_loaded_cb (ActUser *user,
170 GParamSpec *pspec,
171 UmAccountDialog *self)
172{
173 finish_action (self);
174 complete_dialog (self, user);
175}
176
177static void
178create_user_done (ActUserManager *manager,
166 GAsyncResult *res,179 GAsyncResult *res,
167 UmAccountDialog *self)180 UmAccountDialog *self)
168{181{
169 UmUser *user;182 ActUser *user;
170 GError *error;183 GError *error;
171184
172 finish_action (self);
173
174 /* Note that user is returned without an extra reference */185 /* Note that user is returned without an extra reference */
175186
176 error = NULL;187 error = NULL;
177 if (!um_user_manager_create_user_finish (manager, res, &user, &error)) {188 user = act_user_manager_create_user_finish (manager, res, &error);
189
190 if (user == NULL) {
191 finish_action (self);
178 g_debug ("Failed to create user: %s", error->message);192 g_debug ("Failed to create user: %s", error->message);
179 if (!g_error_matches (error, UM_USER_MANAGER_ERROR, UM_USER_MANAGER_ERROR_PERMISSION_DENIED))193 if (!g_error_matches (error, ACT_USER_MANAGER_ERROR, ACT_USER_MANAGER_ERROR_PERMISSION_DENIED))
180 show_error_dialog (self, _("Failed to add account"), error);194 show_error_dialog (self, _("Failed to add account"), error);
181 g_error_free (error);195 g_error_free (error);
182 gtk_widget_grab_focus (self->local_name);196 gtk_widget_grab_focus (self->local_name);
183 } else {197 } else {
184 g_debug ("Created user: %s", um_user_get_user_name (user));198 g_debug ("Created user: %s", act_user_get_user_name (user));
185 complete_dialog (self, user);199 /* Check if the returned object is fully loaded before returning it */
200 if (act_user_is_loaded (user))
201 user_loaded_cb (user, NULL, self);
202 else
203 g_signal_connect (user, "notify::is-loaded", G_CALLBACK (user_loaded_cb), self);
186 }204 }
187}205}
188206
189static void207static void
190local_create_user (UmAccountDialog *self)208local_create_user (UmAccountDialog *self)
191{209{
192 UmUserManager *manager;210 ActUserManager *manager;
193 const gchar *username;211 const gchar *username;
194 const gchar *name;212 const gchar *name;
195 gint account_type;213 gint account_type;
@@ -206,16 +224,14 @@
206224
207 g_debug ("Creating local user: %s", username);225 g_debug ("Creating local user: %s", username);
208226
209 manager = um_user_manager_ref_default ();227 manager = act_user_manager_get_default ();
210 um_user_manager_create_user (manager,228 act_user_manager_create_user_async (manager,
211 username,229 username,
212 name,230 name,
213 account_type,231 account_type,
214 self->cancellable,232 self->cancellable,
215 (GAsyncReadyCallback)create_user_done,233 (GAsyncReadyCallback)create_user_done,
216 self,234 self);
217 NULL);
218 g_object_unref (manager);
219}235}
220236
221static gboolean237static gboolean
@@ -258,13 +274,19 @@
258 UmAccountDialog *self = UM_ACCOUNT_DIALOG (user_data);274 UmAccountDialog *self = UM_ACCOUNT_DIALOG (user_data);
259 GtkTreeModel *model;275 GtkTreeModel *model;
260 const char *name;276 const char *name;
277 GtkWidget *entry;
261278
262 model = gtk_combo_box_get_model (GTK_COMBO_BOX (self->local_username));279 model = gtk_combo_box_get_model (GTK_COMBO_BOX (self->local_username));
263 gtk_list_store_clear (GTK_LIST_STORE (model));280 gtk_list_store_clear (GTK_LIST_STORE (model));
264281
265 name = gtk_entry_get_text (GTK_ENTRY (editable));282 name = gtk_entry_get_text (GTK_ENTRY (editable));
266 generate_username_choices (name, GTK_LIST_STORE (model));283 if (strlen (name) == 0) {
267 gtk_combo_box_set_active (GTK_COMBO_BOX (self->local_username), 0);284 entry = gtk_bin_get_child (GTK_BIN (self->local_username));
285 gtk_entry_set_text (GTK_ENTRY (entry), "");
286 } else {
287 generate_username_choices (name, GTK_LIST_STORE (model));
288 gtk_combo_box_set_active (GTK_COMBO_BOX (self->local_username), 0);
289 }
268290
269 dialog_validate (self);291 dialog_validate (self);
270}292}
@@ -352,6 +374,7 @@
352 g_free (name);374 g_free (name);
353 if (match) {375 if (match) {
354 g_debug ("ignoring duplicate realm: %s", realm_name);376 g_debug ("ignoring duplicate realm: %s", realm_name);
377 g_object_unref (common);
355 return;378 return;
356 }379 }
357 ret = gtk_tree_model_iter_next (model, &iter);380 ret = gtk_tree_model_iter_next (model, &iter);
@@ -389,14 +412,13 @@
389{412{
390 UmAccountDialog *self = UM_ACCOUNT_DIALOG (user_data);413 UmAccountDialog *self = UM_ACCOUNT_DIALOG (user_data);
391 GError *error = NULL;414 GError *error = NULL;
392 UmUser *user = NULL;415 ActUser *user;
393416
394 um_user_manager_cache_user_finish (UM_USER_MANAGER (source),417 user = act_user_manager_cache_user_finish (ACT_USER_MANAGER (source), result, &error);
395 result, &user, &error);
396418
397 /* This is where we're finally done */419 /* This is where we're finally done */
398 if (error == NULL) {420 if (user != NULL) {
399 g_debug ("Successfully cached remote user: %s", um_user_get_user_name (user));421 g_debug ("Successfully cached remote user: %s", act_user_get_user_name (user));
400 finish_action (self);422 finish_action (self);
401 complete_dialog (self, user);423 complete_dialog (self, user);
402424
@@ -406,6 +428,8 @@
406 finish_action (self);428 finish_action (self);
407 g_error_free (error);429 g_error_free (error);
408 }430 }
431
432 g_object_unref (self);
409}433}
410434
411static void435static void
@@ -415,7 +439,7 @@
415{439{
416 UmAccountDialog *self = UM_ACCOUNT_DIALOG (user_data);440 UmAccountDialog *self = UM_ACCOUNT_DIALOG (user_data);
417 UmRealmCommon *common;441 UmRealmCommon *common;
418 UmUserManager *manager;442 ActUserManager *manager;
419 GError *error = NULL;443 GError *error = NULL;
420 gchar *login;444 gchar *login;
421445
@@ -428,18 +452,16 @@
428 * should also lookup information about this via the realm and make452 * should also lookup information about this via the realm and make
429 * sure all that is functional.453 * sure all that is functional.
430 */454 */
431 manager = um_user_manager_ref_default ();455 manager = act_user_manager_get_default ();
432 login = um_realm_calculate_login (common, gtk_entry_get_text (self->enterprise_login));456 login = um_realm_calculate_login (common, gtk_entry_get_text (self->enterprise_login));
433 g_return_if_fail (login != NULL);457 g_return_if_fail (login != NULL);
434458
435 g_debug ("Caching remote user: %s", login);459 g_debug ("Caching remote user: %s", login);
436460
437 um_user_manager_cache_user (manager, login, self->cancellable,461 act_user_manager_cache_user_async (manager, login, self->cancellable,
438 on_register_user, g_object_ref (self),462 on_register_user, g_object_ref (self));
439 g_object_unref);
440463
441 g_free (login);464 g_free (login);
442 g_object_unref (manager);
443465
444 } else {466 } else {
445 show_error_dialog (self, _("Failed to register account"), error);467 show_error_dialog (self, _("Failed to register account"), error);
@@ -645,9 +667,19 @@
645{667{
646 UmAccountDialog *self = UM_ACCOUNT_DIALOG (user_data);668 UmAccountDialog *self = UM_ACCOUNT_DIALOG (user_data);
647 GError *error = NULL;669 GError *error = NULL;
648 GBytes *creds;670 GBytes *creds = NULL;
649671
650 um_realm_login_finish (result, &creds, &error);672 um_realm_login_finish (result, &creds, &error);
673
674 /*
675 * User login is valid, but cannot authenticate right now (eg: user needs
676 * to change password at next login etc.)
677 */
678 if (g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_CANNOT_AUTH)) {
679 g_clear_error (&error);
680 creds = NULL;
681 }
682
651 if (error == NULL) {683 if (error == NULL) {
652684
653 /* Already joined to the domain, just register this user */685 /* Already joined to the domain, just register this user */
@@ -656,7 +688,8 @@
656 enterprise_permit_user_login (self);688 enterprise_permit_user_login (self);
657689
658 /* Join the domain, try using the user's creds */690 /* Join the domain, try using the user's creds */
659 } else if (!um_realm_join_as_user (self->selected_realm,691 } else if (creds == NULL ||
692 !um_realm_join_as_user (self->selected_realm,
660 gtk_entry_get_text (self->enterprise_login),693 gtk_entry_get_text (self->enterprise_login),
661 gtk_entry_get_text (self->enterprise_password),694 gtk_entry_get_text (self->enterprise_password),
662 creds, self->cancellable,695 creds, self->cancellable,
@@ -1024,7 +1057,6 @@
1024{1057{
1025 GtkBuilder *builder;1058 GtkBuilder *builder;
1026 GtkWidget *widget;1059 GtkWidget *widget;
1027 const gchar *filename;
1028 GError *error = NULL;1060 GError *error = NULL;
1029 GtkDialog *dialog;1061 GtkDialog *dialog;
1030 GtkWidget *content;1062 GtkWidget *content;
@@ -1033,10 +1065,9 @@
10331065
1034 builder = gtk_builder_new ();1066 builder = gtk_builder_new ();
10351067
1036 filename = UIDIR "/account-dialog.ui";1068 if (!gtk_builder_add_from_resource (builder,
1037 if (!g_file_test (filename, G_FILE_TEST_EXISTS))1069 "/org/gnome/control-center/user-accounts/account-dialog.ui",
1038 filename = "data/account-dialog.ui";1070 &error)) {
1039 if (!gtk_builder_add_from_file (builder, filename, &error)) {
1040 g_error ("%s", error->message);1071 g_error ("%s", error->message);
1041 g_error_free (error);1072 g_error_free (error);
1042 return;1073 return;
@@ -1069,6 +1100,7 @@
10691100
1070 gtk_dialog_add_button (dialog, _("Cancel"), GTK_RESPONSE_CANCEL);1101 gtk_dialog_add_button (dialog, _("Cancel"), GTK_RESPONSE_CANCEL);
1071 widget = gtk_dialog_add_button (dialog, _("_Add"), GTK_RESPONSE_OK);1102 widget = gtk_dialog_add_button (dialog, _("_Add"), GTK_RESPONSE_OK);
1103 gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);
1072 gtk_widget_grab_default (widget);1104 gtk_widget_grab_default (widget);
10731105
1074 widget = (GtkWidget *) gtk_builder_get_object (builder, "account-dialog");1106 widget = (GtkWidget *) gtk_builder_get_object (builder, "account-dialog");
@@ -1084,6 +1116,28 @@
1084}1116}
10851117
1086static void1118static void
1119on_permission_acquired (GObject *source_object,
1120 GAsyncResult *res,
1121 gpointer user_data)
1122{
1123 UmAccountDialog *self = UM_ACCOUNT_DIALOG (user_data);
1124 GError *error = NULL;
1125
1126 /* Paired with begin_action in um_account_dialog_response () */
1127 finish_action (self);
1128
1129 if (g_permission_acquire_finish (self->permission, res, &error)) {
1130 g_return_if_fail (g_permission_get_allowed (self->permission));
1131 um_account_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_OK);
1132 } else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
1133 g_warning ("Failed to acquire permission: %s", error->message);
1134 }
1135
1136 g_clear_error (&error);
1137 g_object_unref (self);
1138}
1139
1140static void
1087um_account_dialog_response (GtkDialog *dialog,1141um_account_dialog_response (GtkDialog *dialog,
1088 gint response_id)1142 gint response_id)
1089{1143{
@@ -1091,6 +1145,14 @@
10911145
1092 switch (response_id) {1146 switch (response_id) {
1093 case GTK_RESPONSE_OK:1147 case GTK_RESPONSE_OK:
1148 /* We don't (or no longer) have necessary permissions */
1149 if (self->permission && !g_permission_get_allowed (self->permission)) {
1150 begin_action (self);
1151 g_permission_acquire_async (self->permission, self->cancellable,
1152 on_permission_acquired, g_object_ref (self));
1153 return;
1154 }
1155
1094 switch (self->mode) {1156 switch (self->mode) {
1095 case UM_LOCAL:1157 case UM_LOCAL:
1096 local_create_user (self);1158 local_create_user (self);
@@ -1140,6 +1202,7 @@
11401202
1141 if (self->cancellable)1203 if (self->cancellable)
1142 g_object_unref (self->cancellable);1204 g_object_unref (self->cancellable);
1205 g_clear_object (&self->permission);
1143 g_object_unref (self->enterprise_realms);1206 g_object_unref (self->enterprise_realms);
11441207
1145 G_OBJECT_CLASS (um_account_dialog_parent_class)->finalize (obj);1208 G_OBJECT_CLASS (um_account_dialog_parent_class)->finalize (obj);
@@ -1166,6 +1229,7 @@
1166void1229void
1167um_account_dialog_show (UmAccountDialog *self,1230um_account_dialog_show (UmAccountDialog *self,
1168 GtkWindow *parent,1231 GtkWindow *parent,
1232 GPermission *permission,
1169 GAsyncReadyCallback callback,1233 GAsyncReadyCallback callback,
1170 gpointer user_data)1234 gpointer user_data)
1171{1235{
@@ -1181,6 +1245,9 @@
1181 g_object_unref (self->cancellable);1245 g_object_unref (self->cancellable);
1182 self->cancellable = g_cancellable_new ();1246 self->cancellable = g_cancellable_new ();
11831247
1248 g_clear_object (&self->permission);
1249 self->permission = permission ? g_object_ref (permission) : NULL;
1250
1184 local_prepare (self);1251 local_prepare (self);
1185 enterprise_prepare (self);1252 enterprise_prepare (self);
1186 mode_change (self, UM_LOCAL);1253 mode_change (self, UM_LOCAL);
@@ -1192,11 +1259,11 @@
1192 gtk_widget_grab_focus (self->local_name);1259 gtk_widget_grab_focus (self->local_name);
1193}1260}
11941261
1195UmUser *1262ActUser *
1196um_account_dialog_finish (UmAccountDialog *self,1263um_account_dialog_finish (UmAccountDialog *self,
1197 GAsyncResult *result)1264 GAsyncResult *result)
1198{1265{
1199 UmUser *user;1266 ActUser *user;
12001267
1201 g_return_val_if_fail (UM_IS_ACCOUNT_DIALOG (self), NULL);1268 g_return_val_if_fail (UM_IS_ACCOUNT_DIALOG (self), NULL);
1202 g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),1269 g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
12031270
=== modified file 'panels/user-accounts/um-account-dialog.h'
--- panels/user-accounts/um-account-dialog.h 2012-09-06 23:07:09 +0000
+++ panels/user-accounts/um-account-dialog.h 2014-02-24 09:46:44 +0000
@@ -22,8 +22,8 @@
22#ifndef __UM_ACCOUNT_DIALOG_H__22#ifndef __UM_ACCOUNT_DIALOG_H__
23#define __UM_ACCOUNT_DIALOG_H__23#define __UM_ACCOUNT_DIALOG_H__
2424
25#include <act/act.h>
25#include <gtk/gtk.h>26#include <gtk/gtk.h>
26#include "um-user.h"
2727
28G_BEGIN_DECLS28G_BEGIN_DECLS
2929
@@ -38,9 +38,10 @@
38UmAccountDialog *um_account_dialog_new (void);38UmAccountDialog *um_account_dialog_new (void);
39void um_account_dialog_show (UmAccountDialog *self,39void um_account_dialog_show (UmAccountDialog *self,
40 GtkWindow *parent,40 GtkWindow *parent,
41 GPermission *permission,
41 GAsyncReadyCallback callback,42 GAsyncReadyCallback callback,
42 gpointer user_data);43 gpointer user_data);
43UmUser * um_account_dialog_finish (UmAccountDialog *self,44ActUser * um_account_dialog_finish (UmAccountDialog *self,
44 GAsyncResult *result);45 GAsyncResult *result);
4546
46G_END_DECLS47G_END_DECLS
4748
=== modified file 'panels/user-accounts/um-fingerprint-dialog.c'
--- panels/user-accounts/um-fingerprint-dialog.c 2014-02-18 03:09:04 +0000
+++ panels/user-accounts/um-fingerprint-dialog.c 2014-02-24 09:46:44 +0000
@@ -256,7 +256,7 @@
256delete_fingerprints_question (GtkWindow *parent,256delete_fingerprints_question (GtkWindow *parent,
257 GtkWidget *label1,257 GtkWidget *label1,
258 GtkWidget *label2,258 GtkWidget *label2,
259 UmUser *user)259 ActUser *user)
260{260{
261 GtkWidget *question;261 GtkWidget *question;
262 GtkWidget *button;262 GtkWidget *button;
@@ -446,8 +446,8 @@
446446
447 data->num_stages_done++;447 data->num_stages_done++;
448 name = g_strdup_printf ("image%d", data->num_stages_done);448 name = g_strdup_printf ("image%d", data->num_stages_done);
449 path = g_build_filename (UM_PIXMAP_DIR, "print_ok.png", NULL);449 path = g_strdup_printf ("/org/gnome/control-center/user-accounts/print_ok.png");
450 gtk_image_set_from_file (GTK_IMAGE (WID (name)), path);450 gtk_image_set_from_resource (GTK_IMAGE (WID (name)), path);
451 g_free (name);451 g_free (name);
452 g_free (path);452 g_free (path);
453 }453 }
@@ -577,16 +577,12 @@
577 }577 }
578 /* And set the right image */578 /* And set the right image */
579 {579 {
580 char *filename;580 path = g_strdup_printf ("/org/gnome/control-center/user-accounts/%s.png", data->finger);
581
582 filename = g_strdup_printf ("%s.png", data->finger);
583 path = g_build_filename (UM_PIXMAP_DIR, filename, NULL);
584 g_free (filename);
585 }581 }
586 for (i = 1; i <= data->num_enroll_stages; i++) {582 for (i = 1; i <= data->num_enroll_stages; i++) {
587 char *name;583 char *name;
588 name = g_strdup_printf ("image%d", i);584 name = g_strdup_printf ("image%d", i);
589 gtk_image_set_from_file (GTK_IMAGE (WID (name)), path);585 gtk_image_set_from_resource (GTK_IMAGE (WID (name)), path);
590 g_free (name);586 g_free (name);
591 }587 }
592 g_free (path);588 g_free (path);
@@ -628,13 +624,12 @@
628enroll_fingerprints (GtkWindow *parent,624enroll_fingerprints (GtkWindow *parent,
629 GtkWidget *label1,625 GtkWidget *label1,
630 GtkWidget *label2,626 GtkWidget *label2,
631 UmUser *user)627 ActUser *user)
632{628{
633 GDBusProxy *device;629 GDBusProxy *device;
634 GtkBuilder *dialog;630 GtkBuilder *dialog;
635 EnrollData *data;631 EnrollData *data;
636 GtkWidget *ass;632 GtkWidget *ass;
637 const char *filename;
638 char *msg;633 char *msg;
639 GVariant *result;634 GVariant *result;
640 GError *error = NULL;635 GError *error = NULL;
@@ -692,10 +687,9 @@
692 }687 }
693688
694 dialog = gtk_builder_new ();689 dialog = gtk_builder_new ();
695 filename = UIDIR "/account-fingerprint.ui";690 if (!gtk_builder_add_from_resource (dialog,
696 if (!g_file_test (filename, G_FILE_TEST_EXISTS))691 "/org/gnome/control-center/user-accounts/account-fingerprint.ui",
697 filename = "data/account-fingerprint.ui";692 &error)) {
698 if (!gtk_builder_add_from_file (dialog, filename, &error)) {
699 g_error ("%s", error->message);693 g_error ("%s", error->message);
700 g_error_free (error);694 g_error_free (error);
701 return;695 return;
@@ -766,7 +760,7 @@
766fingerprint_button_clicked (GtkWindow *parent,760fingerprint_button_clicked (GtkWindow *parent,
767 GtkWidget *label1,761 GtkWidget *label1,
768 GtkWidget *label2,762 GtkWidget *label2,
769 UmUser *user)763 ActUser *user)
770{764{
771 bindtextdomain ("fprintd", GNOMELOCALEDIR);765 bindtextdomain ("fprintd", GNOMELOCALEDIR);
772 bind_textdomain_codeset ("fprintd", "UTF-8");766 bind_textdomain_codeset ("fprintd", "UTF-8");
773767
=== modified file 'panels/user-accounts/um-fingerprint-dialog.h'
--- panels/user-accounts/um-fingerprint-dialog.h 2010-10-30 22:04:15 +0000
+++ panels/user-accounts/um-fingerprint-dialog.h 2014-02-24 09:46:44 +0000
@@ -18,11 +18,11 @@
18 */18 */
1919
20#include <gtk/gtk.h>20#include <gtk/gtk.h>
21#include "um-user.h"21#include <act/act.h>
2222
23gboolean set_fingerprint_label (GtkWidget *label1,23gboolean set_fingerprint_label (GtkWidget *label1,
24 GtkWidget *label2);24 GtkWidget *label2);
25void fingerprint_button_clicked (GtkWindow *parent,25void fingerprint_button_clicked (GtkWindow *parent,
26 GtkWidget *label1,26 GtkWidget *label1,
27 GtkWidget *label2,27 GtkWidget *label2,
28 UmUser *user);28 ActUser *user);
2929
=== added file 'panels/user-accounts/um-history-dialog.c'
--- panels/user-accounts/um-history-dialog.c 1970-01-01 00:00:00 +0000
+++ panels/user-accounts/um-history-dialog.c 2014-02-24 09:46:44 +0000
@@ -0,0 +1,377 @@
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright 2012 Red Hat, Inc,
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 *
19 * Written by: Ondrej Holy <oholy@redhat.com>
20 */
21
22#include "config.h"
23
24#include <unistd.h>
25#include <stdlib.h>
26#include <sys/types.h>
27#include <sys/wait.h>
28
29#include <glib.h>
30#include <glib/gi18n.h>
31#include <gtk/gtk.h>
32#include <act/act.h>
33
34#include "um-history-dialog.h"
35#include "um-utils.h"
36
37struct _UmHistoryDialog {
38 GtkWidget *dialog;
39 GtkBuilder *builder;
40
41 GDateTime *week;
42 GDateTime *current_week;
43
44 ActUser *user;
45};
46
47typedef struct {
48 gint64 login_time;
49 gint64 logout_time;
50 const gchar *type;
51} UmLoginHistory;
52
53static GtkWidget *
54get_widget (UmHistoryDialog *um,
55 const char *name)
56{
57 return (GtkWidget *)gtk_builder_get_object (um->builder, name);
58}
59
60static void
61close_history_dialog (GtkButton *button,
62 UmHistoryDialog *um)
63{
64 gtk_widget_hide (um->dialog);
65
66 um_history_dialog_set_user (um, NULL);
67
68 if (um->week) {
69 g_date_time_unref (um->week);
70 um->week = NULL;
71 }
72
73 if (um->current_week) {
74 g_date_time_unref (um->current_week);
75 um->current_week = NULL;
76 }
77}
78
79static void
80show_week_label (UmHistoryDialog *um)
81{
82 gchar *label, *from, *to;
83 GDateTime *date;
84 GTimeSpan span;
85
86 span = g_date_time_difference (um->current_week, um->week);
87 if (span == 0) {
88 label = g_strdup (_("This Week"));
89 }
90 else if (span == G_TIME_SPAN_DAY * 7) {
91 label = g_strdup (_("Last Week"));
92 }
93 else {
94 date = g_date_time_add_days (um->week, 6);
95 from = g_date_time_format (um->week, "%b %e");
96 if (g_date_time_get_year (um->week) == g_date_time_get_year (um->current_week)) {
97 to = g_date_time_format (date, "%b %e");
98 }
99 else {
100 to = g_date_time_format (date, "%b %e, %Y");
101 }
102
103 label = g_strconcat (from, " - ", to, NULL);
104
105 g_date_time_unref (date);
106 g_free (from);
107 g_free (to);
108 }
109
110 gtk_label_set_label (GTK_LABEL (get_widget (um, "week-label")), label);
111
112 g_free (label);
113}
114
115static void
116clear_history (UmHistoryDialog *um)
117{
118 GtkWidget *grid;
119 GList *list, *it;
120
121 grid = get_widget (um, "history-grid");
122 list = gtk_container_get_children (GTK_CONTAINER (grid));
123 for (it = list; it != NULL; it = it->next) {
124 gtk_container_remove (GTK_CONTAINER (grid), GTK_WIDGET (it->data));
125 }
126 g_list_free (list);
127}
128
129static GArray *
130get_login_history (ActUser *user)
131{
132 GArray *login_history;
133 GVariantIter *iter, *iter2;
134 GVariant *variant;
135 const GVariant *value;
136 const gchar *key;
137 UmLoginHistory history;
138
139 login_history = NULL;
140 value = act_user_get_login_history (user);
141 g_variant_get ((GVariant *) value, "a(xxa{sv})", &iter);
142 while (g_variant_iter_loop (iter, "(xxa{sv})", &history.login_time, &history.logout_time, &iter2)) {
143 while (g_variant_iter_loop (iter2, "{sv}", &key, &variant)) {
144 if (g_strcmp0 (key, "type") == 0) {
145 history.type = g_variant_get_string (variant, NULL);
146 }
147 }
148
149 if (login_history == NULL) {
150 login_history = g_array_new (FALSE, TRUE, sizeof (UmLoginHistory));
151 }
152
153 g_array_append_val (login_history, history);
154 }
155
156 return login_history;
157}
158
159static void
160set_sensitivity (UmHistoryDialog *um)
161{
162 GArray *login_history;
163 UmLoginHistory history;
164 gboolean sensitive = FALSE;
165
166 login_history = get_login_history (um->user);
167 if (login_history != NULL) {
168 history = g_array_index (login_history, UmLoginHistory, 0);
169 sensitive = g_date_time_to_unix (um->week) > history.login_time;
170 g_array_free (login_history, TRUE);
171 }
172 gtk_widget_set_sensitive (get_widget (um, "previous-button"), sensitive);
173
174 sensitive = (g_date_time_compare (um->current_week, um->week) == 1);
175 gtk_widget_set_sensitive (get_widget (um, "next-button"), sensitive);
176}
177
178static void
179add_record (GtkWidget *grid, GDateTime *datetime, gchar *record_string, gint line)
180{
181 gchar *date, *time, *str;
182 GtkWidget *label;
183
184 date = get_smart_date (datetime);
185 time = g_date_time_format (datetime, "%k:%M");
186 str = g_strconcat (date, ", ", time, NULL);
187 label = gtk_label_new (str);
188 gtk_widget_set_halign (label, GTK_ALIGN_START);
189 gtk_grid_attach (GTK_GRID (grid), label, 1, line, 1, 1);
190 g_free (str);
191 g_free (date);
192 g_free (time);
193 g_date_time_unref (datetime);
194
195 label = gtk_label_new (record_string);
196 gtk_widget_set_halign (label, GTK_ALIGN_START);
197 gtk_grid_attach (GTK_GRID (grid), label, 2, line, 1, 1);
198}
199
200static void
201show_week (UmHistoryDialog *um)
202{
203 GArray *login_history;
204 GDateTime *datetime, *temp;
205 gint64 from, to;
206 gint i, line;
207 GtkWidget *grid;
208 UmLoginHistory history;
209
210 show_week_label (um);
211 clear_history (um);
212 set_sensitivity (um);
213
214 login_history = get_login_history (um->user);
215 if (login_history == NULL) {
216 return;
217 }
218
219 /* Find first record for week */
220 from = g_date_time_to_unix (um->week);
221 temp = g_date_time_add_weeks (um->week, 1);
222 to = g_date_time_to_unix (temp);
223 g_date_time_unref (temp);
224 for (i = login_history->len - 1; i >= 0; i--) {
225 history = g_array_index (login_history, UmLoginHistory, i);
226 if (history.login_time < to) {
227 break;
228 }
229 }
230
231 /* Add new session records */
232 grid = get_widget (um, "history-grid");
233 line = 0;
234 for (;i >= 0; i--) {
235 history = g_array_index (login_history, UmLoginHistory, i);
236 if (history.logout_time > 0 && history.logout_time < from) {
237 break;
238 }
239
240 /* Display only x-session and tty records */
241 if (!g_str_has_prefix (history.type, ":") &&
242 !g_str_has_prefix (history.type, "tty")&&
243 !g_str_has_prefix (history.type, "pts")) {
244 continue;
245 }
246
247 if (history.logout_time > 0 && history.logout_time < to) {
248 datetime = g_date_time_new_from_unix_local (history.logout_time);
249 add_record (grid, datetime, "Session Ended", line);
250 line++;
251 }
252
253 if (history.login_time >= from) {
254 datetime = g_date_time_new_from_unix_local (history.login_time);
255 add_record (grid, datetime, "Session Started", line);
256 line++;
257 }
258 }
259
260 gtk_widget_show_all (grid);
261
262 g_array_free (login_history, TRUE);
263}
264
265static void
266show_previous (GtkButton *button,
267 UmHistoryDialog *um)
268{
269 GDateTime *temp;
270
271 temp = um->week;
272 um->week = g_date_time_add_weeks (um->week, -1);
273 g_date_time_unref (temp);
274
275 show_week (um);
276}
277
278static void
279show_next (GtkButton *button,
280 UmHistoryDialog *um)
281{
282 GDateTime *temp;
283
284 temp = um->week;
285 um->week = g_date_time_add_weeks (um->week, 1);
286 g_date_time_unref (temp);
287
288 show_week (um);
289}
290
291void
292um_history_dialog_set_user (UmHistoryDialog *um,
293 ActUser *user)
294{
295 if (um->user) {
296 g_clear_object (&um->user);
297 }
298
299 if (user) {
300 um->user = g_object_ref (user);
301 }
302}
303
304void
305um_history_dialog_show (UmHistoryDialog *um,
306 GtkWindow *parent)
307{
308 GDateTime *temp, *local;
309
310 /* Set the first day of this week */
311 local = g_date_time_new_now_local ();
312 temp = g_date_time_new_local (g_date_time_get_year (local),
313 g_date_time_get_month (local),
314 g_date_time_get_day_of_month (local),
315 0, 0, 0);
316 um->week = g_date_time_add_days (temp, 1 - g_date_time_get_day_of_week (temp));
317 um->current_week = g_date_time_ref (um->week);
318 g_date_time_unref (local);
319 g_date_time_unref (temp);
320
321 show_week (um);
322
323 gtk_window_set_transient_for (GTK_WINDOW (um->dialog), parent);
324 gtk_window_present (GTK_WINDOW (um->dialog));
325}
326
327UmHistoryDialog *
328um_history_dialog_new (void)
329{
330 GError *error = NULL;
331 UmHistoryDialog *um;
332 GtkWidget *widget;
333
334 um = g_new0 (UmHistoryDialog, 1);
335 um->builder = gtk_builder_new ();
336
337 if (!gtk_builder_add_from_resource (um->builder, "/org/gnome/control-center/user-accounts/history-dialog.ui", &error)) {
338 g_error ("%s", error->message);
339 g_error_free (error);
340 g_free (um);
341
342 return NULL;
343 }
344
345 um->dialog = get_widget (um, "dialog");
346 g_signal_connect (um->dialog, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL);
347
348 widget = get_widget (um, "close-button");
349 g_signal_connect (widget, "clicked", G_CALLBACK (close_history_dialog), um);
350
351 widget = get_widget (um, "next-button");
352 g_signal_connect (widget, "clicked", G_CALLBACK (show_next), um);
353
354 widget = get_widget (um, "previous-button");
355 g_signal_connect (widget, "clicked", G_CALLBACK (show_previous), um);
356
357 return um;
358}
359
360void
361um_history_dialog_free (UmHistoryDialog *um)
362{
363 gtk_widget_destroy (um->dialog);
364
365 g_clear_object (&um->user);
366 g_clear_object (&um->builder);
367
368 if (um->week) {
369 g_date_time_unref (um->week);
370 }
371
372 if (um->current_week) {
373 g_date_time_unref (um->current_week);
374 }
375
376 g_free (um);
377}
0378
=== added file 'panels/user-accounts/um-history-dialog.h'
--- panels/user-accounts/um-history-dialog.h 1970-01-01 00:00:00 +0000
+++ panels/user-accounts/um-history-dialog.h 2014-02-24 09:46:44 +0000
@@ -0,0 +1,41 @@
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright 2012 Red Hat, Inc,
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 *
19 * Written by: Ondrej Holy <oholy@redhat.com>
20 */
21
22#ifndef __UM_HISTORY_DIALOG_H__
23#define __UM_HISTORY_DIALOG_H__
24
25#include <gtk/gtk.h>
26#include <act/act-user.h>
27
28G_BEGIN_DECLS
29
30typedef struct _UmHistoryDialog UmHistoryDialog;
31
32UmHistoryDialog *um_history_dialog_new (void);
33void um_history_dialog_free (UmHistoryDialog *dialog);
34void um_history_dialog_set_user (UmHistoryDialog *dialog,
35 ActUser *user);
36void um_history_dialog_show (UmHistoryDialog *dialog,
37 GtkWindow *parent);
38
39G_END_DECLS
40
41#endif
042
=== modified file 'panels/user-accounts/um-password-dialog.c'
--- panels/user-accounts/um-password-dialog.c 2013-11-28 04:33:51 +0000
+++ panels/user-accounts/um-password-dialog.c 2014-02-24 09:46:44 +0000
@@ -29,9 +29,9 @@
29#include <glib.h>29#include <glib.h>
30#include <glib/gi18n.h>30#include <glib/gi18n.h>
31#include <gtk/gtk.h>31#include <gtk/gtk.h>
32#include <act/act.h>
3233
33#include "um-password-dialog.h"34#include "um-password-dialog.h"
34#include "um-user-manager.h"
35#include "um-utils.h"35#include "um-utils.h"
36#include "run-passwd.h"36#include "run-passwd.h"
37#include "pw-utils.h"37#include "pw-utils.h"
@@ -51,7 +51,7 @@
51 GtkWidget *show_password_button;51 GtkWidget *show_password_button;
52 GtkWidget *ok_button;52 GtkWidget *ok_button;
5353
54 UmUser *user;54 ActUser *user;
55 gboolean using_ecryptfs;55 gboolean using_ecryptfs;
5656
57 GtkWidget *old_password_label;57 GtkWidget *old_password_label;
@@ -61,6 +61,39 @@
61 PasswdHandler *passwd_handler;61 PasswdHandler *passwd_handler;
62};62};
6363
64typedef enum {
65 UM_PASSWORD_DIALOG_MODE_NORMAL = 0,
66 UM_PASSWORD_DIALOG_MODE_SET_AT_LOGIN,
67 UM_PASSWORD_DIALOG_MODE_NO_PASSWORD,
68 UM_PASSWORD_DIALOG_MODE_LOCK_ACCOUNT,
69 UM_PASSWORD_DIALOG_MODE_UNLOCK_ACCOUNT
70} UmPasswordDialogMode;
71
72static int
73update_password_strength (UmPasswordDialog *um)
74{
75 const gchar *password;
76 const gchar *old_password;
77 const gchar *username;
78 gint strength_level;
79 const gchar *hint;
80 const gchar *long_hint;
81
82 password = gtk_entry_get_text (GTK_ENTRY (um->password_entry));
83 old_password = gtk_entry_get_text (GTK_ENTRY (um->old_password_entry));
84 username = act_user_get_user_name (um->user);
85
86 pw_strength (password, old_password, username,
87 &hint, &long_hint, &strength_level);
88
89 gtk_level_bar_set_value (GTK_LEVEL_BAR (um->strength_indicator), strength_level);
90 gtk_label_set_label (GTK_LABEL (um->strength_indicator_label), hint);
91 gtk_widget_set_tooltip_text (um->strength_indicator, long_hint);
92 gtk_widget_set_tooltip_text (um->strength_indicator_label, long_hint);
93
94 return strength_level;
95}
96
64static void97static void
65generate_one_password (GtkWidget *widget,98generate_one_password (GtkWidget *widget,
66 UmPasswordDialog *um)99 UmPasswordDialog *um)
@@ -198,26 +231,54 @@
198 password = gtk_entry_get_text (GTK_ENTRY (um->password_entry));231 password = gtk_entry_get_text (GTK_ENTRY (um->password_entry));
199 hint = gtk_entry_get_text (GTK_ENTRY (um->normal_hint_entry));232 hint = gtk_entry_get_text (GTK_ENTRY (um->normal_hint_entry));
200233
201 if (mode == 0 && um_user_get_uid (um->user) == getuid ()) {234 switch (mode) {
202 GdkDisplay *display;235 case UM_PASSWORD_DIALOG_MODE_NORMAL:
203 GdkCursor *cursor;236 act_user_set_password_mode (um->user, ACT_USER_PASSWORD_MODE_REGULAR);
204237 if (act_user_get_uid (um->user) == getuid ()) {
205 /* When setting a password for the current user,238 GdkDisplay *display;
206 * use passwd directly, to preserve the audit trail239 GdkCursor *cursor;
207 * and to e.g. update the keyring password.240
208 */241 /* When setting a password for the current user,
209 passwd_change_password (um->passwd_handler, password, (PasswdCallback) password_changed_cb, um);242 * use passwd directly, to preserve the audit trail
210 gtk_widget_set_sensitive (um->dialog, FALSE);243 * and to e.g. update the keyring password.
211 display = gtk_widget_get_display (um->dialog);244 */
212 cursor = gdk_cursor_new_for_display (display, GDK_WATCH);245 passwd_change_password (um->passwd_handler, password,
213 gdk_window_set_cursor (gtk_widget_get_window (um->dialog), cursor);246 (PasswdCallback) password_changed_cb, um);
214 gdk_display_flush (display);247 gtk_widget_set_sensitive (um->dialog, FALSE);
215 g_object_unref (cursor);248 display = gtk_widget_get_display (um->dialog);
216 }249 cursor = gdk_cursor_new_for_display (display, GDK_WATCH);
217 else {250 gdk_window_set_cursor (gtk_widget_get_window (um->dialog), cursor);
218 um_user_set_password (um->user, mode, password, hint);251 gdk_display_flush (display);
219 finish_password_change (um);252 g_object_unref (cursor);
220 }253 return;
254 }
255
256 act_user_set_password (um->user, password, hint);
257 break;
258
259 case UM_PASSWORD_DIALOG_MODE_SET_AT_LOGIN:
260 act_user_set_password_mode (um->user, ACT_USER_PASSWORD_MODE_SET_AT_LOGIN);
261 act_user_set_automatic_login (um->user, FALSE);
262 break;
263
264 case UM_PASSWORD_DIALOG_MODE_NO_PASSWORD:
265 act_user_set_password_mode (um->user, ACT_USER_PASSWORD_MODE_NONE);
266 break;
267
268 case UM_PASSWORD_DIALOG_MODE_LOCK_ACCOUNT:
269 act_user_set_locked (um->user, TRUE);
270 act_user_set_automatic_login (um->user, FALSE);
271 break;
272
273 case UM_PASSWORD_DIALOG_MODE_UNLOCK_ACCOUNT:
274 act_user_set_locked (um->user, FALSE);
275 break;
276
277 default:
278 g_assert_not_reached ();
279 }
280
281 finish_password_change (um);
221}282}
222283
223static void284static void
@@ -227,18 +288,27 @@
227 const gchar *old_password;288 const gchar *old_password;
228 const gchar *tooltip;289 const gchar *tooltip;
229 gboolean can_change;290 gboolean can_change;
291 int strength_level;
230292
231 password = gtk_entry_get_text (GTK_ENTRY (um->password_entry));293 password = gtk_entry_get_text (GTK_ENTRY (um->password_entry));
232 verify = gtk_entry_get_text (GTK_ENTRY (um->verify_entry));294 verify = gtk_entry_get_text (GTK_ENTRY (um->verify_entry));
233 old_password = gtk_entry_get_text (GTK_ENTRY (um->old_password_entry));295 old_password = gtk_entry_get_text (GTK_ENTRY (um->old_password_entry));
234296
235 if (strlen (password) < pw_min_length ()) {297 /* Don't update the password strength if we didn't enter anything */
298 if (password && *password == '\0' &&
299 verify && *verify == '\0' &&
300 old_password && *old_password == '\0')
301 return;
302
303 strength_level = update_password_strength (um);
304
305 if (strength_level < 1) {
236 can_change = FALSE;306 can_change = FALSE;
237 if (password[0] == '\0') {307 if (password[0] == '\0') {
238 tooltip = _("You need to enter a new password");308 tooltip = _("You need to enter a new password");
239 }309 }
240 else {310 else {
241 tooltip = _("The new password is too short");311 tooltip = _("The new password is not strong enough");
242 }312 }
243 }313 }
244 else if (strcmp (password, verify) != 0) {314 else if (strcmp (password, verify) != 0) {
@@ -312,29 +382,6 @@
312}382}
313383
314static void384static void
315update_password_strength (UmPasswordDialog *um)
316{
317 const gchar *password;
318 const gchar *old_password;
319 const gchar *username;
320 gint strength_level;
321 const gchar *hint;
322 const gchar *long_hint;
323
324 password = gtk_entry_get_text (GTK_ENTRY (um->password_entry));
325 old_password = gtk_entry_get_text (GTK_ENTRY (um->old_password_entry));
326 username = um_user_get_user_name (um->user);
327
328 pw_strength (password, old_password, username,
329 &hint, &long_hint, &strength_level);
330
331 gtk_level_bar_set_value (GTK_LEVEL_BAR (um->strength_indicator), strength_level);
332 gtk_label_set_label (GTK_LABEL (um->strength_indicator_label), hint);
333 gtk_widget_set_tooltip_text (um->strength_indicator, long_hint);
334 gtk_widget_set_tooltip_text (um->strength_indicator_label, long_hint);
335}
336
337static void
338update_password_match (UmPasswordDialog *um)385update_password_match (UmPasswordDialog *um)
339{386{
340 const char *password;387 const char *password;
@@ -405,6 +452,14 @@
405 GError *error,452 GError *error,
406 UmPasswordDialog *um)453 UmPasswordDialog *um)
407{454{
455 GtkTreeModel *model;
456 GtkTreeIter iter;
457 gint mode;
458
459 model = gtk_combo_box_get_model (GTK_COMBO_BOX (um->action_combo));
460 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (um->action_combo), &iter);
461 gtk_tree_model_get (model, &iter, 1, &mode, -1);
462
408 if (error) {463 if (error) {
409 um->old_password_ok = FALSE;464 um->old_password_ok = FALSE;
410 set_entry_validation_error (GTK_ENTRY (um->old_password_entry),465 set_entry_validation_error (GTK_ENTRY (um->old_password_entry),
@@ -415,6 +470,11 @@
415 clear_entry_validation_error (GTK_ENTRY (um->old_password_entry));470 clear_entry_validation_error (GTK_ENTRY (um->old_password_entry));
416 }471 }
417472
473 /* Check if we are still in normal mode */
474 if (mode != UM_PASSWORD_DIALOG_MODE_NORMAL){
475 return;
476 }
477
418 update_sensitivity (um);478 update_sensitivity (um);
419}479}
420480
@@ -510,7 +570,6 @@
510{570{
511 GtkBuilder *builder;571 GtkBuilder *builder;
512 GError *error;572 GError *error;
513 const gchar *filename;
514 UmPasswordDialog *um;573 UmPasswordDialog *um;
515 GtkWidget *widget;574 GtkWidget *widget;
516 const char *old_label;575 const char *old_label;
@@ -520,10 +579,9 @@
520 builder = gtk_builder_new ();579 builder = gtk_builder_new ();
521580
522 error = NULL;581 error = NULL;
523 filename = UIDIR "/password-dialog.ui";582 if (!gtk_builder_add_from_resource (builder,
524 if (!g_file_test (filename, G_FILE_TEST_EXISTS))583 "/org/gnome/control-center/user-accounts/password-dialog.ui",
525 filename = "data/password-dialog.ui";584 &error)) {
526 if (!gtk_builder_add_from_file (builder, filename, &error)) {
527 g_error ("%s", error->message);585 g_error ("%s", error->message);
528 g_error_free (error);586 g_error_free (error);
529 return NULL;587 return NULL;
@@ -662,7 +720,7 @@
662{720{
663 if (um->user) {721 if (um->user) {
664 gint mode; 722 gint mode;
665 gboolean locked = um_user_get_locked (um->user);723 gboolean locked = act_user_get_locked (um->user);
666724
667 gtk_tree_model_get (model, iter, 1, &mode, -1);725 gtk_tree_model_get (model, iter, 1, &mode, -1);
668726
@@ -672,10 +730,15 @@
672 if (mode == 2 && um->using_ecryptfs)730 if (mode == 2 && um->using_ecryptfs)
673 return FALSE;731 return FALSE;
674732
675 if (mode == 3 && locked)733 /* We don't allow the current user to disable their own account,
734 * as this can lead to them being 'locked out'.
735 */
736 if (mode == UM_PASSWORD_DIALOG_MODE_LOCK_ACCOUNT &&
737 (locked || act_user_get_uid (um->user) == getuid ()
738 || would_demote_only_admin (um->user)))
676 return FALSE;739 return FALSE;
677740
678 if (mode == 4 && !locked)741 if (mode == UM_PASSWORD_DIALOG_MODE_UNLOCK_ACCOUNT && !locked)
679 return FALSE;742 return FALSE;
680743
681 return TRUE;744 return TRUE;
@@ -686,7 +749,7 @@
686749
687void750void
688um_password_dialog_set_user (UmPasswordDialog *um,751um_password_dialog_set_user (UmPasswordDialog *um,
689 UmUser *user)752 ActUser *user)
690{753{
691 GdkPixbuf *pixbuf;754 GdkPixbuf *pixbuf;
692 GtkTreeModel *model;755 GtkTreeModel *model;
@@ -698,22 +761,22 @@
698 if (user) {761 if (user) {
699 um->user = g_object_ref (user);762 um->user = g_object_ref (user);
700763
701 um->using_ecryptfs = is_using_ecryptfs (um_user_get_user_name (user));764 um->using_ecryptfs = is_using_ecryptfs (act_user_get_user_name (user));
702765
703 pixbuf = um_user_render_icon (user, FALSE, 48);766 pixbuf = render_user_icon (user, UM_ICON_STYLE_NONE, 48);
704 gtk_image_set_from_pixbuf (GTK_IMAGE (um->user_icon), pixbuf);767 gtk_image_set_from_pixbuf (GTK_IMAGE (um->user_icon), pixbuf);
705 g_object_unref (pixbuf);768 g_object_unref (pixbuf);
706769
707 gtk_label_set_label (GTK_LABEL (um->user_name),770 gtk_label_set_label (GTK_LABEL (um->user_name),
708 um_user_get_real_name (user));771 act_user_get_real_name (user));
709772
710 gtk_entry_set_text (GTK_ENTRY (um->password_entry), "");773 gtk_entry_set_text (GTK_ENTRY (um->password_entry), "");
711 gtk_entry_set_text (GTK_ENTRY (um->verify_entry), "");774 gtk_entry_set_text (GTK_ENTRY (um->verify_entry), "");
712 gtk_entry_set_text (GTK_ENTRY (um->normal_hint_entry), "");775 gtk_entry_set_text (GTK_ENTRY (um->normal_hint_entry), "");
713 gtk_entry_set_text (GTK_ENTRY (um->old_password_entry), "");776 gtk_entry_set_text (GTK_ENTRY (um->old_password_entry), "");
714 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (um->show_password_button), FALSE);777 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (um->show_password_button), FALSE);
715 if (um_user_get_uid (um->user) == getuid () &&778 if (act_user_get_uid (um->user) == getuid () &&
716 um_user_get_password_mode (um->user) == UM_PASSWORD_MODE_REGULAR) {779 act_user_get_password_mode (um->user) == ACT_USER_PASSWORD_MODE_REGULAR) {
717 gtk_widget_show (um->old_password_label);780 gtk_widget_show (um->old_password_label);
718 gtk_widget_show (um->old_password_entry);781 gtk_widget_show (um->old_password_entry);
719 um->old_password_ok = FALSE;782 um->old_password_ok = FALSE;
@@ -723,7 +786,7 @@
723 gtk_widget_hide (um->old_password_entry);786 gtk_widget_hide (um->old_password_entry);
724 um->old_password_ok = TRUE;787 um->old_password_ok = TRUE;
725 }788 }
726 if (um_user_get_uid (um->user) == getuid()) {789 if (act_user_get_uid (um->user) == getuid()) {
727 if (um->passwd_handler != NULL)790 if (um->passwd_handler != NULL)
728 passwd_destroy (um->passwd_handler);791 passwd_destroy (um->passwd_handler);
729 um->passwd_handler = passwd_init ();792 um->passwd_handler = passwd_init ();
730793
=== modified file 'panels/user-accounts/um-password-dialog.h'
--- panels/user-accounts/um-password-dialog.h 2012-09-06 23:07:09 +0000
+++ panels/user-accounts/um-password-dialog.h 2014-02-24 09:46:44 +0000
@@ -23,7 +23,7 @@
23#define __UM_PASSWORD_DIALOG_H__23#define __UM_PASSWORD_DIALOG_H__
2424
25#include <gtk/gtk.h>25#include <gtk/gtk.h>
26#include "um-user.h"26#include <act/act.h>
2727
28G_BEGIN_DECLS28G_BEGIN_DECLS
2929
@@ -32,7 +32,7 @@
32UmPasswordDialog *um_password_dialog_new (void);32UmPasswordDialog *um_password_dialog_new (void);
33void um_password_dialog_free (UmPasswordDialog *dialog);33void um_password_dialog_free (UmPasswordDialog *dialog);
34void um_password_dialog_set_user (UmPasswordDialog *dialog,34void um_password_dialog_set_user (UmPasswordDialog *dialog,
35 UmUser *user);35 ActUser *user);
36void um_password_dialog_set_privileged (UmPasswordDialog *dialog,36void um_password_dialog_set_privileged (UmPasswordDialog *dialog,
37 gboolean privileged);37 gboolean privileged);
38void um_password_dialog_show (UmPasswordDialog *dialog,38void um_password_dialog_show (UmPasswordDialog *dialog,
3939
=== modified file 'panels/user-accounts/um-photo-dialog.c'
--- panels/user-accounts/um-photo-dialog.c 2014-02-18 03:09:04 +0000
+++ panels/user-accounts/um-photo-dialog.c 2014-02-24 09:46:44 +0000
@@ -26,6 +26,7 @@
26#include <glib.h>26#include <glib.h>
27#include <glib/gi18n.h>27#include <glib/gi18n.h>
28#include <gtk/gtk.h>28#include <gtk/gtk.h>
29#include <act/act.h>
29#define GNOME_DESKTOP_USE_UNSTABLE_API30#define GNOME_DESKTOP_USE_UNSTABLE_API
30#include <libgnome-desktop/gnome-desktop-thumbnail.h>31#include <libgnome-desktop/gnome-desktop-thumbnail.h>
3132
@@ -36,7 +37,6 @@
36#endif /* HAVE_CHEESE */37#endif /* HAVE_CHEESE */
3738
38#include "um-photo-dialog.h"39#include "um-photo-dialog.h"
39#include "um-user-manager.h"
40#include "um-crop-area.h"40#include "um-crop-area.h"
41#include "um-utils.h"41#include "um-utils.h"
4242
@@ -55,7 +55,7 @@
5555
56 GnomeDesktopThumbnailFactory *thumb_factory;56 GnomeDesktopThumbnailFactory *thumb_factory;
5757
58 UmUser *user;58 ActUser *user;
59};59};
6060
61static void61static void
@@ -74,7 +74,7 @@
74 pb = um_crop_area_get_picture (UM_CROP_AREA (um->crop_area));74 pb = um_crop_area_get_picture (UM_CROP_AREA (um->crop_area));
75 pb2 = gdk_pixbuf_scale_simple (pb, 96, 96, GDK_INTERP_BILINEAR);75 pb2 = gdk_pixbuf_scale_simple (pb, 96, 96, GDK_INTERP_BILINEAR);
7676
77 um_user_set_icon_data (um->user, pb2);77 set_user_icon_data (um->user, pb2);
7878
79 g_object_unref (pb2);79 g_object_unref (pb2);
80 g_object_unref (pb);80 g_object_unref (pb);
@@ -247,7 +247,7 @@
247none_icon_selected (GtkMenuItem *menuitem,247none_icon_selected (GtkMenuItem *menuitem,
248 UmPhotoDialog *um)248 UmPhotoDialog *um)
249{249{
250 um_user_set_icon_file (um->user, NULL);250 act_user_set_icon_file (um->user, "");
251}251}
252252
253static void253static void
@@ -276,7 +276,7 @@
276 g_object_get (G_OBJECT (dialog), "pixbuf", &pb, NULL);276 g_object_get (G_OBJECT (dialog), "pixbuf", &pb, NULL);
277 pb2 = gdk_pixbuf_scale_simple (pb, 96, 96, GDK_INTERP_BILINEAR);277 pb2 = gdk_pixbuf_scale_simple (pb, 96, 96, GDK_INTERP_BILINEAR);
278278
279 um_user_set_icon_data (um->user, pb2);279 set_user_icon_data (um->user, pb2);
280280
281 g_object_unref (pb2);281 g_object_unref (pb2);
282 g_object_unref (pb);282 g_object_unref (pb);
@@ -337,7 +337,7 @@
337 const char *filename;337 const char *filename;
338338
339 filename = g_object_get_data (G_OBJECT (menuitem), "filename");339 filename = g_object_get_data (G_OBJECT (menuitem), "filename");
340 um_user_set_icon_file (um->user, filename);340 act_user_set_icon_file (um->user, filename);
341}341}
342342
343static GtkWidget *343static GtkWidget *
@@ -458,7 +458,7 @@
458 y++;458 y++;
459459
460#ifdef HAVE_CHEESE460#ifdef HAVE_CHEESE
461 um->take_photo_menuitem = gtk_menu_item_new_with_label (_("Take a photo..."));461 um->take_photo_menuitem = gtk_menu_item_new_with_label (_("Take a photo…"));
462 gtk_menu_attach (GTK_MENU (menu), GTK_WIDGET (um->take_photo_menuitem),462 gtk_menu_attach (GTK_MENU (menu), GTK_WIDGET (um->take_photo_menuitem),
463 0, ROW_SPAN - 1, y, y + 1);463 0, ROW_SPAN - 1, y, y + 1);
464 g_signal_connect (G_OBJECT (um->take_photo_menuitem), "activate",464 g_signal_connect (G_OBJECT (um->take_photo_menuitem), "activate",
@@ -476,7 +476,7 @@
476 y++;476 y++;
477#endif /* HAVE_CHEESE */477#endif /* HAVE_CHEESE */
478478
479 menuitem = gtk_menu_item_new_with_label (_("Browse for more pictures..."));479 menuitem = gtk_menu_item_new_with_label (_("Browse for more pictures…"));
480 gtk_menu_attach (GTK_MENU (menu), GTK_WIDGET (menuitem),480 gtk_menu_attach (GTK_MENU (menu), GTK_WIDGET (menuitem),
481 0, ROW_SPAN - 1, y, y + 1);481 0, ROW_SPAN - 1, y, y + 1);
482 g_signal_connect (G_OBJECT (menuitem), "activate",482 g_signal_connect (G_OBJECT (menuitem), "activate",
@@ -652,11 +652,11 @@
652652
653void653void
654um_photo_dialog_set_user (UmPhotoDialog *um,654um_photo_dialog_set_user (UmPhotoDialog *um,
655 UmUser *user)655 ActUser *user)
656{656{
657 UmUserManager *manager;657 ActUserManager *manager;
658 GSList *list, *l;658 GSList *list, *l;
659 UmUser *u;659 ActUser *u;
660 GIcon *icon;660 GIcon *icon;
661 GEmblem *emblem;661 GEmblem *emblem;
662 GList *children, *c;662 GList *children, *c;
@@ -675,9 +675,8 @@
675 children = gtk_container_get_children (GTK_CONTAINER (um->photo_popup));675 children = gtk_container_get_children (GTK_CONTAINER (um->photo_popup));
676 g_list_foreach (children, (GFunc) clear_tip, NULL);676 g_list_foreach (children, (GFunc) clear_tip, NULL);
677677
678 manager = um_user_manager_ref_default ();678 manager = act_user_manager_get_default ();
679 list = um_user_manager_list_users (manager);679 list = act_user_manager_list_users (manager);
680 g_object_unref (manager);
681680
682 icon = g_themed_icon_new ("avatar-default");681 icon = g_themed_icon_new ("avatar-default");
683 emblem = g_emblem_new (icon);682 emblem = g_emblem_new (icon);
@@ -689,7 +688,7 @@
689 u = l->data;688 u = l->data;
690 if (u == user)689 if (u == user)
691 continue;690 continue;
692 filename = um_user_get_icon_file (u);691 filename = act_user_get_icon_file (u);
693 if (filename == NULL)692 if (filename == NULL)
694 continue;693 continue;
695 for (c = children; c; c = c->next) {694 for (c = children; c; c = c->next) {
@@ -702,7 +701,7 @@
702 char *tip;701 char *tip;
703702
704 tip = g_strdup_printf (_("Used by %s"),703 tip = g_strdup_printf (_("Used by %s"),
705 um_user_get_real_name (u));704 act_user_get_real_name (u));
706 set_tip (GTK_WIDGET (c->data), tip, emblem);705 set_tip (GTK_WIDGET (c->data), tip, emblem);
707 g_free (tip);706 g_free (tip);
708 break;707 break;
709708
=== modified file 'panels/user-accounts/um-photo-dialog.h'
--- panels/user-accounts/um-photo-dialog.h 2012-09-06 23:07:09 +0000
+++ panels/user-accounts/um-photo-dialog.h 2014-02-24 09:46:44 +0000
@@ -23,7 +23,7 @@
23#define __UM_PHOTO_DIALOG_H__23#define __UM_PHOTO_DIALOG_H__
2424
25#include <gtk/gtk.h>25#include <gtk/gtk.h>
26#include "um-user.h"26#include <act/act.h>
2727
28G_BEGIN_DECLS28G_BEGIN_DECLS
2929
@@ -32,7 +32,7 @@
32UmPhotoDialog *um_photo_dialog_new (GtkWidget *button);32UmPhotoDialog *um_photo_dialog_new (GtkWidget *button);
33void um_photo_dialog_free (UmPhotoDialog *dialog);33void um_photo_dialog_free (UmPhotoDialog *dialog);
34void um_photo_dialog_set_user (UmPhotoDialog *dialog,34void um_photo_dialog_set_user (UmPhotoDialog *dialog,
35 UmUser *user);35 ActUser *user);
3636
37G_END_DECLS37G_END_DECLS
3838
3939
=== modified file 'panels/user-accounts/um-realm-manager.c'
--- panels/user-accounts/um-realm-manager.c 2012-10-19 08:56:05 +0000
+++ panels/user-accounts/um-realm-manager.c 2014-02-24 09:46:44 +0000
@@ -537,6 +537,7 @@
537 GSimpleAsyncResult *async;537 GSimpleAsyncResult *async;
538 GVariant *contents;538 GVariant *contents;
539 GVariant *options;539 GVariant *options;
540 GVariant *option;
540 GVariant *creds;541 GVariant *creds;
541 const gchar *type;542 const gchar *type;
542543
@@ -569,7 +570,8 @@
569 }570 }
570571
571 creds = g_variant_new ("(ssv)", type, owner, contents);572 creds = g_variant_new ("(ssv)", type, owner, contents);
572 options = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0);573 option = g_variant_new ("{sv}", "manage-system", g_variant_new_boolean (FALSE));
574 options = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), &option, 1);
573575
574 g_debug ("Calling the Join() method with %s credentials", owner);576 g_debug ("Calling the Join() method with %s credentials", owner);
575577
@@ -801,18 +803,25 @@
801 break;803 break;
802804
803 case KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN:805 case KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN:
804 case KRB5KDC_ERR_CLIENT_REVOKED:
805 case KRB5KDC_ERR_KEY_EXP:
806 case KRB5KDC_ERR_POLICY:806 case KRB5KDC_ERR_POLICY:
807 case KRB5KDC_ERR_ETYPE_NOSUPP:
808 g_simple_async_result_set_error (async, UM_REALM_ERROR, UM_REALM_ERROR_BAD_LOGIN,807 g_simple_async_result_set_error (async, UM_REALM_ERROR, UM_REALM_ERROR_BAD_LOGIN,
809 _("Cannot log in as %s at the %s domain"),808 _("Cannot log in as %s at the %s domain"),
810 login->user, login->domain);809 login->user, login->domain);
811 break;810 break;
812 case KRB5KDC_ERR_PREAUTH_FAILED:811 case KRB5KDC_ERR_PREAUTH_FAILED:
812 case KRB5KRB_AP_ERR_BAD_INTEGRITY:
813 g_simple_async_result_set_error (async, UM_REALM_ERROR, UM_REALM_ERROR_BAD_PASSWORD,813 g_simple_async_result_set_error (async, UM_REALM_ERROR, UM_REALM_ERROR_BAD_PASSWORD,
814 _("Invalid password, please try again"));814 _("Invalid password, please try again"));
815 break;815 break;
816 case KRB5_PREAUTH_FAILED:
817 case KRB5KDC_ERR_KEY_EXP:
818 case KRB5KDC_ERR_CLIENT_REVOKED:
819 case KRB5KDC_ERR_ETYPE_NOSUPP:
820 case KRB5_PROG_ETYPE_NOSUPP:
821 g_simple_async_result_set_error (async, UM_REALM_ERROR, UM_REALM_ERROR_CANNOT_AUTH,
822 _("Cannot log in as %s at the %s domain"),
823 login->user, login->domain);
824 break;
816 default:825 default:
817 g_simple_async_result_set_error (async, UM_REALM_ERROR, UM_REALM_ERROR_GENERIC,826 g_simple_async_result_set_error (async, UM_REALM_ERROR, UM_REALM_ERROR_GENERIC,
818 _("Couldn't connect to the %s domain: %s"),827 _("Couldn't connect to the %s domain: %s"),
819828
=== modified file 'panels/user-accounts/um-realm-manager.h'
--- panels/user-accounts/um-realm-manager.h 2012-09-17 12:08:35 +0000
+++ panels/user-accounts/um-realm-manager.h 2014-02-24 09:46:44 +0000
@@ -29,6 +29,7 @@
29typedef enum {29typedef enum {
30 UM_REALM_ERROR_BAD_LOGIN,30 UM_REALM_ERROR_BAD_LOGIN,
31 UM_REALM_ERROR_BAD_PASSWORD,31 UM_REALM_ERROR_BAD_PASSWORD,
32 UM_REALM_ERROR_CANNOT_AUTH,
32 UM_REALM_ERROR_GENERIC,33 UM_REALM_ERROR_GENERIC,
33} UmRealmErrors;34} UmRealmErrors;
3435
3536
=== removed file 'panels/user-accounts/um-user-manager.c'
--- panels/user-accounts/um-user-manager.c 2012-09-06 23:07:09 +0000
+++ panels/user-accounts/um-user-manager.c 1970-01-01 00:00:00 +0000
@@ -1,734 +0,0 @@
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2009-2010 Red Hat, Inc.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 *
19 * Written by: Matthias Clasen <mclasen@redhat.com>
20 */
21
22#include "config.h"
23
24#include <stdlib.h>
25#include <stdio.h>
26#include <fcntl.h>
27#include <unistd.h>
28#include <string.h>
29#include <signal.h>
30#include <errno.h>
31#include <sys/stat.h>
32#include <sys/types.h>
33#include <pwd.h>
34
35#ifdef HAVE_PATHS_H
36#include <paths.h>
37#endif /* HAVE_PATHS_H */
38
39#include <glib.h>
40#include <glib/gi18n.h>
41#include <glib/gstdio.h>
42#include <glib-object.h>
43#include <gio/gio.h>
44
45#include "um-user-manager.h"
46
47enum {
48 USERS_LOADED,
49 USER_ADDED,
50 USER_REMOVED,
51 USER_CHANGED,
52 LAST_SIGNAL
53};
54
55static guint signals [LAST_SIGNAL] = { 0, };
56
57static void um_user_manager_class_init (UmUserManagerClass *klass);
58static void um_user_manager_init (UmUserManager *user_manager);
59static void um_user_manager_finalize (GObject *object);
60
61static gpointer user_manager_object = NULL;
62
63G_DEFINE_TYPE (UmUserManager, um_user_manager, G_TYPE_OBJECT)
64
65static void
66um_user_manager_class_init (UmUserManagerClass *klass)
67{
68 GObjectClass *object_class = G_OBJECT_CLASS (klass);
69
70 object_class->finalize = um_user_manager_finalize;
71
72 signals [USERS_LOADED] =
73 g_signal_new ("users-loaded",
74 G_TYPE_FROM_CLASS (klass),
75 G_SIGNAL_RUN_LAST,
76 G_STRUCT_OFFSET (UmUserManagerClass, users_loaded),
77 NULL, NULL,
78 g_cclosure_marshal_VOID__VOID,
79 G_TYPE_NONE, 0);
80
81 signals [USER_ADDED] =
82 g_signal_new ("user-added",
83 G_TYPE_FROM_CLASS (klass),
84 G_SIGNAL_RUN_LAST,
85 G_STRUCT_OFFSET (UmUserManagerClass, user_added),
86 NULL, NULL,
87 g_cclosure_marshal_VOID__OBJECT,
88 G_TYPE_NONE, 1, UM_TYPE_USER);
89 signals [USER_REMOVED] =
90 g_signal_new ("user-removed",
91 G_TYPE_FROM_CLASS (klass),
92 G_SIGNAL_RUN_LAST,
93 G_STRUCT_OFFSET (UmUserManagerClass, user_removed),
94 NULL, NULL,
95 g_cclosure_marshal_VOID__OBJECT,
96 G_TYPE_NONE, 1, UM_TYPE_USER);
97 signals [USER_CHANGED] =
98 g_signal_new ("user-changed",
99 G_TYPE_FROM_CLASS (klass),
100 G_SIGNAL_RUN_LAST,
101 G_STRUCT_OFFSET (UmUserManagerClass, user_changed),
102 NULL, NULL,
103 g_cclosure_marshal_VOID__OBJECT,
104 G_TYPE_NONE, 1, UM_TYPE_USER);
105}
106
107
108/* We maintain a ring for each group of users with the same real name.
109 * We need this to pick the right display names.
110 */
111static void
112remove_user_from_dupe_ring (UmUserManager *manager,
113 UmUser *user)
114{
115 GList *dupes;
116 UmUser *dup;
117
118 dup = NULL;
119 dupes = g_object_get_data (G_OBJECT (user), "dupes");
120
121 if (!dupes) {
122 goto out;
123 }
124
125 if (dupes->next == dupes->prev) {
126 dup = dupes->next->data;
127 g_list_free_1 (dupes->next);
128 g_object_set_data (G_OBJECT (dup), "dupes", NULL);
129 }
130 else {
131 dupes->next->prev = dupes->prev;
132 dupes->prev->next = dupes->next;
133 }
134
135 g_list_free_1 (dupes);
136 g_object_set_data (G_OBJECT (user), "dupes", NULL);
137
138out:
139 if (dup) {
140 um_user_show_short_display_name (dup);
141 g_signal_emit (manager, signals[USER_CHANGED], 0, dup);
142 }
143 um_user_show_short_display_name (user);
144 g_signal_emit (manager, signals[USER_CHANGED], 0, user);
145}
146
147static gboolean
148match_real_name_hrfunc (gpointer key,
149 gpointer value,
150 gpointer user)
151{
152 return (value != user && g_strcmp0 (um_user_get_real_name (user), um_user_get_real_name (value)) == 0);
153}
154
155static void
156add_user_to_dupe_ring (UmUserManager *manager,
157 UmUser *user)
158{
159 UmUser *dup;
160 GList *dupes;
161 GList *l;
162
163 dup = g_hash_table_find (manager->user_by_object_path,
164 match_real_name_hrfunc, user);
165
166 if (!dup) {
167 return;
168 }
169
170 dupes = g_object_get_data (G_OBJECT (dup), "dupes");
171 if (!dupes) {
172 dupes = g_list_append (NULL, dup);
173 g_object_set_data (G_OBJECT (dup), "dupes", dupes);
174 dupes->next = dupes->prev = dupes;
175 }
176 else {
177 dup = NULL;
178 }
179
180 l = g_list_append (NULL, user);
181 g_object_set_data (G_OBJECT (user), "dupes", l);
182 l->prev = dupes->prev;
183 dupes->prev->next = l;
184 l->next = dupes;
185 dupes->prev = l;
186
187 if (dup) {
188 um_user_show_full_display_name (dup);
189 g_signal_emit (manager, signals[USER_CHANGED], 0, dup);
190 }
191 um_user_show_full_display_name (user);
192 g_signal_emit (manager, signals[USER_CHANGED], 0, user);
193}
194
195static void
196user_changed_handler (UmUser *user,
197 UmUserManager *manager)
198{
199 remove_user_from_dupe_ring (manager, user);
200 add_user_to_dupe_ring (manager, user);
201 g_signal_emit (manager, signals[USER_CHANGED], 0, user);
202}
203
204static void
205user_added_handler (UmUserManager *manager,
206 const char *object_path)
207{
208 UmUser *user;
209
210 if (g_hash_table_lookup (manager->user_by_object_path, object_path))
211 return;
212
213 user = um_user_new_from_object_path (object_path);
214 if (!user)
215 return;
216
217 if (um_user_is_system_account (user)) {
218 g_object_unref (user);
219 return;
220 }
221
222 add_user_to_dupe_ring (manager, user);
223
224 g_signal_connect (user, "changed",
225 G_CALLBACK (user_changed_handler), manager);
226 g_hash_table_insert (manager->user_by_object_path, g_strdup (um_user_get_object_path (user)), g_object_ref (user));
227 g_hash_table_insert (manager->user_by_name, g_strdup (um_user_get_user_name (user)), g_object_ref (user));
228
229 g_signal_emit (manager, signals[USER_ADDED], 0, user);
230 g_object_unref (user);
231}
232
233static void
234user_deleted_handler (UmUserManager *manager,
235 const char *object_path)
236{
237 UmUser *user;
238
239 user = g_hash_table_lookup (manager->user_by_object_path, object_path);
240 if (!user)
241 return;
242 g_object_ref (user);
243 g_signal_handlers_disconnect_by_func (user, user_changed_handler, manager);
244
245 remove_user_from_dupe_ring (manager, user);
246
247 g_hash_table_remove (manager->user_by_object_path, um_user_get_object_path (user));
248 g_hash_table_remove (manager->user_by_name, um_user_get_user_name (user));
249 g_signal_emit (manager, signals[USER_REMOVED], 0, user);
250 g_object_unref (user);
251}
252
253static void
254manager_signal_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, UmUserManager *manager)
255{
256 if (strcmp (signal_name, "UserAdded") == 0) {
257 if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)"))) {
258 gchar *object_path;
259 g_variant_get (parameters, "(&o)", &object_path);
260 user_added_handler (manager, object_path);
261 }
262 }
263 else if (strcmp (signal_name, "UserDeleted") == 0) {
264 if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)"))) {
265 gchar *object_path;
266 g_variant_get (parameters, "(&o)", &object_path);
267 user_deleted_handler (manager, object_path);
268 }
269 }
270}
271
272static void
273got_users (GObject *object,
274 GAsyncResult *res,
275 gpointer data)
276{
277 UmUserManager *manager = data;
278 GVariant *result;
279 GError *error = NULL;
280
281 result = g_dbus_proxy_call_finish (G_DBUS_PROXY (object), res, &error);
282 if (!result) {
283 manager->no_service = TRUE;
284 g_error_free (error);
285 goto done;
286 }
287
288 if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(ao)"))) {
289 GVariantIter *iter;
290 gchar *object_path;
291
292 g_variant_get (result, "(ao)", &iter);
293 while (g_variant_iter_loop (iter, "&o", &object_path))
294 user_added_handler (manager, object_path);
295 g_variant_iter_free (iter);
296 }
297
298 g_variant_unref (result);
299
300 done:
301 g_signal_emit (G_OBJECT (manager), signals[USERS_LOADED], 0);
302}
303
304static void
305get_users (UmUserManager *manager)
306{
307 g_debug ("calling 'ListCachedUsers'");
308 g_dbus_proxy_call (manager->proxy,
309 "ListCachedUsers",
310 g_variant_new ("()"),
311 G_DBUS_CALL_FLAGS_NONE,
312 -1,
313 NULL,
314 got_users,
315 manager);
316}
317
318static void
319um_user_manager_init (UmUserManager *manager)
320{
321 GError *error = NULL;
322 GDBusConnection *bus;
323
324 manager->user_by_object_path = g_hash_table_new_full (g_str_hash,
325 g_str_equal,
326 g_free,
327 g_object_unref);
328 manager->user_by_name = g_hash_table_new_full (g_str_hash,
329 g_str_equal,
330 g_free,
331 g_object_unref);
332
333 bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
334 if (bus == NULL) {
335 g_warning ("Couldn't connect to system bus: %s", error->message);
336 g_error_free (error);
337 return;
338 }
339
340 manager->proxy = g_dbus_proxy_new_sync (bus,
341 G_DBUS_PROXY_FLAGS_NONE,
342 NULL,
343 "org.freedesktop.Accounts",
344 "/org/freedesktop/Accounts",
345 "org.freedesktop.Accounts",
346 NULL,
347 &error);
348 if (manager->proxy == NULL) {
349 g_warning ("Couldn't get accounts proxy: %s", error->message);
350 g_error_free (error);
351 return;
352 }
353
354 g_signal_connect (manager->proxy, "g-signal", G_CALLBACK (manager_signal_cb), manager);
355
356 get_users (manager);
357}
358
359static void
360clear_dup (gpointer key,
361 gpointer value,
362 gpointer data)
363{
364 GList *dupes;
365
366 /* don't bother maintaining the ring, we're destroying the
367 * entire hash table anyway
368 */
369 dupes = g_object_get_data (G_OBJECT (value), "dupes");
370
371 if (dupes) {
372 g_list_free_1 (dupes);
373 g_object_set_data (G_OBJECT (value), "dupes", NULL);
374 }
375}
376
377static void
378um_user_manager_finalize (GObject *object)
379{
380 UmUserManager *manager;
381
382 manager = UM_USER_MANAGER (object);
383
384 g_hash_table_foreach (manager->user_by_object_path, clear_dup, NULL);
385 g_hash_table_destroy (manager->user_by_object_path);
386 g_hash_table_destroy (manager->user_by_name);
387
388 g_object_unref (manager->proxy);
389
390 G_OBJECT_CLASS (um_user_manager_parent_class)->finalize (object);
391}
392
393UmUserManager *
394um_user_manager_ref_default (void)
395{
396 if (user_manager_object != NULL) {
397 g_object_ref (user_manager_object);
398 } else {
399 user_manager_object = g_object_new (UM_TYPE_USER_MANAGER, NULL);
400 g_object_add_weak_pointer (user_manager_object,
401 (gpointer *) &user_manager_object);
402 }
403
404 return UM_USER_MANAGER (user_manager_object);
405}
406
407typedef struct {
408 UmUserManager *manager;
409 gchar *user_name;
410 GAsyncReadyCallback callback;
411 gpointer data;
412 GDestroyNotify destroy;
413} AsyncUserOpData;
414
415static void
416async_user_op_data_free (gpointer d)
417{
418 AsyncUserOpData *data = d;
419
420 g_object_unref (data->manager);
421
422 g_free (data->user_name);
423
424 if (data->destroy)
425 data->destroy (data->data);
426
427 g_free (data);
428}
429
430/* Used for both create_user and cache_user */
431static void
432user_call_done (GObject *proxy,
433 GAsyncResult *r,
434 gpointer user_data)
435{
436 AsyncUserOpData *data = user_data;
437 GSimpleAsyncResult *res;
438 GVariant *result;
439 GError *error = NULL;
440 gchar *remote;
441
442 res = g_simple_async_result_new (G_OBJECT (data->manager),
443 data->callback,
444 data->data,
445 um_user_manager_create_user);
446 result = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), r, &error);
447 if (!result) {
448 /* dbus-glib fail:
449 * We have to translate the errors manually here, since
450 * calling dbus_g_error_has_name on the error returned in
451 * um_user_manager_create_user_finish doesn't work.
452 */
453 remote = g_dbus_error_get_remote_error (error);
454 if (g_dbus_error_is_remote_error (error) &&
455 strcmp (remote, "org.freedesktop.Accounts.Error.PermissionDenied") == 0) {
456 g_simple_async_result_set_error (res,
457 UM_USER_MANAGER_ERROR,
458 UM_USER_MANAGER_ERROR_PERMISSION_DENIED,
459 "Not authorized");
460 }
461 if (g_dbus_error_is_remote_error (error) &&
462 strcmp (remote, "org.freedesktop.Accounts.Error.UserExists") == 0) {
463 g_simple_async_result_set_error (res,
464 UM_USER_MANAGER_ERROR,
465 UM_USER_MANAGER_ERROR_USER_EXISTS,
466 _("A user with name '%s' already exists."),
467 data->user_name);
468 } else if (g_dbus_error_is_remote_error (error) &&
469 strcmp (remote, "org.freedesktop.Accounts.Error.UserDoesNotExist") == 0) {
470 g_simple_async_result_set_error (res,
471 UM_USER_MANAGER_ERROR,
472 UM_USER_MANAGER_ERROR_USER_DOES_NOT_EXIST,
473 _("No user with the name '%s' exists."),
474 data->user_name);
475 }
476 else {
477 g_simple_async_result_set_from_error (res, error);
478 }
479 g_error_free (error);
480 g_free (remote);
481 }
482 else {
483 if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(o)"))) {
484 gchar *path;
485 g_variant_get (result, "(o)", &path);
486 g_simple_async_result_set_op_res_gpointer (res, path, g_free);
487 }
488 else
489 g_simple_async_result_set_error (res,
490 UM_USER_MANAGER_ERROR,
491 UM_USER_MANAGER_ERROR_FAILED,
492 "Got invalid response from AccountsService");
493 g_variant_unref (result);
494 }
495
496 data->callback (G_OBJECT (data->manager), G_ASYNC_RESULT (res), data->data);
497 async_user_op_data_free (data);
498 g_object_unref (res);
499}
500
501gboolean
502um_user_manager_create_user_finish (UmUserManager *manager,
503 GAsyncResult *result,
504 UmUser **user,
505 GError **error)
506{
507 gchar *path;
508 GSimpleAsyncResult *res;
509
510 res = G_SIMPLE_ASYNC_RESULT (result);
511
512 *user = NULL;
513
514 if (g_simple_async_result_propagate_error (res, error)) {
515 return FALSE;
516 }
517
518 path = g_simple_async_result_get_op_res_gpointer (res);
519 *user = g_hash_table_lookup (manager->user_by_object_path, path);
520
521 return TRUE;
522}
523
524void
525um_user_manager_create_user (UmUserManager *manager,
526 const char *user_name,
527 const char *real_name,
528 gint account_type,
529 GCancellable *cancellable,
530 GAsyncReadyCallback done,
531 gpointer done_data,
532 GDestroyNotify destroy)
533{
534 AsyncUserOpData *data;
535
536 data = g_new0 (AsyncUserOpData, 1);
537 data->manager = g_object_ref (manager);
538 data->user_name = g_strdup (user_name);
539 data->callback = done;
540 data->data = done_data;
541 data->destroy = destroy;
542
543 g_dbus_proxy_call (manager->proxy,
544 "CreateUser",
545 g_variant_new ("(ssi)", user_name, real_name, account_type),
546 G_DBUS_CALL_FLAGS_NONE,
547 -1,
548 cancellable,
549 user_call_done,
550 data);
551}
552
553gboolean
554um_user_manager_cache_user_finish (UmUserManager *manager,
555 GAsyncResult *result,
556 UmUser **user,
557 GError **error)
558{
559 gchar *path;
560 GSimpleAsyncResult *res;
561
562 res = G_SIMPLE_ASYNC_RESULT (result);
563
564 *user = NULL;
565
566 if (g_simple_async_result_propagate_error (res, error)) {
567 return FALSE;
568 }
569
570 path = g_simple_async_result_get_op_res_gpointer (res);
571 *user = g_hash_table_lookup (manager->user_by_object_path, path);
572
573 return TRUE;
574}
575
576void
577um_user_manager_cache_user (UmUserManager *manager,
578 const char *user_name,
579 GCancellable *cancellable,
580 GAsyncReadyCallback done,
581 gpointer done_data,
582 GDestroyNotify destroy)
583{
584 AsyncUserOpData *data;
585
586 data = g_new0 (AsyncUserOpData, 1);
587 data->manager = g_object_ref (manager);
588 data->user_name = g_strdup (user_name);
589 data->callback = done;
590 data->data = done_data;
591 data->destroy = destroy;
592
593 g_dbus_proxy_call (manager->proxy,
594 "CacheUser",
595 g_variant_new ("(s)", user_name),
596 G_DBUS_CALL_FLAGS_NONE,
597 -1,
598 cancellable,
599 user_call_done,
600 data);
601}
602
603static void
604delete_user_done (GObject *proxy,
605 GAsyncResult *r,
606 gpointer user_data)
607{
608 AsyncUserOpData *data = user_data;
609 GSimpleAsyncResult *res;
610 GVariant *result;
611 GError *error = NULL;
612
613 res = g_simple_async_result_new (G_OBJECT (data->manager),
614 data->callback,
615 data->data,
616 um_user_manager_delete_user);
617 result = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), r, &error);
618 if (!result) {
619 if (g_dbus_error_is_remote_error (error) &&
620 strcmp (g_dbus_error_get_remote_error(error), "org.freedesktop.Accounts.Error.PermissionDenied") == 0) {
621 g_simple_async_result_set_error (res,
622 UM_USER_MANAGER_ERROR,
623 UM_USER_MANAGER_ERROR_PERMISSION_DENIED,
624 "Not authorized");
625 }
626 else if (g_dbus_error_is_remote_error (error) &&
627 strcmp (g_dbus_error_get_remote_error(error), "org.freedesktop.Accounts.Error.UserExists") == 0) {
628 g_simple_async_result_set_error (res,
629 UM_USER_MANAGER_ERROR,
630 UM_USER_MANAGER_ERROR_USER_DOES_NOT_EXIST,
631 _("This user does not exist."));
632 }
633 else {
634 g_simple_async_result_set_from_error (res, error);
635 g_error_free (error);
636 }
637 }
638 else
639 g_variant_unref (result);
640
641 data->callback (G_OBJECT (data->manager), G_ASYNC_RESULT (res), data->data);
642 async_user_op_data_free (data);
643 g_object_unref (res);
644}
645
646gboolean
647um_user_manager_delete_user_finish (UmUserManager *manager,
648 GAsyncResult *result,
649 GError **error)
650{
651 GSimpleAsyncResult *res;
652
653 res = G_SIMPLE_ASYNC_RESULT (result);
654
655 if (g_simple_async_result_propagate_error (res, error)) {
656 return FALSE;
657 }
658
659 return TRUE;
660}
661
662void
663um_user_manager_delete_user (UmUserManager *manager,
664 UmUser *user,
665 gboolean remove_files,
666 GAsyncReadyCallback done,
667 gpointer done_data,
668 GDestroyNotify destroy)
669{
670 AsyncUserOpData *data;
671
672 data = g_new0 (AsyncUserOpData, 1);
673 data->manager = g_object_ref (manager);
674 data->callback = done;
675 data->data = done_data;
676 data->destroy = destroy;
677
678 g_dbus_proxy_call (manager->proxy,
679 "DeleteUser",
680 g_variant_new ("(xb)", (gint64) um_user_get_uid (user), remove_files),
681 G_DBUS_CALL_FLAGS_NONE,
682 -1,
683 NULL,
684 delete_user_done,
685 data);
686}
687
688GSList *
689um_user_manager_list_users (UmUserManager *manager)
690{
691 GSList *list = NULL;
692 GHashTableIter iter;
693 gpointer value;
694
695 g_hash_table_iter_init (&iter, manager->user_by_name);
696 while (g_hash_table_iter_next (&iter, NULL, &value)) {
697 list = g_slist_prepend (list, value);
698 }
699
700 return g_slist_sort (list, (GCompareFunc) um_user_collate);
701}
702
703UmUser *
704um_user_manager_get_user (UmUserManager *manager,
705 const gchar *name)
706{
707 return g_hash_table_lookup (manager->user_by_name, name);
708}
709
710UmUser *
711um_user_manager_get_user_by_id (UmUserManager *manager,
712 uid_t uid)
713{
714 struct passwd *pwent;
715
716 pwent = getpwuid (uid);
717 if (!pwent) {
718 return NULL;
719 }
720
721 return um_user_manager_get_user (manager, pwent->pw_name);
722}
723
724gboolean
725um_user_manager_no_service (UmUserManager *manager)
726{
727 return manager->no_service;
728}
729
730GQuark
731um_user_manager_error_quark (void)
732{
733 return g_quark_from_static_string ("um-user-manager-error-quark");
734}
7350
=== removed file 'panels/user-accounts/um-user-manager.h'
--- panels/user-accounts/um-user-manager.h 2012-09-06 23:07:09 +0000
+++ panels/user-accounts/um-user-manager.h 1970-01-01 00:00:00 +0000
@@ -1,121 +0,0 @@
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2009-2010 Red Hat, Inc.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 *
19 */
20
21#ifndef __UM_USER_MANAGER__
22#define __UM_USER_MANAGER__
23
24#include <glib-object.h>
25#include <gio/gio.h>
26
27#include "um-user.h"
28
29G_BEGIN_DECLS
30
31#define UM_TYPE_USER_MANAGER (um_user_manager_get_type ())
32#define UM_USER_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_TYPE_USER_MANAGER, UmUserManager))
33#define UM_USER_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), UM_TYPE_USER_MANAGER, UmUserManagerClass))
34#define UM_IS_USER_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_TYPE_USER_MANAGER))
35#define UM_IS_USER_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), UM_TYPE_USER_MANAGER))
36#define UM_USER_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), UM_TYPE_USER_MANAGER, UmUserManagerClass))
37
38typedef struct
39{
40 GObject parent;
41
42 GDBusProxy *proxy;
43
44 GHashTable *user_by_object_path;
45 GHashTable *user_by_name;
46
47 gboolean no_service;
48} UmUserManager;
49
50typedef struct
51{
52 GObjectClass parent_class;
53
54 void (* users_loaded) (UmUserManager *user_managaer);
55 void (* user_added) (UmUserManager *user_manager,
56 UmUser *user);
57 void (* user_removed) (UmUserManager *user_manager,
58 UmUser *user);
59 void (* user_changed) (UmUserManager *user_manager,
60 UmUser *user);
61} UmUserManagerClass;
62
63
64typedef enum {
65 UM_USER_MANAGER_ERROR_FAILED,
66 UM_USER_MANAGER_ERROR_USER_EXISTS,
67 UM_USER_MANAGER_ERROR_USER_DOES_NOT_EXIST,
68 UM_USER_MANAGER_ERROR_PERMISSION_DENIED
69} UmUserManagerError;
70
71#define UM_USER_MANAGER_ERROR um_user_manager_error_quark ()
72
73GQuark um_user_manager_error_quark (void);
74
75GType um_user_manager_get_type (void);
76
77UmUserManager * um_user_manager_ref_default (void);
78
79gboolean um_user_manager_no_service (UmUserManager *manager);
80
81GSList * um_user_manager_list_users (UmUserManager *manager);
82UmUser * um_user_manager_get_user (UmUserManager *manager,
83 const char *user_name);
84UmUser * um_user_manager_get_user_by_id (UmUserManager *manager,
85 uid_t uid);
86
87void um_user_manager_create_user (UmUserManager *manager,
88 const char *user_name,
89 const char *real_name,
90 gint account_type,
91 GCancellable *cancellable,
92 GAsyncReadyCallback done,
93 gpointer user_data,
94 GDestroyNotify destroy);
95gboolean um_user_manager_create_user_finish (UmUserManager *manager,
96 GAsyncResult *result,
97 UmUser **user,
98 GError **error);
99void um_user_manager_cache_user (UmUserManager *manager,
100 const char *user_name,
101 GCancellable *cancellable,
102 GAsyncReadyCallback done,
103 gpointer user_data,
104 GDestroyNotify destroy);
105gboolean um_user_manager_cache_user_finish (UmUserManager *manager,
106 GAsyncResult *result,
107 UmUser **user,
108 GError **error);
109void um_user_manager_delete_user (UmUserManager *manager,
110 UmUser *user,
111 gboolean remove_files,
112 GAsyncReadyCallback done,
113 gpointer user_data,
114 GDestroyNotify destroy);
115gboolean um_user_manager_delete_user_finish (UmUserManager *manager,
116 GAsyncResult *result,
117 GError **error);
118
119G_END_DECLS
120
121#endif /* __UM_USER_MANAGER__ */
1220
=== modified file 'panels/user-accounts/um-user-module.c'
--- panels/user-accounts/um-user-module.c 2012-09-06 23:07:09 +0000
+++ panels/user-accounts/um-user-module.c 2014-02-24 09:46:44 +0000
@@ -39,7 +39,7 @@
39#endif39#endif
4040
41 /* register the panel */41 /* register the panel */
42 um_user_panel_register (module);42 cc_user_panel_register (module);
43}43}
4444
45void45void
4646
=== modified file 'panels/user-accounts/um-user-panel.c'
--- panels/user-accounts/um-user-panel.c 2014-02-20 09:30:01 +0000
+++ panels/user-accounts/um-user-panel.c 2014-02-24 09:46:44 +0000
@@ -32,6 +32,7 @@
32#include <glib/gi18n.h>32#include <glib/gi18n.h>
33#include <gtk/gtk.h>33#include <gtk/gtk.h>
34#include <polkit/polkit.h>34#include <polkit/polkit.h>
35#include <act/act.h>
3536
36#ifdef HAVE_CHEESE37#ifdef HAVE_CHEESE
37#include <gst/gst.h>38#include <gst/gst.h>
@@ -39,9 +40,6 @@
3940
40#include "shell/cc-editable-entry.h"41#include "shell/cc-editable-entry.h"
4142
42#include "um-user.h"
43#include "um-user-manager.h"
44
45#include "um-editable-button.h"43#include "um-editable-button.h"
46#include "um-editable-combo.h"44#include "um-editable-combo.h"
4745
@@ -51,19 +49,21 @@
51#include "um-photo-dialog.h"49#include "um-photo-dialog.h"
52#include "um-fingerprint-dialog.h"50#include "um-fingerprint-dialog.h"
53#include "um-utils.h"51#include "um-utils.h"
52#include "um-resources.h"
53#include "um-history-dialog.h"
5454
55#include "cc-common-language.h"55#include "cc-common-language.h"
5656
57#define USER_ACCOUNTS_PERMISSION "com.canonical.controlcenter.user-accounts.administration"57#define USER_ACCOUNTS_PERMISSION "com.canonical.controlcenter.user-accounts.administration"
58#define INDICATOR_SESSION_SCHEMA "com.canonical.indicator.session"58#define INDICATOR_SESSION_SCHEMA "com.canonical.indicator.session"
5959
60CC_PANEL_REGISTER (UmUserPanel, um_user_panel)60CC_PANEL_REGISTER (CcUserPanel, cc_user_panel)
6161
62#define UM_USER_PANEL_PRIVATE(o) \62#define UM_USER_PANEL_PRIVATE(o) \
63 (G_TYPE_INSTANCE_GET_PRIVATE ((o), UM_TYPE_USER_PANEL, UmUserPanelPrivate))63 (G_TYPE_INSTANCE_GET_PRIVATE ((o), UM_TYPE_USER_PANEL, CcUserPanelPrivate))
6464
65struct _UmUserPanelPrivate {65struct _CcUserPanelPrivate {
66 UmUserManager *um;66 ActUserManager *um;
67 GtkBuilder *builder;67 GtkBuilder *builder;
6868
69 GtkWidget *main_box;69 GtkWidget *main_box;
@@ -72,12 +72,17 @@
7272
73 UmPasswordDialog *password_dialog;73 UmPasswordDialog *password_dialog;
74 UmPhotoDialog *photo_dialog;74 UmPhotoDialog *photo_dialog;
75 UmHistoryDialog *history_dialog;
76 gint other_accounts;
77 GtkTreeIter *other_iter;
78
79 UmAccountDialog *account_dialog;
7580
76 GSettings *indicator_session_schema;81 GSettings *indicator_session_schema;
77};82};
7883
79static GtkWidget *84static GtkWidget *
80get_widget (UmUserPanelPrivate *d, const char *name)85get_widget (CcUserPanelPrivate *d, const char *name)
81{86{
82 return (GtkWidget *)gtk_builder_get_object (d->builder, name);87 return (GtkWidget *)gtk_builder_get_object (d->builder, name);
83}88}
@@ -94,14 +99,14 @@
94 NUM_USER_LIST_COLS99 NUM_USER_LIST_COLS
95};100};
96101
97static UmUser *102static ActUser *
98get_selected_user (UmUserPanelPrivate *d)103get_selected_user (CcUserPanelPrivate *d)
99{104{
100 GtkTreeView *tv;105 GtkTreeView *tv;
101 GtkTreeIter iter;106 GtkTreeIter iter;
102 GtkTreeSelection *selection;107 GtkTreeSelection *selection;
103 GtkTreeModel *model;108 GtkTreeModel *model;
104 UmUser *user;109 ActUser *user;
105110
106 tv = (GtkTreeView *)get_widget (d, "list-treeview");111 tv = (GtkTreeView *)get_widget (d, "list-treeview");
107 selection = gtk_tree_view_get_selection (tv);112 selection = gtk_tree_view_get_selection (tv);
@@ -115,15 +120,15 @@
115}120}
116121
117static char *122static char *
118get_name_col_str (UmUser *user)123get_name_col_str (ActUser *user)
119{124{
120 return g_markup_printf_escaped ("<b>%s</b>\n<small>%s</small>",125 return g_markup_printf_escaped ("<b>%s</b>\n<small>%s</small>",
121 um_user_get_display_name (user),126 act_user_get_real_name (user),
122 um_user_get_user_name (user));127 act_user_get_user_name (user));
123}128}
124129
125static void130static void
126user_added (UmUserManager *um, UmUser *user, UmUserPanelPrivate *d)131user_added (ActUserManager *um, ActUser *user, CcUserPanelPrivate *d)
127{132{
128 GtkWidget *widget;133 GtkWidget *widget;
129 GtkTreeModel *model;134 GtkTreeModel *model;
@@ -131,26 +136,31 @@
131 GtkTreeIter iter;136 GtkTreeIter iter;
132 GtkTreeIter dummy;137 GtkTreeIter dummy;
133 GdkPixbuf *pixbuf;138 GdkPixbuf *pixbuf;
134 gchar *text;139 gchar *text, *title;
135 GtkTreeSelection *selection;140 GtkTreeSelection *selection;
136 gint sort_key;141 gint sort_key;
137 gboolean is_autologin;142 gboolean is_autologin;
138143
139 g_debug ("user added: %d %s\n", um_user_get_uid (user), um_user_get_real_name (user));144 if (act_user_is_system_account (user)) {
145 return;
146 }
147
148 g_debug ("user added: %d %s\n", act_user_get_uid (user), act_user_get_real_name (user));
140 widget = get_widget (d, "list-treeview");149 widget = get_widget (d, "list-treeview");
141 model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));150 model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
142 store = GTK_LIST_STORE (model);151 store = GTK_LIST_STORE (model);
143 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));152 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
144153
145 pixbuf = um_user_render_icon (user, TRUE, 48);154 pixbuf = render_user_icon (user, UM_ICON_STYLE_FRAME | UM_ICON_STYLE_STATUS, 48);
146 text = get_name_col_str (user);155 text = get_name_col_str (user);
147156
148 is_autologin = um_user_get_automatic_login (user);157 is_autologin = act_user_get_automatic_login (user);
149158
150 if (um_user_get_uid (user) == getuid ()) {159 if (act_user_get_uid (user) == getuid ()) {
151 sort_key = 1;160 sort_key = 1;
152 }161 }
153 else {162 else {
163 d->other_accounts++;
154 sort_key = 3;164 sort_key = 3;
155 }165 }
156 gtk_list_store_append (store, &iter);166 gtk_list_store_append (store, &iter);
@@ -172,6 +182,19 @@
172 !gtk_tree_selection_get_selected (selection, &model, &dummy)) {182 !gtk_tree_selection_get_selected (selection, &model, &dummy)) {
173 gtk_tree_selection_select_iter (selection, &iter);183 gtk_tree_selection_select_iter (selection, &iter);
174 }184 }
185
186 /* Show heading for other accounts if new one have been added. */
187 if (d->other_accounts == 1 && sort_key == 3) {
188 title = g_strdup_printf ("<small><span foreground=\"#555555\">%s</span></small>", _("Other Accounts"));
189 gtk_list_store_append (store, &iter);
190 gtk_list_store_set (store, &iter,
191 TITLE_COL, title,
192 HEADING_ROW_COL, TRUE,
193 SORT_KEY_COL, 2,
194 -1);
195 d->other_iter = gtk_tree_iter_copy (&iter);
196 g_free (title);
197 }
175}198}
176199
177static void200static void
@@ -180,7 +203,7 @@
180 GtkTreeIter *prev)203 GtkTreeIter *prev)
181{204{
182 GtkTreePath *path;205 GtkTreePath *path;
183 UmUser *user;206 ActUser *user;
184207
185 path = gtk_tree_model_get_path (model, iter);208 path = gtk_tree_model_get_path (model, iter);
186 while (gtk_tree_path_prev (path)) {209 while (gtk_tree_path_prev (path)) {
@@ -199,7 +222,7 @@
199 GtkTreeIter *iter,222 GtkTreeIter *iter,
200 GtkTreeIter *next)223 GtkTreeIter *next)
201{224{
202 UmUser *user;225 ActUser *user;
203226
204 *next = *iter;227 *next = *iter;
205 while (gtk_tree_model_iter_next (model, next)) {228 while (gtk_tree_model_iter_next (model, next)) {
@@ -214,28 +237,32 @@
214}237}
215238
216static void239static void
217user_removed (UmUserManager *um, UmUser *user, UmUserPanelPrivate *d)240user_removed (ActUserManager *um, ActUser *user, CcUserPanelPrivate *d)
218{241{
219 GtkTreeView *tv;242 GtkTreeView *tv;
220 GtkTreeModel *model;243 GtkTreeModel *model;
221 GtkTreeSelection *selection;244 GtkTreeSelection *selection;
222 GtkListStore *store;245 GtkListStore *store;
223 GtkTreeIter iter, next;246 GtkTreeIter iter, next;
224 UmUser *u;247 ActUser *u;
248 gint key;
225249
226 g_debug ("user removed: %s\n", um_user_get_user_name (user));250 g_debug ("user removed: %s\n", act_user_get_user_name (user));
227 tv = (GtkTreeView *)get_widget (d, "list-treeview");251 tv = (GtkTreeView *)get_widget (d, "list-treeview");
228 selection = gtk_tree_view_get_selection (tv);252 selection = gtk_tree_view_get_selection (tv);
229 model = gtk_tree_view_get_model (tv);253 model = gtk_tree_view_get_model (tv);
230 store = GTK_LIST_STORE (model);254 store = GTK_LIST_STORE (model);
231 if (gtk_tree_model_get_iter_first (model, &iter)) {255 if (gtk_tree_model_get_iter_first (model, &iter)) {
232 do {256 do {
233 gtk_tree_model_get (model, &iter, USER_COL, &u, -1);257 gtk_tree_model_get (model, &iter, USER_COL, &u, SORT_KEY_COL, &key, -1);
234258
235 if (u != NULL) {259 if (u != NULL) {
236 if (um_user_get_uid (user) == um_user_get_uid (u)) {260 if (act_user_get_uid (user) == act_user_get_uid (u)) {
237 if (!get_next_user_row (model, &iter, &next))261 if (!get_next_user_row (model, &iter, &next))
238 get_previous_user_row (model, &iter, &next);262 get_previous_user_row (model, &iter, &next);
263 if (key == 3) {
264 d->other_accounts--;
265 }
239 gtk_list_store_remove (store, &iter);266 gtk_list_store_remove (store, &iter);
240 gtk_tree_selection_select_iter (selection, &next);267 gtk_tree_selection_select_iter (selection, &next);
241 g_object_unref (u);268 g_object_unref (u);
@@ -245,18 +272,25 @@
245 }272 }
246 } while (gtk_tree_model_iter_next (model, &iter));273 } while (gtk_tree_model_iter_next (model, &iter));
247 }274 }
275
276 /* Hide heading for other accounts if last one have been removed. */
277 if (d->other_iter != NULL && d->other_accounts == 0 && key == 3) {
278 gtk_list_store_remove (store, d->other_iter);
279 gtk_tree_iter_free (d->other_iter);
280 d->other_iter = NULL;
281 }
248}282}
249283
250static void show_user (UmUser *user, UmUserPanelPrivate *d);284static void show_user (ActUser *user, CcUserPanelPrivate *d);
251285
252static void286static void
253user_changed (UmUserManager *um, UmUser *user, UmUserPanelPrivate *d)287user_changed (ActUserManager *um, ActUser *user, CcUserPanelPrivate *d)
254{288{
255 GtkTreeView *tv;289 GtkTreeView *tv;
256 GtkTreeSelection *selection;290 GtkTreeSelection *selection;
257 GtkTreeModel *model;291 GtkTreeModel *model;
258 GtkTreeIter iter;292 GtkTreeIter iter;
259 UmUser *current;293 ActUser *current;
260 GdkPixbuf *pixbuf;294 GdkPixbuf *pixbuf;
261 char *text;295 char *text;
262 gboolean is_autologin;296 gboolean is_autologin;
@@ -269,9 +303,9 @@
269 do {303 do {
270 gtk_tree_model_get (model, &iter, USER_COL, &current, -1);304 gtk_tree_model_get (model, &iter, USER_COL, &current, -1);
271 if (current == user) {305 if (current == user) {
272 pixbuf = um_user_render_icon (user, TRUE, 48);306 pixbuf = render_user_icon (user, UM_ICON_STYLE_FRAME | UM_ICON_STYLE_STATUS, 48);
273 text = get_name_col_str (user);307 text = get_name_col_str (user);
274 is_autologin = um_user_get_automatic_login (user);308 is_autologin = act_user_get_automatic_login (user);
275309
276 gtk_list_store_set (GTK_LIST_STORE (model), &iter,310 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
277 USER_COL, user,311 USER_COL, user,
@@ -306,19 +340,21 @@
306 GAsyncResult *result,340 GAsyncResult *result,
307 gpointer user_data)341 gpointer user_data)
308{342{
309 UmUserPanelPrivate *d = user_data;343 CcUserPanelPrivate *d = user_data;
310 UmAccountDialog *dialog;344 UmAccountDialog *dialog;
311 GtkTreeView *tv;345 GtkTreeView *tv;
312 GtkTreeModel *model;346 GtkTreeModel *model;
313 GtkTreeSelection *selection;347 GtkTreeSelection *selection;
314 GtkTreeIter iter;348 GtkTreeIter iter;
315 UmUser *current;349 ActUser *current;
316 GtkTreePath *path;350 GtkTreePath *path;
317 UmUser *user;351 ActUser *user;
352 uid_t user_uid;
318353
319 dialog = UM_ACCOUNT_DIALOG (object);354 dialog = UM_ACCOUNT_DIALOG (object);
320 user = um_account_dialog_finish (dialog, result);355 user = um_account_dialog_finish (dialog, result);
321 gtk_widget_destroy (GTK_WIDGET (dialog));356 gtk_widget_destroy (GTK_WIDGET (dialog));
357 d->account_dialog = NULL;
322358
323 if (user == NULL)359 if (user == NULL)
324 return;360 return;
@@ -326,45 +362,45 @@
326 tv = (GtkTreeView *)get_widget (d, "list-treeview");362 tv = (GtkTreeView *)get_widget (d, "list-treeview");
327 model = gtk_tree_view_get_model (tv);363 model = gtk_tree_view_get_model (tv);
328 selection = gtk_tree_view_get_selection (tv);364 selection = gtk_tree_view_get_selection (tv);
365 user_uid = act_user_get_uid (user);
329366
330 gtk_tree_model_get_iter_first (model, &iter);367 gtk_tree_model_get_iter_first (model, &iter);
331 do {368 do {
332 gtk_tree_model_get (model, &iter, USER_COL, &current, -1);369 gtk_tree_model_get (model, &iter, USER_COL, &current, -1);
333 if (user == current) {370 if (current) {
334 path = gtk_tree_model_get_path (model, &iter);371 if (user_uid == act_user_get_uid (current)) {
335 gtk_tree_view_scroll_to_cell (tv, path, NULL, FALSE, 0.0, 0.0);372 path = gtk_tree_model_get_path (model, &iter);
336 gtk_tree_selection_select_path (selection, path);373 gtk_tree_view_scroll_to_cell (tv, path, NULL, FALSE, 0.0, 0.0);
337 gtk_tree_path_free (path);374 gtk_tree_selection_select_path (selection, path);
375 gtk_tree_path_free (path);
376 g_object_unref (current);
377 break;
378 }
338 g_object_unref (current);379 g_object_unref (current);
339 break;
340 }380 }
341 if (current)
342 g_object_unref (current);
343 } while (gtk_tree_model_iter_next (model, &iter));381 } while (gtk_tree_model_iter_next (model, &iter));
344382
345 g_object_unref (user);383 g_object_unref (user);
346}384}
347385
348static void386static void
349add_user (GtkButton *button, UmUserPanelPrivate *d)387add_user (GtkButton *button, CcUserPanelPrivate *d)
350{388{
351 UmAccountDialog *dialog;389 d->account_dialog = um_account_dialog_new ();
352390 um_account_dialog_show (d->account_dialog, GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)),
353 dialog = um_account_dialog_new ();391 d->permission, select_created_user, d);
354 um_account_dialog_show (dialog, GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)),
355 select_created_user, d);
356}392}
357393
358static void394static void
359delete_user_done (UmUserManager *manager,395delete_user_done (ActUserManager *manager,
360 GAsyncResult *res,396 GAsyncResult *res,
361 UmUserPanelPrivate *d)397 CcUserPanelPrivate *d)
362{398{
363 GError *error;399 GError *error;
364400
365 error = NULL;401 error = NULL;
366 if (!um_user_manager_delete_user_finish (manager, res, &error)) {402 if (!act_user_manager_delete_user_finish (manager, res, &error)) {
367 if (!g_error_matches (error, UM_USER_MANAGER_ERROR, UM_USER_MANAGER_ERROR_PERMISSION_DENIED)) {403 if (!g_error_matches (error, ACT_USER_MANAGER_ERROR, ACT_USER_MANAGER_ERROR_PERMISSION_DENIED)) {
368 GtkWidget *dialog;404 GtkWidget *dialog;
369405
370 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)),406 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)),
@@ -387,9 +423,9 @@
387static void423static void
388delete_user_response (GtkWidget *dialog,424delete_user_response (GtkWidget *dialog,
389 gint response_id,425 gint response_id,
390 UmUserPanelPrivate *d)426 CcUserPanelPrivate *d)
391{427{
392 UmUser *user;428 ActUser *user;
393 gboolean remove_files;429 gboolean remove_files;
394430
395 gtk_widget_destroy (dialog);431 gtk_widget_destroy (dialog);
@@ -406,27 +442,32 @@
406442
407 user = get_selected_user (d);443 user = get_selected_user (d);
408444
409 um_user_manager_delete_user (d->um,445 /* remove autologin */
410 user,446 if (act_user_get_automatic_login (user)) {
411 remove_files,447 act_user_set_automatic_login (user, FALSE);
412 (GAsyncReadyCallback)delete_user_done,448 }
413 d,449
414 NULL);450 act_user_manager_delete_user_async (d->um,
451 user,
452 remove_files,
453 NULL,
454 (GAsyncReadyCallback)delete_user_done,
455 d);
415456
416 g_object_unref (user);457 g_object_unref (user);
417}458}
418459
419static void460static void
420delete_user (GtkButton *button, UmUserPanelPrivate *d)461delete_user (GtkButton *button, CcUserPanelPrivate *d)
421{462{
422 UmUser *user;463 ActUser *user;
423 GtkWidget *dialog;464 GtkWidget *dialog;
424465
425 user = get_selected_user (d);466 user = get_selected_user (d);
426 if (user == NULL) {467 if (user == NULL) {
427 return;468 return;
428 }469 }
429 else if (um_user_get_uid (user) == getuid ()) {470 else if (act_user_get_uid (user) == getuid ()) {
430 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)),471 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)),
431 0,472 0,
432 GTK_MESSAGE_INFO,473 GTK_MESSAGE_INFO,
@@ -435,13 +476,13 @@
435 g_signal_connect (dialog, "response",476 g_signal_connect (dialog, "response",
436 G_CALLBACK (gtk_widget_destroy), NULL);477 G_CALLBACK (gtk_widget_destroy), NULL);
437 }478 }
438 else if (um_user_is_logged_in (user)) {479 else if (act_user_is_logged_in_anywhere (user)) {
439 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)),480 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)),
440 0,481 0,
441 GTK_MESSAGE_INFO,482 GTK_MESSAGE_INFO,
442 GTK_BUTTONS_CLOSE,483 GTK_BUTTONS_CLOSE,
443 _("%s is still logged in"),484 _("%s is still logged in"),
444 um_user_get_real_name (user));485 act_user_get_real_name (user));
445486
446 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),487 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
447 _("Deleting a user while they are logged in can leave the system in an inconsistent state."));488 _("Deleting a user while they are logged in can leave the system in an inconsistent state."));
@@ -454,7 +495,7 @@
454 GTK_MESSAGE_QUESTION,495 GTK_MESSAGE_QUESTION,
455 GTK_BUTTONS_NONE,496 GTK_BUTTONS_NONE,
456 _("Do you want to keep %s's files?"),497 _("Do you want to keep %s's files?"),
457 um_user_get_real_name (user));498 act_user_get_real_name (user));
458499
459 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),500 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
460 _("It is possible to keep the home directory, mail spool and temporary files around when deleting a user account."));501 _("It is possible to keep the home directory, mail spool and temporary files around when deleting a user account."));
@@ -508,22 +549,22 @@
508}549}
509550
510static const gchar *551static const gchar *
511get_password_mode_text (UmUser *user)552get_password_mode_text (ActUser *user)
512{553{
513 const gchar *text;554 const gchar *text;
514555
515 if (um_user_get_locked (user)) {556 if (act_user_get_locked (user)) {
516 text = C_("Password mode", "Account disabled");557 text = C_("Password mode", "Account disabled");
517 }558 }
518 else {559 else {
519 switch (um_user_get_password_mode (user)) {560 switch (act_user_get_password_mode (user)) {
520 case UM_PASSWORD_MODE_REGULAR:561 case ACT_USER_PASSWORD_MODE_REGULAR:
521 text = get_invisible_text ();562 text = get_invisible_text ();
522 break;563 break;
523 case UM_PASSWORD_MODE_SET_AT_LOGIN:564 case ACT_USER_PASSWORD_MODE_SET_AT_LOGIN:
524 text = C_("Password mode", "To be set at next login");565 text = C_("Password mode", "To be set at next login");
525 break;566 break;
526 case UM_PASSWORD_MODE_NONE:567 case ACT_USER_PASSWORD_MODE_NONE:
527 text = C_("Password mode", "None");568 text = C_("Password mode", "None");
528 break;569 break;
529 default:570 default:
@@ -537,24 +578,24 @@
537static void578static void
538autologin_changed (GObject *object,579autologin_changed (GObject *object,
539 GParamSpec *pspec,580 GParamSpec *pspec,
540 UmUserPanelPrivate *d)581 CcUserPanelPrivate *d)
541{582{
542 gboolean active;583 gboolean active;
543 UmUser *user;584 ActUser *user;
544585
545 active = gtk_switch_get_active (GTK_SWITCH (object));586 active = gtk_switch_get_active (GTK_SWITCH (object));
546 user = get_selected_user (d);587 user = get_selected_user (d);
547588
548 if (active != um_user_get_automatic_login (user)) {589 if (active != act_user_get_automatic_login (user)) {
549 um_user_set_automatic_login (user, active);590 act_user_set_automatic_login (user, active);
550 if (um_user_get_automatic_login (user)) {591 if (act_user_get_automatic_login (user)) {
551 GSList *list;592 GSList *list;
552 GSList *l;593 GSList *l;
553 list = um_user_manager_list_users (d->um);594 list = act_user_manager_list_users (d->um);
554 for (l = list; l != NULL; l = l->next) {595 for (l = list; l != NULL; l = l->next) {
555 UmUser *u = l->data;596 ActUser *u = l->data;
556 if (um_user_get_uid (u) != um_user_get_uid (user)) {597 if (act_user_get_uid (u) != act_user_get_uid (user)) {
557 um_user_set_automatic_login (user, FALSE);598 act_user_set_automatic_login (user, FALSE);
558 }599 }
559 }600 }
560 g_slist_free (list);601 g_slist_free (list);
@@ -564,21 +605,65 @@
564 g_object_unref (user);605 g_object_unref (user);
565}606}
566607
608static gchar *
609get_login_time_text (ActUser *user)
610{
611 gchar *text, *date_str, *time_str;
612 GDateTime *date_time;
613 gint64 time;
614
615 time = act_user_get_login_time (user);
616 if (act_user_is_logged_in (user)) {
617 text = g_strdup (_("Logged in"));
618 }
619 else if (time > 0) {
620 date_time = g_date_time_new_from_unix_local (time);
621 date_str = get_smart_date (date_time);
622 time_str = g_date_time_format (date_time, "%k:%M");
623
624 text = g_strconcat (date_str, ", ", time_str, NULL);
625
626 g_date_time_unref (date_time);
627 g_free (date_str);
628 g_free (time_str);
629 }
630 else {
631 text = g_strdup ("—");
632 }
633
634 return text;
635}
636
637static gboolean
638get_autologin_possible (ActUser *user)
639{
640 gboolean locked;
641 gboolean set_password_at_login;
642
643 locked = act_user_get_locked (user);
644 set_password_at_login = (act_user_get_password_mode (user) == ACT_USER_PASSWORD_MODE_SET_AT_LOGIN);
645
646 return !(locked || set_password_at_login);
647}
648
649static void on_permission_changed (GPermission *permission, GParamSpec *pspec, gpointer data);
650
567static void651static void
568show_user (UmUser *user, UmUserPanelPrivate *d)652show_user (ActUser *user, CcUserPanelPrivate *d)
569{653{
570 GtkWidget *image;654 GtkWidget *image;
571 GtkWidget *label;655 GtkWidget *label;
572 GtkWidget *label2;656 GtkWidget *label2;
573 GtkWidget *label3;657 GtkWidget *label3;
574 GdkPixbuf *pixbuf;658 GdkPixbuf *pixbuf;
575 gchar *lang;659 gchar *lang, *text;
576 GtkWidget *widget;660 GtkWidget *widget;
577 GtkTreeModel *model;661 GtkTreeModel *model;
578 GtkTreeIter iter;662 GtkTreeIter iter;
579 gboolean show, enable;663 gboolean show, enable;
664 ActUser *current;
580665
581 pixbuf = um_user_render_icon (user, FALSE, 48);666 pixbuf = render_user_icon (user, UM_ICON_STYLE_NONE, 48);
582 image = get_widget (d, "user-icon-image");667 image = get_widget (d, "user-icon-image");
583 gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf);668 gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf);
584 image = get_widget (d, "user-icon-image2");669 image = get_widget (d, "user-icon-image2");
@@ -588,34 +673,32 @@
588 um_photo_dialog_set_user (d->photo_dialog, user);673 um_photo_dialog_set_user (d->photo_dialog, user);
589674
590 widget = get_widget (d, "full-name-entry");675 widget = get_widget (d, "full-name-entry");
591 cc_editable_entry_set_text (CC_EDITABLE_ENTRY (widget), um_user_get_real_name (user));676 cc_editable_entry_set_text (CC_EDITABLE_ENTRY (widget), act_user_get_real_name (user));
592 gtk_widget_set_tooltip_text (widget, um_user_get_user_name (user));677 gtk_widget_set_tooltip_text (widget, act_user_get_user_name (user));
593678
594 widget = get_widget (d, "account-type-combo");679 widget = get_widget (d, "account-type-combo");
595 um_editable_combo_set_active (UM_EDITABLE_COMBO (widget), um_user_get_account_type (user));680 um_editable_combo_set_active (UM_EDITABLE_COMBO (widget), act_user_get_account_type (user));
596681
597 widget = get_widget (d, "account-password-button");682 widget = get_widget (d, "account-password-button");
598 um_editable_button_set_text (UM_EDITABLE_BUTTON (widget), get_password_mode_text (user));683 um_editable_button_set_text (UM_EDITABLE_BUTTON (widget), get_password_mode_text (user));
599 enable = um_user_is_local_account (user);684 enable = act_user_is_local_account (user);
600 gtk_widget_set_sensitive (widget, enable);685 gtk_widget_set_sensitive (widget, enable);
601686
602 widget = get_widget (d, "autologin-switch");687 widget = get_widget (d, "autologin-switch");
603 g_signal_handlers_block_by_func (widget, autologin_changed, d);688 g_signal_handlers_block_by_func (widget, autologin_changed, d);
604 gtk_switch_set_active (GTK_SWITCH (widget), um_user_get_automatic_login (user));689 gtk_switch_set_active (GTK_SWITCH (widget), act_user_get_automatic_login (user));
605 g_signal_handlers_unblock_by_func (widget, autologin_changed, d);690 g_signal_handlers_unblock_by_func (widget, autologin_changed, d);
606691 gtk_widget_set_sensitive (widget, get_autologin_possible (user));
607 if (um_user_get_locked (user))
608 gtk_widget_set_sensitive (widget, FALSE);
609692
610 widget = get_widget (d, "account-language-combo");693 widget = get_widget (d, "account-language-combo");
611 model = um_editable_combo_get_model (UM_EDITABLE_COMBO (widget));694 model = um_editable_combo_get_model (UM_EDITABLE_COMBO (widget));
612 cc_add_user_languages (model);695 cc_add_user_languages (model);
613696
614 lang = g_strdup (um_user_get_language (user));697 lang = g_strdup (act_user_get_language (user));
615 if (!lang)698 if (!lang)
616 lang = cc_common_language_get_current_language ();699 lang = cc_common_language_get_current_language ();
617 cc_common_language_get_iter_for_language (model, lang, &iter);700 if (cc_common_language_get_iter_for_language (model, lang, &iter))
618 um_editable_combo_set_active_iter (UM_EDITABLE_COMBO (widget), &iter);701 um_editable_combo_set_active_iter (UM_EDITABLE_COMBO (widget), &iter);
619 g_free (lang);702 g_free (lang);
620703
621 /* Fingerprint: show when self, possible, and local account */704 /* Fingerprint: show when self, possible, and local account */
@@ -623,8 +706,8 @@
623 label = get_widget (d, "account-fingerprint-label");706 label = get_widget (d, "account-fingerprint-label");
624 label2 = get_widget (d, "account-fingerprint-value-label");707 label2 = get_widget (d, "account-fingerprint-value-label");
625 label3 = get_widget (d, "account-fingerprint-button-label");708 label3 = get_widget (d, "account-fingerprint-button-label");
626 show = (um_user_get_uid (user) == getuid() &&709 show = (act_user_get_uid (user) == getuid() &&
627 um_user_is_local_account (user) &&710 act_user_is_local_account (user) &&
628 set_fingerprint_label (label2, label3));711 set_fingerprint_label (label2, label3));
629 gtk_widget_set_visible (label, show);712 gtk_widget_set_visible (label, show);
630 gtk_widget_set_visible (widget, show);713 gtk_widget_set_visible (widget, show);
@@ -634,34 +717,53 @@
634 label = get_widget (d, "autologin-label");717 label = get_widget (d, "autologin-label");
635 /* Don't show autologin option if ecryptfs is in use, because it won't718 /* Don't show autologin option if ecryptfs is in use, because it won't
636 work if user turns it on. */719 work if user turns it on. */
637 show = um_user_is_local_account (user) &&720 show = act_user_is_local_account (user) &&
638 !is_using_ecryptfs (um_user_get_user_name (user));721 !is_using_ecryptfs (act_user_get_user_name (user));
639 gtk_widget_set_visible (widget, show);722 gtk_widget_set_visible (widget, show);
640 gtk_widget_set_visible (label, show);723 gtk_widget_set_visible (label, show);
641724
642 /* Menu bar: show when self and have indicator schema */725 /* Menu bar: show when self and have indicator schema */
643 widget = get_widget (d, "show-login-name-checkbutton");726 widget = get_widget (d, "show-login-name-checkbutton");
644 label = get_widget (d, "show-login-name-spacer");727 label = get_widget (d, "show-login-name-spacer");
645 show = um_user_get_uid (user) == getuid() &&728 show = act_user_get_uid (user) == getuid() &&
646 d->indicator_session_schema;729 d->indicator_session_schema;
647 gtk_widget_set_visible (widget, show);730 gtk_widget_set_visible (widget, show);
648 gtk_widget_set_visible (label, show);731 gtk_widget_set_visible (label, show);
732
733 /* Last login: show when administrator or current user */
734 widget = get_widget (d, "last-login-value-label");
735 label = get_widget (d, "last-login-label");
736
737 current = act_user_manager_get_user_by_id (d->um, getuid ());
738 show = act_user_get_uid (user) == getuid () ||
739 act_user_get_account_type (current) == ACT_USER_ACCOUNT_TYPE_ADMINISTRATOR;
740 if (show) {
741 text = get_login_time_text (user);
742 gtk_label_set_text (GTK_LABEL (widget), text);
743 g_free (text);
744 }
745 gtk_widget_set_visible (widget, show);
746 gtk_widget_set_visible (label, show);
747
748 enable = act_user_get_login_history (user) != NULL;
749 widget = get_widget (d, "last-login-history-button");
750 gtk_widget_set_visible (widget, show);
751 gtk_widget_set_sensitive (widget, enable);
752
753 if (d->permission != NULL)
754 on_permission_changed (d->permission, NULL, d);
649}755}
650756
651static void on_permission_changed (GPermission *permission, GParamSpec *pspec, gpointer data);
652
653static void757static void
654selected_user_changed (GtkTreeSelection *selection, UmUserPanelPrivate *d)758selected_user_changed (GtkTreeSelection *selection, CcUserPanelPrivate *d)
655{759{
656 GtkTreeModel *model;760 GtkTreeModel *model;
657 GtkTreeIter iter;761 GtkTreeIter iter;
658 UmUser *user;762 ActUser *user;
659763
660 if (gtk_tree_selection_get_selected (selection, &model, &iter)) {764 if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
661 gtk_tree_model_get (model, &iter, USER_COL, &user, -1);765 gtk_tree_model_get (model, &iter, USER_COL, &user, -1);
662 show_user (user, d);766 show_user (user, d);
663 if (d->permission != NULL)
664 on_permission_changed (d->permission, NULL, d);
665 gtk_widget_set_sensitive (get_widget (d, "main-user-vbox"), TRUE);767 gtk_widget_set_sensitive (get_widget (d, "main-user-vbox"), TRUE);
666 g_object_unref (user);768 g_object_unref (user);
667 } else {769 } else {
@@ -671,16 +773,17 @@
671773
672static void774static void
673change_name_done (GtkWidget *entry,775change_name_done (GtkWidget *entry,
674 UmUserPanelPrivate *d)776 CcUserPanelPrivate *d)
675{777{
676 const gchar *text;778 const gchar *text;
677 UmUser *user;779 ActUser *user;
678780
679 user = get_selected_user (d);781 user = get_selected_user (d);
680782
681 text = cc_editable_entry_get_text (CC_EDITABLE_ENTRY (entry));783 text = cc_editable_entry_get_text (CC_EDITABLE_ENTRY (entry));
682 if (g_strcmp0 (text, um_user_get_real_name (user)) != 0) {784 if (g_strcmp0 (text, act_user_get_real_name (user)) != 0 &&
683 um_user_set_real_name (user, text);785 is_valid_name (text)) {
786 act_user_set_real_name (user, text);
684 }787 }
685788
686 g_object_unref (user);789 g_object_unref (user);
@@ -688,9 +791,9 @@
688791
689static void792static void
690account_type_changed (UmEditableCombo *combo,793account_type_changed (UmEditableCombo *combo,
691 UmUserPanelPrivate *d)794 CcUserPanelPrivate *d)
692{795{
693 UmUser *user;796 ActUser *user;
694 GtkTreeModel *model;797 GtkTreeModel *model;
695 GtkTreeIter iter;798 GtkTreeIter iter;
696 gint account_type;799 gint account_type;
@@ -701,8 +804,8 @@
701 um_editable_combo_get_active_iter (combo, &iter);804 um_editable_combo_get_active_iter (combo, &iter);
702 gtk_tree_model_get (model, &iter, 1, &account_type, -1);805 gtk_tree_model_get (model, &iter, 1, &account_type, -1);
703806
704 if (account_type != um_user_get_account_type (user)) {807 if (account_type != act_user_get_account_type (user)) {
705 um_user_set_account_type (user, account_type);808 act_user_set_account_type (user, account_type);
706 }809 }
707810
708 g_object_unref (user);811 g_object_unref (user);
@@ -711,10 +814,10 @@
711static void814static void
712language_response (GtkDialog *dialog,815language_response (GtkDialog *dialog,
713 gint response_id,816 gint response_id,
714 UmUserPanelPrivate *d)817 CcUserPanelPrivate *d)
715{818{
716 GtkWidget *combo;819 GtkWidget *combo;
717 UmUser *user;820 ActUser *user;
718 gchar *lang;821 gchar *lang;
719 GtkTreeModel *model;822 GtkTreeModel *model;
720 GtkTreeIter iter;823 GtkTreeIter iter;
@@ -726,10 +829,10 @@
726829
727 if (response_id == GTK_RESPONSE_OK) {830 if (response_id == GTK_RESPONSE_OK) {
728 lang = cc_language_chooser_get_language (GTK_WIDGET (dialog));831 lang = cc_language_chooser_get_language (GTK_WIDGET (dialog));
729 um_user_set_language (user, lang);832 act_user_set_language (user, lang);
730 }833 }
731 else {834 else {
732 lang = g_strdup (um_user_get_language (user));835 lang = g_strdup (act_user_get_language (user));
733 if (!lang)836 if (!lang)
734 lang = cc_common_language_get_current_language ();837 lang = cc_common_language_get_current_language ();
735 }838 }
@@ -745,12 +848,12 @@
745848
746static void849static void
747language_changed (UmEditableCombo *combo,850language_changed (UmEditableCombo *combo,
748 UmUserPanelPrivate *d)851 CcUserPanelPrivate *d)
749{852{
750 GtkTreeModel *model;853 GtkTreeModel *model;
751 GtkTreeIter iter;854 GtkTreeIter iter;
752 gchar *lang;855 gchar *lang;
753 UmUser *user;856 ActUser *user;
754857
755 if (!um_editable_combo_get_active_iter (combo, &iter))858 if (!um_editable_combo_get_active_iter (combo, &iter))
756 return;859 return;
@@ -761,8 +864,8 @@
761864
762 gtk_tree_model_get (model, &iter, 0, &lang, -1);865 gtk_tree_model_get (model, &iter, 0, &lang, -1);
763 if (lang) {866 if (lang) {
764 if (g_strcmp0 (lang, um_user_get_language (user)) != 0) {867 if (g_strcmp0 (lang, act_user_get_language (user)) != 0) {
765 um_user_set_language (user, lang);868 act_user_set_language (user, lang);
766 }869 }
767 g_free (lang);870 g_free (lang);
768 goto out;871 goto out;
@@ -791,9 +894,9 @@
791}894}
792895
793static void896static void
794change_password (GtkButton *button, UmUserPanelPrivate *d)897change_password (GtkButton *button, CcUserPanelPrivate *d)
795{898{
796 UmUser *user;899 ActUser *user;
797900
798 user = get_selected_user (d);901 user = get_selected_user (d);
799902
@@ -805,14 +908,14 @@
805}908}
806909
807static void910static void
808change_fingerprint (GtkButton *button, UmUserPanelPrivate *d)911change_fingerprint (GtkButton *button, CcUserPanelPrivate *d)
809{912{
810 GtkWidget *label, *label2;913 GtkWidget *label, *label2;
811 UmUser *user;914 ActUser *user;
812915
813 user = get_selected_user (d);916 user = get_selected_user (d);
814917
815 g_assert (g_strcmp0 (g_get_user_name (), um_user_get_user_name (user)) == 0);918 g_assert (g_strcmp0 (g_get_user_name (), act_user_get_user_name (user)) == 0);
816919
817 label = get_widget (d, "account-fingerprint-value-label");920 label = get_widget (d, "account-fingerprint-value-label");
818 label2 = get_widget (d, "account-fingerprint-button-label");921 label2 = get_widget (d, "account-fingerprint-button-label");
@@ -821,13 +924,26 @@
821 g_object_unref (user);924 g_object_unref (user);
822}925}
823926
927static void
928show_history (GtkButton *button, CcUserPanelPrivate *d)
929{
930 ActUser *user;
931
932 user = get_selected_user (d);
933
934 um_history_dialog_set_user (d->history_dialog, user);
935 um_history_dialog_show (d->history_dialog, GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)));
936
937 g_object_unref (user);
938}
939
824static gint940static gint
825sort_users (GtkTreeModel *model,941sort_users (GtkTreeModel *model,
826 GtkTreeIter *a,942 GtkTreeIter *a,
827 GtkTreeIter *b,943 GtkTreeIter *b,
828 gpointer data)944 gpointer data)
829{945{
830 UmUser *ua, *ub;946 ActUser *ua, *ub;
831 gint sa, sb;947 gint sa, sb;
832 gint result;948 gint result;
833949
@@ -841,7 +957,7 @@
841 result = 1;957 result = 1;
842 }958 }
843 else {959 else {
844 result = um_user_collate (ua, ub);960 result = act_user_collate (ua, ub);
845 }961 }
846962
847 if (ua) {963 if (ua) {
@@ -871,14 +987,15 @@
871}987}
872988
873static void989static void
874users_loaded (UmUserManager *manager,990users_loaded (ActUserManager *manager,
875 UmUserPanelPrivate *d)991 GParamSpec *pspec,
992 CcUserPanelPrivate *d)
876{993{
877 GSList *list, *l;994 GSList *list, *l;
878 UmUser *user;995 ActUser *user;
879 GtkWidget *dialog;996 GtkWidget *dialog;
880997
881 if (um_user_manager_no_service (d->um)) {998 if (act_user_manager_no_service (d->um)) {
882 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)),999 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)),
883 GTK_DIALOG_MODAL,1000 GTK_DIALOG_MODAL,
884 GTK_MESSAGE_OTHER,1001 GTK_MESSAGE_OTHER,
@@ -894,14 +1011,15 @@
894 gtk_widget_set_sensitive (d->main_box, FALSE);1011 gtk_widget_set_sensitive (d->main_box, FALSE);
895 }1012 }
8961013
897 list = um_user_manager_list_users (d->um);1014 list = act_user_manager_list_users (d->um);
898 g_debug ("Got %d users\n", g_slist_length (list));1015 g_debug ("Got %d users\n", g_slist_length (list));
8991016
900 g_signal_connect (d->um, "user-changed", G_CALLBACK (user_changed), d);1017 g_signal_connect (d->um, "user-changed", G_CALLBACK (user_changed), d);
1018 g_signal_connect (d->um, "user-is-logged-in-changed", G_CALLBACK (user_changed), d);
9011019
902 for (l = list; l; l = l->next) {1020 for (l = list; l; l = l->next) {
903 user = l->data;1021 user = l->data;
904 g_debug ("adding user %s\n", um_user_get_real_name (user));1022 g_debug ("adding user %s\n", act_user_get_real_name (user));
905 user_added (d->um, user, d);1023 user_added (d->um, user, d);
906 }1024 }
907 g_slist_free (list);1025 g_slist_free (list);
@@ -946,10 +1064,10 @@
946 GParamSpec *pspec,1064 GParamSpec *pspec,
947 gpointer data)1065 gpointer data)
948{1066{
949 UmUserPanelPrivate *d = data;1067 CcUserPanelPrivate *d = data;
950 gboolean is_authorized;1068 gboolean is_authorized;
951 gboolean self_selected;1069 gboolean self_selected;
952 UmUser *user;1070 ActUser *user;
953 GtkWidget *widget;1071 GtkWidget *widget;
9541072
955 user = get_selected_user (d);1073 user = get_selected_user (d);
@@ -958,7 +1076,7 @@
958 }1076 }
9591077
960 is_authorized = g_permission_get_allowed (G_PERMISSION (d->permission));1078 is_authorized = g_permission_get_allowed (G_PERMISSION (d->permission));
961 self_selected = um_user_get_uid (user) == geteuid ();1079 self_selected = act_user_get_uid (user) == geteuid ();
9621080
963 widget = get_widget (d, "add-user-toolbutton");1081 widget = get_widget (d, "add-user-toolbutton");
964 gtk_widget_set_sensitive (widget, is_authorized);1082 gtk_widget_set_sensitive (widget, is_authorized);
@@ -981,7 +1099,8 @@
981 }1099 }
9821100
983 widget = get_widget (d, "remove-user-toolbutton");1101 widget = get_widget (d, "remove-user-toolbutton");
984 gtk_widget_set_sensitive (widget, is_authorized && !self_selected);1102 gtk_widget_set_sensitive (widget, is_authorized && !self_selected
1103 && !would_demote_only_admin (user));
985 if (is_authorized) {1104 if (is_authorized) {
986 setup_tooltip_with_embedded_icon (widget, _("Delete the selected user account"), NULL, NULL);1105 setup_tooltip_with_embedded_icon (widget, _("Delete the selected user account"), NULL, NULL);
987 }1106 }
@@ -1001,28 +1120,37 @@
1001 g_object_unref (icon);1120 g_object_unref (icon);
1002 }1121 }
10031122
1004 if (!um_user_is_local_account (user)) {1123 if (!act_user_is_local_account (user)) {
1005 um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d, "account-type-combo")), FALSE);1124 um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d, "account-type-combo")), FALSE);
1006 remove_unlock_tooltip (get_widget (d, "account-type-combo"));1125 remove_unlock_tooltip (get_widget (d, "account-type-combo"));
1007 gtk_widget_set_sensitive (GTK_WIDGET (get_widget (d, "autologin-switch")), FALSE);1126 gtk_widget_set_sensitive (GTK_WIDGET (get_widget (d, "autologin-switch")), FALSE);
1008 remove_unlock_tooltip (get_widget (d, "autologin-switch"));1127 remove_unlock_tooltip (get_widget (d, "autologin-switch"));
10091128
1010 } else if (is_authorized && um_user_is_local_account (user)) {1129 } else if (is_authorized && act_user_is_local_account (user)) {
1011 um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d, "account-type-combo")), TRUE);1130 if (would_demote_only_admin (user)) {
1131 um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d, "account-type-combo")), FALSE);
1132 } else {
1133 um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d, "account-type-combo")), TRUE);
1134 }
1012 remove_unlock_tooltip (get_widget (d, "account-type-combo"));1135 remove_unlock_tooltip (get_widget (d, "account-type-combo"));
1013 gtk_widget_set_sensitive (GTK_WIDGET (get_widget (d, "autologin-switch")), TRUE);1136
1137 gtk_widget_set_sensitive (GTK_WIDGET (get_widget (d, "autologin-switch")), get_autologin_possible (user));
1014 remove_unlock_tooltip (get_widget (d, "autologin-switch"));1138 remove_unlock_tooltip (get_widget (d, "autologin-switch"));
1015 }1139 }
1016 else {1140 else {
1017 um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d, "account-type-combo")), FALSE);1141 um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d, "account-type-combo")), FALSE);
1018 add_unlock_tooltip (get_widget (d, "account-type-combo"));1142 if (would_demote_only_admin (user)) {
1143 remove_unlock_tooltip (get_widget (d, "account-type-combo"));
1144 } else {
1145 add_unlock_tooltip (get_widget (d, "account-type-combo"));
1146 }
1019 gtk_widget_set_sensitive (GTK_WIDGET (get_widget (d, "autologin-switch")), FALSE);1147 gtk_widget_set_sensitive (GTK_WIDGET (get_widget (d, "autologin-switch")), FALSE);
1020 add_unlock_tooltip (get_widget (d, "autologin-switch"));1148 add_unlock_tooltip (get_widget (d, "autologin-switch"));
1021 }1149 }
10221150
1023 /* The full name entry: insensitive if remote or not authorized and not self */1151 /* The full name entry: insensitive if remote or not authorized and not self */
1024 widget = get_widget (d, "full-name-entry");1152 widget = get_widget (d, "full-name-entry");
1025 if (!um_user_is_local_account (user)) {1153 if (!act_user_is_local_account (user)) {
1026 cc_editable_entry_set_editable (CC_EDITABLE_ENTRY (widget), FALSE);1154 cc_editable_entry_set_editable (CC_EDITABLE_ENTRY (widget), FALSE);
1027 remove_unlock_tooltip (widget);1155 remove_unlock_tooltip (widget);
10281156
@@ -1060,6 +1188,7 @@
1060 gtk_notebook_set_current_page (GTK_NOTEBOOK (get_widget (d, "account-fingerprint-notebook")), 0);1188 gtk_notebook_set_current_page (GTK_NOTEBOOK (get_widget (d, "account-fingerprint-notebook")), 0);
1061 }1189 }
10621190
1191 um_password_dialog_set_user (d->password_dialog, user);
1063 um_password_dialog_set_privileged (d->password_dialog, is_authorized);1192 um_password_dialog_set_privileged (d->password_dialog, is_authorized);
10641193
1065 g_object_unref (user);1194 g_object_unref (user);
@@ -1072,7 +1201,7 @@
1072 GtkTreeIter *iter,1201 GtkTreeIter *iter,
1073 gpointer search_data)1202 gpointer search_data)
1074{1203{
1075 UmUser *user;1204 ActUser *user;
1076 const gchar *name;1205 const gchar *name;
1077 gchar *normalized_key = NULL;1206 gchar *normalized_key = NULL;
1078 gchar *normalized_name = NULL;1207 gchar *normalized_name = NULL;
@@ -1097,10 +1226,10 @@
10971226
1098 for (i = 0; i < 2; i++) {1227 for (i = 0; i < 2; i++) {
1099 if (i == 0) {1228 if (i == 0) {
1100 name = um_user_get_real_name (user);1229 name = act_user_get_real_name (user);
1101 }1230 }
1102 else {1231 else {
1103 name = um_user_get_user_name (user);1232 name = act_user_get_user_name (user);
1104 }1233 }
1105 g_free (normalized_name);1234 g_free (normalized_name);
1106 normalized_name = g_utf8_normalize (name, -1, G_NORMALIZE_ALL);1235 normalized_name = g_utf8_normalize (name, -1, G_NORMALIZE_ALL);
@@ -1134,7 +1263,7 @@
1134 GtkCellRenderer *cell,1263 GtkCellRenderer *cell,
1135 GtkTreeModel *model,1264 GtkTreeModel *model,
1136 GtkTreeIter *iter,1265 GtkTreeIter *iter,
1137 UmUserPanelPrivate *d)1266 CcUserPanelPrivate *d)
1138{1267{
1139 gboolean is_autologin;1268 gboolean is_autologin;
11401269
@@ -1148,7 +1277,7 @@
1148}1277}
11491278
1150static void1279static void
1151setup_main_window (UmUserPanelPrivate *d)1280setup_main_window (CcUserPanelPrivate *d)
1152{1281{
1153 GtkWidget *userlist;1282 GtkWidget *userlist;
1154 GtkTreeModel *model;1283 GtkTreeModel *model;
@@ -1163,10 +1292,11 @@
1163 GIcon *icon;1292 GIcon *icon;
1164 GError *error = NULL;1293 GError *error = NULL;
1165 gchar *names[3];1294 gchar *names[3];
1295 gboolean loaded;
11661296
1167 userlist = get_widget (d, "list-treeview");1297 userlist = get_widget (d, "list-treeview");
1168 store = gtk_list_store_new (NUM_USER_LIST_COLS,1298 store = gtk_list_store_new (NUM_USER_LIST_COLS,
1169 UM_TYPE_USER,1299 ACT_TYPE_USER,
1170 GDK_TYPE_PIXBUF,1300 GDK_TYPE_PIXBUF,
1171 G_TYPE_STRING,1301 G_TYPE_STRING,
1172 G_TYPE_BOOLEAN,1302 G_TYPE_BOOLEAN,
@@ -1183,8 +1313,6 @@
1183 match_user, NULL, NULL);1313 match_user, NULL, NULL);
1184 g_object_unref (model);1314 g_object_unref (model);
11851315
1186 g_signal_connect (d->um, "users-loaded", G_CALLBACK (users_loaded), d);
1187
1188 gtk_widget_style_get (userlist, "expander-size", &expander_size, NULL);1316 gtk_widget_style_get (userlist, "expander-size", &expander_size, NULL);
1189 gtk_tree_view_set_level_indentation (GTK_TREE_VIEW (userlist), - (expander_size + 6));1317 gtk_tree_view_set_level_indentation (GTK_TREE_VIEW (userlist), - (expander_size + 6));
11901318
@@ -1198,15 +1326,8 @@
1198 -1);1326 -1);
1199 g_free (title);1327 g_free (title);
12001328
1201 title = g_strdup_printf ("<small><span foreground=\"#555555\">%s</span></small>", _("Other Accounts"));1329 d->other_accounts = 0;
1202 gtk_list_store_append (store, &iter);1330 d->other_iter = NULL;
1203 gtk_list_store_set (store, &iter,
1204 TITLE_COL, title,
1205 HEADING_ROW_COL, TRUE,
1206 SORT_KEY_COL, 2,
1207 AUTOLOGIN_COL, FALSE,
1208 -1);
1209 g_free (title);
12101331
1211 column = gtk_tree_view_column_new ();1332 column = gtk_tree_view_column_new ();
1212 cell = gtk_cell_renderer_pixbuf_new ();1333 cell = gtk_cell_renderer_pixbuf_new ();
@@ -1270,6 +1391,10 @@
1270 g_signal_connect (button, "clicked",1391 g_signal_connect (button, "clicked",
1271 G_CALLBACK (change_fingerprint), d);1392 G_CALLBACK (change_fingerprint), d);
12721393
1394 button = get_widget (d, "last-login-history-button");
1395 g_signal_connect (button, "clicked",
1396 G_CALLBACK (show_history), d);
1397
1273 d->permission = (GPermission *)polkit_permission_new_sync (USER_ACCOUNTS_PERMISSION, NULL, NULL, &error);1398 d->permission = (GPermission *)polkit_permission_new_sync (USER_ACCOUNTS_PERMISSION, NULL, NULL, &error);
1274 if (d->permission != NULL) {1399 if (d->permission != NULL) {
1275 g_signal_connect (d->permission, "notify",1400 g_signal_connect (d->permission, "notify",
@@ -1295,20 +1420,26 @@
1295 "*",1420 "*",
1296 icon);1421 icon);
1297 g_object_unref (icon);1422 g_object_unref (icon);
1423
1424 g_object_get (d->um, "is-loaded", &loaded, NULL);
1425 if (loaded)
1426 users_loaded (d->um, NULL, d);
1427 else
1428 g_signal_connect (d->um, "notify::is-loaded", G_CALLBACK (users_loaded), d);
1298}1429}
12991430
1300static void1431static void
1301um_user_panel_init (UmUserPanel *self)1432cc_user_panel_init (CcUserPanel *self)
1302{1433{
1303 UmUserPanelPrivate *d;1434 CcUserPanelPrivate *d;
1304 GError *error;1435 GError *error;
1305 volatile GType type G_GNUC_UNUSED;1436 volatile GType type G_GNUC_UNUSED;
1306 const gchar *filename;
1307 GtkWidget *button;1437 GtkWidget *button;
1308 GtkStyleContext *context;1438 GtkStyleContext *context;
1309 GSettingsSchema *schema;1439 GSettingsSchema *schema;
13101440
1311 d = self->priv = UM_USER_PANEL_PRIVATE (self);1441 d = self->priv = UM_USER_PANEL_PRIVATE (self);
1442 g_resources_register (um_get_resource ());
13121443
1313 /* register types that the builder might need */1444 /* register types that the builder might need */
1314 type = um_editable_button_get_type ();1445 type = um_editable_button_get_type ();
@@ -1318,25 +1449,24 @@
1318 gtk_widget_set_size_request (GTK_WIDGET (self), -1, 350);1449 gtk_widget_set_size_request (GTK_WIDGET (self), -1, 350);
13191450
1320 d->builder = gtk_builder_new ();1451 d->builder = gtk_builder_new ();
1321 d->um = um_user_manager_ref_default ();1452 d->um = act_user_manager_get_default ();
13221453
1323 filename = UIDIR "/user-accounts-dialog.ui";
1324 if (!g_file_test (filename, G_FILE_TEST_EXISTS)) {
1325 filename = "data/user-accounts-dialog.ui";
1326 }
1327 error = NULL;1454 error = NULL;
1328 if (!gtk_builder_add_from_file (d->builder, filename, &error)) {1455 if (!gtk_builder_add_from_resource (d->builder,
1456 "/org/gnome/control-center/user-accounts/user-accounts-dialog.ui",
1457 &error)) {
1329 g_error ("%s", error->message);1458 g_error ("%s", error->message);
1330 g_error_free (error);1459 g_error_free (error);
1331 return;1460 return;
1332 }1461 }
13331462
1334 setup_main_window (d);
1335 d->password_dialog = um_password_dialog_new ();1463 d->password_dialog = um_password_dialog_new ();
1336 button = get_widget (d, "user-icon-button");1464 button = get_widget (d, "user-icon-button");
1337 d->photo_dialog = um_photo_dialog_new (button);1465 d->photo_dialog = um_photo_dialog_new (button);
1338 d->main_box = get_widget (d, "accounts-vbox");1466 d->main_box = get_widget (d, "accounts-vbox");
1339 gtk_widget_reparent (d->main_box, GTK_WIDGET (self));1467 gtk_widget_reparent (d->main_box, GTK_WIDGET (self));
1468 d->history_dialog = um_history_dialog_new ();
1469 setup_main_window (d);
13401470
1341 context = gtk_widget_get_style_context (get_widget (d, "list-scrolledwindow"));1471 context = gtk_widget_get_style_context (get_widget (d, "list-scrolledwindow"));
1342 gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);1472 gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
@@ -1352,12 +1482,12 @@
1352}1482}
13531483
1354static void1484static void
1355um_user_panel_dispose (GObject *object)1485cc_user_panel_dispose (GObject *object)
1356{1486{
1357 UmUserPanelPrivate *priv = UM_USER_PANEL (object)->priv;1487 CcUserPanelPrivate *priv = UM_USER_PANEL (object)->priv;
13581488
1359 if (priv->um) {1489 if (priv->um) {
1360 g_object_unref (priv->um);1490 g_signal_handlers_disconnect_by_data (priv->um, priv);
1361 priv->um = NULL;1491 priv->um = NULL;
1362 }1492 }
1363 if (priv->builder) {1493 if (priv->builder) {
@@ -1372,6 +1502,14 @@
1372 um_photo_dialog_free (priv->photo_dialog);1502 um_photo_dialog_free (priv->photo_dialog);
1373 priv->photo_dialog = NULL;1503 priv->photo_dialog = NULL;
1374 }1504 }
1505 if (priv->history_dialog) {
1506 um_history_dialog_free (priv->history_dialog);
1507 priv->history_dialog = NULL;
1508 }
1509 if (priv->account_dialog) {
1510 gtk_dialog_response (GTK_DIALOG (priv->account_dialog), GTK_RESPONSE_DELETE_EVENT);
1511 priv->account_dialog = NULL;
1512 }
1375 if (priv->language_chooser) {1513 if (priv->language_chooser) {
1376 gtk_widget_destroy (priv->language_chooser);1514 gtk_widget_destroy (priv->language_chooser);
1377 priv->language_chooser = NULL;1515 priv->language_chooser = NULL;
@@ -1380,19 +1518,23 @@
1380 g_object_unref (priv->permission);1518 g_object_unref (priv->permission);
1381 priv->permission = NULL;1519 priv->permission = NULL;
1382 }1520 }
1383 G_OBJECT_CLASS (um_user_panel_parent_class)->dispose (object);1521 if (priv->other_iter) {
1522 gtk_tree_iter_free (priv->other_iter);
1523 priv->other_iter = NULL;
1524 }
1525 G_OBJECT_CLASS (cc_user_panel_parent_class)->dispose (object);
1384}1526}
13851527
1386static GPermission *1528static GPermission *
1387um_user_panel_get_permission (CcPanel *panel)1529cc_user_panel_get_permission (CcPanel *panel)
1388{1530{
1389 UmUserPanelPrivate *priv = UM_USER_PANEL (panel)->priv;1531 CcUserPanelPrivate *priv = UM_USER_PANEL (panel)->priv;
13901532
1391 return priv->permission;1533 return priv->permission;
1392}1534}
13931535
1394static const char *1536static const char *
1395um_user_panel_get_help_uri (CcPanel *panel)1537cc_user_panel_get_help_uri (CcPanel *panel)
1396{1538{
1397 if (!g_strcmp0(g_getenv("XDG_CURRENT_DESKTOP"), "Unity"))1539 if (!g_strcmp0(g_getenv("XDG_CURRENT_DESKTOP"), "Unity"))
1398 return "help:ubuntu-help/user-accounts";1540 return "help:ubuntu-help/user-accounts";
@@ -1401,23 +1543,23 @@
1401}1543}
14021544
1403static void1545static void
1404um_user_panel_class_init (UmUserPanelClass *klass)1546cc_user_panel_class_init (CcUserPanelClass *klass)
1405{1547{
1406 GObjectClass *object_class = G_OBJECT_CLASS (klass);1548 GObjectClass *object_class = G_OBJECT_CLASS (klass);
1407 CcPanelClass *panel_class = CC_PANEL_CLASS (klass);1549 CcPanelClass *panel_class = CC_PANEL_CLASS (klass);
14081550
1409 object_class->dispose = um_user_panel_dispose;1551 object_class->dispose = cc_user_panel_dispose;
14101552
1411 panel_class->get_permission = um_user_panel_get_permission;1553 panel_class->get_permission = cc_user_panel_get_permission;
1412 panel_class->get_help_uri = um_user_panel_get_help_uri;1554 panel_class->get_help_uri = cc_user_panel_get_help_uri;
14131555
1414 g_type_class_add_private (klass, sizeof (UmUserPanelPrivate));1556 g_type_class_add_private (klass, sizeof (CcUserPanelPrivate));
1415}1557}
14161558
1417void1559void
1418um_user_panel_register (GIOModule *module)1560cc_user_panel_register (GIOModule *module)
1419{1561{
1420 um_user_panel_register_type (G_TYPE_MODULE (module));1562 cc_user_panel_register_type (G_TYPE_MODULE (module));
1421 g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT,1563 g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT,
1422 UM_TYPE_USER_PANEL, "user-accounts", 0);1564 UM_TYPE_USER_PANEL, "user-accounts", 0);
1423}1565}
14241566
=== modified file 'panels/user-accounts/um-user-panel.h'
--- panels/user-accounts/um-user-panel.h 2012-09-06 23:07:09 +0000
+++ panels/user-accounts/um-user-panel.h 2014-02-24 09:46:44 +0000
@@ -26,33 +26,31 @@
2626
27G_BEGIN_DECLS27G_BEGIN_DECLS
2828
29#define UM_TYPE_USER_PANEL um_user_panel_get_type()29#define UM_TYPE_USER_PANEL cc_user_panel_get_type()
3030
31#define UM_USER_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UM_TYPE_USER_PANEL, UmUserPanel))31#define UM_USER_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UM_TYPE_USER_PANEL, CcUserPanel))
32#define UM_USER_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UM_TYPE_USER_PANEL, UmUserPanelClass))32#define UM_USER_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UM_TYPE_USER_PANEL, CcUserPanelClass))
33#define UM_IS_USER_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UM_TYPE_USER_PANEL))33#define UM_IS_USER_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UM_TYPE_USER_PANEL))
34#define UM_IS_USER_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UM_TYPE_USER_PANEL))34#define UM_IS_USER_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UM_TYPE_USER_PANEL))
35#define UM_USER_PANEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UM_TYPE_USER_PANEL, UmUserPanelClass))35#define UM_USER_PANEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UM_TYPE_USER_PANEL, CcUserPanelClass))
3636
37typedef struct _UmUserPanel UmUserPanel;37typedef struct _CcUserPanel CcUserPanel;
38typedef struct _UmUserPanelClass UmUserPanelClass;38typedef struct _CcUserPanelClass CcUserPanelClass;
39typedef struct _UmUserPanelPrivate UmUserPanelPrivate;39typedef struct _CcUserPanelPrivate CcUserPanelPrivate;
4040
41struct _UmUserPanel41struct _CcUserPanel
42{42{
43 CcPanel parent;43 CcPanel parent;
4444
45 UmUserPanelPrivate *priv;45 CcUserPanelPrivate *priv;
46};46};
4747
48struct _UmUserPanelClass48struct _CcUserPanelClass
49{49{
50 CcPanelClass parent_class;50 CcPanelClass parent_class;
51};51};
5252
53GType um_user_panel_get_type (void) G_GNUC_CONST;53GType cc_user_panel_get_type (void) G_GNUC_CONST;
54
55void um_user_panel_register (GIOModule *module);
5654
57G_END_DECLS55G_END_DECLS
5856
5957
=== removed file 'panels/user-accounts/um-user.c'
--- panels/user-accounts/um-user.c 2013-11-28 04:46:27 +0000
+++ panels/user-accounts/um-user.c 1970-01-01 00:00:00 +0000
@@ -1,991 +0,0 @@
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
4 * Copyright (C) 2007-2008 William Jon McCann <mccann@jhu.edu>
5 * Copyright (C) 2009 Red Hat, Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22#define _XOPEN_SOURCE
23
24#include "config.h"
25
26#include <float.h>
27#include <string.h>
28#include <sys/types.h>
29#include <sys/stat.h>
30#include <unistd.h>
31
32#include <glib.h>
33#include <glib/gi18n.h>
34#include <glib/gstdio.h>
35#include <gio/gio.h>
36#include <gtk/gtk.h>
37
38#include <gio/gunixoutputstream.h>
39
40#include "um-user.h"
41#include "um-account-type.h"
42#include "um-utils.h"
43
44
45 #define UM_USER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UM_TYPE_USER, UmUserClass))
46 #define UM_IS_USER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UM_TYPE_USER))
47#define UM_USER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), UM_TYPE_USER, UmUserClass))
48
49#define MAX_FILE_SIZE 65536
50
51typedef struct {
52 uid_t uid;
53 gchar *user_name;
54 gchar *real_name;
55 gint account_type;
56 gint password_mode;
57 gchar *password_hint;
58 gchar *email;
59 gchar *language;
60 gchar *location;
61 guint64 login_frequency;
62 gchar *icon_file;
63 gboolean locked;
64 gboolean automatic_login;
65 gboolean system_account;
66 gboolean local_account;
67} UserProperties;
68
69static void
70user_properties_free (UserProperties *props)
71{
72 g_free (props->user_name);
73 g_free (props->real_name);
74 g_free (props->password_hint);
75 g_free (props->email);
76 g_free (props->language);
77 g_free (props->location);
78 g_free (props->icon_file);
79 g_free (props);
80}
81
82static UserProperties *
83user_properties_get (GDBusConnection *bus,
84 const gchar *object_path)
85{
86 GVariant *result;
87 GVariantIter *iter;
88 gchar *key;
89 GVariant *value;
90 UserProperties *props;
91 GError *error = NULL;
92
93 result = g_dbus_connection_call_sync (bus,
94 "org.freedesktop.Accounts",
95 object_path,
96 "org.freedesktop.DBus.Properties",
97 "GetAll",
98 g_variant_new ("(s)", "org.freedesktop.Accounts.User"),
99 G_VARIANT_TYPE ("(a{sv})"),
100 G_DBUS_CALL_FLAGS_NONE,
101 -1,
102 NULL,
103 &error);
104 if (!result) {
105 g_debug ("Error calling GetAll() when retrieving properties for %s: %s", object_path, error->message);
106 g_error_free (error);
107 return NULL;
108 }
109
110 /* Add some defaults that may not be received from some AccountsService versions */
111 props = g_new0 (UserProperties, 1);
112 props->local_account = TRUE;
113
114 g_variant_get (result, "(a{sv})", &iter);
115 while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) {
116 if (strcmp (key, "Uid") == 0) {
117 g_variant_get (value, "t", &props->uid);
118 }
119 else if (strcmp (key, "UserName") == 0) {
120 g_variant_get (value, "s", &props->user_name);
121 }
122 else if (strcmp (key, "RealName") == 0) {
123 g_variant_get (value, "s", &props->real_name);
124 }
125 else if (strcmp (key, "AccountType") == 0) {
126 g_variant_get (value, "i", &props->account_type);
127 }
128 else if (strcmp (key, "Email") == 0) {
129 g_variant_get (value, "s", &props->email);
130 }
131 else if (strcmp (key, "Language") == 0) {
132 g_variant_get (value, "s", &props->language);
133 }
134 else if (strcmp (key, "Location") == 0) {
135 g_variant_get (value, "s", &props->location);
136 }
137 else if (strcmp (key, "LoginFrequency") == 0) {
138 g_variant_get (value, "t", &props->login_frequency);
139 }
140 else if (strcmp (key, "IconFile") == 0) {
141 g_variant_get (value, "s", &props->icon_file);
142 }
143 else if (strcmp (key, "Locked") == 0) {
144 g_variant_get (value, "b", &props->locked);
145 }
146 else if (strcmp (key, "AutomaticLogin") == 0) {
147 g_variant_get (value, "b", &props->automatic_login);
148 }
149 else if (strcmp (key, "SystemAccount") == 0) {
150 g_variant_get (value, "b", &props->system_account);
151 }
152 else if (strcmp (key, "LocalAccount") == 0) {
153 g_variant_get (value, "b", &props->local_account);
154 }
155 else if (strcmp (key, "PasswordMode") == 0) {
156 g_variant_get (value, "i", &props->password_mode);
157 }
158 else if (strcmp (key, "PasswordHint") == 0) {
159 g_variant_get (value, "s", &props->password_hint);
160 }
161 else if (strcmp (key, "HomeDirectory") == 0) {
162 /* ignore */
163 }
164 else if (strcmp (key, "Shell") == 0) {
165 /* ignore */
166 }
167 else {
168 g_debug ("unhandled property %s", key);
169 }
170 }
171
172 g_variant_iter_free (iter);
173 g_variant_unref (result);
174
175 return props;
176}
177
178
179struct _UmUser {
180 GObject parent;
181
182 GDBusConnection *bus;
183 GDBusProxy *proxy;
184 gchar *object_path;
185
186 UserProperties *props;
187
188 gchar *display_name;
189};
190
191typedef struct _UmUserClass
192{
193 GObjectClass parent_class;
194} UmUserClass;
195
196enum {
197 CHANGED,
198 LAST_SIGNAL
199};
200
201static guint signals[LAST_SIGNAL] = { 0 };
202
203static void um_user_finalize (GObject *object);
204
205G_DEFINE_TYPE (UmUser, um_user, G_TYPE_OBJECT)
206
207static void
208um_user_class_init (UmUserClass *class)
209{
210 GObjectClass *gobject_class;
211
212 gobject_class = G_OBJECT_CLASS (class);
213
214 gobject_class->finalize = um_user_finalize;
215
216 signals[CHANGED] = g_signal_new ("changed",
217 G_TYPE_FROM_CLASS (class),
218 G_SIGNAL_RUN_LAST,
219 0,
220 NULL, NULL,
221 g_cclosure_marshal_VOID__VOID,
222 G_TYPE_NONE, 0);
223}
224
225
226static void
227um_user_init (UmUser *user)
228{
229}
230
231static void
232um_user_finalize (GObject *object)
233{
234 UmUser *user;
235
236 user = UM_USER (object);
237
238 g_free (user->display_name);
239
240 g_object_unref (user->bus);
241 g_free (user->object_path);
242
243 if (user->proxy != NULL)
244 g_object_unref (user->proxy);
245
246 if (user->props != NULL)
247 user_properties_free (user->props);
248
249 (*G_OBJECT_CLASS (um_user_parent_class)->finalize) (object);
250}
251
252uid_t
253um_user_get_uid (UmUser *user)
254{
255 g_return_val_if_fail (UM_IS_USER (user), -1);
256
257 return user->props->uid;
258}
259
260const gchar *
261um_user_get_real_name (UmUser *user)
262{
263 g_return_val_if_fail (UM_IS_USER (user), NULL);
264
265 return user->props->real_name;
266}
267
268const gchar *
269um_user_get_display_name (UmUser *user)
270{
271 g_return_val_if_fail (UM_IS_USER (user), NULL);
272
273 if (user->display_name)
274 return user->display_name;
275 if (user->props->real_name &&
276 *user->props->real_name != '\0')
277 return user->props->real_name;
278
279 return user->props->user_name;
280}
281
282const gchar *
283um_user_get_user_name (UmUser *user)
284{
285 g_return_val_if_fail (UM_IS_USER (user), NULL);
286
287 return user->props->user_name;
288}
289
290gint
291um_user_get_account_type (UmUser *user)
292{
293 g_return_val_if_fail (UM_IS_USER (user), UM_ACCOUNT_TYPE_STANDARD);
294
295 return user->props->account_type;
296}
297
298gulong
299um_user_get_login_frequency (UmUser *user)
300{
301 g_return_val_if_fail (UM_IS_USER (user), 0);
302
303 return user->props->login_frequency;
304}
305
306gint
307um_user_collate (UmUser *user1,
308 UmUser *user2)
309{
310 const char *str1;
311 const char *str2;
312 gulong num1;
313 gulong num2;
314
315 g_return_val_if_fail (UM_IS_USER (user1), 0);
316 g_return_val_if_fail (UM_IS_USER (user2), 0);
317
318 num1 = user1->props->login_frequency;
319 num2 = user2->props->login_frequency;
320 if (num1 > num2) {
321 return -1;
322 }
323
324 if (num1 < num2) {
325 return 1;
326 }
327
328 /* if login frequency is equal try names */
329 if (user1->props->real_name != NULL) {
330 str1 = user1->props->real_name;
331 } else {
332 str1 = user1->props->user_name;
333 }
334
335 if (user2->props->real_name != NULL) {
336 str2 = user2->props->real_name;
337 } else {
338 str2 = user2->props->user_name;
339 }
340
341 if (str1 == NULL && str2 != NULL) {
342 return -1;
343 }
344
345 if (str1 != NULL && str2 == NULL) {
346 return 1;
347 }
348
349 if (str1 == NULL && str2 == NULL) {
350 return 0;
351 }
352
353 return g_utf8_collate (str1, str2);
354}
355
356static gboolean
357check_user_file (const char *filename,
358 gssize max_file_size)
359{
360 struct stat fileinfo;
361
362 if (max_file_size < 0) {
363 max_file_size = G_MAXSIZE;
364 }
365
366 /* Exists/Readable? */
367 if (stat (filename, &fileinfo) < 0) {
368 g_debug ("File does not exist");
369 return FALSE;
370 }
371
372 /* Is a regular file */
373 if (G_UNLIKELY (!S_ISREG (fileinfo.st_mode))) {
374 g_debug ("File is not a regular file");
375 return FALSE;
376 }
377
378 /* Size is kosher? */
379 if (G_UNLIKELY (fileinfo.st_size > max_file_size)) {
380 g_debug ("File is too large");
381 return FALSE;
382 }
383
384 return TRUE;
385}
386
387static GdkPixbuf *
388frame_pixbuf (GdkPixbuf *source)
389{
390 GdkPixbuf *dest;
391 cairo_t *cr;
392 cairo_surface_t *surface;
393 guint w;
394 guint h;
395 int frame_width;
396 double radius;
397
398 frame_width = 2;
399
400 w = gdk_pixbuf_get_width (source) + frame_width * 2;
401 h = gdk_pixbuf_get_height (source) + frame_width * 2;
402 radius = w / 10;
403
404 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
405 w, h);
406 cr = cairo_create (surface);
407 cairo_surface_destroy (surface);
408
409 /* set up image */
410 cairo_rectangle (cr, 0, 0, w, h);
411 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0);
412 cairo_fill (cr);
413
414 rounded_rectangle (cr, 1.0, 0.5, 0.5, radius, w - 1, h - 1);
415 cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.3);
416 cairo_fill_preserve (cr);
417
418 gdk_cairo_set_source_pixbuf (cr, source, frame_width, frame_width);
419 cairo_fill (cr);
420
421 dest = gdk_pixbuf_get_from_surface (surface, 0, 0, w, h);
422
423 cairo_destroy (cr);
424
425 return dest;
426}
427
428GdkPixbuf *
429um_user_render_icon (UmUser *user,
430 gboolean with_frame,
431 gint icon_size)
432{
433 GdkPixbuf *pixbuf;
434 GdkPixbuf *framed;
435 gboolean res;
436 GError *error;
437
438 g_return_val_if_fail (UM_IS_USER (user), NULL);
439 g_return_val_if_fail (icon_size > 12, NULL);
440
441 pixbuf = NULL;
442 if (user->props->icon_file) {
443 res = check_user_file (user->props->icon_file,
444 MAX_FILE_SIZE);
445 if (res) {
446 pixbuf = gdk_pixbuf_new_from_file_at_size (user->props->icon_file,
447 icon_size,
448 icon_size,
449 NULL);
450 }
451 else {
452 pixbuf = NULL;
453 }
454 }
455
456 if (pixbuf != NULL) {
457 goto out;
458 }
459
460 error = NULL;
461 pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
462
463 "avatar-default",
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches