From b95c470e7ddc0700ca646dbb2cadeb10f0b442a9 Mon Sep 17 00:00:00 2001 From: Wroud Date: Sun, 11 Oct 2020 20:58:07 +0300 Subject: [PATCH] feat(plugin-administration): CB-340 session expire time --- .../core-administration/src/locales/en.ts | 33 -------- .../core-administration/src/locales/ru.ts | 1 + .../packages/core-app/public/icons/icons.svg | 8 ++ .../DriverPropertiesController.ts | 6 +- .../Connections/ConnectionsAdministration.tsx | 6 +- .../src/queries/session/serverConfig.gql | 1 + webapp/packages/core-sdk/src/sdk.ts | 5 +- .../ServerConfigurationForm.tsx | 80 +++++++++++-------- .../ServerConfigurationPage.tsx | 47 ++++++++--- .../ServerConfigurationPageController.ts | 6 +- .../ServerConfigurationService.ts | 20 +++-- .../src/LocaleService.ts | 32 ++++++++ .../plugin-administration/src/locales/en.ts | 36 +++++++++ .../plugin-administration/src/locales/ru.ts | 2 + .../plugin-administration/src/manifest.ts | 2 + 15 files changed, 195 insertions(+), 90 deletions(-) create mode 100644 webapp/packages/plugin-administration/src/LocaleService.ts create mode 100644 webapp/packages/plugin-administration/src/locales/en.ts create mode 100644 webapp/packages/plugin-administration/src/locales/ru.ts diff --git a/webapp/packages/core-administration/src/locales/en.ts b/webapp/packages/core-administration/src/locales/en.ts index b13fc14c3b..3aefa09187 100644 --- a/webapp/packages/core-administration/src/locales/en.ts +++ b/webapp/packages/core-administration/src/locales/en.ts @@ -2,37 +2,4 @@ export default [ ['administration_menu_enter', 'Administration'], ['administration_menu_back', 'Back to app'], ['administration_configuration_wizard_title', 'Initial Server Configuration'], - ['administration_configuration_wizard_welcome', 'Welcome'], - ['administration_configuration_wizard_welcome_step_description', 'Welcome to CloudBeaver'], - ['administration_configuration_wizard_welcome_title', 'Welcome to CloudBeaver, cloud database management system!'], - ['administration_configuration_wizard_welcome_message', 'The easy configuration wizard will guide you through several simple steps to set up the CloudBeaver server. You will need to set server information and administrator credentials. You can also add first database connections here.'], - ['administration_configuration_wizard_welcome_note', 'Note: you will be able to change these configuration parameters later on the administration panel.'], - ['administration_configuration_wizard_configuration', 'Server configuration'], - ['administration_configuration_wizard_configuration_step_description', 'Main server configuration'], - ['administration_configuration_wizard_configuration_title', 'You can configure the main server parameters here.'], - ['administration_configuration_wizard_configuration_message', 'Administrator is a super user who can configure server, set databases connections, manage other users and much more. Please, remember the entered password. It is not possible to recover administrator password automatically.'], - ['administration_configuration_wizard_configuration_plugins', 'Configuration'], - ['administration_configuration_wizard_configuration_server_info', 'Server Info'], - ['administration_configuration_wizard_configuration_server_name', 'Server Name'], - ['administration_configuration_wizard_configuration_admin', 'Administrator'], - ['administration_configuration_wizard_configuration_admin_name', 'Admin user name'], - ['administration_configuration_wizard_configuration_admin_password', 'Admin password'], - ['administration_configuration_wizard_configuration_anonymous_access', 'Allow anonymous access'], - ['administration_configuration_wizard_configuration_anonymous_access_description', 'Allows to work with CloudBeaver without user authentication'], - ['administration_configuration_wizard_configuration_authentication', 'Enable users authentication'], - ['administration_configuration_wizard_configuration_authentication_description', 'Allows users to authenticate. Otherwise only anonymous access is enabled'], - ['administration_configuration_wizard_configuration_custom_connections', 'Enable custom connections'], - ['administration_configuration_wizard_configuration_custom_connections_description', 'Allows users to create custom connections. Otherwise only administrator can create connections'], - ['administration_configuration_wizard_configuration_navigator', 'Navigator'], - ['administration_configuration_wizard_configuration_navigator_hide_folders', 'Hide Folders'], - ['administration_configuration_wizard_configuration_navigator_hide_schemas', 'Hide Schemas'], - ['administration_configuration_wizard_configuration_navigator_hide_virtual_model', 'Hide Virtual Model'], - ['administration_configuration_wizard_configuration_navigator_merge_entities', 'Merge Entities'], - ['administration_configuration_wizard_configuration_navigator_show_only_entities', 'Only Entities'], - ['administration_configuration_wizard_configuration_navigator_show_system_objects', 'System Objects'], - ['administration_configuration_wizard_configuration_navigator_show_utility_objects', 'Utility Objects'], - ['administration_configuration_wizard_finish', 'Confirmation'], - ['administration_configuration_wizard_finish_step_description', 'Confirmation'], - ['administration_configuration_wizard_finish_title', 'That is almost it.'], - ['administration_configuration_wizard_finish_message', 'Press the Finish button to complete the server configuration. You can return to the previous pages if you want to change or add something.\nWhen the configuration is completed all entered settings will be applied for your CloudBeaver server. You will be redirected to the main page to start working.\nYou can always login to the system as administrator to change the server settings.'], ]; diff --git a/webapp/packages/core-administration/src/locales/ru.ts b/webapp/packages/core-administration/src/locales/ru.ts index aec529264e..4a94c397e9 100644 --- a/webapp/packages/core-administration/src/locales/ru.ts +++ b/webapp/packages/core-administration/src/locales/ru.ts @@ -1,4 +1,5 @@ export default [ ['administration_menu_enter', 'Администрирование'], ['administration_menu_back', 'Вернуться в приложение'], + ['administration_configuration_wizard_title', 'Начальная настройка сервера'], ]; diff --git a/webapp/packages/core-app/public/icons/icons.svg b/webapp/packages/core-app/public/icons/icons.svg index 9026fc15a9..574a8579bb 100644 --- a/webapp/packages/core-app/public/icons/icons.svg +++ b/webapp/packages/core-app/public/icons/icons.svg @@ -89,6 +89,14 @@ + + + + + + + + diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/DriverProperties/DriverPropertiesController.ts b/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/DriverProperties/DriverPropertiesController.ts index 4ee2163a5a..784b8f10df 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/DriverProperties/DriverPropertiesController.ts +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/DriverProperties/DriverPropertiesController.ts @@ -49,7 +49,7 @@ export class DriverPropertiesController implements IInitializableController { id: uuid(), key: key ?? 'property', defaultValue: value ?? '', - new: !key, + new: !key }); }; @@ -63,10 +63,10 @@ export class DriverPropertiesController implements IInitializableController { this.driverProperties = observable(driverProperties.map(property => ({ id: property.id!, key: property.id!, - displayName: property.displayName!, + displayName: property.displayName, defaultValue: property.defaultValue, description: property.description, - validValues: property.validValues, + validValues: property.validValues }))); for (const key of Object.keys(this.state)) { diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministration.tsx b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministration.tsx index 5c8fd957d8..2a01eda8a1 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministration.tsx +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministration.tsx @@ -73,11 +73,11 @@ const styles = composes( ` ); -export const ConnectionsAdministration = observer(function ConnectionsAdministration({ +export const ConnectionsAdministration: React.FC = observer(function ConnectionsAdministration({ sub, param, - configurationWizard, -}: AdministrationItemContentProps) { + configurationWizard +}) { const controller = useController(ConnectionsAdministrationController); return styled(useStyles(styles))( diff --git a/webapp/packages/core-sdk/src/queries/session/serverConfig.gql b/webapp/packages/core-sdk/src/queries/session/serverConfig.gql index 1315778c05..3e40a5f917 100644 --- a/webapp/packages/core-sdk/src/queries/session/serverConfig.gql +++ b/webapp/packages/core-sdk/src/queries/session/serverConfig.gql @@ -6,6 +6,7 @@ query serverConfig { supportsCustomConnections supportsConnectionBrowser supportsWorkspaces + sessionExpireTime anonymousAccessEnabled authenticationEnabled diff --git a/webapp/packages/core-sdk/src/sdk.ts b/webapp/packages/core-sdk/src/sdk.ts index 90c60e48d7..8531da7b7d 100644 --- a/webapp/packages/core-sdk/src/sdk.ts +++ b/webapp/packages/core-sdk/src/sdk.ts @@ -439,6 +439,7 @@ export interface ServerConfig { supportsCustomConnections?: Maybe; supportsConnectionBrowser?: Maybe; supportsWorkspaces?: Maybe; + sessionExpireTime?: Maybe; configurationMode?: Maybe; developmentMode?: Maybe; supportedLanguages: ServerLanguage[]; @@ -773,6 +774,7 @@ export interface ServerConfigInput { anonymousAccessEnabled?: Maybe; authenticationEnabled?: Maybe; customConnectionsEnabled?: Maybe; + sessionExpireTime?: Maybe; } export enum AuthCredentialEncryption { @@ -1337,7 +1339,7 @@ export type ServerConfigQueryVariables = Exact<{ [key: string]: never }>; export interface ServerConfigQuery { serverConfig: ( - Pick + Pick & { supportedLanguages: Array>; defaultNavigatorSettings: Pick } ); } @@ -2202,6 +2204,7 @@ export const ServerConfigDocument = ` supportsCustomConnections supportsConnectionBrowser supportsWorkspaces + sessionExpireTime anonymousAccessEnabled authenticationEnabled configurationMode diff --git a/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationForm.tsx b/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationForm.tsx index 315c601a63..6f6f032fb7 100644 --- a/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationForm.tsx +++ b/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationForm.tsx @@ -51,17 +51,19 @@ interface Props { serverConfig: ServerConfigInput; validationTask?: IExecutor; editing?: boolean; + className?: string; onChange: () => void; onSubmit: () => void; } -export const ServerConfigurationForm = observer(function ServerConfigurationForm({ +export const ServerConfigurationForm: React.FC = observer(function ServerConfigurationForm({ serverConfig, validationTask, editing, + className, onChange, onSubmit, -}: Props) { +}) { const translate = useTranslate(); const [focusedRef] = useFocus({ focusFirstChild: true }); @@ -80,7 +82,7 @@ export const ServerConfigurationForm = observer(function ServerConfigurationForm }, [validationTask]); return styled(useStyles(formStyles, boxStyles))( - + @@ -98,37 +100,47 @@ export const ServerConfigurationForm = observer(function ServerConfigurationForm {translate('administration_configuration_wizard_configuration_server_name')} - {editing - ? - : ( - <> - - {translate('administration_configuration_wizard_configuration_admin')} - - - {translate('administration_configuration_wizard_configuration_admin_name')} - - - {translate('administration_configuration_wizard_configuration_admin_password')} - - - )} + + + {translate('administration_configuration_wizard_configuration_server_session_expire_time')} + + + {!editing && ( + <> + + {translate('administration_configuration_wizard_configuration_admin')} + + + {translate('administration_configuration_wizard_configuration_admin_name')} + + + {translate('administration_configuration_wizard_configuration_admin_password')} + + + )} diff --git a/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationPage.tsx b/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationPage.tsx index 697f099fd6..31c63622ec 100644 --- a/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationPage.tsx +++ b/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationPage.tsx @@ -9,6 +9,8 @@ import { observer } from 'mobx-react'; import styled, { use, css } from 'reshadow'; +import { AdministrationTools } from '@cloudbeaver/core-administration'; +import { IconButton } from '@cloudbeaver/core-blocks'; import { useController, useService } from '@cloudbeaver/core-di'; import { useTranslate } from '@cloudbeaver/core-localization'; import { useStyles, composes } from '@cloudbeaver/core-theming'; @@ -19,13 +21,13 @@ import { ServerConfigurationService } from './ServerConfigurationService'; const styles = composes( css` - layout-grid-cell { - composes: theme-background-surface theme-text-on-surface from global; - } + AdministrationTools, layout-grid-cell { + composes: theme-background-surface theme-text-on-surface theme-border-color-background from global; + } - layout-grid-cell { - composes: theme-border-color-background from global; - } + layout-grid-cell, message-box { + composes: theme-border-color-background from global; + } `, css` layout-grid { @@ -40,7 +42,27 @@ const styles = composes( layout-grid-cell { position: relative; border: solid 1px; - padding: 16px 24px + } + + message-box, AdministrationTools { + border-bottom: solid 1px; + } + + message-box, ServerConfigurationForm { + padding: 16px 24px; + } + + AdministrationTools { + display: flex; + padding: 0 16px; + align-items: center; + border-bottom: solid 1px; + } + + IconButton { + height: 32px; + width: 32px; + margin-right: 16px; } p { @@ -58,11 +80,16 @@ export const ServerConfigurationPage = observer(function ServerConfigurationPage - {!controller.editing && ( - <> + {!controller.editing ? ( +

{translate('administration_configuration_wizard_configuration_title')}

{translate('administration_configuration_wizard_configuration_message')}

- +
+ ) : ( + + + + )} { + this.serverConfigurationService.loadConfig(); + }; + onChange = (): void => { if (!this.state.serverConfig.authenticationEnabled) { this.state.serverConfig.anonymousAccessEnabled = true; diff --git a/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationService.ts b/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationService.ts index 2ee2617602..d7484a2e97 100644 --- a/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationService.ts +++ b/webapp/packages/plugin-administration/src/ConfigurationWizard/ServerConfiguration/ServerConfigurationService.ts @@ -6,6 +6,8 @@ * you may not use this file except in compliance with the License. */ +import { observable } from 'mobx'; + import { AdministrationScreenService } from '@cloudbeaver/core-administration'; import { UsersResource } from '@cloudbeaver/core-authentication'; import { injectable } from '@cloudbeaver/core-di'; @@ -23,8 +25,7 @@ export interface IValidationStatusContext { @injectable() export class ServerConfigurationService { - - state: IServerConfigurationPageState; + @observable state: IServerConfigurationPageState; readonly validationTask: IExecutor; constructor( @@ -37,7 +38,7 @@ export class ServerConfigurationService { this.state = this.administrationScreenService .getItemState( 'server-configuration', - () => this.getConfig(), + () => this.getConfig() ); this.validationTask = new Executor(); } @@ -85,7 +86,12 @@ export class ServerConfigurationService { try { await this.graphQLService.sdk.setDefaultNavigatorSettings({ settings: this.state.navigatorConfig }); - await this.graphQLService.sdk.configureServer({ configuration: this.state.serverConfig }); + await this.graphQLService.sdk.configureServer({ + configuration: { + ...this.state.serverConfig, + sessionExpireTime: (this.state.serverConfig.sessionExpireTime ?? 30) * 1000 * 60, + }, + }); if (!this.serverConfigResource.data?.configurationMode) { await this.serverConfigResource.refresh(null); @@ -102,6 +108,9 @@ export class ServerConfigurationService { if (!this.state?.serverConfig.serverName) { return false; } + if ((this.state.serverConfig.sessionExpireTime ?? 0) < 1) { + return false; + } if (this.administrationScreenService.isConfigurationMode) { if (!this.state.serverConfig.adminName || this.state.serverConfig.adminName.length < 6 @@ -123,6 +132,7 @@ export class ServerConfigurationService { anonymousAccessEnabled: true, authenticationEnabled: false, customConnectionsEnabled: false, + sessionExpireTime: 30, }, navigatorConfig: { hideFolders: false, @@ -142,6 +152,7 @@ export class ServerConfigurationService { anonymousAccessEnabled: config.anonymousAccessEnabled, authenticationEnabled: config.authenticationEnabled, customConnectionsEnabled: config.supportsCustomConnections, + sessionExpireTime: (config.sessionExpireTime ?? 1800000) / 1000 / 60, }, navigatorConfig: { hideFolders: false, @@ -154,5 +165,4 @@ export class ServerConfigurationService { }, }; } - } diff --git a/webapp/packages/plugin-administration/src/LocaleService.ts b/webapp/packages/plugin-administration/src/LocaleService.ts new file mode 100644 index 0000000000..63ab3fb719 --- /dev/null +++ b/webapp/packages/plugin-administration/src/LocaleService.ts @@ -0,0 +1,32 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { Bootstrap, injectable } from '@cloudbeaver/core-di'; +import { LocalizationService } from '@cloudbeaver/core-localization'; + +@injectable() +export class LocaleService extends Bootstrap { + constructor(private localizationService: LocalizationService) { + super(); + } + + register(): void | Promise { + this.localizationService.addProvider(this.provider.bind(this)); + } + + load(): void | Promise { } + + private async provider(locale: string) { + switch (locale) { + case 'ru': + return (await import('./locales/ru')).default; + default: + return (await import('./locales/en')).default; + } + } +} diff --git a/webapp/packages/plugin-administration/src/locales/en.ts b/webapp/packages/plugin-administration/src/locales/en.ts new file mode 100644 index 0000000000..b73ff213d3 --- /dev/null +++ b/webapp/packages/plugin-administration/src/locales/en.ts @@ -0,0 +1,36 @@ +export default [ + ['administration_configuration_wizard_welcome', 'Welcome'], + ['administration_configuration_wizard_welcome_step_description', 'Welcome to CloudBeaver'], + ['administration_configuration_wizard_welcome_title', 'Welcome to CloudBeaver, cloud database management system!'], + ['administration_configuration_wizard_welcome_message', 'The easy configuration wizard will guide you through several simple steps to set up the CloudBeaver server. You will need to set server information and administrator credentials. You can also add first database connections here.'], + ['administration_configuration_wizard_welcome_note', 'Note: you will be able to change these configuration parameters later on the administration panel.'], + ['administration_configuration_wizard_configuration', 'Server configuration'], + ['administration_configuration_wizard_configuration_step_description', 'Main server configuration'], + ['administration_configuration_wizard_configuration_title', 'You can configure the main server parameters here.'], + ['administration_configuration_wizard_configuration_message', 'Administrator is a super user who can configure server, set databases connections, manage other users and much more. Please, remember the entered password. It is not possible to recover administrator password automatically.'], + ['administration_configuration_wizard_configuration_plugins', 'Configuration'], + ['administration_configuration_wizard_configuration_server_info', 'Server Info'], + ['administration_configuration_wizard_configuration_server_name', 'Server Name'], + ['administration_configuration_wizard_configuration_server_session_expire_time', 'Session Expire Time'], + ['administration_configuration_wizard_configuration_admin', 'Administrator'], + ['administration_configuration_wizard_configuration_admin_name', 'Admin user name'], + ['administration_configuration_wizard_configuration_admin_password', 'Admin password'], + ['administration_configuration_wizard_configuration_anonymous_access', 'Allow anonymous access'], + ['administration_configuration_wizard_configuration_anonymous_access_description', 'Allows to work with CloudBeaver without user authentication'], + ['administration_configuration_wizard_configuration_authentication', 'Enable users authentication'], + ['administration_configuration_wizard_configuration_authentication_description', 'Allows users to authenticate. Otherwise only anonymous access is enabled'], + ['administration_configuration_wizard_configuration_custom_connections', 'Enable custom connections'], + ['administration_configuration_wizard_configuration_custom_connections_description', 'Allows users to create custom connections. Otherwise only administrator can create connections'], + ['administration_configuration_wizard_configuration_navigator', 'Navigator'], + ['administration_configuration_wizard_configuration_navigator_hide_folders', 'Hide Folders'], + ['administration_configuration_wizard_configuration_navigator_hide_schemas', 'Hide Schemas'], + ['administration_configuration_wizard_configuration_navigator_hide_virtual_model', 'Hide Virtual Model'], + ['administration_configuration_wizard_configuration_navigator_merge_entities', 'Merge Entities'], + ['administration_configuration_wizard_configuration_navigator_show_only_entities', 'Only Entities'], + ['administration_configuration_wizard_configuration_navigator_show_system_objects', 'System Objects'], + ['administration_configuration_wizard_configuration_navigator_show_utility_objects', 'Utility Objects'], + ['administration_configuration_wizard_finish', 'Confirmation'], + ['administration_configuration_wizard_finish_step_description', 'Confirmation'], + ['administration_configuration_wizard_finish_title', 'That is almost it.'], + ['administration_configuration_wizard_finish_message', 'Press the Finish button to complete the server configuration. You can return to the previous pages if you want to change or add something.\nWhen the configuration is completed all entered settings will be applied for your CloudBeaver server. You will be redirected to the main page to start working.\nYou can always login to the system as administrator to change the server settings.'], +]; diff --git a/webapp/packages/plugin-administration/src/locales/ru.ts b/webapp/packages/plugin-administration/src/locales/ru.ts new file mode 100644 index 0000000000..9f25cb126f --- /dev/null +++ b/webapp/packages/plugin-administration/src/locales/ru.ts @@ -0,0 +1,2 @@ +export default [ +]; diff --git a/webapp/packages/plugin-administration/src/manifest.ts b/webapp/packages/plugin-administration/src/manifest.ts index fcb0980424..d3fe26283d 100644 --- a/webapp/packages/plugin-administration/src/manifest.ts +++ b/webapp/packages/plugin-administration/src/manifest.ts @@ -10,6 +10,7 @@ import { PluginManifest } from '@cloudbeaver/core-di'; import { ConfigurationWizardPagesBootstrapService } from './ConfigurationWizard/ConfigurationWizardPagesBootstrapService'; import { ServerConfigurationService } from './ConfigurationWizard/ServerConfiguration/ServerConfigurationService'; +import { LocaleService } from './LocaleService'; export const manifest: PluginManifest = { info: { @@ -19,5 +20,6 @@ export const manifest: PluginManifest = { providers: [ ServerConfigurationService, ConfigurationWizardPagesBootstrapService, + LocaleService, ], };