Blockbot: Avoid false positives
[friendica-addons.git/.git] / blockbot / blockbot.php
index 30ecc3a..5d2242e 100644 (file)
@@ -11,6 +11,7 @@ use Friendica\App;
 use Friendica\Core\Hook;
 use Friendica\Core\System;
 use Jaybizzle\CrawlerDetect\CrawlerDetect;
+use Friendica\Core\Logger;
 
 require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
 
@@ -26,7 +27,23 @@ function blockbot_uninstall() {
 function blockbot_init_1(App $a) {
        $crawlerDetect = new CrawlerDetect();
 
+       // List of strings of known "good" agents
+       $agents = ['diaspora-connection-tester', 'DiasporaFederation', 'Friendica', '(compatible; zot)',
+               'Micro.blog', 'Mastodon', 'hackney', 'GangGo', 'python/federation', 'GNU social', 'winHttp',
+               'Go-http-client', 'Mr.4x3 Powered', 'Test Certificate Info', 'WordPress.com', 'zgrab',
+               'curl/', 'StatusNet', 'OpenGraphReader/', 'Uptimebot/', 'python-opengraph-jaywink'];
+
        if ($crawlerDetect->isCrawler()) {
+               foreach ($agents as $agent) {
+                       if (stristr($_SERVER['HTTP_USER_AGENT'], $agent)) {
+                               // @ToDo: Report every false positive here: https://github.com/JayBizzle/Crawler-Detect/issues/326
+                               logger::notice('False positive', ['agent' => $_SERVER['HTTP_USER_AGENT']]);
+                               return;
+                       }
+               }
+               logger::info('Blocked bot', ['agent' => $_SERVER['HTTP_USER_AGENT']]);
                System::httpExit(403, 'Bots are not allowed');
+       } else {
+               logger::debug('Good user agent detected', ['agent' => $_SERVER['HTTP_USER_AGENT']]);
        }
 }