From f5b00deb7e5aac26049a24ad61a789a252920f8e Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Sun, 31 Jan 2021 13:48:26 -0800 Subject: [PATCH 01/16] safari: initial commit. this is just the output of `xcrun safari-web-extension-converter .` in `extension/` it doesn't work yet (well, it runs without any errors, but it doesn't know to invoke the tabfs process; it just talks to the stub app from the generator) --- .../safari/TabFS/TabFS Extension/Info.plist | 33 ++ .../SafariWebExtensionHandler.swift | 26 + .../TabFS_Extension.entitlements | 10 + .../TabFS/TabFS.xcodeproj/project.pbxproj | 514 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 19916 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 24 + .../xcschemes/xcschememanagement.plist | 14 + .../safari/TabFS/TabFS/AppDelegate.swift | 21 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 58 ++ .../TabFS/TabFS/Assets.xcassets/Contents.json | 6 + .../TabFS/TabFS/Base.lproj/Main.storyboard | 168 ++++++ extension/safari/TabFS/TabFS/Info.plist | 30 + .../safari/TabFS/TabFS/TabFS.entitlements | 10 + .../safari/TabFS/TabFS/ViewController.swift | 51 ++ 17 files changed, 991 insertions(+) create mode 100644 extension/safari/TabFS/TabFS Extension/Info.plist create mode 100644 extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift create mode 100644 extension/safari/TabFS/TabFS Extension/TabFS_Extension.entitlements create mode 100644 extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj create mode 100644 extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 extension/safari/TabFS/TabFS/AppDelegate.swift create mode 100644 extension/safari/TabFS/TabFS/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 extension/safari/TabFS/TabFS/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 extension/safari/TabFS/TabFS/Assets.xcassets/Contents.json create mode 100644 extension/safari/TabFS/TabFS/Base.lproj/Main.storyboard create mode 100644 extension/safari/TabFS/TabFS/Info.plist create mode 100644 extension/safari/TabFS/TabFS/TabFS.entitlements create mode 100644 extension/safari/TabFS/TabFS/ViewController.swift diff --git a/extension/safari/TabFS/TabFS Extension/Info.plist b/extension/safari/TabFS/TabFS Extension/Info.plist new file mode 100644 index 0000000..290ddc8 --- /dev/null +++ b/extension/safari/TabFS/TabFS Extension/Info.plist @@ -0,0 +1,33 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + TabFS Extension + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSExtension + + NSExtensionPointIdentifier + com.apple.Safari.web-extension + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).SafariWebExtensionHandler + + + diff --git a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift new file mode 100644 index 0000000..f026b0b --- /dev/null +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -0,0 +1,26 @@ +// +// SafariWebExtensionHandler.swift +// TabFS Extension +// +// Created by Omar Rizwan on 1/31/21. +// + +import SafariServices +import os.log + +let SFExtensionMessageKey = "message" + +class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { + + func beginRequest(with context: NSExtensionContext) { + let item = context.inputItems[0] as! NSExtensionItem + let message = item.userInfo?[SFExtensionMessageKey] + os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@", message as! CVarArg) + + let response = NSExtensionItem() + response.userInfo = [ SFExtensionMessageKey: [ "Response to": message ] ] + + context.completeRequest(returningItems: [response], completionHandler: nil) + } + +} diff --git a/extension/safari/TabFS/TabFS Extension/TabFS_Extension.entitlements b/extension/safari/TabFS/TabFS Extension/TabFS_Extension.entitlements new file mode 100644 index 0000000..f2ef3ae --- /dev/null +++ b/extension/safari/TabFS/TabFS Extension/TabFS_Extension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + + diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5885330 --- /dev/null +++ b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj @@ -0,0 +1,514 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + F04429F625C7507200D998A5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04429F525C7507200D998A5 /* AppDelegate.swift */; }; + F04429F925C7507200D998A5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F04429F725C7507200D998A5 /* Main.storyboard */; }; + F04429FB25C7507200D998A5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04429FA25C7507200D998A5 /* ViewController.swift */; }; + F04429FD25C7507400D998A5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F04429FC25C7507400D998A5 /* Assets.xcassets */; }; + F0442A0425C7507400D998A5 /* TabFS Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = F0442A0325C7507400D998A5 /* TabFS Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + F0442A0925C7507400D998A5 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0442A0825C7507400D998A5 /* Cocoa.framework */; }; + F0442A0C25C7507400D998A5 /* SafariWebExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0442A0B25C7507400D998A5 /* SafariWebExtensionHandler.swift */; }; + F0442A1D25C7507500D998A5 /* background.js in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1925C7507500D998A5 /* background.js */; }; + F0442A1E25C7507500D998A5 /* safari in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1A25C7507500D998A5 /* safari */; }; + F0442A1F25C7507500D998A5 /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1B25C7507500D998A5 /* manifest.json */; }; + F0442A2025C7507500D998A5 /* vendor in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1C25C7507500D998A5 /* vendor */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + F0442A0525C7507400D998A5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F04429E925C7507200D998A5 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F0442A0225C7507400D998A5; + remoteInfo = "TabFS Extension"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + F0442A1425C7507400D998A5 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + F0442A0425C7507400D998A5 /* TabFS Extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + F04429F125C7507200D998A5 /* TabFS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TabFS.app; sourceTree = BUILT_PRODUCTS_DIR; }; + F04429F425C7507200D998A5 /* TabFS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TabFS.entitlements; sourceTree = ""; }; + F04429F525C7507200D998A5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + F04429F825C7507200D998A5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + F04429FA25C7507200D998A5 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + F04429FC25C7507400D998A5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + F04429FE25C7507400D998A5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F0442A0325C7507400D998A5 /* TabFS Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "TabFS Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + F0442A0825C7507400D998A5 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + F0442A0B25C7507400D998A5 /* SafariWebExtensionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariWebExtensionHandler.swift; sourceTree = ""; }; + F0442A0D25C7507400D998A5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F0442A0E25C7507400D998A5 /* TabFS_Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TabFS_Extension.entitlements; sourceTree = ""; }; + F0442A1925C7507500D998A5 /* background.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = background.js; path = ../../../background.js; sourceTree = ""; }; + F0442A1A25C7507500D998A5 /* safari */ = {isa = PBXFileReference; lastKnownFileType = folder; name = safari; path = ../..; sourceTree = ""; }; + F0442A1B25C7507500D998A5 /* manifest.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = manifest.json; path = ../../../manifest.json; sourceTree = ""; }; + F0442A1C25C7507500D998A5 /* vendor */ = {isa = PBXFileReference; lastKnownFileType = folder; name = vendor; path = ../../../vendor; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + F04429EE25C7507200D998A5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F0442A0025C7507400D998A5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F0442A0925C7507400D998A5 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + F04429E825C7507200D998A5 = { + isa = PBXGroup; + children = ( + F04429F325C7507200D998A5 /* TabFS */, + F0442A0A25C7507400D998A5 /* TabFS Extension */, + F0442A0725C7507400D998A5 /* Frameworks */, + F04429F225C7507200D998A5 /* Products */, + ); + sourceTree = ""; + }; + F04429F225C7507200D998A5 /* Products */ = { + isa = PBXGroup; + children = ( + F04429F125C7507200D998A5 /* TabFS.app */, + F0442A0325C7507400D998A5 /* TabFS Extension.appex */, + ); + name = Products; + sourceTree = ""; + }; + F04429F325C7507200D998A5 /* TabFS */ = { + isa = PBXGroup; + children = ( + F04429F425C7507200D998A5 /* TabFS.entitlements */, + F04429F525C7507200D998A5 /* AppDelegate.swift */, + F04429F725C7507200D998A5 /* Main.storyboard */, + F04429FA25C7507200D998A5 /* ViewController.swift */, + F04429FC25C7507400D998A5 /* Assets.xcassets */, + F04429FE25C7507400D998A5 /* Info.plist */, + ); + path = TabFS; + sourceTree = ""; + }; + F0442A0725C7507400D998A5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + F0442A0825C7507400D998A5 /* Cocoa.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + F0442A0A25C7507400D998A5 /* TabFS Extension */ = { + isa = PBXGroup; + children = ( + F0442A1825C7507500D998A5 /* Resources */, + F0442A0B25C7507400D998A5 /* SafariWebExtensionHandler.swift */, + F0442A0D25C7507400D998A5 /* Info.plist */, + F0442A0E25C7507400D998A5 /* TabFS_Extension.entitlements */, + ); + path = "TabFS Extension"; + sourceTree = ""; + }; + F0442A1825C7507500D998A5 /* Resources */ = { + isa = PBXGroup; + children = ( + F0442A1925C7507500D998A5 /* background.js */, + F0442A1A25C7507500D998A5 /* safari */, + F0442A1B25C7507500D998A5 /* manifest.json */, + F0442A1C25C7507500D998A5 /* vendor */, + ); + name = Resources; + path = "TabFS Extension"; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + F04429F025C7507200D998A5 /* TabFS */ = { + isa = PBXNativeTarget; + buildConfigurationList = F0442A1525C7507400D998A5 /* Build configuration list for PBXNativeTarget "TabFS" */; + buildPhases = ( + F04429ED25C7507200D998A5 /* Sources */, + F04429EE25C7507200D998A5 /* Frameworks */, + F04429EF25C7507200D998A5 /* Resources */, + F0442A1425C7507400D998A5 /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + F0442A0625C7507400D998A5 /* PBXTargetDependency */, + ); + name = TabFS; + productName = TabFS; + productReference = F04429F125C7507200D998A5 /* TabFS.app */; + productType = "com.apple.product-type.application"; + }; + F0442A0225C7507400D998A5 /* TabFS Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = F0442A1125C7507400D998A5 /* Build configuration list for PBXNativeTarget "TabFS Extension" */; + buildPhases = ( + F04429FF25C7507400D998A5 /* Sources */, + F0442A0025C7507400D998A5 /* Frameworks */, + F0442A0125C7507400D998A5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "TabFS Extension"; + productName = "TabFS Extension"; + productReference = F0442A0325C7507400D998A5 /* TabFS Extension.appex */; + productType = "com.apple.product-type.app-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + F04429E925C7507200D998A5 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1210; + LastUpgradeCheck = 1210; + TargetAttributes = { + F04429F025C7507200D998A5 = { + CreatedOnToolsVersion = 12.1; + }; + F0442A0225C7507400D998A5 = { + CreatedOnToolsVersion = 12.1; + }; + }; + }; + buildConfigurationList = F04429EC25C7507200D998A5 /* Build configuration list for PBXProject "TabFS" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = F04429E825C7507200D998A5; + productRefGroup = F04429F225C7507200D998A5 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F04429F025C7507200D998A5 /* TabFS */, + F0442A0225C7507400D998A5 /* TabFS Extension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + F04429EF25C7507200D998A5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F04429FD25C7507400D998A5 /* Assets.xcassets in Resources */, + F04429F925C7507200D998A5 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F0442A0125C7507400D998A5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F0442A2025C7507500D998A5 /* vendor in Resources */, + F0442A1E25C7507500D998A5 /* safari in Resources */, + F0442A1F25C7507500D998A5 /* manifest.json in Resources */, + F0442A1D25C7507500D998A5 /* background.js in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + F04429ED25C7507200D998A5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F04429FB25C7507200D998A5 /* ViewController.swift in Sources */, + F04429F625C7507200D998A5 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F04429FF25C7507400D998A5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F0442A0C25C7507400D998A5 /* SafariWebExtensionHandler.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + F0442A0625C7507400D998A5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F0442A0225C7507400D998A5 /* TabFS Extension */; + targetProxy = F0442A0525C7507400D998A5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + F04429F725C7507200D998A5 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + F04429F825C7507200D998A5 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + F0442A0F25C7507400D998A5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + F0442A1025C7507400D998A5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + F0442A1225C7507400D998A5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = "TabFS Extension/TabFS_Extension.entitlements"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "TabFS Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.14; + PRODUCT_BUNDLE_IDENTIFIER = "com.rsnous.TabFS-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + F0442A1325C7507400D998A5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = "TabFS Extension/TabFS_Extension.entitlements"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "TabFS Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.14; + PRODUCT_BUNDLE_IDENTIFIER = "com.rsnous.TabFS-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + F0442A1625C7507400D998A5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = TabFS/TabFS.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = TabFS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.14; + PRODUCT_BUNDLE_IDENTIFIER = com.rsnous.TabFS; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + F0442A1725C7507400D998A5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = TabFS/TabFS.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = TabFS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.14; + PRODUCT_BUNDLE_IDENTIFIER = com.rsnous.TabFS; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + F04429EC25C7507200D998A5 /* Build configuration list for PBXProject "TabFS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F0442A0F25C7507400D998A5 /* Debug */, + F0442A1025C7507400D998A5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F0442A1125C7507400D998A5 /* Build configuration list for PBXNativeTarget "TabFS Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F0442A1225C7507400D998A5 /* Debug */, + F0442A1325C7507400D998A5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F0442A1525C7507400D998A5 /* Build configuration list for PBXNativeTarget "TabFS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F0442A1625C7507400D998A5 /* Debug */, + F0442A1725C7507400D998A5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = F04429E925C7507200D998A5 /* Project object */; +} diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..4a4220ca6771660e86218a23ae101d1ffc372500 GIT binary patch literal 19916 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 literal 0 HcmV?d00001 diff --git a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..3fadf29 --- /dev/null +++ b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcschemes/xcschememanagement.plist b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..b51b6ed --- /dev/null +++ b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + TabFS.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/extension/safari/TabFS/TabFS/AppDelegate.swift b/extension/safari/TabFS/TabFS/AppDelegate.swift new file mode 100644 index 0000000..21dacdd --- /dev/null +++ b/extension/safari/TabFS/TabFS/AppDelegate.swift @@ -0,0 +1,21 @@ +// +// AppDelegate.swift +// TabFS +// +// Created by Omar Rizwan on 1/31/21. +// + +import Cocoa + +@NSApplicationMain +class AppDelegate: NSObject, NSApplicationDelegate { + + func applicationDidFinishLaunching(_ aNotification: Notification) { + // Insert code here to initialize your application + } + + func applicationWillTerminate(_ aNotification: Notification) { + // Insert code here to tear down your application + } + +} diff --git a/extension/safari/TabFS/TabFS/Assets.xcassets/AccentColor.colorset/Contents.json b/extension/safari/TabFS/TabFS/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/extension/safari/TabFS/TabFS/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/extension/safari/TabFS/TabFS/Assets.xcassets/AppIcon.appiconset/Contents.json b/extension/safari/TabFS/TabFS/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..50ab7bd --- /dev/null +++ b/extension/safari/TabFS/TabFS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/extension/safari/TabFS/TabFS/Assets.xcassets/Contents.json b/extension/safari/TabFS/TabFS/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/extension/safari/TabFS/TabFS/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/extension/safari/TabFS/TabFS/Base.lproj/Main.storyboard b/extension/safari/TabFS/TabFS/Base.lproj/Main.storyboard new file mode 100644 index 0000000..2e5a681 --- /dev/null +++ b/extension/safari/TabFS/TabFS/Base.lproj/Main.storyboard @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extension/safari/TabFS/TabFS/Info.plist b/extension/safari/TabFS/TabFS/Info.plist new file mode 100644 index 0000000..cfbbdb7 --- /dev/null +++ b/extension/safari/TabFS/TabFS/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + diff --git a/extension/safari/TabFS/TabFS/TabFS.entitlements b/extension/safari/TabFS/TabFS/TabFS.entitlements new file mode 100644 index 0000000..f2ef3ae --- /dev/null +++ b/extension/safari/TabFS/TabFS/TabFS.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + + diff --git a/extension/safari/TabFS/TabFS/ViewController.swift b/extension/safari/TabFS/TabFS/ViewController.swift new file mode 100644 index 0000000..98cc7a5 --- /dev/null +++ b/extension/safari/TabFS/TabFS/ViewController.swift @@ -0,0 +1,51 @@ +// +// ViewController.swift +// TabFS +// +// Created by Omar Rizwan on 1/31/21. +// + +import Cocoa +import SafariServices.SFSafariApplication +import SafariServices.SFSafariExtensionManager + +let appName = "TabFS" +let extensionBundleIdentifier = "com.rsnous.TabFS-Extension" + +class ViewController: NSViewController { + + @IBOutlet var appNameLabel: NSTextField! + + override func viewDidLoad() { + super.viewDidLoad() + self.appNameLabel.stringValue = appName + SFSafariExtensionManager.getStateOfSafariExtension(withIdentifier: extensionBundleIdentifier) { (state, error) in + guard let state = state, error == nil else { + // Insert code to inform the user that something went wrong. + return + } + + DispatchQueue.main.async { + if (state.isEnabled) { + self.appNameLabel.stringValue = "\(appName)'s extension is currently on." + } else { + self.appNameLabel.stringValue = "\(appName)'s extension is currently off. You can turn it on in Safari Extensions preferences." + } + } + } + } + + @IBAction func openSafariExtensionPreferences(_ sender: AnyObject?) { + SFSafariApplication.showPreferencesForExtension(withIdentifier: extensionBundleIdentifier) { error in + guard error == nil else { + // Insert code to inform the user that something went wrong. + return + } + + DispatchQueue.main.async { + NSApplication.shared.terminate(nil) + } + } + } + +} From a465ad6a8fbb64184dcdcfa451dbb2aa9346ac2d Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Tue, 2 Feb 2021 23:07:24 -0800 Subject: [PATCH 02/16] safari: checkpoint as I try to get the terrible wiring right --- extension/background.js | 14 ++++ .../TabFS Extension/FSProcessManager.swift | 72 ++++++++++++++++++ .../SafariWebExtensionHandler.swift | 37 ++++++--- .../TabFS/TabFS.xcodeproj/project.pbxproj | 4 + .../UserInterfaceState.xcuserstate | Bin 19916 -> 34829 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 48 ++++++++++++ .../TabFS/TabFS/Base.lproj/Main.storyboard | 27 +++++-- .../safari/TabFS/TabFS/ViewController.swift | 3 + 8 files changed, 188 insertions(+), 17 deletions(-) create mode 100644 extension/safari/TabFS/TabFS Extension/FSProcessManager.swift diff --git a/extension/background.js b/extension/background.js index 5e487cf..e6fba2b 100644 --- a/extension/background.js +++ b/extension/background.js @@ -673,6 +673,10 @@ function findRoute(path) { let port; async function onMessage(req) { + // Safari / Safari extension app API forces you to adopt their + // {name, userInfo} structure for the request. + if (req.name === 'ToSafari') req = req.userInfo; + if (req.buf) req.buf = atob(req.buf); console.log('req', req); @@ -712,6 +716,16 @@ function tryConnect() { port = chrome.runtime.connectNative('com.rsnous.tabfs'); port.onMessage.addListener(onMessage); port.onDisconnect.addListener(p => {console.log('disconnect', p)}); + + // Safari is very weird -- it has this native app that we have to talk to, + // so we poke that app to wake it up, get it to start the TabFS process, + // and get it to start calling us whenever TabFS wants to do an FS call. + // Is there a better way to do this? + if (chrome.runtime.getURL('/').startsWith('safari-web-extension://')) { // Safari-only + chrome.runtime.sendNativeMessage('com.rsnous.tabfs', {op: 'safari_did_connect'}, function(resp) { + console.log(resp); + }); + } } if (!TESTING) { diff --git a/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift b/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift new file mode 100644 index 0000000..d17d934 --- /dev/null +++ b/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift @@ -0,0 +1,72 @@ +// +// FSProcessManager.swift +// TabFS +// +// Created by Omar Rizwan on 1/31/21. +// + +import Foundation + +import SafariServices.SFSafariApplication + +let extensionBundleIdentifier = "com.rsnous.TabFS-Extension" + +class FSProcessManager { + static let shared = FSProcessManager() + + // FIXME: should accept XPC connection to extension + // so it can get replies (??) + + var fs: Process! + var fsInput: FileHandle! + var fsOutput: FileHandle! + + func start() { + fs = Process() + fs.executableURL = URL(fileURLWithPath: "/Users/osnr/Code/tabfs/fs/tabfs") + fs.arguments = [] + + let inputPipe = Pipe(), outputPipe = Pipe() + fs.standardInput = inputPipe + fs.standardOutput = outputPipe + + try! fs.run() + + fsInput = inputPipe.fileHandleForWriting + fsOutput = outputPipe.fileHandleForReading +// +// SFSafariApplication.dispatchMessage( +// withName: "ToSafari", +// toExtensionWithIdentifier: extensionBundleIdentifier, +// userInfo: [:] +// ) { error in +// debugPrint("Message attempted. Error info: \(String.init(describing: error))") +// } + + DispatchQueue.global(qos: .background).async { + while true { + let req = self.awaitRequest() + + SFSafariApplication.dispatchMessage( + withName: "ToSafari", + toExtensionWithIdentifier: extensionBundleIdentifier, + userInfo: req + ) { error in + debugPrint("Message attempted. Error info: \(String.init(describing: error))") + } + } + } + } + + func awaitRequest() -> [String: Any] { + let length = fsOutput.readData(ofLength: 4).withUnsafeBytes { + $0.load(as: UInt32.self) + } + let data = fsOutput.readData(ofLength: Int(length)) + return try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any] + } + + func respond(_ resp: [AnyHashable: Any]) { + try! fsInput.write(JSONSerialization.data(withJSONObject: resp, options: [])) + } +} diff --git a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift index f026b0b..6ae1aae 100644 --- a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -6,21 +6,38 @@ // import SafariServices +import SafariServices.SFSafariApplication import os.log -let SFExtensionMessageKey = "message" - class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { - + func beginRequest(with context: NSExtensionContext) { + + os_log(.default, "Received message from browser.runtime.sendNativefffMessage: %@", context as! CVarArg) + let item = context.inputItems[0] as! NSExtensionItem - let message = item.userInfo?[SFExtensionMessageKey] - os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@", message as! CVarArg) - - let response = NSExtensionItem() - response.userInfo = [ SFExtensionMessageKey: [ "Response to": message ] ] - - context.completeRequest(returningItems: [response], completionHandler: nil) + guard let message = item.userInfo?["message"] as? [AnyHashable: Any] else { return } + + if message["op"] as! String == "safari_did_connect" { + FSProcessManager.shared.start() + + let response = NSExtensionItem() + response.userInfo = [ "message": [ "aResponse to": "moop" ] ] + context.completeRequest(returningItems: [response], completionHandler: nil) + + return + } +// +// os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@", op as! CVarArg) + + FSProcessManager.shared.respond(message) +// +// let response = NSExtensionItem() +// response.userInfo = [ "message": [ "Response to": op ] ] +// +// // How do I get too the app???? +// +// context.completeRequest(returningItems: [response], completionHandler: nil) } } diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj index 5885330..4b063e1 100644 --- a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj +++ b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ F0442A1E25C7507500D998A5 /* safari in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1A25C7507500D998A5 /* safari */; }; F0442A1F25C7507500D998A5 /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1B25C7507500D998A5 /* manifest.json */; }; F0442A2025C7507500D998A5 /* vendor in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1C25C7507500D998A5 /* vendor */; }; + F068D65625C7C66700DB3AB5 /* FSProcessManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F068D65225C77F7600DB3AB5 /* FSProcessManager.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -61,6 +62,7 @@ F0442A1A25C7507500D998A5 /* safari */ = {isa = PBXFileReference; lastKnownFileType = folder; name = safari; path = ../..; sourceTree = ""; }; F0442A1B25C7507500D998A5 /* manifest.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = manifest.json; path = ../../../manifest.json; sourceTree = ""; }; F0442A1C25C7507500D998A5 /* vendor */ = {isa = PBXFileReference; lastKnownFileType = folder; name = vendor; path = ../../../vendor; sourceTree = ""; }; + F068D65225C77F7600DB3AB5 /* FSProcessManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FSProcessManager.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -125,6 +127,7 @@ F0442A0A25C7507400D998A5 /* TabFS Extension */ = { isa = PBXGroup; children = ( + F068D65225C77F7600DB3AB5 /* FSProcessManager.swift */, F0442A1825C7507500D998A5 /* Resources */, F0442A0B25C7507400D998A5 /* SafariWebExtensionHandler.swift */, F0442A0D25C7507400D998A5 /* Info.plist */, @@ -257,6 +260,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + F068D65625C7C66700DB3AB5 /* FSProcessManager.swift in Sources */, F0442A0C25C7507400D998A5 /* SafariWebExtensionHandler.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 4a4220ca6771660e86218a23ae101d1ffc372500..231f2f7ad08e4dfef24bbf973884054072661897 100644 GIT binary patch delta 19585 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 HMrZ#Y5gQE# delta 8011 zcmaJ_2V7HE+dtzbKoYXILP8cdLx!k;13`j{0|$azWCTPJEZ{(toU2w_J8fLmY6YyT zia4s()>*Y`ebuU+?zYxhwXNEr)$b$`>)Ws22fyUz-h0OL{GaiEp7Yw9=-5*D=4b@F z&nrmqjs&AX9vBVEz<5v&D!>F#4W@!xz=0WHHkbom1#f@_U?ErpmVxD<9=r!uf%RYm z_yBAJ+rfw6Yw!*D7Mum=z1Tm+ZEW$+#N9{d2VfFHqCa1GoBcfdXH7(9UhLWm%S z;ZO`EPzqI0=Y@J030Y`|v9LYt025&+*cGNiH_U)NU|*O82f|!93>L!@I0lx&Dp(CC z!bxx{oD1KC3*i#D95%p4xEgMN&2SUk47b4T@FTbf9)`!^8Td6k2QR_P@CtkgAHl!i zWB3FC1Q9|QF(?#yB}j$TC=wZv5t)$%S&9o^bT5vmZNvk3RI68P$OE2)}gKFL$m|!Lc7r!^ac77 zeTBY8-=J^NS#%DaN0-qxFS?EHpx@B%=plN98O+12aBCcaBe4M+aTGRTGqzwB$Kp5~ zj}vhcPQ_`s8&1c)aUWcO3vm(l;9^{Y$KX;t7LUUfcoLqBr{Fs5#dGjW_+>m7zlDAH zZM+08#ar-J`~lvEx8o1-4!jeO{0M)Hcj4W558jLS;r;j%d;lNEC-6!9IsOKJkAJ{d z@Q?T^zJ{;kU-3PBA3tCK0~y3%CY%v75=PFL7&BvGtc;CuFm0F^CYDKHl9?_{s&6Z= z3qw94Cf@_zG+`pyLHI;N5{cbc$A6;H*4DO7jB^>=$4z$`YvbF+(cj5&alQp1ZVd~1 z(2-i=B5g=KX-nGCyCgdAZb-9f2yirl9FPkJ6CKf$R*hgNy&X+�Vo7Tz(XQPBry=BpEfKpIGqKKJT=(pY16jmaC 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 diff --git a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 3fadf29..3f0b7de 100644 --- a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -8,9 +8,57 @@ BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + + + + + + + + + + + + - + - + + @@ -66,7 +67,7 @@ - + @@ -97,18 +98,28 @@ - + - + - + - + + @@ -138,11 +149,13 @@ DQ + + diff --git a/extension/safari/TabFS/TabFS/ViewController.swift b/extension/safari/TabFS/TabFS/ViewController.swift index 98cc7a5..958de47 100644 --- a/extension/safari/TabFS/TabFS/ViewController.swift +++ b/extension/safari/TabFS/TabFS/ViewController.swift @@ -48,4 +48,7 @@ class ViewController: NSViewController { } } + @IBAction func startTabFSAndConnect(_ sender: Any) { +// FSProcessManager.start() + } } From 33e5911cb2741ae57ef41ec245636733568f362c Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Sun, 7 Feb 2021 02:46:07 -0800 Subject: [PATCH 03/16] trying to just run straight from sandbox instead of xpc -- kinda works! blocked on libfuse --- extension/background.js | 5 +++++ .../TabFS Extension/FSProcessManager.swift | 6 +++++- .../SafariWebExtensionHandler.swift | 8 ++++---- .../TabFS_Extension.entitlements | 8 ++++---- .../UserInterfaceState.xcuserstate | Bin 34829 -> 40591 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 +++--- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/extension/background.js b/extension/background.js index e6fba2b..f38f29e 100644 --- a/extension/background.js +++ b/extension/background.js @@ -713,19 +713,24 @@ async function onMessage(req) { }; function tryConnect() { + console.log('start tryConnect'); port = chrome.runtime.connectNative('com.rsnous.tabfs'); + console.log('start tryConnect - did connectNative'); port.onMessage.addListener(onMessage); port.onDisconnect.addListener(p => {console.log('disconnect', p)}); + console.log('tryConnect - about to sNM'); // Safari is very weird -- it has this native app that we have to talk to, // so we poke that app to wake it up, get it to start the TabFS process, // and get it to start calling us whenever TabFS wants to do an FS call. // Is there a better way to do this? if (chrome.runtime.getURL('/').startsWith('safari-web-extension://')) { // Safari-only chrome.runtime.sendNativeMessage('com.rsnous.tabfs', {op: 'safari_did_connect'}, function(resp) { + console.log('didConnect resp'); console.log(resp); }); } + console.log('tryConnect - did sNM'); } if (!TESTING) { diff --git a/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift b/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift index d17d934..ecfea87 100644 --- a/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift +++ b/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift @@ -8,6 +8,7 @@ import Foundation import SafariServices.SFSafariApplication +import os.log let extensionBundleIdentifier = "com.rsnous.TabFS-Extension" @@ -24,6 +25,9 @@ class FSProcessManager { func start() { fs = Process() fs.executableURL = URL(fileURLWithPath: "/Users/osnr/Code/tabfs/fs/tabfs") + + os_log(.default, "url: %{public}@", fs.executableURL as! NSURL) + fs.arguments = [] let inputPipe = Pipe(), outputPipe = Pipe() @@ -34,7 +38,7 @@ class FSProcessManager { fsInput = inputPipe.fileHandleForWriting fsOutput = outputPipe.fileHandleForReading -// +// // SFSafariApplication.dispatchMessage( // withName: "ToSafari", // toExtensionWithIdentifier: extensionBundleIdentifier, diff --git a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift index 6ae1aae..e582e96 100644 --- a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -20,10 +20,10 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { if message["op"] as! String == "safari_did_connect" { FSProcessManager.shared.start() - - let response = NSExtensionItem() - response.userInfo = [ "message": [ "aResponse to": "moop" ] ] - context.completeRequest(returningItems: [response], completionHandler: nil) +// +// let response = NSExtensionItem() +// response.userInfo = [ "message": [ "aResponse to": "moop" ] ] +// context.completeRequest(returningItems: [response], completionHandler: nil) return } diff --git a/extension/safari/TabFS/TabFS Extension/TabFS_Extension.entitlements b/extension/safari/TabFS/TabFS Extension/TabFS_Extension.entitlements index f2ef3ae..3ebfe4c 100644 --- a/extension/safari/TabFS/TabFS Extension/TabFS_Extension.entitlements +++ b/extension/safari/TabFS/TabFS Extension/TabFS_Extension.entitlements @@ -2,9 +2,9 @@ - com.apple.security.app-sandbox - - com.apple.security.files.user-selected.read-only - + com.apple.security.app-sandbox + + com.apple.security.files.all + diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 231f2f7ad08e4dfef24bbf973884054072661897..90dd5fe6e0c1302bb59001b590c788681c1bb0bf 100644 GIT binary patch delta 22159 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%0DZgDxs26nkmhdQl+!fP3fr|qV!V+D2Hp6 zG0J#lk}_49p)6FED9e>fWwo+axj^}$@~0}Ns-acsRRvYWRb^EbRc%${t0q>xT!pHp zR?V(jQuSt4f7P0*4OQ<}y;rrl>VvBNRp+WMR{f=-Ro<#dRkA8Ym8wctm8dFJDpjqj zQPrYqSB+7&U)O$9d$IOX?bX`rwKr>T*WOi2)PCv=b-P-p-l_gp{b!wHomZVtoqt_mU3gto zT})kEU1D8wU20u=T}fSeowBaFPF+`DH??kl-J-fT>Xy~@)vc~uTlZGoj=EiShqZOb z>rT|2uKS|ytGaLMF4o%4X-r3+AybKeuJ)IS;Lx!w;DDyyxZ_z!{&yq z4SO2)H5_X=*>I-ee8Yu?ZyUaExZLod;bEf|G*XRhqomQS(W23*QQjER7~VL%F|skL zF{UxTF{v@Nv7)i6vAVGq|6h*A#uj{9MuY!JS$E@Wjhh?KHU8S<*c8*GZkpP(s_C7k z_nNjeZEM=w^hwi^rcaxWH+|l8vgzBV%T3psZZ_R*`myP!riaaBGt+F{Y}ahx?9}Yq z?5=H=H7lA!n!}shn*IE~}E^1xbx})__>xI^PZFHMMo4hTlt*Wi1t+Q=H+lsa|ZEM@M zw;gIb+IGC{MBC}MuiCz8`>ySB+tv0#?IG=H?fLD>_Ud+ZdqaD3dt1AveRBKM_MY~c z?X%k#Xxm?JU(&v;eMS4>_Fpva8h=f&CQ6f_N!FxkGBpL7VojN*Qd6aA)HG|xYqXkI zG}AP_nz@?SGz&GaYu?cGYu0GCXm)D$X!dIkX^v`+YfflRYtCveXs-4o^`!O`_0;y% z_cZmi_Go%Kd&c%m>6zZs+w*GAoSu0-uk|eGnY^>-VlUSl(i_fO@2t#@zlzTN}9M|&^!Uh2Ktd!zSO t@7><}y+8N<()(NQAH7dzNM@MMFrQ&*2vI})PejBYiO%rX_&y`${{e-B%N_s# delta 16863 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 diff --git a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 3f0b7de..4af142b 100644 --- a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -30,8 +30,8 @@ filePath = "TabFS Extension/FSProcessManager.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "25" - endingLineNumber = "25" + startingLineNumber = "26" + endingLineNumber = "26" landmarkName = "start()" landmarkType = "7"> @@ -56,7 +56,7 @@ BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> Date: Sun, 7 Feb 2021 16:10:37 -0800 Subject: [PATCH 04/16] safari: merge XPC service to run tabfs process. it builds but haven't hooked it in yet --- .../TabFS/TabFS.xcodeproj/project.pbxproj | 135 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 40591 -> 57443 bytes .../xcschemes/xcschememanagement.plist | 5 + .../safari/TabFS/TabFSService/Info.plist | 29 ++++ .../TabFS/TabFSService/TabFSService.swift | 69 +++++++++ .../TabFSService/TabFSServiceProtocols.swift | 17 +++ .../safari/TabFS/TabFSService/main.swift | 13 ++ 7 files changed, 268 insertions(+) create mode 100644 extension/safari/TabFS/TabFSService/Info.plist create mode 100644 extension/safari/TabFS/TabFSService/TabFSService.swift create mode 100644 extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift create mode 100644 extension/safari/TabFS/TabFSService/main.swift diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj index 4b063e1..d8f6003 100644 --- a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj +++ b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj @@ -7,6 +7,11 @@ objects = { /* Begin PBXBuildFile section */ + F028D2B625D0B7370095C2D5 /* TabFSService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B525D0B7370095C2D5 /* TabFSService.swift */; }; + F028D2B825D0B7370095C2D5 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B725D0B7370095C2D5 /* main.swift */; }; + F028D2BC25D0B7370095C2D5 /* TabFSService.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = F028D2B125D0B7370095C2D5 /* TabFSService.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + F028D2D725D0B8500095C2D5 /* TabFSServiceProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B325D0B7370095C2D5 /* TabFSServiceProtocols.swift */; }; + F028D2DE25D0B8590095C2D5 /* TabFSServiceProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B325D0B7370095C2D5 /* TabFSServiceProtocols.swift */; }; F04429F625C7507200D998A5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04429F525C7507200D998A5 /* AppDelegate.swift */; }; F04429F925C7507200D998A5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F04429F725C7507200D998A5 /* Main.storyboard */; }; F04429FB25C7507200D998A5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04429FA25C7507200D998A5 /* ViewController.swift */; }; @@ -22,6 +27,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + F028D2BA25D0B7370095C2D5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F04429E925C7507200D998A5 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F028D2B025D0B7370095C2D5; + remoteInfo = TabFSService; + }; F0442A0525C7507400D998A5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = F04429E925C7507200D998A5 /* Project object */; @@ -32,6 +44,17 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + F028D2BD25D0B7370095C2D5 /* Embed XPC Services */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/XPCServices"; + dstSubfolderSpec = 16; + files = ( + F028D2BC25D0B7370095C2D5 /* TabFSService.xpc in Embed XPC Services */, + ); + name = "Embed XPC Services"; + runOnlyForDeploymentPostprocessing = 0; + }; F0442A1425C7507400D998A5 /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -46,6 +69,11 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + F028D2B125D0B7370095C2D5 /* TabFSService.xpc */ = {isa = PBXFileReference; explicitFileType = "wrapper.xpc-service"; includeInIndex = 0; path = TabFSService.xpc; sourceTree = BUILT_PRODUCTS_DIR; }; + F028D2B325D0B7370095C2D5 /* TabFSServiceProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabFSServiceProtocols.swift; sourceTree = ""; }; + F028D2B525D0B7370095C2D5 /* TabFSService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabFSService.swift; sourceTree = ""; }; + F028D2B725D0B7370095C2D5 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + F028D2B925D0B7370095C2D5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F04429F125C7507200D998A5 /* TabFS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TabFS.app; sourceTree = BUILT_PRODUCTS_DIR; }; F04429F425C7507200D998A5 /* TabFS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TabFS.entitlements; sourceTree = ""; }; F04429F525C7507200D998A5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -66,6 +94,13 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + F028D2AE25D0B7370095C2D5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; F04429EE25C7507200D998A5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -84,11 +119,23 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + F028D2B225D0B7370095C2D5 /* TabFSService */ = { + isa = PBXGroup; + children = ( + F028D2B325D0B7370095C2D5 /* TabFSServiceProtocols.swift */, + F028D2B525D0B7370095C2D5 /* TabFSService.swift */, + F028D2B725D0B7370095C2D5 /* main.swift */, + F028D2B925D0B7370095C2D5 /* Info.plist */, + ); + path = TabFSService; + sourceTree = ""; + }; F04429E825C7507200D998A5 = { isa = PBXGroup; children = ( F04429F325C7507200D998A5 /* TabFS */, F0442A0A25C7507400D998A5 /* TabFS Extension */, + F028D2B225D0B7370095C2D5 /* TabFSService */, F0442A0725C7507400D998A5 /* Frameworks */, F04429F225C7507200D998A5 /* Products */, ); @@ -99,6 +146,7 @@ children = ( F04429F125C7507200D998A5 /* TabFS.app */, F0442A0325C7507400D998A5 /* TabFS Extension.appex */, + F028D2B125D0B7370095C2D5 /* TabFSService.xpc */, ); name = Products; sourceTree = ""; @@ -151,6 +199,23 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + F028D2B025D0B7370095C2D5 /* TabFSService */ = { + isa = PBXNativeTarget; + buildConfigurationList = F028D2C025D0B7370095C2D5 /* Build configuration list for PBXNativeTarget "TabFSService" */; + buildPhases = ( + F028D2AD25D0B7370095C2D5 /* Sources */, + F028D2AE25D0B7370095C2D5 /* Frameworks */, + F028D2AF25D0B7370095C2D5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TabFSService; + productName = TabFSService; + productReference = F028D2B125D0B7370095C2D5 /* TabFSService.xpc */; + productType = "com.apple.product-type.xpc-service"; + }; F04429F025C7507200D998A5 /* TabFS */ = { isa = PBXNativeTarget; buildConfigurationList = F0442A1525C7507400D998A5 /* Build configuration list for PBXNativeTarget "TabFS" */; @@ -159,11 +224,13 @@ F04429EE25C7507200D998A5 /* Frameworks */, F04429EF25C7507200D998A5 /* Resources */, F0442A1425C7507400D998A5 /* Embed App Extensions */, + F028D2BD25D0B7370095C2D5 /* Embed XPC Services */, ); buildRules = ( ); dependencies = ( F0442A0625C7507400D998A5 /* PBXTargetDependency */, + F028D2BB25D0B7370095C2D5 /* PBXTargetDependency */, ); name = TabFS; productName = TabFS; @@ -196,6 +263,9 @@ LastSwiftUpdateCheck = 1210; LastUpgradeCheck = 1210; TargetAttributes = { + F028D2B025D0B7370095C2D5 = { + CreatedOnToolsVersion = 12.1; + }; F04429F025C7507200D998A5 = { CreatedOnToolsVersion = 12.1; }; @@ -219,11 +289,19 @@ targets = ( F04429F025C7507200D998A5 /* TabFS */, F0442A0225C7507400D998A5 /* TabFS Extension */, + F028D2B025D0B7370095C2D5 /* TabFSService */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + F028D2AF25D0B7370095C2D5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; F04429EF25C7507200D998A5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -247,6 +325,16 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + F028D2AD25D0B7370095C2D5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F028D2B825D0B7370095C2D5 /* main.swift in Sources */, + F028D2B625D0B7370095C2D5 /* TabFSService.swift in Sources */, + F028D2D725D0B8500095C2D5 /* TabFSServiceProtocols.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; F04429ED25C7507200D998A5 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -260,6 +348,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + F028D2DE25D0B8590095C2D5 /* TabFSServiceProtocols.swift in Sources */, F068D65625C7C66700DB3AB5 /* FSProcessManager.swift in Sources */, F0442A0C25C7507400D998A5 /* SafariWebExtensionHandler.swift in Sources */, ); @@ -268,6 +357,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + F028D2BB25D0B7370095C2D5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F028D2B025D0B7370095C2D5 /* TabFSService */; + targetProxy = F028D2BA25D0B7370095C2D5 /* PBXContainerItemProxy */; + }; F0442A0625C7507400D998A5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = F0442A0225C7507400D998A5 /* TabFS Extension */; @@ -287,6 +381,38 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + F028D2BE25D0B7370095C2D5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + ENABLE_HARDENED_RUNTIME = YES; + INFOPLIST_FILE = TabFSService/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.rsnous.TabFSService; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_INTERFACE_HEADER_NAME = ""; + SWIFT_VERSION = 4.2; + }; + name = Debug; + }; + F028D2BF25D0B7370095C2D5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + ENABLE_HARDENED_RUNTIME = YES; + INFOPLIST_FILE = TabFSService/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.rsnous.TabFSService; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_INTERFACE_HEADER_NAME = ""; + SWIFT_VERSION = 4.2; + }; + name = Release; + }; F0442A0F25C7507400D998A5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -485,6 +611,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + F028D2C025D0B7370095C2D5 /* Build configuration list for PBXNativeTarget "TabFSService" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F028D2BE25D0B7370095C2D5 /* Debug */, + F028D2BF25D0B7370095C2D5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; F04429EC25C7507200D998A5 /* Build configuration list for PBXProject "TabFS" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 90dd5fe6e0c1302bb59001b590c788681c1bb0bf..0ed33c6b977d690b04f4aef7517264e48a610b72 100644 GIT binary patch delta 29481 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 delta 18312 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 0 + TabFSService.xcscheme_^#shared#^_ + + orderHint + 1 + diff --git a/extension/safari/TabFS/TabFSService/Info.plist b/extension/safari/TabFS/TabFSService/Info.plist new file mode 100644 index 0000000..8b1c3aa --- /dev/null +++ b/extension/safari/TabFS/TabFSService/Info.plist @@ -0,0 +1,29 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + TabFSService + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + XPCService + + ServiceType + Application + + + diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift new file mode 100644 index 0000000..f91a4b4 --- /dev/null +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -0,0 +1,69 @@ +// +// TabFSService.swift +// TabFSService +// +// Created by Omar Rizwan on 2/7/21. +// + +import Foundation + +class TabFSService: NSObject, TabFSServiceProtocol { + var fs: Process! + var fsInput: FileHandle! + var fsOutput: FileHandle! + + init(app: TabFSServiceConsumerProtocol) { + super.init() + + fs = Process() + fs.executableURL = URL(fileURLWithPath: "/Users/osnr/Code/tabfs/fs/tabfs") + fs.currentDirectoryURL = fs.executableURL?.deletingLastPathComponent() + + fs.arguments = [] + + let inputPipe = Pipe(), outputPipe = Pipe() + fs.standardInput = inputPipe + fs.standardOutput = outputPipe + + fsInput = inputPipe.fileHandleForWriting + fsOutput = outputPipe.fileHandleForReading + + try! fs.run() + + // split new thread + DispatchQueue.global(qos: .default).async { + while true { + // read from them + let length = self.fsOutput.readData(ofLength: 4).withUnsafeBytes { $0.load(as: UInt32.self) } + let req = self.fsOutput.readData(ofLength: Int(length)) + // send to other side of XPC conn + app.request(req) + } + } + + // FIXME: disable auto termination + } + + func upperCaseString(_ string: String, withReply reply: @escaping (String) -> Void) { + let response = string.uppercased() + reply(response) + } + + func response(_ resp: Data) { + fsInput.write(withUnsafeBytes(of: UInt32(resp.count)) { Data($0) }) + fsInput.write(resp) + } +} + +class TabFSServiceDelegate: NSObject, NSXPCListenerDelegate { + func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool { + newConnection.remoteObjectInterface = NSXPCInterface(with: TabFSServiceConsumerProtocol.self) + + let exportedObject = TabFSService(app: newConnection.remoteObjectProxy as! TabFSServiceConsumerProtocol) + newConnection.exportedInterface = NSXPCInterface(with: TabFSServiceProtocol.self) + newConnection.exportedObject = exportedObject + + newConnection.resume() + return true + } +} diff --git a/extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift b/extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift new file mode 100644 index 0000000..298015a --- /dev/null +++ b/extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift @@ -0,0 +1,17 @@ +// +// TabFSServiceProtocols.swift +// app-sandbox-xpc-test +// +// Created by Omar Rizwan on 2/7/21. +// + +import Foundation + +@objc public protocol TabFSServiceConsumerProtocol { + func request(_ req: Data) +} +@objc public protocol TabFSServiceProtocol { + func upperCaseString(_ string: String, withReply reply: @escaping (String) -> Void) + + func response(_ resp: Data) +} diff --git a/extension/safari/TabFS/TabFSService/main.swift b/extension/safari/TabFS/TabFSService/main.swift new file mode 100644 index 0000000..39c5a75 --- /dev/null +++ b/extension/safari/TabFS/TabFSService/main.swift @@ -0,0 +1,13 @@ +// +// main.m +// TabFSService +// +// Created by Omar Rizwan on 2/7/21. +// + +import Foundation + +let delegate = TabFSServiceDelegate() +let listener = NSXPCListener.service() +listener.delegate = delegate +listener.resume() From 6f743114da084e41fa095fb0a4abb88233aa49c0 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Sun, 7 Feb 2021 21:44:46 -0800 Subject: [PATCH 05/16] safari: XPC service runs! --- .../TabFS Extension/FSProcessManager.swift | 76 ------------------ .../SafariWebExtensionHandler.swift | 51 +++++++++++- .../TabFS/TabFS.xcodeproj/project.pbxproj | 16 +++- .../UserInterfaceState.xcuserstate | Bin 57443 -> 58988 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 12 +-- .../TabFS/TabFSService/TabFSService.swift | 7 ++ 6 files changed, 72 insertions(+), 90 deletions(-) delete mode 100644 extension/safari/TabFS/TabFS Extension/FSProcessManager.swift diff --git a/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift b/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift deleted file mode 100644 index ecfea87..0000000 --- a/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift +++ /dev/null @@ -1,76 +0,0 @@ -// -// FSProcessManager.swift -// TabFS -// -// Created by Omar Rizwan on 1/31/21. -// - -import Foundation - -import SafariServices.SFSafariApplication -import os.log - -let extensionBundleIdentifier = "com.rsnous.TabFS-Extension" - -class FSProcessManager { - static let shared = FSProcessManager() - - // FIXME: should accept XPC connection to extension - // so it can get replies (??) - - var fs: Process! - var fsInput: FileHandle! - var fsOutput: FileHandle! - - func start() { - fs = Process() - fs.executableURL = URL(fileURLWithPath: "/Users/osnr/Code/tabfs/fs/tabfs") - - os_log(.default, "url: %{public}@", fs.executableURL as! NSURL) - - fs.arguments = [] - - let inputPipe = Pipe(), outputPipe = Pipe() - fs.standardInput = inputPipe - fs.standardOutput = outputPipe - - try! fs.run() - - fsInput = inputPipe.fileHandleForWriting - fsOutput = outputPipe.fileHandleForReading -// -// SFSafariApplication.dispatchMessage( -// withName: "ToSafari", -// toExtensionWithIdentifier: extensionBundleIdentifier, -// userInfo: [:] -// ) { error in -// debugPrint("Message attempted. Error info: \(String.init(describing: error))") -// } - - DispatchQueue.global(qos: .background).async { - while true { - let req = self.awaitRequest() - - SFSafariApplication.dispatchMessage( - withName: "ToSafari", - toExtensionWithIdentifier: extensionBundleIdentifier, - userInfo: req - ) { error in - debugPrint("Message attempted. Error info: \(String.init(describing: error))") - } - } - } - } - - func awaitRequest() -> [String: Any] { - let length = fsOutput.readData(ofLength: 4).withUnsafeBytes { - $0.load(as: UInt32.self) - } - let data = fsOutput.readData(ofLength: Int(length)) - return try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any] - } - - func respond(_ resp: [AnyHashable: Any]) { - try! fsInput.write(JSONSerialization.data(withJSONObject: resp, options: [])) - } -} diff --git a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift index e582e96..67da485 100644 --- a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -9,17 +9,60 @@ import SafariServices import SafariServices.SFSafariApplication import os.log +class TabFSServiceManager: TabFSServiceConsumerProtocol { + static let shared = TabFSServiceManager() + + var service: TabFSServiceProtocol! + + func connect() { + let connection = NSXPCConnection(serviceName: "com.rsnous.TabFSService") + + connection.remoteObjectInterface = NSXPCInterface(with: TabFSServiceProtocol.self) + + connection.exportedInterface = NSXPCInterface(with: TabFSServiceConsumerProtocol.self) + connection.exportedObject = self + + connection.resume() + + service = connection.remoteObjectProxyWithErrorHandler { error in + os_log(.default, "Received error: %{public}@", error as! CVarArg) + } as? TabFSServiceProtocol + + service?.upperCaseString("hello XPC") { response in + os_log(.default, "Response from XPC service: %{public}@", response) + } + } + + func request(_ req: Data) { + SFSafariApplication.dispatchMessage( + withName: "ToSafari", + toExtensionWithIdentifier: "com.rsnous.TabFS-Extension", + userInfo: try! JSONSerialization.jsonObject(with: req, options: []) as! [String : Any] + ) { error in + debugPrint("Message attempted. Error info: \(String.init(describing: error))") + } + } + + func response(_ resp: [AnyHashable: Any]) { + try! service.response(JSONSerialization.data(withJSONObject: resp, options: [])) + } +} + class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { func beginRequest(with context: NSExtensionContext) { - os_log(.default, "Received message from browser.runtime.sendNativefffMessage: %@", context as! CVarArg) + os_log(.default, "TabFSmsg Received message from browser.runtime.sendNativefffMessage: %@", context as! CVarArg) let item = context.inputItems[0] as! NSExtensionItem + + os_log(.default, "TabFSmsg item.userInfo %{public}@", item.userInfo as! CVarArg) guard let message = item.userInfo?["message"] as? [AnyHashable: Any] else { return } if message["op"] as! String == "safari_did_connect" { - FSProcessManager.shared.start() + + os_log(.default, "TabFSmsg sdc") + TabFSServiceManager.shared.connect() // // let response = NSExtensionItem() // response.userInfo = [ "message": [ "aResponse to": "moop" ] ] @@ -27,11 +70,11 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { return } + + TabFSServiceManager.shared.response(message) // // os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@", op as! CVarArg) - FSProcessManager.shared.respond(message) -// // let response = NSExtensionItem() // response.userInfo = [ "message": [ "Response to": op ] ] // diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj index d8f6003..d274516 100644 --- a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj +++ b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ F028D2BC25D0B7370095C2D5 /* TabFSService.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = F028D2B125D0B7370095C2D5 /* TabFSService.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; F028D2D725D0B8500095C2D5 /* TabFSServiceProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B325D0B7370095C2D5 /* TabFSServiceProtocols.swift */; }; F028D2DE25D0B8590095C2D5 /* TabFSServiceProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B325D0B7370095C2D5 /* TabFSServiceProtocols.swift */; }; + F028D2ED25D106F10095C2D5 /* TabFSService.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = F028D2B125D0B7370095C2D5 /* TabFSService.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; F04429F625C7507200D998A5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04429F525C7507200D998A5 /* AppDelegate.swift */; }; F04429F925C7507200D998A5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F04429F725C7507200D998A5 /* Main.storyboard */; }; F04429FB25C7507200D998A5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04429FA25C7507200D998A5 /* ViewController.swift */; }; @@ -23,7 +24,6 @@ F0442A1E25C7507500D998A5 /* safari in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1A25C7507500D998A5 /* safari */; }; F0442A1F25C7507500D998A5 /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1B25C7507500D998A5 /* manifest.json */; }; F0442A2025C7507500D998A5 /* vendor in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1C25C7507500D998A5 /* vendor */; }; - F068D65625C7C66700DB3AB5 /* FSProcessManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F068D65225C77F7600DB3AB5 /* FSProcessManager.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -55,6 +55,16 @@ name = "Embed XPC Services"; runOnlyForDeploymentPostprocessing = 0; }; + F028D2E525D106BB0095C2D5 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/XPCServices"; + dstSubfolderSpec = 16; + files = ( + F028D2ED25D106F10095C2D5 /* TabFSService.xpc in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; F0442A1425C7507400D998A5 /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -90,7 +100,6 @@ F0442A1A25C7507500D998A5 /* safari */ = {isa = PBXFileReference; lastKnownFileType = folder; name = safari; path = ../..; sourceTree = ""; }; F0442A1B25C7507500D998A5 /* manifest.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = manifest.json; path = ../../../manifest.json; sourceTree = ""; }; F0442A1C25C7507500D998A5 /* vendor */ = {isa = PBXFileReference; lastKnownFileType = folder; name = vendor; path = ../../../vendor; sourceTree = ""; }; - F068D65225C77F7600DB3AB5 /* FSProcessManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FSProcessManager.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -175,7 +184,6 @@ F0442A0A25C7507400D998A5 /* TabFS Extension */ = { isa = PBXGroup; children = ( - F068D65225C77F7600DB3AB5 /* FSProcessManager.swift */, F0442A1825C7507500D998A5 /* Resources */, F0442A0B25C7507400D998A5 /* SafariWebExtensionHandler.swift */, F0442A0D25C7507400D998A5 /* Info.plist */, @@ -244,6 +252,7 @@ F04429FF25C7507400D998A5 /* Sources */, F0442A0025C7507400D998A5 /* Frameworks */, F0442A0125C7507400D998A5 /* Resources */, + F028D2E525D106BB0095C2D5 /* CopyFiles */, ); buildRules = ( ); @@ -349,7 +358,6 @@ buildActionMask = 2147483647; files = ( F028D2DE25D0B8590095C2D5 /* TabFSServiceProtocols.swift in Sources */, - F068D65625C7C66700DB3AB5 /* FSProcessManager.swift in Sources */, F0442A0C25C7507400D998A5 /* SafariWebExtensionHandler.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 0ed33c6b977d690b04f4aef7517264e48a610b72..3d7d9f75fc7079d29b52ed55026a23ecf87dd440 100644 GIT binary patch delta 28158 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 I|9PzPKPVuw!2kdN delta 26864 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 diff --git a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 4af142b..87a2930 100644 --- a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -14,8 +14,8 @@ filePath = "TabFS Extension/SafariWebExtensionHandler.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "18" - endingLineNumber = "18" + startingLineNumber = "57" + endingLineNumber = "57" landmarkName = "beginRequest(with:)" landmarkType = "7"> @@ -46,8 +46,8 @@ filePath = "TabFS Extension/SafariWebExtensionHandler.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "19" - endingLineNumber = "19" + startingLineNumber = "60" + endingLineNumber = "60" landmarkName = "beginRequest(with:)" landmarkType = "7"> @@ -62,8 +62,8 @@ filePath = "TabFS Extension/SafariWebExtensionHandler.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "16" - endingLineNumber = "16" + startingLineNumber = "55" + endingLineNumber = "55" landmarkName = "beginRequest(with:)" landmarkType = "7"> diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift index f91a4b4..798df03 100644 --- a/extension/safari/TabFS/TabFSService/TabFSService.swift +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -6,6 +6,7 @@ // import Foundation +import os.log class TabFSService: NSObject, TabFSServiceProtocol { var fs: Process! @@ -28,7 +29,9 @@ class TabFSService: NSObject, TabFSServiceProtocol { fsInput = inputPipe.fileHandleForWriting fsOutput = outputPipe.fileHandleForReading + os_log(.default, "TabFSmsg tfs service: willrun") try! fs.run() + os_log(.default, "TabFSmsg tfs service: ran") // split new thread DispatchQueue.global(qos: .default).async { @@ -57,6 +60,10 @@ class TabFSService: NSObject, TabFSServiceProtocol { class TabFSServiceDelegate: NSObject, NSXPCListenerDelegate { func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool { + + + os_log(.default, "TabFSmsg tfs service: starting delegate") + newConnection.remoteObjectInterface = NSXPCInterface(with: TabFSServiceConsumerProtocol.self) let exportedObject = TabFSService(app: newConnection.remoteObjectProxy as! TabFSServiceConsumerProtocol) From 930352dd42f432886897d7bf66c522a41d8a0486 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Sun, 7 Feb 2021 22:57:04 -0800 Subject: [PATCH 06/16] safari: works! (it lists tabs/by-title, at least) Safari keeps stealing focus bc of how I do messaging to it now, need to fix all that next --- .../UserInterfaceState.xcuserstate | Bin 58988 -> 61059 bytes .../TabFS/TabFSService/TabFSService.swift | 1 + 2 files changed, 1 insertion(+) diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 3d7d9f75fc7079d29b52ed55026a23ecf87dd440..1fff19a1210ad433f797509a76e8cd5b534c4e65 100644 GIT binary patch delta 25031 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 delta 23465 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 diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift index 798df03..eb7508f 100644 --- a/extension/safari/TabFS/TabFSService/TabFSService.swift +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -38,6 +38,7 @@ class TabFSService: NSObject, TabFSServiceProtocol { while true { // read from them let length = self.fsOutput.readData(ofLength: 4).withUnsafeBytes { $0.load(as: UInt32.self) } + os_log(.default, "TabFSmsg tfs service: read %{public}d", length) let req = self.fsOutput.readData(ofLength: Int(length)) // send to other side of XPC conn app.request(req) From 7211a5fdead06a3c1b4cb15af7ce2cf883b19346 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Mon, 8 Feb 2021 02:32:21 -0800 Subject: [PATCH 07/16] safari: start migration to using out-of-band WebSocket to do extension<=>fs comm --- extension/background.js | 29 ++++--- .../SafariWebExtensionHandler.swift | 82 ++++++------------ .../UserInterfaceState.xcuserstate | Bin 61059 -> 58463 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 12 +-- .../TabFS/TabFSService/TabFSService.swift | 78 +++++++++++++---- .../TabFSService/TabFSServiceProtocols.swift | 5 -- .../safari/TabFS/TabFSService/main.swift | 2 + 7 files changed, 111 insertions(+), 97 deletions(-) diff --git a/extension/background.js b/extension/background.js index f38f29e..62ec7d0 100644 --- a/extension/background.js +++ b/extension/background.js @@ -713,24 +713,29 @@ async function onMessage(req) { }; function tryConnect() { - console.log('start tryConnect'); - port = chrome.runtime.connectNative('com.rsnous.tabfs'); - console.log('start tryConnect - did connectNative'); - port.onMessage.addListener(onMessage); - port.onDisconnect.addListener(p => {console.log('disconnect', p)}); - - console.log('tryConnect - about to sNM'); // Safari is very weird -- it has this native app that we have to talk to, - // so we poke that app to wake it up, get it to start the TabFS process, - // and get it to start calling us whenever TabFS wants to do an FS call. + // so we poke that app to wake it up, get it to start the TabFS process + // and boot a WebSocket, then connect to it. // Is there a better way to do this? if (chrome.runtime.getURL('/').startsWith('safari-web-extension://')) { // Safari-only - chrome.runtime.sendNativeMessage('com.rsnous.tabfs', {op: 'safari_did_connect'}, function(resp) { - console.log('didConnect resp'); + chrome.runtime.sendNativeMessage('com.rsnous.tabfs', {op: 'safari_did_connect'}, resp => { console.log(resp); + const socket = new WebSocket('ws://localhost:9991'); + + socket.addEventListener('message', event => { + onMessage(JSON.parse(event.data)); + }); + + port = { postMessage(message) { + socket.send(JSON.stringify(message)); + } }; }); + return; } - console.log('tryConnect - did sNM'); + + port = chrome.runtime.connectNative('com.rsnous.tabfs'); + port.onMessage.addListener(onMessage); + port.onDisconnect.addListener(p => {console.log('disconnect', p)}); } if (!TESTING) { diff --git a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift index 67da485..a1ae4ff 100644 --- a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -6,48 +6,8 @@ // import SafariServices -import SafariServices.SFSafariApplication import os.log -class TabFSServiceManager: TabFSServiceConsumerProtocol { - static let shared = TabFSServiceManager() - - var service: TabFSServiceProtocol! - - func connect() { - let connection = NSXPCConnection(serviceName: "com.rsnous.TabFSService") - - connection.remoteObjectInterface = NSXPCInterface(with: TabFSServiceProtocol.self) - - connection.exportedInterface = NSXPCInterface(with: TabFSServiceConsumerProtocol.self) - connection.exportedObject = self - - connection.resume() - - service = connection.remoteObjectProxyWithErrorHandler { error in - os_log(.default, "Received error: %{public}@", error as! CVarArg) - } as? TabFSServiceProtocol - - service?.upperCaseString("hello XPC") { response in - os_log(.default, "Response from XPC service: %{public}@", response) - } - } - - func request(_ req: Data) { - SFSafariApplication.dispatchMessage( - withName: "ToSafari", - toExtensionWithIdentifier: "com.rsnous.TabFS-Extension", - userInfo: try! JSONSerialization.jsonObject(with: req, options: []) as! [String : Any] - ) { error in - debugPrint("Message attempted. Error info: \(String.init(describing: error))") - } - } - - func response(_ resp: [AnyHashable: Any]) { - try! service.response(JSONSerialization.data(withJSONObject: resp, options: [])) - } -} - class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { func beginRequest(with context: NSExtensionContext) { @@ -60,27 +20,35 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { guard let message = item.userInfo?["message"] as? [AnyHashable: Any] else { return } if message["op"] as! String == "safari_did_connect" { - os_log(.default, "TabFSmsg sdc") - TabFSServiceManager.shared.connect() -// -// let response = NSExtensionItem() -// response.userInfo = [ "message": [ "aResponse to": "moop" ] ] -// context.completeRequest(returningItems: [response], completionHandler: nil) + + // The XPC service is a subprocess that lives outside the macOS App Sandbox. + // It can do forbidden things like spawn tabfs filesystem and set up WebSocket server. + + let connection = NSXPCConnection(serviceName: "com.rsnous.TabFSService") + + connection.remoteObjectInterface = NSXPCInterface(with: TabFSServiceProtocol.self) + + connection.resume() + + let service = connection.remoteObjectProxyWithErrorHandler { error in + os_log(.default, "Received error: %{public}@", error as! CVarArg) + } as? TabFSServiceProtocol + + // need this one XPC call to actually initialize the service + service?.upperCaseString("hello XPC") { response in + os_log(.default, "Response from XPC service: %{public}@", response) + } + + // FIXME: report port back? + let response = NSExtensionItem() + response.userInfo = [ "message": [ "aResponse to": "moop" ] ] + context.completeRequest(returningItems: [response]) { (what) in + print(what) + } return } - - TabFSServiceManager.shared.response(message) -// -// os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@", op as! CVarArg) - -// let response = NSExtensionItem() -// response.userInfo = [ "message": [ "Response to": op ] ] -// -// // How do I get too the app???? -// -// context.completeRequest(returningItems: [response], completionHandler: nil) } } diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 1fff19a1210ad433f797509a76e8cd5b534c4e65..93b8259604f621dcce19c544ab4782fcc692767c 100644 GIT binary patch delta 26418 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 EKWjf?dH?_b delta 28755 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 M9RJ(@@6%KM3$_I^!T @@ -46,8 +46,8 @@ filePath = "TabFS Extension/SafariWebExtensionHandler.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "60" - endingLineNumber = "60" + startingLineNumber = "20" + endingLineNumber = "20" landmarkName = "beginRequest(with:)" landmarkType = "7"> @@ -62,8 +62,8 @@ filePath = "TabFS Extension/SafariWebExtensionHandler.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "55" - endingLineNumber = "55" + startingLineNumber = "15" + endingLineNumber = "15" landmarkName = "beginRequest(with:)" landmarkType = "7"> diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift index eb7508f..e49d80f 100644 --- a/extension/safari/TabFS/TabFSService/TabFSService.swift +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -6,16 +6,14 @@ // import Foundation +import Network import os.log class TabFSService: NSObject, TabFSServiceProtocol { var fs: Process! var fsInput: FileHandle! var fsOutput: FileHandle! - - init(app: TabFSServiceConsumerProtocol) { - super.init() - + func startFs() { fs = Process() fs.executableURL = URL(fileURLWithPath: "/Users/osnr/Code/tabfs/fs/tabfs") fs.currentDirectoryURL = fs.executableURL?.deletingLastPathComponent() @@ -32,6 +30,52 @@ class TabFSService: NSObject, TabFSServiceProtocol { os_log(.default, "TabFSmsg tfs service: willrun") try! fs.run() os_log(.default, "TabFSmsg tfs service: ran") + } + + var ws: NWListener! + func startWs() { + // websocket server + let port = NWEndpoint.Port(rawValue: 9991)! + let parameters = NWParameters(tls: nil) + parameters.allowLocalEndpointReuse = true + parameters.includePeerToPeer = true + let opts = NWProtocolWebSocket.Options() + opts.autoReplyPing = true + parameters.defaultProtocolStack.applicationProtocols.insert(opts, at: 0) + + ws = try! NWListener(using: parameters, on: port) + ws.start(queue: .main) + } + + override init() { + super.init() + + startFs() + startWs() + + var handleRequest: ((_ req: Data) -> Void)? + ws.newConnectionHandler = { conn in + conn.start(queue: .main) + handleRequest = { req in + conn.send(content: req, completion: .contentProcessed({ err in + if err != nil { + // FIXME: ERROR + } + })) + } + + func read() { + conn.receiveMessage { (resp, context, isComplete, err) in + guard let resp = resp else { + // FIXME err + return + } + self.fsInput.write(withUnsafeBytes(of: UInt32(resp.count)) { Data($0) }) + self.fsInput.write(resp) + read() + } + } + } // split new thread DispatchQueue.global(qos: .default).async { @@ -40,11 +84,15 @@ class TabFSService: NSObject, TabFSServiceProtocol { let length = self.fsOutput.readData(ofLength: 4).withUnsafeBytes { $0.load(as: UInt32.self) } os_log(.default, "TabFSmsg tfs service: read %{public}d", length) let req = self.fsOutput.readData(ofLength: Int(length)) - // send to other side of XPC conn - app.request(req) + + // send to other side of WEBSOCKET + if let handleRequest = handleRequest { + handleRequest(req) + } else { + // FIXME: ERROR + } } } - // FIXME: disable auto termination } @@ -52,22 +100,18 @@ class TabFSService: NSObject, TabFSServiceProtocol { let response = string.uppercased() reply(response) } - - func response(_ resp: Data) { - fsInput.write(withUnsafeBytes(of: UInt32(resp.count)) { Data($0) }) - fsInput.write(resp) - } +// +// func response(_ resp: Data) { +// fsInput.write(withUnsafeBytes(of: UInt32(resp.count)) { Data($0) }) +// fsInput.write(resp) +// } } class TabFSServiceDelegate: NSObject, NSXPCListenerDelegate { func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool { - - os_log(.default, "TabFSmsg tfs service: starting delegate") - newConnection.remoteObjectInterface = NSXPCInterface(with: TabFSServiceConsumerProtocol.self) - - let exportedObject = TabFSService(app: newConnection.remoteObjectProxy as! TabFSServiceConsumerProtocol) + let exportedObject = TabFSService() newConnection.exportedInterface = NSXPCInterface(with: TabFSServiceProtocol.self) newConnection.exportedObject = exportedObject diff --git a/extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift b/extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift index 298015a..8aedd87 100644 --- a/extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift +++ b/extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift @@ -7,11 +7,6 @@ import Foundation -@objc public protocol TabFSServiceConsumerProtocol { - func request(_ req: Data) -} @objc public protocol TabFSServiceProtocol { func upperCaseString(_ string: String, withReply reply: @escaping (String) -> Void) - - func response(_ resp: Data) } diff --git a/extension/safari/TabFS/TabFSService/main.swift b/extension/safari/TabFS/TabFSService/main.swift index 39c5a75..f0a4486 100644 --- a/extension/safari/TabFS/TabFSService/main.swift +++ b/extension/safari/TabFS/TabFSService/main.swift @@ -7,6 +7,8 @@ import Foundation +ProcessInfo.processInfo.disableAutomaticTermination("ok") + let delegate = TabFSServiceDelegate() let listener = NSXPCListener.service() listener.delegate = delegate From 4fdcf4be9d1e85a42ff92e7583208c0e87245124 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Mon, 8 Feb 2021 04:02:47 -0800 Subject: [PATCH 08/16] safari: successfully exchanges 1 req/resp over ws, then fails --- .../SafariWebExtensionHandler.swift | 14 +++++++------- .../UserInterfaceState.xcuserstate | Bin 58463 -> 58335 bytes .../TabFS/TabFSService/TabFSService.swift | 7 +++++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift index a1ae4ff..e5a7b51 100644 --- a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -38,13 +38,13 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { // need this one XPC call to actually initialize the service service?.upperCaseString("hello XPC") { response in os_log(.default, "Response from XPC service: %{public}@", response) - } - - // FIXME: report port back? - let response = NSExtensionItem() - response.userInfo = [ "message": [ "aResponse to": "moop" ] ] - context.completeRequest(returningItems: [response]) { (what) in - print(what) + + // FIXME: report port back? + let response = NSExtensionItem() + response.userInfo = [ "message": [ "aResponse to": "moop" ] ] + context.completeRequest(returningItems: [response]) { (what) in + print(what) + } } return diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 93b8259604f621dcce19c544ab4782fcc692767c..83f9da63c95f3312127629bfcf7b3b940ce6f0da 100644 GIT binary patch delta 23271 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 z hYy{LL|^~UPW)%&UsS0AfBQGKRbcE0*j^_A)e)o*L0HFOPEqh6y~qf^tXrcaGw zjd6`zjb}~28lM`!nt?TeHG^w{YeH&<*JRZ+)U2yHUGt{4SFLaD=-P_f>e{;6#@goE z8MO;*J8GBIE~{Np+gZD%c3bVv+C8=VYY*1`QTwd+b?slZA8NnUA$542xK681x6V{n zXH{og=TPTb=TXf1wY)EOSY-n%zrQuA2>}JE=h6fFg8=f`1ZFt}CvEfUjsF81UX!LIk zX^d=4XiRQQZA@=0Xq?zs-dNdK)mYP5-`LnVwQ*tNmc|2(M;nhfo@_kVc(L(H= z8lN=2YSL~pXzJT!+GO73)a2JRuqm)9sA*`^u%^tW{3cmbQ&VeGd(-r$Sxs}B7BsDv zHLYvf*tDr>OVhTdolU!&jx}9qdfZGj+cXbq4sVWc9@CuOoY_3SIj6a_c}jC@^StKy z%?p|rHLq>n(7dU6OY^qo9nD9Ze{DX|e5wU+QE$;~(P`<`(x=6srGHCsOH@m2OMFXW zOG-;>%Y>GKmZFx4Er(jpw*1+0ujOIOla}W#vR5r{Ti&;PY-L*cR*hDzR^8U#t@^D- zttPEzt^Hd=S`%B#TI*Wpwytg6(R#4;Q0tM_)2(M(&$Yg8{nSRbQEhY^+t#bCPn%(z zahqwId7EcjbX#g$T3dQsMq5!^WgBRl(pKBn(57gc(KfqnUfaU9j<$7e8`^$q`*|up zRb4i<$5gGUx>LtbEuC6Eb<$M%)O%B3PklS}-PFI^hqOnxC$uNGr?!u6&uPzVFK91r zpV&UTeS7n ztyYU_T{Sg~lu9KdbQnhjaZl74LdG4G((;pt5>y(y&+pmY*nM`NefD{FA0#Ak4AOL; zjnGt@3l$XAGOiH!O<$P4`F{S2?^jZ^6eA6gW=Lt0BjreYqylN5R3!Z>38_Z9BGpQD z(mm;+^g?P*XgCf|fK%WsxB*%)A0CE9P{3kX39Dc=JPFUkmr4Vrvl6WgRT7lR$}}ZWNm7!P zdCEd1MM+cED;t%~%2p*ykrk+D%64VHQl*4y)fQ@unxHOIb(O0-)SYUMdPqI27OF++ zakWhSL#J{~xdQ-iv-qD(9?`aX*KrLPyt&P#fX*0A$ZKjr_&DU0HYqV4? zUCYq6Xqj4;W@x5{H7C1EcCYL&vm>*kbfy>RNA*&@Os~+Z^;03eMn9)t&@br^^vC*B z{ki_qc*A(hXlOJxni|cF&y8Wm0wdGNH)@O*s4a>{gU}EZi{j9DG!@N2Gtq36jOL;h zXcbzG)}nQ2J;Ep#6`=j-ASyxv6{8Y#5}ihu(REad>d*u92t7s5&8B8+vzr;}VMds} z%}6uK>}L)z2bzP;1aq=E)tqi7nn`A|InP{RE;g5#nP!ezW!|@1TQOFmm1>!mXYI6d ztv%L3E3iteW7h9hnN@C8T4$_t)-~&vb;r7IJ+YoyFL6EG9Jj>naR=NPcg5XscN~RB z;CMV1PYB@zJQ+{Ji8u)-j8&I#wFbJ{uUTy>s0FPvAjF>OlUp&!tmG?K>C*>ovgPFK<& zXo#j#ol@%2oiv9Aw1gg`ztQ6%T29Z=^YkLErFHZkeMq0sXRHZp&f2mF)|*ALDAtb+ zU<27;HjKrwQEV2Q!{)O2Y#~cw%h(FGimhfLmdZ9W%yzL7R>SJt2JT1h7w&L(qC3@{ z@D(^ zc;9;8c_A;&Tkmc3HhKBp-@F-rpSR;3c~2h6qj*0)fDhrZd<2i@WB52eiO=B+c?w^~ zSMW7Fm8bI!JcDoJfM;`;=kh$hmmlCoT<|0O7%%0O{7lII(a-S1zU@=r^LP5WexASA z7yc3ds9)-r`Q?74U+q5@?Zgm~B36ksu~}>tP#D4%`@{j^i(*kCj){}vv^XRF5*NiK zaYNh^b>gmgCZ3CzL8G8;&_3u8bPl=(-GUxL&!AV(C+HhQ2SbC{pkrJx>h)t^zy52R L*S_}u2ABT>)l?99 delta 23326 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 diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift index e49d80f..87321c1 100644 --- a/extension/safari/TabFS/TabFSService/TabFSService.swift +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -34,7 +34,6 @@ class TabFSService: NSObject, TabFSServiceProtocol { var ws: NWListener! func startWs() { - // websocket server let port = NWEndpoint.Port(rawValue: 9991)! let parameters = NWParameters(tls: nil) parameters.allowLocalEndpointReuse = true @@ -56,9 +55,13 @@ class TabFSService: NSObject, TabFSServiceProtocol { var handleRequest: ((_ req: Data) -> Void)? ws.newConnectionHandler = { conn in conn.start(queue: .main) + handleRequest = { req in - conn.send(content: req, completion: .contentProcessed({ err in + let metaData = NWProtocolWebSocket.Metadata(opcode: .text) + let context = NWConnection.ContentContext(identifier: "context", metadata: [metaData]) + conn.send(content: req, contentContext: context, completion: .contentProcessed({ err in if err != nil { + os_log(.default, "%{public}@ error: %{public}@", String(data: req, encoding: .utf8) as! CVarArg, err!.debugDescription as CVarArg) // FIXME: ERROR } })) From b19f68cc8ece9e5769ca579ef9428a4fc35707ee Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Mon, 8 Feb 2021 04:16:30 -0800 Subject: [PATCH 09/16] safari: it works over ws! --- .../UserInterfaceState.xcuserstate | Bin 58335 -> 58385 bytes .../TabFS/TabFSService/TabFSService.swift | 4 ++++ 2 files changed, 4 insertions(+) diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 83f9da63c95f3312127629bfcf7b3b940ce6f0da..961a29f40cb55283607fd0f756059397bc70510b 100644 GIT binary patch delta 23488 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 H(To2A4s|aE delta 23504 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 CcO5eT diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift index 87321c1..ee58fa0 100644 --- a/extension/safari/TabFS/TabFSService/TabFSService.swift +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -71,13 +71,17 @@ class TabFSService: NSObject, TabFSServiceProtocol { conn.receiveMessage { (resp, context, isComplete, err) in guard let resp = resp else { // FIXME err + os_log(.default, "resp error: %{public}@", err!.debugDescription as CVarArg) return } + + os_log(.default, "resp %{public}@", String(data: resp, encoding: .utf8) as! CVarArg) self.fsInput.write(withUnsafeBytes(of: UInt32(resp.count)) { Data($0) }) self.fsInput.write(resp) read() } } + read() } // split new thread From 78f67aa873b02fc95245d8f96faafe94a6735f58 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Mon, 8 Feb 2021 04:21:58 -0800 Subject: [PATCH 10/16] safari: clean up code a bit --- .../SafariWebExtensionHandler.swift | 54 ++++++++---------- .../UserInterfaceState.xcuserstate | Bin 58385 -> 58415 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 36 +----------- .../TabFS/TabFSService/TabFSService.swift | 13 +---- 4 files changed, 26 insertions(+), 77 deletions(-) diff --git a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift index e5a7b51..d3b6843 100644 --- a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -12,43 +12,35 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { func beginRequest(with context: NSExtensionContext) { - os_log(.default, "TabFSmsg Received message from browser.runtime.sendNativefffMessage: %@", context as! CVarArg) - let item = context.inputItems[0] as! NSExtensionItem - - os_log(.default, "TabFSmsg item.userInfo %{public}@", item.userInfo as! CVarArg) guard let message = item.userInfo?["message"] as? [AnyHashable: Any] else { return } + + guard message["op"] as! String == "safari_did_connect" else { return } - if message["op"] as! String == "safari_did_connect" { - os_log(.default, "TabFSmsg sdc") + // The XPC service is a subprocess that lives outside the macOS App Sandbox. + // It can do forbidden things like spawn tabfs filesystem and set up WebSocket server. + + let connection = NSXPCConnection(serviceName: "com.rsnous.TabFSService") + connection.remoteObjectInterface = NSXPCInterface(with: TabFSServiceProtocol.self) + connection.resume() + + let service = connection.remoteObjectProxyWithErrorHandler { error in + os_log(.default, "Received error: %{public}@", error as! CVarArg) + } as? TabFSServiceProtocol + + // need this one XPC call to actually initialize the service + service?.upperCaseString("hello XPC") { response in + os_log(.default, "Response from XPC service: %{public}@", response) - // The XPC service is a subprocess that lives outside the macOS App Sandbox. - // It can do forbidden things like spawn tabfs filesystem and set up WebSocket server. - - let connection = NSXPCConnection(serviceName: "com.rsnous.TabFSService") - - connection.remoteObjectInterface = NSXPCInterface(with: TabFSServiceProtocol.self) - - connection.resume() - - let service = connection.remoteObjectProxyWithErrorHandler { error in - os_log(.default, "Received error: %{public}@", error as! CVarArg) - } as? TabFSServiceProtocol - - // need this one XPC call to actually initialize the service - service?.upperCaseString("hello XPC") { response in - os_log(.default, "Response from XPC service: %{public}@", response) - - // FIXME: report port back? - let response = NSExtensionItem() - response.userInfo = [ "message": [ "aResponse to": "moop" ] ] - context.completeRequest(returningItems: [response]) { (what) in - print(what) - } + // FIXME: report port back? + let response = NSExtensionItem() + response.userInfo = [ "message": [ "aResponse to": "moop" ] ] + context.completeRequest(returningItems: [response]) { (what) in + print(what) } - - return } + + return } } diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 961a29f40cb55283607fd0f756059397bc70510b..7b0289186b4318c53ec2703d00a530939a58bfdd 100644 GIT binary patch delta 25529 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 @@ -36,37 +36,5 @@ landmarkType = "7"> - - - - - - - - diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift index ee58fa0..c722eac 100644 --- a/extension/safari/TabFS/TabFSService/TabFSService.swift +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -27,9 +27,7 @@ class TabFSService: NSObject, TabFSServiceProtocol { fsInput = inputPipe.fileHandleForWriting fsOutput = outputPipe.fileHandleForReading - os_log(.default, "TabFSmsg tfs service: willrun") try! fs.run() - os_log(.default, "TabFSmsg tfs service: ran") } var ws: NWListener! @@ -61,7 +59,7 @@ class TabFSService: NSObject, TabFSServiceProtocol { let context = NWConnection.ContentContext(identifier: "context", metadata: [metaData]) conn.send(content: req, contentContext: context, completion: .contentProcessed({ err in if err != nil { - os_log(.default, "%{public}@ error: %{public}@", String(data: req, encoding: .utf8) as! CVarArg, err!.debugDescription as CVarArg) + os_log(.default, "req %{public}@ error: %{public}@", String(data: req, encoding: .utf8) as! CVarArg, err!.debugDescription as CVarArg) // FIXME: ERROR } })) @@ -75,7 +73,6 @@ class TabFSService: NSObject, TabFSServiceProtocol { return } - os_log(.default, "resp %{public}@", String(data: resp, encoding: .utf8) as! CVarArg) self.fsInput.write(withUnsafeBytes(of: UInt32(resp.count)) { Data($0) }) self.fsInput.write(resp) read() @@ -89,7 +86,6 @@ class TabFSService: NSObject, TabFSServiceProtocol { while true { // read from them let length = self.fsOutput.readData(ofLength: 4).withUnsafeBytes { $0.load(as: UInt32.self) } - os_log(.default, "TabFSmsg tfs service: read %{public}d", length) let req = self.fsOutput.readData(ofLength: Int(length)) // send to other side of WEBSOCKET @@ -107,17 +103,10 @@ class TabFSService: NSObject, TabFSServiceProtocol { let response = string.uppercased() reply(response) } -// -// func response(_ resp: Data) { -// fsInput.write(withUnsafeBytes(of: UInt32(resp.count)) { Data($0) }) -// fsInput.write(resp) -// } } class TabFSServiceDelegate: NSObject, NSXPCListenerDelegate { func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool { - os_log(.default, "TabFSmsg tfs service: starting delegate") - let exportedObject = TabFSService() newConnection.exportedInterface = NSXPCInterface(with: TabFSServiceProtocol.self) newConnection.exportedObject = exportedObject From eae9082407a81746bb11882a76f28eeeed501ae4 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Mon, 8 Feb 2021 04:26:00 -0800 Subject: [PATCH 11/16] safari: loopback restrict --- .../UserInterfaceState.xcuserstate | Bin 58415 -> 60762 bytes .../TabFS/TabFSService/TabFSService.swift | 5 +++++ 2 files changed, 5 insertions(+) diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 7b0289186b4318c53ec2703d00a530939a58bfdd..532c8e28be81574ef3c7c93fe4a55423219bca8f 100644 GIT binary patch delta 22704 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 delta 21227 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 Date: Mon, 8 Feb 2021 04:30:36 -0800 Subject: [PATCH 12/16] safari: more cleanup, start on README.md --- extension/safari/README.md | 22 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 60762 -> 61786 bytes .../TabFS/TabFS/Base.lproj/Main.storyboard | 14 +---------- .../safari/TabFS/TabFS/ViewController.swift | 4 ---- 4 files changed, 23 insertions(+), 17 deletions(-) create mode 100644 extension/safari/README.md diff --git a/extension/safari/README.md b/extension/safari/README.md new file mode 100644 index 0000000..730cf82 --- /dev/null +++ b/extension/safari/README.md @@ -0,0 +1,22 @@ +## TabFS for Safari + +This support is a work in progress (as are these instructions). + +Safari's extension support is pretty messy. You will need: + +- Xcode installed +- Safari 14 or newer +- macOS 10.15 Catalina or newer + +Enable the Develop menu in Safari, then Develop -> Allow Unsigned +Extensions. + +Open the Xcode project `TabFS/TabFS.xcodeproj` in this directory. Run +the project. It should open a TabFS app and install the extension in +Safari. + +Enable the extension in Safari Preferences, grant it access to all +sites. It should be running now! (?) + +Check the `fs/mnt` folder of the TabFS repo on your computer to see if +it's mounted. diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 532c8e28be81574ef3c7c93fe4a55423219bca8f..78ca2358b1a2db9c12716c0d970348c6b0b25b1e 100644 GIT binary patch delta 25987 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 diff --git a/extension/safari/TabFS/TabFSServer/main.swift b/extension/safari/TabFS/TabFSServer/main.swift index 245bfb1..76da2a0 100644 --- a/extension/safari/TabFS/TabFSServer/main.swift +++ b/extension/safari/TabFS/TabFSServer/main.swift @@ -75,8 +75,9 @@ class TabFSServer { func read() { conn.receiveMessage { (resp, context, isComplete, err) in guard let resp = resp else { - // FIXME err - os_log(.default, "resp error: %{public}@", err!.debugDescription as CVarArg) + if let err = err { + os_log(.default, "resp error: %{public}@", err.debugDescription as CVarArg) + } return } @@ -104,10 +105,10 @@ class TabFSServer { } } - // FIXME: notify - + print("OK") } } let server = TabFSServer() + dispatchMain() diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift index 4a86dd6..5bf55ee 100644 --- a/extension/safari/TabFS/TabFSService/TabFSService.swift +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -12,13 +12,36 @@ import os.log class TabFSService: NSObject, TabFSServiceProtocol { func start(withReply reply: @escaping () -> Void) { // This XPC call is enough to just force the XPC service to be started. - os_log("HELLO") + + // kill old copies of TabFSServer + let killall = Process() + killall.launchPath = "/usr/bin/killall" + killall.arguments = ["TabFSServer"] + killall.launch() + killall.waitUntilExit() + + // spin until old TabFSServer (if any) is gone + while true { + let pgrep = Process() + pgrep.launchPath = "/usr/bin/pgrep" + pgrep.arguments = ["TabFSServer"] + pgrep.launch() + pgrep.waitUntilExit() + if pgrep.terminationStatus != 0 { break } + + Thread.sleep(forTimeInterval: 0.01) + } + let server = Process() - os_log("HOW ARE YOU?") + let serverOutput = Pipe() server.executableURL = Bundle.main.url(forResource: "TabFSServer", withExtension: "")! - os_log("I AM GOOD") + server.standardOutput = serverOutput server.launch() - os_log("GREAT") + + // FIXME: should we wait for some signal that the server is ready? + // right now, background.js will just periodically retry until it can connect. + + // tell background.js to try to connect. reply() } }

