Files

116 lines
3.2 KiB
Swift
Raw Permalink Normal View History

//
// Keychain.swift
// AltStore
//
// Created by Riley Testut on 6/4/19.
// Copyright © 2019 Riley Testut. All rights reserved.
//
import Foundation
import KeychainAccess
import AltSign
@propertyWrapper
public struct KeychainItem<Value>
{
public let key: String
public var wrappedValue: Value? {
get {
switch Value.self
{
case is Data.Type: return try? Keychain.shared.keychain.getData(self.key) as? Value
case is String.Type: return try? Keychain.shared.keychain.getString(self.key) as? Value
default: return nil
}
}
set {
switch Value.self
{
case is Data.Type: Keychain.shared.keychain[data: self.key] = newValue as? Data
case is String.Type: Keychain.shared.keychain[self.key] = newValue as? String
default: break
}
}
}
2019-06-06 14:46:23 -07:00
public init(key: String)
2019-06-06 14:46:23 -07:00
{
self.key = key
2019-06-06 14:46:23 -07:00
}
}
public class Keychain
{
public static let shared = Keychain()
fileprivate let keychain = KeychainAccess.Keychain(service: Bundle.Info.appbundleIdentifier).accessibility(.afterFirstUnlock).synchronizable(true)
@KeychainItem(key: "appleIDEmailAddress")
public var appleIDEmailAddress: String?
@KeychainItem(key: "appleIDPassword")
public var appleIDPassword: String?
@KeychainItem(key: "appleIDAdsid")
public var appleIDAdsid: String?
@KeychainItem(key: "appleIDXcodeToken")
public var appleIDXcodeToken: String?
@KeychainItem(key: "signingCertificatePrivateKey")
public var signingCertificatePrivateKey: Data?
@KeychainItem(key: "signingCertificateSerialNumber")
public var signingCertificateSerialNumber: String?
@KeychainItem(key: "signingCertificate")
public var signingCertificate: Data?
@KeychainItem(key: "signingCertificatePassword")
public var signingCertificatePassword: String?
@KeychainItem(key: "patreonAccessToken")
public var patreonAccessToken: String?
@KeychainItem(key: "patreonRefreshToken")
public var patreonRefreshToken: String?
@KeychainItem(key: "patreonCreatorAccessToken")
public var patreonCreatorAccessToken: String?
@KeychainItem(key: "patreonAccountID")
public var patreonAccountID: String?
@KeychainItem(key: "identifier")
public var identifier: String?
@KeychainItem(key: "adiPb")
public var adiPb: String?
// for some reason authenticated cert/session/team is completely not cached, which result in logging in for every request
// we save it here so when user logs out we can clear cached account/session/team
public var certificate: ALTCertificate? = nil
public var session: ALTAppleAPISession? = nil
public var team: ALTTeam? = nil
private init()
{
}
public func reset()
{
self.appleIDEmailAddress = nil
self.appleIDPassword = nil
self.appleIDAdsid = nil
self.appleIDXcodeToken = nil
self.signingCertificatePrivateKey = nil
self.signingCertificateSerialNumber = nil
self.certificate = nil
self.session = nil
self.team = nil
}
}