Set canonical alias on room creation (#1042)
parent
773d5bb9f9
commit
f4f032381b
|
@ -213,6 +213,25 @@ func createRoom(
|
||||||
return jsonerror.InternalServerError()
|
return jsonerror.InternalServerError()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var roomAlias string
|
||||||
|
if r.RoomAliasName != "" {
|
||||||
|
roomAlias = fmt.Sprintf("#%s:%s", r.RoomAliasName, cfg.Matrix.ServerName)
|
||||||
|
// check it's free TODO: This races but is better than nothing
|
||||||
|
hasAliasReq := roomserverAPI.GetRoomIDForAliasRequest{
|
||||||
|
Alias: roomAlias,
|
||||||
|
}
|
||||||
|
|
||||||
|
var aliasResp roomserverAPI.GetRoomIDForAliasResponse
|
||||||
|
err = rsAPI.GetRoomIDForAlias(req.Context(), &hasAliasReq, &aliasResp)
|
||||||
|
if err != nil {
|
||||||
|
util.GetLogger(req.Context()).WithError(err).Error("aliasAPI.GetRoomIDForAlias failed")
|
||||||
|
return jsonerror.InternalServerError()
|
||||||
|
}
|
||||||
|
if aliasResp.RoomID != "" {
|
||||||
|
return util.MessageResponse(400, "Alias already exists")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
membershipContent := gomatrixserverlib.MemberContent{
|
membershipContent := gomatrixserverlib.MemberContent{
|
||||||
Membership: gomatrixserverlib.Join,
|
Membership: gomatrixserverlib.Join,
|
||||||
DisplayName: profile.DisplayName,
|
DisplayName: profile.DisplayName,
|
||||||
|
@ -244,9 +263,9 @@ func createRoom(
|
||||||
// 1- m.room.create
|
// 1- m.room.create
|
||||||
// 2- room creator join member
|
// 2- room creator join member
|
||||||
// 3- m.room.power_levels
|
// 3- m.room.power_levels
|
||||||
// 4- m.room.canonical_alias (opt) TODO
|
// 4- m.room.join_rules
|
||||||
// 5- m.room.join_rules
|
// 5- m.room.history_visibility
|
||||||
// 6- m.room.history_visibility
|
// 6- m.room.canonical_alias (opt)
|
||||||
// 7- m.room.guest_access (opt)
|
// 7- m.room.guest_access (opt)
|
||||||
// 8- other initial state items
|
// 8- other initial state items
|
||||||
// 9- m.room.name (opt)
|
// 9- m.room.name (opt)
|
||||||
|
@ -262,10 +281,15 @@ func createRoom(
|
||||||
{"m.room.create", "", r.CreationContent},
|
{"m.room.create", "", r.CreationContent},
|
||||||
{"m.room.member", userID, membershipContent},
|
{"m.room.member", userID, membershipContent},
|
||||||
{"m.room.power_levels", "", common.InitialPowerLevelsContent(userID)},
|
{"m.room.power_levels", "", common.InitialPowerLevelsContent(userID)},
|
||||||
// TODO: m.room.canonical_alias
|
|
||||||
{"m.room.join_rules", "", gomatrixserverlib.JoinRuleContent{JoinRule: joinRules}},
|
{"m.room.join_rules", "", gomatrixserverlib.JoinRuleContent{JoinRule: joinRules}},
|
||||||
{"m.room.history_visibility", "", common.HistoryVisibilityContent{HistoryVisibility: historyVisibility}},
|
{"m.room.history_visibility", "", common.HistoryVisibilityContent{HistoryVisibility: historyVisibility}},
|
||||||
}
|
}
|
||||||
|
if roomAlias != "" {
|
||||||
|
// TODO: bit of a chicken and egg problem here as the alias doesn't exist and cannot until we have made the room.
|
||||||
|
// This means we might fail creating the alias but say the canonical alias is something that doesn't exist.
|
||||||
|
// m.room.aliases is handled when we call roomserver.SetRoomAlias
|
||||||
|
eventsToMake = append(eventsToMake, fledglingEvent{"m.room.canonical_alias", "", common.CanonicalAlias{Alias: roomAlias}})
|
||||||
|
}
|
||||||
if r.GuestCanJoin {
|
if r.GuestCanJoin {
|
||||||
eventsToMake = append(eventsToMake, fledglingEvent{"m.room.guest_access", "", common.GuestAccessContent{GuestAccess: "can_join"}})
|
eventsToMake = append(eventsToMake, fledglingEvent{"m.room.guest_access", "", common.GuestAccessContent{GuestAccess: "can_join"}})
|
||||||
}
|
}
|
||||||
|
@ -278,7 +302,6 @@ func createRoom(
|
||||||
}
|
}
|
||||||
// TODO: invite events
|
// TODO: invite events
|
||||||
// TODO: 3pid invite events
|
// TODO: 3pid invite events
|
||||||
// TODO: m.room.aliases
|
|
||||||
|
|
||||||
authEvents := gomatrixserverlib.NewAuthEvents(nil)
|
authEvents := gomatrixserverlib.NewAuthEvents(nil)
|
||||||
for i, e := range eventsToMake {
|
for i, e := range eventsToMake {
|
||||||
|
@ -330,10 +353,7 @@ func createRoom(
|
||||||
// TODO(#269): Reserve room alias while we create the room. This stops us
|
// TODO(#269): Reserve room alias while we create the room. This stops us
|
||||||
// from creating the room but still failing due to the alias having already
|
// from creating the room but still failing due to the alias having already
|
||||||
// been taken.
|
// been taken.
|
||||||
var roomAlias string
|
if roomAlias != "" {
|
||||||
if r.RoomAliasName != "" {
|
|
||||||
roomAlias = fmt.Sprintf("#%s:%s", r.RoomAliasName, cfg.Matrix.ServerName)
|
|
||||||
|
|
||||||
aliasReq := roomserverAPI.SetRoomAliasRequest{
|
aliasReq := roomserverAPI.SetRoomAliasRequest{
|
||||||
Alias: roomAlias,
|
Alias: roomAlias,
|
||||||
RoomID: roomID,
|
RoomID: roomID,
|
||||||
|
|
|
@ -36,6 +36,11 @@ type HistoryVisibilityContent struct {
|
||||||
HistoryVisibility string `json:"history_visibility"`
|
HistoryVisibility string `json:"history_visibility"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CanonicalAlias is the event content for https://matrix.org/docs/spec/client_server/r0.6.0#m-room-canonical-alias
|
||||||
|
type CanonicalAlias struct {
|
||||||
|
Alias string `json:"alias"`
|
||||||
|
}
|
||||||
|
|
||||||
// InitialPowerLevelsContent returns the initial values for m.room.power_levels on room creation
|
// InitialPowerLevelsContent returns the initial values for m.room.power_levels on room creation
|
||||||
// if they have not been specified.
|
// if they have not been specified.
|
||||||
// http://matrix.org/docs/spec/client_server/r0.2.0.html#m-room-power-levels
|
// http://matrix.org/docs/spec/client_server/r0.2.0.html#m-room-power-levels
|
||||||
|
|
Loading…
Reference in New Issue