[ (new LoginFlow(LoginType::PASSWORD))->toArray(), ], ]); } /** * POST /_matrix/client/v3/login */ public function login(): Response { $request = Request::createFromGlobals(); $body = json_decode($request->getContent(), true); RequestValidator::validateJson(); // 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 = null; $tokens = null; // create new device with tokens if (empty($deviceId)) { $device = Device::new( $user->getId(), initialDisplayName: $body["initial_device_display_name"] ?? "", ); $device->insert(); $tokens = Tokens::new($userId, $device->getId()); $tokens->insert(); } else { // fetch existing device and tokens $device = $user->fetchDevice($deviceId); $tokens = Tokens::fetch($userId, $device->getId()); if (empty($tokens)) { throw new AppException( ErrorCode::UNKNOWN_TOKEN, "Soft logged out", Response::HTTP_UNAUTHORIZED, ["soft_logout" => true], ); } } return new JsonResponse([ "access_token" => $tokens->getAccessToken(), "device_id" => $device->getId(), "expires_in_ms" => $tokens->getExpiresIn(), "refresh_token" => $tokens->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); RequestValidator::validateJson(); // validate kind $kind = null; try { $kind = UserRegistrationKind::from($request->query->get("kind") ?? "user"); } catch (\ValueError $error) { throw new UnknownError("Bad registration kind.", Response::HTTP_BAD_REQUEST); } $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["initial_device_display_name"] ?? ""; $device = Device::new($userId, $device_id, $initialDeviceDisplayName); $device->insert(); $tokens = Tokens::new($userId, $device->getId()); $tokens->insert(); return new JsonResponse([ "access_token" => $tokens->getAccessToken(), "device_id" => $device->getId(), "expires_in_ms" => $tokens->getExpiresIn(), "refresh_token" => $tokens->getRefreshToken(), "user_id" => $userId, ]); } }