aboutsummaryrefslogtreecommitdiff
path: root/roomserver/api
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2023-06-06 15:16:55 +0200
committerGitHub <noreply@github.com>2023-06-06 15:16:55 +0200
commit725ff5567d2a3bc9992b065e72ccabefb595ec1c (patch)
treea0b84345c1206864bdd3637ccf0193fff0a38b38 /roomserver/api
parentd11da6ec7cc683864e1e10b7f47764d1bb0c4f1a (diff)
Make `StrictValidityChecking` a function (#3092)
Companion PR to https://github.com/matrix-org/gomatrixserverlib/pull/388
Diffstat (limited to 'roomserver/api')
-rw-r--r--roomserver/api/api.go13
-rw-r--r--roomserver/api/query.go68
2 files changed, 60 insertions, 21 deletions
diff --git a/roomserver/api/api.go b/roomserver/api/api.go
index 7cb3379e..a37ade3a 100644
--- a/roomserver/api/api.go
+++ b/roomserver/api/api.go
@@ -32,6 +32,16 @@ func (e ErrNotAllowed) Error() string {
return e.Err.Error()
}
+type RestrictedJoinAPI interface {
+ CurrentStateEvent(ctx context.Context, roomID spec.RoomID, eventType string, stateKey string) (gomatrixserverlib.PDU, error)
+ InvitePending(ctx context.Context, roomID spec.RoomID, userID spec.UserID) (bool, error)
+ RestrictedRoomJoinInfo(ctx context.Context, roomID spec.RoomID, userID spec.UserID, localServerName spec.ServerName) (*gomatrixserverlib.RestrictedRoomJoinInfo, error)
+ QueryRoomInfo(ctx context.Context, roomID spec.RoomID) (*types.RoomInfo, error)
+ QueryServerJoinedToRoom(ctx context.Context, req *QueryServerJoinedToRoomRequest, res *QueryServerJoinedToRoomResponse) error
+ UserJoinedToRoom(ctx context.Context, roomID types.RoomNID, userID spec.UserID) (bool, error)
+ LocallyJoinedUsers(ctx context.Context, roomVersion gomatrixserverlib.RoomVersion, roomNID types.RoomNID) ([]gomatrixserverlib.PDU, error)
+}
+
// RoomserverInputAPI is used to write events to the room server.
type RoomserverInternalAPI interface {
SyncRoomserverAPI
@@ -199,6 +209,7 @@ type UserRoomserverAPI interface {
}
type FederationRoomserverAPI interface {
+ RestrictedJoinAPI
InputRoomEventsAPI
QueryLatestEventsAndStateAPI
QueryBulkStateContentAPI
@@ -223,7 +234,7 @@ type FederationRoomserverAPI interface {
// Query whether a server is allowed to see an event
QueryServerAllowedToSeeEvent(ctx context.Context, serverName spec.ServerName, eventID string) (allowed bool, err error)
QueryRoomsForUser(ctx context.Context, req *QueryRoomsForUserRequest, res *QueryRoomsForUserResponse) error
- QueryRestrictedJoinAllowed(ctx context.Context, req *QueryRestrictedJoinAllowedRequest, res *QueryRestrictedJoinAllowedResponse) error
+ QueryRestrictedJoinAllowed(ctx context.Context, roomID spec.RoomID, userID spec.UserID) (string, error)
PerformInboundPeek(ctx context.Context, req *PerformInboundPeekRequest, res *PerformInboundPeekResponse) error
HandleInvite(ctx context.Context, event *types.HeaderedEvent) error
diff --git a/roomserver/api/query.go b/roomserver/api/query.go
index b33698c8..e741c140 100644
--- a/roomserver/api/query.go
+++ b/roomserver/api/query.go
@@ -24,6 +24,7 @@ import (
"github.com/matrix-org/gomatrixserverlib"
"github.com/matrix-org/gomatrixserverlib/spec"
+ "github.com/matrix-org/util"
"github.com/matrix-org/dendrite/clientapi/auth/authtypes"
"github.com/matrix-org/dendrite/roomserver/types"
@@ -351,26 +352,6 @@ type QueryServerBannedFromRoomResponse struct {
Banned bool `json:"banned"`
}
-type QueryRestrictedJoinAllowedRequest struct {
- UserID string `json:"user_id"`
- RoomID string `json:"room_id"`
-}
-
-type QueryRestrictedJoinAllowedResponse struct {
- // True if the room membership is restricted by the join rule being set to "restricted"
- Restricted bool `json:"restricted"`
- // True if our local server is joined to all of the allowed rooms specified in the "allow"
- // key of the join rule, false if we are missing from some of them and therefore can't
- // reliably decide whether or not we can satisfy the join
- Resident bool `json:"resident"`
- // True if the restricted join is allowed because we found the membership in one of the
- // allowed rooms from the join rule, false if not
- Allowed bool `json:"allowed"`
- // Contains the user ID of the selected user ID that has power to issue invites, this will
- // get populated into the "join_authorised_via_users_server" content in the membership
- AuthorisedVia string `json:"authorised_via,omitempty"`
-}
-
// MarshalJSON stringifies the room ID and StateKeyTuple keys so they can be sent over the wire in HTTP API mode.
func (r *QueryBulkStateContentResponse) MarshalJSON() ([]byte, error) {
se := make(map[string]string)
@@ -459,6 +440,53 @@ type QueryLeftUsersResponse struct {
LeftUsers []string `json:"user_ids"`
}
+type JoinRoomQuerier struct {
+ Roomserver RestrictedJoinAPI
+}
+
+func (rq *JoinRoomQuerier) CurrentStateEvent(ctx context.Context, roomID spec.RoomID, eventType string, stateKey string) (gomatrixserverlib.PDU, error) {
+ return rq.Roomserver.CurrentStateEvent(ctx, roomID, eventType, stateKey)
+}
+
+func (rq *JoinRoomQuerier) InvitePending(ctx context.Context, roomID spec.RoomID, userID spec.UserID) (bool, error) {
+ return rq.Roomserver.InvitePending(ctx, roomID, userID)
+}
+
+func (rq *JoinRoomQuerier) RestrictedRoomJoinInfo(ctx context.Context, roomID spec.RoomID, userID spec.UserID, localServerName spec.ServerName) (*gomatrixserverlib.RestrictedRoomJoinInfo, error) {
+ roomInfo, err := rq.Roomserver.QueryRoomInfo(ctx, roomID)
+ if err != nil || roomInfo == nil || roomInfo.IsStub() {
+ return nil, err
+ }
+
+ req := QueryServerJoinedToRoomRequest{
+ ServerName: localServerName,
+ RoomID: roomID.String(),
+ }
+ res := QueryServerJoinedToRoomResponse{}
+ if err = rq.Roomserver.QueryServerJoinedToRoom(ctx, &req, &res); err != nil {
+ util.GetLogger(ctx).WithError(err).Error("rsAPI.QueryServerJoinedToRoom failed")
+ return nil, fmt.Errorf("InternalServerError: Failed to query room: %w", err)
+ }
+
+ userJoinedToRoom, err := rq.Roomserver.UserJoinedToRoom(ctx, types.RoomNID(roomInfo.RoomNID), userID)
+ if err != nil {
+ util.GetLogger(ctx).WithError(err).Error("rsAPI.UserJoinedToRoom failed")
+ return nil, fmt.Errorf("InternalServerError: %w", err)
+ }
+
+ locallyJoinedUsers, err := rq.Roomserver.LocallyJoinedUsers(ctx, roomInfo.RoomVersion, types.RoomNID(roomInfo.RoomNID))
+ if err != nil {
+ util.GetLogger(ctx).WithError(err).Error("rsAPI.GetLocallyJoinedUsers failed")
+ return nil, fmt.Errorf("InternalServerError: %w", err)
+ }
+
+ return &gomatrixserverlib.RestrictedRoomJoinInfo{
+ LocalServerInRoom: res.RoomExists && res.IsInRoom,
+ UserJoinedToRoom: userJoinedToRoom,
+ JoinedUsers: locallyJoinedUsers,
+ }, nil
+}
+
type MembershipQuerier struct {
Roomserver FederationRoomserverAPI
}