Skip to content

Commit b70847e

Browse files
authored
Unmarshal onto partial membershipContent (#428)
This fixes cases where we e.g. receive valid events, but are unable to unmarshal onto `MembershipContent` because of an invalid `displayname` (which we don't care about when authing events): ``` json: cannot unmarshal bool into Go struct field MemberContent.displayname of type string" ```
1 parent 140f4d2 commit b70847e

File tree

3 files changed

+59
-1
lines changed

3 files changed

+59
-1
lines changed

Diff for: eventauth.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ type membershipContent struct {
112112
// The user that authorised the join, in the case that the restricted join
113113
// rule is in effect.
114114
AuthorizedVia string `json:"join_authorised_via_users_server,omitempty"`
115+
116+
// The MXIDMapping used in pseudo ID rooms
117+
MXIDMapping *MXIDMapping `json:"mxid_mapping,omitempty"`
115118
}
116119

117120
// StateNeededForProtoEvent returns the event types and state_keys needed to authenticate the
@@ -983,7 +986,7 @@ func (m *membershipAllower) membershipAllowed(event PDU) error { // nolint: gocy
983986
var sender *spec.UserID
984987
var err error
985988
if event.Type() == spec.MRoomMember {
986-
mapping := MemberContent{}
989+
mapping := membershipContent{}
987990
if err := json.Unmarshal(event.Content(), &mapping); err != nil {
988991
return err
989992
}

Diff for: eventauth_test.go

+54
Original file line numberDiff line numberDiff line change
@@ -1539,3 +1539,57 @@ func Test_checkUserLevels(t *testing.T) {
15391539
})
15401540
}
15411541
}
1542+
1543+
// Test that we allow broken membership content, i.e.
1544+
// displayname is boolean, an object or array
1545+
func TestMembershipAllowed(t *testing.T) {
1546+
testEventAllowed(t, `{
1547+
"auth_events": {
1548+
"create": {
1549+
"type": "m.room.create",
1550+
"state_key": "",
1551+
"sender": "@u1:a",
1552+
"room_id": "!r1:a",
1553+
"event_id": "$e1:a",
1554+
"content": {"creator": "@u1:a"}
1555+
}
1556+
},
1557+
"allowed": [{
1558+
"type": "m.room.member",
1559+
"state_key": "@u1:a",
1560+
"sender": "@u1:a",
1561+
"room_id": "!r1:a",
1562+
"event_id": "$e2:a",
1563+
"prev_events": [["$e1:a", {}]],
1564+
"content": {"membership": "join", "displayname": false}
1565+
},
1566+
{
1567+
"type": "m.room.member",
1568+
"state_key": "@u1:a",
1569+
"sender": "@u1:a",
1570+
"room_id": "!r1:a",
1571+
"event_id": "$e2:a",
1572+
"prev_events": [["$e1:a", {}]],
1573+
"content": {"membership": "join", "displayname": {}}
1574+
},
1575+
{
1576+
"type": "m.room.member",
1577+
"state_key": "@u1:a",
1578+
"sender": "@u1:a",
1579+
"room_id": "!r1:a",
1580+
"event_id": "$e2:a",
1581+
"prev_events": [["$e1:a", {}]],
1582+
"content": {"membership": "join", "displayname": 0}
1583+
},
1584+
{
1585+
"type": "m.room.member",
1586+
"state_key": "@u1:a",
1587+
"sender": "@u1:a",
1588+
"room_id": "!r1:a",
1589+
"event_id": "$e2:a",
1590+
"prev_events": [["$e1:a", {}]],
1591+
"content": {"membership": "join", "displayname": []}
1592+
}],
1593+
"not_allowed": []
1594+
}`)
1595+
}

Diff for: eventcontent.go

+1
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ func NewMemberContentFromEvent(event PDU) (c MemberContent, err error) {
213213
c.Membership = partial.Membership
214214
c.ThirdPartyInvite = partial.ThirdPartyInvite
215215
c.AuthorisedVia = partial.AuthorizedVia
216+
c.MXIDMapping = partial.MXIDMapping
216217
}
217218
return
218219
}

0 commit comments

Comments
 (0)