From 2978bbeda794bdfc826e3666f1789e07de8abb9b Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Tue, 1 Apr 2025 17:02:33 -0400 Subject: [PATCH] Fix macOS secure storage by migrating to a .dylib instead of a .bundle as these don't require signing --- .../MostRecentPackage.unitypackage.meta | 7 -- .../Plugins/MacOS/KeychainAccess.bundle.meta | 82 ------------- .../MacOS/KeychainAccess.bundle/Contents.meta | 8 -- .../KeychainAccess.bundle/Contents/Info.plist | 46 ------- .../Contents/Info.plist.meta | 7 -- .../KeychainAccess.bundle/Contents/MacOS.meta | 8 -- .../Contents/MacOS/KeychainAccess.meta | 7 -- .../Contents/_CodeSignature.meta | 8 -- .../Contents/_CodeSignature/CodeResources | 115 ------------------ .../_CodeSignature/CodeResources.meta | 7 -- .../Plugins/MacOS/KeychainAccess.mm | 16 +-- .../Plugins/MacOS/KeychainAccess.mm.meta | 4 +- ...KeychainAccess => libKeychainAccess.dylib} | Bin 71984 -> 84968 bytes .../MacOS/libKeychainAccess.dylib.meta | 33 +++++ Packages/Sequence-Unity/package.json | 2 +- 15 files changed, 40 insertions(+), 310 deletions(-) delete mode 100644 Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta delete mode 100644 Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle.meta delete mode 100644 Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents.meta delete mode 100644 Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/Info.plist delete mode 100644 Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/Info.plist.meta delete mode 100644 Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/MacOS.meta delete mode 100644 Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/MacOS/KeychainAccess.meta delete mode 100644 Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature.meta delete mode 100644 Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature/CodeResources delete mode 100644 Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature/CodeResources.meta rename Packages/Sequence-Unity/Plugins/MacOS/{KeychainAccess.bundle/Contents/MacOS/KeychainAccess => libKeychainAccess.dylib} (66%) create mode 100644 Packages/Sequence-Unity/Plugins/MacOS/libKeychainAccess.dylib.meta diff --git a/Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta b/Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta deleted file mode 100644 index c0cdc5250..000000000 --- a/Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: aa66cce13570c4036afe2e85742962d9 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle.meta b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle.meta deleted file mode 100644 index 2f0fd945a..000000000 --- a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle.meta +++ /dev/null @@ -1,82 +0,0 @@ -fileFormatVersion: 2 -guid: 8fecd8d0233ec416caeb7754ad3a2eec -folderAsset: yes -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - : Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 0 - Exclude Linux64: 1 - Exclude OSXUniversal: 0 - Exclude WebGL: 1 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 1 - - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 1 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: OSXUniversal - second: - enabled: 1 - settings: - CPU: AnyCPU - - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: x86 - - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: x86_64 - - first: - iPhone: iOS - second: - enabled: 0 - settings: - AddToEmbeddedBinaries: false - CPU: AnyCPU - CompileFlags: - FrameworkDependencies: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents.meta b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents.meta deleted file mode 100644 index 6ab1af452..000000000 --- a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 62aa190f668b845ef8eb1d676217dbe0 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/Info.plist b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/Info.plist deleted file mode 100644 index 2177211ae..000000000 --- a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/Info.plist +++ /dev/null @@ -1,46 +0,0 @@ - - - - - BuildMachineOSBuild - 23F79 - CFBundleDevelopmentRegion - en - CFBundleExecutable - KeychainAccess - CFBundleIdentifier - xyz.sequence.KeychainAccess - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - KeychainAccess - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSupportedPlatforms - - MacOSX - - CFBundleVersion - 1 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - - DTPlatformName - macosx - DTPlatformVersion - 14.5 - DTSDKBuild - 23F73 - DTSDKName - macosx14.5 - DTXcode - 1540 - DTXcodeBuild - 15F31d - LSMinimumSystemVersion - 10.13 - - diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/Info.plist.meta b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/Info.plist.meta deleted file mode 100644 index 4d98ffcd6..000000000 --- a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/Info.plist.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 49115d8936b8548908e702b2ed764545 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/MacOS.meta b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/MacOS.meta deleted file mode 100644 index 403d5c125..000000000 --- a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/MacOS.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 109421edebb754344af9cb095f3b49a6 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/MacOS/KeychainAccess.meta b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/MacOS/KeychainAccess.meta deleted file mode 100644 index a1cc6c848..000000000 --- a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/MacOS/KeychainAccess.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: f8e00604450094b46a30a18337f6d564 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature.meta b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature.meta deleted file mode 100644 index 360e572b0..000000000 --- a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: b14cb6be4826048babb733e2069d6977 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature/CodeResources b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature/CodeResources deleted file mode 100644 index d5d0fd744..000000000 --- a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature/CodeResources +++ /dev/null @@ -1,115 +0,0 @@ - - - - - files - - files2 - - rules - - ^Resources/ - - ^Resources/.*\.lproj/ - - optional - - weight - 1000 - - ^Resources/.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Resources/Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ - - nested - - weight - 10 - - ^.* - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^Resources/ - - weight - 20 - - ^Resources/.*\.lproj/ - - optional - - weight - 1000 - - ^Resources/.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Resources/Base\.lproj/ - - weight - 1010 - - ^[^/]+$ - - nested - - weight - 10 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature/CodeResources.meta b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature/CodeResources.meta deleted file mode 100644 index 092eef6c7..000000000 --- a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/_CodeSignature/CodeResources.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 800f28824150145d38b7477c74517f78 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.mm b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.mm index 07430283a..d2961c493 100644 --- a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.mm +++ b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.mm @@ -1,19 +1,11 @@ // // KeychainAccess.mm // -// Created by Quinn Purdy on 2024-06-18. +// Created by Quinn Purdy on 2024-06-18. Updated on 2025-04-01 by Quinn Purdy // -// To update the KeychainAccess.bundle, please perform the following (at time of writing on MacOS 14.5 with XCode 15.4): -// Create an XCode Bundle MacOS project File > New > Project ; macOS > Bundle -// Set bundle identifier and team name then click next and select a location -// Set deployment target to lowest possible version -// Add KeychainAccess.mm as a file -// Navigate to build phases -// Double check KeychainAccess.mm is added under Compile Sources (if not add it) -// Expand Link Binary with Libraries and add "Security.framework" -// Product > Build -// If successful, Product > Show Build Folder in Finder -// Replace the KeychainAccess.bundle with the newly build .bundle +// To update the libKeychainAccess.dylib, run the following command from the root of this directory: +// clang -arch x86_64 -arch arm64 -dynamiclib -framework Foundation -framework Security \ + -o libKeychainAccess.dylib KeychainAccess.mm #import #import diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.mm.meta b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.mm.meta index 63613c217..df68691ee 100644 --- a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.mm.meta +++ b/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.mm.meta @@ -7,7 +7,7 @@ PluginImporter: executionOrder: {} defineConstraints: [] isPreloaded: 0 - isOverridable: 0 + isOverridable: 1 isExplicitlyReferenced: 0 validateReferences: 1 platformData: @@ -48,7 +48,7 @@ PluginImporter: second: enabled: 0 settings: - CPU: AnyCPU + CPU: x86_64 - first: Standalone: OSXUniversal second: diff --git a/Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/MacOS/KeychainAccess b/Packages/Sequence-Unity/Plugins/MacOS/libKeychainAccess.dylib similarity index 66% rename from Packages/Sequence-Unity/Plugins/MacOS/KeychainAccess.bundle/Contents/MacOS/KeychainAccess rename to Packages/Sequence-Unity/Plugins/MacOS/libKeychainAccess.dylib index 1762f65e19b2345a0b247c28b99ce550b2e231b0..d72dc8079d0c50595bf345014ada871bc5a55235 100755 GIT binary patch literal 84968 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 Q`gr2qi@yEj7WDG}0l~YZ2><{9 literal 71984 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