summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/matrix-commander-login2
-rw-r--r--docker-compose.dev.yml2
-rw-r--r--src/Controllers/KeyController.php6
-rw-r--r--src/Controllers/LoginController.php4
-rwxr-xr-xsrc/Controllers/RoomController.php84
-rw-r--r--src/Errors/AppException.php2
-rw-r--r--src/Errors/ErrorCode.php47
-rw-r--r--src/Errors/ErrorResponse.php1
-rw-r--r--src/Errors/Exception.php2
-rw-r--r--src/Errors/RateLimitError.php1
-rwxr-xr-xsrc/Errors/UnauthorizedError.php1
-rw-r--r--src/Errors/UnknownError.php2
-rw-r--r--src/Models/RoomEvent.php12
-rw-r--r--src/Models/User.php2
-rw-r--r--src/Router/Router.php2
-rw-r--r--src/Router/routes_client_server.php5
-rw-r--r--src/Support/Parser.php10
-rw-r--r--src/Support/RequestValidator.php2
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;