Fix crash, stale allowAllScripts and allowedOrigins

This commit is contained in:
James Magahern
2020-07-29 18:58:31 -07:00
parent 663dfcd2bb
commit c96cafd1ca
5 changed files with 38 additions and 17 deletions

View File

@@ -57,9 +57,11 @@ class BrowserViewController: UIViewController,
toolbarController.scriptControllerIconView.addAction(UIAction(handler: { action in toolbarController.scriptControllerIconView.addAction(UIAction(handler: { action in
let hostOrigin = webView.url?.host ?? "" let hostOrigin = webView.url?.host ?? ""
let loadedScripts = self.allowedScriptOrigins.union(self.blockedScriptOrigins) 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.delegate = self
scriptViewController.allowScriptsForTab = self.javaScriptEnabledForTab
let navController = UINavigationController(rootViewController: scriptViewController) let navController = UINavigationController(rootViewController: scriptViewController)
navController.modalPresentationStyle = .popover navController.modalPresentationStyle = .popover
@@ -95,7 +97,7 @@ class BrowserViewController: UIViewController,
} }
override func viewDidLoad() { override func viewDidLoad() {
beginLoadingURL(URL(string: "https://google.com")!) beginLoadingURL(URL(string: "https://news.ycombinator.com")!)
} }
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {

View File

@@ -90,8 +90,9 @@ class ScriptPolicyViewController: UIViewController, UICollectionViewDelegate
private static let enableScriptsForTabItem: String = "enableScriptsForTab" private static let enableScriptsForTabItem: String = "enableScriptsForTab"
convenience init(policyManager: ResourcePolicyManager, hostOrigin: String, loadedScripts: Set<String>) { convenience init(policyManager: ResourcePolicyManager, hostOrigin: String, loadedScripts: Set<String>, scriptsAllowedForTab: Bool) {
self.init(nibName: nil, bundle: nil) self.init(nibName: nil, bundle: nil)
allowScriptsForTab = scriptsAllowedForTab
let listConfig = UICollectionLayoutListConfiguration(appearance: .grouped) let listConfig = UICollectionLayoutListConfiguration(appearance: .grouped)
let listLayout = UICollectionViewCompositionalLayout.list(using: listConfig) let listLayout = UICollectionViewCompositionalLayout.list(using: listConfig)
@@ -117,7 +118,9 @@ class ScriptPolicyViewController: UIViewController, UICollectionViewDelegate
// Hide script origins // Hide script origins
snapshot.deleteSections([ .origins ]) snapshot.deleteSections([ .origins ])
} else { } else {
snapshot.appendSections([ .origins ]) if !snapshot.sectionIdentifiers.contains(.origins) {
snapshot.appendSections([ .origins ])
}
snapshot.appendItems(originItems, toSection: .origins) snapshot.appendItems(originItems, toSection: .origins)
} }
@@ -177,9 +180,14 @@ class ScriptPolicyViewController: UIViewController, UICollectionViewDelegate
collectionView.delegate = self collectionView.delegate = self
var snapshot = dataSource.snapshot() var snapshot = dataSource.snapshot()
snapshot.appendSections([ .tabOptions, .origins ]) snapshot.appendSections([ .tabOptions ])
snapshot.appendItems([ Self.enableScriptsForTabItem ], toSection: .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) dataSource.apply(snapshot)
self.dataSource = dataSource self.dataSource = dataSource

View File

@@ -27,6 +27,7 @@
@implementation SBRProcessBundleBridge { @implementation SBRProcessBundleBridge {
WKWebView *_webView; WKWebView *_webView;
WKWebViewConfiguration *_webViewConfiguration; WKWebViewConfiguration *_webViewConfiguration;
WKProcessPool *_processPool;
id<SBRWebProcessProxy> _webProcessProxy; id<SBRWebProcessProxy> _webProcessProxy;
_WKUserStyleSheet *_darkModeStyleSheet; _WKUserStyleSheet *_darkModeStyleSheet;
@@ -41,15 +42,15 @@
[poolConfiguration setInjectedBundleURL:bundleURL]; [poolConfiguration setInjectedBundleURL:bundleURL];
// Set up process pool // Set up process pool
WKProcessPool *processPool = [[WKProcessPool alloc] _initWithConfiguration:poolConfiguration]; _processPool = [[WKProcessPool alloc] _initWithConfiguration:poolConfiguration];
// Initialize allowed origins now // Initialize allowed origins now
NSArray<NSString *> *allowedOrigins = [[_policyDataSource allowedOriginsForScriptResources] allObjects]; NSArray<NSString *> *allowedOrigins = [[_policyDataSource allowedOriginsForScriptResources] allObjects];
[processPool _setObject:allowedOrigins forBundleParameter:SBRGetAllowedOriginsKey()]; [_processPool _setObject:allowedOrigins forBundleParameter:SBRGetAllowedOriginsKey()];
[processPool _setObject:@(_allowAllScripts) forBundleParameter:SBRGetAllScriptsAllowedKey()]; [_processPool _setObject:@(_allowAllScripts) forBundleParameter:SBRGetAllScriptsAllowedKey()];
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.processPool = processPool; configuration.processPool = _processPool;
// Instantiate web view // Instantiate web view
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration]; WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
@@ -78,9 +79,14 @@
[self policyDataSourceDidChange]; [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 #pragma mark Actions
@@ -88,11 +94,14 @@
- (void)policyDataSourceDidChange - (void)policyDataSourceDidChange
{ {
NSArray<NSString *> *allowedOrigins = [[_policyDataSource allowedOriginsForScriptResources] allObjects]; NSArray<NSString *> *allowedOrigins = [[_policyDataSource allowedOriginsForScriptResources] allObjects];
[_processPool _setObject:allowedOrigins forBundleParameter:SBRGetAllowedOriginsKey()];
[_webProcessProxy syncAllowedResourceOrigins:allowedOrigins]; [_webProcessProxy syncAllowedResourceOrigins:allowedOrigins];
} }
- (void)setAllowAllScripts:(BOOL)allowAllScripts - (void)setAllowAllScripts:(BOOL)allowAllScripts
{ {
_allowAllScripts = allowAllScripts;
[_processPool _setObject:@(_allowAllScripts) forBundleParameter:SBRGetAllScriptsAllowedKey()];
[_webProcessProxy setAllScriptsAllowed:allowAllScripts]; [_webProcessProxy setAllScriptsAllowed:allowAllScripts];
} }

View File

@@ -54,7 +54,7 @@
{ {
_allowedResourceOrigins = [[plugInController parameters] valueForKey:SBRGetAllowedOriginsKey()]; _allowedResourceOrigins = [[plugInController parameters] valueForKey:SBRGetAllowedOriginsKey()];
_allScriptsAllowed = [[[plugInController parameters] valueForKey:SBRGetAllScriptsAllowedKey()] boolValue]; _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 - (void)webProcessPlugIn:(WKWebProcessPlugInController *)plugInController didCreateBrowserContextController:(WKWebProcessPlugInBrowserContextController *)browserContextController
@@ -83,12 +83,13 @@
NSString *originString = [requestURL host]; NSString *originString = [requestURL host];
NSString *requestExtension = [requestURL pathExtension]; NSString *requestExtension = [requestURL pathExtension];
if (requestExtension.length > 0 && [requestExtension isEqualToString:@"js"]) { if (requestExtension.length > 0 && [requestExtension isEqualToString:@"js"]) {
[[self processDelegate] webProcessDidLoadScriptWithOrigin:originString];
if ([self allScriptsAllowed] || [_allowedResourceOrigins containsObject:originString]) { if ([self allScriptsAllowed] || [_allowedResourceOrigins containsObject:originString]) {
NSLog(@"SBRProcessPlugin: Allowing whitelisted requestURL: %@", requestURL); NSLog(@"SBRProcessPlugin: Allowing whitelisted requestURL: %@", requestURL);
[[self processDelegate] webProcessDidAllowScriptWithOrigin:originString];
} else { } else {
NSLog(@"SBRProcessPlugin: Blocking requestURL: %@", requestURL); NSLog(@"SBRProcessPlugin: Blocking requestURL: %@", requestURL);
[[self processDelegate] webProcessDidBlockScriptWithOrigin:originString];
request = nil; request = nil;
} }
} }

View File

@@ -10,6 +10,7 @@
@protocol SBRWebProcessDelegate <NSObject> @protocol SBRWebProcessDelegate <NSObject>
- (void)webProcessDidConnect; - (void)webProcessDidConnect;
- (void)webProcessDidLoadScriptWithOrigin:(NSString *)origin; - (void)webProcessDidBlockScriptWithOrigin:(NSString *)origin;
- (void)webProcessDidAllowScriptWithOrigin:(NSString *)origin;
@end @end