Skip to content

Commit 85489e2

Browse files
authored
Check userID for nil to prevent panic (#426)
1 parent e97395e commit 85489e2

File tree

3 files changed

+101
-1
lines changed

3 files changed

+101
-1
lines changed

eventauth.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ func (a *allowerContext) powerLevelsEventAllowed(event PDU) error {
526526
if err != nil {
527527
return err
528528
}
529-
if !isValidUserID(sender.String()) {
529+
if sender == nil || !isValidUserID(sender.String()) {
530530
return errorf("Not a valid user ID: %q", senderID)
531531
}
532532
}

eventauth_test.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"testing"
2121

2222
"github.com/matrix-org/gomatrixserverlib/spec"
23+
"github.com/stretchr/testify/assert"
2324
)
2425

2526
func stateNeededEquals(a, b StateNeeded) bool {
@@ -1116,6 +1117,101 @@ func TestDemoteUserDefaultPowerLevelBelowOwn(t *testing.T) {
11161117
}
11171118
}
11181119

1120+
func NilUserIDForBadSenderTest(roomID spec.RoomID, senderID spec.SenderID) (*spec.UserID, error) {
1121+
if senderID == "@baduser" {
1122+
return nil, nil
1123+
}
1124+
1125+
return spec.NewUserID(string(senderID), true)
1126+
}
1127+
1128+
var nilPowerLevelTestRoom = &testAuthEvents{
1129+
CreateJSON: json.RawMessage(`{
1130+
"type": "m.room.create",
1131+
"state_key": "",
1132+
"sender": "@baduser",
1133+
"room_id": "!r1:a",
1134+
"event_id": "$e1:a",
1135+
"content": {
1136+
"room_version": "1"
1137+
}
1138+
}`),
1139+
PowerLevelsJSON: json.RawMessage(`{
1140+
"type": "m.room.power_levels",
1141+
"state_key": "",
1142+
"sender": "@u1:a",
1143+
"room_id": "!r1:a",
1144+
"event_id": "$e3:a",
1145+
"content": {
1146+
"users_default": 100,
1147+
"users": {
1148+
"@u1:a": 100
1149+
},
1150+
"redact": 100
1151+
}
1152+
}`),
1153+
MemberJSON: map[string]json.RawMessage{
1154+
"@u1:a": json.RawMessage(`{
1155+
"type": "m.room.member",
1156+
"state_key": "@u1:a",
1157+
"sender": "@u1:a",
1158+
"room_id": "!r1:a",
1159+
"event_id": "$e2:a",
1160+
"content": {
1161+
"membership": "join"
1162+
}
1163+
}`),
1164+
},
1165+
}
1166+
1167+
func TestPowerLevelCheckShouldNotPanic(t *testing.T) {
1168+
powerChangeBadUser, err := MustGetRoomVersion(RoomVersionV1).NewEventFromTrustedJSON(spec.RawJSON(`{
1169+
"type": "m.room.power_levels",
1170+
"state_key": "",
1171+
"sender": "@u1:a",
1172+
"room_id": "!r1:a",
1173+
"event_id": "$e5:a",
1174+
"content": {
1175+
"users_default": 50,
1176+
"users": {
1177+
"@baduser": 0
1178+
},
1179+
"redact": 100
1180+
}
1181+
}`), false)
1182+
if err != nil {
1183+
t.Fatal(err)
1184+
}
1185+
assert.NotPanics(t, func() {
1186+
if err := Allowed(powerChangeBadUser, powerLevelTestRoom, NilUserIDForBadSenderTest); err == nil {
1187+
panic("Event should not be allowed")
1188+
}
1189+
}, "")
1190+
1191+
powerChange, err := MustGetRoomVersion(RoomVersionV1).NewEventFromTrustedJSON(spec.RawJSON(`{
1192+
"type": "m.room.power_levels",
1193+
"state_key": "",
1194+
"sender": "@u1:a",
1195+
"room_id": "!r1:a",
1196+
"event_id": "$e5:a",
1197+
"content": {
1198+
"users_default": 50,
1199+
"users": {
1200+
"@u1:a": 0
1201+
},
1202+
"redact": 100
1203+
}
1204+
}`), false)
1205+
if err != nil {
1206+
t.Fatal(err)
1207+
}
1208+
assert.NotPanics(t, func() {
1209+
if err := Allowed(powerChange, nilPowerLevelTestRoom, NilUserIDForBadSenderTest); err == nil {
1210+
panic("Event should not be allowed")
1211+
}
1212+
}, "")
1213+
}
1214+
11191215
func TestPromoteUserDefaultLevelAboveOwn(t *testing.T) {
11201216
// User shouldn't be able to promote the user default
11211217
// level above their own effective level.

eventcontent.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ func NewCreateContentFromAuthEvents(authEvents AuthEventProvider, userIDForSende
7676
err = errorf("invalid sender userID: %s", err.Error())
7777
return
7878
}
79+
if sender == nil {
80+
err = errorf("userID not found for sender: %s in room %s", createEvent.SenderID(), createEvent.RoomID().String())
81+
return
82+
}
7983
c.senderDomain = string(sender.Domain())
8084
return
8185
}

0 commit comments

Comments
 (0)