[AltStoreCore] Adds Source.isRecommended

Also replaces legacy “Trusted Sources” references with “Recommended Sources”
This commit is contained in:
Riley Testut
2023-10-16 18:18:06 -05:00
parent 24334f88ce
commit ff46fb38b9
5 changed files with 30 additions and 18 deletions

View File

@@ -390,7 +390,6 @@
D586D39B28EF58B0000E101F /* AltTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D586D39A28EF58B0000E101F /* AltTests.swift */; }; D586D39B28EF58B0000E101F /* AltTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D586D39A28EF58B0000E101F /* AltTests.swift */; };
D58916FE28C7C55C00E39C8B /* LoggedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D58916FD28C7C55C00E39C8B /* LoggedError.swift */; }; D58916FE28C7C55C00E39C8B /* LoggedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D58916FD28C7C55C00E39C8B /* LoggedError.swift */; };
D5893F802A1419E800E767CD /* NSManagedObjectContext+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5893F7E2A14183200E767CD /* NSManagedObjectContext+Conveniences.swift */; }; D5893F802A1419E800E767CD /* NSManagedObjectContext+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5893F7E2A14183200E767CD /* NSManagedObjectContext+Conveniences.swift */; };
D5893F822A141E4900E767CD /* KnownSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5893F812A141E4900E767CD /* KnownSource.swift */; };
D58D5F2E26DFE68E00E55E38 /* LaunchAtLogin in Frameworks */ = {isa = PBXBuildFile; productRef = D58D5F2D26DFE68E00E55E38 /* LaunchAtLogin */; }; D58D5F2E26DFE68E00E55E38 /* LaunchAtLogin in Frameworks */ = {isa = PBXBuildFile; productRef = D58D5F2D26DFE68E00E55E38 /* LaunchAtLogin */; };
D59162AB29BA60A9005CBF47 /* SourceHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59162AA29BA60A9005CBF47 /* SourceHeaderView.swift */; }; D59162AB29BA60A9005CBF47 /* SourceHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59162AA29BA60A9005CBF47 /* SourceHeaderView.swift */; };
D59162AD29BA616A005CBF47 /* SourceHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D59162AC29BA616A005CBF47 /* SourceHeaderView.xib */; }; D59162AD29BA616A005CBF47 /* SourceHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D59162AC29BA616A005CBF47 /* SourceHeaderView.xib */; };
@@ -435,6 +434,7 @@
D5F5AF7D28ECEA990067C736 /* ErrorDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F5AF7C28ECEA990067C736 /* ErrorDetailsViewController.swift */; }; D5F5AF7D28ECEA990067C736 /* ErrorDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F5AF7C28ECEA990067C736 /* ErrorDetailsViewController.swift */; };
D5F99A1828D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */; }; D5F99A1828D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */; };
D5F99A1A28D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */; }; D5F99A1A28D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */; };
D5FB28EE2ADDF89800A1C337 /* KnownSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5893F812A141E4900E767CD /* KnownSource.swift */; };
D5FB7A0E2AA25A4E00EF863D /* Previews.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D5FB7A0D2AA25A4E00EF863D /* Previews.xcassets */; }; D5FB7A0E2AA25A4E00EF863D /* Previews.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D5FB7A0D2AA25A4E00EF863D /* Previews.xcassets */; };
D5FB7A212AA284ED00EF863D /* EnableJIT.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1A2AA284ED00EF863D /* EnableJIT.swift */; }; D5FB7A212AA284ED00EF863D /* EnableJIT.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1A2AA284ED00EF863D /* EnableJIT.swift */; };
D5FB7A242AA284ED00EF863D /* Logger+AltJIT.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1D2AA284ED00EF863D /* Logger+AltJIT.swift */; }; D5FB7A242AA284ED00EF863D /* Logger+AltJIT.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1D2AA284ED00EF863D /* Logger+AltJIT.swift */; };
@@ -1231,7 +1231,6 @@
BF41B807233433C100C593A3 /* LoadingState.swift */, BF41B807233433C100C593A3 /* LoadingState.swift */,
D5DAE0932804B0B80034D8D4 /* ScreenshotProcessor.swift */, D5DAE0932804B0B80034D8D4 /* ScreenshotProcessor.swift */,
D5A2193329B14F94002229FC /* DeprecatedAPIs.swift */, D5A2193329B14F94002229FC /* DeprecatedAPIs.swift */,
D5893F812A141E4900E767CD /* KnownSource.swift */,
); );
path = Types; path = Types;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -1474,6 +1473,7 @@
children = ( children = (
BFB39B5B252BC10E00D1BE50 /* Managed.swift */, BFB39B5B252BC10E00D1BE50 /* Managed.swift */,
D5F48B4929CD0B67002B52A4 /* AsyncManaged.swift */, D5F48B4929CD0B67002B52A4 /* AsyncManaged.swift */,
D5893F812A141E4900E767CD /* KnownSource.swift */,
BF66EE8E2501AEBC007EE018 /* ALTAppPermissions.h */, BF66EE8E2501AEBC007EE018 /* ALTAppPermissions.h */,
BF66EE912501AEBC007EE018 /* ALTAppPermissions.m */, BF66EE912501AEBC007EE018 /* ALTAppPermissions.m */,
BF66EE922501AEBC007EE018 /* ALTPatreonBenefitType.h */, BF66EE922501AEBC007EE018 /* ALTPatreonBenefitType.h */,
@@ -2989,6 +2989,7 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
D5FB28EE2ADDF89800A1C337 /* KnownSource.swift in Sources */,
BF66EED32501AECA007EE018 /* AltStore2ToAltStore3.xcmappingmodel in Sources */, BF66EED32501AECA007EE018 /* AltStore2ToAltStore3.xcmappingmodel in Sources */,
BF66EEA52501AEC5007EE018 /* Benefit.swift in Sources */, BF66EEA52501AEC5007EE018 /* Benefit.swift in Sources */,
BF66EED22501AECA007EE018 /* AltStore4ToAltStore5.xcmappingmodel in Sources */, BF66EED22501AECA007EE018 /* AltStore4ToAltStore5.xcmappingmodel in Sources */,
@@ -3098,7 +3099,6 @@
D540E93828EE1BDE000F1B0F /* ErrorDetailsViewController.swift in Sources */, D540E93828EE1BDE000F1B0F /* ErrorDetailsViewController.swift in Sources */,
D513F6162A12CE4E0061EAA1 /* SourceError.swift in Sources */, D513F6162A12CE4E0061EAA1 /* SourceError.swift in Sources */,
BF56D2AC23DF8E170006506D /* FetchAppIDsOperation.swift in Sources */, BF56D2AC23DF8E170006506D /* FetchAppIDsOperation.swift in Sources */,
D5893F822A141E4900E767CD /* KnownSource.swift in Sources */,
BFC1F38D22AEE3A4003AC21A /* DownloadAppOperation.swift in Sources */, BFC1F38D22AEE3A4003AC21A /* DownloadAppOperation.swift in Sources */,
BFE6073A231ADF82002B0E8E /* SettingsViewController.swift in Sources */, BFE6073A231ADF82002B0E8E /* SettingsViewController.swift in Sources */,
D57F2C9126E0070200B9FA39 /* EnableJITOperation.swift in Sources */, D57F2C9126E0070200B9FA39 /* EnableJITOperation.swift in Sources */,

View File

@@ -8,6 +8,8 @@
import Foundation import Foundation
import AltStoreCore
private extension URL private extension URL
{ {
#if STAGING #if STAGING
@@ -66,7 +68,7 @@ class UpdateKnownSourcesOperation: ResultOperation<([KnownSource], [KnownSource]
let sources = (trusted: response.trusted ?? [], blocked: response.blocked ?? []) let sources = (trusted: response.trusted ?? [], blocked: response.blocked ?? [])
// Cache sources // Cache sources
UserDefaults.shared.trustedSources = sources.trusted UserDefaults.shared.recommendedSources = sources.trusted
UserDefaults.shared.blockedSources = sources.blocked UserDefaults.shared.blockedSources = sources.blocked
self.finish(.success(sources)) self.finish(.success(sources))

View File

@@ -94,11 +94,11 @@ class VerifyAppOperation: ResultOperation<Void>
throw error throw error
#endif #endif
if let trustedSources = UserDefaults.shared.trustedSources, let sourceID = await self.context.$appVersion.sourceID if let recommendedSources = UserDefaults.shared.recommendedSources, let sourceID = await self.context.$appVersion.sourceID
{ {
let isTrusted = trustedSources.contains { $0.identifier == sourceID } let isRecommended = recommendedSources.contains { $0.identifier == sourceID }
guard !isTrusted else { guard !isRecommended else {
// Don't enforce permission checking for Trusted Sources while 2.0 is in beta. // Don't enforce permission checking for Recommended Sources while 2.0 is in beta.
return self.finish(.success(())) return self.finish(.success(()))
} }
} }

View File

@@ -236,6 +236,16 @@ public extension Source
return isAdded return isAdded
} }
} }
var isRecommended: Bool {
guard let recommendedSources = UserDefaults.shared.recommendedSources else { return false }
// TODO: Support alternate URLs
let isRecommended = recommendedSources.contains { source in
return source.identifier == self.identifier || source.sourceURL?.absoluteString.lowercased() == self.sourceURL.absoluteString
}
return isRecommended
}
} }
internal extension Source internal extension Source

