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
+44
View File
@@ -0,0 +1,44 @@
{% include "header.html" %}
<h1>
&raquo; Browsing Users,
Page: {{ current }} of {{ total }}
</h1>
{%- for u in users %}
<div class="userInfo" style=" {{ border }} ">
<img class="avatar" width="40" height="40" src="/{{ u.avatar }}"/>
<div class="name">
<strong>
<a href="/user/{{ u.name_enc }}">{{ u.name }}</a>
</strong>
</div>
<div class="info">
Images: <strong>{{ u.images }}</strong>
{%- if let Some(w) = u.website %}|
<strong><a href="{{ w }}" target="_blank">
Website
</a></strong>
{%- endif %}
</div>
<div style="clear:both;"></div>
</div>
{%- endfor %}
<div class="userInfo">
{%- if let Some(p) = prev %}
<a href="/users/page/{{ p }}" class="textPrev" title="Previous">&laquo; Previous</a>
{%- else %}
<div class="textNoPrev">&laquo; Previous</div>
{%- endif %}
{%- if let Some(n) = next %}
<a href="/users/page/{{ n }}" class="textNext" title="Next">Next &raquo;</a>
{%- else %}
<div class="textNoNext">Next &raquo;</div>
{%- endif %}
<div style="clear: both;"></div>
</div>
{% include "footer.html" %}