diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 0d9cd47e7cd..b59b2c560a6 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -1149,7 +1149,7 @@ jobs: - name: Set up provisioning profiles run: | - cp $HOME/secrets/bitwarden_desktop_autofill_app_store_2024.provisionprofile \ + cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile mkdir -p $HOME/Library/MobileDevice/Provisioning\ Profiles @@ -1243,7 +1243,7 @@ jobs: APP_STORE_CONNECT_AUTH_KEY_PATH: ~/private_keys/AuthKey_6TV9MKN3GP.p8 DEBUG: electron-osx-sign* CSC_FOR_PULL_REQUEST: true - run: npm run pack:mac:mas:with-extension + run: npm run pack:mac:mas - name: Upload .pkg artifact uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 @@ -1421,7 +1421,7 @@ jobs: - name: Set up provisioning profiles run: | - cp $HOME/secrets/bitwarden_desktop_autofill_app_store_2024.provisionprofile \ + cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile mkdir -p $HOME/Library/MobileDevice/Provisioning\ Profiles @@ -1517,7 +1517,7 @@ jobs: APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} APP_STORE_CONNECT_AUTH_KEY_PATH: ~/private_keys/AuthKey_6TV9MKN3GP.p8 DEBUG: electron-osx-sign* - run: npm run pack:mac:masdev:with-extension + run: npm run pack:mac:masdev - name: Zip masdev asset run: | diff --git a/apps/desktop/macos/Debug.xcconfig b/apps/desktop/macos/Debug.xcconfig new file mode 100644 index 00000000000..73d8cd871fb --- /dev/null +++ b/apps/desktop/macos/Debug.xcconfig @@ -0,0 +1,11 @@ +// +// Debug.xcconfig +// desktop +// +// Created by Nathan Ansel on 2/20/25. +// + +// Configuration settings file format documentation can be found at: +// https://help.apple.com/xcode/#/dev745c5c974 +CODE_SIGN_IDENTITY = Apple Development +PROVISIONING_PROFILE_SPECIFIER = Bitwarden Desktop Autofill Development 2024 diff --git a/apps/desktop/macos/production.xcconfig b/apps/desktop/macos/ReleaseAppStore.xcconfig similarity index 91% rename from apps/desktop/macos/production.xcconfig rename to apps/desktop/macos/ReleaseAppStore.xcconfig index 98b9d4335ea..2b891bbfc81 100644 --- a/apps/desktop/macos/production.xcconfig +++ b/apps/desktop/macos/ReleaseAppStore.xcconfig @@ -1,5 +1,5 @@ // -// Production.xcconfig +// ReleaseAppStore.xcconfig // desktop // // Created by Vince Grassia on 7/25/24. diff --git a/apps/desktop/macos/ReleaseDeveloper.xcconfig b/apps/desktop/macos/ReleaseDeveloper.xcconfig new file mode 100644 index 00000000000..2ac1df43021 --- /dev/null +++ b/apps/desktop/macos/ReleaseDeveloper.xcconfig @@ -0,0 +1,11 @@ +// +// ReleaseDeveloper.xcconfig +// desktop +// +// Created by Nathan Ansel on 2/20/25. +// + +// Configuration settings file format documentation can be found at: +// https://help.apple.com/xcode/#/dev745c5c974 +CODE_SIGN_IDENTITY = Developer ID Application +PROVISIONING_PROFILE_SPECIFIER = Bitwarden Desktop Autofill Developer 2024 diff --git a/apps/desktop/macos/desktop.xcodeproj/project.pbxproj b/apps/desktop/macos/desktop.xcodeproj/project.pbxproj index 355e484187e..4daf572e1ae 100644 --- a/apps/desktop/macos/desktop.xcodeproj/project.pbxproj +++ b/apps/desktop/macos/desktop.xcodeproj/project.pbxproj @@ -17,7 +17,9 @@ /* Begin PBXFileReference section */ 3368DB382C654B8100896B75 /* BitwardenMacosProviderFFI.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BitwardenMacosProviderFFI.xcframework; path = ../desktop_native/macos_provider/BitwardenMacosProviderFFI.xcframework; sourceTree = ""; }; 3368DB3A2C654F3800896B75 /* BitwardenMacosProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BitwardenMacosProvider.swift; sourceTree = ""; }; - 968ED08A2C52A47200FFFEE6 /* Production.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Production.xcconfig; sourceTree = ""; }; + 968ED08A2C52A47200FFFEE6 /* ReleaseAppStore.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ReleaseAppStore.xcconfig; sourceTree = ""; }; + D83832AB2D67B9AE003FB9F8 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + D83832AD2D67B9D0003FB9F8 /* ReleaseDeveloper.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ReleaseDeveloper.xcconfig; sourceTree = ""; }; E1DF713C2B342F6900F29026 /* autofill-extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "autofill-extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; E1DF713E2B342F6900F29026 /* AuthenticationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AuthenticationServices.framework; path = System/Library/Frameworks/AuthenticationServices.framework; sourceTree = SDKROOT; }; E1DF71412B342F6900F29026 /* CredentialProviderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialProviderViewController.swift; sourceTree = ""; }; @@ -42,7 +44,9 @@ E1DF711D2B342E2800F29026 = { isa = PBXGroup; children = ( - 968ED08A2C52A47200FFFEE6 /* Production.xcconfig */, + D83832AB2D67B9AE003FB9F8 /* Debug.xcconfig */, + 968ED08A2C52A47200FFFEE6 /* ReleaseAppStore.xcconfig */, + D83832AD2D67B9D0003FB9F8 /* ReleaseDeveloper.xcconfig */, E1DF71402B342F6900F29026 /* autofill-extension */, E1DF713D2B342F6900F29026 /* Frameworks */, E1DF71272B342E2800F29026 /* Products */, @@ -166,8 +170,96 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + D83832AE2D67BA84003FB9F8 /* ReleaseDeveloper */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D83832AD2D67B9D0003FB9F8 /* ReleaseDeveloper.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + 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; + CODE_SIGN_ENTITLEMENTS = "autofill-extension/autofill_extension.entitlements"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 14.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = ReleaseDeveloper; + }; + D83832AF2D67BA84003FB9F8 /* ReleaseDeveloper */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = "autofill-extension/autofill_extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=macosx*]" = LTZ2PFU5D6; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "autofill-extension/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = Bitwarden; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.bitwarden.desktop.autofill-extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Bitwarden Desktop Autofill App Store 2024"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = ReleaseDeveloper; + }; E1DF71332B342E2900F29026 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = D83832AB2D67B9AE003FB9F8 /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -223,15 +315,16 @@ MACOSX_DEPLOYMENT_TARGET = 14.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; + ONLY_ACTIVE_ARCH = NO; SDKROOT = macosx; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; - E1DF71342B342E2900F29026 /* Release */ = { + E1DF71342B342E2900F29026 /* ReleaseAppStore */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 968ED08A2C52A47200FFFEE6 /* ReleaseAppStore.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -284,7 +377,7 @@ SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; }; - name = Release; + name = ReleaseAppStore; }; E1DF714C2B342F6900F29026 /* Debug */ = { isa = XCBuildConfiguration; @@ -316,7 +409,7 @@ }; name = Debug; }; - E1DF714D2B342F6900F29026 /* Release */ = { + E1DF714D2B342F6900F29026 /* ReleaseAppStore */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = "autofill-extension/autofill_extension.entitlements"; @@ -344,7 +437,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; }; - name = Release; + name = ReleaseAppStore; }; /* End XCBuildConfiguration section */ @@ -353,19 +446,21 @@ isa = XCConfigurationList; buildConfigurations = ( E1DF71332B342E2900F29026 /* Debug */, - E1DF71342B342E2900F29026 /* Release */, + E1DF71342B342E2900F29026 /* ReleaseAppStore */, + D83832AE2D67BA84003FB9F8 /* ReleaseDeveloper */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; + defaultConfigurationName = ReleaseAppStore; }; E1DF714E2B342F6900F29026 /* Build configuration list for PBXNativeTarget "autofill-extension" */ = { isa = XCConfigurationList; buildConfigurations = ( E1DF714C2B342F6900F29026 /* Debug */, - E1DF714D2B342F6900F29026 /* Release */, + E1DF714D2B342F6900F29026 /* ReleaseAppStore */, + D83832AF2D67BA84003FB9F8 /* ReleaseDeveloper */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; + defaultConfigurationName = ReleaseAppStore; }; /* End XCConfigurationList section */ }; diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 4c609af1691..cd298b46635 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -23,7 +23,6 @@ "build:dev": "concurrently -n Main,Rend -c yellow,cyan \"npm run build:main:dev\" \"npm run build:renderer:dev\"", "build:preload": "cross-env NODE_ENV=production webpack --config webpack.preload.js", "build:preload:watch": "cross-env NODE_ENV=production webpack --config webpack.preload.js --watch", - "build:macos-extension": "./desktop_native/macos_provider/build.sh && node scripts/build-macos-extension.js", "build:main": "cross-env NODE_ENV=production webpack --config webpack.main.js", "build:main:dev": "npm run build-native && cross-env NODE_ENV=development webpack --config webpack.main.js", "build:main:watch": "npm run build-native && cross-env NODE_ENV=development webpack --config webpack.main.js --watch", @@ -39,18 +38,14 @@ "pack:mac": "npm run clean:dist && electron-builder --mac --universal -p never", "pack:mac:arm64": "npm run clean:dist && electron-builder --mac --arm64 -p never", "pack:mac:mas": "npm run clean:dist && electron-builder --mac mas --universal -p never", - "pack:mac:mas:with-extension": "npm run clean:dist && npm run build:macos-extension && electron-builder --mac mas --universal -p never", "pack:mac:masdev": "npm run clean:dist && electron-builder --mac mas-dev --universal -p never", - "pack:mac:masdev:with-extension": "npm run clean:dist && npm run build:macos-extension && electron-builder --mac mas-dev --universal -p never", "pack:win": "npm run clean:dist && electron-builder --win --x64 --arm64 --ia32 -p never -c.win.certificateSubjectName=\"8bit Solutions LLC\"", "pack:win:ci": "npm run clean:dist && electron-builder --win --x64 --arm64 --ia32 -p never", "dist:dir": "npm run build && npm run pack:dir", "dist:lin": "npm run build && npm run pack:lin", "dist:mac": "npm run build && npm run pack:mac", "dist:mac:mas": "npm run build && npm run pack:mac:mas", - "dist:mac:mas:with-extension": "npm run build && npm run pack:mac:mas:with-extension", "dist:mac:masdev": "npm run build && npm run pack:mac:masdev", - "dist:mac:masdev:with-extension": "npm run build && npm run pack:mac:masdev:with-extension", "dist:win": "npm run build && npm run pack:win", "dist:win:ci": "npm run build && npm run pack:win:ci", "publish:lin": "npm run build && npm run clean:dist && electron-builder --linux --x64 -p always", diff --git a/apps/desktop/scripts/after-sign.js b/apps/desktop/scripts/after-sign.js index 20c24c8a76b..1763a09001e 100644 --- a/apps/desktop/scripts/after-sign.js +++ b/apps/desktop/scripts/after-sign.js @@ -5,6 +5,7 @@ const path = require("path"); const { notarize } = require("@electron/notarize"); const { deepAssign } = require("builder-util"); const fse = require("fs-extra"); +const buildExtension = require('./build-macos-extension.js'); exports.default = run; @@ -16,12 +17,19 @@ async function run(context) { const appPath = `${context.appOutDir}/${appName}.app`; const macBuild = context.electronPlatformName === "darwin"; const copySafariExtension = ["darwin", "mas"].includes(context.electronPlatformName); - const copyAutofillExtension = ["mas"].includes(context.electronPlatformName); + const copyAutofillExtension = ["darwin", "mas"].includes(context.electronPlatformName); + const isTempBuild = context.appOutDir.includes("temp"); let shouldResign = false; // cannot use extraFiles because it modifies the extensions .plist and makes it invalid if (copyAutofillExtension) { + if (!isTempBuild) { + await buildExtension.default(context); + } else { + console.log("### Packing in a temporary build location - skipping autofill extension build"); + } + console.log("### Copying autofill extension"); const extensionPath = path.join(__dirname, "../macos/dist/autofill-extension.appex"); if (!fse.existsSync(extensionPath)) { diff --git a/apps/desktop/scripts/build-macos-extension.js b/apps/desktop/scripts/build-macos-extension.js index a971517fb48..f5331804a18 100644 --- a/apps/desktop/scripts/build-macos-extension.js +++ b/apps/desktop/scripts/build-macos-extension.js @@ -10,10 +10,13 @@ const paths = { extensionDistDir: "./macos/dist", extensionDist: "./macos/dist/autofill-extension.appex", macOsProject: "./macos/desktop.xcodeproj", - macOsConfig: "./macos/production.xcconfig", }; -async function buildMacOs() { +exports.default = buildMacOs; + +async function buildMacOs(context) { + console.log("### Building Autofill Extension"); + if (fse.existsSync(paths.macosBuild)) { fse.removeSync(paths.macosBuild); } @@ -22,15 +25,35 @@ async function buildMacOs() { fse.removeSync(paths.extensionDistDir); } + let configuration; + if (context !== undefined) { + // Extract the first target name (assuming there's at least one target) + const appOutDir = context.appOutDir; + + if (appOutDir.includes("mas-dev")) { + configuration = "Debug"; + } else if (appOutDir.includes("mas")) { + configuration = "ReleaseAppStore"; + } else if (appOutDir.includes("mac")) { + configuration = "ReleaseDeveloper"; + } else { + console.log("########## UNABLE TO DETERMINE CONFIGURATION ##########"); + console.log("########## Skipping Autofill Extension Build ##########"); + return; + } + } else { + console.log("### No context found, defaulting to the Debug configuration"); + configuration = "Debug"; + } + const proc = child.spawn("xcodebuild", [ "-project", paths.macOsProject, "-alltargets", "-configuration", - "Release", - // Uncomment when signing is fixed - "-xcconfig", - paths.macOsConfig, + configuration, + "CODE_SIGN_INJECT_BASE_ENTITLEMENTS=NO", + "OTHER_CODE_SIGN_FLAGS='--timestamp'" ]); stdOutProc(proc); await new Promise((resolve, reject) =>