diff --git a/roomserver/api/canonical_alias.go b/roomserver/api/canonical_alias.go new file mode 100644 index 000000000..c0f3b02e6 --- /dev/null +++ b/roomserver/api/canonical_alias.go @@ -0,0 +1,185 @@ +// Copyright 2020 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package api + +import ( + "context" + "net/http" + + commonHTTP "github.com/matrix-org/dendrite/common/http" + opentracing "github.com/opentracing/opentracing-go" +) + +// SetRoomCanonicalAliasRequest is a request to SetRoomCanonicalAlias +type SetRoomCanonicalAliasRequest struct { + // ID of the user setting the alias + UserID string `json:"user_id"` + // New alias for the room + CanonicalAlias string `json:"alias"` + // The room ID the alias is referring to + RoomID string `json:"room_id"` +} + +// SetRoomCanonicalAliasResponse is a response to SetRoomCanonicalAlias +type SetRoomCanonicalAliasResponse struct { + // Does the alias already refer to a room? + AliasExists bool `json:"alias_exists"` + // Does the alias refer to a different room? + DifferentRoom bool `json:"different_room"` +} + +// GetRoomIDForCanonicalAliasRequest is a request to GetRoomIDForCanonicalAlias +type GetRoomIDForCanonicalAliasRequest struct { + // Canonical Alias we want to lookup + CanonicalAlias string `json:"alias"` +} + +// GetRoomIDForCanonicalAliasResponse is a response to GetRoomIDForCanonicalAlias +type GetRoomIDForCanonicalAliasResponse struct { + // The room ID the canonical alias refers to + RoomID string `json:"room_id"` +} + +// GetCanonicalAliasForRoomIDRequest is a request to GetCanonicalAliasForRoomID +type GetCanonicalAliasForRoomIDRequest struct { + // The room ID we want to find the canonical for + RoomID string `json:"room_id"` +} + +// GetCanonicalForRoomIDResponse is a response to GetCanonicalAliasForRoomID +type GetCanonicalAliasForRoomIDResponse struct { + CanonicalAlias string `json:"alias"` +} + +// GetCreatorIDForCanonicalAliasRequest is a request to GetCreatorIDForCanonicalAlias +type GetCreatorIDForCanonicalAliasRequest struct { + // The alias we want to find the creator of + CanonicalAlias string `json:"alias"` +} + +// GetCreatorIDForCanonicalAliasResponse is a response to GetCreatorIDForCanonicalAlias +type GetCreatorIDForAliasResponse struct { + // The user ID of the canonical alias creator + UserID string `json:"user_id"` +} + +// RoomserverCanonicalAliasAPI is used to save, lookup or remove a room alias +type RoomserverCanonicalAliasAPI interface { + // Set the room canonical alias + SetRoomCanonicalAlias( + ctx context.Context, + req *SetRoomCanonicalAliasRequest, + response *SetRoomCanonicalAliasResponse, + ) error + + // Get the room ID for an alias + GetRoomIDForCanonicalAlias( + ctx context.Context, + req *GetRoomIDForCanonicalAliasRequest, + response *GetRoomIDForCanonicalAliasResponse, + ) error + + // Get the canonical alias for a room ID + GetCanonicalAliasForRoomID( + ctx context.Context, + req *GetCanonicalAliasForRoomIDRequest, + response *GetCanonicalAliasForRoomIDResponse, + ) error + + // Get the user ID of the creator of a canonical alias + GetCreatorIDForCanonicalAlias( + ctx context.Context, + req *GetCreatorIDForCanonicalAliasRequest, + response *GetCreatorIDForCanonicalAliasAliasResponse, + ) error +} + +// RoomserverSetRoomCanonicalAliasPath is the HTTP path for the SetRoomCanonicalAlias API. +const RoomserverSetRoomCanonicalAliasPath = "/api/roomserver/setRoomCanonicalAlias" + +// RoomserverGetRoomIDForCanonicalAliasPath is the HTTP path for the GetRoomIDForCanonicalAlias API. +const RoomserverGetRoomIDForCanonicalAliasPath = "/api/roomserver/GetRoomIDForCanonicalAlias" + +// RoomserverGetCanonicalAliasForRoomIDPath is the HTTP path for the GetCanonicalAliasForRoomID API. +const RoomserverGetCanonicalAliasForRoomIDPath = "/api/roomserver/GetCanonicalAliasForRoomID" + +// RoomserverGetCreatorIDForCanonicalAliasPath is the HTTP path for the GetCreatorIDForCanonicalAlias API. +const RoomserverGetCreatorIDForCanonicalAliasPath = "/api/roomserver/GetCreatorIDForCanonicalAlias" + +// NewRoomserverCanonicalAliasAPIHTTP creates a RoomserverCanonicalAliasAPI implemented by talking to a HTTP POST API. +// If httpClient is nil then it uses the http.DefaultClient +func NewRoomserverCanonicalAliasAPIHTTP(roomserverURL string, httpClient *http.Client) RoomserverCanonicalAliasAPI { + if httpClient == nil { + httpClient = http.DefaultClient + } + return &httpRoomserverCanonicalAliasAPI{roomserverURL, httpClient} +} + +type httpRoomserverCanonicalAliasAPI struct { + roomserverURL string + httpClient *http.Client +} + +// SetRoomCanonicalAlias implements RoomserverCanonicalAliasAPI +func (h *httpRoomserverCanonicalAliasAPI) SetRoomCanonicalAlias( + ctx context.Context, + request *SetRoomCanonicalAliasRequest, + response *SetRoomCanonicalAliasResponse, +) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "SetRoomCanonicalAlias") + defer span.Finish() + + apiURL := h.roomserverURL + RoomserverSetRoomCanonicalAliasPath + return commonHTTP.PostJSON(ctx, span, h.httpClient, apiURL, request, response) +} + +// GetRoomIDForCanonicalAlias implements RoomserverCanonicalAliasAPI +func (h *httpRoomserverCanonicalAliasAPI) GetRoomIDForCanonicalAlias( + ctx context.Context, + request *GetRoomIDForCanonicalAliasRequest, + response *GetRoomIDForCanonicalAliasResponse, +) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "GetRoomIDForCanonicalAlias") + defer span.Finish() + + apiURL := h.roomserverURL + RoomserverGetRoomIDForCanonicalAliasPath + return commonHTTP.PostJSON(ctx, span, h.httpClient, apiURL, request, response) +} + +// GetCanonicalAliasForRoomID implements RoomserverCanonicalAliasAPI +func (h *httpRoomserverCanonicalAliasAPI) GetCanonicalAliasForRoomID( + ctx context.Context, + request *GetCanonicalAliasForRoomIDRequest, + response *GetCanonicalAliasForRoomIDResponse, +) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "GetCanonicalAliasForRoomID") + defer span.Finish() + + apiURL := h.roomserverURL + RoomserverGetCanonicalAliasForRoomIDPath + return commonHTTP.PostJSON(ctx, span, h.httpClient, apiURL, request, response) +} + +// GetCreatorIDForAlias implements RoomserverCanonicalAliasAPI +func (h *httpRoomserverCanonicalAliasAPI) GetCreatorIDForCanonicalAlias( + ctx context.Context, + request *GetCreatorIDForCanonicalAliasRequest, + response *GetCreatorIDForCanonicalAliasResponse, +) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "GetCreatorIDForCanonicalAlias") + defer span.Finish() + + apiURL := h.roomserverURL + RoomserverGetCreatorIDForCanonicalAliasPath + return commonHTTP.PostJSON(ctx, span, h.httpClient, apiURL, request, response) +} diff --git a/roomserver/canonical_alias/canonical_alias.go b/roomserver/canonical_alias/canonical_alias.go index b129588eb..30b5c1a53 100644 --- a/roomserver/canonical_alias/canonical_alias.go +++ b/roomserver/canonical_alias/canonical_alias.go @@ -84,11 +84,11 @@ func (r *RoomserverCanonicalAliasAPI) SetRoomAlias( // The alias belongs to a different room if roomID != request.roomID { // RFC: Is there a standard bool for wrong room? - response.CorrectRoom = false + response.DifferentRoom = true return nil } - response.CorrectRoom = true + response.DifferentRoom = false // Save the new canonical alias if err := r.DB.SetRoomCanonicalAlias(ctx, request.CanonicalAlias, request.RoomID, request.UserID); err != nil {