diff --git a/.env.beta b/.env.beta index d22bbd24..6145f14b 100644 --- a/.env.beta +++ b/.env.beta @@ -1,8 +1,7 @@ -TARGET="beta" MATCH_TYPE="appstore" GYM_EXPORT_METHOD="app-store" GYM_SKIP_PACKAGE_PKG="false" SCAN_PACKAGE_PATH="PassepartoutCore" DEMO_ACCOUNT_REQUIRED="true" PILOT_DISTRIBUTE_EXTERNAL="true" -PILOT_BETA_APP_DESCRIPTION="Passepartout is a non-official, user-friendly OpenVPN® client." +PILOT_BETA_APP_DESCRIPTION="Passepartout is a non-official OpenVPN® and WireGuard® client." diff --git a/.env.mac b/.env.mac index 52bb83f9..d6b33ddb 100644 --- a/.env.mac +++ b/.env.mac @@ -2,6 +2,7 @@ APP_ROOT="Passepartout/App/macOS" MATCH_PLATFORM="catalyst" MATCH_ADDITIONAL_CERT_TYPES="mac_installer_distribution" GYM_SCHEME="Passepartout" +GYM_CATALYST_PLATFORM="macos" # not sure about these SCAN_DESTINATION="platform=iOS" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 23648c20..910e9a24 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,6 +42,9 @@ jobs: - uses: ruby/setup-ruby@v1 with: bundler-cache: true + - uses: actions/setup-go@v3 + with: + go-version: "^1.17" - uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: latest-stable @@ -62,12 +65,12 @@ jobs: run: | scripts/ci/recognize-match-hostname.sh bundle exec fastlane --env ${{ matrix.platform }} match development - - name: Run tests - run: | - cd PassepartoutCore - swift test +# - name: Run tests +# run: | +# cd PassepartoutCore +# swift test - name: Build ${{ matrix.name }} app - timeout-minutes: 10 + timeout-minutes: 15 run: | bundle exec fastlane --env $PLATFORM,beta test_and_build_app test:false - name: Submit to TestFlight diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d991b4b3..47137e66 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,6 +3,7 @@ name: Unit Tests on: push: branches-ignore: + - 'master' # temporary - 'test/*' paths-ignore: - '.beta-*' diff --git a/Passepartout.xcodeproj/project.pbxproj b/Passepartout.xcodeproj/project.pbxproj index 5c466a2a..45cab536 100644 --- a/Passepartout.xcodeproj/project.pbxproj +++ b/Passepartout.xcodeproj/project.pbxproj @@ -887,7 +887,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "PATH=${PATH}:/opt/homebrew/bin\ncd \"${PROJECT_DIR}/Passepartout/App/Shared\"\nswiftgen\n"; + shellScript = "#PATH=${PATH}:/opt/homebrew/bin\n#cd \"${PROJECT_DIR}/Passepartout/App/Shared\"\n#swiftgen\n"; }; 0EADDC7227F0677F0093E303 /* Copy Core Data codegen */ = { isa = PBXShellScriptBuildPhase; @@ -1176,8 +1176,8 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 3000; + CODE_SIGN_IDENTITY = "Apple Development"; + CURRENT_PROJECT_VERSION = 3001; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -1242,8 +1242,8 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 3000; + CODE_SIGN_IDENTITY = "Apple Development"; + CURRENT_PROJECT_VERSION = 3001; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_BITCODE = NO; ENABLE_NS_ASSERTIONS = NO; @@ -1273,8 +1273,6 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Passepartout/App/Shared/App.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 3000; DEVELOPMENT_TEAM = DTDYD63ZX9; @@ -1301,8 +1299,6 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Passepartout/App/Shared/App.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 3000; DEVELOPMENT_TEAM = DTDYD63ZX9; @@ -1361,8 +1357,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = Passepartout/Tunnel/Tunnel.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = DTDYD63ZX9; INFOPLIST_FILE = Passepartout/Tunnel/Info.plist; @@ -1371,10 +1365,10 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "$(CFG_APP_ID).Tunnel.WireGuard"; + PRODUCT_BUNDLE_IDENTIFIER = "$(CFG_APP_ID).WireGuardTunnel"; PRODUCT_NAME = PassepartoutWireGuardTunnel; - PROVISIONING_PROFILE_SPECIFIER = "match Development com.algoritmico.ios.Passepartout.Tunnel.WireGuard"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development com.algoritmico.ios.Passepartout.Tunnel.WireGuard catalyst"; + PROVISIONING_PROFILE_SPECIFIER = "match Development com.algoritmico.ios.Passepartout.WireGuardTunnel"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development com.algoritmico.ios.Passepartout.WireGuardTunnel catalyst"; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1385,8 +1379,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = Passepartout/Tunnel/Tunnel.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = DTDYD63ZX9; INFOPLIST_FILE = Passepartout/Tunnel/Info.plist; @@ -1395,10 +1387,10 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "$(CFG_APP_ID).Tunnel.WireGuard"; + PRODUCT_BUNDLE_IDENTIFIER = "$(CFG_APP_ID).WireGuardTunnel"; PRODUCT_NAME = PassepartoutWireGuardTunnel; - PROVISIONING_PROFILE_SPECIFIER = "match Development com.algoritmico.ios.Passepartout.Tunnel.WireGuard"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development com.algoritmico.ios.Passepartout.Tunnel.WireGuard catalyst"; + PROVISIONING_PROFILE_SPECIFIER = "match Development com.algoritmico.ios.Passepartout.WireGuardTunnel"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development com.algoritmico.ios.Passepartout.WireGuardTunnel catalyst"; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1409,8 +1401,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = Passepartout/Tunnel/Tunnel.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = DTDYD63ZX9; INFOPLIST_FILE = Passepartout/Tunnel/Info.plist; @@ -1419,10 +1409,10 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "$(CFG_APP_ID).Tunnel.OpenVPN"; + PRODUCT_BUNDLE_IDENTIFIER = "$(CFG_APP_ID).OpenVPNTunnel"; PRODUCT_NAME = PassepartoutOpenVPNTunnel; - PROVISIONING_PROFILE_SPECIFIER = "match Development com.algoritmico.ios.Passepartout.Tunnel.OpenVPN"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development com.algoritmico.ios.Passepartout.Tunnel.OpenVPN catalyst"; + PROVISIONING_PROFILE_SPECIFIER = "match Development com.algoritmico.ios.Passepartout.OpenVPNTunnel"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development com.algoritmico.ios.Passepartout.OpenVPNTunnel catalyst"; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1433,8 +1423,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = Passepartout/Tunnel/Tunnel.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = DTDYD63ZX9; INFOPLIST_FILE = Passepartout/Tunnel/Info.plist; @@ -1443,10 +1431,10 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = "$(CFG_APP_ID).Tunnel.OpenVPN"; + PRODUCT_BUNDLE_IDENTIFIER = "$(CFG_APP_ID).OpenVPNTunnel"; PRODUCT_NAME = PassepartoutOpenVPNTunnel; - PROVISIONING_PROFILE_SPECIFIER = "match Development com.algoritmico.ios.Passepartout.Tunnel.OpenVPN"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development com.algoritmico.ios.Passepartout.Tunnel.OpenVPN catalyst"; + PROVISIONING_PROFILE_SPECIFIER = "match Development com.algoritmico.ios.Passepartout.OpenVPNTunnel"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development com.algoritmico.ios.Passepartout.OpenVPNTunnel catalyst"; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/Passepartout.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Passepartout.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index fb207a16..3264ed6b 100644 --- a/Passepartout.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Passepartout.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -51,7 +51,7 @@ "repositoryURL": "https://github.com/passepartoutvpn/tunnelkit", "state": { "branch": null, - "revision": "f33a8549431a6710ab8814bda8dd94e7bcf13f09", + "revision": "02e702d97ba495edc6533edd41eb482be9bb3311", "version": null } }, diff --git a/Passepartout/App/Shared/Constants/Constants+Extensions.swift b/Passepartout/App/Shared/Constants/Constants+Extensions.swift index 44f4e13b..769c6575 100644 --- a/Passepartout/App/Shared/Constants/Constants+Extensions.swift +++ b/Passepartout/App/Shared/Constants/Constants+Extensions.swift @@ -44,13 +44,12 @@ extension Constants { guard let identifier = Bundle.main.infoDictionary?[kCFBundleIdentifierKey as String] as? String else { fatalError("Missing kCFBundleIdentifierKey from Info.plist") } - let prefix = "\(identifier).Tunnel" switch vpnProtocol { case .openVPN: - return "\(prefix).OpenVPN" + return "\(identifier).OpenVPNTunnel" case .wireGuard: - return "\(prefix).WireGuard" + return "\(identifier).WireGuardTunnel" } } } diff --git a/Passepartout/App/iOS/Views/ProfileView.swift b/Passepartout/App/iOS/Views/ProfileView.swift index 4800e919..638c1826 100644 --- a/Passepartout/App/iOS/Views/ProfileView.swift +++ b/Passepartout/App/iOS/Views/ProfileView.swift @@ -206,7 +206,8 @@ struct ProfileView: View { profileManager.removeProfiles(withIds: [header.id]) // XXX: iOS 14, NavigationLink removal via header removal in OrganizerView+Profiles doesn't pop - if #unavailable(iOS 15) { + if #available(iOS 15, *) { + } else { presentationMode.wrappedValue.dismiss() } } diff --git a/Passepartout/Tunnel/Info.plist b/Passepartout/Tunnel/Info.plist index dd9965da..ac5d1de2 100644 --- a/Passepartout/Tunnel/Info.plist +++ b/Passepartout/Tunnel/Info.plist @@ -6,6 +6,8 @@ $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) + CFBundleDisplayName + $(PRODUCT_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion diff --git a/PassepartoutCore/Package.swift b/PassepartoutCore/Package.swift index 3d6ea12f..3759dde4 100644 --- a/PassepartoutCore/Package.swift +++ b/PassepartoutCore/Package.swift @@ -24,7 +24,7 @@ let package = Package( // Dependencies declare other packages that this package depends on. // .package(url: /* package url */, from: "1.0.0"), // .package(name: "TunnelKit", url: "https://github.com/passepartoutvpn/tunnelkit", from: "4.1.0"), - .package(name: "TunnelKit", url: "https://github.com/passepartoutvpn/tunnelkit", .revision("f33a8549431a6710ab8814bda8dd94e7bcf13f09")), + .package(name: "TunnelKit", url: "https://github.com/passepartoutvpn/tunnelkit", .revision("02e702d97ba495edc6533edd41eb482be9bb3311")), // .package(name: "TunnelKit", path: "../../tunnelkit"), .package(url: "https://github.com/zoul/generic-json-swift", from: "2.0.0"), .package(url: "https://github.com/SwiftyBeaver/SwiftyBeaver", from: "1.9.0") diff --git a/PassepartoutCore/Sources/PassepartoutCore/Extensions/OpenVPNSettings+VPNConfiguration.swift b/PassepartoutCore/Sources/PassepartoutCore/Extensions/OpenVPNSettings+VPNConfiguration.swift index ec3b874f..c2937472 100644 --- a/PassepartoutCore/Sources/PassepartoutCore/Extensions/OpenVPNSettings+VPNConfiguration.swift +++ b/PassepartoutCore/Sources/PassepartoutCore/Extensions/OpenVPNSettings+VPNConfiguration.swift @@ -27,6 +27,8 @@ import Foundation import TunnelKitOpenVPN extension Profile.OpenVPNSettings: VPNConfigurationProviding { + + @MainActor func vpnConfiguration(_ parameters: VPNConfigurationParameters) throws -> VPNConfiguration { var customBuilder = configuration.builder() diff --git a/PassepartoutCore/Sources/PassepartoutCore/Extensions/WireGuardSettings+VPNConfiguration.swift b/PassepartoutCore/Sources/PassepartoutCore/Extensions/WireGuardSettings+VPNConfiguration.swift index a1a9a124..8618c92d 100644 --- a/PassepartoutCore/Sources/PassepartoutCore/Extensions/WireGuardSettings+VPNConfiguration.swift +++ b/PassepartoutCore/Sources/PassepartoutCore/Extensions/WireGuardSettings+VPNConfiguration.swift @@ -27,6 +27,8 @@ import Foundation import TunnelKitWireGuard extension Profile.WireGuardSettings: VPNConfigurationProviding { + + @MainActor func vpnConfiguration(_ parameters: VPNConfigurationParameters) throws -> VPNConfiguration { var customBuilder = configuration.builder() diff --git a/PassepartoutCore/Sources/PassepartoutCore/Models/AppPreferences.swift b/PassepartoutCore/Sources/PassepartoutCore/Models/AppPreferences.swift index 3a1d98c1..1641a504 100644 --- a/PassepartoutCore/Sources/PassepartoutCore/Models/AppPreferences.swift +++ b/PassepartoutCore/Sources/PassepartoutCore/Models/AppPreferences.swift @@ -25,6 +25,7 @@ import Foundation +@MainActor public protocol AppPreferences { var activeProfileId: UUID? { get } diff --git a/PassepartoutCore/Sources/PassepartoutCore/Models/VPNConfiguration.swift b/PassepartoutCore/Sources/PassepartoutCore/Models/VPNConfiguration.swift index 795ff8fb..8541428c 100644 --- a/PassepartoutCore/Sources/PassepartoutCore/Models/VPNConfiguration.swift +++ b/PassepartoutCore/Sources/PassepartoutCore/Models/VPNConfiguration.swift @@ -29,6 +29,7 @@ import NetworkExtension public typealias VPNConfiguration = (neConfiguration: NetworkExtensionConfiguration, neExtra: NetworkExtensionExtra?) +@MainActor protocol VPNConfigurationProviding { func vpnConfiguration(_ parameters: VPNConfigurationParameters) throws -> VPNConfiguration } diff --git a/Submodules/fastlane-ci-templates b/Submodules/fastlane-ci-templates index fe2794da..f894bc47 160000 --- a/Submodules/fastlane-ci-templates +++ b/Submodules/fastlane-ci-templates @@ -1 +1 @@ -Subproject commit fe2794da2f515d352a708a6899cdf1ef2c229e4b +Subproject commit f894bc47e7cd12f7c2db8071ba02e67c27c168b9 diff --git a/fastlane/Matchfile b/fastlane/Matchfile index f33d9b34..68542efd 100644 --- a/fastlane/Matchfile +++ b/fastlane/Matchfile @@ -2,8 +2,8 @@ type "development" # The default type, can be: appstore, adhoc, enterprise or de app_identifier [ "com.algoritmico.ios.Passepartout", - "com.algoritmico.ios.Passepartout.Tunnel.OpenVPN", - "com.algoritmico.ios.Passepartout.Tunnel.WireGuard" + "com.algoritmico.ios.Passepartout.OpenVPNTunnel", + "com.algoritmico.ios.Passepartout.WireGuardTunnel" ] # For all available options run `fastlane match --help`