Skip to content
API Documentation
BastionGuard™
SambaPage Class Reference

#include <SambaPage.hpp>

Inheritance diagram for SambaPage:

Classes

struct  SambaColumns

Public Member Functions

 SambaPage ()
virtual ~SambaPage ()=default

Private Member Functions

void loadConfig ()
void saveConfig ()
void refreshUI ()
void onAddDir ()
void onRemoveDir ()
void onScanNow ()

Private Attributes

SambaColumns sambaCols
Glib::RefPtr< Gtk::ListStore > sambaStore
Gtk::TreeView sambaView
Gtk::Switch switchEnable
Gtk::Button btnAdd
Gtk::Button btnRemove
Gtk::Button btnScan
Gtk::Button btnSave
bool loading_ = false

Detailed Description

Definition at line 25 of file SambaPage.hpp.

Constructor & Destructor Documentation

◆ SambaPage()

SambaPage::SambaPage ( )

Definition at line 66 of file SambaPage.cpp.

67: Gtk::Box(Gtk::Orientation::VERTICAL, 12)
68{
69 set_margin(12);
70
71 sambaStore = Gtk::ListStore::create(sambaCols);
72 sambaView.set_model(sambaStore);
73
74 auto hboxSwitch = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 6);
75
76 auto lbl = Gtk::make_managed<Gtk::Label>(_("<b>Abilita scansione Samba</b>"));
77 lbl->set_use_markup(true);
78 lbl->set_hexpand(true);
79 lbl->set_halign(Gtk::Align::START);
80
81 switchEnable.set_valign(Gtk::Align::CENTER);
82 switchEnable.signal_state_set().connect(
83 [this](bool){
84 if (!loading_)
85 saveConfig();
86 return false;
87 },
88 false
89 );
90
91 hboxSwitch->append(*lbl);
92 hboxSwitch->append(switchEnable);
93 append(*hboxSwitch);
94
95 auto col = Gtk::make_managed<Gtk::TreeViewColumn>(_("Percorso"));
96 auto cell = Gtk::make_managed<Gtk::CellRendererText>();
97
98 col->pack_start(*cell, true);
99 col->add_attribute(cell->property_text(), sambaCols.col_path);
100 sambaView.append_column(*col);
101
102 auto scroll = Gtk::make_managed<Gtk::ScrolledWindow>();
103 scroll->set_child(sambaView);
104 scroll->set_vexpand(true);
105 scroll->set_min_content_height(180);
106 append(*scroll);
107
108
109 auto btnBox = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 6);
110
111 btnAdd.set_label(_("Aggiungi"));
112 btnRemove.set_label(_("Rimuovi"));
113 btnScan.set_label(_("Scansiona ora"));
114 btnSave.set_label(_("Salva configurazione"));
115
116 btnBox->append(btnAdd);
117 btnBox->append(btnRemove);
118 btnBox->append(btnScan);
119 btnBox->append(btnSave);
120
121 btnBox->set_halign(Gtk::Align::END);
122 append(*btnBox);
123
124 // Signals
125 btnAdd.signal_clicked().connect(sigc::mem_fun(*this, &SambaPage::onAddDir));
126 btnRemove.signal_clicked().connect(sigc::mem_fun(*this, &SambaPage::onRemoveDir));
127 btnSave.signal_clicked().connect(sigc::mem_fun(*this, &SambaPage::saveConfig));
128 btnScan.signal_clicked().connect(sigc::mem_fun(*this, &SambaPage::onScanNow));
129
130 loadConfig();
131 refreshUI();
132}
#define _(s)
Glib::RefPtr< Gtk::ListStore > sambaStore
Definition SambaPage.hpp:41
void onAddDir()
Gtk::Button btnRemove
Definition SambaPage.hpp:45
void loadConfig()
Gtk::Button btnScan
Definition SambaPage.hpp:45
bool loading_
Definition SambaPage.hpp:47
Gtk::Button btnAdd
Definition SambaPage.hpp:45
SambaColumns sambaCols
Definition SambaPage.hpp:40
void onScanNow()
void saveConfig()
void onRemoveDir()
Gtk::Switch switchEnable
Definition SambaPage.hpp:44
Gtk::TreeView sambaView
Definition SambaPage.hpp:42
Gtk::Button btnSave
Definition SambaPage.hpp:45
void refreshUI()
Gtk::TreeModelColumn< Glib::ustring > col_path
Definition SambaPage.hpp:36

