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
+10
View File
@@ -0,0 +1,10 @@
{% include "header.html" %}
<div class="warn"><img style="float: left; margin: 100px;" alt="404" src="/media/404.jpg"/>Broken link - no image found!<br/>
<a href="/">Go back to the main...</a></div>
{% include "footer.html" %}
+13
View File
@@ -0,0 +1,13 @@
{% include "header.html" %}
{%- if ok %}
<div class="success" style="text-align:center">
Abused. Wait for response.<br><br>
<strong>{% if let Some(r) = referer %}<a href="{{ r }}">&#187; back</a>{% endif %}</strong>
</div>
{%- else %}
<div class="warn" style="text-align:center">
Abused failed.<br><br>
<strong>{% if let Some(r) = referer %}<a href="{{ r }}">&#187; back</a>{% endif %}</strong>
</div>
{%- endif %}
{% include "footer.html" %}
+34
View File
@@ -0,0 +1,34 @@
{% include "header.html" %}
<div align="center">
<form action="/abuse" method="post">
<fieldset>
<legend>Abuse // Contact: abuse@4ducky.com</legend>
<p style="text-align:left;">Report Abuse or Request Deletion (Copyrighted Material, Pornography, Harassment) If requesting the removal of copyrighted materials, you must be the owner or legally represent the owner of said materials. Report it here:</p>
<dl class="form">
<dt>Imagelink:</dt>
<dd>
<input type="text" name="imglink" value=""/>
</dd>
<dt>Reason:</dt>
<dd>
<input type="text" name="rsn" value=""/>
</dd>
<dt>Email:</dt>
<dd>
<input type="text" name="mail" value="" />
</dd>
<dd>
<input type="submit" class="button login" name="abuse" value="Send" />
<input type="hidden" name="image" value="">
<input type="hidden" name="_csrf" value="{{ l.csrf }}">
</dd>
</dl>
</fieldset>
</form>
</div>
{% include "footer.html" %}
+83
View File
@@ -0,0 +1,83 @@
{% include "header.html" %}
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50%" valign="top">
<h2>Newest Comments:</h2>
<div style="width:100%">
{%- for c in comments %}
<div class="comment">
<div class="commentHead">
<img class="avatarSmall" width="16" height="16" src="/{{ c.avatar }}"/>
<a href="/user/{{ c.name_enc }}">{{ c.name }}</a>
at {{ c.date }}
[bild:<a href="/all/view/{{ c.keyword }}">{{ c.keyword }}</a>]
<div style="float:right;" id="del">
<a href="#" data-delcomment="{{ c.id }}">[x]</a>
</div>
</div>
{{ c.content }}
</div>
{%- endfor %}
</div></td>
<td width="50%" valign="top">
{%- 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 %}
</div>
<div style="clear:both;"></div>
</div>
{%- endfor %}
{%- else %}
<h2 style="margin:5px;" >No Spammer</h2>
{%- endif %}
{%- 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>
</div>
<div class="info">
<strong><a href="/all/view/{{ a.keyword }}" > &gt;&gt; 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>
{%- endif %}
{%- endfor %}
{%- else %}
<h2 style="margin:5px;" >No Abuses</h2>
{%- endif %}
</td>
</tr>
</table>
{% include "footer.html" %}
+11
View File
@@ -0,0 +1,11 @@
<p>
To use the remote upload just drag the following link somewhere to your bookmarks (or in Opera right click it
and choose <em>Bookmark link</em>):
&raquo; <a data-bookmarklet="1" href="javascript:void((function(){var%20e=document.createElement('script');e.setAttribute('type','text/javascript');e.setAttribute('src','{{ frontend_path }}media/post.js.php');document.body.appendChild(e)})());"><u>Post to {{ site_name }}</u></a> &laquo;
</p>
<p>
Now, if you're on a website where you see an image you want to post, just click on your newly created bookmark
and then on the image you want to post. Thats all. Really!
</p>
+31
View File
@@ -0,0 +1,31 @@
{%- if !likes.is_empty() %}
<div class="comment" style="border: 1px solid #FFD600;">
<div style="color: #FFD600;font-size: 30px;width:32px;height:32px; float: left; padding-left: 7px;">&hearts;</div>
{%- for lk in likes %}
<a title="ID: {{ lk.user_id }}" href="/user/{{ lk.name_enc }}"><img class="avatarSmall" width="32" height="32" src="/{{ lk.avatar }}"/></a>
{%- endfor %}
</div>
{%- endif %}
{%- for c in comments %}
{%- if c.blocked %}
<br/><a class="quote" style="margin-left: 5px;" href="#" data-toggle="comment{{ c.id }}"><img style="margin-right: 10px; vertical-align:middle;" height="28" width="28" src="/media/xd.png" alt="blocked"/>Comment blocked ({{ c.name }})</a>
<div style="display: none;" id="comment{{ c.id }}">
{%- endif %}
<div id="comment{{ c.id }}" class="comment"{% if c.upload.is_some() %} style="min-height:86px;"{% endif %}>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="40" valign="top"><a style="{{ c.style }}" title="ID: {{ c.user_id }}" href="/user/{{ c.name_enc }}"><img class="avatarSmall" width="32" height="32" src="/{{ c.avatar }}"/></a></td>
<td valign="top" >
<div class="info" id="unmark" style="float:right;padding-right:5px;"><a href="#content_comment" class="quote" data-requote="{{ c.id }}" data-name="{{ c.name }}">{{ c.howlong }}</a> {% if admin %}<a href="#" data-delcomment="{{ c.id }}">[x]</a>{% endif %}</div><div><a style="{{ c.style }}" title="ID: {{ c.user_id }}" href="/user/{{ c.name_enc }}">{{ c.name }}</a></div>
{%- if let Some(up) = c.upload %}
<div style="float:left;margin-right:10px;"><a href="/{{ up.0 }}" rel="lightbox[more]" title="{{ c.text }}"><img src="/{{ up.1 }}"/></a>
</div>
{%- endif %}
<div id="{{ c.id }}">{{ c.html|safe }}</div></td>
</tr>
</table>
</div>
{%- if c.blocked %}
</div>
{%- endif %}
{%- endfor %}
+14
View File
@@ -0,0 +1,14 @@
{%- for c in items %}
<div id="commentbar">
<a href="/all/view/{{ c.keyword }}">
<div id="commentimg">
<img width="28" height="28" src="/{{ c.avatar }}" />
</div>
<div id="commenttext">
<strong>{{ c.name }}: </strong>{{ c.content }}
</div>
</a>
</div>
{%- endfor %}
+39
View File
@@ -0,0 +1,39 @@
{%- if !errors.is_empty() %}
<ul>
{%- for e in errors %}
<li>{{ e|safe }}</li>
{%- endfor %}
</ul>
{%- else %}
<form id="UForm" action="/upload" method="post" enctype="multipart/form-data" >
<input type="hidden" name="_csrf" value="{{ csrf }}" />
<table width="80%" border="0" cellspacing="1px" cellpadding="0">
<tr>
<td valign="top"><strong>Rules:</strong></td>
<td style="padding-left:3px;" valign="top">Gore, CP, Spam, Nazi, Porn = Ban <br /><br />
</td>
</tr>
<tr>
<td valign="top"><strong>Image:</strong></td>
<td valign="top"><input type="file" name="image" accept="image/jpeg,image/png,image/gif" style="color: #000; background-color: #fff;"/><br /></td>
</tr>
<tr>
<td valign="top"><strong>or Url:</strong></td>
<td valign="top"><input type="text" name="url" value=""/><br /></td>
</tr>
<tr>
<td valign="top"><strong>Comment:</strong></td>
<td valign="top"><textarea id="content_comment" name="ucomment" rows="3" cols="30"></textarea><br /></td>
</tr>
<tr>
<td>&nbsp;</td>
<td align="right"><input type="submit" name="upload" value="Upload" /></td>
</tr>
</table>
<input type="hidden" id="q" value="upload" />
</form>
{%- endif %}
+19
View File
@@ -0,0 +1,19 @@
{% include "header.html" %}
<h1>&raquo; Bookmarklet</h1>
<div class="article">
<h2>{{ l.site_name }} Remote Upload</h2>
<p>
To use the remote upload just drag the following link somewhere to your bookmarks (or in Opera right click it
and choose <em>Bookmark link</em>):
&raquo; <a data-bookmarklet="1" href="javascript:void((function(){var%20e=document.createElement('script');e.setAttribute('type','text/javascript');e.setAttribute('src','{{ l.frontend_path }}media/post.js.php');document.body.appendChild(e)})());">Post to {{ l.site_name }}</a> &laquo;
</p>
<p>
Now, if you're on a website where you see an image you want to post, just click on your newly created bookmark
and then on the image you want to post. Thats all. Really!
</p>
</div>
{% include "footer.html" %}
+70
View File
@@ -0,0 +1,70 @@
{% include "header.html" %}
{%- if let Some(ub) = user_block %}
<div style="margin-left: 5px; width: 95%;">
<div style="font-size: 20px; margin-bottom: 5px; font-weight: bold;">
<a style="{{ ub.style }}" href="/user/{{ ub.name_enc }}">{{ ub.name }}</a> {{ ub.rank|safe }} {% if let Some(w) = ub.website %}- <a href="{{ w }}" target="_blank">www</a> -{% endif %}
</div>
<div style="max-width: 35em; float: left;"><img alt="{{ ub.name }}" src="/{{ ub.avatar }}"/></div>
<div id="userstats"><a href="/inbox/{{ ub.name_enc }}"><img alt="mailme" src="/media/{% if l.white %}mailme_fb.png{% else %}mailme.png{% endif %}" width="64px" height="64px"/></a></div>
<div id="userstats"><div>{{ ub.id }}</div>ID</div>
<div id="userstats"><div>{{ ub.days }}</div>Days past</div>
<div id="userstats"><div>{{ ub.images }}</div>Uploads</div>
<div id="userstats"><div>{{ ub.comments }}</div>Comments</div>
<div id="userstats"><div>{{ ub.favs }}</div>Favs</div>
</div>
{%- endif %}
<div style="clear:both;"></div>
<h1>
&raquo; Browsing
{%- if let Some(ub) = user_block %}
User: <a href="/user/{{ ub.name_enc }}">{{ ub.name }}</a>
{%- else if kind == "search" %}
Results for {{ term }},
{%- else if kind == "comments" %}
Comments ,
{%- else if kind == "favorites" %}
favorites ,
{%- else %}
All,
{%- endif %}
Page: {{ page_current }} of {{ page_total }}
{%- if kind == "comments" %}
| <strong><a href="/comments/reset?t={{ l.csrf }}">&#187; reset unread</a></strong>
{%- if unread_new > 0 %}
| <a href="/unread">&#187; newest comments ({{ unread_new }})</a> | <a href="/comments">&#187; Comments</a>
{%- endif %}
{%- endif %}
</h1>
<div id="images" style="height:{{ height }}px">
{%- if let Some(p) = prev_href %}
<a href="{{ p }}" class="prev" title="Previous" id="prevBar">Previous</a>
{%- else %}
<div class="noPrev" id="prevBar">Previous</div>
{%- endif %}
{%- if let Some(n) = next_href %}
<a href="{{ n }}" class="next" title="Next" id="nextBar">Next</a>
{%- else %}
<div class="noNext" id="nextBar">Next</div>
{%- endif %}
<noscript>
<div class="noscr">Please enable Javascript.</div>
</noscript>
<div id="imageGrid" style="height:{{ height }}px">
{%- for t in items %}
<div class="{{ t.class }}" style="left:{{ t.left }}px;top:{{ t.top }}px;">{% if t.alert %}<div class="inboxalert" style="padding:3px;" >!</div>{% endif %}<a {% if t.alert %}style="background-color:#96b2e4;" {% endif %}class="thumb" href="{{ t.href }}">{% if t.alert %}<div class="overlay"></div>{% endif %}<img src="{{ t.src }}" title="{{ t.title }}" alt="{{ t.alt }}"/></a></div>
{%- endfor %}
</div>
</div>
{% include "footer.html" %}
+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" %}
+13
View File
@@ -0,0 +1,13 @@
{% include "header.html" %}
<br/>
{%- for f in items %}
<div align="center">
<a href="/all/view/{{ f.keyword }}"><img src="{{ f.thumb }}" align="top" style="float:left;margin-right:5px;"></a>
</div>
{%- endfor %}
<div style="clear:both;"></div>
{% include "footer.html" %}
+27
View File
@@ -0,0 +1,27 @@
</div></div>
<!--
<div id="footer">&copy; 4ducky.com - a Dolan Duck Production | <a href="/impressum">Contact us</a> | <a href="/abuseform">Abuse / Request Deletion</a></div> -->
{%- if let Some(u) = l.user %}
<div id="sidebar">
<div id="top">{% if u.admin %}<a href="/manage"><img height="28" width="28" src="{% if l.white %}/media/manage-fb.png{% else %}/media/manage.png{% endif %}" alt="manage"/></a>{% endif %} <a href="#" id="loadcom"><img height="28" width="28" src="{% if l.white %}/media/refresh_fb.png{% else %}/media/refresh.png{% endif %}" alt="refresh"/></a> <a href="#" id="x"><img height="28" width="28" src="{% if l.white %}/media/xfb.png{% else %}/media/xd.png{% endif %}" alt="close"/></a></div>
<div id="rightpanel">
<noscript><div class="noscr">Please enable Javascript.</div></noscript>
<div align="center"><img alt="load" src="{% if l.white %}/media/load.gif{% else %}/media/load_b.gif{% endif %}" /></div>
</div>
<div id="bottom">
<div id="commentbar"><a href="/truhe"><div id="commentimg"><img width="28" height="28" src="/media/truhe.png" alt="Spenden"></div><div id="commenttext"><strong>4ducky.com </strong>Statistiken</div></a></div>
<script type="text/javascript" src="/random/1/128x128/"></script>
<div id="commentbar"><a target="_blank" href="http://goodius.com"><div id="commentimg"><img width="28" height="28" src="/media/forum.png" alt="Forum"></div><div id="commenttext"><strong>Goodius.com</strong> <br />für alle Hipster</div></a></div>
<div id="commentbar"><a href="http://www.facebook.com/goodius" target="_blank"><div id="commentimg"><img width="28" height="28" src="/media/fbicon.png" alt="Facebook"></div><div id="commenttext"><strong>Duckies: </strong><br /> auf Judenbuch</div></a></div>
</div>
</div>
{%- endif %}
<div><a href="#" id="footer-back-to-top"></a></div>
</body>
</html>
+127
View File
@@ -0,0 +1,127 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>{{ l.title }}</title>
<meta name="description" content="ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔ ENTE ✔"/>
<meta name="csrf-token" content="{{ l.csrf }}"/>
<link rel="icon" href="/favicon.ico"/>
{%- if l.white %}
<link rel="stylesheet" type="text/css" href="/media/styles_fb.css" />
{%- else %}
<link rel="stylesheet" type="text/css" href="/media/styles_b.css" />
{%- endif %}
<link rel="stylesheet" href="/media/lightbox/lightbox.css" type="text/css" />
<link rel="stylesheet" href="/media/4ducky.css" type="text/css" />
{%- if l.jscolor %}
<script type="text/javascript" src="/media/jscolor.js"></script>
{%- endif %}
<script type="text/javascript" src="/media/4ducky.js" defer="defer"></script>
</head>
<body{% if l.user.is_none() %} data-guest="1"{% endif %}{% if l.view_image > 0 %} data-image-id="{{ l.view_image }}"{% endif %}>
<div id="site">
<div id="menu"> <a href="/" id="logo"></a>
{%- if let Some(u) = l.user %}
<div id="MenuLoad"{% if !l.upload_errors.is_empty() %} data-error="1"{% endif %}>
<div id="UploadD"><div style="float:right;margin:5px;"><img data-action="close-upload" src="/media/close.png" /></div><div id="UploadD_d">
{%- if !l.upload_errors.is_empty() %}
<ul>
{%- for msg in l.upload_errors %}
<li>{{ msg|safe }}</li>
{%- endfor %}
</ul>
{%- else %}
<div style="margin-top:12px;text-align:center;" id="UbLoad">
<div align="center">
<img src="/media/load_b.gif" />
</div>
</div>
{%- endif %}
</div>
</div>
</div>
<div id="MenuRightBlock"></div>
<div class="menuItems">
<a href="#" data-menu="upload">Upload</a> <a href="#" data-menu="addon">Addon</a> <a href="/truhe">Truhe</a> <a href="/fame">HoD</a>
</div>
<div class="menuItems2"><a id="nigger" href="/logout?t={{ l.csrf }}" original-title="Hello World"><img width="28" height="28" src="/media/logout{{ l.b }}.png" /></a></div>
<div class="menuItems2"><a href="/profile"><img width="28" height="28" src="/media/profile{{ l.b }}.png" /></a></div>
<div class="menuItems2"><a href="/favorites"><img width="28" height="28" src="/media/p{{ l.b }}.png" /></a></div>
<div class="menuItems2">
{%- if u.unread_msgs > 0 %}
<div class="inboxalert">{{ u.unread_msgs }}</div>
{%- endif %}
<div><a href="/inbox"><img width="28" height="28" src="/media/n{{ l.b }}.png" /></a></div>
</div>
<div class="menuItems2">
{%- if u.unread_count > 0 %}
<div class="inboxalert"> {{ u.unread_count }}</div>
<a data-hover="Last5Div" href="/unread" ><img width="28" height="28" src="/media/w{{ l.b }}.png" /></a>
{%- else %}
<a href="/comments" ><img width="28" height="28" src="/media/w{{ l.b }}.png" /></a>
{%- endif %}
</div>
<div id="Last5Div" class="Last5Div" data-hover="Last5Div">
{%- for c in u.unread %}
<a href="/all/view/{{ c.keyword }}">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr height="45px">
<td valign="middle" align="left" width="45px"><img width="40" height="40" src="{{ c.thumb }}" /></td>
<td align="left"><strong>Image:</strong><br />{{ c.short }}</td>
</tr>
</table>
</a>
{%- endfor %}
<div style="text-align:right;padding:2px;">
<a href="/comments/reset?t={{ l.csrf }}">&#187; reset unread</a>
<a href="/unread">&raquo; watch all</a>
</div>
</div>
<div class="menuItems2">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" valign="middle" ><a href="#" id="del_cookie"><img title="Reload page, activate sidebar" width="28" height="28" src="/{{ u.avatar }}" /></a></td>
<td align="center" valign="middle"><a href="/user/{{ u.name_enc }}">{{ u.name }}</a></td>
</tr>
</table>
</div>
{%- else %}
<div class="menuItems2">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" valign="middle" ><a href="/impressum"><img title="contact" width="28" height="28" src="/media/mailme.png" alt="login"/></a></td>
<td align="center" valign="middle"><a href="/impressum">Contact</a></td>
</tr>
</table>
</div>
<div class="menuItems2">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" valign="middle" ><a href="/register"><img title="Register" width="28" height="28" src="/media/register_fb.png" alt="register"/></a></td>
<td align="center" valign="middle"><a href="/register">Register</a></td>
</tr>
</table>
</div>
<div class="menuItems2">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" valign="middle" ><a href="/login"><img title="Login" width="28" height="28" src="/media/login_fb.png" alt="login"/></a></td>
<td align="center" valign="middle"><a href="/login">Login</a></td>
</tr>
</table>
</div>
{%- endif %}
<div style="clear:both;"></div>
</div>
<div id="content">
<div class="alert" id="dolan">
{%- if l.user.is_some() %}{{ l.message|safe }} <img style="float: right;" id="stfu" height="16" width="16" src="{% if l.white %}/media/xfb.png{% else %}/media/xd.png{% endif %}" alt="close"/>
{%- else %}Dolan: "Hate annoying advertisements? <a href="/register">Register now for free</a> to have them removed!" Like us on <a href="http://www.facebook.com/fuehls">Facebook.com</a>
{%- endif %}</div>
+49
View File
@@ -0,0 +1,49 @@
{% include "header.html" %}
<div align="center">
<fieldset>
<legend>About</legend>
<img id="ownerboy" height="20%" width="20%" style="float: right;" src="/media/andrew.jpeg" alt="Admin"/>
<table width="500" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="112" valign="top">Owner:</td>
<td width="388"><strong>
<p>&nbsp;</p>
</strong></td>
</tr>
<tr>
<td>Email:</td>
<td><a href="mailto:support@4ducky.com">support@4ducky.com</a></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Rules </td>
<td>1.) No underaged people / no cp / no illustration with naked kids</td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>2.) No gore / dead people / dead animals</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Saw something like this?</td>
<td><a href="/abuseform">Please request deletion</a></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
</fieldset>
</div>
{% include "footer.html" %}
+71
View File
@@ -0,0 +1,71 @@
{% 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" %}
+70
View File
@@ -0,0 +1,70 @@
{% include "header.html" %}
<br/><br/>
<table class="duckytable" align="center" width="800px" border="0" cellspacing="0" cellpadding="0">
<caption>Conversation with:</caption>
<tr>
<td width="400px" style="border-bottom: 0;">
<div class="userInfo" style=" {{ border }}">
<img class="avatar" width="60" height="60" src="/{{ avatar }}"/>
<div class="name">
<strong>
<a href="/user/{{ name_enc }}">{{ name }}</a>
</strong>
</div>
<div class="info">
ID: <strong>{{ id }}</strong> /
Images: <strong>{{ images }}</strong>
{%- if let Some(w) = website %}/
<strong><a href="{{ w }}" target="_blank">
Website
</a></strong>
{%- endif %}
<br /><br />
</div>
</div>
</td>
</tr>
</table>
<div align="center">
<div class="comment" style=" {{ border }}margin:5px; text-align:left;width:700px;color:#333">
<strong>Message to {{ name }}:</strong>
<form method="post" class="addComment" action="/inbox/{{ name_enc }}">
<div>
<input type="hidden" name="_csrf" value="{{ l.csrf }}"/>
<textarea name="content" rows="6" cols="93"></textarea><br />
<input class="submit" type="submit" name="addComment" value="Submit Message"/>
</div>
</form>
</div>
{%- for s in messages %}
<div class="comment" style=" margin:5px; text-align:left;width:700px;{{ s.border }}">
<div class="commentHead">
<a href="/user/{{ s.from_enc }}">{{ s.from_name }}</a>
at {{ s.date }}
</div>
<hr style=" {{ s.border }} width: 99%;">
{{ s.body|safe }}
</div>
{%- else %}
No messages found. <hr style="background-color:#d2d9e7;">
{%- endfor %}
</div> <br/>
{% include "footer.html" %}
+44
View File
@@ -0,0 +1,44 @@
{% include "header.html" %}
<div align="center">
<form action="/login" method="post">
<fieldset>
<legend>Invites</legend>
<dl class="form">
<dt>Info:</dt>
<dd>
-Invitemissbrauch führt zum Ban. (Keine Reaktivierung) / Darunter fällt auch einem gebannten User einen Invite zu geben.
</dd>
<dt></dt>
<dd>-Nutzt die Invites weise. Baut euer Gast groben Unfug, seid ihr auch weg.</dd>
<dt>Howto:</dt>
<dd>Einfach den Link weiterschicken.</dd>
</dl>
<table class="table" width="100%" border="0" cellspacing="0">
<tr class="tabletop">
<td align="center" class="tabletoptd"><strong>InviteCode</strong></td>
<td align="center" class="tabletoptd" width="100px"><strong>Used</strong></td>
</tr>
{%- for i in invites %}
<tr class="tablelist">
<td align="center" class="tabletd">
{%- if i.used_by.is_none() %}
<strong><a href="{{ l.frontend_path }}invites/{{ i.code }}">{{ i.code }}</a></strong>
{%- else %}
{{ i.code }}
{%- endif %}
</td>
<td align="center" class="tabletd" width="50px">{% if let Some(n) = i.used_by %}{{ n }}{% else %}no{% endif %}</td>
</tr>
{%- else %}
<td align="center" class="tabletd">Zurzeit keine Invites für dich</td>
<td class="tabletd"></td>
{%- endfor %}
</table>
</fieldset>
</form>
</div>
{% include "footer.html" %}
+47
View File
@@ -0,0 +1,47 @@
{% include "header.html" %}
<div align="center">
<form action="/login" method="post">
<input type="hidden" name="_csrf" value="{{ l.csrf }}"/>
<fieldset>
<legend>Login</legend>
{%- if wrong_login %}
<div class="warn">
Wrong user or password!
</div>
{%- endif %}
{%- if let Some(reason) = banned %}
<div class="warn">
Account banned!<br /> {% if reason.len() > 2 %}Grund: {{ reason }}{% endif %}
</div>
{%- endif %}
<dl class="form">
<dt>Name:</dt>
<dd>
<input type="text" name="name" value="{{ name }}"/>
</dd>
<dt>Passwort:</dt>
<dd>
<input type="password" name="pass" />
</dd>
<dt>&nbsp;</dt>
<dd>
<input class="check" type="checkbox" name="remember" id="inputRemember" value="1"/>
<label for="inputRemember">Remember me!</label>
</dd>
<dt>&nbsp;</dt>
<dd>
<input type="submit" class="button login" name="login" value="Login" />
</dd>
</dl>
Don't have an account yet? <a href="/register">Register!</a>
</fieldset>
</form>
</div>
{% include "footer.html" %}
+79
View File
@@ -0,0 +1,79 @@
{% 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" %}
+159
View File
@@ -0,0 +1,159 @@
{% include "header.html" %}
<div align="center">
<form action="/profile" enctype="multipart/form-data" method="post">
<input type="hidden" name="_csrf" value="{{ l.csrf }}"/>
<fieldset>
<legend>Change Profile</legend>
{%- if m.pass_short %}
<div class="warn">Your password must be at least 6 characters long!</div>
{%- endif %}
{%- if m.pass_not_equal %}
<div class="warn">Your both passwords are not equal!</div>
{%- endif %}
{%- if m.avatar_failed %}
<div class="warn">Your avatar Image could not be processed!</div>
{%- endif %}
{%- if m.color_failed %}
<div class="warn">Not a valid colorcode!</div>
{%- endif %}
<dl class="form">
<dt>Passwort:</dt>
<dd>
<input type="password" name="cpass" /> (leave empty, if you don't want to change it)
</dd>
<dt>(Repeat)</dt>
<dd>
<input type="password" name="cpass2" />
</dd>
{%- if !has_email %}
<dt>E-Mail:</dt>
<dd>
<input type="text" name="email" />
</dd>
{%- endif %}
<dt>Website:</dt>
<dd>
<input type="text" name="website" value="{{ website }}"/>
</dd>
<dt>Avatar:</dt>
<dd>
<input type="file" name="avatar" accept="image/jpeg,image/png,image/gif" style="color: #000; background-color: #fff;"/><br/>
</dd>
<dt>Color:</dt>
<dd>
<input class="color" maxlength="6" type="text" name="color" value="{{ color }}" style="width:100px;"/> (default:: 000000)
<br/>
</dd>
<dt>Style:</dt>
<dd>
<select name="stylecolor">
{%- if style == "white" %}<option value="white">White</option><option value="black">Black</option>{% else %}<option value="black">Black</option><option value="white">White</option>{% endif %}
</select>
</dd>
<dt>&nbsp;</dt>
<dd>
<input type="submit" name="save" class="button" value="Save" />
</dd>
</dl>
</fieldset>
</form>
<form action="/profile" enctype="multipart/form-data" method="post">
<input type="hidden" name="_csrf" value="{{ l.csrf }}"/>
<fieldset>
<legend>Block user</legend>
{%- if m.blocked %}
<div class="success">User blocked!</div>
{%- endif %}
{%- if m.block_failed %}
<div class="warn">Could not block user!</div>
{%- endif %}
{%- if m.block_already %}
<div class="warn">User already blocked!</div>
{%- endif %}
{%- if m.user_failed %}
<div class="warn">User not found!</div>
{%- endif %}
{%- if m.unblocked %}
<div class="success">User unblocked!</div>
{%- endif %}
{%- if m.unblock_failed %}
<div class="warn">Could not unblock user!</div>
{%- endif %}
{%- if m.not_blocked %}
<div class="warn">User not blocked!</div>
{%- endif %}
<dl class="form">
{%- for b in blocked %}
<div style="text-align:left" class="userInfo">
<img class="avatar" width="40" height="40" src="/{{ b.avatar }}"/>
<div class="name">
<strong>
<a href="/user/{{ b.name_enc }}">{{ b.name }}</a>
</strong>
</div>
<div class="info">
Images: <strong>{{ b.images }}</strong>
</div>
<div style="clear:both;"></div>
</div>
{%- else %}
<div class="success">No users blocked!</div>
{%- endfor %}
<dt>User:</dt>
<dd>
<input type="text" name="blockuser" />
</dd>
<dt>&nbsp;</dt>
<dd>
<input type="submit" name="block" class="button" value="Block" />
</dd>
<dt>User:</dt>
<dd>
{%- if !blocked.is_empty() %}
<select name="unblockuser">
<option value="select">Select user</option>
{%- for b in blocked %}
<option value="{{ b.name }}">{{ b.name }}</option>
{%- endfor %}
</select>
{%- else %}No user blocked!{% endif %}
</dd>
<dt>&nbsp;</dt>
<dd>
<input type="submit" name="unblock" class="button" value="Unblock" />
</dd>
</dl>
</fieldset>
</form>
</div>
{% include "footer.html" %}
+76
View File
@@ -0,0 +1,76 @@
{% include "header.html" %}
<h1>
&raquo; Quicktagger
</h1>
<div class="article" id="quickTagIntro">
<h2>Quick tagging?</h2>
<p>
This special site automatically searches for images which are in desperate need of getting tagged.
That is: new images without any or very few tags.
</p>
<p>
This site is carefully designed to allow efficient tagging of images. You don't have to move your hands
away from the keyboard - just write and press enter for the next image. Make sure javascript is
enabled in your browser, or you wont see anything.
</p>
<h2>A few words about tagging</h2>
<p>
If you are unsure what tags to write, just imagine you are searching for this image - what word(s) would you
search for?
</p>
<p>
Also, is there any written text on the image itself? Try to write only the most essential words down. For instance
if you see a motivational with the text:
</p>
<blockquote>
<strong>Huddle House</strong><br/>
For those times when Waffle House isn't quite white trashy enough
</blockquote>
<p>
good tags for this image would be "<em>motivational huddle house white trash</em>"
</p>
<p>
If you don't know what to write, just press enter to skip the image.
</p>
<p>
<strong>Don't abuse the system in any way, or the wrath of the administrator will come done on you!</strong>
</p>
<h2><a href="#" data-action="quicktag-start"> &raquo; I get it, let's start already!</a></h2>
</div>
<div id="viewer" class="hidden">
<div id="imageInfo">
<div>
location: <a id="imageLocation" href="#"></a>
</div>
<div>
<div>
Tags: <span id="tags"></span>
</div>
<form class="visible" id="addTag" action="">
<input type="text" name="tags" id="tagText"/>
<input type="hidden" id="imageId" name="imageId" value="0"/>
<input type="hidden" id="logId" name="logId" value="0"/>
<input type="button" name="save" value="Add Tags" class="button" data-action="quicktag"/>
</form>
</div>
</div>
<div id="imageContainer">
<img id="image" class="scaled" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
</div>
<br/>
</div>
{% include "footer.html" %}
+84
View File
@@ -0,0 +1,84 @@
{% include "header.html" %}
<div align="center">
<form action="/register" method="post">
<input type="hidden" name="_csrf" value="{{ l.csrf }}"/>
<fieldset>
<legend>Create Account</legend>
{%- if m.name_in_use %}
<div class="warn">This Username is {% if invite.is_some() %}allready{% else %}already{% endif %} registered!</div>
{%- endif %}
{%- if m.name_invalid %}
<div class="warn">Your name must be at least 2 characters long an may not have any special characters!</div>
{%- endif %}
{%- if m.pass_short %}
<div class="warn">Your password must be at least 6 characters long!</div>
{%- endif %}
{%- if m.pass_not_equal %}
<div class="warn">Your both passwords are not equal!</div>
{%- endif %}
{%- if m.email_in_use %}
<div class="warn">There is already a registered user with this E-Mail address!</div>
{%- endif %}
{%- if m.wrong_email %}
<div class="warn">Your E-Mail address seems to be invalid!</div>
{%- endif %}
{%- if m.captcha_inc %}
<div class="warn">Incorrect Captcha!</div>
{%- endif %}
<dl class="form">
<dt>{% if invite.is_some() %}Name:{% else %}Username:{% endif %}</dt>
<dd>
<input type="text" name="name" value="{{ name }}"/>
Only letters and numbers; at least 2 characters long{% if invite.is_none() %}; no spaces{% endif %}
</dd>
<dt>E-Mail:</dt>
<dd>
<input type="text" name="email" value="{{ email }}"/>
Must be valid!
</dd>
<dt>Password:</dt>
<dd>
<input type="password" name="pass" class="pass"/>
</dd>
<dt>(Repeat)</dt>
<dd>
<input type="password" name="pass2" class="pass"/>
</dd>
{%- if let Some(code) = invite %}
<dt>Invitecode: </dt>
<dd>
<div style="padding:5px;">
{{ code }}
<input type="hidden" name="invite" value="{{ code }}"/>
</div>
</dd>
{%- endif %}
<dt>Captcha{% if invite.is_none() %}:{% endif %}</dt>
<dd>
<img src="/captcha/{{ captcha }}.png" width="180" height="56" alt="captcha" style="vertical-align:middle;"/><br/>
<input type="hidden" name="captcha_id" value="{{ captcha }}"/>
<input type="text" name="captcha" autocomplete="off" maxlength="5"/>
</dd>
<dt>&nbsp;</dt>
<dd>
<input type="submit" name="register" class="button register" value="Register" />
</dd>
</dl>
</fieldset>
</form>
</div>
{% include "footer.html" %}
+16
View File
@@ -0,0 +1,16 @@
{% include "header.html" %}
<div align="center">
<fieldset>
<legend>Register</legend>
<dl class="form">
<dd>Registration is closed at the moment. Like us on Facebook to stay up2date:</dd>
<dd><br /></dd>
<dd><a href="http://www.facebook.com/4duckie" target="_blank">facebook.com/4duckie</a></dd>
</dl>
</fieldset>
</div>
{% include "footer.html" %}
+7
View File
@@ -0,0 +1,7 @@
{% include "header.html" %}
<div class="article">
<h2>Account successfully created</h2>
<p>You can now login.</p>
</div>
{% include "footer.html" %}
+46
View File
@@ -0,0 +1,46 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>{{ site_title }}</title>
<link rel="stylesheet" type="text/css" href="/media/{% if white %}styles_fb.css{% else %}styles_b.css{% endif %}" />
<link rel="Shortcut Icon" href="/media/favicon.ico"/>
<script type="text/javascript" src="/media/remotepost.js" defer="defer"></script>
</head>
<body style="margin: 0.2em 1em 0 1em; padding: 0;">
<h1 class="remotePost">4ducky.com - One click Uploader</h1>
{%- if status == "login" %}
<form action="/remotepost.php" method="post">
<em>Name:</em>
<input type="text" name="name" style="width: 80px; margin-right: 10px" value="{{ name }}"/>
<em>Passwort:</em>
<input type="password" style="width: 80px; margin-right: 10px" name="pass" />
<input type="submit" class="button login" name="login" value="Login" />
<input type="hidden" name="remember" value="1"/>
<input type="hidden" name="url" value="{{ url }}"/>
<input type="hidden" name="_csrf" value="{{ csrf }}"/>
</form>
{%- else if status == "ready" %}
<p>Please click on the image you want to publish on {{ site_name }}.com!</p>
<p><strong>Rules:</strong> Gore, CP, Spam (no Thread) = Ban</p>
{%- else if status == "confirm" %}
<p><img src="{{ url }}" style="max-width:200px;max-height:120px;float:right;margin-left:10px;" alt=""/>Post this image to {{ site_name }}.com?</p>
<form action="/remotepost.php" method="post">
<input type="hidden" name="url" value="{{ url }}"/>
<input type="hidden" name="_csrf" value="{{ csrf }}"/>
<input type="submit" class="button" name="post" value="Post" />
</form>
<p><strong>Rules:</strong> Gore, CP, Spam (no Thread) = Ban</p>
{%- else if status == "failed" %}
<p>Sorry, the Image could not be posted for the following reason:</p>
<p><strong>{% for e in errors %}{{ e|safe }} {% endfor %}</strong></p>
{%- else %}
<p id="RP_Success">Image posted! Thank you!</p>
{%- endif %}
</body>
</html>
+247
View File
@@ -0,0 +1,247 @@
{% include "header.html" %}
<div align="center" style="margin-top: 25px; margin-bottom: 25px;">
<table class="duckytable" width="600px" cellspacing="0" cellpadding="0">
<caption>4ducky.com Finances:</caption>
<tr>
<td>Current 4ducky balance:</td>
<td><strong>20,00 Euro</strong></td>
</tr>
<tr>
<td colspan="2"><div class="meter"><span style="width: 50%">50 % achieved</span></div></td>
</tr>
<tr>
<td colspan="2" style="text-align:left;">
Jeder User hat die Möglichkeit 4ducky.com mit Spenden zu unterstützen. Der 4ducky.com Server kostet derzeit 30 Euro im Monat.
Wer etwas beisteuern möchte, der schickt einfach einen <a href="https://www.amazon.de/gp/product/BT00DHI7XI">Amazon-Gutschein</a> (bitte auf eure E-Mail Adresse und nur den Code per PN) an den User "<a href="http://www.4ducky.com/inbox/Pandora">Pandora</a>" oder spendet via Bitcoin an 13wcgskYqQ2L4cPtV6TJHyfzrQ8NT5Zt9e. Spender werden hier geehrt:
</td>
</tr>
<tr>
<td colspan="2"><strong>Last activities & donations:</strong></td>
</tr>
</table>
<table class="duckytable" width="600px" cellspacing="0" cellpadding="0">
<tr>
<td style="width: 40%;"><strong>Date</strong></td>
<td style="width: 40%;"><strong>Activity / Feeler</strong></td>
<td style="width: 40%;"><strong>Amount</strong></td>
</tr>
</table>
<div id="spendenducks">
<table class="duckytable" width="600px" cellspacing="0" cellpadding="0">
<tr class="spender">
<td>Oktober 2015</td>
<td><a href="/user/Pulvertoastmann">Pulvertoastmann</a></td>
<td>+ 10,00 Euro</td>
</tr>
<tr class="spender">
<td>Oktober 2015</td>
<td><a href="/user/nadjer">nadjer</a></td>
<td>+ 20,00 Euro</td>
</tr>
<tr class="kosten">
<td>Oktober 2015</td>
<td>Server-Miete</td>
<td>- 30,00 Euro</td>
</tr>
<tr class="spender">
<td>September 2015</td>
<td><a href="/user/Moses">Moses</a></td>
<td>+ 10,00 Euro</td>
</tr>
<tr class="kosten">
<td>September 2015</td>
<td>Server-Miete</td>
<td>- 30,00 Euro</td>
</tr>
<tr class="kosten">
<td>August 2015</td>
<td>Server-Miete</td>
<td>- 30,00 Euro</td>
</tr>
<tr class="spender">
<td>August 2015</td>
<td>Anonym</td>
<td>+ 30,00 Euro</td>
</tr>
<tr class="kosten">
<td>Juli 2015</td>
<td>Server-Miete</td>
<td>- 30,00 Euro</td>
</tr>
<tr class="spender">
<td>Juni 2015</td>
<td><a href="/user/DerFickNigger">DerFickNigger</a></td>
<td>+ 10,00 Euro</td>
</tr>
<tr class="spender">
<td>Juni 2015</td>
<td><a href="/user/waluri">waluri</a></td>
<td>+ 10,00 Euro</td>
</tr>
<tr class="spender">
<td>Juni 2015</td>
<td><a href="/user/Kastritis">Kastritis</a></td>
<td>+ 17,00 Euro</td>
</tr>
<tr class="spender">
<td>Juni 2015</td>
<td><a href="/user/BASEDGOD">BASEDGOD</a></td>
<td>+ 10,00 Euro</td>
</tr>
<tr class="kosten">
<td>Juni 2015</td>
<td>Server-Miete</td>
<td>- 30,00 Euro</td>
</tr>
<tr class="kosten">
<td>Mai 2015</td>
<td>Server-Miete</td>
<td>- 30,00 Euro</td>
</tr>
<tr class="spender">
<td>April 2015</td>
<td><a href="/user/DerFickNigger">DerFickNigger</a></td>
<td>+ 25,00 Euro</td>
</tr>
<tr class="kosten">
<td>April 2015</td>
<td>Server-Miete</td>
<td>- 30,00 Euro</td>
</tr>
<tr class="spender">
<td>März 2015</td>
<td><a href="/user/AntraX">AntraX</a></td>
<td>+ 88,00 Euro</td>
</tr>
<tr class="kosten">
<td>März 2015</td>
<td>Server-Miete</td>
<td>- 30,00 Euro</td>
</tr>
<tr class="spender">
<td>Februar 2015</td>
<td><a href="/user/Ahmed">Ahmed</a></td>
<td>+ 50,00 Euro</td>
</tr>
<tr class="kosten">
<td>März 2015</td>
<td>Server-Miete</td>
<td>- 30,00 Euro</td>
</tr>
<tr class="spender">
<td>Januar 2015</td>
<td><a href="/user/FG">FG</a></td>
<td>+ 30,00 Euro</td>
</tr>
<tr class="spender">
<td>Januar 2015</td>
<td><a href="/user/Nadjer">Nadjer</a></td>
<td>+ 10,00 Euro</td>
</tr>
<tr class="kosten">
<td>Januar 2015</td>
<td>Server-Miete</td>
<td>- 30,00 Euro</td>
</tr>
<tr class="spender">
<td>Dezember 2014</td>
<td><a href="/user/Kastritis">Kastritis</a></td>
<td>+ 11,00 Euro</td>
</tr>
<tr class="spender">
<td>Dezember 2014</td>
<td>vergessen wer</td>
<td>+ 10,00 Euro</td>
</tr>
<tr class="spender">
<td>Juli 2014</td>
<td><a href="/user/RoterIndianer">RoterIndianer</a></td>
<td>+ 40,00 Euro</td>
</tr>
<tr class="spender">
<td>Juli 2014</td>
<td><a href="/user/Seine_Durchlaucht">Seine_Durchlaucht</a></td>
<td>+ 10,00 Euro</td>
</tr>
<tr class="spender">
<td>Juli 2014</td>
<td><a href="/user/Napalm">Napalm</a></td>
<td>+ 10,00 Euro</td>
</tr>
<tr class="spender">
<td>Juni 2014</td>
<td><a href="/user/Sozialfall">Sozialfall</a></td>
<td>+ 20,00 Euro</td>
</tr>
<tr class="spender">
<td>Dezember 2013</td>
<td><a href="/user/IchHab4Euro">IchHab4Euro</a></td>
<td>+ 4,00 Euro</td>
</tr>
<tr class="spender">
<td>Dezember 2013</td>
<td><a href="/user/FG">FG</a></td>
<td>+ 25,00 Euro</td>
</tr>
<tr class="spender">
<td>Dezember 2013</td>
<td><a href="/user/Kastritis">Kastritis</a></td>
<td>+ 10,00 Euro</td>
</tr>
<tr class="spender">
<td>Oktober 2013</td>
<td><a href="/user/Hitler">Hitler</a></td>
<td>+ 20,00 Euro</td>
</tr>
<tr class="spender">
<td>September 2013</td>
<td><a href="/user/Pandora">Pandora</a></td>
<td>+ 20,00 Euro</td>
</tr>
<tr class="kosten">
<td>September 2013</td>
<td>Server-Miete</td>
<td>- 20 Euro</td>
</tr>
</table>
</div>
<br/><br/>
<table class="duckytable" width="600px" cellspacing="0" cellpadding="0">
<caption>4ducky.com Statistics:</caption>
<tr>
<td>Images:</td>
<td>{{ img }} Images</td>
<td>~ {{ self.per_user(img) }} Images/User</td>
</tr>
<tr>
<td>User:</td>
<td>{{ duckys }} Duckies</td>
<td>{{ banned }} Banned Duckies</td>
</tr>
<tr>
<td>Comments:</td>
<td>{{ comm }} Comments</td>
<td>~ {{ self.per_user(comm) }} Comments/User</td>
</tr>
<tr>
<td>Likes:</td>
<td>{{ fav }} Likes</td>
<td>~ {{ self.per_user(fav) }} Likes/User</td>
</tr>
</table>
</div>
{% include "footer.html" %}
+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" %}
+182
View File
@@ -0,0 +1,182 @@
{% include "header.html" %}
<h1> &raquo; Viewing
{%- if let Some(cu) = ctx_user %}
User: <a href="/user/{{ cu.1 }}">{{ cu.0 }}</a>
{%- else %}
: {{ pname }}, uploaded {{ howlong }}
{%- endif %} ({{ date }})
</h1>
<div id="viewer">
{%- if let Some(p) = prev_href %}
<a href="{{ p }}" class="prev" id="prevBar" title="Previous">Previous</a>
{%- else %}
<div class="noPrev" id="prevBar">Previous</div>
{%- endif %}
{%- if let Some(n) = next_href %}
<a href="{{ n }}" class="next" id="nextBar" title="Next">Next</a>
{%- else %}
<div class="noNext" id="nextBar">Next</div>
{%- endif %}
<div id="imageContainer">
{%- if logged_in %}
<img class="scaled" id="image" src="{{ image_src }}" alt="{{ pname }}"/>
{%- else %}
<a href="/register"><img id="image" src="/images/gate.png" alt="register"/></a><br />
{%- endif %}
</div>
<div id="imageInfo">
<div class="userInfo">
<img class="avatar" width="50" height="50" alt="Avatar" src="/{{ up_avatar }}"/>
{%- if logged_in %}
<a style="font-size: 45px; float:right;margin-top:-9px;" href="#" data-fav="{{ image_id }}"><img name="img1" class="duckfav" src="/media/ducksw.png" alt="fav" height="64px" width="64px"/></a>
{%- endif %}
<div class="name"><strong><a title="ID: {{ up_id }} | Images: {{ up_images }}" style="{{ up_style }}" href="/user/{{ up_enc }}">{{ up_name }}</a> </strong>
{{ rank|safe }}
</div>
{%- if logged_in %}
<div class="info"><a class="smalllink" href="#" data-toggle="MessageForm">message</a> | <a href="#CommentForm">comment</a> | {% else %} <div class="info">{% endif %}<a class="smalllink" href="#" data-toggle="ShareForm">share</a> | <a target="_blank" href="{{ search_link }}">search</a> | <a target="_blank" href="{{ edit_link }}">edit</a> | <a href="#" data-toggle="AbuseForm">abuse</a></div>
{%- if admin %}
<div class="info" style="font-size: 14px; border:dotted 1px #666;float:left;padding:1px; margin-top:8px;">Score: {{ score }} |
{% if superadmin %} <a href="#" data-admin="fame" data-id="{{ image_id }}">HoF</a> | <a href="#" data-admin="ban" data-id="{{ up_id }}">Ban</a> | {% endif %}<a href="#" data-admin="timeblock" data-id="{{ up_id }}">TimeBlock User</a> | <a href="#" data-admin="close" data-id="{{ image_id }}">Close Thread</a> | <a href="#" data-admin="delete" data-id="{{ image_id }}">Delete Pic</a></div>
{%- endif %}
</div>
{%- if admin %}
<br/>
{%- endif %}
<div style="clear: both;"></div>
<div id="AbuseForm" style="display: none">
<div class="comment">
<form action="/abuse" method="post">
<dl class="form">
<dt>Reason:</dt>
<dd>
<input type="text" name="rsn" value=""/>
</dd>
<dt>Email:</dt>
<dd>
<input type="text" name="mail" value="" />
</dd>
<dt>&nbsp;</dt>
<dd>
<input type="submit" class="submit" name="abuse" value="Send" />
<input type="hidden" name="image" value="{{ image_id }}"/>
<input type="hidden" name="_csrf" value="{{ l.csrf }}"/>
</dd>
</dl>
</form>
</div>
</div>
<div id="FavDiv" class="comment" style="display:none"> </div>
<div id="MessageForm" style="display:none">
<div class="comment">
Send:
<form method="post" class="addComment" action="/inbox/{{ up_enc }}">
<div>
<input type="hidden" name="_csrf" value="{{ l.csrf }}"/>
<input name="title" /><br />
<textarea name="content" rows="3" cols="40"></textarea><br />
<input class="submit" type="submit" name="addComment" value="Submit"/>
</div>
</form>
</div>
</div>
<div id="ShareForm" style="display:none">
<div class="comment">
Link:<br/> <input type="text" readonly="1" value="{{ share_link }}" style="width: 400px; font-size:10px" data-select="1"/>
<br />
Forum-Code: <input type="text" readonly="1" value="{{ forum_code }}" style="width: 400px; font-size:10px" data-select="1"/>
<br />
HTML-Code: <input type="text" readonly="1" value="{{ html_code }}" style="width: 400px; font-size:10px" data-select="1"/>
</div>
</div>
<div class="comments">
<div id="cmts">
<noscript>
<div class="noscr">Please enable Javascript.</div>
</noscript>
<div align="center">
<img src="{% if l.white %}/media/load.gif{% else %}/media/load_b.gif{% endif %}" />
</div>
</div>
{%- if logged_in && comment_open %}
<div class="comment">
<noscript>
<div class="noscr">Please enable Javascript.</div>
</noscript>
<div class="noscr" id="CommentError" style="display:none"></div>
<form method="post" class="addComment" id="CommentForm" enctype="multipart/form-data" action="{{ form_action }}">
<input type="hidden" name="_csrf" value="{{ l.csrf }}"/>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
{%- if let Some(lines) = spam %}
<td colspan="2"><div class="comment">
{%- for line in lines %}{% if !loop.first %}<br>{% endif %}{{ line|safe }}{% endfor %}
</div></td>
{%- else %}
<td width="40" valign="top"><img class="avatarSmall" width="32" height="32" src="/{{ my_avatar }}"/></td>
<td valign="top" >
&#187; BB-Codes: <a class="quote" href="#" data-bbcode="img">[img]</a> <a class="quote" href="#" data-bbcode="link">[link]</a> <a class="quote" href="#" data-bbcode="spoiler">[spoiler]</a> <a class="quote" href="#" data-bbcode="youtube">[youtube]</a>
<div id="ImgFile" style="display:none">
<input type="file" id="image_comment" name="image_comment" value="" style="color: #000; background-color: #fff; border:1px solid #bdc7d8;"/>
<input type="text" id="url_comment" name="url_comment" value="http//URL Upload" />
</div>
<textarea name="content" id="content_comment" rows="6" cols="53"></textarea></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input id="SubBut" class="submit" type="button" name="addComment" value="Submit Comment" data-image-id="{{ image_id }}"/>
<div style="text-align:center;display:none" id="SubLoad">
<div align="center">
<img src="{% if l.white %}/media/load.gif{% else %}/media/load_b.gif{% endif %}" />
</div>
</div>
</td>
{%- endif %}
</tr>
</table>
<div> </div>
</form>
</div>
{%- else %}
<div class="comment">
{%- if comment_open %}
Register to comment...
{%- else %}
Comments are closed!
{%- endif %}
</div>
{%- endif %}
</div>
</div>
</div>
{% include "footer.html" %}