@@ -1019,7 +1019,10 @@ func (m *membershipAllower) membershipAllowedSelf() error { // nolint: gocyclo
10191019 }
10201020 if m .newMember .Membership == Knock {
10211021 if m .joinRule .JoinRule != Knock {
1022- return m .membershipFailed ()
1022+ return errorf (
1023+ "%q is not allowed to change their membership from %q to %q as the join rule %q does not allow knocking" ,
1024+ m .targetID , m .oldMember .Membership , m .newMember .Membership , m .joinRule .JoinRule ,
1025+ )
10231026 }
10241027 // A user that is not in the room is allowed to knock if the join
10251028 // rules are "knock" and they are not already joined to, invited to
@@ -1028,13 +1031,19 @@ func (m *membershipAllower) membershipAllowedSelf() error { // nolint: gocyclo
10281031 if supported , err := m .roomVersion .AllowKnockingInEventAuth (); err != nil {
10291032 return fmt .Errorf ("m.roomVersion.AllowKnockingInEventAuth: %w" , err )
10301033 } else if ! supported {
1031- return m .membershipFailed ()
1034+ return errorf (
1035+ "%q is not allowed to change their membership from %q to %q as room version %q does not support knocking" ,
1036+ m .targetID , m .oldMember .Membership , m .newMember .Membership , m .roomVersion ,
1037+ )
10321038 }
10331039 switch m .oldMember .Membership {
10341040 case Join , Invite , Ban :
10351041 // The user is already joined, invited or banned, therefore they
10361042 // can't knock.
1037- return m .membershipFailed ()
1043+ return errorf (
1044+ "%q is not allowed to change their membership from %q to %q as they are already joined/invited/banned" ,
1045+ m .targetID , m .oldMember .Membership , m .newMember .Membership ,
1046+ )
10381047 default :
10391048 // A non-joined, non-invited, non-banned user is allowed to knock.
10401049 return nil
@@ -1122,11 +1131,20 @@ func (m *membershipAllower) membershipAllowedOther() error { // nolint: gocyclo
11221131 return nil
11231132 }
11241133 // A user can invite in response to a knock.
1125- if m .joinRule .JoinRule == Knock && m .oldMember .Membership == Knock && senderLevel >= m .powerLevels .Invite {
1134+ if m .oldMember .Membership == Knock && senderLevel >= m .powerLevels .Invite {
1135+ if m .joinRule .JoinRule != Knock {
1136+ return errorf (
1137+ "%q is not allowed to change the membership of %q from %q to %q as the join rule %q does not allow knocking" ,
1138+ m .senderID , m .targetID , m .oldMember .Membership , m .newMember .Membership , m .joinRule .JoinRule ,
1139+ )
1140+ }
11261141 if supported , err := m .roomVersion .AllowKnockingInEventAuth (); err != nil {
11271142 return fmt .Errorf ("m.roomVersion.AllowKnockingInEventAuth: %w" , err )
11281143 } else if ! supported {
1129- return m .membershipFailed ()
1144+ return errorf (
1145+ "%q is not allowed to change the membership of %q from %q to %q as room version %q does not support knocking" ,
1146+ m .senderID , m .targetID , m .oldMember .Membership , m .newMember .Membership , m .roomVersion ,
1147+ )
11301148 }
11311149 return nil
11321150 }
0 commit comments