Merge lp:~donadigo/switchboard-plug-parental-controls/update-plank-backend into lp:~elementary-pantheon/switchboard-plug-parental-controls/trunk

Proposed by Adam Bieńkowski
Status: Work in progress
Proposed branch: lp:~donadigo/switchboard-plug-parental-controls/update-plank-backend
Merge into: lp:~elementary-pantheon/switchboard-plug-parental-controls/trunk
Diff against target: 407 lines (+135/-57)
6 files modified
src/Widgets/GeneralBox.vala (+17/-30)
src/cli/Application.vala (+15/-18)
src/daemon/CMakeLists.txt (+1/-0)
src/daemon/PlankController.vala (+80/-0)
src/daemon/SessionHandler.vala (+10/-3)
src/shared/Vars.vala (+12/-6)
To merge this branch: bzr merge lp:~donadigo/switchboard-plug-parental-controls/update-plank-backend
Reviewer Review Type Date Requested Status
Danielle Foré Needs Fixing
Review via email: mp+295960@code.launchpad.net

Commit message

* Fix bug #1583221: "Update Plank settings handling".

Description of the change

Fixes bug #1583221: "Update Plank settings handling".

This is a rewrite of Plank backend which is controlling of whethever to lock the dock or not for current user.

To post a comment you must log in.
164. By Adam Bieńkowski

Remove unneded user variable

Revision history for this message
Danielle Foré (danrabbit) wrote :

I can't confirm that this locks the dock for another user. I can confirm that the daemon is running because website blocking is working

review: Needs Fixing

Unmerged revisions

164. By Adam Bieńkowski

Remove unneded user variable

163. By Adam Bieńkowski

