isNotEmptyString,
logger,
sleep,
+ truncateId,
} from '../../../utils/index.js'
import { OCPPConstants } from '../OCPPConstants.js'
import { OCPPIncomingRequestService } from '../OCPPIncomingRequestService.js'
`${chargingStation.logPrefix()} ${moduleName}.handleRequestRemoteStartTransaction: Remote start transaction REJECTED on ${
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
chargingStation.stationInfo?.chargingStationId
- }, idTag '${commandPayload.idTag}': no available connector found`
+ }, idTag '${truncateId(commandPayload.idTag)}': no available connector found`
)
return OCPP16Constants.OCPP_RESPONSE_REJECTED
}
ReservationTerminationReason,
type ResponseHandler,
} from '../../../types/index.js'
-import { Constants, convertToInt, logger } from '../../../utils/index.js'
+import { Constants, convertToInt, logger, truncateId } from '../../../utils/index.js'
import { OCPPResponseService } from '../OCPPResponseService.js'
import { OCPP16ServiceUtils } from './OCPP16ServiceUtils.js'
authorizeConnectorStatus.idTagAuthorized = false
delete authorizeConnectorStatus.authorizeIdTag
logger.debug(
- `${chargingStation.logPrefix()} ${moduleName}.handleResponseAuthorize: idTag '${
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseAuthorize: idTag '${truncateId(
requestPayload.idTag
- }' rejected with status '${payload.idTagInfo.status}'`
+ )}' rejected with status '${payload.idTagInfo.status}'`
)
}
} else {
if (reservation != null) {
if (reservation.idTag !== requestPayload.idTag) {
logger.warn(
- `${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Reserved transaction ${payload.transactionId.toString()} started with a different idTag ${
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Reserved transaction ${payload.transactionId.toString()} started with a different idTag ${truncateId(
requestPayload.idTag
- } than the reservation one ${reservation.idTag}`
+ )} than the reservation one ${truncateId(reservation.idTag)}`
)
}
if (hasReservationExpired(reservation)) {
`${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Transaction with id ${payload.transactionId.toString()} STARTED on ${
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
chargingStation.stationInfo?.chargingStationId
- }#${connectorId.toString()} for idTag '${requestPayload.idTag}'`
+ }#${connectorId.toString()} for idTag '${truncateId(requestPayload.idTag)}'`
)
if (chargingStation.stationInfo?.powerSharedByConnectors === true) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
`${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Starting transaction with id ${payload.transactionId.toString()} REJECTED on ${
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
chargingStation.stationInfo?.chargingStationId
- }#${connectorId.toString()} with status '${payload.idTagInfo.status}', idTag '${
+ }#${connectorId.toString()} with status '${payload.idTagInfo.status}', idTag '${truncateId(
requestPayload.idTag
- }'${
+ )}'${
OCPP16ServiceUtils.hasReservation(chargingStation, connectorId, requestPayload.idTag)
? // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
`, reservationId '${requestPayload.reservationId?.toString()}'`
StandardParametersKey,
} from '../../../../types/index.js'
import { OCPPVersion } from '../../../../types/ocpp/OCPPVersion.js'
-import { logger } from '../../../../utils/index.js'
+import { logger, truncateId } from '../../../../utils/index.js'
import {
AuthContext,
AuthenticationMethod,
try {
logger.debug(
- `${this.chargingStation.logPrefix()} ${moduleName}.${methodName}: Authorizing identifier ${identifier.value} via OCPP 1.6`
+ `${this.chargingStation.logPrefix()} ${moduleName}.${methodName}: Authorizing identifier ${truncateId(identifier.value)} via OCPP 1.6`
)
// Mark connector as authorizing if provided
OCPP20TriggerReasonEnumType,
} from '../../../../types/ocpp/2.0/Transaction.js'
import { OCPPVersion } from '../../../../types/ocpp/OCPPVersion.js'
-import { logger } from '../../../../utils/index.js'
+import { logger, truncateId } from '../../../../utils/index.js'
import {
AuthContext,
AuthenticationMethod,
try {
logger.debug(
- `${this.chargingStation.logPrefix()} ${moduleName}.${methodName}: Authorizing identifier ${identifier.value} via OCPP 2.0 TransactionEvent`
+ `${this.chargingStation.logPrefix()} ${moduleName}.${methodName}: Authorizing identifier ${truncateId(identifier.value)} via OCPP 2.0 TransactionEvent`
)
// Check if remote authorization is configured
this.metrics.totalRequests++
logger.debug(
- `${this.chargingStation.logPrefix()} ${moduleName}.authenticate: Starting authentication for identifier: ${JSON.stringify(request.identifier)}`
+ `${this.chargingStation.logPrefix()} ${moduleName}.authenticate: Starting authentication for identifier: ${truncateId(request.identifier.value)}`
)
// Try each strategy in priority order
*/
public invalidateCache (identifier: UnifiedIdentifier): void {
logger.debug(
- `${this.chargingStation.logPrefix()} ${moduleName}.invalidateCache: Invalidating cache for identifier: ${identifier.value}`
+ `${this.chargingStation.logPrefix()} ${moduleName}.invalidateCache: Invalidating cache for identifier: ${truncateId(identifier.value)}`
)
// Invalidate in local strategy
if (localStrategy) {
localStrategy.invalidateCache(identifier.value)
logger.info(
- `${this.chargingStation.logPrefix()} ${moduleName}.invalidateCache: Cache invalidated for identifier: ${identifier.value}`
+ `${this.chargingStation.logPrefix()} ${moduleName}.invalidateCache: Cache invalidated for identifier: ${truncateId(identifier.value)}`
)
} else {
logger.debug(
try {
logger.debug(
- `${moduleName}: Authenticating ${request.identifier.value} for ${request.context}`
+ `${moduleName}: Authenticating ${truncateId(request.identifier.value)} for ${request.context}`
)
// 1. Try local authorization list first (highest priority)
}
}
- logger.debug(`${moduleName}: No local authorization found for ${request.identifier.value}`)
+ logger.debug(
+ `${moduleName}: No local authorization found for ${truncateId(request.identifier.value)}`
+ )
return undefined
} catch (error) {
const errorMessage = getErrorMessage(error)
} from '../interfaces/OCPPAuthService.js'
import type { AuthConfiguration, AuthorizationResult, AuthRequest } from '../types/AuthTypes.js'
-import { ensureError, getErrorMessage, logger } from '../../../../utils/index.js'
+import { ensureError, getErrorMessage, logger, truncateId } from '../../../../utils/index.js'
import {
AuthenticationError,
AuthenticationMethod,
try {
logger.debug(
- `${moduleName}: Authenticating ${request.identifier.value.substring(0, 8)}... via CSMS for ${request.context}`
+ `${moduleName}: Authenticating ${truncateId(request.identifier.value)} via CSMS for ${request.context}`
)
// Get appropriate adapter for OCPP version
const isInLocalList = await this.localAuthListManager.getEntry(request.identifier.value)
if (isInLocalList) {
logger.debug(
- `${moduleName}: Skipping cache for local list identifier: ${request.identifier.value.substring(0, 8)}...`
+ `${moduleName}: Skipping cache for local list identifier: ${truncateId(request.identifier.value)}`
)
} else {
this.cacheResult(
}
logger.debug(
- `${moduleName}: No remote authorization result for ${request.identifier.value.substring(0, 8)}...`
+ `${moduleName}: No remote authorization result for ${truncateId(request.identifier.value)}`
)
return undefined
} catch (error) {
const cacheTtl = ttl ?? result.cacheTtl ?? 300 // Default 5 minutes
this.authCache.set(identifier, result, cacheTtl)
logger.debug(
- `${moduleName}: Cached result for ${identifier.substring(0, 8)}... (TTL: ${String(cacheTtl)}s)`
+ `${moduleName}: Cached result for ${truncateId(identifier)} (TTL: ${String(cacheTtl)}s)`
)
} catch (error) {
const errorMessage = getErrorMessage(error)
UnifiedIdentifier,
} from '../types/AuthTypes.js'
+import { truncateId } from '../../../../utils/index.js'
import { AuthorizationStatus } from '../types/AuthTypes.js'
/**
- * Compute remaining TTL in seconds from an expiry date.
* @param expiryDate - Expiry timestamp to compute TTL from
* @returns TTL in seconds, or undefined if already expired or no date provided
*/
* @returns Formatted error string with truncated identifier
*/
function formatAuthError (error: Error, identifier: UnifiedIdentifier): string {
- const identifierValue = identifier.value.substring(0, 8) + '...'
- return `Authentication failed for identifier ${identifierValue} (${identifier.type}): ${error.message}`
+ return `Authentication failed for identifier ${truncateId(identifier.value)} (${identifier.type}): ${error.message}`
}
/**
const message = AuthHelpers.formatAuthError(error, identifier)
- assert.ok(message.includes('SHORT...'))
+ assert.ok(message.includes('SHORT'))
+ assert.ok(!message.includes('SHORT...'))
assert.ok(message.includes('Local'))
assert.ok(message.includes('Invalid format'))
})