From c3e0c8660451146d733a4a7647f85b5ceb932779 Mon Sep 17 00:00:00 2001 From: jornmann Date: Sun, 25 Sep 2022 12:32:03 +0300 Subject: [PATCH] update --- 404.png | Bin 0 -> 3912 bytes api.php | 42 +++++---- creds.php | 5 +- css/style.css | 220 ++++++++++++++++++++++++++++++++++++++----- image_proxy.php | 54 +++++++++++ index.php | 47 +++++++-- messages.txt | 2 +- oldapi.php | 39 ++++++++ oldindex.php | 60 ++++++++++++ post.php | 29 +++++- schema.sql | 3 +- templates/footer.php | 6 +- templates/header.php | 10 +- video-file.png | Bin 0 -> 5677 bytes 14 files changed, 450 insertions(+), 67 deletions(-) create mode 100644 404.png create mode 100644 image_proxy.php create mode 100644 oldapi.php create mode 100644 oldindex.php create mode 100644 video-file.png diff --git a/404.png b/404.png new file mode 100644 index 0000000000000000000000000000000000000000..53d78695cfee8144432b59c21f68dec4574a3124 GIT binary patch literal 3912 zcmV-O54Z4%P)006cK1^@s6UOEX>4Tx04R}tkv&MmKpe$iQ>A`X9PA+CkfAzR5L?7it5Adrp;l;qmz@OibnNH0Uhls^O8!K(hil#;!BMz&YPWeK{ zW0mt3XRTai&3p0}26Ot#GS_L2B7sFLL4pVcRg_SMjR>teDHc++AMfBFas3jx6mpfo z$gzM5G{~+W{11M2YvrR;UQ#d)biX*x#~2XU1sXNS`95}>#tGnm2Cnp$zfuQgK1r{& zwD1uyxD8xfw=`uBxZDATpA6ZQUCB>V$mfCgGy0}1Fmwy_t$DpQ_i_3Fq^Yaq4RCM> zj29?-y~DeE+I#!=OtZfqz&diqZyNuq00006VoOIv00000008+zyMF)x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<_QcBBOV0xg2?~?02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{01Y5XL_t(|+U=cRXcXrf#-G`>id{`EB1%Ycp%;a;Fy)xq!d2_ ziU3lH)v~0XcrKT-e6Lt6k_{S?N zM(BVsk)~<3V}N0tP9=abfsZ*L6$$vl=7P)tW9V*`JO6yXeb>K)AykngN&_(W)n*iT z{~~q!+*g|$KP16@cs(AG_T3(vUm?{9p4Xx!C>W&ySls=K>rOZ8Oslp;_F>kZA2PdO z+(PIzkMjzj8H_=xzRFPT5|o0-7nk|f2_g{02|mBVtq5?U z?q}DQ))$j1Si}k3z|yQuKi~^0ls9ucJ4j@PUbFrA?Sj4y!!(1?EqqqnMA7-I+%L!w z>(+520iYFxQGzdMs8z$KLcRhh1CFS=TOhznu6(U71V6)YitvRa{3g-;e5ry(z!6RE zoeVlt1W*XRX1ScqJWU3aNe=&&q1uYuuYu`QknqJ_ZqGld;a92y%7)Ks7$-=;olg0& zSaOjIyZLPxelcBL0b&e`B2}>QZWuRCYuuk7A(*#gDT2ITT3-7VX zhL8Y88B~*-O@n}3CWHh~fkbXH2)nb&f{;Z>1PYHZhi9)45lb zq@vPsae`2!vyF>t@XU@OpU)=;z{KZ|eddd5*Q$A|@5k9S z-2fsQ#@&D{%l)JRsA-xdZ1t~;u4k7wxoIzq)v#HI77B&XsU6d>|nD;dp`PfRxnz>tCzG#p-MXb50TA#4_MEq_JTA*{0Cb^|N{R9N{o{j$1E zu4e>K281fy58yy_B*U@HJEm2IUIM7d1zkUcX2|~i`dhG?4MK-y9FZY7K&SHyK9TjR z`?oueAl;7+s5s1q>B~n!gGUF92z+k7WbX8dN~+)^fDv#$FD@wpqDuG(U`)cUolDj~ zYt9I!s$2XCV8HPC`Jh3!?S=uul-m!Oi}eyEsfLga7(fSy{l|w?Ldap506I1*$Ex); zLg;sqA`D2%wJ;no0IJVH}_%fFS_WDV$*i&p21? z<`@ZJh~TUTGHz~XCe8&@48ciITyNL1J7>Gw+6Z96f$^HdF$8v*BLNH$&?rpr z1)T>Hz=(%(hF~hOK*|W+oC%@$Bjr@|B&&)ifRxgToB&cvMF1(KIV1t3977~CL=!+t zX&y)bDWza?AUYwsaN$D3Yy0=_SDOD3z=Y|_l`FO|HFG#W!ZJfJa+bbayu{0azLx_01KvVzF4^kbrq84D<07>RisLtX#3az17*Q{`b=8sIW7Nex`{8 z(5{oC1YbQkRW~y_VKdn50BircJk{2#b)2gJ?}H0t*Qyr^h9Ag&F$7W|S*V@`JgyU8OFaoM~lWGp; zwD>TFRuNS}tZr+Bw+f}TZO^R6To;BM`qP< zzAoQd8XZNpqXQFdZ8b3JGRf7d4mQ!&hL@(N@wbTyK+|k<%W7Vk?dZ^96s@kC6?};u zhKYhihGhP0F`ZWLMwLnh|9<`Tnsxv2>#xrsFaTH(9F{SIFYf|CI$+4%&$3C8R>Ld*|}+&hD(<&p}oC55@Eg` z*jz3rr7&6M*8$4VpICkt9E?&H-gCnB1-g*n`*RRK!GiUJ0C!grA8^fl^zJ`Z~v9Pd! zH{N&y-+ue89`cM=vq(F3=blcd@$=6=1js*YMQ3EZ?@s4>)RXuc5}>j=RQ6@j%+rI#l=O8 zjg29j&7!5H1pqKNH&=5^WH1D4BWoIiga+qP}f z!_9*S4;t2c;e{6(s@p&R{L@iqitbC+F^5Sa!ym@+K9P$;);dZ7Or=uj?d`=MfBXRe zc>MS=e)!=BY+6P=a;ifABaA5=n&4GJBQ)n zVRUwOV%M%+Si5#D&YU@e!-o%}tE&rLU0v9+WeWxd2GHK#j-H+#?A^P!!38@yI&kvj zNem7SVrFIr8#ZjfzJ2?!di84IeaSjzSvqjw07ea8m;Czcul2vb`|dleTer?NOirfA zM85D8L`uQ$gix;Lc4gh3#rpxN2AJ%ClzDF;0i=8dEYKo^q6i>G04a(9QUs8q?DRh> WY6yPvhrX`>0000 -{ - "posts": [ -intval($res["PostID"]), "username"=>$res["Username"], "time"=>$res["Time"], "message"=>str_replace("\r", "", $res["Message"]), "imageURL"=>test_input($res["ImageURL"]))); } + +echo json_encode(array("posts"=>$posts), JSON_PRETTY_PRINT); ?> - ] -} diff --git a/creds.php b/creds.php index 8ecdac6..45b0edc 100644 --- a/creds.php +++ b/creds.php @@ -1,9 +1,10 @@ diff --git a/css/style.css b/css/style.css index 7fc6a07..1b72da1 100644 --- a/css/style.css +++ b/css/style.css @@ -1,16 +1,57 @@ +/* colorscheme independent rules */ body { - background-color: #D0D0D0; font-family: monospace; + margin: 0; + padding: 0; + padding-bottom: 5px; + width: 70%; + margin: auto; + box-shadow: 0px 0px 15px #000000; +} +@media screen and (max-width: 1200px) { + body { + width: 80%; + } +} +@media screen and (max-width: 900px) { + body { + width: 100%; + } +} +img.image { + max-width: 100%; } table, th, td { - border: 1px solid #000000; - background-color: #EEEEEE; font-size: 10pt; margin: auto; } +input { + font-family: monospace; +} +.navbar { + padding: 3px; + font-size: 15pt; +} .logotable { border: 0px; - background-color: #D0D0D0; +} +span.message { + white-space: pre-line; + text-overflow: ellipsis; + overflow-wrap: break-word; + max-width: 100%; +} +hr { + border: 0px none #000000; + border-top: 1px solid #EEEEEE; + margin: 5px; +} +div.message { + margin: 5px; + padding: 5px; + width: fit-content; + max-width: 100%; + display: block; } .center { margin: auto; @@ -18,36 +59,167 @@ table, th, td { .text-center { text-align: center !important; } -.navbar { - border: 1px solid #000000; - background-color: #EEEEEE; - padding: 3px; -} a { text-decoration: none; + transition: 0.1s; +} +.navbar { + border: 0; + position: -webkit-sticky; /* safari */ + position: sticky; + top: 0; + box-shadow: 0px 0px 5px #000000; + height: fit-content; + padding: 0; +} +.navbutton { + border-top: 0px; + border-bottom: 0px; + height: 100%; + padding: 5px; + padding-top: 0px; + padding-bottom: 0px; + transition: 0.1s; + vertical-align: middle; } -span#id { - color: #2c49c9 !important; +/* light theme fallback */ +html { + background-color: #c0c0c0; } -span#name{ +body { + background-color: #D0D0D0; +} +table, th, td { + border: 1px solid #000000; + background-color: #EEEEEE; +} +.navbar { + border-bottom: 1px solid #000000; + background-color: #EEEEEE; +} +.navbutton { + color: #000000; + border: 1px solid #000000; +} +.navbutton:hover { + color: #ffffff; + background-color: #000000; +} +.navbutton:first-of-type:not(#floatright) { + border-left: 1px solid #000000; + border-right: 0px; +} +.navbutton:last-of-type#floatright { + border-left: 0px solid #000000; + border-right: 1px solid #000000; +} +.logotable { + background-color: #D0D0D0; +} + +span.id { + color: #2c49c9; +} +span.name{ color: #1c8757; } -span#date { +span.date { color: #727272; } -span#message { - color: #000000; - white-space: pre-line; - text-overflow: ellipsis; - overflow-wrap: break-word; - max-width: 100%; +a.sharebutton { + color: #727272; } -div#message { +a.sharebutton:hover { + color: #000000; +} +span.you { + color: #373737; +} +span.message { + color: #000000; +} +div.message { background-color: #EEEEEE; border: 1px solid #000000; - padding: 5px; - width: fit-content; - max-width: 100%; - display: block; +} +textarea, input { + background-color: #ffffff; + border: 1px solid #000000; + color: #000000; +} + +/* dark theme */ +@media (prefers-color-scheme: dark) { + html { + background-color: #101010; + } + body { + background-color: #141414; + color: #ffffff; + } + a { + color: #4fb1dc; + } + a:hover { + color: #89cff0; + } + table, th, td { + border: 1px solid #111111; + background-color: #1f1f1f; + } + .navbar { + border-bottom: 1px solid #111111; + background-color: #1f1f1f; + } + .navbutton { + color: #ffffff; + border: 1px solid #111111; + } + .navbutton:hover { + color: #000000; + background-color: #ffffff; + } + .navbutton:first-of-type:not(#floatright) { + border-left: 1px solid #111111; + border-right: 0px; + } + .navbutton:last-of-type#floatright { + border-left: 0px solid #111111; + border-right: 1px solid #111111; + } + .logotable { + background-color: #00000000; + } + + span.id { + color: #1f8fb9; + } + span.name{ + color: #55bb84; + } + span.date { + color: #727272; + } + a.sharebutton { + color: #727272; + } + a.sharebutton:hover { + color: #ffffff; + } + span.you { + color: #c0c0c0; + } + span.message { + color: #ffffff; + } + div.message { + background-color: #1f1f1f; + border: 1px solid #111111; + } + textarea, input { + background-color: #1f1f1f; + border: 1px solid #111111; + color: #ffffff; + } } diff --git a/image_proxy.php b/image_proxy.php new file mode 100644 index 0000000..5506aa1 --- /dev/null +++ b/image_proxy.php @@ -0,0 +1,54 @@ + $lh) return false; + return substr($haystack, 0, $ln) == $needle; +} + +$i = @$_GET["i"]; +if (!isset($_GET["i"])) { + http_response_code(400); + die("no image url"); +} +$c = curl_init($i); +curl_setopt($c, CURLOPT_FOLLOWLOCATION, false); + +$clear = false; +$buffer = array(); +curl_setopt($c, CURLOPT_HEADERFUNCTION, function($c, $h) { + global $clear, $buffer; + if (!$clear) { + if (str_starts_with(strtolower($h), "content-type:")) { + $i = explode(" ", str_replace("\r\n", "", $h)); + if (str_starts_with($i[count($i) - 1], "image/")) { + $clear = true; + for($j = 0; $j < count($buffer); $j++) { + header($buffer[$j]); + } + header($h); + } elseif (str_starts_with($i[count($i) - 1], "video/")) { + header("Location: /rautafarmi/video-file.png"); + die(); + } else { + http_response_code(302); + header("Location: /rautafarmi/404.png"); + die(); + } + } + else array_push($buffer, $h); + } + else header($h); + return strlen($h); +}); +curl_exec($c); +if (curl_error($c) != "") { + http_response_code(302); + header("Location: /rautafarmi/404.png"); +} +curl_close($c); diff --git a/index.php b/index.php index 548ec79..bdb32a7 100644 --- a/index.php +++ b/index.php @@ -1,4 +1,20 @@ + + +
@@ -13,6 +29,12 @@ + + + +
image URL + +
action @@ -26,19 +48,28 @@ "; - echo "".$res['PostID']." "; + echo "
"; + echo " ".$res['PostID']." "; if(empty($res['Username'])) { - echo "Anonymous "; + echo "Anonymous"; } else { - echo "".$res['Username']." "; + echo "".$res['Username'].""; } - echo "".$res['Time']."
"; - echo "".$res['Message'].""; - echo "

