Skip to content

Commit 12afbf1

Browse files
authored
Merge pull request #252 from kerner1000/feature/fix-code-signing
new codesign strategy
2 parents 50e5636 + 22ec24f commit 12afbf1

File tree

2 files changed

+77
-41
lines changed

2 files changed

+77
-41
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ dependencies {
4646
implementation 'org.apache.maven:maven-plugin-api:3.6.0'
4747
implementation 'org.codehaus.plexus:plexus-utils:3.1.1'
4848
implementation 'org.twdata.maven:mojo-executor:2.3.0'
49-
implementation 'commons-io:commons-io:2.7'
49+
implementation 'commons-io:commons-io:2.11.0'
5050
implementation 'org.apache.commons:commons-lang3:3.9'
5151
implementation 'org.apache.commons:commons-collections4:4.1'
5252
implementation 'org.apache.commons:commons-compress:1.21'
@@ -88,7 +88,7 @@ publishing {
8888

8989
java {
9090
withSourcesJar()
91-
// and/or analogously use “withJavadocJar()� to get a “javadocJar� task
91+
// and/or analogously use “withJavadocJar()” to get a “javadocJar” task
9292
}
9393

9494
install.repositories.mavenInstaller.pom.with {

src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java

Lines changed: 75 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
11
package io.github.fvarrui.javapackager.packagers;
22

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+
310
import java.io.File;
11+
import java.io.IOException;
412
import java.util.ArrayList;
513
import java.util.Arrays;
14+
import java.util.Collection;
615
import java.util.List;
716
import java.util.stream.Collectors;
817

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-
2118
/**
2219
* Packager for Mac OS X
2320
*/
@@ -200,41 +197,80 @@ private File preparePrecompiledStartupStub() throws Exception {
200197

201198
private void codesign(String developerId, File entitlements, File appFile) throws Exception {
202199

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 {
213207
// 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!");
216210
entitlements = new File(assetsFolder, "entitlements.plist");
217211
VelocityUtils.render("mac/entitlements.plist.vtl", entitlements, this);
218212
} else if (!entitlements.exists()) {
219213
throw new Exception("Entitlements file doesn't exist: " + entitlements);
220214
}
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]));
221262

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+
}
228273
}
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()]));
238274
}
239275

240276
}

0 commit comments

Comments
 (0)