2019-05-30 17:10:50 -07:00
//
// S e r v e r P r o t o c o l . s w i f t
// A l t S e r v e r
//
// C r e a t e d b y R i l e y T e s t u t o n 5 / 2 4 / 1 9 .
// C o p y r i g h t © 2 0 1 9 R i l e y T e s t u t . A l l r i g h t s r e s e r v e d .
//
import Foundation
2019-11-18 14:49:17 -08:00
import AltSign
2019-05-30 17:10:50 -07:00
public let ALTServerServiceType = " _altserver._tcp "
2019-11-18 14:49:17 -08:00
protocol ServerMessageProtocol : Codable
2019-05-30 17:10:50 -07:00
{
2019-06-21 11:20:03 -07:00
var version : Int { get }
var identifier : String { get }
}
2019-11-18 14:49:17 -08:00
public enum ServerRequest : Decodable
{
case anisetteData ( AnisetteDataRequest )
case prepareApp ( PrepareAppRequest )
case beginInstallation ( BeginInstallationRequest )
2020-03-05 14:49:21 -08:00
case installProvisioningProfiles ( InstallProvisioningProfilesRequest )
case removeProvisioningProfiles ( RemoveProvisioningProfilesRequest )
2019-11-18 14:49:17 -08:00
case unknown ( identifier : String , version : Int )
var identifier : String {
switch self
{
case . anisetteData ( let request ) : return request . identifier
case . prepareApp ( let request ) : return request . identifier
case . beginInstallation ( let request ) : return request . identifier
2020-03-05 14:49:21 -08:00
case . installProvisioningProfiles ( let request ) : return request . identifier
case . removeProvisioningProfiles ( let request ) : return request . identifier
2019-11-18 14:49:17 -08:00
case . unknown ( let identifier , _ ) : return identifier
}
}
var version : Int {
switch self
{
case . anisetteData ( let request ) : return request . version
case . prepareApp ( let request ) : return request . version
case . beginInstallation ( let request ) : return request . version
2020-03-05 14:49:21 -08:00
case . installProvisioningProfiles ( let request ) : return request . version
case . removeProvisioningProfiles ( let request ) : return request . version
2019-11-18 14:49:17 -08:00
case . unknown ( _ , let version ) : return version
}
}
private enum CodingKeys : String , CodingKey
{
case identifier
case version
}
public init ( from decoder : Decoder ) throws
{
let container = try decoder . container ( keyedBy : CodingKeys . self )
let version = try container . decode ( Int . self , forKey : . version )
let identifier = try container . decode ( String . self , forKey : . identifier )
switch identifier
{
case " AnisetteDataRequest " :
let request = try AnisetteDataRequest ( from : decoder )
self = . anisetteData ( request )
case " PrepareAppRequest " :
let request = try PrepareAppRequest ( from : decoder )
self = . prepareApp ( request )
case " BeginInstallationRequest " :
let request = try BeginInstallationRequest ( from : decoder )
self = . beginInstallation ( request )
2020-03-05 14:49:21 -08:00
case " InstallProvisioningProfilesRequest " :
let request = try InstallProvisioningProfilesRequest ( from : decoder )
self = . installProvisioningProfiles ( request )
case " RemoveProvisioningProfilesRequest " :
let request = try RemoveProvisioningProfilesRequest ( from : decoder )
self = . removeProvisioningProfiles ( request )
2019-11-18 14:49:17 -08:00
default :
self = . unknown ( identifier : identifier , version : version )
}
}
}
public enum ServerResponse : Decodable
{
case anisetteData ( AnisetteDataResponse )
case installationProgress ( InstallationProgressResponse )
2020-03-05 14:49:21 -08:00
case installProvisioningProfiles ( InstallProvisioningProfilesResponse )
case removeProvisioningProfiles ( RemoveProvisioningProfilesResponse )
2019-11-18 14:49:17 -08:00
case error ( ErrorResponse )
case unknown ( identifier : String , version : Int )
var identifier : String {
switch self
{
case . anisetteData ( let response ) : return response . identifier
case . installationProgress ( let response ) : return response . identifier
2020-03-05 14:49:21 -08:00
case . installProvisioningProfiles ( let response ) : return response . identifier
case . removeProvisioningProfiles ( let response ) : return response . identifier
2019-11-18 14:49:17 -08:00
case . error ( let response ) : return response . identifier
case . unknown ( let identifier , _ ) : return identifier
}
}
var version : Int {
switch self
{
case . anisetteData ( let response ) : return response . version
case . installationProgress ( let response ) : return response . version
2020-03-05 14:49:21 -08:00
case . installProvisioningProfiles ( let response ) : return response . version
case . removeProvisioningProfiles ( let response ) : return response . version
2019-11-18 14:49:17 -08:00
case . error ( let response ) : return response . version
case . unknown ( _ , let version ) : return version
}
}
private enum CodingKeys : String , CodingKey
{
case identifier
case version
}
public init ( from decoder : Decoder ) throws
{
let container = try decoder . container ( keyedBy : CodingKeys . self )
let version = try container . decode ( Int . self , forKey : . version )
let identifier = try container . decode ( String . self , forKey : . identifier )
switch identifier
{
case " AnisetteDataResponse " :
let response = try AnisetteDataResponse ( from : decoder )
self = . anisetteData ( response )
case " InstallationProgressResponse " :
let response = try InstallationProgressResponse ( from : decoder )
self = . installationProgress ( response )
2020-03-05 14:49:21 -08:00
case " InstallProvisioningProfilesResponse " :
let response = try InstallProvisioningProfilesResponse ( from : decoder )
self = . installProvisioningProfiles ( response )
case " RemoveProvisioningProfilesResponse " :
let response = try RemoveProvisioningProfilesResponse ( from : decoder )
self = . removeProvisioningProfiles ( response )
2019-11-18 14:49:17 -08:00
case " ErrorResponse " :
let response = try ErrorResponse ( from : decoder )
self = . error ( response )
default :
self = . unknown ( identifier : identifier , version : version )
}
}
}
2020-03-05 14:49:21 -08:00
// _ D o n ' t _ p r o v i d e g e n e r i c S u c c e s s R e s p o n s e , a s t h a t w o u l d p r e v e n t u s
// f r o m e a s i l y c h a n g i n g r e s p o n s e f o r m a t f o r a r e q u e s t i n t h e f u t u r e .
public struct ErrorResponse : ServerMessageProtocol
{
public var version = 2
public var identifier = " ErrorResponse "
public var error : ALTServerError {
return self . serverError ? . error ? ? ALTServerError ( self . errorCode )
}
private var serverError : CodableServerError ?
// L e g a c y ( v 1 )
private var errorCode : ALTServerError . Code
public init ( error : ALTServerError )
{
self . serverError = CodableServerError ( error : error )
self . errorCode = error . code
}
}
2019-11-18 14:49:17 -08:00
public struct AnisetteDataRequest : ServerMessageProtocol
{
public var version = 1
public var identifier = " AnisetteDataRequest "
public init ( )
{
}
}
public struct AnisetteDataResponse : ServerMessageProtocol
2019-06-21 11:20:03 -07:00
{
public var version = 1
2019-11-18 14:49:17 -08:00
public var identifier = " AnisetteDataResponse "
public var anisetteData : ALTAnisetteData
private enum CodingKeys : String , CodingKey
{
case identifier
case version
case anisetteData
}
public init ( anisetteData : ALTAnisetteData )
{
self . anisetteData = anisetteData
}
public init ( from decoder : Decoder ) throws
{
let container = try decoder . container ( keyedBy : CodingKeys . self )
self . version = try container . decode ( Int . self , forKey : . version )
self . identifier = try container . decode ( String . self , forKey : . identifier )
let json = try container . decode ( [ String : String ] . self , forKey : . anisetteData )
if let anisetteData = ALTAnisetteData ( json : json )
{
self . anisetteData = anisetteData
}
else
{
throw DecodingError . dataCorruptedError ( forKey : CodingKeys . anisetteData , in : container , debugDescription : " Couuld not parse anisette data from JSON " )
}
}
public func encode ( to encoder : Encoder ) throws
{
var container = encoder . container ( keyedBy : CodingKeys . self )
try container . encode ( self . version , forKey : . version )
try container . encode ( self . identifier , forKey : . identifier )
let json = self . anisetteData . json ( )
try container . encode ( json , forKey : . anisetteData )
}
}
public struct PrepareAppRequest : ServerMessageProtocol
{
public var version = 1
public var identifier = " PrepareAppRequest "
2019-06-21 11:20:03 -07:00
2019-05-30 17:10:50 -07:00
public var udid : String
public var contentSize : Int
public init ( udid : String , contentSize : Int )
{
self . udid = udid
self . contentSize = contentSize
}
}
2019-11-18 14:49:17 -08:00
public struct BeginInstallationRequest : ServerMessageProtocol
2019-05-30 17:10:50 -07:00
{
2020-03-11 13:51:39 -07:00
public var version = 2
2019-11-18 14:49:17 -08:00
public var identifier = " BeginInstallationRequest "
2019-06-21 11:20:03 -07:00
2020-03-11 13:51:39 -07:00
// I f a c t i v e P r o f i l e s i s n o n - n i l , t h e n A l t S e r v e r s h o u l d r e m o v e a l l p r o f i l e s e x c e p t a c t i v e o n e s .
public var activeProfiles : Set < String > ?
public init ( activeProfiles : Set < String > ? )
2019-06-21 11:20:03 -07:00
{
2020-03-11 13:51:39 -07:00
self . activeProfiles = activeProfiles
2019-06-21 11:20:03 -07:00
}
}
2020-03-05 14:49:21 -08:00
public struct InstallationProgressResponse : ServerMessageProtocol
2019-06-21 11:20:03 -07:00
{
public var version = 1
2020-03-05 14:49:21 -08:00
public var identifier = " InstallationProgressResponse "
2019-06-21 11:20:03 -07:00
2020-03-05 14:49:21 -08:00
public var progress : Double
public init ( progress : Double )
{
self . progress = progress
2019-11-18 14:49:17 -08:00
}
2020-03-05 14:49:21 -08:00
}
public struct InstallProvisioningProfilesRequest : ServerMessageProtocol
{
public var version = 1
public var identifier = " InstallProvisioningProfilesRequest "
2019-06-10 15:03:47 -07:00
2020-03-05 14:49:21 -08:00
public var udid : String
public var provisioningProfiles : Set < ALTProvisioningProfile >
// I f a c t i v e P r o f i l e s i s n o n - n i l , t h e n A l t S e r v e r s h o u l d r e m o v e a l l p r o f i l e s e x c e p t a c t i v e o n e s .
public var activeProfiles : Set < String > ?
private enum CodingKeys : String , CodingKey
2019-11-18 14:49:17 -08:00
{
2020-03-05 14:49:21 -08:00
case identifier
case version
case udid
case provisioningProfiles
case activeProfiles
}
public init ( udid : String , provisioningProfiles : Set < ALTProvisioningProfile > , activeProfiles : Set < String > ? )
{
self . udid = udid
self . provisioningProfiles = provisioningProfiles
self . activeProfiles = activeProfiles
}
public init ( from decoder : Decoder ) throws
{
let container = try decoder . container ( keyedBy : CodingKeys . self )
self . version = try container . decode ( Int . self , forKey : . version )
self . identifier = try container . decode ( String . self , forKey : . identifier )
self . udid = try container . decode ( String . self , forKey : . udid )
let rawProvisioningProfiles = try container . decode ( [ Data ] . self , forKey : . provisioningProfiles )
let provisioningProfiles = try rawProvisioningProfiles . map { ( data ) -> ALTProvisioningProfile in
guard let profile = ALTProvisioningProfile ( data : data ) else {
throw DecodingError . dataCorruptedError ( forKey : CodingKeys . provisioningProfiles , in : container , debugDescription : " Could not parse provisioning profile from data. " )
}
return profile
}
self . provisioningProfiles = Set ( provisioningProfiles )
self . activeProfiles = try container . decodeIfPresent ( Set < String > . self , forKey : . activeProfiles )
}
public func encode ( to encoder : Encoder ) throws
{
var container = encoder . container ( keyedBy : CodingKeys . self )
try container . encode ( self . version , forKey : . version )
try container . encode ( self . identifier , forKey : . identifier )
try container . encode ( self . udid , forKey : . udid )
try container . encode ( self . provisioningProfiles . map { $0 . data } , forKey : . provisioningProfiles )
try container . encodeIfPresent ( self . activeProfiles , forKey : . activeProfiles )
2019-05-30 17:10:50 -07:00
}
2019-11-18 14:49:17 -08:00
}
2020-03-05 14:49:21 -08:00
public struct InstallProvisioningProfilesResponse : ServerMessageProtocol
2019-11-18 14:49:17 -08:00
{
public var version = 1
2020-03-05 14:49:21 -08:00
public var identifier = " InstallProvisioningProfilesResponse "
2019-11-18 14:49:17 -08:00
2020-03-05 14:49:21 -08:00
public init ( )
{
}
}
public struct RemoveProvisioningProfilesRequest : ServerMessageProtocol
{
public var version = 1
public var identifier = " RemoveProvisioningProfilesRequest "
2019-05-30 17:10:50 -07:00
2020-03-05 14:49:21 -08:00
public var udid : String
public var bundleIdentifiers : Set < String >
public init ( udid : String , bundleIdentifiers : Set < String > )
{
self . udid = udid
self . bundleIdentifiers = bundleIdentifiers
}
}
public struct RemoveProvisioningProfilesResponse : ServerMessageProtocol
{
public var version = 1
public var identifier = " RemoveProvisioningProfilesResponse "
public init ( )
2019-05-30 17:10:50 -07:00
{
}
}