Copy release receipt to tunnel (#871)

Not just the provided one, because it could be the sandbox receipt.

Fixes #870 further.
This commit is contained in:
Davide 2024-11-14 19:42:38 +01:00 committed by GitHub
parent 65dfc86653
commit 5818b36cda
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 57 additions and 18 deletions

View File

@ -34,6 +34,7 @@
0EDE56EA2CABE40D0082D21C /* Intents.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0EDE56E62CABE40D0082D21C /* Intents.plist */; }; 0EDE56EA2CABE40D0082D21C /* Intents.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0EDE56E62CABE40D0082D21C /* Intents.plist */; };
0EDE56FA2CABE42E0082D21C /* PassepartoutIntents.appex in Embed ExtensionKit Extensions */ = {isa = PBXBuildFile; fileRef = 0EDE56F02CABE42E0082D21C /* PassepartoutIntents.appex */; platformFilters = (ios, macos, ); settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 0EDE56FA2CABE42E0082D21C /* PassepartoutIntents.appex in Embed ExtensionKit Extensions */ = {isa = PBXBuildFile; fileRef = 0EDE56F02CABE42E0082D21C /* PassepartoutIntents.appex */; platformFilters = (ios, macos, ); settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
0EDE57002CABE4B50082D21C /* IntentsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EDE56E72CABE40D0082D21C /* IntentsExtension.swift */; }; 0EDE57002CABE4B50082D21C /* IntentsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EDE56E72CABE40D0082D21C /* IntentsExtension.swift */; };
0EE254912CE67946007A96F2 /* LegacyV2 in Frameworks */ = {isa = PBXBuildFile; productRef = 0EE254902CE67946007A96F2 /* LegacyV2 */; };
0EE8D7E12CD112C200F6600C /* App+tvOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE8D7E02CD112C200F6600C /* App+tvOS.swift */; }; 0EE8D7E12CD112C200F6600C /* App+tvOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE8D7E02CD112C200F6600C /* App+tvOS.swift */; };
0EF5FE4D2CE53B1C00EC2CD4 /* PassepartoutImplementations in Frameworks */ = {isa = PBXBuildFile; productRef = 0EF5FE4C2CE53B1C00EC2CD4 /* PassepartoutImplementations */; }; 0EF5FE4D2CE53B1C00EC2CD4 /* PassepartoutImplementations in Frameworks */ = {isa = PBXBuildFile; productRef = 0EF5FE4C2CE53B1C00EC2CD4 /* PassepartoutImplementations */; };
0EF5FE4F2CE53BCE00EC2CD4 /* LegacyV2 in Frameworks */ = {isa = PBXBuildFile; productRef = 0EF5FE4E2CE53BCE00EC2CD4 /* LegacyV2 */; }; 0EF5FE4F2CE53BCE00EC2CD4 /* LegacyV2 in Frameworks */ = {isa = PBXBuildFile; productRef = 0EF5FE4E2CE53BCE00EC2CD4 /* LegacyV2 */; };
@ -149,6 +150,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
0EE254912CE67946007A96F2 /* LegacyV2 in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -442,7 +444,6 @@
}; };
0E3FF4AD2CE3AF6F00BFF640 = { 0E3FF4AD2CE3AF6F00BFF640 = {
CreatedOnToolsVersion = 15.4; CreatedOnToolsVersion = 15.4;
TestTargetID = 0E06D18E2B87629100176E1D;
}; };
0E757F0F2CD0CFFC006E13E1 = { 0E757F0F2CD0CFFC006E13E1 = {
CreatedOnToolsVersion = 15.4; CreatedOnToolsVersion = 15.4;
@ -884,26 +885,24 @@
0E3FF4B52CE3AF6F00BFF640 /* Debug */ = { 0E3FF4B52CE3AF6F00BFF640 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALLOW_TARGET_PLATFORM_SPECIALIZATION = NO;
BUNDLE_LOADER = "$(TEST_HOST)";
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.algoritmico.ios.PassepartoutTests; PRODUCT_BUNDLE_IDENTIFIER = com.algoritmico.ios.PassepartoutTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Passepartout.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Passepartout";
}; };
name = Debug; name = Debug;
}; };
0E3FF4B62CE3AF6F00BFF640 /* Release */ = { 0E3FF4B62CE3AF6F00BFF640 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALLOW_TARGET_PLATFORM_SPECIALIZATION = NO;
BUNDLE_LOADER = "$(TEST_HOST)";
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.algoritmico.ios.PassepartoutTests; PRODUCT_BUNDLE_IDENTIFIER = com.algoritmico.ios.PassepartoutTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Passepartout.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Passepartout";
}; };
name = Release; name = Release;
}; };
@ -1148,6 +1147,10 @@
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
productName = TunnelLibrary; productName = TunnelLibrary;
}; };
0EE254902CE67946007A96F2 /* LegacyV2 */ = {
isa = XCSwiftPackageProductDependency;
productName = LegacyV2;
};
0EF5FE4C2CE53B1C00EC2CD4 /* PassepartoutImplementations */ = { 0EF5FE4C2CE53B1C00EC2CD4 /* PassepartoutImplementations */ = {
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
productName = PassepartoutImplementations; productName = PassepartoutImplementations;

View File

@ -0,0 +1,34 @@
//
// Bundle+Extensions.swift
// Passepartout
//
// Created by Davide De Rosa on 11/14/24.
// Copyright (c) 2024 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
import Foundation
extension Bundle {
public var appStoreProductionReceiptURL: URL? {
appStoreReceiptURL?
.deletingLastPathComponent()
.appendingPathComponent("receipt") // could be "sandboxReceipt"
}
}

View File

@ -115,6 +115,18 @@ private extension AppContext {
} }
.store(in: &subscriptions) .store(in: &subscriptions)
// copy release receipt to tunnel for TestFlight eligibility (once is enough, it won't change)
if let appReceiptURL = Bundle.main.appStoreProductionReceiptURL {
let tunnelReceiptURL = BundleConfiguration.urlForAppGroupReceipt
do {
pp_log(.App.iap, .info, "Copy release receipt to tunnel...")
try? FileManager.default.removeItem(at: tunnelReceiptURL)
try FileManager.default.copyItem(at: appReceiptURL, to: tunnelReceiptURL)
} catch {
pp_log(.App.iap, .error, "Unable to copy release receipt to tunnel: \(error)")
}
}
do { do {
pp_log(.app, .notice, "Fetch providers index...") pp_log(.app, .notice, "Fetch providers index...")
try await providerManager.fetchIndex(from: API.shared) try await providerManager.fetchIndex(from: API.shared)
@ -137,6 +149,7 @@ private extension AppContext {
} catch { } catch {
pp_log(.App.profiles, .error, "Unable to re-observe local profiles: \(error)") pp_log(.App.profiles, .error, "Unable to re-observe local profiles: \(error)")
} }
await iapManager.reloadReceipt() await iapManager.reloadReceipt()
} }
await pendingTask?.value await pendingTask?.value

View File

@ -50,17 +50,6 @@ extension IAPManager {
willConnect: { iap, profile in willConnect: { iap, profile in
var builder = profile.builder() var builder = profile.builder()
// copy app receipt URL to tunnel for beta eligibility
if let appReceiptURL = Bundle.main.appStoreReceiptURL {
let tunnelReceiptURL = BundleConfiguration.urlForAppGroupReceipt
do {
try FileManager.default.removeItem(at: tunnelReceiptURL)
try FileManager.default.copyItem(at: appReceiptURL, to: tunnelReceiptURL)
} catch {
pp_log(.App.iap, .error, "Unable to copy receipt URL to tunnel: \(error)")
}
}
// ineligible, suppress on-demand rules // ineligible, suppress on-demand rules
if !iap.isEligible(for: .onDemand) { if !iap.isEligible(for: .onDemand) {
pp_log(.App.iap, .notice, "Ineligible, suppress on-demand rules") pp_log(.App.iap, .notice, "Ineligible, suppress on-demand rules")