Made message signing in Cryptography use SHA512 as the message content for... #1
5 changed files with 0 additions and 1361 deletions
|
@ -3,586 +3,8 @@
|
|||
|
||||
namespace Socialbox\Managers;
|
||||
|
||||
use InvalidArgumentException;
|
||||
use ncc\ThirdParty\Symfony\Uid\UuidV4;
|
||||
use PDO;
|
||||
use PDOException;
|
||||
use Socialbox\Classes\Cryptography;
|
||||
use Socialbox\Classes\Database;
|
||||
use Socialbox\Enums\Status\EncryptionChannelState;
|
||||
use Socialbox\Enums\Types\CommunicationRecipientType;
|
||||
use Socialbox\Exceptions\DatabaseOperationException;
|
||||
use Socialbox\Objects\Database\ChannelMessageRecord;
|
||||
use Socialbox\Objects\Database\EncryptionChannelRecord;
|
||||
use Socialbox\Objects\PeerAddress;
|
||||
|
||||
class EncryptionChannelManager
|
||||
{
|
||||
/**
|
||||
* Creates a new encryption channel between two peers.
|
||||
*
|
||||
* @param PeerAddress|string $callingPeer The peer that is creating the channel.
|
||||
* @param PeerAddress|string $receivingPeer The peer that is receiving the channel.
|
||||
* @param string $signatureUuid The UUID of the signature used to create the channel.
|
||||
* @param string $encryptionPublicKey The public key used for encryption.
|
||||
* @param string $transportEncryptionAlgorithm The algorithm used for transport encryption.
|
||||
* @return string The UUID of the created channel.
|
||||
* @throws DatabaseOperationException If an error occurs while creating the channel.
|
||||
*/
|
||||
public static function createChannel(PeerAddress|string $callingPeer, PeerAddress|string $receivingPeer,
|
||||
string $signatureUuid, string $encryptionPublicKey, string $transportEncryptionAlgorithm,
|
||||
?string $uuid=null
|
||||
): string
|
||||
{
|
||||
if(is_string($callingPeer))
|
||||
{
|
||||
$callingPeer = PeerAddress::fromAddress($callingPeer);
|
||||
}
|
||||
|
||||
if(is_string($receivingPeer))
|
||||
{
|
||||
$receivingPeer = PeerAddress::fromAddress($receivingPeer);
|
||||
}
|
||||
|
||||
|
||||
if(!Cryptography::validatePublicEncryptionKey($encryptionPublicKey))
|
||||
{
|
||||
throw new InvalidArgumentException('Invalid encryption public key provided');
|
||||
}
|
||||
|
||||
$transportEncryptionAlgorithm = strtolower($transportEncryptionAlgorithm);
|
||||
if(!Cryptography::isSupportedAlgorithm($transportEncryptionAlgorithm))
|
||||
{
|
||||
throw new InvalidArgumentException('Unsupported transport encryption algorithm');
|
||||
}
|
||||
|
||||
if($uuid === null)
|
||||
{
|
||||
$uuid = UuidV4::v4()->toRfc4122();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('INSERT INTO encryption_channels (uuid, calling_peer, calling_signature_uuid, calling_encryption_public_key, receiving_peer, transport_encryption_algorithm) VALUES (:uuid, :calling_peer, :calling_signature_uuid, :calling_encryption_public_key, :receiving_peer, :transport_encryption_algorithm)');
|
||||
$stmt->bindParam(':uuid', $uuid);
|
||||
$callingPeerAddress = $callingPeer->getAddress();
|
||||
$stmt->bindParam(':calling_peer', $callingPeerAddress);
|
||||
$stmt->bindParam(':calling_signature_uuid', $signatureUuid);
|
||||
$stmt->bindParam(':calling_encryption_public_key', $encryptionPublicKey);
|
||||
$receivingPeerAddress = $receivingPeer->getAddress();
|
||||
$stmt->bindParam(':receiving_peer', $receivingPeerAddress);
|
||||
$stmt->bindParam(':transport_encryption_algorithm', $transportEncryptionAlgorithm);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to create the encryption channel', $e);
|
||||
}
|
||||
|
||||
return $uuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the incoming encryption channels for the specified peer.
|
||||
*
|
||||
* @param string|PeerAddress $peerAddress The peer to retrieve the channels for.
|
||||
* @param int $limit The maximum number of channels to retrieve.
|
||||
* @param int $page The page of channels to retrieve.
|
||||
* @return EncryptionChannelRecord[] The incoming channels for the peer.
|
||||
* @throws DatabaseOperationException If an error occurs while retrieving the channels.
|
||||
*/
|
||||
public static function getChannels(string|PeerAddress $peerAddress, int $limit=100, int $page=0): array
|
||||
{
|
||||
if($peerAddress instanceof PeerAddress)
|
||||
{
|
||||
$peerAddress = $peerAddress->getAddress();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT * FROM encryption_channels WHERE calling_peer=:address OR receiving_peer=:address LIMIT :limit OFFSET :offset');
|
||||
$stmt->bindParam(':address', $peerAddress);
|
||||
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
|
||||
$offset = $page * $limit;
|
||||
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
$results = $stmt->fetchAll();
|
||||
|
||||
$channels = [];
|
||||
foreach($results as $result)
|
||||
{
|
||||
$channels[] = new EncryptionChannelRecord($result);
|
||||
}
|
||||
|
||||
return $channels;
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to retrieve the encryption channels', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the incoming encryption channels for the specified peer.
|
||||
*
|
||||
* @param string|PeerAddress $peerAddress The peer to retrieve the channels for.
|
||||
* @param int $limit The maximum number of channels to retrieve.
|
||||
* @param int $page The page of channels to retrieve.
|
||||
* @return EncryptionChannelRecord[] The incoming channels for the peer.
|
||||
* @throws DatabaseOperationException If an error occurs while retrieving the channels.
|
||||
*/
|
||||
public static function getRequests(string|PeerAddress $peerAddress, int $limit=100, int $page=0): array
|
||||
{
|
||||
if($peerAddress instanceof PeerAddress)
|
||||
{
|
||||
$peerAddress = $peerAddress->getAddress();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT * FROM encryption_channels WHERE receiving_peer=:address AND state=:state LIMIT :limit OFFSET :offset');
|
||||
$stmt->bindParam(':address', $peerAddress);
|
||||
$state = EncryptionChannelState::AWAITING_RECEIVER->value;
|
||||
$stmt->bindParam(':state', $state);
|
||||
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
|
||||
$offset = $page * $limit;
|
||||
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
$results = $stmt->fetchAll();
|
||||
|
||||
$channels = [];
|
||||
foreach($results as $result)
|
||||
{
|
||||
$channels[] = new EncryptionChannelRecord($result);
|
||||
}
|
||||
|
||||
return $channels;
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to retrieve the encryption channels', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the incoming encryption channels for the specified peer.
|
||||
*
|
||||
* @param string|PeerAddress $peerAddress The peer to retrieve the channels for.
|
||||
* @param int $limit The maximum number of channels to retrieve.
|
||||
* @param int $page The page of channels to retrieve.
|
||||
* @return EncryptionChannelRecord[] The incoming channels for the peer.
|
||||
* @throws DatabaseOperationException If an error occurs while retrieving the channels.
|
||||
*/
|
||||
public static function getIncomingChannels(string|PeerAddress $peerAddress, int $limit=100, int $page=0): array
|
||||
{
|
||||
if($peerAddress instanceof PeerAddress)
|
||||
{
|
||||
$peerUuid = $peerAddress->getAddress();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT * FROM encryption_channels WHERE receiving_peer=:address LIMIT :limit OFFSET :offset');
|
||||
$stmt->bindParam(':address', $peerUuid);
|
||||
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
|
||||
$offset = $page * $limit;
|
||||
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
$results = $stmt->fetchAll();
|
||||
|
||||
$channels = [];
|
||||
foreach($results as $result)
|
||||
{
|
||||
$channels[] = new EncryptionChannelRecord($result);
|
||||
}
|
||||
|
||||
return $channels;
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to retrieve the encryption channels', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the outgoing channels for the specified peer.
|
||||
*
|
||||
* @param string|PeerAddress $peerAddress The peer to retrieve the channels for.
|
||||
* @param int $limit The maximum number of channels to retrieve.
|
||||
* @param int $page The page of channels to retrieve.
|
||||
* @return EncryptionChannelRecord[] The outgoing channels for the specified peer.
|
||||
* @throws DatabaseOperationException If an error occurs while retrieving the channels.
|
||||
*/
|
||||
public static function getOutgoingChannels(string|PeerAddress $peerAddress, int $limit=100, int $page=0): array
|
||||
{
|
||||
if($peerAddress instanceof PeerAddress)
|
||||
{
|
||||
$peerAddress = $peerAddress->getAddress();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT * FROM encryption_channels WHERE calling_peer=:address LIMIT :limit OFFSET :offset');
|
||||
$stmt->bindParam(':address', $peerAddress);
|
||||
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
|
||||
$offset = $page * $limit;
|
||||
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
$results = $stmt->fetchAll();
|
||||
|
||||
$channels = [];
|
||||
foreach($results as $result)
|
||||
{
|
||||
$channels[] = new EncryptionChannelRecord($result);
|
||||
}
|
||||
|
||||
return $channels;
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to retrieve the encryption channels', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Declines the encryption channel with the specified UUID.
|
||||
*
|
||||
* @param string $channelUuid The UUID of the channel to decline.
|
||||
* @throws DatabaseOperationException If an error occurs while declining the channel.
|
||||
*/
|
||||
public static function declineChannel(string $channelUuid): void
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('UPDATE encryption_channels SET state=:state WHERE uuid=:uuid');
|
||||
$state = EncryptionChannelState::DECLINED->value;
|
||||
$stmt->bindParam(':state', $state);
|
||||
$stmt->bindParam(':uuid', $channelUuid);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to decline the encryption channel', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Accepts the encryption channel with the specified UUID.
|
||||
*
|
||||
* @param string $channelUuid The UUID of the channel to accept.
|
||||
* @param string $signatureUuid The UUID of the signature used to create the channel.
|
||||
* @param string $encryptionPublicKey The public key used for encryption.
|
||||
* @param string $encryptedTransportEncryptionKey The encrypted transport encryption key.
|
||||
* @throws DatabaseOperationException If an error occurs while accepting the channel.
|
||||
*/
|
||||
public static function acceptChannel(string $channelUuid, string $signatureUuid, string $encryptionPublicKey, string $encryptedTransportEncryptionKey): void
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('UPDATE encryption_channels SET state=:state, receiving_signature_uuid=:receiving_signature_uuid, receiving_encryption_public_key=:receiving_encryption_public_key, transport_encryption_algorithm=:transport_encryption_algorithm, transport_encryption_key=:transport_encryption_key WHERE uuid=:uuid');
|
||||
$state = EncryptionChannelState::OPENED->value;
|
||||
$stmt->bindParam(':state', $state);
|
||||
$stmt->bindParam(':receiving_signature_uuid', $signatureUuid);
|
||||
$stmt->bindParam(':receiving_encryption_public_key', $encryptionPublicKey);
|
||||
$stmt->bindParam(':transport_encryption_key', $encryptedTransportEncryptionKey);
|
||||
$stmt->bindParam(':uuid', $channelUuid);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to accept the encryption channel', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the encryption channel with the specified UUID.
|
||||
*
|
||||
* @param string $channelUuid The UUID of the channel to retrieve.
|
||||
* @return EncryptionChannelRecord|null The record of the encryption channel. Null if the channel does not exist.
|
||||
* @throws DatabaseOperationException If an error occurs while retrieving the channel.
|
||||
*/
|
||||
public static function getChannel(string $channelUuid): ?EncryptionChannelRecord
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT * FROM encryption_channels WHERE uuid=:uuid');
|
||||
$stmt->bindParam(':uuid', $channelUuid);
|
||||
$stmt->execute();
|
||||
$result = $stmt->fetch();
|
||||
|
||||
if($result === false)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return new EncryptionChannelRecord($result);
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to retrieve the encryption channel', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the encryption channel with the specified UUID.
|
||||
*
|
||||
* @param string $channelUuid The UUID of the channel to delete.
|
||||
* @return void
|
||||
* @throws DatabaseOperationException If an error occurs while deleting the channel.
|
||||
*/
|
||||
public static function deleteChannel(string $channelUuid): void
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('DELETE FROM encryption_channels WHERE uuid=:uuid');
|
||||
$stmt->bindParam(':uuid', $channelUuid);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to delete the encryption channel', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the state of the encryption channel with the specified UUID.
|
||||
*
|
||||
* @param string $channelUuid The UUID of the channel to update.
|
||||
* @return EncryptionChannelState The current state of the channel.
|
||||
* @throws DatabaseOperationException If an error occurs while updating the channel state.
|
||||
*/
|
||||
public static function getChannelState(string $channelUuid): EncryptionChannelState
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT state FROM encryption_channels WHERE uuid=:uuid');
|
||||
$stmt->bindParam(':uuid', $channelUuid);
|
||||
$stmt->execute();
|
||||
|
||||
return EncryptionChannelState::from($stmt->fetchColumn());
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to retrieve the encryption channel state', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the state of the encryption channel with the specified UUID.
|
||||
*
|
||||
* @param string $channelUuid The UUID of the channel to update.
|
||||
* @param EncryptionChannelState $state The new state of the channel.
|
||||
* @return void The current state of the channel.
|
||||
* @throws DatabaseOperationException If an error occurs while updating the channel state.
|
||||
*/
|
||||
public static function updateChannelState(string $channelUuid, EncryptionChannelState $state): void
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('UPDATE encryption_channels SET state=:state WHERE uuid=:uuid');
|
||||
$state = $state->value;
|
||||
$stmt->bindParam(':state', $state);
|
||||
$stmt->bindParam(':uuid', $channelUuid);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to update the encryption channel state', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a channel with the provided UUID exists.
|
||||
*
|
||||
* @param string $uuid The UUID of the channel to check.
|
||||
* @return bool True if the channel exists, False otherwise.
|
||||
* @throws DatabaseOperationException If an error occurs while checking the channel.
|
||||
*/
|
||||
public static function channelExists(string $uuid): bool
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT COUNT(*) FROM encryption_channels WHERE uuid=:uuid');
|
||||
$stmt->bindParam(':uuid', $uuid);
|
||||
$stmt->execute();
|
||||
|
||||
return $stmt->fetchColumn() > 0;
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('There was an error while trying to check if the channel UUID exists', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends data to the specified channel.
|
||||
*
|
||||
* @param string $channelUuid The UUID of the channel to send the data to.
|
||||
* @param string $message The message to send.
|
||||
* @param string $signature The signature of the message.
|
||||
* @param CommunicationRecipientType $recipient The recipient type.
|
||||
* @return string The UUID of the sent message.
|
||||
* @throws DatabaseOperationException If an error occurs while sending the message.
|
||||
*/
|
||||
public static function sendData(string $channelUuid, string $message, string $signature, CommunicationRecipientType $recipient): string
|
||||
{
|
||||
$uuid = UuidV4::v4()->toRfc4122();
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('INSERT INTO channel_com (uuid, channel_uuid, recipient, message, signature) VALUES (:uuid, :channel_uuid, :recipient, :message, :signature)');
|
||||
$stmt->bindParam(':uuid', $uuid);
|
||||
$stmt->bindParam(':channel_uuid', $channelUuid);
|
||||
$recipient = $recipient->value;
|
||||
$stmt->bindParam(':recipient', $recipient);
|
||||
$stmt->bindParam(':message', $message);
|
||||
$stmt->bindParam(':signature', $signature);
|
||||
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to send the message', $e);
|
||||
}
|
||||
|
||||
return $uuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the messages for the specified channel and recipient.
|
||||
*
|
||||
* @param string $channelUuid The UUID of the channel to retrieve the messages for.
|
||||
* @param CommunicationRecipientType $recipient The recipient type to retrieve the messages for.
|
||||
* @return ChannelMessageRecord[] The messages for the specified channel and recipient.
|
||||
* @throws DatabaseOperationException If an error occurs while retrieving the messages.
|
||||
*/
|
||||
public static function receiveData(string $channelUuid, CommunicationRecipientType $recipient): array
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT * FROM channel_com WHERE channel_uuid=:channel_uuid AND recipient=:recipient AND received=0 ORDER BY timestamp');
|
||||
$stmt->bindParam(':channel_uuid', $channelUuid);
|
||||
$recipient = $recipient->value;
|
||||
$stmt->bindParam(':recipient', $recipient);
|
||||
$stmt->execute();
|
||||
$results = $stmt->fetchAll();
|
||||
|
||||
$messages = [];
|
||||
foreach($results as $result)
|
||||
{
|
||||
$messages[] = new ChannelMessageRecord($result);
|
||||
}
|
||||
|
||||
return $messages;
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to retrieve the messages', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the message with the specified UUID.
|
||||
*
|
||||
* @param string $channelUuid The UUID of the channel to retrieve the message for.
|
||||
* @param string $messageUuid The UUID of the message to retrieve.
|
||||
* @return ChannelMessageRecord|null The message with the specified UUID. Null if the message does not exist.
|
||||
* @throws DatabaseOperationException If an error occurs while retrieving the message.
|
||||
*/
|
||||
public static function getData(string $channelUuid, string $messageUuid): ?ChannelMessageRecord
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT * FROM channel_com WHERE channel_uuid=:channel_uuid AND uuid=:uuid');
|
||||
$stmt->bindParam(':channel_uuid', $channelUuid);
|
||||
$stmt->bindParam(':uuid', $messageUuid);
|
||||
$stmt->execute();
|
||||
$result = $stmt->fetch();
|
||||
|
||||
if($result === false)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return new ChannelMessageRecord($result);
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to retrieve the message', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Imports the specified message data into the database.
|
||||
*
|
||||
* @param ChannelMessageRecord $message The message data to import.
|
||||
* @throws DatabaseOperationException If an error occurs while importing the message.
|
||||
*/
|
||||
public static function importData(ChannelMessageRecord $message): void
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('INSERT INTO channel_com (uuid, channel_uuid, recipient, message, signature, received, timestamp) VALUES (:uuid, :channel_uuid, :recipient, :message, :signature, :received, :timestamp)');
|
||||
$uuid = $message->getUuid();
|
||||
$stmt->bindParam(':uuid', $uuid);
|
||||
$channelUuid = $message->getChannelUuid();
|
||||
$stmt->bindParam(':channel_uuid', $channelUuid);
|
||||
$recipient = $message->getRecipient()->value;
|
||||
$stmt->bindParam(':recipient', $recipient);
|
||||
$messageData = $message->getMessage();
|
||||
$stmt->bindParam(':message', $messageData);
|
||||
$signature = $message->getSignature();
|
||||
$stmt->bindParam(':signature', $signature);
|
||||
$received = $message->isReceived() ? 1 : 0;
|
||||
$stmt->bindParam(':received', $received);
|
||||
$timestamp = $message->getTimestamp();
|
||||
$stmt->bindParam(':timestamp', $timestamp);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to import the message', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks the message with the specified UUID as received.
|
||||
*
|
||||
* @param string $uuid The UUID of the message to mark as received.
|
||||
* @throws DatabaseOperationException If an error occurs while marking the message as received.
|
||||
*/
|
||||
public static function markDataAsReceived(string $uuid): void
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('UPDATE channel_com SET received=1 WHERE uuid=:uuid');
|
||||
$stmt->bindParam(':uuid', $uuid);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to mark the message as received', $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the message with the specified UUID.
|
||||
*
|
||||
* @param string $uuid The UUID of the message to delete.
|
||||
* @throws DatabaseOperationException If an error occurs while deleting the message.
|
||||
*/
|
||||
public static function deleteData(string $uuid): void
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('DELETE FROM channel_com WHERE uuid=:uuid');
|
||||
$stmt->bindParam(':uuid', $uuid);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException('Failed to delete the message', $e);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,160 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Socialbox\Objects\Database;
|
||||
|
||||
use DateMalformedStringException;
|
||||
use DateTime;
|
||||
use InvalidArgumentException;
|
||||
use Socialbox\Enums\Types\CommunicationRecipientType;
|
||||
use Socialbox\Interfaces\SerializableInterface;
|
||||
use Socialbox\Objects\Standard\EncryptionChannelMessage;
|
||||
|
||||
class ChannelMessageRecord implements SerializableInterface
|
||||
{
|
||||
private string $uuid;
|
||||
private string $channelUuid;
|
||||
private CommunicationRecipientType $recipient;
|
||||
private string $message;
|
||||
private string $signature;
|
||||
private bool $received;
|
||||
private DateTime $timestamp;
|
||||
|
||||
/**
|
||||
* Constructs a new instance of this class and initializes its properties with the provided data.
|
||||
*
|
||||
* @param array $data An associative array containing initialization data. Expected keys:
|
||||
* - 'uuid' (string): The unique identifier.
|
||||
* - 'channel_uuid' (string): The channel UUID.
|
||||
* - 'recipient' (string): The recipient type, which will be cast to a CommunicationRecipientType instance.
|
||||
* - 'message' (string): The message.
|
||||
* - 'signature' (string): The signature.
|
||||
* - 'received' (bool): Whether the message has been received.
|
||||
* - 'timestamp' (int|string|\DateTime): The timestamp of the message.
|
||||
*/
|
||||
public function __construct(array $data)
|
||||
{
|
||||
$this->uuid = $data['uuid'];
|
||||
$this->channelUuid = $data['channel_uuid'];
|
||||
$this->recipient = CommunicationRecipientType::from($data['recipient']);
|
||||
$this->message = $data['message'];
|
||||
$this->signature = $data['signature'];
|
||||
$this->received = (bool)$data['received'];
|
||||
|
||||
if($data['timestamp'] instanceof DateTime)
|
||||
{
|
||||
$this->timestamp = $data['timestamp'];
|
||||
}
|
||||
elseif(is_int($data['timestamp']))
|
||||
{
|
||||
$this->timestamp = (new DateTime())->setTimestamp($data['timestamp']);
|
||||
}
|
||||
elseif(is_string($data['timestamp']))
|
||||
{
|
||||
$this->timestamp = new DateTime($data['timestamp']);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException('Invalid timestamp type, got ' . gettype($data['timestamp']));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the unique identifier for the message.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUuid(): string
|
||||
{
|
||||
return $this->uuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the UUID of the channel that the message belongs to.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getChannelUuid(): string
|
||||
{
|
||||
return $this->channelUuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the recipient type of the message.
|
||||
*
|
||||
* @return CommunicationRecipientType
|
||||
*/
|
||||
public function getRecipient(): CommunicationRecipientType
|
||||
{
|
||||
return $this->recipient;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the message content.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getMessage(): string
|
||||
{
|
||||
return $this->message;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the signature of the message.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSignature(): string
|
||||
{
|
||||
return $this->signature;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the message has been received.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isReceived(): bool
|
||||
{
|
||||
return $this->received;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the timestamp of the message.
|
||||
*
|
||||
* @return DateTime
|
||||
*/
|
||||
public function getTimestamp(): DateTime
|
||||
{
|
||||
return $this->timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public static function fromArray(array $data): ChannelMessageRecord
|
||||
{
|
||||
return new self($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function toArray(): array
|
||||
{
|
||||
return [
|
||||
'uuid' => $this->uuid,
|
||||
'channel_uuid' => $this->channelUuid,
|
||||
'recipient' => $this->recipient->value,
|
||||
'message' => $this->message,
|
||||
'signature' => $this->signature,
|
||||
'received' => $this->received,
|
||||
'timestamp' => $this->timestamp->format('Y-m-d H:i:s')
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
public function toStandard(): EncryptionChannelMessage
|
||||
{
|
||||
return new EncryptionChannelMessage($this->toArray());
|
||||
}
|
||||
}
|
|
@ -1,256 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Socialbox\Objects\Database;
|
||||
|
||||
use DateTime;
|
||||
use InvalidArgumentException;
|
||||
use Socialbox\Enums\Status\EncryptionChannelState;
|
||||
use Socialbox\Interfaces\SerializableInterface;
|
||||
use Socialbox\Objects\PeerAddress;
|
||||
use Socialbox\Objects\Standard\EncryptionChannel;
|
||||
|
||||
class EncryptionChannelRecord implements SerializableInterface
|
||||
{
|
||||
private string $uuid;
|
||||
private PeerAddress $callingPeer;
|
||||
private string $callingSignatureUuid;
|
||||
private string $callingEncryptionPublicKey;
|
||||
private PeerAddress $receivingPeer;
|
||||
private ?string $receivingSignatureUuid;
|
||||
private ?string $receivingEncryptionPublicKey;
|
||||
private string $transportEncryptionAlgorithm;
|
||||
private ?string $transportEncryptionKey;
|
||||
private EncryptionChannelState $state;
|
||||
private DateTime $created;
|
||||
|
||||
/**
|
||||
* Public Constructor for the encryption channel record
|
||||
*
|
||||
* @param array $data
|
||||
*/
|
||||
public function __construct(array $data)
|
||||
{
|
||||
$this->uuid = $data['uuid'];
|
||||
|
||||
if(!isset($data['calling_peer']))
|
||||
{
|
||||
throw new InvalidArgumentException('Missing property calling_peer');
|
||||
}
|
||||
else
|
||||
{
|
||||
if(is_string($data['calling_peer']))
|
||||
{
|
||||
$this->callingPeer = PeerAddress::fromAddress($data['calling_peer']);
|
||||
}
|
||||
elseif($data['calling_peer'] instanceof PeerAddress)
|
||||
{
|
||||
$this->callingPeer = $data['calling_peer'];
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException('Unexpected calling_peer type, got ' . gettype($data['calling_peer']));
|
||||
}
|
||||
}
|
||||
|
||||
$this->callingSignatureUuid = $data['calling_signature_uuid'];
|
||||
$this->callingEncryptionPublicKey = $data['calling_encryption_public_key'];
|
||||
|
||||
if(!isset($data['receiving_peer']))
|
||||
{
|
||||
throw new InvalidArgumentException('Missing property receiving_peer');
|
||||
}
|
||||
else
|
||||
{
|
||||
if(is_string($data['receiving_peer']))
|
||||
{
|
||||
$this->receivingPeer = PeerAddress::fromAddress($data['receiving_peer']);
|
||||
}
|
||||
elseif($data['receiving_peer'] instanceof PeerAddress)
|
||||
{
|
||||
$this->receivingPeer = $data['receiving_peer'];
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException('Unexpected receiving_peer type, got ' . gettype($data['receiving_peer']));
|
||||
}
|
||||
}
|
||||
|
||||
$this->receivingSignatureUuid = $data['receiving_signature_uuid'] ?? null;
|
||||
$this->receivingEncryptionPublicKey = $data['receiving_encryption_public_key'] ?? null;
|
||||
$this->transportEncryptionAlgorithm = $data['transport_encryption_algorithm'];
|
||||
$this->transportEncryptionKey = $data['transport_encryption_key'] ?? null;
|
||||
$this->state = EncryptionChannelState::tryFrom($data['state']) ?? EncryptionChannelState::ERROR;
|
||||
|
||||
if(!isset($data['created']))
|
||||
{
|
||||
throw new InvalidArgumentException('Missing property created');
|
||||
}
|
||||
else
|
||||
{
|
||||
if(is_string($data['created']))
|
||||
{
|
||||
$this->created = new DateTime($data['created']);
|
||||
}
|
||||
elseif(is_int($data['created']))
|
||||
{
|
||||
$this->created = (new DateTime())->setTimestamp($data['created']);
|
||||
}
|
||||
elseif($data['created'] instanceof DateTime)
|
||||
{
|
||||
$this->created = $data['created'];
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException('Unexpected created type, got ' . gettype($data['created']));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Unique Universal Identifier for the encryption record
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUuid(): string
|
||||
{
|
||||
return $this->uuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the address of the calling peer
|
||||
*
|
||||
* @return PeerAddress
|
||||
*/
|
||||
public function getCallingPeer(): PeerAddress
|
||||
{
|
||||
return $this->callingPeer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the UUID of the signing keypair that the caller is using
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getCallingSignatureUuid(): string
|
||||
{
|
||||
return $this->callingSignatureUuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the public key of the encryption keypair that the caller is using
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getCallingEncryptionPublicKey(): string
|
||||
{
|
||||
return $this->callingEncryptionPublicKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the address of the receiving peer
|
||||
*
|
||||
* @return PeerAddress
|
||||
*/
|
||||
public function getReceivingPeer(): PeerAddress
|
||||
{
|
||||
return $this->receivingPeer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the UUID of the signing keypair that the receiver is using
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getReceivingSignatureUuid(): ?string
|
||||
{
|
||||
return $this->receivingSignatureUuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the public key of the encryption keypair that the receiver is using
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getReceivingEncryptionPublicKey(): ?string
|
||||
{
|
||||
return $this->receivingEncryptionPublicKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the algorithm used for transport encryption
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTransportEncryptionAlgorithm(): string
|
||||
{
|
||||
return $this->transportEncryptionAlgorithm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the key used for transport encryption
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getTransportEncryptionKey(): ?string
|
||||
{
|
||||
return $this->transportEncryptionKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current state of the encryption channel
|
||||
*
|
||||
* @return EncryptionChannelState
|
||||
*/
|
||||
public function getState(): EncryptionChannelState
|
||||
{
|
||||
return $this->state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the creation date of the encryption channel
|
||||
*
|
||||
* @return DateTime
|
||||
*/
|
||||
public function getCreated(): DateTime
|
||||
{
|
||||
return $this->created;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public static function fromArray(array $data): EncryptionChannelRecord
|
||||
{
|
||||
return new self($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function toArray(): array
|
||||
{
|
||||
return [
|
||||
'uuid' => $this->uuid,
|
||||
'calling_peer' => $this->callingPeer->getAddress(),
|
||||
'calling_signature_uuid' => $this->callingSignatureUuid,
|
||||
'calling_encryption_public_key' => $this->callingEncryptionPublicKey,
|
||||
'receiving_peer' => $this->receivingPeer->getAddress(),
|
||||
'receiving_signature_uuid' => $this->receivingSignatureUuid,
|
||||
'receiving_encryption_public_key' => $this->receivingEncryptionPublicKey,
|
||||
'transport_encryption_algorithm' => $this->transportEncryptionAlgorithm,
|
||||
'transport_encryption_key' => $this->transportEncryptionKey,
|
||||
'state' => $this->state->value,
|
||||
'created' => $this->created->format('Y-m-d H:i:s')
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the Encryption Channel Record to a Standard Encryption Channel
|
||||
*
|
||||
* @return EncryptionChannel
|
||||
*/
|
||||
public function toStandard(): EncryptionChannel
|
||||
{
|
||||
return new EncryptionChannel($this->toArray());
|
||||
}
|
||||
}
|
|
@ -1,222 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Socialbox\Objects\Standard;
|
||||
|
||||
use DateTime;
|
||||
use InvalidArgumentException;
|
||||
use Socialbox\Enums\Status\EncryptionChannelState;
|
||||
use Socialbox\Interfaces\SerializableInterface;
|
||||
|
||||
class EncryptionChannel implements SerializableInterface
|
||||
{
|
||||
private string $uuid;
|
||||
private string $callingPeer;
|
||||
private string $callingSignatureUuid;
|
||||
private string $callingSignaturePublicKey;
|
||||
private string $callingEncryptionPublicKey;
|
||||
private string $receivingPeer;
|
||||
private ?string $receivingSignatureUuid;
|
||||
private ?string $receivingSignaturePublicKey;
|
||||
private ?string $receivingEncryptionPublicKey;
|
||||
private string $transportEncryptionAlgorithm;
|
||||
private ?string $transportEncryptionKey;
|
||||
private EncryptionChannelState $state;
|
||||
private int $created;
|
||||
|
||||
/**
|
||||
* EncryptionChannel constructor.
|
||||
*
|
||||
* @param array $data
|
||||
*/
|
||||
public function __construct(array $data)
|
||||
{
|
||||
$this->uuid = $data['uuid'];
|
||||
$this->callingPeer = $data['calling_peer'];
|
||||
$this->callingSignatureUuid = $data['calling_signature_uuid'];
|
||||
$this->callingSignaturePublicKey = $data['calling_signature_public_key'];
|
||||
$this->callingEncryptionPublicKey = $data['calling_encryption_public_key'];
|
||||
$this->receivingPeer = $data['receiving_peer'];
|
||||
$this->receivingSignatureUuid = $data['receiving_signature_uuid'];
|
||||
$this->receivingSignaturePublicKey = $data['receiving_signature_public_key'];
|
||||
$this->receivingEncryptionPublicKey = $data['receiving_encryption_public_key'];
|
||||
$this->transportEncryptionAlgorithm = $data['transport_encryption_algorithm'];
|
||||
$this->transportEncryptionKey = $data['transport_encryption_key'];
|
||||
$this->state = EncryptionChannelState::from($data['state']);
|
||||
|
||||
if($data['created'] instanceof DateTime)
|
||||
{
|
||||
$this->created = $data['created']->getTimestamp();
|
||||
}
|
||||
elseif(is_int($data['created']))
|
||||
{
|
||||
$this->created = $data['created'];
|
||||
}
|
||||
elseif(is_string($data['created']))
|
||||
{
|
||||
$this->created = strtotime($data['created']) ?: throw new InvalidArgumentException('Invalid date format');
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException('Invalid date format, got type: ' . gettype($data['created']));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Unique Universal Identifier of the Encryption Channel
|
||||
*
|
||||
* @return string The UUID of the Encryption Channel
|
||||
*/
|
||||
public function getUuid(): string
|
||||
{
|
||||
return $this->uuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Peer address that initiated the Encryption Channel
|
||||
*
|
||||
* @return string The Peer address that initiated the Encryption Channel
|
||||
*/
|
||||
public function getCallingPeer(): string
|
||||
{
|
||||
return $this->callingPeer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Unique Universal Identifier of the Signature used by the calling Peer
|
||||
*
|
||||
* @return string The UUID of the Signature used by the calling Peer
|
||||
*/
|
||||
public function getCallingSignatureUuid(): string
|
||||
{
|
||||
return $this->callingSignatureUuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Public Key of the Signature used by the calling Peer
|
||||
*
|
||||
* @return string The Public Key of the Signature used by the calling Peer
|
||||
*/
|
||||
public function getCallingSignaturePublicKey(): string
|
||||
{
|
||||
return $this->callingSignaturePublicKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Public Key of the Encryption used by the calling Peer
|
||||
*
|
||||
* @return string The Public Key of the Encryption used by the calling Peer
|
||||
*/
|
||||
public function getCallingEncryptionPublicKey(): string
|
||||
{
|
||||
return $this->callingEncryptionPublicKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Peer address that received the Encryption Channel
|
||||
*
|
||||
* @return string The Peer address that received the Encryption Channel
|
||||
*/
|
||||
public function getReceivingPeer(): string
|
||||
{
|
||||
return $this->receivingPeer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Unique Universal Identifier of the Signature used by the receiving Peer
|
||||
*
|
||||
* @return string|null The UUID of the Signature used by the receiving Peer, or null if not set
|
||||
*/
|
||||
public function getReceivingSignatureUuid(): ?string
|
||||
{
|
||||
return $this->receivingSignatureUuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Public Key of the Signature used by the receiving Peer
|
||||
*
|
||||
* @return string|null The Public Key of the Signature used by the receiving Peer, or null if not set
|
||||
*/
|
||||
public function getReceivingSignaturePublicKey(): ?string
|
||||
{
|
||||
return $this->receivingSignaturePublicKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Public Key of the Encryption used by the receiving Peer
|
||||
*
|
||||
* @return string|null The Public Key of the Encryption used by the receiving Peer, or null if not set
|
||||
*/
|
||||
public function getReceivingEncryptionPublicKey(): ?string
|
||||
{
|
||||
return $this->receivingEncryptionPublicKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Algorithm used for the Transport Encryption
|
||||
*
|
||||
* @return string The Algorithm used for the Transport Encryption
|
||||
*/
|
||||
public function getTransportEncryptionAlgorithm(): string
|
||||
{
|
||||
return $this->transportEncryptionAlgorithm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Key used for the Transport Encryption
|
||||
*
|
||||
* @return string|null The Key used for the Transport Encryption, or null if not set
|
||||
*/
|
||||
public function getTransportEncryptionKey(): ?string
|
||||
{
|
||||
return $this->transportEncryptionKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the State of the Encryption Channel
|
||||
*
|
||||
* @return EncryptionChannelState The State of the Encryption Channel
|
||||
*/
|
||||
public function getState(): EncryptionChannelState
|
||||
{
|
||||
return $this->state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Unix Timestamp of the creation date of the Encryption Channel
|
||||
*
|
||||
* @return int The Unix Timestamp of the creation date of the Encryption Channel
|
||||
*/
|
||||
public function getCreated(): int
|
||||
{
|
||||
return $this->created;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public static function fromArray(array $data): EncryptionChannel
|
||||
{
|
||||
return new self($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function toArray(): array
|
||||
{
|
||||
return [
|
||||
'uuid' => $this->uuid,
|
||||
'calling_peer' => $this->callingPeer,
|
||||
'calling_signature_uuid' => $this->callingSignatureUuid,
|
||||
'calling_encryption_public_key' => $this->callingEncryptionPublicKey,
|
||||
'receiving_peer' => $this->receivingPeer,
|
||||
'receiving_signature_uuid' => $this->receivingSignatureUuid,
|
||||
'receiving_signature_public_key' => $this->receivingSignaturePublicKey,
|
||||
'receiving_encryption_public_key' => $this->receivingEncryptionPublicKey,
|
||||
'transport_encryption_algorithm' => $this->transportEncryptionAlgorithm,
|
||||
'transport_encryption_key' => $this->transportEncryptionKey,
|
||||
'state' => $this->state->value,
|
||||
'created' => $this->created
|
||||
];
|
||||
}
|
||||
}
|
|
@ -1,145 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Socialbox\Objects\Standard;
|
||||
|
||||
use DateTime;
|
||||
use InvalidArgumentException;
|
||||
use Socialbox\Enums\Types\CommunicationRecipientType;
|
||||
use Socialbox\Interfaces\SerializableInterface;
|
||||
|
||||
class EncryptionChannelMessage implements SerializableInterface
|
||||
{
|
||||
private string $uuid;
|
||||
private string $channelUuid;
|
||||
private CommunicationRecipientType $recipient;
|
||||
private string $message;
|
||||
private string $signature;
|
||||
private bool $received;
|
||||
private int $timestamp;
|
||||
|
||||
/**
|
||||
* EncryptionChannelMessage constructor.
|
||||
*
|
||||
* @param array $data
|
||||
*/
|
||||
public function __construct(array $data)
|
||||
{
|
||||
$this->uuid = $data['uuid'];
|
||||
$this->channelUuid = $data['channel_uuid'];
|
||||
$this->recipient = CommunicationRecipientType::from($data['recipient']);
|
||||
$this->message = $data['message'];
|
||||
$this->signature = $data['signature'];
|
||||
$this->received = (bool)$data['received'];
|
||||
|
||||
if($data['timestamp'] instanceof DateTime)
|
||||
{
|
||||
$this->timestamp = $data['timestamp']->getTimestamp();
|
||||
}
|
||||
elseif(is_int($data['timestamp']))
|
||||
{
|
||||
$this->timestamp = $data['timestamp'];
|
||||
}
|
||||
elseif(is_string($data['timestamp']))
|
||||
{
|
||||
$this->timestamp = strtotime($data['timestamp']) ?: throw new InvalidArgumentException('Invalid date format');
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException('Invalid date format, got type: ' . gettype($data['timestamp']));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The Unique Universal Identifier of the message.
|
||||
*
|
||||
* @return string The UUID of the message.
|
||||
*/
|
||||
public function getUuid(): string
|
||||
{
|
||||
return $this->uuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* The Unique Universal Identifier of the channel.
|
||||
*
|
||||
* @return string The UUID of the channel.
|
||||
*/
|
||||
public function getChannelUuid(): string
|
||||
{
|
||||
return $this->channelUuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* The recipient of the message.
|
||||
*
|
||||
* @return CommunicationRecipientType The recipient of the message.
|
||||
*/
|
||||
public function getRecipient(): CommunicationRecipientType
|
||||
{
|
||||
return $this->recipient;
|
||||
}
|
||||
|
||||
/**
|
||||
* The encrypted message.
|
||||
*
|
||||
* @return string The message.
|
||||
*/
|
||||
public function getMessage(): string
|
||||
{
|
||||
return $this->message;
|
||||
}
|
||||
|
||||
/**
|
||||
* The signature of the decrypted message.
|
||||
*
|
||||
* @return string The signature of the message.
|
||||
*/
|
||||
public function getSignature(): string
|
||||
{
|
||||
return $this->signature;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the message has been received.
|
||||
*
|
||||
* @return bool Whether the message has been received.
|
||||
*/
|
||||
public function isReceived(): bool
|
||||
{
|
||||
return $this->received;
|
||||
}
|
||||
|
||||
/**
|
||||
* The timestamp of the message.
|
||||
*
|
||||
* @return int The timestamp of the message.
|
||||
*/
|
||||
public function getTimestamp(): int
|
||||
{
|
||||
return $this->timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public static function fromArray(array $data): EncryptionChannelMessage
|
||||
{
|
||||
return new self($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function toArray(): array
|
||||
{
|
||||
return [
|
||||
'uuid' => $this->uuid,
|
||||
'channel_uuid' => $this->channelUuid,
|
||||
'recipient' => $this->recipient->value,
|
||||
'message' => $this->message,
|
||||
'signature' => $this->signature,
|
||||
'received' => $this->received,
|
||||
'timestamp' => $this->timestamp
|
||||
];
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue