Make code scanning happier (#31243)

* Make code scanning happier

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Add tests

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Discard changes to src/components/views/auth/CaptchaForm.tsx

---------

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
Michael Telatynski 2025-12-04 15:38:18 +00:00 committed by GitHub
parent bfc2c884bc
commit f84e2815d0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 46 additions and 27 deletions

View File

@ -7,16 +7,9 @@ Please see LICENSE files in the repository root for full details.
*/
import React, { type JSX } from "react";
import {
EventType,
type RoomMember,
type RoomState,
RoomStateEvent,
type Room,
type IContent,
} from "matrix-js-sdk/src/matrix";
import { EventType, type RoomMember, type RoomState, RoomStateEvent, type Room } from "matrix-js-sdk/src/matrix";
import { logger } from "matrix-js-sdk/src/logger";
import { throttle, get } from "lodash";
import { throttle, get, set } from "lodash";
import { KnownMembership, type RoomPowerLevelsEventContent } from "matrix-js-sdk/src/types";
import { _t, _td, type TranslationKey } from "../../../../../languageHandler";
@ -137,6 +130,8 @@ interface RolesRoomSettingsTabState {
isReady: boolean;
}
const EVENTS_LEVEL_PREFIX = "event_levels_";
export default class RolesRoomSettingsTab extends React.Component<IProps, RolesRoomSettingsTabState> {
public static contextType = MatrixClientContext;
declare public context: React.ContextType<typeof MatrixClientContext>;
@ -199,24 +194,10 @@ export default class RolesRoomSettingsTab extends React.Component<IProps, RolesR
// Clone the power levels just in case
plContent = Object.assign({}, plContent);
const eventsLevelPrefix = "event_levels_";
if (powerLevelKey.startsWith(eventsLevelPrefix)) {
// deep copy "events" object, Object.assign itself won't deep copy
plContent["events"] = Object.assign({}, plContent["events"] || {});
plContent["events"][powerLevelKey.slice(eventsLevelPrefix.length)] = value;
if (powerLevelKey.startsWith(EVENTS_LEVEL_PREFIX)) {
set(plContent, ["events", powerLevelKey.slice(EVENTS_LEVEL_PREFIX.length)], value);
} else {
const keyPath = powerLevelKey.split(".");
let parentObj: IContent = {};
let currentObj: IContent = plContent;
for (const key of keyPath) {
if (!currentObj[key]) {
currentObj[key] = {};
}
parentObj = currentObj;
currentObj = currentObj[key];
}
parentObj[keyPath[keyPath.length - 1]] = value;
set(plContent, powerLevelKey.split("."), value);
}
try {
@ -462,7 +443,7 @@ export default class RolesRoomSettingsTab extends React.Component<IProps, RolesR
value={eventsLevels[eventType]}
usersDefault={defaultUserLevel}
disabled={!canChangeLevels || currentUserLevel < eventsLevels[eventType]}
powerLevelKey={"event_levels_" + eventType}
powerLevelKey={EVENTS_LEVEL_PREFIX + eventType}
onChange={this.onPowerLevelsChanged}
/>
</div>

View File

@ -247,4 +247,42 @@ describe("RolesRoomSettingsTab", () => {
deferred.reject("Error");
await waitFor(() => expect(selector).toHaveValue("100"));
});
it("should allow changing events power levels", async () => {
mocked(cli.sendStateEvent).mockResolvedValue({ event_id: "$eventId" });
mocked(cli.getRoom).mockReturnValue(room);
mocked(room.currentState.mayClientSendStateEvent).mockReturnValue(true);
const { container } = await renderTab();
const selector = container.querySelector(`[placeholder="Change topic"]`)!;
fireEvent.change(selector, { target: { value: "0" } });
expect(cli.sendStateEvent).toHaveBeenCalledWith(
room.roomId,
"m.room.power_levels",
expect.objectContaining({
events: expect.objectContaining({
"m.room.topic": 0,
}),
}),
);
});
it("should allow changing top level power levels", async () => {
mocked(cli.sendStateEvent).mockResolvedValue({ event_id: "$eventId" });
mocked(cli.getRoom).mockReturnValue(room);
mocked(room.currentState.mayClientSendStateEvent).mockReturnValue(true);
const { container } = await renderTab();
const selector = container.querySelector(`[placeholder="Remove users"]`)!;
fireEvent.change(selector, { target: { value: "0" } });
expect(cli.sendStateEvent).toHaveBeenCalledWith(
room.roomId,
"m.room.power_levels",
expect.objectContaining({
kick: 0,
}),
);
});
});