cmake_minimum_required(VERSION 3.16) project(BastionGuard LANGUAGES CXX) # ============================================================ # CEF feature policy # ============================================================ # IMPORTANT: # ENABLE_CEF controls only the optional standalone CEF proxy and the # system-wide CA installer. It does NOT control the embedded CEF runtime # used by SecureBrowser, BankPage, BankOpener, BankGUI or Secure Payments. # Those components are always built and installed. option(ENABLE_CEF "Enable optional standalone CEF proxy/system-CA integration; embedded Secure Browser remains enabled" ON) option(ENABLE_CEF_DAEMON "Build and install the standalone bastionguard-cef proxy and user service" ON) option(ENABLE_SYSTEM_CA_INSTALL "Install the system CA policy and install-ca-system.sh helper" ON) set(BG_OS_RELEASE_FILE "/etc/os-release" CACHE FILEPATH "os-release file used for distro-specific build decisions") set(BG_OS_ID "") set(BG_UBUNTU_LINUXMINT FALSE) # Match the exact distribution ID only. ID_LIKE is deliberately ignored, # therefore Debian (ID=debian) is never treated as Ubuntu/Linux Mint. if(EXISTS "${BG_OS_RELEASE_FILE}") file(STRINGS "${BG_OS_RELEASE_FILE}" BG_OS_ID_LINE REGEX "^ID=") if(BG_OS_ID_LINE) list(GET BG_OS_ID_LINE 0 BG_OS_ID_LINE_FIRST) string(REGEX REPLACE "^ID=[\\\"']?([^\\\"']+)[\\\"']?$" "\\1" BG_OS_ID "${BG_OS_ID_LINE_FIRST}") string(TOLOWER "${BG_OS_ID}" BG_OS_ID) endif() endif() if(BG_OS_ID STREQUAL "ubuntu" OR BG_OS_ID STREQUAL "linuxmint") set(BG_UBUNTU_LINUXMINT TRUE) set(ENABLE_CEF OFF CACHE BOOL "Disable only standalone CEF proxy/system-CA integration on Ubuntu/Linux Mint" FORCE) endif() # ENABLE_CEF=OFF must never disable the embedded browser stack. # It only turns off the standalone proxy daemon and system CA installer. if(NOT ENABLE_CEF) set(ENABLE_CEF_DAEMON OFF CACHE BOOL "Build and install the standalone bastionguard-cef proxy and user service" FORCE) set(ENABLE_SYSTEM_CA_INSTALL OFF CACHE BOOL "Install the system CA policy and install-ca-system.sh helper" FORCE) endif() # Embedded CEF is intentionally unconditional. add_compile_definitions( BASTIONGUARD_HAS_CEF=1 BASTIONGUARD_HAS_EMBEDDED_CEF=1 ) if(ENABLE_CEF_DAEMON) add_compile_definitions(BASTIONGUARD_HAS_CEF_DAEMON=1) else() add_compile_definitions(BASTIONGUARD_HAS_CEF_DAEMON=0) endif() if(ENABLE_SYSTEM_CA_INSTALL) add_compile_definitions(BASTIONGUARD_ALLOW_SYSTEM_CA_INSTALL=1) else() add_compile_definitions(BASTIONGUARD_ALLOW_SYSTEM_CA_INSTALL=0) endif() message(STATUS "BG_OS_ID = ${BG_OS_ID}") message(STATUS "BG_UBUNTU_LINUXMINT = ${BG_UBUNTU_LINUXMINT}") message(STATUS "ENABLE_CEF = ${ENABLE_CEF} (optional proxy/CA only)") message(STATUS "ENABLE_CEF_DAEMON = ${ENABLE_CEF_DAEMON}") message(STATUS "ENABLE_SYSTEM_CA_INSTALL = ${ENABLE_SYSTEM_CA_INSTALL}") message(STATUS "Embedded Secure Browser / Bank = ALWAYS ENABLED") # ============================================================ # Packaging: disable privileged install-time actions (DEB/RPM/CI) # ============================================================ option(BG_DEBIAN_NO_INSTALL_CODE "Disable bg_install_code( ...) actions (packaging friendly: DEB/RPM/CI)" OFF ) # Optional explicit switch (recommended for spec/rules/CI) option(BG_PACKAGING "Packaging build (RPM/DEB) – disable privileged install-time code" OFF ) # ------------------------------------------------------------ # Auto-detect packaging environments (RPM/DEB) and CI # NOTE: DESTDIR is usually set only at install time, not configure time # ------------------------------------------------------------ if(NOT BG_PACKAGING) # RPM builders if(DEFINED ENV{RPM_BUILD_ROOT} AND NOT "$ENV{RPM_BUILD_ROOT}" STREQUAL "") set(BG_PACKAGING ON CACHE BOOL "RPM packaging build (RPM_BUILD_ROOT)" FORCE) elseif(DEFINED ENV{RPM_PACKAGE_BUILD_ROOT} AND NOT "$ENV{RPM_PACKAGE_BUILD_ROOT}" STREQUAL "") set(BG_PACKAGING ON CACHE BOOL "RPM packaging build (RPM_PACKAGE_BUILD_ROOT)" FORCE) # Debian builders (best-effort) elseif(DEFINED ENV{DEB_BUILD_OPTIONS} AND NOT "$ENV{DEB_BUILD_OPTIONS}" STREQUAL "") set(BG_PACKAGING ON CACHE BOOL "DEB packaging build (DEB_BUILD_OPTIONS)" FORCE) endif() endif() # Keep original behavior: CI disables privileged install-time code if(NOT BG_PACKAGING AND NOT BG_DEBIAN_NO_INSTALL_CODE) if(DEFINED ENV{CI} AND NOT "$ENV{CI}" STREQUAL "") set(BG_DEBIAN_NO_INSTALL_CODE ON CACHE BOOL "Disable bg_install_code( ...) actions (CI build)" FORCE) endif() endif() # If packaging, force-disable privileged install-time code if(BG_PACKAGING) set(BG_DEBIAN_NO_INSTALL_CODE ON CACHE BOOL "Disable bg_install_code( ...) actions (packaging build)" FORCE) endif() # Debug (useful while stabilizing; you can remove later) message(STATUS "BG_PACKAGING = ${BG_PACKAGING}") message(STATUS "BG_DEBIAN_NO_INSTALL_CODE = ${BG_DEBIAN_NO_INSTALL_CODE}") message(STATUS "ENV{DESTDIR} = '$ENV{DESTDIR}'") message(STATUS "ENV{RPM_BUILD_ROOT} = '$ENV{RPM_BUILD_ROOT}'") message(STATUS "ENV{RPM_PACKAGE_BUILD_ROOT}= '$ENV{RPM_PACKAGE_BUILD_ROOT}'") message(STATUS "ENV{CI} = '$ENV{CI}'") # ------------------------------------------------------------ # Wrapper: keep same name, but do NOT recurse. # - If disabled: do not even generate install(CODE ...) # - Extra safety: even if generated, skip at install-time when DESTDIR is set # ------------------------------------------------------------ function(bg_install_code code_str) # Configure-time guard (packaging / CI / explicit disable) if(BG_DEBIAN_NO_INSTALL_CODE OR BG_PACKAGING) message(STATUS "[Packaging] Skipping privileged install(CODE ...) block") return() endif() # Install-time guard (DESTDIR staging) install(CODE " if(DEFINED ENV{DESTDIR} AND NOT \"\$ENV{DESTDIR}\" STREQUAL \"\") message(STATUS \"[Packaging] DESTDIR is set β†’ skip privileged install code\") else() ${code_str} endif() ") endfunction() # =============================== # πŸ”’ RPATH GLOBALE BASTIONGUARD # =============================== set(BG_RPATH "/usr/share/BastionGuard/lib") set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) set(CMAKE_INSTALL_RPATH "${BG_RPATH}") set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_AUTOMOC OFF) set(CMAKE_AUTOUIC OFF) set(CMAKE_AUTORCC OFF) find_package(PkgConfig REQUIRED) find_package(Gettext REQUIRED) # ====================== # libsystemd / sd-bus # ====================== pkg_check_modules(SYSTEMD REQUIRED libsystemd) if (SYSTEMD_FOUND) message(STATUS "βœ” libsystemd trovato: ${SYSTEMD_VERSION}") include_directories(${SYSTEMD_INCLUDE_DIRS}) link_directories(${SYSTEMD_LIBRARY_DIRS}) add_definitions(${SYSTEMD_CFLAGS_OTHER}) else() message(FATAL_ERROR "❌ libsystemd non trovato. Installa libsystemd-dev") endif() # ============================== # Controllo NGINX # ============================== find_program(NGINX_EXECUTABLE nginx) if (NOT NGINX_EXECUTABLE) message(FATAL_ERROR "❌ NGINX non trovato nel sistema. Installa nginx (es: sudo apt install nginx o sudo pacman -S nginx).") else() execute_process(COMMAND ${NGINX_EXECUTABLE} -v ERROR_VARIABLE NGINX_VERSION_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ) string(REPLACE "nginx version: " "" NGINX_VERSION "${NGINX_VERSION_OUTPUT}") message(STATUS "βœ” NGINX trovato: ${NGINX_EXECUTABLE} (${NGINX_VERSION})") endif() # ============================== # Controllo RSYNC (richiesto per SaneSecurity) # ============================== find_program(RSYNC_EXECUTABLE rsync) if (NOT RSYNC_EXECUTABLE) message(FATAL_ERROR "❌ rsync non trovato nel sistema. È richiesto per aggiornare le firme SaneSecurity. Installa rsync (Debian/Ubuntu: sudo apt install rsync | Arch: sudo pacman -S rsync).") else() message(STATUS "βœ” rsync trovato: ${RSYNC_EXECUTABLE}") endif() include(GNUInstallDirs) # ============================================================ # BastionGuard – RPATH centralizzato (SAFE) # ============================================================ set(BG_LIBDIR "/usr/share/BastionGuard/lib") set(BG_CEF_LIBDIR "/usr/share/BastionGuard/cef") function(bg_set_rpath target) if(TARGET ${target}) set_target_properties(${target} PROPERTIES BUILD_RPATH "${BG_LIBDIR};${BG_CEF_LIBDIR}" INSTALL_RPATH "${BG_LIBDIR};${BG_CEF_LIBDIR}" SKIP_BUILD_RPATH FALSE ) endif() endfunction() # Option to control whether systemd services are enabled / started at install time. option(ENABLE_SYSTEMD_SERVICES "Enable and start systemd services at install time" OFF) # --- Percorso dati installati (es: /usr/share/BastionGuard/data) --- install(DIRECTORY data/ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/data PATTERN "scripts/install-ca-system.sh" EXCLUDE PATTERN "service/BastionGuard-cef.service" EXCLUDE ) set(INSTALL_DATA_DIR "${CMAKE_INSTALL_FULL_DATAROOTDIR}/BastionGuard/data") set(INSTALL_LOCALE_DIR "${CMAKE_INSTALL_FULL_DATAROOTDIR}/BastionGuard/locale") set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH ON) set(ENV{PKG_CONFIG_PATH} "/usr/share/BastionGuard/lib/pkgconfig:/usr/share/BastionGuard/share/pkgconfig" ) # ====================== # pkg-config # ====================== pkg_check_modules(GTKMM REQUIRED gtkmm-4.0) pkg_check_modules(GIOMM REQUIRED giomm-2.68) pkg_check_modules(SIGC REQUIRED sigc++-3.0) pkg_check_modules(YARA REQUIRED yara) pkg_check_modules(SOUP REQUIRED libsoup-3.0) pkg_check_modules(PANGOMM REQUIRED pangomm-2.48) # ====================== # libudev (PrivacyPage) # ====================== pkg_check_modules(UDEV REQUIRED libudev) include_directories(${UDEV_INCLUDE_DIRS}) link_directories(${UDEV_LIBRARY_DIRS}) if (UDEV_FOUND) message(STATUS "βœ” libudev trovato: ${UDEV_VERSION}") else() message(FATAL_ERROR "❌ libudev non trovato. Installa libudev-dev (Debian/Ubuntu) o systemd-libs-devel (Fedora).") endif() # ====================== # LibSecret (per salvataggio sicuro delle credenziali) # ====================== pkg_check_modules(LIBSECRET REQUIRED libsecret-1) if (LIBSECRET_FOUND) message(STATUS "βœ” LibSecret trovato: ${LIBSECRET_VERSION}") include_directories(${LIBSECRET_INCLUDE_DIRS}) link_directories(${LIBSECRET_LIBRARY_DIRS}) add_definitions(${LIBSECRET_CFLAGS_OTHER}) else() message(FATAL_ERROR "❌ LibSecret non trovato. Installa libsecret-1-dev (Debian/Ubuntu) o libsecret (Arch/Fedora).") endif() # ====================== # libidn2 (per IDNA/Punycode nelle URL phishing) # ====================== pkg_check_modules(IDN2 REQUIRED libidn2) include_directories(${IDN2_INCLUDE_DIRS}) link_directories(${IDN2_LIBRARY_DIRS}) # ====================== # SQLite3 (per gestione blacklist e database phishing) # ====================== pkg_check_modules(SQLITE3 REQUIRED sqlite3) include_directories(${SQLITE3_INCLUDE_DIRS}) link_directories(${SQLITE3_LIBRARY_DIRS}) if(SQLITE3_FOUND) message(STATUS "βœ” SQLite3 trovato: ${SQLITE3_LIBRARIES}") else() message(FATAL_ERROR "❌ SQLite3 non trovato. Installa libsqlite3-dev (Debian/Ubuntu) o sqlite (Arch/Fedora).") endif() # ======================================================= # libsmbclient (Samba Client Library) - ricerca universale # ======================================================= find_path(SMBCLIENT_INCLUDE_DIR libsmbclient.h PATHS /usr/include /usr/include/samba-4.0 /usr/local/include ) find_library(SMBCLIENT_LIBRARY smbclient PATHS /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 ) if (NOT SMBCLIENT_INCLUDE_DIR OR NOT SMBCLIENT_LIBRARY) message(FATAL_ERROR "❌ libsmbclient non trovato...") else() message(STATUS "βœ” libsmbclient trovato: ${SMBCLIENT_LIBRARY}") message(STATUS "βœ” include: ${SMBCLIENT_INCLUDE_DIR}") endif() set(SMBCLIENT_LIBRARIES ${SMBCLIENT_LIBRARY}) set(SMBCLIENT_INCLUDE_DIRS ${SMBCLIENT_INCLUDE_DIR}) include_directories(${SMBCLIENT_INCLUDE_DIRS}) # ====================== # nlohmann-json (header-only, via CMake config) # ====================== find_package(nlohmann_json 3.2.0 REQUIRED) # ====================== # CURL (per Google Safe Browsing API) # ====================== find_package(CURL REQUIRED) # ============================== # OpenSSL # ============================== find_package(OpenSSL REQUIRED) link_directories(/usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64) if (OpenSSL_FOUND) message(STATUS "OpenSSL trovato: ${OPENSSL_VERSION}") include_directories(${OPENSSL_INCLUDE_DIR}) else() message(FATAL_ERROR "OpenSSL non trovato. Installa libssl-dev") endif() # ====================== # systemd (sd-bus) β€” necessario su Debian/Ubuntu recenti (DSO missing) # ====================== pkg_check_modules(SYSTEMD QUIET libsystemd) if (SYSTEMD_FOUND) message(STATUS "βœ” libsystemd trovato: ${SYSTEMD_VERSION}") else() message(WARNING "⚠ libsystemd non trovato (libsystemd-dev). Alcune feature potrebbero non compilare.") endif() function(bg_link_systemd tgt) if (SYSTEMD_FOUND AND TARGET ${tgt}) target_include_directories(${tgt} PRIVATE ${SYSTEMD_INCLUDE_DIRS}) target_link_directories(${tgt} PRIVATE ${SYSTEMD_LIBRARY_DIRS}) target_link_libraries(${tgt} PRIVATE ${SYSTEMD_LIBRARIES}) target_compile_options(${tgt} PRIVATE ${SYSTEMD_CFLAGS_OTHER}) endif() endfunction() # ============================== # Boost (thread pool, asio, ecc.) # ============================== find_package(Boost REQUIRED COMPONENTS thread) include_directories(${Boost_INCLUDE_DIRS}) # ============================== # Hyperscan (opzionale, per regex ad alte prestazioni) # ============================== find_path(HYPERSCAN_INCLUDE_DIR NAMES hs/hs.h) find_library(HYPERSCAN_LIBRARY NAMES hs) find_library(HYPERSCAN_LIBRARY NAMES hs libhs hs.so.5 PATHS /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64) if (HYPERSCAN_INCLUDE_DIR AND HYPERSCAN_LIBRARY) message(STATUS "βœ” Hyperscan trovato: ${HYPERSCAN_LIBRARY}") include_directories(${HYPERSCAN_INCLUDE_DIR}) add_compile_definitions(HAVE_HYPERSCAN=1) else() message(WARNING "⚠ Hyperscan non trovato. VerrΓ  usato std::regex fallback (piΓΉ lento).") endif() include_directories( ${GTKMM_INCLUDE_DIRS} ${GIOMM_INCLUDE_DIRS} ${SIGC_INCLUDE_DIRS} ${YARA_INCLUDE_DIRS} ${SOUP_INCLUDE_DIRS} src src/filters ) link_directories( ${GTKMM_LIBRARY_DIRS} ${GIOMM_LIBRARY_DIRS} ${SIGC_LIBRARY_DIRS} ${YARA_LIBRARY_DIRS} ${SOUP_LIBRARY_DIRS} ) if(GTKMM_CFLAGS_OTHER) add_compile_options(${GTKMM_CFLAGS_OTHER}) endif() if(GIOMM_CFLAGS_OTHER) add_compile_options(${GIOMM_CFLAGS_OTHER}) endif() if(SIGC_CFLAGS_OTHER) add_compile_options(${SIGC_CFLAGS_OTHER}) endif() if(YARA_CFLAGS_OTHER) add_compile_options(${YARA_CFLAGS_OTHER}) endif() if(SOUP_CFLAGS_OTHER) add_compile_options(${SOUP_CFLAGS_OTHER}) endif() # ====================== # Libreria phishing_common (dnsmasq backend minimal) # ====================== set(PHISHING_COMMON_SOURCES src/phishing/local_warning_server.cpp src/phishing/WebProbe.cpp src/phishing/network_quality.cpp src/phishing/dns_cache.cpp ) add_library(phishing_common STATIC ${PHISHING_COMMON_SOURCES}) target_include_directories(phishing_common PUBLIC src src/phishing) target_link_libraries(phishing_common PUBLIC ${SOUP_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${IDN2_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto ) # ====================== # Identity Leak Module # ====================== set(IDENTITY_LEAK_SOURCES src/IdentityLeakPage/ui/IdentityLeakPage.cpp src/IdentityLeakPage/worker/LeakCheckWorker.cpp src/IdentityLeakPage/monitor/LeakMonitor.cpp src/IdentityLeakPage/core/LeakAggregator.cpp src/IdentityLeakPage/core/LeakNormalizer.cpp src/IdentityLeakPage/providers/HibpProvider.cpp src/IdentityLeakPage/providers/LeakCheckProvider.cpp src/IdentityLeakPage/providers/HibpPasswordProvider.cpp src/IdentityLeakPage/net/HttpClient.cpp src/IdentityLeakPage/storage/LeakDatabase.cpp src/IdentityLeakPage/utils/HashUtil.cpp src/IdentityLeakPage/utils/IdentityLeakConfig.cpp src/IdentityLeakPage/utils/TimeUtil.cpp ) add_library(identity_leak STATIC ${IDENTITY_LEAK_SOURCES}) target_include_directories(identity_leak PUBLIC src src/IdentityLeakPage ) target_link_libraries(identity_leak PUBLIC ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} CURL::libcurl OpenSSL::SSL OpenSSL::Crypto ${SQLITE3_LIBRARIES} nlohmann_json::nlohmann_json ) # ====================== # Password Manager Module # ====================== set(PASSWORD_MANAGER_SOURCES src/password_manager/PasswordEntry.cpp src/password_manager/PasswordVault.cpp src/password_manager/PasswordGenerator.cpp src/password_manager/PasswordDialogs.cpp src/password_manager/PasswordSearchRow.cpp src/password_manager/PasswordManagerPage.cpp src/password_manager/PasswordImporter.cpp src/password_manager/PasswordImportDialog.cpp src/password_manager/PasswordVaultView.cpp ) add_library(password_manager STATIC ${PASSWORD_MANAGER_SOURCES}) target_include_directories(password_manager PUBLIC src src/password_manager ) target_link_libraries(password_manager PUBLIC ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${LIBSECRET_LIBRARIES} nlohmann_json::nlohmann_json ) # ====================== # RE2 (opzionale, per regex sicure e veloci) # ====================== find_library(RE2_LIBRARY NAMES re2 libre2 PATHS /usr/lib /usr/lib64 /usr/local/lib) if (RE2_LIBRARY) message(STATUS "βœ” RE2 trovato: ${RE2_LIBRARY}") target_link_libraries(phishing_common PRIVATE ${RE2_LIBRARY}) else() message(WARNING "⚠ RE2 non trovato. Uso std::regex fallback.") endif() # === Integrazione Boost per phishing_common === target_link_libraries(phishing_common PRIVATE re2 Boost::thread ) target_compile_definitions(phishing_common PUBLIC "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) # ============================ # Firewall Management Module # ============================ set(FIREWALL_SOURCES src/firewall/FirewallChoiceDialog.cpp src/firewall/FirewallDetector.cpp src/firewall/FirewallInstaller.cpp src/firewall/FirewallRuleManager.cpp src/firewall/BlacklistIpExtractor.cpp ) add_library(firewall STATIC ${FIREWALL_SOURCES}) target_include_directories(firewall PUBLIC src/firewall) target_link_libraries(firewall PUBLIC ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ) # ---------------------- # GUI principale (BastionGuard) # ---------------------- set(BastionGuard_SOURCES src/main.cpp src/MainWindow.cpp src/TrayIcon.cpp src/Backend.cpp src/DashboardPage.cpp src/ScanPage.cpp src/LogPage.cpp src/SettingsPage.cpp src/AboutPage.cpp src/QuarantinePage.cpp src/Quarantine.cpp src/ClamdConfig.cpp src/UpdatePage.cpp src/DonatePage.cpp src/StyleProvider.cpp src/AntiRansomEngine.cpp src/AntiPhishingEngine.cpp src/BankPage.cpp src/wizard/wizard_window.cpp src/wizard/wizard_setup.cpp src/SecureBrowser.cpp src/PrivacyPage.cpp src/AurScan.cpp src/SettingsWindow.cpp src/AntiRansomwarePage.cpp src/SambaPage.cpp src/SaneSecurityUpdater.cpp src/SettingsStore.cpp src/first_run/first-run-services-window.cpp src/pac/PacManager.cpp src/cloud/MalwareBazaar.cpp src/usb/USBScanPage.cpp src/usb/ScanPromptWindow.cpp src/usb/LiveScanDialog.cpp src/phishing_search/PhishingPage.cpp src/phishing_search/PhishingCheckCard.cpp src/vpn/VpnPage.cpp src/vpn/WireguardBackend.cpp src/password_manager/PasswordManagerPage.cpp src/backup/BackupPage.cpp src/Utils.cpp ) # === Eseguibile principale === add_executable(BastionGuard ${BastionGuard_SOURCES}) target_include_directories(BastionGuard PRIVATE src src/firewall ) target_compile_definitions(BastionGuard PRIVATE BASTIONGUARD_VERSION="2.0" BASTIONGUARD_BUILD=20260411 ) target_link_libraries(BastionGuard PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${YARA_LIBRARIES} ${SOUP_LIBRARIES} ${LIBSECRET_LIBRARIES} ${UDEV_LIBRARIES} ${SMBCLIENT_LIBRARIES} phishing_common firewall identity_leak password_manager CURL::libcurl OpenSSL::SSL OpenSSL::Crypto ${SYSTEMD_LIBRARIES} ) target_link_options(BastionGuard PRIVATE -lsystemd) bg_set_rpath(BastionGuard) bg_link_systemd(BastionGuard) # ============================================================ # Blink / CEF Integration (SecureBrowser) # ============================================================ set(CEF_ROOT "${CMAKE_SOURCE_DIR}/thirdparty/cef") set(CEF_RELEASE_DIR "${CEF_ROOT}/Release") set(CEF_LIB "${CEF_RELEASE_DIR}/libcef.so") # Tentativi di percorso possibili per il wrapper set(CEF_WRAPPER_A "${CEF_ROOT}/build/libcef_dll_wrapper.a") set(CEF_WRAPPER_B "${CEF_ROOT}/build/libcef_dll_wrapper/libcef_dll_wrapper.a") # ============================================================ # πŸ”Ή Download automatico CEF se mancante # ============================================================ set(CEF_URL "https://cef-builds.spotifycdn.com/cef_binary_141.0.7%2Bga5714cc%2Bchromium-141.0.7390.108_linux64_minimal.tar.bz2") set(CEF_ARCHIVE "${CMAKE_SOURCE_DIR}/thirdparty/cef_download.tar.bz2") if (NOT EXISTS ${CEF_LIB}) message(WARNING "⚠️ libcef.so non trovato in ${CEF_RELEASE_DIR}") message(STATUS "⬇️ Download automatico CEF da: ${CEF_URL}") # Crea cartella thirdparty/cef file(MAKE_DIRECTORY ${CEF_ROOT}) # Scarica il pacchetto file(DOWNLOAD ${CEF_URL} ${CEF_ARCHIVE} SHOW_PROGRESS STATUS cef_status ) list(GET cef_status 0 cef_status_code) if (NOT cef_status_code EQUAL 0) message(FATAL_ERROR "❌ Errore nel download di CEF (${CEF_URL})") endif() # Estrai archivio message(STATUS "πŸ“¦ Estrazione archivio CEF...") execute_process( COMMAND ${CMAKE_COMMAND} -E tar xjf ${CEF_ARCHIVE} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/thirdparty RESULT_VARIABLE cef_extract_result ) if (NOT cef_extract_result EQUAL 0) message(FATAL_ERROR "❌ Errore durante l'estrazione del pacchetto CEF") endif() # Rinomina la cartella estratta (contiene spesso un nome lungo) file(GLOB cef_subdirs "${CMAKE_SOURCE_DIR}/thirdparty/cef_binary_*") list(LENGTH cef_subdirs cef_count) if (cef_count GREATER 0) list(GET cef_subdirs 0 cef_extracted_dir) message(STATUS "πŸ“‚ CEF estratto in: ${cef_extracted_dir}") file(RENAME "${cef_extracted_dir}" "${CEF_ROOT}") endif() # Verifica dopo estrazione if (NOT EXISTS ${CEF_LIB}) message(FATAL_ERROR "❌ libcef.so ancora non trovato dopo estrazione in ${CEF_RELEASE_DIR}") endif() message(STATUS "βœ” CEF scaricato e preparato con successo in ${CEF_ROOT}") else() message(STATUS "βœ” CEF trovato: ${CEF_LIB}") endif() # ============================================================ # Build automatica del wrapper se necessario # ============================================================ if (NOT (EXISTS ${CEF_WRAPPER_A} OR EXISTS ${CEF_WRAPPER_B})) message(STATUS "🧩 Compilo automaticamente libcef_dll_wrapper.a (wrapper CEF)...") execute_process( COMMAND cmake -B build -S . WORKING_DIRECTORY ${CEF_ROOT} RESULT_VARIABLE CEF_CONFIGURE_RESULT ) if (NOT CEF_CONFIGURE_RESULT EQUAL 0) message(FATAL_ERROR "❌ Errore durante la configurazione CMake di libcef_dll_wrapper") endif() execute_process( COMMAND cmake --build build --config Release WORKING_DIRECTORY ${CEF_ROOT} RESULT_VARIABLE CEF_BUILD_RESULT ) if (NOT CEF_BUILD_RESULT EQUAL 0) message(FATAL_ERROR "❌ Errore durante la compilazione di libcef_dll_wrapper.a") endif() endif() # ============================================================ # Conferma finale e selezione wrapper corretto # ============================================================ if (EXISTS ${CEF_WRAPPER_A}) set(CEF_WRAPPER ${CEF_WRAPPER_A}) elseif (EXISTS ${CEF_WRAPPER_B}) set(CEF_WRAPPER ${CEF_WRAPPER_B}) else() message(FATAL_ERROR "❌ libcef_dll_wrapper.a non trovato dopo la build.") endif() message(STATUS "βœ” Wrapper statico CEF trovato: ${CEF_WRAPPER}") # ------------------------------------------------------------ # SecureBrowser is already part of BastionGuard_SOURCES above and remains # unconditional even when ENABLE_CEF=OFF. # ------------------------------------------------------------ include_directories(${CEF_ROOT} ${CEF_ROOT}/include) target_link_libraries(BastionGuard PRIVATE ${CEF_LIB} ${CEF_WRAPPER} pthread dl ) # Su alcune distro serve anche pthread e dl find_package(Threads REQUIRED) target_link_libraries(BastionGuard PRIVATE pthread dl) # ============================================================ # βœ… INSTALLAZIONE COMPLETA DEL RUNTIME CEF (compatibile con build senza cef_helper) # ============================================================ set(CEF_INSTALL_DIR "${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/cef") # Installa librerie principali install(FILES ${CEF_RELEASE_DIR}/libcef.so ${CEF_RELEASE_DIR}/libEGL.so ${CEF_RELEASE_DIR}/libGLESv2.so ${CEF_RELEASE_DIR}/libvk_swiftshader.so ${CEF_RELEASE_DIR}/libvulkan.so.1 DESTINATION ${CEF_INSTALL_DIR} ) # Installa sandbox (chrome-sandbox) install(FILES ${CEF_RELEASE_DIR}/chrome-sandbox DESTINATION ${CEF_INSTALL_DIR} PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ ) # Installa tutte le risorse necessarie (pak, dat, bin, locales) install(DIRECTORY ${CEF_ROOT}/Resources/ DESTINATION ${CEF_INSTALL_DIR} FILES_MATCHING PATTERN "*.pak" PATTERN "*.bin" PATTERN "*.dat" PATTERN "locales" ) # Installa eventuali snapshot e config install(FILES ${CEF_RELEASE_DIR}/v8_context_snapshot.bin ${CEF_RELEASE_DIR}/vk_swiftshader_icd.json DESTINATION ${CEF_INSTALL_DIR} OPTIONAL ) # Post-install: imposta permessi sandbox bg_install_code( " message(STATUS \"[CEF] Imposto permessi per chrome-sandbox...\") execute_process(COMMAND chmod 4755 ${CMAKE_INSTALL_FULL_DATAROOTDIR}/BastionGuard/cef/chrome-sandbox) ") # ============================================================ # Optional Polkit integration # ============================================================ find_package(PkgConfig REQUIRED) pkg_check_modules(POLKIT_GOBJECT QUIET polkit-gobject-1) if (POLKIT_GOBJECT_FOUND) message(STATUS "βœ” Found Polkit: ${POLKIT_GOBJECT_VERSION}") include_directories(${POLKIT_GOBJECT_INCLUDE_DIRS}) target_link_libraries(BastionGuard PRIVATE ${POLKIT_GOBJECT_LIBRARIES}) target_compile_definitions(BastionGuard PRIVATE HAVE_POLKIT=1) else() message(WARNING "⚠ Polkit not found, using pkexec fallback only") target_compile_definitions(BastionGuard PRIVATE HAVE_POLKIT=0) endif() target_compile_definitions(BastionGuard PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) install(TARGETS BastionGuard RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # =============================== # Eseguibile per gli alert ransomware # =============================== set(RANSW_ALERT_SOURCES src/alert/BastionGuard-ransomware-alert.cpp src/Backend.cpp src/AntiRansomEngine.cpp src/AntiPhishingEngine.cpp src/Quarantine.cpp src/Utils.cpp ) add_executable(BastionGuard-ransomware-alert ${RANSW_ALERT_SOURCES}) target_include_directories(BastionGuard-ransomware-alert PRIVATE src) target_link_libraries(BastionGuard-ransomware-alert PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${YARA_LIBRARIES} ${SOUP_LIBRARIES} ${SMBCLIENT_LIBRARIES} CURL::libcurl OpenSSL::SSL OpenSSL::Crypto phishing_common firewall ) bg_set_rpath(BastionGuard-ransomware-alert) target_compile_definitions(BastionGuard-ransomware-alert PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) install(TARGETS BastionGuard-ransomware-alert RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ================================ # Alert realtime (SOCKET UNIX) # BastionGuard-ransomware-realtime-alert # ================================ set(RANSW_REALTIME_ALERT_SOURCES src/alert/BastionGuard-ransomware-realtime-alert.cpp src/alert/AlertWindowRealtime.cpp src/Backend.cpp src/AntiRansomEngine.cpp src/AntiPhishingEngine.cpp src/Quarantine.cpp src/Utils.cpp ) add_executable(BastionGuard-ransomware-realtime-alert ${RANSW_REALTIME_ALERT_SOURCES}) target_include_directories(BastionGuard-ransomware-realtime-alert PRIVATE src) target_link_libraries(BastionGuard-ransomware-realtime-alert PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${SOUP_LIBRARIES} ${YARA_LIBRARIES} ${SMBCLIENT_LIBRARIES} CURL::libcurl OpenSSL::SSL OpenSSL::Crypto phishing_common pthread firewall ) bg_set_rpath(BastionGuard-ransomware-realtime-alert) target_compile_definitions(BastionGuard-ransomware-realtime-alert PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) # Installazione binario install(TARGETS BastionGuard-ransomware-realtime-alert RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ====================== # Demone Anti-Phishing # ====================== # ====================== # BastionGuard DNS Daemon (dnsmasq backend) # ====================== set(BastionGuard_DAEMON_SOURCES src/phishing/BastionGuard-daemon.cpp src/phishing/local_warning_server.cpp src/phishing/dns_cache.cpp ) add_executable(BastionGuard-daemon ${BastionGuard_DAEMON_SOURCES}) target_include_directories(BastionGuard-daemon PRIVATE src src/phishing) target_link_libraries(BastionGuard-daemon PRIVATE ${SOUP_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${GTKMM_LIBRARIES} Threads::Threads dl ) bg_set_rpath(BastionGuard-daemon) target_compile_definitions(BastionGuard-daemon PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) install(TARGETS BastionGuard-daemon RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ====================== # Archive inspection support # ====================== set(BG_ARCHIVE_CORE_SOURCES src/security/archive/ArchiveSandbox.cpp src/security/archive/ArchiveInspector.cpp ) set(BG_ARCHIVE_HELPER_SOURCES src/helpers/archive_worker.cpp ) add_executable(archive_worker ${BG_ARCHIVE_HELPER_SOURCES} ) target_include_directories(archive_worker PRIVATE src ) target_compile_definitions(archive_worker PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) # opzionale ma utile bg_set_rpath(archive_worker) install(TARGETS archive_worker RUNTIME DESTINATION /usr/libexec/bastionguard ) # ====================== # Demone Anti-Ransomware # ====================== add_executable(BastionGuard-ransomware-scanner src/scanner-ransomware/BastionGuard-ransomware-scanner.cpp ${BG_ARCHIVE_CORE_SOURCES} ) target_link_libraries(BastionGuard-ransomware-scanner PRIVATE ${YARA_LIBRARIES} ${SIGC_LIBRARIES} ${GIOMM_LIBRARIES} ${GTKMM_LIBRARIES} phishing_common OpenSSL::SSL OpenSSL::Crypto Threads::Threads nlohmann_json::nlohmann_json ) bg_set_rpath(BastionGuard-ransomware-scanner) target_compile_definitions(BastionGuard-ransomware-scanner PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) install(TARGETS BastionGuard-ransomware-scanner RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ====================== # Demone Anti-Ransomware Realtime (fanotify) # ====================== add_executable(BastionGuard-ransomware-realtime src/scanner-ransomware/BastionGuard-ransomware-realtime.cpp ${BG_ARCHIVE_CORE_SOURCES} ) target_include_directories(BastionGuard-ransomware-realtime PRIVATE src) target_link_libraries(BastionGuard-ransomware-realtime PRIVATE ${YARA_LIBRARIES} ${SIGC_LIBRARIES} ${GIOMM_LIBRARIES} ${GTKMM_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto phishing_common pthread ) bg_set_rpath(BastionGuard-ransomware-realtime) target_compile_definitions(BastionGuard-ransomware-realtime PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) install(TARGETS BastionGuard-ransomware-realtime RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ====================== # Native Messaging Host # ====================== add_executable(BastionGuard-native-host src/native_host/native_host.cpp src/wizard/wizard_setup.cpp ) target_include_directories(BastionGuard-native-host PRIVATE src) target_link_libraries(BastionGuard-native-host PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${YARA_LIBRARIES} ${SOUP_LIBRARIES} nlohmann_json::nlohmann_json ) bg_set_rpath(BastionGuard-native-host) target_compile_definitions(BastionGuard-native-host PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) install(TARGETS BastionGuard-native-host RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ====================== # Setup Wizard # ====================== set(WIZARD_SOURCES src/wizard/wizard_window.cpp src/wizard/wizard_setup.cpp src/wizard/main.cpp src/wizard/StyleProvider.cpp src/Utils.cpp ) add_executable(BastionGuard-wizard ${WIZARD_SOURCES}) target_include_directories(BastionGuard-wizard PRIVATE src) target_link_libraries(BastionGuard-wizard PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${SOUP_LIBRARIES} phishing_common ) bg_set_rpath(BastionGuard-wizard) target_compile_definitions(BastionGuard-wizard PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) install(TARGETS BastionGuard-wizard RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ============================== # First Run Services standalone # ============================== add_executable(BastionGuard-first-run src/first_run/first-run-main.cpp src/first_run/first-run-services-window.cpp src/StyleProvider.cpp ) target_compile_definitions(BastionGuard-first-run PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) target_include_directories(BastionGuard-first-run PRIVATE src src/first_run ) target_link_libraries(BastionGuard-first-run PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ) bg_set_rpath(BastionGuard-first-run) install(TARGETS BastionGuard-first-run RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ====================== # Helper privilegiato β€” bastionguard-privhelper # ====================== set(PRIVHELPER_SOURCES src/privhelper/bastionguard_privhelper.cpp ) add_executable(bastionguard-privhelper ${PRIVHELPER_SOURCES}) target_link_libraries(bastionguard-privhelper PRIVATE ${UDEV_LIBRARIES} pthread) install(TARGETS bastionguard-privhelper RUNTIME DESTINATION /usr/bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) bg_install_code( " message(STATUS \"[privhelper] Imposto owner root e setuid su bastionguard-privhelper\") execute_process( COMMAND chown root:root /usr/bin/bastionguard-privhelper RESULT_VARIABLE CHOWN_RES ) if(NOT CHOWN_RES EQUAL 0) message(FATAL_ERROR \"[privhelper] chown root fallito\") endif() execute_process( COMMAND chmod 4755 /usr/bin/bastionguard-privhelper RESULT_VARIABLE CHMOD_RES ) if(NOT CHMOD_RES EQUAL 0) message(FATAL_ERROR \"[privhelper] chmod 4755 fallito\") endif() message(STATUS \"[privhelper] βœ” bastionguard-privhelper installato come setuid root\") ") # ====================== # Helper privilegiato β€” bastionguard-firewall # ====================== set(FIREWALL_HELPER_SOURCES src/privhelper/bastionguard-firewall.cpp ) add_executable(bastionguard-firewall ${FIREWALL_HELPER_SOURCES}) # Nessuna dipendenza GTK / Backend target_link_libraries(bastionguard-firewall PRIVATE pthread) install(TARGETS bastionguard-firewall RUNTIME DESTINATION /usr/bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) bg_install_code( " message(STATUS \"[firewall-helper] Imposto owner root e setuid su bastionguard-firewall\") execute_process( COMMAND chown root:root /usr/bin/bastionguard-firewall RESULT_VARIABLE CHOWN_RES ) if(NOT CHOWN_RES EQUAL 0) message(FATAL_ERROR \"[firewall-helper] chown root fallito\") endif() execute_process( COMMAND chmod 4755 /usr/bin/bastionguard-firewall RESULT_VARIABLE CHMOD_RES ) if(NOT CHMOD_RES EQUAL 0) message(FATAL_ERROR \"[firewall-helper] chmod 4755 fallito\") endif() message(STATUS \"[firewall-helper] βœ” bastionguard-firewall installato come setuid root\") ") # ====================== # Demone Privacy (Webcam + Microfono) # ====================== set(PRIVACYD_SOURCES src/BastionGuard-privacyd.cpp ) add_executable(BastionGuard-privacyd ${PRIVACYD_SOURCES}) target_include_directories(BastionGuard-privacyd PRIVATE src) target_link_libraries(BastionGuard-privacyd PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ) bg_set_rpath(BastionGuard-privacyd) target_compile_definitions(BastionGuard-privacyd PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) # === Installa l’eseguibile === install(TARGETS BastionGuard-privacyd RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ====================== # Demone USB (BastionGuard-usbd) # ====================== # Trova libsystemd find_package(PkgConfig REQUIRED) pkg_check_modules(SYSTEMD REQUIRED libsystemd) set(USBD_SOURCES src/usb/BastionGuard-usbd.cpp src/usb/LiveScanDialog.cpp ) add_executable(BastionGuard-usbd ${USBD_SOURCES}) target_include_directories(BastionGuard-usbd PRIVATE src src/usb ${SYSTEMD_INCLUDE_DIRS} ) target_link_libraries(BastionGuard-usbd PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${UDEV_LIBRARIES} ${SYSTEMD_LIBRARIES} # <── FIX CRITICO ) bg_set_rpath(BastionGuard-usbd) target_compile_definitions(BastionGuard-usbd PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) install(TARGETS BastionGuard-usbd RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ====================== # BankOpener (wrapper sandbox sicuro) # ====================== add_executable(BastionGuard-bankopener src/xdg-open.cpp src/xdg-main.cpp src/SecureBrowser.cpp src/SettingsStore.cpp src/phishing/local_warning_server.cpp ) target_include_directories(BastionGuard-bankopener PRIVATE src) target_link_libraries(BastionGuard-bankopener PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${SOUP_LIBRARIES} nlohmann_json::nlohmann_json ${CEF_LIB} ${CEF_WRAPPER} pthread dl ) bg_set_rpath(BastionGuard-bankopener) # Imposta il percorso runtime per libcef.so set_target_properties(BastionGuard-bankopener PROPERTIES BUILD_RPATH "${CMAKE_SOURCE_DIR}/thirdparty/cef/Release" INSTALL_RPATH "/usr/share/BastionGuard/cef" ) install(TARGETS BastionGuard-bankopener RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ====================== # Bank gui desktop # ====================== add_executable(BastionGuard-bankgui src/bankgui-main.cpp src/StyleProvider.cpp ) target_compile_definitions(BastionGuard-bankgui PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) target_include_directories(BastionGuard-bankgui PRIVATE src) target_link_libraries(BastionGuard-bankgui PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ) bg_set_rpath(BastionGuard-bankgui) install(TARGETS BastionGuard-bankgui RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ====================== # Pagamenti sicuri # ====================== find_package(Boost REQUIRED) add_executable(bastionguard-pacd src/pac/BastionGuard-pac.cpp ) target_link_libraries(bastionguard-pacd PRIVATE Boost::boost) target_compile_features(bastionguard-pacd PRIVATE cxx_std_17) install(TARGETS bastionguard-pacd RUNTIME DESTINATION bin) if(ENABLE_CEF_DAEMON) # ====================== # BastionGuard CEF Proxy (bastionguard-cef) # ====================== find_package(Threads REQUIRED) find_package(Boost REQUIRED) # Boost headers target portability (1.89+) if(TARGET Boost::headers) set(BG_BOOST_HEADERS Boost::headers) elseif(TARGET Boost::boost) set(BG_BOOST_HEADERS Boost::boost) else() message(FATAL_ERROR "Boost headers target not found (Boost::headers/Boost::boost).") endif() # libsoup + glib/gobject/gio for local_warning_server.cpp symbols pkg_check_modules(GLIB REQUIRED glib-2.0 gobject-2.0 gio-2.0) add_executable(bastionguard-cef src/cef/bastionguard_cef.cpp src/SecureBrowser.cpp src/SettingsStore.cpp src/phishing/local_warning_server.cpp ) target_include_directories(bastionguard-cef PRIVATE src ${CEF_ROOT} ${CEF_ROOT}/include ${GLIB_INCLUDE_DIRS} ${SOUP_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS} ${GIOMM_INCLUDE_DIRS} ${SIGC_INCLUDE_DIRS} ) target_compile_options(bastionguard-cef PRIVATE ${GLIB_CFLAGS_OTHER} ${SOUP_CFLAGS_OTHER} ) # Asio without boost_system (Boost 1.89+) target_compile_definitions(bastionguard-cef PRIVATE BOOST_ASIO_DISABLE_BOOST_SYSTEM BOOST_ASIO_USE_STD_SYSTEM_ERROR ) target_link_libraries(bastionguard-cef PRIVATE ${BG_BOOST_HEADERS} Threads::Threads OpenSSL::SSL OpenSSL::Crypto ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${SOUP_LIBRARIES} ${GLIB_LIBRARIES} ${CEF_LIB} ${CEF_WRAPPER} dl pthread ) bg_set_rpath(bastionguard-cef) install(TARGETS bastionguard-cef RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() # ====================== # BastionGuard Secure Payments # - BastionGuard-secure (CLI opener) # - BastionGuard-secure-gui (GUI selector) # src/payment_secure/* # ====================== # ---- CLI opener ---- add_executable(BastionGuard-secure src/payment_secure/BastionGuard-secure-cli.cpp src/payment_secure/BastionGuard-secure.cpp src/payment_secure/dns_secure.cpp src/SecureBrowser.cpp src/SettingsStore.cpp src/phishing/local_warning_server.cpp ) target_compile_definitions(BastionGuard-secure PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) target_include_directories(BastionGuard-secure PRIVATE src src/payment_secure ${CEF_ROOT} ${CEF_ROOT}/include ${GLIBMM_INCLUDE_DIRS} ${GLIB_INCLUDE_DIRS} ${SOUP_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS} ${GIOMM_INCLUDE_DIRS} ${SIGC_INCLUDE_DIRS} ) target_compile_options(BastionGuard-secure PRIVATE ${GLIBMM_CFLAGS_OTHER} ${GLIB_CFLAGS_OTHER} ${SOUP_CFLAGS_OTHER} ) target_link_libraries(BastionGuard-secure PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ${SOUP_LIBRARIES} ${GLIBMM_LIBRARIES} ${GLIB_LIBRARIES} nlohmann_json::nlohmann_json ${CEF_LIB} ${CEF_WRAPPER} OpenSSL::SSL OpenSSL::Crypto Threads::Threads dl pthread ) bg_set_rpath(BastionGuard-secure) set_target_properties(BastionGuard-secure PROPERTIES INSTALL_RPATH "/usr/share/BastionGuard/lib;/usr/share/BastionGuard/cef" BUILD_RPATH "/usr/share/BastionGuard/lib;/usr/share/BastionGuard/cef" ) install(TARGETS BastionGuard-secure RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ---- GUI selector ---- add_executable(BastionGuard-secure-gui src/payment_secure/BastionGuard-secure-main.cpp src/payment_secure/dns_secure.cpp src/StyleProvider.cpp ) target_compile_definitions(BastionGuard-secure-gui PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) target_include_directories(BastionGuard-secure-gui PRIVATE src src/payment_secure ${GTKMM_INCLUDE_DIRS} ${GIOMM_INCLUDE_DIRS} ${SIGC_INCLUDE_DIRS} ) target_link_libraries(BastionGuard-secure-gui PRIVATE ${GTKMM_LIBRARIES} ${GIOMM_LIBRARIES} ${SIGC_LIBRARIES} ) bg_set_rpath(BastionGuard-secure-gui) set_target_properties(BastionGuard-secure-gui PROPERTIES INSTALL_RPATH "/usr/share/BastionGuard/lib" BUILD_RPATH "/usr/share/BastionGuard/lib" ) install(TARGETS BastionGuard-secure-gui RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # ====================== # BastionGuard-mailproxy β€” proxy SMTP utente # Gira come systemctl --user, senza privilegi root # ====================== add_executable(BastionGuard-mailproxy src/mail/BastionGuard-mailproxy.cpp ) target_include_directories(BastionGuard-mailproxy PRIVATE src) target_link_libraries(BastionGuard-mailproxy PRIVATE CURL::libcurl OpenSSL::SSL OpenSSL::Crypto nlohmann_json::nlohmann_json pthread ) target_compile_definitions(BastionGuard-mailproxy PRIVATE "DATA_DIR=\"${INSTALL_DATA_DIR}\"" "LOCALEDIR=\"${INSTALL_LOCALE_DIR}\"" ) bg_set_rpath(BastionGuard-mailproxy) install(TARGETS BastionGuard-mailproxy RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) # Installa il service file systemd --user install(FILES data/service/BastionGuard-mailproxy.service DESTINATION /usr/lib/systemd/user ) # ============================================================ # BastionGuard WebUI # ============================================================ set(BG_WEBUI_SOURCE_DIR "${CMAKE_SOURCE_DIR}/webui") set(BG_WEBUI_BUILD_DIR "${CMAKE_BINARY_DIR}/webui") set(BG_WEBUI_STAMP "${BG_WEBUI_BUILD_DIR}/.webui-staged") if(EXISTS "${BG_WEBUI_SOURCE_DIR}/index.php") add_custom_command( OUTPUT "${BG_WEBUI_STAMP}" COMMAND ${CMAKE_COMMAND} -E rm -rf "${BG_WEBUI_BUILD_DIR}" COMMAND ${CMAKE_COMMAND} -E make_directory "${BG_WEBUI_BUILD_DIR}" COMMAND ${CMAKE_COMMAND} -E copy_directory "${BG_WEBUI_SOURCE_DIR}" "${BG_WEBUI_BUILD_DIR}" COMMAND ${CMAKE_COMMAND} -E touch "${BG_WEBUI_STAMP}" DEPENDS "${BG_WEBUI_SOURCE_DIR}/index.php" COMMENT "Staging BastionGuard WebUI into the build directory" VERBATIM ) add_custom_target(BastionGuard-webui ALL DEPENDS "${BG_WEBUI_STAMP}" ) install(DIRECTORY "${BG_WEBUI_BUILD_DIR}/" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/webui" USE_SOURCE_PERMISSIONS COMPONENT webui PATTERN ".git" EXCLUDE PATTERN "*.bak" EXCLUDE PATTERN "*.tmp" EXCLUDE PATTERN ".webui-staged" EXCLUDE ) install(DIRECTORY "${CMAKE_SOURCE_DIR}/data/vhosts/webui/" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/data/vhosts/webui" USE_SOURCE_PERMISSIONS COMPONENT webui OPTIONAL ) install(CODE " message(STATUS \"[WebUI] Installed in: ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/webui\") file(MAKE_DIRECTORY \$ENV{DESTDIR}/var/lib/bastionguard-webui) file(MAKE_DIRECTORY \$ENV{DESTDIR}/var/lib/bastionguard-webui/cache) file(MAKE_DIRECTORY \$ENV{DESTDIR}/var/lib/bastionguard-webui/quarantine) file(MAKE_DIRECTORY \$ENV{DESTDIR}/var/lib/bastionguard-webui/sessions) file(MAKE_DIRECTORY \$ENV{DESTDIR}/var/lib/bastionguard-webui/tmp) file(MAKE_DIRECTORY \$ENV{DESTDIR}/var/log/bastionguard-webui) ") else() message(WARNING "BastionGuard WebUI source not found at ${BG_WEBUI_SOURCE_DIR}; WebUI will not be installed.") endif() # ====================== # BastionGuard Backup (fork di Timeshift, build via Meson) # ====================== option(ENABLE_BASTIONGUARD_BACKUP "Build bastionguard-backup (Timeshift fork)" ON) if(ENABLE_BASTIONGUARD_BACKUP) include(ExternalProject) find_program(MESON_EXECUTABLE meson REQUIRED) find_program(NINJA_EXECUTABLE ninja REQUIRED) find_program(VALAC_EXECUTABLE valac REQUIRED) find_program(PKG_CONFIG_EXECUTABLE pkg-config REQUIRED) # Dipendenze runtime/build del fork pkg_check_modules(BG_BACKUP_GTK3 REQUIRED gtk+-3.0) pkg_check_modules(BG_BACKUP_GIO REQUIRED gio-2.0 gio-unix-2.0) pkg_check_modules(BG_BACKUP_JSON REQUIRED json-glib-1.0) pkg_check_modules(BG_BACKUP_VTE REQUIRED vte-2.91) pkg_check_modules(BG_BACKUP_GEE REQUIRED gee-0.8) set(BG_BACKUP_SOURCE_DIR "${CMAKE_SOURCE_DIR}/thirdparty/bastionguard-backup") set(BG_BACKUP_BINARY_DIR "${CMAKE_BINARY_DIR}/bastionguard-backup-build") set(BG_BACKUP_INSTALL_DIR "${CMAKE_BINARY_DIR}/bastionguard-backup-install") message(STATUS "[BG-Backup] Source dir : ${BG_BACKUP_SOURCE_DIR}") message(STATUS "[BG-Backup] Build dir : ${BG_BACKUP_BINARY_DIR}") message(STATUS "[BG-Backup] Stage dir : ${BG_BACKUP_INSTALL_DIR}") message(STATUS "[BG-Backup] Final prefix: ${CMAKE_INSTALL_PREFIX}") ExternalProject_Add(bastionguard_backup_ext SOURCE_DIR "${BG_BACKUP_SOURCE_DIR}" BINARY_DIR "${BG_BACKUP_BINARY_DIR}" CONFIGURE_COMMAND ${MESON_EXECUTABLE} setup "${BG_BACKUP_BINARY_DIR}" "${BG_BACKUP_SOURCE_DIR}" --prefix=/usr --buildtype=release --reconfigure BUILD_COMMAND ${MESON_EXECUTABLE} compile -C "${BG_BACKUP_BINARY_DIR}" INSTALL_COMMAND ${MESON_EXECUTABLE} install -C "${BG_BACKUP_BINARY_DIR}" --destdir "${BG_BACKUP_INSTALL_DIR}" BUILD_ALWAYS 1 USES_TERMINAL_CONFIGURE 1 USES_TERMINAL_BUILD 1 USES_TERMINAL_INSTALL 1 LOG_CONFIGURE OFF LOG_BUILD OFF LOG_INSTALL OFF ) add_custom_target(BastionGuard-backup ALL DEPENDS bastionguard_backup_ext ) install(CODE " set(BG_BACKUP_DESTDIR \"\$ENV{DESTDIR}\") message(STATUS \"[BG-Backup] =====================================\") message(STATUS \"[BG-Backup] Installazione bastionguard-backup\") message(STATUS \"[BG-Backup] Stage dir Meson : ${BG_BACKUP_INSTALL_DIR}\") message(STATUS \"[BG-Backup] Prefix finale : ${CMAKE_INSTALL_PREFIX}\") message(STATUS \"[BG-Backup] DESTDIR : \${BG_BACKUP_DESTDIR}\") message(STATUS \"[BG-Backup]\") set(BG_BACKUP_STAGE_BIN \"${BG_BACKUP_INSTALL_DIR}/usr/bin\") set(BG_BACKUP_STAGE_SHARE \"${BG_BACKUP_INSTALL_DIR}/usr/share\") set(BG_BACKUP_STAGE_ETC \"${BG_BACKUP_INSTALL_DIR}/etc\") set(BG_BACKUP_DEST_BIN \"\${BG_BACKUP_DESTDIR}${CMAKE_INSTALL_PREFIX}/bin\") set(BG_BACKUP_DEST_SHARE \"\${BG_BACKUP_DESTDIR}${CMAKE_INSTALL_PREFIX}/share\") set(BG_BACKUP_DEST_ETC \"\${BG_BACKUP_DESTDIR}/etc\") message(STATUS \"[BG-Backup] Copia binari : \${BG_BACKUP_STAGE_BIN} -> \${BG_BACKUP_DEST_BIN}\") if(EXISTS \"\${BG_BACKUP_STAGE_BIN}\") file(MAKE_DIRECTORY \"\${BG_BACKUP_DEST_BIN}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_BACKUP_STAGE_BIN}\" \"\${BG_BACKUP_DEST_BIN}\" RESULT_VARIABLE BG_BACKUP_BIN_RES ) if(NOT BG_BACKUP_BIN_RES EQUAL 0) message(FATAL_ERROR \"[BG-Backup] Errore copiando i binari in \${BG_BACKUP_DEST_BIN}\") endif() else() message(WARNING \"[BG-Backup] Directory bin non trovata: \${BG_BACKUP_STAGE_BIN}\") endif() message(STATUS \"[BG-Backup] Copia share : \${BG_BACKUP_STAGE_SHARE} -> \${BG_BACKUP_DEST_SHARE}\") if(EXISTS \"\${BG_BACKUP_STAGE_SHARE}\") file(MAKE_DIRECTORY \"\${BG_BACKUP_DEST_SHARE}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_BACKUP_STAGE_SHARE}\" \"\${BG_BACKUP_DEST_SHARE}\" RESULT_VARIABLE BG_BACKUP_SHARE_RES ) if(NOT BG_BACKUP_SHARE_RES EQUAL 0) message(FATAL_ERROR \"[BG-Backup] Errore copiando share in \${BG_BACKUP_DEST_SHARE}\") endif() else() message(WARNING \"[BG-Backup] Directory share non trovata: \${BG_BACKUP_STAGE_SHARE}\") endif() message(STATUS \"[BG-Backup] Copia etc : \${BG_BACKUP_STAGE_ETC} -> \${BG_BACKUP_DEST_ETC}\") if(EXISTS \"\${BG_BACKUP_STAGE_ETC}\") file(MAKE_DIRECTORY \"\${BG_BACKUP_DEST_ETC}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_BACKUP_STAGE_ETC}\" \"\${BG_BACKUP_DEST_ETC}\" RESULT_VARIABLE BG_BACKUP_ETC_RES ) if(NOT BG_BACKUP_ETC_RES EQUAL 0) message(FATAL_ERROR \"[BG-Backup] Errore copiando etc in \${BG_BACKUP_DEST_ETC}\") endif() else() message(STATUS \"[BG-Backup] Nessuna directory etc da installare\") endif() message(STATUS \"[BG-Backup] βœ” installazione completata\") message(STATUS \"[BG-Backup] =====================================\") ") endif() # ====================== # BastionGuard Secure Connection (Meson + Go) # ====================== option(ENABLE_BASTIONGUARD_SECURE_CONNECTION "Build bastionguard-secure-connection" ON) if(ENABLE_BASTIONGUARD_SECURE_CONNECTION) include(ExternalProject) find_program(MESON_EXECUTABLE meson REQUIRED) find_program(NINJA_EXECUTABLE ninja REQUIRED) find_program(GO_EXECUTABLE go REQUIRED) find_program(PROTOC_EXECUTABLE protoc REQUIRED) find_program(GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin REQUIRED) find_program(PKG_CONFIG_EXECUTABLE pkg-config REQUIRED) set(BG_SC_SOURCE_DIR "${CMAKE_SOURCE_DIR}/thirdparty/bastionguard-secure-connection") set(BG_SC_BINARY_DIR "${CMAKE_BINARY_DIR}/bastionguard-secure-connection-build") set(BG_SC_INSTALL_DIR "${CMAKE_BINARY_DIR}/bastionguard-secure-connection-install") message(STATUS "[BG-SC] Source dir : ${BG_SC_SOURCE_DIR}") message(STATUS "[BG-SC] Build dir : ${BG_SC_BINARY_DIR}") message(STATUS "[BG-SC] Stage dir : ${BG_SC_INSTALL_DIR}") message(STATUS "[BG-SC] Final prefix: ${CMAKE_INSTALL_PREFIX}") ExternalProject_Add(bastionguard_secure_connection_ext SOURCE_DIR "${BG_SC_SOURCE_DIR}" BINARY_DIR "${BG_SC_BINARY_DIR}" CONFIGURE_COMMAND ${MESON_EXECUTABLE} setup "${BG_SC_BINARY_DIR}" "${BG_SC_SOURCE_DIR}" --prefix=/usr --sysconfdir=/etc --localedir=share/locale --buildtype=release --reconfigure BUILD_COMMAND ${MESON_EXECUTABLE} compile -C "${BG_SC_BINARY_DIR}" INSTALL_COMMAND ${MESON_EXECUTABLE} install -C "${BG_SC_BINARY_DIR}" --destdir "${BG_SC_INSTALL_DIR}" BUILD_ALWAYS 1 USES_TERMINAL_CONFIGURE 1 USES_TERMINAL_BUILD 1 USES_TERMINAL_INSTALL 1 LOG_CONFIGURE OFF LOG_BUILD OFF LOG_INSTALL OFF ) add_custom_target(BastionGuard-secure-connection ALL DEPENDS bastionguard_secure_connection_ext ) install(CODE " set(BG_SC_DESTDIR \"\$ENV{DESTDIR}\") message(STATUS \"[BG-SC] =====================================\") message(STATUS \"[BG-SC] Installazione bastionguard-secure-connection\") message(STATUS \"[BG-SC] Stage dir Meson : ${BG_SC_INSTALL_DIR}\") message(STATUS \"[BG-SC] Prefix finale : ${CMAKE_INSTALL_PREFIX}\") message(STATUS \"[BG-SC] DESTDIR : \${BG_SC_DESTDIR}\") set(BG_SC_STAGE_BIN \"${BG_SC_INSTALL_DIR}/usr/bin\") set(BG_SC_STAGE_SHARE \"${BG_SC_INSTALL_DIR}/usr/share\") set(BG_SC_STAGE_ETC \"${BG_SC_INSTALL_DIR}/etc\") set(BG_SC_STAGE_LIB \"${BG_SC_INSTALL_DIR}/usr/lib\") set(BG_SC_DEST_BIN \"\${BG_SC_DESTDIR}${CMAKE_INSTALL_PREFIX}/bin\") set(BG_SC_DEST_SHARE \"\${BG_SC_DESTDIR}${CMAKE_INSTALL_PREFIX}/share\") set(BG_SC_DEST_ETC \"\${BG_SC_DESTDIR}/etc\") set(BG_SC_DEST_LIB \"\${BG_SC_DESTDIR}${CMAKE_INSTALL_PREFIX}/lib\") if(EXISTS \"\${BG_SC_STAGE_BIN}\") file(MAKE_DIRECTORY \"\${BG_SC_DEST_BIN}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_SC_STAGE_BIN}\" \"\${BG_SC_DEST_BIN}\" RESULT_VARIABLE BG_SC_BIN_RES ) if(NOT BG_SC_BIN_RES EQUAL 0) message(FATAL_ERROR \"[BG-SC] Errore copiando i binari\") endif() endif() if(EXISTS \"\${BG_SC_STAGE_SHARE}\") file(MAKE_DIRECTORY \"\${BG_SC_DEST_SHARE}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_SC_STAGE_SHARE}\" \"\${BG_SC_DEST_SHARE}\" RESULT_VARIABLE BG_SC_SHARE_RES ) if(NOT BG_SC_SHARE_RES EQUAL 0) message(FATAL_ERROR \"[BG-SC] Errore copiando share\") endif() endif() if(EXISTS \"\${BG_SC_STAGE_ETC}\") file(MAKE_DIRECTORY \"\${BG_SC_DEST_ETC}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_SC_STAGE_ETC}\" \"\${BG_SC_DEST_ETC}\" RESULT_VARIABLE BG_SC_ETC_RES ) if(NOT BG_SC_ETC_RES EQUAL 0) message(FATAL_ERROR \"[BG-SC] Errore copiando etc\") endif() endif() # ── Copia esplicita config daemon in /etc/bastionguard-secure-connectiond ── # Meson installa i JSON con sysconfdir=/etc (assoluto), quindi nella stage # finiscono sempre in /etc/bastionguard-secure-connectiond/. # Con DESTDIR finiscono dentro il pkgdir, senza DESTDIR in /etc di sistema. set(BG_SC_CONF_SRC \"${BG_SC_INSTALL_DIR}/etc/bastionguard-secure-connectiond\") set(BG_SC_CONF_DST \"\${BG_SC_DESTDIR}/etc/bastionguard-secure-connectiond\") if(EXISTS \"\${BG_SC_CONF_SRC}\") file(MAKE_DIRECTORY \"\${BG_SC_CONF_DST}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_SC_CONF_SRC}\" \"\${BG_SC_CONF_DST}\" RESULT_VARIABLE BG_SC_CONF_RES ) if(NOT BG_SC_CONF_RES EQUAL 0) message(WARNING \"[BG-SC] Impossibile copiare la config (permessi?): \${BG_SC_CONF_DST}\") else() message(STATUS \"[BG-SC] βœ” Config daemon installata: \${BG_SC_CONF_DST}\") endif() else() message(WARNING \"[BG-SC] Directory config non trovata nella stage: \${BG_SC_CONF_SRC}\") endif() # ── Copia esplicita autostart in /etc/xdg/autostart ────────────────── set(BG_SC_AUTOSTART_SRC \"${BG_SC_INSTALL_DIR}/etc/xdg/autostart/bastionguard-sc-autostart.desktop\") set(BG_SC_AUTOSTART_DST \"\${BG_SC_DESTDIR}/etc/xdg/autostart/bastionguard-sc-autostart.desktop\") if(EXISTS \"\${BG_SC_AUTOSTART_SRC}\") file(MAKE_DIRECTORY \"\${BG_SC_DESTDIR}/etc/xdg/autostart\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy \"\${BG_SC_AUTOSTART_SRC}\" \"\${BG_SC_AUTOSTART_DST}\" RESULT_VARIABLE BG_SC_AUTOSTART_RES ) if(NOT BG_SC_AUTOSTART_RES EQUAL 0) message(WARNING \"[BG-SC] Impossibile copiare l'autostart (permessi?): \${BG_SC_AUTOSTART_DST}\") else() message(STATUS \"[BG-SC] βœ” Autostart installato: \${BG_SC_AUTOSTART_DST}\") endif() else() message(WARNING \"[BG-SC] File autostart non trovato nella stage: \${BG_SC_AUTOSTART_SRC}\") endif() if(EXISTS \"\${BG_SC_STAGE_LIB}\") file(MAKE_DIRECTORY \"\${BG_SC_DEST_LIB}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_SC_STAGE_LIB}\" \"\${BG_SC_DEST_LIB}\" RESULT_VARIABLE BG_SC_LIB_RES ) if(NOT BG_SC_LIB_RES EQUAL 0) message(FATAL_ERROR \"[BG-SC] Errore copiando lib\") endif() endif() message(STATUS \"[BG-SC] βœ” installazione completata\") message(STATUS \"[BG-SC] =====================================\") ") endif() # ====================== # BastionGuard Recovery Data (CMake) # ====================== option(ENABLE_BASTIONGUARD_RECOVERY_DATA "Build bastionguard-recovery-data" ON) if(ENABLE_BASTIONGUARD_RECOVERY_DATA) include(ExternalProject) set(BG_RD_SOURCE_DIR "${CMAKE_SOURCE_DIR}/thirdparty/bastionguard-recovery-data") set(BG_RD_BINARY_DIR "${CMAKE_BINARY_DIR}/bastionguard-recovery-data-build") set(BG_RD_INSTALL_DIR "${CMAKE_BINARY_DIR}/bastionguard-recovery-data-install") message(STATUS "[BG-RD] Source dir : ${BG_RD_SOURCE_DIR}") message(STATUS "[BG-RD] Build dir : ${BG_RD_BINARY_DIR}") message(STATUS "[BG-RD] Stage dir : ${BG_RD_INSTALL_DIR}") message(STATUS "[BG-RD] Final prefix: ${CMAKE_INSTALL_PREFIX}") ExternalProject_Add(bastionguard_recovery_data_ext SOURCE_DIR "${BG_RD_SOURCE_DIR}" BINARY_DIR "${BG_RD_BINARY_DIR}" CONFIGURE_COMMAND "${CMAKE_COMMAND}" -S "${BG_RD_SOURCE_DIR}" -B "${BG_RD_BINARY_DIR}" -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release BUILD_COMMAND "${CMAKE_COMMAND}" --build "${BG_RD_BINARY_DIR}" --parallel INSTALL_COMMAND "${CMAKE_COMMAND}" -E env DESTDIR=${BG_RD_INSTALL_DIR} "${CMAKE_COMMAND}" --install "${BG_RD_BINARY_DIR}" BUILD_ALWAYS 1 USES_TERMINAL_CONFIGURE 1 USES_TERMINAL_BUILD 1 USES_TERMINAL_INSTALL 1 LOG_CONFIGURE OFF LOG_BUILD OFF LOG_INSTALL OFF ) add_custom_target(BastionGuard-recovery-data ALL DEPENDS bastionguard_recovery_data_ext ) install(CODE " set(BG_RD_DESTDIR \"\$ENV{DESTDIR}\") message(STATUS \"[BG-RD] =====================================\") message(STATUS \"[BG-RD] Installazione bastionguard-recovery-data\") message(STATUS \"[BG-RD] Stage dir CMake : ${BG_RD_INSTALL_DIR}\") message(STATUS \"[BG-RD] Prefix finale : ${CMAKE_INSTALL_PREFIX}\") message(STATUS \"[BG-RD] DESTDIR : \${BG_RD_DESTDIR}\") set(BG_RD_STAGE_BIN \"${BG_RD_INSTALL_DIR}/usr/bin\") set(BG_RD_STAGE_SHARE \"${BG_RD_INSTALL_DIR}/usr/share\") set(BG_RD_STAGE_ETC \"${BG_RD_INSTALL_DIR}/etc\") set(BG_RD_STAGE_LIB \"${BG_RD_INSTALL_DIR}/usr/lib\") set(BG_RD_DEST_BIN \"\${BG_RD_DESTDIR}${CMAKE_INSTALL_PREFIX}/bin\") set(BG_RD_DEST_SHARE \"\${BG_RD_DESTDIR}${CMAKE_INSTALL_PREFIX}/share\") set(BG_RD_DEST_ETC \"\${BG_RD_DESTDIR}/etc\") set(BG_RD_DEST_LIB \"\${BG_RD_DESTDIR}${CMAKE_INSTALL_PREFIX}/lib\") if(EXISTS \"\${BG_RD_STAGE_BIN}\") file(MAKE_DIRECTORY \"\${BG_RD_DEST_BIN}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_RD_STAGE_BIN}\" \"\${BG_RD_DEST_BIN}\" RESULT_VARIABLE BG_RD_BIN_RES ) if(NOT BG_RD_BIN_RES EQUAL 0) message(FATAL_ERROR \"[BG-RD] Errore copiando i binari\") endif() else() message(WARNING \"[BG-RD] Directory bin non trovata: \${BG_RD_STAGE_BIN}\") endif() if(EXISTS \"\${BG_RD_STAGE_SHARE}\") file(MAKE_DIRECTORY \"\${BG_RD_DEST_SHARE}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_RD_STAGE_SHARE}\" \"\${BG_RD_DEST_SHARE}\" RESULT_VARIABLE BG_RD_SHARE_RES ) if(NOT BG_RD_SHARE_RES EQUAL 0) message(FATAL_ERROR \"[BG-RD] Errore copiando share\") endif() else() message(WARNING \"[BG-RD] Directory share non trovata: \${BG_RD_STAGE_SHARE}\") endif() if(EXISTS \"\${BG_RD_STAGE_ETC}\") file(MAKE_DIRECTORY \"\${BG_RD_DEST_ETC}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_RD_STAGE_ETC}\" \"\${BG_RD_DEST_ETC}\" RESULT_VARIABLE BG_RD_ETC_RES ) if(NOT BG_RD_ETC_RES EQUAL 0) message(FATAL_ERROR \"[BG-RD] Errore copiando etc\") endif() else() message(STATUS \"[BG-RD] Nessuna directory etc da installare\") endif() if(EXISTS \"\${BG_RD_STAGE_LIB}\") file(MAKE_DIRECTORY \"\${BG_RD_DEST_LIB}\") execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy_directory \"\${BG_RD_STAGE_LIB}\" \"\${BG_RD_DEST_LIB}\" RESULT_VARIABLE BG_RD_LIB_RES ) if(NOT BG_RD_LIB_RES EQUAL 0) message(FATAL_ERROR \"[BG-RD] Errore copiando lib\") endif() endif() message(STATUS \"[BG-RD] βœ” installazione completata\") message(STATUS \"[BG-RD] =====================================\") ") endif() # ====================== # Traduzioni con gettext # ====================== set(PO_DIR ${CMAKE_SOURCE_DIR}/locale) set(POT_FILE ${PO_DIR}/BastionGuard.pot) file(GLOB PO_FILES RELATIVE ${PO_DIR} ${PO_DIR}/*.po) add_custom_target(update-po COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE} --keyword=_ --language=C++ --from-code=UTF-8 -o ${POT_FILE} ${CMAKE_SOURCE_DIR}/src/*.cpp ${CMAKE_SOURCE_DIR}/src/*.hpp WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Rigenerazione BastionGuard.pot" ) if(NOT DEFINED GETTEXT_MSGUNIQ_EXECUTABLE) find_program(GETTEXT_MSGUNIQ_EXECUTABLE msguniq) endif() if(NOT GETTEXT_MSGUNIQ_EXECUTABLE) message(WARNING "msguniq non trovato. I duplicati nelle .po non verranno filtrati automaticamente.") endif() set(MO_TARGETS "") foreach(PO_REL ${PO_FILES}) set(PO_FILE ${PO_DIR}/${PO_REL}) get_filename_component(LANG ${PO_FILE} NAME_WE) set(BUILD_LOCALE_DIR ${CMAKE_CURRENT_BINARY_DIR}/locale/${LANG}/LC_MESSAGES) set(SANITIZED_PO ${CMAKE_CURRENT_BINARY_DIR}/locale/${LANG}/BastionGuard_${LANG}.po) set(MO_FILE ${BUILD_LOCALE_DIR}/BastionGuard.mo) if(GETTEXT_MSGUNIQ_EXECUTABLE) add_custom_command( OUTPUT ${MO_FILE} COMMAND ${CMAKE_COMMAND} -E make_directory ${BUILD_LOCALE_DIR} COMMAND ${GETTEXT_MSGUNIQ_EXECUTABLE} ${PO_FILE} -o ${SANITIZED_PO} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${MO_FILE} ${SANITIZED_PO} DEPENDS ${PO_FILE} COMMENT "Sanitizzo ${PO_FILE} (msguniq) e compilo ${MO_FILE}" ) else() add_custom_command( OUTPUT ${MO_FILE} COMMAND ${CMAKE_COMMAND} -E make_directory ${BUILD_LOCALE_DIR} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${MO_FILE} ${PO_FILE} DEPENDS ${PO_FILE} COMMENT "Compilo ${PO_FILE} β†’ ${MO_FILE}" ) endif() add_custom_target(${LANG}.mo ALL DEPENDS ${MO_FILE}) list(APPEND MO_TARGETS ${LANG}.mo) install(FILES ${MO_FILE} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/locale/${LANG}/LC_MESSAGES ) endforeach() add_custom_target(translations DEPENDS ${MO_TARGETS}) # ====================== # Installazioni generali # ====================== install(FILES desktop/BastionGuard.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) install(FILES desktop/BastionGuard-bankgui.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) install(FILES desktop/BastionGuard-secure.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) install(FILES desktop/bastionguard-bankopener.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) install(FILES desktop/BastionGuard-autostart.desktop DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/xdg/autostart) if (EXISTS "${CMAKE_SOURCE_DIR}/data/rules") install(DIRECTORY "${CMAKE_SOURCE_DIR}/data/rules/" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/rules") else() message(WARNING "data/rules not found; skipping install") endif() if (EXISTS "${CMAKE_SOURCE_DIR}/data/vhosts") install(DIRECTORY "${CMAKE_SOURCE_DIR}/data/vhosts/" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/data/vhosts") else() message(WARNING "data/vhosts not found; skipping install") endif() # ============================== # Installazione automatica dei file NGINX (universale) # ============================== if (INSTALL_NGINX_DEFAULTS) message(STATUS "🧩 Installazione automatica dei file di configurazione NGINX abilitata") bg_install_code( " message(STATUS \"πŸ“¦ Creazione directory standard NGINX...\") file(MAKE_DIRECTORY /etc/nginx/conf.d) file(MAKE_DIRECTORY /etc/nginx/sites-available) file(MAKE_DIRECTORY /etc/nginx/sites-enabled) # ============================================================ # 1️⃣ Copia BastionGuard Virtual Host (nginx.conf β†’ BastionGuard.conf) # ============================================================ if(EXISTS \"/usr/share/BastionGuard/data/vhosts/nginx.conf\") message(STATUS \"[NGINX] Installo BastionGuard.conf in /etc/nginx/sites-available/\") execute_process(COMMAND cp -f /usr/share/BastionGuard/data/vhosts/nginx.conf /etc/nginx/sites-available/BastionGuard.conf) if(NOT EXISTS /etc/nginx/sites-enabled/BastionGuard.conf) execute_process(COMMAND ln -s ../sites-available/BastionGuard.conf /etc/nginx/sites-enabled/BastionGuard.conf) message(STATUS \"[NGINX] Abilitato site BastionGuard in sites-enabled/\") else() message(STATUS \"[NGINX] sites-enabled/BastionGuard.conf giΓ  presente\") endif() else() message(WARNING \"[NGINX] nginx.conf non trovato in /usr/share/BastionGuard/data/vhosts/\") endif() # ============================================================ # 2️⃣ Installa il default site per Arch / altre distro # ============================================================ if(EXISTS /etc/os-release) file(READ /etc/os-release OSINFO) string(FIND \"\${OSINFO}\" \"arch\" _archpos) if(NOT _archpos EQUAL -1) message(STATUS \"[NGINX] Rilevata Arch Linux β†’ uso nginx-default-arch.conf come default\") if(EXISTS \"/usr/share/BastionGuard/data/vhosts/nginx-default-arch.conf\") execute_process(COMMAND cp -f /usr/share/BastionGuard/data/vhosts/nginx-default-arch.conf /etc/nginx/sites-available/default) endif() else() message(STATUS \"[NGINX] Uso configurazione standard nginx-default.conf come default\") if(EXISTS \"/usr/share/BastionGuard/data/vhosts/nginx-default.conf\") execute_process(COMMAND cp -f /usr/share/BastionGuard/data/vhosts/nginx-default.conf /etc/nginx/sites-available/default) endif() endif() endif() # Link simbolico per default if(NOT EXISTS /etc/nginx/sites-enabled/default) execute_process(COMMAND ln -s ../sites-available/default /etc/nginx/sites-enabled/default) message(STATUS \"[NGINX] Abilitato default site in sites-enabled/\") endif() # ============================================================ # 3️⃣ Pagina di test HTTP # ============================================================ if(NOT EXISTS /srv/http/index.html) file(MAKE_DIRECTORY /srv/http) file(WRITE /srv/http/index.html \"

