diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Controllers/Client/ClientController.php | 108 | ||||
| -rw-r--r-- | src/Models/User.php | 2 | ||||
| -rw-r--r-- | src/Router.php | 2 |
3 files changed, 108 insertions, 4 deletions
diff --git a/src/Controllers/Client/ClientController.php b/src/Controllers/Client/ClientController.php index 053d288..c9eb1fa 100644 --- a/src/Controllers/Client/ClientController.php +++ b/src/Controllers/Client/ClientController.php @@ -4,11 +4,14 @@ namespace App\Controllers\Client; use App\Database; use App\Errors\AppException; +use App\Errors\ErrorResponse; +use App\Errors\UnauthorizedError; use App\Errors\UnknownError; use App\Models\Device; use App\Models\RoomEvent; use App\Models\Tokens; use App\Models\User; +use App\Support\Id; use App\Support\Logger; use App\Support\Parser; use App\Support\RequestValidator; @@ -16,6 +19,8 @@ use Matrix\Data\AccountData; use Matrix\Data\DeviceLists; use Matrix\Data\LoginFlow; use Matrix\Data\Presence; +use Matrix\Data\PushCondition; +use Matrix\Data\PushRule; use Matrix\Data\Room\Ephemeral; use Matrix\Data\Room\JoinedRoom; use Matrix\Data\Room\RoomSummary; @@ -23,11 +28,14 @@ use Matrix\Data\Room\Rooms; use Matrix\Data\Room\State; use Matrix\Data\Room\Timeline; use Matrix\Data\Room\UnreadNotificationCounts; +use Matrix\Data\Ruleset; use Matrix\Data\ToDevice; +use Matrix\Enums\AuthenticationType; use Matrix\Enums\ErrorCode; use Matrix\Enums\LoginType; use Matrix\Enums\MembershipState; use Matrix\Enums\PresenceState; +use Matrix\Enums\PushConditionKind; use Matrix\Enums\UserRegistrationKind; use Matrix\Events\PresenceEvent; use Matrix\Responses\ClientLoginGetResponse; @@ -131,6 +139,21 @@ class ClientController $body = json_decode($request->getContent(), true); RequestValidator::validateJson(); + if (empty($body)) { + return new JsonResponse([ + "completed" => [], + "flows" => [ + [ + "stages" => [ + AuthenticationType::DUMMY, + ], + ], + ], + "params" => [], + "session" => Id::generate(), + ], Response::HTTP_UNAUTHORIZED); + } + // validate kind $kind = null; try { @@ -139,11 +162,24 @@ class ClientController throw new UnknownError("Bad registration kind.", Response::HTTP_BAD_REQUEST); } - $username = $body["username"]; + $username = $body["username"] ?? ""; + if (empty($username)) { + $username = crc32(time() . random_bytes(64)); + } + $userId = "@$username:$_ENV[DOMAIN]"; - Database::getInstance()->query("insert into users (id, password) values (:id, :password)", [ + if (empty($body["password"])) { + throw new AppException(ErrorCode::MISSING_PARAM, "missing password", Response::HTTP_BAD_REQUEST); + } + + if (Database::getInstance()->query("select id from users where id=:id", ["id" => $userId])->fetchColumn()) { + throw new AppException(ErrorCode::USER_IN_USE, "The desired user ID is already taken.", Response::HTTP_BAD_REQUEST); + } + + Database::getInstance()->query("insert into users (id, name, password) values (:id, :name, :password)", [ "id" => $userId, + "name" => $username, "password" => $body["password"], ]); @@ -289,4 +325,72 @@ class ClientController refreshToken: $newTokens->getRefreshToken(), )); } + + #[Route(path: "/_matrix/client/v3/pushrules", methods: ["GET"])] + public function pushRules(Request $request): Response + { + $user = User::authenticateWithRequest($request); + + return new JsonResponse([ + "global" => new Ruleset( + content: [ + new PushRule( + actions: [ + "notify", + [ + "set_tweak" => "sound", + "value" => "default", + ], + [ + "set_tweak" => "highlight", + ], + ], + default: true, + enabled: true, + pattern: "alice", + ruleId: ".m.rule.contains_user_name", + ), + ], + + override: [ + new PushRule( + actions: [], + conditions: [], + default: true, + enabled: false, + ruleId: ".m.rule.master", + ), + ], + + room: [], + sender: [], + + underride: [ + new PushRule( + actions: [ + "notify", + [ + "set_tweak" => "sound", + "value" => "ring", + ], + [ + "set_tweak" => "highlight", + "value" => false, + ], + ], + conditions: [ + new PushCondition( + kind: PushConditionKind::EVENT_MATCH, + key: "type", + pattern: "m.call.invite", + ) + ], + default: true, + enabled: true, + ruleId: ".m.rule.master", + ), + ], + ), + ]); + } } diff --git a/src/Models/User.php b/src/Models/User.php index b24afaf..4c016ad 100644 --- a/src/Models/User.php +++ b/src/Models/User.php @@ -22,7 +22,7 @@ class User implements ConnectsToDatabase { return new self( $row["id"], - $row["name"] ?? "", + $row["name"], ); } diff --git a/src/Router.php b/src/Router.php index cda3006..ab0c37c 100644 --- a/src/Router.php +++ b/src/Router.php @@ -64,7 +64,7 @@ class Router try { $matcher = new UrlMatcher($this->routes, $context); - $match = $matcher->matchRequest($request); + $match = $matcher->match(rtrim($request->getPathInfo(), "/")); $class = $match["_controller"][0]; $method = $match["_controller"][1]; |