I*m$;%j97 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 F_z#XBJqrK; diff --git a/extension/safari/TabFS/TabFS/Base.lproj/Main.storyboard b/extension/safari/TabFS/TabFS/Base.lproj/Main.storyboard index 94e9cfb..ea2f26e 100644 --- a/extension/safari/TabFS/TabFS/Base.lproj/Main.storyboard +++ b/extension/safari/TabFS/TabFS/Base.lproj/Main.storyboard @@ -107,19 +107,9 @@ - + - @@ -149,13 +139,11 @@ DQ - - diff --git a/extension/safari/TabFS/TabFS/ViewController.swift b/extension/safari/TabFS/TabFS/ViewController.swift index 958de47..7681fe0 100644 --- a/extension/safari/TabFS/TabFS/ViewController.swift +++ b/extension/safari/TabFS/TabFS/ViewController.swift @@ -47,8 +47,4 @@ class ViewController: NSViewController { } } } - - @IBAction func startTabFSAndConnect(_ sender: Any) { -// FSProcessManager.start() - } } From b6b61ee09314b05cef42b8f93e516c672fd1d6aa Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Mon, 8 Feb 2021 04:52:07 -0800 Subject: [PATCH 13/16] safari: make tabfs URL path independent --- extension/safari/TabFS/TabFSService/TabFSService.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift index 80c6051..85b29f3 100644 --- a/extension/safari/TabFS/TabFSService/TabFSService.swift +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -14,8 +14,11 @@ class TabFSService: NSObject, TabFSServiceProtocol { var fsInput: FileHandle! var fsOutput: FileHandle! func startFs() { + let fileURL = URL(fileURLWithPath: #filePath) + let repoURL = fileURL.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent() + fs = Process() - fs.executableURL = URL(fileURLWithPath: "/Users/osnr/Code/tabfs/fs/tabfs") + fs.executableURL = repoURL.appendingPathComponent("fs").appendingPathComponent("tabfs") fs.currentDirectoryURL = fs.executableURL?.deletingLastPathComponent() fs.arguments = [] From 9b4abc40ee96711828fc6b0b425c5ea869a5f771 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Mon, 8 Feb 2021 05:03:31 -0800 Subject: [PATCH 14/16] safari: more cleanup and commenting --- .../SafariWebExtensionHandler.swift | 21 +++++++++++++----- .../UserInterfaceState.xcuserstate | Bin 61786 -> 61421 bytes .../TabFS/TabFSService/TabFSService.swift | 14 ++++++------ .../TabFSService/TabFSServiceProtocols.swift | 2 +- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift index d3b6843..fbe9538 100644 --- a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -18,23 +18,34 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { guard message["op"] as! String == "safari_did_connect" else { return } // The XPC service is a subprocess that lives outside the macOS App Sandbox. + // (Safari extension native code, including this file, has to live in the sandbox.) // It can do forbidden things like spawn tabfs filesystem and set up WebSocket server. + // We only use one native message to bootstrap the XPC service, then do all communications + // to that service (which in turn talks to tabfs.c) over WebSocket instead. + // (Safari makes doing native messaging quite painful, so we try to avoid it. + // It forces the browser to pop to front if you message Safari in the obvious way, + // for instance: https://developer.apple.com/forums/thread/122232 + // And with the WebSocket, the XPC service can talk straight to background.js, whereas + // native messaging would require us here to sit in the middle.) + let connection = NSXPCConnection(serviceName: "com.rsnous.TabFSService") connection.remoteObjectInterface = NSXPCInterface(with: TabFSServiceProtocol.self) connection.resume() let service = connection.remoteObjectProxyWithErrorHandler { error in - os_log(.default, "Received error: %{public}@", error as! CVarArg) + os_log(.default, "Received error: %{public}@", error as CVarArg) } as? TabFSServiceProtocol - // need this one XPC call to actually initialize the service - service?.upperCaseString("hello XPC") { response in - os_log(.default, "Response from XPC service: %{public}@", response) + // Need this one XPC call to actually initialize the service. + service?.start() { + os_log(.default, "Response from XPC service") // FIXME: report port back? let response = NSExtensionItem() - response.userInfo = [ "message": [ "aResponse to": "moop" ] ] + response.userInfo = [ "message": "alive" ] + // This response (over native messaging) prompts background.js to + // connect to the WebSocket server that the XPC service should now be running. context.completeRequest(returningItems: [response]) { (what) in print(what) } diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 78ca2358b1a2db9c12716c0d970348c6b0b25b1e..7b7b1d3434926613cd0b1d6d1e644e594946fde1 100644 GIT binary patch delta 25616 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 delta 25542 zcmaHT2V4}#`#!rnyLY#p4vO^NrT3121yF1#y@-g2h@jNFu_g9$)>yG)SM0GHdyTzo z)M)HoV{HG~JI<1P|35#UJ79Nb_I>7k-ZJmZ_~a&WuNSG3B z2y4QI2qc1tU?PMFCBlesB7%q{qKG)61JRM_M5Ga2i3}o>$Re_d93qz}Ci)R2M1P`` zC|43Sgo+qNj3LGn6NyR0RAL%2i};0@M{FcE5u1rE#8zS(v7Pvp*g@_ZljC1iiHlpH_~A?wNEP=-(eW_xqA5}v2r-oA1R1H;2 z)ltK!;nZkq3^kFOMg2m}rj}4ksb$nkYAtnuI!GO&4pT>{qtr3#ICa8;I!QgG9#M~} zC)88w8TFicLA|72QLm{t)LZo=;HxZ<70QZb{bU1VWwHv{VA&YiSlKw)c-aKmMA;joeahCHI#H$OGj;N_nt6L>?*+lZVSA zsZSw2Osmd}vSmams@ zkT=UW$~Vb3%eTn4%D2h4%Xi5S$Pda-%1_Bp%g@Ol${)!e%b&=f%Ad)f%U{S}%3sOf z$v?}#C}aw`La9(#DXbMX3R{Jp!d~H^a8x)coE7d0Uqz@QOcAB%uIQoYsYqA!QuJ12 zC^8jUifl!`qMxEfQK1;Ds8ozqj8lwPOi)ZzOj1l%Oi`#6Qx!86^A!sejfy743dKsr zUd2Aee#LK!1B!!+LyE(SBZ{MnlZx|->xvtS*Gk13#aqQY#ovneihmRz6dx6zXpENA zBCSsw(`{*gI)DzLL+MC5ijJe>=_I;6olK|DX>?b*A6-KCr%UMpbQwL6E~f|474#6g zfgVARq{q_}=;`zfdNsX`^j%nSIQD<~Qa5bA&m~{LY+VE-{yxKbYIh9p*0cn0dkyEMQ5NVr8tHRj@S6uq-RG zrfeJ5l67RASZCIoZObOGiEI+vp6$SPWIM6RYzmvoc4d3BxojTWk1b&<*um@=b}T!N z9nVf+C$f{+$?OzXsb*)e^Vr4g5_UDahF!~UVYjj;*;DLk_ILISdzL-No@Xzx7ul=q zZT1d(mwm`SVqdYZ*^lfe&X6i{@gu zo?JTDi|fs0aG6{dm(AsHxm+RFpBuzgD7jj$j;rTJa-+C$+$3%?H;em)o6XJVmT>F2 z4O}y~k=w-m%I)Beb0@fy+$ruf_d9onJIh_>u5eemYuqjF9`}%Y#J%8Na<91e+$Zic zZ@?S!M!Yd^!khADygA>BZ^K*jHoPtG$h-3%yeIF&NANLxEU!%96ZwvOC%!Y^h0owK z`7A!0&*%H_MSM9wh_B!W^F#SszK$Qo|HS{ykLJhl6ZpyeY<@n!fM3in@Svz1H>|Mpja*r5-Y^PVx?Fm4iTX^ zOdKwb5XXtr#TnvEahCXtI9r?}F7+0diOae{_^{@7Z7N7`6=IK?ciI{dn6>(}Ll?zG)d|%V)p1px+RZUE zWidViABm5`e^Q-P{jNHvIli;uy_>IwKb>;yicS5iUYfWgImiVFvIOBzs6I8=2? zHCJ^y>ql|U=uOv~fltP#s4qHN5esp(`n;o^Qrpcmd^$csbw+hob^1RrJS&D2_Zch_ zEw98LNUv1QlHQ<`V!r0m1?f_^uDN;b(yri(@g?|Dd>OtR3E70Nz*pj{@YVPld@WXj zmEh~}^;jOh9&c7Ja9V15Nu)$0)n$=a=^1`$`IjxGsIjULb%J{bz603A$}1%p}MP@ zt8VS;nsP?d-*vsc%kUfcP5c)A2YwsBgWpyC2{8_0UJ&a7v1*9TgxE4w*d_cv{ullL ze~4swgg?fg;M4GD_;dUP{t|zMzsBFFSGcZKo>4tly-?kQ7z;5*^%P?Cd3-2djoQ@U zwfH;yZ@d9lA{id5?rUf;S1ZIPy}gU@&-fQYPxY7Tf$HHm8hod}|G%0DMx&-jDu=In zI*TtxFI|DJCiJm9)g{#vm7azsgb`t^wpnOGE+kC!W~1Lsg9tM{fiTDNh}QV(9?5B* zdASvZz0uD>h5d5}7grUk^ift&5>A9O;X=3)ZmO56SE|>lH>$U)cdEZt?^XXa5gvNZdJcNdL|ej#@YQo5{8b-R zrYcwT`2sN#VwB1iVzTBv1^!qZ5v{kkk%&=!RE24Viip?SyO?N4BuF3CC)H=oCrtDf zNu4OkM5>-iBas3zy+)!l#4xq~a7S~Z8_`qGWFgU==m9YtV#GosU2iqSfO?C!brO|s z7iFzAU9pv}qdcNeYLQPAKuiuX#X`N+M7k;zwNZI>>r>XhpdzcFEWff8nP|tt0Y!uR zW{V!`$(=3K%Tx5t{+Eps1Bfzps)s3h_ds>BM{DK3C`AmypAmzJO8g};h!~2$ftbGP zImFB%#%ma*4>7YJDMi#0by`Y6%miY>ccda9A{8-=7*33Umsp#@c^wiXdxLfPPz{zStf$}VEM#3Xb>H@@?UCW$i(h({BbAXtm_FEMu%0zvgh{uQ%5|@rc%(;;`2{9LmORb4B#CeGs zXC*G7w;}N_NL+GLg{p0SHdLC}?S8H$ldhlZ#4RnAZfdCHDN*TyL?t(s*S|>gA4fyn zL#+6Vcz{^(h9) z=Q|rH&wleaK%r$sP|Gj@17Lv|0Sti=Fa{>T6qo^X&-BqH^Kb`l>tNPGZE5+6FM zLjR*)eQ~s1lx>TvvDNk48Fba~1EgvAk&5^Mk|cg~{7(nz6@zmJ4en9l?4o0e@@q^2 zy+H=Z1X=h?^jj`KRyY)5*$~Tt80r|sB=lz%#D;tqlt2L})KMh^VqL$Z3g{<|NeSo= zO2Gh#b%Pj!mkzOBU-<&cB?`zO)?MO&`ng~0d`;Q`ss7*04O+01nm7^PL0rVDigVt0sa{VU)>5Ap(RnK`kKGL=LDce=>eDsCV|Od z3dC}u%#el^dGtbv^;Jg(RO`%j)l46!nZ4V2hc z4zWszRjES)mm4DAvk2@4d%#|Z4T4w�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 bo3S}N^1tBjKmXZ<|D~?&{wMywC!YT|Iiw5R diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift index 85b29f3..86c39f8 100644 --- a/extension/safari/TabFS/TabFSService/TabFSService.swift +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -67,7 +67,7 @@ class TabFSService: NSObject, TabFSServiceProtocol { let context = NWConnection.ContentContext(identifier: "context", metadata: [metaData]) conn.send(content: req, contentContext: context, completion: .contentProcessed({ err in if err != nil { - os_log(.default, "req %{public}@ error: %{public}@", String(data: req, encoding: .utf8) as! CVarArg, err!.debugDescription as CVarArg) + os_log(.default, "req %{public}@ error: %{public}@", String(data: req, encoding: .utf8)!, err!.debugDescription as CVarArg) // FIXME: ERROR } })) @@ -81,6 +81,7 @@ class TabFSService: NSObject, TabFSServiceProtocol { return } + // Send the response back to tabfs.c. self.fsInput.write(withUnsafeBytes(of: UInt32(resp.count)) { Data($0) }) self.fsInput.write(resp) read() @@ -89,15 +90,14 @@ class TabFSService: NSObject, TabFSServiceProtocol { read() } - // split new thread DispatchQueue.global(qos: .default).async { while true { - // read from them + // Blocking read from the tabfs process. let length = self.fsOutput.readData(ofLength: 4).withUnsafeBytes { $0.load(as: UInt32.self) } let req = self.fsOutput.readData(ofLength: Int(length)) - // send to other side of WEBSOCKET if let handleRequest = handleRequest { + // Send the request over the WebSocket connection to background.js in browser. handleRequest(req) } else { // FIXME: ERROR @@ -107,9 +107,9 @@ class TabFSService: NSObject, TabFSServiceProtocol { // FIXME: disable auto termination } - func upperCaseString(_ string: String, withReply reply: @escaping (String) -> Void) { - let response = string.uppercased() - reply(response) + func start(withReply reply: @escaping () -> Void) { + // This XPC call is enough to just force the XPC service to be started. + reply() } } diff --git a/extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift b/extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift index 8aedd87..4dd6e77 100644 --- a/extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift +++ b/extension/safari/TabFS/TabFSService/TabFSServiceProtocols.swift @@ -8,5 +8,5 @@ import Foundation @objc public protocol TabFSServiceProtocol { - func upperCaseString(_ string: String, withReply reply: @escaping (String) -> Void) + func start(withReply reply: @escaping () -> Void) } From 2f639e2a0276efb3dbb8a470e61ee8ffc2503f5b Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Mon, 8 Feb 2021 12:12:43 -0800 Subject: [PATCH 15/16] safari: TabFSServer subprocess that can live long. fixes bug where fs would die after a minute or two --- extension/safari/README.md | 9 ++ .../SafariWebExtensionHandler.swift | 2 +- .../TabFS/TabFS.xcodeproj/project.pbxproj | 128 +++++++++++++++--- .../UserInterfaceState.xcuserstate | Bin 61421 -> 61961 bytes .../xcschemes/xcschememanagement.plist | 9 +- extension/safari/TabFS/TabFSServer/main.swift | 113 ++++++++++++++++ .../TabFS/TabFSService/TabFSService.swift | 104 +------------- 7 files changed, 245 insertions(+), 120 deletions(-) create mode 100644 extension/safari/TabFS/TabFSServer/main.swift diff --git a/extension/safari/README.md b/extension/safari/README.md index 730cf82..9ceafdc 100644 --- a/extension/safari/README.md +++ b/extension/safari/README.md @@ -20,3 +20,12 @@ sites. It should be running now! (?) Check the `fs/mnt` folder of the TabFS repo on your computer to see if it's mounted. + +### tips + +- To open Web inspector: Safari -> Develop menu -> Web Extension + Background Pages -> TabFS + +- You need to rebuild if you change background.js. This is pretty + annoying. + diff --git a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift index fbe9538..75790fa 100644 --- a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -16,7 +16,7 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { guard let message = item.userInfo?["message"] as? [AnyHashable: Any] else { return } guard message["op"] as! String == "safari_did_connect" else { return } - + // The XPC service is a subprocess that lives outside the macOS App Sandbox. // (Safari extension native code, including this file, has to live in the sandbox.) // It can do forbidden things like spawn tabfs filesystem and set up WebSocket server. diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj index d274516..5495f1d 100644 --- a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj +++ b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj @@ -9,10 +9,11 @@ /* Begin PBXBuildFile section */ F028D2B625D0B7370095C2D5 /* TabFSService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B525D0B7370095C2D5 /* TabFSService.swift */; }; F028D2B825D0B7370095C2D5 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B725D0B7370095C2D5 /* main.swift */; }; - F028D2BC25D0B7370095C2D5 /* TabFSService.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = F028D2B125D0B7370095C2D5 /* TabFSService.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; F028D2D725D0B8500095C2D5 /* TabFSServiceProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B325D0B7370095C2D5 /* TabFSServiceProtocols.swift */; }; F028D2DE25D0B8590095C2D5 /* TabFSServiceProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B325D0B7370095C2D5 /* TabFSServiceProtocols.swift */; }; F028D2ED25D106F10095C2D5 /* TabFSService.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = F028D2B125D0B7370095C2D5 /* TabFSService.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + F028D30125D17B080095C2D5 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D30025D17B080095C2D5 /* main.swift */; }; + F028D34525D17D6A0095C2D5 /* TabFSServer in CopyFiles */ = {isa = PBXBuildFile; fileRef = F028D2FE25D17B080095C2D5 /* TabFSServer */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; F04429F625C7507200D998A5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04429F525C7507200D998A5 /* AppDelegate.swift */; }; F04429F925C7507200D998A5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F04429F725C7507200D998A5 /* Main.storyboard */; }; F04429FB25C7507200D998A5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04429FA25C7507200D998A5 /* ViewController.swift */; }; @@ -27,12 +28,12 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - F028D2BA25D0B7370095C2D5 /* PBXContainerItemProxy */ = { + F028D33725D17D100095C2D5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = F04429E925C7507200D998A5 /* Project object */; proxyType = 1; - remoteGlobalIDString = F028D2B025D0B7370095C2D5; - remoteInfo = TabFSService; + remoteGlobalIDString = F028D2FD25D17B080095C2D5; + remoteInfo = TabFSServer; }; F0442A0525C7507400D998A5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; @@ -44,17 +45,6 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - F028D2BD25D0B7370095C2D5 /* Embed XPC Services */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "$(CONTENTS_FOLDER_PATH)/XPCServices"; - dstSubfolderSpec = 16; - files = ( - F028D2BC25D0B7370095C2D5 /* TabFSService.xpc in Embed XPC Services */, - ); - name = "Embed XPC Services"; - runOnlyForDeploymentPostprocessing = 0; - }; F028D2E525D106BB0095C2D5 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -65,6 +55,25 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F028D2FC25D17B080095C2D5 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + F028D30E25D17BD20095C2D5 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 7; + files = ( + F028D34525D17D6A0095C2D5 /* TabFSServer in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; F0442A1425C7507400D998A5 /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -84,6 +93,8 @@ F028D2B525D0B7370095C2D5 /* TabFSService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabFSService.swift; sourceTree = ""; }; F028D2B725D0B7370095C2D5 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; F028D2B925D0B7370095C2D5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F028D2FE25D17B080095C2D5 /* TabFSServer */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = TabFSServer; sourceTree = BUILT_PRODUCTS_DIR; }; + F028D30025D17B080095C2D5 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; F04429F125C7507200D998A5 /* TabFS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TabFS.app; sourceTree = BUILT_PRODUCTS_DIR; }; F04429F425C7507200D998A5 /* TabFS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TabFS.entitlements; sourceTree = ""; }; F04429F525C7507200D998A5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -110,6 +121,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F028D2FB25D17B080095C2D5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; F04429EE25C7507200D998A5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -139,12 +157,21 @@ path = TabFSService; sourceTree = ""; }; + F028D2FF25D17B080095C2D5 /* TabFSServer */ = { + isa = PBXGroup; + children = ( + F028D30025D17B080095C2D5 /* main.swift */, + ); + path = TabFSServer; + sourceTree = ""; + }; F04429E825C7507200D998A5 = { isa = PBXGroup; children = ( F04429F325C7507200D998A5 /* TabFS */, F0442A0A25C7507400D998A5 /* TabFS Extension */, F028D2B225D0B7370095C2D5 /* TabFSService */, + F028D2FF25D17B080095C2D5 /* TabFSServer */, F0442A0725C7507400D998A5 /* Frameworks */, F04429F225C7507200D998A5 /* Products */, ); @@ -156,6 +183,7 @@ F04429F125C7507200D998A5 /* TabFS.app */, F0442A0325C7507400D998A5 /* TabFS Extension.appex */, F028D2B125D0B7370095C2D5 /* TabFSService.xpc */, + F028D2FE25D17B080095C2D5 /* TabFSServer */, ); name = Products; sourceTree = ""; @@ -214,16 +242,35 @@ F028D2AD25D0B7370095C2D5 /* Sources */, F028D2AE25D0B7370095C2D5 /* Frameworks */, F028D2AF25D0B7370095C2D5 /* Resources */, + F028D30E25D17BD20095C2D5 /* CopyFiles */, ); buildRules = ( ); dependencies = ( + F028D33825D17D100095C2D5 /* PBXTargetDependency */, ); name = TabFSService; productName = TabFSService; productReference = F028D2B125D0B7370095C2D5 /* TabFSService.xpc */; productType = "com.apple.product-type.xpc-service"; }; + F028D2FD25D17B080095C2D5 /* TabFSServer */ = { + isa = PBXNativeTarget; + buildConfigurationList = F028D30425D17B090095C2D5 /* Build configuration list for PBXNativeTarget "TabFSServer" */; + buildPhases = ( + F028D2FA25D17B080095C2D5 /* Sources */, + F028D2FB25D17B080095C2D5 /* Frameworks */, + F028D2FC25D17B080095C2D5 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TabFSServer; + productName = TabFSServer; + productReference = F028D2FE25D17B080095C2D5 /* TabFSServer */; + productType = "com.apple.product-type.tool"; + }; F04429F025C7507200D998A5 /* TabFS */ = { isa = PBXNativeTarget; buildConfigurationList = F0442A1525C7507400D998A5 /* Build configuration list for PBXNativeTarget "TabFS" */; @@ -232,13 +279,11 @@ F04429EE25C7507200D998A5 /* Frameworks */, F04429EF25C7507200D998A5 /* Resources */, F0442A1425C7507400D998A5 /* Embed App Extensions */, - F028D2BD25D0B7370095C2D5 /* Embed XPC Services */, ); buildRules = ( ); dependencies = ( F0442A0625C7507400D998A5 /* PBXTargetDependency */, - F028D2BB25D0B7370095C2D5 /* PBXTargetDependency */, ); name = TabFS; productName = TabFS; @@ -275,6 +320,9 @@ F028D2B025D0B7370095C2D5 = { CreatedOnToolsVersion = 12.1; }; + F028D2FD25D17B080095C2D5 = { + CreatedOnToolsVersion = 12.1; + }; F04429F025C7507200D998A5 = { CreatedOnToolsVersion = 12.1; }; @@ -299,6 +347,7 @@ F04429F025C7507200D998A5 /* TabFS */, F0442A0225C7507400D998A5 /* TabFS Extension */, F028D2B025D0B7370095C2D5 /* TabFSService */, + F028D2FD25D17B080095C2D5 /* TabFSServer */, ); }; /* End PBXProject section */ @@ -344,6 +393,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F028D2FA25D17B080095C2D5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F028D30125D17B080095C2D5 /* main.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; F04429ED25C7507200D998A5 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -365,10 +422,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - F028D2BB25D0B7370095C2D5 /* PBXTargetDependency */ = { + F028D33825D17D100095C2D5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = F028D2B025D0B7370095C2D5 /* TabFSService */; - targetProxy = F028D2BA25D0B7370095C2D5 /* PBXContainerItemProxy */; + target = F028D2FD25D17B080095C2D5 /* TabFSServer */; + targetProxy = F028D33725D17D100095C2D5 /* PBXContainerItemProxy */; }; F0442A0625C7507400D998A5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -421,6 +478,28 @@ }; name = Release; }; + F028D30225D17B080095C2D5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 75YA78K5AM; + ENABLE_HARDENED_RUNTIME = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + F028D30325D17B080095C2D5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 75YA78K5AM; + ENABLE_HARDENED_RUNTIME = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; F0442A0F25C7507400D998A5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -628,6 +707,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + F028D30425D17B090095C2D5 /* Build configuration list for PBXNativeTarget "TabFSServer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F028D30225D17B080095C2D5 /* Debug */, + F028D30325D17B080095C2D5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; F04429EC25C7507200D998A5 /* Build configuration list for PBXProject "TabFS" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 7b7b1d3434926613cd0b1d6d1e644e594946fde1..db4d28a4586d55fe2fec66a1786a1afbb034a065 100644 GIT binary patch delta 30304 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 F{{UW8E&%`l delta 29764 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 diff --git a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcschemes/xcschememanagement.plist b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcschemes/xcschememanagement.plist index 9296675..e89e3dc 100644 --- a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,13 +7,18 @@ TabFS.xcscheme_^#shared#^_ orderHint - 0 + 2 - TabFSService.xcscheme_^#shared#^_ + TabFSServer.xcscheme_^#shared#^_ orderHint 1 + TabFSService.xcscheme_^#shared#^_ + + orderHint + 0 + diff --git a/extension/safari/TabFS/TabFSServer/main.swift b/extension/safari/TabFS/TabFSServer/main.swift new file mode 100644 index 0000000..245bfb1 --- /dev/null +++ b/extension/safari/TabFS/TabFSServer/main.swift @@ -0,0 +1,113 @@ +// +// main.swift +// TabFSServer +// +// Created by Omar Rizwan on 2/8/21. +// + +import Foundation +import Network +import os.log + +class TabFSServer { + + var fs: Process! + var fsInput: FileHandle! + var fsOutput: FileHandle! + func startFs() { + let fileURL = URL(fileURLWithPath: #filePath) + let repoURL = fileURL.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent() + + fs = Process() + fs.executableURL = repoURL.appendingPathComponent("fs").appendingPathComponent("tabfs") + fs.currentDirectoryURL = fs.executableURL?.deletingLastPathComponent() + + fs.arguments = [] + + let inputPipe = Pipe(), outputPipe = Pipe() + fs.standardInput = inputPipe + fs.standardOutput = outputPipe + + fsInput = inputPipe.fileHandleForWriting + fsOutput = outputPipe.fileHandleForReading + + try! fs.run() + } + + var ws: NWListener! + func startWs() { + // TODO: randomly generate port and report back to caller? + let port = NWEndpoint.Port(rawValue: 9991)! + + let parameters = NWParameters(tls: nil) + parameters.allowLocalEndpointReuse = true + parameters.includePeerToPeer = true + // for security ? so people outside your computer can't hijack TabFS at least + parameters.requiredInterfaceType = .loopback + + let opts = NWProtocolWebSocket.Options() + opts.autoReplyPing = true + parameters.defaultProtocolStack.applicationProtocols.insert(opts, at: 0) + + ws = try! NWListener(using: parameters, on: port) + ws.start(queue: .main) + } + + init() { + startFs() + startWs() + + var handleRequest: ((_ req: Data) -> Void)? + ws.newConnectionHandler = { conn in + conn.start(queue: .main) + + handleRequest = { req in + let metaData = NWProtocolWebSocket.Metadata(opcode: .text) + let context = NWConnection.ContentContext(identifier: "context", metadata: [metaData]) + conn.send(content: req, contentContext: context, completion: .contentProcessed({ err in + if err != nil { + os_log(.default, "req %{public}@ error: %{public}@", String(data: req, encoding: .utf8)!, err!.debugDescription as CVarArg) + // FIXME: ERROR + } + })) + } + + func read() { + conn.receiveMessage { (resp, context, isComplete, err) in + guard let resp = resp else { + // FIXME err + os_log(.default, "resp error: %{public}@", err!.debugDescription as CVarArg) + return + } + + // Send the response back to tabfs.c. + self.fsInput.write(withUnsafeBytes(of: UInt32(resp.count)) { Data($0) }) + self.fsInput.write(resp) + read() + } + } + read() + } + + DispatchQueue.global(qos: .default).async { + while true { + // Blocking read from the tabfs process. + let length = self.fsOutput.readData(ofLength: 4).withUnsafeBytes { $0.load(as: UInt32.self) } + let req = self.fsOutput.readData(ofLength: Int(length)) + + if let handleRequest = handleRequest { + // Send the request over the WebSocket connection to background.js in browser. + handleRequest(req) + } else { + // FIXME: ERROR + } + } + } + + // FIXME: notify + + } +} + +let server = TabFSServer() +dispatchMain() diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift index 86c39f8..4a86dd6 100644 --- a/extension/safari/TabFS/TabFSService/TabFSService.swift +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -10,105 +10,15 @@ import Network import os.log class TabFSService: NSObject, TabFSServiceProtocol { - var fs: Process! - var fsInput: FileHandle! - var fsOutput: FileHandle! - func startFs() { - let fileURL = URL(fileURLWithPath: #filePath) - let repoURL = fileURL.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent() - - fs = Process() - fs.executableURL = repoURL.appendingPathComponent("fs").appendingPathComponent("tabfs") - fs.currentDirectoryURL = fs.executableURL?.deletingLastPathComponent() - - fs.arguments = [] - - let inputPipe = Pipe(), outputPipe = Pipe() - fs.standardInput = inputPipe - fs.standardOutput = outputPipe - - fsInput = inputPipe.fileHandleForWriting - fsOutput = outputPipe.fileHandleForReading - - try! fs.run() - } - - var ws: NWListener! - func startWs() { - // TODO: randomly generate port and report back to caller? - let port = NWEndpoint.Port(rawValue: 9991)! - - let parameters = NWParameters(tls: nil) - parameters.allowLocalEndpointReuse = true - parameters.includePeerToPeer = true - // for security ? so people outside your computer can't hijack TabFS at least - parameters.requiredInterfaceType = .loopback - - let opts = NWProtocolWebSocket.Options() - opts.autoReplyPing = true - parameters.defaultProtocolStack.applicationProtocols.insert(opts, at: 0) - - ws = try! NWListener(using: parameters, on: port) - ws.start(queue: .main) - } - - override init() { - super.init() - - startFs() - startWs() - - var handleRequest: ((_ req: Data) -> Void)? - ws.newConnectionHandler = { conn in - conn.start(queue: .main) - - handleRequest = { req in - let metaData = NWProtocolWebSocket.Metadata(opcode: .text) - let context = NWConnection.ContentContext(identifier: "context", metadata: [metaData]) - conn.send(content: req, contentContext: context, completion: .contentProcessed({ err in - if err != nil { - os_log(.default, "req %{public}@ error: %{public}@", String(data: req, encoding: .utf8)!, err!.debugDescription as CVarArg) - // FIXME: ERROR - } - })) - } - - func read() { - conn.receiveMessage { (resp, context, isComplete, err) in - guard let resp = resp else { - // FIXME err - os_log(.default, "resp error: %{public}@", err!.debugDescription as CVarArg) - return - } - - // Send the response back to tabfs.c. - self.fsInput.write(withUnsafeBytes(of: UInt32(resp.count)) { Data($0) }) - self.fsInput.write(resp) - read() - } - } - read() - } - - DispatchQueue.global(qos: .default).async { - while true { - // Blocking read from the tabfs process. - let length = self.fsOutput.readData(ofLength: 4).withUnsafeBytes { $0.load(as: UInt32.self) } - let req = self.fsOutput.readData(ofLength: Int(length)) - - if let handleRequest = handleRequest { - // Send the request over the WebSocket connection to background.js in browser. - handleRequest(req) - } else { - // FIXME: ERROR - } - } - } - // FIXME: disable auto termination - } - func start(withReply reply: @escaping () -> Void) { // This XPC call is enough to just force the XPC service to be started. + os_log("HELLO") + let server = Process() + os_log("HOW ARE YOU?") + server.executableURL = Bundle.main.url(forResource: "TabFSServer", withExtension: "")! + os_log("I AM GOOD") + server.launch() + os_log("GREAT") reply() } } From 0f2ab4b4de7e828757091e323be1caab0a70b770 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Mon, 8 Feb 2021 13:45:26 -0800 Subject: [PATCH 16/16] safari: fix some races when you reload Web inspector, make ws connection retry --- extension/background.js | 25 ++++++++++---- extension/safari/README.md | 10 ++++-- .../SafariWebExtensionHandler.swift | 17 ++++++---- .../UserInterfaceState.xcuserstate | Bin 61961 -> 64115 bytes extension/safari/TabFS/TabFSServer/main.swift | 9 ++--- .../TabFS/TabFSService/TabFSService.swift | 31 +++++++++++++++--- 6 files changed, 68 insertions(+), 24 deletions(-) diff --git a/extension/background.js b/extension/background.js index 62ec7d0..e31a4c4 100644 --- a/extension/background.js +++ b/extension/background.js @@ -720,15 +720,26 @@ function tryConnect() { if (chrome.runtime.getURL('/').startsWith('safari-web-extension://')) { // Safari-only chrome.runtime.sendNativeMessage('com.rsnous.tabfs', {op: 'safari_did_connect'}, resp => { console.log(resp); - const socket = new WebSocket('ws://localhost:9991'); - socket.addEventListener('message', event => { - onMessage(JSON.parse(event.data)); - }); + let socket; + function connectSocket(checkAfterTime) { + socket = new WebSocket('ws://localhost:9991'); + socket.addEventListener('message', event => { + onMessage(JSON.parse(event.data)); + }); - port = { postMessage(message) { - socket.send(JSON.stringify(message)); - } }; + port = { postMessage(message) { + socket.send(JSON.stringify(message)); + } }; + + setTimeout(() => { + if (socket.readyState !== 1) { + console.log('ws connection failed, retrying in', checkAfterTime); + connectSocket(checkAfterTime * 2); + } + }, checkAfterTime); + } + connectSocket(200); }); return; } diff --git a/extension/safari/README.md b/extension/safari/README.md index 9ceafdc..8a47d23 100644 --- a/extension/safari/README.md +++ b/extension/safari/README.md @@ -24,8 +24,12 @@ it's mounted. ### tips - To open Web inspector: Safari -> Develop menu -> Web Extension - Background Pages -> TabFS + Background Pages -> TabFS. -- You need to rebuild if you change background.js. This is pretty - annoying. + Refreshing this inspector should reload the tabfs filesystem, also. + +- You need to rebuild in Xcode any time you change background.js + (because the extension files are copied into the extension, rather + than running directly from folder as in Firefox and Chrome). This is + pretty annoying. diff --git a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift index 75790fa..dc30cc4 100644 --- a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -17,16 +17,20 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { guard message["op"] as! String == "safari_did_connect" else { return } - // The XPC service is a subprocess that lives outside the macOS App Sandbox. + // The XPC service is a process that can live outside the macOS App Sandbox. // (Safari extension native code, including this file, has to live in the sandbox.) // It can do forbidden things like spawn tabfs filesystem and set up WebSocket server. - // We only use one native message to bootstrap the XPC service, then do all communications - // to that service (which in turn talks to tabfs.c) over WebSocket instead. + // We only use one native message, to bootstrap the XPC service (TabFSService). + // Then the XPC service starts TabFSServer. TabFSServer is separate because + // XPC services get killed by the OS after a minute or two; TabFSServer + // is just a normal process that can live on. It talks straight + // to background.js (which in turn talks to tabfs.c) over a WebSocket. + // (Safari makes doing native messaging quite painful, so we try to avoid it. // It forces the browser to pop to front if you message Safari in the obvious way, // for instance: https://developer.apple.com/forums/thread/122232 - // And with the WebSocket, the XPC service can talk straight to background.js, whereas + // And with the WebSocket, the server can talk straight to background.js, whereas // native messaging would require us here to sit in the middle.) let connection = NSXPCConnection(serviceName: "com.rsnous.TabFSService") @@ -44,8 +48,9 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { // FIXME: report port back? let response = NSExtensionItem() response.userInfo = [ "message": "alive" ] - // This response (over native messaging) prompts background.js to - // connect to the WebSocket server that the XPC service should now be running. + // This response (over native messaging) will prompt background.js to + // connect to the WebSocket server of TabFSServer, which should + // now be running. context.completeRequest(returningItems: [response]) { (what) in print(what) } diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index db4d28a4586d55fe2fec66a1786a1afbb034a065..96586efa5188d1811771b04dc6e136c4b0a21815 100644 GIT binary patch delta 27086 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 OzwR6V*Z)uU+W!CrNn5)B delta 25886 zcmafa1zZ)`AMc%+Gjs2qrpq9tyGua802NUYq)R|RL`nn^?>)P=u65nD1F^8z?p(XO zbM4mEwe_937Zlh3d(V&e0&`~0{Jy{bo%1{Yye3B9Atq*F;Lq&Ym})dW0iTFZ!KdNV z@!9wsd@f#(FTmI18}P08PJAzZ0zZkL!cXI8@N4*W{04p#e}aD^a6&<_1V`u*MuZt* zPP8K05cY%v;Yc_UZiGJ(LPQdsh$x~f5kvGK;)w(znMfgWh(e--s2~Os)x=<8D4`;L zRT0C8QN$c#E-{a&BjywJ!~$X=v4~hqEF;zsYl(Hl7Gf*0m-vg=N9-pK5GRO}#3|x5 zafY}`+$Qc3kBG;_6XFH&l6XV>OS~oC0Sw3i2lRjuFazeG6|e@*z!L<3wjczAg9y+O zbOzl(EQkZWKqgRSfo#wRRyA z$Vze$Sw#*dRpdx=6giq4Lyjdi