Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
aeca31e
feat: bump Android SDK to 18.3.0
martinzigrai May 7, 2026
dcb05a9
feat!: rename reason to reasons in SuspiciousAppInfo
martinzigrai May 7, 2026
b65434a
feat!: rename blacklist to blocklist in reasons, deprecate old malwar…
martinzigrai May 7, 2026
0a1fbc1
chore: update changelog for 2.6.0
martinzigrai May 7, 2026
cc11448
fix: correct changelog wording and deprecated JSDoc
martinzigrai May 7, 2026
74b51f2
fix: remove SuspiciousAppDetectionConfig references from Capacitor AP…
martinzigrai May 7, 2026
6adad49
feat: add SuspiciousAppDetectionConfig to Capacitor API
martinzigrai May 7, 2026
25727c9
fix: use data class constructor instead of non-existent Builder for S…
martinzigrai May 7, 2026
1ec1e66
refactor: extract SuspiciousAppDetectionConfig parsing to Extensions
martinzigrai May 7, 2026
68a623e
fix: use positional args for SuspiciousAppDetectionConfig and refacto…
martinzigrai May 12, 2026
fca1e71
chore: update example package-lock.json
martinzigrai May 12, 2026
c44532b
Merge branch 'main' into rc/2.6.0
tompsota May 13, 2026
294be68
refactor: tighten SuspiciousAppDetectionConfig parsing
martinzigrai May 15, 2026
b008756
feat!: remove deprecated MalwareConfig API
martinzigrai May 15, 2026
99d9d59
chore: bump to 3.0.0
martinzigrai May 15, 2026
f31d0d5
chore: rebuild dist for 3.0.0
martinzigrai May 15, 2026
e012a58
chore: CHANGELOG update
martinzigrai May 15, 2026
bccbdf7
refactor: rename MalwareScanScope to ScanScope and move config utils
martinzigrai May 19, 2026
4cd3572
fix: fix import order in capacitor.ts
martinzigrai May 19, 2026
38ce588
fix: apply prettier formatting to capacitor.ts
martinzigrai May 19, 2026
2f431b3
docs: update changelog
martinzigrai May 27, 2026
4a668aa
refactor: rename normalizeConfig to withDefaults in config utils
martinzigrai May 28, 2026
e119abb
refactor: rename ScanScope.scanScope field to scopeType
tompsota May 28, 2026
bd8bd47
fix: dist
tompsota May 28, 2026
4f54fdc
fix: dist
tompsota May 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,47 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [3.0.0] - 2026-05-15

- Android SDK version: 18.3.0
- iOS SDK version: 6.14.4

### Breaking

- `SuspiciousAppInfo.reason` (String) renamed to `reasons` (string[])
- Value `"blacklist"` in `reasons` renamed to `"blocklist"`
- Removed `TalsecMalwareConfig` and `TalsecAndroidConfig.malwareConfig`
- `SuspiciousAppDetectionConfig.malwareScanScope` and `reasonMode` are now required

### Capacitor

#### Added

- `SuspiciousAppDetectionConfig` for malware detection configuration

#### Removed

- `TalsecMalwareConfig` type and `TalsecAndroidConfig.malwareConfig` field

### Android

#### Added

- New API class `SuspiciousAppDetectionConfig` that can be used to configure malware detection
- New API for malware detection configuration in `TalsecConfig`, see `TalsecConfig.Builder#suspiciousAppDetection`

#### Fixed

- Fixed `VerifyError` caused by JaCoCo bytecode instrumentation
- Fixed a potential cause of crash in the multi-instance detector
- Fixed Java interoperability of `ScreenProtector` methods
- Fixed Kotlin classpath conflicts in SDK dependency resolution (Kotlin 2.0.0)

#### Changed

- Fine-tuned location spoofing detection
- Modified malware incident log structure for better aggregation

## [2.5.1] - 2026-03-24