References _, btnAdd, btnRemove, btnSave, btnScan, SambaPage::SambaColumns::col_path, loadConfig(), loading_, onAddDir(), onRemoveDir(), onScanNow(), refreshUI(), sambaCols, sambaStore, sambaView, saveConfig(), and switchEnable.

◆ ~SambaPage()

virtual SambaPage::~SambaPage ( )
virtualdefault

Member Function Documentation

◆ loadConfig()

void SambaPage::loadConfig ( )
private

Definition at line 136 of file SambaPage.cpp.

137{
138 loading_ = true;
139
140 sambaStore->clear();
141
142 switchEnable.set_active(Backend::instance().isSambaEnabled());
143
144 for (const auto &dir : Backend::instance().getSambaDirs())
145 {
146 if (dir.empty()) continue;
147 auto row = *(sambaStore->append());
148 row[sambaCols.col_path] = dir;
149 row[sambaCols.col_color] = "white";
150 }
151
152 loading_ = false;
153}
static Backend & instance()
Definition Backend.cpp:830
Gtk::TreeModelColumn< Glib::ustring > col_color
Definition SambaPage.hpp:37

References SambaPage::SambaColumns::col_color, SambaPage::SambaColumns::col_path, Backend::instance(), loading_, sambaCols, sambaStore, and switchEnable.

Referenced by SambaPage().

◆ onAddDir()

void SambaPage::onAddDir ( )
private

Definition at line 190 of file SambaPage.cpp.

191{
192
193 auto dlg = Gtk::make_managed<Gtk::Dialog>();
194 Gtk::Dialog* dialog = dlg;
195
196 dialog->set_title("");
197 dialog->set_modal(false);
198 dialog->set_destroy_with_parent(true);
199 dialog->set_default_size(480, 260);
200 dialog->set_resizable(false);
201
202 auto ctx = dialog->get_style_context();
203 ctx->add_class("app-dialog");
204 ctx->add_class("main-window");
205 ctx->add_class("app-window");
206
207 auto header = Gtk::make_managed<Gtk::HeaderBar>();
208 header->set_show_title_buttons(false);
209 header->set_decoration_layout("");
210 header->add_css_class("custom-headerbar");
211
212 auto close_box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
213 close_box->set_margin_end(6);
214
215 try {
216 auto px = Gdk::Pixbuf::create_from_file(resource("icon-close.png"), 28, 28, true);
217 auto btnCloseIcon = Gtk::make_managed<Gtk::Button>();
218 btnCloseIcon->set_child(*Gtk::make_managed<Gtk::Image>(px));
219 btnCloseIcon->add_css_class("header-button");
220 btnCloseIcon->signal_clicked().connect([dialog]() { dialog->close(); });
221 close_box->append(*btnCloseIcon);
222 } catch (...) {}
223
224 header->pack_end(*close_box);
225
226 auto header_wrapper = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL);
227 header_wrapper->append(*header);
228 dialog->set_titlebar(*header_wrapper);
229
230
231 auto box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 14);
232 box->set_margin(20);
233 dialog->get_content_area()->append(*box);
234
235 auto lblTitle = Gtk::make_managed<Gtk::Label>(_("<b>Aggiungi percorso SMB</b>"));
236 lblTitle->set_use_markup(true);
237 lblTitle->set_halign(Gtk::Align::CENTER);
238 lblTitle->add_css_class("title");
239 box->append(*lblTitle);
240
241 auto entryUrl = Gtk::make_managed<Gtk::Entry>();
242 entryUrl->set_placeholder_text("smb://server/share/percorso");
243
244 auto entryUser = Gtk::make_managed<Gtk::Entry>();
245 entryUser->set_placeholder_text(_("Username (opzionale)"));
246
247 auto entryPass = Gtk::make_managed<Gtk::Entry>();
248 entryPass->set_placeholder_text(_("Password (opzionale)"));
249 entryPass->set_visibility(false);
250
251 box->append(*entryUrl);
252 box->append(*entryUser);
253 box->append(*entryPass);
254
255 auto infoAlert = Gtk::make_managed<Gtk::Label>(_(
256 "<i>Nota: in caso di rilevamento malware su file remoti,\n"
257 "sarà necessario intervenire manualmente per la rimozione.</i>")
258 );
259 infoAlert->set_use_markup(true);
260 infoAlert->add_css_class("alert-info");
261 infoAlert->set_halign(Gtk::Align::CENTER);
262 box->append(*infoAlert);
263
264 auto btnRow = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 12);
265 btnRow->set_halign(Gtk::Align::CENTER);
266 box->append(*btnRow);
267
268 auto btnOk = Gtk::make_managed<Gtk::Button>(_("Aggiungi"));
269 auto btnCancel = Gtk::make_managed<Gtk::Button>(_("Annulla"));
270
271 btnOk->add_css_class("btn-success");
272 btnCancel->add_css_class("btn-danger");
273
274 btnRow->append(*btnOk);
275 btnRow->append(*btnCancel);
276
277
278 btnOk->signal_clicked().connect([=, this]() {
279
280 std::string url = entryUrl->get_text();
281
282
283 url = Backend::resolveSambaDir(url);
284 std::replace(url.begin(), url.end(), '\\', '/');
285
286 if (url.size() > 7 && url.back() == '/')
287 url.pop_back();
288
289
290 if (!Backend::isValidSMB(url))
291 {
293 dynamic_cast<Gtk::Window*>(get_root()),
294 _("Percorso SMB non valido:\n") + url,
295 Gtk::MessageType::ERROR);
296 return;
297 }
298
299 auto row = *(sambaStore->append());
300 row[sambaCols.col_path] = url;
301
303 url,
304 entryUser->get_text(),
305 entryPass->get_text()
306 );
307
308 saveConfig();
309 dialog->close();
310 });
311
312 btnCancel->signal_clicked().connect([dialog]() {
313 dialog->close();
314 });
315
316 dialog->present();
317}
static std::string resolveSambaDir(const std::string &path)
Definition Backend.cpp:2065
static bool isValidSMB(const std::string &url)
Definition Backend.cpp:1919
void saveSMBCredentials(const std::string &url, const std::string &user, const std::string &pass)
Definition Backend.cpp:1930
static void show_message(Gtk::Window *parent, const std::string &message, Gtk::MessageType type=Gtk::MessageType::INFO, const std::string &secondary=std::string())
Definition Utils.cpp:33
std::string resource(const std::string &rel)
Definition Resource.hpp:31

