2020-05-01 10:48:17 +01:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2023-06-13 13:19:31 +01:00
|
|
|
"crypto/ed25519"
|
2020-05-01 10:48:17 +01:00
|
|
|
|
2022-02-18 15:05:03 +00:00
|
|
|
"github.com/matrix-org/gomatrixserverlib"
|
2023-04-19 15:50:33 +01:00
|
|
|
"github.com/matrix-org/gomatrixserverlib/spec"
|
2023-05-31 16:27:08 +01:00
|
|
|
"github.com/matrix-org/util"
|
2022-02-18 15:05:03 +00:00
|
|
|
|
2020-12-18 13:33:28 +00:00
|
|
|
asAPI "github.com/matrix-org/dendrite/appservice/api"
|
2021-11-24 10:45:23 +00:00
|
|
|
fsAPI "github.com/matrix-org/dendrite/federationapi/api"
|
2023-05-17 01:33:27 +01:00
|
|
|
"github.com/matrix-org/dendrite/roomserver/types"
|
2022-02-18 15:05:03 +00:00
|
|
|
userapi "github.com/matrix-org/dendrite/userapi/api"
|
2020-05-01 10:48:17 +01:00
|
|
|
)
|
|
|
|
|
2023-04-28 16:46:01 +01:00
|
|
|
// ErrInvalidID is an error returned if the userID is invalid
|
|
|
|
type ErrInvalidID struct {
|
|
|
|
Err error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e ErrInvalidID) Error() string {
|
|
|
|
return e.Err.Error()
|
|
|
|
}
|
|
|
|
|
|
|
|
// ErrNotAllowed is an error returned if the user is not allowed
|
|
|
|
// to execute some action (e.g. invite)
|
|
|
|
type ErrNotAllowed struct {
|
|
|
|
Err error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e ErrNotAllowed) Error() string {
|
|
|
|
return e.Err.Error()
|
|
|
|
}
|
|
|
|
|
2023-06-06 14:16:55 +01:00
|
|
|
type RestrictedJoinAPI interface {
|
|
|
|
CurrentStateEvent(ctx context.Context, roomID spec.RoomID, eventType string, stateKey string) (gomatrixserverlib.PDU, error)
|
2023-06-12 12:19:25 +01:00
|
|
|
InvitePending(ctx context.Context, roomID spec.RoomID, senderID spec.SenderID) (bool, error)
|
|
|
|
RestrictedRoomJoinInfo(ctx context.Context, roomID spec.RoomID, senderID spec.SenderID, localServerName spec.ServerName) (*gomatrixserverlib.RestrictedRoomJoinInfo, error)
|
2023-06-06 14:16:55 +01:00
|
|
|
QueryRoomInfo(ctx context.Context, roomID spec.RoomID) (*types.RoomInfo, error)
|
|
|
|
QueryServerJoinedToRoom(ctx context.Context, req *QueryServerJoinedToRoomRequest, res *QueryServerJoinedToRoomResponse) error
|
2023-06-12 12:19:25 +01:00
|
|
|
UserJoinedToRoom(ctx context.Context, roomID types.RoomNID, senderID spec.SenderID) (bool, error)
|
2023-06-06 14:16:55 +01:00
|
|
|
LocallyJoinedUsers(ctx context.Context, roomVersion gomatrixserverlib.RoomVersion, roomNID types.RoomNID) ([]gomatrixserverlib.PDU, error)
|
|
|
|
}
|
|
|
|
|
2020-05-01 10:48:17 +01:00
|
|
|
// RoomserverInputAPI is used to write events to the room server.
|
|
|
|
type RoomserverInternalAPI interface {
|
2022-05-05 09:56:03 +01:00
|
|
|
SyncRoomserverAPI
|
2022-05-05 13:17:38 +01:00
|
|
|
AppserviceRoomserverAPI
|
|
|
|
ClientRoomserverAPI
|
2022-05-05 19:30:38 +01:00
|
|
|
UserRoomserverAPI
|
|
|
|
FederationRoomserverAPI
|
2023-06-06 21:55:18 +01:00
|
|
|
QuerySenderIDAPI
|
2022-05-05 09:56:03 +01:00
|
|
|
|
2020-05-01 10:48:17 +01:00
|
|
|
// needed to avoid chicken and egg scenario when setting up the
|
|
|
|
// interdependencies between the roomserver and other input APIs
|
2022-05-05 19:30:38 +01:00
|
|
|
SetFederationAPI(fsAPI fsAPI.RoomserverFederationAPI, keyRing *gomatrixserverlib.KeyRing)
|
2022-05-06 12:39:26 +01:00
|
|
|
SetAppserviceAPI(asAPI asAPI.AppServiceInternalAPI)
|
|
|
|
SetUserAPI(userAPI userapi.RoomserverUserAPI)
|
2020-07-02 15:41:18 +01:00
|
|
|
|
2020-12-04 14:11:01 +00:00
|
|
|
// QueryAuthChain returns the entire auth chain for the event IDs given.
|
|
|
|
// The response includes the events in the request.
|
|
|
|
// Omits without error for any missing auth events. There will be no duplicates.
|
2022-05-06 12:39:26 +01:00
|
|
|
// Used in MSC2836.
|
2020-12-04 14:11:01 +00:00
|
|
|
QueryAuthChain(
|
|
|
|
ctx context.Context,
|
2022-05-05 13:17:38 +01:00
|
|
|
req *QueryAuthChainRequest,
|
|
|
|
res *QueryAuthChainResponse,
|
2020-12-04 14:11:01 +00:00
|
|
|
) error
|
2023-06-13 13:19:31 +01:00
|
|
|
|
|
|
|
// GetOrCreateUserRoomPrivateKey gets the user room key for the specified user. If no key exists yet, a new one is created.
|
|
|
|
GetOrCreateUserRoomPrivateKey(ctx context.Context, userID spec.UserID, roomID spec.RoomID) (ed25519.PrivateKey, error)
|
2020-05-01 10:48:17 +01:00
|
|
|
}
|
2022-05-05 09:56:03 +01:00
|
|
|
|
2022-05-05 13:17:38 +01:00
|
|
|
type InputRoomEventsAPI interface {
|
|
|
|
InputRoomEvents(
|
2022-05-05 09:56:03 +01:00
|
|
|
ctx context.Context,
|
2022-05-05 13:17:38 +01:00
|
|
|
req *InputRoomEventsRequest,
|
|
|
|
res *InputRoomEventsResponse,
|
2023-05-09 23:46:49 +01:00
|
|
|
)
|
2022-05-05 13:17:38 +01:00
|
|
|
}
|
|
|
|
|
2023-06-06 21:55:18 +01:00
|
|
|
type QuerySenderIDAPI interface {
|
2023-06-07 18:14:35 +01:00
|
|
|
QuerySenderIDForUser(ctx context.Context, roomID string, userID spec.UserID) (spec.SenderID, error)
|
|
|
|
QueryUserIDForSender(ctx context.Context, roomID string, senderID spec.SenderID) (*spec.UserID, error)
|
2023-06-06 21:55:18 +01:00
|
|
|
}
|
|
|
|
|
2022-05-05 13:17:38 +01:00
|
|
|
// Query the latest events and state for a room from the room server.
|
|
|
|
type QueryLatestEventsAndStateAPI interface {
|
|
|
|
QueryLatestEventsAndState(ctx context.Context, req *QueryLatestEventsAndStateRequest, res *QueryLatestEventsAndStateResponse) error
|
|
|
|
}
|
|
|
|
|
|
|
|
// QueryBulkStateContent does a bulk query for state event content in the given rooms.
|
|
|
|
type QueryBulkStateContentAPI interface {
|
2022-05-05 09:56:03 +01:00
|
|
|
QueryBulkStateContent(ctx context.Context, req *QueryBulkStateContentRequest, res *QueryBulkStateContentResponse) error
|
2022-05-05 13:17:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
type QueryEventsAPI interface {
|
2023-03-01 16:06:47 +00:00
|
|
|
// QueryEventsByID queries a list of events by event ID for one room. If no room is specified, it will try to determine
|
|
|
|
// which room to use by querying the first events roomID.
|
2022-05-05 13:17:38 +01:00
|
|
|
QueryEventsByID(
|
|
|
|
ctx context.Context,
|
|
|
|
req *QueryEventsByIDRequest,
|
|
|
|
res *QueryEventsByIDResponse,
|
|
|
|
) error
|
|
|
|
// QueryCurrentState retrieves the requested state events. If state events are not found, they will be missing from
|
|
|
|
// the response.
|
|
|
|
QueryCurrentState(ctx context.Context, req *QueryCurrentStateRequest, res *QueryCurrentStateResponse) error
|
|
|
|
}
|
|
|
|
|
|
|
|
// API functions required by the syncapi
|
|
|
|
type SyncRoomserverAPI interface {
|
|
|
|
QueryLatestEventsAndStateAPI
|
|
|
|
QueryBulkStateContentAPI
|
2023-06-06 21:55:18 +01:00
|
|
|
QuerySenderIDAPI
|
2022-05-05 09:56:03 +01:00
|
|
|
// QuerySharedUsers returns a list of users who share at least 1 room in common with the given user.
|
|
|
|
QuerySharedUsers(ctx context.Context, req *QuerySharedUsersRequest, res *QuerySharedUsersResponse) error
|
2023-03-01 16:06:47 +00:00
|
|
|
// QueryEventsByID queries a list of events by event ID for one room. If no room is specified, it will try to determine
|
|
|
|
// which room to use by querying the first events roomID.
|
2022-05-05 09:56:03 +01:00
|
|
|
QueryEventsByID(
|
|
|
|
ctx context.Context,
|
2022-05-05 13:17:38 +01:00
|
|
|
req *QueryEventsByIDRequest,
|
|
|
|
res *QueryEventsByIDResponse,
|
2022-05-05 09:56:03 +01:00
|
|
|
) error
|
|
|
|
// Query the membership event for an user for a room.
|
|
|
|
QueryMembershipForUser(
|
|
|
|
ctx context.Context,
|
2022-05-05 13:17:38 +01:00
|
|
|
req *QueryMembershipForUserRequest,
|
|
|
|
res *QueryMembershipForUserResponse,
|
2022-05-05 09:56:03 +01:00
|
|
|
) error
|
|
|
|
|
|
|
|
// Query the state after a list of events in a room from the room server.
|
|
|
|
QueryStateAfterEvents(
|
|
|
|
ctx context.Context,
|
2022-05-05 13:17:38 +01:00
|
|
|
req *QueryStateAfterEventsRequest,
|
|
|
|
res *QueryStateAfterEventsResponse,
|
2022-05-05 09:56:03 +01:00
|
|
|
) error
|
|
|
|
|
|
|
|
// Query a given amount (or less) of events prior to a given set of events.
|
|
|
|
PerformBackfill(
|
|
|
|
ctx context.Context,
|
2022-05-05 13:17:38 +01:00
|
|
|
req *PerformBackfillRequest,
|
|
|
|
res *PerformBackfillResponse,
|
2022-05-05 09:56:03 +01:00
|
|
|
) error
|
2022-08-11 17:23:35 +01:00
|
|
|
|
|
|
|
// QueryMembershipAtEvent queries the memberships at the given events.
|
2023-04-27 12:54:20 +01:00
|
|
|
// Returns a map from eventID to a slice of types.HeaderedEvent.
|
2022-08-11 17:23:35 +01:00
|
|
|
QueryMembershipAtEvent(
|
|
|
|
ctx context.Context,
|
|
|
|
request *QueryMembershipAtEventRequest,
|
|
|
|
response *QueryMembershipAtEventResponse,
|
|
|
|
) error
|
2022-05-05 09:56:03 +01:00
|
|
|
}
|
2022-05-05 13:17:38 +01:00
|
|
|
|
|
|
|
type AppserviceRoomserverAPI interface {
|
2023-06-06 21:55:18 +01:00
|
|
|
QuerySenderIDAPI
|
2023-03-01 16:06:47 +00:00
|
|
|
// QueryEventsByID queries a list of events by event ID for one room. If no room is specified, it will try to determine
|
|
|
|
// which room to use by querying the first events roomID.
|
2022-05-05 13:17:38 +01:00
|
|
|
QueryEventsByID(
|
|
|
|
ctx context.Context,
|
|
|
|
req *QueryEventsByIDRequest,
|
|
|
|
res *QueryEventsByIDResponse,
|
|
|
|
) error
|
|
|
|
// Query a list of membership events for a room
|
|
|
|
QueryMembershipsForRoom(
|
|
|
|
ctx context.Context,
|
|
|
|
req *QueryMembershipsForRoomRequest,
|
|
|
|
res *QueryMembershipsForRoomResponse,
|
|
|
|
) error
|
|
|
|
// Get all known aliases for a room ID
|
|
|
|
GetAliasesForRoomID(
|
|
|
|
ctx context.Context,
|
|
|
|
req *GetAliasesForRoomIDRequest,
|
|
|
|
res *GetAliasesForRoomIDResponse,
|
|
|
|
) error
|
|
|
|
}
|
|
|
|
|
|
|
|
type ClientRoomserverAPI interface {
|
|
|
|
InputRoomEventsAPI
|
|
|
|
QueryLatestEventsAndStateAPI
|
|
|
|
QueryBulkStateContentAPI
|
|
|
|
QueryEventsAPI
|
2023-06-06 21:55:18 +01:00
|
|
|
QuerySenderIDAPI
|
2022-05-05 13:17:38 +01:00
|
|
|
QueryMembershipForUser(ctx context.Context, req *QueryMembershipForUserRequest, res *QueryMembershipForUserResponse) error
|
|
|
|
QueryMembershipsForRoom(ctx context.Context, req *QueryMembershipsForRoomRequest, res *QueryMembershipsForRoomResponse) error
|
|
|
|
QueryRoomsForUser(ctx context.Context, req *QueryRoomsForUserRequest, res *QueryRoomsForUserResponse) error
|
|
|
|
QueryStateAfterEvents(ctx context.Context, req *QueryStateAfterEventsRequest, res *QueryStateAfterEventsResponse) error
|
|
|
|
// QueryKnownUsers returns a list of users that we know about from our joined rooms.
|
|
|
|
QueryKnownUsers(ctx context.Context, req *QueryKnownUsersRequest, res *QueryKnownUsersResponse) error
|
2023-04-27 07:07:13 +01:00
|
|
|
QueryRoomVersionForRoom(ctx context.Context, roomID string) (gomatrixserverlib.RoomVersion, error)
|
2022-05-05 13:17:38 +01:00
|
|
|
QueryPublishedRooms(ctx context.Context, req *QueryPublishedRoomsRequest, res *QueryPublishedRoomsResponse) error
|
|
|
|
|
|
|
|
GetRoomIDForAlias(ctx context.Context, req *GetRoomIDForAliasRequest, res *GetRoomIDForAliasResponse) error
|
|
|
|
GetAliasesForRoomID(ctx context.Context, req *GetAliasesForRoomIDRequest, res *GetAliasesForRoomIDResponse) error
|
|
|
|
|
2023-05-31 16:27:08 +01:00
|
|
|
PerformCreateRoom(ctx context.Context, userID spec.UserID, roomID spec.RoomID, createRequest *PerformCreateRoomRequest) (string, *util.JSONResponse)
|
2022-05-05 13:17:38 +01:00
|
|
|
// PerformRoomUpgrade upgrades a room to a newer version
|
2023-06-12 12:19:25 +01:00
|
|
|
PerformRoomUpgrade(ctx context.Context, roomID string, userID spec.UserID, roomVersion gomatrixserverlib.RoomVersion) (newRoomID string, err error)
|
2023-04-28 16:46:01 +01:00
|
|
|
PerformAdminEvacuateRoom(ctx context.Context, roomID string) (affected []string, err error)
|
|
|
|
PerformAdminEvacuateUser(ctx context.Context, userID string) (affected []string, err error)
|
|
|
|
PerformAdminPurgeRoom(ctx context.Context, roomID string) error
|
|
|
|
PerformAdminDownloadState(ctx context.Context, roomID, userID string, serverName spec.ServerName) error
|
|
|
|
PerformPeek(ctx context.Context, req *PerformPeekRequest) (roomID string, err error)
|
|
|
|
PerformUnpeek(ctx context.Context, roomID, userID, deviceID string) error
|
|
|
|
PerformInvite(ctx context.Context, req *PerformInviteRequest) error
|
|
|
|
PerformJoin(ctx context.Context, req *PerformJoinRequest) (roomID string, joinedVia spec.ServerName, err error)
|
2022-05-05 13:17:38 +01:00
|
|
|
PerformLeave(ctx context.Context, req *PerformLeaveRequest, res *PerformLeaveResponse) error
|
2023-04-28 16:46:01 +01:00
|
|
|
PerformPublish(ctx context.Context, req *PerformPublishRequest) error
|
2022-05-05 13:17:38 +01:00
|
|
|
// PerformForget forgets a rooms history for a specific user
|
|
|
|
PerformForget(ctx context.Context, req *PerformForgetRequest, resp *PerformForgetResponse) error
|
|
|
|
SetRoomAlias(ctx context.Context, req *SetRoomAliasRequest, res *SetRoomAliasResponse) error
|
|
|
|
RemoveRoomAlias(ctx context.Context, req *RemoveRoomAliasRequest, res *RemoveRoomAliasResponse) error
|
|
|
|
}
|
2022-05-05 19:30:38 +01:00
|
|
|
|
|
|
|
type UserRoomserverAPI interface {
|
2023-06-06 21:55:18 +01:00
|
|
|
QuerySenderIDAPI
|
2022-05-05 19:30:38 +01:00
|
|
|
QueryLatestEventsAndStateAPI
|
2023-02-20 13:58:03 +00:00
|
|
|
KeyserverRoomserverAPI
|
2022-05-05 19:30:38 +01:00
|
|
|
QueryCurrentState(ctx context.Context, req *QueryCurrentStateRequest, res *QueryCurrentStateResponse) error
|
|
|
|
QueryMembershipsForRoom(ctx context.Context, req *QueryMembershipsForRoomRequest, res *QueryMembershipsForRoomResponse) error
|
2023-04-28 16:46:01 +01:00
|
|
|
PerformAdminEvacuateUser(ctx context.Context, userID string) (affected []string, err error)
|
|
|
|
PerformJoin(ctx context.Context, req *PerformJoinRequest) (roomID string, joinedVia spec.ServerName, err error)
|
2022-05-05 19:30:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
type FederationRoomserverAPI interface {
|
2023-06-06 14:16:55 +01:00
|
|
|
RestrictedJoinAPI
|
2022-05-05 19:30:38 +01:00
|
|
|
InputRoomEventsAPI
|
|
|
|
QueryLatestEventsAndStateAPI
|
|
|
|
QueryBulkStateContentAPI
|
2023-06-06 21:55:18 +01:00
|
|
|
QuerySenderIDAPI
|
|
|
|
|
2022-05-05 19:30:38 +01:00
|
|
|
// QueryServerBannedFromRoom returns whether a server is banned from a room by server ACLs.
|
|
|
|
QueryServerBannedFromRoom(ctx context.Context, req *QueryServerBannedFromRoomRequest, res *QueryServerBannedFromRoomResponse) error
|
2023-05-19 17:27:01 +01:00
|
|
|
QueryMembershipForUser(ctx context.Context, req *QueryMembershipForUserRequest, res *QueryMembershipForUserResponse) error
|
2023-06-12 12:19:25 +01:00
|
|
|
QueryMembershipForSenderID(ctx context.Context, roomID spec.RoomID, senderID spec.SenderID, res *QueryMembershipForUserResponse) error
|
2022-11-11 09:35:17 +00:00
|
|
|
QueryMembershipsForRoom(ctx context.Context, req *QueryMembershipsForRoomRequest, res *QueryMembershipsForRoomResponse) error
|
2023-04-27 07:07:13 +01:00
|
|
|
QueryRoomVersionForRoom(ctx context.Context, roomID string) (gomatrixserverlib.RoomVersion, error)
|
2022-05-05 19:30:38 +01:00
|
|
|
GetRoomIDForAlias(ctx context.Context, req *GetRoomIDForAliasRequest, res *GetRoomIDForAliasResponse) error
|
2023-03-01 16:06:47 +00:00
|
|
|
// QueryEventsByID queries a list of events by event ID for one room. If no room is specified, it will try to determine
|
|
|
|
// which room to use by querying the first events roomID.
|
2022-05-05 19:30:38 +01:00
|
|
|
QueryEventsByID(ctx context.Context, req *QueryEventsByIDRequest, res *QueryEventsByIDResponse) error
|
|
|
|
// Query to get state and auth chain for a (potentially hypothetical) event.
|
|
|
|
// Takes lists of PrevEventIDs and AuthEventsIDs and uses them to calculate
|
|
|
|
// the state and auth chain to return.
|
|
|
|
QueryStateAndAuthChain(ctx context.Context, req *QueryStateAndAuthChainRequest, res *QueryStateAndAuthChainResponse) error
|
|
|
|
QueryPublishedRooms(ctx context.Context, req *QueryPublishedRoomsRequest, res *QueryPublishedRoomsResponse) error
|
|
|
|
// Query missing events for a room from roomserver
|
|
|
|
QueryMissingEvents(ctx context.Context, req *QueryMissingEventsRequest, res *QueryMissingEventsResponse) error
|
|
|
|
// Query whether a server is allowed to see an event
|
2023-06-12 12:19:25 +01:00
|
|
|
QueryServerAllowedToSeeEvent(ctx context.Context, serverName spec.ServerName, eventID string, roomID string) (allowed bool, err error)
|
2022-05-17 13:23:35 +01:00
|
|
|
QueryRoomsForUser(ctx context.Context, req *QueryRoomsForUserRequest, res *QueryRoomsForUserResponse) error
|
2023-06-12 12:19:25 +01:00
|
|
|
QueryRestrictedJoinAllowed(ctx context.Context, roomID spec.RoomID, senderID spec.SenderID) (string, error)
|
2022-05-05 19:30:38 +01:00
|
|
|
PerformInboundPeek(ctx context.Context, req *PerformInboundPeekRequest, res *PerformInboundPeekResponse) error
|
2023-05-31 17:33:49 +01:00
|
|
|
HandleInvite(ctx context.Context, event *types.HeaderedEvent) error
|
|
|
|
|
2023-04-28 16:46:01 +01:00
|
|
|
PerformInvite(ctx context.Context, req *PerformInviteRequest) error
|
2022-05-05 19:30:38 +01:00
|
|
|
// Query a given amount (or less) of events prior to a given set of events.
|
|
|
|
PerformBackfill(ctx context.Context, req *PerformBackfillRequest, res *PerformBackfillResponse) error
|
2023-05-17 01:33:27 +01:00
|
|
|
|
2023-05-31 17:33:49 +01:00
|
|
|
IsKnownRoom(ctx context.Context, roomID spec.RoomID) (bool, error)
|
|
|
|
StateQuerier() gomatrixserverlib.StateQuerier
|
2022-05-05 19:30:38 +01:00
|
|
|
}
|
2022-12-12 07:20:59 +00:00
|
|
|
|
|
|
|
type KeyserverRoomserverAPI interface {
|
|
|
|
QueryLeftUsers(ctx context.Context, req *QueryLeftUsersRequest, res *QueryLeftUsersResponse) error
|
|
|
|
}
|