specialworld83 2026-03-15 13:01:38 +01:00
commit 7f6e28fa57
36 changed files with 479 additions and 160 deletions

View file

@ -417,8 +417,8 @@ target_include_directories(BastionGuard
)
target_compile_definitions(BastionGuard PRIVATE
BASTIONGUARD_VERSION="1.0"
BASTIONGUARD_BUILD=20260116
BASTIONGUARD_VERSION="1.1"
BASTIONGUARD_BUILD=20260310
)
target_link_libraries(BastionGuard

View file

@ -8,4 +8,4 @@ usr/share/dbus-1/system-services/*.service usr/share/dbus-1/system-services/
usr/share/dbus-1/services/*.service usr/share/dbus-1/services/
usr/lib/systemd/system/* usr/lib/systemd/system/
usr/lib/systemd/user/* usr/lib/systemd/user/
usr/libexec/bastionguard/archive_worker usr/libexec/bastionguard/

View file

@ -511,8 +511,8 @@ target_include_directories(BastionGuard
)
target_compile_definitions(BastionGuard PRIVATE
BASTIONGUARD_VERSION="1.0"
BASTIONGUARD_BUILD=20260116
BASTIONGUARD_VERSION="1.1"
BASTIONGUARD_BUILD=20260310
)
target_link_libraries(BastionGuard
@ -908,6 +908,7 @@ install(TARGETS BastionGuard-ransomware-scanner RUNTIME DESTINATION ${CMAKE_INST
# ======================
add_executable(BastionGuard-ransomware-realtime
src/scanner-ransomware/BastionGuard-ransomware-realtime.cpp
${BG_ARCHIVE_CORE_SOURCES}
)
target_include_directories(BastionGuard-ransomware-realtime PRIVATE src)

View file

@ -12,13 +12,11 @@ if [[ ! -d "$SRC_DIR" ]]; then
exit 1
fi
# PATCH ALL: every .cpp under src/ (includes src/usb/USBScanPage.cpp and any future files)
mapfile -t FILES_TO_PATCH < <(find "$SRC_DIR" -type f -name "*.cpp" | sort)
TMPDIR="$(mktemp -d)"
trap 'rm -rf "$TMPDIR"' EXIT
# Make a stable backup key from full path (avoid basename collisions)
backup_key() { echo "$1" | sed 's|/|__|g'; }
echo "[1/6] Backups"
@ -26,6 +24,7 @@ for f in "${FILES_TO_PATCH[@]}"; do
[[ -f "$f" ]] || continue
cp -a "$f" "$TMPDIR/$(backup_key "$f").orig"
done
if [[ -f "$COMPAT_HPP" ]]; then
cp -a "$COMPAT_HPP" "$TMPDIR/GtkCompat.hpp.orig"
else
@ -36,9 +35,6 @@ echo "[2/6] Writing $COMPAT_HPP (Qt macro-safe)"
cat > "$COMPAT_HPP" <<'EOF'
#pragma once
// Qt macro hygiene: Qt defines macros (signals/slots/emit/foreach/Q_FOREACH) that break glib/gtkmm headers.
// Temporarily undef them while including gtkmm/glibmm, then restore.
#if defined(_MSC_VER) || defined(__clang__) || defined(__GNUC__)
#define GTKCOMPAT_HAS_PUSH_POP_MACRO 1
#else
@ -72,7 +68,6 @@ cat > "$COMPAT_HPP" <<'EOF'
#define GTKCOMPAT_RESTORE_Q_FOREACH 1
#endif
#else
// Fallback: undefine (cannot restore reliably without push/pop)
#ifdef signals
#undef signals
#endif
@ -121,7 +116,6 @@ namespace GtkCompat
}
}
// Robust comparisons between Glib::ustring and std::string (avoids operator!= issues).
inline bool operator==(const Glib::ustring& lhs, const std::string& rhs) { return lhs.raw() == rhs; }
inline bool operator==(const std::string& lhs, const Glib::ustring& rhs) { return lhs == rhs.raw(); }
inline bool operator!=(const Glib::ustring& lhs, const std::string& rhs) { return !(lhs == rhs); }
@ -167,48 +161,81 @@ for f in "${FILES_TO_PATCH[@]}"; do
done
echo "[4/6] Fix ListBox::remove_all()"
# Apply globally (not just ScanPage.cpp), in case other listboxes call remove_all()
perl -pi -e 's/\b([A-Za-z_][A-Za-z0-9_]*)\.remove_all\(\)\s*;/GtkCompat::listbox_clear($1);/g' "${FILES_TO_PATCH[@]}"
echo "[5/6] Fix get_children() vars and loops (supports auto, auto&, auto &)"
echo "[5/6] Fix get_children() vars and loops (supports auto, auto&, auto*, braced and single-line)"
for f in "${FILES_TO_PATCH[@]}"; do
[[ -f "$f" ]] || continue
# auto children = obj.get_children();
perl -i -pe '
s/\bauto\s+(\w+)\s*=\s*([A-Za-z_][A-Za-z0-9_:>\-\.\(\)\s]*)\s*\.get_children\s*\(\s*\)\s*;/
auto $1 = GtkCompat::children($2);/gx
' "$f"
# auto children = obj->get_children();
perl -i -pe '
s/\bauto\s+(\w+)\s*=\s*([A-Za-z_][A-Za-z0-9_:>\-\.\(\)\s]*)\s*->get_children\s*\(\s*\)\s*;/
auto $1 = GtkCompat::children(*($2));/gx
' "$f"
# for (auto X : OBJ.get_children()) {
perl -0777 -i -pe '
s/for\s*\(\s*auto\s+(\w+)\s*:\s*([^\)]+?)\.get_children\s*\(\s*\)\s*\)\s*\{/
for (auto* $1 = ($2).get_first_child(); $1 != nullptr; $1 = $1->get_next_sibling()) {/gsx
' "$f"
# for (auto& X : OBJ.get_children()) { and for (auto & X : ...)
perl -0777 -i -pe '
s/for\s*\(\s*auto\s*&\s*(\w+)\s*:\s*([^\)]+?)\.get_children\s*\(\s*\)\s*\)\s*\{/
for (auto* $1 = ($2).get_first_child(); $1 != nullptr; $1 = $1->get_next_sibling()) {/gsx
' "$f"
# for (auto X : OBJ->get_children()) {
perl -0777 -i -pe '
s/for\s*\(\s*auto\s*\*\s*(\w+)\s*:\s*([^\)]+?)\.get_children\s*\(\s*\)\s*\)\s*\{/
for (auto* $1 = ($2).get_first_child(); $1 != nullptr; $1 = $1->get_next_sibling()) {/gsx
' "$f"
perl -0777 -i -pe '
s/for\s*\(\s*auto\s+(\w+)\s*:\s*([^\)]+?)\-\>get_children\s*\(\s*\)\s*\)\s*\{/
for (auto* $1 = ($2)->get_first_child(); $1 != nullptr; $1 = $1->get_next_sibling()) {/gsx
' "$f"
# for (auto& X : OBJ->get_children()) { and for (auto & X : ...)
perl -0777 -i -pe '
s/for\s*\(\s*auto\s*&\s*(\w+)\s*:\s*([^\)]+?)\-\>get_children\s*\(\s*\)\s*\)\s*\{/
for (auto* $1 = ($2)->get_first_child(); $1 != nullptr; $1 = $1->get_next_sibling()) {/gsx
' "$f"
perl -0777 -i -pe '
s/for\s*\(\s*auto\s*\*\s*(\w+)\s*:\s*([^\)]+?)\-\>get_children\s*\(\s*\)\s*\)\s*\{/
for (auto* $1 = ($2)->get_first_child(); $1 != nullptr; $1 = $1->get_next_sibling()) {/gsx
' "$f"
perl -0777 -i -pe '
s@for\s*\(\s*auto\s+(\w+)\s*:\s*([^\n;]+?)\.get_children\s*\(\s*\)\s*\)\s*\n(\s*)([^\n;][^\n]*;)@
$3for (auto* $1 = ($2).get_first_child(); $1 != nullptr; ) {\n$3 auto* next = $1->get_next_sibling();\n$3 $4\n$3 $1 = next;\n$3}@gsx
' "$f"
perl -0777 -i -pe '
s@for\s*\(\s*auto\s*&\s*(\w+)\s*:\s*([^\n;]+?)\.get_children\s*\(\s*\)\s*\)\s*\n(\s*)([^\n;][^\n]*;)@
$3for (auto* $1 = ($2).get_first_child(); $1 != nullptr; ) {\n$3 auto* next = $1->get_next_sibling();\n$3 $4\n$3 $1 = next;\n$3}@gsx
' "$f"
perl -0777 -i -pe '
s@for\s*\(\s*auto\s*\*\s*(\w+)\s*:\s*([^\n;]+?)\.get_children\s*\(\s*\)\s*\)\s*\n(\s*)([^\n;][^\n]*;)@
$3for (auto* $1 = ($2).get_first_child(); $1 != nullptr; ) {\n$3 auto* next = $1->get_next_sibling();\n$3 $4\n$3 $1 = next;\n$3}@gsx
' "$f"
perl -0777 -i -pe '
s@for\s*\(\s*auto\s+(\w+)\s*:\s*([^\n;]+?)\-\>get_children\s*\(\s*\)\s*\)\s*\n(\s*)([^\n;][^\n]*;)@
$3for (auto* $1 = ($2)->get_first_child(); $1 != nullptr; ) {\n$3 auto* next = $1->get_next_sibling();\n$3 $4\n$3 $1 = next;\n$3}@gsx
' "$f"
perl -0777 -i -pe '
s@for\s*\(\s*auto\s*&\s*(\w+)\s*:\s*([^\n;]+?)\-\>get_children\s*\(\s*\)\s*\)\s*\n(\s*)([^\n;][^\n]*;)@
$3for (auto* $1 = ($2)->get_first_child(); $1 != nullptr; ) {\n$3 auto* next = $1->get_next_sibling();\n$3 $4\n$3 $1 = next;\n$3}@gsx
' "$f"
perl -0777 -i -pe '
s@for\s*\(\s*auto\s*\*\s*(\w+)\s*:\s*([^\n;]+?)\-\>get_children\s*\(\s*\)\s*\)\s*\n(\s*)([^\n;][^\n]*;)@
$3for (auto* $1 = ($2)->get_first_child(); $1 != nullptr; ) {\n$3 auto* next = $1->get_next_sibling();\n$3 $4\n$3 $1 = next;\n$3}@gsx
' "$f"
done
echo "[6/6] Generate patch artifact: $PATCH_OUT"
@ -235,4 +262,3 @@ echo "DONE. Residual get_children() occurrences (should be 0):"
grep -R --line-number "get_children()" -n "$SRC_DIR" || true
echo
echo "Patch written to: $PATCH_OUT"

View file

@ -0,0 +1,31 @@
#!/usr/bin/env bash
set -euo pipefail
FILE="src/SettingsPage.cpp"
if [[ ! -f "$FILE" ]]; then
echo "ERROR: $FILE not found" >&2
exit 1
fi
echo "[ubuntu-lts-system-fix] Patching $FILE"
perl -0777 -i -pe '
s@if \(pw\) chown\(conf_file\.c_str\(\), pw->pw_uid, pw->pw_gid\);@if (pw) {\n const int chown_rc = chown(conf_file.c_str(), pw->pw_uid, pw->pw_gid);\n if (chown_rc != 0) {\n std::cerr << _("[SettingsPage] ⚠ chown fallita per ") << conf_file << std::endl;\n }\n }@g;
s@std::system\("systemctl --user restart BastionGuard-mailproxy\.service 2>/dev/null"\);@const int rc = std::system("systemctl --user restart BastionGuard-mailproxy.service 2>/dev/null");\n if (rc != 0) {\n std::cerr << _("[SettingsPage] ⚠ Impossibile riavviare BastionGuard-mailproxy.service") << std::endl;\n }@g;
' "$FILE"
echo "[ubuntu-lts-system-fix] Verifying patch"
if grep -Eq '^[[:space:]]*if \(pw\) chown\(conf_file\.c_str\(\), pw->pw_uid, pw->pw_gid\);[[:space:]]*$' "$FILE"; then
echo "ERROR: chown patch not applied" >&2
exit 1
fi
if grep -Eq '^[[:space:]]*std::system\("systemctl --user restart BastionGuard-mailproxy\.service 2>/dev/null"\);[[:space:]]*$' "$FILE"; then
echo "ERROR: mailproxy restart patch not applied" >&2
exit 1
fi
echo "[ubuntu-lts-system-fix] Patch applied successfully"

2
debian/rules vendored
View file

@ -10,6 +10,8 @@ override_dh_auto_configure:
set -ex; \
dh_auto_configure -- \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_FLAGS="$(CFLAGS) -Wno-error=unused-result" \
-DCMAKE_CXX_FLAGS="$(CXXFLAGS) -Wno-error=unused-result" \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_INSTALL_SYSCONFDIR=/etc \
-DCMAKE_INSTALL_LOCALSTATEDIR=/var \

View file

@ -3,7 +3,7 @@
#
Name: bastionguard
Version: 1.0
Version: 1.1
Release: 1%{?dist}
Summary: BastionGuard Security Platform
@ -79,6 +79,7 @@ Transparent security control plane for Linux desktops
BastionGuard is not a "trust us" security product.
It is a security control plane for Linux desktops where every protection
mechanism is explicit, deterministic, and observable.
.
Unlike most desktop security tools, which hide decisions behind opaque
engines, cloud scoring, or silent automation, BastionGuard exposes
what is happening, why it is happening, and how protections are applied.
@ -126,38 +127,34 @@ readelf -d %{buildroot}%{_bindir}/BastionGuard | grep -q NEEDED
%files
# Binari
%{_bindir}/*
# Dati applicazione
%{_datadir}/BastionGuard
# Desktop entries
%{_datadir}/applications/BastionGuard.desktop
%{_datadir}/applications/BastionGuard-bankgui.desktop
%{_datadir}/applications/BastionGuard-secure.desktop
%{_datadir}/applications/bastionguard-bankopener.desktop
# Autostart (XDG)
%config(noreplace) %{_sysconfdir}/xdg/autostart/BastionGuard-autostart.desktop
# DBus
%{_datadir}/dbus-1/services/org.BastionGuard.RansomwareAlert.service
%{_datadir}/dbus-1/system-services/org.BastionGuard.USBD.service
%{_datadir}/dbus-1/system.d/org.BastionGuard.USBD.conf
# Polkit
%{_datadir}/polkit-1/actions/it.BastionGuard.camera.policy
%{_datadir}/polkit-1/actions/org.BastionGuard.policy
%{_datadir}/polkit-1/actions/org.BastionGuard.ransomware.policy
%{_datadir}/polkit-1/actions/org.BastionGuard.USBD.policy
# Systemd
%{_unitdir}/*
%{_userunitdir}/*
%dir %{_libexecdir}/bastionguard
%{_libexecdir}/bastionguard/archive_worker
%changelog
* Wed Jan 28 2026 BastionGuard <info@bastionguard.it> - 1.0-1
- Initial RPM package
* Fri Mar 13 2026 Calogero Scarnà <info@bastionguard.eu> - 1.1-1
- Update package, view changelog

View file

@ -556,15 +556,19 @@ set(BastionGuard_SOURCES
src/phishing_search/PhishingPage.cpp
src/phishing_search/PhishingCheckCard.cpp
)
add_executable(BastionGuard ${BastionGuard_SOURCES})
target_include_directories(BastionGuard
PRIVATE
src
src/firewall
)
target_compile_definitions(BastionGuard PRIVATE
BASTIONGUARD_VERSION="1.0"
BASTIONGUARD_BUILD=20260116
BASTIONGUARD_VERSION="1.1"
BASTIONGUARD_BUILD=20260310
)
target_link_libraries(BastionGuard
@ -958,6 +962,7 @@ install(TARGETS BastionGuard-ransomware-scanner RUNTIME DESTINATION ${CMAKE_INST
# ======================
add_executable(BastionGuard-ransomware-realtime
src/scanner-ransomware/BastionGuard-ransomware-realtime.cpp
${BG_ARCHIVE_CORE_SOURCES}
)
target_include_directories(BastionGuard-ransomware-realtime PRIVATE src)

View file

@ -6874,3 +6874,9 @@ msgstr ""
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr ""
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr ""
msgid "❌ Errore controllo cloud sconosciuto."
msgstr ""

View file

@ -1,18 +1,17 @@
# بعض العنوان الوصفي
# حقوق الطبع والنشر (C) السنة صاحب حقوق الطبع والنشر للحزمة
# يتم توزيع هذا الملف تحت نفس الرخصة مثل حزمة PACKAGE.
# المؤلف الأول <EMAIL@ADDRESS>، السنة.
# BastionGuard™ Arabic translation
# Copyright (C) 2025-2026 BastionGuard™
# This file is distributed under the same license as the BastionGuard package.
# Calogero Scarnà <info@bastionguard.eu>, 2025-2026.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"Project-Id-Version: BastionGuard 1.0\n"
"Report-Msgid-Bugs-To: info@bastionguard.eu\n"
"POT-Creation-Date: 2026-01-19 07:54+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"PO-Revision-Date: 2026-01-19 07:54+0100\n"
"Last-Translator: Calogero Scarnà <info@bastionguard.eu>\n"
"Language-Team: Arabic\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -6867,3 +6866,9 @@ msgstr "وكيل البريد"
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr "وكيل SMTP محلي لحماية البريد الإلكتروني الصادر"
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr "⏳ هناك عدد كبير جدًا من عمليات التحقق السحابية الجارية، يتم التخطي مؤقتًا."
msgid "❌ Errore controllo cloud sconosciuto."
msgstr "❌ خطأ غير معروف في التحقق السحابي."

View file

@ -1,17 +1,16 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# BastionGuard™ German translation
# Copyright (C) 2025-2026 BastionGuard™
# This file is distributed under the same license as the BastionGuard package.
# Calogero Scarnà <info@bastionguard.eu>, 2025-2026.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"Project-Id-Version: BastionGuard 1.0\n"
"Report-Msgid-Bugs-To: info@bastionguard.eu\n"
"POT-Creation-Date: 2026-01-19 07:54+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"PO-Revision-Date: 2026-01-19 07:54+0100\n"
"Last-Translator: Calogero Scarnà <info@bastionguard.eu>\n"
"Language-Team: German\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -6891,3 +6890,9 @@ msgstr "Mail-Proxy"
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr "Lokaler SMTP-Proxy zum Schutz ausgehender E-Mails"
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr "⏳ Zu viele Cloud-Prüfungen laufen gerade, wird vorübergehend übersprungen."
msgid "❌ Errore controllo cloud sconosciuto."
msgstr "❌ Unbekannter Fehler bei der Cloud-Prüfung."

View file

@ -1,18 +1,17 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# BastionGuard™ English (United States) translation
# Copyright (C) 2025-2026 BastionGuard™
# This file is distributed under the same license as the BastionGuard package.
# Calogero Scarnà <info@bastionguard.eu>, 2025-2026.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"Project-Id-Version: BastionGuard 1.0\n"
"Report-Msgid-Bugs-To: info@bastionguard.eu\n"
"POT-Creation-Date: 2026-01-19 07:54+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"PO-Revision-Date: 2026-01-19 07:54+0100\n"
"Last-Translator: Calogero Scarnà <info@bastionguard.eu>\n"
"Language-Team: English (United States)\n"
"Language: en_US\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -6892,3 +6891,9 @@ msgstr "Mail Proxy"
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr "Local SMTP proxy for outgoing email protection"
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr "⏳ Too many cloud checks in progress, temporarily skipping."
msgid "❌ Errore controllo cloud sconosciuto."
msgstr "❌ Unknown cloud check error."

View file

@ -1,17 +1,16 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# BastionGuard™ Spanish translation
# Copyright (C) 2025-2026 BastionGuard™
# This file is distributed under the same license as the BastionGuard package.
# Calogero Scarnà <info@bastionguard.eu>, 2025-2026.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"Project-Id-Version: BastionGuard 1.0\n"
"Report-Msgid-Bugs-To: info@bastionguard.eu\n"
"POT-Creation-Date: 2026-01-19 07:54+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"PO-Revision-Date: 2026-01-19 07:54+0100\n"
"Last-Translator: Calogero Scarnà <info@bastionguard.eu>\n"
"Language-Team: Spanish\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -6940,3 +6939,9 @@ msgstr "Proxy de correo"
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr "Proxy SMTP local para proteger el correo saliente"
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr "⏳ Demasiadas comprobaciones en la nube en curso, se omite temporalmente."
msgid "❌ Errore controllo cloud sconosciuto."
msgstr "❌ Error desconocido en la comprobación de la nube."

View file

@ -1,17 +1,16 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# BastionGuard™ French translation
# Copyright (C) 2025-2026 BastionGuard™
# This file is distributed under the same license as the BastionGuard package.
# Calogero Scarnà <info@bastionguard.eu>, 2025-2026.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"Project-Id-Version: BastionGuard 1.0\n"
"Report-Msgid-Bugs-To: info@bastionguard.eu\n"
"POT-Creation-Date: 2026-01-19 07:54+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"PO-Revision-Date: 2026-01-19 07:54+0100\n"
"Last-Translator: Calogero Scarnà <info@bastionguard.eu>\n"
"Language-Team: French\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -6901,3 +6900,9 @@ msgstr "Proxy de messagerie"
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr "Proxy SMTP local pour la protection des e-mails sortants"
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr "⏳ Trop de vérifications cloud en cours, saut temporaire."
msgid "❌ Errore controllo cloud sconosciuto."
msgstr "❌ Erreur inconnue lors de la vérification cloud."

View file

@ -1,17 +1,16 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# BastionGuard™ translation template
# Copyright (C) 2025-2026 BastionGuard™
# This file is distributed under the same license as the BastionGuard package.
# Calogero Scarnà <info@bastionguard.eu>, 2025-2026.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Project-Id-Version: BastionGuard 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-19 07:54+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"PO-Revision-Date: 2026-01-19 07:54+0100\n"
"Last-Translator: Calogero Scarnà <info@bastionguard.eu>\n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -6598,3 +6597,8 @@ msgstr "Mail Proxy"
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr "Proxy SMTP locale per protezione email in uscita"
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgid "❌ Errore controllo cloud sconosciuto."
msgstr "❌ Errore controllo cloud sconosciuto."

View file

@ -1,17 +1,16 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# BastionGuard™ Japanese translation
# Copyright (C) 2025-2026 BastionGuard™
# This file is distributed under the same license as the BastionGuard package.
# Calogero Scarnà <info@bastionguard.eu>, 2025-2026.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Project-Id-Version: BastionGuard 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-19 07:54+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"PO-Revision-Date: 2026-01-19 07:54+0100\n"
"Last-Translator: Calogero Scarnà <info@bastionguard.eu>\n"
"Language-Team: Japanese\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -6834,3 +6833,9 @@ msgstr "メールプロキシ"
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr "送信メール保護のためのローカル SMTP プロキシ"
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr "⏳ クラウドチェックが多すぎるため、一時的にスキップします。"
msgid "❌ Errore controllo cloud sconosciuto."
msgstr "❌ 不明なクラウドチェックエラー。"

View file

@ -1,17 +1,16 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# BastionGuard™ Dutch translation
# Copyright (C) 2025-2026 BastionGuard™
# This file is distributed under the same license as the BastionGuard package.
# Calogero Scarnà <info@bastionguard.eu>, 2025-2026.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Project-Id-Version: BastionGuard 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-19 07:54+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"PO-Revision-Date: 2026-01-19 07:54+0100\n"
"Last-Translator: Calogero Scarnà <info@bastionguard.eu>\n"
"Language-Team: Dutch\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -6777,3 +6776,9 @@ msgstr "Mail-proxy"
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr "Lokale SMTP-proxy voor bescherming van uitgaande e-mail"
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr "⏳ Te veel cloudcontroles bezig, tijdelijk overslaan."
msgid "❌ Errore controllo cloud sconosciuto."
msgstr "❌ Onbekende fout bij de cloudcontrole."

View file

@ -1,17 +1,16 @@
# JAKIŚ OPISOWY TYTUŁ
# Copyright (C) ROK POSIADACZ PRAW AUTORSKICH PAKIETU
# Ten plik jest dystrybuowany na tych samych warunkach co pakiet PACKAGE.
# PIERWSZY AUTOR <EMAIL@ADRES>, ROK.
# BastionGuard™ Polish translation
# Copyright (C) 2025-2026 BastionGuard™
# This file is distributed under the same license as the BastionGuard package.
# Calogero Scarnà <info@bastionguard.eu>, 2025-2026.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Project-Id-Version: BastionGuard 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-19 07:54+0100\n"
"PO-Revision-Date: ROK-MIES-DZIEŃ GG:MM+STREFA\n"
"Last-Translator: PEŁNE IMIĘ I NAZWISKO <EMAIL@ADRES>\n"
"Language-Team: POLSKI <LL@li.org>\n"
"PO-Revision-Date: 2026-01-19 07:54+0100\n"
"Last-Translator: Calogero Scarnà <info@bastionguard.eu>\n"
"Language-Team: Polish\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -6836,3 +6835,9 @@ msgstr "Proxy poczty"
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr "Lokalny proxy SMTP do ochrony wychodzącej poczty e-mail"
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr "⏳ Zbyt wiele kontroli chmury w toku, tymczasowo pomijam."
msgid "❌ Errore controllo cloud sconosciuto."
msgstr "❌ Nieznany błąd kontroli chmury."

View file

@ -1,18 +1,17 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# BastionGuard™ Portuguese (Portugal) translation
# Copyright (C) 2025-2026 BastionGuard™
# This file is distributed under the same license as the BastionGuard package.
# Calogero Scarnà <info@bastionguard.eu>, 2025-2026.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Project-Id-Version: BastionGuard 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-19 07:54+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: pt_BR\n"
"PO-Revision-Date: 2026-01-19 07:54+0100\n"
"Last-Translator: Calogero Scarnà <info@bastionguard.eu>\n"
"Language-Team: Portuguese (Portugal)\n"
"Language: pt_PT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -6809,3 +6808,9 @@ msgstr "Proxy de e-mail"
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr "Proxy SMTP local para proteção de e-mails enviados"
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr "⏳ Muitas verificações de nuvem em andamento, pulando temporariamente."
msgid "❌ Errore controllo cloud sconosciuto."
msgstr "❌ Erro desconhecido na verificação da nuvem."

View file

@ -1,17 +1,16 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# BastionGuard™ Russian translation
# Copyright (C) 2025-2026 BastionGuard™
# This file is distributed under the same license as the BastionGuard package.
# Calogero Scarnà <info@bastionguard.eu>, 2025-2026.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Project-Id-Version: BastionGuard 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-19 07:54+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"PO-Revision-Date: 2026-01-19 07:54+0100\n"
"Last-Translator: Calogero Scarnà <info@bastionguard.eu>\n"
"Language-Team: Russian\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -6775,3 +6774,9 @@ msgstr "Почтовый прокси"
msgid "Proxy SMTP locale per protezione email in uscita"
msgstr "Локальный SMTP-прокси для защиты исходящей почты"
msgid "⏳ Troppi controlli cloud in corso, salto temporaneamente."
msgstr "⏳ Слишком много облачных проверок выполняется, временно пропускаю."
msgid "❌ Errore controllo cloud sconosciuto."
msgstr "❌ Неизвестная ошибка при облачной проверке."

View file

@ -3,7 +3,7 @@
#
Name: bastionguard
Version: 1.0
Version: 1.1
Release: 0
Summary: BastionGuard Security Platform
License: GPL-3.0-or-later
@ -107,6 +107,7 @@ Transparent security control plane for Linux desktops
BastionGuard is not a "trust us" security product.
It is a security control plane for Linux desktops where every protection
mechanism is explicit, deterministic, and observable.
.
Unlike most desktop security tools, which hide decisions behind opaque
engines, cloud scoring, or silent automation, BastionGuard exposes
what is happening, why it is happening, and how protections are applied.
@ -183,8 +184,11 @@ readelf -d %{buildroot}%{_bindir}/BastionGuard | grep -q NEEDED
%{_unitdir}/*
%{_userunitdir}/*
%dir %{_libexecdir}/bastionguard
%{_libexecdir}/bastionguard/archive_worker
%changelog
* Wed Jan 28 2026 BastionGuard <info@bastionguard.it> - 1.0-0
- Initial openSUSE RPM packaging
* Fri Mar 13 2026 Calogero Scarnà <info@bastionguard.eu> - 1.1-1
- Update package, view changelog

View file

@ -565,8 +565,8 @@ target_include_directories(BastionGuard
)
target_compile_definitions(BastionGuard PRIVATE
BASTIONGUARD_VERSION="1.0"
BASTIONGUARD_BUILD=20260116
BASTIONGUARD_VERSION="1.1"
BASTIONGUARD_BUILD=20260310
)
target_link_libraries(BastionGuard
@ -960,6 +960,7 @@ install(TARGETS BastionGuard-ransomware-scanner RUNTIME DESTINATION ${CMAKE_INST
# ======================
add_executable(BastionGuard-ransomware-realtime
src/scanner-ransomware/BastionGuard-ransomware-realtime.cpp
${BG_ARCHIVE_CORE_SOURCES}
)
target_include_directories(BastionGuard-ransomware-realtime PRIVATE src)

View file

@ -1,4 +1,4 @@
# Maintainer: BastionGuard info@bastionguard.it
# Maintainer: BastionGuard info@bastionguard.eu
pkgname=bastionguard
pkgver=1.1

View file

@ -567,8 +567,8 @@ target_include_directories(BastionGuard
)
target_compile_definitions(BastionGuard PRIVATE
BASTIONGUARD_VERSION="1.0"
BASTIONGUARD_BUILD=20260116
BASTIONGUARD_VERSION="1.1"
BASTIONGUARD_BUILD=20260310
)
target_link_libraries(BastionGuard
@ -987,6 +987,7 @@ install(TARGETS BastionGuard-ransomware-scanner RUNTIME DESTINATION ${CMAKE_INST
# ======================
add_executable(BastionGuard-ransomware-realtime
src/scanner-ransomware/BastionGuard-ransomware-realtime.cpp
${BG_ARCHIVE_CORE_SOURCES}
)
target_include_directories(BastionGuard-ransomware-realtime PRIVATE src)

View file

@ -18,6 +18,7 @@
* The BastionGuard name and branding are not licensed under the GPL.
*/
#include "MainWindow.hpp"
#include "ClamdConfig.hpp"
#include "Resource.hpp"

View file

@ -4235,9 +4235,6 @@ void SettingsPage::build_email_security_tab() {
return row;
};
// ---------------------------------------------------------------------
// TAB GENERALE
// ---------------------------------------------------------------------
auto tab_general = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 12);
tab_general->set_margin_top(12);
tab_general->set_margin_bottom(12);
@ -4265,9 +4262,7 @@ void SettingsPage::build_email_security_tab() {
tab_general->append(*make_switch_row(_("Pubblica STARTTLS"), *swAdvertiseStartTls));
tab_general->append(*make_switch_row(_("Abilita listener TLS implicito"), *swImplicitTlsListener));
// ---------------------------------------------------------------------
// TAB FIRMA
// ---------------------------------------------------------------------
auto tab_signature = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 12);
tab_signature->set_margin_top(12);
tab_signature->set_margin_bottom(12);
@ -4331,9 +4326,6 @@ void SettingsPage::build_email_security_tab() {
s.logo_path = "/usr/share/BastionGuard/data/logo.png";
};
// ---------------------------------------------------------------------
// TAB THUNDERBIRD
// ---------------------------------------------------------------------
auto tab_thunderbird = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 12);
tab_thunderbird->set_margin_top(12);
tab_thunderbird->set_margin_bottom(12);
@ -4463,9 +4455,7 @@ void SettingsPage::build_email_security_tab() {
run_tb_installer();
});
// ---------------------------------------------------------------------
// TAB PROFILI SMTP
// ---------------------------------------------------------------------
auto tab_profiles = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 12);
tab_profiles->set_margin_top(12);
tab_profiles->set_margin_bottom(12);

