From ba1c4c15636088012ed6e66acbdc6cd27e681d05 Mon Sep 17 00:00:00 2001 From: Max Goedjen Date: Fri, 11 Feb 2022 23:31:03 -0800 Subject: [PATCH] XPC to agent working --- .../Brief/Documentation.docc/Documentation.md | 4 +- Sources/Packages/Sources/Brief/Updater.swift | 8 +- .../Sources/Brief/UpdaterProtocol.swift | 2 +- .../BriefTests/ReleaseParsingTests.swift | 4 +- Sources/SecretAgent/AppDelegate.swift | 2 +- Sources/Secretive.xcodeproj/project.pbxproj | 202 +++--- .../xcschemes/SecretiveUpdater.xcscheme | 78 ++ Sources/Secretive/App.swift | 4 +- .../UpdaterCommunicationController.swift | 11 +- .../Preview Content/PreviewUpdater.swift | 2 +- Sources/Secretive/Secretive.entitlements | 4 + Sources/Secretive/Views/ContentView.swift | 2 +- Sources/Secretive/Views/UpdateView.swift | 2 +- Sources/SecretiveUpdater/AppDelegate.swift | 43 ++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 60 ++ .../AppIcon.appiconset/Mac Icon.png | Bin 0 -> 15975 bytes .../AppIcon.appiconset/Mac Icon@0.25x.png | Bin 0 -> 40764 bytes .../Assets.xcassets/Contents.json | 6 + Sources/SecretiveUpdater/Info.plist | 7 +- Sources/SecretiveUpdater/Main.storyboard | 683 ++++++++++++++++++ .../SecretiveUpdater.entitlements | 10 + Sources/SecretiveUpdater/Updater.swift | 2 +- .../SecretiveUpdater/UpdaterProtocol.swift | 1 + 24 files changed, 1038 insertions(+), 110 deletions(-) create mode 100644 Sources/Secretive.xcodeproj/xcshareddata/xcschemes/SecretiveUpdater.xcscheme create mode 100644 Sources/SecretiveUpdater/AppDelegate.swift create mode 100644 Sources/SecretiveUpdater/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Sources/SecretiveUpdater/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Sources/SecretiveUpdater/Assets.xcassets/AppIcon.appiconset/Mac Icon.png create mode 100644 Sources/SecretiveUpdater/Assets.xcassets/AppIcon.appiconset/Mac Icon@0.25x.png create mode 100644 Sources/SecretiveUpdater/Assets.xcassets/Contents.json create mode 100644 Sources/SecretiveUpdater/Main.storyboard create mode 100644 Sources/SecretiveUpdater/SecretiveUpdater.entitlements diff --git a/Sources/Packages/Sources/Brief/Documentation.docc/Documentation.md b/Sources/Packages/Sources/Brief/Documentation.docc/Documentation.md index fe1562c..af11448 100644 --- a/Sources/Packages/Sources/Brief/Documentation.docc/Documentation.md +++ b/Sources/Packages/Sources/Brief/Documentation.docc/Documentation.md @@ -11,5 +11,5 @@ Brief is a collection of protocols and concrete implmentation describing updates ### Updater -- ``UpdaterProtocol`` -- ``Updater`` +- ``UpdateCheckerProtocol`` +- ``UpdateChecker`` diff --git a/Sources/Packages/Sources/Brief/Updater.swift b/Sources/Packages/Sources/Brief/Updater.swift index c71e538..dd4ff2a 100644 --- a/Sources/Packages/Sources/Brief/Updater.swift +++ b/Sources/Packages/Sources/Brief/Updater.swift @@ -1,8 +1,8 @@ import Foundation import Combine -/// A concrete implementation of ``UpdaterProtocol`` which considers the current release and OS version. -public class Updater: ObservableObject, UpdaterProtocol { +/// A concrete implementation of ``UpdateCheckerProtocol`` which considers the current release and OS version. +public class UpdateChecker: ObservableObject, UpdateCheckerProtocol { @Published public var update: Release? public let testBuild: Bool @@ -53,7 +53,7 @@ public class Updater: ObservableObject, UpdaterProtocol { } -extension Updater { +extension UpdateChecker { /// Evaluates the available downloadable releases, and selects the newest non-prerelease release that the user is able to run. /// - Parameter releases: An array of ``Release`` objects. @@ -88,7 +88,7 @@ extension Updater { } -extension Updater { +extension UpdateChecker { enum Constants { static let updateURL = URL(string: "https://api.github.com/repos/maxgoedjen/secretive/releases")! diff --git a/Sources/Packages/Sources/Brief/UpdaterProtocol.swift b/Sources/Packages/Sources/Brief/UpdaterProtocol.swift index 1930a0f..1d37b84 100644 --- a/Sources/Packages/Sources/Brief/UpdaterProtocol.swift +++ b/Sources/Packages/Sources/Brief/UpdaterProtocol.swift @@ -1,7 +1,7 @@ import Foundation /// A protocol for retreiving the latest available version of an app. -public protocol UpdaterProtocol: ObservableObject { +public protocol UpdateCheckerProtocol: ObservableObject { /// The latest update var update: Release? { get } diff --git a/Sources/Packages/Tests/BriefTests/ReleaseParsingTests.swift b/Sources/Packages/Tests/BriefTests/ReleaseParsingTests.swift index 74af9ee..3a0f326 100644 --- a/Sources/Packages/Tests/BriefTests/ReleaseParsingTests.swift +++ b/Sources/Packages/Tests/BriefTests/ReleaseParsingTests.swift @@ -51,7 +51,7 @@ class ReleaseParsingTests: XCTestCase { func testGreatestSelectedIfOldPatchIsPublishedLater() { // If 2.x.x series has been published, and a patch for 1.x.x is issued // 2.x.x should still be selected if user can run it. - let updater = Updater(checkOnLaunch: false, osVersion: SemVer("2.2.3"), currentVersion: SemVer("1.0.0")) + let updater = UpdateChecker(checkOnLaunch: false, osVersion: SemVer("2.2.3"), currentVersion: SemVer("1.0.0")) let two = Release(name: "2.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "2.0 available! Minimum macOS Version: 2.2.3") let releases = [ Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Initial release Minimum macOS Version: 1.2.3"), @@ -72,7 +72,7 @@ class ReleaseParsingTests: XCTestCase { func testLatestVersionIsRunnable() { // If the 2.x.x series has been published but the user can't run it // the last version the user can run should be selected. - let updater = Updater(checkOnLaunch: false, osVersion: SemVer("1.2.3"), currentVersion: SemVer("1.0.0")) + let updater = UpdateChecker(checkOnLaunch: false, osVersion: SemVer("1.2.3"), currentVersion: SemVer("1.0.0")) let oneOhTwo = Release(name: "1.0.2", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Emergency patch! Minimum macOS Version: 1.2.3") let releases = [ Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Initial release Minimum macOS Version: 1.2.3"), diff --git a/Sources/SecretAgent/AppDelegate.swift b/Sources/SecretAgent/AppDelegate.swift index 2c221dd..54bac2f 100644 --- a/Sources/SecretAgent/AppDelegate.swift +++ b/Sources/SecretAgent/AppDelegate.swift @@ -16,7 +16,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { list.add(store: SmartCard.Store()) return list }() - private let updater = Updater(checkOnLaunch: false) + private let updater = UpdateChecker(checkOnLaunch: false) private let notifier = Notifier() private let publicKeyFileStoreController = PublicKeyFileStoreController(homeDirectory: NSHomeDirectory()) private lazy var agent: Agent = { diff --git a/Sources/Secretive.xcodeproj/project.pbxproj b/Sources/Secretive.xcodeproj/project.pbxproj index 79ad47b..a12bbee 100644 --- a/Sources/Secretive.xcodeproj/project.pbxproj +++ b/Sources/Secretive.xcodeproj/project.pbxproj @@ -18,6 +18,9 @@ 5003EF612780081600DF2006 /* SmartCardSecretKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5003EF602780081600DF2006 /* SmartCardSecretKit */; }; 5003EF632780081B00DF2006 /* SecureEnclaveSecretKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5003EF622780081B00DF2006 /* SecureEnclaveSecretKit */; }; 5003EF652780081B00DF2006 /* SmartCardSecretKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5003EF642780081B00DF2006 /* SmartCardSecretKit */; }; + 500ED3D427B7934A00A6DC28 /* UpdaterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5088065927B4A5E40090BD57 /* UpdaterProtocol.swift */; }; + 500ED3D527B796C800A6DC28 /* Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater.app in Resources */ = {isa = PBXBuildFile; fileRef = 5081F6D027B790DD0094B82D /* Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater.app */; }; + 500ED3DA27B797EE00A6DC28 /* Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5081F6D027B790DD0094B82D /* Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 501421622781262300BBAA70 /* Brief in Frameworks */ = {isa = PBXBuildFile; productRef = 501421612781262300BBAA70 /* Brief */; }; 501421652781268000BBAA70 /* SecretAgent.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 50A3B78A24026B7500D209EA /* SecretAgent.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 50153E20250AFCB200525160 /* UpdateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50153E1F250AFCB200525160 /* UpdateView.swift */; }; @@ -37,10 +40,12 @@ 506772C72424784600034DED /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 506772C62424784600034DED /* Credits.rtf */; }; 506772C92425BB8500034DED /* NoStoresView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506772C82425BB8500034DED /* NoStoresView.swift */; }; 5079BA0F250F29BF00EA86F4 /* StoreListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5079BA0E250F29BF00EA86F4 /* StoreListView.swift */; }; - 5088065327B4A5BE0090BD57 /* SecretiveUpdater.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = 5088064827B4A5BE0090BD57 /* SecretiveUpdater.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 5088065A27B4A5E40090BD57 /* UpdaterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5088065927B4A5E40090BD57 /* UpdaterProtocol.swift */; }; - 5088065C27B4A6240090BD57 /* Updater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5088065B27B4A6240090BD57 /* Updater.swift */; }; - 5088065E27B4A6460090BD57 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5088065D27B4A6460090BD57 /* main.swift */; }; + 5081F6D327B790DD0094B82D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5081F6D227B790DD0094B82D /* AppDelegate.swift */; }; + 5081F6D727B790DE0094B82D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5081F6D627B790DE0094B82D /* Assets.xcassets */; }; + 5081F6E027B791110094B82D /* UpdaterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5088065927B4A5E40090BD57 /* UpdaterProtocol.swift */; }; + 5081F6E127B791110094B82D /* Updater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5088065B27B4A6240090BD57 /* Updater.swift */; }; + 5081F6E327B791620094B82D /* Brief in Frameworks */ = {isa = PBXBuildFile; productRef = 5081F6E227B791620094B82D /* Brief */; }; + 5081F70027B792150094B82D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5081F6FF27B792150094B82D /* Main.storyboard */; }; 5088068F27B4A6FF0090BD57 /* UpdaterCommunicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5088068E27B4A6FF0090BD57 /* UpdaterCommunicationController.swift */; }; 508A58AA241E06B40069DC07 /* PreviewUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508A58A9241E06B40069DC07 /* PreviewUpdater.swift */; }; 508A58B3241ED2180069DC07 /* AgentStatusChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508A58B2241ED2180069DC07 /* AgentStatusChecker.swift */; }; @@ -49,7 +54,6 @@ 508BF2AA25B4F1CB009EFB7E /* InternetAccessPolicy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 508BF29425B4F140009EFB7E /* InternetAccessPolicy.plist */; }; 5091D2BC25183B830049FD9B /* ApplicationDirectoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5091D2BB25183B830049FD9B /* ApplicationDirectoryController.swift */; }; 5099A02423FD2AAA0062B6F2 /* CreateSecretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5099A02323FD2AAA0062B6F2 /* CreateSecretView.swift */; }; - 50A00F5B27B4E99C0020C9CA /* Brief in Frameworks */ = {isa = PBXBuildFile; productRef = 50A00F5A27B4E99C0020C9CA /* Brief */; }; 50A3B79124026B7600D209EA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50A3B79024026B7600D209EA /* Assets.xcassets */; }; 50A3B79424026B7600D209EA /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50A3B79324026B7600D209EA /* Preview Assets.xcassets */; }; 50A3B79724026B7600D209EA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50A3B79524026B7600D209EA /* Main.storyboard */; }; @@ -59,6 +63,20 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 500ED3D627B796C800A6DC28 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 50617D7723FCE48D0099B055 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5081F6CF27B790DD0094B82D; + remoteInfo = SecretiveUpdater; + }; + 500ED3D827B7978700A6DC28 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 50617D7723FCE48D0099B055 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5081F6CF27B790DD0094B82D; + remoteInfo = SecretiveUpdater; + }; 50142166278126B500BBAA70 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 50617D7723FCE48D0099B055 /* Project object */; @@ -73,13 +91,6 @@ remoteGlobalIDString = 50617D7E23FCE48D0099B055; remoteInfo = Secretive; }; - 5088065127B4A5BE0090BD57 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 50617D7723FCE48D0099B055 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5088064727B4A5BE0090BD57; - remoteInfo = SecretiveUpdater; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -93,17 +104,6 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 5088065427B4A5BE0090BD57 /* Embed XPC Services */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "$(CONTENTS_FOLDER_PATH)/XPCServices"; - dstSubfolderSpec = 16; - files = ( - 5088065327B4A5BE0090BD57 /* SecretiveUpdater.xpc in Embed XPC Services */, - ); - name = "Embed XPC Services"; - runOnlyForDeploymentPostprocessing = 0; - }; 50A5C18E240E4B4B00E2996C /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -120,6 +120,7 @@ dstPath = Contents/Library/LoginItems; dstSubfolderSpec = 1; files = ( + 500ED3DA27B797EE00A6DC28 /* Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater.app in CopyFiles */, 501421652781268000BBAA70 /* SecretAgent.app in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; @@ -153,7 +154,11 @@ 506772C62424784600034DED /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 506772C82425BB8500034DED /* NoStoresView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoStoresView.swift; sourceTree = ""; }; 5079BA0E250F29BF00EA86F4 /* StoreListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListView.swift; sourceTree = ""; }; - 5088064827B4A5BE0090BD57 /* SecretiveUpdater.xpc */ = {isa = PBXFileReference; explicitFileType = "wrapper.xpc-service"; includeInIndex = 0; path = SecretiveUpdater.xpc; sourceTree = BUILT_PRODUCTS_DIR; }; + 5081F6D027B790DD0094B82D /* Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5081F6D227B790DD0094B82D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 5081F6D627B790DE0094B82D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5081F6DB27B790DE0094B82D /* SecretiveUpdater.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SecretiveUpdater.entitlements; sourceTree = ""; }; + 5081F6FF27B792150094B82D /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 5088065027B4A5BE0090BD57 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5088065927B4A5E40090BD57 /* UpdaterProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdaterProtocol.swift; sourceTree = ""; }; 5088065B27B4A6240090BD57 /* Updater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Updater.swift; sourceTree = ""; }; @@ -198,11 +203,11 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 5088064527B4A5BE0090BD57 /* Frameworks */ = { + 5081F6CD27B790DD0094B82D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 50A00F5B27B4E99C0020C9CA /* Brief in Frameworks */, + 5081F6E327B791620094B82D /* Brief in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -238,6 +243,7 @@ 50A3B78B24026B7500D209EA /* SecretAgent */, 508A58AF241E144C0069DC07 /* Config */, 5088064927B4A5BE0090BD57 /* SecretiveUpdater */, + 5081F6D127B790DD0094B82D /* SecretiveUpdater */, 50617D8023FCE48E0099B055 /* Products */, 5099A08B240243730062B6F2 /* Frameworks */, ); @@ -249,7 +255,7 @@ 50617D7F23FCE48E0099B055 /* Secretive.app */, 50617D9423FCE48E0099B055 /* SecretiveTests.xctest */, 50A3B78A24026B7500D209EA /* SecretAgent.app */, - 5088064827B4A5BE0090BD57 /* SecretiveUpdater.xpc */, + 5081F6D027B790DD0094B82D /* Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater.app */, ); name = Products; sourceTree = ""; @@ -291,12 +297,23 @@ path = SecretiveTests; sourceTree = ""; }; + 5081F6D127B790DD0094B82D /* SecretiveUpdater */ = { + isa = PBXGroup; + children = ( + 5081F6D227B790DD0094B82D /* AppDelegate.swift */, + 5088065927B4A5E40090BD57 /* UpdaterProtocol.swift */, + 5088065B27B4A6240090BD57 /* Updater.swift */, + 5081F6FF27B792150094B82D /* Main.storyboard */, + 5081F6D627B790DE0094B82D /* Assets.xcassets */, + 5081F6DB27B790DE0094B82D /* SecretiveUpdater.entitlements */, + ); + path = SecretiveUpdater; + sourceTree = ""; + }; 5088064927B4A5BE0090BD57 /* SecretiveUpdater */ = { isa = PBXGroup; children = ( 5088065027B4A5BE0090BD57 /* Info.plist */, - 5088065927B4A5E40090BD57 /* UpdaterProtocol.swift */, - 5088065B27B4A6240090BD57 /* Updater.swift */, 5088065D27B4A6460090BD57 /* main.swift */, ); path = SecretiveUpdater; @@ -337,8 +354,8 @@ 508A58B2241ED2180069DC07 /* AgentStatusChecker.swift */, 5091D2BB25183B830049FD9B /* ApplicationDirectoryController.swift */, 50571E0224393C2600F76F6C /* JustUpdatedChecker.swift */, - 50571E0424393D1500F76F6C /* LaunchAgentController.swift */, 5066A6F6251829B1004B5A36 /* ShellConfigurationController.swift */, + 50571E0424393D1500F76F6C /* LaunchAgentController.swift */, ); path = Controllers; sourceTree = ""; @@ -385,13 +402,13 @@ 50617D7D23FCE48D0099B055 /* Resources */, 50617DBF23FCE4AB0099B055 /* Embed Frameworks */, 50C385AF240E438B00AF2719 /* CopyFiles */, - 5088065427B4A5BE0090BD57 /* Embed XPC Services */, ); buildRules = ( ); dependencies = ( 50142167278126B500BBAA70 /* PBXTargetDependency */, - 5088065227B4A5BE0090BD57 /* PBXTargetDependency */, + 500ED3D727B796C800A6DC28 /* PBXTargetDependency */, + 500ED3D927B7978700A6DC28 /* PBXTargetDependency */, ); name = Secretive; packageProductDependencies = ( @@ -422,13 +439,13 @@ productReference = 50617D9423FCE48E0099B055 /* SecretiveTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - 5088064727B4A5BE0090BD57 /* SecretiveUpdater */ = { + 5081F6CF27B790DD0094B82D /* SecretiveUpdater */ = { isa = PBXNativeTarget; - buildConfigurationList = 5088065827B4A5BE0090BD57 /* Build configuration list for PBXNativeTarget "SecretiveUpdater" */; + buildConfigurationList = 5081F6DC27B790DE0094B82D /* Build configuration list for PBXNativeTarget "SecretiveUpdater" */; buildPhases = ( - 5088064427B4A5BE0090BD57 /* Sources */, - 5088064527B4A5BE0090BD57 /* Frameworks */, - 5088064627B4A5BE0090BD57 /* Resources */, + 5081F6CC27B790DD0094B82D /* Sources */, + 5081F6CD27B790DD0094B82D /* Frameworks */, + 5081F6CE27B790DD0094B82D /* Resources */, ); buildRules = ( ); @@ -436,11 +453,11 @@ ); name = SecretiveUpdater; packageProductDependencies = ( - 50A00F5A27B4E99C0020C9CA /* Brief */, + 5081F6E227B791620094B82D /* Brief */, ); productName = SecretiveUpdater; - productReference = 5088064827B4A5BE0090BD57 /* SecretiveUpdater.xpc */; - productType = "com.apple.product-type.xpc-service"; + productReference = 5081F6D027B790DD0094B82D /* Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater.app */; + productType = "com.apple.product-type.application"; }; 50A3B78924026B7500D209EA /* SecretAgent */ = { isa = PBXNativeTarget; @@ -473,7 +490,7 @@ 50617D7723FCE48D0099B055 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1220; + LastSwiftUpdateCheck = 1330; LastUpgradeCheck = 1320; ORGANIZATIONNAME = "Max Goedjen"; TargetAttributes = { @@ -484,9 +501,8 @@ CreatedOnToolsVersion = 11.3; TestTargetID = 50617D7E23FCE48D0099B055; }; - 5088064727B4A5BE0090BD57 = { + 5081F6CF27B790DD0094B82D = { CreatedOnToolsVersion = 13.3; - LastSwiftMigration = 1330; }; 50A3B78924026B7500D209EA = { CreatedOnToolsVersion = 11.4; @@ -509,7 +525,7 @@ 50617D7E23FCE48D0099B055 /* Secretive */, 50617D9323FCE48E0099B055 /* SecretiveTests */, 50A3B78924026B7500D209EA /* SecretAgent */, - 5088064727B4A5BE0090BD57 /* SecretiveUpdater */, + 5081F6CF27B790DD0094B82D /* SecretiveUpdater */, ); }; /* End PBXProject section */ @@ -522,6 +538,7 @@ 50617D8A23FCE48E0099B055 /* Preview Assets.xcassets in Resources */, 50617D8723FCE48E0099B055 /* Assets.xcassets in Resources */, 506772C72424784600034DED /* Credits.rtf in Resources */, + 500ED3D527B796C800A6DC28 /* Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater.app in Resources */, 508BF28E25B4F005009EFB7E /* InternetAccessPolicy.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -533,10 +550,12 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 5088064627B4A5BE0090BD57 /* Resources */ = { + 5081F6CE27B790DD0094B82D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5081F6D727B790DE0094B82D /* Assets.xcassets in Resources */, + 5081F70027B792150094B82D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -565,6 +584,7 @@ 50571E0324393C2600F76F6C /* JustUpdatedChecker.swift in Sources */, 5079BA0F250F29BF00EA86F4 /* StoreListView.swift in Sources */, 50617DD223FCEFA90099B055 /* PreviewStore.swift in Sources */, + 500ED3D427B7934A00A6DC28 /* UpdaterProtocol.swift in Sources */, 5066A6F7251829B1004B5A36 /* ShellConfigurationController.swift in Sources */, 50033AC327813F1700253856 /* BundleIDs.swift in Sources */, 508A58B3241ED2180069DC07 /* AgentStatusChecker.swift in Sources */, @@ -592,13 +612,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 5088064427B4A5BE0090BD57 /* Sources */ = { + 5081F6CC27B790DD0094B82D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5088065A27B4A5E40090BD57 /* UpdaterProtocol.swift in Sources */, - 5088065C27B4A6240090BD57 /* Updater.swift in Sources */, - 5088065E27B4A6460090BD57 /* main.swift in Sources */, + 5081F6D327B790DD0094B82D /* AppDelegate.swift in Sources */, + 5081F6E027B791110094B82D /* UpdaterProtocol.swift in Sources */, + 5081F6E127B791110094B82D /* Updater.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -614,6 +634,16 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 500ED3D727B796C800A6DC28 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5081F6CF27B790DD0094B82D /* SecretiveUpdater */; + targetProxy = 500ED3D627B796C800A6DC28 /* PBXContainerItemProxy */; + }; + 500ED3D927B7978700A6DC28 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5081F6CF27B790DD0094B82D /* SecretiveUpdater */; + targetProxy = 500ED3D827B7978700A6DC28 /* PBXContainerItemProxy */; + }; 50142167278126B500BBAA70 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 50A3B78924026B7500D209EA /* SecretAgent */; @@ -624,11 +654,6 @@ target = 50617D7E23FCE48D0099B055 /* Secretive */; targetProxy = 50617D9523FCE48E0099B055 /* PBXContainerItemProxy */; }; - 5088065227B4A5BE0090BD57 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5088064727B4A5BE0090BD57 /* SecretiveUpdater */; - targetProxy = 5088065127B4A5BE0090BD57 /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -862,12 +887,13 @@ }; name = Release; }; - 5088065527B4A5BE0090BD57 /* Debug */ = { + 5081F6DD27B790DE0094B82D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_ENTITLEMENTS = SecretiveUpdater/SecretiveUpdater.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; @@ -875,76 +901,77 @@ ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SecretiveUpdater/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = SecretiveUpdater; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Max Goedjen. All rights reserved."; + INFOPLIST_KEY_NSMainStoryboardFile = Main; + INFOPLIST_KEY_NSPrincipalClass = NSApplication; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", - "@loader_path/../Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = 12.3; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.maxgoedjen.SecretiveUpdater; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; + PRODUCT_BUNDLE_IDENTIFIER = Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater; + PRODUCT_NAME = Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater; SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; }; name = Debug; }; - 5088065627B4A5BE0090BD57 /* Test */ = { + 5081F6DE27B790DE0094B82D /* Test */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = SecretiveUpdater/SecretiveUpdater.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = Z72PRUAWF6; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SecretiveUpdater/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = SecretiveUpdater; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Max Goedjen. All rights reserved."; + INFOPLIST_KEY_NSMainStoryboardFile = Main; + INFOPLIST_KEY_NSPrincipalClass = NSApplication; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", - "@loader_path/../Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = 12.3; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.maxgoedjen.SecretiveUpdater; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; + PRODUCT_BUNDLE_IDENTIFIER = Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater; + PRODUCT_NAME = Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater; SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; }; name = Test; }; - 5088065727B4A5BE0090BD57 /* Release */ = { + 5081F6DF27B790DE0094B82D /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "Developer ID Application"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_ENTITLEMENTS = SecretiveUpdater/SecretiveUpdater.entitlements; + CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = Z72PRUAWF6; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SecretiveUpdater/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = SecretiveUpdater; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Max Goedjen. All rights reserved."; + INFOPLIST_KEY_NSMainStoryboardFile = Main; + INFOPLIST_KEY_NSPrincipalClass = NSApplication; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", - "@loader_path/../Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = 12.3; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.maxgoedjen.SecretiveUpdater; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; + PRODUCT_BUNDLE_IDENTIFIER = Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater; + PRODUCT_NAME = Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; }; @@ -1020,6 +1047,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Secretive/Secretive.entitlements; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; @@ -1162,12 +1190,12 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5088065827B4A5BE0090BD57 /* Build configuration list for PBXNativeTarget "SecretiveUpdater" */ = { + 5081F6DC27B790DE0094B82D /* Build configuration list for PBXNativeTarget "SecretiveUpdater" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5088065527B4A5BE0090BD57 /* Debug */, - 5088065627B4A5BE0090BD57 /* Test */, - 5088065727B4A5BE0090BD57 /* Release */, + 5081F6DD27B790DE0094B82D /* Debug */, + 5081F6DE27B790DE0094B82D /* Test */, + 5081F6DF27B790DE0094B82D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1221,7 +1249,7 @@ isa = XCSwiftPackageProductDependency; productName = Brief; }; - 50A00F5A27B4E99C0020C9CA /* Brief */ = { + 5081F6E227B791620094B82D /* Brief */ = { isa = XCSwiftPackageProductDependency; productName = Brief; }; diff --git a/Sources/Secretive.xcodeproj/xcshareddata/xcschemes/SecretiveUpdater.xcscheme b/Sources/Secretive.xcodeproj/xcshareddata/xcschemes/SecretiveUpdater.xcscheme new file mode 100644 index 0000000..25476f1 --- /dev/null +++ b/Sources/Secretive.xcodeproj/xcshareddata/xcschemes/SecretiveUpdater.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Sources/Secretive/App.swift b/Sources/Secretive/App.swift index fdf369d..24b7fb3 100644 --- a/Sources/Secretive/App.swift +++ b/Sources/Secretive/App.swift @@ -24,9 +24,9 @@ struct Secretive: App { @SceneBuilder var body: some Scene { WindowGroup { - ContentView(showingCreation: $showingCreation, runningSetup: $showingSetup, hasRunSetup: $hasRunSetup) + ContentView(showingCreation: $showingCreation, runningSetup: $showingSetup, hasRunSetup: $hasRunSetup) .environmentObject(storeList) - .environmentObject(Updater(checkOnLaunch: hasRunSetup)) + .environmentObject(UpdateChecker(checkOnLaunch: hasRunSetup)) .environmentObject(agentStatusChecker) .onAppear { updaterController.configure() diff --git a/Sources/Secretive/Controllers/UpdaterCommunicationController.swift b/Sources/Secretive/Controllers/UpdaterCommunicationController.swift index 2657e2b..883d4c4 100644 --- a/Sources/Secretive/Controllers/UpdaterCommunicationController.swift +++ b/Sources/Secretive/Controllers/UpdaterCommunicationController.swift @@ -3,7 +3,8 @@ import Combine import AppKit import OSLog import SecretKit -import SecretiveUpdater +//import SecretiveUpdater +import ServiceManagement class UpdaterCommunicationController: ObservableObject { @@ -16,7 +17,10 @@ class UpdaterCommunicationController: ObservableObject { func configure() { guard !running else { return } - connection = NSXPCConnection(serviceName: "com.maxgoedjen.SecretiveUpdater") + // TODO: Set disabled on launch. Only enable when I have an update to install. + let x = SMLoginItemSetEnabled("Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater" as CFString, false) + let y = SMLoginItemSetEnabled("Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater" as CFString, true) + connection = NSXPCConnection(machServiceName: "Z72PRUAWF6.com.maxgoedjen.SecretiveUpdater") connection?.remoteObjectInterface = NSXPCInterface(with: UpdaterProtocol.self) connection?.invalidationHandler = { Logger().warning("XPC connection invalidated") @@ -25,6 +29,9 @@ class UpdaterCommunicationController: ObservableObject { updater = connection?.remoteObjectProxyWithErrorHandler({ error in Logger().error("\(String(describing: error))") }) as? UpdaterProtocol + Task { + print(try await updater?.installUpdate(url: URL(string: "https://google.com")!)) + } running = true } diff --git a/Sources/Secretive/Preview Content/PreviewUpdater.swift b/Sources/Secretive/Preview Content/PreviewUpdater.swift index a993d87..8708cde 100644 --- a/Sources/Secretive/Preview Content/PreviewUpdater.swift +++ b/Sources/Secretive/Preview Content/PreviewUpdater.swift @@ -2,7 +2,7 @@ import Foundation import Combine import Brief -class PreviewUpdater: UpdaterProtocol { +class PreviewUpdater: UpdateCheckerProtocol { let update: Release? let testBuild = false diff --git a/Sources/Secretive/Secretive.entitlements b/Sources/Secretive/Secretive.entitlements index c1bb5e0..4778f7e 100644 --- a/Sources/Secretive/Secretive.entitlements +++ b/Sources/Secretive/Secretive.entitlements @@ -4,6 +4,10 @@ com.apple.security.app-sandbox + com.apple.security.application-groups + + $(TeamIdentifierPrefix)com.maxgoedjen.Secretive + com.apple.security.files.user-selected.read-write com.apple.security.network.client diff --git a/Sources/Secretive/Views/ContentView.swift b/Sources/Secretive/Views/ContentView.swift index c14e48e..5a65076 100644 --- a/Sources/Secretive/Views/ContentView.swift +++ b/Sources/Secretive/Views/ContentView.swift @@ -4,7 +4,7 @@ import SecureEnclaveSecretKit import SmartCardSecretKit import Brief -struct ContentView: View { +struct ContentView: View { @Binding var showingCreation: Bool @Binding var runningSetup: Bool diff --git a/Sources/Secretive/Views/UpdateView.swift b/Sources/Secretive/Views/UpdateView.swift index afe620e..55e2a16 100644 --- a/Sources/Secretive/Views/UpdateView.swift +++ b/Sources/Secretive/Views/UpdateView.swift @@ -1,7 +1,7 @@ import SwiftUI import Brief -struct UpdateDetailView: View { +struct UpdateDetailView: View { @EnvironmentObject var updater: UpdaterType diff --git a/Sources/SecretiveUpdater/AppDelegate.swift b/Sources/SecretiveUpdater/AppDelegate.swift new file mode 100644 index 0000000..ed2b424 --- /dev/null +++ b/Sources/SecretiveUpdater/AppDelegate.swift @@ -0,0 +1,43 @@ +import Cocoa + +@main +class AppDelegate: NSObject, NSApplicationDelegate { + + let delegate = ServiceDelegate(exportedObject: Updater()) + let listener = NSXPCListener(machServiceName: Bundle.main.bundleIdentifier!) + + func applicationDidFinishLaunching(_ aNotification: Notification) { + listener.delegate = delegate + listener.resume() + Task { + try! await delegate.exported.authorize() + } + } + + func applicationWillTerminate(_ aNotification: Notification) { + } + + func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return false + } + + +} + +class ServiceDelegate: NSObject, NSXPCListenerDelegate { + + let exported: UpdaterProtocol + + init(exportedObject: UpdaterProtocol) { + self.exported = exportedObject + } + + func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool { + newConnection.exportedInterface = NSXPCInterface(with: UpdaterProtocol.self) + newConnection.exportedObject = exported + newConnection.resume() + return true + } + +} + diff --git a/Sources/SecretiveUpdater/Assets.xcassets/AccentColor.colorset/Contents.json b/Sources/SecretiveUpdater/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/Sources/SecretiveUpdater/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Sources/SecretiveUpdater/Assets.xcassets/AppIcon.appiconset/Contents.json b/Sources/SecretiveUpdater/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..c14ca73 --- /dev/null +++ b/Sources/SecretiveUpdater/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,60 @@ +{ + "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" + }, + { + "filename" : "Mac Icon.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : "Mac Icon@0.25x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Sources/SecretiveUpdater/Assets.xcassets/AppIcon.appiconset/Mac Icon.png b/Sources/SecretiveUpdater/Assets.xcassets/AppIcon.appiconset/Mac Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..99a172b16255d13d16560c128e84dcbd9fa8356e GIT binary patch literal 15975 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 literal 0 HcmV?d00001 diff --git a/Sources/SecretiveUpdater/Assets.xcassets/Contents.json b/Sources/SecretiveUpdater/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Sources/SecretiveUpdater/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Sources/SecretiveUpdater/Info.plist b/Sources/SecretiveUpdater/Info.plist index c123a5d..dada86e 100644 --- a/Sources/SecretiveUpdater/Info.plist +++ b/Sources/SecretiveUpdater/Info.plist @@ -2,10 +2,7 @@ - XPCService - - ServiceType - Application - + LSUIElement + diff --git a/Sources/SecretiveUpdater/Main.storyboard b/Sources/SecretiveUpdater/Main.storyboard new file mode 100644 index 0000000..a8531a8 --- /dev/null +++ b/Sources/SecretiveUpdater/Main.storyboard @@ -0,0 +1,683 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Sources/SecretiveUpdater/SecretiveUpdater.entitlements b/Sources/SecretiveUpdater/SecretiveUpdater.entitlements new file mode 100644 index 0000000..b87fc3a --- /dev/null +++ b/Sources/SecretiveUpdater/SecretiveUpdater.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + $(TeamIdentifierPrefix)com.maxgoedjen.Secretive + + + diff --git a/Sources/SecretiveUpdater/Updater.swift b/Sources/SecretiveUpdater/Updater.swift index 5002eea..d4cc72d 100644 --- a/Sources/SecretiveUpdater/Updater.swift +++ b/Sources/SecretiveUpdater/Updater.swift @@ -9,7 +9,7 @@ import Security.AuthorizationTags class Updater: UpdaterProtocol { func installUpdate(url: URL) async throws -> String { - try await authorize() +// try await authorize() // let (downloadedURL, _) = try await URLSession.shared.download(from: url) // let unzipped = try await decompress(url: downloadedURL) // let config = NSWorkspace.OpenConfiguration() diff --git a/Sources/SecretiveUpdater/UpdaterProtocol.swift b/Sources/SecretiveUpdater/UpdaterProtocol.swift index a432677..0961b4c 100644 --- a/Sources/SecretiveUpdater/UpdaterProtocol.swift +++ b/Sources/SecretiveUpdater/UpdaterProtocol.swift @@ -4,5 +4,6 @@ import Brief @objc public protocol UpdaterProtocol { func installUpdate(url: URL) async throws -> String + func authorize() async throws }