security: Implement static translation injection for zero-JS Tor compatibility

This commit is contained in:
thePR0M3TH3AN committed 2026-03-13 15:52:35 -04:00
1 parent d22fb0c9bd
commit 1783d55973
4 files changed
+83 -69

No files matched your search

Binary file not shown.
+33 -33
View File
@@ -331,10 +331,10 @@
<div class="left-tear-offs">
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>Use Tor Browser</span><br><br>
<span>to help spread this message go to</span><br>
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>click the button below to print</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -343,10 +343,10 @@
<!-- Repeat for other tear-offs -->
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>Use Tor Browser</span><br><br>
<span>to help spread this message go to</span><br>
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>click the button below to print</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -354,10 +354,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>Use Tor Browser</span><br><br>
<span>to help spread this message go to</span><br>
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>click the button below to print</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -365,10 +365,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>Use Tor Browser</span><br><br>
<span>to help spread this message go to</span><br>
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>click the button below to print</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -376,10 +376,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>Use Tor Browser</span><br><br>
<span>to help spread this message go to</span><br>
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>click the button below to print</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -387,10 +387,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>Use Tor Browser</span><br><br>
<span>to help spread this message go to</span><br>
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>click the button below to print</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -398,10 +398,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>Use Tor Browser</span><br><br>
<span>to help spread this message go to</span><br>
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>click the button below to print</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -409,10 +409,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>Use Tor Browser</span><br><br>
<span>to help spread this message go to</span><br>
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>click the button below to print</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -420,10 +420,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>Use Tor Browser</span><br><br>
<span>to help spread this message go to</span><br>
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>click the button below to print</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -431,10 +431,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>Use Tor Browser</span><br><br>
<span>to help spread this message go to</span><br>
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>click the button below to print</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -465,14 +465,14 @@ Join us in a revolution that values truth and transparency. Together, we can bui
</div>
<hr>
<div class="footer">
<p class="credit"><span data-i18n="web.built_with">built with</span> <a href="https://github.com/PR0M3TH3AN/VoxVera">voxvera</a></p>
<p class="credit"><span>built with</span> <a href="https://github.com/PR0M3TH3AN/VoxVera">voxvera</a></p>
<p class="binary" id="binary-message">0110010 0101011 0110010 0111101 0110100</p>
</div>
</div>
</div>
<div class="button-bar">
<button class="print-button" onclick="window.print()" data-i18n="web.print_button">Print Flyer</button>
<a class="download-button" href="download/voxvera-portable.zip" download data-i18n="web.download_button">Download</a>
<button class="print-button" onclick="window.print()">Print this page</button>
<a class="download-button" href="download/voxvera-portable.zip" download>Download Tool & Source</a>
<select class="lang-select" id="lang-selector" onchange="setLanguage(this.value)"></select>
</div>
</body>
+17 -3
View File
@@ -360,7 +360,14 @@ def build_assets(
html = html.replace("{{locales}}", json.dumps(all_locales))
# Statically replace {{placeholders}} for Tor JS-disabled compatibility
# 1. Statically replace localization tokens {{t_web_...}}
# This ensures the flyer is translated even with JS disabled.
lang_data = all_locales.get(data.get("lang", "en"), all_locales.get("en", {}))
web_tokens = lang_data.get("web", {})
for token, translation in web_tokens.items():
html = html.replace(f"{{{{t_web_{token}}}}}", str(translation))
# 2. Statically replace config placeholders {{key}}
for key, value in data.items():
html = html.replace(f"{{{{{key}}}}}", str(value))
@@ -736,10 +743,17 @@ def build_site():
html = html.replace("{{locales}}", json.dumps(all_locales))
# Update relative path for download
# 1. Statically replace localization tokens (Default to EN for initial state)
lang_data = all_locales.get("en", {})
for category in ["web", "landing"]:
tokens = lang_data.get(category, {})
for token, translation in tokens.items():
html = html.replace(f"{{{{t_{category}_{token}}}}}", str(translation))
# 2. Update relative path for download
html = html.replace("download/download.zip", "download/voxvera-portable.zip")
# Inject site-specific config data
# 3. Inject site-specific config data
for key, value in data.items():
html = html.replace(f"{{{{{key}}}}}", str(value))
+33 -33
View File
@@ -331,10 +331,10 @@
<div class="left-tear-offs">
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>{{t_web_tear_off_tor_browser}}</span><br><br>
<span>{{t_web_tear_off_desc}}</span><br>
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>{{t_web_tear_off_footer}}</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -343,10 +343,10 @@
<!-- Repeat for other tear-offs -->
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>{{t_web_tear_off_tor_browser}}</span><br><br>
<span>{{t_web_tear_off_desc}}</span><br>
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>{{t_web_tear_off_footer}}</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -354,10 +354,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>{{t_web_tear_off_tor_browser}}</span><br><br>
<span>{{t_web_tear_off_desc}}</span><br>
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>{{t_web_tear_off_footer}}</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -365,10 +365,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>{{t_web_tear_off_tor_browser}}</span><br><br>
<span>{{t_web_tear_off_desc}}</span><br>
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>{{t_web_tear_off_footer}}</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -376,10 +376,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>{{t_web_tear_off_tor_browser}}</span><br><br>
<span>{{t_web_tear_off_desc}}</span><br>
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>{{t_web_tear_off_footer}}</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -387,10 +387,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>{{t_web_tear_off_tor_browser}}</span><br><br>
<span>{{t_web_tear_off_desc}}</span><br>
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>{{t_web_tear_off_footer}}</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -398,10 +398,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>{{t_web_tear_off_tor_browser}}</span><br><br>
<span>{{t_web_tear_off_desc}}</span><br>
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>{{t_web_tear_off_footer}}</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -409,10 +409,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>{{t_web_tear_off_tor_browser}}</span><br><br>
<span>{{t_web_tear_off_desc}}</span><br>
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>{{t_web_tear_off_footer}}</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -420,10 +420,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>{{t_web_tear_off_tor_browser}}</span><br><br>
<span>{{t_web_tear_off_desc}}</span><br>
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>{{t_web_tear_off_footer}}</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -431,10 +431,10 @@
</div>
<div class="tear-off">
<div class="tear-off-text">
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
<span>{{t_web_tear_off_tor_browser}}</span><br><br>
<span>{{t_web_tear_off_desc}}</span><br>
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
<span data-i18n="web.tear_off_footer">click the button below to print</span>
<span>{{t_web_tear_off_footer}}</span>
</div>
<div class="qr-code">
<img src="qrcode-tear-offs.png" alt="QR Code">
@@ -458,14 +458,14 @@
</div>
<hr>
<div class="footer">
<p class="credit"><span data-i18n="web.built_with">built with</span> <a href="https://github.com/PR0M3TH3AN/VoxVera">voxvera</a></p>
<p class="credit"><span>{{t_web_built_with}}</span> <a href="https://github.com/PR0M3TH3AN/VoxVera">voxvera</a></p>
<p class="binary" id="binary-message">{{binary_message}}</p>
</div>
</div>
</div>
<div class="button-bar">
<button class="print-button" onclick="window.print()" data-i18n="web.print_button">Print Flyer</button>
<a class="download-button" href="download/download.zip" download data-i18n="web.download_button">Download</a>
<button class="print-button" onclick="window.print()">{{t_web_print_button}}</button>
<a class="download-button" href="download/download.zip" download>{{t_web_download_button}}</a>
<select class="lang-select" id="lang-selector" onchange="setLanguage(this.value)"></select>
</div>
</body>