diff --git a/contrib/docker/docker-compose.prod.singledomain.yaml b/contrib/docker/docker-compose.prod.singledomain.yaml index db1b2164..398d2051 100644 --- a/contrib/docker/docker-compose.prod.singledomain.yaml +++ b/contrib/docker/docker-compose.prod.singledomain.yaml @@ -52,7 +52,8 @@ services: TURN_PASSWORD: "$TURN_PASSWORD" TURN_SERVER: "$TURN_SERVER" TURN_USER: "$TURN_USER" - MAX_PER_GROUP: "$MAX_PER_GROUP" + MAX_PER_GROUP: $MAX_PER_GROUP + MAX_USERNAME_LENGTH: $MAX_USERNAME_LENGTH labels: - "traefik.http.routers.front.rule=Host(`${BASE_DOMAIN}`) && PathPrefix(`/`)" - "traefik.http.routers.front.entryPoints=web,websecure" diff --git a/front/Dockerfile b/front/Dockerfile index aa050936..7db25c60 100644 --- a/front/Dockerfile +++ b/front/Dockerfile @@ -30,6 +30,8 @@ ARG STUN_SERVER ARG TURN_SERVER ARG TURN_USER ARG TURN_PASSWORD +ARG MAX_USERNAME_LENGTH +ARG MAX_PER_GROUP COPY front . COPY --from=builder /usr/src/generated src/Messages/generated @@ -50,7 +52,8 @@ ARG UPLOADER_URL=uploader.$BASE_DOMAIN RUN ./templater.sh RUN API_URL=$API_URL UPLOADER_URL=$UPLOADER_URL ADMIN_URL=$ADMIN_URL START_ROOM_URL=$START_ROOM_URL \ JITSI_URL=$JITSI_URL JITSI_PRIVATE_MODE=$JITSI_PRIVATE_MODE \ - STUN_SERVER=$STUN_SERVER TURN_SERVER=$TURN_SERVER TURN_USER=$TURN_USER TURN_PASSWORD=$TURN_PASSWORD \ + STUN_SERVER=$STUN_SERVER TURN_SERVER=$TURN_SERVER TURN_USER=$TURN_USER \ + TURN_PASSWORD=$TURN_PASSWORD MAX_USERNAME_LENGTH=$MAX_USERNAME_LENGTH MAX_PER_GROUP=$MAX_PER_GROUP \ yarn run build # final production image diff --git a/front/src/Connexion/LocalUser.ts b/front/src/Connexion/LocalUser.ts index 0793a938..8ead6eb0 100644 --- a/front/src/Connexion/LocalUser.ts +++ b/front/src/Connexion/LocalUser.ts @@ -7,10 +7,8 @@ export interface CharacterTexture { rights: string } -export const maxUserNameLength: number = MAX_USERNAME_LENGTH; - export function isUserNameValid(value: string): boolean { - const regexp = new RegExp('^[A-Za-z0-9]{1,'+maxUserNameLength+'}$'); + const regexp = new RegExp('^[A-Za-z0-9\-\+\?\_\&\!]{1,'+MAX_USERNAME_LENGTH+'}$'); return regexp.test(value); } diff --git a/front/src/Enum/EnvironmentVariable.ts b/front/src/Enum/EnvironmentVariable.ts index 85b63335..47fe0a30 100644 --- a/front/src/Enum/EnvironmentVariable.ts +++ b/front/src/Enum/EnvironmentVariable.ts @@ -12,8 +12,8 @@ const JITSI_URL : string|undefined = (process.env.JITSI_URL === '') ? undefined const JITSI_PRIVATE_MODE : boolean = process.env.JITSI_PRIVATE_MODE == "true"; const POSITION_DELAY = 200; // Wait 200ms between sending position events const MAX_EXTRAPOLATION_TIME = 100; // Extrapolate a maximum of 250ms if no new movement is sent by the player -export const MAX_USERNAME_LENGTH = parseInt(process.env.MAX_USERNAME_LENGTH || '') || 8; -export const MAX_PER_GROUP = parseInt(process.env.MAX_PER_GROUP || '4'); +const MAX_USERNAME_LENGTH = parseInt(process.env.MAX_USERNAME_LENGTH || '8'); +const MAX_PER_GROUP = parseInt(process.env.MAX_PER_GROUP || '4'); export const isMobile = ():boolean => ( ( window.innerWidth <= 800 ) || ( window.innerHeight <= 600 ) ); @@ -31,5 +31,7 @@ export { TURN_USER, TURN_PASSWORD, JITSI_URL, - JITSI_PRIVATE_MODE + JITSI_PRIVATE_MODE, + MAX_USERNAME_LENGTH, + MAX_PER_GROUP } diff --git a/front/src/Phaser/Login/LoginScene.ts b/front/src/Phaser/Login/LoginScene.ts index 435592f2..dfbb582d 100644 --- a/front/src/Phaser/Login/LoginScene.ts +++ b/front/src/Phaser/Login/LoginScene.ts @@ -4,6 +4,7 @@ import {ResizableScene} from "./ResizableScene"; import { localUserStore } from "../../Connexion/LocalUserStore"; import {MenuScene} from "../Menu/MenuScene"; import { isUserNameValid } from "../../Connexion/LocalUser"; +import { MAX_USERNAME_LENGTH } from "../../Enum/EnvironmentVariable"; export const LoginSceneName = "LoginScene"; @@ -35,7 +36,7 @@ export class LoginScene extends ResizableScene { inputElement.value = localUserStore.getName() ?? ''; inputElement.focus(); inputElement.addEventListener('keypress', (event: KeyboardEvent) => { - if(inputElement.value.length > 7){ + if(inputElement.value.length >= MAX_USERNAME_LENGTH){ event.preventDefault(); return; } diff --git a/front/tests/Phaser/Connexion/LocalUserTest.ts b/front/tests/Phaser/Connexion/LocalUserTest.ts index 25b54005..8eef3618 100644 --- a/front/tests/Phaser/Connexion/LocalUserTest.ts +++ b/front/tests/Phaser/Connexion/LocalUserTest.ts @@ -1,5 +1,6 @@ import "jasmine"; -import {areCharacterLayersValid, isUserNameValid, maxUserNameLength} from "../../../src/Connexion/LocalUser"; +import {areCharacterLayersValid, isUserNameValid} from "../../../src/Connexion/LocalUser"; +import {MAX_USERNAME_LENGTH} from "../../../src/Enum/EnvironmentVariable"; describe("isUserNameValid()", () => { it("should validate name with letters", () => { @@ -11,7 +12,7 @@ describe("isUserNameValid()", () => { }); it("should not validate string with too many letters", () => { let testString = ''; - for (let i = 0; i < maxUserNameLength + 2; i++) { + for (let i = 0; i < MAX_USERNAME_LENGTH + 2; i++) { testString += 'a'; } expect(isUserNameValid(testString)).toBe(false);