From 3dcb3dbd5a08384dfc52340c3ae41acda2ea5928 Mon Sep 17 00:00:00 2001 From: JulienM Date: Tue, 14 Nov 2023 17:28:55 +0100 Subject: [PATCH] fix(tenant): tenant name can't exceed db limit --- src/api/controller/rootAdmin.js | 10 ++++++-- src/app/js/root-admin/CreateTenantDialog.js | 9 +++++-- src/app/js/root-admin/NameField.js | 5 +++- src/app/js/root-admin/Tenants.js | 26 +++++++++++++++++---- src/common/tools/tenantTools.js | 12 ++++++++-- 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/api/controller/rootAdmin.js b/src/api/controller/rootAdmin.js index a875e17e9..ed5a27252 100644 --- a/src/api/controller/rootAdmin.js +++ b/src/api/controller/rootAdmin.js @@ -5,8 +5,11 @@ import jwt from 'koa-jwt'; import { auth } from 'config'; import { ObjectId } from 'mongodb'; import { createWorkerQueue, deleteWorkerQueue } from '../workers'; -import { ROOT_ROLE, checkForbiddenNames } from '../../common/tools/tenantTools'; - +import { + ROOT_ROLE, + checkForbiddenNames, + checkNameTooLong, +} from '../../common/tools/tenantTools'; import bullBoard from '../bullBoard'; import { insertConfigTenant } from '../services/configTenant'; @@ -51,6 +54,9 @@ const postTenant = async ctx => { if (tenantExists || checkForbiddenNames(name)) { ctx.status = 403; ctx.body = { error: `Invalid name: "${name}"` }; + } else if (checkNameTooLong(name)) { + ctx.status = 403; + ctx.body = { error: `Tenant name: "${name}" too long` }; } else { await ctx.tenantCollection.create({ name, diff --git a/src/app/js/root-admin/CreateTenantDialog.js b/src/app/js/root-admin/CreateTenantDialog.js index 03f0a9fb3..be65d2ba6 100644 --- a/src/app/js/root-admin/CreateTenantDialog.js +++ b/src/app/js/root-admin/CreateTenantDialog.js @@ -16,6 +16,8 @@ import NameField from './NameField'; import { checkForbiddenNames, forbiddenNamesMessage, + getTenantMaxSize, + MAX_DB_NAME_SIZE, } from '../../../common/tools/tenantTools'; const CreateTenantDialog = ({ isOpen, handleClose, createAction }) => { @@ -43,8 +45,11 @@ const CreateTenantDialog = ({ isOpen, handleClose, createAction }) => { > Le nom ne peut pas être {forbiddenNamesMessage}. Les majuscules ne sont pas autorisées. Seules les lettres, - chiffres et le tiret “-” sont autorisés. 50 caractères - maximum sont autorisés + chiffres et le tiret “-” sont autorisés.{' '} + {getTenantMaxSize(window.__DBNAME__)} caractères maximum + sont autorisés. (Le terme{' '} + {'"{non du container}_{nom de l\'instance}"'} ne doit + pas dépasser {MAX_DB_NAME_SIZE} caractères). diff --git a/src/app/js/root-admin/NameField.js b/src/app/js/root-admin/NameField.js index 1a077022c..1bdb56e85 100644 --- a/src/app/js/root-admin/NameField.js +++ b/src/app/js/root-admin/NameField.js @@ -2,6 +2,7 @@ import React, { forwardRef } from 'react'; import PropTypes from 'prop-types'; import { OutlinedInput } from '@mui/material'; import { IMaskInput } from 'react-imask'; +import { getTenantMaxSize } from '../../../common/tools/tenantTools'; const definitions = { '#': /[0-9ux*]/i, @@ -14,7 +15,9 @@ const TextMaskCustom = forwardRef(function TextMaskCustom(props, ref) { {...other} mask={[ { - mask: /^[a-z0-9-]{1,50}$/, + mask: new RegExp( + `^[a-z0-9-]{1,${getTenantMaxSize(window.__DBNAME__)}}$`, + ), definitions, }, ]} diff --git a/src/app/js/root-admin/Tenants.js b/src/app/js/root-admin/Tenants.js index 0016d542d..f63439cb8 100644 --- a/src/app/js/root-admin/Tenants.js +++ b/src/app/js/root-admin/Tenants.js @@ -235,11 +235,29 @@ const Tenants = ({ handleLogout }) => { // Define the columns for the datagrid const columns = [ { field: '_id', headerName: 'ID', width: 200 }, - { field: 'name', headerName: 'Nom', flex: 1 }, + { + field: 'name', + headerName: 'Nom', + flex: 4, + renderCell: params => { + return ( + + {params.value} + + ); + }, + }, { field: 'description', headerName: 'Description', - flex: 1, + flex: 4, valueFormatter: params => { return formatValue(params.value); }, @@ -261,7 +279,7 @@ const Tenants = ({ handleLogout }) => { { field: 'author', headerName: 'Auteur', - flex: 1, + flex: 2, valueFormatter: params => { return formatValue(params.value); }, @@ -269,7 +287,7 @@ const Tenants = ({ handleLogout }) => { { field: 'createdAt', headerName: 'Créée le', - flex: 1, + flex: 2, valueFormatter: params => { if (params.value == null) { return '-'; diff --git a/src/common/tools/tenantTools.js b/src/common/tools/tenantTools.js index bed34b913..0a09254fa 100644 --- a/src/common/tools/tenantTools.js +++ b/src/common/tools/tenantTools.js @@ -1,10 +1,18 @@ +import config from 'config'; export const DEFAULT_TENANT = 'default'; export const ROOT_ROLE = 'root'; export const ADMIN_ROLE = 'admin'; +export const MAX_DB_NAME_SIZE = 63; export const INVALID_NAMES = [ADMIN_ROLE, ROOT_ROLE, DEFAULT_TENANT, '']; -export const checkForbiddenNames = value => - INVALID_NAMES.includes(value) || value.length > 50; + +export const getTenantMaxSize = (dbName = config?.mongo?.dbName) => + MAX_DB_NAME_SIZE - dbName?.length - 1; + +export const checkForbiddenNames = value => INVALID_NAMES.includes(value); + +export const checkNameTooLong = value => value.length > getTenantMaxSize(); + export const forbiddenNamesMessage = INVALID_NAMES.filter(name => !!name) .map((name, index, list) => index === list.length - 1 ? `or "${name}"` : `"${name}"`,