aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dendrite-sample.monolith.yaml8
-rw-r--r--dendrite-sample.polylith.yaml8
-rw-r--r--roomserver/api/api.go1
-rw-r--r--setup/config/config_userapi.go4
-rw-r--r--userapi/internal/api.go42
-rw-r--r--userapi/userapi.go1
6 files changed, 64 insertions, 0 deletions
diff --git a/dendrite-sample.monolith.yaml b/dendrite-sample.monolith.yaml
index eadb74a2..5195c29b 100644
--- a/dendrite-sample.monolith.yaml
+++ b/dendrite-sample.monolith.yaml
@@ -310,6 +310,14 @@ user_api:
# The default lifetime is 3600000ms (60 minutes).
# openid_token_lifetime_ms: 3600000
+ # Users who register on this homeserver will automatically be joined to the rooms listed under "auto_join_rooms" option.
+ # By default, any room aliases included in this list will be created as a publicly joinable room
+ # when the first user registers for the homeserver. If the room already exists,
+ # make certain it is a publicly joinable room, i.e. the join rule of the room must be set to 'public'.
+ # As Spaces are just rooms under the hood, Space aliases may also be used.
+ auto_join_rooms:
+ # - "#main:matrix.org"
+
# Configuration for Opentracing.
# See https://github.com/matrix-org/dendrite/tree/master/docs/tracing for information on
# how this works and how to set it up.
diff --git a/dendrite-sample.polylith.yaml b/dendrite-sample.polylith.yaml
index aa7e0cc3..bbbe16fd 100644
--- a/dendrite-sample.polylith.yaml
+++ b/dendrite-sample.polylith.yaml
@@ -375,6 +375,14 @@ user_api:
# The default lifetime is 3600000ms (60 minutes).
# openid_token_lifetime_ms: 3600000
+ # Users who register on this homeserver will automatically be joined to the rooms listed under "auto_join_rooms" option.
+ # By default, any room aliases included in this list will be created as a publicly joinable room
+ # when the first user registers for the homeserver. If the room already exists,
+ # make certain it is a publicly joinable room, i.e. the join rule of the room must be set to 'public'.
+ # As Spaces are just rooms under the hood, Space aliases may also be used.
+ auto_join_rooms:
+ # - "#main:matrix.org"
+
# Configuration for Opentracing.
# See https://github.com/matrix-org/dendrite/tree/master/docs/tracing for information on
# how this works and how to set it up.
diff --git a/roomserver/api/api.go b/roomserver/api/api.go
index baf63aa3..403bbe8b 100644
--- a/roomserver/api/api.go
+++ b/roomserver/api/api.go
@@ -167,6 +167,7 @@ type UserRoomserverAPI interface {
QueryCurrentState(ctx context.Context, req *QueryCurrentStateRequest, res *QueryCurrentStateResponse) error
QueryMembershipsForRoom(ctx context.Context, req *QueryMembershipsForRoomRequest, res *QueryMembershipsForRoomResponse) error
PerformAdminEvacuateUser(ctx context.Context, req *PerformAdminEvacuateUserRequest, res *PerformAdminEvacuateUserResponse) error
+ PerformJoin(ctx context.Context, req *PerformJoinRequest, res *PerformJoinResponse) error
}
type FederationRoomserverAPI interface {
diff --git a/setup/config/config_userapi.go b/setup/config/config_userapi.go
index 97a6d738..f8ad41d9 100644
--- a/setup/config/config_userapi.go
+++ b/setup/config/config_userapi.go
@@ -19,6 +19,10 @@ type UserAPI struct {
// The Account database stores the login details and account information
// for local users. It is accessed by the UserAPI.
AccountDatabase DatabaseOptions `yaml:"account_database,omitempty"`
+
+ // Users who register on this homeserver will automatically
+ // be joined to the rooms listed under this option.
+ AutoJoinRooms []string `yaml:"auto_join_rooms"`
}
const DefaultOpenIDTokenLifetimeMS = 3600000 // 60 minutes
diff --git a/userapi/internal/api.go b/userapi/internal/api.go
index 63044eed..7b94b3da 100644
--- a/userapi/internal/api.go
+++ b/userapi/internal/api.go
@@ -54,6 +54,7 @@ type UserInternalAPI struct {
KeyAPI keyapi.UserKeyAPI
RSAPI rsapi.UserRoomserverAPI
PgClient pushgateway.Client
+ Cfg *config.UserAPI
}
func (a *UserInternalAPI) InputAccountData(ctx context.Context, req *api.InputAccountDataRequest, res *api.InputAccountDataResponse) error {
@@ -130,6 +131,45 @@ func (a *UserInternalAPI) setFullyRead(ctx context.Context, req *api.InputAccoun
return nil
}
+func postRegisterJoinRooms(cfg *config.UserAPI, acc *api.Account, rsAPI rsapi.UserRoomserverAPI) {
+ // POST register behaviour: check if the user is a normal user.
+ // If the user is a normal user, add user to room specified in the configuration "auto_join_rooms".
+ if acc.AccountType != api.AccountTypeAppService && acc.AppServiceID == "" {
+ for room := range cfg.AutoJoinRooms {
+ userID := userutil.MakeUserID(acc.Localpart, cfg.Matrix.ServerName)
+ err := addUserToRoom(context.Background(), rsAPI, cfg.AutoJoinRooms[room], acc.Localpart, userID)
+ if err != nil {
+ logrus.WithFields(logrus.Fields{
+ "user_id": userID,
+ "room": cfg.AutoJoinRooms[room],
+ }).WithError(err).Errorf("user failed to auto-join room")
+ }
+ }
+ }
+}
+
+// Add user to a room. This function currently working for auto_join_rooms config,
+// which can add a newly registered user to a specified room.
+func addUserToRoom(
+ ctx context.Context,
+ rsAPI rsapi.UserRoomserverAPI,
+ roomID string,
+ username string,
+ userID string,
+) error {
+ addGroupContent := make(map[string]interface{})
+ // This make sure the user's username can be displayed correctly.
+ // Because the newly-registered user doesn't have an avatar, the avatar_url is not needed.
+ addGroupContent["displayname"] = username
+ joinReq := rsapi.PerformJoinRequest{
+ RoomIDOrAlias: roomID,
+ UserID: userID,
+ Content: addGroupContent,
+ }
+ joinRes := rsapi.PerformJoinResponse{}
+ return rsAPI.PerformJoin(ctx, &joinReq, &joinRes)
+}
+
func (a *UserInternalAPI) PerformAccountCreation(ctx context.Context, req *api.PerformAccountCreationRequest, res *api.PerformAccountCreationResponse) error {
acc, err := a.DB.CreateAccount(ctx, req.Localpart, req.Password, req.AppServiceID, req.AccountType)
if err != nil {
@@ -174,6 +214,8 @@ func (a *UserInternalAPI) PerformAccountCreation(ctx context.Context, req *api.P
return err
}
+ postRegisterJoinRooms(a.Cfg, acc, a.RSAPI)
+
res.AccountCreated = true
res.Account = acc
return nil
diff --git a/userapi/userapi.go b/userapi/userapi.go
index d26b4e19..c077248e 100644
--- a/userapi/userapi.go
+++ b/userapi/userapi.go
@@ -82,6 +82,7 @@ func NewInternalAPI(
RSAPI: rsAPI,
DisableTLSValidation: cfg.PushGatewayDisableTLSValidation,
PgClient: pgClient,
+ Cfg: cfg,
}
receiptConsumer := consumers.NewOutputReceiptEventConsumer(