Merge lp:~donadigo/switchboard-plug-parental-controls/fix-home-config into lp:~elementary-pantheon/switchboard-plug-parental-controls/trunk

Proposed by Adam Bieńkowski
Status: Merged
Approved by: Felipe Escoto
Approved revision: 230
Merged at revision: 243
Proposed branch: lp:~donadigo/switchboard-plug-parental-controls/fix-home-config
Merge into: lp:~elementary-pantheon/switchboard-plug-parental-controls/trunk
Diff against target: 819 lines (+193/-153)
18 files modified
CMakeLists.txt (+1/-0)
data/CMakeLists.txt (+1/-0)
data/daemon.conf (+13/-0)
src/CMakeLists.txt (+1/-1)
src/Widgets/GeneralBox.vala (+3/-3)
src/client/CMakeLists.txt (+1/-1)
src/daemon/CMakeLists.txt (+1/-1)
src/daemon/Daemon.vala (+3/-3)
src/daemon/IptablesHelper.vala (+7/-9)
src/daemon/ProcessWatcher.vala (+3/-3)
src/daemon/Server.vala (+11/-2)
src/daemon/SessionHandler.vala (+17/-2)
src/daemon/SessionManager.vala (+14/-5)
src/daemon/UserConfig.vala (+64/-73)
src/shared/Constants.vala.cmake (+2/-2)
src/shared/PAM/Reader.vala (+8/-15)
src/shared/PAM/Writer.vala (+40/-27)
src/shared/Utils.vala (+3/-6)
To merge this branch: bzr merge lp:~donadigo/switchboard-plug-parental-controls/fix-home-config
Reviewer Review Type Date Requested Status
Felipe Escoto (community) Approve
Cody Garver (community) Needs Fixing
Review via email: mp+305406@code.launchpad.net

Commit message

* Save config file to share/pantheon-parental-controls instead of each home folder
* Rename "Vars" to "Constants"
* Do not block apps when not active
* Restarting configuration is now more unified in the code

Description of the change

