From d929a9ec4cc188ac9c790d5f4c70fc709d6eda1e Mon Sep 17 00:00:00 2001 From: netkas Date: Thu, 6 Feb 2025 15:38:52 -0500 Subject: [PATCH] Added Standard Objects for the encryption channel --- .../Objects/Database/ChannelMessageRecord.php | 34 ++- .../Database/EncryptionChannelRecord.php | 11 + .../Objects/Standard/EncryptionChannel.php | 222 ++++++++++++++++++ .../Standard/EncryptionChannelMessage.php | 145 ++++++++++++ 4 files changed, 405 insertions(+), 7 deletions(-) create mode 100644 src/Socialbox/Objects/Standard/EncryptionChannel.php create mode 100644 src/Socialbox/Objects/Standard/EncryptionChannelMessage.php diff --git a/src/Socialbox/Objects/Database/ChannelMessageRecord.php b/src/Socialbox/Objects/Database/ChannelMessageRecord.php index aed0925..99c7c5a 100644 --- a/src/Socialbox/Objects/Database/ChannelMessageRecord.php +++ b/src/Socialbox/Objects/Database/ChannelMessageRecord.php @@ -2,8 +2,12 @@ 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 { @@ -13,7 +17,7 @@ private string $message; private string $signature; private bool $received; - private \DateTime $timestamp; + private DateTime $timestamp; /** * Constructs a new instance of this class and initializes its properties with the provided data. @@ -26,7 +30,7 @@ * - 'signature' (string): The signature. * - 'received' (bool): Whether the message has been received. * - 'timestamp' (int|string|\DateTime): The timestamp of the message. - * @return void + * @throws DateMalformedStringException If the timestamp is a string that cannot be parsed. */ public function __construct(array $data) { @@ -37,21 +41,21 @@ $this->signature = $data['signature']; $this->received = (bool)$data['received']; - if($data['timestamp'] instanceof \DateTime) + if($data['timestamp'] instanceof DateTime) { $this->timestamp = $data['timestamp']; } elseif(is_int($data['timestamp'])) { - $this->timestamp = (new \DateTime())->setTimestamp($data['timestamp']); + $this->timestamp = (new DateTime())->setTimestamp($data['timestamp']); } elseif(is_string($data['timestamp'])) { - $this->timestamp = new \DateTime($data['timestamp']); + $this->timestamp = new DateTime($data['timestamp']); } else { - throw new \InvalidArgumentException('Invalid timestamp type, got ' . gettype($data['timestamp'])); + throw new InvalidArgumentException('Invalid timestamp type, got ' . gettype($data['timestamp'])); } } @@ -105,12 +109,22 @@ return $this->signature; } + /** + * Returns whether the message has been received. + * + * @return bool + */ public function isReceived(): bool { return $this->received; } - public function getTimestamp(): \DateTime + /** + * Returns the timestamp of the message. + * + * @return DateTime + */ + public function getTimestamp(): DateTime { return $this->timestamp; } @@ -138,4 +152,10 @@ 'timestamp' => $this->timestamp->format('Y-m-d H:i:s') ]; } + + + public function toStandard(): EncryptionChannelMessage + { + return new EncryptionChannelMessage($this->toArray()); + } } \ No newline at end of file diff --git a/src/Socialbox/Objects/Database/EncryptionChannelRecord.php b/src/Socialbox/Objects/Database/EncryptionChannelRecord.php index c8979f0..92a4246 100644 --- a/src/Socialbox/Objects/Database/EncryptionChannelRecord.php +++ b/src/Socialbox/Objects/Database/EncryptionChannelRecord.php @@ -7,6 +7,7 @@ use Socialbox\Enums\Status\EncryptionChannelState; use Socialbox\Interfaces\SerializableInterface; use Socialbox\Objects\PeerAddress; + use Socialbox\Objects\Standard\EncryptionChannel; class EncryptionChannelRecord implements SerializableInterface { @@ -256,4 +257,14 @@ '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()); + } } \ No newline at end of file diff --git a/src/Socialbox/Objects/Standard/EncryptionChannel.php b/src/Socialbox/Objects/Standard/EncryptionChannel.php new file mode 100644 index 0000000..f0df342 --- /dev/null +++ b/src/Socialbox/Objects/Standard/EncryptionChannel.php @@ -0,0 +1,222 @@ +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 + ]; + } + } \ No newline at end of file diff --git a/src/Socialbox/Objects/Standard/EncryptionChannelMessage.php b/src/Socialbox/Objects/Standard/EncryptionChannelMessage.php new file mode 100644 index 0000000..ccd8573 --- /dev/null +++ b/src/Socialbox/Objects/Standard/EncryptionChannelMessage.php @@ -0,0 +1,145 @@ +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 + ]; + } + } \ No newline at end of file