From 438fc7cfa0f0afdf2248339eace73bbfa00d7e4b Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Mon, 18 Nov 2019 14:17:57 -0800 Subject: [PATCH] [AltServer] Uses GrandSlam Authentication MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Uses Mail.app plug-in to retrieve the computer’s anisette data, which is necessary for GSA. --- AltPlugin/ALTPluginService.h | 19 ++ AltPlugin/ALTPluginService.m | 99 ++++++++ AltPlugin/Info.plist | 62 +++++ AltServer/AnisetteDataManager.swift | 69 ++++++ AltServer/AppDelegate.swift | 8 +- .../ALTDeviceManager+Installation.swift | 232 +++++++++++++----- AltStore.xcodeproj/project.pbxproj | 149 ++++++++++- .../xcshareddata/xcschemes/AltPlugin.xcscheme | 67 +++++ Dependencies/AltSign | 2 +- 9 files changed, 631 insertions(+), 76 deletions(-) create mode 100644 AltPlugin/ALTPluginService.h create mode 100644 AltPlugin/ALTPluginService.m create mode 100644 AltPlugin/Info.plist create mode 100644 AltServer/AnisetteDataManager.swift create mode 100644 AltStore.xcodeproj/xcshareddata/xcschemes/AltPlugin.xcscheme diff --git a/AltPlugin/ALTPluginService.h b/AltPlugin/ALTPluginService.h new file mode 100644 index 00000000..d0c2fb78 --- /dev/null +++ b/AltPlugin/ALTPluginService.h @@ -0,0 +1,19 @@ +// +// ALTPluginService.h +// AltPlugin +// +// Created by Riley Testut on 11/14/19. +// Copyright © 2019 Riley Testut. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface ALTPluginService : NSObject + ++ (instancetype)sharedService; + +@end + +NS_ASSUME_NONNULL_END diff --git a/AltPlugin/ALTPluginService.m b/AltPlugin/ALTPluginService.m new file mode 100644 index 00000000..003de970 --- /dev/null +++ b/AltPlugin/ALTPluginService.m @@ -0,0 +1,99 @@ +// +// ALTPluginService.m +// AltPlugin +// +// Created by Riley Testut on 11/14/19. +// Copyright © 2019 Riley Testut. All rights reserved. +// + +#import "ALTPluginService.h" + +#import + +#import "ALTAnisetteData.h" + +@import AppKit; + +@interface AKAppleIDSession : NSObject +- (id)appleIDHeadersForRequest:(id)arg1; +@end + +@interface AKDevice ++ (AKDevice *)currentDevice; +- (NSString *)uniqueDeviceIdentifier; +- (NSString *)serialNumber; +- (NSString *)serverFriendlyDescription; +@end + +@interface ALTPluginService () + +@property (nonatomic, readonly) NSISO8601DateFormatter *dateFormatter; + +@end + +@implementation ALTPluginService + ++ (instancetype)sharedService +{ + static ALTPluginService *_service = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _service = [[self alloc] init]; + }); + + return _service; +} + +- (instancetype)init +{ + self = [super init]; + if (self) + { + _dateFormatter = [[NSISO8601DateFormatter alloc] init]; + } + + return self; +} + ++ (void)initialize +{ + [[ALTPluginService sharedService] start]; +} + +- (void)start +{ + dlopen("/System/Library/PrivateFrameworks/AuthKit.framework/AuthKit", RTLD_NOW); + + [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"com.rileytestut.AltServer.FetchAnisetteData" object:nil]; +} + +- (void)receiveNotification:(NSNotification *)notification +{ + NSString *requestUUID = notification.userInfo[@"requestUUID"]; + + NSMutableURLRequest* req = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"https://developerservices2.apple.com/services/QH65B2/listTeams.action?clientId=XABBG36SBA"]]; + [req setHTTPMethod:@"POST"]; + + AKAppleIDSession *session = [[NSClassFromString(@"AKAppleIDSession") alloc] initWithIdentifier:@"com.apple.gs.xcode.auth"]; + NSDictionary *headers = [session appleIDHeadersForRequest:req]; + + AKDevice *device = [NSClassFromString(@"AKDevice") currentDevice]; + NSDate *date = [self.dateFormatter dateFromString:headers[@"X-Apple-I-Client-Time"]]; + + ALTAnisetteData *anisetteData = [[NSClassFromString(@"ALTAnisetteData") alloc] initWithMachineID:headers[@"X-Apple-I-MD-M"] + oneTimePassword:headers[@"X-Apple-I-MD"] + localUserID:headers[@"X-Apple-I-MD-LU"] + routingInfo:[headers[@"X-Apple-I-MD-RINFO"] longLongValue] + deviceUniqueIdentifier:device.uniqueDeviceIdentifier + deviceSerialNumber:device.serialNumber + deviceDescription:device.serverFriendlyDescription + date:date + locale:[NSLocale currentLocale] + timeZone:[NSTimeZone localTimeZone]]; + + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:anisetteData requiringSecureCoding:YES error:nil]; + + [[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"com.rileytestut.AltServer.AnisetteDataResponse" object:nil userInfo:@{@"requestUUID": requestUUID, @"anisetteData": data} deliverImmediately:YES]; +} + +@end diff --git a/AltPlugin/Info.plist b/AltPlugin/Info.plist new file mode 100644 index 00000000..6188d46b --- /dev/null +++ b/AltPlugin/Info.plist @@ -0,0 +1,62 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSHumanReadableCopyright + Copyright © 2019 Riley Testut. All rights reserved. + NSPrincipalClass + ALTPluginService + Supported10.14PluginCompatibilityUUIDs + + # UUIDs for versions from 10.12 to 99.99.99 + # For mail version 10.0 (3226) on OS X Version 10.12 (build 16A319) + 36CCB8BB-2207-455E-89BC-B9D6E47ABB5B + # For mail version 10.1 (3251) on OS X Version 10.12.1 (build 16B2553a) + 9054AFD9-2607-489E-8E63-8B09A749BC61 + # For mail version 10.2 (3259) on OS X Version 10.12.2 (build 16D12b) + 1CD3B36A-0E3B-4A26-8F7E-5BDF96AAC97E + # For mail version 10.3 (3273) on OS X Version 10.12.4 (build 16G1036) + 21560BD9-A3CC-482E-9B99-95B7BF61EDC1 + # For mail version 11.0 (3441.0.1) on OS X Version 10.13 (build 17A315i) + C86CD990-4660-4E36-8CDA-7454DEB2E199 + # For mail version 12.0 (3445.100.39) on OS X Version 10.14.1 (build 18B45d) + A4343FAF-AE18-40D0-8A16-DFAE481AF9C1 + # For mail version 13.0 (3594.4.2) on OS X Version 10.15 (build 19A558d) + 6EEA38FB-1A0B-469B-BB35-4C2E0EEA9053 + + Supported10.15PluginCompatibilityUUIDs + + # UUIDs for versions from 10.12 to 99.99.99 + # For mail version 10.0 (3226) on OS X Version 10.12 (build 16A319) + 36CCB8BB-2207-455E-89BC-B9D6E47ABB5B + # For mail version 10.1 (3251) on OS X Version 10.12.1 (build 16B2553a) + 9054AFD9-2607-489E-8E63-8B09A749BC61 + # For mail version 10.2 (3259) on OS X Version 10.12.2 (build 16D12b) + 1CD3B36A-0E3B-4A26-8F7E-5BDF96AAC97E + # For mail version 10.3 (3273) on OS X Version 10.12.4 (build 16G1036) + 21560BD9-A3CC-482E-9B99-95B7BF61EDC1 + # For mail version 11.0 (3441.0.1) on OS X Version 10.13 (build 17A315i) + C86CD990-4660-4E36-8CDA-7454DEB2E199 + # For mail version 12.0 (3445.100.39) on OS X Version 10.14.1 (build 18B45d) + A4343FAF-AE18-40D0-8A16-DFAE481AF9C1 + # For mail version 13.0 (3594.4.2) on OS X Version 10.15 (build 19A558d) + 6EEA38FB-1A0B-469B-BB35-4C2E0EEA9053 + + + diff --git a/AltServer/AnisetteDataManager.swift b/AltServer/AnisetteDataManager.swift new file mode 100644 index 00000000..c754b3bb --- /dev/null +++ b/AltServer/AnisetteDataManager.swift @@ -0,0 +1,69 @@ +// +// AnisetteDataManager.swift +// AltServer +// +// Created by Riley Testut on 11/16/19. +// Copyright © 2019 Riley Testut. All rights reserved. +// + +import Foundation +import AltKit + +class AnisetteDataManager: NSObject +{ + static let shared = AnisetteDataManager() + + private var anisetteDataCompletionHandlers: [String: (Result) -> Void] = [:] + private var anisetteDataTimers: [String: Timer] = [:] + + private override init() + { + super.init() + + DistributedNotificationCenter.default().addObserver(self, selector: #selector(AnisetteDataManager.handleAnisetteDataResponse(_:)), name: Notification.Name("com.rileytestut.AltServer.AnisetteDataResponse"), object: nil) + } + + func requestAnisetteData(_ completion: @escaping (Result) -> Void) + { + let requestUUID = UUID().uuidString + self.anisetteDataCompletionHandlers[requestUUID] = completion + + let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (timer) in + self.finishRequest(forUUID: requestUUID, result: .failure(ALTServerError(.pluginNotFound))) + } + self.anisetteDataTimers[requestUUID] = timer + + DistributedNotificationCenter.default().postNotificationName(Notification.Name("com.rileytestut.AltServer.FetchAnisetteData"), object: nil, userInfo: ["requestUUID": requestUUID], options: .deliverImmediately) + } +} + +private extension AnisetteDataManager +{ + @objc func handleAnisetteDataResponse(_ notification: Notification) + { + guard let userInfo = notification.userInfo, let requestUUID = userInfo["requestUUID"] as? String else { return } + + if + let archivedAnisetteData = userInfo["anisetteData"] as? Data, + let anisetteData = try? NSKeyedUnarchiver.unarchivedObject(ofClass: ALTAnisetteData.self, from: archivedAnisetteData) + { + self.finishRequest(forUUID: requestUUID, result: .success(anisetteData)) + } + else + { + self.finishRequest(forUUID: requestUUID, result: .failure(ALTServerError(.invalidAnisetteData))) + } + } + + func finishRequest(forUUID requestUUID: String, result: Result) + { + let completionHandler = self.anisetteDataCompletionHandlers[requestUUID] + self.anisetteDataCompletionHandlers[requestUUID] = nil + + let timer = self.anisetteDataTimers[requestUUID] + self.anisetteDataTimers[requestUUID] = nil + + timer?.invalidate() + completionHandler?(result) + } +} diff --git a/AltServer/AppDelegate.swift b/AltServer/AppDelegate.swift index 84b04d9c..0f2468e5 100644 --- a/AltServer/AppDelegate.swift +++ b/AltServer/AppDelegate.swift @@ -100,11 +100,7 @@ private extension AppDelegate let alert = NSAlert() alert.messageText = NSLocalizedString("Please enter your Apple ID and password.", comment: "") - alert.informativeText = NSLocalizedString(""" -Your Apple ID and password are not saved and are only sent to Apple for authentication. - -If you have two-factor authentication enabled, please create an app-specific password for use with AltStore at https://appleid.apple.com. -""", comment: "") + alert.informativeText = NSLocalizedString("Your Apple ID and password are not saved and are only sent to Apple for authentication.", comment: "") let textFieldSize = NSSize(width: 300, height: 22) @@ -157,7 +153,7 @@ If you have two-factor authentication enabled, please create an app-specific pas let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil) UNUserNotificationCenter.current().add(request) - case .failure(InstallError.cancelled): + case .failure(InstallError.cancelled), .failure(ALTAppleAPIError.requiresTwoFactorAuthentication): // Ignore break diff --git a/AltServer/Devices/ALTDeviceManager+Installation.swift b/AltServer/Devices/ALTDeviceManager+Installation.swift index 9a69e8f9..ee043d7f 100644 --- a/AltServer/Devices/ALTDeviceManager+Installation.swift +++ b/AltServer/Devices/ALTDeviceManager+Installation.swift @@ -8,6 +8,7 @@ import Cocoa import UserNotifications +import ObjectiveC #if STAGING private let appURL = URL(string: "https://f000.backblazeb2.com/file/altstore-staging/altstore.ipa")! @@ -55,118 +56,129 @@ extension ALTDeviceManager try? FileManager.default.removeItem(at: destinationDirectoryURL) } - self.authenticate(appleID: appleID, password: password) { (result) in + AnisetteDataManager.shared.requestAnisetteData { (result) in do { - let account = try result.get() + let anisetteData = try result.get() - self.fetchTeam(for: account) { (result) in + self.authenticate(appleID: appleID, password: password, anisetteData: anisetteData) { (result) in do { - let team = try result.get() + let (account, session) = try result.get() - self.register(device, team: team) { (result) in + self.fetchTeam(for: account, session: session) { (result) in do { - let device = try result.get() + let team = try result.get() - self.fetchCertificate(for: team) { (result) in + self.register(device, team: team, session: session) { (result) in do { - let certificate = try result.get() + let device = try result.get() - let content = UNMutableNotificationContent() - content.title = String(format: NSLocalizedString("Installing AltStore to %@...", comment: ""), device.name) - content.body = NSLocalizedString("This may take a few seconds.", comment: "") - - let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil) - UNUserNotificationCenter.current().add(request) - - self.downloadApp { (result) in + self.fetchCertificate(for: team, session: session) { (result) in do { - let fileURL = try result.get() + let certificate = try result.get() - try FileManager.default.createDirectory(at: destinationDirectoryURL, withIntermediateDirectories: true, attributes: nil) + let content = UNMutableNotificationContent() + content.title = String(format: NSLocalizedString("Installing AltStore to %@...", comment: ""), device.name) + content.body = NSLocalizedString("This may take a few seconds.", comment: "") - let appBundleURL = try FileManager.default.unzipAppBundle(at: fileURL, toDirectory: destinationDirectoryURL) + let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil) + UNUserNotificationCenter.current().add(request) - do - { - try FileManager.default.removeItem(at: fileURL) - } - catch - { - print("Failed to remove downloaded .ipa.", error) - } - - guard let application = ALTApplication(fileURL: appBundleURL) else { throw ALTError(.invalidApp) } - - self.registerAppID(name: "AltStore", identifier: "com.rileytestut.AltStore", team: team) { (result) in + self.downloadApp { (result) in do { - let appID = try result.get() + let fileURL = try result.get() - self.updateFeatures(for: appID, app: application, team: team) { (result) in + try FileManager.default.createDirectory(at: destinationDirectoryURL, withIntermediateDirectories: true, attributes: nil) + + let appBundleURL = try FileManager.default.unzipAppBundle(at: fileURL, toDirectory: destinationDirectoryURL) + + do + { + try FileManager.default.removeItem(at: fileURL) + } + catch + { + print("Failed to remove downloaded .ipa.", error) + } + + guard let application = ALTApplication(fileURL: appBundleURL) else { throw ALTError(.invalidApp) } + + self.registerAppID(name: "AltStore", identifier: "com.rileytestut.AltStore", team: team, session: session) { (result) in do { let appID = try result.get() - self.fetchProvisioningProfile(for: appID, team: team) { (result) in + self.updateFeatures(for: appID, app: application, team: team, session: session) { (result) in do { - let provisioningProfile = try result.get() + let appID = try result.get() - self.install(application, to: device, team: team, appID: appID, certificate: certificate, profile: provisioningProfile) { (result) in - finish(result.error, title: "Failed to Install AltStore") + self.fetchProvisioningProfile(for: appID, team: team, session: session) { (result) in + do + { + let provisioningProfile = try result.get() + + self.install(application, to: device, team: team, appID: appID, certificate: certificate, profile: provisioningProfile) { (result) in + finish(result.error, title: "Failed to Install AltStore") + } + } + catch + { + finish(error, title: "Failed to Fetch Provisioning Profile") + } } } catch { - finish(error, title: "Failed to Fetch Provisioning Profile") + finish(error, title: "Failed to Update App ID") } } } catch { - finish(error, title: "Failed to Update App ID") + finish(error, title: "Failed to Register App") } } } catch { - finish(error, title: "Failed to Register App") + finish(error, title: "Failed to Download AltStore") + return } } } catch { - finish(error, title: "Failed to Download AltStore") - return + finish(error, title: "Failed to Fetch Certificate") } } } catch { - finish(error, title: "Failed to Fetch Certificate") + finish(error, title: "Failed to Register Device") } } } catch { - finish(error, title: "Failed to Register Device") + finish(error, title: "Failed to Fetch Team") } } } catch { - finish(error, title: "Failed to Fetch Team") + finish(error, title: "Failed to Authenticate") } } } catch { - finish(error, title: "Failed to Authenticate") + finish(error, title: "Failed to Fetch Anisette Data") } } } @@ -188,15 +200,57 @@ extension ALTDeviceManager downloadTask.resume() } - func authenticate(appleID: String, password: String, completionHandler: @escaping (Result) -> Void) + func authenticate(appleID: String, password: String, anisetteData: ALTAnisetteData, completionHandler: @escaping (Result<(ALTAccount, ALTAppleAPISession), Error>) -> Void) { - ALTAppleAPI.shared.authenticate(appleID: appleID, password: password) { (account, error) in - let result = Result(account, error) - completionHandler(result) + func handleVerificationCode(_ completionHandler: @escaping (String?) -> Void) + { + DispatchQueue.main.async { + let alert = NSAlert() + alert.messageText = NSLocalizedString("Two-Factor Authentication Enabled", comment: "") + alert.informativeText = NSLocalizedString("Please enter the 6-digit verification code that was sent to your Apple devices.", comment: "") + + let textField = NSTextField(frame: NSRect(x: 0, y: 0, width: 300, height: 22)) + textField.delegate = self + textField.translatesAutoresizingMaskIntoConstraints = false + textField.placeholderString = NSLocalizedString("123456", comment: "") + alert.accessoryView = textField + alert.window.initialFirstResponder = textField + + alert.addButton(withTitle: NSLocalizedString("Continue", comment: "")) + alert.addButton(withTitle: NSLocalizedString("Cancel", comment: "")) + + self.securityCodeAlert = alert + self.securityCodeTextField = textField + self.validate() + + NSRunningApplication.current.activate(options: .activateIgnoringOtherApps) + + let response = alert.runModal() + if response == .alertFirstButtonReturn + { + let code = textField.stringValue + completionHandler(code) + } + else + { + completionHandler(nil) + } + } + } + + ALTAppleAPI.shared.authenticate(appleID: appleID, password: password, anisetteData: anisetteData, verificationHandler: handleVerificationCode) { (account, session, error) in + if let account = account, let session = session + { + completionHandler(.success((account, session))) + } + else + { + completionHandler(.failure(error ?? ALTAppleAPIError(.unknown))) + } } } - func fetchTeam(for account: ALTAccount, completionHandler: @escaping (Result) -> Void) + func fetchTeam(for account: ALTAccount, session: ALTAppleAPISession, completionHandler: @escaping (Result) -> Void) { func finish(_ result: Result) { @@ -242,7 +296,7 @@ To prevent this from happening, feel free to try again with another Apple ID to } } - ALTAppleAPI.shared.fetchTeams(for: account) { (teams, error) in + ALTAppleAPI.shared.fetchTeams(for: account, session: session) { (teams, error) in do { let teams = try Result(teams, error).get() @@ -271,9 +325,9 @@ To prevent this from happening, feel free to try again with another Apple ID to } } - func fetchCertificate(for team: ALTTeam, completionHandler: @escaping (Result) -> Void) + func fetchCertificate(for team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result) -> Void) { - ALTAppleAPI.shared.fetchCertificates(for: team) { (certificates, error) in + ALTAppleAPI.shared.fetchCertificates(for: team, session: session) { (certificates, error) in do { let certificates = try Result(certificates, error).get() @@ -308,11 +362,11 @@ To prevent this from happening, feel free to try again with another Apple ID to if let certificate = certificates.first { - ALTAppleAPI.shared.revoke(certificate, for: team) { (success, error) in + ALTAppleAPI.shared.revoke(certificate, for: team, session: session) { (success, error) in do { try Result(success, error).get() - self.fetchCertificate(for: team, completionHandler: completionHandler) + self.fetchCertificate(for: team, session: session, completionHandler: completionHandler) } catch { @@ -322,13 +376,13 @@ To prevent this from happening, feel free to try again with another Apple ID to } else { - ALTAppleAPI.shared.addCertificate(machineName: "AltStore", to: team) { (certificate, error) in + ALTAppleAPI.shared.addCertificate(machineName: "AltStore", to: team, session: session) { (certificate, error) in do { let certificate = try Result(certificate, error).get() guard let privateKey = certificate.privateKey else { throw InstallError.missingPrivateKey } - ALTAppleAPI.shared.fetchCertificates(for: team) { (certificates, error) in + ALTAppleAPI.shared.fetchCertificates(for: team, session: session) { (certificates, error) in do { let certificates = try Result(certificates, error).get() @@ -361,11 +415,11 @@ To prevent this from happening, feel free to try again with another Apple ID to } } - func registerAppID(name appName: String, identifier: String, team: ALTTeam, completionHandler: @escaping (Result) -> Void) + func registerAppID(name appName: String, identifier: String, team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result) -> Void) { let bundleID = "com.\(team.identifier).\(identifier)" - ALTAppleAPI.shared.fetchAppIDs(for: team) { (appIDs, error) in + ALTAppleAPI.shared.fetchAppIDs(for: team, session: session) { (appIDs, error) in do { let appIDs = try Result(appIDs, error).get() @@ -376,7 +430,7 @@ To prevent this from happening, feel free to try again with another Apple ID to } else { - ALTAppleAPI.shared.addAppID(withName: appName, bundleIdentifier: bundleID, team: team) { (appID, error) in + ALTAppleAPI.shared.addAppID(withName: appName, bundleIdentifier: bundleID, team: team, session: session) { (appID, error) in completionHandler(Result(appID, error)) } } @@ -388,7 +442,7 @@ To prevent this from happening, feel free to try again with another Apple ID to } } - func updateFeatures(for appID: ALTAppID, app: ALTApplication, team: ALTTeam, completionHandler: @escaping (Result) -> Void) + func updateFeatures(for appID: ALTAppID, app: ALTApplication, team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result) -> Void) { let requiredFeatures = app.entitlements.compactMap { (entitlement, value) -> (ALTFeature, Any)? in guard let feature = ALTFeature(entitlement: entitlement) else { return nil } @@ -405,14 +459,14 @@ To prevent this from happening, feel free to try again with another Apple ID to let appID = appID.copy() as! ALTAppID appID.features = features - ALTAppleAPI.shared.update(appID, team: team) { (appID, error) in + ALTAppleAPI.shared.update(appID, team: team, session: session) { (appID, error) in completionHandler(Result(appID, error)) } } - func register(_ device: ALTDevice, team: ALTTeam, completionHandler: @escaping (Result) -> Void) + func register(_ device: ALTDevice, team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result) -> Void) { - ALTAppleAPI.shared.fetchDevices(for: team) { (devices, error) in + ALTAppleAPI.shared.fetchDevices(for: team, session: session) { (devices, error) in do { let devices = try Result(devices, error).get() @@ -423,7 +477,7 @@ To prevent this from happening, feel free to try again with another Apple ID to } else { - ALTAppleAPI.shared.registerDevice(name: device.name, identifier: device.identifier, team: team) { (device, error) in + ALTAppleAPI.shared.registerDevice(name: device.name, identifier: device.identifier, team: team, session: session) { (device, error) in completionHandler(Result(device, error)) } } @@ -435,9 +489,9 @@ To prevent this from happening, feel free to try again with another Apple ID to } } - func fetchProvisioningProfile(for appID: ALTAppID, team: ALTTeam, completionHandler: @escaping (Result) -> Void) + func fetchProvisioningProfile(for appID: ALTAppID, team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result) -> Void) { - ALTAppleAPI.shared.fetchProvisioningProfile(for: appID, team: team) { (profile, error) in + ALTAppleAPI.shared.fetchProvisioningProfile(for: appID, team: team, session: session) { (profile, error) in completionHandler(Result(profile, error)) } } @@ -489,3 +543,45 @@ To prevent this from happening, feel free to try again with another Apple ID to } } } + +private var securityCodeAlertKey = 0 +private var securityCodeTextFieldKey = 0 + +extension ALTDeviceManager: NSTextFieldDelegate +{ + var securityCodeAlert: NSAlert? { + get { return objc_getAssociatedObject(self, &securityCodeAlertKey) as? NSAlert } + set { objc_setAssociatedObject(self, &securityCodeAlertKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } + } + + var securityCodeTextField: NSTextField? { + get { return objc_getAssociatedObject(self, &securityCodeTextFieldKey) as? NSTextField } + set { objc_setAssociatedObject(self, &securityCodeTextFieldKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } + } + + public func controlTextDidChange(_ obj: Notification) + { + self.validate() + } + + public func controlTextDidEndEditing(_ obj: Notification) + { + self.validate() + } + + private func validate() + { + guard let code = self.securityCodeTextField?.stringValue.trimmingCharacters(in: .whitespacesAndNewlines) else { return } + + if code.count == 6 + { + self.securityCodeAlert?.buttons.first?.isEnabled = true + } + else + { + self.securityCodeAlert?.buttons.first?.isEnabled = false + } + + self.securityCodeAlert?.layout() + } +} diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index c0106d6f..160cb12f 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -116,6 +116,7 @@ BF54E8212315EF0D000AE0D8 /* ALTPatreonBenefitType.m in Sources */ = {isa = PBXBuildFile; fileRef = BF54E8202315EF0D000AE0D8 /* ALTPatreonBenefitType.m */; }; BF5AB3A82285FE7500DC914B /* AltSign.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF5AB3A72285FE6C00DC914B /* AltSign.framework */; }; BF5AB3A92285FE7500DC914B /* AltSign.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BF5AB3A72285FE6C00DC914B /* AltSign.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BF5C5FCF237DF69100EDD0C6 /* ALTPluginService.m in Sources */ = {isa = PBXBuildFile; fileRef = BF5C5FCE237DF69100EDD0C6 /* ALTPluginService.m */; }; BF6F439223644C6E00A0B879 /* RefreshAltStoreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6F439123644C6E00A0B879 /* RefreshAltStoreViewController.swift */; }; BF74989B23621C0700CED65F /* ForwardingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF74989A23621C0700CED65F /* ForwardingNavigationController.swift */; }; BF770E5122BB1CF6002A40FE /* InstallAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF770E5022BB1CF6002A40FE /* InstallAppOperation.swift */; }; @@ -136,6 +137,7 @@ BFB1169B2293274D00BB457C /* JSONDecoder+ManagedObjectContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB1169A2293274D00BB457C /* JSONDecoder+ManagedObjectContext.swift */; }; BFB3645A2325985F00CD0EB1 /* FindServerOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB364592325985F00CD0EB1 /* FindServerOperation.swift */; }; BFB4323F22DE852000B7F8BC /* UpdateCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BFB4323E22DE852000B7F8BC /* UpdateCollectionViewCell.xib */; }; + BFB49AAA23834CF900D542D9 /* ALTAnisetteData.m in Sources */ = {isa = PBXBuildFile; fileRef = BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */; }; BFB6B21B23186D640022A802 /* NewsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB6B21A23186D640022A802 /* NewsItem.swift */; }; BFB6B21E231870160022A802 /* NewsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB6B21D231870160022A802 /* NewsViewController.swift */; }; BFB6B220231870B00022A802 /* NewsCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB6B21F231870B00022A802 /* NewsCollectionViewCell.swift */; }; @@ -143,6 +145,7 @@ BFBBE2DD22931B20002097FA /* AltStore.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = BFBBE2DB22931B20002097FA /* AltStore.xcdatamodeld */; }; BFBBE2DF22931F73002097FA /* StoreApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFBBE2DE22931F73002097FA /* StoreApp.swift */; }; BFBBE2E122931F81002097FA /* InstalledApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFBBE2E022931F81002097FA /* InstalledApp.swift */; }; + BFBFFB252380C71600993A4A /* AltPlugin.mailbundle in Resources */ = {isa = PBXBuildFile; fileRef = BF5C5FC5237DF5AE00EDD0C6 /* AltPlugin.mailbundle */; }; BFC1F38D22AEE3A4003AC21A /* DownloadAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC1F38C22AEE3A4003AC21A /* DownloadAppOperation.swift */; }; BFD2476E2284B9A500981D42 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD2476D2284B9A500981D42 /* AppDelegate.swift */; }; BFD247752284B9A500981D42 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BFD247732284B9A500981D42 /* Main.storyboard */; }; @@ -202,6 +205,7 @@ BFE338DD22F0E7F3002E24B9 /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE338DC22F0E7F3002E24B9 /* Source.swift */; }; BFE338DF22F0EADB002E24B9 /* FetchSourceOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE338DE22F0EADB002E24B9 /* FetchSourceOperation.swift */; }; BFE338E822F10E56002E24B9 /* LaunchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE338E722F10E56002E24B9 /* LaunchViewController.swift */; }; + BFE48975238007CE003239E0 /* AnisetteDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE48974238007CE003239E0 /* AnisetteDataManager.swift */; }; BFE60738231ADF49002B0E8E /* Settings.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BFE60737231ADF49002B0E8E /* Settings.storyboard */; }; BFE6073A231ADF82002B0E8E /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE60739231ADF82002B0E8E /* SettingsViewController.swift */; }; BFE6073C231AE1E7002B0E8E /* SettingsHeaderFooterView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BFE6073B231AE1E7002B0E8E /* SettingsHeaderFooterView.xib */; }; @@ -243,6 +247,13 @@ remoteGlobalIDString = BF45872A2298D31600BD7491; remoteInfo = libimobiledevice; }; + BFBFFB262380C72F00993A4A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFD247622284B9A500981D42 /* Project object */; + proxyType = 1; + remoteGlobalIDString = BF5C5FC4237DF5AE00EDD0C6; + remoteInfo = AltPlugin; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -268,6 +279,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + BF5C5FE9237E438C00EDD0C6 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; BFD247842284BB2C00981D42 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -400,6 +420,10 @@ BF54E81F2315EF0D000AE0D8 /* ALTPatreonBenefitType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTPatreonBenefitType.h; sourceTree = ""; }; BF54E8202315EF0D000AE0D8 /* ALTPatreonBenefitType.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ALTPatreonBenefitType.m; sourceTree = ""; }; BF5AB3A72285FE6C00DC914B /* AltSign.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AltSign.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BF5C5FC5237DF5AE00EDD0C6 /* AltPlugin.mailbundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AltPlugin.mailbundle; sourceTree = BUILT_PRODUCTS_DIR; }; + BF5C5FC7237DF5AE00EDD0C6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BF5C5FCD237DF69100EDD0C6 /* ALTPluginService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTPluginService.h; sourceTree = ""; }; + BF5C5FCE237DF69100EDD0C6 /* ALTPluginService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ALTPluginService.m; sourceTree = ""; }; BF6F439123644C6E00A0B879 /* RefreshAltStoreViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshAltStoreViewController.swift; sourceTree = ""; }; BF74989A23621C0700CED65F /* ForwardingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardingNavigationController.swift; sourceTree = ""; }; BF770E5022BB1CF6002A40FE /* InstallAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstallAppOperation.swift; sourceTree = ""; }; @@ -422,6 +446,8 @@ BFB1169C22932DB100BB457C /* apps.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = apps.json; sourceTree = ""; }; BFB364592325985F00CD0EB1 /* FindServerOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindServerOperation.swift; sourceTree = ""; }; BFB4323E22DE852000B7F8BC /* UpdateCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdateCollectionViewCell.xib; sourceTree = ""; }; + BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ALTAnisetteData.m; path = "Dependencies/AltSign/AltSign/Model/Apple API/ALTAnisetteData.m"; sourceTree = SOURCE_ROOT; }; + BFB49AA923834CF900D542D9 /* ALTAnisetteData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ALTAnisetteData.h; path = "Dependencies/AltSign/AltSign/Model/Apple API/ALTAnisetteData.h"; sourceTree = SOURCE_ROOT; }; BFB6B21A23186D640022A802 /* NewsItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsItem.swift; sourceTree = ""; }; BFB6B21D231870160022A802 /* NewsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsViewController.swift; sourceTree = ""; }; BFB6B21F231870B00022A802 /* NewsCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsCollectionViewCell.swift; sourceTree = ""; }; @@ -491,6 +517,7 @@ BFE338DC22F0E7F3002E24B9 /* Source.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Source.swift; sourceTree = ""; }; BFE338DE22F0EADB002E24B9 /* FetchSourceOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchSourceOperation.swift; sourceTree = ""; }; BFE338E722F10E56002E24B9 /* LaunchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchViewController.swift; sourceTree = ""; }; + BFE48974238007CE003239E0 /* AnisetteDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnisetteDataManager.swift; sourceTree = ""; }; BFE60737231ADF49002B0E8E /* Settings.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Settings.storyboard; sourceTree = ""; }; BFE60739231ADF82002B0E8E /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; BFE6073B231AE1E7002B0E8E /* SettingsHeaderFooterView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SettingsHeaderFooterView.xib; sourceTree = ""; }; @@ -639,6 +666,7 @@ children = ( BF45868F229872EA00BD7491 /* AppDelegate.swift */, BF458695229872EA00BD7491 /* Main.storyboard */, + BFE48974238007CE003239E0 /* AnisetteDataManager.swift */, BF703195229F36FF006E110F /* Devices */, BFD52BDC22A0A659000B7ED1 /* Connections */, BF055B4A233B528B0086DEA9 /* Extensions */, @@ -787,6 +815,18 @@ name = libcnary; sourceTree = ""; }; + BF5C5FC6237DF5AE00EDD0C6 /* AltPlugin */ = { + isa = PBXGroup; + children = ( + BF5C5FCD237DF69100EDD0C6 /* ALTPluginService.h */, + BF5C5FCE237DF69100EDD0C6 /* ALTPluginService.m */, + BFB49AA923834CF900D542D9 /* ALTAnisetteData.h */, + BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */, + BF5C5FC7237DF5AE00EDD0C6 /* Info.plist */, + ); + path = AltPlugin; + sourceTree = ""; + }; BF703194229F36F6006E110F /* Resources */ = { isa = PBXGroup; children = ( @@ -863,6 +903,7 @@ BF45868E229872EA00BD7491 /* AltServer */, BF1E315122A0616100370A3C /* AltKit */, BF45872C2298D31600BD7491 /* libimobiledevice */, + BF5C5FC6237DF5AE00EDD0C6 /* AltPlugin */, BFD247852284BB3300981D42 /* Frameworks */, BFD2476B2284B9A500981D42 /* Products */, 4460E048E3AC1C9708C4FA33 /* Pods */, @@ -876,6 +917,7 @@ BF45868D229872EA00BD7491 /* AltServer.app */, BF45872B2298D31600BD7491 /* libimobiledevice.a */, BF1E315022A0616100370A3C /* libAltKit.a */, + BF5C5FC5237DF5AE00EDD0C6 /* AltPlugin.mailbundle */, ); name = Products; sourceTree = ""; @@ -1186,6 +1228,24 @@ productReference = BF45872B2298D31600BD7491 /* libimobiledevice.a */; productType = "com.apple.product-type.library.static"; }; + BF5C5FC4237DF5AE00EDD0C6 /* AltPlugin */ = { + isa = PBXNativeTarget; + buildConfigurationList = BF5C5FC8237DF5AE00EDD0C6 /* Build configuration list for PBXNativeTarget "AltPlugin" */; + buildPhases = ( + BF5C5FC1237DF5AE00EDD0C6 /* Sources */, + BF5C5FC2237DF5AE00EDD0C6 /* Frameworks */, + BF5C5FC3237DF5AE00EDD0C6 /* Resources */, + BF5C5FE9237E438C00EDD0C6 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AltPlugin; + productName = AltPlugin; + productReference = BF5C5FC5237DF5AE00EDD0C6 /* AltPlugin.mailbundle */; + productType = "com.apple.product-type.bundle"; + }; BFD247692284B9A500981D42 /* AltStore */ = { isa = PBXNativeTarget; buildConfigurationList = BFD2477E2284B9A700981D42 /* Build configuration list for PBXNativeTarget "AltStore" */; @@ -1213,7 +1273,7 @@ BFD247622284B9A500981D42 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1020; + LastSwiftUpdateCheck = 1120; LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Riley Testut"; TargetAttributes = { @@ -1235,6 +1295,10 @@ BF45872A2298D31600BD7491 = { CreatedOnToolsVersion = 10.2.1; }; + BF5C5FC4237DF5AE00EDD0C6 = { + CreatedOnToolsVersion = 11.2; + LastSwiftMigration = 1120; + }; BFD247692284B9A500981D42 = { CreatedOnToolsVersion = 10.2.1; LastSwiftMigration = 1020; @@ -1266,6 +1330,7 @@ BF45868C229872EA00BD7491 /* AltServer */, BF1E314F22A0616100370A3C /* AltKit */, BF45872A2298D31600BD7491 /* libimobiledevice */, + BF5C5FC4237DF5AE00EDD0C6 /* AltPlugin */, ); }; /* End PBXProject section */ @@ -1275,6 +1340,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + BFBFFB252380C71600993A4A /* AltPlugin.mailbundle in Resources */, BF458694229872EA00BD7491 /* Assets.xcassets in Resources */, BF458697229872EA00BD7491 /* Main.storyboard in Resources */, ); @@ -1389,6 +1455,7 @@ BF458690229872EA00BD7491 /* AppDelegate.swift in Sources */, BF4586C52298CDB800BD7491 /* ALTDeviceManager.mm in Sources */, BF0241AA22F29CCD00129732 /* UserDefaults+AltServer.swift in Sources */, + BFE48975238007CE003239E0 /* AnisetteDataManager.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1453,6 +1520,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + BF5C5FC1237DF5AE00EDD0C6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BFB49AAA23834CF900D542D9 /* ALTAnisetteData.m in Sources */, + BF5C5FCF237DF69100EDD0C6 /* ALTPluginService.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; BFD247662284B9A500981D42 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1558,6 +1634,11 @@ target = BF45872A2298D31600BD7491 /* libimobiledevice */; targetProxy = BF4588442298D48B00BD7491 /* PBXContainerItemProxy */; }; + BFBFFB272380C72F00993A4A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = BF5C5FC4237DF5AE00EDD0C6 /* AltPlugin */; + targetProxy = BFBFFB262380C72F00993A4A /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -1795,6 +1876,63 @@ }; name = Release; }; + BF5C5FC9237DF5AE00EDD0C6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = AltPlugin/Info.plist; + INSTALL_PATH = "$(HOME)/Library/Mail/Bundles/"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + "/Users/Riley/Library/Developer/Xcode/DerivedData/AltStore-bhqnkrahfutztzeudtxhcxccgtlo/Build/Products/Debug", + ); + MACOSX_DEPLOYMENT_TARGET = 10.14; + PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltPlugin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + WRAPPER_EXTENSION = mailbundle; + }; + name = Debug; + }; + BF5C5FCA237DF5AE00EDD0C6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = AltPlugin/Info.plist; + INSTALL_PATH = "$(HOME)/Library/Mail/Bundles/"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + "/Users/Riley/Library/Developer/Xcode/DerivedData/AltStore-bhqnkrahfutztzeudtxhcxccgtlo/Build/Products/Debug", + ); + MACOSX_DEPLOYMENT_TARGET = 10.14; + PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltPlugin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + WRAPPER_EXTENSION = mailbundle; + }; + name = Release; + }; BFD2477C2284B9A700981D42 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1996,6 +2134,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + BF5C5FC8237DF5AE00EDD0C6 /* Build configuration list for PBXNativeTarget "AltPlugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BF5C5FC9237DF5AE00EDD0C6 /* Debug */, + BF5C5FCA237DF5AE00EDD0C6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; BFD247652284B9A500981D42 /* Build configuration list for PBXProject "AltStore" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/AltStore.xcodeproj/xcshareddata/xcschemes/AltPlugin.xcscheme b/AltStore.xcodeproj/xcshareddata/xcschemes/AltPlugin.xcscheme new file mode 100644 index 00000000..2bfc3556 --- /dev/null +++ b/AltStore.xcodeproj/xcshareddata/xcschemes/AltPlugin.xcscheme @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Dependencies/AltSign b/Dependencies/AltSign index a66bcc7a..72c4418b 160000 --- a/Dependencies/AltSign +++ b/Dependencies/AltSign @@ -1 +1 @@ -Subproject commit a66bcc7abbc176a847f0a75f5a6f0ddf8e240f41 +Subproject commit 72c4418bc6be2808adf77baeb7a4b2b83f8e813c