Implement LiftBlacklist functionality and related methods

This commit is contained in:
netkas 2025-06-06 18:15:20 -04:00
parent 0ad53d6032
commit 663ce2ceac
Signed by: netkas
GPG key ID: 4D8629441B76E4CC
4 changed files with 101 additions and 1 deletions

View file

@ -10,6 +10,7 @@
use FederationServer\Methods\Audit\ViewAuditEntry; use FederationServer\Methods\Audit\ViewAuditEntry;
use FederationServer\Methods\Blacklist\BlacklistEntity; use FederationServer\Methods\Blacklist\BlacklistEntity;
use FederationServer\Methods\Blacklist\DeleteBlacklist; use FederationServer\Methods\Blacklist\DeleteBlacklist;
use FederationServer\Methods\Blacklist\LiftBlacklist;
use FederationServer\Methods\Blacklist\ListBlacklist; use FederationServer\Methods\Blacklist\ListBlacklist;
use FederationServer\Methods\Entities\DeleteEntity; use FederationServer\Methods\Entities\DeleteEntity;
use FederationServer\Methods\Entities\GetEntityRecord; use FederationServer\Methods\Entities\GetEntityRecord;
@ -201,7 +202,7 @@
DeleteBlacklist::handleRequest(); DeleteBlacklist::handleRequest();
break; break;
case self::LIFT_BLACKLIST: case self::LIFT_BLACKLIST:
throw new \Exception('To be implemented'); LiftBlacklist::handleRequest();
break; break;
case self::BLACKLIST_ATTACH_EVIDENCE: case self::BLACKLIST_ATTACH_EVIDENCE:
throw new \Exception('To be implemented'); throw new \Exception('To be implemented');

View file

@ -189,6 +189,32 @@
} }
} }
/**
* Lifts a blacklist record, marking it as no longer active.
*
* @param string $uuid The UUID of the blacklist record to lift.
* @throws InvalidArgumentException If the UUID is empty.
* @throws DatabaseOperationException If there is an error preparing or executing the SQL statement.
*/
public static function liftBlacklistRecord(string $uuid): void
{
if(empty($uuid))
{
throw new InvalidArgumentException("UUID cannot be empty.");
}
try
{
$stmt = DatabaseConnection::getConnection()->prepare("UPDATE blacklist SET lifted=1 WHERE uuid = :uuid");
$stmt->bindParam(':uuid', $uuid);
$stmt->execute();
}
catch (PDOException $e)
{
throw new DatabaseOperationException("Failed to lift blacklist record: " . $e->getMessage(), 0, $e);
}
}
/** /**
* Returns an array of blacklist records in a pagination style for the global database * Returns an array of blacklist records in a pagination style for the global database
* *

View file

@ -0,0 +1,61 @@
<?php
namespace FederationServer\Methods\Blacklist;
use FederationServer\Classes\Configuration;
use FederationServer\Classes\Managers\BlacklistManager;
use FederationServer\Classes\RequestHandler;
use FederationServer\Classes\Validate;
use FederationServer\Exceptions\DatabaseOperationException;
use FederationServer\Exceptions\RequestException;
use FederationServer\FederationServer;
class LiftBlacklist extends RequestHandler
{
/**
* @inheritDoc
*/
public static function handleRequest(): void
{
$authenticatedOperator = FederationServer::requireAuthenticatedOperator();
if(!$authenticatedOperator->canManageBlacklist())
{
throw new RequestException('Insufficient permissions to manage the blacklist', 401);
}
if(!preg_match('#^/blacklist/([a-fA-F0-9\-]{36,})$#', FederationServer::getPath(), $matches))
{
throw new RequestException('Blacklist UUID required', 405);
}
$blacklistUuid = $matches[1];
if(!$blacklistUuid || !Validate::uuid($blacklistUuid))
{
throw new RequestException('Invalid blacklist UUID', 400);
}
try
{
$blacklistRecord = BlacklistManager::getBlacklistEntry($blacklistUuid);
if($blacklistRecord === null)
{
throw new RequestException('Blacklist record not found', 404);
}
if($blacklistRecord->isLifted())
{
throw new RequestException('Blacklist record is already lifted', 400);
}
BlacklistManager::liftBlacklistRecord($blacklistUuid);
}
catch (DatabaseOperationException $e)
{
throw new RequestException('Unable to retrieve blacklist records', 500, $e);
}
self::successResponse();
}
}

View file

@ -13,6 +13,7 @@
private string $entity; private string $entity;
private ?string $evidence; private ?string $evidence;
private BlacklistType $type; private BlacklistType $type;
private bool $lifted;
private ?int $expires; private ?int $expires;
private int $created; private int $created;
@ -35,6 +36,7 @@
$this->entity = $data['entity'] ?? ''; $this->entity = $data['entity'] ?? '';
$this->evidence = $data['evidence'] ?? null; $this->evidence = $data['evidence'] ?? null;
$this->type = isset($data['type']) ? BlacklistType::from($data['type']) : BlacklistType::OTHER; $this->type = isset($data['type']) ? BlacklistType::from($data['type']) : BlacklistType::OTHER;
$this->lifted = isset($data['lifted']) ? (bool)$data['lifted'] : false;
$this->expires = isset($data['expires']) ? (int)$data['expires'] : null; $this->expires = isset($data['expires']) ? (int)$data['expires'] : null;
$this->created = isset($data['created']) ? (int)$data['created'] : time(); $this->created = isset($data['created']) ? (int)$data['created'] : time();
} }
@ -92,6 +94,16 @@
return $this->type; return $this->type;
} }
/**
* Check if the blacklist record has been lifted.
*
* @return bool True if the record is lifted, false otherwise.
*/
public function isLifted(): bool
{
return $this->lifted;
}
/** /**
* Get the expiration timestamp of the blacklist record. * Get the expiration timestamp of the blacklist record.
* *