@nevis-security/nevis-mobile-authentication-sdk-react
Version:
React Native plugin for Nevis Mobile Authentication SDK. Supports only mobile.
156 lines (145 loc) • 5.12 kB
text/typescript
/**
* Copyright © 2023-2024 Nevis Security AG. All rights reserved.
*/
import type { PinChangeRecoverableCustomValidationError } from '../../error/pin/change/PinChangeRecoverableCustomValidationError';
import { PinEnrollmentCustomValidationError } from '../../error/pin/enrollment/PinEnrollmentCustomValidationError';
/**
* The object defining the minimum and maximum length of the PIN.
*/
export abstract class PinPolicy {
/**
* The minimum length of the PIN.
*/
abstract minLength: number;
/**
* The maximum length of the PIN.
*/
abstract maxLength: number;
/**
* Default constructor for {@link PinPolicy}.
*
* @param minLength the minimum length of the PIN.
* @param maxLength the maximum length of the PIN.
* @returns an {@link PinPolicy} instance.
*/
static create(minLength: number, maxLength: number): PinPolicy {
return new PinPolicyImpl(minLength, maxLength);
}
/**
* Performs validation other than the minimum and maximum PIN length during PIN
* enrollment.
*
* This must be implemented in the case you require additional criteria for a
* PIN to be valid: the PIN must contain a minimum number of distinct digits,
* sequences of consecutive digits are disallowed, etc.
*
* If this method is not implemented, only the PIN minimum and maximum length
* will be validated during PIN enrollment.
*
* If validation fails, the implementation must invoke the provided `onError`
* with the error. The error will be the one returned by the
* {@link PinEnrollmentContext.lastRecoverableError} property.
*
* The implementation must guarantee that, one (and only one) of `onSuccess`
* and `onError` is invoked, and that the one invoked is invoked only once.
*
* Synchronous implementation example that requires PIN to have at least 4
* different digits:
* ```ts
* validatePinForEnrollment(
* _pin: string,
* onSuccess: () => void,
* _onError: (error: PinEnrollmentCustomValidationError) => void
* ): void {
* if(hasLessThan4DifferentDigits(pin)) {
* const error = new PinEnrollmentCustomValidationError(
* "The PIN has less than 4 consecutive digits."
* );
* onError(error);
* } else {
* onSuccess();
* }
* }
* ```
*
* @param pin the PIN to be validated.
* @param onSuccess the callback to invoke if the validation is successful.
* @param onError the callback to invoke with error if the validation fails.
*/
abstract validatePinForEnrollment(
pin: string,
onSuccess: () => void,
onError: (error: PinEnrollmentCustomValidationError) => void
): void;
/**
* Performs validation other than the minimum and maximum PIN length during PIN
* change.
*
* This must be implemented in the case you require additional criteria for a
* PIN to be valid: the PIN must contain a minimum number of distinct digits,
* sequences of consecutive digits are disallowed, etc.
*
* If this method is not implemented, only the PIN minimum and maximum length
* will be validated during PIN enrollment.
*
* If validation fails, the implementation must invoke the provided `onError`
* with the error. The error will be the one returned by the
* {@link PinEnrollmentContext.lastRecoverableError} property.
*
* The implementation must guarantee that, one (and only one) of `onSuccess`
* and `onError` is invoked, and that the one invoked is invoked only once.
*
* Synchronous implementation example that requires the PIN to be the same as
* a confirmation PIN provided in another field:
* ```ts
* validatePinForPinChange(
* _pin: string,
* onSuccess: () => void,
* _onError: (error: PinChangeRecoverableCustomValidationError) => void
* ): void {
* if(isDifferentThanConfirmationPIN(pin)) {
* const error = new PinChangeRecoverableCustomValidationError(
* "The provided PINs do not match."
* );
* onError(error);
* } else {
* onSuccess();
* }
* }
* ```
*
* @param pin the PIN to be validated.
* @param onSuccess the callback to invoke if the validation is successful.
* @param onError the callback to invoke with error if the validation fails.
*/
abstract validatePinForPinChange(
pin: string,
onSuccess: () => void,
onError: (error: PinChangeRecoverableCustomValidationError) => void
): void;
}
export class PinPolicyImpl extends PinPolicy {
minLength: number;
maxLength: number;
constructor(minLength: number, maxLength: number) {
super();
this.minLength = minLength;
this.maxLength = maxLength;
}
validatePinForEnrollment(
_pin: string,
onSuccess: () => void,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_onError: (error: PinEnrollmentCustomValidationError) => void
): void {
onSuccess();
}
validatePinForPinChange(
_pin: string,
onSuccess: () => void,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_onError: (error: PinChangeRecoverableCustomValidationError) => void
): void {
onSuccess();
}
}