diff options
Diffstat (limited to 'src/Controllers')
-rw-r--r-- | src/Controllers/KeyController.php | 23 | ||||
-rw-r--r-- | src/Controllers/LoginController.php | 8 | ||||
-rwxr-xr-x | src/Controllers/RoomController.php | 54 | ||||
-rw-r--r-- | src/Controllers/ServerDiscoveryController.php | 7 | ||||
-rw-r--r-- | src/Controllers/ServerImplementationController.php | 5 | ||||
-rwxr-xr-x | src/Controllers/SyncController.php | 59 |
6 files changed, 131 insertions, 25 deletions
diff --git a/src/Controllers/KeyController.php b/src/Controllers/KeyController.php index 5050d9b..53e9ff4 100644 --- a/src/Controllers/KeyController.php +++ b/src/Controllers/KeyController.php @@ -12,7 +12,7 @@ use Symfony\Component\HttpFoundation\JsonResponse; class KeyController { - public function server(): Response + public function server(Request $request): Response { return new JsonResponse([ "server" => [ @@ -22,26 +22,31 @@ class KeyController ]); } - public function upload(): Response + /** + * POST /_matrix/client/v3/keys/upload + */ + public function upload(Request $request): Response { - $request = Request::createFromGlobals(); + $body = json_decode($request->getContent(), true); + RequestValidator::validateJson(); return new JsonResponse([ - "one_time_key_counts" => [], + "one_time_key_counts" => count($body["one_time_keys"]), ]); } - public function query(string $serverName): Response - {} + public function query(Request $request): Response + { + $serverName = $request->attributes->get("serverName"); + } /** * POST /_matrix/client/v3/refresh */ - public function refresh(): Response + public function refresh(Request $request): Response { - $request = Request::createFromGlobals(); - RequestValidator::validateJson(); $body = json_decode($request->getContent(), true); + RequestValidator::validateJson(); $tokens = Tokens::fetchWithRefreshToken($body["refresh_token"]); diff --git a/src/Controllers/LoginController.php b/src/Controllers/LoginController.php index fd48f25..15f1583 100644 --- a/src/Controllers/LoginController.php +++ b/src/Controllers/LoginController.php @@ -22,7 +22,7 @@ class LoginController /** * GET /_matrix/client/r0/login */ - public function supportedLoginTypes(): Response + public function supportedLoginTypes(Request $request): Response { return new JsonResponse([ "flows" => [ @@ -34,9 +34,8 @@ class LoginController /** * POST /_matrix/client/v3/login */ - public function login(): Response + public function login(Request $request): Response { - $request = Request::createFromGlobals(); $body = json_decode($request->getContent(), true); RequestValidator::validateJson(); @@ -101,9 +100,8 @@ class LoginController /** * POST /_matrix/client/v3/register */ - public function register(): Response + public function register(Request $request): Response { - $request = Request::createFromGlobals(); $body = json_decode($request->getContent(), true); RequestValidator::validateJson(); diff --git a/src/Controllers/RoomController.php b/src/Controllers/RoomController.php new file mode 100755 index 0000000..1067d29 --- /dev/null +++ b/src/Controllers/RoomController.php @@ -0,0 +1,54 @@ +<?php + +namespace App\Controllers; + +use App\Database; +use App\Errors\AppException; +use App\Errors\ErrorCode; +use App\Support\Parser; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\JsonResponse; + +class RoomController +{ + /** + * GET /_matrix/client/v3/directory/room/{roomAlias} + * + * @see https://spec.matrix.org/v1.15/client-server-api/#get_matrixclientv3directoryroomroomalias + */ + public function resolveAlias(Request $request): Response + { + $alias = $request->attributes->get("roomAlias"); + + $roomAlias = Parser::parseRoomAlias($alias); # TODO: on parse error => 400 + $roomId = null; + + if ($roomAlias["server"] != $_ENV["DOMAIN"]) { + # TODO: federation API resolve + $roomId = -1; + } + else { + $room = Database::getInstance()->query(<<<SQL + select id from rooms where name = :name + SQL, [ + "name" => $roomAlias["name"], + ])->fetch(); + + $roomId = $room["id"] ?? null; + } + + if (empty($roomId)) { + throw new AppException( + ErrorCode::NOT_FOUND, + "Room alias $alias not found.", + Response::HTTP_NOT_FOUND + ); + } + + return new JsonResponse([ + "room_id" => $roomId, + "servers" => [], + ]); + } +} diff --git a/src/Controllers/ServerDiscoveryController.php b/src/Controllers/ServerDiscoveryController.php index c4e5ea7..f3b96b2 100644 --- a/src/Controllers/ServerDiscoveryController.php +++ b/src/Controllers/ServerDiscoveryController.php @@ -2,19 +2,20 @@ namespace App\Controllers; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\JsonResponse; class ServerDiscoveryController { - public function server(): Response + public function server(Request $request): Response { return new JsonResponse([ "m.server" => "$_ENV[DOMAIN]:443", ]); } - public function client(): Response + public function client(Request $request): Response { return new JsonResponse([ "m.homeserver" => [ @@ -23,7 +24,7 @@ class ServerDiscoveryController ]); } - public function support(): Response + public function support(Request $request): Response { return new JsonResponse([ "contacts" => [], diff --git a/src/Controllers/ServerImplementationController.php b/src/Controllers/ServerImplementationController.php index e168a65..93b9a3f 100644 --- a/src/Controllers/ServerImplementationController.php +++ b/src/Controllers/ServerImplementationController.php @@ -2,12 +2,13 @@ namespace App\Controllers; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\JsonResponse; class ServerImplementationController { - public function version(): Response + public function version(Request $request): Response { return new JsonResponse([ "server" => [ @@ -17,7 +18,7 @@ class ServerImplementationController ]); } - public function versions(): Response + public function versions(Request $request): Response { return new JsonResponse([ "versions" => [ diff --git a/src/Controllers/SyncController.php b/src/Controllers/SyncController.php index 19da1b5..76b6a26 100755 --- a/src/Controllers/SyncController.php +++ b/src/Controllers/SyncController.php @@ -2,25 +2,72 @@ namespace App\Controllers; +use App\Database; use App\Errors\UnauthorizedError; +use App\Events\PresenceEvent; +use App\Types\PresenceState; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\JsonResponse; class SyncController { - public function sync(): Response + /** + * GET /_matrix/client/v3/sync + * + * @see https://spec.matrix.org/v1.15/client-server-api/#get_matrixclientv3sync + * @see https://spec.matrix.org/v1.15/client-server-api/#extensions-to-sync + */ + public function sync(Request $request): Response { - $request = Request::createFromGlobals(); + $accessToken = str_replace("Bearer ", "", $request->headers->get("authorization") ?: ""); + $user = Database::getInstance()->query(<<<SQL + select users.* from users left join tokens on tokens.user_id = users.id where tokens.access_token=:access_token + SQL, [ + "access_token" => $accessToken, + ])->fetch(); - if ($request->headers->get("authorization") != "Bearer abc123") { - # TODO: get user based on bearer token + # TODO: token validation + + if (empty($user)) { throw new UnauthorizedError(); } + $filter = $request->query->get("filter", ""); + $syncFullState = $request->query->get("full_state", false); + $setPresence = PresenceState::tryFrom($request->query->get("set_presence") ?? "") ?? PresenceState::ONLINE; + $since = $request->query->get("since", ""); + $timeout = $request->query->get("timeout", 0); + return new JsonResponse([ - "account_data" => [], - "next_batch" => "", + "account_data" => [ + "events" => [ + + ], + ], + + "device_lists" => [], + + "device_one_time_keys_count" => 10, + + "next_batch" => "next_batch_id", + + "presence" => [ + "events" => [ + (new PresenceEvent(sender: $user["id"]))->toJsonEncodeable(), + ], + ], + + "rooms" => [ + "invite" => [], + "join" => [], + "knock" => [], + "leave" => [], + ], + + "to_device" => [ + "events" => [], + ], ]); } } |