Skip to content
API Documentation
BastionGuard™
UsersBox.vala
Go to the documentation of this file.
1/*
2 * UsersBox.vala
3 */
4
5using Gtk;
6using Gee;
7
13using TeeJee.System;
14using TeeJee.Misc;
15
16class UsersBox : Gtk.Box{
17 private Gtk.ListBox listbox;
18 private Gtk.ScrolledWindow scrolled_treeview;
19 private Gtk.Window parent_window;
21 private Gtk.Box box_btrfs;
22 private Gtk.Label lbl_message;
23 private Gtk.CheckButton chk_include_btrfs_home;
24 private bool restore_mode = false;
25
26 public UsersBox (Gtk.Window _parent_window, ExcludeBox _exclude_box, bool _restore_mode) {
27 log_debug("UsersBox: UsersBox()");
28 GLib.Object(orientation: Gtk.Orientation.VERTICAL, spacing: 6);
29 parent_window = _parent_window;
30 margin_top = 12;
31 margin_bottom = 12;
32 margin_start = 12;
33 margin_end = 12;
34 restore_mode = _restore_mode;
35 exclude_box = _exclude_box;
36
37 add_label_header(this, _("User Home Directories"), true);
38 lbl_message = add_label(this, _("User home directories are excluded by default unless you enable them here"), false, true);
39
41
42 box_btrfs = new Gtk.Box(Gtk.Orientation.VERTICAL, 6);
43 append(box_btrfs);
45 refresh();
46 log_debug("UsersBox: UsersBox(): exit");
47 }
48
49 private void init_listbox(){
50 listbox = new Gtk.ListBox();
51 listbox.selection_mode = Gtk.SelectionMode.NONE;
52 listbox.add_css_class("boxed-list");
53
54 scrolled_treeview = new Gtk.ScrolledWindow();
55 scrolled_treeview.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
56 scrolled_treeview.set_child(listbox);
57 scrolled_treeview.hexpand = true;
58 scrolled_treeview.vexpand = true;
59 append(scrolled_treeview);
60 }
61
62 private string[] user_patterns(SystemUser user){
63 string exc_pattern = "%s/**".printf(user.home_path);
64 string inc_pattern = "+ %s/**".printf(user.home_path);
65 string inc_hidden_pattern = "+ %s/.**".printf(user.home_path);
66 if (user.has_encrypted_home){
67 inc_pattern = "+ /home/.ecryptfs/%s/***".printf(user.name);
68 exc_pattern = "/home/.ecryptfs/%s/***".printf(user.name);
69 }
70 return {exc_pattern, inc_pattern, inc_hidden_pattern};
71 }
72
73 private void apply_user_mode(SystemUser user, string mode){
74 string[] patterns = user_patterns(user);
75 string exc_pattern = patterns[0];
76 string inc_pattern = patterns[1];
77 string inc_hidden_pattern = patterns[2];
78
79 if (mode == "hidden" && user.has_encrypted_home){
80 string txt = _("Encrypted Home Directory");
81 string msg = _("Selected user has an encrypted home directory. It's not possible to include only hidden files.");
82 gtk_messagebox(txt, msg, parent_window, true);
83 return;
84 }
85
86 App.exclude_list_user.remove(exc_pattern);
87 App.exclude_list_user.remove(inc_pattern);
88 App.exclude_list_user.remove(inc_hidden_pattern);
89
90 if (mode == "exclude"){
91 if (!App.exclude_list_user.contains(exc_pattern)){
92 App.exclude_list_user.add(exc_pattern);
93 }
94 }
95 else if (mode == "hidden"){
96 if (!App.exclude_list_user.contains(inc_hidden_pattern)){
97 App.exclude_list_user.add(inc_hidden_pattern);
98 }
99 }
100 else if (mode == "all"){
101 if (!App.exclude_list_user.contains(inc_pattern)){
102 App.exclude_list_user.add(inc_pattern);
103 }
104 }
105
107 }
108
109 private Gtk.Widget create_user_row(SystemUser user){
110 string[] patterns = user_patterns(user);
111 string exc_pattern = patterns[0];
112 string inc_pattern = patterns[1];
113 string inc_hidden_pattern = patterns[2];
114
115 bool include_hidden = App.exclude_list_user.contains(inc_hidden_pattern);
116 bool include_all = App.exclude_list_user.contains(inc_pattern);
117 bool exclude_all = !include_hidden && !include_all;
118
119 if (exclude_all && !App.exclude_list_user.contains(exc_pattern)){
120 App.exclude_list_user.add(exc_pattern);
121 }
122
123 var row = new Gtk.ListBoxRow();
124 var outer = new Gtk.Box(Gtk.Orientation.VERTICAL, 6);
125 outer.margin_start = 8;
126 outer.margin_end = 8;
127 outer.margin_top = 8;
128 outer.margin_bottom = 8;
129 row.set_child(outer);
130
131 var top = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 12);
132 outer.append(top);
133
134 var labels = new Gtk.Box(Gtk.Orientation.VERTICAL, 3);
135 labels.hexpand = true;
136 top.append(labels);
137
138 var name = new Gtk.Label(user.name);
139 name.xalign = 0.0f;
140 name.add_css_class("heading");
141 labels.append(name);
142
143 var home = new Gtk.Label(user.home_path);
144 home.xalign = 0.0f;
145 home.wrap = true;
146 home.add_css_class("dim-label");
147 labels.append(home);
148
149 var mode_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 12);
150 mode_box.halign = Gtk.Align.START;
151 outer.append(mode_box);
152
153 var btn_exclude = new Gtk.CheckButton.with_label(_("Exclude All Files"));
154 var btn_hidden = new Gtk.CheckButton.with_label(_("Include Only Hidden Files"));
155 var btn_all = new Gtk.CheckButton.with_label(_("Include All Files"));
156 btn_hidden.set_group(btn_exclude);
157 btn_all.set_group(btn_exclude);
158
159 btn_exclude.active = exclude_all;
160 btn_hidden.active = include_hidden;
161 btn_all.active = include_all;
162
163 btn_exclude.toggled.connect(()=>{ if (btn_exclude.active) apply_user_mode(user, "exclude"); });
164 btn_hidden.toggled.connect(()=>{ if (btn_hidden.active) apply_user_mode(user, "hidden"); });
165 btn_all.toggled.connect(()=>{ if (btn_all.active) apply_user_mode(user, "all"); });
166
167 mode_box.append(btn_exclude);
168 mode_box.append(btn_hidden);
169 mode_box.append(btn_all);
170
171 return row;
172 }
173
174 private void init_btrfs_home_option(Gtk.Box box){
175 if (restore_mode){
176 chk_include_btrfs_home = new Gtk.CheckButton.with_label(_("Restore @home subvolume"));
177 box.append(chk_include_btrfs_home);
178 chk_include_btrfs_home.toggled.connect(()=>{
179 App.include_btrfs_home_for_restore = chk_include_btrfs_home.active;
180 });
181 }
182 else {
183 chk_include_btrfs_home = new Gtk.CheckButton.with_label(_("Include @home subvolume in backups"));
184 box.append(chk_include_btrfs_home);
185 chk_include_btrfs_home.toggled.connect(()=>{
186 App.include_btrfs_home_for_backup = chk_include_btrfs_home.active;
187 });
188 }
189 }
190
191 public void refresh(){
192 if (App.btrfs_mode){
193 lbl_message.visible = false;
194 scrolled_treeview.visible = false;
195 box_btrfs.visible = true;
196 if (restore_mode){
197 chk_include_btrfs_home.active = App.include_btrfs_home_for_restore;
198 }
199 else{
200 chk_include_btrfs_home.active = App.include_btrfs_home_for_backup;
201 }
202 }
203 else{
204 lbl_message.visible = true;
205 scrolled_treeview.visible = true;
207 box_btrfs.visible = false;
208 }
209 show();
210 }
211
212 private void refresh_treeview(){
213 Gtk.Widget? child = listbox.get_first_child();
214 while (child != null){
215 Gtk.Widget? next = child.get_next_sibling();
216 listbox.remove(child);
217 child = next;
218 }
219
220 foreach(var user in App.current_system_users.values){
221 if (user.is_system){ continue; }
222 listbox.append(create_user_row(user));
223 }
224
226 }
227}
Main App
#define _(s)
void refresh_treeview()
Gee.HashMap< string, SystemUser > current_system_users
Definition Main.vala:164
bool btrfs_mode
Definition Main.vala:52
Gee.ArrayList< string > exclude_list_user
Definition Main.vala:61
bool include_btrfs_home_for_restore
Definition Main.vala:54
bool include_btrfs_home_for_backup
Definition Main.vala:53
string name
bool has_encrypted_home
string home_path
Gtk.CheckButton chk_include_btrfs_home
Definition UsersBox.vala:23
UsersBox(Gtk.Window _parent_window, ExcludeBox _exclude_box, bool _restore_mode)
Definition UsersBox.vala:26
Gtk.Widget create_user_row(SystemUser user)
Gtk.ListBox listbox
Definition UsersBox.vala:17
void init_btrfs_home_option(Gtk.Box box)
void refresh_treeview()
bool restore_mode
Definition UsersBox.vala:24
void apply_user_mode(SystemUser user, string mode)
Definition UsersBox.vala:73
Gtk.Window parent_window
Definition UsersBox.vala:19
ExcludeBox exclude_box
Definition UsersBox.vala:20
void refresh()
string[] user_patterns(SystemUser user)
Definition UsersBox.vala:62
void init_listbox()
Definition UsersBox.vala:49
Gtk.Box box_btrfs
Definition UsersBox.vala:21
Gtk.ScrolledWindow scrolled_treeview
Definition UsersBox.vala:18
Gtk.Label lbl_message
Definition UsersBox.vala:22
Gtk.Label add_label(Gtk.Box box, string text, bool bold=false, bool italic=false, bool large=false)
void log_debug(string message)