636 {
638 std::cerr <<
_(
"[SecureBrowser] CEF disabilitato su questa build o distribuzione.\n");
639 return false;
640 }
641
642 if (!std::getenv("BG_SANDBOX"))
644
645 bool expected = false;
646 if (!
g_cef_started.compare_exchange_strong(expected,
true)) {
647 std::cerr <<
_(
"[SecureBrowser] ⚠️ Richiesta duplicata nello stesso processo.\n");
648 return false;
649 }
650
651 InstanceLock lock("/tmp/BastionGuard-bankopener.lock");
652 if (!lock.acquired()) {
653 std::cerr <<
_(
"[SecureBrowser] ℹ️ Istanza già attiva. Rifiuto nuovo avvio.\n");
655 return false;
656 }
657
658 auto fail = [&](
const std::string& msg) ->
bool {
659 std::cerr << msg << "\n";
661 return false;
662 };
663
664 std::cout <<
_(
"[SecureBrowser] 🧩 Avvio sandbox Blink/CEF per URL: ") << url << std::endl;
665
667
668 setenv("SSL_CERT_DIR", "/etc/ssl/certs", 1);
669 setenv("SSL_CERT_FILE", "/etc/ssl/certs/ca-certificates.crt", 1);
670 setenv("NSS_CERT_FILE", "/etc/ssl/certs/ca-certificates.crt", 1);
671 setenv("NSS_CERT_DIR", "/etc/ssl/certs", 1);
672
673 const std::string cef_dir = "/usr/share/BastionGuard/cef";
674 const std::string cache_dir = Glib::get_home_dir() + "/.cache/BastionGuard/cef_sandbox";
675 std::error_code ec;
676 fs::create_directories(cache_dir, ec);
677 if (ec) {
678 std::cerr <<
_(
"[SecureBrowser] ⚠️ Creazione cache_dir fallita: ") << ec.message() <<
"\n";
679 }
680
681
682
683
684 setenv("BG_CEF_PERSIST_SESSION", "1", 1);
685
686 CefMainArgs args(argc, argv);
688
689 auto try_init_cef = [&](const char* backend) -> bool {
690 if (backend) setenv("BastionGuard_CEF_BACKEND", backend, 1);
691
692 CefSettings settings;
693 settings.no_sandbox = true;
694 settings.windowless_rendering_enabled = false;
695 settings.log_severity = LOGSEVERITY_WARNING;
696 settings.background_color = CefColorSetARGB(0xFF, 0xFF, 0xFF, 0xFF);
697
698 CefString(&settings.resources_dir_path) = cef_dir;
699 CefString(&settings.locales_dir_path) = cef_dir + "/locales";
700 CefString(&settings.cache_path) = cache_dir;
701
702
703
704
705 settings.persist_session_cookies = true;
706
707 bool init_ok = CefInitialize(args, settings, app, nullptr);
708 if (!init_ok) {
709 std::cerr <<
_(
"[SecureBrowser] ❌ CefInitialize returned false for backend: ")
710 << (backend ? backend : "auto") << "\n";
711 }
712 return init_ok;
713 };
714
715
716
717
718
719
720
721
722
723
724
725 auto pick_backend = []() -> const char* {
726 if (const char* b = std::getenv("BastionGuard_CEF_BACKEND")) {
727 if (std::strcmp(b, "wayland") == 0 || std::strcmp(b, "x11") == 0)
728 return b;
729 }
730 if (const char* o = std::getenv("OZONE_PLATFORM")) {
731 if (std::strcmp(o, "wayland") == 0 || std::strcmp(o, "x11") == 0)
732 return o;
733 }
734 if (const char* s = std::getenv("XDG_SESSION_TYPE")) {
735 if (std::strcmp(s, "wayland") == 0) return "wayland";
736 if (std::strcmp(s, "x11") == 0) return "x11";
737 }
738 if (std::getenv("WAYLAND_DISPLAY")) return "wayland";
739 if (std::getenv("DISPLAY")) return "x11";
740 return "x11";
741 };
742
743 const char* backend_pref = pick_backend();
744 std::cerr <<
_(
"[SecureBrowser] backend preferito: ") << backend_pref <<
"\n";
745
746 bool ok = try_init_cef(backend_pref);
747
748
749
750 if (!ok && std::strcmp(backend_pref, "wayland") == 0 &&
751 std::getenv("DISPLAY") && !std::getenv("BG_CEF_X11_FALLBACK")) {
752 std::cerr <<
_(
"[SecureBrowser] ⚠️ CEF Wayland fallito → re-exec con X11.\n");
753 setenv("BG_CEF_X11_FALLBACK", "1", 1);
754 setenv("BastionGuard_CEF_BACKEND", "x11", 1);
755 setenv("OZONE_PLATFORM", "x11", 1);
756 setenv("GDK_BACKEND", "x11", 1);
757 unsetenv("WAYLAND_DISPLAY");
758
759 if (argv && argv[0]) {
760 std::vector<char*> reargv;
761 for (int i = 0; i < argc; ++i) reargv.push_back(argv[i]);
762 reargv.push_back(nullptr);
763 execvp(argv[0], reargv.data());
764 std::perror("execvp(x11 fallback)");
765 }
766 }
767
768 if (!ok) {
769 return fail(
_(
"[SecureBrowser] ❌ CefInitialize fallito definitivamente."));
770 }
771
772 CefRefPtr<SimpleHandler> handler = new SimpleHandler();
773 CefRefPtr<SecureBrowserViewDelegate> view_delegate =
774 new SecureBrowserViewDelegate();
775
776 CefBrowserSettings bset;
777 bset.javascript = STATE_ENABLED;
778 bset.webgl = STATE_ENABLED;
779
780 CefRefPtr<CefBrowserView> mainView =
781 CefBrowserView::CreateBrowserView(
782 handler, url, bset, nullptr, nullptr, view_delegate);
783
784 if (!mainView) {
785 CefShutdown();
786 return fail(
_(
"[SecureBrowser] ❌ CreateBrowserView() ha restituito nullptr."));
787 }
788
789 class WindowDelegate : public CefWindowDelegate {
790 public:
791 explicit WindowDelegate(CefRefPtr<CefBrowserView>
main) : mainView_(
main) {}
792
793 void OnWindowCreated(CefRefPtr<CefWindow> window) override {
794 window->AddChildView(mainView_);
795 window->SetBounds(CefRect(100, 100, 1200, 800));
796 mainView_->SetBounds(CefRect(0, 0, 1200, 800));
797 window->SetTitle("BastionGuard Secure Browser");
798 window->Show();
799 }
800
801 void OnWindowDestroyed(CefRefPtr<CefWindow>) override {
802 CefQuitMessageLoop();
803 }
804
805 IMPLEMENT_REFCOUNTING(WindowDelegate);
806
807 private:
808 CefRefPtr<CefBrowserView> mainView_;
809 };
810
811 CefWindow::CreateTopLevelWindow(new WindowDelegate(mainView));
812
813 std::cout <<
_(
"[SecureBrowser] ✅ Finestra sandbox creata, avvio message loop.\n");
814
815 CefRunMessageLoop();
816 CefShutdown();
817
819 std::cout <<
_(
"[SecureBrowser] ✅ Sandbox chiusa correttamente.\n");
820 return true;
821}
static void clear_proxy_env()
void start_local_warning_server()
static std::atomic< bool > g_cef_started
static CefRefPtr< CefApp > createApp()
void fail(const std::string &message)