Files
kibiandClaude Opus 5.5 d0f2d526df 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>
2026-10-17 02:15:05 +02:00

72 lines
1.4 KiB
HTML

{% include "header.html" %}
{%- if user_not_found %}
<div class="warn">
<ul>
<li class="error">User not found.</li>
</ul>
</div>
{%- endif %}
{%- if user_blocked %}
<div class="warn">
<ul>
<li class="error">User blocked you.</li>
</ul>
</div>
{%- endif %}
<br/><br/>
<table class="duckytable" align="center" width="800px" border="0" cellspacing="0" cellpadding="0">
<caption>Messages:</caption>
{%- for c in convos %}
<tr>
<td width="400px">
<div class="userInfo" style="margin:5px;min-height:40px;{{ c.border }}" >
<img class="avatar" width="40" height="40" src="/{{ c.avatar }}"/>
<div class="name">
<strong>
<a href="/inbox/{{ c.name_enc }}">{{ c.name }}</a>
</strong>
</div>
<div class="info">
ID: <strong>{{ c.id }}</strong> /
Images: <strong>{{ c.images }}</strong>
{%- if let Some(w) = c.website %}/
Website: <strong><a href="{{ w }}" target="_blank">
{{ w }}
</a></strong>
{%- endif %}
{%- if !c.title.is_empty() %}
/ Subject: <strong> {{ c.title|safe }}
</strong><br />
{%- endif %}
</div>
</div>
</td>
</tr>
{%- else %}
<tr>
<td width="400px">
<div class="userInfo" style="border:1px solid #d2d9e7;padding:8px;">
Your inbox is empty.
</div>
</td>
</tr>
{%- endfor %}
</table> <br/>
{% include "footer.html" %}