Skip to content
API Documentation
BastionGuard™
SecureGuiWindow Class Reference
Inheritance diagram for SecureGuiWindow:

Public Member Functions

 SecureGuiWindow ()

Protected Member Functions

bool on_close_request () override

Private Member Functions

void build_headerbar ()
void minimize ()
void show_warning (const Glib::ustring &msg, const Glib::ustring &secondary={})
void on_cancel_clicked ()
void on_open_clicked ()
void on_sandbox_finished (const Glib::RefPtr< Gio::AsyncResult > &)
void terminate_sandbox ()

Static Private Member Functions

static std::string config_path_payments ()
static std::vector< Glib::ustring > load_domains_from_config ()

Private Attributes

Gtk::DropDown dropdown_
std::vector< Glib::ustring > domains_
Gtk::Button btn_open_
Gtk::Button btn_cancel_
Glib::RefPtr< Gio::Subprocess > sandbox_proc_

Detailed Description

Definition at line 47 of file BastionGuard-secure-main.cpp.

Constructor & Destructor Documentation

◆ SecureGuiWindow()

SecureGuiWindow::SecureGuiWindow ( )
inline

Definition at line 49 of file BastionGuard-secure-main.cpp.

49 {
50 set_title("");
51 set_resizable(false);
52 set_default_size(640, 300);
54
55 auto main_box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 0);
56 set_child(*main_box);
57
58 auto sidebar = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 10);
59 sidebar->set_size_request(240, -1);
60 sidebar->get_style_context()->add_class("sidebar");
61
62 {
63 auto header = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 8);
64 header->get_style_context()->add_class("sidebar-header");
65
66 try {
67 auto pixbuf = Gdk::Pixbuf::create_from_file(resource("logo-sidebar.png"), 96, 96, true);
68 auto logo = Gtk::make_managed<Gtk::Image>(pixbuf);
69 header->append(*logo);
70 } catch (...) {
71 std::cerr << _("⚠ Impossibile caricare data/logo-sidebar.png") << "\n";
72 }
73
74 auto lbl = Gtk::make_managed<Gtk::Label>("BastionGuard");
75 lbl->set_halign(Gtk::Align::START);
76 lbl->get_style_context()->add_class("sidebar-title");
77 header->append(*lbl);
78
79 sidebar->append(*header);
80 }
81
82 auto spacer = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL);
83 spacer->set_vexpand(true);
84 sidebar->append(*spacer);
85
86 main_box->append(*sidebar);
87 auto content_box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 10);
88 content_box->set_margin(24);
89 content_box->set_hexpand(true);
90 content_box->get_style_context()->add_class("content");
91 main_box->append(*content_box);
92
93 auto label = Gtk::make_managed<Gtk::Label>(
94 _("Seleziona un sito sicuro per i pagamenti/e-commerce:")
95 );
96 label->set_wrap(true);
97 label->set_halign(Gtk::Align::START);
98 content_box->append(*label);
99
101 if (domains_.empty())
102 domains_.push_back("paypal.com");
103
104 auto string_list = Gtk::StringList::create(domains_);
105 dropdown_.set_model(string_list);
106 dropdown_.set_selected(0);
107 content_box->append(dropdown_);
108
109 auto hint = Gtk::make_managed<Gtk::Label>(
110 _("La lista proviene da ~/.config/BastionGuard/payments.json (chiave: \"list\").")
111 );
112 hint->set_halign(Gtk::Align::START);
113 hint->get_style_context()->add_class("hint");
114 content_box->append(*hint);
115
116 auto buttons = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 8);
117 buttons->set_halign(Gtk::Align::END);
118
119 btn_cancel_.set_label(_("Annulla"));
120 btn_cancel_.signal_clicked().connect(sigc::mem_fun(*this, &SecureGuiWindow::on_cancel_clicked));
121 buttons->append(btn_cancel_);
122
123 btn_open_.set_label(_("Apri in Secure Browser"));
124 btn_open_.signal_clicked().connect(sigc::mem_fun(*this, &SecureGuiWindow::on_open_clicked));
125 buttons->append(btn_open_);
126
127 content_box->append(*buttons);
128 }
#define _(s)
static std::vector< Glib::ustring > load_domains_from_config()
std::vector< Glib::ustring > domains_
std::string resource(const std::string &rel)
Definition Resource.hpp:31

References _, btn_cancel_, btn_open_, build_headerbar(), domains_, dropdown_, load_domains_from_config(), on_cancel_clicked(), on_open_clicked(), and resource().

