summaryrefslogtreecommitdiff
path: root/src/Controllers
diff options
context:
space:
mode:
Diffstat (limited to 'src/Controllers')
-rw-r--r--src/Controllers/KeyController.php23
-rw-r--r--src/Controllers/LoginController.php8
-rwxr-xr-xsrc/Controllers/RoomController.php54
-rw-r--r--src/Controllers/ServerDiscoveryController.php7
-rw-r--r--src/Controllers/ServerImplementationController.php5
-rwxr-xr-xsrc/Controllers/SyncController.php59
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" => [],
+ ],
]);
}
}