From 0d70ba83633f70334e7cbb538a7472ece1fc7812 Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Mon, 29 May 2023 12:20:59 +0600 Subject: [PATCH] UBER-221 Confirm registration (#3254) Signed-off-by: Denis Bykhov --- dev/tool/src/index.ts | 11 ++ packages/ui/src/components/Popup.svelte | 2 +- .../ui/src/components/PopupInstance.svelte | 8 +- plugins/login-assets/lang/en.json | 4 +- plugins/login-assets/lang/ru.json | 4 +- .../src/components/Confirmation.svelte | 50 ++++++ .../src/components/ConfirmationSend.svelte | 27 +++ .../src/components/CreateWorkspaceForm.svelte | 13 +- .../src/components/LoginApp.svelte | 6 + .../src/components/LoginForm.svelte | 2 +- .../src/components/SelectWorkspace.svelte | 11 +- .../src/components/SignupForm.svelte | 14 +- plugins/login-resources/src/plugin.ts | 4 +- plugins/login-resources/src/utils.ts | 95 ++++++++++- plugins/login/src/index.ts | 1 + server/account/src/index.ts | 156 +++++++++++++++--- server/token/src/token.ts | 2 +- tests/create-local.sh | 1 + tests/prepare.sh | 1 + 19 files changed, 363 insertions(+), 49 deletions(-) create mode 100644 plugins/login-resources/src/components/Confirmation.svelte create mode 100644 plugins/login-resources/src/components/ConfirmationSend.svelte diff --git a/dev/tool/src/index.ts b/dev/tool/src/index.ts index ccf2644aa5..1c7dc2320c 100644 --- a/dev/tool/src/index.ts +++ b/dev/tool/src/index.ts @@ -17,6 +17,7 @@ import { ACCOUNT_DB, assignWorkspace, + confirmEmail, createAccount, createWorkspace, dropAccount, @@ -371,6 +372,16 @@ export function devTool ( ) }) + program + .command('confirm-email ') + .description('confirm user email') + .action(async (email: string, cmd) => { + const { mongodbUri } = prepareTools() + return await withDatabase(mongodbUri, async (db) => { + await confirmEmail(db, email) + }) + }) + program .command('diff-workspace ') .description('restore workspace transactions and minio resources from previous dump.') diff --git a/packages/ui/src/components/Popup.svelte b/packages/ui/src/components/Popup.svelte index 3a7454d711..ba29b77db7 100644 --- a/packages/ui/src/components/Popup.svelte +++ b/packages/ui/src/components/Popup.svelte @@ -16,7 +16,7 @@ import { popupstore as modal } from '../popups' import PopupInstance from './PopupInstance.svelte' - export let contentPanel: HTMLElement + export let contentPanel: HTMLElement | undefined = undefined const instances: PopupInstance[] = [] diff --git a/packages/ui/src/components/PopupInstance.svelte b/packages/ui/src/components/PopupInstance.svelte index 919e80b36f..2ceee1d75e 100644 --- a/packages/ui/src/components/PopupInstance.svelte +++ b/packages/ui/src/components/PopupInstance.svelte @@ -27,7 +27,7 @@ export let zIndex: number export let top: boolean export let close: () => void - export let contentPanel: HTMLElement + export let contentPanel: HTMLElement | undefined let modalHTML: HTMLElement let componentInstance: any @@ -68,7 +68,11 @@ _close(undefined) } - const fitPopup = (modalHTML: HTMLElement, element: PopupAlignment | undefined, contentPanel: HTMLElement): void => { + const fitPopup = ( + modalHTML: HTMLElement, + element: PopupAlignment | undefined, + contentPanel: HTMLElement | undefined + ): void => { if ((fullSize || docSize) && (element === 'float' || element === 'centered')) { options = fitPopupElement(modalHTML, 'full', contentPanel) options.props.maxHeight = '100vh' diff --git a/plugins/login-assets/lang/en.json b/plugins/login-assets/lang/en.json index 8b43bd8f36..bb2099bbc6 100644 --- a/plugins/login-assets/lang/en.json +++ b/plugins/login-assets/lang/en.json @@ -39,6 +39,8 @@ "InviteLimit": "Invite limit:", "GetLink": "Get invite link", "NoLimit": "No limit", - "AlreadyJoined": "Already joined?" + "AlreadyJoined": "Already joined?", + "ConfirmationSent": "A message has been sent to your email containing a link to confirm the your address.", + "ConfirmationSent2": "Please follow the link to complete your sign up." } } diff --git a/plugins/login-assets/lang/ru.json b/plugins/login-assets/lang/ru.json index 6774a15a73..5faaa47917 100644 --- a/plugins/login-assets/lang/ru.json +++ b/plugins/login-assets/lang/ru.json @@ -39,6 +39,8 @@ "InviteLimit": "Предел использований:", "GetLink": "Получить ссылку", "NoLimit": "Без предела использований", - "AlreadyJoined": "Уже подключены?" + "AlreadyJoined": "Уже подключены?", + "ConfirmationSent": "На Вашу почту отправлено сообщение, c ссылкой для подтверждения email.", + "ConfirmationSent2": "Пожалуйста, перейдите по ссылке для завершения регистрации." } } diff --git a/plugins/login-resources/src/components/Confirmation.svelte b/plugins/login-resources/src/components/Confirmation.svelte new file mode 100644 index 0000000000..0677133dee --- /dev/null +++ b/plugins/login-resources/src/components/Confirmation.svelte @@ -0,0 +1,50 @@ + + diff --git a/plugins/login-resources/src/components/ConfirmationSend.svelte b/plugins/login-resources/src/components/ConfirmationSend.svelte new file mode 100644 index 0000000000..46dcdfd9b2 --- /dev/null +++ b/plugins/login-resources/src/components/ConfirmationSend.svelte @@ -0,0 +1,27 @@ + + + +
+
+

+

+
+
diff --git a/plugins/login-resources/src/components/CreateWorkspaceForm.svelte b/plugins/login-resources/src/components/CreateWorkspaceForm.svelte index 0af2b0245d..40fb22e35b 100644 --- a/plugins/login-resources/src/components/CreateWorkspaceForm.svelte +++ b/plugins/login-resources/src/components/CreateWorkspaceForm.svelte @@ -17,11 +17,12 @@ import { Status, Severity, OK, setMetadata } from '@hcengineering/platform' import Form from './Form.svelte' - import { createWorkspace } from '../utils' + import { createWorkspace, getAccount } from '../utils' import { fetchMetadataLocalStorage, getCurrentLocation, navigate, setMetadataLocalStorage } from '@hcengineering/ui' import login from '../plugin' import { workbenchId } from '@hcengineering/workbench' import presentation from '@hcengineering/presentation' + import { onMount } from 'svelte' const fields = [ { @@ -38,6 +39,16 @@ let status: Status = OK + onMount(async () => { + const account = await getAccount() + if (account?.confirmed !== true) { + const loc = getCurrentLocation() + loc.path[1] = 'confirmationSend' + loc.path.length = 2 + navigate(loc) + } + }) + const action = { i18n: login.string.CreateWorkspace, func: async () => { diff --git a/plugins/login-resources/src/components/LoginApp.svelte b/plugins/login-resources/src/components/LoginApp.svelte index 2535d951b5..e7bd101560 100644 --- a/plugins/login-resources/src/components/LoginApp.svelte +++ b/plugins/login-resources/src/components/LoginApp.svelte @@ -27,6 +27,8 @@ import { getMetadata } from '@hcengineering/platform' import PasswordRequest from './PasswordRequest.svelte' import PasswordRestore from './PasswordRestore.svelte' + import Confirmation from './Confirmation.svelte' + import ConfirmationSend from './ConfirmationSend.svelte' export let page: string = 'login' @@ -68,6 +70,10 @@ {:else if page === 'join'} + {:else if page === 'confirm'} + + {:else if page === 'confirmationSend'} + {/if} diff --git a/plugins/login-resources/src/components/LoginForm.svelte b/plugins/login-resources/src/components/LoginForm.svelte index 7a2d9e88b3..60a037c02f 100644 --- a/plugins/login-resources/src/components/LoginForm.svelte +++ b/plugins/login-resources/src/components/LoginForm.svelte @@ -75,7 +75,7 @@ } } const loc = getCurrentLocation() - loc.path[1] = 'selectWorkspace' + loc.path[1] = result.confirmed ? 'selectWorkspace' : 'confirmationSend' loc.path.length = 2 if (navigateUrl !== undefined) { loc.query = { ...loc.query, navigateUrl } diff --git a/plugins/login-resources/src/components/SelectWorkspace.svelte b/plugins/login-resources/src/components/SelectWorkspace.svelte index 0428de0e79..4f9b5a34f6 100644 --- a/plugins/login-resources/src/components/SelectWorkspace.svelte +++ b/plugins/login-resources/src/components/SelectWorkspace.svelte @@ -26,14 +26,19 @@ setMetadataLocalStorage } from '@hcengineering/ui' import login from '../plugin' - import { getWorkspaces, navigateToWorkspace, selectWorkspace } from '../utils' + import { getAccount, getWorkspaces, navigateToWorkspace, selectWorkspace } from '../utils' import StatusControl from './StatusControl.svelte' - import { Workspace } from '@hcengineering/login' + import { LoginInfo, Workspace } from '@hcengineering/login' + import { onMount } from 'svelte' export let navigateUrl: string | undefined = undefined let status = OK + let account: LoginInfo | undefined = undefined + + onMount(async () => (account = await getAccount())) + async function select (workspace: string) { status = new Status(Severity.INFO, login.status.ConnectingToServer, {}) @@ -88,7 +93,7 @@ {workspace.workspace} {/each} - {#if !workspaces.length} + {#if !workspaces.length && account?.confirmed === true}
diff --git a/plugins/login-resources/src/components/SignupForm.svelte b/plugins/login-resources/src/components/SignupForm.svelte index abc54d744f..dd65f41ed3 100644 --- a/plugins/login-resources/src/components/SignupForm.svelte +++ b/plugins/login-resources/src/components/SignupForm.svelte @@ -14,13 +14,12 @@ // limitations under the License. -->