Member Function Documentation

◆ build_headerbar()

void SecureGuiWindow::build_headerbar ( )
inlineprivate

Definition at line 144 of file BastionGuard-secure-main.cpp.

144 {
145 auto header = Gtk::make_managed<Gtk::HeaderBar>();
146 header->set_show_title_buttons(false);
147 header->set_decoration_layout("");
148 header->get_style_context()->add_class("custom-headerbar");
149
150 auto title_label = Gtk::make_managed<Gtk::Label>("BastionGuard Secure Browser");
151 title_label->get_style_context()->add_class("header-title");
152 title_label->set_halign(Gtk::Align::CENTER);
153 title_label->set_valign(Gtk::Align::CENTER);
154 header->set_title_widget(*title_label);
155
156 auto header_right = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
157 header_right->get_style_context()->add_class("header-right");
158
159 try {
160 auto pix_min = Gdk::Pixbuf::create_from_file(resource("icon-minimize.png"), 32, 32, true);
161 auto btn_min = Gtk::make_managed<Gtk::Button>();
162 btn_min->set_child(*Gtk::make_managed<Gtk::Image>(pix_min));
163 btn_min->get_style_context()->add_class("header-button");
164 header_right->append(*btn_min);
165 btn_min->signal_clicked().connect([this]() { minimize(); });
166 } catch (...) {
167 std::cerr << _("⚠ Errore caricamento icona minimize") << "\n";
168 }
169
170 try {
171 auto pix_close = Gdk::Pixbuf::create_from_file(resource("icon-close.png"), 32, 32, true);
172 auto btn_close = Gtk::make_managed<Gtk::Button>();
173 btn_close->set_child(*Gtk::make_managed<Gtk::Image>(pix_close));
174 btn_close->get_style_context()->add_class("header-button");
175 header_right->append(*btn_close);
176 btn_close->signal_clicked().connect([this]() {
178 this->hide();
179 });
180 } catch (...) {
181 std::cerr << _("⚠ Errore caricamento icona close") << "\n";
182 }
183
184 header->pack_end(*header_right);
185 set_titlebar(*header);
186 }

References _, minimize(), resource(), and terminate_sandbox().

Referenced by SecureGuiWindow().

◆ config_path_payments()

std::string SecureGuiWindow::config_path_payments ( )
inlinestaticprivate

Definition at line 194 of file BastionGuard-secure-main.cpp.

194 {
195 const auto base = Glib::get_user_config_dir();
196 return base + "/BastionGuard/payments.json";
197 }

Referenced by load_domains_from_config().

◆ load_domains_from_config()

std::vector< Glib::ustring > SecureGuiWindow::load_domains_from_config ( )
inlinestaticprivate

Definition at line 199 of file BastionGuard-secure-main.cpp.

199 {
200 std::vector<Glib::ustring> out;
201 const auto path = config_path_payments();
202
203 if (!fs::exists(path)) {
204 std::cerr << "⚠ Config non trovata: " << path << "\n";
205 return out;
206 }
207
208 std::ifstream f(path, std::ios::binary);
209 if (!f.is_open()) {
210 std::cerr << "⚠ Impossibile aprire: " << path << "\n";
211 return out;
212 }
213
214 json j;
215 try {
216 f >> j;
217 } catch (const std::exception& e) {
218 std::cerr << "⚠ Errore parsing JSON: " << e.what() << "\n";
219 return out;
220 }
221
222 if (!j.is_object() || !j.contains("list") || !j["list"].is_array()) {
223 std::cerr << "⚠ payments.json invalido: manca \"list\" (array).\n";
224 return out;
225 }
226
227 for (const auto& v : j["list"]) {
228 if (!v.is_string()) continue;
229 const auto s = v.get<std::string>();
230 if (!s.empty()) out.emplace_back(s);
231 }
232
233 return out;
234 }
nlohmann::json json
Definition Backend.cpp:2908
static std::string config_path_payments()

References config_path_payments().

Referenced by SecureGuiWindow().

◆ minimize()

void SecureGuiWindow::minimize ( )
inlineprivate

Definition at line 188 of file BastionGuard-secure-main.cpp.

188 {
189#if GTKMM_CHECK_VERSION(4,10,0)
190 this->hide();
191#endif
192 }

Referenced by build_headerbar().

◆ on_cancel_clicked()

void SecureGuiWindow::on_cancel_clicked ( )
inlineprivate

Definition at line 245 of file BastionGuard-secure-main.cpp.

245 {
247 hide();
248 }