View file

@ -1,3 +1,23 @@
/*
* BastionGuard
* Copyright (C) 20252026 Calogero Scarnà
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* BastionGuard is a trademark of Calogero Scarnà.
* The BastionGuard name and branding are not licensed under the GPL.
*/
#include <algorithm>
#include <cctype>
#include <cstdint>

View file

@ -1,3 +1,23 @@
/*
* BastionGuard
* Copyright (C) 20252026 Calogero Scarnà
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* BastionGuard is a trademark of Calogero Scarnà.
* The BastionGuard name and branding are not licensed under the GPL.
*/
#include "PhishingCheckCard.hpp"
#include <glibmm/i18n.h>
#include <glibmm/markup.h>

View file

@ -1,3 +1,23 @@
/*
* BastionGuard
* Copyright (C) 20252026 Calogero Scarnà
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* BastionGuard is a trademark of Calogero Scarnà.
* The BastionGuard name and branding are not licensed under the GPL.
*/
#pragma once
#include <gtkmm.h>

View file

@ -1,3 +1,23 @@
/*
* BastionGuard
* Copyright (C) 20252026 Calogero Scarnà
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* BastionGuard is a trademark of Calogero Scarnà.
* The BastionGuard name and branding are not licensed under the GPL.
*/
#include "PhishingPage.hpp"
#include <glibmm/i18n.h>

