aboutsummaryrefslogtreecommitdiff
path: root/roomserver
diff options
context:
space:
mode:
authorS7evinK <2353100+S7evinK@users.noreply.github.com>2022-02-18 16:05:03 +0100
committerGitHub <noreply@github.com>2022-02-18 16:05:03 +0100
commit002429c9e24cc746e0929b41eccbe429f89a6e1f (patch)
tree217eaea280343f46c61868a694d75fccd8fe66af /roomserver
parentdbded875257703eb63c8eb8af8d47d74c811642f (diff)
Implement server notices (#2180)
* Add server_notices config * Disallow rejecting "server notice" invites * Update config * Slightly refactor sendEvent and CreateRoom so it can be reused * Implement unspecced server notices * Validate the request * Set the user api when starting * Rename function/variables * Update comments * Update config * Set the avatar on account creation * Update test * Only create the account when starting Only add routes if sever notices are enabled * Use reserver username Check that we actually got roomData * Add check for admin account Enable server notices for CI Return same values as Synapse * Add custom error for rejecting server notice invite * Move building an invite to it's own function, for reusability * Don't create new rooms, use the existing one (follow Synapse behavior) Co-authored-by: kegsay <kegan@matrix.org>
Diffstat (limited to 'roomserver')
-rw-r--r--roomserver/api/api.go5
-rw-r--r--roomserver/api/api_trace.go10
-rw-r--r--roomserver/api/perform.go2
-rw-r--r--roomserver/internal/api.go5
-rw-r--r--roomserver/internal/perform/perform_leave.go43
-rw-r--r--roomserver/inthttp/client.go6
6 files changed, 61 insertions, 10 deletions
diff --git a/roomserver/api/api.go b/roomserver/api/api.go
index e6d37e8f..bcbf0e4f 100644
--- a/roomserver/api/api.go
+++ b/roomserver/api/api.go
@@ -3,9 +3,11 @@ package api
import (
"context"
+ "github.com/matrix-org/gomatrixserverlib"
+
asAPI "github.com/matrix-org/dendrite/appservice/api"
fsAPI "github.com/matrix-org/dendrite/federationapi/api"
- "github.com/matrix-org/gomatrixserverlib"
+ userapi "github.com/matrix-org/dendrite/userapi/api"
)
// RoomserverInputAPI is used to write events to the room server.
@@ -14,6 +16,7 @@ type RoomserverInternalAPI interface {
// interdependencies between the roomserver and other input APIs
SetFederationAPI(fsAPI fsAPI.FederationInternalAPI, keyRing *gomatrixserverlib.KeyRing)
SetAppserviceAPI(asAPI asAPI.AppServiceQueryAPI)
+ SetUserAPI(userAPI userapi.UserInternalAPI)
InputRoomEvents(
ctx context.Context,
diff --git a/roomserver/api/api_trace.go b/roomserver/api/api_trace.go
index 16f52abb..88b37215 100644
--- a/roomserver/api/api_trace.go
+++ b/roomserver/api/api_trace.go
@@ -5,10 +5,12 @@ import (
"encoding/json"
"fmt"
- asAPI "github.com/matrix-org/dendrite/appservice/api"
- fsAPI "github.com/matrix-org/dendrite/federationapi/api"
"github.com/matrix-org/gomatrixserverlib"
"github.com/matrix-org/util"
+
+ asAPI "github.com/matrix-org/dendrite/appservice/api"
+ fsAPI "github.com/matrix-org/dendrite/federationapi/api"
+ userapi "github.com/matrix-org/dendrite/userapi/api"
)
// RoomserverInternalAPITrace wraps a RoomserverInternalAPI and logs the
@@ -25,6 +27,10 @@ func (t *RoomserverInternalAPITrace) SetAppserviceAPI(asAPI asAPI.AppServiceQuer
t.Impl.SetAppserviceAPI(asAPI)
}
+func (t *RoomserverInternalAPITrace) SetUserAPI(userAPI userapi.UserInternalAPI) {
+ t.Impl.SetUserAPI(userAPI)
+}
+
func (t *RoomserverInternalAPITrace) InputRoomEvents(
ctx context.Context,
req *InputRoomEventsRequest,
diff --git a/roomserver/api/perform.go b/roomserver/api/perform.go
index 51cbcb1a..d640858a 100644
--- a/roomserver/api/perform.go
+++ b/roomserver/api/perform.go
@@ -95,6 +95,8 @@ type PerformLeaveRequest struct {
}
type PerformLeaveResponse struct {
+ Code int `json:"code,omitempty"`
+ Message interface{} `json:"message,omitempty"`
}
type PerformInviteRequest struct {
diff --git a/roomserver/internal/api.go b/roomserver/internal/api.go
index e58f11c1..10c8c844 100644
--- a/roomserver/internal/api.go
+++ b/roomserver/internal/api.go
@@ -15,6 +15,7 @@ import (
"github.com/matrix-org/dendrite/roomserver/storage"
"github.com/matrix-org/dendrite/setup/config"
"github.com/matrix-org/dendrite/setup/process"
+ userapi "github.com/matrix-org/dendrite/userapi/api"
"github.com/matrix-org/gomatrixserverlib"
"github.com/nats-io/nats.go"
"github.com/sirupsen/logrus"
@@ -159,6 +160,10 @@ func (r *RoomserverInternalAPI) SetFederationAPI(fsAPI fsAPI.FederationInternalA
}
}
+func (r *RoomserverInternalAPI) SetUserAPI(userAPI userapi.UserInternalAPI) {
+ r.Leaver.UserAPI = userAPI
+}
+
func (r *RoomserverInternalAPI) SetAppserviceAPI(asAPI asAPI.AppServiceQueryAPI) {
r.asAPI = asAPI
}
diff --git a/roomserver/internal/perform/perform_leave.go b/roomserver/internal/perform/perform_leave.go
index 12784e5f..49ddd481 100644
--- a/roomserver/internal/perform/perform_leave.go
+++ b/roomserver/internal/perform/perform_leave.go
@@ -16,25 +16,29 @@ package perform
import (
"context"
+ "encoding/json"
"fmt"
"strings"
+ "github.com/matrix-org/gomatrix"
+ "github.com/matrix-org/gomatrixserverlib"
+ "github.com/matrix-org/util"
+ "github.com/sirupsen/logrus"
+
fsAPI "github.com/matrix-org/dendrite/federationapi/api"
"github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/dendrite/roomserver/internal/helpers"
"github.com/matrix-org/dendrite/roomserver/internal/input"
"github.com/matrix-org/dendrite/roomserver/storage"
"github.com/matrix-org/dendrite/setup/config"
- "github.com/matrix-org/gomatrixserverlib"
- "github.com/matrix-org/util"
- "github.com/sirupsen/logrus"
+ userapi "github.com/matrix-org/dendrite/userapi/api"
)
type Leaver struct {
- Cfg *config.RoomServer
- DB storage.Database
- FSAPI fsAPI.FederationInternalAPI
-
+ Cfg *config.RoomServer
+ DB storage.Database
+ FSAPI fsAPI.FederationInternalAPI
+ UserAPI userapi.UserInternalAPI
Inputer *input.Inputer
}
@@ -85,6 +89,31 @@ func (r *Leaver) performLeaveRoomByID(
if host != r.Cfg.Matrix.ServerName {
return r.performFederatedRejectInvite(ctx, req, res, senderUser, eventID)
}
+ // check that this is not a "server notice room"
+ accData := &userapi.QueryAccountDataResponse{}
+ if err := r.UserAPI.QueryAccountData(ctx, &userapi.QueryAccountDataRequest{
+ UserID: req.UserID,
+ RoomID: req.RoomID,
+ DataType: "m.tag",
+ }, accData); err != nil {
+ return nil, fmt.Errorf("unable to query account data")
+ }
+
+ if roomData, ok := accData.RoomAccountData[req.RoomID]; ok {
+ tagData, ok := roomData["m.tag"]
+ if ok {
+ tags := gomatrix.TagContent{}
+ if err = json.Unmarshal(tagData, &tags); err != nil {
+ return nil, fmt.Errorf("unable to unmarshal tag content")
+ }
+ if _, ok = tags.Tags["m.server_notice"]; ok {
+ // mimic the returned values from Synapse
+ res.Message = "You cannot reject this invite"
+ res.Code = 403
+ return nil, fmt.Errorf("You cannot reject this invite")
+ }
+ }
+ }
}
// There's no invite pending, so first of all we want to find out
diff --git a/roomserver/inthttp/client.go b/roomserver/inthttp/client.go
index a61404ef..99c59660 100644
--- a/roomserver/inthttp/client.go
+++ b/roomserver/inthttp/client.go
@@ -11,6 +11,8 @@ import (
"github.com/matrix-org/dendrite/internal/caching"
"github.com/matrix-org/dendrite/internal/httputil"
"github.com/matrix-org/dendrite/roomserver/api"
+ userapi "github.com/matrix-org/dendrite/userapi/api"
+
"github.com/matrix-org/gomatrixserverlib"
"github.com/opentracing/opentracing-go"
)
@@ -90,6 +92,10 @@ func (h *httpRoomserverInternalAPI) SetFederationAPI(fsAPI fsInputAPI.Federation
func (h *httpRoomserverInternalAPI) SetAppserviceAPI(asAPI asAPI.AppServiceQueryAPI) {
}
+// SetUserAPI no-ops in HTTP client mode as there is no chicken/egg scenario
+func (h *httpRoomserverInternalAPI) SetUserAPI(userAPI userapi.UserInternalAPI) {
+}
+
// SetRoomAlias implements RoomserverAliasAPI
func (h *httpRoomserverInternalAPI) SetRoomAlias(
ctx context.Context,