Refactor CaptchaManager to improve UUID validation and streamline variable usage

https://github.com/nosial/Socialbox-PHP/issues/74
This commit is contained in:
netkas 2025-03-12 13:19:20 -04:00
parent 938c558cdc
commit 4cdabf6603
Signed by: netkas
GPG key ID: 4D8629441B76E4CC

View file

@ -3,10 +3,12 @@
namespace Socialbox\Managers;
use DateTime;
use InvalidArgumentException;
use PDOException;
use Socialbox\Classes\Database;
use Socialbox\Classes\Logger;
use Socialbox\Classes\Utilities;
use Socialbox\Classes\Validator;
use Socialbox\Enums\Status\CaptchaStatus;
use Socialbox\Exceptions\DatabaseOperationException;
use Socialbox\Objects\Database\CaptchaRecord;
@ -17,26 +19,30 @@
/**
* Creates a new captcha for the given peer UUID.
*
* @param string|PeerDatabaseRecord $peer_uuid The UUID of the peer to create the captcha for.
* @param string|PeerDatabaseRecord $peerUuid The UUID of the peer to create the captcha for.
* @return string The answer to the captcha.
* @throws DatabaseOperationException If the operation fails.
*/
public static function createCaptcha(string|PeerDatabaseRecord $peer_uuid): string
public static function createCaptcha(string|PeerDatabaseRecord $peerUuid): string
{
// If the peer_uuid is a RegisteredPeerRecord, get the UUID
if($peer_uuid instanceof PeerDatabaseRecord)
if($peerUuid instanceof PeerDatabaseRecord)
{
$peer_uuid = $peer_uuid->getUuid();
$peerUuid = $peerUuid->getUuid();
}
elseif(!Validator::validateUuid($peerUuid))
{
throw new InvalidArgumentException('The given internal peer UUID is not a valid UUID V4');
}
$answer = Utilities::randomString(6, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
$current_time = (new DateTime())->setTimestamp(time())->format('Y-m-d H:i:s');
if(!self::captchaExists($peer_uuid))
if(!self::captchaExists($peerUuid))
{
Logger::getLogger()->debug('Creating a new captcha record for peer ' . $peer_uuid);
Logger::getLogger()->debug('Creating a new captcha record for peer ' . $peerUuid);
$statement = Database::getConnection()->prepare("INSERT INTO captcha_images (peer_uuid, created, answer) VALUES (?, ?, ?)");
$statement->bindParam(1, $peer_uuid);
$statement->bindParam(1, $peerUuid);
$statement->bindParam(2, $current_time);
$statement->bindParam(3, $answer);
@ -52,11 +58,11 @@
return $answer;
}
Logger::getLogger()->debug('Updating an existing captcha record for peer ' . $peer_uuid);
Logger::getLogger()->debug('Updating an existing captcha record for peer ' . $peerUuid);
$statement = Database::getConnection()->prepare("UPDATE captcha_images SET answer=?, status='UNSOLVED', created=? WHERE peer_uuid=?");
$statement->bindParam(1, $answer);
$statement->bindParam(2, $current_time);
$statement->bindParam(3, $peer_uuid);
$statement->bindParam(3, $peerUuid);
try
{
@ -73,25 +79,25 @@
/**
* Answers a captcha for the given peer UUID.
*
* @param string|PeerDatabaseRecord $peer_uuid The UUID of the peer to answer the captcha for.
* @param string|PeerDatabaseRecord $peerUuid The UUID of the peer to answer the captcha for.
* @param string $answer The answer to the captcha.
* @return bool True if the answer is correct, false otherwise.
* @throws DatabaseOperationException If the operation fails.
*/
public static function answerCaptcha(string|PeerDatabaseRecord $peer_uuid, string $answer): bool
public static function answerCaptcha(string|PeerDatabaseRecord $peerUuid, string $answer): bool
{
if($peer_uuid instanceof PeerDatabaseRecord)
if($peerUuid instanceof PeerDatabaseRecord)
{
$peer_uuid = $peer_uuid->getUuid();
$peerUuid = $peerUuid->getUuid();
}
// Return false if the captcha does not exist
if(!self::captchaExists($peer_uuid))
if(!self::captchaExists($peerUuid))
{
return false;
}
$captcha = self::getCaptcha($peer_uuid);
$captcha = self::getCaptcha($peerUuid);
// Return false if the captcha has already been solved
if($captcha->getStatus() === CaptchaStatus::SOLVED)
@ -112,7 +118,7 @@
}
$statement = Database::getConnection()->prepare("UPDATE captcha_images SET status='SOLVED', answered=NOW() WHERE peer_uuid=?");
$statement->bindParam(1, $peer_uuid);
$statement->bindParam(1, $peerUuid);
try
{
@ -129,24 +135,24 @@
/**
* Retrieves the captcha record for the given peer UUID.
*
* @param string|PeerDatabaseRecord $peer_uuid The UUID of the peer to retrieve the captcha for.
* @param string|PeerDatabaseRecord $peerUuid The UUID of the peer to retrieve the captcha for.
* @return CaptchaRecord|null The captcha record.
* @throws DatabaseOperationException If the operation fails.
*/
public static function getCaptcha(string|PeerDatabaseRecord $peer_uuid): ?CaptchaRecord
public static function getCaptcha(string|PeerDatabaseRecord $peerUuid): ?CaptchaRecord
{
// If the peer_uuid is a RegisteredPeerRecord, get the UUID
if($peer_uuid instanceof PeerDatabaseRecord)
if($peerUuid instanceof PeerDatabaseRecord)
{
$peer_uuid = $peer_uuid->getUuid();
$peerUuid = $peerUuid->getUuid();
}
Logger::getLogger()->debug('Getting the captcha record for peer ' . $peer_uuid);
Logger::getLogger()->debug('Getting the captcha record for peer ' . $peerUuid);
try
{
$statement = Database::getConnection()->prepare("SELECT * FROM captcha_images WHERE peer_uuid=? LIMIT 1");
$statement->bindParam(1, $peer_uuid);
$statement->bindParam(1, $peerUuid);
$statement->execute();
$result = $statement->fetch();
}
@ -166,24 +172,24 @@
/**
* Checks if a captcha exists for the given peer UUID.
*
* @param string|PeerDatabaseRecord $peer_uuid The UUID of the peer to check for a captcha.
* @param string|PeerDatabaseRecord $peerUuid The UUID of the peer to check for a captcha.
* @return bool True if a captcha exists, false otherwise.
* @throws DatabaseOperationException If the operation fails.
*/
public static function captchaExists(string|PeerDatabaseRecord $peer_uuid): bool
public static function captchaExists(string|PeerDatabaseRecord $peerUuid): bool
{
// If the peer_uuid is a RegisteredPeerRecord, get the UUID
if($peer_uuid instanceof PeerDatabaseRecord)
if($peerUuid instanceof PeerDatabaseRecord)
{
$peer_uuid = $peer_uuid->getUuid();
$peerUuid = $peerUuid->getUuid();
}
Logger::getLogger()->debug('Checking if a captcha exists for peer ' . $peer_uuid);
Logger::getLogger()->debug('Checking if a captcha exists for peer ' . $peerUuid);
try
{
$statement = Database::getConnection()->prepare("SELECT COUNT(*) FROM captcha_images WHERE peer_uuid=?");
$statement->bindParam(1, $peer_uuid);
$statement->bindParam(1, $peerUuid);
$statement->execute();
$result = $statement->fetchColumn();
}