f1b92de017
* Initial cut at fixing up MSC2946 to work with latest spec * bugfix: send response back correctly * Initial working version of MSC2946 * msc2946: handle suggested_only; remove custom database As the MSC doesn't require reverse lookups, we can just pull the room state and inspect via the roomserver database. To handle this, expand QueryCurrentState to support wildcards. Use all this and handle `?suggested_only`. * Sort child rooms * msc2946: Make TestClientSpacesSummary pass * msc2946: allow invited rooms to be spidered * msc2946: support basic federation requests * fix up go mod
212 lines
7.7 KiB
Go
212 lines
7.7 KiB
Go
package api
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/matrix-org/dendrite/federationapi/types"
|
|
"github.com/matrix-org/gomatrix"
|
|
"github.com/matrix-org/gomatrixserverlib"
|
|
)
|
|
|
|
// FederationClient is a subset of gomatrixserverlib.FederationClient functions which the fedsender
|
|
// implements as proxy calls, with built-in backoff/retries/etc. Errors returned from functions in
|
|
// this interface are of type FederationClientError
|
|
type FederationClient interface {
|
|
gomatrixserverlib.BackfillClient
|
|
gomatrixserverlib.FederatedStateClient
|
|
GetUserDevices(ctx context.Context, s gomatrixserverlib.ServerName, userID string) (res gomatrixserverlib.RespUserDevices, err error)
|
|
ClaimKeys(ctx context.Context, s gomatrixserverlib.ServerName, oneTimeKeys map[string]map[string]string) (res gomatrixserverlib.RespClaimKeys, err error)
|
|
QueryKeys(ctx context.Context, s gomatrixserverlib.ServerName, keys map[string][]string) (res gomatrixserverlib.RespQueryKeys, err error)
|
|
GetEvent(ctx context.Context, s gomatrixserverlib.ServerName, eventID string) (res gomatrixserverlib.Transaction, err error)
|
|
MSC2836EventRelationships(ctx context.Context, dst gomatrixserverlib.ServerName, r gomatrixserverlib.MSC2836EventRelationshipsRequest, roomVersion gomatrixserverlib.RoomVersion) (res gomatrixserverlib.MSC2836EventRelationshipsResponse, err error)
|
|
MSC2946Spaces(ctx context.Context, dst gomatrixserverlib.ServerName, roomID string, suggestedOnly bool) (res gomatrixserverlib.MSC2946SpacesResponse, err error)
|
|
LookupServerKeys(ctx context.Context, s gomatrixserverlib.ServerName, keyRequests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp) ([]gomatrixserverlib.ServerKeys, error)
|
|
GetEventAuth(ctx context.Context, s gomatrixserverlib.ServerName, roomVersion gomatrixserverlib.RoomVersion, roomID, eventID string) (res gomatrixserverlib.RespEventAuth, err error)
|
|
LookupMissingEvents(ctx context.Context, s gomatrixserverlib.ServerName, roomID string, missing gomatrixserverlib.MissingEvents, roomVersion gomatrixserverlib.RoomVersion) (res gomatrixserverlib.RespMissingEvents, err error)
|
|
}
|
|
|
|
// FederationClientError is returned from FederationClient methods in the event of a problem.
|
|
type FederationClientError struct {
|
|
Err string
|
|
RetryAfter time.Duration
|
|
Blacklisted bool
|
|
}
|
|
|
|
func (e *FederationClientError) Error() string {
|
|
return fmt.Sprintf("%s - (retry_after=%s, blacklisted=%v)", e.Err, e.RetryAfter.String(), e.Blacklisted)
|
|
}
|
|
|
|
// FederationInternalAPI is used to query information from the federation sender.
|
|
type FederationInternalAPI interface {
|
|
FederationClient
|
|
gomatrixserverlib.KeyDatabase
|
|
|
|
KeyRing() *gomatrixserverlib.KeyRing
|
|
|
|
QueryServerKeys(ctx context.Context, request *QueryServerKeysRequest, response *QueryServerKeysResponse) error
|
|
|
|
// PerformDirectoryLookup looks up a remote room ID from a room alias.
|
|
PerformDirectoryLookup(
|
|
ctx context.Context,
|
|
request *PerformDirectoryLookupRequest,
|
|
response *PerformDirectoryLookupResponse,
|
|
) error
|
|
// Query the server names of the joined hosts in a room.
|
|
// Unlike QueryJoinedHostsInRoom, this function returns a de-duplicated slice
|
|
// containing only the server names (without information for membership events).
|
|
// The response will include this server if they are joined to the room.
|
|
QueryJoinedHostServerNamesInRoom(
|
|
ctx context.Context,
|
|
request *QueryJoinedHostServerNamesInRoomRequest,
|
|
response *QueryJoinedHostServerNamesInRoomResponse,
|
|
) error
|
|
// Handle an instruction to make_join & send_join with a remote server.
|
|
PerformJoin(
|
|
ctx context.Context,
|
|
request *PerformJoinRequest,
|
|
response *PerformJoinResponse,
|
|
)
|
|
// Handle an instruction to peek a room on a remote server.
|
|
PerformOutboundPeek(
|
|
ctx context.Context,
|
|
request *PerformOutboundPeekRequest,
|
|
response *PerformOutboundPeekResponse,
|
|
) error
|
|
// Handle an instruction to make_leave & send_leave with a remote server.
|
|
PerformLeave(
|
|
ctx context.Context,
|
|
request *PerformLeaveRequest,
|
|
response *PerformLeaveResponse,
|
|
) error
|
|
// Handle sending an invite to a remote server.
|
|
PerformInvite(
|
|
ctx context.Context,
|
|
request *PerformInviteRequest,
|
|
response *PerformInviteResponse,
|
|
) error
|
|
// Notifies the federation sender that these servers may be online and to retry sending messages.
|
|
PerformServersAlive(
|
|
ctx context.Context,
|
|
request *PerformServersAliveRequest,
|
|
response *PerformServersAliveResponse,
|
|
) error
|
|
// Broadcasts an EDU to all servers in rooms we are joined to.
|
|
PerformBroadcastEDU(
|
|
ctx context.Context,
|
|
request *PerformBroadcastEDURequest,
|
|
response *PerformBroadcastEDUResponse,
|
|
) error
|
|
}
|
|
|
|
type QueryServerKeysRequest struct {
|
|
ServerName gomatrixserverlib.ServerName
|
|
KeyIDToCriteria map[gomatrixserverlib.KeyID]gomatrixserverlib.PublicKeyNotaryQueryCriteria
|
|
}
|
|
|
|
func (q *QueryServerKeysRequest) KeyIDs() []gomatrixserverlib.KeyID {
|
|
kids := make([]gomatrixserverlib.KeyID, len(q.KeyIDToCriteria))
|
|
i := 0
|
|
for keyID := range q.KeyIDToCriteria {
|
|
kids[i] = keyID
|
|
i++
|
|
}
|
|
return kids
|
|
}
|
|
|
|
type QueryServerKeysResponse struct {
|
|
ServerKeys []gomatrixserverlib.ServerKeys
|
|
}
|
|
|
|
type QueryPublicKeysRequest struct {
|
|
Requests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp `json:"requests"`
|
|
}
|
|
|
|
type QueryPublicKeysResponse struct {
|
|
Results map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult `json:"results"`
|
|
}
|
|
|
|
type PerformDirectoryLookupRequest struct {
|
|
RoomAlias string `json:"room_alias"`
|
|
ServerName gomatrixserverlib.ServerName `json:"server_name"`
|
|
}
|
|
|
|
type PerformDirectoryLookupResponse struct {
|
|
RoomID string `json:"room_id"`
|
|
ServerNames []gomatrixserverlib.ServerName `json:"server_names"`
|
|
}
|
|
|
|
type PerformJoinRequest struct {
|
|
RoomID string `json:"room_id"`
|
|
UserID string `json:"user_id"`
|
|
// The sorted list of servers to try. Servers will be tried sequentially, after de-duplication.
|
|
ServerNames types.ServerNames `json:"server_names"`
|
|
Content map[string]interface{} `json:"content"`
|
|
}
|
|
|
|
type PerformJoinResponse struct {
|
|
JoinedVia gomatrixserverlib.ServerName
|
|
LastError *gomatrix.HTTPError
|
|
}
|
|
|
|
type PerformOutboundPeekRequest struct {
|
|
RoomID string `json:"room_id"`
|
|
// The sorted list of servers to try. Servers will be tried sequentially, after de-duplication.
|
|
ServerNames types.ServerNames `json:"server_names"`
|
|
}
|
|
|
|
type PerformOutboundPeekResponse struct {
|
|
LastError *gomatrix.HTTPError
|
|
}
|
|
|
|
type PerformLeaveRequest struct {
|
|
RoomID string `json:"room_id"`
|
|
UserID string `json:"user_id"`
|
|
ServerNames types.ServerNames `json:"server_names"`
|
|
}
|
|
|
|
type PerformLeaveResponse struct {
|
|
}
|
|
|
|
type PerformInviteRequest struct {
|
|
RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"`
|
|
Event *gomatrixserverlib.HeaderedEvent `json:"event"`
|
|
InviteRoomState []gomatrixserverlib.InviteV2StrippedState `json:"invite_room_state"`
|
|
}
|
|
|
|
type PerformInviteResponse struct {
|
|
Event *gomatrixserverlib.HeaderedEvent `json:"event"`
|
|
}
|
|
|
|
type PerformServersAliveRequest struct {
|
|
Servers []gomatrixserverlib.ServerName
|
|
}
|
|
|
|
type PerformServersAliveResponse struct {
|
|
}
|
|
|
|
// QueryJoinedHostServerNamesInRoomRequest is a request to QueryJoinedHostServerNames
|
|
type QueryJoinedHostServerNamesInRoomRequest struct {
|
|
RoomID string `json:"room_id"`
|
|
ExcludeSelf bool `json:"exclude_self"`
|
|
}
|
|
|
|
// QueryJoinedHostServerNamesInRoomResponse is a response to QueryJoinedHostServerNames
|
|
type QueryJoinedHostServerNamesInRoomResponse struct {
|
|
ServerNames []gomatrixserverlib.ServerName `json:"server_names"`
|
|
}
|
|
|
|
type PerformBroadcastEDURequest struct {
|
|
}
|
|
|
|
type PerformBroadcastEDUResponse struct {
|
|
}
|
|
|
|
type InputPublicKeysRequest struct {
|
|
Keys map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult `json:"keys"`
|
|
}
|
|
|
|
type InputPublicKeysResponse struct {
|
|
}
|