View File

@@ -8,11 +8,11 @@
import Foundation import Foundation
struct KnownSource: Decodable public struct KnownSource: Decodable
{ {
var identifier: String public var identifier: String
var sourceURL: URL? public var sourceURL: URL?
var bundleIDs: [String]? public var bundleIDs: [String]?
} }
private extension KnownSource private extension KnownSource
@@ -42,19 +42,19 @@ private extension KnownSource
} }
} }
extension UserDefaults public extension UserDefaults
{ {
// Cache trusted sources just in case we need to check whether source is trusted or not. // Cache recommended sources just in case we need to check whether source is recommended or not.
@nonobjc var trustedSources: [KnownSource]? { @nonobjc var recommendedSources: [KnownSource]? {
get { get {
guard let sources = _trustedSources?.compactMap({ KnownSource(dictionary: $0) }) else { return nil } guard let sources = _recommendedSources?.compactMap({ KnownSource(dictionary: $0) }) else { return nil }
return sources return sources
} }
set { set {
_trustedSources = newValue?.map { $0.dictionaryRepresentation } _recommendedSources = newValue?.map { $0.dictionaryRepresentation }
} }
} }
@NSManaged @objc(trustedSources) private var _trustedSources: [[String: Any]]? @NSManaged @objc(recommendedSources) private var _recommendedSources: [[String: Any]]?
@nonobjc var blockedSources: [KnownSource]? { @nonobjc var blockedSources: [KnownSource]? {
get { get {