From c96cafd1cad87ae17afa475a817d8374a5348f6a Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 29 Jul 2020 18:58:31 -0700 Subject: [PATCH] Fix crash, stale allowAllScripts and allowedOrigins --- .../Browser View/BrowserViewController.swift | 8 ++++--- .../ScriptPolicyViewController.swift | 16 ++++++++++---- .../SBRProcessBundleBridge.m | 21 +++++++++++++------ SBrowserProcessBundle/SBRProcessPlugin.m | 7 ++++--- SBrowserProcessBundle/SBRWebProcessDelegate.h | 3 ++- 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/SBrowser/Browser View/BrowserViewController.swift b/SBrowser/Browser View/BrowserViewController.swift index 77b208b..b39344b 100644 --- a/SBrowser/Browser View/BrowserViewController.swift +++ b/SBrowser/Browser View/BrowserViewController.swift @@ -57,9 +57,11 @@ class BrowserViewController: UIViewController, toolbarController.scriptControllerIconView.addAction(UIAction(handler: { action in let hostOrigin = webView.url?.host ?? "" let loadedScripts = self.allowedScriptOrigins.union(self.blockedScriptOrigins) - let scriptViewController = ScriptPolicyViewController(policyManager: self.policyManager, hostOrigin: hostOrigin, loadedScripts: loadedScripts) + let scriptViewController = ScriptPolicyViewController(policyManager: self.policyManager, + hostOrigin: hostOrigin, + loadedScripts: loadedScripts, + scriptsAllowedForTab: self.javaScriptEnabledForTab) scriptViewController.delegate = self - scriptViewController.allowScriptsForTab = self.javaScriptEnabledForTab let navController = UINavigationController(rootViewController: scriptViewController) navController.modalPresentationStyle = .popover @@ -95,7 +97,7 @@ class BrowserViewController: UIViewController, } override func viewDidLoad() { - beginLoadingURL(URL(string: "https://google.com")!) + beginLoadingURL(URL(string: "https://news.ycombinator.com")!) } override func viewWillAppear(_ animated: Bool) { diff --git a/SBrowser/Script Policy UI/ScriptPolicyViewController.swift b/SBrowser/Script Policy UI/ScriptPolicyViewController.swift index 90efd42..739de72 100644 --- a/SBrowser/Script Policy UI/ScriptPolicyViewController.swift +++ b/SBrowser/Script Policy UI/ScriptPolicyViewController.swift @@ -90,8 +90,9 @@ class ScriptPolicyViewController: UIViewController, UICollectionViewDelegate private static let enableScriptsForTabItem: String = "enableScriptsForTab" - convenience init(policyManager: ResourcePolicyManager, hostOrigin: String, loadedScripts: Set) { + convenience init(policyManager: ResourcePolicyManager, hostOrigin: String, loadedScripts: Set, scriptsAllowedForTab: Bool) { self.init(nibName: nil, bundle: nil) + allowScriptsForTab = scriptsAllowedForTab let listConfig = UICollectionLayoutListConfiguration(appearance: .grouped) let listLayout = UICollectionViewCompositionalLayout.list(using: listConfig) @@ -117,7 +118,9 @@ class ScriptPolicyViewController: UIViewController, UICollectionViewDelegate // Hide script origins snapshot.deleteSections([ .origins ]) } else { - snapshot.appendSections([ .origins ]) + if !snapshot.sectionIdentifiers.contains(.origins) { + snapshot.appendSections([ .origins ]) + } snapshot.appendItems(originItems, toSection: .origins) } @@ -177,9 +180,14 @@ class ScriptPolicyViewController: UIViewController, UICollectionViewDelegate collectionView.delegate = self var snapshot = dataSource.snapshot() - snapshot.appendSections([ .tabOptions, .origins ]) + snapshot.appendSections([ .tabOptions ]) snapshot.appendItems([ Self.enableScriptsForTabItem ], toSection: .tabOptions) - snapshot.appendItems(originItems, toSection: .origins) + + if !allowScriptsForTab { + snapshot.appendSections([ .origins ]) + snapshot.appendItems(originItems, toSection: .origins) + } + dataSource.apply(snapshot) self.dataSource = dataSource diff --git a/SBrowser/Web Process Bundle Bridge/SBRProcessBundleBridge.m b/SBrowser/Web Process Bundle Bridge/SBRProcessBundleBridge.m index c04ec4c..5ea6a6d 100644 --- a/SBrowser/Web Process Bundle Bridge/SBRProcessBundleBridge.m +++ b/SBrowser/Web Process Bundle Bridge/SBRProcessBundleBridge.m @@ -27,6 +27,7 @@ @implementation SBRProcessBundleBridge { WKWebView *_webView; WKWebViewConfiguration *_webViewConfiguration; + WKProcessPool *_processPool; id _webProcessProxy; _WKUserStyleSheet *_darkModeStyleSheet; @@ -41,15 +42,15 @@ [poolConfiguration setInjectedBundleURL:bundleURL]; // Set up process pool - WKProcessPool *processPool = [[WKProcessPool alloc] _initWithConfiguration:poolConfiguration]; + _processPool = [[WKProcessPool alloc] _initWithConfiguration:poolConfiguration]; // Initialize allowed origins now NSArray *allowedOrigins = [[_policyDataSource allowedOriginsForScriptResources] allObjects]; - [processPool _setObject:allowedOrigins forBundleParameter:SBRGetAllowedOriginsKey()]; - [processPool _setObject:@(_allowAllScripts) forBundleParameter:SBRGetAllScriptsAllowedKey()]; + [_processPool _setObject:allowedOrigins forBundleParameter:SBRGetAllowedOriginsKey()]; + [_processPool _setObject:@(_allowAllScripts) forBundleParameter:SBRGetAllScriptsAllowedKey()]; WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; - configuration.processPool = processPool; + configuration.processPool = _processPool; // Instantiate web view WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration]; @@ -78,9 +79,14 @@ [self policyDataSourceDidChange]; } -- (void)webProcessDidLoadScriptWithOrigin:(NSString *)origin +- (void)webProcessDidAllowScriptWithOrigin:(NSString *)origin { - [_delegate webProcess:self didBlockScriptResourceFromOrigin:origin]; + [[self delegate] webProcess:self didAllowScriptResourceFromOrigin:origin]; +} + +- (void)webProcessDidBlockScriptWithOrigin:(NSString *)origin +{ + [[self delegate] webProcess:self didBlockScriptResourceFromOrigin:origin]; } #pragma mark Actions @@ -88,11 +94,14 @@ - (void)policyDataSourceDidChange { NSArray *allowedOrigins = [[_policyDataSource allowedOriginsForScriptResources] allObjects]; + [_processPool _setObject:allowedOrigins forBundleParameter:SBRGetAllowedOriginsKey()]; [_webProcessProxy syncAllowedResourceOrigins:allowedOrigins]; } - (void)setAllowAllScripts:(BOOL)allowAllScripts { + _allowAllScripts = allowAllScripts; + [_processPool _setObject:@(_allowAllScripts) forBundleParameter:SBRGetAllScriptsAllowedKey()]; [_webProcessProxy setAllScriptsAllowed:allowAllScripts]; } diff --git a/SBrowserProcessBundle/SBRProcessPlugin.m b/SBrowserProcessBundle/SBRProcessPlugin.m index 16a059f..2bac957 100644 --- a/SBrowserProcessBundle/SBRProcessPlugin.m +++ b/SBrowserProcessBundle/SBRProcessPlugin.m @@ -54,7 +54,7 @@ { _allowedResourceOrigins = [[plugInController parameters] valueForKey:SBRGetAllowedOriginsKey()]; _allScriptsAllowed = [[[plugInController parameters] valueForKey:SBRGetAllScriptsAllowedKey()] boolValue]; - NSLog(@"Got %lu allowed script origins at initialization", (unsigned long)_allowedResourceOrigins.count); + NSLog(@"SBRProcessPlugin: %lu origins allowed, all scripts allowed: %@ ", (unsigned long)_allowedResourceOrigins.count, _allScriptsAllowed ? @"YES" : @"NO"); } - (void)webProcessPlugIn:(WKWebProcessPlugInController *)plugInController didCreateBrowserContextController:(WKWebProcessPlugInBrowserContextController *)browserContextController @@ -83,12 +83,13 @@ NSString *originString = [requestURL host]; NSString *requestExtension = [requestURL pathExtension]; if (requestExtension.length > 0 && [requestExtension isEqualToString:@"js"]) { - [[self processDelegate] webProcessDidLoadScriptWithOrigin:originString]; - 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; } } diff --git a/SBrowserProcessBundle/SBRWebProcessDelegate.h b/SBrowserProcessBundle/SBRWebProcessDelegate.h index b785497..d0730b1 100644 --- a/SBrowserProcessBundle/SBRWebProcessDelegate.h +++ b/SBrowserProcessBundle/SBRWebProcessDelegate.h @@ -10,6 +10,7 @@ @protocol SBRWebProcessDelegate - (void)webProcessDidConnect; -- (void)webProcessDidLoadScriptWithOrigin:(NSString *)origin; +- (void)webProcessDidBlockScriptWithOrigin:(NSString *)origin; +- (void)webProcessDidAllowScriptWithOrigin:(NSString *)origin; @end