Port 4ducky to Rust (Axum + SQLite)

Same design, layout, URLs and features as the PHP version: browse grid,
image view with AJAX comments, BBCode, likes, uploads (file, URL and
bookmarklet), quicktagger, profile, block list, inbox, invites, Hall of
Ducks, Truhe, abuse reports and the admin tools.

- Parameterized SQL, escaped templates (askama), argon2 passwords,
  server-side sessions, CSRF tokens on every write, strict script CSP
- SSRF-safe remote image fetching, magic-byte upload checks
- Self-hosted captcha replaces reCAPTCHA v1; analytics/social widgets removed
- Vanilla JS replaces jQuery and its plugins with the same DOM behaviour
- Reverse proxy support (frontend_path, trust_proxy, secure_cookies)
- Admin CLI: admin, settings, invites

See README.md for running it and the full list of changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-17 02:15:05 +02:00
co-authored by Claude Opus 5.5
parent 664d8c6117
commit d0f2d526df
56 changed files with 11133 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
{% include "header.html" %}
{%- if kind == "chat" %}
<div align="center">
{%- if url.is_empty() %}
<div class="comment" style="width:800px;text-align:center;">The chat is currently offline.</div>
{%- else %}
<iframe src="{{ url }}" width="800" height="500"></iframe>
{%- endif %}
</div>
{%- else if kind == "forum" %}
<div align="center" style="margin-top: 2px; margin-bottom: 25px;">
{%- if url.is_empty() %}
<div class="comment" style="width:800px;text-align:center;">The forum is currently offline.</div>
{%- else %}
<iframe src="{{ url }}" width="848" height="1200" frameborder="0"></iframe>
{%- endif %}
</div>
{%- else %}
<div align="center" style="margin-top: 10px; margin-bottom: 25px;">
{%- if url.is_empty() %}
<div class="comment" style="width:800px;text-align:center;">The shop is currently closed.</div>
{%- else %}
<iframe height="1800" width="848" src="{{ url }}" name="Spreadshop" id="Spreadshop" frameborder="0"></iframe>
{%- endif %}
</div>
{%- endif %}
{% include "footer.html" %}