[AltStoreCore] Refactors core AltStore logic into AltStoreCore framework

AltStoreCore will contain all shared AltStore code between AltStore and any app extensions. Initially, it includes all AltStore model logic.
This commit is contained in:
Riley Testut
2020-09-03 16:39:08 -07:00
parent de925e7fea
commit f1a39e1a1f
149 changed files with 3266 additions and 1792 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -2,14 +2,4 @@
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "ALTAppPermission.h"
#import "ALTPatreonBenefitType.h"
#import "ALTSourceUserInfoKey.h"
#import "NSAttributedString+Markdown.h"
// Shared
#import "ALTConstants.h"
#import "ALTConnection.h"
#import "NSError+ALTServerError.h"
#import "CFNotificationName+AltStore.h"

View File

@@ -8,6 +8,8 @@
import Foundation
import AltStoreCore
import AppCenter
import AppCenterAnalytics
import AppCenterCrashes

View File

@@ -8,6 +8,7 @@
import UIKit
import AltStoreCore
import Roxas
import Nuke

View File

@@ -8,6 +8,7 @@
import UIKit
import AltStoreCore
import Roxas
import Nuke

View File

@@ -8,6 +8,8 @@
import UIKit
import AltStoreCore
class PermissionPopoverViewController: UIViewController
{
var permission: AppPermission!

View File

@@ -8,6 +8,7 @@
import UIKit
import AltStoreCore
import Roxas
class AppIDsViewController: UICollectionViewController

View File

@@ -10,6 +10,7 @@ import UIKit
import UserNotifications
import AVFoundation
import AltStoreCore
import AltSign
import Roxas

View File

@@ -7,8 +7,9 @@
//
import UIKit
import AltSign
import AltStoreCore
import AltSign
import Roxas
class RefreshAltStoreViewController: UIViewController

View File

@@ -8,6 +8,7 @@
import UIKit
import AltStoreCore
import Roxas
import Nuke

View File

@@ -7,6 +7,8 @@
//
import UIKit
import AltStoreCore
import Roxas
class AppBannerView: RSTNibView

View File

@@ -8,6 +8,8 @@
import Roxas
import AltStoreCore
extension TimeInterval
{
static let shortToastViewDuration = 4.0

View File

@@ -8,6 +8,8 @@
import Foundation
import AltStoreCore
extension FileManager
{
var altstoreSharedDirectory: URL? {

View File

@@ -9,6 +9,8 @@
import UIKit
import Roxas
import AltStoreCore
class LaunchViewController: RSTLaunchViewController
{
private var didFinishLaunching = false

View File

@@ -11,8 +11,8 @@ import UIKit
import UserNotifications
import MobileCoreServices
import AltStoreCore
import AltSign
import Roxas
extension AppManager

View File

@@ -9,6 +9,8 @@
import Foundation
import CoreData
import AltStoreCore
extension AppManager
{
struct FetchSourcesError: LocalizedError, CustomNSError

View File

@@ -9,9 +9,9 @@
import UIKit
import MobileCoreServices
import Roxas
import AltStoreCore
import AltSign
import Roxas
import Nuke

View File

@@ -9,6 +9,7 @@
import UIKit
import SafariServices
import AltStoreCore
import Roxas
import Nuke

View File

@@ -10,6 +10,7 @@ import Foundation
import Roxas
import Network
import AltStoreCore
import AltSign
enum AuthenticationError: LocalizedError

View File

@@ -8,6 +8,7 @@
import Foundation
import AltStoreCore
import AltSign
extension BackupAppOperation

View File

@@ -8,6 +8,7 @@
import Foundation
import AltStoreCore
import AltSign
import Roxas

View File

@@ -9,6 +9,7 @@
import Foundation
import Roxas
import AltStoreCore
import AltSign
@objc(DownloadAppOperation)

View File

@@ -8,6 +8,7 @@
import Foundation
import AltStoreCore
import AltSign
import Roxas

View File

@@ -8,6 +8,7 @@
import Foundation
import AltStoreCore
import AltSign
import Roxas

View File

@@ -7,9 +7,10 @@
//
import Foundation
import Roxas
import AltStoreCore
import AltSign
import Roxas
@objc(FetchProvisioningProfilesOperation)
class FetchProvisioningProfilesOperation: ResultOperation<[String: ALTProvisioningProfile]>

View File

@@ -9,6 +9,7 @@
import Foundation
import CoreData
import AltStoreCore
import Roxas
@objc(FetchSourceOperation)
@@ -49,7 +50,7 @@ class FetchSourceOperation: ResultOperation<Source>
{
let (data, _) = try Result((data, response), error).get()
let decoder = JSONDecoder()
let decoder = AltStoreCore.JSONDecoder()
decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
let container = try decoder.singleValueContainer()
let text = try container.decode(String.self)

View File

@@ -9,6 +9,7 @@
import Foundation
import Network
import AltStoreCore
import AltSign
import Roxas

View File

@@ -10,6 +10,7 @@ import Foundation
import CoreData
import Network
import AltStoreCore
import AltSign
class OperationContext

View File

@@ -8,8 +8,8 @@
import Foundation
import AltStoreCore
import AltSign
import Roxas
@objc(RefreshAppOperation)

View File

@@ -9,6 +9,7 @@
import Foundation
import CoreData
import AltStoreCore
import AltSign
class RefreshGroup: NSObject

View File

@@ -8,6 +8,8 @@
import Foundation
import AltStoreCore
@objc(RemoveAppOperation)
class RemoveAppOperation: ResultOperation<InstalledApp>
{

View File

@@ -9,6 +9,7 @@
import Foundation
import Roxas
import AltStoreCore
import AltSign
@objc(ResignAppOperation)

View File

@@ -9,6 +9,8 @@
import Foundation
import Network
import AltStoreCore
@objc(SendAppOperation)
class SendAppOperation: ResultOperation<ServerConnection>
{

View File

@@ -9,6 +9,8 @@
import Foundation
import Network
import AltStoreCore
class ServerConnection
{
var server: Server
@@ -93,7 +95,7 @@ class ServerConnection
{
let data = try self.process(data: data, error: error)
let response = try JSONDecoder().decode(ServerResponse.self, from: data)
let response = try AltStoreCore.JSONDecoder().decode(ServerResponse.self, from: data)
completionHandler(.success(response))
}
catch

View File

@@ -9,6 +9,8 @@
import Foundation
import Network
import AltStoreCore
class ServerManager: NSObject
{
static let shared = ServerManager()

View File

@@ -10,6 +10,7 @@ import UIKit
import SafariServices
import AuthenticationServices
import AltStoreCore
import Roxas
extension PatreonViewController

View File

@@ -8,6 +8,7 @@
import UIKit
import AltStoreCore
import Roxas
@objc(RefreshAttemptTableViewCell)

View File

@@ -10,6 +10,8 @@ import UIKit
import SafariServices
import MessageUI
import AltStoreCore
extension SettingsViewController
{
fileprivate enum Section: Int, CaseIterable

View File

@@ -9,6 +9,7 @@
import UIKit
import CoreData
import AltStoreCore
import Roxas
class SourcesViewController: UICollectionViewController

View File

@@ -0,0 +1,27 @@
//
// AltStoreCore.h
// AltStoreCore
//
// Created by Riley Testut on 9/3/20.
// Copyright © 2020 Riley Testut. All rights reserved.
//
#import <Foundation/Foundation.h>
//! Project version number for AltStoreCore.
FOUNDATION_EXPORT double AltStoreCoreVersionNumber;
//! Project version string for AltStoreCore.
FOUNDATION_EXPORT const unsigned char AltStoreCoreVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <AltStoreCore/PublicHeader.h>
#import <AltStoreCore/ALTAppPermission.h>
#import <AltStoreCore/ALTSourceUserInfoKey.h>
#import <AltStoreCore/ALTPatreonBenefitType.h>
// Shared
#import <AltStoreCore/ALTConstants.h>
#import <AltStoreCore/ALTConnection.h>
#import <AltStoreCore/NSError+ALTServerError.h>
#import <AltStoreCore/CFNotificationName+AltStore.h>

View File

@@ -12,11 +12,11 @@ import KeychainAccess
import AltSign
@propertyWrapper
struct KeychainItem<Value>
public struct KeychainItem<Value>
{
let key: String
public let key: String
var wrappedValue: Value? {
public var wrappedValue: Value? {
get {
switch Value.self
{
@@ -35,50 +35,50 @@ struct KeychainItem<Value>
}
}
init(key: String)
public init(key: String)
{
self.key = key
}
}
class Keychain
public class Keychain
{
static let shared = Keychain()
public static let shared = Keychain()
fileprivate let keychain = KeychainAccess.Keychain(service: "com.rileytestut.AltStore").accessibility(.afterFirstUnlock).synchronizable(true)
@KeychainItem(key: "appleIDEmailAddress")
var appleIDEmailAddress: String?
public var appleIDEmailAddress: String?
@KeychainItem(key: "appleIDPassword")
var appleIDPassword: String?
public var appleIDPassword: String?
@KeychainItem(key: "signingCertificatePrivateKey")
var signingCertificatePrivateKey: Data?
public var signingCertificatePrivateKey: Data?
@KeychainItem(key: "signingCertificateSerialNumber")
var signingCertificateSerialNumber: String?
public var signingCertificateSerialNumber: String?
@KeychainItem(key: "signingCertificate")
var signingCertificate: Data?
public var signingCertificate: Data?
@KeychainItem(key: "signingCertificatePassword")
var signingCertificatePassword: String?
public var signingCertificatePassword: String?
@KeychainItem(key: "patreonAccessToken")
var patreonAccessToken: String?
public var patreonAccessToken: String?
@KeychainItem(key: "patreonRefreshToken")
var patreonRefreshToken: String?
public var patreonRefreshToken: String?
@KeychainItem(key: "patreonCreatorAccessToken")
var patreonCreatorAccessToken: String?
public var patreonCreatorAccessToken: String?
private init()
{
}
func reset()
public func reset()
{
self.appleIDEmailAddress = nil
self.appleIDPassword = nil

View File

@@ -9,7 +9,7 @@
import Foundation
import CoreData
extension CodingUserInfoKey
public extension CodingUserInfoKey
{
static let managedObjectContext = CodingUserInfoKey(rawValue: "managedObjectContext")!
static let sourceURL = CodingUserInfoKey(rawValue: "sourceURL")!
@@ -18,29 +18,29 @@ extension CodingUserInfoKey
public final class JSONDecoder: Foundation.JSONDecoder
{
@DecoderItem(key: .managedObjectContext)
var managedObjectContext: NSManagedObjectContext?
public var managedObjectContext: NSManagedObjectContext?
@DecoderItem(key: .sourceURL)
var sourceURL: URL?
public var sourceURL: URL?
}
extension Decoder
public extension Decoder
{
var managedObjectContext: NSManagedObjectContext? { self.userInfo[.managedObjectContext] as? NSManagedObjectContext }
var sourceURL: URL? { self.userInfo[.sourceURL] as? URL }
}
@propertyWrapper
struct DecoderItem<Value>
public struct DecoderItem<Value>
{
let key: CodingUserInfoKey
public let key: CodingUserInfoKey
var wrappedValue: Value? {
public var wrappedValue: Value? {
get { fatalError("only works on instance properties of classes") }
set { fatalError("only works on instance properties of classes") }
}
init(key: CodingUserInfoKey)
public init(key: CodingUserInfoKey)
{
self.key = key
}

View File

@@ -0,0 +1,17 @@
//
// UIApplication+AppExtension.swift
// DeltaCore
//
// Created by Riley Testut on 6/14/18.
// Copyright © 2018 Riley Testut. All rights reserved.
//
import UIKit
public extension UIApplication
{
// Cannot normally use UIApplication.shared from extensions, so we get around this by calling value(forKey:).
class var alt_shared: UIApplication? {
return UIApplication.value(forKey: "sharedApplication") as? UIApplication
}
}

View File

@@ -8,7 +8,7 @@
import UIKit
extension UIColor
public extension UIColor
{
// Borrowed from https://stackoverflow.com/a/26341062
var hexString: String {

View File

@@ -10,7 +10,7 @@ import Foundation
import Roxas
extension UserDefaults
public extension UserDefaults
{
@NSManaged var firstLaunch: Date?

22
AltStoreCore/Info.plist Normal file
View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
</dict>
</plist>

View File

@@ -12,9 +12,9 @@ import CoreData
import AltSign
@objc(Account)
class Account: NSManagedObject, Fetchable
public class Account: NSManagedObject, Fetchable
{
var localizedName: String {
public var localizedName: String {
var components = PersonNameComponents()
components.givenName = self.firstName
components.familyName = self.lastName
@@ -24,30 +24,30 @@ class Account: NSManagedObject, Fetchable
}
/* Properties */
@NSManaged var appleID: String
@NSManaged var identifier: String
@NSManaged public var appleID: String
@NSManaged public var identifier: String
@NSManaged var firstName: String
@NSManaged var lastName: String
@NSManaged public var firstName: String
@NSManaged public var lastName: String
@NSManaged var isActiveAccount: Bool
@NSManaged public var isActiveAccount: Bool
/* Relationships */
@NSManaged var teams: Set<Team>
@NSManaged public var teams: Set<Team>
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{
super.init(entity: entity, insertInto: context)
}
init(_ account: ALTAccount, context: NSManagedObjectContext)
public init(_ account: ALTAccount, context: NSManagedObjectContext)
{
super.init(entity: Account.entity(), insertInto: context)
self.update(account: account)
}
func update(account: ALTAccount)
public func update(account: ALTAccount)
{
self.appleID = account.appleID
self.identifier = account.identifier
@@ -57,7 +57,7 @@ class Account: NSManagedObject, Fetchable
}
}
extension Account
public extension Account
{
@nonobjc class func fetchRequest() -> NSFetchRequest<Account>
{

View File

@@ -12,24 +12,24 @@ import CoreData
import AltSign
@objc(AppID)
class AppID: NSManagedObject, Fetchable
public class AppID: NSManagedObject, Fetchable
{
/* Properties */
@NSManaged var name: String
@NSManaged var identifier: String
@NSManaged var bundleIdentifier: String
@NSManaged var features: [ALTFeature: Any]
@NSManaged var expirationDate: Date?
@NSManaged public var name: String
@NSManaged public var identifier: String
@NSManaged public var bundleIdentifier: String
@NSManaged public var features: [ALTFeature: Any]
@NSManaged public var expirationDate: Date?
/* Relationships */
@NSManaged private(set) var team: Team?
@NSManaged public private(set) var team: Team?
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{
super.init(entity: entity, insertInto: context)
}
init(_ appID: ALTAppID, team: Team, context: NSManagedObjectContext)
public init(_ appID: ALTAppID, team: Team, context: NSManagedObjectContext)
{
super.init(entity: AppID.entity(), insertInto: context)
@@ -43,7 +43,7 @@ class AppID: NSManagedObject, Fetchable
}
}
extension AppID
public extension AppID
{
@nonobjc class func fetchRequest() -> NSFetchRequest<AppID>
{

View File

@@ -9,7 +9,7 @@
import CoreData
import UIKit
extension ALTAppPermissionType
public extension ALTAppPermissionType
{
var localizedShortName: String? {
switch self
@@ -43,14 +43,14 @@ extension ALTAppPermissionType
}
@objc(AppPermission)
class AppPermission: NSManagedObject, Decodable, Fetchable
public class AppPermission: NSManagedObject, Decodable, Fetchable
{
/* Properties */
@NSManaged var type: ALTAppPermissionType
@NSManaged var usageDescription: String
@NSManaged public var type: ALTAppPermissionType
@NSManaged public var usageDescription: String
/* Relationships */
@NSManaged private(set) var app: StoreApp!
@NSManaged public private(set) var app: StoreApp!
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{
@@ -63,7 +63,7 @@ class AppPermission: NSManagedObject, Decodable, Fetchable
case usageDescription
}
required init(from decoder: Decoder) throws
public required init(from decoder: Decoder) throws
{
guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") }
@@ -89,7 +89,7 @@ class AppPermission: NSManagedObject, Decodable, Fetchable
}
}
extension AppPermission
public extension AppPermission
{
@nonobjc class func fetchRequest() -> NSFetchRequest<AppPermission>
{

View File

@@ -23,7 +23,7 @@ public class DatabaseManager
private init()
{
self.persistentContainer = RSTPersistentContainer(name: "AltStore")
self.persistentContainer = RSTPersistentContainer(name: "AltStore", bundle: Bundle(for: DatabaseManager.self))
self.persistentContainer.preferredMergePolicy = MergePolicy()
}
}
@@ -98,7 +98,7 @@ public extension DatabaseManager
}
}
extension DatabaseManager
public extension DatabaseManager
{
func activeAccount(in context: NSManagedObjectContext = DatabaseManager.shared.viewContext) -> Account?
{

View File

@@ -12,9 +12,9 @@ import CoreData
import AltSign
// Free developer accounts are limited to only 3 active sideloaded apps at a time as of iOS 13.3.1.
let ALTActiveAppsLimit = 3
public let ALTActiveAppsLimit = 3
protocol InstalledAppProtocol: Fetchable
public protocol InstalledAppProtocol: Fetchable
{
var name: String { get }
var bundleIdentifier: String { get }
@@ -27,36 +27,36 @@ protocol InstalledAppProtocol: Fetchable
}
@objc(InstalledApp)
class InstalledApp: NSManagedObject, InstalledAppProtocol
public class InstalledApp: NSManagedObject, InstalledAppProtocol
{
/* Properties */
@NSManaged var name: String
@NSManaged var bundleIdentifier: String
@NSManaged var resignedBundleIdentifier: String
@NSManaged var version: String
@NSManaged public var name: String
@NSManaged public var bundleIdentifier: String
@NSManaged public var resignedBundleIdentifier: String
@NSManaged public var version: String
@NSManaged var refreshedDate: Date
@NSManaged var expirationDate: Date
@NSManaged var installedDate: Date
@NSManaged public var refreshedDate: Date
@NSManaged public var expirationDate: Date
@NSManaged public var installedDate: Date
@NSManaged var isActive: Bool
@NSManaged public var isActive: Bool
@NSManaged var certificateSerialNumber: String?
@NSManaged public var certificateSerialNumber: String?
/* Relationships */
@NSManaged var storeApp: StoreApp?
@NSManaged var team: Team?
@NSManaged var appExtensions: Set<InstalledExtension>
@NSManaged public var storeApp: StoreApp?
@NSManaged public var team: Team?
@NSManaged public var appExtensions: Set<InstalledExtension>
var isSideloaded: Bool {
public var isSideloaded: Bool {
return self.storeApp == nil
}
var appIDCount: Int {
public var appIDCount: Int {
return 1 + self.appExtensions.count
}
var requiredActiveSlots: Int {
public var requiredActiveSlots: Int {
let requiredActiveSlots = UserDefaults.standard.activeAppLimitIncludesExtensions ? self.appIDCount : 1
return requiredActiveSlots
}
@@ -66,7 +66,7 @@ class InstalledApp: NSManagedObject, InstalledAppProtocol
super.init(entity: entity, insertInto: context)
}
init(resignedApp: ALTApplication, originalBundleIdentifier: String, certificateSerialNumber: String?, context: NSManagedObjectContext)
public init(resignedApp: ALTApplication, originalBundleIdentifier: String, certificateSerialNumber: String?, context: NSManagedObjectContext)
{
super.init(entity: InstalledApp.entity(), insertInto: context)
@@ -80,7 +80,7 @@ class InstalledApp: NSManagedObject, InstalledAppProtocol
self.update(resignedApp: resignedApp, certificateSerialNumber: certificateSerialNumber)
}
func update(resignedApp: ALTApplication, certificateSerialNumber: String?)
public func update(resignedApp: ALTApplication, certificateSerialNumber: String?)
{
self.name = resignedApp.name
@@ -95,14 +95,14 @@ class InstalledApp: NSManagedObject, InstalledAppProtocol
}
}
func update(provisioningProfile: ALTProvisioningProfile)
public func update(provisioningProfile: ALTProvisioningProfile)
{
self.refreshedDate = provisioningProfile.creationDate
self.expirationDate = provisioningProfile.expirationDate
}
}
extension InstalledApp
public extension InstalledApp
{
@nonobjc class func fetchRequest() -> NSFetchRequest<InstalledApp>
{
@@ -199,7 +199,7 @@ extension InstalledApp
}
}
extension InstalledApp
public extension InstalledApp
{
var openAppURL: URL {
let openAppURL = URL(string: "altstore-" + self.bundleIdentifier + "://")!
@@ -213,7 +213,7 @@ extension InstalledApp
}
}
extension InstalledApp
public extension InstalledApp
{
class var appsDirectoryURL: URL {
let appsDirectoryURL = FileManager.default.applicationSupportDirectory.appendingPathComponent("Apps")

View File

@@ -12,27 +12,27 @@ import CoreData
import AltSign
@objc(InstalledExtension)
class InstalledExtension: NSManagedObject, InstalledAppProtocol
public class InstalledExtension: NSManagedObject, InstalledAppProtocol
{
/* Properties */
@NSManaged var name: String
@NSManaged var bundleIdentifier: String
@NSManaged var resignedBundleIdentifier: String
@NSManaged var version: String
@NSManaged public var name: String
@NSManaged public var bundleIdentifier: String
@NSManaged public var resignedBundleIdentifier: String
@NSManaged public var version: String
@NSManaged var refreshedDate: Date
@NSManaged var expirationDate: Date
@NSManaged var installedDate: Date
@NSManaged public var refreshedDate: Date
@NSManaged public var expirationDate: Date
@NSManaged public var installedDate: Date
/* Relationships */
@NSManaged var parentApp: InstalledApp?
@NSManaged public var parentApp: InstalledApp?
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{
super.init(entity: entity, insertInto: context)
}
init(resignedAppExtension: ALTApplication, originalBundleIdentifier: String, context: NSManagedObjectContext)
public init(resignedAppExtension: ALTApplication, originalBundleIdentifier: String, context: NSManagedObjectContext)
{
super.init(entity: InstalledExtension.entity(), insertInto: context)
@@ -46,7 +46,7 @@ class InstalledExtension: NSManagedObject, InstalledAppProtocol
self.update(resignedAppExtension: resignedAppExtension)
}
func update(resignedAppExtension: ALTApplication)
public func update(resignedAppExtension: ALTApplication)
{
self.name = resignedAppExtension.name
@@ -59,14 +59,14 @@ class InstalledExtension: NSManagedObject, InstalledAppProtocol
}
}
func update(provisioningProfile: ALTProvisioningProfile)
public func update(provisioningProfile: ALTProvisioningProfile)
{
self.refreshedDate = provisioningProfile.creationDate
self.expirationDate = provisioningProfile.expirationDate
}
}
extension InstalledExtension
public extension InstalledExtension
{
@nonobjc class func fetchRequest() -> NSFetchRequest<InstalledExtension>
{

View File

@@ -10,27 +10,27 @@ import UIKit
import CoreData
@objc(NewsItem)
class NewsItem: NSManagedObject, Decodable, Fetchable
public class NewsItem: NSManagedObject, Decodable, Fetchable
{
/* Properties */
@NSManaged var identifier: String
@NSManaged var date: Date
@NSManaged public var identifier: String
@NSManaged public var date: Date
@NSManaged var title: String
@NSManaged var caption: String
@NSManaged var tintColor: UIColor
@NSManaged var sortIndex: Int32
@NSManaged var isSilent: Bool
@NSManaged public var title: String
@NSManaged public var caption: String
@NSManaged public var tintColor: UIColor
@NSManaged public var sortIndex: Int32
@NSManaged public var isSilent: Bool
@NSManaged var imageURL: URL?
@NSManaged var externalURL: URL?
@NSManaged public var imageURL: URL?
@NSManaged public var externalURL: URL?
@NSManaged var appID: String?
@NSManaged var sourceIdentifier: String?
@NSManaged public var appID: String?
@NSManaged public var sourceIdentifier: String?
/* Relationships */
@NSManaged var storeApp: StoreApp?
@NSManaged var source: Source?
@NSManaged public var storeApp: StoreApp?
@NSManaged public var source: Source?
private enum CodingKeys: String, CodingKey
{
@@ -50,7 +50,7 @@ class NewsItem: NSManagedObject, Decodable, Fetchable
super.init(entity: entity, insertInto: context)
}
required init(from decoder: Decoder) throws
public required init(from decoder: Decoder) throws
{
guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") }
@@ -82,7 +82,7 @@ class NewsItem: NSManagedObject, Decodable, Fetchable
}
}
extension NewsItem
public extension NewsItem
{
@nonobjc class func fetchRequest() -> NSFetchRequest<NewsItem>
{

View File

@@ -30,14 +30,14 @@ extension PatreonAPI
}
@objc(PatreonAccount)
class PatreonAccount: NSManagedObject, Fetchable
public class PatreonAccount: NSManagedObject, Fetchable
{
@NSManaged var identifier: String
@NSManaged public var identifier: String
@NSManaged var name: String
@NSManaged var firstName: String?
@NSManaged public var name: String
@NSManaged public var firstName: String?
@NSManaged var isPatron: Bool
@NSManaged public var isPatron: Bool
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{
@@ -64,7 +64,7 @@ class PatreonAccount: NSManagedObject, Fetchable
}
}
extension PatreonAccount
public extension PatreonAccount
{
@nonobjc class func fetchRequest() -> NSFetchRequest<PatreonAccount>
{

View File

@@ -9,20 +9,20 @@
import CoreData
@objc(RefreshAttempt)
class RefreshAttempt: NSManagedObject, Fetchable
public class RefreshAttempt: NSManagedObject, Fetchable
{
@NSManaged var identifier: String
@NSManaged var date: Date
@NSManaged public var identifier: String
@NSManaged public var date: Date
@NSManaged var isSuccess: Bool
@NSManaged var errorDescription: String?
@NSManaged public var isSuccess: Bool
@NSManaged public var errorDescription: String?
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{
super.init(entity: entity, insertInto: context)
}
init(identifier: String, result: Result<[String: Result<InstalledApp, Error>], Error>, context: NSManagedObjectContext)
public init(identifier: String, result: Result<[String: Result<InstalledApp, Error>], Error>, context: NSManagedObjectContext)
{
super.init(entity: RefreshAttempt.entity(), insertInto: context)
@@ -50,7 +50,7 @@ class RefreshAttempt: NSManagedObject, Fetchable
}
}
extension RefreshAttempt
public extension RefreshAttempt
{
@nonobjc class func fetchRequest() -> NSFetchRequest<RefreshAttempt>
{

View File

@@ -9,11 +9,11 @@
import Foundation
@objc(ALTSecureValueTransformer)
final class SecureValueTransformer: NSSecureUnarchiveFromDataTransformer
public final class SecureValueTransformer: NSSecureUnarchiveFromDataTransformer
{
static let name = NSValueTransformerName(rawValue: "ALTSecureValueTransformer")
public static let name = NSValueTransformerName(rawValue: "ALTSecureValueTransformer")
override static var allowedTopLevelClasses: [AnyClass] {
public override static var allowedTopLevelClasses: [AnyClass] {
let allowedClasses = super.allowedTopLevelClasses + [NSError.self]
return allowedClasses
}

View File

@@ -8,7 +8,7 @@
import CoreData
extension Source
public extension Source
{
#if ALPHA
static let altStoreIdentifier = "com.rileytestut.AltStore.Alpha"
@@ -36,23 +36,23 @@ extension Source
}
@objc(Source)
class Source: NSManagedObject, Fetchable, Decodable
public class Source: NSManagedObject, Fetchable, Decodable
{
/* Properties */
@NSManaged var name: String
@NSManaged var identifier: String
@NSManaged var sourceURL: URL
@NSManaged public var name: String
@NSManaged public var identifier: String
@NSManaged public var sourceURL: URL
@NSManaged var error: NSError?
@NSManaged public var error: NSError?
/* Non-Core Data Properties */
var userInfo: [ALTSourceUserInfoKey: String]?
public var userInfo: [ALTSourceUserInfoKey: String]?
/* Relationships */
@objc(apps) @NSManaged private(set) var _apps: NSOrderedSet
@objc(newsItems) @NSManaged private(set) var _newsItems: NSOrderedSet
@objc(apps) @NSManaged public private(set) var _apps: NSOrderedSet
@objc(newsItems) @NSManaged public private(set) var _newsItems: NSOrderedSet
@nonobjc var apps: [StoreApp] {
@nonobjc public var apps: [StoreApp] {
get {
return self._apps.array as! [StoreApp]
}
@@ -61,7 +61,7 @@ class Source: NSManagedObject, Fetchable, Decodable
}
}
@nonobjc var newsItems: [NewsItem] {
@nonobjc public var newsItems: [NewsItem] {
get {
return self._newsItems.array as! [NewsItem]
}
@@ -85,7 +85,7 @@ class Source: NSManagedObject, Fetchable, Decodable
super.init(entity: entity, insertInto: context)
}
required init(from decoder: Decoder) throws
public required init(from decoder: Decoder) throws
{
guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") }
guard let sourceURL = decoder.sourceURL else { preconditionFailure("Decoder must have non-nil sourceURL.") }
@@ -147,7 +147,7 @@ class Source: NSManagedObject, Fetchable, Decodable
}
}
extension Source
public extension Source
{
@nonobjc class func fetchRequest() -> NSFetchRequest<Source>
{

View File

@@ -12,7 +12,7 @@ import CoreData
import Roxas
import AltSign
extension StoreApp
public extension StoreApp
{
#if ALPHA
static let altstoreAppID = "com.rileytestut.AltStore.Alpha"
@@ -29,40 +29,40 @@ extension StoreApp
}
@objc(StoreApp)
class StoreApp: NSManagedObject, Decodable, Fetchable
public class StoreApp: NSManagedObject, Decodable, Fetchable
{
/* Properties */
@NSManaged private(set) var name: String
@NSManaged private(set) var bundleIdentifier: String
@NSManaged private(set) var subtitle: String?
@NSManaged public private(set) var name: String
@NSManaged public private(set) var bundleIdentifier: String
@NSManaged public private(set) var subtitle: String?
@NSManaged private(set) var developerName: String
@NSManaged private(set) var localizedDescription: String
@NSManaged private(set) var size: Int32
@NSManaged public private(set) var developerName: String
@NSManaged public private(set) var localizedDescription: String
@NSManaged public private(set) var size: Int32
@NSManaged private(set) var iconURL: URL
@NSManaged private(set) var screenshotURLs: [URL]
@NSManaged public private(set) var iconURL: URL
@NSManaged public private(set) var screenshotURLs: [URL]
@NSManaged var version: String
@NSManaged private(set) var versionDate: Date
@NSManaged private(set) var versionDescription: String?
@NSManaged public var version: String
@NSManaged public private(set) var versionDate: Date
@NSManaged public private(set) var versionDescription: String?
@NSManaged private(set) var downloadURL: URL
@NSManaged private(set) var tintColor: UIColor?
@NSManaged private(set) var isBeta: Bool
@NSManaged public private(set) var downloadURL: URL
@NSManaged public private(set) var tintColor: UIColor?
@NSManaged public private(set) var isBeta: Bool
@NSManaged var sourceIdentifier: String?
@NSManaged public var sourceIdentifier: String?
@NSManaged var sortIndex: Int32
@NSManaged public var sortIndex: Int32
/* Relationships */
@NSManaged var installedApp: InstalledApp?
@NSManaged var newsItems: Set<NewsItem>
@NSManaged public var installedApp: InstalledApp?
@NSManaged public var newsItems: Set<NewsItem>
@NSManaged @objc(source) var _source: Source?
@NSManaged @objc(permissions) var _permissions: NSOrderedSet
@NSManaged @objc(source) public var _source: Source?
@NSManaged @objc(permissions) public var _permissions: NSOrderedSet
@nonobjc var source: Source? {
@nonobjc public var source: Source? {
set {
self._source = newValue
self.sourceIdentifier = newValue?.identifier
@@ -72,7 +72,7 @@ class StoreApp: NSManagedObject, Decodable, Fetchable
}
}
@nonobjc var permissions: [AppPermission] {
@nonobjc public var permissions: [AppPermission] {
return self._permissions.array as! [AppPermission]
}
@@ -100,7 +100,7 @@ class StoreApp: NSManagedObject, Decodable, Fetchable
case isBeta = "beta"
}
required init(from decoder: Decoder) throws
public required init(from decoder: Decoder) throws
{
guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") }
@@ -153,7 +153,7 @@ class StoreApp: NSManagedObject, Decodable, Fetchable
}
}
extension StoreApp
public extension StoreApp
{
@nonobjc class func fetchRequest() -> NSFetchRequest<StoreApp>
{

View File

@@ -11,7 +11,7 @@ import CoreData
import AltSign
extension ALTTeamType
public extension ALTTeamType
{
var localizedDescription: String {
switch self
@@ -25,34 +25,34 @@ extension ALTTeamType
}
}
extension Team
public extension Team
{
static let maximumFreeAppIDs = 10
}
@objc(Team)
class Team: NSManagedObject, Fetchable
public class Team: NSManagedObject, Fetchable
{
/* Properties */
@NSManaged var name: String
@NSManaged var identifier: String
@NSManaged var type: ALTTeamType
@NSManaged public var name: String
@NSManaged public var identifier: String
@NSManaged public var type: ALTTeamType
@NSManaged var isActiveTeam: Bool
@NSManaged public var isActiveTeam: Bool
/* Relationships */
@NSManaged private(set) var account: Account!
@NSManaged var installedApps: Set<InstalledApp>
@NSManaged private(set) var appIDs: Set<AppID>
@NSManaged public private(set) var account: Account!
@NSManaged public var installedApps: Set<InstalledApp>
@NSManaged public private(set) var appIDs: Set<AppID>
var altTeam: ALTTeam?
public var altTeam: ALTTeam?
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{
super.init(entity: entity, insertInto: context)
}
init(_ team: ALTTeam, account: Account, context: NSManagedObjectContext)
public init(_ team: ALTTeam, account: Account, context: NSManagedObjectContext)
{
super.init(entity: Team.entity(), insertInto: context)
@@ -61,7 +61,7 @@ class Team: NSManagedObject, Fetchable
self.update(team: team)
}
func update(team: ALTTeam)
public func update(team: ALTTeam)
{
self.altTeam = team
@@ -71,7 +71,7 @@ class Team: NSManagedObject, Fetchable
}
}
extension Team
public extension Team
{
@nonobjc class func fetchRequest() -> NSFetchRequest<Team>
{

View File

@@ -16,9 +16,9 @@ extension PatreonAPI
}
}
struct Benefit: Hashable
public struct Benefit: Hashable
{
var type: ALTPatreonBenefitType
public var type: ALTPatreonBenefitType
init(response: PatreonAPI.BenefitResponse)
{

View File

@@ -16,9 +16,9 @@ extension PatreonAPI
}
}
struct Campaign
public struct Campaign
{
var identifier: String
public var identifier: String
init(response: PatreonAPI.CampaignResponse)
{

View File

@@ -71,11 +71,11 @@ extension PatreonAPI
}
}
class PatreonAPI: NSObject
public class PatreonAPI: NSObject
{
static let shared = PatreonAPI()
public static let shared = PatreonAPI()
var isAuthenticated: Bool {
public var isAuthenticated: Bool {
return Keychain.shared.patreonAccessToken != nil
}
@@ -90,7 +90,7 @@ class PatreonAPI: NSObject
}
}
extension PatreonAPI
public extension PatreonAPI
{
func authenticate(completion: @escaping (Result<PatreonAccount, Swift.Error>) -> Void)
{
@@ -412,8 +412,8 @@ private extension PatreonAPI
@available(iOS 13.0, *)
extension PatreonAPI: ASWebAuthenticationPresentationContextProviding
{
func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor
public func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor
{
return UIApplication.shared.keyWindow ?? UIWindow()
return UIApplication.alt_shared?.keyWindow ?? UIWindow()
}
}

View File

@@ -43,7 +43,7 @@ extension PatreonAPI
extension Patron
{
enum Status: String, Decodable
public enum Status: String, Decodable
{
case active = "active_patron"
case declined = "declined_patron"
@@ -52,14 +52,14 @@ extension Patron
}
}
class Patron
public class Patron
{
var name: String
var identifier: String
public var name: String
public var identifier: String
var status: Status
public var status: Status
var benefits: Set<Benefit> = []
public var benefits: Set<Benefit> = []
init(response: PatreonAPI.PatronResponse)
{

View File

@@ -34,12 +34,12 @@ extension PatreonAPI
}
}
struct Tier
public struct Tier
{
var name: String
var identifier: String
public var name: String
public var identifier: String
var benefits: [Benefit] = []
public var benefits: [Benefit] = []
init(response: PatreonAPI.TierResponse)
{

View File

@@ -9,7 +9,7 @@
import Foundation
import AltSign
protocol AppProtocol
public protocol AppProtocol
{
var name: String { get }
var bundleIdentifier: String { get }
@@ -18,21 +18,21 @@ protocol AppProtocol
extension ALTApplication: AppProtocol
{
var url: URL {
public var url: URL {
return self.fileURL
}
}
extension StoreApp: AppProtocol
{
var url: URL {
public var url: URL {
return self.downloadURL
}
}
extension InstalledApp: AppProtocol
{
var url: URL {
public var url: URL {
return self.fileURL
}
}

View File

@@ -8,13 +8,13 @@
import CoreData
typealias FetchRequest = NSFetchRequest<NSFetchRequestResult>
public typealias FetchRequest = NSFetchRequest<NSFetchRequestResult>
protocol Fetchable: NSManagedObject
public protocol Fetchable: NSManagedObject
{
}
extension Fetchable
public extension Fetchable
{
static func first(satisfying predicate: NSPredicate? = nil, sortedBy sortDescriptors: [NSSortDescriptor]? = nil, in context: NSManagedObjectContext,
requestProperties: [PartialKeyPath<FetchRequest>: Any?] = [:]) -> Self?

14
Podfile
View File

@@ -3,10 +3,9 @@ inhibit_all_warnings!
target 'AltStore' do
platform :ios, '12.0'
use_modular_headers!
use_frameworks!
# Pods for AltStore
pod 'KeychainAccess', '~> 3.2.0'
pod 'Nuke', '~> 7.0'
pod 'AppCenter', '~> 3.1.0'
pod 'Roxas', :path => 'Dependencies/Roxas'
@@ -24,6 +23,17 @@ target 'AltServer' do
end
target 'AltStoreCore' do
platform :ios, '12.0'
use_frameworks!
# Pods for AltServer
pod 'KeychainAccess', '~> 3.2.0'
pod 'Roxas', :path => 'Dependencies/Roxas'
end
target 'AltDaemon' do
platform :ios, '12.0'

View File

@@ -47,6 +47,6 @@ SPEC CHECKSUMS:
Sparkle: 3f75576db8b0265adef36c43249d747f22d0b708
STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68
PODFILE CHECKSUM: 8e139db2a0c0a1d2f4affc7b615b6ca0720633ed
PODFILE CHECKSUM: f76f10e8f2823d859ce9672d0b5d7054a5c24504
COCOAPODS: 1.9.3

View File

@@ -1 +0,0 @@
../../../Target Support Files/KeychainAccess/KeychainAccess-umbrella.h

View File

@@ -1 +0,0 @@
../../../Target Support Files/KeychainAccess/KeychainAccess.modulemap

View File

@@ -1 +0,0 @@
../../../Target Support Files/Nuke/Nuke-umbrella.h

View File

@@ -1 +0,0 @@
../../../Target Support Files/Nuke/Nuke.modulemap

View File

@@ -0,0 +1 @@
../../../Target Support Files/Roxas-library/Roxas-library-umbrella.h

View File

@@ -0,0 +1 @@
../../../Target Support Files/Roxas-library/Roxas-library.modulemap

View File

@@ -1 +0,0 @@
../../../Target Support Files/Roxas/Roxas-umbrella.h

View File

@@ -1 +0,0 @@
../../../Target Support Files/Roxas/Roxas.modulemap

2
Pods/Manifest.lock generated
View File

@@ -47,6 +47,6 @@ SPEC CHECKSUMS:
Sparkle: 3f75576db8b0265adef36c43249d747f22d0b708
STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68
PODFILE CHECKSUM: 8e139db2a0c0a1d2f4affc7b615b6ca0720633ed
PODFILE CHECKSUM: f76f10e8f2823d859ce9672d0b5d7054a5c24504
COCOAPODS: 1.9.3

Some files were not shown because too many files have changed in this diff Show More