From cb17c0a379dd35075a2ec9d774ca8722482d973d Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 4 Nov 2017 19:15:55 -0700 Subject: [PATCH] Migrate blacklistUnverifiedDevicesPerRoom This currently causes a split-brain scenario for the application due to the priority of each level. Granular settings assumes a simple override, however the crypto setting wants per room to be overriden with the global setting, regardless of the room setting. Some additional comments are needed on the intended behaviour. Signed-off-by: Travis Ralston --- src/components/views/elements/SettingsFlag.js | 7 ++- src/components/views/rooms/RoomSettings.js | 47 ++++++------------- src/settings/DefaultSettingsHandler.js | 1 - src/settings/RoomDeviceSettingsHandler.js | 30 ++++++++++-- src/settings/Settings.js | 12 ++--- 5 files changed, 52 insertions(+), 45 deletions(-) diff --git a/src/components/views/elements/SettingsFlag.js b/src/components/views/elements/SettingsFlag.js index 96fe704acb..3640b5538e 100644 --- a/src/components/views/elements/SettingsFlag.js +++ b/src/components/views/elements/SettingsFlag.js @@ -55,7 +55,12 @@ module.exports = React.createClass({ }, save: function(val = null) { - SettingsStore.setValue(this.props.name, this.props.roomId, this.props.level, val ? val : this.state.value); + return SettingsStore.setValue( + this.props.name, + this.props.roomId, + this.props.level, + val ? val : this.state.value + ); }, render: function() { diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js index a7606a2bdd..50243ae65f 100644 --- a/src/components/views/rooms/RoomSettings.js +++ b/src/components/views/rooms/RoomSettings.js @@ -363,28 +363,11 @@ module.exports = React.createClass({ }, saveBlacklistUnverifiedDevicesPerRoom: function() { - if (!this.refs.blacklistUnverified) return; - if (this._isRoomBlacklistUnverified() !== this.refs.blacklistUnverified.checked) { - this._setRoomBlacklistUnverified(this.refs.blacklistUnverified.checked); - } - }, - - _isRoomBlacklistUnverified: function() { - // TODO: {Travis} Use generic blacklistUnverifiedDevices - const blacklistUnverifiedDevicesPerRoom = SettingsStore.getValue("blacklistUnverifiedDevicesPerRoom"); - if (blacklistUnverifiedDevicesPerRoom) { - return blacklistUnverifiedDevicesPerRoom[this.props.room.roomId]; - } - return false; - }, - - _setRoomBlacklistUnverified: function(value) { - // TODO: {Travis} Use generic blacklistUnverifiedDevices - const blacklistUnverifiedDevicesPerRoom = SettingsStore.getValue("blacklistUnverifiedDevicesPerRoom"); - blacklistUnverifiedDevicesPerRoom[this.props.room.roomId] = value; - SettingsStore.setValue("blacklistUnverifiedDevicesPerRoom", null, SettingLevel.DEVICE, blacklistUnverifiedDevicesPerRoom); - - this.props.room.setBlacklistUnverifiedDevices(value); + if (!this.refs.blacklistUnverifiedDevices) return; + this.refs.blacklistUnverifiedDevices.save().then(() => { + const value = SettingsStore.getValue("blacklistUnverifiedDevices", this.props.room.roomId); + this.props.room.setBlacklistUnverifiedDevices(value); + }); }, _hasDiff: function(strA, strB) { @@ -590,20 +573,20 @@ module.exports = React.createClass({ }, _renderEncryptionSection: function() { + const SettingsFlag = sdk.getComponent("elements.SettingsFlag"); + const cli = MatrixClientPeg.get(); const roomState = this.props.room.currentState; const isEncrypted = cli.isRoomEncrypted(this.props.room.roomId); - const isGlobalBlacklistUnverified = SettingsStore.getValue("blacklistUnverifiedDevices"); - const isRoomBlacklistUnverified = this._isRoomBlacklistUnverified(); - // TODO: {Travis} Convert to blacklistUnverifiedDevices with SettingsFlag - const settings = - ; + const settings = ( + + ); if (!isEncrypted && roomState.mayClientSendStateEvent("m.room.encryption", cli)) { return ( diff --git a/src/settings/DefaultSettingsHandler.js b/src/settings/DefaultSettingsHandler.js index 2c3a05a18a..cf2e660411 100644 --- a/src/settings/DefaultSettingsHandler.js +++ b/src/settings/DefaultSettingsHandler.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import Promise from 'bluebird'; import SettingsHandler from "./SettingsHandler"; /** diff --git a/src/settings/RoomDeviceSettingsHandler.js b/src/settings/RoomDeviceSettingsHandler.js index 394d8cd319..186be3041f 100644 --- a/src/settings/RoomDeviceSettingsHandler.js +++ b/src/settings/RoomDeviceSettingsHandler.js @@ -23,12 +23,30 @@ import SettingsHandler from "./SettingsHandler"; */ export default class RoomDeviceSettingsHandler extends SettingsHandler { getValue(settingName, roomId) { - const value = localStorage.getItem(this._getKey(settingName, roomId)); - if (!value) return null; - return JSON.parse(value).value; + // Special case blacklist setting to use legacy values + if (settingName === "blacklistUnverifiedDevices") { + const value = this._read("mx_local_settings"); + if (value && value['blacklistUnverifiedDevicesPerRoom']) { + return value['blacklistUnverifiedDevicesPerRoom'][roomId]; + } + } + + const value = this._read(this._getKey(settingName, roomId)); + if (value) return value.value; + return null; } setValue(settingName, roomId, newValue) { + // Special case blacklist setting for legacy structure + if (settingName === "blacklistUnverifiedDevices") { + let value = this._read("mx_local_settings"); + if (!value) value = {}; + if (!value["blacklistUnverifiedDevicesPerRoom"]) value["blacklistUnverifiedDevicesPerRoom"] = {}; + value["blacklistUnverifiedDevicesPerRoom"][roomId] = newValue; + localStorage.setItem("mx_local_settings", JSON.stringify(value)); + return Promise.resolve(); + } + if (newValue === null) { localStorage.removeItem(this._getKey(settingName, roomId)); } else { @@ -47,6 +65,12 @@ export default class RoomDeviceSettingsHandler extends SettingsHandler { return localStorage !== undefined && localStorage !== null; } + _read(key) { + const rawValue = localStorage.getItem(key); + if (!rawValue) return null; + return JSON.parse(rawValue); + } + _getKey(settingName, roomId) { return "mx_setting_" + settingName + "_" + roomId; } diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 4bab7acb40..1408762cc2 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -188,16 +188,12 @@ export const SETTINGS = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: 200, }, - "blacklistUnverifiedDevicesPerRoom": { - // TODO: {Travis} Write a migration path to support blacklistUnverifiedDevices - supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, - displayName: _td('Never send encrypted messages to unverified devices from this device'), - default: {}, - }, "blacklistUnverifiedDevices": { - // TODO: {Travis} Write a migration path to support blacklistUnverifiedDevices supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, - displayName: _td('Never send encrypted messages to unverified devices from this device'), + 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'), + }, default: false, }, "urlPreviewsEnabled": {