UNPKG

cordova-talsec-plugin-freerasp

Version:

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

471 lines (457 loc) 12.9 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // www/src/talsec.ts var talsec_exports = {}; __export(talsec_exports, { addToWhitelist: () => addToWhitelist, blockScreenCapture: () => blockScreenCapture, getAppIcon: () => getAppIcon, isScreenCaptureBlocked: () => isScreenCaptureBlocked, onInvalidCallback: () => onInvalidCallback, removeExternalId: () => removeExternalId, start: () => start, storeExternalId: () => storeExternalId }); module.exports = __toCommonJS(talsec_exports); // www/src/models/screenCaptureStatus.ts var ScreenCaptureStatus = { ALLOWED: 0, BLOCKED: 1 }; // www/src/api/methods/native.ts var storeExternalId = (externalId) => { return new Promise((resolve, reject) => { cordova.exec( () => { resolve(true); }, reject, "TalsecPlugin", "storeExternalId", [externalId] ); }); }; var removeExternalId = () => { return new Promise((resolve, reject) => { cordova.exec( () => { resolve(true); }, reject, "TalsecPlugin", "removeExternalId", [] ); }); }; var 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 ]); }); }; var 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]); }); }; var blockScreenCapture = (enable) => { return new Promise((resolve, reject) => { cordova.exec(resolve, reject, "TalsecPlugin", "blockScreenCapture", [ enable ]); }); }; var isScreenCaptureBlocked = () => { return new Promise((resolve, reject) => { cordova.exec( (result) => resolve(result === ScreenCaptureStatus.BLOCKED), reject, "TalsecPlugin", "isScreenCaptureBlocked", [] ); }); }; var onInvalidCallback = () => { cordova.exec( () => { }, () => { }, "TalsecPlugin", "onInvalidCallback" ); }; // www/src/models/threat.ts var Threat = 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); static MultiInstance = new _Threat(0); static TimeSpoofing = new _Threat(0); static LocationSpoofing = new _Threat(0); static UnsecureWifi = new _Threat(0); static Automation = 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.MultiInstance, this.TimeSpoofing, this.LocationSpoofing, this.UnsecureWifi, this.Automation ] : [ 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, this.TimeSpoofing ]; } }; // www/src/models/raspExecutionState.ts var RaspExecutionState = class _RaspExecutionState { value; static AllChecksFinished = new _RaspExecutionState(0); constructor(value) { this.value = value; } static getValues() { return [this.AllChecksFinished]; } }; // www/src/utils/utils.ts var getThreatCount = () => { return Threat.getValues().length; }; var getRaspExecutionStateCount = () => { return RaspExecutionState.getValues().length; }; var itemsHaveType = (data, desiredType) => { return data.every((item) => typeof item === desiredType); }; // www/src/channels/threat.ts var getThreatChannelData = async () => { const dataLength = cordova.platformId === "ios" ? 1 : 2; const identifiers = await new Promise((resolve, reject) => { cordova.exec(resolve, reject, "TalsecPlugin", "getThreatChannelData"); }); if (identifiers.length !== dataLength || !itemsHaveType(identifiers, "string")) { onInvalidCallback(); } return identifiers; }; var 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; }; var prepareMapping = async () => { const newValues = await getThreatIdentifiers(); const threats = Threat.getValues(); threats.map((threat, index) => { threat.value = newValues[index]; }); }; // www/src/utils/malware.ts var parseMalwareData = async (data) => { return new Promise((resolve, reject) => { try { resolve(data.map((entry) => toSuspiciousAppInfo(entry))); } catch (error) { reject(`Error while parsing app data: ${error}`); } }); }; var toSuspiciousAppInfo = (base64Value) => { const data = JSON.parse(atob(base64Value)); const packageInfo = data.packageInfo; return { packageInfo, reasons: data.reasons, permissions: data.permissions }; }; // www/src/api/listeners/threat.ts var registerThreatListener = async (config) => { await prepareMapping(); const [key, malwareKey] = await getThreatChannelData(); const eventListener = async (event) => { switch (event[key]) { case Threat.PrivilegedAccess.value: config.privilegedAccess?.(); break; case Threat.Debug.value: config.debug?.(); break; case Threat.Simulator.value: config.simulator?.(); break; case Threat.AppIntegrity.value: config.appIntegrity?.(); break; case Threat.UnofficialStore.value: config.unofficialStore?.(); break; case Threat.Hooks.value: config.hooks?.(); break; case Threat.DeviceBinding.value: config.deviceBinding?.(); break; case Threat.Passcode.value: config.passcode?.(); break; case Threat.SecureHardwareNotAvailable.value: config.secureHardwareNotAvailable?.(); break; case Threat.ObfuscationIssues.value: config.obfuscationIssues?.(); break; case Threat.DeviceID.value: config.deviceID?.(); break; case Threat.DevMode.value: config.devMode?.(); break; case Threat.SystemVPN.value: config.systemVPN?.(); break; case Threat.Malware.value: config.malware?.(await parseMalwareData(event[malwareKey])); break; case Threat.ADBEnabled.value: config.adbEnabled?.(); break; case Threat.Screenshot.value: config.screenshot?.(); break; case Threat.ScreenRecording.value: config.screenRecording?.(); break; case Threat.MultiInstance.value: config.multiInstance?.(); break; case Threat.TimeSpoofing.value: config.timeSpoofing?.(); break; case Threat.LocationSpoofing.value: config.locationSpoofing?.(); break; case Threat.UnsecureWifi.value: config.unsecureWifi?.(); break; case Threat.Automation.value: config.automation?.(); break; default: onInvalidCallback(); break; } }; cordova.exec( eventListener, (error) => { console.error(`Error during RASP+ events listener attaching: ${error}`); }, "TalsecPlugin", "registerListener", [] ); }; // www/src/channels/raspExecutionState.ts var getRaspExecutionStateIdentifiers = async () => { const identifiers = await new Promise((resolve, reject) => { cordova.exec( resolve, reject, "TalsecPlugin", "getRaspExecutionStateIdentifiers" ); }); if (identifiers.length !== getRaspExecutionStateCount() || !itemsHaveType(identifiers, "number")) { onInvalidCallback(); } return identifiers; }; var getRaspExecutionStateChannelData = async () => { const dataLength = 1; const identifiers = await new Promise((resolve, reject) => { cordova.exec( resolve, reject, "TalsecPlugin", "getRaspExecutionStateChannelData" ); }); if (identifiers.length !== dataLength || !itemsHaveType(identifiers, "string")) { onInvalidCallback(); } return identifiers; }; var prepareRaspExecutionStateMapping = async () => { const newValues = await getRaspExecutionStateIdentifiers(); const threats = RaspExecutionState.getValues(); threats.map((threat, index) => { threat.value = newValues[index]; }); }; // www/src/api/listeners/raspExecutionState.ts var registerRaspExecutionStateListener = async (config) => { const [key] = await getRaspExecutionStateChannelData(); await prepareRaspExecutionStateMapping(); const eventListener = async (event) => { switch (event[key]) { case RaspExecutionState.AllChecksFinished.value: config.allChecksFinished?.(); break; default: onInvalidCallback(); break; } }; cordova.exec( eventListener, (error) => { console.error( `Error during RASP+ execution state listener attaching: ${error}` ); }, "TalsecPlugin", "registerRaspExecutionStateListener", [] ); }; // www/src/utils/config.ts var DEFAULT_SCAN_SCOPE = { scopeType: "SIDELOADED_ONLY" }; var DEFAULT_REASON_MODE = "HIGHEST_CONFIDENCE"; var withDetectionDefaults = (config) => ({ ...config, scanScope: config.scanScope ?? DEFAULT_SCAN_SCOPE, reasonMode: config.reasonMode ?? DEFAULT_REASON_MODE }); var normalizeAndroidConfig = (androidConfig) => { if (!androidConfig.suspiciousAppDetectionConfig) return androidConfig; return { ...androidConfig, suspiciousAppDetectionConfig: withDetectionDefaults( androidConfig.suspiciousAppDetectionConfig ) }; }; var withDefaults = (config) => { if (!config.androidConfig) return config; return { ...config, androidConfig: normalizeAndroidConfig(config.androidConfig) }; }; // www/src/api/methods/cordova.ts var start = async (config, eventListenerConfig, raspExecutionStateActions) => { await registerThreatListener(eventListenerConfig); if (raspExecutionStateActions) { await registerRaspExecutionStateListener(raspExecutionStateActions); } return new Promise((resolve, reject) => { cordova.exec( (message) => { if (message != null && message === "started") { resolve(); } else { onInvalidCallback(); } }, (error) => { console.error(`${error.code}: ${error.message}`); reject(error); }, "TalsecPlugin", "start", [withDefaults(config)] ); }); }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { addToWhitelist, blockScreenCapture, getAppIcon, isScreenCaptureBlocked, onInvalidCallback, removeExternalId, start, storeExternalId });