aboutsummaryrefslogtreecommitdiff
path: root/clientapi/routing
diff options
context:
space:
mode:
authorSam Wedgwood <28223854+swedgwood@users.noreply.github.com>2023-08-15 12:37:04 +0100
committerGitHub <noreply@github.com>2023-08-15 12:37:04 +0100
commit9a12420428f1832c76fc0c84ad85db200e261ecb (patch)
tree38ce262c515d74865920f6ebaf336f1887dee11b /clientapi/routing
parentfa6c7ba45671c8fbf13cb7ba456355a04941b535 (diff)
[pseudoID] More pseudo ID fixes (#3167)
Signed-off-by: `Sam Wedgwood <sam@wedgwood.dev>`
Diffstat (limited to 'clientapi/routing')
-rw-r--r--clientapi/routing/joined_rooms.go31
-rw-r--r--clientapi/routing/profile.go21
-rw-r--r--clientapi/routing/sendevent.go13
-rw-r--r--clientapi/routing/server_notices.go42
4 files changed, 72 insertions, 35 deletions
diff --git a/clientapi/routing/joined_rooms.go b/clientapi/routing/joined_rooms.go
index f664183f..3fe0d8b4 100644
--- a/clientapi/routing/joined_rooms.go
+++ b/clientapi/routing/joined_rooms.go
@@ -33,23 +33,36 @@ func GetJoinedRooms(
device *userapi.Device,
rsAPI api.ClientRoomserverAPI,
) util.JSONResponse {
- var res api.QueryRoomsForUserResponse
- err := rsAPI.QueryRoomsForUser(req.Context(), &api.QueryRoomsForUserRequest{
- UserID: device.UserID,
- WantMembership: "join",
- }, &res)
+ deviceUserID, err := spec.NewUserID(device.UserID, true)
+ if err != nil {
+ util.GetLogger(req.Context()).WithError(err).Error("Invalid device user ID")
+ return util.JSONResponse{
+ Code: http.StatusInternalServerError,
+ JSON: spec.Unknown("internal server error"),
+ }
+ }
+
+ rooms, err := rsAPI.QueryRoomsForUser(req.Context(), *deviceUserID, "join")
if err != nil {
util.GetLogger(req.Context()).WithError(err).Error("QueryRoomsForUser failed")
return util.JSONResponse{
Code: http.StatusInternalServerError,
- JSON: spec.InternalServerError{},
+ JSON: spec.Unknown("internal server error"),
}
}
- if res.RoomIDs == nil {
- res.RoomIDs = []string{}
+
+ var roomIDStrs []string
+ if rooms == nil {
+ roomIDStrs = []string{}
+ } else {
+ roomIDStrs = make([]string, len(rooms))
+ for i, roomID := range rooms {
+ roomIDStrs[i] = roomID.String()
+ }
}
+
return util.JSONResponse{
Code: http.StatusOK,
- JSON: getJoinedRoomsResponse{res.RoomIDs},
+ JSON: getJoinedRoomsResponse{roomIDStrs},
}
}
diff --git a/clientapi/routing/profile.go b/clientapi/routing/profile.go
index 66b58507..564cd588 100644
--- a/clientapi/routing/profile.go
+++ b/clientapi/routing/profile.go
@@ -251,11 +251,15 @@ func updateProfile(
profile *authtypes.Profile,
userID string, evTime time.Time,
) (util.JSONResponse, error) {
- var res api.QueryRoomsForUserResponse
- err := rsAPI.QueryRoomsForUser(ctx, &api.QueryRoomsForUserRequest{
- UserID: device.UserID,
- WantMembership: "join",
- }, &res)
+ deviceUserID, err := spec.NewUserID(device.UserID, true)
+ if err != nil {
+ return util.JSONResponse{
+ Code: http.StatusInternalServerError,
+ JSON: spec.Unknown("internal server error"),
+ }, err
+ }
+
+ rooms, err := rsAPI.QueryRoomsForUser(ctx, *deviceUserID, "join")
if err != nil {
util.GetLogger(ctx).WithError(err).Error("QueryRoomsForUser failed")
return util.JSONResponse{
@@ -264,6 +268,11 @@ func updateProfile(
}, err
}
+ roomIDStrs := make([]string, len(rooms))
+ for i, room := range rooms {
+ roomIDStrs[i] = room.String()
+ }
+
_, domain, err := gomatrixserverlib.SplitID('@', userID)
if err != nil {
util.GetLogger(ctx).WithError(err).Error("gomatrixserverlib.SplitID failed")
@@ -274,7 +283,7 @@ func updateProfile(
}
events, err := buildMembershipEvents(
- ctx, res.RoomIDs, *profile, userID, evTime, rsAPI,
+ ctx, roomIDStrs, *profile, userID, evTime, rsAPI,
)
switch e := err.(type) {
case nil:
diff --git a/clientapi/routing/sendevent.go b/clientapi/routing/sendevent.go
index 17200171..a167a5a7 100644
--- a/clientapi/routing/sendevent.go
+++ b/clientapi/routing/sendevent.go
@@ -316,10 +316,17 @@ func generateSendEvent(
}
}
senderID, err := rsAPI.QuerySenderIDForUser(ctx, *validRoomID, *fullUserID)
- if err != nil || senderID == nil {
+ if err != nil {
return nil, &util.JSONResponse{
- Code: http.StatusNotFound,
- JSON: spec.NotFound("Unable to find senderID for user"),
+ Code: http.StatusInternalServerError,
+ JSON: spec.NotFound("internal server error"),
+ }
+ } else if senderID == nil {
+ // TODO: is it always the case that lack of a sender ID means they're not joined?
+ // And should this logic be deferred to the roomserver somehow?
+ return nil, &util.JSONResponse{
+ Code: http.StatusForbidden,
+ JSON: spec.Forbidden("not joined to room"),
}
}
diff --git a/clientapi/routing/server_notices.go b/clientapi/routing/server_notices.go
index 1c5d693c..5deb559d 100644
--- a/clientapi/routing/server_notices.go
+++ b/clientapi/routing/server_notices.go
@@ -94,34 +94,42 @@ func SendServerNotice(
}
}
+ userID, err := spec.NewUserID(r.UserID, true)
+ if err != nil {
+ return util.JSONResponse{
+ Code: http.StatusBadRequest,
+ JSON: spec.InvalidParam("invalid user ID"),
+ }
+ }
+
// get rooms for specified user
- allUserRooms := []string{}
- userRooms := api.QueryRoomsForUserResponse{}
+ allUserRooms := []spec.RoomID{}
// Get rooms the user is either joined, invited or has left.
for _, membership := range []string{"join", "invite", "leave"} {
- if err := rsAPI.QueryRoomsForUser(ctx, &api.QueryRoomsForUserRequest{
- UserID: r.UserID,
- WantMembership: membership,
- }, &userRooms); err != nil {
+ userRooms, queryErr := rsAPI.QueryRoomsForUser(ctx, *userID, membership)
+ if queryErr != nil {
return util.ErrorResponse(err)
}
- allUserRooms = append(allUserRooms, userRooms.RoomIDs...)
+ allUserRooms = append(allUserRooms, userRooms...)
}
// get rooms of the sender
- senderUserID := fmt.Sprintf("@%s:%s", cfgNotices.LocalPart, cfgClient.Matrix.ServerName)
- senderRooms := api.QueryRoomsForUserResponse{}
- if err := rsAPI.QueryRoomsForUser(ctx, &api.QueryRoomsForUserRequest{
- UserID: senderUserID,
- WantMembership: "join",
- }, &senderRooms); err != nil {
+ senderUserID, err := spec.NewUserID(fmt.Sprintf("@%s:%s", cfgNotices.LocalPart, cfgClient.Matrix.ServerName), true)
+ if err != nil {
+ return util.JSONResponse{
+ Code: http.StatusInternalServerError,
+ JSON: spec.Unknown("internal server error"),
+ }
+ }
+ senderRooms, err := rsAPI.QueryRoomsForUser(ctx, *senderUserID, "join")
+ if err != nil {
return util.ErrorResponse(err)
}
// check if we have rooms in common
- commonRooms := []string{}
+ commonRooms := []spec.RoomID{}
for _, userRoomID := range allUserRooms {
- for _, senderRoomID := range senderRooms.RoomIDs {
+ for _, senderRoomID := range senderRooms {
if userRoomID == senderRoomID {
commonRooms = append(commonRooms, senderRoomID)
}
@@ -139,7 +147,7 @@ func SendServerNotice(
// create a new room for the user
if len(commonRooms) == 0 {
- powerLevelContent := eventutil.InitialPowerLevelsContent(senderUserID)
+ powerLevelContent := eventutil.InitialPowerLevelsContent(senderUserID.String())
powerLevelContent.Users[r.UserID] = -10 // taken from Synapse
pl, err := json.Marshal(powerLevelContent)
if err != nil {
@@ -195,7 +203,7 @@ func SendServerNotice(
}
}
- roomID = commonRooms[0]
+ roomID = commonRooms[0].String()
membershipRes := api.QueryMembershipForUserResponse{}
err = rsAPI.QueryMembershipForUser(ctx, &api.QueryMembershipForUserRequest{UserID: *deviceUserID, RoomID: roomID}, &membershipRes)
if err != nil {