This branch fixes an issue where created user that was never logged in (and his home directory wasn't initiated) the config file wouldn't be created and the config wouldn't be applied. We now have a config file in data/ folder which will be installed in cmake_install_prefix/share/pantheon-parental-controls. This config provides brief description of what it does and how to use it.

There are also some minor changes like renaming "Vars" to "Constants" and fixing smaller bugs.

This is work for Loki Update.

To post a comment you must log in.
Revision history for this message
Cody Garver (codygarver) wrote :

Needs trunk merged in and conflicts resolved.

review: Needs Fixing
230. By Adam Bieńkowski

Merge trunk; resolve conflicts; fix writing time restrictions logic to PAM configuration

Revision history for this message
Adam Bieńkowski (donadigo) wrote :

Branch updated.

Revision history for this message
Felipe Escoto (philip.scott) wrote :

Stepping to the right direction with this branch. I'm approving it so we can move on without it getting too large

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'CMakeLists.txt'
--- CMakeLists.txt 2016-09-21 13:11:51 +0000
+++ CMakeLists.txt 2016-12-09 17:18:29 +0000
@@ -32,6 +32,7 @@
3232
33# Configure file33# Configure file
34configure_file (${CMAKE_SOURCE_DIR}/config.vala.cmake ${CMAKE_BINARY_DIR}/src/config.vala)34configure_file (${CMAKE_SOURCE_DIR}/config.vala.cmake ${CMAKE_BINARY_DIR}/src/config.vala)
35configure_file (${CMAKE_SOURCE_DIR}/src/shared/Constants.vala.cmake ${CMAKE_SOURCE_DIR}/src/shared/Constants.vala)
35add_definitions (-DGETTEXT_PACKAGE=\"${GETTEXT_PACKAGE}\")36add_definitions (-DGETTEXT_PACKAGE=\"${GETTEXT_PACKAGE}\")
3637
37option (ENABLE_DAEMON_STARTUP "Enable starting daemon on system startup" TRUE)38option (ENABLE_DAEMON_STARTUP "Enable starting daemon on system startup" TRUE)
3839
=== modified file 'data/CMakeLists.txt'
--- data/CMakeLists.txt 2016-09-09 14:51:34 +0000
+++ data/CMakeLists.txt 2016-12-09 17:18:29 +0000
@@ -1,6 +1,7 @@
1configure_file (org.pantheon.switchboard.parental-controls.policy.cmake ${CMAKE_CURRENT_BINARY_DIR}/data/org.pantheon.switchboard.parental-controls.policy)1configure_file (org.pantheon.switchboard.parental-controls.policy.cmake ${CMAKE_CURRENT_BINARY_DIR}/data/org.pantheon.switchboard.parental-controls.policy)
2configure_file (org.pantheon.ParentalControls.service.cmake ${CMAKE_CURRENT_BINARY_DIR}/org.pantheon.ParentalControls.service)2configure_file (org.pantheon.ParentalControls.service.cmake ${CMAKE_CURRENT_BINARY_DIR}/org.pantheon.ParentalControls.service)
33
4install (FILES daemon.conf DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pantheon-parental-controls)
4install (FILES ${CMAKE_CURRENT_BINARY_DIR}/data/org.pantheon.switchboard.parental-controls.policy DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/polkit-1/actions/)5install (FILES ${CMAKE_CURRENT_BINARY_DIR}/data/org.pantheon.switchboard.parental-controls.policy DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/polkit-1/actions/)
5install (FILES ${CMAKE_CURRENT_BINARY_DIR}/org.pantheon.ParentalControls.service DESTINATION share/dbus-1/system-services)6install (FILES ${CMAKE_CURRENT_BINARY_DIR}/org.pantheon.ParentalControls.service DESTINATION share/dbus-1/system-services)
6install (FILES org.pantheon.ParentalControls.conf DESTINATION /etc/dbus-1/system.d)7install (FILES org.pantheon.ParentalControls.conf DESTINATION /etc/dbus-1/system.d)
78
=== added file 'data/daemon.conf'
--- data/daemon.conf 1970-01-01 00:00:00 +0000
+++ data/daemon.conf 2016-12-09 17:18:29 +0000
@@ -0,0 +1,13 @@
1# This is main configuration file for pantheon parental controls daemon.
2# It is used to restrict users and control whethever they can or cannot
3# access a specified service.
4#
5# a simple example of how a configuration for user "username" would look like:
6# [username]
7# Active=false
8# Targets=/path/to/executable1;/path/to/executable2;
9# BlockUrls=website1.com;website2.com
10# Admin=false
11#
12# End of example file.
13#
0\ No newline at end of file14\ No newline at end of file
115
=== modified file 'src/CMakeLists.txt'
--- src/CMakeLists.txt 2016-10-25 21:35:37 +0000
+++ src/CMakeLists.txt 2016-12-09 17:18:29 +0000
@@ -22,7 +22,7 @@
22 Widgets/AppsBox.vala22 Widgets/AppsBox.vala
23 Widgets/AppChooser.vala23 Widgets/AppChooser.vala
24 Widgets/WeekSpinBox.vala24 Widgets/WeekSpinBox.vala
25 shared/Vars.vala25 shared/Constants.vala
26 shared/Utils.vala26 shared/Utils.vala
27 shared/PAM/Token.vala27 shared/PAM/Token.vala
28 shared/PAM/Reader.vala28 shared/PAM/Reader.vala
2929
=== modified file 'src/Widgets/GeneralBox.vala'
--- src/Widgets/GeneralBox.vala 2016-09-27 20:32:53 +0000
+++ src/Widgets/GeneralBox.vala 2016-12-09 17:18:29 +0000
@@ -38,7 +38,7 @@
3838
39 public GeneralBox (Act.User user) {39 public GeneralBox (Act.User user) {
40 this.user = user;40 this.user = user;
41 plank_conf_file_path = Path.build_filename (user.get_home_dir (), Vars.PLANK_CONF_DIR);41 plank_conf_file_path = Path.build_filename (user.get_home_dir (), Constants.PLANK_CONF_DIR);
4242
43 dock_btn.notify["active"].connect (on_dock_btn_activate);43 dock_btn.notify["active"].connect (on_dock_btn_activate);
44 print_btn.notify["active"].connect (on_print_conf_activate);44 print_btn.notify["active"].connect (on_print_conf_activate);
@@ -136,7 +136,7 @@
136 }136 }
137137
138 private void load_restrictions () {138 private void load_restrictions () {
139 var token = PAM.Reader.get_token_for_user (Vars.PAM_TIME_CONF_PATH, user.get_user_name ());139 var token = PAM.Reader.get_token_for_user (Constants.PAM_TIME_CONF_PATH, user.get_user_name ());
140 if (token == null) {140 if (token == null) {
141 return;141 return;
142 }142 }
@@ -204,7 +204,7 @@
204 string[] users = { user.get_user_name () };204 string[] users = { user.get_user_name () };
205205
206 try {206 try {
207 CupsPkHelper? helper = Bus.get_proxy_sync (BusType.SYSTEM, Vars.CUPS_PK_HELPER_IFACE, "/");207 CupsPkHelper? helper = Bus.get_proxy_sync (BusType.SYSTEM, Constants.CUPS_PK_HELPER_IFACE, "/");
208 if (helper == null) {208 if (helper == null) {
209 return;209 return;
210 }210 }
211211
=== modified file 'src/client/CMakeLists.txt'
--- src/client/CMakeLists.txt 2016-08-30 17:40:51 +0000
+++ src/client/CMakeLists.txt 2016-12-09 17:18:29 +0000
@@ -9,7 +9,7 @@
9vala_precompile (VALA_C ${CLIENT_EXEC_NAME}9vala_precompile (VALA_C ${CLIENT_EXEC_NAME}
10 Client.vala10 Client.vala
11 AppUnavailableDialog.vala11 AppUnavailableDialog.vala
12 ${CMAKE_SOURCE_DIR}/src/shared/Vars.vala12 ${CMAKE_SOURCE_DIR}/src/shared/Constants.vala
13 ${CMAKE_SOURCE_DIR}/src/shared/Utils.vala13 ${CMAKE_SOURCE_DIR}/src/shared/Utils.vala
14PACKAGES14PACKAGES
15 posix15 posix
1616
=== modified file 'src/daemon/CMakeLists.txt'
--- src/daemon/CMakeLists.txt 2016-08-30 17:40:51 +0000
+++ src/daemon/CMakeLists.txt 2016-12-09 17:18:29 +0000
@@ -18,7 +18,7 @@
18 Interfaces.vala18 Interfaces.vala
19 UserConfig.vala19 UserConfig.vala
20 Server.vala20 Server.vala
21 ${CMAKE_SOURCE_DIR}/src/shared/Vars.vala21 ${CMAKE_SOURCE_DIR}/src/shared/Constants.vala
22 ${CMAKE_SOURCE_DIR}/src/shared/Utils.vala22 ${CMAKE_SOURCE_DIR}/src/shared/Utils.vala
23 ${CMAKE_SOURCE_DIR}/src/shared/PAM/Token.vala23 ${CMAKE_SOURCE_DIR}/src/shared/PAM/Token.vala
24 ${CMAKE_SOURCE_DIR}/src/shared/PAM/Reader.vala24 ${CMAKE_SOURCE_DIR}/src/shared/PAM/Reader.vala
2525
=== modified file 'src/daemon/Daemon.vala'
--- src/daemon/Daemon.vala 2016-08-29 22:25:35 +0000
+++ src/daemon/Daemon.vala 2016-12-09 17:18:29 +0000
@@ -64,7 +64,7 @@
6464
65 private void on_bus_acquired (DBusConnection connection) {65 private void on_bus_acquired (DBusConnection connection) {
66 try {66 try {
67 connection.register_object (Vars.PARENTAL_CONTROLS_OBJECT_PATH, Server.get_default ());67 connection.register_object (Constants.PARENTAL_CONTROLS_OBJECT_PATH, Server.get_default ());
68 } catch (IOError e) {68 } catch (IOError e) {
69 warning ("%s\n", e.message);69 warning ("%s\n", e.message);
70 }70 }
@@ -75,12 +75,12 @@
75 return;75 return;
76 }76 }
7777
78 Bus.own_name (BusType.SYSTEM, Vars.PARENTAL_CONTROLS_IFACE, BusNameOwnerFlags.REPLACE,78 Bus.own_name (BusType.SYSTEM, Constants.PARENTAL_CONTROLS_IFACE, BusNameOwnerFlags.REPLACE,
79 on_bus_acquired,79 on_bus_acquired,
80 () => {},80 () => {},
81 on_bus_lost);81 on_bus_lost);
8282
83 session_manager = new SessionManager ();83 session_manager = SessionManager.get_default ();
84 session_manager.start ();84 session_manager.start ();
85 }85 }
8686
8787
=== modified file 'src/daemon/IptablesHelper.vala'
--- src/daemon/IptablesHelper.vala 2016-08-30 17:28:55 +0000
+++ src/daemon/IptablesHelper.vala 2016-12-09 17:18:29 +0000
@@ -27,7 +27,6 @@
2727
28 private UserConfig config;28 private UserConfig config;
29 private string[] current_urls;29 private string[] current_urls;
30 private ulong changed_signal_id;
3130
32 public static bool get_can_start () {31 public static bool get_can_start () {
33 return Environment.find_program_in_path (IPTABLES_EXEC) != null;32 return Environment.find_program_in_path (IPTABLES_EXEC) != null;
@@ -40,18 +39,17 @@
40 public void start () {39 public void start () {
41 this.current_urls = config.get_block_urls ();40 this.current_urls = config.get_block_urls ();
42 add_rules ();41 add_rules ();
4342 }
44 changed_signal_id = config.changed.connect (() => {43
45 remove_rules ();44 public void restart () {
4645 remove_rules ();
47 current_urls = config.get_block_urls ();46
48 add_rules ();47 current_urls = config.get_block_urls ();
49 });48 add_rules ();
50 }49 }
5150
52 public void stop () {51 public void stop () {
53 remove_rules ();52 remove_rules ();
54 disconnect (changed_signal_id);
55 }53 }
5654
57 private void add_rules () {55 private void add_rules () {
5856
=== modified file 'src/daemon/ProcessWatcher.vala'
--- src/daemon/ProcessWatcher.vala 2016-10-25 21:35:37 +0000
+++ src/daemon/ProcessWatcher.vala 2016-12-09 17:18:29 +0000
@@ -42,7 +42,7 @@
42 }42 }
4343
44 private void handle_pid (int pid) {44 private void handle_pid (int pid) {
45 if (config == null) {45 if (config == null || !config.get_active ()) {
46 return;46 return;
47 }47 }
4848
@@ -86,7 +86,7 @@
86 try {86 try {
87 var unix_user = new Polkit.UnixUser.for_name (config.username);87 var unix_user = new Polkit.UnixUser.for_name (config.username);
88 var result = authority.check_authorization_sync (new Polkit.UnixProcess.for_owner (client_pid, 0, unix_user.get_uid ()),88 var result = authority.check_authorization_sync (new Polkit.UnixProcess.for_owner (client_pid, 0, unix_user.get_uid ()),
89 Vars.PARENTAL_CONTROLS_ACTION_ID,89 Constants.PARENTAL_CONTROLS_ACTION_ID,
90 null,90 null,
91 Polkit.CheckAuthorizationFlags.NONE);91 Polkit.CheckAuthorizationFlags.NONE);
92 if (result.get_is_authorized ()) {92 if (result.get_is_authorized ()) {
@@ -100,7 +100,7 @@
100 server.disconnect (signal_id);100 server.disconnect (signal_id);
101 });101 });
102102
103 server.app_authorize (config.username, executable, Vars.PARENTAL_CONTROLS_ACTION_ID);103 server.app_authorize (config.username, executable, Constants.PARENTAL_CONTROLS_ACTION_ID);
104 } else {104 } else {
105 server.show_app_unavailable (executable);105 server.show_app_unavailable (executable);
106 }106 }
107107
=== modified file 'src/daemon/Server.vala'
--- src/daemon/Server.vala 2016-10-25 21:35:37 +0000
+++ src/daemon/Server.vala 2016-12-09 17:18:29 +0000
@@ -60,6 +60,8 @@
60 }60 }
6161
62 UserConfig.init ();62 UserConfig.init ();
63
64 config_changed.connect (on_config_changed);
63 }65 }
6466
65 [DBus (visible = false)]67 [DBus (visible = false)]
@@ -69,7 +71,7 @@
69 public signal void launch (string[] args);71 public signal void launch (string[] args);
70 public signal void show_app_unavailable (string path);72 public signal void show_app_unavailable (string path);
71 public signal void show_timeout (int hours, int minutes);73 public signal void show_timeout (int hours, int minutes);
72 public signal void user_config_changed (string username);74 public signal void config_changed ();
7375
74 public void end_app_authorization (BusName sender) {76 public void end_app_authorization (BusName sender) {
75 uint32 pid = get_pid_from_sender (sender);77 uint32 pid = get_pid_from_sender (sender);
@@ -188,6 +190,13 @@
188 return config.get_admin ();190 return config.get_admin ();
189 }191 }
190192
193 private void on_config_changed () {
194 var current_handler = SessionManager.get_default ().current_handler;
195 if (current_handler != null) {
196 current_handler.update ();
197 }
198 }
199
191 private void ensure_pam_lightdm_enabled () {200 private void ensure_pam_lightdm_enabled () {
192 string path = "/etc/pam.d/lightdm";201 string path = "/etc/pam.d/lightdm";
193 202
@@ -231,7 +240,7 @@
231240
232 try {241 try {
233 var authority = Polkit.Authority.get_sync (null);242 var authority = Polkit.Authority.get_sync (null);
234 var auth_result = authority.check_authorization_sync (subject, Vars.PARENTAL_CONTROLS_ACTION_ID, null, Polkit.CheckAuthorizationFlags.NONE);243 var auth_result = authority.check_authorization_sync (subject, Constants.PARENTAL_CONTROLS_ACTION_ID, null, Polkit.CheckAuthorizationFlags.NONE);
235 return auth_result.get_is_authorized (); 244 return auth_result.get_is_authorized ();
236 } catch (Error e) {245 } catch (Error e) {
237 warning (e.message);246 warning (e.message);
238247
=== modified file 'src/daemon/SessionHandler.vala'
--- src/daemon/SessionHandler.vala 2016-08-30 17:28:55 +0000
+++ src/daemon/SessionHandler.vala 2016-12-09 17:18:29 +0000
@@ -43,7 +43,7 @@
4343
44 iptables_helper = new IptablesHelper (config);44 iptables_helper = new IptablesHelper (config);
4545
46 var token = PAM.Reader.get_token_for_user (Vars.PAM_TIME_CONF_PATH, session.name);46 var token = PAM.Reader.get_token_for_user (Constants.PAM_TIME_CONF_PATH, session.name);
47 if (token != null) {47 if (token != null) {
48 timer = new Timer (token);48 timer = new Timer (token);
49 timer.terminate.connect (() => {49 timer.terminate.connect (() => {
@@ -53,7 +53,7 @@
53 warning (e.message);53 warning (e.message);
54 } 54 }
55 });55 });
56 } 56 }
57 }57 }
5858
59 public string get_id () {59 public string get_id () {
@@ -78,6 +78,21 @@
78 }78 }
79 }79 }
8080
81 public void update () {
82 if (!config.get_active ()) {
83 iptables_helper.stop ();
84 if (timer != null) {
85 timer.stop ();
86 }
87
88 return;
89 }
90
91 if (IptablesHelper.get_can_start ()) {
92 iptables_helper.restart ();
93 }
94 }
95
81 public void stop () {96 public void stop () {
82 iptables_helper.stop ();97 iptables_helper.stop ();
83 if (timer != null) {98 if (timer != null) {
8499
=== modified file 'src/daemon/SessionManager.vala'
--- src/daemon/SessionManager.vala 2016-08-30 17:28:55 +0000
+++ src/daemon/SessionManager.vala 2016-12-09 17:18:29 +0000
@@ -22,16 +22,25 @@
2222
23 namespace PC.Daemon {23 namespace PC.Daemon {
24 public class SessionManager : Object {24 public class SessionManager : Object {
25 private SessionHandler? current_handler = null;25 public SessionHandler? current_handler = null;
26 private IManager? manager = null;26 private IManager? manager = null;
27 private DBusConnection? conn = null;27 private DBusConnection? conn = null;
28 private ProcessWatcher pwatcher;28 private ProcessWatcher pwatcher;
2929
30 private uint[] signal_ids;30 private uint[] signal_ids;
3131
32 private static SessionManager? instance = null;
33 public static SessionManager get_default () {
34 if (instance == null) {
35 instance = new SessionManager ();
36 }
37
38 return instance;
39 }
40
32 public SessionManager () {41 public SessionManager () {
33 try {42 try {
34 manager = Bus.get_proxy_sync (BusType.SYSTEM, Vars.LOGIN_IFACE, Vars.LOGIN_OBJECT_PATH);43 manager = Bus.get_proxy_sync (BusType.SYSTEM, Constants.LOGIN_IFACE, Constants.LOGIN_OBJECT_PATH);
35 conn = Bus.get_sync (BusType.SYSTEM, null);44 conn = Bus.get_sync (BusType.SYSTEM, null);
36 } catch (IOError e) {45 } catch (IOError e) {
37 warning ("%s\n", e.message);46 warning ("%s\n", e.message);
@@ -52,7 +61,7 @@
52 try {61 try {
53 foreach (SeatStruct seat_s in manager.list_seats ()) {62 foreach (SeatStruct seat_s in manager.list_seats ()) {
54 signal_ids += conn.signal_subscribe (null,63 signal_ids += conn.signal_subscribe (null,
55 Vars.DBUS_PROPERTIES_IFACE,64 Constants.DBUS_PROPERTIES_IFACE,
56 "PropertiesChanged",65 "PropertiesChanged",
57 seat_s.object_path,66 seat_s.object_path,
58 null,67 null,
@@ -78,7 +87,7 @@
78 try {87 try {
79 var structs = manager.list_sessions ();88 var structs = manager.list_sessions ();
80 foreach (SessionStruct session_s in structs) {89 foreach (SessionStruct session_s in structs) {
81 ISession? session = Bus.get_proxy_sync (BusType.SYSTEM, Vars.LOGIN_IFACE, session_s.object_path);90 ISession? session = Bus.get_proxy_sync (BusType.SYSTEM, Constants.LOGIN_IFACE, session_s.object_path);
82 if (session != null && session.active) {91 if (session != null && session.active) {
83 return session;92 return session;
84 }93 }
@@ -100,7 +109,7 @@
100109
101 if (session != null &&110 if (session != null &&
102 session.name != null &&111 session.name != null &&
103 !(session.name in Vars.DAEMON_IGNORED_USERS)) {112 !(session.name in Constants.DAEMON_IGNORED_USERS)) {
104 current_handler = new SessionHandler (session);113 current_handler = new SessionHandler (session);
105 current_handler.start ();114 current_handler.start ();
106 pwatcher.set_config (current_handler.get_config ());115 pwatcher.set_config (current_handler.get_config ());
107116
=== modified file 'src/daemon/UserConfig.vala'
--- src/daemon/UserConfig.vala 2016-08-30 17:28:55 +0000
+++ src/daemon/UserConfig.vala 2016-12-09 17:18:29 +0000
@@ -23,11 +23,8 @@
23namespace PC.Daemon {23namespace PC.Daemon {
24 public class UserConfig : Object {24 public class UserConfig : Object {
25 public string username;25 public string username;
26 public signal void changed ();26
2727 private static KeyFile key;
28 private KeyFile key;
29 private string config_path;
30
31 private static List<UserConfig> config_list;28 private static List<UserConfig> config_list;
3229
33 public static UserConfig? get_for_username (string username, bool create) {30 public static UserConfig? get_for_username (string username, bool create) {
@@ -38,9 +35,9 @@
38 }35 }
3936
40 if (create) {37 if (create) {
41 return create_for_username (username); 38 return create_for_username (username);
42 }39 }
43 40
44 return null;41 return null;
45 }42 }
4643
@@ -51,84 +48,96 @@
51 public static void init () {48 public static void init () {
52 config_list = new List<UserConfig> ();49 config_list = new List<UserConfig> ();
5350
51 key = new KeyFile ();
52 key.set_list_separator (';');
53
54 if (!init_config_file ()) {
55 return;
56 }
57
58 try {
59 key.load_from_file (Constants.DAEMON_CONF_FILE, KeyFileFlags.KEEP_COMMENTS | KeyFileFlags.KEEP_TRANSLATIONS);
60 } catch (KeyFileError e) {
61 warning (e.message);
62 } catch (FileError e) {
63 warning (e.message);
64 }
65
54 foreach (Act.User user in Utils.get_usermanager ().list_users ()) {66 foreach (Act.User user in Utils.get_usermanager ().list_users ()) {
55 string config_path = Utils.build_daemon_conf_path (user);67 string username = user.get_user_name ();
56 if (!FileUtils.test (config_path, FileTest.IS_REGULAR)) {68 if (!key.has_group (username)) {
57 continue;69 continue;
58 }70 }
5971
60 var key = new KeyFile ();72 var user_config = new UserConfig (username);
61 key.set_list_separator (';');
62 try {
63 if (!key.load_from_file (config_path, KeyFileFlags.NONE)) {
64 continue;
65 }
66 } catch (KeyFileError e) {
67 warning (e.message);
68 continue;
69 } catch (FileError e) {
70 warning (e.message);
71 continue;
72 }
73
74 var user_config = new UserConfig (config_path, user.get_user_name (), key);
75 config_list.append (user_config);73 config_list.append (user_config);
76 }74 }
77 }75 }
7876
77 private static bool init_config_file () {
78 var file = File.new_for_path (Constants.DAEMON_CONF_FILE);
79 if (!file.query_exists ()) {
80 critical ("Could not found daemon config file: %s does not exist".printf (file.get_path ()));
81 return false;
82 }
83
84 try {
85 var monitor = file.monitor (FileMonitorFlags.NONE, null);
86 monitor.changed.connect ((src, dest, event) => {
87 if (event == FileMonitorEvent.CHANGES_DONE_HINT) {
88 foreach (UserConfig config in config_list) {
89 config.update_key ();
90 }
91
92 Server.get_default ().config_changed ();
93 }
94 });
95 } catch (Error e) {
96 warning (e.message);
97 }
98
99 return true;
100 }
101
79 private static UserConfig? create_for_username (string username) {102 private static UserConfig? create_for_username (string username) {
80 var user = Utils.get_usermanager ().get_user (username);103 var user = Utils.get_usermanager ().get_user (username);
81 if (user == null) {104 if (user == null) {
82 return null;105 return null;
83 }106 }
84107
85 string config_path = Utils.build_daemon_conf_path (user);108 var config = new UserConfig (username);
86 var file = File.new_for_path (config_path);109 config.set_active (false);
87 try {
88 file.create (FileCreateFlags.PRIVATE);
89 } catch (FileError e) {
90 warning (e.message);
91 return null;
92 } catch (Error e) {
93 warning (e.message);
94 return null;
95 }
96
97 var config = new UserConfig (config_path, username, new KeyFile ());
98 config_list.append (config);110 config_list.append (config);
99 return config;111 return config;
100 }112 }
101113
102 private UserConfig (string config_path, string username, KeyFile key) {114 private UserConfig (string username) {
103 this.username = username;115 this.username = username;
104 this.key = key;
105 this.config_path = config_path;
106 monitor_file ();
107 }116 }
108117
109 public void set_active (bool active) {118 public void set_active (bool active) {
110 key.set_boolean (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_ACTIVE, active);119 key.set_boolean (username, Constants.DAEMON_KEY_ACTIVE, active);
111 save ();120 save ();
112 }121 }
113122
114 public void set_targets (string[] targets) {123 public void set_targets (string[] targets) {
115 key.set_string_list (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_TARGETS, targets);124 key.set_string_list (username, Constants.DAEMON_KEY_TARGETS, targets);
116 save ();125 save ();
117 }126 }
118127
119 public void set_block_urls (string[] block_urls) {128 public void set_block_urls (string[] block_urls) {
120 key.set_string_list (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_BLOCK_URLS, block_urls);129 key.set_string_list (username, Constants.DAEMON_KEY_BLOCK_URLS, block_urls);
121 save ();130 save ();
122 }131 }
123132
124 public void set_admin (bool admin) {133 public void set_admin (bool admin) {
125 key.set_boolean (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_ADMIN, admin);134 key.set_boolean (username, Constants.DAEMON_KEY_ADMIN, admin);
126 save ();135 save ();
127 }136 }
128137
129 public bool get_active () {138 public bool get_active () {
130 try {139 try {
131 return key.get_boolean (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_ACTIVE);140 return key.get_boolean (username, Constants.DAEMON_KEY_ACTIVE);
132 } catch (KeyFileError e) {141 } catch (KeyFileError e) {
133 warning (e.message);142 warning (e.message);
134 }143 }
@@ -138,7 +147,7 @@
138147
139 public string[] get_targets () {148 public string[] get_targets () {
140 try { 149 try {
141 return key.get_string_list (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_TARGETS);150 return key.get_string_list (username, Constants.DAEMON_KEY_TARGETS);
142 } catch (KeyFileError e) {151 } catch (KeyFileError e) {
143 warning (e.message);152 warning (e.message);
144 } 153 }
@@ -148,7 +157,7 @@
148157
149 public string[] get_block_urls () {158 public string[] get_block_urls () {
150 try {159 try {
151 return key.get_string_list (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_BLOCK_URLS);160 return key.get_string_list (username, Constants.DAEMON_KEY_BLOCK_URLS);
152 } catch (KeyFileError e) {161 } catch (KeyFileError e) {
153 warning (e.message);162 warning (e.message);
154 }163 }
@@ -158,7 +167,7 @@
158167
159 public bool get_admin () {168 public bool get_admin () {
160 try {169 try {
161 return key.get_boolean (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_ADMIN);170 return key.get_boolean (username, Constants.DAEMON_KEY_ADMIN);
162 } catch (KeyFileError e) {171 } catch (KeyFileError e) {
163 warning (e.message);172 warning (e.message);
164 }173 }
@@ -166,26 +175,9 @@
166 return false;175 return false;
167 }176 }
168177
169 private void monitor_file () {178 public void update_key () {
170 var file = File.new_for_path (config_path);179 try {
171 try {180 key.load_from_file (Constants.DAEMON_CONF_FILE, KeyFileFlags.KEEP_COMMENTS | KeyFileFlags.KEEP_TRANSLATIONS);
172 var monitor = file.monitor (FileMonitorFlags.NONE, null);
173 monitor.changed.connect ((src, dest, event) => {
174 if (event == FileMonitorEvent.CHANGES_DONE_HINT) {
175 update_key ();
176
177 Server.get_default ().user_config_changed (username);
178 changed ();
179 }
180 });
181 } catch (Error e) {
182 warning (e.message);
183 }
184 }
185
186 private void update_key () {
187 try {
188 key.load_from_file (config_path, KeyFileFlags.NONE);
189 } catch (KeyFileError e) {181 } catch (KeyFileError e) {
190 warning (e.message);182 warning (e.message);
191 } catch (FileError e) {183 } catch (FileError e) {
@@ -195,14 +187,13 @@
195187
196 private void save () {188 private void save () {
197 try {189 try {
198 key.save_to_file (config_path);190 key.save_to_file (Constants.DAEMON_CONF_FILE);
199 } catch (FileError e) {191 } catch (FileError e) {
200 warning (e.message);192 warning (e.message);
201 return;193 return;
202 }194 }
203195
204 Server.get_default ().user_config_changed (username);196 Server.get_default ().config_changed ();
205 changed ();
206 }197 }
207 }198 }
208}199}
209\ No newline at end of file200\ No newline at end of file
210201
=== renamed file 'src/shared/Vars.vala' => 'src/shared/Constants.vala.cmake'
--- src/shared/Vars.vala 2016-08-29 22:25:35 +0000
+++ src/shared/Constants.vala.cmake 2016-12-09 17:18:29 +0000
@@ -20,7 +20,7 @@
20 * Authored by: Adam Bieńkowski <donadigos159@gmail.com>20 * Authored by: Adam Bieńkowski <donadigos159@gmail.com>
21 */21 */
22 22
23namespace PC.Vars {23namespace PC.Constants {
24 public const string LOGIN_IFACE = "org.freedesktop.login1";24 public const string LOGIN_IFACE = "org.freedesktop.login1";
25 public const string LOGIN_OBJECT_PATH = "/org/freedesktop/login1";25 public const string LOGIN_OBJECT_PATH = "/org/freedesktop/login1";
26 public const string DBUS_PROPERTIES_IFACE = "org.freedesktop.DBus.Properties";26 public const string DBUS_PROPERTIES_IFACE = "org.freedesktop.DBus.Properties";
@@ -31,7 +31,7 @@
31 public const string PLANK_CONF_DIR = "/.config/plank/dock1/settings";31 public const string PLANK_CONF_DIR = "/.config/plank/dock1/settings";
32 public const string PLANK_CONF_GROUP = "PlankDockPreferences";32 public const string PLANK_CONF_GROUP = "PlankDockPreferences";
33 public const string PLANK_CONF_LOCK_ITEMS_KEY = "LockItems";33 public const string PLANK_CONF_LOCK_ITEMS_KEY = "LockItems";
34 public const string DAEMON_CONF_DIR = "/.config/pantheon-parental-controls-daemon.conf";34 public const string DAEMON_CONF_FILE = "@CMAKE_INSTALL_PREFIX@/share/pantheon-parental-controls/daemon.conf";
35 public const string[] DAEMON_IGNORED_USERS = { "lightdm" };35 public const string[] DAEMON_IGNORED_USERS = { "lightdm" };
36 public const string DAEMON_GROUP = "PCDaemon";36 public const string DAEMON_GROUP = "PCDaemon";
37 public const string DAEMON_KEY_ACTIVE = "Active";37 public const string DAEMON_KEY_ACTIVE = "Active";
3838
=== modified file 'src/shared/PAM/Reader.vala'
--- src/shared/PAM/Reader.vala 2016-08-30 17:28:55 +0000
+++ src/shared/PAM/Reader.vala 2016-12-09 17:18:29 +0000
@@ -22,22 +22,15 @@
2222
23namespace PC.PAM {23namespace PC.PAM {
24 public class Reader : Object {24 public class Reader : Object {
25 public static string get_config (string contents, bool ignore_comments = true) {25 public static string get_config (string contents, out int start_idx, out int end_idx) {
26 string config = "";26 start_idx = contents.index_of (Constants.PAM_CONF_START);
27 end_idx = contents.index_of (Constants.PAM_CONF_END) + Constants.PAM_CONF_END.char_count ();
2728
28 int start_idx = contents.index_of (Vars.PAM_CONF_START);
29 int end_idx = contents.index_of (Vars.PAM_CONF_END) + Vars.PAM_CONF_END.char_count ();
30 if (start_idx == -1 || end_idx == -1) {29 if (start_idx == -1 || end_idx == -1) {
31 return config;30 return "";
32 }31 }
3332
34 config = contents.slice (start_idx, end_idx);33 return contents.slice (start_idx, end_idx);
35
36 if (ignore_comments) {
37 return Utils.remove_comments (config);
38 }
39
40 return config;
41 }34 }
4235
43 public static List<Token> get_tokens (string filename) {36 public static List<Token> get_tokens (string filename) {
@@ -49,7 +42,7 @@
49 return new List<Token> ();42 return new List<Token> ();
50 }43 }
5144
52 string config = get_config (contents);45 string config = get_config (contents, null, null);
53 return Token.parse (config);46 return Token.parse (config);
54 }47 }
5548
5649
=== modified file 'src/shared/PAM/Writer.vala'
--- src/shared/PAM/Writer.vala 2016-08-30 17:28:55 +0000
+++ src/shared/PAM/Writer.vala 2016-12-09 17:18:29 +0000
@@ -25,7 +25,7 @@
25 private string filename;25 private string filename;
2626
27 public static Writer new_for_time () {27 public static Writer new_for_time () {
28 return new Writer (Vars.PAM_TIME_CONF_PATH);28 return new Writer (Constants.PAM_TIME_CONF_PATH);
29 }29 }
3030
31 public Writer (string filename) {31 public Writer (string filename) {
@@ -33,13 +33,11 @@
33 }33 }
3434
35 public void add_restriction_for_user (string input, bool clean) {35 public void add_restriction_for_user (string input, bool clean) {
36 string? clean_username = null;
36 if (clean) {37 if (clean) {
37 var token = Token.parse_line (input);38 var token = Token.parse_line (input);
38 if (token != null) {39 if (token != null) {
39 string username = token.get_user_arg0 ();40 clean_username = token.get_user_arg0 ();
40 if (Reader.get_token_for_user (filename, username) != null) {
41 remove_restriction_for_user (username);
42 }
43 } 41 }
44 }42 }
4543
@@ -51,26 +49,32 @@
51 return;49 return;
52 }50 }
5351
54 string config = Reader.get_config (contents, false);52 int start_idx;
5553 int end_idx;
56 var builder = new StringBuilder (Vars.PAM_CONF_START);54 string config = Reader.get_config (contents, out start_idx, out end_idx);
57 if (config != "") {55
58 builder.append ("\n");56 if (start_idx != -1 && end_idx != -1) {
59 builder.append (Utils.remove_comments (config));57 contents = contents.splice (start_idx - 1, end_idx);
60 } else {58 }
59
60 var builder = new StringBuilder (Constants.PAM_CONF_START);
61 builder.append ("\n");
62
63 foreach (var token in Token.parse (config)) {
64 if (token.get_user_arg0 () == clean_username) {
65 continue;
66 }
67
68 builder.append (token.to_string ());
61 builder.append ("\n");69 builder.append ("\n");
62 }70 }
6371
64 builder.append (input);72 builder.append (input);
65 builder.append ("\n");73 builder.append ("\n");
66 builder.append (Vars.PAM_CONF_END);74 builder.append (Constants.PAM_CONF_END);
6775
68 try {76 try {
69 if (config != "") {77 FileUtils.set_contents (filename, "%s\n%s".printf (contents, builder.str));
70 FileUtils.set_contents (filename, contents.replace (config, builder.str));
71 } else {
72 FileUtils.set_contents (filename, "\n%s\n%s\n".printf (contents, builder.str));
73 }
74 } catch (FileError e) {78 } catch (FileError e) {
75 warning ("%s\n", e.message);79 warning ("%s\n", e.message);
76 }80 }
@@ -85,26 +89,35 @@
85 return;89 return;
86 }90 }
8791
88 string config = Reader.get_config (contents);92 int start_idx;
93 int end_idx;
94 string config = Reader.get_config (contents, out start_idx, out end_idx);
8995
90 if (config == "") {96 if (start_idx != -1 && end_idx != -1) {
97 contents = contents.splice (start_idx - 1, end_idx);
98 } else {
91 return;99 return;
92 }100 }
93101
94 string buffer = "";102 var builder = new StringBuilder (Constants.PAM_CONF_START);
103 builder.append ("\n");
95104
96 foreach (string line in config.split ("\n")) {105 foreach (var token in Token.parse (config)) {
97 var token = Token.parse_line (line);106 if (token.get_user_arg0 () == username) {
98 if (token != null && token.get_user_arg0 () != username) {107 continue;
99 buffer += line;
100 }108 }
109
110 builder.append (token.to_string ());
111 builder.append ("\n");
101 }112 }
102113
114 builder.append (Constants.PAM_CONF_END);
115
103 try {116 try {
104 FileUtils.set_contents (filename, contents.replace (config, buffer));117 FileUtils.set_contents (filename, "%s\n%s".printf (contents, builder.str));
105 } catch (FileError e) {118 } catch (FileError e) {
106 warning ("%s\n", e.message);119 warning ("%s\n", e.message);
107 }120 }
108 } 121 }
109 }122 }
110}123}
111\ No newline at end of file124\ No newline at end of file
112125
=== modified file 'src/shared/Utils.vala'
--- src/shared/Utils.vala 2016-10-25 21:35:37 +0000
+++ src/shared/Utils.vala 2016-12-09 17:18:29 +0000
@@ -75,7 +75,7 @@
75 }75 }
7676
77 try {77 try {
78 api = Bus.get_proxy_sync (BusType.SYSTEM, Vars.PARENTAL_CONTROLS_IFACE, Vars.PARENTAL_CONTROLS_OBJECT_PATH);78 api = Bus.get_proxy_sync (BusType.SYSTEM, Constants.PARENTAL_CONTROLS_IFACE, Constants.PARENTAL_CONTROLS_OBJECT_PATH);
79 } catch (Error e) {79 } catch (Error e) {
80 critical ("%s, using dummy parental controls backend", e.message);80 critical ("%s, using dummy parental controls backend", e.message);
81 api = new DummyParentalControls ();81 api = new DummyParentalControls ();
@@ -90,8 +90,9 @@
90 }90 }
9191
92 try {92 try {
93
93 var user = new Polkit.UnixUser.for_name (Environment.get_user_name ());94 var user = new Polkit.UnixUser.for_name (Environment.get_user_name ());
94 permission = new Polkit.Permission.sync (Vars.PARENTAL_CONTROLS_ACTION_ID,95 permission = new Polkit.Permission.sync (Constants.PARENTAL_CONTROLS_ACTION_ID,
95 new Polkit.UnixProcess.for_owner (Posix.getpid (), 0, user.get_uid ()));96 new Polkit.UnixProcess.for_owner (Posix.getpid (), 0, user.get_uid ()));
96 return permission;97 return permission;
97 } catch (Error e) {98 } catch (Error e) {
@@ -132,9 +133,5 @@
132133
133 return buffer;134 return buffer;
134 }135 }
135
136 public static string build_daemon_conf_path (Act.User user) {
137 return Path.build_filename (user.get_home_dir (), Vars.DAEMON_CONF_DIR);
138 }
139 }136 }
140}137}

Subscribers

People subscribed via source and target branches

to all changes: