From 5af448bbd6ec98a990f1137d25fb78fca82b155a Mon Sep 17 00:00:00 2001 From: pezcurrel Date: Sat, 18 Nov 2023 21:55:08 +0100 Subject: [PATCH] First commit --- README.md | 29 ++++++ css/main.css | 233 ++++++++++++++++++++++++++++++++++++++++++++ imgs/icon-16.png | Bin 0 -> 2716 bytes imgs/icon-180.png | Bin 0 -> 6177 bytes imgs/icon-192.png | Bin 0 -> 6606 bytes imgs/icon-32.png | Bin 0 -> 735 bytes imgs/icon-512.png | Bin 0 -> 26274 bytes imgs/ogimage.png | Bin 0 -> 28798 bytes index.php | 205 ++++++++++++++++++++++++++++++++++++++ lib/ckratelimit.php | 36 +++++++ lib/ght.php | 50 ++++++++++ sec/.htaccess | 2 + 12 files changed, 555 insertions(+) create mode 100644 README.md create mode 100644 css/main.css create mode 100644 imgs/icon-16.png create mode 100644 imgs/icon-180.png create mode 100644 imgs/icon-192.png create mode 100644 imgs/icon-32.png create mode 100644 imgs/icon-512.png create mode 100644 imgs/ogimage.png create mode 100644 index.php create mode 100644 lib/ckratelimit.php create mode 100644 lib/ght.php create mode 100644 sec/.htaccess diff --git a/README.md b/README.md new file mode 100644 index 0000000..ddbd507 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +## What is this? + +Unocck is a web tool that allows to easily check if a Mastodon or Mastodon compatible instance is censoring a given ActivityPub post. + +## Setting up Unocck on a webserver + +To set up Unocck on a webserver you just need it to support PHP, to make the “sec” directory writeable by the webserver’s user and to put into it a “conf.ini” file like this: + +``` +host=[hostname of the instance to check] +hostdesc=[a terse description of the instance, in html] +maintref=[a terse reference to you, in html] +token=[the access token of an application that you have already set up on an account on the instance defined by “host” (in Mastodon web UI you can set up an application under “Preferences” -> “Development”; the only privilege it needs is “read:search”)] +``` + +You can optionally also set a “footer” that will be added before the link to this repo in page footer, and a proxy to use for connections; for example: + +``` +footer=Home +proxy=tcp://localhost:8118 +``` + +You can change Unocck icons and its “OG Image” by editing files inside the “imgs” directory. + +## Are there running Unocck instances? + +[Here](https://mastodon.help/unocck/) you can find a running Unocck instance checking mastodon.uno, a Mastodon instance whose admins are well known for [bad practices](https://qua.name/diorama/astroturfing-the-italophone-fediverse) and censoring those who criticize them. + +If you set up your own and you want it to be listed here, please let me know using the e-mail address you can find in my profile page. diff --git a/css/main.css b/css/main.css new file mode 100644 index 0000000..4a8aca9 --- /dev/null +++ b/css/main.css @@ -0,0 +1,233 @@ +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + font-family: "sans"; + background-color: #222222; + color: white; + margin: 0; + padding: 0; +} + +a { + /*color: #87decd;*/ + color: lightgreen; +} + +form { + padding: 0; + margin: 0; +} + +h1, h2, h3, h4, h5, h6 { + text-align: center; + color: white; +} + +p { + margin: 0; + color: white; + text-indent: 3mm; + /*text-align: justify; + -webkit-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto;*/ +} + +.firstp { + text-indent: 0; +} + +input:focus, textarea:focus, button:focus { + outline: none; +} + +#main { + margin-left: auto; + margin-right: auto; + max-width: 20cm; + width: 100%; + padding: 3mm; +} + +.error, .success, .warning, .neutral, .normtext { + width: 100%; + color: red; + margin-bottom: 15px; + border: 1px solid red; + border-radius: 6px; + padding: 3mm; +} + +.neutral { + color: white; + border-color: white; +} + +.warning { + color: orange; + border-color: orange; +} + +.success { + color: lightgreen; + border-color: lightgreen; +} + +.normtext { + background-color: #444444; + color: white; + border: none; +} + +.hili { + color: yellow; +} + +.tittab { + border-collapse: collapse; + width: 100%; + border: none; +} + +.tittab tr { + margin: 0; + padding: 0; +} + +.tittab td { + margin: 0; + padding: 1mm; + vertical-align: middle; +} + +.closeb { + cursor: pointer; + top: 3px; + vertical-align: middle; +} + +.inputdiv, .lastinputdiv, .outputdiv, .lastoutputdiv { + width: 100%; +} + +.inputdiv { + margin-bottom: 15px; +} + +.lastoutputdiv { + margin-top: 15px; +} + +.input, .inputx, .textarea, .button, .halfbutton, .copybutton, .output, .outputnobb, .outputli, .posthead, .lastborder, fieldset { + width: 100%; + border: 1px solid #555555; + border-radius: 0 6px 6px 6px; + font-size: 12pt; + margin: 0; + padding: 3px; +} + +.input, .inputx, .textarea { + font-family: "sans"; +} + +.inputx { + border-radius: 0 6px 0 0; +} + +.lastborder { + border-top: none; + border-radius: 0 0 6px 6px; +} + +fieldset { + padding: 6px; + margin-top: 2px; +} + +.halfbutton { + width: 50%; + height: 30px; + border-radius: 6px; +} + +.button, .copybutton { + height: 40px; + border-radius: 6px; + font-weight: bold; +} + +.copybutton { + border-top: none; + border-radius: 0 0 6px 6px; +} + +.output, .outputnobb { + border-radius: 0; + margin: 0; + font-family: "sans"; +} + +.outputnobb { + border-bottom: none; +} + +.outputli { + border-radius: 0 0 6px 6px; +} + +label { + max-width: 96%; + font-weight: bold; + color: white; + background-color: #555555; + border-bottom: none; + border-radius: 6px 6px 0 0; + padding: 2px 6px 3px 6px; + display: inline-block; + margin: 0; +} + +.cblab { + background-color: rgba(0, 0, 0, 0); + font-weight: normal; + display: table-cell; +} + +.posthead, .errposthead { + font-weight: bold; + font-size: 12pt; + margin-bottom: 0; + border-bottom: none; + border-radius: 6px 6px 0 0; + color: white; + background-color: #555555; + padding: 3px 6px 3px 6px; + margin-top: 15px; +} + +.errposthead { + background-color: red; +} + +.horsep { + width: 100%; + height: 25px; +} + +#footer, #almfooter { + width: 100%; + text-align: center; + font-size: 9pt; + margin: 3mm 0 0 0; +} + +#almfooter { + font-size: 10.5pt; +} diff --git a/imgs/icon-16.png b/imgs/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..03ac02e3ecc3cf7bf302f5e6ae78f4645dfc92db GIT binary patch literal 2716 zcmbVO3s@6Z7M?uFBnW}v;1U|1qD1TG0trG8sssiMqBuMRU0Z~LP;DtB;SD}e9%j`R zji?Bz1Z%-+t**#J>nD!|OBG>34b-+$#2}PZ1Vp=4_6*QnuynWE$#>@7d+xdaIsZ9l zX0mtPT3 zem)W(a6~$X+xXXr7s6yPP=+28MNt-usc(Q88qAqvz%`j`gjtwdSz4I$c-D4H?X7K> z%;)j=E{m2pI0}VAD|?ZLtCRaufzXKrp|DsigES^9Ippu!k|Owp)xnw}n=4!fDKkI*@KCN_?q zjJZSvYMX#L?aD7<&KIArH4SWgY$u46X0i0={mG1LzF?s}f6-#0^D-A#k(-w{?&G^k z;ujPgvOY9y!^XFxqPN7vzOz*(PfSWqNln|mCp#xMZ?EFuA?4wMBS()Fs!LCPeCm_3 z^3xaocCq48WmR=eU46sf8=J0w+5C_8j@x(cYC5~Rzwdd_`%v5WsDJ3m@W|-Xv1iYJ zB6*QKf4L@^y~2wFyr^_KjgFGMDAZ(dS1|9<}0ije99u!T+rOh6{jx@8MMiy6YZ-QW*9< zn(geXx*1sN7Z?%tnng55yp?cIdXd1>P|jH#3l+5{jSzThOgw>O$bS(^3lP%CiWUGs zb+0)_;G5q~l*37FLR%Yd+9+2=16oz8y$V*kk1W%{Q@CB`(B!5bMy#Aoc)b|$X0E6X zum@B`368B_*c1XdMajhrFk(~8N{EQ^Fqpv8a}RC<;FdTUERuP?31D|1dBiKBX8r{!VpLcdE5)tRISX z-|f~S(DfM^>%j6!z`8!jeUBSyObS~{7Nn>fl%pRk8QBV$L3iCRDfs6y9`8TRS68#^ z0sG9F15ZI^H}Y#A18{QqK;2@#y3AJzd`8f`WQaV~zDzDB@PuMUCPr*Lrg{e=uSwB< z3TYYEURsS~!TWAOSV00M+*@7ub@A1eP9Dp^iNR>ruZT=Kxu#a|snZ>$g+S@JKagdx z+y)M+W;y`ANH5$**n(p4@_Fwc#5Wfbcx3F162wd=Li+g8wIvBM*{&P`CRYS^^x<)G zZw5N?PuBF4X)HYlA+#)KmZ=pbmO&6~tEJ67$i@Rz$;^hDYM^?^<$&de{tg1qcs^Kk z8@lQf8?s}&q^jd^JSVLd$JU|8K%=vid;uDpj>KRBkGF`Ktqc?}o-U{ePDHfCkHBNo zR6rhtw$B9}(USHanbm=bto{WwS5vfPQ?fKtIT+iklCf#!osKzuK82qGPeXWMM#Mc} z(_`f~1wBRaA>gHJcZNY?1VL?(#37^DncYdY+ib#K3Yqoqc7$X;61AL$g}csO2gAEV zVzPO>0kXlPbmGO*N0#D$i3qB8nf-PSoV(**uYf`GMsR;Dw6@Vn4-)`3etO^l)K_o< z!bE|xNb z;#X~u!G=F6l=8U4PM}2Pk~KK0MNu{;kY&A0gHP&55^v97*RS>;y1CXo0?V<=;l6IY zgJoiqP?BGhSaYVWRjF&PTk}P3W3h|F^7pSTZ#9gou^yssGMnqQxqW}3nTa53OW=09 zkf?_C>}&@Iv+sIETG4mMWi7dRn0EtawPEmT*x9QcgR1Z@EML6R+uyo=&(=yKUWl$b zmaXwC|GBj^Vg#5g9oXfJI)Jj><+A0z3kM%TiLCl^HoP|W%@n|`GL0wyt%nM z;_ROfRu#RuLMm-5yzo!Y<8f+@#gV{@zY?3GM9xjMV_4@&MJM-};m!7jxXb*!N^6U| zVT$rAp?+>9=RfszY-R`OzS<^qcr8U5?$FG>oTikE(~D~x{WR@%kJ%|zd-Lx`T;nf) zAhR*jq!$ozJXOu^2z5$V)QoTdrgIbt|&-xY3bv7hm#!galvf K{h4@k*1rHM8uT;( literal 0 HcmV?d00001 diff --git a/imgs/icon-180.png b/imgs/icon-180.png new file mode 100644 index 0000000000000000000000000000000000000000..0ade583beb3a2a9e6baa1ce1d5f3ef19efa6dea8 GIT binary patch literal 6177 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 Rz*+zR002ovPDHLkV1mv)Nh|;W literal 0 HcmV?d00001 diff --git a/imgs/icon-512.png b/imgs/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..a052d8555d4f910fc02e2dcd376c067a8ac8fcfe GIT binary patch literal 26274 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 literal 0 HcmV?d00001 diff --git a/imgs/ogimage.png b/imgs/ogimage.png new file mode 100644 index 0000000000000000000000000000000000000000..68d8903eefbce98faa8886a54b139220bca7e35a GIT binary patch literal 28798 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"R0L?9 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 literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100644 index 0000000..e83c91d --- /dev/null +++ b/index.php @@ -0,0 +1,205 @@ +. +*/ + +// example of a post censored by mastodon.uno: https://livellosegreto.it/@xabacadabra/110662830871887169 + +require 'lib/ght.php'; +require 'lib/ckratelimit.php'; + +const SNAME='unocck'; +const SVERS='0.1'; +const SREPO='https://git.lattuga.net/pongrebio/unocck'; +const MULEN=1024; +const INIFP='sec/conf.ini'; +const RLFP='sec/rl.state'; + +header('Content-Language: en'); + +$usname=ucfirst(SNAME); +$timeout=5; +$cjr=rand(0,999999); + +$conf=@parse_ini_file(INIFP,false,INI_SCANNER_RAW); +if ($conf===false) + die('Could not open configuration file.'); +elseif (!isset($conf['host']) || !isset($conf['hostdesc']) || !isset($conf['token']) || !isset($conf['maintref'])) + die('Configuration file is malformed.'); + +if (file_exists(RLFP)) { + $buf=@file(RLFP,FILE_IGNORE_NEW_LINES); + if ($buf===false) + die('Could not open rate limiting state file.'); + if (count($buf)!=2 || preg_match('#^\d+$#',$buf[0])!==1 || preg_match('#^\d+$#',$buf[1])!==1) + die('Malformed rate limiting state file.'); + $rl=['remaining'=>$buf[0]+0,'restime'=>$buf[1]+0]; +} else { + $rl=['remaining'=>400,'restime'=>0]; +} + +$now=time(); +if ($rl['remaining']==10 && $now<=$rl['restime'])// ten to leave a margin for "many people using it" + die("Sorry, this {$usname} instance has reached rate limit on «{$conf['host']}», please wait at least ".ght($rl['restime']-$now,null,0).'.'); + +$errors=[]; + +if (isset($argv[1])) + $_GET=['purl'=>$argv[1]]; + +if (isset($_GET['purl'])) { + if (strlen($_GET['purl'])>MULEN) { + $_GET['purl']=''; + $errors[]='“Post URL” is too long'; + } + $_GET['purl']=trim($_GET['purl']); + if ($_GET['purl']!='' && preg_match('#^https?://#',$_GET['purl'])!==1)// todo: make it better + $errors[]='“Post URL” is not a valid http(s) address'; +} else { + $_GET['purl']=''; +} + +if ($_GET['purl']!=='') + $purlhn=preg_replace('#^https?://([^/]+).*$#','$1',$_GET['purl']); + +if (count($errors)>0) + $errors='
There are some errors in the values you submitted
  • '.implode('
  • ',$errors).'
