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 ;
}
+ // 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 = (
-
- );
- }
-
if (!isEncrypted && roomState.mayClientSendStateEvent("m.room.encryption", cli)) {
return (
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;