Implement evidence management methods: create, delete, and retrieve evidence
Some checks are pending
CI / release (push) Waiting to run
CI / debug (push) Waiting to run
CI / check-phpunit (push) Waiting to run
CI / check-phpdoc (push) Waiting to run
CI / generate-phpdoc (push) Blocked by required conditions
CI / test (push) Blocked by required conditions
CI / release-documentation (push) Blocked by required conditions
CI / release-artifacts (push) Blocked by required conditions
Some checks are pending
CI / release (push) Waiting to run
CI / debug (push) Waiting to run
CI / check-phpunit (push) Waiting to run
CI / check-phpdoc (push) Waiting to run
CI / generate-phpdoc (push) Blocked by required conditions
CI / test (push) Blocked by required conditions
CI / release-documentation (push) Blocked by required conditions
CI / release-artifacts (push) Blocked by required conditions
This commit is contained in:
parent
c1a2384257
commit
eb34a1027c
4 changed files with 189 additions and 6 deletions
|
@ -15,6 +15,9 @@
|
||||||
use FederationServer\Methods\Entities\ListEntityEvidence;
|
use FederationServer\Methods\Entities\ListEntityEvidence;
|
||||||
use FederationServer\Methods\Entities\PushEntity;
|
use FederationServer\Methods\Entities\PushEntity;
|
||||||
use FederationServer\Methods\Entities\QueryEntity;
|
use FederationServer\Methods\Entities\QueryEntity;
|
||||||
|
use FederationServer\Methods\Evidence\CreateEvidence;
|
||||||
|
use FederationServer\Methods\Evidence\DeleteEvidence;
|
||||||
|
use FederationServer\Methods\Evidence\GetEvidence;
|
||||||
use FederationServer\Methods\Evidence\ListEvidence;
|
use FederationServer\Methods\Evidence\ListEvidence;
|
||||||
use FederationServer\Methods\Operators\CreateOperator;
|
use FederationServer\Methods\Operators\CreateOperator;
|
||||||
use FederationServer\Methods\Operators\DeleteOperator;
|
use FederationServer\Methods\Operators\DeleteOperator;
|
||||||
|
@ -58,7 +61,7 @@
|
||||||
case LIST_ENTITY_AUDIT_LOGS;
|
case LIST_ENTITY_AUDIT_LOGS;
|
||||||
|
|
||||||
case LIST_EVIDENCE;
|
case LIST_EVIDENCE;
|
||||||
case ADD_EVIDENCE;
|
case CREATE_EVIDENCE;
|
||||||
case GET_EVIDENCE;
|
case GET_EVIDENCE;
|
||||||
case DELETE_EVIDENCE;
|
case DELETE_EVIDENCE;
|
||||||
|
|
||||||
|
@ -165,14 +168,14 @@
|
||||||
case self::LIST_EVIDENCE:
|
case self::LIST_EVIDENCE:
|
||||||
ListEvidence::handleRequest();
|
ListEvidence::handleRequest();
|
||||||
break;
|
break;
|
||||||
case self::ADD_EVIDENCE:
|
case self::CREATE_EVIDENCE:
|
||||||
throw new \Exception('To be implemented');
|
CreateEvidence::handleRequest();
|
||||||
break;
|
break;
|
||||||
case self::GET_EVIDENCE:
|
case self::GET_EVIDENCE:
|
||||||
throw new \Exception('To be implemented');
|
GetEvidence::handleRequest();;
|
||||||
break;
|
break;
|
||||||
case self::DELETE_EVIDENCE:
|
case self::DELETE_EVIDENCE:
|
||||||
throw new \Exception('To be implemented');
|
DeleteEvidence::handleRequest();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case self::LIST_BLACKLIST:
|
case self::LIST_BLACKLIST:
|
||||||
|
@ -229,7 +232,7 @@
|
||||||
preg_match('#^/blacklist/([a-fA-F0-9\-]{36,})/attach_evidence$#', $path) && $requestMethod === 'POST' => Method::ATTACH_EVIDENCE,
|
preg_match('#^/blacklist/([a-fA-F0-9\-]{36,})/attach_evidence$#', $path) && $requestMethod === 'POST' => Method::ATTACH_EVIDENCE,
|
||||||
|
|
||||||
$path === '/evidence' && $requestMethod === 'GET' => Method::LIST_EVIDENCE,
|
$path === '/evidence' && $requestMethod === 'GET' => Method::LIST_EVIDENCE,
|
||||||
$path === '/evidence' && $requestMethod === 'POST' => Method::ADD_EVIDENCE,
|
$path === '/evidence' && $requestMethod === 'POST' => Method::CREATE_EVIDENCE,
|
||||||
preg_match('#^/evidence/([a-fA-F0-9\-]{36,})$#', $path) && $requestMethod === 'GET' => Method::GET_EVIDENCE,
|
preg_match('#^/evidence/([a-fA-F0-9\-]{36,})$#', $path) && $requestMethod === 'GET' => Method::GET_EVIDENCE,
|
||||||
preg_match('#^/evidence/([a-fA-F0-9\-]{36,})$#', $path) && $requestMethod === 'DELETE' => Method::DELETE_EVIDENCE,
|
preg_match('#^/evidence/([a-fA-F0-9\-]{36,})$#', $path) && $requestMethod === 'DELETE' => Method::DELETE_EVIDENCE,
|
||||||
|
|
||||||
|
|
67
src/FederationServer/Methods/Evidence/CreateEvidence.php
Normal file
67
src/FederationServer/Methods/Evidence/CreateEvidence.php
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FederationServer\Methods\Evidence;
|
||||||
|
|
||||||
|
use FederationServer\Classes\Managers\EntitiesManager;
|
||||||
|
use FederationServer\Classes\Managers\EvidenceManager;
|
||||||
|
use FederationServer\Classes\RequestHandler;
|
||||||
|
use FederationServer\Classes\Validate;
|
||||||
|
use FederationServer\Exceptions\DatabaseOperationException;
|
||||||
|
use FederationServer\Exceptions\RequestException;
|
||||||
|
use FederationServer\FederationServer;
|
||||||
|
|
||||||
|
class CreateEvidence extends RequestHandler
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public static function handleRequest(): void
|
||||||
|
{
|
||||||
|
$authenticatedOperator = FederationServer::getAuthenticatedOperator();
|
||||||
|
if(!$authenticatedOperator->canManageBlacklist())
|
||||||
|
{
|
||||||
|
throw new RequestException('Forbidden: You do not have permission to create evidence', 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$entityUuid = FederationServer::getParameter('entity_uuid');
|
||||||
|
if(!$entityUuid || !Validate::uuid($entityUuid))
|
||||||
|
{
|
||||||
|
throw new RequestException('Bad Request: Entity UUID is required and must be valid', 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
$textContent = FederationServer::getParameter('text_content');
|
||||||
|
if(!is_null($textContent) && strlen($textContent) > 65535)
|
||||||
|
{
|
||||||
|
throw new RequestException('Bad Request: Text content must not exceed 65535 characters', 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
$note = FederationServer::getParameter('note');
|
||||||
|
if(!is_null($note) && strlen($note) > 65535)
|
||||||
|
{
|
||||||
|
throw new RequestException('Bad Request: Note must not exceed 65535 characters', 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
$confidential = false;
|
||||||
|
if(FederationServer::getParameter('confidential') === 'true')
|
||||||
|
{
|
||||||
|
$confidential = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if(!EntitiesManager::getEntityByUuid($entityUuid))
|
||||||
|
{
|
||||||
|
throw new RequestException('Not Found: Entity does not exist', 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
$evidenceUuid = EvidenceManager::addEvidence($entityUuid, $authenticatedOperator->getUuid(), $textContent, $note, $confidential);
|
||||||
|
}
|
||||||
|
catch (DatabaseOperationException $e)
|
||||||
|
{
|
||||||
|
throw new RequestException('Internal Server Error: Failed to create evidence', 500, $e);
|
||||||
|
}
|
||||||
|
|
||||||
|
self::successResponse($evidenceUuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
55
src/FederationServer/Methods/Evidence/DeleteEvidence.php
Normal file
55
src/FederationServer/Methods/Evidence/DeleteEvidence.php
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FederationServer\Methods\Evidence;
|
||||||
|
|
||||||
|
use FederationServer\Classes\Logger;
|
||||||
|
use FederationServer\Classes\Managers\EvidenceManager;
|
||||||
|
use FederationServer\Classes\RequestHandler;
|
||||||
|
use FederationServer\Classes\Validate;
|
||||||
|
use FederationServer\Exceptions\DatabaseOperationException;
|
||||||
|
use FederationServer\Exceptions\RequestException;
|
||||||
|
use FederationServer\FederationServer;
|
||||||
|
|
||||||
|
class DeleteEvidence extends RequestHandler
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public static function handleRequest(): void
|
||||||
|
{
|
||||||
|
$authenticatedOperator = FederationServer::getAuthenticatedOperator();
|
||||||
|
if(!$authenticatedOperator->canManageBlacklist())
|
||||||
|
{
|
||||||
|
throw new RequestException('Forbidden: You do not have permission to delete evidence', 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!preg_match('#^/evidence/([a-fA-F0-9\-]{36,})$#', FederationServer::getPath(), $matches))
|
||||||
|
{
|
||||||
|
throw new RequestException('Evidence UUID required', 405);
|
||||||
|
}
|
||||||
|
|
||||||
|
$evidenceUuid = $matches[1];
|
||||||
|
if(!$evidenceUuid || !Validate::uuid($evidenceUuid))
|
||||||
|
{
|
||||||
|
throw new RequestException('Invalid evidence UUID', 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if(!EvidenceManager::evidenceExists($evidenceUuid))
|
||||||
|
{
|
||||||
|
throw new RequestException('Evidence Not Found', 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
EvidenceManager::deleteEvidence($evidenceUuid);
|
||||||
|
}
|
||||||
|
catch(DatabaseOperationException $e)
|
||||||
|
{
|
||||||
|
Logger::log()->error('Database error while deleting evidence: ' . $e->getMessage(), $e);
|
||||||
|
throw new RequestException('Internal Server Error: Unable to delete evidence', 500, $e);
|
||||||
|
}
|
||||||
|
|
||||||
|
self::successResponse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
58
src/FederationServer/Methods/Evidence/GetEvidence.php
Normal file
58
src/FederationServer/Methods/Evidence/GetEvidence.php
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FederationServer\Methods\Evidence;
|
||||||
|
|
||||||
|
use FederationServer\Classes\Configuration;
|
||||||
|
use FederationServer\Classes\Logger;
|
||||||
|
use FederationServer\Classes\Managers\EvidenceManager;
|
||||||
|
use FederationServer\Classes\RequestHandler;
|
||||||
|
use FederationServer\Classes\Validate;
|
||||||
|
use FederationServer\Exceptions\DatabaseOperationException;
|
||||||
|
use FederationServer\Exceptions\RequestException;
|
||||||
|
use FederationServer\FederationServer;
|
||||||
|
|
||||||
|
class GetEvidence extends RequestHandler
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public static function handleRequest(): void
|
||||||
|
{
|
||||||
|
$authenticatedOperator = FederationServer::getAuthenticatedOperator(false);
|
||||||
|
if(!Configuration::getServerConfiguration()->isPublicEvidence() && $authenticatedOperator === null)
|
||||||
|
{
|
||||||
|
throw new RequestException('Unauthorized: You must be authenticated to access evidence', 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!preg_match('#^/evidence/([a-fA-F0-9\-]{36,})$#', FederationServer::getPath(), $matches))
|
||||||
|
{
|
||||||
|
throw new RequestException('Evidence UUID required', 405);
|
||||||
|
}
|
||||||
|
|
||||||
|
$evidenceUuid = $matches[1];
|
||||||
|
if(!$evidenceUuid || !Validate::uuid($evidenceUuid))
|
||||||
|
{
|
||||||
|
throw new RequestException('Invalid evidence UUID', 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$evidenceRecord = EvidenceManager::getEvidence($evidenceUuid);
|
||||||
|
if($evidenceRecord === null)
|
||||||
|
{
|
||||||
|
throw new RequestException('Evidence Not Found', 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($evidenceRecord->isConfidential() && $authenticatedOperator === null)
|
||||||
|
{
|
||||||
|
throw new RequestException('Forbidden: Confidential evidence access is restricted', 403);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(DatabaseOperationException $e)
|
||||||
|
{
|
||||||
|
Logger::log()->error('Database error while getting evidence: ' . $e->getMessage(), $e);
|
||||||
|
throw new RequestException('Internal Server Error: Unable to get evidence', 500, $e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue