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 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
- PluginThreatHandler.threatDispatcher.onResume()
41
- PluginThreatHandler.executionStateDispatcher.onResume()
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
- PluginThreatHandler.threatDispatcher.onPause()
49
- PluginThreatHandler.executionStateDispatcher.onPause()
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
- PluginThreatHandler.threatDispatcher.unregisterListener()
55
- PluginThreatHandler.executionStateDispatcher.unregisterListener()
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
- init {
71
+ override fun initialize() {
70
72
  reactContext.addLifecycleEventListener(lifecycleListener)
71
73
  initializeEventKeys()
72
- PluginThreatHandler.initializeDispatchers(PluginListener(reactContext))
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
- PluginThreatHandler.threatDispatcher.registerListener()
168
+ ThreatDispatcher.registerListener(PluginListener(reactContext))
166
169
  }
167
170
  if (eventName == RaspExecutionStateEvent.CHANNEL_NAME) {
168
- PluginThreatHandler.executionStateDispatcher.registerListener()
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
- PluginThreatHandler.threatDispatcher.unregisterListener()
184
+ ThreatDispatcher.unregisterListener()
182
185
  }
183
186
  if (eventName == RaspExecutionStateEvent.CHANNEL_NAME) {
184
- PluginThreatHandler.executionStateDispatcher.unregisterListener()
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
- internal lateinit var threatDispatcher: ThreatDispatcher
14
- internal lateinit var executionStateDispatcher: ExecutionStateDispatcher
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
- threatDispatcher.dispatchThreat(ThreatEvent.PrivilegedAccess)
21
+ ThreatDispatcher.dispatchThreat(ThreatEvent.PrivilegedAccess)
25
22
  }
26
23
 
27
24
  override fun onDebuggerDetected() {
28
- threatDispatcher.dispatchThreat(ThreatEvent.Debug)
25
+ ThreatDispatcher.dispatchThreat(ThreatEvent.Debug)
29
26
  }
30
27
 
31
28
  override fun onEmulatorDetected() {
32
- threatDispatcher.dispatchThreat(ThreatEvent.Simulator)
29
+ ThreatDispatcher.dispatchThreat(ThreatEvent.Simulator)
33
30
  }
34
31
 
35
32
  override fun onTamperDetected() {
36
- threatDispatcher.dispatchThreat(ThreatEvent.AppIntegrity)
33
+ ThreatDispatcher.dispatchThreat(ThreatEvent.AppIntegrity)
37
34
  }
38
35
 
39
36
  override fun onUntrustedInstallationSourceDetected() {
40
- threatDispatcher.dispatchThreat(ThreatEvent.UnofficialStore)
37
+ ThreatDispatcher.dispatchThreat(ThreatEvent.UnofficialStore)
41
38
  }
42
39
 
43
40
  override fun onHookDetected() {
44
- threatDispatcher.dispatchThreat(ThreatEvent.Hooks)
41
+ ThreatDispatcher.dispatchThreat(ThreatEvent.Hooks)
45
42
  }
46
43
 
47
44
  override fun onDeviceBindingDetected() {
48
- threatDispatcher.dispatchThreat(ThreatEvent.DeviceBinding)
45
+ ThreatDispatcher.dispatchThreat(ThreatEvent.DeviceBinding)
49
46
  }
50
47
 
51
48
  override fun onObfuscationIssuesDetected() {
52
- threatDispatcher.dispatchThreat(ThreatEvent.ObfuscationIssues)
49
+ ThreatDispatcher.dispatchThreat(ThreatEvent.ObfuscationIssues)
53
50
  }
54
51
 
55
52
  override fun onMalwareDetected(suspiciousAppInfos: MutableList<SuspiciousAppInfo>) {
56
- threatDispatcher.dispatchMalware(suspiciousAppInfos ?: mutableListOf())
53
+ ThreatDispatcher.dispatchMalware(suspiciousAppInfos ?: mutableListOf())
57
54
  }
58
55
 
59
56
  override fun onScreenshotDetected() {
60
- threatDispatcher.dispatchThreat(ThreatEvent.Screenshot)
57
+ ThreatDispatcher.dispatchThreat(ThreatEvent.Screenshot)
61
58
  }
62
59
 
63
60
  override fun onScreenRecordingDetected() {
64
- threatDispatcher.dispatchThreat(ThreatEvent.ScreenRecording)
61
+ ThreatDispatcher.dispatchThreat(ThreatEvent.ScreenRecording)
65
62
  }
66
63
 
67
64
  override fun onMultiInstanceDetected() {
68
- threatDispatcher.dispatchThreat(ThreatEvent.MultiInstance)
65
+ ThreatDispatcher.dispatchThreat(ThreatEvent.MultiInstance)
69
66
  }
70
67
 
71
68
  override fun onUnsecureWifiDetected() {
72
- threatDispatcher.dispatchThreat(ThreatEvent.UnsecureWifi)
69
+ ThreatDispatcher.dispatchThreat(ThreatEvent.UnsecureWifi)
73
70
  }
74
71
 
75
72
  override fun onTimeSpoofingDetected() {
76
- threatDispatcher.dispatchThreat(ThreatEvent.TimeSpoofing)
73
+ ThreatDispatcher.dispatchThreat(ThreatEvent.TimeSpoofing)
77
74
  }
78
75
 
79
76
  override fun onLocationSpoofingDetected() {
80
- threatDispatcher.dispatchThreat(ThreatEvent.LocationSpoofing)
77
+ ThreatDispatcher.dispatchThreat(ThreatEvent.LocationSpoofing)
81
78
  }
82
79
 
83
80
  override fun onAutomationDetected() {
84
- threatDispatcher.dispatchThreat(ThreatEvent.Automation)
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
- threatDispatcher.dispatchThreat(ThreatEvent.Passcode)
88
+ ThreatDispatcher.dispatchThreat(ThreatEvent.Passcode)
92
89
  }
93
90
 
94
91
  override fun onHardwareBackedKeystoreNotAvailableDetected() {
95
- threatDispatcher.dispatchThreat(ThreatEvent.SecureHardwareNotAvailable)
92
+ ThreatDispatcher.dispatchThreat(ThreatEvent.SecureHardwareNotAvailable)
96
93
  }
97
94
 
98
95
  override fun onDeveloperModeDetected() {
99
- threatDispatcher.dispatchThreat(ThreatEvent.DevMode)
96
+ ThreatDispatcher.dispatchThreat(ThreatEvent.DevMode)
100
97
  }
101
98
 
102
99
  override fun onADBEnabledDetected() {
103
- threatDispatcher.dispatchThreat(ThreatEvent.ADBEnabled)
100
+ ThreatDispatcher.dispatchThreat(ThreatEvent.ADBEnabled)
104
101
  }
105
102
 
106
103
  override fun onSystemVPNDetected() {
107
- threatDispatcher.dispatchThreat(ThreatEvent.SystemVPN)
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
- executionStateDispatcher.dispatch(RaspExecutionStateEvent.AllChecksFinished)
110
+ ExecutionStateDispatcher.dispatch(RaspExecutionStateEvent.AllChecksFinished)
114
111
  }
115
112
  }
116
113
 
@@ -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 class ExecutionStateDispatcher(private val listener: PluginExecutionStateListener) {
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 class ThreatDispatcher(private val listener: PluginThreatListener) {
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.0",
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",