@nevis-security/nevis-mobile-authentication-sdk-react
Version:
React Native plugin for Nevis Mobile Authentication SDK. Supports only mobile.
460 lines (410 loc) • 15.4 kB
text/typescript
/**
* Copyright © 2024 Nevis Security AG. All rights reserved.
*/
import { Account } from '../../localData/Account';
import { IdUserNamePair } from '../../localData/IdUserNamePair';
import { Server } from '../../localData/Server';
enum DeviceInformationMismatchType {
MissingAuthenticatorInMobileDevice,
MissingAuthenticatorInServer,
MissingDeviceInformationInMobileDevice,
MissingDeviceInformationInServer,
DeviceNameMismatch,
FcmRegistrationTokenMismatch,
}
/**
* The configuration mismatches between the server and the mobile device application.
*
* @see {@link DeviceInformationCheck}
* @see {@link DeviceInformationSync}
*/
export abstract class DeviceInformationMismatch {
/**
* Alternate constructor that creates a {@link DeviceInformationMismatch} from a json.
*
* @param json contains the source for instance creation.
* @returns a {@link DeviceInformationMismatch} instance.
*/
static fromJson(json: any): DeviceInformationMismatch {
const subtype =
DeviceInformationMismatchType[json.type as keyof typeof DeviceInformationMismatchType];
switch (subtype) {
case DeviceInformationMismatchType.MissingAuthenticatorInMobileDevice:
return MissingAuthenticatorInMobileDevice.fromJson(json.data);
case DeviceInformationMismatchType.MissingAuthenticatorInServer:
return MissingAuthenticatorInServer.fromJson(json.data);
case DeviceInformationMismatchType.MissingDeviceInformationInMobileDevice:
return MissingDeviceInformationInMobileDevice.fromJson(json.data);
case DeviceInformationMismatchType.MissingDeviceInformationInServer:
return MissingDeviceInformationInServer.fromJson(json.data);
case DeviceInformationMismatchType.DeviceNameMismatch:
return DeviceNameMismatch.fromJson(json.data);
case DeviceInformationMismatchType.FcmRegistrationTokenMismatch:
return FcmRegistrationTokenMismatch.fromJson(json.data);
default:
throw new Error(`Unknown device information mismatch (${json.type}).`);
}
}
}
/**
* An authenticator is registered in the server for an account, but not in the mobile device application.
*
* Fixing this mismatch when invoking {@link DeviceInformationSync} will remove the authenticator
* from the server.
*/
export abstract class MissingAuthenticatorInMobileDevice extends DeviceInformationMismatch {
/**
* The key ID of the FIDO UAF credentials associated with the missing authenticator.
*
* It is encoded in base 64 URL.
*/
abstract keyId: string;
/**
* The AAID of the missing authenticator.
*/
abstract aaid: string;
/**
* The server where the mismatch occurs.
*/
abstract server: Server;
/**
* Default constructor for {@link MissingAuthenticatorInMobileDevice}.
*
* @param keyId the key ID of the FIDO UAF credentials associated with the missing authenticator.
* @param aaid the AAID of the missing authenticator.
* @param server the server where the mismatch occurs.
* @returns the created {@link MissingAuthenticatorInMobileDevice} instance.
*/
static create(keyId: string, aaid: string, server: Server): MissingAuthenticatorInMobileDevice {
return new MissingAuthenticatorInMobileDeviceImpl(keyId, aaid, server);
}
/**
* Alternate constructor that creates a {@link MissingAuthenticatorInMobileDevice} from a json.
*
* @param json contains the source for instance creation.
* @returns the created {@link MissingAuthenticatorInMobileDevice} instance.
*/
static fromJson(json: any): MissingAuthenticatorInMobileDevice {
return MissingAuthenticatorInMobileDeviceImpl.fromJson(json);
}
}
export class MissingAuthenticatorInMobileDeviceImpl extends MissingAuthenticatorInMobileDevice {
keyId: string;
aaid: string;
server: Server;
constructor(keyId: string, aaid: string, server: Server) {
super();
this.keyId = keyId;
this.aaid = aaid;
this.server = server;
}
static fromJson(json: any): MissingAuthenticatorInMobileDeviceImpl {
const server = Server.fromJson(json.server);
return new MissingAuthenticatorInMobileDeviceImpl(json.keyId, json.aaid, server);
}
}
/**
* An authenticator is registered in the mobile device application for an account, but not in the server.
*
* Fixing this mismatch when invoking {@link DeviceInformationSync} will remove the authenticator
* in the SDK. If this is the latest authenticator for the account, the device information for the account
* will also be removed from the application and the server.
*/
export abstract class MissingAuthenticatorInServer extends DeviceInformationMismatch {
/**
* The key ID of the FIDO UAF credentials associated with the missing authenticator.
*
* It is encoded in base 64 URL.
*/
abstract keyId: string;
/**
* The account associated with the missing authenticator.
*/
abstract account: Account;
/**
* The AAID of the missing authenticator.
*/
abstract aaid: string;
/**
* Default constructor for {@link MissingAuthenticatorInServer}.
*
* @param keyId the key ID of the FIDO UAF credentials associated with the missing authenticator.
* @param account the account associated with the missing authenticator.
* @param aaid the AAID of the missing authenticator.
* @returns the created {@link MissingAuthenticatorInServer} instance.
*/
static create(keyId: string, account: Account, aaid: string): MissingAuthenticatorInServer {
return new MissingAuthenticatorInServerImpl(keyId, account, aaid);
}
/**
* Alternate constructor that creates a {@link MissingAuthenticatorInServer} from a json.
*
* @param json contains the source for instance creation.
* @returns the created {@link MissingAuthenticatorInServer} instance.
*/
static fromJson(json: any): MissingAuthenticatorInServer {
return MissingAuthenticatorInServerImpl.fromJson(json);
}
}
export class MissingAuthenticatorInServerImpl extends MissingAuthenticatorInServer {
keyId: string;
account: Account;
aaid: string;
constructor(keyId: string, account: Account, aaid: string) {
super();
this.keyId = keyId;
this.account = account;
this.aaid = aaid;
}
static fromJson(json: any): MissingAuthenticatorInServerImpl {
const account = Account.fromJson(json.account);
return new MissingAuthenticatorInServerImpl(json.keyId, account, json.aaid);
}
}
/**
* The device information for the given {@link IdUserNamePair} is defined in the server but not in
* the mobile device application.
*
* Fixing this mismatch when invoking {@link DeviceInformationSync} will remove the information associated
* with the `IdUsernamePair` from the server.
*/
export abstract class MissingDeviceInformationInMobileDevice extends DeviceInformationMismatch {
/**
* The identifier of the dispatch target that is missing in the mobile device.
*/
abstract dispatchTargetId: string;
/**
* The server where the mismatch occurs.
*/
abstract server: Server;
/**
* Default constructor for {@link MissingDeviceInformationInMobileDevice}.
*
* @param dispatchTargetId the identifier of the dispatch target that is missing in the mobile device.
* @param server the server where the mismatch occurs.
* @returns the created {@link MissingDeviceInformationInMobileDevice} instance.
*/
static create(
dispatchTargetId: string,
server: Server
): MissingDeviceInformationInMobileDevice {
return new MissingDeviceInformationInMobileDeviceImpl(dispatchTargetId, server);
}
/**
* Alternate constructor that creates a {@link MissingDeviceInformationInMobileDevice} from a json.
*
* @param json contains the source for instance creation.
* @returns the created {@link MissingDeviceInformationInMobileDevice} instance.
*/
static fromJson(json: any): MissingDeviceInformationInMobileDevice {
return MissingDeviceInformationInMobileDeviceImpl.fromJson(json);
}
}
export class MissingDeviceInformationInMobileDeviceImpl extends MissingDeviceInformationInMobileDevice {
dispatchTargetId: string;
server: Server;
constructor(dispatchTargetId: string, server: Server) {
super();
this.dispatchTargetId = dispatchTargetId;
this.server = server;
}
static fromJson(json: any): MissingDeviceInformationInMobileDeviceImpl {
const server = Server.fromJson(json.server);
return new MissingDeviceInformationInMobileDeviceImpl(json.dispatchTargetId, server);
}
}
/**
* The device information for the given {@link IdUserNamePair} is defined in the SDK but not in the
* server.
*
* This mismatch cannot be solved, providing it to the {@link DeviceInformationSync#mismatches(Set)}
* method will have no effect.
*/
export abstract class MissingDeviceInformationInServer extends DeviceInformationMismatch {
/**
* The {@link IdUserNamePair} that is missing in the server.
*/
abstract idUsernamePair: IdUserNamePair;
/**
* The server where the mismatch occurs.
*/
abstract server: Server;
/**
* Default constructor for {@link MissingDeviceInformationInServer}.
*
* @param idUsernamePair the {@link IdUserNamePair} that is missing in the server.
* @param server the server where the mismatch occurs.
* @returns the created {@link MissingDeviceInformationInServer} instance.
*/
static create(
idUsernamePair: IdUserNamePair,
server: Server
): MissingDeviceInformationInServer {
return new MissingDeviceInformationInServerImpl(idUsernamePair, server);
}
/**
* Alternate constructor that creates a {@link MissingDeviceInformationInServer} from a json.
*
* @param json contains the source for instance creation.
* @returns the created {@link MissingDeviceInformationInServer} instance.
*/
static fromJson(json: any): MissingDeviceInformationInServer {
return MissingDeviceInformationInServerImpl.fromJson(json);
}
}
export class MissingDeviceInformationInServerImpl extends MissingDeviceInformationInServer {
idUsernamePair: IdUserNamePair;
server: Server;
constructor(idUsernamePair: IdUserNamePair, server: Server) {
super();
this.idUsernamePair = idUsernamePair;
this.server = server;
}
static fromJson(json: any): MissingDeviceInformationInServerImpl {
const server = Server.fromJson(json.server);
const idUsernamePair = IdUserNamePair.fromJson(json.idUsernamePair);
return new MissingDeviceInformationInServerImpl(idUsernamePair, server);
}
}
/**
* There is a mismatch between the name of the device in the server and the one in the mobile device
* application.
*
* Fixing this mismatch when invoking {@link DeviceInformationSync} will update the values
* in all servers with the values in the mobile device application.
*
* If you rather have the value in the server to be used, you can provide the name returned
* by {@link nameInServer}, and execute a {@link DeviceInformationChange} operation with
* that value.
*/
export abstract class DeviceNameMismatch extends DeviceInformationMismatch {
/**
* The name of the device in the server.
*/
abstract nameInServer: string;
/**
* The name of the device in the mobile application (that is, as returned by {@link DeviceInformation.name}
* through {@link LocalData.deviceInformation}).
*/
abstract nameInMobileDevice: string;
/**
* The server where the mismatch occurs.
*/
abstract server: Server;
/**
* Default constructor for {@link DeviceNameMismatch}.
*
* @param nameInServer the name of the device in the server.
* @param nameInMobileDevice the name of the device in the mobile application.
* @param server the server where the mismatch occurs.
* @returns the created {@link DeviceNameMismatch} instance.
*/
static create(
nameInServer: string,
nameInMobileDevice: string,
server: Server
): DeviceNameMismatch {
return new DeviceNameMismatchImpl(nameInServer, nameInMobileDevice, server);
}
/**
* Alternate constructor that creates a {@link DeviceNameMismatch} from a json.
*
* @param json contains the source for instance creation.
* @returns the created {@link DeviceNameMismatch} instance.
*/
static fromJson(json: any): DeviceNameMismatch {
return DeviceNameMismatchImpl.fromJson(json);
}
}
export class DeviceNameMismatchImpl extends DeviceNameMismatch {
nameInServer: string;
nameInMobileDevice: string;
server: Server;
constructor(nameInServer: string, nameInMobileDevice: string, server: Server) {
super();
this.nameInServer = nameInServer;
this.nameInMobileDevice = nameInMobileDevice;
this.server = server;
}
static fromJson(json: any): DeviceNameMismatchImpl {
const server = Server.fromJson(json.server);
return new DeviceNameMismatchImpl(json.nameInServer, json.nameInMobileDevice, server);
}
}
/**
* There is a mismatch between the firebase registration token in the server and the one in the mobile
* device application.
*
* Fixing this mismatch when invoking {@link DeviceInformationSync} will update the values in the
* server with the values in the mobile device application.
*
* <If you rather have the value in the server to be used, you can provide the registration
* token returned by {@link fcmRegistrationTokenInServer}, and execute a {@link DeviceInformationChange}
* operation with that value.
*/
export abstract class FcmRegistrationTokenMismatch extends DeviceInformationMismatch {
/**
* The firebase registration token in the server.
*/
abstract fcmRegistrationTokenInServer?: string;
/**
* The firebase registration token in the mobile device application (that is, as returned by
* {@link DeviceInformation.fcmRegistrationToken} through {@link LocalData.deviceInformation}).
*/
abstract fcmRegistrationTokenInMobileDevice?: string;
/**
* The server where the mismatch occurs.
*/
abstract server: Server;
/**
* Default constructor for {@link FcmRegistrationTokenMismatch}.
*
* @param server the server where the mismatch occurs.
* @param fcmRegistrationTokenInServer the firebase registration token in the server.
* @param fcmRegistrationTokenInMobileDevice the firebase registration token in the mobile device application.
* @returns the created {@link FcmRegistrationTokenMismatch} instance.
*/
static create(
server: Server,
fcmRegistrationTokenInServer?: string,
fcmRegistrationTokenInMobileDevice?: string
): FcmRegistrationTokenMismatch {
return new FcmRegistrationTokenMismatchImpl(
server,
fcmRegistrationTokenInServer,
fcmRegistrationTokenInMobileDevice
);
}
/**
* Alternate constructor that creates an {@link FcmRegistrationTokenMismatch} from a json.
*
* @param json contains the source for instance creation.
* @returns the created {@link FcmRegistrationTokenMismatch} instance.
*/
static fromJson(json: any): FcmRegistrationTokenMismatch {
return FcmRegistrationTokenMismatchImpl.fromJson(json);
}
}
export class FcmRegistrationTokenMismatchImpl extends FcmRegistrationTokenMismatch {
fcmRegistrationTokenInServer?: string;
fcmRegistrationTokenInMobileDevice?: string;
server: Server;
constructor(
server: Server,
fcmRegistrationTokenInServer?: string,
fcmRegistrationTokenInMobileDevice?: string
) {
super();
this.fcmRegistrationTokenInServer = fcmRegistrationTokenInServer;
this.fcmRegistrationTokenInMobileDevice = fcmRegistrationTokenInMobileDevice;
this.server = server;
}
static fromJson(json: any): FcmRegistrationTokenMismatchImpl {
const server = Server.fromJson(json.server);
return new FcmRegistrationTokenMismatchImpl(
server,
json.fcmRegistrationTokenInServer,
json.fcmRegistrationTokenInMobileDevice
);
}
}