aboutsummaryrefslogtreecommitdiff
path: root/syncapi/routing/getevent.go
diff options
context:
space:
mode:
Diffstat (limited to 'syncapi/routing/getevent.go')
-rw-r--r--syncapi/routing/getevent.go43
1 files changed, 28 insertions, 15 deletions
diff --git a/syncapi/routing/getevent.go b/syncapi/routing/getevent.go
index 09c2aef0..4fa282f3 100644
--- a/syncapi/routing/getevent.go
+++ b/syncapi/routing/getevent.go
@@ -37,7 +37,7 @@ import (
func GetEvent(
req *http.Request,
device *userapi.Device,
- roomID string,
+ rawRoomID string,
eventID string,
cfg *config.SyncAPI,
syncDB storage.Database,
@@ -47,7 +47,7 @@ func GetEvent(
db, err := syncDB.NewDatabaseTransaction(ctx)
logger := util.GetLogger(ctx).WithFields(logrus.Fields{
"event_id": eventID,
- "room_id": roomID,
+ "room_id": rawRoomID,
})
if err != nil {
logger.WithError(err).Error("GetEvent: syncDB.NewDatabaseTransaction failed")
@@ -57,6 +57,14 @@ func GetEvent(
}
}
+ roomID, err := spec.NewRoomID(rawRoomID)
+ if err != nil {
+ return util.JSONResponse{
+ Code: http.StatusBadRequest,
+ JSON: spec.InvalidParam("invalid room ID"),
+ }
+ }
+
events, err := db.Events(ctx, []string{eventID})
if err != nil {
logger.WithError(err).Error("GetEvent: syncDB.Events failed")
@@ -76,13 +84,22 @@ func GetEvent(
}
// If the request is coming from an appservice, get the user from the request
- userID := device.UserID
+ rawUserID := device.UserID
if asUserID := req.FormValue("user_id"); device.AppserviceID != "" && asUserID != "" {
- userID = asUserID
+ rawUserID = asUserID
+ }
+
+ userID, err := spec.NewUserID(rawUserID, true)
+ if err != nil {
+ util.GetLogger(req.Context()).WithError(err).Error("invalid device.UserID")
+ return util.JSONResponse{
+ Code: http.StatusInternalServerError,
+ JSON: spec.Unknown("internal server error"),
+ }
}
// Apply history visibility to determine if the user is allowed to view the event
- events, err = internal.ApplyHistoryVisibilityFilter(ctx, db, rsAPI, events, nil, userID, "event")
+ events, err = internal.ApplyHistoryVisibilityFilter(ctx, db, rsAPI, events, nil, *userID, "event")
if err != nil {
logger.WithError(err).Error("GetEvent: internal.ApplyHistoryVisibilityFilter failed")
return util.JSONResponse{
@@ -101,18 +118,14 @@ func GetEvent(
}
}
- sender := spec.UserID{}
- validRoomID, err := spec.NewRoomID(roomID)
- if err != nil {
+ senderUserID, err := rsAPI.QueryUserIDForSender(req.Context(), *roomID, events[0].SenderID())
+ if err != nil || senderUserID == nil {
+ util.GetLogger(req.Context()).WithError(err).WithField("senderID", events[0].SenderID()).WithField("roomID", *roomID).Error("QueryUserIDForSender errored or returned nil-user ID when user should be part of a room")
return util.JSONResponse{
- Code: http.StatusBadRequest,
- JSON: spec.BadJSON("roomID is invalid"),
+ Code: http.StatusInternalServerError,
+ JSON: spec.Unknown("internal server error"),
}
}
- senderUserID, err := rsAPI.QueryUserIDForSender(req.Context(), *validRoomID, events[0].SenderID())
- if err == nil && senderUserID != nil {
- sender = *senderUserID
- }
sk := events[0].StateKey()
if sk != nil && *sk != "" {
@@ -131,6 +144,6 @@ func GetEvent(
}
return util.JSONResponse{
Code: http.StatusOK,
- JSON: synctypes.ToClientEvent(events[0], synctypes.FormatAll, sender, sk),
+ JSON: synctypes.ToClientEvent(events[0], synctypes.FormatAll, *senderUserID, sk),
}
}