diff options
Diffstat (limited to 'src/Controllers')
| -rw-r--r-- | src/Controllers/KeyController.php | 6 | ||||
| -rw-r--r-- | src/Controllers/LoginController.php | 4 | ||||
| -rwxr-xr-x | src/Controllers/RoomController.php | 84 |
3 files changed, 71 insertions, 23 deletions
diff --git a/src/Controllers/KeyController.php b/src/Controllers/KeyController.php index 7777229..ebf580a 100644 --- a/src/Controllers/KeyController.php +++ b/src/Controllers/KeyController.php @@ -3,10 +3,10 @@ namespace App\Controllers; use App\Errors\AppException; -use App\Errors\ErrorCode; use App\Models\Tokens; use App\Models\User; use App\Support\RequestValidator; +use Matrix\Enums\ErrorCode; use Matrix\Responses\ClientKeysUploadPostResponse; use Matrix\Responses\ClientRefreshPostResponse; use Symfony\Component\HttpFoundation\Request; @@ -34,8 +34,10 @@ class KeyController $body = json_decode($request->getContent(), true); RequestValidator::validateJson(); + foreach ($body["one_time_keys"] as $identifier => $data) {} + return new JsonResponse(new ClientKeysUploadPostResponse([ - "curve25519" => 0, + #"curve25519" => 0, "signed_curve25519" => count($body["one_time_keys"]), ])); } diff --git a/src/Controllers/LoginController.php b/src/Controllers/LoginController.php index 9ae3a48..f9576fb 100644 --- a/src/Controllers/LoginController.php +++ b/src/Controllers/LoginController.php @@ -4,7 +4,6 @@ namespace App\Controllers; use App\Database; use App\Errors\AppException; -use App\Errors\ErrorCode; use App\Errors\UnknownError; use App\Models\Device; use App\Models\Tokens; @@ -13,6 +12,7 @@ use App\Support\Logger; use App\Support\Parser; use App\Support\RequestValidator; use Matrix\Data\LoginFlow; +use Matrix\Enums\ErrorCode; use Matrix\Enums\LoginType; use Matrix\Enums\UserRegistrationKind; use Matrix\Responses\ClientLoginGetResponse; @@ -57,6 +57,8 @@ class LoginController if (empty($userId["server"])) { #$userId = "@$userId[username]:$_ENV[DOMAIN]"; $userId = "@$userId[username]:localhost"; + } else { + $userId = "@$userId[username]:$userId[server]"; } #if ($loginType == LoginType::PASSWORD) {} diff --git a/src/Controllers/RoomController.php b/src/Controllers/RoomController.php index dcc0415..060a030 100755 --- a/src/Controllers/RoomController.php +++ b/src/Controllers/RoomController.php @@ -4,14 +4,15 @@ namespace App\Controllers; use App\Database; use App\Errors\AppException; -use App\Errors\ErrorCode; +use App\Errors\Exception; use App\Errors\UnauthorizedError; -use App\Events\RoomMessageEvent; use App\Models\RoomEvent; use App\Models\User; use App\Support\Id; use App\Support\Parser; use App\Support\RequestValidator; +use Matrix\Data\UnsignedData; +use Matrix\Enums\ErrorCode; use Matrix\Enums\EventType; use Matrix\Enums\MembershipState; use Matrix\Enums\MessageType; @@ -19,6 +20,7 @@ use Matrix\Enums\RoomGuestAccess; use Matrix\Enums\RoomHistoryVisibility; use Matrix\Enums\RoomJoinRule; use Matrix\Enums\RoomVisibility; +use Matrix\Events\ClientEvent; use Matrix\Events\Room\CreateEvent; use Matrix\Events\Room\GuestAccessEvent; use Matrix\Events\Room\HistoryVisibilityEvent; @@ -196,6 +198,51 @@ class RoomController ]); } + /** + * GET /_matrix/client/v3/rooms/{roomId}/messages + */ + public function getMessages(Request $request): Response + { + $user = User::authenticateWithRequest($request); + + $roomId = $request->attributes->get("roomId"); + + $membership = Database::getInstance() + ->query("select state from room_memberships where user_id=:user_id and room_id=:room_id", [ + "user_id" => $user->getId(), + "room_id" => $roomId, + ]) + ->fetchColumn(); + + if (MembershipState::from($membership) !== MembershipState::JOIN) { + throw new Exception(ErrorCode::FORBIDDEN, "You aren't a member of the room.", Response::HTTP_FORBIDDEN); + } + + $direction = $request->query->get("dir"); + $filter = $request->query->get("filter"); + $from = $request->query->get("from"); + $limit = $request->query->get("limit", 10); + $to = $request->query->get("to"); + + $events = Database::getInstance()->query(<<<SQL + select * from room_events + where room_id = :room_id + SQL, [ + "room_id" => $roomId, + #"limit" => ($filter["room"]["timeline"]["limit"] ?? false) ? "limit " . $filter["room"]["timeline"]["limit"] : "", + ])->fetchAll(); + + return new JsonResponse([ + "chunk" => array_map([RoomEvent::class, "transformEvent"], $events), + "end" => "", + "start" => "", + "state" => [], + ]); + } + + /** + * POST /_matrix/client/v3/rooms/{roomId}/read_markers + */ public function readMarkers(Request $request): Response { $user = User::authenticateWithRequest($request); @@ -214,8 +261,7 @@ class RoomController */ public function send(Request $request): Response { - $accessToken = str_replace("Bearer ", "", $request->headers->get("authorization") ?: ""); - $user = User::fetchWithAccessToken($accessToken); + $user = User::authenticateWithRequest($request); if (empty($user)) { throw new UnauthorizedError(); @@ -228,24 +274,22 @@ class RoomController $body = json_decode($request->getContent(), true); RequestValidator::validateJson(); - $message = $body["body"]; - $messageType = MessageType::from($body["msgtype"]); + // validate msgtype + MessageType::from($body["msgtype"]); - $eventId = "\$" . md5(random_bytes(512)) . ":" . $_ENV["DOMAIN"]; - $event = new RoomMessageEvent( - id: $eventId, - sender: $user->getId(), - originServerTimestamp: new \DateTime("now"), - content: [ - "body" => $message, - "msgtype" => $messageType->value, - ], - unsigned: [ - "age" => 1234, - "membership" => MembershipState::JOIN->value, - ], + $eventId = Id::generateEventId(); + $event = new RoomEvent(new ClientEvent( + content: $body, + eventId: $eventId, + originServerTimestamp: time(), roomId: $roomId, - ); + sender: $user->getId(), + type: $eventType, + unsigned: new UnsignedData( + age: 1234, # TODO + membership: MembershipState::JOIN, + ), + )); $event->insert(); return new JsonResponse([ |
