From 66d2cd79075d72f3111dfc538039abd401936db8 Mon Sep 17 00:00:00 2001 From: netkas Date: Thu, 13 Mar 2025 14:20:27 -0400 Subject: [PATCH] Add AddressBookRevokeAllSignatures method for revoking all signing keys of a contact https://github.com/nosial/Socialbox-PHP/issues/73 --- .../AddressBookRevokeAllSignatures.php | 58 +++++++++++++++++++ src/Socialbox/Enums/StandardMethods.php | 7 ++- src/Socialbox/Managers/ContactManager.php | 34 +++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 src/Socialbox/Classes/StandardMethods/AddressBook/AddressBookRevokeAllSignatures.php diff --git a/src/Socialbox/Classes/StandardMethods/AddressBook/AddressBookRevokeAllSignatures.php b/src/Socialbox/Classes/StandardMethods/AddressBook/AddressBookRevokeAllSignatures.php new file mode 100644 index 0000000..362f40b --- /dev/null +++ b/src/Socialbox/Classes/StandardMethods/AddressBook/AddressBookRevokeAllSignatures.php @@ -0,0 +1,58 @@ +containsParameter('peer')) + { + throw new MissingRpcArgumentException('peer'); + } + + $peerAddress = PeerAddress::fromAddress($rpcRequest->getParameter('peer')); + + try + { + // Check if the contact already exists + $contact = ContactManager::getContact($request->getPeer(), $peerAddress); + } + catch (DatabaseOperationException $e) + { + throw new StandardRpcException('Failed to check contact state with calling peer', StandardError::INTERNAL_SERVER_ERROR, $e); + } + + if($contact === null) + { + return $rpcRequest->produceResponse(false); + } + + try + { + ContactManager::removeAllContactSigningKeys($contact); + } + catch (DatabaseOperationException $e) + { + throw new StandardRpcException('Failed to remove all contact signatures', StandardError::INTERNAL_SERVER_ERROR, $e); + } + + // Return success + return $rpcRequest->produceResponse(true); + } + } \ No newline at end of file diff --git a/src/Socialbox/Enums/StandardMethods.php b/src/Socialbox/Enums/StandardMethods.php index 1f385a3..6cc526b 100644 --- a/src/Socialbox/Enums/StandardMethods.php +++ b/src/Socialbox/Enums/StandardMethods.php @@ -8,6 +8,7 @@ use Socialbox\Classes\StandardMethods\AddressBook\AddressBookDeleteContact; use Socialbox\Classes\StandardMethods\AddressBook\AddressBookGetContact; use Socialbox\Classes\StandardMethods\AddressBook\AddressBookGetContacts; + use Socialbox\Classes\StandardMethods\AddressBook\AddressBookRevokeAllSignatures; use Socialbox\Classes\StandardMethods\AddressBook\AddressBookRevokeSignature; use Socialbox\Classes\StandardMethods\AddressBook\AddressBookTrustSignature; use Socialbox\Classes\StandardMethods\AddressBook\AddressBookUpdateRelationship; @@ -79,8 +80,9 @@ case ADDRESS_BOOK_DELETE_CONTACT = 'addressBookDeleteContact'; case ADDRESS_BOOK_GET_CONTACT = 'addressBookGetContact'; case ADDRESS_BOOK_GET_CONTACTS = 'addressBookGetContacts'; - case ADDRESS_BOOK_TRUST_SIGNATURE = 'addressBookTrustSignature'; + case ADDRESS_BOOK_REVOKE_ALL_SIGNATURES = 'addressBookRevokeAllSignatures'; case ADDRESS_BOOK_REVOKE_SIGNATURE = 'addressBookRevokeSignature'; + case ADDRESS_BOOK_TRUST_SIGNATURE = 'addressBookTrustSignature'; case ADDRESS_BOOK_UPDATE_RELATIONSHIP = 'addressBookUpdateRelationship'; // Core Methods @@ -203,8 +205,9 @@ self::ADDRESS_BOOK_DELETE_CONTACT => AddressBookDeleteContact::execute($request, $rpcRequest), self::ADDRESS_BOOK_GET_CONTACT => AddressBookGetContact::execute($request, $rpcRequest), self::ADDRESS_BOOK_GET_CONTACTS => AddressBookGetContacts::execute($request, $rpcRequest), - self::ADDRESS_BOOK_TRUST_SIGNATURE => AddressBookTrustSignature::execute($request, $rpcRequest), + self::ADDRESS_BOOK_REVOKE_ALL_SIGNATURES => AddressBookRevokeAllSignatures::execute($request, $rpcRequest), self::ADDRESS_BOOK_REVOKE_SIGNATURE => AddressBookRevokeSignature::execute($request, $rpcRequest), + self::ADDRESS_BOOK_TRUST_SIGNATURE => AddressBookTrustSignature::execute($request, $rpcRequest), self::ADDRESS_BOOK_UPDATE_RELATIONSHIP => AddressBookUpdateRelationship::execute($request, $rpcRequest), // Core Methods diff --git a/src/Socialbox/Managers/ContactManager.php b/src/Socialbox/Managers/ContactManager.php index 006e5ff..967293e 100644 --- a/src/Socialbox/Managers/ContactManager.php +++ b/src/Socialbox/Managers/ContactManager.php @@ -432,6 +432,14 @@ } } + /** + * Removes a signing key from a contact in the database. + * + * @param string|ContactDatabaseRecord $contactUuid The unique identifier of the contact to remove the signing key from. + * @param string $signatureUuid The UUID of the signing key to remove. + * @return void + * @throws DatabaseOperationException If the database query fails. + */ public static function removeContactSigningKey(string|ContactDatabaseRecord $contactUuid, string $signatureUuid): void { if($contactUuid instanceof ContactDatabaseRecord) @@ -452,6 +460,32 @@ } } + /** + * Removes all signing keys for a contact from the database. + * + * @param string|ContactDatabaseRecord $contactUuid The unique identifier of the contact to remove all signing keys from. + * @return void + * @throws DatabaseOperationException If the database query fails. + */ + public static function removeAllContactSigningKeys(string|ContactDatabaseRecord $contactUuid): void + { + if($contactUuid instanceof ContactDatabaseRecord) + { + $contactUuid = $contactUuid->getUuid(); + } + + try + { + $statement = Database::getConnection()->prepare('DELETE FROM contacts_known_keys WHERE contact_uuid=:contact_uuid'); + $statement->bindParam(':contact_uuid', $contactUuid); + $statement->execute(); + } + catch(PDOException $e) + { + throw new DatabaseOperationException('Failed to remove all signing keys from a contact in the database', $e); + } + } + /** * Determines if a signing key UUID exists for a contact in the database. *