freerasp-react-native 4.5.0 → 4.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/android/src/main/java/com/freeraspreactnative/FreeraspReactNativeModule.kt +15 -12
- package/android/src/main/java/com/freeraspreactnative/PluginThreatHandler.kt +25 -28
- package/android/src/main/java/com/freeraspreactnative/dispatchers/ExecutionStateDispatcher.kt +4 -2
- package/android/src/main/java/com/freeraspreactnative/dispatchers/ThreatDispatcher.kt +4 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [4.5.1] - 2026-03-16
|
|
9
|
+
|
|
10
|
+
- Android SDK version: 18.0.4
|
|
11
|
+
- iOS SDK version: 6.14.1
|
|
12
|
+
|
|
13
|
+
### React Native
|
|
14
|
+
|
|
15
|
+
#### Fixed
|
|
16
|
+
|
|
17
|
+
- Fixed case where event dispatchers on Android were not initialized before calling onResume at the app launch
|
|
18
|
+
|
|
8
19
|
## [4.5.0] - 2026-03-03
|
|
9
20
|
|
|
10
21
|
- Android SDK version: 18.0.4
|
|
@@ -20,6 +20,8 @@ import com.facebook.react.bridge.UiThreadUtil.runOnUiThread
|
|
|
20
20
|
import com.facebook.react.bridge.WritableArray
|
|
21
21
|
import com.facebook.react.bridge.WritableMap
|
|
22
22
|
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
23
|
+
import com.freeraspreactnative.dispatchers.ExecutionStateDispatcher
|
|
24
|
+
import com.freeraspreactnative.dispatchers.ThreatDispatcher
|
|
23
25
|
import com.freeraspreactnative.events.RaspExecutionStateEvent
|
|
24
26
|
import com.freeraspreactnative.events.ThreatEvent
|
|
25
27
|
import com.freeraspreactnative.interfaces.PluginExecutionStateListener
|
|
@@ -37,22 +39,22 @@ class FreeraspReactNativeModule(private val reactContext: ReactApplicationContex
|
|
|
37
39
|
|
|
38
40
|
private val lifecycleListener = object : LifecycleEventListener {
|
|
39
41
|
override fun onHostResume() {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
ThreatDispatcher.onResume()
|
|
43
|
+
ExecutionStateDispatcher.onResume()
|
|
42
44
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
|
43
45
|
reactContext.currentActivity?.let { ScreenProtector.register(it) }
|
|
44
46
|
}
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
override fun onHostPause() {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
ThreatDispatcher.onPause()
|
|
51
|
+
ExecutionStateDispatcher.onPause()
|
|
50
52
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
|
51
53
|
reactContext.currentActivity?.let { ScreenProtector.unregister(it) }
|
|
52
54
|
}
|
|
53
55
|
if (reactContext.currentActivity?.isFinishing == true) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
+
ThreatDispatcher.unregisterListener()
|
|
57
|
+
ExecutionStateDispatcher.unregisterListener()
|
|
56
58
|
PluginThreatHandler.unregisterSDKListener(reactContext)
|
|
57
59
|
}
|
|
58
60
|
}
|
|
@@ -66,10 +68,11 @@ class FreeraspReactNativeModule(private val reactContext: ReactApplicationContex
|
|
|
66
68
|
return NAME
|
|
67
69
|
}
|
|
68
70
|
|
|
69
|
-
|
|
71
|
+
override fun initialize() {
|
|
70
72
|
reactContext.addLifecycleEventListener(lifecycleListener)
|
|
71
73
|
initializeEventKeys()
|
|
72
|
-
PluginThreatHandler.
|
|
74
|
+
PluginThreatHandler.initializePluginListener(PluginListener(reactContext))
|
|
75
|
+
super.initialize()
|
|
73
76
|
}
|
|
74
77
|
|
|
75
78
|
@ReactMethod
|
|
@@ -162,10 +165,10 @@ class FreeraspReactNativeModule(private val reactContext: ReactApplicationContex
|
|
|
162
165
|
@ReactMethod
|
|
163
166
|
fun addListener(eventName: String) {
|
|
164
167
|
if (eventName == ThreatEvent.CHANNEL_NAME) {
|
|
165
|
-
|
|
168
|
+
ThreatDispatcher.registerListener(PluginListener(reactContext))
|
|
166
169
|
}
|
|
167
170
|
if (eventName == RaspExecutionStateEvent.CHANNEL_NAME) {
|
|
168
|
-
|
|
171
|
+
ExecutionStateDispatcher.registerListener(PluginListener(reactContext))
|
|
169
172
|
}
|
|
170
173
|
}
|
|
171
174
|
|
|
@@ -178,10 +181,10 @@ class FreeraspReactNativeModule(private val reactContext: ReactApplicationContex
|
|
|
178
181
|
@ReactMethod
|
|
179
182
|
fun removeListenerForEvent(eventName: String, promise: Promise) {
|
|
180
183
|
if (eventName == ThreatEvent.CHANNEL_NAME) {
|
|
181
|
-
|
|
184
|
+
ThreatDispatcher.unregisterListener()
|
|
182
185
|
}
|
|
183
186
|
if (eventName == RaspExecutionStateEvent.CHANNEL_NAME) {
|
|
184
|
-
|
|
187
|
+
ExecutionStateDispatcher.unregisterListener()
|
|
185
188
|
}
|
|
186
189
|
promise.resolve("Listener unregistered")
|
|
187
190
|
}
|
|
@@ -10,107 +10,104 @@ import com.freeraspreactnative.events.ThreatEvent
|
|
|
10
10
|
|
|
11
11
|
internal object PluginThreatHandler {
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
fun initializeDispatchers(listener: FreeraspReactNativeModule.PluginListener) {
|
|
17
|
-
threatDispatcher = ThreatDispatcher(listener)
|
|
18
|
-
executionStateDispatcher = ExecutionStateDispatcher(listener)
|
|
13
|
+
fun initializePluginListener(listener: FreeraspReactNativeModule.PluginListener) {
|
|
14
|
+
ThreatDispatcher.listener = listener
|
|
15
|
+
ExecutionStateDispatcher.listener = listener
|
|
19
16
|
}
|
|
20
17
|
|
|
21
18
|
private val threatDetected = object : ThreatListener.ThreatDetected() {
|
|
22
19
|
|
|
23
20
|
override fun onRootDetected() {
|
|
24
|
-
|
|
21
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.PrivilegedAccess)
|
|
25
22
|
}
|
|
26
23
|
|
|
27
24
|
override fun onDebuggerDetected() {
|
|
28
|
-
|
|
25
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.Debug)
|
|
29
26
|
}
|
|
30
27
|
|
|
31
28
|
override fun onEmulatorDetected() {
|
|
32
|
-
|
|
29
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.Simulator)
|
|
33
30
|
}
|
|
34
31
|
|
|
35
32
|
override fun onTamperDetected() {
|
|
36
|
-
|
|
33
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.AppIntegrity)
|
|
37
34
|
}
|
|
38
35
|
|
|
39
36
|
override fun onUntrustedInstallationSourceDetected() {
|
|
40
|
-
|
|
37
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.UnofficialStore)
|
|
41
38
|
}
|
|
42
39
|
|
|
43
40
|
override fun onHookDetected() {
|
|
44
|
-
|
|
41
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.Hooks)
|
|
45
42
|
}
|
|
46
43
|
|
|
47
44
|
override fun onDeviceBindingDetected() {
|
|
48
|
-
|
|
45
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.DeviceBinding)
|
|
49
46
|
}
|
|
50
47
|
|
|
51
48
|
override fun onObfuscationIssuesDetected() {
|
|
52
|
-
|
|
49
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.ObfuscationIssues)
|
|
53
50
|
}
|
|
54
51
|
|
|
55
52
|
override fun onMalwareDetected(suspiciousAppInfos: MutableList<SuspiciousAppInfo>) {
|
|
56
|
-
|
|
53
|
+
ThreatDispatcher.dispatchMalware(suspiciousAppInfos ?: mutableListOf())
|
|
57
54
|
}
|
|
58
55
|
|
|
59
56
|
override fun onScreenshotDetected() {
|
|
60
|
-
|
|
57
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.Screenshot)
|
|
61
58
|
}
|
|
62
59
|
|
|
63
60
|
override fun onScreenRecordingDetected() {
|
|
64
|
-
|
|
61
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.ScreenRecording)
|
|
65
62
|
}
|
|
66
63
|
|
|
67
64
|
override fun onMultiInstanceDetected() {
|
|
68
|
-
|
|
65
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.MultiInstance)
|
|
69
66
|
}
|
|
70
67
|
|
|
71
68
|
override fun onUnsecureWifiDetected() {
|
|
72
|
-
|
|
69
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.UnsecureWifi)
|
|
73
70
|
}
|
|
74
71
|
|
|
75
72
|
override fun onTimeSpoofingDetected() {
|
|
76
|
-
|
|
73
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.TimeSpoofing)
|
|
77
74
|
}
|
|
78
75
|
|
|
79
76
|
override fun onLocationSpoofingDetected() {
|
|
80
|
-
|
|
77
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.LocationSpoofing)
|
|
81
78
|
}
|
|
82
79
|
|
|
83
80
|
override fun onAutomationDetected() {
|
|
84
|
-
|
|
81
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.Automation)
|
|
85
82
|
}
|
|
86
83
|
}
|
|
87
84
|
|
|
88
85
|
private val deviceState = object : ThreatListener.DeviceState() {
|
|
89
86
|
|
|
90
87
|
override fun onUnlockedDeviceDetected() {
|
|
91
|
-
|
|
88
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.Passcode)
|
|
92
89
|
}
|
|
93
90
|
|
|
94
91
|
override fun onHardwareBackedKeystoreNotAvailableDetected() {
|
|
95
|
-
|
|
92
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.SecureHardwareNotAvailable)
|
|
96
93
|
}
|
|
97
94
|
|
|
98
95
|
override fun onDeveloperModeDetected() {
|
|
99
|
-
|
|
96
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.DevMode)
|
|
100
97
|
}
|
|
101
98
|
|
|
102
99
|
override fun onADBEnabledDetected() {
|
|
103
|
-
|
|
100
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.ADBEnabled)
|
|
104
101
|
}
|
|
105
102
|
|
|
106
103
|
override fun onSystemVPNDetected() {
|
|
107
|
-
|
|
104
|
+
ThreatDispatcher.dispatchThreat(ThreatEvent.SystemVPN)
|
|
108
105
|
}
|
|
109
106
|
}
|
|
110
107
|
|
|
111
108
|
private val raspExecutionState = object : ThreatListener.RaspExecutionState() {
|
|
112
109
|
override fun onAllChecksFinished() {
|
|
113
|
-
|
|
110
|
+
ExecutionStateDispatcher.dispatch(RaspExecutionStateEvent.AllChecksFinished)
|
|
114
111
|
}
|
|
115
112
|
}
|
|
116
113
|
|
package/android/src/main/java/com/freeraspreactnative/dispatchers/ExecutionStateDispatcher.kt
CHANGED
|
@@ -3,13 +3,15 @@ package com.freeraspreactnative.dispatchers
|
|
|
3
3
|
import com.freeraspreactnative.events.RaspExecutionStateEvent
|
|
4
4
|
import com.freeraspreactnative.interfaces.PluginExecutionStateListener
|
|
5
5
|
|
|
6
|
-
internal
|
|
6
|
+
internal object ExecutionStateDispatcher {
|
|
7
|
+
lateinit var listener: PluginExecutionStateListener
|
|
7
8
|
private val cache = mutableSetOf<RaspExecutionStateEvent>()
|
|
8
9
|
|
|
9
10
|
private var isAppInForeground = false
|
|
10
11
|
private var isListenerRegistered = false
|
|
11
12
|
|
|
12
|
-
fun registerListener() {
|
|
13
|
+
fun registerListener(newListener: PluginExecutionStateListener) {
|
|
14
|
+
listener = newListener
|
|
13
15
|
isListenerRegistered = true
|
|
14
16
|
isAppInForeground = true
|
|
15
17
|
flushCache()
|
|
@@ -4,14 +4,16 @@ import com.aheaditec.talsec_security.security.api.SuspiciousAppInfo
|
|
|
4
4
|
import com.freeraspreactnative.events.ThreatEvent
|
|
5
5
|
import com.freeraspreactnative.interfaces.PluginThreatListener
|
|
6
6
|
|
|
7
|
-
internal
|
|
7
|
+
internal object ThreatDispatcher {
|
|
8
|
+
lateinit var listener: PluginThreatListener
|
|
8
9
|
private val threatCache = mutableSetOf<ThreatEvent>()
|
|
9
10
|
private val malwareCache = mutableSetOf<SuspiciousAppInfo>()
|
|
10
11
|
|
|
11
12
|
private var isAppInForeground = false
|
|
12
13
|
private var isListenerRegistered = false
|
|
13
14
|
|
|
14
|
-
fun registerListener() {
|
|
15
|
+
fun registerListener(newListener: PluginThreatListener) {
|
|
16
|
+
listener = newListener
|
|
15
17
|
isListenerRegistered = true
|
|
16
18
|
isAppInForeground = true
|
|
17
19
|
flushCache()
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "freerasp-react-native",
|
|
3
|
-
"version": "4.5.
|
|
3
|
+
"version": "4.5.1",
|
|
4
4
|
"description": "React Native plugin for improving app security and threat monitoring on Android and iOS mobile devices.",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|