References terminate_sandbox().

Referenced by SecureGuiWindow().

◆ on_close_request()

bool SecureGuiWindow::on_close_request ( )
inlineoverrideprotected

Definition at line 131 of file BastionGuard-secure-main.cpp.

131 {
133 return false;
134 }

References terminate_sandbox().

◆ on_open_clicked()

void SecureGuiWindow::on_open_clicked ( )
inlineprivate

Definition at line 250 of file BastionGuard-secure-main.cpp.

250 {
251 const auto idx = dropdown_.get_selected();
252 if (idx < 0 || static_cast<size_t>(idx) >= domains_.size()) {
253 show_warning(_("Seleziona un elemento valido."));
254 return;
255 }
256
257 const auto domain = domains_[static_cast<size_t>(idx)];
258 if (domain.empty()) {
259 show_warning(_("Dominio non valido."));
260 return;
261 }
262
263 const std::string url = "https://" + domain.raw();
264
265 set_sensitive(false);
266 try {
267 sandbox_proc_ = Gio::Subprocess::create(
268 {"BastionGuard-secure", url},
269 Gio::Subprocess::Flags::NONE
270 );
271 sandbox_proc_->wait_check_async(
272 sigc::mem_fun(*this, &SecureGuiWindow::on_sandbox_finished)
273 );
274 } catch (const Glib::Error& ex) {
275 show_warning(_("Errore avvio subprocess."), ex.what());
276 set_sensitive(true);
277 }
278 }
void on_sandbox_finished(const Glib::RefPtr< Gio::AsyncResult > &)
void show_warning(const Glib::ustring &msg, const Glib::ustring &secondary={})
Glib::RefPtr< Gio::Subprocess > sandbox_proc_

References _, domains_, dropdown_, on_sandbox_finished(), sandbox_proc_, and show_warning().

Referenced by SecureGuiWindow().

◆ on_sandbox_finished()

void SecureGuiWindow::on_sandbox_finished ( const Glib::RefPtr< Gio::AsyncResult > & )
inlineprivate

Definition at line 280 of file BastionGuard-secure-main.cpp.

280 {
281 hide();
282 }

Referenced by on_open_clicked().

◆ show_warning()

void SecureGuiWindow::show_warning ( const Glib::ustring & msg,
const Glib::ustring & secondary = {} )
inlineprivate

Definition at line 236 of file BastionGuard-secure-main.cpp.

236 {}) {
237 auto* dialog = new Gtk::MessageDialog(
238 *this, msg, false, Gtk::MessageType::WARNING, Gtk::ButtonsType::OK, true);
239 if (!secondary.empty()) dialog->set_secondary_text(secondary);
240 dialog->set_modal(true);
241 dialog->signal_response().connect([dialog](int){ dialog->hide(); delete dialog; });
242 dialog->present();
243 }

Referenced by on_open_clicked().

◆ terminate_sandbox()

void SecureGuiWindow::terminate_sandbox ( )
inlineprivate

Definition at line 284 of file BastionGuard-secure-main.cpp.

284 {
285 if (!sandbox_proc_) return;
286
287 try {
288 sandbox_proc_->send_signal(SIGTERM);
289 } catch (...) {
290 try { sandbox_proc_->force_exit(); } catch (...) {}
291 }
292 }

References sandbox_proc_.

Referenced by build_headerbar(), on_cancel_clicked(), and on_close_request().

Member Data Documentation

◆ btn_cancel_

Gtk::Button SecureGuiWindow::btn_cancel_
private

Definition at line 141 of file BastionGuard-secure-main.cpp.

Referenced by SecureGuiWindow().

◆ btn_open_

Gtk::Button SecureGuiWindow::btn_open_
private

Definition at line 140 of file BastionGuard-secure-main.cpp.

Referenced by SecureGuiWindow().

◆ domains_

std::vector<Glib::ustring> SecureGuiWindow::domains_
private

Definition at line 138 of file BastionGuard-secure-main.cpp.

Referenced by on_open_clicked(), and SecureGuiWindow().

◆ dropdown_

Gtk::DropDown SecureGuiWindow::dropdown_
private

Definition at line 137 of file BastionGuard-secure-main.cpp.

Referenced by on_open_clicked(), and SecureGuiWindow().

◆ sandbox_proc_

Glib::RefPtr<Gio::Subprocess> SecureGuiWindow::sandbox_proc_
private

Definition at line 142 of file BastionGuard-secure-main.cpp.

Referenced by on_open_clicked(), and terminate_sandbox().


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