From fccc1084791ca5632c37f95ea6048f4157228e6e Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Thu, 14 Aug 2025 21:52:39 +0200 Subject: [PATCH] chore: align utils implementation MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- .../ui-server/AbstractUIServer.ts | 30 +++++++++---------- src/worker/WorkerUtils.ts | 8 +++-- ui/web/src/composables/Utils.ts | 4 ++- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/charging-station/ui-server/AbstractUIServer.ts b/src/charging-station/ui-server/AbstractUIServer.ts index 2795570d..74bb3ad0 100644 --- a/src/charging-station/ui-server/AbstractUIServer.ts +++ b/src/charging-station/ui-server/AbstractUIServer.ts @@ -19,7 +19,7 @@ import { type ResponsePayload, type UIServerConfiguration, } from '../../types/index.js' -import { logger } from '../../utils/index.js' +import { isEmpty, logger } from '../../utils/index.js' import { UIServiceFactory } from './ui-services/UIServiceFactory.js' import { getUsernameAndPasswordFromAuthorizationToken } from './UIServerUtils.js' @@ -105,25 +105,23 @@ export abstract class AbstractUIServer { for (const uiService of this.uiServices.values()) { uiService.stop() } + this.uiServices.clear() + this.responseHandlers.clear() this.clearCaches() } protected authenticate (req: IncomingMessage, next: (err?: Error) => void): void { - const authorizationError = new BaseError('Unauthorized') - if (this.isBasicAuthEnabled()) { - if (!this.isValidBasicAuth(req, next)) { - next(authorizationError) - } + if (this.uiServerConfiguration.authentication?.enabled !== true) { next() + return + } + let ok = false + if (this.isBasicAuthEnabled()) { + ok = this.isValidBasicAuth(req, next) } else if (this.isProtocolBasicAuthEnabled()) { - if (!this.isValidProtocolBasicAuth(req, next)) { - next(authorizationError) - } - next() - } else if (this.uiServerConfiguration.authentication?.enabled === true) { - next(authorizationError) + ok = this.isValidProtocolBasicAuth(req, next) } - next() + next(ok ? undefined : new BaseError('Unauthorized')) } protected registerProtocolVersionUIService (version: ProtocolVersion): void { @@ -172,9 +170,11 @@ export abstract class AbstractUIServer { private isValidProtocolBasicAuth (req: IncomingMessage, next: (err?: Error) => void): boolean { const authorizationProtocol = req.headers['sec-websocket-protocol']?.split(/,\s+/).pop() + if (authorizationProtocol == null || isEmpty(authorizationProtocol)) { + return false + } const usernameAndPassword = getUsernameAndPasswordFromAuthorizationToken( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/restrict-template-expressions - `${authorizationProtocol}${Array(((4 - (authorizationProtocol!.length % 4)) % 4) + 1).join( + `${authorizationProtocol}${Array(((4 - (authorizationProtocol.length % 4)) % 4) + 1).join( '=' )}` .split('.') diff --git a/src/worker/WorkerUtils.ts b/src/worker/WorkerUtils.ts index 958ecccc..b982cf05 100644 --- a/src/worker/WorkerUtils.ts +++ b/src/worker/WorkerUtils.ts @@ -2,9 +2,11 @@ import chalk from 'chalk' import { getRandomValues } from 'node:crypto' export const sleep = async (milliSeconds: number): Promise => { - return await new Promise(resolve => - setTimeout(resolve as () => void, milliSeconds) - ) + return await new Promise(resolve => { + const timeout = setTimeout(() => { + resolve(timeout) + }, milliSeconds) + }) } export const defaultExitHandler = (code: number): void => { diff --git a/ui/web/src/composables/Utils.ts b/ui/web/src/composables/Utils.ts index d34749e4..fef01713 100644 --- a/ui/web/src/composables/Utils.ts +++ b/ui/web/src/composables/Utils.ts @@ -61,7 +61,9 @@ export const randomUUID = (): `${string}-${string}-${string}-${string}-${string} export const validateUUID = ( uuid: `${string}-${string}-${string}-${string}-${string}` ): uuid is `${string}-${string}-${string}-${string}-${string}` => { - return /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(uuid) + return /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/.test( + uuid + ) } export const useUIClient = (): UIClient => { -- 2.43.0