From d613498b8a3ec65ea51d0794a3b6b29e604ad126 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 13 May 2019 14:17:09 +0100 Subject: [PATCH 1/7] Fix bug where email was not required where it shouldn't have been See comment! Fixes https://github.com/vector-im/riot-web/issues/9681 --- src/components/views/auth/RegistrationForm.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/views/auth/RegistrationForm.js b/src/components/views/auth/RegistrationForm.js index 7c083ea270..bef0b9e019 100644 --- a/src/components/views/auth/RegistrationForm.js +++ b/src/components/views/auth/RegistrationForm.js @@ -1,7 +1,7 @@ /* Copyright 2015, 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd -Copyright 2018 New Vector Ltd +Copyright 2018, 2019 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -150,7 +150,11 @@ module.exports = React.createClass({ if (!field) { continue; } - field.validate({ allowEmpty: false }); + // We must wait for these validations to finish before queueing + // up the setState below so our setState gies in the queue after + // all the setStates from these validate calls (that's how we + // know they've finished). + await field.validate({ allowEmpty: false }); } // Validation and state updates are async, so we need to wait for them to complete From 2d6a313871562733040805de630abe6547d5c576 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 13 May 2019 14:24:56 +0100 Subject: [PATCH 2/7] Typo Co-Authored-By: J. Ryan Stinnett --- src/components/views/auth/RegistrationForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/auth/RegistrationForm.js b/src/components/views/auth/RegistrationForm.js index bef0b9e019..654387e196 100644 --- a/src/components/views/auth/RegistrationForm.js +++ b/src/components/views/auth/RegistrationForm.js @@ -151,7 +151,7 @@ module.exports = React.createClass({ continue; } // We must wait for these validations to finish before queueing - // up the setState below so our setState gies in the queue after + // up the setState below so our setState goes in the queue after // all the setStates from these validate calls (that's how we // know they've finished). await field.validate({ allowEmpty: false }); From b6fd485dadae9202277c67402c78afdd7994b50d Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 14 May 2019 11:44:00 +0100 Subject: [PATCH 3/7] Fix email registration: pt. 1 We look to see if there's already a user logged in and if there is, restore that session instead of logging the user in as their new account. We still set this 'is_registered' flag though, even though in that case it's not a newly registered account that's being restored, so don't set in that case. --- src/components/structures/MatrixChat.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 33f1bac090..c0107263fc 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1733,9 +1733,6 @@ export default React.createClass({ // returns a promise which resolves to the new MatrixClient onRegistered: function(credentials) { - // XXX: This should be in state or ideally store(s) because we risk not - // rendering the most up-to-date view of state otherwise. - this._is_registered = true; if (this.state.register_session_id) { // The user came in through an email validation link. To avoid overwriting // their session, check to make sure the session isn't someone else. @@ -1771,6 +1768,9 @@ export default React.createClass({ return MatrixClientPeg.get(); } } + // XXX: This should be in state or ideally store(s) because we risk not + // rendering the most up-to-date view of state otherwise. + this._is_registered = true; return Lifecycle.setLoggedIn(credentials); }, From 040424f462d523b00bfe6c19964fd261d1633743 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 14 May 2019 11:59:38 +0100 Subject: [PATCH 4/7] Fix email registration, pt. 2 Regressed in https://github.com/matrix-org/matrix-react-sdk/pull/2768 where we check for an existing stored account first and restore that instead if it exist, telling the user. We usually make a guest account when the user first hits the page though, so this just restored this guest account. Don't restore the account if it's just a guest account (which, as per comment, is not perfect, but is definitely better than the current behaviour). Fixes https://github.com/vector-im/riot-web/issues/9581 --- src/Lifecycle.js | 29 ++++++++++++++++--------- src/components/structures/MatrixChat.js | 8 +++++-- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 527394da4d..ca4c7c48f8 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -126,6 +126,15 @@ export function getStoredSessionOwner() { return hsUrl && userId && accessToken ? userId : null; } +/** + * @returns {bool} True if the stored session is for a guest user or false if it is + * for a real user. If there is no stored session, return null. + */ +export function getStoredSessionIsGuest() { + const {hsUrl, isUrl, accessToken, userId, deviceId, isGuest} = _getLocalStorageSessionVars(); + return hsUrl && userId && accessToken ? isGuest : null; +} + /** * @param {Object} queryParams string->string map of the * query-parameters extracted from the real query-string of the starting @@ -235,7 +244,15 @@ function _getLocalStorageSessionVars() { const userId = localStorage.getItem("mx_user_id"); const deviceId = localStorage.getItem("mx_device_id"); - return {hsUrl, isUrl, accessToken, userId, deviceId}; + let isGuest; + if (localStorage.getItem("mx_is_guest") !== null) { + isGuest = localStorage.getItem("mx_is_guest") === "true"; + } else { + // legacy key name + isGuest = localStorage.getItem("matrix-is-guest") === "true"; + } + + return {hsUrl, isUrl, accessToken, userId, deviceId, isGuest}; } // returns a promise which resolves to true if a session is found in @@ -253,15 +270,7 @@ async function _restoreFromLocalStorage() { return false; } - const {hsUrl, isUrl, accessToken, userId, deviceId} = _getLocalStorageSessionVars(); - - let isGuest; - if (localStorage.getItem("mx_is_guest") !== null) { - isGuest = localStorage.getItem("mx_is_guest") === "true"; - } else { - // legacy key name - isGuest = localStorage.getItem("matrix-is-guest") === "true"; - } + const {hsUrl, isUrl, accessToken, userId, deviceId, isGuest} = _getLocalStorageSessionVars(); if (accessToken && userId && hsUrl) { console.log(`Restoring session for ${userId}`); diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index c0107263fc..b1001e3b83 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1735,9 +1735,13 @@ export default React.createClass({ onRegistered: function(credentials) { if (this.state.register_session_id) { // The user came in through an email validation link. To avoid overwriting - // their session, check to make sure the session isn't someone else. + // their session, check to make sure the session isn't someone else, and + // isn't a guest user since we'll usually have set a guest user session before + // starting the registration process. This isn't perfect since it's possible + // the user had a separate guest session they didn't actually mean to replace. const sessionOwner = Lifecycle.getStoredSessionOwner(); - if (sessionOwner && sessionOwner !== credentials.userId) { + const sessionIsGuest = Lifecycle.getStoredSessionIsGuest(); + if (sessionOwner && !sessionIsGuest && sessionOwner !== credentials.userId) { console.log( `Found a session for ${sessionOwner} but ${credentials.userId} is trying to verify their ` + `email address. Restoring the session for ${sessionOwner} with warning.`, From 4aec75ef699198a4c13bf8f21fec7d7b8815e0f6 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 14 May 2019 12:11:07 +0100 Subject: [PATCH 5/7] Yes yes, eslint --- src/Lifecycle.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Lifecycle.js b/src/Lifecycle.js index ca4c7c48f8..0e2389fd1c 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -131,8 +131,8 @@ export function getStoredSessionOwner() { * for a real user. If there is no stored session, return null. */ export function getStoredSessionIsGuest() { - const {hsUrl, isUrl, accessToken, userId, deviceId, isGuest} = _getLocalStorageSessionVars(); - return hsUrl && userId && accessToken ? isGuest : null; + const sessVars = _getLocalStorageSessionVars(); + return sessVars.hsUrl && sessVars.userId && sessVars.accessToken ? sessVars.isGuest : null; } /** From 4e2cce7d44af8528138b779478fa6b4ee1756e86 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 14 May 2019 13:48:46 +0100 Subject: [PATCH 6/7] Prepare changelog for v1.1.1 --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d9a01e668..988a85fd43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +Changes in [1.1.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.1.1) (2019-05-14) +=================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.1.0...v1.1.1) + + * Fix registration with email + [\#2970](https://github.com/matrix-org/matrix-react-sdk/pull/2970) + * Fix bug where email was not required where it shouldn't have been + [\#2969](https://github.com/matrix-org/matrix-react-sdk/pull/2969) + Changes in [1.1.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.1.0) (2019-05-07) =================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.1.0-rc.1...v1.1.0) From 851d2076113d1aff90c14ebc13a645b003dbbe9e Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 14 May 2019 13:48:47 +0100 Subject: [PATCH 7/7] v1.1.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5735fed77c..df51ac6526 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "1.1.0", + "version": "1.1.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": {