@@ -98,6 +98,24 @@ sub auth_check_event
9898 return 1;
9999}
100100
101+ sub _creator_for_create_event
102+ {
103+ my ( $create_event ) = @_ ;
104+
105+ $create_event or
106+ return undef ;
107+
108+ my $room_version = $create_event -> {content }{room_version };
109+
110+ # For room version 11+, 'creator' is absent from content; creator is implicit from sender.
111+ if ( defined $room_version and $room_version =~ / \A [0-9]+\z / and $room_version >= 11 ) {
112+ return $create_event -> {sender };
113+ }
114+
115+ # For older room versions, 'creator' must be present explicitly.
116+ return $create_event -> {content }{creator };
117+ }
118+
101119sub auth_check_event_m_room_create
102120{
103121 my $self = shift ;
@@ -108,9 +126,8 @@ sub auth_check_event_m_room_create
108126 return 0;
109127
110128 # Any m.room.create event is acceptable, provided that the creator matches.
111- # For room version 11+, 'creator' is absent from content; creator is implicit from sender.
112- my $creator = $event -> {content }{creator } // $event -> {sender };
113- return $event -> {sender } eq $creator ;
129+ my $creator = _creator_for_create_event( $event );
130+ return defined ( $creator ) and $event -> {sender } eq $creator ;
114131}
115132
116133sub auth_check_event_m_room_member
@@ -131,8 +148,7 @@ sub auth_check_event_m_room_member
131148 $accepted_events , $event -> {auth_events }, " m.room.create"
132149 );
133150
134- # For room version 11+, 'creator' is absent from content; use sender instead
135- my $creator = $create_event ? ( $create_event -> {content }{creator } // $create_event -> {sender } ) : undef ;
151+ my $creator = _creator_for_create_event( $create_event );
136152 if ( $creator and $event -> {state_key } eq $creator ) {
137153 return 1;
138154 }
0 commit comments