import { OCPP20VariableManager } from '../../2.0/OCPP20VariableManager.js'
import {
GetVariableStatusEnumType,
- OCPP20AuthorizationStatusEnumType,
OCPP20IdTokenEnumType,
type OCPP20IdTokenType,
OCPP20RequestCommand,
AuthenticationMethod,
AuthorizationStatus,
IdentifierType,
+ mapOCPP20AuthorizationStatus,
mapToOCPP20Status,
} from '../types/AuthTypes.js'
}
}
- // Validate inputs
- if (connectorId == null) {
- logger.warn(
- `${this.chargingStation.logPrefix()} ${moduleName}.${methodName}: No connector specified for authorization`
- )
- return {
- additionalInfo: {
- error: 'Connector ID is required for OCPP 2.0 authorization',
- },
- isOffline: false,
- method: AuthenticationMethod.REMOTE_AUTHORIZATION,
- status: AuthorizationStatus.INVALID,
- timestamp: new Date(),
- }
- }
-
try {
const idToken = this.convertFromUnifiedIdentifier(identifier)
const cacheExpiryDateTime = response.idTokenInfo.cacheExpiryDateTime
// Map OCPP 2.0 authorization status to unified status
- const unifiedStatus = this.mapOCPP20AuthStatus(authStatus)
+ const unifiedStatus = mapOCPP20AuthorizationStatus(authStatus)
logger.debug(
`${this.chargingStation.logPrefix()} ${moduleName}.${methodName}: Authorization result for ${idToken.idToken}: ${authStatus} (unified: ${unifiedStatus})`
*/
private getOfflineAuthorizationConfig (): boolean {
try {
- // In OCPP 2.0, this would be controlled by LocalAuthorizeOffline variable
- // For now, return a default value
- return true
+ const value = this.getVariableValue('AuthCtrlr', 'LocalAuthorizeOffline')
+ return this.parseBooleanVariable(value, true)
} catch (error) {
logger.warn(
`${this.chargingStation.logPrefix()} ${moduleName}.getOfflineAuthorizationConfig: Error getting offline authorization config`,
}
}
- /**
- * Maps OCPP 2.0 AuthorizationStatusEnumType to unified AuthorizationStatus
- * @param ocpp20Status - OCPP 2.0 authorization status
- * @returns Unified authorization status
- */
- private mapOCPP20AuthStatus (
- ocpp20Status: OCPP20AuthorizationStatusEnumType
- ): AuthorizationStatus {
- switch (ocpp20Status) {
- case OCPP20AuthorizationStatusEnumType.Accepted:
- return AuthorizationStatus.ACCEPTED
- case OCPP20AuthorizationStatusEnumType.Blocked:
- return AuthorizationStatus.BLOCKED
- case OCPP20AuthorizationStatusEnumType.ConcurrentTx:
- return AuthorizationStatus.CONCURRENT_TX
- case OCPP20AuthorizationStatusEnumType.Expired:
- return AuthorizationStatus.EXPIRED
- case OCPP20AuthorizationStatusEnumType.Invalid:
- return AuthorizationStatus.INVALID
- case OCPP20AuthorizationStatusEnumType.NoCredit:
- return AuthorizationStatus.NO_CREDIT
- case OCPP20AuthorizationStatusEnumType.NotAllowedTypeEVSE:
- return AuthorizationStatus.NOT_ALLOWED_TYPE_EVSE
- case OCPP20AuthorizationStatusEnumType.NotAtThisLocation:
- return AuthorizationStatus.NOT_AT_THIS_LOCATION
- case OCPP20AuthorizationStatusEnumType.NotAtThisTime:
- return AuthorizationStatus.NOT_AT_THIS_TIME
- case OCPP20AuthorizationStatusEnumType.Unknown:
- default:
- return AuthorizationStatus.UNKNOWN
- }
- }
-
/**
* Map OCPP 2.0 IdToken type to unified identifier type
* @param ocpp20Type - OCPP 2.0 IdTokenEnumType to convert
return false
}
- // For now return true - real implementation would test remote connectivity
- return true
+ // Check if any adapter reports remote availability
+ for (const adapter of this.adapters.values()) {
+ try {
+ if (adapter.isRemoteAvailable()) {
+ return true
+ }
+ } catch {
+ // Continue checking other adapters
+ }
+ }
+
+ return false
}
public updateCacheEntry (
this.config
)
- // Map strategies by their priority to strategy names
strategies.forEach(strategy => {
- if (strategy.priority === 1) {
- this.strategies.set('local', strategy)
- } else if (strategy.priority === 2) {
- this.strategies.set('remote', strategy)
- } else if (strategy.priority === 3) {
- this.strategies.set('certificate', strategy)
- }
+ const key = strategy.name.replace('AuthStrategy', '').toLowerCase()
+ this.strategies.set(key, strategy)
})
logger.info(
* Authentication error with context
*/
export class AuthenticationError extends Error {
- public override readonly cause?: Error
public readonly code: AuthErrorCode
public readonly context?: AuthContext
public readonly identifier?: string
ocppVersion?: OCPPVersion
}
) {
- super(message)
+ super(message, { cause: options?.cause })
this.code = code
this.identifier = options?.identifier
this.context = options?.context
this.ocppVersion = options?.ocppVersion
- this.cause = options?.cause
}
}