"; + echo " "; + if($_SERVER["HTTP_X_FORWARDED_FOR"] == $res["IP"]) { + echo "(you) "; + } + /*echo "
";*/ + echo "
"; + /*echo "
";*/ + if(! empty($res['ImageURL'])) { + echo "
"; + } + echo "".htmlspecialchars($res['Message']).""; + echo ""; } ?> diff --git a/messages.txt b/messages.txt index 896175d..d589297 100644 --- a/messages.txt +++ b/messages.txt @@ -1,7 +1,7 @@ Hello! If you are reading this message, it means you are using an outdated rautafarmi client. As of 2022-09-07, rautafarmi has stopped using the old messages.txt method for retrieving messages. -An alternative will be released soon. To continue using the original rautafarmi, set your instance to +New clients should add support for the JSON API. To continue using the original rautafarmi, set your instance to https://donut.gq/old-rautafarmi. --jornmann, donut.gq and rautafarmi sysop diff --git a/oldapi.php b/oldapi.php new file mode 100644 index 0000000..674f60a --- /dev/null +++ b/oldapi.php @@ -0,0 +1,39 @@ + +{ + "posts": [ + + ] +} diff --git a/oldindex.php b/oldindex.php new file mode 100644 index 0000000..c037ba7 --- /dev/null +++ b/oldindex.php @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + +
username + 30 char limit +
message + +
image URL + +
action + +
+ +
+
+"; + echo " ".$res['PostID']." "; + if(empty($res['Username'])) { + echo "Anonymous"; + } else { + echo "".$res['Username'].""; + } + echo " "; + if($_SERVER["HTTP_X_FORWARDED_FOR"] == $res["IP"]) { + echo "(you) "; + } + /*echo "
";*/ + echo "".$res['Time']."
"; + /*echo "
";*/ + if(! empty($res['ImageURL'])) { + echo "
"; + } + echo "".htmlspecialchars($res['Message']).""; + echo "
"; +} +?> + + diff --git a/post.php b/post.php index af48fbd..02cd3f7 100644 --- a/post.php +++ b/post.php @@ -1,22 +1,45 @@ you have been banned from posting on rautafarmi!"; +$backbutton = "
[ back ]"; + if(isset($_POST['message'])) { $username = mysqli_real_escape_string($mysqli, $_POST['username']); $message = mysqli_real_escape_string($mysqli, $_POST['message']); + $imgurl = mysqli_real_escape_string($mysqli, $_POST['imgurl']); if(empty($message)) { - die("cannot post empty message!"); + die("cannot post empty message!".$backbutton); } - $mysqli->query("INSERT INTO posts (username, message, ip) VALUES('" . $username . "', '" . $message . "', '" . $_SERVER["HTTP_X_FORWARDED_FOR"] . "')"); + if($_SERVER["HTTP_X_FORWARDED_FOR"] == "37.139.53.81") { + die($banmessage."