View file

@ -1,3 +1,23 @@
/*
* BastionGuard
* Copyright (C) 20252026 Calogero Scarnà
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* BastionGuard is a trademark of Calogero Scarnà.
* The BastionGuard name and branding are not licensed under the GPL.
*/
#pragma once
#include <regex>
#include <gtkmm.h>

View file

@ -1,3 +1,23 @@
/*
* BastionGuard
* Copyright (C) 20252026 Calogero Scarnà
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* BastionGuard is a trademark of Calogero Scarnà.
* The BastionGuard name and branding are not licensed under the GPL.
*/
#include "ArchiveInspector.hpp"
#include "ArchiveSandbox.hpp"

View file

@ -1,3 +1,23 @@
/*
* BastionGuard
* Copyright (C) 20252026 Calogero Scarnà
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* BastionGuard is a trademark of Calogero Scarnà.
* The BastionGuard name and branding are not licensed under the GPL.
*/
#pragma once
#include "ArchiveResult.hpp"

View file

@ -1,3 +1,23 @@
/*
* BastionGuard
* Copyright (C) 20252026 Calogero Scarnà
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* BastionGuard is a trademark of Calogero Scarnà.
* The BastionGuard name and branding are not licensed under the GPL.
*/
#pragma once
#include <string>

View file

@ -1,3 +1,23 @@
/*
* BastionGuard
* Copyright (C) 20252026 Calogero Scarnà
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* BastionGuard is a trademark of Calogero Scarnà.
* The BastionGuard name and branding are not licensed under the GPL.
*/
#include "ArchiveSandbox.hpp"
#include <array>

View file

@ -1,3 +1,23 @@
/*
* BastionGuard
* Copyright (C) 20252026 Calogero Scarnà
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* BastionGuard is a trademark of Calogero Scarnà.
* The BastionGuard name and branding are not licensed under the GPL.
*/
#pragma once
#include "ArchiveResult.hpp"