forked from 4ducky/4ducky
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>
80 lines
2.3 KiB
HTML
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 }}"> >> 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" %}
|