References _, SambaPage::SambaColumns::col_path, Backend::instance(), Backend::isValidSMB(), Backend::resolveSambaDir(), resource(), sambaCols, sambaStore, saveConfig(), Backend::saveSMBCredentials(), and Utils::show_message().

Referenced by SambaPage().

◆ onRemoveDir()

void SambaPage::onRemoveDir ( )
private

Definition at line 319 of file SambaPage.cpp.

320{
321 auto sel = sambaView.get_selection();
322 if (!sel) return;
323
324 auto it = sel->get_selected();
325 if (it)
326 {
327 sambaStore->erase(it);
328 saveConfig();
329 }
330}

References sambaStore, sambaView, and saveConfig().

Referenced by SambaPage().

◆ onScanNow()

void SambaPage::onScanNow ( )
private

Definition at line 332 of file SambaPage.cpp.

333{
335
336 auto active = std::make_shared<std::atomic<bool>>(true);
337 auto dialog_open = std::make_shared<bool>(true);
338
339
340 auto dialog = Gtk::make_managed<Gtk::Dialog>();
341 Gtk::Dialog* dlg = dialog;
342
343 dlg->set_title("");
344 dlg->set_modal(false);
345 dlg->set_default_size(520, 420);
346 dlg->set_resizable(false);
347
348 auto ctx = dlg->get_style_context();
349 ctx->add_class("app-dialog");
350 ctx->add_class("main-window");
351 ctx->add_class("app-window");
352
353
354 auto header = Gtk::make_managed<Gtk::HeaderBar>();
355 header->set_show_title_buttons(false);
356 header->set_decoration_layout("");
357 header->add_css_class("custom-headerbar");
358
359 auto close_box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
360 close_box->set_margin_end(6);
361
362 try {
363 auto px = Gdk::Pixbuf::create_from_file(resource("icon-close.png"), 28, 28, true);
364 auto btnCloseIcon = Gtk::make_managed<Gtk::Button>();
365 btnCloseIcon->set_child(*Gtk::make_managed<Gtk::Image>(px));
366 btnCloseIcon->add_css_class("header-button");
367 btnCloseIcon->signal_clicked().connect([dlg]() { dlg->close(); });
368 close_box->append(*btnCloseIcon);
369 } catch (...) {}
370
371 header->pack_end(*close_box);
372
373 auto header_wrapper = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL);
374 header_wrapper->append(*header);
375 dlg->set_titlebar(*header_wrapper);
376
377
378 auto box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 20);
379 box->set_margin(20);
380 dlg->get_content_area()->append(*box);
381
382 auto lbl = Gtk::make_managed<Gtk::Label>(_("Scansione Samba avviata…"));
383 lbl->set_halign(Gtk::Align::CENTER);
384 lbl->add_css_class("title");
385 box->append(*lbl);
386
387 auto lblCurrent = Gtk::make_managed<Gtk::Label>(_("File corrente: --"));
388 lblCurrent->set_halign(Gtk::Align::CENTER);
389 lblCurrent->add_css_class("subtitle");
390 box->append(*lblCurrent);
391
392
393 auto prog = Gtk::make_managed<Gtk::ProgressBar>();
394 prog->set_show_text(true);
395 prog->set_text("0%");
396 prog->set_fraction(0.0);
397 prog->set_halign(Gtk::Align::CENTER);
398 prog->set_margin_bottom(10);
399 box->append(*prog);
400
401
402
403 auto fileList = Gtk::make_managed<Gtk::ListBox>();
404 fileList->set_vexpand(true);
405 fileList->add_css_class("scan-file-list");
406
407 auto scroll = Gtk::make_managed<Gtk::ScrolledWindow>();
408 scroll->set_child(*fileList);
409 scroll->set_vexpand(true);
410 scroll->set_min_content_height(140);
411 box->append(*scroll);
412
413
414
415 auto buttonRow = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 20);
416 buttonRow->set_halign(Gtk::Align::CENTER);
417 box->append(*buttonRow);
418
419 auto btnStop = Gtk::make_managed<Gtk::Button>(_("Interrompi scansione"));
420 btnStop->add_css_class("btn-danger");
421
422 auto btnClose = Gtk::make_managed<Gtk::Button>(_("Chiudi"));
423 btnClose->add_css_class("btn-success");
424
425 buttonRow->append(*btnStop);
426 buttonRow->append(*btnClose);
427
428 dlg->present();
429
430
431 btnStop->signal_clicked().connect([dlg, active]() {
433 if (active->load()) {
434 active->store(false);
435 dlg->close();
436 }
437 });
438
439 btnClose->signal_clicked().connect([dlg]() { dlg->close(); });
440
441
442 auto timeoutFiles = std::make_shared<sigc::connection>();
443
444 *timeoutFiles = Glib::signal_timeout().connect(
445 [lbl, lblCurrent, prog, fileList, btnStop, dialog_open]() -> bool
446 {
447 if (!*dialog_open)
448 return false;
449
451
452 if (!st.scan_active)
453 {
454 const size_t logCount = st.files.size();
455 const size_t infected = st.infected;
456
457 std::string summary =
458 Glib::ustring::compose(
459 _("Scansione completata.\n"
460 "File analizzati: %1\n"
461 "File infetti: %2"),
462 logCount,
463 infected
464 );
465
466 lbl->set_text(summary);
467 lblCurrent->set_text(_("File corrente: --"));
468
469 prog->set_fraction(1.0);
470 prog->set_text("100%");
471
472 btnStop->set_sensitive(false);
473 btnStop->remove_css_class("btn-danger");
474 btnStop->add_css_class("btn-grey");
475
476 while (auto row = fileList->get_row_at_index(0))
477 fileList->remove(*row);
478
479 for (const auto& f : st.files)
480 {
481 auto lblLine = Gtk::make_managed<Gtk::Label>(f);
482 lblLine->set_halign(Gtk::Align::START);
483
484 auto row = Gtk::make_managed<Gtk::ListBoxRow>();
485 row->set_child(*lblLine);
486
487 fileList->append(*row);
488 }
489
490 return true;
491 }
492
493 lblCurrent->set_text(_("File corrente: ") +
494 (st.current_scanning.empty() ? "--" : st.current_scanning));
495
496 prog->set_fraction(st.progress);
497 prog->set_text(std::to_string(int(st.progress * 100)) + "%");
498
499 while (auto row = fileList->get_row_at_index(0))
500 fileList->remove(*row);
501
502 for (const auto& f : st.files)
503 {
504 auto lblLine = Gtk::make_managed<Gtk::Label>(f);
505 lblLine->set_halign(Gtk::Align::START);
506
507 auto row = Gtk::make_managed<Gtk::ListBoxRow>();
508 row->set_child(*lblLine);
509
510 fileList->append(*row);
511 }
512
513 return true;
514 },
515 250
516 );
517
518
519 dlg->signal_close_request().connect(
520 [dialog_open, timeoutFiles]() -> bool {
521
522 *dialog_open = false;
523
524 if (timeoutFiles->connected())
525 timeoutFiles->disconnect();
526
528
529 return false;
530 },
531 false
532 );
533
534
536 [lbl, dialog_open](const std::string& summary, float pct)
537 {
538 Glib::signal_idle().connect_once(
539 [lbl, dialog_open, summary]()
540 {
541 if (!*dialog_open) return;
542 lbl->set_text(summary);
543 }
544 );
545 };
546
547
548 std::thread([]() {
549 auto dirs = Backend::instance().getSambaDirs();
550 for (const auto& d : dirs)
552 }).detach();
553}
std::function< void(const std::string &, float)> samba_progress_callback
Definition Backend.hpp:150
void requestStopSambaScan()
Definition Backend.cpp:2572
void resetSambaStop()
Definition Backend.cpp:2568
ScanStatus get_current_scan_files()
Definition Backend.cpp:2985
std::vector< std::string > getSambaDirs()
Definition Backend.cpp:1764
void scanSambaDir(const std::string &dir)
Definition Backend.cpp:2280