- Android SDK version: 18.0.4
Expand Down
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,5 @@ dependencies {
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"

implementation 'com.aheaditec.talsec.security:TalsecSecurity-Community-Capacitor:18.0.4'
implementation 'com.aheaditec.talsec.security:TalsecSecurity-Community-Capacitor:18.3.0'
}
13 changes: 6 additions & 7 deletions android/src/main/java/com/aheaditec/freerasp/FreeraspPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import com.aheaditec.freerasp.dispatchers.ExecutionStateDispatcher
import com.aheaditec.freerasp.dispatchers.ThreatDispatcher
import com.aheaditec.freerasp.utils.Utils
import com.aheaditec.freerasp.utils.getArraySafe
import com.aheaditec.freerasp.utils.getNestedArraySafe
import com.aheaditec.freerasp.utils.toEncodedJSArray
import com.aheaditec.freerasp.utils.toSuspiciousAppDetectionConfig
import com.aheaditec.talsec_security.security.api.SuspiciousAppInfo
import com.aheaditec.talsec_security.security.api.Talsec
import com.aheaditec.talsec_security.security.api.TalsecConfig
Expand Down Expand Up @@ -315,13 +315,12 @@ class FreeraspPlugin : Plugin() {
.prod(configJson.getBool("isProd") ?: true)
.killOnBypass(configJson.getBool("killOnBypass") ?: false)

if (androidConfig.has("malwareConfig")) {
val malwareConfig = androidConfig.getJSONObject("malwareConfig")
talsecBuilder.whitelistedInstallationSources(malwareConfig.getArraySafe("whitelistedInstallationSources"))
talsecBuilder.blacklistedHashes(malwareConfig.getArraySafe("blacklistedHashes"))
talsecBuilder.blacklistedPackageNames(malwareConfig.getArraySafe("blacklistedPackageNames"))
talsecBuilder.suspiciousPermissions(malwareConfig.getNestedArraySafe("suspiciousPermissions"))
if (androidConfig.has("suspiciousAppDetectionConfig")) {
talsecBuilder.suspiciousAppDetection(
androidConfig.getJSONObject("suspiciousAppDetectionConfig").toSuspiciousAppDetectionConfig()
)
}

return talsecBuilder.build()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import kotlinx.serialization.Serializable
@Serializable
data class CapSuspiciousAppInfo(
val packageInfo: CapPackageInfo,
val reason: String,
val reasons: Set<String>,
val permissions: Set<String>?
)

Expand Down
26 changes: 25 additions & 1 deletion android/src/main/java/com/aheaditec/freerasp/utils/Extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ import android.util.Base64
import android.util.Log
import com.aheaditec.freerasp.models.CapPackageInfo
import com.aheaditec.freerasp.models.CapSuspiciousAppInfo
import com.aheaditec.talsec_security.security.api.MalwareScanScope
import com.aheaditec.talsec_security.security.api.ReasonMode
import com.aheaditec.talsec_security.security.api.ScopeType
import com.aheaditec.talsec_security.security.api.SuspiciousAppDetectionConfig
import com.aheaditec.talsec_security.security.api.SuspiciousAppInfo
import com.getcapacitor.JSArray
import kotlinx.serialization.encodeToString
Expand Down Expand Up @@ -50,13 +54,33 @@ internal fun JSONObject.getNestedArraySafe(key: String): Array<Array<String>> {
return outArray.toTypedArray()
}

internal fun JSONObject.toScanScope(): MalwareScanScope {
val scopeType = ScopeType.valueOf(getString("scopeType"))
val trustedInstallSources = optJSONArray("trustedInstallSources")
?.toPrimitiveArray<String>()?.toList()
return MalwareScanScope(scopeType, trustedInstallSources)
}

internal fun JSONObject.toSuspiciousAppDetectionConfig(): SuspiciousAppDetectionConfig {
val scanScope = getJSONObject("scanScope").toScanScope()
val reasonMode = ReasonMode.valueOf(getString("reasonMode"))
return SuspiciousAppDetectionConfig(
getArraySafe("packageNames").toSet().takeIf { it.isNotEmpty() },
getArraySafe("hashes").toSet().takeIf { it.isNotEmpty() },
getNestedArraySafe("requestedPermissions").map { it.toSet() }.toSet().takeIf { it.isNotEmpty() },
getNestedArraySafe("grantedPermissions").map { it.toSet() }.toSet().takeIf { it.isNotEmpty() },
scanScope,
reasonMode,
)
}

/**
* Converts the Talsec's SuspiciousAppInfo to Capacitor equivalent
*/
internal fun SuspiciousAppInfo.toCapSuspiciousAppInfo(context: Context): CapSuspiciousAppInfo {
return CapSuspiciousAppInfo(
packageInfo = this.packageInfo.toCapPackageInfo(context),
reason = this.reason,
reasons = this.reasons,
permissions = this.permissions
)
}
Expand Down
2 changes: 1 addition & 1 deletion dist/esm/api/methods/capacitor.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { TalsecConfig, ThreatEventActions, RaspExecutionStateEventActions } from '../../types/types';
import type { RaspExecutionStateEventActions, TalsecConfig, ThreatEventActions } from '../../types/types';
export declare const startFreeRASP: (config: TalsecConfig, actions: ThreatEventActions, raspExecutionStateActions?: RaspExecutionStateEventActions) => Promise<{
started: boolean;
}>;
3 changes: 2 additions & 1 deletion dist/esm/api/methods/capacitor.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/esm/api/methods/capacitor.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 15 additions & 7 deletions dist/esm/types/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,21 +61,29 @@ export type TalsecAndroidConfig = {
packageName: string;
certificateHashes: string[];
supportedAlternativeStores?: string[];
malwareConfig?: TalsecMalwareConfig;
suspiciousAppDetectionConfig?: SuspiciousAppDetectionConfig;
};
export type TalsecIosConfig = {
appBundleId: string;
appTeamId: string;
};
export type TalsecMalwareConfig = {
blacklistedHashes?: string[];
blacklistedPackageNames?: string[];
suspiciousPermissions?: string[][];
whitelistedInstallationSources?: string[];
export type ScopeType = 'SIDELOADED_ONLY' | 'SIDELOADED_AND_SYSTEM_EXCLUDE_OEM' | 'SIDELOADED_AND_OEM' | 'SIDELOADED_AND_SYSTEM_AND_OEM' | 'ALL';
export type ReasonMode = 'ALL' | 'HIGHEST_CONFIDENCE';
export type ScanScope = {
scopeType: ScopeType;
trustedInstallSources?: string[];
};
export type SuspiciousAppDetectionConfig = {
packageNames?: string[];
hashes?: string[];
requestedPermissions?: string[][];
grantedPermissions?: string[][];
scanScope: ScanScope;
reasonMode: ReasonMode;
};
export type SuspiciousAppInfo = {
packageInfo: PackageInfo;
reason: string;
reasons: string[];
permissions?: string[];
};
export type PackageInfo = {
Expand Down
2 changes: 1 addition & 1 deletion dist/esm/types/types.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions dist/esm/utils/config.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import type { ScanScope, ReasonMode, SuspiciousAppDetectionConfig, TalsecAndroidConfig, TalsecConfig } from '../types/types';
export declare const DEFAULT_SCAN_SCOPE: ScanScope;
export declare const DEFAULT_REASON_MODE: ReasonMode;
export declare const withDetectionDefaults: (config: SuspiciousAppDetectionConfig) => SuspiciousAppDetectionConfig;
export declare const normalizeAndroidConfig: (androidConfig: TalsecAndroidConfig) => TalsecAndroidConfig;
export declare const withDefaults: (config: TalsecConfig) => TalsecConfig;
21 changes: 21 additions & 0 deletions dist/esm/utils/config.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading