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" => [], +      ],      ]);    }  }  | 
