diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 14c78bd7dc..e2c2a928d1 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1104,6 +1104,7 @@ module.exports = React.createClass({ SettingLevel.ROOM_DEVICE, "blacklistUnverifiedDevices", room.roomId, + /*explicit=*/true, ); room.setBlacklistUnverifiedDevices(blacklistEnabled); } diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js index ff2accf0b0..13c92cecc9 100644 --- a/src/components/views/dialogs/UnknownDeviceDialog.js +++ b/src/components/views/dialogs/UnknownDeviceDialog.js @@ -147,9 +147,12 @@ export default React.createClass({ return <Spinner />; } + // The global value is treated as a default for when rooms don't specify a value. const client = MatrixClientPeg.get(); - const blacklistUnverified = client.getGlobalBlacklistUnverifiedDevices() || - this.props.room.getBlacklistUnverifiedDevices(); + let blacklistUnverified = client.getGlobalBlacklistUnverifiedDevices(); + if (this.props.room.getBlacklistUnverifiedDevices() !== null) { + blacklistUnverified = this.props.room.getBlacklistUnverifiedDevices(); + } let warning; if (blacklistUnverified) { diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js index ad26f19af5..fa108ce6c1 100644 --- a/src/components/views/rooms/RoomSettings.js +++ b/src/components/views/rooms/RoomSettings.js @@ -369,6 +369,7 @@ module.exports = React.createClass({ SettingLevel.ROOM_DEVICE, "blacklistUnverifiedDevices", this.props.room.roomId, + /*explicit=*/true, ); this.props.room.setBlacklistUnverifiedDevices(value); }); @@ -592,21 +593,6 @@ module.exports = React.createClass({ /> ); - const deviceBlacklisting = SettingsStore.getValueAt( - SettingLevel.DEVICE, - "blacklistUnverifiedDevices", - this.props.room.roomId, - /*explicit=*/true - ); - if (deviceBlacklisting === true) { - settings = ( - <label> - <input type="checkbox" disabled={true} checked={true} /> - { SettingsStore.getDisplayName("blacklistUnverifiedDevices", SettingLevel.ROOM_DEVICE) } - </label> - ); - } - if (!isEncrypted && roomState.mayClientSendStateEvent("m.room.encryption", cli)) { return ( <div> diff --git a/src/settings/Settings.js b/src/settings/Settings.js index b432e613d3..52f85da58f 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -70,6 +70,11 @@ export const SETTINGS = { // // // Optional settings controller. See SettingsController for more information. // controller: new MySettingController(), + // + // // Optional flag to make supportedLevels be respected as the order to handle + // // settings. The first element is treated as "most preferred". The "default" + // // level is always appended to the end. + // supportedLevelsAreOrdered: false, // }, "feature_groups": { isFeature: true, @@ -197,7 +202,10 @@ export const SETTINGS = { default: 200, }, "blacklistUnverifiedDevices": { - supportedLevels: ['device', 'room-device'], + // We specifically want to have room-device > device so that users may set a device default + // with a per-room override. + supportedLevels: ['room-device', 'device'], + supportedLevelsAreOrdered: true, displayName: { "default": _td('Never send encrypted messages to unverified devices from this device'), "room-device": _td('Never send encrypted messages to unverified devices in this room from this device'), diff --git a/src/settings/SettingsStore.js b/src/settings/SettingsStore.js index db7ae807e3..b6343c4a96 100644 --- a/src/settings/SettingsStore.js +++ b/src/settings/SettingsStore.js @@ -191,14 +191,18 @@ export default class SettingsStore { * @return {*} The value, or null if not found. */ static getValueAt(level, settingName, roomId = null, explicit = false, excludeDefault = false) { - const minIndex = LEVEL_ORDER.indexOf(level); - if (minIndex === -1) throw new Error("Level " + level + " is not prioritized"); - // Verify that the setting is actually a setting if (!SETTINGS[settingName]) { throw new Error("Setting '" + settingName + "' does not appear to be a setting."); } + const setting = SETTINGS[settingName]; + const levelOrder = (setting.supportedLevelsAreOrdered ? setting.supportedLevels : LEVEL_ORDER); + if (!levelOrder.includes("default")) levelOrder.push("default"); // always include default + + const minIndex = levelOrder.indexOf(level); + if (minIndex === -1) throw new Error("Level " + level + " is not prioritized"); + if (SettingsStore.isFeature(settingName)) { const configValue = SettingsStore._getFeatureState(settingName); if (configValue === "enable") return true; @@ -215,10 +219,10 @@ export default class SettingsStore { return SettingsStore._tryControllerOverride(settingName, level, roomId, value); } - for (let i = minIndex; i < LEVEL_ORDER.length; i++) { - const handler = handlers[LEVEL_ORDER[i]]; + for (let i = minIndex; i < levelOrder.length; i++) { + const handler = handlers[levelOrder[i]]; if (!handler) continue; - if (excludeDefault && LEVEL_ORDER[i] === "default") continue; + if (excludeDefault && levelOrder[i] === "default") continue; const value = handler.getValue(settingName, roomId); if (value === null || value === undefined) continue;