diff --git a/src/Socialbox/Classes/RpcClient.php b/src/Socialbox/Classes/RpcClient.php index 97d9854..50ced1d 100644 --- a/src/Socialbox/Classes/RpcClient.php +++ b/src/Socialbox/Classes/RpcClient.php @@ -76,6 +76,11 @@ $this->serverPublicKey = $resolvedServer->getPublicKey(); $this->rpcEndpoint = $resolvedServer->getEndpoint(); + if(empty($this->serverPublicKey)) + { + throw new ResolutionException('Failed to resolve domain: No public key found for the server'); + } + // Attempt to create an encrypted session with the server $this->sessionUuid = $this->createSession(); $this->sendDheExchange(); diff --git a/src/Socialbox/Classes/ServerResolver.php b/src/Socialbox/Classes/ServerResolver.php index 9524b19..8d18f94 100644 --- a/src/Socialbox/Classes/ServerResolver.php +++ b/src/Socialbox/Classes/ServerResolver.php @@ -38,22 +38,18 @@ } $fullRecord = self::concatenateTxtRecords($txtRecords); - if (preg_match(self::PATTERN, $fullRecord, $matches)) { $endpoint = trim($matches[1]); $publicKey = trim(str_replace(' ', '', $matches[2])); - if (empty($endpoint)) { throw new ResolutionException(sprintf("Failed to resolve RPC endpoint for %s", $domain)); } - if (empty($publicKey)) { throw new ResolutionException(sprintf("Failed to resolve public key for %s", $domain)); } - return new ResolvedServer($endpoint, $publicKey); } else @@ -74,23 +70,26 @@ } /** - * Concatenates an array of TXT records into a single string. + * Concatenates an array of TXT records into a single string, filtering for SocialBox records. * * @param array $txtRecords An array of TXT records, where each record is expected to have a 'txt' key. - * @return string A concatenated string of all TXT records. + * @return string A concatenated string of all relevant TXT records. */ private static function concatenateTxtRecords(array $txtRecords): string { $fullRecordBuilder = ''; - foreach ($txtRecords as $txt) { if (isset($txt['txt'])) { - $fullRecordBuilder .= trim($txt['txt'], '" '); + $record = trim($txt['txt'], '" '); + // Only include records that start with v=socialbox + if (stripos($record, 'v=socialbox') === 0) + { + $fullRecordBuilder .= $record; + } } } - return $fullRecordBuilder; } } \ No newline at end of file diff --git a/src/Socialbox/Classes/Utilities.php b/src/Socialbox/Classes/Utilities.php index d12ad20..231fa85 100644 --- a/src/Socialbox/Classes/Utilities.php +++ b/src/Socialbox/Classes/Utilities.php @@ -83,6 +83,7 @@ class Utilities if ($decoded === false) { + var_dump($data); throw new InvalidArgumentException('Failed to decode data from Base64'); } diff --git a/src/Socialbox/SocialClient.php b/src/Socialbox/SocialClient.php index ec325b7..9dae1ec 100644 --- a/src/Socialbox/SocialClient.php +++ b/src/Socialbox/SocialClient.php @@ -43,4 +43,54 @@ )->getResponse()->getResult(); } + /** + * Retrieves the privacy policy from the server. + * + * @return string Returns the privacy policy as a string. + * @throws RpcException Thrown if the RPC request fails. + */ + public function getPrivacyPolicy(): string + { + return $this->sendRequest( + new RpcRequest('getPrivacyPolicy', Utilities::randomCrc32()) + )->getResponse()->getResult(); + } + + /** + * Accepts the privacy policy by sending a request to the server. + * + * @return true Returns true if the privacy policy is successfully accepted. + * @throws RpcException Thrown if the RPC request fails. + */ + public function acceptPrivacyPolicy(): true + { + return (bool)$this->sendRequest( + new RpcRequest('acceptPrivacyPolicy', Utilities::randomCrc32()) + )->getResponse()->getResult(); + } + + /** + * Retrieves the terms of service from the server. + * + * @return string Returns the terms of service as a string. + * @throws RpcException Thrown if the RPC request fails. + */ + public function getTermsOfService(): string + { + return $this->sendRequest(new RpcRequest('getTermsOfService', Utilities::randomCrc32()) + )->getResponse()->getResult(); + } + + /** + * Sends a request to accept the terms of service and verifies the response. + * + * @return true Returns true if the terms of service are successfully accepted. + * @throws RpcException Thrown if the RPC request fails. + */ + public function acceptTermsOfService(): true + { + return (bool)$this->sendRequest( + new RpcRequest('acceptTermsOfService', Utilities::randomCrc32()) + )->getResponse()->getResult(); + } } \ No newline at end of file diff --git a/tests/test.php b/tests/test.php index 585ec76..0b671b4 100644 --- a/tests/test.php +++ b/tests/test.php @@ -5,6 +5,10 @@ $client = new \Socialbox\SocialClient(generateRandomPeer()); var_dump($client->ping()); + var_dump($client->getPrivacyPolicy()); + var_dump($client->acceptPrivacyPolicy()); + var_dump($client->getTermsOfService()); + var_dump($client->acceptTermsOfService()); function generateRandomPeer() {