@@ -66,64 +66,49 @@ struct InstallController: RouteCollection {
66
66
}
67
67
68
68
do {
69
- var format = PropertyListSerialization . PropertyListFormat . xml
70
- let plistAny = try PropertyListSerialization . propertyList ( from : data , options : [ ] , format : & format )
71
- guard var plist = plistAny as? [ String : Any ] else {
69
+ let decoder = PropertyListDecoder ( )
70
+ let ipaManifest = try decoder . decode ( IPAManifest . self , from : data )
71
+ guard var ipaItem = ipaManifest . items . first , var ipaAsset = ipaItem . assets . first else {
72
72
return nil
73
73
}
74
74
75
- // Navigate to the first asset URL
76
- guard var items = plist [ " items " ] as? [ [ String : Any ] ] , !items. isEmpty else {
75
+ guard var ipaURLComponents = URLComponents ( string: ipaAsset. url) else {
77
76
return nil
78
77
}
79
78
80
- var firstItem = items [ 0 ]
81
- guard var assets = firstItem [ " assets " ] as? [ [ String : Any ] ] , !assets. isEmpty else {
82
- return nil
83
- }
84
-
85
- var firstAsset = assets [ 0 ]
86
- guard let urlString = firstAsset [ " url " ] as? String , var urlComponents = URLComponents ( string: urlString) else {
87
- return nil
88
- }
89
-
90
- // Update host if needed
91
- if urlComponents. host == " dl.dropboxusercontent.com " {
92
- urlComponents. host = " www.dropbox.com "
79
+ if ipaURLComponents. host == " dl.dropboxusercontent.com " {
80
+ ipaURLComponents. host = " www.dropbox.com "
93
81
}
94
82
95
- // ensure dl=1 is present to force direct download from Dropbox
96
- var queryItems = urlComponents. queryItems ?? [ ]
83
+ var queryItems = ipaURLComponents. queryItems ?? [ ]
97
84
let dlQueryItem = URLQueryItem ( name: " dl " , value: " 1 " )
98
- if let dlQueryItemIndex = queryItems. firstIndex ( where: { $0. name == dlQueryItem . name } ) {
99
- queryItems [ dlQueryItemIndex ] = dlQueryItem
85
+ if let index = queryItems. firstIndex ( where: { $0. name == " dl " } ) {
86
+ queryItems [ index ] = dlQueryItem
100
87
} else {
101
88
queryItems. append ( dlQueryItem)
102
89
}
103
- urlComponents. queryItems = queryItems
104
-
105
- // Set the modified URL back to the first asset
106
- if let newURL = urlComponents. string {
107
- firstAsset [ " url " ] = newURL
108
- assets [ 0 ] = firstAsset
109
- firstItem [ " assets " ] = assets
110
- items [ 0 ] = firstItem
111
- plist [ " items " ] = items
112
- } else {
90
+ ipaURLComponents. queryItems = queryItems
91
+
92
+ guard let newIPAURL = ipaURLComponents. string else {
113
93
return nil
114
94
}
115
95
116
- // Serialize the modified plist back to Data
117
- let newData = try PropertyListSerialization . data (
118
- fromPropertyList: plist,
119
- format: . xml,
120
- options: 0
121
- )
96
+ ipaAsset. url = newIPAURL
97
+
98
+ // Rebuild updated manifest
99
+ var updatedIPAManifest = ipaManifest
100
+ ipaItem. assets [ 0 ] = ipaAsset
101
+ updatedIPAManifest. items [ 0 ] = ipaItem
102
+
103
+ let encoder = PropertyListEncoder ( )
104
+ encoder. outputFormat = . xml
105
+ let newData = try encoder. encode ( updatedIPAManifest)
106
+
122
107
var newBuffer = ByteBufferAllocator ( ) . buffer ( capacity: newData. count)
123
108
newBuffer. writeBytes ( newData)
124
109
return newBuffer
125
110
} catch {
126
- logger. error ( " Manifest plist modification failed: \( error. localizedDescription) . \n Raw error: \( error ) " )
111
+ logger. error ( " Manifest plist modification failed: \( error. localizedDescription) . " )
127
112
return nil
128
113
}
129
114
}
0 commit comments