diff options
| -rwxr-xr-x | bin/matrix-commander-login | 2 | ||||
| -rw-r--r-- | docker-compose.dev.yml | 2 | ||||
| -rw-r--r-- | src/Controllers/KeyController.php | 6 | ||||
| -rw-r--r-- | src/Controllers/LoginController.php | 4 | ||||
| -rwxr-xr-x | src/Controllers/RoomController.php | 84 | ||||
| -rw-r--r-- | src/Errors/AppException.php | 2 | ||||
| -rw-r--r-- | src/Errors/ErrorCode.php | 47 | ||||
| -rw-r--r-- | src/Errors/ErrorResponse.php | 1 | ||||
| -rw-r--r-- | src/Errors/Exception.php | 2 | ||||
| -rw-r--r-- | src/Errors/RateLimitError.php | 1 | ||||
| -rwxr-xr-x | src/Errors/UnauthorizedError.php | 1 | ||||
| -rw-r--r-- | src/Errors/UnknownError.php | 2 | ||||
| -rw-r--r-- | src/Models/RoomEvent.php | 12 | ||||
| -rw-r--r-- | src/Models/User.php | 2 | ||||
| -rw-r--r-- | src/Router/Router.php | 2 | ||||
| -rw-r--r-- | src/Router/routes_client_server.php | 5 | ||||
| -rw-r--r-- | src/Support/Parser.php | 10 | ||||
| -rw-r--r-- | src/Support/RequestValidator.php | 2 |
18 files changed, 110 insertions, 77 deletions
diff --git a/bin/matrix-commander-login b/bin/matrix-commander-login index 42fb81e..350ade3 100755 --- a/bin/matrix-commander-login +++ b/bin/matrix-commander-login @@ -3,7 +3,7 @@ matrix-commander --no-ssl \ --credentials .cache/credentials.json \ --store .cache/store \ - --homeserver=http://localhost:8080 \ + --homeserver=http://localhost \ --user-login=php \ --device=matrix-commander \ --room-default=matrix-commander-room \ diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 48dfa7c..9efff01 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -17,7 +17,7 @@ services: web: build: "docker/nginx" ports: - - "8080:80" + - "80:80" - "8084:443" volumes: - "./:/var/www/html" 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([ diff --git a/src/Errors/AppException.php b/src/Errors/AppException.php index 2a554c7..2628c4b 100644 --- a/src/Errors/AppException.php +++ b/src/Errors/AppException.php @@ -2,6 +2,8 @@ namespace App\Errors; +use Matrix\Enums\ErrorCode; + class AppException extends Exception { public function __construct( diff --git a/src/Errors/ErrorCode.php b/src/Errors/ErrorCode.php deleted file mode 100644 index b59f0a1..0000000 --- a/src/Errors/ErrorCode.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php - -namespace App\Errors; - -enum ErrorCode: string -{ - case FORBIDDEN = "M_FORBIDDEN"; - case UNKNOWN_TOKEN = "M_UNKNOWN_TOKEN"; - case MISSING_TOKEN = "M_MISSING_TOKEN"; - case USER_LOCKED = "M_USER_LOCKED"; - case USER_SUSPENDED = "M_USER_SUSPENDED"; - case BAD_JSON = "M_BAD_JSON"; - case NOT_JSON = "M_NOT_JSON"; - case NOT_FOUND = "M_NOT_FOUND"; - case LIMIT_EXCEEDED = "M_LIMIT_EXCEEDED"; - case UNRECOGNIZED = "M_UNRECOGNIZED"; - case UNKNOWN = "M_UNKNOWN"; - - case UNAUTHORIZED = "M_UNAUTHORIZED"; - case USER_DEACTIVATED = "M_USER_DEACTIVATED"; - case USER_IN_USE = "M_USER_IN_USE"; - case INVALID_USERNAME = "M_INVALID_USERNAME"; - case ROOM_IN_USE = "M_ROOM_IN_USE"; - case INVALID_ROOM_STATE = "M_INVALID_ROOM_STATE"; - - case THREEPID_IN_USE = "M_THREEPID_IN_USE"; - case THREEPID_NOT_FOUND = "M_THREEPID_NOT_FOUND"; - case THREEPID_AUTH_FAILED = "M_THREEPID_AUTH_FAILED"; - case THREEPID_DENIED = "M_THREEPID_DENIED"; - case THREEPID_MEDIUM_NOT_SUPPORTED = "M_THREEPID_MEDIUM_NOT_SUPPORTED"; - - case SERVER_NOT_TRUSTED = "M_SERVER_NOT_TRUSTED"; - case UNSUPPORTED_ROOM_VERSION = "M_UNSUPPORTED_ROOM_VERSION"; - case INCOMPATIBLE_ROOM_VERSION = "M_INCOMPATIBLE_ROOM_VERSION"; - case BAD_STATE = "M_BAD_STATE"; - case GUEST_ACCESS_FORBIDDEN = "M_GUEST_ACCESS_FORBIDDEN"; - - case CAPTCHA_NEEDED = "M_CAPTCHA_NEEDED"; - case CAPTCHA_INVALID = "M_CAPTCHA_INVALID"; - - case MISSING_PARAM = "M_MISSING_PARAM"; - case INVALID_PARAM = "M_INVALID_PARAM"; - case TOO_LARGE = "M_TOO_LARGE"; - case EXCLUSIVE = "M_EXCLUSIVE"; - case RESOURCE_LIMIT_EXCEEDED = "M_RESOURCE_LIMIT_EXCEEDED"; - case CANNOT_LEAVE_SERVER_NOTICE_ROOM = "M_CANNOT_LEAVE_SERVER_NOTICE_ROOM"; -} diff --git a/src/Errors/ErrorResponse.php b/src/Errors/ErrorResponse.php index 6248659..360aaf3 100644 --- a/src/Errors/ErrorResponse.php +++ b/src/Errors/ErrorResponse.php @@ -2,6 +2,7 @@ namespace App\Errors; +use Matrix\Enums\ErrorCode; use Symfony\Component\HttpFoundation\JsonResponse; class ErrorResponse extends JsonResponse diff --git a/src/Errors/Exception.php b/src/Errors/Exception.php index ccb124e..4e871b5 100644 --- a/src/Errors/Exception.php +++ b/src/Errors/Exception.php @@ -2,6 +2,8 @@ namespace App\Errors; +use Matrix\Enums\ErrorCode; + abstract class Exception extends \RuntimeException { public function __construct(private ErrorCode $errorCode, string $message, int $httpCode) diff --git a/src/Errors/RateLimitError.php b/src/Errors/RateLimitError.php index d84f66a..5c2795c 100644 --- a/src/Errors/RateLimitError.php +++ b/src/Errors/RateLimitError.php @@ -2,6 +2,7 @@ namespace App\Errors; +use Matrix\Enums\ErrorCode; use Symfony\Component\HttpFoundation\Response; class RateLimitError extends Exception diff --git a/src/Errors/UnauthorizedError.php b/src/Errors/UnauthorizedError.php index 97df025..cd9981f 100755 --- a/src/Errors/UnauthorizedError.php +++ b/src/Errors/UnauthorizedError.php @@ -2,6 +2,7 @@ namespace App\Errors; +use Matrix\Enums\ErrorCode; use Symfony\Component\HttpFoundation\Response; class UnauthorizedError extends Exception diff --git a/src/Errors/UnknownError.php b/src/Errors/UnknownError.php index f861597..8b78b4d 100644 --- a/src/Errors/UnknownError.php +++ b/src/Errors/UnknownError.php @@ -2,6 +2,8 @@ namespace App\Errors; +use Matrix\Enums\ErrorCode; + class UnknownError extends Exception { public function __construct(string $message, int $httpCode) diff --git a/src/Models/RoomEvent.php b/src/Models/RoomEvent.php index 96dc204..ce74cac 100644 --- a/src/Models/RoomEvent.php +++ b/src/Models/RoomEvent.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Database; +use Matrix\Data\UnsignedData; use Matrix\Enums\EventType; use Matrix\Events\ClientEvent; use Matrix\Events\StateEvent; @@ -19,6 +20,15 @@ class RoomEvent */ public static function transformEvent(array $row): ClientEvent { + $rowUnsigned = json_decode($row["unsigned"], true); + $unsigned = new UnsignedData( + age: $row["age"] ?? null, + membership: $row["membership"] ?? null, + previousContent: $row["previous_content"] ?? null, + redactedBecause: $row["redacted_because"] ?? null, + transactionId: $row["transaction_id"] ?? null, + ); + return new ClientEvent( content: json_decode($row["content"], true), eventId: $row["id"], @@ -26,7 +36,7 @@ class RoomEvent roomId: $row["room_id"], sender: $row["sender"], type: EventType::from($row["type"]), - unsigned: json_decode($row["unsigned"], true), + unsigned: $unsigned, ); } diff --git a/src/Models/User.php b/src/Models/User.php index c92f5b3..b8aad62 100644 --- a/src/Models/User.php +++ b/src/Models/User.php @@ -4,9 +4,9 @@ namespace App\Models; use App\Database; use App\Errors\AppException; -use App\Errors\ErrorCode; use App\Errors\UnauthorizedError; use App\Support\ConnectsToDatabase; +use Matrix\Enums\ErrorCode; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; diff --git a/src/Router/Router.php b/src/Router/Router.php index 377821f..6859771 100644 --- a/src/Router/Router.php +++ b/src/Router/Router.php @@ -2,11 +2,11 @@ namespace App\Router; -use App\Errors\ErrorCode; use App\Errors\ErrorResponse; use App\Errors\Exception; use App\Singleton; use App\Support\Logger; +use Matrix\Enums\ErrorCode; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Exception\MethodNotAllowedException; diff --git a/src/Router/routes_client_server.php b/src/Router/routes_client_server.php index 590520b..e888782 100644 --- a/src/Router/routes_client_server.php +++ b/src/Router/routes_client_server.php @@ -108,4 +108,9 @@ return function (RouteConfigurator $routes): void ->add("matrix_client_v3_rooms_id_read_markers", "/_matrix/client/v3/rooms/{roomId}/read_markers") ->controller([RoomController::class, "readMarkers"]) ->methods(["POST"]); + + $routes + ->add("matrix_client_v3_rooms_id_messages", "/_matrix/client/v3/rooms/{roomId}/messages") + ->controller([RoomController::class, "getMessages"]) + ->methods(["GET"]); }; diff --git a/src/Support/Parser.php b/src/Support/Parser.php index 02ec251..c432240 100644 --- a/src/Support/Parser.php +++ b/src/Support/Parser.php @@ -33,10 +33,18 @@ class Parser $name = ""; $server = ""; + if (str_starts_with($alias, "#")) { + $alias = substr($alias, 1); + } + $parts = explode(":", $alias); - $name = substr($parts[0], 1); + $name = $parts[0]; $server = $parts[1]; + if ($server === "localhost" && str_starts_with($_ENV["DOMAIN"], "localhost")) { + $server = $_ENV["DOMAIN"]; + } + return [ "name" => $name, "server" => $server, diff --git a/src/Support/RequestValidator.php b/src/Support/RequestValidator.php index 40ede8b..e27ed4d 100644 --- a/src/Support/RequestValidator.php +++ b/src/Support/RequestValidator.php @@ -3,7 +3,7 @@ namespace App\Support; use App\Errors\AppException; -use App\Errors\ErrorCode; +use Matrix\Enums\ErrorCode; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; |