Rewrite plank locking; organize constant variables

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/Widgets/GeneralBox.vala'
--- src/Widgets/GeneralBox.vala 2016-05-19 18:11:33 +0000
+++ src/Widgets/GeneralBox.vala 2016-05-27 14:00:40 +0000
@@ -22,7 +22,6 @@
2222
23namespace PC.Widgets {23namespace PC.Widgets {
24 public class GeneralBox : Gtk.Grid {24 public class GeneralBox : Gtk.Grid {
25 private string plank_conf_file_path = "";
26 private Act.User user;25 private Act.User user;
27 private Gtk.CheckButton dock_btn;26 private Gtk.CheckButton dock_btn;
28 private Gtk.CheckButton print_btn;27 private Gtk.CheckButton print_btn;
@@ -36,10 +35,8 @@
3635
37 public GeneralBox (Act.User user) {36 public GeneralBox (Act.User user) {
38 this.user = user;37 this.user = user;
39 plank_conf_file_path = Path.build_filename (user.get_home_dir (), Vars.PLANK_CONF_DIR);
4038
41 dock_btn.notify["active"].connect (on_dock_btn_activate);39 dock_btn.notify["active"].connect (on_dock_btn_activate);
42
43 print_btn.notify["active"].connect (on_print_conf_activate);40 print_btn.notify["active"].connect (on_print_conf_activate);
4441
45 limit_switch.notify["active"].connect (on_limit_switch_changed);42 limit_switch.notify["active"].connect (on_limit_switch_changed);
@@ -51,7 +48,6 @@
51 weekday_box.changed.connect (update_pam);48 weekday_box.changed.connect (update_pam);
52 weekend_box.changed.connect (update_pam);49 weekend_box.changed.connect (update_pam);
5350
54 monitor_updates ();
55 update ();51 update ();
56 load_restrictions ();52 load_restrictions ();
57 }53 }
@@ -78,9 +74,9 @@
7874
79 limit_combobox = new Gtk.ComboBoxText ();75 limit_combobox = new Gtk.ComboBoxText ();
80 limit_combobox.hexpand = true;76 limit_combobox.hexpand = true;
81 limit_combobox.append (Vars.ALL_ID, _("On weekdays and weekends"));77 limit_combobox.append (Vars.PAM_ALL_ID, _("On weekdays and weekends"));
82 limit_combobox.append (Vars.WEEKDAYS_ID, _("Only on weekdays"));78 limit_combobox.append (Vars.PAM_WEEKDAYS_ID, _("Only on weekdays"));
83 limit_combobox.append (Vars.WEEKENDS_ID, _("Only on weekends"));79 limit_combobox.append (Vars.PAM_WEEKENDS_ID, _("Only on weekends"));
84 limit_combobox.active_id = "all";80 limit_combobox.active_id = "all";
8581
86 frame = new Gtk.Frame (null);82 frame = new Gtk.Frame (null);
@@ -130,7 +126,7 @@
130126
131 limit_combobox.active_id = restrict.day_id;127 limit_combobox.active_id = restrict.day_id;
132 switch (restrict.day_id) {128 switch (restrict.day_id) {
133 case Vars.ALL_ID:129 case Vars.PAM_ALL_ID:
134 string from_weekday = restrict.weekday_hours.split ("-")[0];130 string from_weekday = restrict.weekday_hours.split ("-")[0];
135 string to_weekday = restrict.weekday_hours.split ("-")[1];131 string to_weekday = restrict.weekday_hours.split ("-")[1];
136 string from_weekend = restrict.weekend_hours.split ("-")[0];132 string from_weekend = restrict.weekend_hours.split ("-")[0];
@@ -142,11 +138,11 @@
142 weekend_box.set_from (from_weekend);138 weekend_box.set_from (from_weekend);
143 weekend_box.set_to (to_weekend);139 weekend_box.set_to (to_weekend);
144 break;140 break;
145 case Vars.WEEKDAYS_ID:141 case Vars.PAM_WEEKDAYS_ID:
146 weekday_box.set_from (restrict.from);142 weekday_box.set_from (restrict.from);
147 weekday_box.set_to (restrict.to);143 weekday_box.set_to (restrict.to);
148 break;144 break;
149 case Vars.WEEKENDS_ID:145 case Vars.PAM_WEEKENDS_ID:
150 weekend_box.set_from (restrict.from);146 weekend_box.set_from (restrict.from);
151 weekend_box.set_to (restrict.to);147 weekend_box.set_to (restrict.to);
152 break;148 break;
@@ -161,14 +157,14 @@
161 string restrict = "";157 string restrict = "";
162 string id = limit_combobox.get_active_id ();158 string id = limit_combobox.get_active_id ();
163 switch (id) {159 switch (id) {
164 case Vars.ALL_ID:160 case Vars.PAM_ALL_ID:
165 restrict = generate_pam_conf_restriction (id, weekday_box.get_from (), weekday_box.get_to ());161 restrict = generate_pam_conf_restriction (id, weekday_box.get_from (), weekday_box.get_to ());
166 restrict += "|" + weekend_box.get_from () + "-" + weekend_box.get_to ();162 restrict += "|" + weekend_box.get_from () + "-" + weekend_box.get_to ();
167 break;163 break;
168 case Vars.WEEKDAYS_ID:164 case Vars.PAM_WEEKDAYS_ID:
169 restrict = generate_pam_conf_restriction (id, weekday_box.get_from (), weekday_box.get_to ());165 restrict = generate_pam_conf_restriction (id, weekday_box.get_from (), weekday_box.get_to ());
170 break;166 break;
171 case Vars.WEEKENDS_ID:167 case Vars.PAM_WEEKENDS_ID:
172 restrict = generate_pam_conf_restriction (id, weekend_box.get_from (), weekend_box.get_to ());168 restrict = generate_pam_conf_restriction (id, weekend_box.get_from (), weekend_box.get_to ());
173 break;169 break;
174 }170 }
@@ -180,13 +176,13 @@
180 string retval = "*;*;";176 string retval = "*;*;";
181 string days = "";177 string days = "";
182 switch (id) {178 switch (id) {
183 case Vars.ALL_ID:179 case Vars.PAM_ALL_ID:
184 days = "Al";180 days = "Al";
185 break;181 break;
186 case Vars.WEEKDAYS_ID:182 case Vars.PAM_WEEKDAYS_ID:
187 days = "Wk";183 days = "Wk";
188 break;184 break;
189 case Vars.WEEKENDS_ID:185 case Vars.PAM_WEEKENDS_ID:
190 days = "Wd";186 days = "Wd";
191 break;187 break;
192 }188 }
@@ -195,20 +191,11 @@
195 return retval;191 return retval;
196 }192 }
197193
198 private void monitor_updates () {
199 try {
200 var monitor = File.new_for_path (plank_conf_file_path).monitor_file (FileMonitorFlags.NONE);
201 monitor.changed.connect (update);
202 } catch (IOError e) {
203 warning ("%s\n", e.message);
204 }
205 }
206
207 private void update () {194 private void update () {
208 var key_file = new KeyFile ();195 var key_file = new KeyFile ();
209 try {196 try {
210 key_file.load_from_file (plank_conf_file_path, KeyFileFlags.NONE);197 key_file.load_from_file (Utils.build_daemon_conf_path (user), KeyFileFlags.NONE);
211 dock_btn.active = !key_file.get_boolean (Vars.PLANK_CONF_GROUP, Vars.PLANK_CONF_LOCK_ITEMS_KEY);198 dock_btn.active = !key_file.get_boolean (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_LOCK_PLANK_ITEMS);
212 } catch (FileError e) {199 } catch (FileError e) {
213 dock_btn.active = true;200 dock_btn.active = true;
214 warning ("%s\n", e.message);201 warning ("%s\n", e.message);
@@ -272,15 +259,15 @@
272259
273 private void on_limit_combobox_changed () {260 private void on_limit_combobox_changed () {
274 switch (limit_combobox.get_active_id ()) {261 switch (limit_combobox.get_active_id ()) {
275 case Vars.ALL_ID:262 case Vars.PAM_ALL_ID:
276 weekday_box.sensitive = true;263 weekday_box.sensitive = true;
277 weekend_box.sensitive = true;264 weekend_box.sensitive = true;
278 break;265 break;
279 case Vars.WEEKDAYS_ID:266 case Vars.PAM_WEEKDAYS_ID:
280 weekday_box.sensitive = true;267 weekday_box.sensitive = true;
281 weekend_box.sensitive = false; 268 weekend_box.sensitive = false;
282 break;269 break;
283 case Vars.WEEKENDS_ID:270 case Vars.PAM_WEEKENDS_ID:
284 weekday_box.sensitive = false;271 weekday_box.sensitive = false;
285 weekend_box.sensitive = true;272 weekend_box.sensitive = true;
286 break; 273 break;
287274
=== modified file 'src/cli/Application.vala'
--- src/cli/Application.vala 2016-05-18 15:29:00 +0000
+++ src/cli/Application.vala 2016-05-27 14:00:40 +0000
@@ -23,7 +23,6 @@
23namespace PC.Cli {23namespace PC.Cli {
24 public class App : Application {24 public class App : Application {
25 private const string TIME_CONF_FILE = "/etc/security/time.conf";25 private const string TIME_CONF_FILE = "/etc/security/time.conf";
26 private string plank_conf_file_path = "";
2726
28 public App () {27 public App () {
29 Object (flags: ApplicationFlags.HANDLES_COMMAND_LINE);28 Object (flags: ApplicationFlags.HANDLES_COMMAND_LINE);
@@ -160,24 +159,22 @@
160 }159 }
161160
162 private void lock_dock_for_user (string user, bool lock) {161 private void lock_dock_for_user (string user, bool lock) {
163 plank_conf_file_path = Path.build_filename (Utils.get_usermanager ().get_user (user).get_home_dir (), Vars.PLANK_CONF_DIR);162 string path = Utils.build_daemon_conf_path (Utils.get_usermanager ().get_user (user));
164 if (plank_conf_file_path != "" && File.new_for_path (plank_conf_file_path).query_exists ()) {163 var key_file = new KeyFile ();
165 var key_file = new KeyFile ();164 try {
166 try {165 key_file.load_from_file (path, KeyFileFlags.KEEP_COMMENTS | KeyFileFlags.KEEP_TRANSLATIONS);
167 key_file.load_from_file (plank_conf_file_path, KeyFileFlags.KEEP_COMMENTS | KeyFileFlags.KEEP_TRANSLATIONS);166 } catch (KeyFileError e) {
168 } catch (KeyFileError e) {167 warning ("%s\n", e.message);
169 warning ("%s\n", e.message);168 } catch (FileError e) {
170 } catch (FileError e) {169 warning ("%s\n", e.message);
171 warning ("%s\n", e.message);170 }
172 }171
173 172 key_file.set_boolean (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_LOCK_PLANK_ITEMS, lock);
174 key_file.set_boolean (Vars.PLANK_CONF_GROUP, Vars.PLANK_CONF_LOCK_ITEMS_KEY, lock);
175173
176 try {174 try {
177 key_file.save_to_file (plank_conf_file_path);175 key_file.save_to_file (path);
178 } catch (FileError e) {176 } catch (FileError e) {
179 warning ("%s\n", e.message);177 warning ("%s\n", e.message);
180 }
181 }178 }
182 }179 }
183180
184181
=== modified file 'src/daemon/CMakeLists.txt'
--- src/daemon/CMakeLists.txt 2016-03-06 11:20:50 +0000
+++ src/daemon/CMakeLists.txt 2016-05-27 14:00:40 +0000
@@ -14,6 +14,7 @@
14 IptablesHelper.vala14 IptablesHelper.vala
15 SessionManager.vala15 SessionManager.vala
16 SessionHandler.vala16 SessionHandler.vala
17 PlankController.vala
17 Interfaces.vala18 Interfaces.vala
18 Server.vala19 Server.vala
19 ${CMAKE_SOURCE_DIR}/src/shared/Vars.vala20 ${CMAKE_SOURCE_DIR}/src/shared/Vars.vala
2021
=== added file 'src/daemon/PlankController.vala'
--- src/daemon/PlankController.vala 1970-01-01 00:00:00 +0000
+++ src/daemon/PlankController.vala 2016-05-27 14:00:40 +0000
@@ -0,0 +1,80 @@
1// -*- Mode: vala; indent-tabs-mode: nil; tab-width: 4 -*-
2/*-
3 * Copyright (c) 2016 Adam Bieńkowski (https://launchpad.net/switchboard-plug-parental-controls)
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 3 of the License, or (at your option) any later version.
9 *
10 * This library 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 GNU
13 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
19 *
20 * Authored by: Adam Bieńkowski <donadigos159@gmail.com>
21 */
22
23namespace PC.Daemon {
24 public class PlankController : Object {
25 private bool lock_dock;
26 private HashTable<ulong, Settings> settings_table;
27
28 public PlankController (bool _lock_dock) {
29 lock_dock = _lock_dock;
30 settings_table = new HashTable<ulong, Settings> (null, null);
31 }
32
33 public void start () {
34 if (!lock_dock) {
35 return;
36 }
37
38 string[]? docks = get_docks ();
39
40 var schema = SettingsSchemaSource.get_default ().lookup (Vars.PLANK_SETTINGS_SCHEMA_ID, true);
41 if (schema == null || docks == null) {
42 return;
43 }
44
45 foreach (string dock in docks) {
46 var dock_settings = new Settings.full (schema, null, Vars.PLANK_SETTINGS_PATH.printf (dock));
47 dock_settings.set_boolean (Vars.PLANK_SETTINGS_LOCK_ITEMS_KEY, lock_dock);
48 settings_table.insert (dock_settings.changed.connect (settings_changed), dock_settings);
49 }
50
51 }
52
53 public void stop () {
54 if (!lock_dock || settings_table.length == 0) {
55 return;
56 }
57
58 settings_table.foreach ((handler_id, settings) => {
59 settings.disconnect (handler_id);
60 settings.reset (Vars.PLANK_SETTINGS_LOCK_ITEMS_KEY);
61 });
62 }
63
64 private void settings_changed (Settings dock_settings, string key) {
65 if (key == Vars.PLANK_SETTINGS_LOCK_ITEMS_KEY
66 && dock_settings.get_boolean (Vars.PLANK_SETTINGS_LOCK_ITEMS_KEY) != lock_dock) {
67 dock_settings.set_boolean (Vars.PLANK_SETTINGS_LOCK_ITEMS_KEY, lock_dock);
68 }
69 }
70
71 private string[]? get_docks () {
72 var plank_settings = new Settings ("net.launchpad.plank");
73 if (plank_settings != null) {
74 return plank_settings.get_strv (Vars.PLANK_SETTINGS_ENABLED_DOCKS_KEY);
75 }
76
77 return null;
78 }
79 }
80}
0\ No newline at end of file81\ No newline at end of file
182
=== modified file 'src/daemon/SessionHandler.vala'
--- src/daemon/SessionHandler.vala 2016-05-18 14:52:41 +0000
+++ src/daemon/SessionHandler.vala 2016-05-27 14:00:40 +0000
@@ -27,6 +27,7 @@
2727
28 public Core core;28 public Core core;
29 public IptablesHelper iptables_helper;29 public IptablesHelper iptables_helper;
30 public PlankController plank_controller;
3031
31 private ISession session;32 private ISession session;
32 private Server server;33 private Server server;
@@ -49,13 +50,16 @@
49 }50 }
5051
51 string[] block_urls = {};52 string[] block_urls = {};
53 bool lock_dock = false;
52 try {54 try {
53 block_urls = core.key_file.get_string_list (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_BLOCK_URLS);55 block_urls = core.key_file.get_string_list (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_BLOCK_URLS);
56 lock_dock = core.key_file.get_boolean (Vars.DAEMON_GROUP, Vars.DAEMON_KEY_LOCK_PLANK_ITEMS);
54 } catch (KeyFileError e) {57 } catch (KeyFileError e) {
55 warning ("%s\n", e.message);58 warning ("%s\n", e.message);
56 }59 }
5760
58 iptables_helper = new IptablesHelper (block_urls);61 iptables_helper = new IptablesHelper (block_urls);
62 plank_controller = new PlankController (lock_dock);
59 }63 }
6064
61 public void start () {65 public void start () {
@@ -71,6 +75,8 @@
71 iptables_helper.add_rules ();75 iptables_helper.add_rules ();
72 }76 }
7377
78 plank_controller.start ();
79
74 var restricts = PAMControl.get_all_restrictions ();80 var restricts = PAMControl.get_all_restrictions ();
75 foreach (var restrict in restricts) {81 foreach (var restrict in restricts) {
76 if (restrict.user == Utils.get_current_user ().get_user_name ()) {82 if (restrict.user == Utils.get_current_user ().get_user_name ()) {
@@ -81,7 +87,7 @@
81 }87 }
8288
83 switch (restrict.day_id) {89 switch (restrict.day_id) {
84 case Vars.WEEKDAYS_ID:90 case Vars.PAM_WEEKDAYS_ID:
85 if (current_date.get_day_of_week () < 6) {91 if (current_date.get_day_of_week () < 6) {
86 int estimated_time = int.parse (restrict.to);92 int estimated_time = int.parse (restrict.to);
87 var span = get_difference_span (estimated_time, current_date);93 var span = get_difference_span (estimated_time, current_date);
@@ -89,7 +95,7 @@
89 }95 }
9096
91 break;97 break;
92 case Vars.WEEKENDS_ID:98 case Vars.PAM_WEEKENDS_ID:
93 if (current_date.get_day_of_week () >= 6) {99 if (current_date.get_day_of_week () >= 6) {
94 int estimated_time = int.parse (restrict.to);100 int estimated_time = int.parse (restrict.to);
95 var span = get_difference_span (estimated_time, current_date);101 var span = get_difference_span (estimated_time, current_date);
@@ -97,7 +103,7 @@
97 }103 }
98104
99 break;105 break;
100 case Vars.ALL_ID:106 case Vars.PAM_ALL_ID:
101 int estimated_time = 2400;107 int estimated_time = 2400;
102 if (current_date.get_day_of_week () < 6) {108 if (current_date.get_day_of_week () < 6) {
103 estimated_time = int.parse (restrict.weekday_hours.split ("-")[1]);109 estimated_time = int.parse (restrict.weekday_hours.split ("-")[1]);
@@ -124,6 +130,7 @@
124 public void stop () {130 public void stop () {
125 core.stop ();131 core.stop ();
126 iptables_helper.reset ();132 iptables_helper.reset ();
133 plank_controller.stop ();
127 }134 }
128135
129 private TimeSpan get_difference_span (int estimated_time, DateTime current_date) {136 private TimeSpan get_difference_span (int estimated_time, DateTime current_date) {
130137
=== modified file 'src/shared/Vars.vala'
--- src/shared/Vars.vala 2016-05-20 21:19:09 +0000
+++ src/shared/Vars.vala 2016-05-27 14:00:40 +0000
@@ -24,12 +24,16 @@
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";
27
27 public const string PARENTAL_CONTROLS_IFACE = "org.pantheon.ParentalControls";28 public const string PARENTAL_CONTROLS_IFACE = "org.pantheon.ParentalControls";
28 public const string PARENTAL_CONTROLS_OBJECT_PATH = "/org/pantheon/ParentalControls";29 public const string PARENTAL_CONTROLS_OBJECT_PATH = "/org/pantheon/ParentalControls";
29 public const string PARENTAL_CONTROLS_ACTION_ID = "org.pantheon.switchboard.parental-controls.administration";30 public const string PARENTAL_CONTROLS_ACTION_ID = "org.pantheon.switchboard.parental-controls.administration";
30 public const string PLANK_CONF_DIR = "/.config/plank/dock1/settings";31
31 public const string PLANK_CONF_GROUP = "PlankDockPreferences";32 public const string PLANK_SETTINGS_SCHEMA_ID = "net.launchpad.plank.dock.settings";
32 public const string PLANK_CONF_LOCK_ITEMS_KEY = "LockItems";33 public const string PLANK_SETTINGS_PATH = "/net/launchpad/plank/docks/%s/";
34 public const string PLANK_SETTINGS_LOCK_ITEMS_KEY = "lock-items";
35 public const string PLANK_SETTINGS_ENABLED_DOCKS_KEY = "enabled-docks";
36
33 public const string DAEMON_CONF_DIR = "/.config/pantheon-parental-controls-daemon.conf";37 public const string DAEMON_CONF_DIR = "/.config/pantheon-parental-controls-daemon.conf";
34 public const string[] DAEMON_IGNORED_USERS = { "lightdm" };38 public const string[] DAEMON_IGNORED_USERS = { "lightdm" };
35 public const string DAEMON_GROUP = "PCDaemon";39 public const string DAEMON_GROUP = "PCDaemon";
@@ -37,10 +41,12 @@
37 public const string DAEMON_KEY_TARGETS = "Targets";41 public const string DAEMON_KEY_TARGETS = "Targets";
38 public const string DAEMON_KEY_ADMIN = "Admin";42 public const string DAEMON_KEY_ADMIN = "Admin";
39 public const string DAEMON_KEY_BLOCK_URLS = "BlockUrls";43 public const string DAEMON_KEY_BLOCK_URLS = "BlockUrls";
44 public const string DAEMON_KEY_LOCK_PLANK_ITEMS = "LockPlankItems";
45
40 public const string PAM_CONF_START = "## PANTHEON_PARENTAL_CONTROLS_START";46 public const string PAM_CONF_START = "## PANTHEON_PARENTAL_CONTROLS_START";
41 public const string PAM_CONF_END = "## PANTHEON_PARENTAL_CONTROLS_END";47 public const string PAM_CONF_END = "## PANTHEON_PARENTAL_CONTROLS_END";
42 public const string PAM_CONF_REGEX = PAM_CONF_START + "|" + PAM_CONF_END;48 public const string PAM_CONF_REGEX = PAM_CONF_START + "|" + PAM_CONF_END;
43 public const string ALL_ID = "all";49 public const string PAM_ALL_ID = "all";
44 public const string WEEKDAYS_ID = "weekdays";50 public const string PAM_WEEKDAYS_ID = "weekdays";
45 public const string WEEKENDS_ID = "weekends";51 public const string PAM_WEEKENDS_ID = "weekends";
46}52}
47\ No newline at end of file53\ No newline at end of file

Subscribers

People subscribed via source and target branches

to all changes: