[ (new LoginFlow(LoginType::PASSWORD))->toArray(), ], ]); } /** * POST /_matrix/client/v3/login */ public function login(): Response { $request = Request::createFromGlobals(); $body = json_decode($request->getContent(), true); // validate login type $loginType = null; try { $loginType = LoginType::from($body["type"]); } catch (\ValueError $error) { throw new UnknownError("Bad login type.", Response::HTTP_BAD_REQUEST); } // get user id $userId = $body["identifier"]["user"]; #if ($loginType == LoginType::PASSWORD) {} $user = User::fetchWithPassword($userId, $body["password"]); if (! $user) { throw new AppException(ErrorCode::FORBIDDEN, "Invalid credentials.", Response::HTTP_FORBIDDEN); } $deviceId = $body["device_id"] ?? ""; $device = $user->fetchDevice($deviceId); if (! $device) { $device = Device::new( $user->getId(), initialDisplayName: $body["initial_device_display_name"] ?? "", ); } return new JsonResponse([ "access_token" => $device->getAccessToken(), "device_id" => $device->getId(), "expires_in_ms" => 60000, "refresh_token" => $device->getRefreshToken(), "user_id" => $user->getId(), #"well_known" => [], ]); } /** * POST /_matrix/client/v3/register */ public function register(): Response { $request = Request::createFromGlobals(); $body = json_decode($request->getContent(), true); $kind = UserRegistrationKind::from($request->query->get("kind") ?? "user"); $username = $body["username"]; $userId = "@$username:$_ENV[DOMAIN]"; Database::getInstance()->query("insert into users (id, password) values (:id, :password)", [ "id" => $userId, "password" => $body["password"], ]); $device_id = $body["device_id"] ?? ""; $initialDeviceDisplayName = $body["initialDeviceDisplayName"] ?? ""; $device = Device::new($userId, $device_id, $initialDeviceDisplayName); $device->insert(); return new JsonResponse([ "access_token" => $device->getAccessToken(), "device_id" => $device->getId(), "expires_in_ms" => 60000, "refresh_token" => $device->getRefreshToken(), "user_id" => $userId, ]); } }