Skip to content

Commit e4cb4c5

Browse files
authored
release: freeRASP 7.5.1 (#200)
* feat: make dispatchers singleton * Update iOS SDK to 6.14.4
1 parent 6231452 commit e4cb4c5

File tree

32 files changed

+919
-536
lines changed

32 files changed

+919
-536
lines changed

CHANGELOG.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [7.5.1] - 2026-03-24
9+
10+
- Android SDK version: 18.0.4
11+
- iOS SDK version: 6.14.4
12+
13+
### Android
14+
15+
#### Changed
16+
17+
- Made dispatchers singletons
18+
19+
### iOS
20+
21+
#### Fixed
22+
23+
- Fixed new jailbreak checks false positives on iOS 14 and 13.
24+
- Fixed false positives with jailbreak on iOS 15 and 16.
25+
- Fixed issue with app crashing on screenshot/screen recording.
26+
- Fixed retrigger jailbreak issue on iOS 15 and 16.
27+
828
## [7.5.0] - 2026-03-02
929

1030
- Android SDK version: 18.0.4

android/src/main/kotlin/com/aheaditec/freerasp/dispatchers/ExecutionStateDispatcher.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.aheaditec.freerasp.dispatchers
33
import com.aheaditec.freerasp.RaspExecutionStateEvent
44
import io.flutter.plugin.common.EventChannel.EventSink
55

6-
internal class ExecutionStateDispatcher {
6+
internal object ExecutionStateDispatcher {
77
private val eventCache = mutableSetOf<RaspExecutionStateEvent>()
88
private var isAppInForeground = false
99

android/src/main/kotlin/com/aheaditec/freerasp/dispatchers/ThreatDispatcher.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.aheaditec.freerasp.handlers.MethodCallHandler
55
import com.aheaditec.talsec_security.security.api.SuspiciousAppInfo
66
import io.flutter.plugin.common.EventChannel.EventSink
77

8-
internal class ThreatDispatcher {
8+
internal object ThreatDispatcher {
99
private val threatCache = mutableSetOf<Threat>()
1010
private val malwareCache = mutableListOf<SuspiciousAppInfo>()
1111
private var isAppInForeground = false

android/src/main/kotlin/com/aheaditec/freerasp/handlers/PluginThreatHandler.kt

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,100 +18,97 @@ import com.aheaditec.talsec_security.security.api.ThreatListener.ThreatDetected
1818
*/
1919
internal object PluginThreatHandler {
2020

21-
internal val threatDispatcher = ThreatDispatcher()
22-
internal val executionStateDispatcher = ExecutionStateDispatcher()
23-
2421
private val threatDetected = object : ThreatDetected() {
2522
override fun onRootDetected() {
26-
threatDispatcher.dispatchThreat(Threat.PrivilegedAccess)
23+
ThreatDispatcher.dispatchThreat(Threat.PrivilegedAccess)
2724
}
2825

2926
override fun onDebuggerDetected() {
30-
threatDispatcher.dispatchThreat(Threat.Debug)
27+
ThreatDispatcher.dispatchThreat(Threat.Debug)
3128
}
3229

3330
override fun onEmulatorDetected() {
34-
threatDispatcher.dispatchThreat(Threat.Simulator)
31+
ThreatDispatcher.dispatchThreat(Threat.Simulator)
3532
}
3633

3734
override fun onTamperDetected() {
38-
threatDispatcher.dispatchThreat(Threat.AppIntegrity)
35+
ThreatDispatcher.dispatchThreat(Threat.AppIntegrity)
3936
}
4037

4138
override fun onUntrustedInstallationSourceDetected() {
42-
threatDispatcher.dispatchThreat(Threat.UnofficialStore)
39+
ThreatDispatcher.dispatchThreat(Threat.UnofficialStore)
4340
}
4441

4542
override fun onHookDetected() {
46-
threatDispatcher.dispatchThreat(Threat.Hooks)
43+
ThreatDispatcher.dispatchThreat(Threat.Hooks)
4744
}
4845

4946
override fun onDeviceBindingDetected() {
50-
threatDispatcher.dispatchThreat(Threat.DeviceBinding)
47+
ThreatDispatcher.dispatchThreat(Threat.DeviceBinding)
5148
}
5249

5350
override fun onObfuscationIssuesDetected() {
54-
threatDispatcher.dispatchThreat(Threat.ObfuscationIssues)
51+
ThreatDispatcher.dispatchThreat(Threat.ObfuscationIssues)
5552
}
5653

5754
override fun onMalwareDetected(suspiciousApps: List<SuspiciousAppInfo>) {
58-
threatDispatcher.dispatchMalware(suspiciousApps)
55+
ThreatDispatcher.dispatchMalware(suspiciousApps)
5956
}
6057

6158
override fun onScreenshotDetected() {
62-
threatDispatcher.dispatchThreat(Threat.Screenshot)
59+
ThreatDispatcher.dispatchThreat(Threat.Screenshot)
6360
}
6461

6562
override fun onScreenRecordingDetected() {
66-
threatDispatcher.dispatchThreat(Threat.ScreenRecording)
63+
ThreatDispatcher.dispatchThreat(Threat.ScreenRecording)
6764
}
6865

6966
override fun onMultiInstanceDetected() {
70-
threatDispatcher.dispatchThreat(Threat.MultiInstance)
67+
ThreatDispatcher.dispatchThreat(Threat.MultiInstance)
7168
}
7269

7370
override fun onUnsecureWifiDetected() {
74-
threatDispatcher.dispatchThreat(Threat.UnsecureWiFi)
71+
ThreatDispatcher.dispatchThreat(Threat.UnsecureWiFi)
7572
}
7673

7774
override fun onTimeSpoofingDetected() {
78-
threatDispatcher.dispatchThreat(Threat.TimeSpoofing)
75+
ThreatDispatcher.dispatchThreat(Threat.TimeSpoofing)
7976
}
8077

8178
override fun onLocationSpoofingDetected() {
82-
threatDispatcher.dispatchThreat(Threat.LocationSpoofing)
79+
ThreatDispatcher.dispatchThreat(Threat.LocationSpoofing)
8380
}
8481

8582
override fun onAutomationDetected() {
86-
threatDispatcher.dispatchThreat(Threat.Automation)
83+
ThreatDispatcher.dispatchThreat(Threat.Automation)
8784
}
8885
}
8986

9087
private val deviceState = object : DeviceState() {
9188
override fun onUnlockedDeviceDetected() {
92-
threatDispatcher.dispatchThreat(Threat.Passcode)
89+
ThreatDispatcher.dispatchThreat(Threat.Passcode)
9390
}
9491

9592
override fun onHardwareBackedKeystoreNotAvailableDetected() {
96-
threatDispatcher.dispatchThreat(Threat.SecureHardwareNotAvailable)
93+
ThreatDispatcher.dispatchThreat(Threat.SecureHardwareNotAvailable)
9794
}
9895

9996
override fun onSystemVPNDetected() {
100-
threatDispatcher.dispatchThreat(Threat.SystemVPN)
97+
ThreatDispatcher.dispatchThreat(Threat.SystemVPN)
10198
}
10299

103100
override fun onDeveloperModeDetected() {
104-
threatDispatcher.dispatchThreat(Threat.DevMode)
101+
ThreatDispatcher.dispatchThreat(Threat.DevMode)
105102
}
106103

107104
override fun onADBEnabledDetected() {
108-
threatDispatcher.dispatchThreat(Threat.ADBEnabled)
105+
ThreatDispatcher.dispatchThreat(Threat.ADBEnabled)
109106
}
110107
}
111108

112109
private val raspExecutionState = object : RaspExecutionState() {
113110
override fun onAllChecksFinished() {
114-
executionStateDispatcher.dispatch(RaspExecutionStateEvent.AllChecksFinished)
111+
ExecutionStateDispatcher.dispatch(RaspExecutionStateEvent.AllChecksFinished)
115112
}
116113
}
117114

android/src/main/kotlin/com/aheaditec/freerasp/handlers/TalsecThreatHandler.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ internal object TalsecThreatHandler {
8888
* [EventSink] is not destroyed but also is not able to send events.
8989
*/
9090
internal fun suspendListener() {
91-
PluginThreatHandler.threatDispatcher.onPause()
92-
PluginThreatHandler.executionStateDispatcher.onPause()
91+
ThreatDispatcher.onPause()
92+
ExecutionStateDispatcher.onPause()
9393
}
9494

9595
/**
@@ -104,8 +104,8 @@ internal object TalsecThreatHandler {
104104
* also is not able to send events.
105105
*/
106106
internal fun resumeListener() {
107-
PluginThreatHandler.threatDispatcher.onResume()
108-
PluginThreatHandler.executionStateDispatcher.onResume()
107+
ThreatDispatcher.onResume()
108+
ExecutionStateDispatcher.onResume()
109109
}
110110

111111
/**
@@ -115,30 +115,30 @@ internal object TalsecThreatHandler {
115115
* @param eventSink The event sink of the new listener.
116116
*/
117117
internal fun attachEventSink(eventSink: EventSink) {
118-
PluginThreatHandler.threatDispatcher.eventSink = eventSink
118+
ThreatDispatcher.eventSink = eventSink
119119
}
120120

121121
/**
122122
* Called when a listener unsubscribes from the event channel.
123123
*/
124124
internal fun detachEventSink() {
125-
PluginThreatHandler.threatDispatcher.eventSink = null
125+
ThreatDispatcher.eventSink = null
126126
}
127127

128128
internal fun attachExecutionStateSink(eventSink: EventSink) {
129-
PluginThreatHandler.executionStateDispatcher.eventSink = eventSink
129+
ExecutionStateDispatcher.eventSink = eventSink
130130
}
131131

132132
internal fun detachExecutionStateSink() {
133-
PluginThreatHandler.executionStateDispatcher.eventSink = null
133+
ExecutionStateDispatcher.eventSink = null
134134
}
135135

136136
internal fun attachMethodSink(sink: MethodCallHandler.MethodSink) {
137-
PluginThreatHandler.threatDispatcher.methodSink = sink
137+
ThreatDispatcher.methodSink = sink
138138
}
139139

140140
internal fun detachMethodSink() {
141-
PluginThreatHandler.threatDispatcher.methodSink = null
141+
ThreatDispatcher.methodSink = null
142142
}
143143
}
144144

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)