Skip to content

Commit 56410eb

Browse files
chore: add iOS obfuscation & request filtering
1 parent 4802864 commit 56410eb

File tree

7 files changed

+142
-127
lines changed

7 files changed

+142
-127
lines changed

android/src/main/java/com/instabug/reactlibrary/RNInstabugNetworkLoggerModule.java

Lines changed: 50 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -109,54 +109,54 @@ public void run() {
109109

110110

111111

112-
// @ReactMethod
113-
// public void registerNetworkLogsListener() {
114-
// MainThreadHandler.runOnMainThread(new Runnable() {
115-
// @Override
116-
// public void run() {
117-
// InternalAPM._registerNetworkLogSanitizer(new VoidSanitizer<NetworkLogSnapshot>() {
118-
// @Override
119-
// public void sanitize(NetworkLogSnapshot networkLogSnapshot, @NonNull OnCompleteCallback<NetworkLogSnapshot> onCompleteCallback) {
120-
// final int id = onCompleteCallback.hashCode();
121-
// callbackMap.put(id, onCompleteCallback);
122-
//
123-
// WritableMap networkSnapshotParams = Arguments.createMap();
124-
// networkSnapshotParams.putInt("id", id);
125-
// networkSnapshotParams.putString("url", networkLogSnapshot.getUrl());
126-
// networkSnapshotParams.putInt("responseCode", networkLogSnapshot.getResponseCode());
127-
//
128-
// sendEvent("IBGNetworkLoggerHandler", networkSnapshotParams);
129-
//
130-
// }
131-
// });
132-
// }
133-
// });
134-
// }
135-
//
136-
// @ReactMethod
137-
// protected void updateNetworkLogSnapshot(String jsonString) {
138-
//
139-
// JSONObject newJSONObject = null;
140-
// try {
141-
// newJSONObject = new JSONObject(jsonString);
142-
// } catch (JSONException e) {
143-
// throw new RuntimeException(e);
144-
// }
145-
// final Integer ID = newJSONObject.optInt("id");
146-
// final NetworkLogSnapshot modifiedSnapshot = new NetworkLogSnapshot(
147-
// newJSONObject.optString("url"),
148-
// null,
149-
// null,
150-
// null,
151-
// null,
152-
// newJSONObject.optInt("responseCode")
153-
// );
154-
//
155-
// final OnCompleteCallback<NetworkLogSnapshot> callback = callbackMap.get(ID);
156-
// if (callback != null) {
157-
// callback.onComplete(null);
158-
// }
159-
// callbackMap.remove(ID);
160-
//
161-
// }
112+
@ReactMethod
113+
public void registerNetworkLogsListener() {
114+
MainThreadHandler.runOnMainThread(new Runnable() {
115+
@Override
116+
public void run() {
117+
InternalAPM._registerNetworkLogSanitizer(new VoidSanitizer<NetworkLogSnapshot>() {
118+
@Override
119+
public void sanitize(NetworkLogSnapshot networkLogSnapshot, @NonNull OnCompleteCallback<NetworkLogSnapshot> onCompleteCallback) {
120+
final int id = onCompleteCallback.hashCode();
121+
callbackMap.put(id, onCompleteCallback);
122+
123+
WritableMap networkSnapshotParams = Arguments.createMap();
124+
networkSnapshotParams.putInt("id", id);
125+
networkSnapshotParams.putString("url", networkLogSnapshot.getUrl());
126+
networkSnapshotParams.putInt("responseCode", networkLogSnapshot.getResponseCode());
127+
128+
sendEvent("IBGNetworkLoggerHandler", networkSnapshotParams);
129+
130+
}
131+
});
132+
}
133+
});
134+
}
135+
136+
@ReactMethod
137+
protected void updateNetworkLogSnapshot(String jsonString) {
138+
139+
JSONObject newJSONObject = null;
140+
try {
141+
newJSONObject = new JSONObject(jsonString);
142+
} catch (JSONException e) {
143+
throw new RuntimeException(e);
144+
}
145+
final Integer ID = newJSONObject.optInt("id");
146+
final NetworkLogSnapshot modifiedSnapshot = new NetworkLogSnapshot(
147+
newJSONObject.optString("url"),
148+
null,
149+
null,
150+
null,
151+
null,
152+
newJSONObject.optInt("responseCode")
153+
);
154+
155+
final OnCompleteCallback<NetworkLogSnapshot> callback = callbackMap.get(ID);
156+
if (callback != null) {
157+
callback.onComplete(null);
158+
}
159+
callbackMap.remove(ID);
160+
161+
}
162162
}

examples/default/ios/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ PODS:
475475
- RNGestureHandler (2.13.4):
476476
- RCT-Folly (= 2021.07.22.00)
477477
- React-Core
478-
- RNInstabug (13.3.0):
478+
- RNInstabug (13.4.0):
479479
- Instabug (= 13.4.2)
480480
- React-Core
481481
- RNReanimated (3.5.4):
@@ -750,7 +750,7 @@ SPEC CHECKSUMS:
750750
ReactCommon: 3ccb8fb14e6b3277e38c73b0ff5e4a1b8db017a9
751751
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
752752
RNGestureHandler: 6e46dde1f87e5f018a54fe5d40cd0e0b942b49ee
753-
RNInstabug: 3bd51c9e01a076ed5b0bc0a10590e34272dff2fb
753+
RNInstabug: 8e7eb1df3f35b935dda661f5bb475f37cef595e6
754754
RNReanimated: ab2e96c6d5591c3dfbb38a464f54c8d17fb34a87
755755
RNScreens: b21dc57dfa2b710c30ec600786a3fc223b1b92e7
756756
RNSVG: 80584470ff1ffc7994923ea135a3e5ad825546b9

ios/RNInstabug/InstabugNetworkLoggerBridge.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,18 @@
33

44

55
@interface InstabugNtworkLoggerBridge : RCTEventEmitter <RCTBridgeModule>
6-
6+
//@property NSMutableDictionary<NSString *, IBGURLRequestAsyncObfuscationCompletedHandler> *dictionary;
77
/*
88
+------------------------------------------------------------------------+
99
| NetworkLogger Module |
1010
+------------------------------------------------------------------------+
1111
*/
1212

1313
- (void)isNativeInterceptionEnabled:(RCTPromiseResolveBlock)resolve :(RCTPromiseRejectBlock)reject;
14+
15+
- (void) registerNetworkLogsListener;
16+
17+
- (void) updateNetworkLogSnapshot: (NSString * _Nonnull)jsonString;
18+
19+
- (void) setNetworkLoggingRequestFilterPredicateIOS:(BOOL)value;
1420
@end

ios/RNInstabug/InstabugNetworkLoggerBridge.m

Lines changed: 72 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
#import "InstabugNetworkLoggerBridge.h"
88
#import "Util/IBGNetworkLogger+CP.h"
99

10+
1011
@implementation InstabugNtworkLoggerBridge
12+
//@property NSMutableDictionary<NSString *, IBGURLRequestAsyncObfuscationCompletedHandler> *dictionary;
13+
14+
1115

1216
- (dispatch_queue_t)methodQueue {
1317
return dispatch_get_main_queue();
@@ -20,14 +24,16 @@ + (BOOL)requiresMainQueueSetup
2024

2125
- (NSArray<NSString *> *)supportedEvents {
2226
return @[
23-
@"IBGpreInvocationHandler"
27+
@"IBGpreInvocationHandler",
28+
@"IBGNetworkLoggerHandler"
2429
];
2530
}
2631
RCT_EXPORT_MODULE(IBGNetworkLogger)
2732

2833
bool hasListeners = NO;
2934

3035

36+
3137
// Will be called when this module's first listener is added.
3238
-(void)startObserving {
3339
hasListeners = YES;
@@ -44,74 +50,76 @@ -(void)stopObserving {
4450
resolve(@(IBGNetworkLogger.isNativeNetworkInterceptionFeatureEnabled));
4551
}
4652

47-
48-
// RCT_EXPORT_METHOD(registerNetworkLogsListener){
49-
// [IBGNetworkLogger setRequestObfuscationHandlerV2:^(NSURLRequest * _Nonnull request, void (^ _Nonnull completionHandler)(NSURLRequest * _Nonnull)) {
50-
// NSString *tempId = [[[NSUUID alloc] init] UUIDString];
51-
// self.dictionary[tempId] = completionHandler;
52-
//
53-
// // Ensure the URL, HTTP body, and headers are in the correct format
54-
// NSString *urlString = request.URL.absoluteString ?: @"";
55-
// NSString *bodyString = [[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding] ?: @"";
56-
// NSDictionary *headerDict = request.allHTTPHeaderFields ?: @{};
57-
//
58-
// // Create the dictionary to send
59-
// NSDictionary *dict = @{
60-
// @"tempId": tempId,
61-
// @"url": urlString,
62-
// @"requestBody": bodyString,
63-
// @"requestHeader": headerDict
64-
// };
65-
//
66-
// // Send the event
67-
// [self sendEventWithName:@"IBGNetworkLoggerHandler" body:dict];
68-
//
69-
// }];
70-
// }
71-
//
72-
// RCT_EXPORT_METHOD(updateNetworkLogSnapshot:(NSString * _Nonnull)jsonString) {
73-
// // Properly initialize the NSMutableURLRequest
74-
// NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
53+
//RCT_EXPORT_METHOD(registerNetworkLogsListener){
7554
//
76-
// // Convert jsonString to NSData
77-
// NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
55+
// [IBGNetworkLogger setRequestAsyncObfuscationHandler:^(NSURLRequest *requestToBeObfuscated, IBGURLRequestAsyncObfuscationCompletedHandler completion) {
7856
//
79-
// // Parse the JSON into a dictionary
80-
// NSError *error = nil;
81-
// NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
57+
// NSString *tempId = [[[NSUUID alloc] init] UUIDString];
58+
// self.dictionary[tempId] = completion;
8259
//
83-
// // Check for JSON parsing errors
84-
// if (error) {
85-
// NSLog(@"Failed to parse JSON: %@", error);
86-
// return;
87-
// }
60+
// // Ensure the URL, HTTP body, and headers are in the correct format
61+
// NSString *urlString = requestToBeObfuscated.URL.absoluteString ?: @"";
62+
// NSString *bodyString = [[NSString alloc] initWithData:requestToBeObfuscated.HTTPBody encoding:NSUTF8StringEncoding] ?: @"";
63+
// NSDictionary *headerDict = requestToBeObfuscated.allHTTPHeaderFields ?: @{};
8864
//
89-
// // Set the URL, HTTP body, and headers
90-
// request.URL = [NSURL URLWithString:dict[@"url"]];
91-
// request.HTTPBody = [dict[@"requestBody"] dataUsingEncoding:NSUTF8StringEncoding];
65+
// // Create the dictionary to send
66+
// NSDictionary *dict = @{
67+
// @"tempId": tempId,
68+
// @"url": urlString,
69+
// @"requestBody": bodyString,
70+
// @"requestHeader": headerDict
71+
// };
9272
//
93-
// // Ensure requestHeader is a dictionary
94-
// if ([dict[@"requestHeader"] isKindOfClass:[NSDictionary class]]) {
95-
// request.allHTTPHeaderFields = dict[@"requestHeader"];
96-
// } else {
97-
// NSLog(@"Invalid requestHeader format");
98-
// // return;
99-
// }
73+
// // Send the event
74+
// [self sendEventWithName:@"IBGNetworkLoggerHandler" body:dict];
10075
//
101-
// // Ensure self.completion is not nil before calling it
102-
// NSString *tempId = dict[@"tempId"];
103-
// if ([tempId isKindOfClass:[NSString class]] && self.dictionary[tempId] != nil) {
104-
// ((IBGURLRequestObfuscationHandler)self.dictionary[tempId])(request);
105-
// } else {
106-
// NSLog(@"Not Available Completion");
107-
// }
108-
// }
109-
//
110-
// RCT_EXPORT_METHOD(setNetworkLoggingRequestFilterPredicateIOS: (BOOL)value){
111-
//
112-
// NSPredicate *requestPredicate = [NSPredicate predicateWithValue:(value) ? YES : NO];
113-
//
114-
// [IBGNetworkLogger setNetworkLoggingRequestFilterPredicate:requestPredicate responseFilterPredicate:nil];
115-
// }
76+
// }];
77+
//}
78+
79+
80+
//RCT_EXPORT_METHOD(updateNetworkLogSnapshot:(NSString * _Nonnull)jsonString) {
81+
// // Properly initialize the NSMutableURLRequest
82+
// NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
83+
//
84+
// // Convert jsonString to NSData
85+
// NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
86+
//
87+
// // Parse the JSON into a dictionary
88+
// NSError *error = nil;
89+
// NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
90+
//
91+
// // Check for JSON parsing errors
92+
// if (error) {
93+
// NSLog(@"Failed to parse JSON: %@", error);
94+
// return;
95+
// }
96+
//
97+
// // Set the URL, HTTP body, and headers
98+
// request.URL = [NSURL URLWithString:dict[@"url"]];
99+
// request.HTTPBody = [dict[@"requestBody"] dataUsingEncoding:NSUTF8StringEncoding];
100+
//
101+
// // Ensure requestHeader is a dictionary
102+
// if ([dict[@"requestHeader"] isKindOfClass:[NSDictionary class]]) {
103+
// request.allHTTPHeaderFields = dict[@"requestHeader"];
104+
// } else {
105+
// NSLog(@"Invalid requestHeader format");
106+
//// return;
107+
// }
108+
//
109+
// // Ensure self.completion is not nil before calling it
110+
// NSString *tempId = dict[@"tempId"];
111+
// if ([tempId isKindOfClass:[NSString class]] && self.dictionary[tempId] != nil) {
112+
// ((IBGURLRequestObfuscationHandler)self.dictionary[tempId])(request);
113+
// } else {
114+
// NSLog(@"Not Available Completion");
115+
// }
116+
//}
117+
118+
RCT_EXPORT_METHOD(setNetworkLoggingRequestFilterPredicateIOS: (BOOL)value){
119+
120+
NSPredicate *requestPredicate = [NSPredicate predicateWithValue:(value) ? YES : NO];
121+
122+
[IBGNetworkLogger setNetworkLoggingRequestFilterPredicate:requestPredicate responseFilterPredicate:nil];
123+
}
116124

117125
@end

ios/RNInstabug/InstabugReactBridge.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,6 @@
123123
gqlQueryName:(NSString * _Nullable)gqlQueryName
124124
serverErrorMessage:(NSString * _Nullable)serverErrorMessage;
125125

126-
// - (void) registerNetworkLogsListener;
127-
//
128-
// - (void) updateNetworkLogSnapshot: (NSString * _Nonnull)jsonString;
129-
//
130-
// - (void) setNetworkLoggingRequestFilterPredicateIOS:(BOOL)value;
131-
132126
/*
133127
+------------------------------------------------------------------------+
134128
| Experiments |

ios/RNInstabug/Util/IBGNetworkLogger+CP.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ NS_ASSUME_NONNULL_BEGIN
3131
generatedW3CTraceparent:(NSString * _Nullable)generatedW3CTraceparent
3232
caughtedW3CTraceparent:(NSString * _Nullable)caughtedW3CTraceparent;
3333

34+
+ (void)setRequestAsyncObfuscationHandler:(void (^)(NSURLRequest * requestToBeObfuscated, void (^ completion)(NSURLRequest * obfuscatedRequest)))asyncObfuscationHandler;
35+
+ (void)setRequestFilteringHandler:(void (^)(NSURLRequest * request, void (^completion)(BOOL keep)))requestFilteringHandler;
36+
+ (void)setResponseFilteringHandler:(void (^)(NSURLResponse * response, void (^comppletion)(BOOL keep)))responseFilteringHandler;
37+
3438
@end
3539

3640
NS_ASSUME_NONNULL_END

src/native/NativeNetworkLogger.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@ import { NativeModules } from './NativePackage';
22
import { NativeEventEmitter, type NativeModule } from 'react-native';
33

44
export interface NetworkLoggerNativeModule extends NativeModule {
5-
// Network logging Flags //
65
isNativeInterceptionEnabled(): Promise<boolean>;
6+
// Android only
77
isAPMNetworkEnabled(): Promise<boolean>;
8+
// Android only
89
hasAPMNetworkPlugin(): Promise<boolean>;
910

10-
// registerNetworkLogsListener(): void;
11-
// updateNetworkLogSnapshot(networkData: string): void;
12-
// setNetworkLoggingRequestFilterPredicateIOS(value: boolean): void;
11+
registerNetworkLogsListener(): void;
12+
13+
updateNetworkLogSnapshot(networkData: string): void;
14+
// iOS only
15+
setNetworkLoggingRequestFilterPredicateIOS(value: boolean): void;
1316
}
1417

1518
export const NativeNetworkLogger = NativeModules.IBGNetworkLogger;

0 commit comments

Comments
 (0)