From 7a9e914a554b4fb1e3495e000c97a8ed1aeadeb8 Mon Sep 17 00:00:00 2001 From: Viktor Fomin Date: Wed, 13 Apr 2022 14:51:14 +0300 Subject: [PATCH 01/12] Web: Client: Settings: fix init --- .../access-portal/passwordStrength.js | 41 +++++++++++-------- .../categories/security/access-portal/tfa.js | 21 ++++++---- .../security/access-portal/trustedMail.js | 15 +++---- 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/passwordStrength.js b/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/passwordStrength.js index 9a1ff43e16..fbbe013150 100644 --- a/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/passwordStrength.js +++ b/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/passwordStrength.js @@ -35,7 +35,15 @@ const MainContainer = styled.div` `; const PasswordStrength = (props) => { - const { t, history, setPortalPasswordSettings, passwordSettings } = props; + const { + t, + history, + setPortalPasswordSettings, + passwordSettings, + initSettings, + isInit, + } = props; + const [passwordLen, setPasswordLen] = useState(8); const [useUpperCase, setUseUpperCase] = useState(false); const [useDigits, setUseDigits] = useState(false); @@ -46,19 +54,14 @@ const PasswordStrength = (props) => { const getSettings = () => { const currentSettings = getFromSessionStorage("currentPasswordSettings"); - const defaultSettings = getFromSessionStorage("defaultPasswordSettings"); - if (defaultSettings) { - saveToSessionStorage("defaultPasswordSettings", defaultSettings); - } else { - const defaultData = { - minLength: passwordSettings.minLength, - upperCase: passwordSettings.upperCase, - digits: passwordSettings.digits, - specSymbols: passwordSettings.specSymbols, - }; - saveToSessionStorage("defaultPasswordSettings", defaultData); - } + const defaultData = { + minLength: passwordSettings.minLength, + upperCase: passwordSettings.upperCase, + digits: passwordSettings.digits, + specSymbols: passwordSettings.specSymbols, + }; + saveToSessionStorage("defaultPasswordSettings", defaultData); if (currentSettings) { setPasswordLen(currentSettings.minLength); @@ -71,11 +74,14 @@ const PasswordStrength = (props) => { setUseDigits(passwordSettings.digits); setUseSpecialSymbols(passwordSettings.specSymbols); } - - setIsLoading(true); }; useEffect(() => { + if (!isInit) initSettings().then(() => setIsLoading(true)); + }, []); + + useEffect(() => { + if (!isInit) return; checkWidth(); getSettings(); window.addEventListener("resize", checkWidth); @@ -232,12 +238,15 @@ const PasswordStrength = (props) => { ); }; -export default inject(({ auth }) => { +export default inject(({ auth, setup }) => { const { setPortalPasswordSettings, passwordSettings } = auth.settingsStore; + const { initSettings, isInit } = setup; return { setPortalPasswordSettings, passwordSettings, + initSettings, + isInit, }; })( withTranslation(["Settings", "Common"])( diff --git a/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/tfa.js b/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/tfa.js index 348de8140a..53a235cafb 100644 --- a/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/tfa.js +++ b/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/tfa.js @@ -22,7 +22,7 @@ const MainContainer = styled.div` `; const TwoFactorAuth = (props) => { - const { t, history } = props; + const { t, history, initSettings, isInit } = props; const [type, setType] = useState("none"); const [smsDisabled, setSmsDisabled] = useState(false); @@ -33,13 +33,8 @@ const TwoFactorAuth = (props) => { const getSettings = () => { const { tfaSettings, smsAvailable, appAvailable } = props; const currentSettings = getFromSessionStorage("currentTfaSettings"); - const defaultSettings = getFromSessionStorage("defaultTfaSettings"); - if (defaultSettings) { - saveToSessionStorage("defaultTfaSettings", defaultSettings); - } else { - saveToSessionStorage("defaultTfaSettings", tfaSettings); - } + saveToSessionStorage("defaultTfaSettings", tfaSettings); if (currentSettings) { setType(currentSettings); @@ -49,10 +44,14 @@ const TwoFactorAuth = (props) => { setSmsDisabled(smsAvailable); setAppDisabled(appAvailable); - setIsLoading(true); }; useEffect(() => { + if (!isInit) initSettings().then(() => setIsLoading(true)); + }, []); + + useEffect(() => { + if (!isInit) return; checkWidth(); getSettings(); window.addEventListener("resize", checkWidth); @@ -164,7 +163,7 @@ const TwoFactorAuth = (props) => { ); }; -export default inject(({ auth }) => { +export default inject(({ auth, setup }) => { const { setTfaSettings, getTfaConfirmLink, @@ -173,12 +172,16 @@ export default inject(({ auth }) => { appAvailable, } = auth.tfaStore; + const { isInit, initSettings } = setup; + return { setTfaSettings, getTfaConfirmLink, tfaSettings, smsAvailable, appAvailable, + isInit, + initSettings, }; })( withTranslation(["Settings", "Common"])(withRouter(observer(TwoFactorAuth))) diff --git a/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/trustedMail.js b/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/trustedMail.js index 5e0853106f..2f199c2deb 100644 --- a/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/trustedMail.js +++ b/web/ASC.Web.Client/src/components/pages/Settings/categories/security/access-portal/trustedMail.js @@ -46,17 +46,12 @@ const TrustedMail = (props) => { const getSettings = () => { const currentSettings = getFromSessionStorage("currentTrustedMailSettings"); - const defaultSettings = getFromSessionStorage("defaultTrustedMailSettings"); - if (defaultSettings) { - saveToSessionStorage("defaultTrustedMailSettings", defaultSettings); - } else { - const defaultData = { - type: String(trustedDomainsType), - domains: trustedDomains, - }; - saveToSessionStorage("defaultTrustedMailSettings", defaultData); - } + const defaultData = { + type: String(trustedDomainsType), + domains: trustedDomains, + }; + saveToSessionStorage("defaultTrustedMailSettings", defaultData); if (currentSettings) { setType(currentSettings.type); From 6ff7c9b09d4792388269d844731a53d6b68c43d0 Mon Sep 17 00:00:00 2001 From: Viktor Fomin Date: Wed, 13 Apr 2022 14:51:52 +0300 Subject: [PATCH 02/12] Web: Client: Tests: fix mock --- .../mocking/mock-data/settings/maildomainsettingsError.json | 5 ++--- .../tests/mocking/mock-data/settings/password.json | 4 ++-- .../tests/mocking/mock-data/settings/settings.json | 1 + 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/web/ASC.Web.Client/tests/mocking/mock-data/settings/maildomainsettingsError.json b/web/ASC.Web.Client/tests/mocking/mock-data/settings/maildomainsettingsError.json index a567b77388..03be1b89ca 100644 --- a/web/ASC.Web.Client/tests/mocking/mock-data/settings/maildomainsettingsError.json +++ b/web/ASC.Web.Client/tests/mocking/mock-data/settings/maildomainsettingsError.json @@ -1,6 +1,5 @@ { - "count": 1, - "response": "Error", - "status": 0, + "error": { "message": "Request failed with status code 400", "hresult": 0 }, + "status": 1, "statusCode": 400 } diff --git a/web/ASC.Web.Client/tests/mocking/mock-data/settings/password.json b/web/ASC.Web.Client/tests/mocking/mock-data/settings/password.json index ca51fe15d2..8e4f193fea 100644 --- a/web/ASC.Web.Client/tests/mocking/mock-data/settings/password.json +++ b/web/ASC.Web.Client/tests/mocking/mock-data/settings/password.json @@ -1,8 +1,8 @@ { "count": 1, "response": { - "id": "EXAMPLEID", - "minLength": 8, + "id": "6dde41a5-4c75-11ec-98de-089798855014", + "minLength": 10, "upperCase": false, "digits": false, "specSymbols": false diff --git a/web/ASC.Web.Client/tests/mocking/mock-data/settings/settings.json b/web/ASC.Web.Client/tests/mocking/mock-data/settings/settings.json index 6d3f172b30..62342c320b 100644 --- a/web/ASC.Web.Client/tests/mocking/mock-data/settings/settings.json +++ b/web/ASC.Web.Client/tests/mocking/mock-data/settings/settings.json @@ -20,6 +20,7 @@ "utcHoursOffset": 0, "greetingSettings": "Web Office", "ownerId": "00000000-0000-0000-0000-000000000000", + "nameSchemaId": "Common", "enabledJoin": true, "enableAdmMess": true, "thirdpartyEnable": true, From 1dcc6b035b3f3cb09505c74861c5b09bee5169f5 Mon Sep 17 00:00:00 2001 From: Viktor Fomin Date: Wed, 13 Apr 2022 14:52:11 +0300 Subject: [PATCH 03/12] Web: Client: Tests: fix action tests --- web/ASC.Web.Client/tests/action_tests.js | 105 +++++++++++++---------- 1 file changed, 62 insertions(+), 43 deletions(-) diff --git a/web/ASC.Web.Client/tests/action_tests.js b/web/ASC.Web.Client/tests/action_tests.js index 9c9433f7e4..b836bf7a3b 100644 --- a/web/ASC.Web.Client/tests/action_tests.js +++ b/web/ASC.Web.Client/tests/action_tests.js @@ -76,32 +76,6 @@ Scenario("Tfa activation success", async ({ I }) => { I.see("Documents"); }); -Scenario("Tfa on from settings", async ({ I }) => { - I.mockEndpoint(Endpoints.common, "common"); - I.mockEndpoint(Endpoints.settings, "settings"); - I.mockEndpoint(Endpoints.build, "build"); - I.mockEndpoint(Endpoints.info, "infoSettings"); - I.mockEndpoint(Endpoints.self, "selfSettings"); - I.mockEndpoint(Endpoints.tfaapp, "tfaapp"); - I.mockEndpoint(Endpoints.tfaconfirm, "tfaconfirm"); - I.mockEndpoint(Endpoints.confirm, "confirm"); - I.mockEndpoint(Endpoints.setup, "setup"); - - I.amOnPage("/settings/security/access-portal/tfa"); - - I.see("Two-factor authentication"); - - I.click({ - react: "RadioButton", - props: { - value: "app", - }, - }); - - I.click("Save"); - I.see("Configure your authenticator application"); -}); - Scenario("Profile remove success", async ({ I }) => { I.mockEndpoint(Endpoints.confirm, "confirm"); @@ -741,12 +715,16 @@ Scenario( } ); +// SECURITY SETTINGS TESTS + Scenario("Setting password strength change test success", async ({ I }) => { - I.mockEndpoint(Endpoints.settings, "settings"); - I.mockEndpoint(Endpoints.password, "password"); - I.mockEndpoint(Endpoints.build, "build"); - I.mockEndpoint(Endpoints.info, "infoSettings"); I.mockEndpoint(Endpoints.self, "selfSettings"); + I.mockEndpoint(Endpoints.info, "infoSettings"); + I.mockEndpoint(Endpoints.build, "build"); + I.mockEndpoint(Endpoints.settings, "settingsCustomization"); + I.mockEndpoint(Endpoints.common, "common"); + I.mockEndpoint(Endpoints.password, "password"); + I.mockEndpoint(Endpoints.tfaapp, "tfaapp"); if (deviceType === "mobile") { I.amOnPage("/settings/security/access-portal/password"); @@ -768,11 +746,13 @@ Scenario("Setting password strength change test success", async ({ I }) => { }); Scenario("Setting password strength change test error", async ({ I }) => { - I.mockEndpoint(Endpoints.settings, "settings"); - I.mockEndpoint(Endpoints.password, "password"); - I.mockEndpoint(Endpoints.build, "build"); - I.mockEndpoint(Endpoints.info, "infoSettings"); I.mockEndpoint(Endpoints.self, "selfSettings"); + I.mockEndpoint(Endpoints.info, "infoSettings"); + I.mockEndpoint(Endpoints.build, "build"); + I.mockEndpoint(Endpoints.settings, "settingsCustomization"); + I.mockEndpoint(Endpoints.common, "common"); + I.mockEndpoint(Endpoints.password, "password"); + I.mockEndpoint(Endpoints.tfaapp, "tfaapp"); if (deviceType === "mobile") { I.amOnPage("/settings/security/access-portal/password"); @@ -796,12 +776,41 @@ Scenario("Setting password strength change test error", async ({ I }) => { } }); +Scenario("Tfa on from settings", async ({ I }) => { + I.mockEndpoint(Endpoints.self, "selfSettings"); + I.mockEndpoint(Endpoints.info, "infoSettings"); + I.mockEndpoint(Endpoints.build, "build"); + I.mockEndpoint(Endpoints.settings, "settingsCustomization"); + I.mockEndpoint(Endpoints.common, "common"); + I.mockEndpoint(Endpoints.password, "password"); + I.mockEndpoint(Endpoints.tfaapp, "tfaapp"); + I.mockEndpoint(Endpoints.tfaconfirm, "tfaconfirm"); + I.mockEndpoint(Endpoints.confirm, "confirm"); + I.mockEndpoint(Endpoints.setup, "setup"); + + I.amOnPage("/settings/security/access-portal/tfa"); + + I.see("Two-factor authentication"); + + I.click({ + react: "RadioButton", + props: { + value: "app", + }, + }); + + I.click("Save"); + I.see("Configure your authenticator application"); +}); + Scenario("Trusted mail settings change test success", async ({ I }) => { I.mockEndpoint(Endpoints.settings, "settings"); I.mockEndpoint(Endpoints.build, "build"); I.mockEndpoint(Endpoints.info, "infoSettings"); I.mockEndpoint(Endpoints.self, "selfSettings"); I.mockEndpoint(Endpoints.common, "common"); + I.mockEndpoint(Endpoints.password, "password"); + I.mockEndpoint(Endpoints.tfaapp, "tfaapp"); I.mockEndpoint(Endpoints.maildomainsettings, "maildomainsettings"); if (deviceType === "mobile") { @@ -810,16 +819,18 @@ Scenario("Trusted mail settings change test success", async ({ I }) => { I.see("Trusted mail domain settings"); I.click({ - react: "Checkbox", + react: "RadioButton", props: { value: "1", }, }); I.see("You have unsaved changes"); + + I.see("Add trusted domain"); I.click("Add trusted domain"); - I.see({ react: "TextInput" }); + I.seeElement("#domain-input-0"); I.fillField("#domain-input-0", "test.com"); I.click("Save"); @@ -835,6 +846,8 @@ Scenario("Trusted mail settings change test error", async ({ I }) => { I.mockEndpoint(Endpoints.info, "infoSettings"); I.mockEndpoint(Endpoints.self, "selfSettings"); I.mockEndpoint(Endpoints.common, "common"); + I.mockEndpoint(Endpoints.password, "password"); + I.mockEndpoint(Endpoints.tfaapp, "tfaapp"); I.mockEndpoint(Endpoints.maildomainsettings, "maildomainsettings"); if (deviceType === "mobile") { @@ -843,16 +856,18 @@ Scenario("Trusted mail settings change test error", async ({ I }) => { I.see("Trusted mail domain settings"); I.click({ - react: "Checkbox", + react: "RadioButton", props: { value: "1", }, }); I.see("You have unsaved changes"); + + I.see("Add trusted domain"); I.click("Add trusted domain"); - I.see({ react: "TextInput" }); + I.seeElement("#domain-input-0"); I.fillField("#domain-input-0", "test"); I.click("Save"); @@ -865,9 +880,11 @@ Scenario("Trusted mail settings change test error", async ({ I }) => { Scenario("Trusted mail settings change test server error", async ({ I }) => { I.mockEndpoint(Endpoints.settings, "settings"); I.mockEndpoint(Endpoints.build, "build"); - I.mockEndpoint(Endpoints.info, "info"); - I.mockEndpoint(Endpoints.self, "self"); + I.mockEndpoint(Endpoints.info, "infoSettings"); + I.mockEndpoint(Endpoints.self, "selfSettings"); I.mockEndpoint(Endpoints.common, "common"); + I.mockEndpoint(Endpoints.password, "password"); + I.mockEndpoint(Endpoints.tfaapp, "tfaapp"); I.mockEndpoint(Endpoints.maildomainsettings, "maildomainsettingsError"); if (deviceType === "mobile") { @@ -876,17 +893,19 @@ Scenario("Trusted mail settings change test server error", async ({ I }) => { I.see("Trusted mail domain settings"); I.click({ - react: "Checkbox", + react: "RadioButton", props: { value: "1", }, }); I.see("You have unsaved changes"); + + I.see("Add trusted domain"); I.click("Add trusted domain"); - I.see({ react: "TextInput" }); - I.fillField("#domain-input-0", "test"); + I.seeElement("#domain-input-0"); + I.fillField("#domain-input-0", "test.com"); I.click("Save"); From 816e25772c8bbdad1a46effe080b2f5562923831 Mon Sep 17 00:00:00 2001 From: Viktor Fomin Date: Wed, 13 Apr 2022 14:52:30 +0300 Subject: [PATCH 04/12] Web: Client: add command --- web/ASC.Web.Client/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/ASC.Web.Client/package.json b/web/ASC.Web.Client/package.json index 4a23cc1f6d..df107ea41e 100644 --- a/web/ASC.Web.Client/package.json +++ b/web/ASC.Web.Client/package.json @@ -34,7 +34,8 @@ "test:sequential": "run-s -c test:chromium:sequential test:firefox:sequential test:webkit:sequential && yarn test:parse-xml", "test:model": "run-s -c test:chromium:model test:firefox:model test:webkit:model && yarn test:parse-xml", "test:parse-xml": "node tests/helpers/parserXML.js", - "test:ui": "npx codecept-ui" + "test:ui": "npx codecept-ui", + "test:ui:mobile": "cross-env DEVICE_TYPE=mobile npx codecept-ui" }, "dependencies": { "firebase": "^8.10.0", From fbe7f11f2bb94bbbd57ed220090259e02a9b2347 Mon Sep 17 00:00:00 2001 From: Viktor Fomin Date: Wed, 13 Apr 2022 15:03:59 +0300 Subject: [PATCH 05/12] Web: Components: SaveCancelButtons: add isSaving prop --- packages/asc-web-components/save-cancel-buttons/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/asc-web-components/save-cancel-buttons/index.js b/packages/asc-web-components/save-cancel-buttons/index.js index 301dedcdb9..92e618e62f 100644 --- a/packages/asc-web-components/save-cancel-buttons/index.js +++ b/packages/asc-web-components/save-cancel-buttons/index.js @@ -47,6 +47,7 @@ class SaveCancelButtons extends React.Component { isFirstWelcomePageSettings, className, id, + isSaving, } = this.props; const cancelButtonDisabled = @@ -69,11 +70,12 @@ class SaveCancelButtons extends React.Component { onClick={onSaveClick} label={saveButtonLabel} minwidth={displaySettings && "auto"} + isLoading={isSaving} />