UNPKG

cordova-talsec-plugin-freerasp

Version:

Cordova plugin for improving app security and threat monitoring on Android and iOS mobile devices.

253 lines (252 loc) 7.23 kB
/* global cordova */ class Threat { value; static AppIntegrity = new Threat(0); static PrivilegedAccess = new Threat(0); static Debug = new Threat(0); static Hooks = new Threat(0); static Passcode = new Threat(0); static Simulator = new Threat(0); static SecureHardwareNotAvailable = new Threat(0); static SystemVPN = new Threat(0); static DeviceBinding = new Threat(0); static DeviceID = new Threat(0); static UnofficialStore = new Threat(0); static ObfuscationIssues = new Threat(0); static DevMode = new Threat(0); static Malware = new Threat(0); static ADBEnabled = new Threat(0); static Screenshot = new Threat(0); static ScreenRecording = new Threat(0); constructor(value) { this.value = value; } static getValues = () => { return cordova.platformId === 'android' ? [ this.AppIntegrity, this.PrivilegedAccess, this.Debug, this.Hooks, this.Passcode, this.Simulator, this.SecureHardwareNotAvailable, this.SystemVPN, this.DeviceBinding, this.UnofficialStore, this.ObfuscationIssues, this.DevMode, this.Malware, this.ADBEnabled, this.Screenshot, this.ScreenRecording, ] : [ this.AppIntegrity, this.PrivilegedAccess, this.Debug, this.Hooks, this.Passcode, this.Simulator, this.SecureHardwareNotAvailable, this.SystemVPN, this.DeviceBinding, this.DeviceID, this.UnofficialStore, this.Screenshot, this.ScreenRecording, ]; }; } const ScreenCaptureStatus = { ALLOWED: 0, BLOCKED: 1, }; const getThreatCount = () => { return Threat.getValues().length; }; const getThreatChannelData = async () => { const dataLength = cordova.platformId === 'ios' ? 1 : 2; const data = await new Promise((resolve, reject) => { cordova.exec(resolve, reject, 'TalsecPlugin', 'getThreatChannelData'); }); if (data.length !== dataLength || !itemsHaveType(data, 'string')) { onInvalidCallback(); } return data; }; const itemsHaveType = (data, desidedType) => { // eslint-disable-next-line valid-typeof return data.every((item) => typeof item === desidedType); }; const getThreatIdentifiers = async () => { const identifiers = await new Promise((resolve, reject) => { cordova.exec(resolve, reject, 'TalsecPlugin', 'getThreatIdentifiers'); }); if ( identifiers.length !== getThreatCount() || !itemsHaveType(identifiers, 'number') ) { onInvalidCallback(); } return identifiers; }; const prepareMapping = async () => { const newValues = await getThreatIdentifiers(); const threats = Threat.getValues(); // eslint-disable-next-line array-callback-return threats.map((threat, index) => { threat.value = newValues[index]; }); }; const onInvalidCallback = () => { cordova.exec( () => {}, () => {}, 'TalsecPlugin', 'onInvalidCallback', ); }; // parses base64-encoded malware data to SuspiciousAppInfo[] const parseMalwareData = (data) => { return data.map((entry) => toSuspiciousAppInfo(entry)); }; const toSuspiciousAppInfo = (base64Value) => { const data = JSON.parse(atob(base64Value)); const packageInfo = data.packageInfo; return { packageInfo, reason: data.reason }; }; const start = async (config, eventListenerConfig) => { await prepareMapping(); const [key, malwareKey] = await getThreatChannelData(); const eventListener = (event) => { switch (event[key]) { case Threat.PrivilegedAccess.value: eventListenerConfig.privilegedAccess?.(); break; case Threat.Debug.value: eventListenerConfig.debug?.(); break; case Threat.Simulator.value: eventListenerConfig.simulator?.(); break; case Threat.AppIntegrity.value: eventListenerConfig.appIntegrity?.(); break; case Threat.UnofficialStore.value: eventListenerConfig.unofficialStore?.(); break; case Threat.Hooks.value: eventListenerConfig.hooks?.(); break; case Threat.DeviceBinding.value: eventListenerConfig.deviceBinding?.(); break; case Threat.Passcode.value: eventListenerConfig.passcode?.(); break; case Threat.SecureHardwareNotAvailable.value: eventListenerConfig.secureHardwareNotAvailable?.(); break; case Threat.ObfuscationIssues.value: eventListenerConfig.obfuscationIssues?.(); break; case Threat.DeviceID.value: eventListenerConfig.deviceID?.(); break; case Threat.DevMode.value: eventListenerConfig.devMode?.(); break; case Threat.SystemVPN.value: eventListenerConfig.systemVPN?.(); break; case Threat.Malware.value: eventListenerConfig.malware?.(parseMalwareData(event[malwareKey])); break; case Threat.ADBEnabled.value: eventListenerConfig.adbEnabled?.(); break; case Threat.Screenshot.value: eventListenerConfig.screenshot?.(); break; case Threat.ScreenRecording.value: eventListenerConfig.screenRecording?.(); break; default: onInvalidCallback(); break; } }; return new Promise((resolve, reject) => { cordova.exec( (message) => { if (message != null && message === 'started') { resolve(); } else { eventListener(message); } }, (error) => { console.error(`${error.code}: ${error.message}`); reject(error); }, 'TalsecPlugin', 'start', [config], ); }); }; const addToWhitelist = (packageName) => { if (cordova.platformId === 'ios') { return Promise.reject('Malware detection not available on iOS'); } return new Promise((resolve, reject) => { cordova.exec(resolve, reject, 'TalsecPlugin', 'addToWhitelist', [ packageName, ]); }); }; const getAppIcon = (packageName) => { if (cordova.platformId === 'ios') { return Promise.reject('Malware detection not available on iOS'); } return new Promise((resolve, reject) => { cordova.exec(resolve, reject, 'TalsecPlugin', 'getAppIcon', [packageName]); }); }; const blockScreenCapture = (enable) => { if (cordova.platformId === 'ios') { return Promise.reject( 'Blocking/Unblocking Screen Capture is not available on iOS', ); } return new Promise((resolve, reject) => { cordova.exec(resolve, reject, 'TalsecPlugin', 'blockScreenCapture', [ enable, ]); }); }; const isScreenCaptureBlocked = () => { if (cordova.platformId === 'ios') { return Promise.reject( 'Checking Screen Capture Status is not available on iOS', ); } return new Promise((resolve, reject) => { cordova.exec( (result) => resolve(result === ScreenCaptureStatus.BLOCKED), reject, 'TalsecPlugin', 'isScreenCaptureBlocked', [], ); }); }; // @ts-ignore module.exports = { start, addToWhitelist, getAppIcon, blockScreenCapture, isScreenCaptureBlocked, };