βœ… Nginx configurato correttamente per BastionGuard

\") message(STATUS \"[NGINX] Creata pagina di test /srv/http/index.html\") endif() # ============================================================ # 4️⃣ Test configurazione e riavvio # ============================================================ message(STATUS \"[NGINX] Testo configurazione...\") execute_process(COMMAND nginx -t RESULT_VARIABLE nginx_test) if(nginx_test EQUAL 0) execute_process(COMMAND systemctl restart nginx) message(STATUS \"[NGINX] βœ… Configurazione valida, Nginx riavviato.\") else() message(WARNING \"[NGINX] ⚠ Test configurazione fallito. Controlla con: sudo nginx -t\") endif() ") else() message(STATUS "Installazione automatica dei file NGINX disabilitata (usa -DINSTALL_NGINX_DEFAULTS=ON per abilitarla)") endif() install(FILES data/service/org.BastionGuard.RansomwareAlert.service DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/dbus-1/services) install(FILES actions/policy/org.BastionGuard.policy actions/policy/org.BastionGuard.ransomware.policy actions/policy/org.BastionGuard.USBD.policy DESTINATION /usr/share/polkit-1/actions PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) if(ENABLE_SYSTEM_CA_INSTALL) install(FILES actions/policy/eu.bastionguard.install-ca.policy DESTINATION /usr/share/polkit-1/actions PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) endif() install(FILES actions/dbus/org.BastionGuard.USBD.conf DESTINATION /usr/share/dbus-1/system.d PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) # Install DBus system service install( FILES actions/dbus/org.BastionGuard.USBD.service DESTINATION /usr/share/dbus-1/system-services PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) # ====================== # Polkit Policy – Privacy Webcam # ====================== install(FILES actions/policy/it.BastionGuard.camera.policy DESTINATION /usr/share/polkit-1/actions PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) # ====================== # Permission Policy – Privacy Webcam # ====================== install(FILES data/sudoers/bastionguard-helper DESTINATION /etc/sudoers.d PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) # ====================== # Permission Policy – Bank helper # ====================== install(FILES data/sudoers/bastionguard-helper DESTINATION /etc/sudoers.d PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) # ====================== # Permission Policy – Helper anti-phishing-update # ====================== install(FILES data/sudoers/bastionguard-phishing DESTINATION /etc/sudoers.d PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) install(PROGRAMS data/scripts/bank-helper DESTINATION /usr/bin/ ) # ====================== # Services # ====================== # opzione per abilitare automaticamente le user units durante 'cmake --install' (default OFF) option(ENABLE_USER_AGENT_AUTO "Attempt to enable systemd --user unit for logged-in users at install time" OFF) # install system units (system-wide) install(FILES data/service/BastionGuard-phishing-scanner.service data/service/BastionGuard-phishing-updater.service data/service/BastionGuard-phishing-updater.timer data/service/BastionGuard-ransomware-realtime.service data/service/bastionguard-sanesecurity.service data/service/bastionguard-sanesecurity.timer data/service/BastionGuard-usbd.service DESTINATION /usr/lib/systemd/system ) # install user units (systemd --user services) install(FILES data/service/BastionGuard-useragent.service data/service/BastionGuard-privacyd.service data/service/BastionGuard-ransomware-alert.service data/service/BastionGuard-ransomware-realtime-alert.service data/service/BastionGuard-ransomware-scanner.service data/service/BastionGuard-pacd.service data/service/BastionGuard-mailproxy.service data/service/BastionGuard-user-session-watch.service DESTINATION /usr/lib/systemd/user ) if(ENABLE_CEF_DAEMON) install(FILES data/service/BastionGuard-cef.service DESTINATION /usr/lib/systemd/user ) install(FILES data/service/BastionGuard-cef.service DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/data/service ) endif() # helper script to enable user agents for logged-in users install(PROGRAMS data/scripts/enable-user-agents.sh data/scripts/BastionGuard-phishing-updater.sh data/scripts/BastionGuard-net-setup.sh data/scripts/BastionGuard-export-env.sh data/scripts/BastionGuard-locale.sh data/scripts/BastionGuard-setup-clamav-daemon.sh data/scripts/BastionGuard-user-session-watch.sh DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/data/scripts ) if(ENABLE_SYSTEM_CA_INSTALL) install(PROGRAMS data/scripts/install-ca-system.sh DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/data/scripts ) endif() install(PROGRAMS data/extension/bastionguard-tb-extension/install-tb-extension.sh DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/data/extension/bastionguard-tb-extension ) install(FILES data/config/nftables.conf DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/BastionGuard/data/config ) # ============================================================ # πŸ”§ Forza RPATH su TUTTI i binari BastionGuard # ============================================================ set(BG_ALL_BINARIES BastionGuard BastionGuard-ransomware-alert BastionGuard-ransomware-realtime-alert BastionGuard-daemon BastionGuard-privacyd BastionGuard-usbd BastionGuard-wizard BastionGuard-bankopener BastionGuard-bankgui BastionGuard-native-host BastionGuard-ransomware-scanner BastionGuard-ransomware-realtime BastionGuard-mailproxy archive_worker ) foreach(tgt IN LISTS BG_ALL_BINARIES) if(TARGET ${tgt}) set_target_properties(${tgt} PROPERTIES INSTALL_RPATH "/usr/share/BastionGuard/lib;/usr/share/BastionGuard/cef" BUILD_RPATH "/usr/share/BastionGuard/lib;/usr/share/BastionGuard/cef" ) endif() endforeach() # ============================================================ # πŸ“Œ Installazione automatica delle firme custom in /var/lib/clamav # ============================================================ bg_install_code( " message(STATUS \"[ClamAV] Copio tutte le firme custom da data/signature in /var/lib/clamav ...\") set(SRC_DIR \"${CMAKE_SOURCE_DIR}/data/signature\") set(DEST_DIR \"/var/lib/clamav\") # Crea la directory se non esiste file(MAKE_DIRECTORY \${DEST_DIR}) # Cerca solo i file con estensioni valide per ClamAV file(GLOB SIGNATURE_FILES \"\${SRC_DIR}/*.ndb\" \"\${SRC_DIR}/*.hdb\" \"\${SRC_DIR}/*.ldb\" \"\${SRC_DIR}/*.fp\" \"\${SRC_DIR}/*.ign\" \"\${SRC_DIR}/*.ign2\" ) list(LENGTH SIGNATURE_FILES NUM_FILES) if(NUM_FILES EQUAL 0) message(WARNING \"[ClamAV] Nessun file di signature (.ndb/.hdb/.ldb/.fp/etc) trovato in \${SRC_DIR}\") else() foreach(f IN LISTS SIGNATURE_FILES) get_filename_component(FILENAME \${f} NAME) file(INSTALL DESTINATION \${DEST_DIR} TYPE FILE FILES \"\${f}\" PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) message(STATUS \"[ClamAV] Installato: \${FILENAME} β†’ \${DEST_DIR}\") endforeach() message(STATUS \"[ClamAV] Completato: \${NUM_FILES} firme custom copiate con successo\") endif() ") # ============================================================ # βš™οΈ Installazione ottimizzazioni DNS (sysctl) # ============================================================ set(SYSCTL_SOURCE_PATH "${CMAKE_INSTALL_FULL_DATAROOTDIR}/BastionGuard/data/config/99-dns-fast.conf") set(SYSCTL_DEST_PATH "/etc/sysctl.d/99-dns-fast.conf") bg_install_code( " message(STATUS \"[Sysctl] Installazione ottimizzazioni DNS...\") if(EXISTS \"${SYSCTL_SOURCE_PATH}\") file(INSTALL DESTINATION /etc/sysctl.d TYPE FILE FILES \"${SYSCTL_SOURCE_PATH}\" PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) message(STATUS \"[Sysctl] Copiato: ${SYSCTL_SOURCE_PATH} β†’ ${SYSCTL_DEST_PATH}\") # Applica immediatamente le modifiche execute_process(COMMAND sysctl --system RESULT_VARIABLE sysctl_result OUTPUT_VARIABLE sysctl_output ERROR_VARIABLE sysctl_error) if(sysctl_result EQUAL 0) message(STATUS \"[Sysctl] βœ… Configurazioni DNS applicate correttamente.\") else() message(WARNING \"[Sysctl] ⚠ Errore applicando sysctl: \${sysctl_error}\") endif() else() message(WARNING \"[Sysctl] ⚠ File non trovato: ${SYSCTL_SOURCE_PATH}\") endif() ") if(ENABLE_SYSTEMD_SERVICES) bg_install_code( " message(STATUS \"[Systemd] Ricarico configurazione systemd...\") execute_process(COMMAND systemctl daemon-reload) message(STATUS \"[Systemd] Abilito BastionGuard-phishing-scanner...\") execute_process(COMMAND systemctl enable BastionGuard-phishing-scanner.service) message(STATUS \"[Systemd] Avvio BastionGuard-phishing-scanner...\") execute_process(COMMAND systemctl start BastionGuard-phishing-scanner.service) message(STATUS \"[Systemd] Riavvio BastionGuard-phishing-scanner...\") execute_process(COMMAND systemctl restart BastionGuard-phishing-scanner.service) message(STATUS \"[Systemd] Abilito BastionGuard-ransomware-realtime...\") execute_process(COMMAND systemctl enable BastionGuard-ransomware-realtime.service) message(STATUS \"[Systemd] Avvio BastionGuard-ransomware-realtime...\") execute_process(COMMAND systemctl start BastionGuard-ransomware-realtime.service) message(STATUS \"[Systemd] Riavvio BastionGuard-ransomware-realtime...\") execute_process(COMMAND systemctl restart BastionGuard-ransomware-realtime.service) message(STATUS \"[Systemd] Abilito BastionGuard-phishing-scanner on graphical...\") execute_process(COMMAND systemctl enable BastionGuard-restart-on-graphical.service) message(STATUS \"[Systemd] Riavvio BastionGuard-phishing-scanner on graphical...\") execute_process(COMMAND systemctl start BastionGuard-restart-on-graphical.service) message(STATUS \"[Systemd] Riavvio polkit ...\") execute_process(COMMAND systemctl start polkit.service) ") else() message(STATUS "Systemd service install-time actions are disabled. To enable, run CMake with -DENABLE_SYSTEMD_SERVICES=ON") endif() # ============================================================ # Installazione automatica regola udev per BastionGuard USB # ============================================================ set(UDEV_RULE_SOURCE "${CMAKE_SOURCE_DIR}/data/udev/99-BastionGuard-usb.rules") set(UDEV_RULE_DEST "/etc/udev/rules.d/99-BastionGuard-usb.rules") if(EXISTS ${UDEV_RULE_SOURCE}) message(STATUS "βœ” Regola UDEV trovata: ${UDEV_RULE_SOURCE}") bg_install_code( " message(STATUS \"[UDEV] Installazione regola USB...\") # Determina l'utente reale set(INSTALL_USER \"$ENV{SUDO_USER}\") if(NOT INSTALL_USER OR INSTALL_USER STREQUAL \"\") set(INSTALL_USER \"$ENV{USER}\") endif() message(STATUS \"[UDEV] Utente reale: \${INSTALL_USER}\") # 1️⃣ Copia regola udev UNA SOLA VOLTA execute_process( COMMAND cp -f \"${UDEV_RULE_SOURCE}\" \"${UDEV_RULE_DEST}\" ) message(STATUS \"[UDEV] Copiata: ${UDEV_RULE_SOURCE} β†’ ${UDEV_RULE_DEST}\") # 2️⃣ Gruppo plugdev execute_process( COMMAND getent group plugdev RESULT_VARIABLE PLUGDEV_EXISTS OUTPUT_QUIET ERROR_QUIET ) if(PLUGDEV_EXISTS EQUAL 0) message(STATUS \"[UDEV] Gruppo plugdev giΓ  esistente.\") else() message(STATUS \"[UDEV] Creo gruppo plugdev...\") execute_process(COMMAND groupadd plugdev) endif() # 3️⃣ Aggiunta utente execute_process( COMMAND id -nG \${INSTALL_USER} OUTPUT_VARIABLE USER_GROUPS OUTPUT_STRIP_TRAILING_WHITESPACE ) string(FIND \"\${USER_GROUPS}\" \"plugdev\" FOUND_PLUGDEV) if(NOT FOUND_PLUGDEV EQUAL -1) message(STATUS \"[UDEV] Utente \${INSTALL_USER} giΓ  nel gruppo plugdev.\") else() message(STATUS \"[UDEV] Aggiungo \${INSTALL_USER} al gruppo plugdev...\") execute_process(COMMAND usermod -aG plugdev \${INSTALL_USER}) endif() # 4️⃣ Reload message(STATUS \"[UDEV] Ricarico regole udev...\") execute_process(COMMAND udevadm control --reload-rules) # 5️⃣ Trigger message(STATUS \"[UDEV] Eseguo udevadm trigger...\") execute_process(COMMAND udevadm trigger) message(STATUS \"[UDEV] βœ” Installazione UDEV completata.\") ") else() message(WARNING "⚠ File UDEV non trovato: ${UDEV_RULE_SOURCE}") endif() # ====================== # Helper uninstall target (CMake uninstall support) # ====================== if(NOT TARGET uninstall) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY ) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake COMMENT "Rimozione completa di tutti i file installati da BastionGuard" ) endif()