Skip to content

Commit bde5a16

Browse files
committed
added 'mcx' option
1 parent bdf7244 commit bde5a16

File tree

1 file changed

+44
-20
lines changed

1 file changed

+44
-20
lines changed

Sources/plist2profile/Plist2Profile.swift

+44-20
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,12 @@ struct Plist2Profile: ParsableCommand {
5858
help: "sets the scope for the profile to 'User' (otherwise scope is 'System')"
5959
)
6060
var userScope = false
61-
62-
// TODO: option to create a modern or mcx profile
61+
62+
@Flag(
63+
name: .customLong("mcx"),
64+
help: "creates the profile in macx format (default: modern)"
65+
)
66+
var mcx = false
6367

6468
// MARK: variables
6569

@@ -121,26 +125,36 @@ struct Plist2Profile: ParsableCommand {
121125
}
122126
}
123127

124-
func createModernPayload(plistPath: String) throws -> NSDictionary {
125-
let payloadUUID = UUID()
126-
// determine filename from path
127-
let plistURL = URL(fileURLWithPath: plistPath)
128-
let plistname = plistURL.deletingPathExtension().lastPathComponent
129-
guard let payload = try? NSMutableDictionary(contentsOf: plistURL, error: ())
130-
else {
131-
try exit("file at '\(plistPath)' might not be a plist!", code: 65)
132-
}
128+
func createModernPayload(name: String, plist: NSDictionary) throws -> NSDictionary {
129+
let mutablePayload = plist.mutableCopy() as! NSMutableDictionary
133130
// payload keys
134-
payload["PayloadIdentifier"] = plistname
135-
payload["PayloadType"] = plistname
136-
payload["PayloadDisplayName"] = displayName
137-
payload["PayloadUUID"] = payloadUUID.uuidString
138-
payload["PayloadVersion"] = payloadVersion
131+
mutablePayload["PayloadIdentifier"] = name
132+
mutablePayload["PayloadType"] = name
133+
mutablePayload["PayloadDisplayName"] = displayName
134+
mutablePayload["PayloadUUID"] = UUID().uuidString
135+
mutablePayload["PayloadVersion"] = payloadVersion
139136

140137
if !organization.isEmpty {
141-
payload["PayloadOrganization"] = organization
138+
mutablePayload["PayloadOrganization"] = organization
142139
}
143-
return payload
140+
return mutablePayload
141+
}
142+
143+
func createMCXPayload(name: String, plist: NSDictionary) throws -> NSDictionary {
144+
let mcxPayload = NSMutableDictionary()
145+
mcxPayload["PayloadIdentifier"] = name
146+
mcxPayload["PayloadType"] = "com.apple.ManagedClient.preferences"
147+
mcxPayload["PayloadDisplayName"] = displayName
148+
mcxPayload["PayloadUUID"] = UUID().uuidString
149+
mcxPayload["PayloadVersion"] = payloadVersion
150+
151+
let prefSettings = NSDictionary(object: plist, forKey: "mcx_preference_settings" as NSString)
152+
let prefArray = NSArray(object: prefSettings)
153+
let forcedDict = NSDictionary(object: prefArray, forKey: "Forced" as NSString)
154+
let domainDict = NSDictionary(object: forcedDict, forKey: name as NSString)
155+
mcxPayload["PayloadContent"] = domainDict
156+
157+
return mcxPayload
144158
}
145159

146160
// MARK: run
@@ -167,9 +181,19 @@ struct Plist2Profile: ParsableCommand {
167181
let payloads = NSMutableArray()
168182

169183
for plistPath in plistPaths {
170-
let payload = try createModernPayload(plistPath: plistPath)
171-
payloads.add(payload)
172184

185+
// determine filename from path
186+
let plistURL = URL(fileURLWithPath: plistPath)
187+
let plistname = plistURL.deletingPathExtension().lastPathComponent
188+
guard let plistdict = try? NSDictionary(contentsOf: plistURL, error: ())
189+
else {
190+
try exit("file at '\(plistPath)' might not be a plist!", code: 65)
191+
}
192+
193+
let payload = mcx ? try createMCXPayload(name: plistname, plist: plistdict)
194+
: try createModernPayload(name: plistname, plist: plistdict)
195+
196+
payloads.add(payload)
173197
}
174198

175199
// insert payloads array

0 commit comments

Comments
 (0)