Reason: spam

.$backbutton"); + } + + if($username == "Crytoinimi") { + die($banmessage."

Reason: spam

.$backbutton"); + } + if($username == "Tookdono") { + echo "

success

"; + echo "

done

"; + header("Location: index.php"); + exit(); + } + + $mysqli->query("INSERT INTO posts (username, message, ip, imageurl) VALUES('" . $username . "', '" . $message . "', '" . $_SERVER["HTTP_X_FORWARDED_FOR"] . "', '" . $imgurl . "')"); + //$stmt->bind_param("sis", $username, $message); + //$stmt->execute(); echo "

success

"; header("Location: index.php"); +} else { + echo "

fail! no message!

"; } -echo "

done

"; ?> diff --git a/schema.sql b/schema.sql index 386048a..44804b4 100644 --- a/schema.sql +++ b/schema.sql @@ -3,5 +3,6 @@ CREATE TABLE IF NOT EXISTS posts ( Username VARCHAR(30), IP VARCHAR(100) NOT NULL, Time TIMESTAMP, - Message VARCHAR(1000) + Message VARCHAR(1000), + ImageURL VARCHAR(100) ); diff --git a/templates/footer.php b/templates/footer.php index 7bd0e82..70f2efb 100644 --- a/templates/footer.php +++ b/templates/footer.php @@ -1,9 +1,9 @@
-

made with love, php, blood, sweat, and tears. lots of tears.

-

-

(c) donut.gq and contributors 2022

+

[ api ] [ e-mail ] [ privacy policy ]

+

(c) donut.gq 2022

+ diff --git a/templates/header.php b/templates/header.php index 6f3c79e..ee72da9 100644 --- a/templates/header.php +++ b/templates/header.php @@ -7,12 +7,12 @@ +
diff --git a/video-file.png b/video-file.png new file mode 100644 index 0000000000000000000000000000000000000000..1d41b087c6a6e9dbe1758462d02c2e09323dc293 GIT binary patch literal 5677 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