diff --git a/.github/workflows/build_appstore.yml b/.github/workflows/build_appstore.yml index fe5fdb9add..de09277cb1 100644 --- a/.github/workflows/build_appstore.yml +++ b/.github/workflows/build_appstore.yml @@ -10,6 +10,7 @@ on: type: choice options: - testflight + - testflight_review - appstore asana-task-url: description: "Asana release task URL" diff --git a/.github/workflows/build_notarized.yml b/.github/workflows/build_notarized.yml index 99fd243a0a..4d2e597b7a 100644 --- a/.github/workflows/build_notarized.yml +++ b/.github/workflows/build_notarized.yml @@ -11,8 +11,6 @@ on: options: - review - release - - review-sandbox - - release-sandbox create-dmg: description: "Create DMG image" required: true diff --git a/Configuration/App/DBP/DuckDuckGoDBPAgentAppStore.xcconfig b/Configuration/App/DBP/DuckDuckGoDBPAgentAppStore.xcconfig index e9a31677df..86fbdf3ab6 100644 --- a/Configuration/App/DBP/DuckDuckGoDBPAgentAppStore.xcconfig +++ b/Configuration/App/DBP/DuckDuckGoDBPAgentAppStore.xcconfig @@ -22,7 +22,7 @@ PRODUCT_BUNDLE_IDENTIFIER[config=Debug][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_I PRODUCT_BUNDLE_IDENTIFIER[config=CI][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID) PRODUCT_BUNDLE_IDENTIFIER[config=Review][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID) -INFOPLIST_FILE = DuckDuckGoDBPBackgroundAgent/Info.plist +INFOPLIST_FILE = DuckDuckGoDBPBackgroundAgent/Info-AppStore.plist GENERATE_INFOPLIST_FILE = YES INFOPLIST_KEY_LSUIElement = YES INFOPLIST_KEY_NSPrincipalClass = Application @@ -31,20 +31,22 @@ INFOPLIST_KEY_NSPrincipalClass = Application //CODE_SIGN_STYLE[config=Debug][sdk=*] = Manual //CODE_SIGN_STYLE[config=Release][sdk=*] = Manual -CODE_SIGN_ENTITLEMENTS[config=Review][sdk=macosx*] = DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgent.entitlements -CODE_SIGN_ENTITLEMENTS[config=CI][sdk=macosx*] = DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgent.entitlements -CODE_SIGN_ENTITLEMENTS[config=Debug][sdk=macosx*] = DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgent.entitlements -CODE_SIGN_ENTITLEMENTS[config=Release][sdk=macosx*] = DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgent.entitlements +CODE_SIGN_ENTITLEMENTS[config=Review][sdk=macosx*] = DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgentAppStore.entitlements +CODE_SIGN_ENTITLEMENTS[config=CI][sdk=macosx*] = DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgentAppStore.entitlements +CODE_SIGN_ENTITLEMENTS[config=Debug][sdk=macosx*] = DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgentAppStore.entitlements +CODE_SIGN_ENTITLEMENTS[config=Release][sdk=macosx*] = DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgentAppStore.entitlements -CODE_SIGN_IDENTITY[sdk=macosx*] = Developer ID Application +CODE_SIGN_IDENTITY[sdk=macosx*] = 3rd Party Mac Developer Application CODE_SIGN_IDENTITY[config=Debug][sdk=macosx*] = Apple Development CODE_SIGN_IDENTITY[config=CI][sdk=macosx*] = +PRODUCT_NAME_PREFIX = $(DBP_BACKGROUND_AGENT_PRODUCT_NAME) PRODUCT_NAME = $(DBP_BACKGROUND_AGENT_PRODUCT_NAME) +PRODUCT_NAME[config=Release][arch=*][sdk=*] = $(DBP_BACKGROUND_AGENT_RELEASE_PRODUCT_NAME) PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*] = -PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = macOS DBP Agent - Review -PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = macOS DBP Agent - Release +PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.DBP.backgroundAgent.review macos +PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.DBP.backgroundAgent macos FEATURE_FLAGS = FEEDBACK DBP NETWORK_PROTECTION diff --git a/Configuration/App/DuckDuckGoAppStore.xcconfig b/Configuration/App/DuckDuckGoAppStore.xcconfig index fbe23b7460..d7baac19fb 100644 --- a/Configuration/App/DuckDuckGoAppStore.xcconfig +++ b/Configuration/App/DuckDuckGoAppStore.xcconfig @@ -17,10 +17,10 @@ #include "../AppStore.xcconfig" #include "ManualAppStoreRelease.xcconfig" -AGENT_BUNDLE_ID[sdk=*] = $(DEVELOPMENT_TEAM).com.duckduckgo.macos.browser.network-protection.agent -AGENT_BUNDLE_ID[config=Debug][sdk=*] = $(DEVELOPMENT_TEAM).com.duckduckgo.macos.browser.network-protection.agent.debug -AGENT_BUNDLE_ID[config=CI][sdk=*] = $(DEVELOPMENT_TEAM).com.duckduckgo.macos.browser.network-protection.agent.debug -AGENT_BUNDLE_ID[config=Review][sdk=*] = $(DEVELOPMENT_TEAM).com.duckduckgo.macos.browser.network-protection.agent.review +AGENT_BUNDLE_ID[sdk=*] = com.duckduckgo.mobile.ios.vpn.agent +AGENT_BUNDLE_ID[config=Debug][sdk=*] = com.duckduckgo.mobile.ios.vpn.agent.debug +AGENT_BUNDLE_ID[config=CI][sdk=*] = com.duckduckgo.mobile.ios.vpn.agent.debug +AGENT_BUNDLE_ID[config=Review][sdk=*] = com.duckduckgo.mobile.ios.vpn.agent.review PRODUCT_BUNDLE_IDENTIFIER = $(MAIN_BUNDLE_IDENTIFIER) @@ -28,7 +28,6 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAppStore.entitlements CODE_SIGN_ENTITLEMENTS[config=CI][arch=*][sdk=*] = DuckDuckGo/DuckDuckGoAppStoreCI.entitlements CODE_SIGN_IDENTITY[sdk=macosx*] = 3rd Party Mac Developer Application -CODE_SIGN_IDENTITY[config=Review][sdk=macosx*] = Developer ID Application CODE_SIGN_IDENTITY[config=Debug][sdk=macosx*] = Apple Development CODE_SIGN_IDENTITY[config=CI][sdk=macosx*] = @@ -43,6 +42,6 @@ PRODUCT_NAME[config=Release][arch=*][sdk=*] = $(RELEASE_PRODUCT_NAME_OVERRIDE:de PROVISIONING_PROFILE_SPECIFIER[config=Debug][sdk=macosx*] = PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios macos -PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = Sandbox MacOS Browser Product Review +PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.review macos #include? "../../LocalOverridesAppStore.xcconfig" diff --git a/Configuration/App/NetworkProtection/DuckDuckGoVPNAppStore.xcconfig b/Configuration/App/NetworkProtection/DuckDuckGoVPNAppStore.xcconfig index 6bbaffcaf7..e6f706c3af 100644 --- a/Configuration/App/NetworkProtection/DuckDuckGoVPNAppStore.xcconfig +++ b/Configuration/App/NetworkProtection/DuckDuckGoVPNAppStore.xcconfig @@ -16,13 +16,11 @@ #include "../AppTargetsBase.xcconfig" #include "../../AppStore.xcconfig" -BUNDLE_IDENTIFIER_PREFIX = HKE973VLUW.com.duckduckgo.macos.browser.network-protection.agent - // Override AppTargetsBase.xcconfig until we resolve bundle IDs. -PRODUCT_BUNDLE_IDENTIFIER[sdk=*] = $(BUNDLE_IDENTIFIER_PREFIX) -PRODUCT_BUNDLE_IDENTIFIER[config=Debug][sdk=*] = $(BUNDLE_IDENTIFIER_PREFIX).debug -PRODUCT_BUNDLE_IDENTIFIER[config=CI][sdk=*] = $(BUNDLE_IDENTIFIER_PREFIX).debug -PRODUCT_BUNDLE_IDENTIFIER[config=Review][sdk=*] = $(BUNDLE_IDENTIFIER_PREFIX).review +PRODUCT_BUNDLE_IDENTIFIER[sdk=*] = $(AGENT_BUNDLE_ID_BASE) +PRODUCT_BUNDLE_IDENTIFIER[config=Debug][sdk=*] = $(AGENT_BUNDLE_ID_BASE).debug +PRODUCT_BUNDLE_IDENTIFIER[config=CI][sdk=*] = $(AGENT_BUNDLE_ID_BASE).debug +PRODUCT_BUNDLE_IDENTIFIER[config=Review][sdk=*] = $(AGENT_BUNDLE_ID_BASE).review INFOPLIST_FILE = DuckDuckGoVPN/Info-AppStore.plist GENERATE_INFOPLIST_FILE = YES @@ -34,25 +32,27 @@ INFOPLIST_KEY_NSPrincipalClass = Application //CODE_SIGN_STYLE[config=Release][sdk=*] = Manual // Left empty intentionally as we currently only support debug and release builds -CODE_SIGN_ENTITLEMENTS[config=Review][sdk=macosx*] = CODE_SIGN_ENTITLEMENTS[config=CI][sdk=macosx*] = CODE_SIGN_ENTITLEMENTS[config=Debug][sdk=macosx*] = DuckDuckGoVPN/DuckDuckGoVPNAppStore.entitlements CODE_SIGN_ENTITLEMENTS[config=Release][sdk=macosx*] = DuckDuckGoVPN/DuckDuckGoVPNAppStore.entitlements +CODE_SIGN_ENTITLEMENTS[config=Review][sdk=macosx*] = DuckDuckGoVPN/DuckDuckGoVPNAppStore.entitlements CODE_SIGN_IDENTITY[sdk=macosx*] = 3rd Party Mac Developer Application -CODE_SIGN_IDENTITY[config=Review][sdk=macosx*] = Developer ID Application CODE_SIGN_IDENTITY[config=Debug][sdk=macosx*] = Apple Development CODE_SIGN_IDENTITY[config=CI][sdk=macosx*] = +PRODUCT_NAME_PREFIX = $(AGENT_PRODUCT_NAME) PRODUCT_NAME = $(AGENT_PRODUCT_NAME) +PRODUCT_NAME[config=Release][arch=*][sdk=*] = $(AGENT_RELEASE_PRODUCT_NAME) PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*] = -PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = Mac Browser NetP Developer ID Not. (Distribution) +PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.vpn.agent macos +PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.vpn.agent.review macos -FEATURE_FLAGS[arch=*][sdk=*] = -FEATURE_FLAGS[config=CI][arch=*][sdk=*] = -FEATURE_FLAGS[config=Debug][arch=*][sdk=*] = -FEATURE_FLAGS[config=Review][arch=*][sdk=*] = +FEATURE_FLAGS[arch=*][sdk=*] = NETWORK_PROTECTION +FEATURE_FLAGS[config=CI][arch=*][sdk=*] = NETWORK_PROTECTION +FEATURE_FLAGS[config=Debug][arch=*][sdk=*] = NETWORK_PROTECTION +FEATURE_FLAGS[config=Review][arch=*][sdk=*] = NETWORK_PROTECTION ENABLE_APP_SANDBOX = YES SWIFT_OBJC_BRIDGING_HEADER = diff --git a/Configuration/AppStore.xcconfig b/Configuration/AppStore.xcconfig index d309999bd3..af55b7fa5d 100644 --- a/Configuration/AppStore.xcconfig +++ b/Configuration/AppStore.xcconfig @@ -31,9 +31,9 @@ GCC_PREPROCESSOR_DEFINITIONS[config=Review][arch=*][sdk=*] = APPSTORE=1 REVIEW=1 MACOSX_DEPLOYMENT_TARGET = 12.3 SWIFT_ACTIVE_COMPILATION_CONDITIONS[arch=*][sdk=*] = APPSTORE $(FEATURE_FLAGS) -SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=CI][arch=*][sdk=*] = APPSTORE DEBUG CI $(FEATURE_FLAGS) -SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=Debug][arch=*][sdk=*] = APPSTORE DEBUG $(FEATURE_FLAGS) -SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=Review][arch=*][sdk=*] = APPSTORE REVIEW $(FEATURE_FLAGS) +SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=CI][arch=*][sdk=*] = APPSTORE DEBUG NETWORK_PROTECTION DBP CI $(FEATURE_FLAGS) +SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=Debug][arch=*][sdk=*] = APPSTORE DEBUG NETWORK_PROTECTION DBP $(FEATURE_FLAGS) +SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=Review][arch=*][sdk=*] = APPSTORE REVIEW NETWORK_PROTECTION DBP $(FEATURE_FLAGS) NETP_BASE_APP_GROUP = $(DEVELOPMENT_TEAM).com.duckduckgo.macos.browser.network-protection NETP_APP_GROUP[config=CI][sdk=macos*] = $(NETP_BASE_APP_GROUP).debug @@ -41,9 +41,49 @@ NETP_APP_GROUP[config=Review][sdk=macos*] = $(NETP_BASE_APP_GROUP).review NETP_APP_GROUP[config=Debug][sdk=macos*] = $(NETP_BASE_APP_GROUP).debug NETP_APP_GROUP[config=Release][sdk=macos*] = $(NETP_BASE_APP_GROUP) -AGENT_BUNDLE_ID[sdk=*] = HKE973VLUW.com.duckduckgo.macos.browser.network-protection.agent -AGENT_BUNDLE_ID[config=Debug][sdk=*] = HKE973VLUW.com.duckduckgo.macos.browser.network-protection.agent.debug -AGENT_BUNDLE_ID[config=CI][sdk=*] = HKE973VLUW.com.duckduckgo.macos.browser.network-protection.agent.debug -AGENT_BUNDLE_ID[config=Review][sdk=*] = HKE973VLUW.com.duckduckgo.macos.browser.network-protection.agent.review +AGENT_BUNDLE_ID_BASE[sdk=*] = com.duckduckgo.mobile.ios.vpn.agent +AGENT_BUNDLE_ID[sdk=*] = $(AGENT_BUNDLE_ID_BASE) +AGENT_BUNDLE_ID[config=Debug][sdk=*] = $(AGENT_BUNDLE_ID_BASE).debug +AGENT_BUNDLE_ID[config=CI][sdk=*] = $(AGENT_BUNDLE_ID_BASE).debug +AGENT_BUNDLE_ID[config=Review][sdk=*] = $(AGENT_BUNDLE_ID_BASE).review AGENT_PRODUCT_NAME = DuckDuckGo VPN App Store +AGENT_RELEASE_PRODUCT_NAME = DuckDuckGo VPN + +SYSEX_BUNDLE_ID[sdk=*] = com.duckduckgo.mobile.ios.vpn.agent +SYSEX_BUNDLE_ID[config=Debug][sdk=*] = com.duckduckgo.mobile.ios.vpn.agent.debug.network-protection-extension +SYSEX_BUNDLE_ID[config=CI][sdk=*] = com.duckduckgo.mobile.ios.vpn.agent.debug.network-protection-extension +SYSEX_BUNDLE_ID[config=Review][sdk=*] = com.duckduckgo.mobile.ios.vpn.agent.review.network-protection-extension +SYSEX_BUNDLE_ID[config=Release][sdk=*] = com.duckduckgo.mobile.ios.vpn.agent.network-protection-extension + +// Distributed Notifications Prefix + +SYSEX_BUNDLE_ID_BASE[sdk=*] = $(AGENT_BUNDLE_ID_BASE).network-extension +SYSEX_BUNDLE_ID_BASE[config=Debug][sdk=*] = $(AGENT_BUNDLE_ID_BASE).network-extension +SYSEX_BUNDLE_ID_BASE[config=CI][sdk=*] = $(AGENT_BUNDLE_ID_BASE).network-extension +SYSEX_BUNDLE_ID_BASE[config=Review][sdk=*] = $(AGENT_BUNDLE_ID_BASE).network-extension +SYSEX_BUNDLE_ID_BASE[config=Release][sdk=*] = $(AGENT_BUNDLE_ID_BASE).network-extension + +DISTRIBUTED_NOTIFICATIONS_PREFIX_BASE = $(SYSEX_BUNDLE_ID_BASE) + +DISTRIBUTED_NOTIFICATIONS_PREFIX[config=CI][sdk=*] = $(DISTRIBUTED_NOTIFICATIONS_PREFIX_BASE).ci +DISTRIBUTED_NOTIFICATIONS_PREFIX[config=Review][sdk=*] = $(DISTRIBUTED_NOTIFICATIONS_PREFIX_BASE).review +DISTRIBUTED_NOTIFICATIONS_PREFIX[config=Debug][sdk=*] = $(DISTRIBUTED_NOTIFICATIONS_PREFIX_BASE).debug +DISTRIBUTED_NOTIFICATIONS_PREFIX[config=Release][sdk=*] = $(DISTRIBUTED_NOTIFICATIONS_PREFIX_BASE) + +// DBP + +DBP_BACKGROUND_AGENT_PRODUCT_NAME = DuckDuckGo Personal Information Removal App Store +DBP_BACKGROUND_AGENT_RELEASE_PRODUCT_NAME = DuckDuckGo Personal Information Removal + +DBP_BACKGROUND_AGENT_BUNDLE_ID_BASE[sdk=*] = com.duckduckgo.mobile.ios.DBP.backgroundAgent +DBP_BACKGROUND_AGENT_BUNDLE_ID[sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID_BASE) +DBP_BACKGROUND_AGENT_BUNDLE_ID[config=Debug][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID_BASE).debug +DBP_BACKGROUND_AGENT_BUNDLE_ID[config=CI][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID_BASE).debug +DBP_BACKGROUND_AGENT_BUNDLE_ID[config=Review][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID_BASE).review + +DBP_BASE_APP_GROUP = $(DEVELOPMENT_TEAM).com.duckduckgo.macos.browser.appstore.dbp +DBP_APP_GROUP[config=CI][sdk=*] = $(DBP_BASE_APP_GROUP).debug +DBP_APP_GROUP[config=Review][sdk=*] = $(DBP_BASE_APP_GROUP).review +DBP_APP_GROUP[config=Debug][sdk=*] = $(DBP_BASE_APP_GROUP).debug +DBP_APP_GROUP[config=Release][sdk=*] = $(DBP_BASE_APP_GROUP) diff --git a/Configuration/DeveloperID.xcconfig b/Configuration/DeveloperID.xcconfig index ec99e58e5f..0bfb9bb8cb 100644 --- a/Configuration/DeveloperID.xcconfig +++ b/Configuration/DeveloperID.xcconfig @@ -59,21 +59,24 @@ NOTIFICATIONS_AGENT_PRODUCT_NAME = DuckDuckGo Notifications AGENT_BUNDLE_ID_BASE[sdk=*] = com.duckduckgo.macos.vpn -DBP_BASE_APP_GROUP = $(DEVELOPMENT_TEAM).com.duckduckgo.macos.browser.dbp -DBP_APP_GROUP[config=CI][sdk=*] = $(DBP_BASE_APP_GROUP).debug -DBP_APP_GROUP[config=Review][sdk=*] = $(DBP_BASE_APP_GROUP).review -DBP_APP_GROUP[config=Debug][sdk=*] = $(DBP_BASE_APP_GROUP).debug -DBP_APP_GROUP[config=Release][sdk=*] = $(DBP_BASE_APP_GROUP) - AGENT_BUNDLE_ID[sdk=*] = $(AGENT_BUNDLE_ID_BASE) AGENT_BUNDLE_ID[config=Debug][sdk=*] = $(AGENT_BUNDLE_ID_BASE).debug AGENT_BUNDLE_ID[config=CI][sdk=*] = $(AGENT_BUNDLE_ID_BASE).debug AGENT_BUNDLE_ID[config=Review][sdk=*] = $(AGENT_BUNDLE_ID_BASE).review AGENT_PRODUCT_NAME = DuckDuckGo VPN -DBP_BACKGROUND_AGENT_BUNDLE_ID[sdk=*] = com.duckduckgo.macos.DBP.backgroundAgent -DBP_BACKGROUND_AGENT_BUNDLE_ID[config=Debug][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID).debug -DBP_BACKGROUND_AGENT_BUNDLE_ID[config=CI][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID).debug -DBP_BACKGROUND_AGENT_BUNDLE_ID[config=Review][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID).review +// DBP DBP_BACKGROUND_AGENT_PRODUCT_NAME = DuckDuckGo Personal Information Removal + +DBP_BACKGROUND_AGENT_BUNDLE_ID_BASE[sdk=*] = com.duckduckgo.macos.DBP.backgroundAgent +DBP_BACKGROUND_AGENT_BUNDLE_ID[sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID_BASE) +DBP_BACKGROUND_AGENT_BUNDLE_ID[config=Debug][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID_BASE).debug +DBP_BACKGROUND_AGENT_BUNDLE_ID[config=CI][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID_BASE).debug +DBP_BACKGROUND_AGENT_BUNDLE_ID[config=Review][sdk=*] = $(DBP_BACKGROUND_AGENT_BUNDLE_ID_BASE).review + +DBP_BASE_APP_GROUP = $(DEVELOPMENT_TEAM).com.duckduckgo.macos.browser.dbp +DBP_APP_GROUP[config=CI][sdk=*] = $(DBP_BASE_APP_GROUP).debug +DBP_APP_GROUP[config=Review][sdk=*] = $(DBP_BASE_APP_GROUP).review +DBP_APP_GROUP[config=Debug][sdk=*] = $(DBP_BASE_APP_GROUP).debug +DBP_APP_GROUP[config=Release][sdk=*] = $(DBP_BASE_APP_GROUP) diff --git a/Configuration/Extensions/NetworkProtection/NetworkProtectionAppExtension.xcconfig b/Configuration/Extensions/NetworkProtection/NetworkProtectionAppExtension.xcconfig index 52e0e2aa00..60ad407569 100644 --- a/Configuration/Extensions/NetworkProtection/NetworkProtectionAppExtension.xcconfig +++ b/Configuration/Extensions/NetworkProtection/NetworkProtectionAppExtension.xcconfig @@ -17,7 +17,7 @@ // Since we're using nonstandard bundle IDs we'll just define them here, but we should consider // standardizing the bundle IDs so we can just define BUNDLE_IDENTIFIER_PREFIX -BUNDLE_IDENTIFIER_PREFIX = com.duckduckgo.mobile.ios +BUNDLE_IDENTIFIER_PREFIX = com.duckduckgo.mobile.ios.vpn.agent CODE_SIGN_ENTITLEMENTS[config=CI][sdk=macosx*] = CODE_SIGN_ENTITLEMENTS[config=Debug][sdk=macosx*] = DuckDuckGo/NetworkProtectionAppExtension.entitlements @@ -25,6 +25,10 @@ CODE_SIGN_ENTITLEMENTS[config=Release][sdk=macosx*] = DuckDuckGo/NetworkProtecti CODE_SIGN_ENTITLEMENTS[config=Review][sdk=macosx*] = DuckDuckGo/NetworkProtectionAppExtension.entitlements CODE_SIGN_STYLE[config=Debug][sdk=*] = Automatic +CODE_SIGN_IDENTITY[sdk=macosx*] = 3rd Party Mac Developer Application +CODE_SIGN_IDENTITY[config=Debug][sdk=macosx*] = Apple Development +CODE_SIGN_IDENTITY[config=CI][sdk=macosx*] = + GENERATE_INFOPLIST_FILE = YES INFOPLIST_FILE = NetworkProtectionAppExtension/Info.plist INFOPLIST_KEY_NSHumanReadableCopyright = Copyright © 2023 DuckDuckGo. All rights reserved. @@ -34,14 +38,45 @@ FEATURE_FLAGS[config=CI][arch=*][sdk=*] = NETWORK_EXTENSION NETWORK_PROTECTION FEATURE_FLAGS[config=Debug][arch=*][sdk=*] = NETWORK_EXTENSION NETWORK_PROTECTION FEATURE_FLAGS[config=Review][arch=*][sdk=*] = NETWORK_EXTENSION NETWORK_PROTECTION +NETP_BASE_APP_GROUP = $(DEVELOPMENT_TEAM).com.duckduckgo.macos.browser.network-protection +NETP_APP_GROUP[config=CI][sdk=macos*] = $(NETP_BASE_APP_GROUP).debug +NETP_APP_GROUP[config=Review][sdk=macos*] = $(NETP_BASE_APP_GROUP).review +NETP_APP_GROUP[config=Debug][sdk=macos*] = $(NETP_BASE_APP_GROUP).debug +NETP_APP_GROUP[config=Release][sdk=macos*] = $(NETP_BASE_APP_GROUP) + PRODUCT_BUNDLE_IDENTIFIER[sdk=*] = -PRODUCT_BUNDLE_IDENTIFIER[config=CI][sdk=*] = +PRODUCT_BUNDLE_IDENTIFIER[config=CI][sdk=*] = $(BUNDLE_IDENTIFIER_PREFIX).debug.network-protection-extension PRODUCT_BUNDLE_IDENTIFIER[config=Debug][sdk=*] = $(BUNDLE_IDENTIFIER_PREFIX).debug.network-protection-extension PRODUCT_BUNDLE_IDENTIFIER[config=Release][sdk=*] = $(BUNDLE_IDENTIFIER_PREFIX).network-protection-extension PRODUCT_BUNDLE_IDENTIFIER[config=Review][sdk=*] = $(BUNDLE_IDENTIFIER_PREFIX).review.network-protection-extension +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = +PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.vpn.agent.network-protection-extension macos +PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.vpn.agent.review.network-protection-extension macos + SDKROOT = macosx SKIP_INSTALL = YES SWIFT_EMIT_LOC_STRINGS = YES LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks @executable_path/../../../../Frameworks + +// Distributed Notifications: + +AGENT_BUNDLE_ID_BASE[sdk=*] = com.duckduckgo.mobile.ios.vpn.agent +AGENT_BUNDLE_ID[sdk=*] = $(AGENT_BUNDLE_ID_BASE) +AGENT_BUNDLE_ID[config=Debug][sdk=*] = $(AGENT_BUNDLE_ID_BASE).debug +AGENT_BUNDLE_ID[config=CI][sdk=*] = $(AGENT_BUNDLE_ID_BASE).debug +AGENT_BUNDLE_ID[config=Review][sdk=*] = $(AGENT_BUNDLE_ID_BASE).review + +SYSEX_BUNDLE_ID_BASE[sdk=*] = $(AGENT_BUNDLE_ID_BASE).network-extension +SYSEX_BUNDLE_ID_BASE[config=Debug][sdk=*] = $(AGENT_BUNDLE_ID_BASE).network-extension +SYSEX_BUNDLE_ID_BASE[config=CI][sdk=*] = $(AGENT_BUNDLE_ID_BASE).network-extension +SYSEX_BUNDLE_ID_BASE[config=Review][sdk=*] = $(AGENT_BUNDLE_ID_BASE).network-extension +SYSEX_BUNDLE_ID_BASE[config=Release][sdk=*] = $(AGENT_BUNDLE_ID_BASE).network-extension + +DISTRIBUTED_NOTIFICATIONS_PREFIX_BASE = $(SYSEX_BUNDLE_ID_BASE) + +DISTRIBUTED_NOTIFICATIONS_PREFIX[config=CI][sdk=*] = $(DISTRIBUTED_NOTIFICATIONS_PREFIX_BASE).ci +DISTRIBUTED_NOTIFICATIONS_PREFIX[config=Review][sdk=*] = $(DISTRIBUTED_NOTIFICATIONS_PREFIX_BASE).review +DISTRIBUTED_NOTIFICATIONS_PREFIX[config=Debug][sdk=*] = $(DISTRIBUTED_NOTIFICATIONS_PREFIX_BASE).debug +DISTRIBUTED_NOTIFICATIONS_PREFIX[config=Release][sdk=*] = $(DISTRIBUTED_NOTIFICATIONS_PREFIX_BASE) diff --git a/Configuration/Tests/IntegrationTests.xcconfig b/Configuration/Tests/IntegrationTests.xcconfig index 9816d83936..6100fbe474 100644 --- a/Configuration/Tests/IntegrationTests.xcconfig +++ b/Configuration/Tests/IntegrationTests.xcconfig @@ -17,7 +17,7 @@ MACOSX_DEPLOYMENT_TARGET = 11.4 -FEATURE_FLAGS = FEEDBACK NETWORK_PROTECTION +FEATURE_FLAGS = FEEDBACK NETWORK_PROTECTION DBP INFOPLIST_FILE = IntegrationTests/Info.plist PRODUCT_BUNDLE_IDENTIFIER = com.duckduckgo.Integration-Tests diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index a56184439d..015454bb89 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -90,6 +90,10 @@ 1E950E432912A10D0051A99B /* UserScript in Frameworks */ = {isa = PBXBuildFile; productRef = 1E950E422912A10D0051A99B /* UserScript */; }; 310E79BF294A19A8007C49E8 /* FireproofingReferenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310E79BE294A19A8007C49E8 /* FireproofingReferenceTests.swift */; }; 311B262728E73E0A00FD181A /* TabShadowConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311B262628E73E0A00FD181A /* TabShadowConfig.swift */; }; + 31267C692B640C4200FEF811 /* DataBrokerProtectionFeatureVisibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31C5FFB82AF64D120008A79F /* DataBrokerProtectionFeatureVisibility.swift */; }; + 31267C6A2B640C4B00FEF811 /* DataBrokerProtectionFeatureDisabler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3199C6F82AF94F5B002A7BA1 /* DataBrokerProtectionFeatureDisabler.swift */; }; + 31267C6B2B640C5200FEF811 /* DataBrokerProtectionAppEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3199C6FC2AF97367002A7BA1 /* DataBrokerProtectionAppEvents.swift */; }; + 3129788A2B64131200B67619 /* DataBrokerProtection in Frameworks */ = {isa = PBXBuildFile; productRef = 312978892B64131200B67619 /* DataBrokerProtection */; }; 3143C8792B0D1F3D00382627 /* DataBrokerProtection in Frameworks */ = {isa = PBXBuildFile; productRef = 3143C8782B0D1F3D00382627 /* DataBrokerProtection */; }; 3154FD1428E6011A00909769 /* TabShadowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3154FD1328E6011A00909769 /* TabShadowView.swift */; }; 3158B1472B0BF72E00AF130C /* DBPHomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3192EC872A4DCF21001E97A5 /* DBPHomeViewController.swift */; }; @@ -108,6 +112,8 @@ 3158B15B2B0BF76700AF130C /* DataBrokerProtectionFeatureDisabler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3199C6F82AF94F5B002A7BA1 /* DataBrokerProtectionFeatureDisabler.swift */; }; 3158B15C2B0BF76D00AF130C /* DataBrokerProtectionAppEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3199C6FC2AF97367002A7BA1 /* DataBrokerProtectionAppEvents.swift */; }; 3158B15E2B0BF76F00AF130C /* DataBrokerProtectionAppEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3199C6FC2AF97367002A7BA1 /* DataBrokerProtectionAppEvents.swift */; }; + 315A023D2B64216B00BFA577 /* IPCServiceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD01C182AD8319C0088B32E /* IPCServiceManager.swift */; }; + 315A023F2B6421AE00BFA577 /* Networking in Frameworks */ = {isa = PBXBuildFile; productRef = 315A023E2B6421AE00BFA577 /* Networking */; }; 315AA07028CA5CC800200030 /* YoutubePlayerNavigationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 315AA06F28CA5CC800200030 /* YoutubePlayerNavigationHandler.swift */; }; 3168506D2AF3AD1D009A2828 /* WaitlistViewControllerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3168506C2AF3AD1C009A2828 /* WaitlistViewControllerPresenter.swift */; }; 3168506E2AF3AD1D009A2828 /* WaitlistViewControllerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3168506C2AF3AD1C009A2828 /* WaitlistViewControllerPresenter.swift */; }; @@ -132,6 +138,11 @@ 31E163BA293A56F400963C10 /* BrokenSiteReportingReferenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31E163B9293A56F400963C10 /* BrokenSiteReportingReferenceTests.swift */; }; 31E163BD293A579E00963C10 /* PrivacyReferenceTestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31E163BC293A579E00963C10 /* PrivacyReferenceTestHelper.swift */; }; 31E163C0293A581900963C10 /* privacy-reference-tests in Resources */ = {isa = PBXBuildFile; fileRef = 31E163BF293A581900963C10 /* privacy-reference-tests */; }; + 31EF1E802B63FFA800E6DB17 /* DBPHomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3192EC872A4DCF21001E97A5 /* DBPHomeViewController.swift */; }; + 31EF1E812B63FFB800E6DB17 /* DataBrokerProtectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3139A1512AA4B3C000969C7D /* DataBrokerProtectionManager.swift */; }; + 31EF1E822B63FFC200E6DB17 /* DataBrokerProtectionLoginItemScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B6D98662ADEB4B000CD35FE /* DataBrokerProtectionLoginItemScheduler.swift */; }; + 31EF1E832B63FFCA00E6DB17 /* LoginItem+DataBrokerProtection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D8FA00B2AC5BDCE005DD0D0 /* LoginItem+DataBrokerProtection.swift */; }; + 31EF1E842B63FFD100E6DB17 /* DataBrokerProtectionDebugMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 316850712AF3AD58009A2828 /* DataBrokerProtectionDebugMenu.swift */; }; 31F28C4F28C8EEC500119F70 /* YoutubePlayerUserScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F28C4C28C8EEC500119F70 /* YoutubePlayerUserScript.swift */; }; 31F28C5128C8EEC500119F70 /* YoutubeOverlayUserScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F28C4E28C8EEC500119F70 /* YoutubeOverlayUserScript.swift */; }; 31F28C5328C8EECA00119F70 /* DuckURLSchemeHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F28C5228C8EECA00119F70 /* DuckURLSchemeHandler.swift */; }; @@ -1050,6 +1061,10 @@ 4B0BD7B72A9FE6E500EF609D /* NetworkProtectionOnboardingMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B05829D2A812AC000AC3F7C /* NetworkProtectionOnboardingMenu.swift */; }; 4B0BD7B82A9FE6E600EF609D /* NetworkProtectionOnboardingMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B05829D2A812AC000AC3F7C /* NetworkProtectionOnboardingMenu.swift */; }; 4B0DB5E528BD9D08007DD239 /* PinningManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B0DB5E428BD9D08007DD239 /* PinningManager.swift */; }; + 4B0EF7262B578095009D6481 /* AppVersionExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BA71ED92B4B81E80002EBCE /* AppVersionExtension.swift */; }; + 4B0EF7272B578096009D6481 /* AppVersionExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BA71ED92B4B81E80002EBCE /* AppVersionExtension.swift */; }; + 4B0EF7282B5780AB009D6481 /* AppVersionExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BA71ED92B4B81E80002EBCE /* AppVersionExtension.swift */; }; + 4B0EF7292B5780EB009D6481 /* VPNAppEventsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B8DB3192B504D7500EC16DA /* VPNAppEventsHandler.swift */; }; 4B11060525903E570039B979 /* CoreDataEncryptionTesting.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 4B11060325903E570039B979 /* CoreDataEncryptionTesting.xcdatamodeld */; }; 4B11060A25903EAC0039B979 /* CoreDataEncryptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B11060925903EAC0039B979 /* CoreDataEncryptionTests.swift */; }; 4B117F7D276C0CB5002F3D8C /* LocalStatisticsStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B117F7C276C0CB5002F3D8C /* LocalStatisticsStoreTests.swift */; }; @@ -2021,9 +2036,11 @@ 4BA1A6E6258C270800F6F690 /* EncryptionKeyGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BA1A6E5258C270800F6F690 /* EncryptionKeyGeneratorTests.swift */; }; 4BA1A6F6258C4F9600F6F690 /* EncryptionMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BA1A6F5258C4F9600F6F690 /* EncryptionMocks.swift */; }; 4BA1A6FE258C5C1300F6F690 /* EncryptedValueTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BA1A6FD258C5C1300F6F690 /* EncryptedValueTransformerTests.swift */; }; - 4BA71EDA2B4B81E80002EBCE /* AppVersionExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BA71ED92B4B81E80002EBCE /* AppVersionExtension.swift */; }; - 4BA71EDB2B4B81E80002EBCE /* AppVersionExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BA71ED92B4B81E80002EBCE /* AppVersionExtension.swift */; }; - 4BA71EDC2B4B81E80002EBCE /* AppVersionExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BA71ED92B4B81E80002EBCE /* AppVersionExtension.swift */; }; + 4BA7C4D92B3F61FB00AFE511 /* BundleExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6106B9D26A565DA0013B453 /* BundleExtension.swift */; }; + 4BA7C4DA2B3F639800AFE511 /* NetworkProtectionTunnelController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B8F52402A18326600BE7131 /* NetworkProtectionTunnelController.swift */; }; + 4BA7C4DB2B3F63AE00AFE511 /* NetworkExtensionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD1688D2AD4A4C400D24876 /* NetworkExtensionController.swift */; }; + 4BA7C4DD2B3F64E500AFE511 /* LoginItems in Frameworks */ = {isa = PBXBuildFile; productRef = 4BA7C4DC2B3F64E500AFE511 /* LoginItems */; }; + 4BA7C4E12B3F6F8600AFE511 /* NetworkProtectionAppExtension.appex in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4B4D603D2A0B290200BCD287 /* NetworkProtectionAppExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 4BB6CE5F26B77ED000EC5860 /* Cryptography.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB6CE5E26B77ED000EC5860 /* Cryptography.swift */; }; 4BB88B4525B7B55C006F6B06 /* DebugUserScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB88B4425B7B55C006F6B06 /* DebugUserScript.swift */; }; 4BB88B4A25B7B690006F6B06 /* SequenceExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB88B4925B7B690006F6B06 /* SequenceExtensions.swift */; }; @@ -2101,6 +2118,17 @@ 4BF4EA5027C71F26004E57C4 /* PasswordManagementListSectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BF4EA4F27C71F26004E57C4 /* PasswordManagementListSectionTests.swift */; }; 4BF6961D28BE911100D402D4 /* RecentlyVisitedSiteModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BF6961C28BE911100D402D4 /* RecentlyVisitedSiteModelTests.swift */; }; 4BF6962028BEEE8B00D402D4 /* LocalPinningManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BF6961F28BEEE8B00D402D4 /* LocalPinningManagerTests.swift */; }; + 4BF97AD12B43C43F00EB4240 /* NetworkProtectionIPC in Frameworks */ = {isa = PBXBuildFile; productRef = 4BF97AD02B43C43F00EB4240 /* NetworkProtectionIPC */; }; + 4BF97AD32B43C43F00EB4240 /* NetworkProtectionUI in Frameworks */ = {isa = PBXBuildFile; productRef = 4BF97AD22B43C43F00EB4240 /* NetworkProtectionUI */; }; + 4BF97AD52B43C43F00EB4240 /* NetworkProtection in Frameworks */ = {isa = PBXBuildFile; productRef = 4BF97AD42B43C43F00EB4240 /* NetworkProtection */; }; + 4BF97AD62B43C45800EB4240 /* NetworkProtectionNavBarPopoverManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3618C12ADE75C8000D6154 /* NetworkProtectionNavBarPopoverManager.swift */; }; + 4BF97AD72B43C53D00EB4240 /* NetworkProtectionIPCTunnelController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA7CC4D2AD11F6F0042E5CE /* NetworkProtectionIPCTunnelController.swift */; }; + 4BF97AD82B43C5B300EB4240 /* NetworkProtectionAppEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B2DDCF72A93A8BB0039D884 /* NetworkProtectionAppEvents.swift */; }; + 4BF97AD92B43C5C000EB4240 /* NetworkProtectionBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B4D605E2A0B29FA00BCD287 /* NetworkProtectionBundle.swift */; }; + 4BF97ADA2B43C5DC00EB4240 /* VPNFeedbackCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B0526632B1D55D80054955A /* VPNFeedbackCategory.swift */; }; + 4BF97ADB2B43C5E000EB4240 /* VPNMetadataCollector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B05265D2B1AE5C70054955A /* VPNMetadataCollector.swift */; }; + 4BF97ADC2B43C5E200EB4240 /* VPNFeedbackSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B0526602B1D55320054955A /* VPNFeedbackSender.swift */; }; + 4BF97ADD2B43C5FC00EB4240 /* KeychainType+ClientDefault.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD3AF5C2A8E7AF1006F9F56 /* KeychainType+ClientDefault.swift */; }; 5601FECD29B7973D00068905 /* TabBarViewItemTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5601FECC29B7973D00068905 /* TabBarViewItemTests.swift */; }; 5603D90629B7B746007F9F01 /* MockTabViewItemDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5603D90529B7B746007F9F01 /* MockTabViewItemDelegate.swift */; }; 5603D90729B7B746007F9F01 /* MockTabViewItemDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5603D90529B7B746007F9F01 /* MockTabViewItemDelegate.swift */; }; @@ -2348,7 +2376,6 @@ 9D9AE92A2AAA43EB0026E7DC /* DataBrokerProtectionBackgroundManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D9AE9282AAA43EB0026E7DC /* DataBrokerProtectionBackgroundManager.swift */; }; 9D9AE92C2AAB84FF0026E7DC /* DBPMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D9AE92B2AAB84FF0026E7DC /* DBPMocks.swift */; }; 9D9AE92D2AAB84FF0026E7DC /* DBPMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D9AE92B2AAB84FF0026E7DC /* DBPMocks.swift */; }; - 9D9AE9312AAB8A9E0026E7DC /* BrowserServicesKit in Frameworks */ = {isa = PBXBuildFile; productRef = 9D9AE9302AAB8A9E0026E7DC /* BrowserServicesKit */; }; 9DB6E7242AA0DC5800A17F3C /* LoginItems in Frameworks */ = {isa = PBXBuildFile; productRef = 9DB6E7232AA0DC5800A17F3C /* LoginItems */; }; 9DC70B1A2AA1FA5B005A844B /* LoginItems in Frameworks */ = {isa = PBXBuildFile; productRef = 9DC70B192AA1FA5B005A844B /* LoginItems */; }; 9DEF97E12B06C4EE00764F03 /* Networking in Frameworks */ = {isa = PBXBuildFile; productRef = 9DEF97E02B06C4EE00764F03 /* Networking */; }; @@ -3101,6 +3128,27 @@ remoteGlobalIDString = AA585D7D248FD31100E9A3E2; remoteInfo = "DuckDuckGo Privacy Browser"; }; + 4BA7C4DE2B3F6F4900AFE511 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = AA585D76248FD31100E9A3E2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4B4D603C2A0B290200BCD287; + remoteInfo = NetworkProtectionAppExtension; + }; + 4BBA2D282B6ACD4D00F6A470 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = AA585D76248FD31100E9A3E2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4B2D06682A13318400DE1F49; + remoteInfo = DuckDuckGoVPNAppStore; + }; + 4BBA2D2A2B6AD01E00F6A470 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = AA585D76248FD31100E9A3E2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9D9AE8D32AAA39D30026E7DC; + remoteInfo = DuckDuckGoDBPBackgroundAgentAppStore; + }; 7B4CE8DF26F02108009134B1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = AA585D76248FD31100E9A3E2 /* Project object */; @@ -3165,6 +3213,16 @@ name = "Embed Login Items"; runOnlyForDeploymentPostprocessing = 0; }; + 4BA7C4E02B3F6F7500AFE511 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 4BA7C4E12B3F6F8600AFE511 /* NetworkProtectionAppExtension.appex in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; B6EC37E629B5DA2A001ACE79 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -3824,7 +3882,7 @@ 9D9AE8682AA76CDC0026E7DC /* LoginItem+NetworkProtection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LoginItem+NetworkProtection.swift"; sourceTree = ""; }; 9D9AE86A2AA76CF90026E7DC /* LoginItemsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginItemsManager.swift; sourceTree = ""; }; 9D9AE8D12AAA39A70026E7DC /* DuckDuckGo Personal Information Removal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DuckDuckGo Personal Information Removal.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 9D9AE8F22AAA39D30026E7DC /* .app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = .app; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D9AE8F22AAA39D30026E7DC /* DuckDuckGo Personal Information Removal App Store.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DuckDuckGo Personal Information Removal App Store.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 9D9AE9142AAA3B450026E7DC /* Info-AppStore.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-AppStore.plist"; sourceTree = ""; }; 9D9AE9152AAA3B450026E7DC /* DuckDuckGoDBPBackgroundAgentAppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DuckDuckGoDBPBackgroundAgentAppDelegate.swift; sourceTree = ""; }; 9D9AE9162AAA3B450026E7DC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -4340,6 +4398,7 @@ files = ( 373FB4B32B4D6C4B004C88D6 /* PreferencesViews in Frameworks */, 7B5F9A752AE2BE4E002AEBC0 /* PixelKit in Frameworks */, + 4BF97AD32B43C43F00EB4240 /* NetworkProtectionUI in Frameworks */, B6F7128229F6820A00594A45 /* QuickLookUI.framework in Frameworks */, 984FD3BF299ACF35007334DD /* Bookmarks in Frameworks */, 37A5E2F0298AA1B20047046B /* Persistence in Frameworks */, @@ -4347,12 +4406,15 @@ 37269EFD2B332FAC005E8E46 /* Common in Frameworks */, 378F44E629B4BDEE00899924 /* SwiftUIExtensions in Frameworks */, 3706FCA7293F65D500E42796 /* BrowserServicesKit in Frameworks */, + 3129788A2B64131200B67619 /* DataBrokerProtection in Frameworks */, 3706FCA9293F65D500E42796 /* ContentBlocking in Frameworks */, + 4BF97AD12B43C43F00EB4240 /* NetworkProtectionIPC in Frameworks */, 37F44A5F298C17830025E7FE /* Navigation in Frameworks */, B6EC37FF29B8D915001ACE79 /* Configuration in Frameworks */, 372217822B33380700B8E9C2 /* TestUtils in Frameworks */, 3706FCAA293F65D500E42796 /* UserScript in Frameworks */, 3706FCAB293F65D500E42796 /* TrackerRadarKit in Frameworks */, + 4BF97AD52B43C43F00EB4240 /* NetworkProtection in Frameworks */, 3739326529AE4B39009346AE /* DDGSync in Frameworks */, 37DF000729F9C061002B7D3E /* SyncDataProviders in Frameworks */, 3706FCAE293F65D500E42796 /* Lottie in Frameworks */, @@ -4432,6 +4494,7 @@ 7BEEA5142AD1236300A9E72B /* NetworkProtectionIPC in Frameworks */, EE7295EF2A545C12008C0991 /* NetworkProtection in Frameworks */, 4B2D067F2A1334D700DE1F49 /* NetworkProtectionUI in Frameworks */, + 4BA7C4DD2B3F64E500AFE511 /* LoginItems in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4521,7 +4584,7 @@ buildActionMask = 2147483647; files = ( 9D6983FB2AC773C8002C02FC /* PixelKit in Frameworks */, - 9D9AE9312AAB8A9E0026E7DC /* BrowserServicesKit in Frameworks */, + 315A023F2B6421AE00BFA577 /* Networking in Frameworks */, 9D9AE8FB2AAA3AD90026E7DC /* DataBrokerProtection in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -6537,7 +6600,7 @@ 4B2D06392A11CFBB00DE1F49 /* DuckDuckGo VPN.app */, 4B2D06692A13318400DE1F49 /* DuckDuckGo VPN App Store.app */, 9D9AE8D12AAA39A70026E7DC /* DuckDuckGo Personal Information Removal.app */, - 9D9AE8F22AAA39D30026E7DC /* .app */, + 9D9AE8F22AAA39D30026E7DC /* DuckDuckGo Personal Information Removal App Store.app */, 4B957C412AC7AE700062CA31 /* DuckDuckGo Privacy Pro.app */, 565E46DD2B2725DC0013AC2A /* SyncE2EUITests.xctest */, 376113D42B29CD5B00E794BB /* SyncE2EUITests App Store.xctest */, @@ -8091,10 +8154,13 @@ 3706FA7A293F65D500E42796 /* Sources */, 3706FCA6293F65D500E42796 /* Frameworks */, 3706FCB1293F65D500E42796 /* Resources */, + 4BBA2D272B6AC09D00F6A470 /* Embed Login Items */, ); buildRules = ( ); dependencies = ( + 4BBA2D2B2B6AD01E00F6A470 /* PBXTargetDependency */, + 4BBA2D292B6ACD4D00F6A470 /* PBXTargetDependency */, B69D061C2A4C0BC10032D14D /* PBXTargetDependency */, 4B5F14FE2A1529230060320F /* PBXTargetDependency */, ); @@ -8118,7 +8184,11 @@ 7B5F9A742AE2BE4E002AEBC0 /* PixelKit */, 37269EFC2B332FAC005E8E46 /* Common */, 372217812B33380700B8E9C2 /* TestUtils */, + 4BF97AD02B43C43F00EB4240 /* NetworkProtectionIPC */, + 4BF97AD22B43C43F00EB4240 /* NetworkProtectionUI */, + 4BF97AD42B43C43F00EB4240 /* NetworkProtection */, 373FB4B22B4D6C4B004C88D6 /* PreferencesViews */, + 312978892B64131200B67619 /* DataBrokerProtection */, ); productName = DuckDuckGo; productReference = 3706FD05293F65D500E42796 /* DuckDuckGo App Store.app */; @@ -8277,10 +8347,12 @@ 4B2D06662A13318400DE1F49 /* Frameworks */, 4B2D06672A13318400DE1F49 /* Resources */, 4B2D067D2A13341200DE1F49 /* ShellScript */, + 4BA7C4E02B3F6F7500AFE511 /* CopyFiles */, ); buildRules = ( ); dependencies = ( + 4BA7C4DF2B3F6F4900AFE511 /* PBXTargetDependency */, B6080BA52B20AF8800B418EF /* PBXTargetDependency */, ); name = DuckDuckGoVPNAppStore; @@ -8290,6 +8362,7 @@ 7BA7CC602AD1211C0042E5CE /* Networking */, 7BEEA5132AD1236300A9E72B /* NetworkProtectionIPC */, 7BFCB74F2ADE7E2300DA3EA7 /* PixelKit */, + 4BA7C4DC2B3F64E500AFE511 /* LoginItems */, ); productName = DuckDuckGoAgentAppStore; productReference = 4B2D06692A13318400DE1F49 /* DuckDuckGo VPN App Store.app */; @@ -8463,6 +8536,7 @@ 9D9AE8D72AAA39D30026E7DC /* Sources */, 9D9AE8E72AAA39D30026E7DC /* Frameworks */, 9D9AE8EA2AAA39D30026E7DC /* Resources */, + 3121F62B2B64266A002F706A /* Copy Swift Package resources */, ); buildRules = ( ); @@ -8472,11 +8546,11 @@ name = DuckDuckGoDBPBackgroundAgentAppStore; packageProductDependencies = ( 9D9AE8FA2AAA3AD90026E7DC /* DataBrokerProtection */, - 9D9AE9302AAB8A9E0026E7DC /* BrowserServicesKit */, 9D6983FA2AC773C8002C02FC /* PixelKit */, + 315A023E2B6421AE00BFA577 /* Networking */, ); productName = DuckDuckGoAgent; - productReference = 9D9AE8F22AAA39D30026E7DC /* .app */; + productReference = 9D9AE8F22AAA39D30026E7DC /* DuckDuckGo Personal Information Removal App Store.app */; productType = "com.apple.product-type.application"; }; AA585D7D248FD31100E9A3E2 /* DuckDuckGo Privacy Browser */ = { @@ -8999,6 +9073,24 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 3121F62B2B64266A002F706A /* Copy Swift Package resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Copy Swift Package resources"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n# We had issues where the Swift Package resources were not being added to the Agent Apps,\n# so we're manually coping them here.\n# It seems to be a known issue: https://forums.swift.org/t/swift-packages-resource-bundle-not-present-in-xcarchive-when-framework-using-said-package-is-archived/50084/2\ncp -RL \"${BUILT_PRODUCTS_DIR}\"/ContentScopeScripts_ContentScopeScripts.bundle \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/\"\ncp -RL \"${BUILT_PRODUCTS_DIR}\"/DataBrokerProtection_DataBrokerProtection.bundle \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/\"\n"; + }; 3705272528992C8A000C06A2 /* Check Embedded Config URLs */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -9149,6 +9241,24 @@ shellPath = /bin/sh; shellScript = "if [[ \"${CONFIGURATION}\" != \"Debug\" ]]; then\n # run only for Debug builds\n exit 0\nfi\n\n# if Xcode created real Applications directory inside BUILT_PRODUCTS_DIR \nif [[ ! -L ${BUILT_PRODUCTS_DIR}/Applications ]]; then\n # we only get here on clean build, remove an existing app in /Applications/DEBUG on clean build\n echo \"rm -rf /${INSTALL_PATH}/${PRODUCT_NAME}.app\"\n rm -rf \"/${INSTALL_PATH}/${PRODUCT_NAME}.app\"\n\n # create /Applications/DEBUG dir\n echo \"mkdir -p /${INSTALL_PATH}\"\n mkdir -p \"/${INSTALL_PATH}\"\n\n # move the app bundle to /Applications/DEBUG\n echo \"mv ${DSTROOT}/${INSTALL_PATH}/${PRODUCT_NAME}.app /${INSTALL_PATH}/${PRODUCT_NAME}.app\"\n mv \"${DSTROOT}/${INSTALL_PATH}/${PRODUCT_NAME}.app\" \"/${INSTALL_PATH}/${PRODUCT_NAME}.app\"\n\n # rm ${BUILT_PRODUCTS_DIR}/Applications directory created by Xcode\n echo \"rm -rf ${BUILT_PRODUCTS_DIR}/Applications\" \n rm -rf \"${BUILT_PRODUCTS_DIR}/Applications\"\n # create ${BUILT_PRODUCTS_DIR}/Applications symlink to /Applications\n echo \"ln -s /Applications ${BUILT_PRODUCTS_DIR}/Applications\"\n ln -s /Applications \"${BUILT_PRODUCTS_DIR}/Applications\"\nfi\n"; }; + 4BBA2D272B6AC09D00F6A470 /* Embed Login Items */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Embed Login Items"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Embeds login items for the App Store build.\n\n# Skip login item embedding for release builds until they're ready to go live.\nif [ \"${CONFIGURATION}\" = \"Release\" ]; then\n echo \"Skipping login item embedding for release build.\"\n exit 0\n \n VPN_AGENT_NAME=\"${AGENT_RELEASE_PRODUCT_NAME}\"\n PIR_AGENT_NAME=\"${DBP_BACKGROUND_AGENT_RELEASE_PRODUCT_NAME}\"\nelse\n VPN_AGENT_NAME=\"${AGENT_PRODUCT_NAME}\"\n PIR_AGENT_NAME=\"${DBP_BACKGROUND_AGENT_PRODUCT_NAME}\"\nfi\n\nVPN_AGENT_ORIGIN=\"${CONFIGURATION_BUILD_DIR}/${VPN_AGENT_NAME}.app\"\nPIR_AGENT_ORIGIN=\"${CONFIGURATION_BUILD_DIR}/${PIR_AGENT_NAME}.app\"\nAGENT_DESTINATION=\"${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Library/LoginItems\"\n \n# Make sure that Library/LoginItems exists before copying\nmkdir -p \"$AGENT_DESTINATION\"\n \necho \"Copying VPN agent from $VPN_AGENT_ORIGIN to $AGENT_DESTINATION\"\nrsync -r \"$VPN_AGENT_ORIGIN\" \"$AGENT_DESTINATION\"\n \necho \"Copying Personal Information Removal agent from $PIR_AGENT_ORIGIN to $AGENT_DESTINATION\"\nrsync -r \"$PIR_AGENT_ORIGIN\" \"$AGENT_DESTINATION\"\n"; + }; 7B31FD922AD126C40086AA24 /* Embed System Network Extension */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -9295,6 +9405,7 @@ 3706FA7F293F65D500E42796 /* TabIndex.swift in Sources */, 3706FA80293F65D500E42796 /* TabLazyLoaderDataSource.swift in Sources */, 3706FA81293F65D500E42796 /* LoginImport.swift in Sources */, + 4BF97AD72B43C53D00EB4240 /* NetworkProtectionIPCTunnelController.swift in Sources */, EEC4A66E2B2C894F00F7C0AA /* VPNLocationPreferenceItemModel.swift in Sources */, 3706FA83293F65D500E42796 /* LazyLoadable.swift in Sources */, 3706FA84293F65D500E42796 /* ClickToLoadModel.swift in Sources */, @@ -9449,6 +9560,7 @@ 3706FB05293F65D500E42796 /* Favicons.xcdatamodeld in Sources */, 3706FB07293F65D500E42796 /* Publisher.asVoid.swift in Sources */, 3706FB08293F65D500E42796 /* NavigationButtonMenuDelegate.swift in Sources */, + 4BF97ADB2B43C5E000EB4240 /* VPNMetadataCollector.swift in Sources */, 3706FB09293F65D500E42796 /* CrashReport.swift in Sources */, 1E0C72072ABC63BD00802009 /* SubscriptionPagesUserScript.swift in Sources */, 3706FB0A293F65D500E42796 /* NSPathControlView.swift in Sources */, @@ -9492,6 +9604,7 @@ 3706FB2D293F65D500E42796 /* PasswordManagementPopover.swift in Sources */, 3706FB2F293F65D500E42796 /* HomePageRecentlyVisitedModel.swift in Sources */, 3707C718294B5D0F00682A9F /* AdClickAttributionTabExtension.swift in Sources */, + 31EF1E812B63FFB800E6DB17 /* DataBrokerProtectionManager.swift in Sources */, 3706FEBA293F6EFF00E42796 /* BWStatus.swift in Sources */, 3706FB30293F65D500E42796 /* NavigationBarPopovers.swift in Sources */, 3706FB31293F65D500E42796 /* PinnedTabsHostingView.swift in Sources */, @@ -9528,6 +9641,7 @@ 3706FB4C293F65D500E42796 /* SharingMenu.swift in Sources */, 3706FB4D293F65D500E42796 /* GrammarFeaturesManager.swift in Sources */, 3706FB50293F65D500E42796 /* SafariFaviconsReader.swift in Sources */, + 31267C692B640C4200FEF811 /* DataBrokerProtectionFeatureVisibility.swift in Sources */, 3706FB51293F65D500E42796 /* NSScreenExtension.swift in Sources */, EEC4A66A2B2C87D300F7C0AA /* VPNLocationView.swift in Sources */, 3706FB52293F65D500E42796 /* NSBezierPathExtension.swift in Sources */, @@ -9540,6 +9654,7 @@ 3706FB57293F65D500E42796 /* AppPrivacyConfigurationDataProvider.swift in Sources */, 857E5AF62A790B7000FC0FB4 /* PixelExperiment.swift in Sources */, 3706FB58293F65D500E42796 /* LinkButton.swift in Sources */, + 4B0EF7272B578096009D6481 /* AppVersionExtension.swift in Sources */, 3706FB59293F65D500E42796 /* TemporaryFileHandler.swift in Sources */, 37197EA62942443D00394917 /* WebViewSnapshotView.swift in Sources */, 3706FB5A293F65D500E42796 /* PrivacyFeatures.swift in Sources */, @@ -9595,11 +9710,13 @@ D64A5FF92AEA5C2B00B6D6E7 /* HomeButtonMenuFactory.swift in Sources */, 3707C717294B5D0F00682A9F /* FindInPageTabExtension.swift in Sources */, 3706FB81293F65D500E42796 /* IndexPathExtension.swift in Sources */, + 4BF97AD62B43C45800EB4240 /* NetworkProtectionNavBarPopoverManager.swift in Sources */, B6BCC5502AFE4F7D002C5499 /* DataImportTypePicker.swift in Sources */, 7BAF9E4B2A8A3CC9002D3B6E /* UserDefaults+NetworkProtectionShared.swift in Sources */, B6685E3D29A602D90043D2EE /* ExternalAppSchemeHandler.swift in Sources */, B6E1491029A5C30500AAFBE8 /* ContentBlockingTabExtension.swift in Sources */, 3706FB82293F65D500E42796 /* PasswordManagementNoteItemView.swift in Sources */, + 4BF97AD82B43C5B300EB4240 /* NetworkProtectionAppEvents.swift in Sources */, 3706FEC5293F6F0600E42796 /* BWInstallationService.swift in Sources */, 3775912E29AAC72700E26367 /* SyncPreferences.swift in Sources */, 3706FB83293F65D500E42796 /* NSApplicationExtension.swift in Sources */, @@ -9657,11 +9774,13 @@ 3706FBA5293F65D500E42796 /* TabShadowView.swift in Sources */, 3706FBA7293F65D500E42796 /* EncryptedValueTransformer.swift in Sources */, 4B41EDAF2B168AFF001EEDF4 /* VPNFeedbackFormViewController.swift in Sources */, + 31EF1E802B63FFA800E6DB17 /* DBPHomeViewController.swift in Sources */, 3706FBA8293F65D500E42796 /* PasteboardBookmark.swift in Sources */, 3706FBA9293F65D500E42796 /* PinnedTabsManager.swift in Sources */, B66260E829ACD0C900E9E3EE /* DuckPlayerTabExtension.swift in Sources */, 3706FBAA293F65D500E42796 /* HoverUserScript.swift in Sources */, 3706FBAC293F65D500E42796 /* MainMenuActions.swift in Sources */, + 4BF97AD92B43C5C000EB4240 /* NetworkProtectionBundle.swift in Sources */, 3706FBAE293F65D500E42796 /* DataImport.swift in Sources */, 3706FBAF293F65D500E42796 /* FireproofDomains.xcdatamodeld in Sources */, B626A7552991413000053070 /* SerpHeadersNavigationResponder.swift in Sources */, @@ -9697,6 +9816,7 @@ 3706FBC9293F65D500E42796 /* ArrayExtension.swift in Sources */, 3706FBCA293F65D500E42796 /* CrashReportSender.swift in Sources */, 3706FBCB293F65D500E42796 /* BookmarkHTMLImporter.swift in Sources */, + 4BF97ADC2B43C5E200EB4240 /* VPNFeedbackSender.swift in Sources */, 987799F72999996B005D8EB6 /* BookmarkDatabase.swift in Sources */, 3706FBCC293F65D500E42796 /* CustomRoundedCornersShape.swift in Sources */, 3706FBCD293F65D500E42796 /* LocaleExtension.swift in Sources */, @@ -9725,6 +9845,7 @@ 4B4D60E32A0C883A00BCD287 /* AppMain.swift in Sources */, 37197EA12942441700394917 /* Tab+UIDelegate.swift in Sources */, 56D6A3D729DB2BAB0055215A /* ContinueSetUpView.swift in Sources */, + 4BF97ADD2B43C5FC00EB4240 /* KeychainType+ClientDefault.swift in Sources */, B6BCC51F2AFCD9ED002C5499 /* DataImportSourcePicker.swift in Sources */, 3706FBDF293F65D500E42796 /* String+Punycode.swift in Sources */, EEC4A6722B2C90AB00F7C0AA /* VPNLocationPreferenceItem.swift in Sources */, @@ -9733,6 +9854,7 @@ 3706FBE2293F65D500E42796 /* ClickToLoadUserScript.swift in Sources */, 3706FBE3293F65D500E42796 /* WindowControllersManager.swift in Sources */, 37197EAA2942443D00394917 /* ModalSheetCancellable.swift in Sources */, + 31267C6B2B640C5200FEF811 /* DataBrokerProtectionAppEvents.swift in Sources */, 3706FBE4293F65D500E42796 /* FireAnimationView.swift in Sources */, 3706FBE5293F65D500E42796 /* FaviconUrlReference.swift in Sources */, 3706FBE7293F65D500E42796 /* PasswordManagementItemListModel.swift in Sources */, @@ -9780,6 +9902,7 @@ 3706FC06293F65D500E42796 /* OnboardingViewModel.swift in Sources */, 3706FC07293F65D500E42796 /* ScriptSourceProviding.swift in Sources */, 4B6785402AA7C726008A5004 /* DailyPixel.swift in Sources */, + 31EF1E832B63FFCA00E6DB17 /* LoginItem+DataBrokerProtection.swift in Sources */, B6619EFC2B111CC600CD9186 /* InstructionsFormatParser.swift in Sources */, 3706FC08293F65D500E42796 /* CoreDataBookmarkImporter.swift in Sources */, 3706FC09293F65D500E42796 /* SuggestionViewModel.swift in Sources */, @@ -9789,7 +9912,6 @@ 4B37EE722B4CFEE400A89A61 /* SurveyURLBuilder.swift in Sources */, 37197EAC294244D600394917 /* FutureExtension.swift in Sources */, 4B9DB0452A983B24000927DB /* WaitlistModalViewController.swift in Sources */, - 4BA71EDB2B4B81E80002EBCE /* AppVersionExtension.swift in Sources */, B66CA41F2AD910B300447CF0 /* DataImportView.swift in Sources */, 3706FC0C293F65D500E42796 /* NSAttributedStringExtension.swift in Sources */, 3706FC0D293F65D500E42796 /* AnimationView.swift in Sources */, @@ -9840,6 +9962,7 @@ 3706FC32293F65D500E42796 /* MoreOptionsMenu.swift in Sources */, 3706FC34293F65D500E42796 /* PermissionAuthorizationViewController.swift in Sources */, 3706FC35293F65D500E42796 /* BookmarkNode.swift in Sources */, + 31EF1E822B63FFC200E6DB17 /* DataBrokerProtectionLoginItemScheduler.swift in Sources */, B6B140892ABDBCC1004F8E85 /* HoverTrackingArea.swift in Sources */, 3706FC36293F65D500E42796 /* LongPressButton.swift in Sources */, 3706FC37293F65D500E42796 /* CoreDataStore.swift in Sources */, @@ -9867,6 +9990,7 @@ 3706FC4A293F65D500E42796 /* LocalStatisticsStore.swift in Sources */, 3706FC4B293F65D500E42796 /* BackForwardListItem.swift in Sources */, 4B4D60DD2A0C875E00BCD287 /* NetworkProtectionOptionKeyExtension.swift in Sources */, + 31267C6A2B640C4B00FEF811 /* DataBrokerProtectionFeatureDisabler.swift in Sources */, 3707C723294B5D2900682A9F /* URLSessionExtension.swift in Sources */, 3706FC4E293F65D500E42796 /* AtbAndVariantCleanup.swift in Sources */, 3706FC4F293F65D500E42796 /* NibLoadable.swift in Sources */, @@ -9886,6 +10010,7 @@ 7BEC20432B0F505F00243D3E /* AddBookmarkPopoverView.swift in Sources */, 3706FC5B293F65D500E42796 /* NSOutlineViewExtensions.swift in Sources */, 3706FC5C293F65D500E42796 /* AppDelegate.swift in Sources */, + 31EF1E842B63FFD100E6DB17 /* DataBrokerProtectionDebugMenu.swift in Sources */, 3706FC5D293F65D500E42796 /* ContentOverlayViewController.swift in Sources */, 3706FC5E293F65D500E42796 /* OnboardingViewController.swift in Sources */, 7BE146082A6A83C700C313B8 /* NetworkProtectionDebugMenu.swift in Sources */, @@ -9933,6 +10058,7 @@ 3706FC81293F65D500E42796 /* DispatchQueueExtensions.swift in Sources */, 3706FC82293F65D500E42796 /* PermissionAuthorizationPopover.swift in Sources */, 3706FC83293F65D500E42796 /* PopoverMessageViewController.swift in Sources */, + 4BF97ADA2B43C5DC00EB4240 /* VPNFeedbackCategory.swift in Sources */, 9D9AE86E2AA76D1F0026E7DC /* LoginItem+NetworkProtection.swift in Sources */, 3707C721294B5D2900682A9F /* WKMenuItemIdentifier.swift in Sources */, 3706FEBE293F6EFF00E42796 /* BWMessageIdGenerator.swift in Sources */, @@ -10344,12 +10470,15 @@ files = ( 7B2DDCFB2A93B25F0039D884 /* KeychainType+ClientDefault.swift in Sources */, B6F92BA32A691583002ABA6B /* UserDefaultsWrapper.swift in Sources */, + 4BA7C4DB2B3F63AE00AFE511 /* NetworkExtensionController.swift in Sources */, 4B2D067C2A13340900DE1F49 /* Logging.swift in Sources */, B6F92BAD2A6937B5002ABA6B /* OptionalExtension.swift in Sources */, + 4BA7C4D92B3F61FB00AFE511 /* BundleExtension.swift in Sources */, 7BA7CC5A2AD120640042E5CE /* NetworkProtection+ConvenienceInitializers.swift in Sources */, 7BA7CC3B2AD11E330042E5CE /* Bundle+Configuration.swift in Sources */, EEC589DC2A4F1CE800BCD60C /* AppLauncher.swift in Sources */, 7BA7CC3F2AD11E3D0042E5CE /* AppLauncher+DefaultInitializer.swift in Sources */, + 4B0EF7292B5780EB009D6481 /* VPNAppEventsHandler.swift in Sources */, 7BA7CC412AD11E420042E5CE /* NetworkProtectionBouncer.swift in Sources */, 4BF0E5082AD2551A00FFEC9E /* NetworkProtectionPixelEvent.swift in Sources */, 7BA7CC582AD1203A0042E5CE /* UserText+NetworkProtection.swift in Sources */, @@ -10362,6 +10491,7 @@ 7BA7CC392AD11E2D0042E5CE /* DuckDuckGoVPNAppDelegate.swift in Sources */, 7BA7CC552AD11FFB0042E5CE /* NetworkProtectionOptionKeyExtension.swift in Sources */, 7BA7CC3D2AD11E380042E5CE /* TunnelControllerIPCService.swift in Sources */, + 4BA7C4DA2B3F639800AFE511 /* NetworkProtectionTunnelController.swift in Sources */, 7BA7CC432AD11E480042E5CE /* UserText.swift in Sources */, 7BA7CC542AD11FCE0042E5CE /* NetworkProtectionBundle.swift in Sources */, ); @@ -10931,7 +11061,6 @@ 4B957B272AC7AE700062CA31 /* MenuItemSelectors.swift in Sources */, 4B957B282AC7AE700062CA31 /* FaviconView.swift in Sources */, 4B957B292AC7AE700062CA31 /* OnboardingFlow.swift in Sources */, - 4BA71EDC2B4B81E80002EBCE /* AppVersionExtension.swift in Sources */, 4B957B2A2AC7AE700062CA31 /* PasswordManagementLoginModel.swift in Sources */, 4B957B2B2AC7AE700062CA31 /* TabViewModel.swift in Sources */, 4B957B2C2AC7AE700062CA31 /* TabDragAndDropManager.swift in Sources */, @@ -11049,6 +11178,7 @@ 4B957B8D2AC7AE700062CA31 /* NSWorkspaceExtension.swift in Sources */, 4B957B8E2AC7AE700062CA31 /* AutofillTabExtension.swift in Sources */, 4B957B8F2AC7AE700062CA31 /* Assertions.swift in Sources */, + 4B0EF7282B5780AB009D6481 /* AppVersionExtension.swift in Sources */, 4B957B902AC7AE700062CA31 /* BookmarkViewModel.swift in Sources */, 4B957B912AC7AE700062CA31 /* DaxSpeech.swift in Sources */, BB5789732B2CC0300009DFE2 /* DataBrokerProtectionSubscriptionEventHandler.swift in Sources */, @@ -11164,6 +11294,7 @@ 9D9AE92A2AAA43EB0026E7DC /* DataBrokerProtectionBackgroundManager.swift in Sources */, 9D9AE91E2AAA3B450026E7DC /* DuckDuckGoDBPBackgroundAgentAppDelegate.swift in Sources */, 9D9AE9222AAA3B450026E7DC /* UserText.swift in Sources */, + 315A023D2B64216B00BFA577 /* IPCServiceManager.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -11359,6 +11490,7 @@ 37CD54CB27F2FDD100F1F7B9 /* DownloadsPreferences.swift in Sources */, 4B1E6EF227AB5E5D00F51793 /* PasswordManagementItemList.swift in Sources */, AAC5E4D025D6A709007F5990 /* Bookmark.swift in Sources */, + 4B0EF7262B578095009D6481 /* AppVersionExtension.swift in Sources */, 4BBDEE9328FC14760092FAA6 /* ConnectBitwardenViewModel.swift in Sources */, 4B5A4F4C27F3A5AA008FBD88 /* NSNotificationName+DataImport.swift in Sources */, B64C853826944B880048FEBE /* StoredPermission.swift in Sources */, @@ -11820,7 +11952,6 @@ B6F9BDE42B45CD1900677B33 /* ModalView.swift in Sources */, 1D2DC0072901679C008083A1 /* BWError.swift in Sources */, B68C92C42750EF76002AC6B0 /* PixelDataRecord.swift in Sources */, - 4BA71EDA2B4B81E80002EBCE /* AppVersionExtension.swift in Sources */, 853014D625E671A000FB8205 /* PageObserverUserScript.swift in Sources */, B677FC4F2B06376B0099EB04 /* ReportFeedbackView.swift in Sources */, B642738227B65BAC0005DFD1 /* SecureVaultErrorReporter.swift in Sources */, @@ -12178,6 +12309,21 @@ isa = PBXTargetDependency; productRef = 4B5F14FB2A15291D0060320F /* InputFilesChecker */; }; + 4BA7C4DF2B3F6F4900AFE511 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4B4D603C2A0B290200BCD287 /* NetworkProtectionAppExtension */; + targetProxy = 4BA7C4DE2B3F6F4900AFE511 /* PBXContainerItemProxy */; + }; + 4BBA2D292B6ACD4D00F6A470 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4B2D06682A13318400DE1F49 /* DuckDuckGoVPNAppStore */; + targetProxy = 4BBA2D282B6ACD4D00F6A470 /* PBXContainerItemProxy */; + }; + 4BBA2D2B2B6AD01E00F6A470 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9D9AE8D32AAA39D30026E7DC /* DuckDuckGoDBPBackgroundAgentAppStore */; + targetProxy = 4BBA2D2A2B6AD01E00F6A470 /* PBXContainerItemProxy */; + }; 7B4CE8E026F02108009134B1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AA585D7D248FD31100E9A3E2 /* DuckDuckGo Privacy Browser */; @@ -13182,10 +13328,19 @@ package = 9807F643278CA16F00E1547B /* XCRemoteSwiftPackageReference "BrowserServicesKit" */; productName = UserScript; }; + 312978892B64131200B67619 /* DataBrokerProtection */ = { + isa = XCSwiftPackageProductDependency; + productName = DataBrokerProtection; + }; 3143C8782B0D1F3D00382627 /* DataBrokerProtection */ = { isa = XCSwiftPackageProductDependency; productName = DataBrokerProtection; }; + 315A023E2B6421AE00BFA577 /* Networking */ = { + isa = XCSwiftPackageProductDependency; + package = 9807F643278CA16F00E1547B /* XCRemoteSwiftPackageReference "BrowserServicesKit" */; + productName = Networking; + }; 31A3A4E22B0C115F0021063C /* DataBrokerProtection */ = { isa = XCSwiftPackageProductDependency; productName = DataBrokerProtection; @@ -13483,6 +13638,23 @@ isa = XCSwiftPackageProductDependency; productName = LoginItems; }; + 4BA7C4DC2B3F64E500AFE511 /* LoginItems */ = { + isa = XCSwiftPackageProductDependency; + productName = LoginItems; + }; + 4BF97AD02B43C43F00EB4240 /* NetworkProtectionIPC */ = { + isa = XCSwiftPackageProductDependency; + productName = NetworkProtectionIPC; + }; + 4BF97AD22B43C43F00EB4240 /* NetworkProtectionUI */ = { + isa = XCSwiftPackageProductDependency; + productName = NetworkProtectionUI; + }; + 4BF97AD42B43C43F00EB4240 /* NetworkProtection */ = { + isa = XCSwiftPackageProductDependency; + package = 9807F643278CA16F00E1547B /* XCRemoteSwiftPackageReference "BrowserServicesKit" */; + productName = NetworkProtection; + }; 7B31FD8B2AD125620086AA24 /* NetworkProtectionIPC */ = { isa = XCSwiftPackageProductDependency; productName = NetworkProtectionIPC; @@ -13581,11 +13753,6 @@ isa = XCSwiftPackageProductDependency; productName = DataBrokerProtection; }; - 9D9AE9302AAB8A9E0026E7DC /* BrowserServicesKit */ = { - isa = XCSwiftPackageProductDependency; - package = 9807F643278CA16F00E1547B /* XCRemoteSwiftPackageReference "BrowserServicesKit" */; - productName = BrowserServicesKit; - }; 9DB6E7232AA0DC5800A17F3C /* LoginItems */ = { isa = XCSwiftPackageProductDependency; productName = LoginItems; diff --git a/DuckDuckGo/DBP/DBPHomeViewController.swift b/DuckDuckGo/DBP/DBPHomeViewController.swift index fe34618f62..ab0e4f783b 100644 --- a/DuckDuckGo/DBP/DBPHomeViewController.swift +++ b/DuckDuckGo/DBP/DBPHomeViewController.swift @@ -16,6 +16,8 @@ // limitations under the License. // +#if DBP + import Foundation import DataBrokerProtection import AppKit @@ -199,3 +201,5 @@ public class DataBrokerProtectionPixelsHandler: EventMapping com.apple.security.app-sandbox + com.apple.security.application-groups + + $(DBP_APP_GROUP) + $(NETP_APP_GROUP) + com.apple.security.device.audio-input com.apple.security.device.camera @@ -35,8 +40,14 @@ /Library/Application Support/TorBrowser-Data/Browser/ /Library/Application Support/Arc/User Data/ + com.apple.security.temporary-exception.mach-lookup.global-name + + $(DBP_BACKGROUND_AGENT_BUNDLE_ID) + $(AGENT_BUNDLE_ID) + keychain-access-groups + $(DBP_APP_GROUP) $(AppIdentifierPrefix)com.duckduckgo.mobile.ios $(NETP_APP_GROUP) diff --git a/DuckDuckGo/DuckDuckGoAppStoreCI.entitlements b/DuckDuckGo/DuckDuckGoAppStoreCI.entitlements index 9a0241659f..a2c7bd6bd5 100644 --- a/DuckDuckGo/DuckDuckGoAppStoreCI.entitlements +++ b/DuckDuckGo/DuckDuckGoAppStoreCI.entitlements @@ -8,6 +8,10 @@ com.apple.security.app-sandbox + com.apple.security.application-groups + + $(NETP_APP_GROUP) + com.apple.security.device.audio-input com.apple.security.device.camera diff --git a/DuckDuckGo/HomePage/Model/HomePageContinueSetUpModel.swift b/DuckDuckGo/HomePage/Model/HomePageContinueSetUpModel.swift index c43c574292..93e8b9ee74 100644 --- a/DuckDuckGo/HomePage/Model/HomePageContinueSetUpModel.swift +++ b/DuckDuckGo/HomePage/Model/HomePageContinueSetUpModel.swift @@ -40,14 +40,7 @@ extension HomePage.Models { let gridWidth = FeaturesGridDimensions.width let deleteActionTitle = UserText.newTabSetUpRemoveItemAction let privacyConfigurationManager: PrivacyConfigurationManaging - -#if NETWORK_PROTECTION && DBP - let networkProtectionRemoteMessaging: NetworkProtectionRemoteMessaging - let networkProtectionUserDefaults: UserDefaults - - let dataBrokerProtectionRemoteMessaging: DataBrokerProtectionRemoteMessaging - let dataBrokerProtectionUserDefaults: UserDefaults -#endif + let homePageRemoteMessaging: HomePageRemoteMessaging var isDay0SurveyEnabled: Bool { let newTabContinueSetUpSettings = privacyConfigurationManager.privacyConfig.settings(for: .newTabContinueSetUp) @@ -138,17 +131,13 @@ extension HomePage.Models { @Published var visibleFeaturesMatrix: [[FeatureType]] = [[]] -#if NETWORK_PROTECTION && DBP init(defaultBrowserProvider: DefaultBrowserProvider, dataImportProvider: DataImportStatusProviding, tabCollectionViewModel: TabCollectionViewModel, emailManager: EmailManager = EmailManager(), privacyPreferences: PrivacySecurityPreferences = PrivacySecurityPreferences.shared, duckPlayerPreferences: DuckPlayerPreferencesPersistor, - networkProtectionRemoteMessaging: NetworkProtectionRemoteMessaging, - dataBrokerProtectionRemoteMessaging: DataBrokerProtectionRemoteMessaging, - networkProtectionUserDefaults: UserDefaults, - dataBrokerProtectionUserDefaults: UserDefaults, + homePageRemoteMessaging: HomePageRemoteMessaging, privacyConfigurationManager: PrivacyConfigurationManaging = AppPrivacyFeatures.shared.contentBlocking.privacyConfigurationManager) { self.defaultBrowserProvider = defaultBrowserProvider self.dataImportProvider = dataImportProvider @@ -156,10 +145,7 @@ extension HomePage.Models { self.emailManager = emailManager self.privacyPreferences = privacyPreferences self.duckPlayerPreferences = duckPlayerPreferences - self.networkProtectionRemoteMessaging = networkProtectionRemoteMessaging - self.dataBrokerProtectionRemoteMessaging = dataBrokerProtectionRemoteMessaging - self.networkProtectionUserDefaults = networkProtectionUserDefaults - self.dataBrokerProtectionUserDefaults = dataBrokerProtectionUserDefaults + self.homePageRemoteMessaging = homePageRemoteMessaging self.privacyConfigurationManager = privacyConfigurationManager refreshFeaturesMatrix() @@ -167,26 +153,6 @@ extension HomePage.Models { NotificationCenter.default.addObserver(self, selector: #selector(newTabOpenNotification(_:)), name: HomePage.Models.newHomePageTabOpen, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(windowDidBecomeKey(_:)), name: NSWindow.didBecomeKeyNotification, object: nil) } -#else - init(defaultBrowserProvider: DefaultBrowserProvider, - dataImportProvider: DataImportStatusProviding, - tabCollectionViewModel: TabCollectionViewModel, - emailManager: EmailManager = EmailManager(), - privacyPreferences: PrivacySecurityPreferences = PrivacySecurityPreferences.shared, - duckPlayerPreferences: DuckPlayerPreferencesPersistor, - privacyConfigurationManager: PrivacyConfigurationManaging = AppPrivacyFeatures.shared.contentBlocking.privacyConfigurationManager) { - self.defaultBrowserProvider = defaultBrowserProvider - self.dataImportProvider = dataImportProvider - self.tabCollectionViewModel = tabCollectionViewModel - self.emailManager = emailManager - self.privacyPreferences = privacyPreferences - self.duckPlayerPreferences = duckPlayerPreferences - self.privacyConfigurationManager = privacyConfigurationManager - refreshFeaturesMatrix() - NotificationCenter.default.addObserver(self, selector: #selector(newTabOpenNotification(_:)), name: HomePage.Models.newHomePageTabOpen, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(windowDidBecomeKey(_:)), name: NSWindow.didBecomeKeyNotification, object: nil) - } -#endif // swiftlint:disable:next cyclomatic_complexity @MainActor func performAction(for featureType: FeatureType) { @@ -238,12 +204,12 @@ extension HomePage.Models { shouldShowSurveyDay7 = false case .networkProtectionRemoteMessage(let message): #if NETWORK_PROTECTION - networkProtectionRemoteMessaging.dismiss(message: message) + homePageRemoteMessaging.networkProtectionRemoteMessaging.dismiss(message: message) Pixel.fire(.networkProtectionRemoteMessageDismissed(messageID: message.id)) #endif case .dataBrokerProtectionRemoteMessage(let message): #if DBP - dataBrokerProtectionRemoteMessaging.dismiss(message: message) + homePageRemoteMessaging.dataBrokerProtectionRemoteMessaging.dismiss(message: message) Pixel.fire(.dataBrokerProtectionRemoteMessageDismissed(messageID: message.id)) #endif case .dataBrokerProtectionWaitlistInvited: @@ -260,7 +226,7 @@ extension HomePage.Models { features.append(.dataBrokerProtectionWaitlistInvited) } - for message in dataBrokerProtectionRemoteMessaging.presentableRemoteMessages() { + for message in homePageRemoteMessaging.dataBrokerProtectionRemoteMessaging.presentableRemoteMessages() { features.append(.dataBrokerProtectionRemoteMessage(message)) DailyPixel.fire( pixel: .dataBrokerProtectionRemoteMessageDisplayed(messageID: message.id), @@ -271,7 +237,7 @@ extension HomePage.Models { #endif #if NETWORK_PROTECTION - for message in networkProtectionRemoteMessaging.presentableRemoteMessages() { + for message in homePageRemoteMessaging.networkProtectionRemoteMessaging.presentableRemoteMessages() { features.append(.networkProtectionRemoteMessage(message)) DailyPixel.fire( pixel: .networkProtectionRemoteMessageDisplayed(messageID: message.id), @@ -434,7 +400,7 @@ extension HomePage.Models { #if NETWORK_PROTECTION guard let actionType = remoteMessage.action.actionType else { Pixel.fire(.networkProtectionRemoteMessageDismissed(messageID: remoteMessage.id)) - networkProtectionRemoteMessaging.dismiss(message: remoteMessage) + homePageRemoteMessaging.networkProtectionRemoteMessaging.dismiss(message: remoteMessage) refreshFeaturesMatrix() return } @@ -449,7 +415,7 @@ extension HomePage.Models { Pixel.fire(.networkProtectionRemoteMessageOpened(messageID: remoteMessage.id)) // Dismiss the message after the user opens the URL, even if they just close the tab immediately afterwards. - networkProtectionRemoteMessaging.dismiss(message: remoteMessage) + homePageRemoteMessaging.networkProtectionRemoteMessaging.dismiss(message: remoteMessage) refreshFeaturesMatrix() } } @@ -460,7 +426,7 @@ extension HomePage.Models { #if DBP guard let actionType = remoteMessage.action.actionType else { Pixel.fire(.dataBrokerProtectionRemoteMessageDismissed(messageID: remoteMessage.id)) - dataBrokerProtectionRemoteMessaging.dismiss(message: remoteMessage) + homePageRemoteMessaging.dataBrokerProtectionRemoteMessaging.dismiss(message: remoteMessage) refreshFeaturesMatrix() return } @@ -475,7 +441,7 @@ extension HomePage.Models { Pixel.fire(.dataBrokerProtectionRemoteMessageOpened(messageID: remoteMessage.id)) // Dismiss the message after the user opens the URL, even if they just close the tab immediately afterwards. - dataBrokerProtectionRemoteMessaging.dismiss(message: remoteMessage) + homePageRemoteMessaging.dataBrokerProtectionRemoteMessaging.dismiss(message: remoteMessage) refreshFeaturesMatrix() } } @@ -611,3 +577,42 @@ extension HomePage.Models { } } } + +// MARK: - Remote Messaging + +struct HomePageRemoteMessaging { + + static func defaultMessaging() -> HomePageRemoteMessaging { +#if NETWORK_PROTECTION && DBP + return HomePageRemoteMessaging( + networkProtectionRemoteMessaging: DefaultNetworkProtectionRemoteMessaging(), + networkProtectionUserDefaults: .netP, + dataBrokerProtectionRemoteMessaging: DefaultDataBrokerProtectionRemoteMessaging(), + dataBrokerProtectionUserDefaults: .dbp + ) +#elseif NETWORK_PROTECTION + return HomePageRemoteMessaging( + networkProtectionRemoteMessaging: DefaultNetworkProtectionRemoteMessaging(), + networkProtectionUserDefaults: .netP + ) +#elseif DBP + return HomePageRemoteMessaging( + dataBrokerProtectionRemoteMessaging: DefaultDataBrokerProtectionRemoteMessaging(), + dataBrokerProtectionUserDefaults: .dbp + ) +#else + return HomePageRemoteMessaging() +#endif + } + +#if NETWORK_PROTECTION + let networkProtectionRemoteMessaging: NetworkProtectionRemoteMessaging + let networkProtectionUserDefaults: UserDefaults +#endif + +#if DBP + let dataBrokerProtectionRemoteMessaging: DataBrokerProtectionRemoteMessaging + let dataBrokerProtectionUserDefaults: UserDefaults +#endif + +} diff --git a/DuckDuckGo/HomePage/View/HomePageViewController.swift b/DuckDuckGo/HomePage/View/HomePageViewController.swift index 5b15855c39..6317449878 100644 --- a/DuckDuckGo/HomePage/View/HomePageViewController.swift +++ b/DuckDuckGo/HomePage/View/HomePageViewController.swift @@ -138,27 +138,13 @@ final class HomePageViewController: NSViewController { } func createFeatureModel() -> HomePage.Models.ContinueSetUpModel { -#if NETWORK_PROTECTION && DBP - let vm = HomePage.Models.ContinueSetUpModel( + return HomePage.Models.ContinueSetUpModel( defaultBrowserProvider: SystemDefaultBrowserProvider(), dataImportProvider: BookmarksAndPasswordsImportStatusProvider(), tabCollectionViewModel: tabCollectionViewModel, duckPlayerPreferences: DuckPlayerPreferencesUserDefaultsPersistor(), - networkProtectionRemoteMessaging: DefaultNetworkProtectionRemoteMessaging(), - dataBrokerProtectionRemoteMessaging: DefaultDataBrokerProtectionRemoteMessaging(), - networkProtectionUserDefaults: .netP, - dataBrokerProtectionUserDefaults: .dbp + homePageRemoteMessaging: .defaultMessaging() ) -#else - let vm = HomePage.Models.ContinueSetUpModel( - defaultBrowserProvider: SystemDefaultBrowserProvider(), - dataImportProvider: BookmarksAndPasswordsImportStatusProvider(), - tabCollectionViewModel: tabCollectionViewModel, - duckPlayerPreferences: DuckPlayerPreferencesUserDefaultsPersistor() - ) -#endif - - return vm } func createDefaultBrowserModel() -> HomePage.Models.DefaultBrowserModel { diff --git a/DuckDuckGo/NetworkProtection/AppAndExtensionAndAgentTargets/UserDefaults+NetworkProtectionShared.swift b/DuckDuckGo/NetworkProtection/AppAndExtensionAndAgentTargets/UserDefaults+NetworkProtectionShared.swift index fc0fc453f2..5e0799f8d5 100644 --- a/DuckDuckGo/NetworkProtection/AppAndExtensionAndAgentTargets/UserDefaults+NetworkProtectionShared.swift +++ b/DuckDuckGo/NetworkProtection/AppAndExtensionAndAgentTargets/UserDefaults+NetworkProtectionShared.swift @@ -16,7 +16,7 @@ // limitations under the License. // -#if NETP_SYSTEM_EXTENSION +#if NETWORK_PROTECTION import Combine import Foundation diff --git a/DuckDuckGo/NetworkProtection/AppAndExtensionTargets/AppAndExtensionAndNotificationTargets/NetworkProtectionBundle.swift b/DuckDuckGo/NetworkProtection/AppAndExtensionTargets/AppAndExtensionAndNotificationTargets/NetworkProtectionBundle.swift index 57875ad240..e14b7f1e84 100644 --- a/DuckDuckGo/NetworkProtection/AppAndExtensionTargets/AppAndExtensionAndNotificationTargets/NetworkProtectionBundle.swift +++ b/DuckDuckGo/NetworkProtection/AppAndExtensionTargets/AppAndExtensionAndNotificationTargets/NetworkProtectionBundle.swift @@ -72,7 +72,7 @@ enum NetworkProtectionBundle { #if NETP_SYSTEM_EXTENSION .system #else - .dataProtection(.named(Bundle.main.appGroupName)) + .dataProtection(.named(Bundle.main.appGroup(bundle: .netP))) #endif }() } diff --git a/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionAppEvents.swift b/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionAppEvents.swift index d6f2684e73..a1e96fa4cf 100644 --- a/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionAppEvents.swift +++ b/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionAppEvents.swift @@ -150,6 +150,7 @@ final class NetworkProtectionAppEvents { // MARK: - Legacy Login Item and Extension private func removeLegacyLoginItemAndVPNConfiguration() async { +#if NETP_SYSTEM_EXTENSION LoginItem(bundleId: legacyAgentBundleID, defaults: .netP).forceStop() let tunnels = try? await NETunnelProviderManager.loadAllFromPreferences() @@ -164,6 +165,7 @@ final class NetworkProtectionAppEvents { UserDefaults.netP.networkProtectionOnboardingStatusRawValue = OnboardingStatus.default.rawValue try? await tunnel.removeFromPreferences() +#endif } } diff --git a/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionDebugMenu.swift b/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionDebugMenu.swift index 340c5ad693..e1696a7aba 100644 --- a/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionDebugMenu.swift +++ b/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionDebugMenu.swift @@ -76,7 +76,7 @@ final class NetworkProtectionDebugMenu: NSMenu { resetToDefaults .targetting(self) - NSMenuItem(title: "Remove System Extension and Login Items", action: #selector(NetworkProtectionDebugMenu.removeSystemExtensionAndAgents)) + NSMenuItem(title: "Remove Network Extension and Login Items", action: #selector(NetworkProtectionDebugMenu.removeSystemExtensionAndAgents)) .targetting(self) NSMenuItem(title: "Reset Remote Messages", action: #selector(NetworkProtectionDebugMenu.resetNetworkProtectionRemoteMessages)) diff --git a/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionTunnelController.swift b/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionTunnelController.swift index 00384ac2e7..d5eb04eecf 100644 --- a/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionTunnelController.swift +++ b/DuckDuckGo/NetworkProtection/AppTargets/BothAppTargets/NetworkProtectionTunnelController.swift @@ -25,11 +25,14 @@ import Common import NetworkExtension import NetworkProtection import NetworkProtectionUI -import SystemExtensionManager -import SystemExtensions import Networking import PixelKit +#if NETP_SYSTEM_EXTENSION +import SystemExtensionManager +import SystemExtensions +#endif + typealias NetworkProtectionStatusChangeHandler = (NetworkProtection.ConnectionStatus) -> Void typealias NetworkProtectionConfigChangeHandler = () -> Void diff --git a/DuckDuckGo/NetworkProtection/AppTargets/DeveloperIDTarget/NetworkProtectionIPCTunnelController.swift b/DuckDuckGo/NetworkProtection/AppTargets/DeveloperIDTarget/NetworkProtectionIPCTunnelController.swift index ada65d6335..a7ac07106b 100644 --- a/DuckDuckGo/NetworkProtection/AppTargets/DeveloperIDTarget/NetworkProtectionIPCTunnelController.swift +++ b/DuckDuckGo/NetworkProtection/AppTargets/DeveloperIDTarget/NetworkProtectionIPCTunnelController.swift @@ -16,6 +16,8 @@ // limitations under the License. // +#if NETWORK_PROTECTION + import Foundation import NetworkProtection import NetworkProtectionIPC @@ -66,3 +68,5 @@ final class NetworkProtectionIPCTunnelController: TunnelController { loginItemsManager.enableLoginItems(LoginItemsManager.networkProtectionLoginItems, log: .networkProtection) } } + +#endif diff --git a/DuckDuckGo/NetworkProtectionAppExtension.entitlements b/DuckDuckGo/NetworkProtectionAppExtension.entitlements index 65ab070619..13dd983ca1 100644 --- a/DuckDuckGo/NetworkProtectionAppExtension.entitlements +++ b/DuckDuckGo/NetworkProtectionAppExtension.entitlements @@ -24,6 +24,7 @@ keychain-access-groups $(AppIdentifierPrefix)com.duckduckgo.mobile.ios + $(NETP_APP_GROUP) diff --git a/DuckDuckGo/VPNFeedbackForm/VPNFeedbackFormView.swift b/DuckDuckGo/VPNFeedbackForm/VPNFeedbackFormView.swift index 9f909044eb..bf65e004dd 100644 --- a/DuckDuckGo/VPNFeedbackForm/VPNFeedbackFormView.swift +++ b/DuckDuckGo/VPNFeedbackForm/VPNFeedbackFormView.swift @@ -132,29 +132,29 @@ private struct VPNFeedbackFormIssueDescriptionForm: View { @ViewBuilder func textEditor() -> some View { #if APPSTORE - FocusableTextEditor(text: $model.notes) + FocusableTextEditor(text: $viewModel.feedbackFormText, characterLimit: 1000) #else - if #available(macOS 12, *) { - FocusableTextEditor(text: $viewModel.feedbackFormText, characterLimit: 1000) - } else { - TextEditor(text: $viewModel.feedbackFormText) - .frame(height: 197.0) - .font(.body) - .foregroundColor(.primary) - .onChange(of: viewModel.feedbackFormText) { - viewModel.feedbackFormText = String($0.prefix(1000)) + if #available(macOS 12, *) { + FocusableTextEditor(text: $viewModel.feedbackFormText, characterLimit: 1000) + } else { + TextEditor(text: $viewModel.feedbackFormText) + .frame(height: 197.0) + .font(.body) + .foregroundColor(.primary) + .onChange(of: viewModel.feedbackFormText) { + viewModel.feedbackFormText = String($0.prefix(1000)) + } + .padding(EdgeInsets(top: 3.0, leading: 6.0, bottom: 5.0, trailing: 0.0)) + .clipShape(RoundedRectangle(cornerRadius: 8.0, style: .continuous)) + .background( + ZStack { + RoundedRectangle(cornerRadius: 8.0) + .stroke(Color(NSColor.textEditorBorderColor), lineWidth: 0.4) + RoundedRectangle(cornerRadius: 8.0) + .fill(Color(NSColor.textEditorBackgroundColor)) } - .padding(EdgeInsets(top: 3.0, leading: 6.0, bottom: 5.0, trailing: 0.0)) - .clipShape(RoundedRectangle(cornerRadius: 8.0, style: .continuous)) - .background( - ZStack { - RoundedRectangle(cornerRadius: 8.0) - .stroke(Color(NSColor.textEditorBorderColor), lineWidth: 0.4) - RoundedRectangle(cornerRadius: 8.0) - .fill(Color(NSColor.textEditorBackgroundColor)) - } - ) - } + ) + } #endif } diff --git a/DuckDuckGo/VPNFeedbackForm/VPNMetadataCollector.swift b/DuckDuckGo/VPNFeedbackForm/VPNMetadataCollector.swift index 182b2f0708..ca26c25a79 100644 --- a/DuckDuckGo/VPNFeedbackForm/VPNMetadataCollector.swift +++ b/DuckDuckGo/VPNFeedbackForm/VPNMetadataCollector.swift @@ -68,11 +68,8 @@ struct VPNMetadata: Encodable { struct LoginItemState: Encodable { let vpnMenuState: String let vpnMenuIsRunning: Bool - -#if NETP_SYSTEM_EXTENSION let notificationsAgentState: String let notificationsAgentIsRunning: Bool -#endif } let appInfo: AppInfo @@ -263,7 +260,10 @@ final class DefaultVPNMetadataCollector: VPNMetadataCollector { #else return .init( vpnMenuState: vpnMenuState, - vpnMenuIsRunning: vpnMenuIsRunning) + vpnMenuIsRunning: vpnMenuIsRunning, + notificationsAgentState: "not-required", + notificationsAgentIsRunning: false + ) #endif } diff --git a/DuckDuckGo/Waitlist/NetworkProtectionFeatureDisabler.swift b/DuckDuckGo/Waitlist/NetworkProtectionFeatureDisabler.swift index fe00557e56..bd7f5ce202 100644 --- a/DuckDuckGo/Waitlist/NetworkProtectionFeatureDisabler.swift +++ b/DuckDuckGo/Waitlist/NetworkProtectionFeatureDisabler.swift @@ -104,7 +104,9 @@ final class NetworkProtectionFeatureDisabler: NetworkProtectionFeatureDisabling } func removeSystemExtension() async throws { +#if NETP_SYSTEM_EXTENSION try await ipcClient.debugCommand(.removeSystemExtension) +#endif } private func unpinNetworkProtection() { diff --git a/DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgent.entitlements b/DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgent.entitlements index 113209622e..d479a64a3a 100644 --- a/DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgent.entitlements +++ b/DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgent.entitlements @@ -2,13 +2,14 @@ - com.apple.security.application-groups - - $(NETP_APP_GROUP) - - keychain-access-groups - - $(DBP_APP_GROUP) - + com.apple.security.application-groups + + $(DBP_APP_GROUP) + $(NETP_APP_GROUP) + + keychain-access-groups + + $(DBP_APP_GROUP) + diff --git a/DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgentAppStore.entitlements b/DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgentAppStore.entitlements index b2fd453927..352df997f2 100644 --- a/DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgentAppStore.entitlements +++ b/DuckDuckGoDBPBackgroundAgent/DuckDuckGoDBPBackgroundAgentAppStore.entitlements @@ -2,20 +2,18 @@ - com.apple.security.network.server - - com.apple.security.network.client - - com.apple.security.app-sandbox - - keychain-access-groups - - $(NETP_APP_GROUP) - - com.apple.security.application-groups - - $(TeamIdentifierPrefix)com.duckduckgo.macos.browser.network-protection - $(NETP_APP_GROUP) - + keychain-access-groups + + $(DBP_APP_GROUP) + + com.apple.security.application-groups + + $(DBP_APP_GROUP) + $(NETP_APP_GROUP) + + com.apple.security.network.client + + com.apple.security.app-sandbox + diff --git a/DuckDuckGoDBPBackgroundAgent/Info-AppStore.plist b/DuckDuckGoDBPBackgroundAgent/Info-AppStore.plist index 2bb1be4a67..cbd58651f6 100644 --- a/DuckDuckGoDBPBackgroundAgent/Info-AppStore.plist +++ b/DuckDuckGoDBPBackgroundAgent/Info-AppStore.plist @@ -2,9 +2,14 @@ - DBP_APP_GROUP - $(DBP_APP_GROUP) - LSApplicationCategoryType - public.app-category.productivity + DBP_APP_GROUP + $(DBP_APP_GROUP) + LSApplicationCategoryType + public.app-category.productivity + NSAppTransportSecurity + + NSAllowsArbitraryLoadsInWebContent + + diff --git a/DuckDuckGoDBPBackgroundAgent/Info.plist b/DuckDuckGoDBPBackgroundAgent/Info.plist index 031e63ff71..cbd58651f6 100644 --- a/DuckDuckGoDBPBackgroundAgent/Info.plist +++ b/DuckDuckGoDBPBackgroundAgent/Info.plist @@ -2,14 +2,14 @@ - DBP_APP_GROUP - $(DBP_APP_GROUP) - LSApplicationCategoryType - public.app-category.productivity - NSAppTransportSecurity - - NSAllowsArbitraryLoadsInWebContent - - + DBP_APP_GROUP + $(DBP_APP_GROUP) + LSApplicationCategoryType + public.app-category.productivity + NSAppTransportSecurity + + NSAllowsArbitraryLoadsInWebContent + + diff --git a/DuckDuckGoVPN/DuckDuckGoVPNAppDelegate.swift b/DuckDuckGoVPN/DuckDuckGoVPNAppDelegate.swift index cfd264856f..5db390f007 100644 --- a/DuckDuckGoVPN/DuckDuckGoVPNAppDelegate.swift +++ b/DuckDuckGoVPN/DuckDuckGoVPNAppDelegate.swift @@ -64,7 +64,7 @@ final class DuckDuckGoVPNAppDelegate: NSObject, NSApplicationDelegate { Bundle.main.networkExtensionBundleID } -#if NETP_SYSTEM_EXTENSION +#if NETWORK_PROTECTION private lazy var networkExtensionController = NetworkExtensionController(extensionBundleID: networkExtensionBundleID) #endif @@ -184,9 +184,17 @@ final class DuckDuckGoVPNAppDelegate: NSObject, NSApplicationDelegate { dryRun = false #endif + let pixelSource: String + +#if NETP_SYSTEM_EXTENSION + pixelSource = "vpnAgent" +#else + pixelSource = "vpnAgentAppStore" +#endif + PixelKit.setUp(dryRun: dryRun, appVersion: AppVersion.shared.versionNumber, - source: "vpnAgent", + source: pixelSource, defaultHeaders: [:], log: .networkProtectionPixel, defaults: .netP) { (pixelName: String, headers: [String: String], parameters: [String: String], _, _, onComplete: @escaping PixelKit.CompletionBlock) in diff --git a/DuckDuckGoVPN/DuckDuckGoVPNAppStore.entitlements b/DuckDuckGoVPN/DuckDuckGoVPNAppStore.entitlements index 7de1c91761..7d375721de 100644 --- a/DuckDuckGoVPN/DuckDuckGoVPNAppStore.entitlements +++ b/DuckDuckGoVPN/DuckDuckGoVPNAppStore.entitlements @@ -2,6 +2,10 @@ + com.apple.developer.networking.networkextension + + packet-tunnel-provider + com.apple.security.app-sandbox keychain-access-groups diff --git a/DuckDuckGoVPN/Info-AppStore.plist b/DuckDuckGoVPN/Info-AppStore.plist index 1861d4c159..7627fdd9c9 100644 --- a/DuckDuckGoVPN/Info-AppStore.plist +++ b/DuckDuckGoVPN/Info-AppStore.plist @@ -2,8 +2,12 @@ + DISTRIBUTED_NOTIFICATIONS_PREFIX + $(DISTRIBUTED_NOTIFICATIONS_PREFIX) NETP_APP_GROUP $(NETP_APP_GROUP) + SYSEX_BUNDLE_ID + $(SYSEX_BUNDLE_ID) LSApplicationCategoryType public.app-category.productivity CFBundleShortVersionString diff --git a/DuckDuckGoVPN/NetworkExtensionController.swift b/DuckDuckGoVPN/NetworkExtensionController.swift index 954f47f8ee..6c74f850a6 100644 --- a/DuckDuckGoVPN/NetworkExtensionController.swift +++ b/DuckDuckGoVPN/NetworkExtensionController.swift @@ -18,8 +18,11 @@ import Foundation import NetworkProtectionUI + +#if NETP_SYSTEM_EXTENSION import SystemExtensionManager import SystemExtensions +#endif /// Network Protection's network extension session object. /// @@ -27,22 +30,31 @@ import SystemExtensions /// final class NetworkExtensionController { +#if NETP_SYSTEM_EXTENSION private let systemExtensionManager: SystemExtensionManager +#endif init(extensionBundleID: String) { +#if NETP_SYSTEM_EXTENSION systemExtensionManager = SystemExtensionManager(extensionBundleID: extensionBundleID) +#endif } + } extension NetworkExtensionController { + func activateSystemExtension(waitingForUserApproval: @escaping () -> Void) async throws { +#if NETP_SYSTEM_EXTENSION try await systemExtensionManager.activate( waitingForUserApproval: waitingForUserApproval) try? await Task.sleep(nanoseconds: 300 * NSEC_PER_MSEC) +#endif } func deactivateSystemExtension() async throws { +#if NETP_SYSTEM_EXTENSION do { try await systemExtensionManager.deactivate() } catch OSSystemExtensionError.extensionNotFound { @@ -51,5 +63,7 @@ extension NetworkExtensionController { } catch { throw error } +#endif } + } diff --git a/LocalPackages/BuildToolPlugins/Plugins/InputFilesChecker/InputFilesChecker.swift b/LocalPackages/BuildToolPlugins/Plugins/InputFilesChecker/InputFilesChecker.swift index 25b433412b..00053f594d 100644 --- a/LocalPackages/BuildToolPlugins/Plugins/InputFilesChecker/InputFilesChecker.swift +++ b/LocalPackages/BuildToolPlugins/Plugins/InputFilesChecker/InputFilesChecker.swift @@ -25,28 +25,12 @@ let nonSandboxedExtraInputFiles: Set = [ .init("BWEncryptionOutput.m", .source), .init("BWManager.swift", .source), .init("UpdateController.swift", .source), - .init("DuckDuckGo VPN.app", .unknown), - .init("DuckDuckGo Notifications.app", .unknown), .init("PFMoveApplication.m", .source), - .init("NetworkProtectionBundle.swift", .source), - .init("NetworkProtectionAppEvents.swift", .source), - .init("NetworkProtectionIPCTunnelController.swift", .source), - .init("NetworkProtectionNavBarPopoverManager.swift", .source), .init("NetworkProtectionSubscriptionEventHandler.swift", .source), - .init("KeychainType+ClientDefault.swift", .source), - .init("DBPHomeViewController.swift", .source), - .init("DataBrokerProtectionManager.swift", .source), - .init("DataBrokerProtectionLoginItemScheduler.swift", .source), - .init("LoginItem+DataBrokerProtection.swift", .source), - .init("DataBrokerProtectionDebugMenu.swift", .source), - .init("DataBrokerProtectionFeatureVisibility.swift", .source), - .init("DataBrokerProtectionFeatureDisabler.swift", .source), - .init("DataBrokerProtectionAppEvents.swift", .source), - .init("VPNMetadataCollector.swift", .source), - .init("VPNFeedbackCategory.swift", .source), - .init("VPNFeedbackSender.swift", .source), - .init("DuckDuckGo Personal Information Removal.app", .unknown), - .init("DataBrokerProtectionSubscriptionEventHandler.swift", .source) + .init("DataBrokerProtectionSubscriptionEventHandler.swift", .source), + .init("DuckDuckGo VPN.app", .unknown), + .init("DuckDuckGo Notifications.app", .unknown), + .init("DuckDuckGo Personal Information Removal.app", .unknown) ] /** diff --git a/NetworkProtectionAppExtension/Info.plist b/NetworkProtectionAppExtension/Info.plist index a575a86d3e..afaad4a3af 100644 --- a/NetworkProtectionAppExtension/Info.plist +++ b/NetworkProtectionAppExtension/Info.plist @@ -2,6 +2,8 @@ + DISTRIBUTED_NOTIFICATIONS_PREFIX + $(DISTRIBUTED_NOTIFICATIONS_PREFIX) NETP_APP_GROUP $(NETP_APP_GROUP) NSExtension diff --git a/UnitTests/HomePage/ContinueSetUpModelTests.swift b/UnitTests/HomePage/ContinueSetUpModelTests.swift index 0e119c839d..7aeae6706a 100644 --- a/UnitTests/HomePage/ContinueSetUpModelTests.swift +++ b/UnitTests/HomePage/ContinueSetUpModelTests.swift @@ -20,7 +20,7 @@ import XCTest import BrowserServicesKit @testable import DuckDuckGo_Privacy_Browser -#if NETWORK_PROTECTION && DBP +#if NETWORK_PROTECTION final class MockNetworkProtectionRemoteMessaging: NetworkProtectionRemoteMessaging { @@ -38,6 +38,10 @@ final class MockNetworkProtectionRemoteMessaging: NetworkProtectionRemoteMessagi } +#endif + +#if DBP + final class MockDataBrokerProtectionRemoteMessaging: DataBrokerProtectionRemoteMessaging { var messages: [DataBrokerProtectionRemoteMessage] = [] @@ -89,20 +93,24 @@ final class ContinueSetUpModelTests: XCTestCase { privacyConfigManager.privacyConfig = config #if NETWORK_PROTECTION && DBP - vm = HomePage.Models.ContinueSetUpModel( - defaultBrowserProvider: capturingDefaultBrowserProvider, - dataImportProvider: capturingDataImportProvider, - tabCollectionViewModel: tabCollectionVM, - emailManager: emailManager, - privacyPreferences: privacyPreferences, - duckPlayerPreferences: duckPlayerPreferences, + let messaging = HomePageRemoteMessaging( networkProtectionRemoteMessaging: MockNetworkProtectionRemoteMessaging(), - dataBrokerProtectionRemoteMessaging: MockDataBrokerProtectionRemoteMessaging(), networkProtectionUserDefaults: userDefaults, - dataBrokerProtectionUserDefaults: userDefaults, - privacyConfigurationManager: privacyConfigManager + dataBrokerProtectionRemoteMessaging: MockDataBrokerProtectionRemoteMessaging(), + dataBrokerProtectionUserDefaults: userDefaults + ) +#elseif NETWORK_PROTECTION + let messaging = HomePageRemoteMessaging( + networkProtectionRemoteMessaging: MockNetworkProtectionRemoteMessaging(), + networkProtectionUserDefaults: userDefaults ) -#else +#elseif DBP + let messaging = HomePageRemoteMessaging( + dataBrokerProtectionRemoteMessaging: MockDataBrokerProtectionRemoteMessaging(), + dataBrokerProtectionUserDefaults: userDefaults + ) +#endif + vm = HomePage.Models.ContinueSetUpModel( defaultBrowserProvider: capturingDefaultBrowserProvider, dataImportProvider: capturingDataImportProvider, @@ -110,9 +118,9 @@ final class ContinueSetUpModelTests: XCTestCase { emailManager: emailManager, privacyPreferences: privacyPreferences, duckPlayerPreferences: duckPlayerPreferences, + homePageRemoteMessaging: messaging, privacyConfigurationManager: privacyConfigManager ) -#endif } override func tearDown() { @@ -148,7 +156,6 @@ final class ContinueSetUpModelTests: XCTestCase { duckPlayerPreferences.youtubeOverlayAnyButtonPressed = true privacyPreferences.autoconsentEnabled = true -#if NETWORK_PROTECTION && DBP vm = HomePage.Models.ContinueSetUpModel( defaultBrowserProvider: capturingDefaultBrowserProvider, dataImportProvider: capturingDataImportProvider, @@ -156,21 +163,8 @@ final class ContinueSetUpModelTests: XCTestCase { emailManager: emailManager, privacyPreferences: privacyPreferences, duckPlayerPreferences: duckPlayerPreferences, - networkProtectionRemoteMessaging: MockNetworkProtectionRemoteMessaging(), - dataBrokerProtectionRemoteMessaging: MockDataBrokerProtectionRemoteMessaging(), - networkProtectionUserDefaults: userDefaults, - dataBrokerProtectionUserDefaults: userDefaults - ) -#else - vm = HomePage.Models.ContinueSetUpModel( - defaultBrowserProvider: capturingDefaultBrowserProvider, - dataImportProvider: capturingDataImportProvider, - tabCollectionViewModel: tabCollectionVM, - emailManager: emailManager, - privacyPreferences: privacyPreferences, - duckPlayerPreferences: duckPlayerPreferences + homePageRemoteMessaging: createMessaging() ) -#endif XCTAssertFalse(vm.isMoreOrLessButtonNeeded) } @@ -463,7 +457,6 @@ final class ContinueSetUpModelTests: XCTestCase { userDefaults.set(false, forKey: UserDefaultsWrapper.Key.homePageShowSurveyDay0.rawValue) userDefaults.set(false, forKey: UserDefaultsWrapper.Key.homePageShowSurveyDay7.rawValue) -#if NETWORK_PROTECTION && DBP vm = HomePage.Models.ContinueSetUpModel( defaultBrowserProvider: capturingDefaultBrowserProvider, dataImportProvider: capturingDataImportProvider, @@ -471,21 +464,8 @@ final class ContinueSetUpModelTests: XCTestCase { emailManager: emailManager, privacyPreferences: privacyPreferences, duckPlayerPreferences: duckPlayerPreferences, - networkProtectionRemoteMessaging: MockNetworkProtectionRemoteMessaging(), - dataBrokerProtectionRemoteMessaging: MockDataBrokerProtectionRemoteMessaging(), - networkProtectionUserDefaults: userDefaults, - dataBrokerProtectionUserDefaults: userDefaults + homePageRemoteMessaging: createMessaging() ) -#else - vm = HomePage.Models.ContinueSetUpModel( - defaultBrowserProvider: capturingDefaultBrowserProvider, - dataImportProvider: capturingDataImportProvider, - tabCollectionViewModel: tabCollectionVM, - emailManager: emailManager, - privacyPreferences: privacyPreferences, - duckPlayerPreferences: duckPlayerPreferences - ) -#endif XCTAssertEqual(vm.visibleFeaturesMatrix, [[]]) } @@ -545,6 +525,27 @@ final class ContinueSetUpModelTests: XCTestCase { return features.chunked(into: HomePage.featuresPerRow) } + private func createMessaging() -> HomePageRemoteMessaging { +#if NETWORK_PROTECTION && DBP + return HomePageRemoteMessaging( + networkProtectionRemoteMessaging: MockNetworkProtectionRemoteMessaging(), + networkProtectionUserDefaults: userDefaults, + dataBrokerProtectionRemoteMessaging: MockDataBrokerProtectionRemoteMessaging(), + dataBrokerProtectionUserDefaults: userDefaults + ) +#elseif NETWORK_PROTECTION + return HomePageRemoteMessaging( + networkProtectionRemoteMessaging: MockNetworkProtectionRemoteMessaging(), + networkProtectionUserDefaults: userDefaults + ) +#elseif DBP + return HomePageRemoteMessaging( + dataBrokerProtectionRemoteMessaging: MockDataBrokerProtectionRemoteMessaging(), + dataBrokerProtectionUserDefaults: userDefaults + ) +#endif + } + enum SurveyDay { case day0 case day7 @@ -570,19 +571,24 @@ extension HomePage.Models.ContinueSetUpModel { manager.privacyConfig = privacyConfig #if NETWORK_PROTECTION && DBP - return HomePage.Models.ContinueSetUpModel( - defaultBrowserProvider: defaultBrowserProvider, - dataImportProvider: dataImportProvider, - tabCollectionViewModel: TabCollectionViewModel(), - emailManager: emailManager, - privacyPreferences: privacyPreferences, - duckPlayerPreferences: duckPlayerPreferences, + let messaging = HomePageRemoteMessaging( networkProtectionRemoteMessaging: MockNetworkProtectionRemoteMessaging(), - dataBrokerProtectionRemoteMessaging: MockDataBrokerProtectionRemoteMessaging(), networkProtectionUserDefaults: appGroupUserDefaults, - dataBrokerProtectionUserDefaults: appGroupUserDefaults, - privacyConfigurationManager: manager) -#else + dataBrokerProtectionRemoteMessaging: MockDataBrokerProtectionRemoteMessaging(), + dataBrokerProtectionUserDefaults: appGroupUserDefaults + ) +#elseif NETWORK_PROTECTION + let messaging = HomePageRemoteMessaging( + networkProtectionRemoteMessaging: MockNetworkProtectionRemoteMessaging(), + networkProtectionUserDefaults: appGroupUserDefaults + ) +#elseif DBP + let messaging = HomePageRemoteMessaging( + dataBrokerProtectionRemoteMessaging: MockDataBrokerProtectionRemoteMessaging(), + dataBrokerProtectionUserDefaults: appGroupUserDefaults + ) +#endif + return HomePage.Models.ContinueSetUpModel( defaultBrowserProvider: defaultBrowserProvider, dataImportProvider: dataImportProvider, @@ -590,7 +596,7 @@ extension HomePage.Models.ContinueSetUpModel { emailManager: emailManager, privacyPreferences: privacyPreferences, duckPlayerPreferences: duckPlayerPreferences, + homePageRemoteMessaging: messaging, privacyConfigurationManager: manager) -#endif } } diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 77ccd14744..6725154913 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -57,6 +57,25 @@ platform :mac do upload_to_testflight(options.merge({api_key: get_api_key})) end + # Makes App Store Review build and uploads it to TestFlight without managing App Store listing. + # + # @option [String] username (default: nil) Your DDG Apple ID. Pass it to not be asked + # for it a couple of times during the process. + # + desc 'Makes App Store release build and uploads it to TestFlight' + lane :release_testflight_review do |options| + build_review(options) + + upload_to_testflight( + options.merge( + { + api_key: get_api_key, + app_identifier: "com.duckduckgo.mobile.ios.review" + } + ) + ) + end + # Makes App Store release build, uploads it to TestFlight, and prepares App Store listing for submission. # # - it first uploads just the build, and only then attempts uploading metadata. @@ -334,6 +353,19 @@ platform :mac do ) end + # Builds the App Store review version of the app. + # + private_lane :build_review do |options| + sync_signing(options) + + build_app( + export_method: "app-store", + scheme: "Product Review Release App Store", + export_options: "scripts/assets/AppStoreExportOptions.plist", + xcargs: "-skipPackagePluginValidation" + ) + end + # Ensures that the local repository is in good shape for the release: # # - Checks out the default branch diff --git a/fastlane/Matchfile b/fastlane/Matchfile index 33a7ab50ae..8dbddfccb8 100644 --- a/fastlane/Matchfile +++ b/fastlane/Matchfile @@ -4,7 +4,17 @@ git_branch "macos" platform "macos" type "appstore" -app_identifier "com.duckduckgo.mobile.ios" +app_identifier [ + "com.duckduckgo.mobile.ios", + "com.duckduckgo.mobile.ios.vpn.agent", + "com.duckduckgo.mobile.ios.vpn.agent.network-protection-extension", + "com.duckduckgo.mobile.ios.review", + "com.duckduckgo.mobile.ios.vpn.agent.review", + "com.duckduckgo.mobile.ios.vpn.agent.review.network-protection-extension", + "com.duckduckgo.mobile.ios.DBP.backgroundAgent.review", + "com.duckduckgo.mobile.ios.DBP.backgroundAgent" + +] additional_cert_types ["mac_installer_distribution"] generate_apple_certs false diff --git a/fastlane/README.md b/fastlane/README.md index 13752cbc3f..40b651beaa 100644 --- a/fastlane/README.md +++ b/fastlane/README.md @@ -31,6 +31,14 @@ Fetches and updates certificates and provisioning profiles for App Store distrib Makes App Store release build and uploads it to TestFlight +### mac release_testflight_review + +```sh +[bundle exec] fastlane mac release_testflight_review +``` + +Makes App Store release build and uploads it to TestFlight + ### mac release_appstore ```sh diff --git a/scripts/archive.sh b/scripts/archive.sh index 38ddb80c05..19fd0285a1 100755 --- a/scripts/archive.sh +++ b/scripts/archive.sh @@ -15,7 +15,7 @@ print_usage_and_exit() { cat <<- EOF Usage: - $ $(basename "$0") [-a ] [-d] [-s] [-r] [-v ] + $ $(basename "$0") [-a ] [-d] [-s] [-r] [-v ] Options: -a Update Asana task after building the app (implies -d) @@ -25,6 +25,8 @@ print_usage_and_exit() { -s Skip xcodebuild output in logs -v Override app version with (does not update Xcode project) + This script is only meant for building notarized apps. For making App Store builds, use fastlane. + To clear keychain entries: $ $(basename "$0") clear-keychain @@ -49,16 +51,6 @@ read_command_line_arguments() { scheme="DuckDuckGo Privacy Browser" configuration="Release" ;; - review-sandbox) - app_name="DuckDuckGo App Store Review" - scheme="Product Review Release App Store" - configuration="Review" - ;; - release-sandbox) - app_name="DuckDuckGo" - scheme="DuckDuckGo Privacy Browser App Store" - configuration="Release" - ;; dbp) app_name="DuckDuckGoDBP" scheme="DuckDuckGo DBP" diff --git a/scripts/assets/AppStoreExportOptions.plist b/scripts/assets/AppStoreExportOptions.plist index 4bc400142f..b9395f914a 100644 --- a/scripts/assets/AppStoreExportOptions.plist +++ b/scripts/assets/AppStoreExportOptions.plist @@ -10,6 +10,21 @@ com.duckduckgo.mobile.ios match AppStore com.duckduckgo.mobile.ios macos + com.duckduckgo.mobile.ios.vpn.agent + match AppStore com.duckduckgo.mobile.ios.vpn.agent macos + com.duckduckgo.mobile.ios.vpn.agent.network-protection-extension + match AppStore com.duckduckgo.mobile.ios.vpn.agent.network-protection-extension macos + com.duckduckgo.mobile.ios.review + match AppStore com.duckduckgo.mobile.ios.review macos + com.duckduckgo.mobile.ios.vpn.agent.review + match AppStore com.duckduckgo.mobile.ios.vpn.agent.review macos + com.duckduckgo.mobile.ios.vpn.agent.review.network-protection-extension + match AppStore com.duckduckgo.mobile.ios.vpn.agent.review.network-protection-extension macos + com.duckduckgo.mobile.ios.DBP.backgroundAgent + match AppStore com.duckduckgo.mobile.ios.DBP.backgroundAgent macos + com.duckduckgo.mobile.ios.DBP.backgroundAgent.review + match AppStore com.duckduckgo.mobile.ios.DBP.backgroundAgent.review macos +