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
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2016-09-21 13:11:51 +0000
3+++ CMakeLists.txt 2016-12-09 17:18:29 +0000
4@@ -32,6 +32,7 @@
5
6 # Configure file
7 configure_file (${CMAKE_SOURCE_DIR}/config.vala.cmake ${CMAKE_BINARY_DIR}/src/config.vala)
8+configure_file (${CMAKE_SOURCE_DIR}/src/shared/Constants.vala.cmake ${CMAKE_SOURCE_DIR}/src/shared/Constants.vala)
9 add_definitions (-DGETTEXT_PACKAGE=\"${GETTEXT_PACKAGE}\")
10
11 option (ENABLE_DAEMON_STARTUP "Enable starting daemon on system startup" TRUE)
12
13=== modified file 'data/CMakeLists.txt'
14--- data/CMakeLists.txt 2016-09-09 14:51:34 +0000
15+++ data/CMakeLists.txt 2016-12-09 17:18:29 +0000
16@@ -1,6 +1,7 @@
17 configure_file (org.pantheon.switchboard.parental-controls.policy.cmake ${CMAKE_CURRENT_BINARY_DIR}/data/org.pantheon.switchboard.parental-controls.policy)
18 configure_file (org.pantheon.ParentalControls.service.cmake ${CMAKE_CURRENT_BINARY_DIR}/org.pantheon.ParentalControls.service)
19
20+install (FILES daemon.conf DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pantheon-parental-controls)
21 install (FILES ${CMAKE_CURRENT_BINARY_DIR}/data/org.pantheon.switchboard.parental-controls.policy DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/polkit-1/actions/)
22 install (FILES ${CMAKE_CURRENT_BINARY_DIR}/org.pantheon.ParentalControls.service DESTINATION share/dbus-1/system-services)
23 install (FILES org.pantheon.ParentalControls.conf DESTINATION /etc/dbus-1/system.d)
24
25=== added file 'data/daemon.conf'
26--- data/daemon.conf 1970-01-01 00:00:00 +0000
27+++ data/daemon.conf 2016-12-09 17:18:29 +0000
28@@ -0,0 +1,13 @@
29+# This is main configuration file for pantheon parental controls daemon.
30+# It is used to restrict users and control whethever they can or cannot
31+# access a specified service.
32+#
33+# a simple example of how a configuration for user "username" would look like:
34+# [username]
35+# Active=false
36+# Targets=/path/to/executable1;/path/to/executable2;
37+# BlockUrls=website1.com;website2.com
38+# Admin=false
39+#
40+# End of example file.
41+#
42\ No newline at end of file
43
44=== modified file 'src/CMakeLists.txt'
45--- src/CMakeLists.txt 2016-10-25 21:35:37 +0000
46+++ src/CMakeLists.txt 2016-12-09 17:18:29 +0000
47@@ -22,7 +22,7 @@
48 Widgets/AppsBox.vala
49 Widgets/AppChooser.vala
50 Widgets/WeekSpinBox.vala
51- shared/Vars.vala
52+ shared/Constants.vala
53 shared/Utils.vala
54 shared/PAM/Token.vala
55 shared/PAM/Reader.vala
56
57=== modified file 'src/Widgets/GeneralBox.vala'
58--- src/Widgets/GeneralBox.vala 2016-09-27 20:32:53 +0000
59+++ src/Widgets/GeneralBox.vala 2016-12-09 17:18:29 +0000
60@@ -38,7 +38,7 @@
61
62 public GeneralBox (Act.User user) {
63 this.user = user;
64- plank_conf_file_path = Path.build_filename (user.get_home_dir (), Vars.PLANK_CONF_DIR);
65+ plank_conf_file_path = Path.build_filename (user.get_home_dir (), Constants.PLANK_CONF_DIR);
66
67 dock_btn.notify["active"].connect (on_dock_btn_activate);
68 print_btn.notify["active"].connect (on_print_conf_activate);
69@@ -136,7 +136,7 @@
70 }
71
72 private void load_restrictions () {
73- var token = PAM.Reader.get_token_for_user (Vars.PAM_TIME_CONF_PATH, user.get_user_name ());
74+ var token = PAM.Reader.get_token_for_user (Constants.PAM_TIME_CONF_PATH, user.get_user_name ());
75 if (token == null) {
76 return;
77 }
78@@ -204,7 +204,7 @@
79 string[] users = { user.get_user_name () };
80
81 try {
82- CupsPkHelper? helper = Bus.get_proxy_sync (BusType.SYSTEM, Vars.CUPS_PK_HELPER_IFACE, "/");
83+ CupsPkHelper? helper = Bus.get_proxy_sync (BusType.SYSTEM, Constants.CUPS_PK_HELPER_IFACE, "/");
84 if (helper == null) {
85 return;
86 }
87
88=== modified file 'src/client/CMakeLists.txt'
89--- src/client/CMakeLists.txt 2016-08-30 17:40:51 +0000
90+++ src/client/CMakeLists.txt 2016-12-09 17:18:29 +0000
91@@ -9,7 +9,7 @@
92 vala_precompile (VALA_C ${CLIENT_EXEC_NAME}
93 Client.vala
94 AppUnavailableDialog.vala
95- ${CMAKE_SOURCE_DIR}/src/shared/Vars.vala
96+ ${CMAKE_SOURCE_DIR}/src/shared/Constants.vala
97 ${CMAKE_SOURCE_DIR}/src/shared/Utils.vala
98 PACKAGES
99 posix
100
101=== modified file 'src/daemon/CMakeLists.txt'
102--- src/daemon/CMakeLists.txt 2016-08-30 17:40:51 +0000
103+++ src/daemon/CMakeLists.txt 2016-12-09 17:18:29 +0000
104@@ -18,7 +18,7 @@
105 Interfaces.vala
106 UserConfig.vala
107 Server.vala
108- ${CMAKE_SOURCE_DIR}/src/shared/Vars.vala
109+ ${CMAKE_SOURCE_DIR}/src/shared/Constants.vala
110 ${CMAKE_SOURCE_DIR}/src/shared/Utils.vala
111 ${CMAKE_SOURCE_DIR}/src/shared/PAM/Token.vala
112 ${CMAKE_SOURCE_DIR}/src/shared/PAM/Reader.vala
113
114=== modified file 'src/daemon/Daemon.vala'
115--- src/daemon/Daemon.vala 2016-08-29 22:25:35 +0000
116+++ src/daemon/Daemon.vala 2016-12-09 17:18:29 +0000
117@@ -64,7 +64,7 @@
118
119 private void on_bus_acquired (DBusConnection connection) {
120 try {
121- connection.register_object (Vars.PARENTAL_CONTROLS_OBJECT_PATH, Server.get_default ());
122+ connection.register_object (Constants.PARENTAL_CONTROLS_OBJECT_PATH, Server.get_default ());
123 } catch (IOError e) {
124 warning ("%s\n", e.message);
125 }
126@@ -75,12 +75,12 @@
127 return;
128 }
129
130- Bus.own_name (BusType.SYSTEM, Vars.PARENTAL_CONTROLS_IFACE, BusNameOwnerFlags.REPLACE,
131+ Bus.own_name (BusType.SYSTEM, Constants.PARENTAL_CONTROLS_IFACE, BusNameOwnerFlags.REPLACE,
132 on_bus_acquired,
133 () => {},
134 on_bus_lost);
135
136- session_manager = new SessionManager ();
137+ session_manager = SessionManager.get_default ();
138 session_manager.start ();
139 }
140
141
142=== modified file 'src/daemon/IptablesHelper.vala'
143--- src/daemon/IptablesHelper.vala 2016-08-30 17:28:55 +0000
144+++ src/daemon/IptablesHelper.vala 2016-12-09 17:18:29 +0000
145@@ -27,7 +27,6 @@
146
147 private UserConfig config;
148 private string[] current_urls;
149- private ulong changed_signal_id;
150
151 public static bool get_can_start () {
152 return Environment.find_program_in_path (IPTABLES_EXEC) != null;
153@@ -40,18 +39,17 @@
154 public void start () {
155 this.current_urls = config.get_block_urls ();
156 add_rules ();
157-
158- changed_signal_id = config.changed.connect (() => {
159- remove_rules ();
160-
161- current_urls = config.get_block_urls ();
162- add_rules ();
163- });
164+ }
165+
166+ public void restart () {
167+ remove_rules ();
168+
169+ current_urls = config.get_block_urls ();
170+ add_rules ();
171 }
172
173 public void stop () {
174 remove_rules ();
175- disconnect (changed_signal_id);
176 }
177
178 private void add_rules () {
179
180=== modified file 'src/daemon/ProcessWatcher.vala'
181--- src/daemon/ProcessWatcher.vala 2016-10-25 21:35:37 +0000
182+++ src/daemon/ProcessWatcher.vala 2016-12-09 17:18:29 +0000
183@@ -42,7 +42,7 @@
184 }
185
186 private void handle_pid (int pid) {
187- if (config == null) {
188+ if (config == null || !config.get_active ()) {
189 return;
190 }
191
192@@ -86,7 +86,7 @@
193 try {
194 var unix_user = new Polkit.UnixUser.for_name (config.username);
195 var result = authority.check_authorization_sync (new Polkit.UnixProcess.for_owner (client_pid, 0, unix_user.get_uid ()),
196- Vars.PARENTAL_CONTROLS_ACTION_ID,
197+ Constants.PARENTAL_CONTROLS_ACTION_ID,
198 null,
199 Polkit.CheckAuthorizationFlags.NONE);
200 if (result.get_is_authorized ()) {
201@@ -100,7 +100,7 @@
202 server.disconnect (signal_id);
203 });
204
205- server.app_authorize (config.username, executable, Vars.PARENTAL_CONTROLS_ACTION_ID);
206+ server.app_authorize (config.username, executable, Constants.PARENTAL_CONTROLS_ACTION_ID);
207 } else {
208 server.show_app_unavailable (executable);
209 }
210
211=== modified file 'src/daemon/Server.vala'
212--- src/daemon/Server.vala 2016-10-25 21:35:37 +0000
213+++ src/daemon/Server.vala 2016-12-09 17:18:29 +0000
214@@ -60,6 +60,8 @@
215 }
216
217 UserConfig.init ();
218+
219+ config_changed.connect (on_config_changed);
220 }
221
222 [DBus (visible = false)]
223@@ -69,7 +71,7 @@
224 public signal void launch (string[] args);
225 public signal void show_app_unavailable (string path);
226 public signal void show_timeout (int hours, int minutes);
227- public signal void user_config_changed (string username);
228+ public signal void config_changed ();
229
230 public void end_app_authorization (BusName sender) {
231 uint32 pid = get_pid_from_sender (sender);
232@@ -188,6 +190,13 @@
233 return config.get_admin ();
234 }
235
236+ private void on_config_changed () {
237+ var current_handler = SessionManager.get_default ().current_handler;
238+ if (current_handler != null) {
239+ current_handler.update ();
240+ }
241+ }
242+
243 private void ensure_pam_lightdm_enabled () {
244 string path = "/etc/pam.d/lightdm";
245
246@@ -231,7 +240,7 @@
247
248 try {
249 var authority = Polkit.Authority.get_sync (null);
250- var auth_result = authority.check_authorization_sync (subject, Vars.PARENTAL_CONTROLS_ACTION_ID, null, Polkit.CheckAuthorizationFlags.NONE);
251+ var auth_result = authority.check_authorization_sync (subject, Constants.PARENTAL_CONTROLS_ACTION_ID, null, Polkit.CheckAuthorizationFlags.NONE);
252 return auth_result.get_is_authorized ();
253 } catch (Error e) {
254 warning (e.message);
255
256=== modified file 'src/daemon/SessionHandler.vala'
257--- src/daemon/SessionHandler.vala 2016-08-30 17:28:55 +0000
258+++ src/daemon/SessionHandler.vala 2016-12-09 17:18:29 +0000
259@@ -43,7 +43,7 @@
260
261 iptables_helper = new IptablesHelper (config);
262
263- var token = PAM.Reader.get_token_for_user (Vars.PAM_TIME_CONF_PATH, session.name);
264+ var token = PAM.Reader.get_token_for_user (Constants.PAM_TIME_CONF_PATH, session.name);
265 if (token != null) {
266 timer = new Timer (token);
267 timer.terminate.connect (() => {
268@@ -53,7 +53,7 @@
269 warning (e.message);
270 }
271 });
272- }
273+ }
274 }
275
276 public string get_id () {
277@@ -78,6 +78,21 @@
278 }
279 }
280
281+ public void update () {
282+ if (!config.get_active ()) {
283+ iptables_helper.stop ();
284+ if (timer != null) {
285+ timer.stop ();
286+ }
287+
288+ return;
289+ }
290+
291+ if (IptablesHelper.get_can_start ()) {
292+ iptables_helper.restart ();
293+ }
294+ }
295+
296 public void stop () {
297 iptables_helper.stop ();
298 if (timer != null) {
299
300=== modified file 'src/daemon/SessionManager.vala'
301--- src/daemon/SessionManager.vala 2016-08-30 17:28:55 +0000
302+++ src/daemon/SessionManager.vala 2016-12-09 17:18:29 +0000
303@@ -22,16 +22,25 @@
304
305 namespace PC.Daemon {
306 public class SessionManager : Object {
307- private SessionHandler? current_handler = null;
308+ public SessionHandler? current_handler = null;
309 private IManager? manager = null;
310 private DBusConnection? conn = null;
311 private ProcessWatcher pwatcher;
312
313 private uint[] signal_ids;
314
315+ private static SessionManager? instance = null;
316+ public static SessionManager get_default () {
317+ if (instance == null) {
318+ instance = new SessionManager ();
319+ }
320+
321+ return instance;
322+ }
323+
324 public SessionManager () {
325 try {
326- manager = Bus.get_proxy_sync (BusType.SYSTEM, Vars.LOGIN_IFACE, Vars.LOGIN_OBJECT_PATH);
327+ manager = Bus.get_proxy_sync (BusType.SYSTEM, Constants.LOGIN_IFACE, Constants.LOGIN_OBJECT_PATH);
328 conn = Bus.get_sync (BusType.SYSTEM, null);
329 } catch (IOError e) {
330 warning ("%s\n", e.message);
331@@ -52,7 +61,7 @@
332 try {
333 foreach (SeatStruct seat_s in manager.list_seats ()) {
334 signal_ids += conn.signal_subscribe (null,
335- Vars.DBUS_PROPERTIES_IFACE,
336+ Constants.DBUS_PROPERTIES_IFACE,
337 "PropertiesChanged",
338 seat_s.object_path,
339 null,
340@@ -78,7 +87,7 @@
341 try {
342 var structs = manager.list_sessions ();
343 foreach (SessionStruct session_s in structs) {
344- ISession? session = Bus.get_proxy_sync (BusType.SYSTEM, Vars.LOGIN_IFACE, session_s.object_path);
345+ ISession? session = Bus.get_proxy_sync (BusType.SYSTEM, Constants.LOGIN_IFACE, session_s.object_path);
346 if (session != null && session.active) {
347 return session;
348 }
349@@ -100,7 +109,7 @@
350
351 if (session != null &&
352 session.name != null &&
353- !(session.name in Vars.DAEMON_IGNORED_USERS)) {
354+ !(session.name in Constants.DAEMON_IGNORED_USERS)) {
355 current_handler = new SessionHandler (session);
356 current_handler.start ();
357 pwatcher.set_config (current_handler.get_config ());
358
359=== modified file 'src/daemon/UserConfig.vala'
360--- src/daemon/UserConfig.vala 2016-08-30 17:28:55 +0000
361+++ src/daemon/UserConfig.vala 2016-12-09 17:18:29 +0000
362@@ -23,11 +23,8 @@
363 namespace PC.Daemon {
364 public class UserConfig : Object {
365 public string username;
366- public signal void changed ();
367-
368- private KeyFile key;
369- private string config_path;
370-
371+
372+ private static KeyFile key;
373 private static List<UserConfig> config_list;
374
375 public static UserConfig? get_for_username (string username, bool create) {
376@@ -38,9 +35,9 @@
377 }
378
379 if (create) {
380- return create_for_username (username);
381- }
382-
383+ return create_for_username (username);
384+ }
385+
386 return null;
387 }
388
389@@ -51,84 +48,96 @@
390 public static void init () {
391 config_list = new List<UserConfig> ();
392
393+ key = new KeyFile ();
394+ key.set_list_separator (';');
395+
396+ if (!init_config_file ()) {
397+ return;
398+ }
399+
400+ try {
401+ key.load_from_file (Constants.DAEMON_CONF_FILE, KeyFileFlags.KEEP_COMMENTS | KeyFileFlags.KEEP_TRANSLATIONS);
402+ } catch (KeyFileError e) {
403+ warning (e.message);
404+ } catch (FileError e) {
405+ warning (e.message);
406+ }
407+
408 foreach (Act.User user in Utils.get_usermanager ().list_users ()) {
409- string config_path = Utils.build_daemon_conf_path (user);
410- if (!FileUtils.test (config_path, FileTest.IS_REGULAR)) {
411+ string username = user.get_user_name ();
412+ if (!key.has_group (username)) {
413 continue;
414 }
415
416- var key = new KeyFile ();
417- key.set_list_separator (';');
418- try {
419- if (!key.load_from_file (config_path, KeyFileFlags.NONE)) {
420- continue;
421- }
422- } catch (KeyFileError e) {
423- warning (e.message);
424- continue;
425- } catch (FileError e) {
426- warning (e.message);
427- continue;
428- }
429-
430- var user_config = new UserConfig (config_path, user.get_user_name (), key);
431+ var user_config = new UserConfig (username);
432 config_list.append (user_config);
433 }
434 }
435
436+ private static bool init_config_file () {
437+ var file = File.new_for_path (Constants.DAEMON_CONF_FILE);
438+ if (!file.query_exists ()) {
439+ critical ("Could not found daemon config file: %s does not exist".printf (file.get_path ()));
440+ return false;
441+ }
442+
443+ try {
444+ var monitor = file.monitor (FileMonitorFlags.NONE, null);
445+ monitor.changed.connect ((src, dest, event) => {
446+ if (event == FileMonitorEvent.CHANGES_DONE_HINT) {
447+ foreach (UserConfig config in config_list) {
448+ config.update_key ();
449+ }
450+
451+ Server.get_default ().config_changed ();
452+ }
453+ });
454+ } catch (Error e) {
455+ warning (e.message);
456+ }
457+
458+ return true;
459+ }
460+
461 private static UserConfig? create_for_username (string username) {
462 var user = Utils.get_usermanager ().get_user (username);
463 if (user == null) {
464 return null;
465 }
466
467- string config_path = Utils.build_daemon_conf_path (user);
468- var file = File.new_for_path (config_path);
469- try {
470- file.create (FileCreateFlags.PRIVATE);
471- } catch (FileError e) {
472- warning (e.message);
473- return null;
474- } catch (Error e) {
475- warning (e.message);
476- return null;
477- }
478-
479- var config = new UserConfig (config_path, username, new KeyFile ());
480+ var config = new UserConfig (username);
481+ config.set_active (false);
482 config_list.append (config);
483 return config;
484 }
485
486- private UserConfig (string config_path, string username, KeyFile key) {
487+ private UserConfig (string username) {
488 this.username = username;
489- this.key = key;
490- this.config_path = config_path;
491- monitor_file ();
492 }
493
494 public void set_active (bool active) {
495- key.set_boolean (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_ACTIVE, active);
496+ key.set_boolean (username, Constants.DAEMON_KEY_ACTIVE, active);
497 save ();
498 }
499
500 public void set_targets (string[] targets) {
501- key.set_string_list (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_TARGETS, targets);
502+ key.set_string_list (username, Constants.DAEMON_KEY_TARGETS, targets);
503 save ();
504 }
505
506 public void set_block_urls (string[] block_urls) {
507- key.set_string_list (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_BLOCK_URLS, block_urls);
508+ key.set_string_list (username, Constants.DAEMON_KEY_BLOCK_URLS, block_urls);
509 save ();
510 }
511
512 public void set_admin (bool admin) {
513- key.set_boolean (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_ADMIN, admin);
514+ key.set_boolean (username, Constants.DAEMON_KEY_ADMIN, admin);
515 save ();
516 }
517
518 public bool get_active () {
519 try {
520- return key.get_boolean (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_ACTIVE);
521+ return key.get_boolean (username, Constants.DAEMON_KEY_ACTIVE);
522 } catch (KeyFileError e) {
523 warning (e.message);
524 }
525@@ -138,7 +147,7 @@
526
527 public string[] get_targets () {
528 try {
529- return key.get_string_list (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_TARGETS);
530+ return key.get_string_list (username, Constants.DAEMON_KEY_TARGETS);
531 } catch (KeyFileError e) {
532 warning (e.message);
533 }
534@@ -148,7 +157,7 @@
535
536 public string[] get_block_urls () {
537 try {
538- return key.get_string_list (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_BLOCK_URLS);
539+ return key.get_string_list (username, Constants.DAEMON_KEY_BLOCK_URLS);
540 } catch (KeyFileError e) {
541 warning (e.message);
542 }
543@@ -158,7 +167,7 @@
544
545 public bool get_admin () {
546 try {
547- return key.get_boolean (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_ADMIN);
548+ return key.get_boolean (username, Constants.DAEMON_KEY_ADMIN);
549 } catch (KeyFileError e) {
550 warning (e.message);
551 }
552@@ -166,26 +175,9 @@
553 return false;
554 }
555
556- private void monitor_file () {
557- var file = File.new_for_path (config_path);
558- try {
559- var monitor = file.monitor (FileMonitorFlags.NONE, null);
560- monitor.changed.connect ((src, dest, event) => {
561- if (event == FileMonitorEvent.CHANGES_DONE_HINT) {
562- update_key ();
563-
564- Server.get_default ().user_config_changed (username);
565- changed ();
566- }
567- });
568- } catch (Error e) {
569- warning (e.message);
570- }
571- }
572-
573- private void update_key () {
574- try {
575- key.load_from_file (config_path, KeyFileFlags.NONE);
576+ public void update_key () {
577+ try {
578+ key.load_from_file (Constants.DAEMON_CONF_FILE, KeyFileFlags.KEEP_COMMENTS | KeyFileFlags.KEEP_TRANSLATIONS);
579 } catch (KeyFileError e) {
580 warning (e.message);
581 } catch (FileError e) {
582@@ -195,14 +187,13 @@
583
584 private void save () {
585 try {
586- key.save_to_file (config_path);
587+ key.save_to_file (Constants.DAEMON_CONF_FILE);
588 } catch (FileError e) {
589 warning (e.message);
590 return;
591 }
592
593- Server.get_default ().user_config_changed (username);
594- changed ();
595+ Server.get_default ().config_changed ();
596 }
597 }
598 }
599\ No newline at end of file
600
601=== renamed file 'src/shared/Vars.vala' => 'src/shared/Constants.vala.cmake'
602--- src/shared/Vars.vala 2016-08-29 22:25:35 +0000
603+++ src/shared/Constants.vala.cmake 2016-12-09 17:18:29 +0000
604@@ -20,7 +20,7 @@
605 * Authored by: Adam Bieńkowski <donadigos159@gmail.com>
606 */
607
608-namespace PC.Vars {
609+namespace PC.Constants {
610 public const string LOGIN_IFACE = "org.freedesktop.login1";
611 public const string LOGIN_OBJECT_PATH = "/org/freedesktop/login1";
612 public const string DBUS_PROPERTIES_IFACE = "org.freedesktop.DBus.Properties";
613@@ -31,7 +31,7 @@
614 public const string PLANK_CONF_DIR = "/.config/plank/dock1/settings";
615 public const string PLANK_CONF_GROUP = "PlankDockPreferences";
616 public const string PLANK_CONF_LOCK_ITEMS_KEY = "LockItems";
617- public const string DAEMON_CONF_DIR = "/.config/pantheon-parental-controls-daemon.conf";
618+ public const string DAEMON_CONF_FILE = "@CMAKE_INSTALL_PREFIX@/share/pantheon-parental-controls/daemon.conf";
619 public const string[] DAEMON_IGNORED_USERS = { "lightdm" };
620 public const string DAEMON_GROUP = "PCDaemon";
621 public const string DAEMON_KEY_ACTIVE = "Active";
622
623=== modified file 'src/shared/PAM/Reader.vala'
624--- src/shared/PAM/Reader.vala 2016-08-30 17:28:55 +0000
625+++ src/shared/PAM/Reader.vala 2016-12-09 17:18:29 +0000
626@@ -22,22 +22,15 @@
627
628 namespace PC.PAM {
629 public class Reader : Object {
630- public static string get_config (string contents, bool ignore_comments = true) {
631- string config = "";
632+ public static string get_config (string contents, out int start_idx, out int end_idx) {
633+ start_idx = contents.index_of (Constants.PAM_CONF_START);
634+ end_idx = contents.index_of (Constants.PAM_CONF_END) + Constants.PAM_CONF_END.char_count ();
635
636- int start_idx = contents.index_of (Vars.PAM_CONF_START);
637- int end_idx = contents.index_of (Vars.PAM_CONF_END) + Vars.PAM_CONF_END.char_count ();
638 if (start_idx == -1 || end_idx == -1) {
639- return config;
640- }
641-
642- config = contents.slice (start_idx, end_idx);
643-
644- if (ignore_comments) {
645- return Utils.remove_comments (config);
646- }
647-
648- return config;
649+ return "";
650+ }
651+
652+ return contents.slice (start_idx, end_idx);
653 }
654
655 public static List<Token> get_tokens (string filename) {
656@@ -49,7 +42,7 @@
657 return new List<Token> ();
658 }
659
660- string config = get_config (contents);
661+ string config = get_config (contents, null, null);
662 return Token.parse (config);
663 }
664
665
666=== modified file 'src/shared/PAM/Writer.vala'
667--- src/shared/PAM/Writer.vala 2016-08-30 17:28:55 +0000
668+++ src/shared/PAM/Writer.vala 2016-12-09 17:18:29 +0000
669@@ -25,7 +25,7 @@
670 private string filename;
671
672 public static Writer new_for_time () {
673- return new Writer (Vars.PAM_TIME_CONF_PATH);
674+ return new Writer (Constants.PAM_TIME_CONF_PATH);
675 }
676
677 public Writer (string filename) {
678@@ -33,13 +33,11 @@
679 }
680
681 public void add_restriction_for_user (string input, bool clean) {
682+ string? clean_username = null;
683 if (clean) {
684 var token = Token.parse_line (input);
685 if (token != null) {
686- string username = token.get_user_arg0 ();
687- if (Reader.get_token_for_user (filename, username) != null) {
688- remove_restriction_for_user (username);
689- }
690+ clean_username = token.get_user_arg0 ();
691 }
692 }
693
694@@ -51,26 +49,32 @@
695 return;
696 }
697
698- string config = Reader.get_config (contents, false);
699-
700- var builder = new StringBuilder (Vars.PAM_CONF_START);
701- if (config != "") {
702- builder.append ("\n");
703- builder.append (Utils.remove_comments (config));
704- } else {
705+ int start_idx;
706+ int end_idx;
707+ string config = Reader.get_config (contents, out start_idx, out end_idx);
708+
709+ if (start_idx != -1 && end_idx != -1) {
710+ contents = contents.splice (start_idx - 1, end_idx);
711+ }
712+
713+ var builder = new StringBuilder (Constants.PAM_CONF_START);
714+ builder.append ("\n");
715+
716+ foreach (var token in Token.parse (config)) {
717+ if (token.get_user_arg0 () == clean_username) {
718+ continue;
719+ }
720+
721+ builder.append (token.to_string ());
722 builder.append ("\n");
723 }
724
725 builder.append (input);
726 builder.append ("\n");
727- builder.append (Vars.PAM_CONF_END);
728+ builder.append (Constants.PAM_CONF_END);
729
730 try {
731- if (config != "") {
732- FileUtils.set_contents (filename, contents.replace (config, builder.str));
733- } else {
734- FileUtils.set_contents (filename, "\n%s\n%s\n".printf (contents, builder.str));
735- }
736+ FileUtils.set_contents (filename, "%s\n%s".printf (contents, builder.str));
737 } catch (FileError e) {
738 warning ("%s\n", e.message);
739 }
740@@ -85,26 +89,35 @@
741 return;
742 }
743
744- string config = Reader.get_config (contents);
745+ int start_idx;
746+ int end_idx;
747+ string config = Reader.get_config (contents, out start_idx, out end_idx);
748
749- if (config == "") {
750+ if (start_idx != -1 && end_idx != -1) {
751+ contents = contents.splice (start_idx - 1, end_idx);
752+ } else {
753 return;
754 }
755
756- string buffer = "";
757+ var builder = new StringBuilder (Constants.PAM_CONF_START);
758+ builder.append ("\n");
759
760- foreach (string line in config.split ("\n")) {
761- var token = Token.parse_line (line);
762- if (token != null && token.get_user_arg0 () != username) {
763- buffer += line;
764+ foreach (var token in Token.parse (config)) {
765+ if (token.get_user_arg0 () == username) {
766+ continue;
767 }
768+
769+ builder.append (token.to_string ());
770+ builder.append ("\n");
771 }
772
773+ builder.append (Constants.PAM_CONF_END);
774+
775 try {
776- FileUtils.set_contents (filename, contents.replace (config, buffer));
777+ FileUtils.set_contents (filename, "%s\n%s".printf (contents, builder.str));
778 } catch (FileError e) {
779 warning ("%s\n", e.message);
780 }
781- }
782+ }
783 }
784 }
785\ No newline at end of file
786
787=== modified file 'src/shared/Utils.vala'
788--- src/shared/Utils.vala 2016-10-25 21:35:37 +0000
789+++ src/shared/Utils.vala 2016-12-09 17:18:29 +0000
790@@ -75,7 +75,7 @@
791 }
792
793 try {
794- api = Bus.get_proxy_sync (BusType.SYSTEM, Vars.PARENTAL_CONTROLS_IFACE, Vars.PARENTAL_CONTROLS_OBJECT_PATH);
795+ api = Bus.get_proxy_sync (BusType.SYSTEM, Constants.PARENTAL_CONTROLS_IFACE, Constants.PARENTAL_CONTROLS_OBJECT_PATH);
796 } catch (Error e) {
797 critical ("%s, using dummy parental controls backend", e.message);
798 api = new DummyParentalControls ();
799@@ -90,8 +90,9 @@
800 }
801
802 try {
803+
804 var user = new Polkit.UnixUser.for_name (Environment.get_user_name ());
805- permission = new Polkit.Permission.sync (Vars.PARENTAL_CONTROLS_ACTION_ID,
806+ permission = new Polkit.Permission.sync (Constants.PARENTAL_CONTROLS_ACTION_ID,
807 new Polkit.UnixProcess.for_owner (Posix.getpid (), 0, user.get_uid ()));
808 return permission;
809 } catch (Error e) {
810@@ -132,9 +133,5 @@
811
812 return buffer;
813 }
814-
815- public static string build_daemon_conf_path (Act.User user) {
816- return Path.build_filename (user.get_home_dir (), Vars.DAEMON_CONF_DIR);
817- }
818 }
819 }

Subscribers

People subscribed via source and target branches

to all changes: