diff options
Diffstat (limited to 'src/Controllers/Client/KeyController.php')
| -rw-r--r-- | src/Controllers/Client/KeyController.php | 119 |
1 files changed, 107 insertions, 12 deletions
diff --git a/src/Controllers/Client/KeyController.php b/src/Controllers/Client/KeyController.php index b9ae61f..47f8933 100644 --- a/src/Controllers/Client/KeyController.php +++ b/src/Controllers/Client/KeyController.php @@ -2,6 +2,9 @@ namespace App\Controllers\Client; +use App\App; +use App\Database; +use App\Models\Device; use App\Models\User; use App\Support\RequestValidator; use Matrix\Responses\ClientKeysUploadPostResponse; @@ -12,6 +15,76 @@ use Symfony\Component\Routing\Attribute\Route; class KeyController { + #[Route(path: "/_matrix/client/r0/keys/upload", methods: ["POST"])] + #[Route(path: "/_matrix/client/v3/keys/upload", methods: ["POST"])] + public function upload(Request $request): Response + { + $user = User::authenticateWithRequest($request); + $body = json_decode($request->getContent(), true); + RequestValidator::validateJson(); + + if (! empty($body["device_keys"])) { + if ($body["device_keys"]["user_id"] !== $user->getId()) {} + if ($body["device_keys"]["user_id"] !== $user->getDeviceId()) {} + + Database::getInstance()->query(<<<SQL + insert into device_keys (supported_algorithms, keys, signatures, user_id, device_id) + values (:supported_algorithms, :keys, :signatures, :user_id, :device_id) + SQL, [ + "supported_algorithms" => json_encode($body["device_keys"]["algorithms"]), + "keys" => json_encode($body["device_keys"]["keys"]), + "signatures" => json_encode($body["device_keys"]["signatures"]), + "user_id" => $user->getId(), + "device_id" => $user->getDeviceId(), + ]); + } + + $oneTimeKeys = $body["one_time_keys"]; + if (! empty($body["fallback_keys"])) { + $oneTimeKeys += $body["fallback_keys"]; + } + + foreach ($oneTimeKeys as $identifier => $object) { + $identifierParts = explode(":", $identifier); + + $algorithm = $identifierParts[0]; + $id = $identifierParts[1]; + + $signatures = array_values($object["signatures"])[0]; + $signatureIdentifier = array_keys($signatures)[0]; + $signatureAlgorithm = explode(":", $signatureIdentifier)[0]; + $signatureKey = array_values($signatures)[0]; + + $deviceId = explode(":", $signatureIdentifier)[1]; + + Database::getInstance()->query(<<<SQL + insert into one_time_keys (id, key, algorithm, signature_key, signature_algorithm, is_fallback, user_id, device_id) + values (:id, :key, :algorithm, :signature_key, :signature_algorithm, :is_fallback, :user_id, :device_id) + SQL, [ + "id" => $id, + "key" => $object["key"], + "algorithm" => $algorithm, + "signature_key" => $signatureKey, + "signature_algorithm" => $signatureAlgorithm, + "is_fallback" => ($object["fallback"] ?? false) ?: 0, + "user_id" => $user->getId(), + "device_id" => $deviceId, + ]); + } + + # TODO: do that per algorithm + $currentCountOneTimeKeys = Database::getInstance() + ->query("select count(id) from one_time_keys where user_id=:userId and is_fallback=false", [ + "userId" => $user->getId(), + ]) + ->fetchColumn(); + + return new JsonResponse(new ClientKeysUploadPostResponse([ + #"curve25519" => 0, + "signed_curve25519" => $currentCountOneTimeKeys, + ])); + } + #[Route(path: "/_matrix/client/v3/keys/query", methods: ["POST"])] public function query(Request $request): Response { @@ -22,26 +95,48 @@ class KeyController $deviceKeys = $body["device_keys"]; $timeout = $body["timeout"] ?? 10000; - foreach ($deviceKeys as $keysUserId => $deviceIds) {} + $downloadedDeviceKeys = []; + foreach ($deviceKeys as $keysUserId => $deviceIds) { + foreach ($deviceIds as $deviceId) { + $result = Database::getInstance() + ->query("select * from device_keys where user_id=:user_id and device_id=:device_id", [ + "user_id" => $keysUserId, + "device_id" => $deviceId, + ]) + ->fetch(); + $device = Device::fetch($deviceId, $keysUserId); + + $downloadedDeviceKeys[$keysUserId][$deviceId] = [ + "algorithms" => $result["supported_algorithms"], + "keys" => $result["keys"], + "signatures" => $result["signatures"], + "device_id" => $result["device_id"], + "user_id" => $result["user_id"], + "unsigned" => [ + "device_display_name" => $device->getName(), + ], + ]; + } + } + + // apply timeout + if ($timeout > 0) { + sleep(intval(($timeout / 1000) - App::getExectionTime())); + } + return new JsonResponse([ - "device_keys" => [], + "device_keys" => empty($downloadedDeviceKeys) ? new \stdClass() : $downloadedDeviceKeys, ]); } - #[Route(path: "/_matrix/client/r0/keys/upload", methods: ["POST"])] - #[Route(path: "/_matrix/client/v3/keys/upload", methods: ["POST"])] - public function upload(Request $request): Response + #[Route(path: "/_matrix/client/v3/keys/claim", methods: ["POST"])] + public function claim(Request $request): Response { $user = User::authenticateWithRequest($request); $body = json_decode($request->getContent(), true); RequestValidator::validateJson(); - - foreach ($body["one_time_keys"] as $identifier => $object) {} - - return new JsonResponse(new ClientKeysUploadPostResponse([ - #"curve25519" => 0, - "signed_curve25519" => count($body["one_time_keys"]), - ])); + + return new JsonResponse(); } } |
