summaryrefslogtreecommitdiff
path: root/src/Controllers/KeyController.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Controllers/KeyController.php')
-rw-r--r--src/Controllers/KeyController.php34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/Controllers/KeyController.php b/src/Controllers/KeyController.php
index a999e40..5050d9b 100644
--- a/src/Controllers/KeyController.php
+++ b/src/Controllers/KeyController.php
@@ -2,6 +2,10 @@
namespace App\Controllers;
+use App\Errors\AppException;
+use App\Errors\ErrorCode;
+use App\Models\Tokens;
+use App\Support\RequestValidator;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
@@ -29,4 +33,34 @@ class KeyController
public function query(string $serverName): Response
{}
+
+ /**
+ * POST /_matrix/client/v3/refresh
+ */
+ public function refresh(): Response
+ {
+ $request = Request::createFromGlobals();
+ RequestValidator::validateJson();
+ $body = json_decode($request->getContent(), true);
+
+ $tokens = Tokens::fetchWithRefreshToken($body["refresh_token"]);
+
+ if (empty($tokens)) {
+ throw new AppException(
+ ErrorCode::UNKNOWN_TOKEN,
+ "Soft logged out",
+ Response::HTTP_UNAUTHORIZED,
+ ["soft_logout" => true],
+ );
+ }
+
+ $newTokens = Tokens::new($tokens->getUserId(), $tokens->getDeviceId());
+ $newTokens->insert();
+
+ return new JsonResponse([
+ "access_token" => $newTokens->getAccessToken(),
+ "expires_in" => $newTokens->getExpiresIn(),
+ "refresh_token" => $newTokens->getRefreshToken(),
+ ]);
+ }
}