References _, Backend::get_current_scan_files(), Backend::getSambaDirs(), Backend::instance(), Backend::requestStopSambaScan(), Backend::resetSambaStop(), resource(), Backend::samba_progress_callback, and Backend::scanSambaDir().

Referenced by SambaPage().

◆ refreshUI()

void SambaPage::refreshUI ( )
private

Definition at line 181 of file SambaPage.cpp.

182{
183 btnScan.set_sensitive(
184 switchEnable.get_active() &&
185 sambaStore->children().size() > 0
186 );
187}

References btnScan, sambaStore, and switchEnable.

Referenced by SambaPage(), and saveConfig().

◆ saveConfig()

void SambaPage::saveConfig ( )
private

Definition at line 156 of file SambaPage.cpp.

157{
158 std::vector<std::string> dirs;
159
160 for (auto &row : sambaStore->children())
161 {
162 Glib::ustring p = row[sambaCols.col_path];
163 if (!p.empty())
164 dirs.push_back(p);
165 }
166
168 switchEnable.get_active(),
169 dirs
170 );
171
172 refreshUI();
173
175 dynamic_cast<Gtk::Window*>(get_root()),
176 _("Configurazione Samba salvata correttamente."),
177 Gtk::MessageType::INFO);
178}
void saveSambaConfig(bool enabled, const std::vector< std::string > &dirs)
Definition Backend.cpp:2608

