Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions KeePassiumLib/KeePassiumLib.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -433,10 +433,10 @@
};
7544570225CAE2D50011386C /* XCRemoteSwiftPackageReference "TPInAppReceipt" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/keepassium/TPInAppReceipt";
repositoryURL = "https://github.com/tikhop/TPInAppReceipt";
requirement = {
branch = keepassium;
kind = branch;
kind = upToNextMajorVersion;
minimumVersion = 4.0.2;
};
};
757C51CD29F17D3C008986F4 /* XCRemoteSwiftPackageReference "SwiftDomainParser" */ = {
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

93 changes: 38 additions & 55 deletions KeePassiumLib/KeePassiumLib/premium/IARError+description.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,82 +8,65 @@

import TPInAppReceipt

extension IARError: @retroactive LocalizedError {

extension AppReceiptError: @retroactive LocalizedError {
public var errorDescription: String? {
switch self {
case .initializationFailed(reason: let reason):
return "Initialization failed. \(reason.localizedDescription)"
case .validationFailed(reason: let reason):
return "Validation failed. \(reason.localizedDescription)"
case .purchaseExpired:
return "Purchase expired."
case .receiptRefreshingInProgress:
return "Receipt refreshing in progress."
case .appStoreReceiptNotFound:
return "App Store receipt not found."
case .receiptContentInvalid(let error):
return "Receipt content invalid. \(error.localizedDescription)"
case .receiptPayloadMissingOrInvalid:
return "Receipt payload missing or invalid."
case .decodingFailed(let error):
return "Receipt decoding failed. \(error.localizedDescription)"
}
}
}

extension IARError.ReceiptInitializationFailureReason: @retroactive LocalizedError {

extension ChainVerificationError: @retroactive LocalizedError {
public var errorDescription: String? {
switch self {
case .appStoreReceiptNotFound:
return "App Store receipt not found."
case .pkcs7ParsingError:
return "PKCS7 parsing error."
case .dataIsInvalid:
return "Receipt data is invalid."
case .invalidCertificateData:
return "Invalid certificate data."
case .chainValidationFailed:
return "Certificate chain validation failed."
case .revocationCheckFailed:
return "Certificate revocation check failed."
}
}
}

extension IARError.ValidationFailureReason: @retroactive LocalizedError {

extension SignatureVerificationError: @retroactive LocalizedError {
public var errorDescription: String? {
switch self {
case .hashValidation:
return "Hash validation."
case .signatureValidation(reason: let reason):
return "Signature validation. \(reason.localizedDescription)"
case .bundleIdentifierVerification:
return "Bundle identifier verification."
case .bundleVersionVerification:
return "Bundle version verification."
case .invalidKey:
return "Invalid signature key."
case .invalidSignature:
return "Invalid signature."
}
}
}

extension IARError.SignatureValidationFailureReason: @retroactive LocalizedError {
extension HashVerificationError: @retroactive LocalizedError {
public var errorDescription: String? {
switch self {
case .missingDeviceIdentifier:
return "Missing device identifier."
case .hashMismatch:
return "Receipt hash mismatch."
}
}
}

extension MetaVerificationError: @retroactive LocalizedError {
public var errorDescription: String? {
switch self {
case .appleIncRootCertificateNotFound:
return "Apple Inc root certificate not found."
case .unableToLoadAppleIncRootCertificate:
return "Unable to load Apple Inc root certificate."
case .unableToLoadAppleIncPublicKey:
return "Unable to load Apple Inc public key."
case .unableToLoadiTunesCertificate:
return "Unable to load iTunes certificate."
case .unableToLoadiTunesPublicKey:
return "Unable to load iTunes public key."
case .unableToLoadWorldwideDeveloperCertificate:
return "Unable to load WWDC certificate."
case .unableToLoadAppleIncPublicSecKey:
return "Unable to load Apple Inc public sec key."
case .receiptIsNotSigned:
return "Receipt is not signed."
case .receiptSignedDataNotFound:
return "Receipt signed data not found."
case .receiptDataNotFound:
return "Receipt data not found."
case .signatureNotFound:
return "Signature not found."
case .invalidSignature:
return "Invalid signature."
case .invalidCertificateChainOfTrust:
return "Invalid certificate chain of trust."
case .bundleIdentifierMismatch:
return "Bundle identifier mismatch."
case .versionIdentifierMismatch:
return "Bundle version mismatch."
case .bundleInfoUnavailable:
return "Bundle info unavailable."
}
}
}
14 changes: 7 additions & 7 deletions KeePassiumLib/KeePassiumLib/premium/ReceiptAnalyzer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
// by the Free Software Foundation: https://www.gnu.org/licenses/).
// For commercial licensing, please contact the author.

import TPInAppReceipt
@_spi(Blocking) import TPInAppReceipt

private let dateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
Expand Down Expand Up @@ -158,7 +158,7 @@ class ReceiptAnalyzer {

static func logPurchaseHistory() {
do {
let receipt = try InAppReceipt.localReceipt()
let receipt = try AppReceipt.local_blocking
guard receipt.hasPurchases else {
Diag.debug("No previous purchases found.")
return
Expand Down Expand Up @@ -201,7 +201,7 @@ class ReceiptAnalyzer {
}

do {
let receipt = try InAppReceipt.localReceipt()
let receipt = try AppReceipt.local_blocking
guard receipt.hasPurchases else {
return PurchaseHistory.empty
}
Expand All @@ -223,7 +223,7 @@ class ReceiptAnalyzer {


private func processLifetimePurchases(
_ receipt: InAppReceipt,
_ receipt: AppReceipt,
_ purchaseHistory: inout PurchaseHistory
) {
for lifetimeProduct in InAppProduct.allForever {
Expand All @@ -246,7 +246,7 @@ class ReceiptAnalyzer {


private func processVersionPurchases(
_ receipt: InAppReceipt,
_ receipt: AppReceipt,
_ purchaseHistory: inout PurchaseHistory
) {
guard let purchasedVersion = getLatestPurchasedVersion(receipt) else {
Expand Down Expand Up @@ -293,7 +293,7 @@ class ReceiptAnalyzer {
}
}

private func getLatestPurchasedVersion(_ receipt: InAppReceipt) -> InAppPurchase? {
private func getLatestPurchasedVersion(_ receipt: AppReceipt) -> InAppPurchase? {
let versionPurchases = receipt.purchases.filter { purchase in
guard purchase.cancellationDate == nil else { return false }
guard let product = InAppProduct(rawValue: purchase.productIdentifier) else {
Expand All @@ -310,7 +310,7 @@ class ReceiptAnalyzer {


private func processSubscriptionPurchases(
_ receipt: InAppReceipt,
_ receipt: AppReceipt,
_ purchaseHistory: inout PurchaseHistory
) {
purchaseHistory.containsTrial = receipt.autoRenewablePurchases.contains {
Expand Down