From a20d44d64f02f86d23cba1f1a886352c5f744a1a Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Fri, 12 Sep 2025 13:07:20 +0200 Subject: sending messages results in client acknowledging success --- src/Controllers/AccountController.php | 35 +++++++++++++++++ src/Controllers/KeyController.php | 4 +- src/Controllers/RoomController.php | 34 +++++++++++++++++ src/Controllers/SyncController.php | 71 ++++++++++++++++++++++++++++------- 4 files changed, 129 insertions(+), 15 deletions(-) create mode 100755 src/Controllers/AccountController.php (limited to 'src/Controllers') diff --git a/src/Controllers/AccountController.php b/src/Controllers/AccountController.php new file mode 100755 index 0000000..858a6b5 --- /dev/null +++ b/src/Controllers/AccountController.php @@ -0,0 +1,35 @@ +headers->get("authorization") ?: ""); + $user = User::fetchWithAccessToken($accessToken); + + if (empty($user)) { + throw new UnauthorizedError(); + } + + $device = Device::fetch(userId: $user->getId()); + + return new JsonResponse([ + "device_id" => $device->getId(), + "user_id" => $user->getId(), + ]); + } +} diff --git a/src/Controllers/KeyController.php b/src/Controllers/KeyController.php index 53e9ff4..b2a17a6 100644 --- a/src/Controllers/KeyController.php +++ b/src/Controllers/KeyController.php @@ -31,7 +31,9 @@ class KeyController RequestValidator::validateJson(); return new JsonResponse([ - "one_time_key_counts" => count($body["one_time_keys"]), + "one_time_key_counts" => [ + "signed_curve25519" => count($body["one_time_keys"]) + ], ]); } diff --git a/src/Controllers/RoomController.php b/src/Controllers/RoomController.php index 1067d29..367d754 100755 --- a/src/Controllers/RoomController.php +++ b/src/Controllers/RoomController.php @@ -5,7 +5,12 @@ namespace App\Controllers; use App\Database; use App\Errors\AppException; use App\Errors\ErrorCode; +use App\Errors\UnauthorizedError; +use App\Models\User; use App\Support\Parser; +use App\Support\RequestValidator; +use App\Types\EventType; +use App\Types\MessageType; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\JsonResponse; @@ -51,4 +56,33 @@ class RoomController "servers" => [], ]); } + + /** + * PUT /_matrix/client/v3/rooms/{roomId}/send/{eventType}/{txnId} + * + * @see https://spec.matrix.org/v1.15/client-server-api/#put_matrixclientv3roomsroomidsendeventtypetxnid + */ + public function send(Request $request): Response + { + $accessToken = str_replace("Bearer ", "", $request->headers->get("authorization") ?: ""); + $user = User::fetchWithAccessToken($accessToken); + + if (empty($user)) { + throw new UnauthorizedError(); + } + + $roomId = $request->attributes->get("roomId"); + $eventType = EventType::from($request->attributes->get("eventType")); + $transactionId = $request->attributes->get("txnId"); + + $body = json_decode($request->getContent(), true); + RequestValidator::validateJson(); + + $message = $body["body"]; + $messageType = MessageType::from($body["msgtype"]); + + return new JsonResponse([ + "event_id" => "\$asdfghjkl:" . $_ENV["DOMAIN"], + ]); + } } diff --git a/src/Controllers/SyncController.php b/src/Controllers/SyncController.php index 76b6a26..b7d51c3 100755 --- a/src/Controllers/SyncController.php +++ b/src/Controllers/SyncController.php @@ -5,6 +5,7 @@ namespace App\Controllers; use App\Database; use App\Errors\UnauthorizedError; use App\Events\PresenceEvent; +use App\Models\User; use App\Types\PresenceState; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -21,13 +22,7 @@ class SyncController public function sync(Request $request): Response { $accessToken = str_replace("Bearer ", "", $request->headers->get("authorization") ?: ""); - $user = Database::getInstance()->query(<< $accessToken, - ])->fetch(); - - # TODO: token validation + $user = User::fetchWithAccessToken($accessToken); if (empty($user)) { throw new UnauthorizedError(); @@ -39,6 +34,49 @@ class SyncController $since = $request->query->get("since", ""); $timeout = $request->query->get("timeout", 0); + $rooms = Database::getInstance()->query(<<fetchAll(); + + $joinedRooms = new \stdClass(); + if (! empty($rooms)) { + $joinedRooms = []; + foreach ($rooms as $room) { + $joinedRooms[$room["id"]] = [ + "account_data" => [ + "events" => [], + ], + + "ephemeral" => [ + "events" => [], + ], + + "state" => [ + "events" => [], + ], + + "summary" => [ + "m.heroes" => [], + "m.invited_member_count" => 0, + "m.joined_member_count" => 1, + ], + + "timeline" => [ + "events" => [], + "limited" => false, + "prev_batch" => "", + ], + + "unread_notifications" => [ + "highlight_count" => 1, + "notification_count" => 2, + ], + + "unread_thread_notifications" => new \stdClass(), + ]; + } + } + return new JsonResponse([ "account_data" => [ "events" => [ @@ -46,23 +84,28 @@ class SyncController ], ], - "device_lists" => [], + "device_lists" => [ + "changed" => [], + "left" => [], + ], - "device_one_time_keys_count" => 10, + "device_one_time_keys_count" => [ + "signed_curve25519" => 10, + ], "next_batch" => "next_batch_id", "presence" => [ "events" => [ - (new PresenceEvent(sender: $user["id"]))->toJsonEncodeable(), + (new PresenceEvent(sender: $user->getId()))->toJsonEncodeable(), ], ], "rooms" => [ - "invite" => [], - "join" => [], - "knock" => [], - "leave" => [], + "invite" => new \stdClass(), + "join" => $joinedRooms, + "knock" => new \stdClass(), + "leave" => new \stdClass(), ], "to_device" => [ -- cgit v1.2.3