References _, SambaPage::SambaColumns::col_path, Backend::instance(), refreshUI(), sambaCols, sambaStore, Backend::saveSambaConfig(), Utils::show_message(), and switchEnable.

Referenced by onAddDir(), onRemoveDir(), and SambaPage().

Member Data Documentation

◆ btnAdd

Gtk::Button SambaPage::btnAdd
private

Definition at line 45 of file SambaPage.hpp.

Referenced by SambaPage().

◆ btnRemove

Gtk::Button SambaPage::btnRemove
private

Definition at line 45 of file SambaPage.hpp.

Referenced by SambaPage().

◆ btnSave

Gtk::Button SambaPage::btnSave
private

Definition at line 45 of file SambaPage.hpp.

Referenced by SambaPage().

◆ btnScan

Gtk::Button SambaPage::btnScan
private

Definition at line 45 of file SambaPage.hpp.

Referenced by refreshUI(), and SambaPage().

◆ loading_

bool SambaPage::loading_ = false
private

Definition at line 47 of file SambaPage.hpp.

Referenced by loadConfig(), and SambaPage().

◆ sambaCols

SambaColumns SambaPage::sambaCols
private

Definition at line 40 of file SambaPage.hpp.

Referenced by loadConfig(), onAddDir(), SambaPage(), and saveConfig().

◆ sambaStore

Glib::RefPtr<Gtk::ListStore> SambaPage::sambaStore
private

Definition at line 41 of file SambaPage.hpp.

Referenced by loadConfig(), onAddDir(), onRemoveDir(), refreshUI(), SambaPage(), and saveConfig().

◆ sambaView

Gtk::TreeView SambaPage::sambaView
private

Definition at line 42 of file SambaPage.hpp.

Referenced by onRemoveDir(), and SambaPage().

◆ switchEnable

Gtk::Switch SambaPage::switchEnable
private

Definition at line 44 of file SambaPage.hpp.

Referenced by loadConfig(), refreshUI(), SambaPage(), and saveConfig().


The documentation for this class was generated from the following files: