// // SBRProcessPlugin.m // SBrowserProcessBundle // // Created by James Magahern on 7/22/20. // #import "SBRProcessPlugin.h" #import "SBRWebProcessDelegate.h" #import "SBRWebProcessProxy.h" #import #import #import #import #import @interface SBRProcessPlugin () @property (nonatomic, strong) id processDelegate; @property (nonatomic, assign) BOOL allScriptsAllowed; @property (nonatomic, strong) NSMutableSet *allowedResourceOrigins; @property (nonatomic, strong) NSDictionary *policyTypeByOrigin; @end @implementation SBRProcessPlugin + (void)initialize { [super initialize]; NSLog(@"SBRProcessPlugin Initialized"); } #pragma mark - (void)hello { NSLog(@"SBRProcessPlugin: Helloooooo"); } - (void)syncAllowedResourceOrigins:(NSArray *)allowedOrigins { _allowedResourceOrigins = [NSMutableSet setWithArray:allowedOrigins]; } - (void)syncPolicyTypes:(NSDictionary *)policyTypes { _policyTypeByOrigin = policyTypes; } - (void)setAllScriptsAllowed:(BOOL)allScriptsAllowed { _allScriptsAllowed = allScriptsAllowed; } #pragma mark - (void)webProcessPlugIn:(WKWebProcessPlugInController *)plugInController initializeWithObject:(id)initializationObject { _allowedResourceOrigins = [[plugInController parameters] valueForKey:SBRGetAllowedOriginsKey()]; _allScriptsAllowed = [[[plugInController parameters] valueForKey:SBRGetAllScriptsAllowedKey()] boolValue]; NSLog(@"SBRProcessPlugin: %lu origins allowed, all scripts allowed: %@ ", (unsigned long)_allowedResourceOrigins.count, _allScriptsAllowed ? @"YES" : @"NO"); } - (void)webProcessPlugIn:(WKWebProcessPlugInController *)plugInController didCreateBrowserContextController:(WKWebProcessPlugInBrowserContextController *)browserContextController { _WKRemoteObjectInterface *proxyInterface = [_WKRemoteObjectInterface remoteObjectInterfaceWithProtocol:@protocol(SBRWebProcessProxy)]; [browserContextController._remoteObjectRegistry registerExportedObject:self interface:proxyInterface]; _WKRemoteObjectInterface *eventListenerInterface = [_WKRemoteObjectInterface remoteObjectInterfaceWithProtocol:@protocol(SBRWebProcessDelegate)]; self.processDelegate = [browserContextController._remoteObjectRegistry remoteObjectProxyWithInterface:eventListenerInterface]; browserContextController.loadDelegate = self; [[self processDelegate] webProcessDidConnect]; } #pragma mark - (NSURLRequest *)webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller frame:(WKWebProcessPlugInFrame *)frame willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse { NSLog(@"SBRProcessPlugin: Sending request: %@", request); if (_allowedResourceOrigins == nil) { NSLog(@"Allowed resource origins should not be nil!!!!"); } NSURL *requestURL = [request URL]; NSString *originString = [requestURL host]; NSString *requestExtension = [requestURL pathExtension]; if (requestExtension.length > 0 && [requestExtension isEqualToString:@"js"]) { if ([self allScriptsAllowed] || [_allowedResourceOrigins containsObject:originString]) { NSLog(@"SBRProcessPlugin: Allowing whitelisted requestURL: %@", requestURL); [[self processDelegate] webProcessDidAllowScriptWithOrigin:originString]; } else { NSLog(@"SBRProcessPlugin: Blocking requestURL: %@", requestURL); [[self processDelegate] webProcessDidBlockScriptWithOrigin:originString]; request = nil; } } return request; } @end