|
1 | 1 | package io.github.fvarrui.javapackager.packagers; |
2 | 2 |
|
| 3 | +import io.github.fvarrui.javapackager.model.MacStartup; |
| 4 | +import io.github.fvarrui.javapackager.model.Platform; |
| 5 | +import io.github.fvarrui.javapackager.utils.*; |
| 6 | +import org.apache.commons.lang3.StringUtils; |
| 7 | +import org.apache.commons.lang3.SystemUtils; |
| 8 | +import org.codehaus.plexus.util.cli.CommandLineException; |
| 9 | + |
3 | 10 | import java.io.File; |
| 11 | +import java.io.IOException; |
4 | 12 | import java.util.ArrayList; |
5 | 13 | import java.util.Arrays; |
| 14 | +import java.util.Collection; |
6 | 15 | import java.util.List; |
7 | 16 | import java.util.stream.Collectors; |
8 | 17 |
|
9 | | -import org.apache.commons.lang3.StringUtils; |
10 | | -import org.apache.commons.lang3.SystemUtils; |
11 | | - |
12 | | -import io.github.fvarrui.javapackager.model.MacStartup; |
13 | | -import io.github.fvarrui.javapackager.model.Platform; |
14 | | -import io.github.fvarrui.javapackager.utils.CommandUtils; |
15 | | -import io.github.fvarrui.javapackager.utils.FileUtils; |
16 | | -import io.github.fvarrui.javapackager.utils.Logger; |
17 | | -import io.github.fvarrui.javapackager.utils.VelocityUtils; |
18 | | -import io.github.fvarrui.javapackager.utils.VersionUtils; |
19 | | -import io.github.fvarrui.javapackager.utils.XMLUtils; |
20 | | - |
21 | 18 | /** |
22 | 19 | * Packager for Mac OS X |
23 | 20 | */ |
@@ -200,41 +197,80 @@ private File preparePrecompiledStartupStub() throws Exception { |
200 | 197 |
|
201 | 198 | private void codesign(String developerId, File entitlements, File appFile) throws Exception { |
202 | 199 |
|
203 | | - // checks --option flags |
204 | | - List<String> flags = new ArrayList<>(); |
205 | | - if (macConfig.isHardenedCodesign()) { |
206 | | - if (VersionUtils.compareVersions("10.13.6", SystemUtils.OS_VERSION) >= 0) { |
207 | | - flags.add("runtime"); // enable hardened runtime if Mac OS version >= 10.13.6 |
208 | | - } else { |
209 | | - Logger.warn("Mac OS version detected: " + SystemUtils.OS_VERSION + " ... hardened runtime disabled!"); |
210 | | - } |
211 | | - } |
212 | | - |
| 200 | + prepareEntitlementFile(entitlements); |
| 201 | + |
| 202 | + manualDeepSign(appFile, developerId, entitlements); |
| 203 | + |
| 204 | + } |
| 205 | + |
| 206 | + private void prepareEntitlementFile(File entitlements) throws Exception { |
213 | 207 | // if entitlements.plist file not specified, use a default one |
214 | | - if (entitlements == null) { |
215 | | - Logger.warn("Entitlements file not specified. Using defaults!"); |
| 208 | + if (entitlements == null) { |
| 209 | + Logger.warn("Entitlements file not specified. Using defaults!"); |
216 | 210 | entitlements = new File(assetsFolder, "entitlements.plist"); |
217 | 211 | VelocityUtils.render("mac/entitlements.plist.vtl", entitlements, this); |
218 | 212 | } else if (!entitlements.exists()) { |
219 | 213 | throw new Exception("Entitlements file doesn't exist: " + entitlements); |
220 | 214 | } |
| 215 | + } |
| 216 | + |
| 217 | + private void manualDeepSign(File appFolder, String developerCertificateName, File entitlements) throws IOException, CommandLineException { |
| 218 | + |
| 219 | + List<Object> findCommandArgs = new ArrayList<>(); |
| 220 | + findCommandArgs.add(appFolder); |
| 221 | + findCommandArgs.add("-depth"); // execute 'codesign' in 'reverse order', i.e., deepest files first |
| 222 | + findCommandArgs.add("-type"); |
| 223 | + findCommandArgs.add("f"); // filter for files only |
| 224 | + findCommandArgs.add("-exec"); |
| 225 | + findCommandArgs.add("codesign"); |
| 226 | + findCommandArgs.add("-f"); |
| 227 | + |
| 228 | + addHardenedCodesign(findCommandArgs); |
| 229 | + |
| 230 | + findCommandArgs.add("-s"); |
| 231 | + findCommandArgs.add(developerCertificateName); |
| 232 | + findCommandArgs.add("--entitlements"); |
| 233 | + findCommandArgs.add(entitlements); |
| 234 | + findCommandArgs.add("{}"); |
| 235 | + findCommandArgs.add("\\;"); |
| 236 | + |
| 237 | + CommandUtils.execute("find", findCommandArgs.toArray(new Object[0])); |
| 238 | + |
| 239 | + // make sure the executable is signed last |
| 240 | + List<Object> codeSignCommandArgs = new ArrayList<>(); |
| 241 | + codeSignCommandArgs.add("-f"); |
| 242 | + addHardenedCodesign(codeSignCommandArgs); |
| 243 | + codeSignCommandArgs.add("--entitlements"); |
| 244 | + codeSignCommandArgs.add(entitlements); |
| 245 | + codeSignCommandArgs.add("-s"); |
| 246 | + codeSignCommandArgs.add(developerCertificateName); |
| 247 | + codeSignCommandArgs.add(this.executable); |
| 248 | + |
| 249 | + CommandUtils.execute("codesign", codeSignCommandArgs.toArray(new Object[0])); |
| 250 | + |
| 251 | + // finally, sign the top level directory |
| 252 | + List<Object> codeSignArgs2 = new ArrayList<>(); |
| 253 | + codeSignArgs2.add("-f"); |
| 254 | + addHardenedCodesign(codeSignArgs2); |
| 255 | + codeSignArgs2.add("--entitlements"); |
| 256 | + codeSignArgs2.add(entitlements); |
| 257 | + codeSignArgs2.add("-s"); |
| 258 | + codeSignArgs2.add(developerCertificateName); |
| 259 | + codeSignArgs2.add(appFolder); |
| 260 | + |
| 261 | + CommandUtils.execute("codesign", codeSignArgs2.toArray(new Object[0])); |
221 | 262 |
|
222 | | - // prepare params array |
223 | | - List<Object> codesignArgs = new ArrayList<>(); |
224 | | - codesignArgs.add("--force"); |
225 | | - if (!flags.isEmpty()) { |
226 | | - codesignArgs.add("--options"); |
227 | | - codesignArgs.add(StringUtils.join(flags, ",")); |
| 263 | + } |
| 264 | + |
| 265 | + private void addHardenedCodesign(Collection<Object> args){ |
| 266 | + if (macConfig.isHardenedCodesign()) { |
| 267 | + if (VersionUtils.compareVersions("10.13.6", SystemUtils.OS_VERSION) >= 0) { |
| 268 | + args.add("-o"); |
| 269 | + args.add("runtime"); // enable hardened runtime if Mac OS version >= 10.13.6 |
| 270 | + } else { |
| 271 | + Logger.warn("Mac OS version detected: " + SystemUtils.OS_VERSION + " ... hardened runtime disabled!"); |
| 272 | + } |
228 | 273 | } |
229 | | - codesignArgs.add("--deep"); |
230 | | - codesignArgs.add("--entitlements"); |
231 | | - codesignArgs.add(entitlements); |
232 | | - codesignArgs.add("--sign"); |
233 | | - codesignArgs.add(developerId); |
234 | | - codesignArgs.add(appFile); |
235 | | - |
236 | | - // run codesign |
237 | | - CommandUtils.execute("codesign", codesignArgs.toArray(new Object[codesignArgs.size()])); |
238 | 274 | } |
239 | 275 |
|
240 | 276 | } |
0 commit comments