diff --git a/eventauth.go b/eventauth.go index 0610ac0e..148a1095 100644 --- a/eventauth.go +++ b/eventauth.go @@ -112,6 +112,9 @@ type membershipContent struct { // The user that authorised the join, in the case that the restricted join // rule is in effect. AuthorizedVia string `json:"join_authorised_via_users_server,omitempty"` + + // The MXIDMapping used in pseudo ID rooms + MXIDMapping *MXIDMapping `json:"mxid_mapping,omitempty"` } // 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 var sender *spec.UserID var err error if event.Type() == spec.MRoomMember { - mapping := MemberContent{} + mapping := membershipContent{} if err := json.Unmarshal(event.Content(), &mapping); err != nil { return err } diff --git a/eventauth_test.go b/eventauth_test.go index 74463a3d..e074058f 100644 --- a/eventauth_test.go +++ b/eventauth_test.go @@ -1539,3 +1539,57 @@ func Test_checkUserLevels(t *testing.T) { }) } } + +// Test that we allow broken membership content, i.e. +// displayname is boolean, an object or array +func TestMembershipAllowed(t *testing.T) { + testEventAllowed(t, `{ + "auth_events": { + "create": { + "type": "m.room.create", + "state_key": "", + "sender": "@u1:a", + "room_id": "!r1:a", + "event_id": "$e1:a", + "content": {"creator": "@u1:a"} + } + }, + "allowed": [{ + "type": "m.room.member", + "state_key": "@u1:a", + "sender": "@u1:a", + "room_id": "!r1:a", + "event_id": "$e2:a", + "prev_events": [["$e1:a", {}]], + "content": {"membership": "join", "displayname": false} + }, + { + "type": "m.room.member", + "state_key": "@u1:a", + "sender": "@u1:a", + "room_id": "!r1:a", + "event_id": "$e2:a", + "prev_events": [["$e1:a", {}]], + "content": {"membership": "join", "displayname": {}} + }, + { + "type": "m.room.member", + "state_key": "@u1:a", + "sender": "@u1:a", + "room_id": "!r1:a", + "event_id": "$e2:a", + "prev_events": [["$e1:a", {}]], + "content": {"membership": "join", "displayname": 0} + }, + { + "type": "m.room.member", + "state_key": "@u1:a", + "sender": "@u1:a", + "room_id": "!r1:a", + "event_id": "$e2:a", + "prev_events": [["$e1:a", {}]], + "content": {"membership": "join", "displayname": []} + }], + "not_allowed": [] + }`) +} diff --git a/eventcontent.go b/eventcontent.go index 05b80bea..ac85acc0 100644 --- a/eventcontent.go +++ b/eventcontent.go @@ -213,6 +213,7 @@ func NewMemberContentFromEvent(event PDU) (c MemberContent, err error) { c.Membership = partial.Membership c.ThirdPartyInvite = partial.ThirdPartyInvite c.AuthorisedVia = partial.AuthorizedVia + c.MXIDMapping = partial.MXIDMapping } return }