'; +else + $errors=''; + +echo " + + +{$usname} + + + + + + + + + + + + +
+

{$usname}

+
+

Hello, this is a {$usname} instance. {$usname} is a tool to easily check if a Mastodon instance is censoring a given post. This {$usname} instance is set to check «{$conf['host']}», {$conf['hostdesc']}. It works by querying {$conf['host']}’s /api/v2/search API endpoint with the credentials of an application defined inside a {$conf['host']} account, but to avoid false positives it does so only after it has verified that the URL you passed to it actually points to a publicly accessible ActivityPub object.

+

{$usname} does not use cookies or Javascript and does not store any data about you anywhere.

+

You can find {$usname}’s code here.

+

This {$usname} instance is maintained by {$conf['maintref']}.

+
+
+".$errors." +

Check

+
+
+
\n
\n"; + +if ($errors=='' && $_GET['purl']!='') { + echo "
\n"; + $context=[ + 'http'=>[ + 'header'=>"Content-type: application/x-www-form-urlencoded\r\nAccept: application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"\r\n", + 'method'=>'GET', + 'ignore_errors'=>true, + 'user_agent'=>'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', + 'timeout'=>5 + ] + ]; + if (isset($conf['proxy'])) + $context['http']['proxy']=$conf['proxy']; + $http_response_header=null; + $res=@file_get_contents($_GET['purl'],false,stream_context_create($context)); + /*$xres=json_decode($res,true); + echo preprint($xres);*/ + if (isset($http_response_header)) + $hcode=gethttpcode($http_response_header); + if ($res===false || !isset($http_response_header)) { + echo "
Error: {$usname} could not connect to «{$purlhn}» and won’t proceed with the check.
\n"; + } elseif ($hcode[0]!='2') { + if ($hcode[0]=='5') + echo "
«{$purlhn}» returned a server error. {$usname} won’t proceed with the check.
\n"; + elseif ($hcode[0]=='4') + echo "
Error: {$usname} could not access the “Post URL” you passed to it: probably the post visibility is not public/unlisted, or you passed a wrong URL. {$usname} won’t proceed with the check.
\n"; + elseif ($hcode[0]=='3') + echo "
Error: the “Post URL” you passed to {$usname} redirects, and since its programmer is lazy, {$usname} currently only accepts URLs which point to original posts (on Mastodon web you can copy a post’s original URL by opening the “three vertical dots” menu you find on every post and selecting “Copy link to post”). {$usname} won’t proceed with the check.
\n"; + elseif ($hcode[0]=='1') + echo "
«{$purlhn}» returned an unexpected and useless informational message. {$usname} won’t proceed with the check.
\n"; + else + echo "
«{$purlhn}» returned an unexpected HTTP code. {$usname} won’t proceed with the check.
\n"; + } elseif (null===$res=@json_decode($res,true)) { + echo "
Error: «{$purlhn}» returned data which could not be parsed as JSON (".json_last_error().': '.json_last_error_msg().").
\n"; + } elseif (isset($res['error'])) { + echo "
Error: «{$purlhn}» returned «".htmlentities($res['error'])."». {$usname} won’t proceed with the check.
\n"; + } elseif (!isset($res['@context'][0]) || $res['@context'][0]!='https://www.w3.org/ns/activitystreams') { + echo "
Error: the “Post URL” you passed to {$usname} doesn’t point to an ActivityPub post. {$usname} won’t proceed with the check.
\n"; + } else { + $context['http']['header']="Content-type: application/x-www-form-urlencoded\r\nAccept: application/json\r\nAuthorization: Bearer {$conf['token']}\r\n"; + $http_response_header=null; + $hhost=htmlentities($conf['host']); + $url=$conf['host'].'/api/v2/search?q='.urlencode($_GET['purl']).'&type=statuses&resolve=1&limit=1'; + $hurl=htmlentities($url); + //while (true) { + $res=@file_get_contents('https://'.$url,false,stream_context_create($context)); + if (isset($http_response_header)) + $rl=ckratelimit($http_response_header,'echofun',true,false); + //echo preprint($rl); + if (is_array($rl) && @file_put_contents(RLFP,$rl['remaining']."\n".($rl['secstoreset']+time())."\n")===false) + echo "
Warning: could not write to rate limit state file.
\n"; + /*if ($rl['remaining']==0) + break; + usleep(250000); + }*/ + if ($res===false) { + echo "
Error: could not connect to «{$hhost}».
\n"; + } elseif (null===$res=@json_decode($res,true)) { + echo "
Error: «{$hurl}» returned data which could not be parsed as JSON (".json_last_error().': '.json_last_error_msg().").
\n"; + } elseif (isset($res['error'])) { + echo "
Error: «{$hurl}» replied with this error message: «".htmlentities($res['error'])."».
\n"; + } elseif (!isset($res['statuses'])) { + echo "
Error: «{$hurl}» returned data in an unexpected format.
\n"; + } else { + if (isset($res['statuses'][0]['id'])) + echo "
\nPost is not censored.\n
\n"; + else + echo "
\nPost is censored.\n
\n"; + } + } +} + +if (isset($conf['footer'])) + echo "
{$conf['footer']}
\n"; + +echo " +
+ +\n"; + +function preprint($var) { + return '
'.print_r($var,true)."
\n"; +} + +function gethttpcode($headers) { + return preg_replace('#^[^ ]+ (\d+).*$#','$1',$headers[0]); +} + +function echofun($msg) { + echo $msg; +} + +?> diff --git a/lib/ckratelimit.php b/lib/ckratelimit.php new file mode 100644 index 0000000..184bbfd --- /dev/null +++ b/lib/ckratelimit.php @@ -0,0 +1,36 @@ +$srvrlremain,'secstoreset'=>$secstoreset]; + if ($onlyret) + return $ret; + if ($verbose) $echofun("ckratelimit: X-RateLimit-Remaining: {$srvrlremain}; server time: {$srvnow}: ".gmdate('c',$srvnow).'; X-RateLimit-Reset: '.gmdate('c',$srvrlreset).'; current seconds before reset: '.$secstoreset.".\n"); + if ($srvrlremain==0) { + $echofun("Reached rate limit, waiting {$secstoreset} seconds for rate limit reset ...\n"); + sleep($secstoreset); + } + } else { + if ($verbose) $echofun("ckratelimit: no «Date» / «X-RateLimit-Reset» / «X-RateLimit-Remaining» header(s)!\n"); + } + } else { + if ($verbose) $echofun("ckratelimit: headers is not an array!\n"); + } + return $ret; +} +?> diff --git a/lib/ght.php b/lib/ght.php new file mode 100644 index 0000000..32844ab --- /dev/null +++ b/lib/ght.php @@ -0,0 +1,50 @@ +0) + ($x==1) ? $out.=$x.$fa[$i] : $out.=$x.$fa[$i+1]; + $ts=$ts-$x*31536000; + $i+=2; +// weeks + $x=floor($ts/604800); + if ($x>0) + ($x==1) ? $out.=$x.$fa[$i] : $out.=$x.$fa[$i+1]; + $ts=$ts-$x*604800; + $i+=2; +// days + $x=floor($ts/86400); + if ($x>0) + ($x==1) ? $out.=$x.$fa[$i] : $out.=$x.$fa[$i+1]; + $ts=$ts-$x*86400; + $i+=2; +// hours + $x=floor($ts/3600); + if ($x>0) + ($x==1) ? $out.=$x.$fa[$i] : $out.=$x.$fa[$i+1]; + $ts=$ts-$x*3600; + $i+=2; +// minutes + $x=floor($ts/60); + if ($x>0) + ($x==1) ? $out.=$x.$fa[$i] : $out.=$x.$fa[$i+1]; + $ts=$ts-$x*60; + $i+=2; +// seconds + $x=round($ts,$sd); + ($x==1) ? $out.=$x.$fa[$i] : $out.=$x.$fa[$i+1]; + return $out; +} + +?> diff --git a/sec/.htaccess b/sec/.htaccess new file mode 100644 index 0000000..93169e4 --- /dev/null +++ b/sec/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all