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

80 lines
2.3 KiB
HTML

{% include "header.html" %}
<br />
<table align="center" class="duckytable" width="800px" cellspacing="0" cellpadding="0">
<caption>Spammer / Abuse:</caption>
<tr>
<td style="width:50%;">
{%- if !spammers.is_empty() %}
<h2 style="margin:5px;" >Newest Spammer:</h2>
{%- for u in spammers %}
<div class="userInfo" style="margin:5px;">
<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">
ID: <strong>{{ u.id }}</strong> /
Images: <strong>{{ u.images }}</strong>
{%- if let Some(w) = u.website %}/
Website: <strong><a href="{{ w }}" target="_blank">
{{ w }}
</a></strong>
{%- endif %}
{%- if let Some(until) = u.until %}/ Bis:{{ until }}<br>Grund: {{ u.reason }}{% endif %}{% if can_unblock %} / <a href="/manage/free/{{ u.id }}?t={{ l.csrf }}">Unblock</a>{% endif %}
</div>
<div style="clear:both;"></div>
</div>
{%- endfor %}
{%- else %}
<h2 style="margin:5px;" >No Spammer atm</h2>
{%- endif %}</td>
<td style="width:50%;">
{%- if !abuses.is_empty() %}
<h2 style="margin:5px;" >Newest Abuses:</h2>
{%- for a in abuses %}
{%- if let Some(t) = a.thumb %}
<div class="userInfo" style="margin:5px;">
<img style="float:left; margin:2px;" width="64" height="64" src="{{ t }}"/>
<div class="info">
Reason: <strong>{{ a.reason }}</strong> /
Email: <strong>{{ a.email }}</strong>
{%- if let Some(n) = a.user_name %}<br>User:<strong>{{ n }}</strong>{% endif %}
<br><a href="/manage/del/{{ a.id }}?t={{ l.csrf }}">Delete Abuse</a>
</div>
<div class="info">
<strong><a href="/all/view/{{ a.keyword }}"> &gt;&gt; Zum Thread</a> </strong>
</div>
<div style="clear:both;"></div>
</div>
{%- else %}
<div class="userInfo" style="padding:5px;">
{% if let Some(h) = a.imagelink_href %}<a href="{{ h }}" rel="nofollow noopener">{{ a.imagelink }}</a>{% else %}{{ a.imagelink }}{% endif %}<br>
Reason: <strong>{{ a.reason }}</strong> /
Email: <strong>{{ a.email }}</strong>
</div>
<div class="userInfo" style="padding:5px;">
<a href="/manage/del/{{ a.id }}?t={{ l.csrf }}">Löschen</a>
</div>
{%- endif %}
{%- endfor %}
{%- else %}
<h2 style="margin:5px;">No Abuses</h2>
{%- endif %}
</td>
</tr>
</table>
{% include "footer.html" %}