RemoveRoomAlias implements alias.RoomserverInternalAPI
( ctx context.Context, request *api.RemoveRoomAliasRequest, response *api.RemoveRoomAliasResponse, )
| 133 | |
| 134 | // RemoveRoomAlias implements alias.RoomserverInternalAPI |
| 135 | func (r *RoomserverInternalAPI) RemoveRoomAlias( |
| 136 | ctx context.Context, |
| 137 | request *api.RemoveRoomAliasRequest, |
| 138 | response *api.RemoveRoomAliasResponse, |
| 139 | ) error { |
| 140 | roomID, err := r.DB.GetRoomIDForAlias(ctx, request.Alias) |
| 141 | if err != nil { |
| 142 | return fmt.Errorf("r.DB.GetRoomIDForAlias: %w", err) |
| 143 | } |
| 144 | if roomID == "" { |
| 145 | response.Found = false |
| 146 | response.Removed = false |
| 147 | return nil |
| 148 | } |
| 149 | |
| 150 | response.Found = true |
| 151 | creatorID, err := r.DB.GetCreatorIDForAlias(ctx, request.Alias) |
| 152 | if err != nil { |
| 153 | return fmt.Errorf("r.DB.GetCreatorIDForAlias: %w", err) |
| 154 | } |
| 155 | |
| 156 | if creatorID != request.UserID { |
| 157 | var plEvent *gomatrixserverlib.HeaderedEvent |
| 158 | var pls *gomatrixserverlib.PowerLevelContent |
| 159 | |
| 160 | plEvent, err = r.DB.GetStateEvent(ctx, roomID, gomatrixserverlib.MRoomPowerLevels, "") |
| 161 | if err != nil { |
| 162 | return fmt.Errorf("r.DB.GetStateEvent: %w", err) |
| 163 | } |
| 164 | |
| 165 | pls, err = plEvent.PowerLevels() |
| 166 | if err != nil { |
| 167 | return fmt.Errorf("plEvent.PowerLevels: %w", err) |
| 168 | } |
| 169 | |
| 170 | if pls.UserLevel(request.UserID) < pls.EventLevel(gomatrixserverlib.MRoomCanonicalAlias, true) { |
| 171 | response.Removed = false |
| 172 | return nil |
| 173 | } |
| 174 | } |
| 175 | |
| 176 | ev, err := r.DB.GetStateEvent(ctx, roomID, gomatrixserverlib.MRoomCanonicalAlias, "") |
| 177 | if err != nil && err != sql.ErrNoRows { |
| 178 | return err |
| 179 | } else if ev != nil { |
| 180 | stateAlias := gjson.GetBytes(ev.Content(), "alias").Str |
| 181 | // the alias to remove is currently set as the canonical alias, remove it |
| 182 | if stateAlias == request.Alias { |
| 183 | res, err := sjson.DeleteBytes(ev.Content(), "alias") |
| 184 | if err != nil { |
| 185 | return err |
| 186 | } |
| 187 | |
| 188 | sender := request.UserID |
| 189 | if request.UserID != ev.Sender() { |
| 190 | sender = ev.Sender() |
| 191 | } |
| 192 |
nothing calls this directly
no test coverage detected