$ git clone http://thingshare.ion.nu/thingshare.git
commit c85141c35a0900f6e4c1384ce78b5e4a572cfce6
Author: Alicia <...>
Date:   Mon Nov 9 21:48:09 2020 +0100

    Support for filtering tags on the admin level.

diff --git a/admin_federation.php b/admin_federation.php
index 2f7cbc1..5672d9c 100644
--- a/admin_federation.php
+++ b/admin_federation.php
@@ -74,6 +74,17 @@ if(checknonce()) // Save changes
       mysqli_query($db, 'insert into peers(domain, blacklist) values("'.$peer.'", 0)');
     }
   }
+  if(isset($_POST['addfilter']))
+  {
+    $filter=mysqli_real_escape_string($db, $_POST['newfilter']);
+    mysqli_query($db, 'delete from filtertags where tag="'.$filter.'"');
+    mysqli_query($db, 'insert into filtertags(tag) values("'.$filter.'")');
+  }
+  if(isset($_POST['deletefilter']))
+  {
+    $filter=mysqli_real_escape_string($db, $_POST['deletefilter']);
+    mysqli_query($db, 'delete from filtertags where tag="'.$filter.'"');
+  }
 }
 if($error!=''){$error='<span class="error">'.$error.'</span>';}
 
@@ -86,6 +97,13 @@ while($row=mysqli_fetch_assoc($res))
   if($row['blacklist']){$domain='<span class="blacklist">'.$domain.'</span>';}
   $peers.=$domain.'<button name="deletepeer" value="'.htmlentities($row['domain']).'">X</button><br />';
 }
+$filters='';
+$res=mysqli_query($db, 'select tag from filtertags');
+while($row=mysqli_fetch_assoc($res))
+{
+  $tag=htmlentities($row['tag']);
+  $filters.='<span class="blacklist">'.$tag.'</span><button name="deletefilter" value="'.$tag.'">X</button><br />';
+}
 $autofollowcheck=(getoption('autofollow')?' checked':'');
 ?>
 <?=$error?>
@@ -95,8 +113,18 @@ $autofollowcheck=(getoption('autofollow')?' checked':'');
   <input type="submit" name="options" value="<?=_('Save')?>" />
 </form>
 <form method="post"><?=nonce()?>
-<h2><?=_('Peers')?></h2>
-<?=$peers?>
+  <h2><?=_('Peers')?></h2>
+  <?=$peers?>
+</form>
+<form method="post"><?=nonce()?>
   <input type="text" name="newpeer" placeholder="<?=_('domain.tld')?>" /><button name="addpeer"><?=_('Add peer')?></button><button name="blacklistpeer" title="<?=_('Don\'t autofollow this peer')?>"><?=_('Add peer to blacklist')?></button><br />
   <button name="action" value="addindirectpeers"><?=_('Add indirect peers')?></button>
 </form>
+<form method="post"><?=nonce()?>
+  <h2><?=_('Filters')?></h2>
+  <?=_('Peers\' things with these tags will not be shown in search results on this instance')?><br />
+  <?=$filters?>
+</form>
+<form method="post"><?=nonce()?>
+  <input type="text" name="newfilter" placeholder="<?=_('Tag to filter')?>" /><button name="addfilter"><?=_('Add filter')?></button><br />
+</form>
diff --git a/db.php b/db.php
index 22e7d16..345f8b2 100644
--- a/db.php
+++ b/db.php
@@ -129,6 +129,7 @@ function db_create_tables()
     message text,
     sent datetime,
     removed boolean);');
+  mysqli_query($db, 'create table filtertags(tag text);');
 }
 
 function db_getuser($id)
diff --git a/search.php b/search.php
index 373c751..007e7fd 100644
--- a/search.php
+++ b/search.php
@@ -24,13 +24,18 @@ include_once('rpc.php');
 $peers=Array(DOMAIN);
 $res=mysqli_query($db, 'select domain from peers where !blacklist');
 while($row=mysqli_fetch_row($res)){$peers[]=$row[0];}
+// Get list of tags to filter out
+$filtertags='';
+$res=mysqli_query($db, 'select tag from filtertags');
+while($row=mysqli_fetch_row($res)){$filtertags.=' tag:-'.$row[0];}
+// Pagination
 $perpage=(isset($_GET['perpage'])?(int)$_GET['perpage']:20);
 $page=(int)(isset($_GET['page'])?$_GET['page']:0);
 $perpeer=round($perpage/count($peers));
 $sortby=(isset($_GET['sort'])?$_GET['sort']:'new');
 if($path[1]=='browse'){$sortby=$path[2];} // Handle 'Browse' links
 else if($path[1]=='tag'){$_GET['q']='tag:'.$path[2];} // Handle 'Tag' links
-$res=rpc_search($peers, 'search/'.urlencode($_GET['q']).'/'.urlencode($sortby).'/'.$perpeer.'/'.($page*$perpage));
+$res=rpc_search($peers, 'search/'.urlencode($_GET['q'].$filtertags).'/'.urlencode($sortby).'/'.$perpeer.'/'.($page*$perpage));
 // Construct navigation links for pages
 $pagefull=false;
 foreach($res as $r){if(count($r)==$perpeer){$pagefull=true;}}