Skip to content

Commit 2454b7c

Browse files
committed
A windows artifacts signing with jsign
1 parent 6edf71e commit 2454b7c

File tree

10 files changed

+678
-8
lines changed

10 files changed

+678
-8
lines changed

build.gradle

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ plugins {
66
id 'com.gradle.plugin-publish' version '0.12.0'
77
id 'io.codearte.nexus-staging' version '0.21.2'
88
id 'eclipse'
9+
id 'de.undercouch.download' version '4.1.1'
910
}
1011

1112
repositories {
@@ -48,7 +49,8 @@ dependencies {
4849
implementation 'org.apache.velocity:velocity-engine-core:2.0'
4950
implementation 'io.github.fvarrui:gradle-launch4j:2.4.7'
5051
implementation 'com.netflix.nebula:gradle-ospackage-plugin:8.4.1'
51-
52+
implementation 'net.jsign:jsign-core:3.1'
53+
5254
testImplementation 'junit:junit:4.12'
5355

5456
compileOnly 'org.apache.maven.plugin-tools:maven-plugin-annotations:3.6.0'
@@ -210,3 +212,11 @@ nexusStaging {
210212
username = project.findProperty('ossrhUser') ?: ''
211213
password = project.findProperty('ossrhPassword') ?: ''
212214
}
215+
216+
task updateUniversalJavaApplicationStub(type: Download) {
217+
group 'Update'
218+
description 'Downloads universalJavaApplicationStub to src/main/resources/mac and overrides the existing one.'
219+
src 'https://github.com/fvarrui/universalJavaApplicationStub/releases/download/v3.1.0b/universalJavaApplicationStub'
220+
dest file('src/main/resources/mac')
221+
overwrite true
222+
}

src/main/java/io/github/fvarrui/javapackager/gradle/CreateWindowsExe.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@
1010

1111
import edu.sc.seis.launch4j.tasks.Launch4jLibraryTask;
1212
import io.github.fvarrui.javapackager.model.WindowsConfig;
13-
import io.github.fvarrui.javapackager.packagers.ArtifactGenerator;
1413
import io.github.fvarrui.javapackager.packagers.Context;
1514
import io.github.fvarrui.javapackager.packagers.Packager;
15+
import io.github.fvarrui.javapackager.packagers.WindowsArtifactGenerator;
1616
import io.github.fvarrui.javapackager.packagers.WindowsPackager;
1717
import io.github.fvarrui.javapackager.utils.FileUtils;
1818

1919
/**
2020
* Creates Windows native executable on Gradle context
2121
*/
22-
public class CreateWindowsExe extends ArtifactGenerator {
22+
public class CreateWindowsExe extends WindowsArtifactGenerator {
2323

2424
public CreateWindowsExe() {
2525
super("Windows EXE");
@@ -72,6 +72,8 @@ public File apply(Packager packager) throws Exception {
7272

7373
File generatedExe = new File(project.getBuildDir(), "launch4j/" + executable.getName());
7474

75+
sign(generatedExe, windowsPackager);
76+
7577
FileUtils.copyFileToFile(generatedExe, executable);
7678

7779
return executable;

src/main/java/io/github/fvarrui/javapackager/maven/CreateWindowsExe.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@
1919
import org.twdata.maven.mojoexecutor.MojoExecutor.Element;
2020

2121
import io.github.fvarrui.javapackager.model.WindowsConfig;
22-
import io.github.fvarrui.javapackager.packagers.ArtifactGenerator;
2322
import io.github.fvarrui.javapackager.packagers.Context;
2423
import io.github.fvarrui.javapackager.packagers.Packager;
24+
import io.github.fvarrui.javapackager.packagers.WindowsArtifactGenerator;
2525
import io.github.fvarrui.javapackager.packagers.WindowsPackager;
2626

2727
/**
2828
* Copies all dependencies to app folder on Maven context
2929
*
3030
*/
31-
public class CreateWindowsExe extends ArtifactGenerator {
31+
public class CreateWindowsExe extends WindowsArtifactGenerator {
3232

3333
public CreateWindowsExe() {
3434
super("Windows EXE");
@@ -108,6 +108,8 @@ public File apply(Packager packager) {
108108
Context.getMavenContext().getEnv()
109109
);
110110

111+
sign(executable, windowsPackager);
112+
111113
} catch (MojoExecutionException e) {
112114

113115
throw new RuntimeException(e);

src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class WindowsConfig implements Serializable {
3737
private boolean wrapJar = true;
3838
private LinkedHashMap<String, String> setupLanguages = new LinkedHashMap<>();
3939
private SetupMode setupMode = SetupMode.installForAllUsers;
40+
private WindowsSigning signing;
4041

4142
public File getIcoFile() {
4243
return icoFile;
@@ -238,6 +239,14 @@ public void setSetupMode(SetupMode setupMode) {
238239
this.setupMode = setupMode;
239240
}
240241

242+
public WindowsSigning getSigning() {
243+
return signing;
244+
}
245+
246+
public void setSigning(WindowsSigning signing) {
247+
this.signing = signing;
248+
}
249+
241250
@Override
242251
public String toString() {
243252
return "WindowsConfig [icoFile=" + icoFile + ", headerType=" + headerType + ", companyName=" + companyName
@@ -249,7 +258,7 @@ public String toString() {
249258
+ ", disableFinishedPage=" + disableFinishedPage + ", createDesktopIconTask=" + createDesktopIconTask
250259
+ ", generateSetup=" + generateSetup + ", generateMsi=" + generateMsi + ", generateMsm=" + generateMsm
251260
+ ", msiUpgradeCode=" + msiUpgradeCode + ", wrapJar=" + wrapJar + ", setupLanguages=" + setupLanguages
252-
+ ", setupMode=" + setupMode + "]";
261+
+ ", setupMode=" + setupMode + ", signing=" + signing + "]";
253262
}
254263

255264
/**
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package io.github.fvarrui.javapackager.model;
2+
3+
import java.io.File;
4+
5+
import org.apache.commons.lang3.StringUtils;
6+
7+
public class WindowsSigning {
8+
9+
private String storetype;
10+
private File keystore;
11+
private File certfile;
12+
private File keyfile;
13+
private String storepass;
14+
private String alias;
15+
private String keypass;
16+
private String alg;
17+
18+
public String getStoretype() {
19+
return storetype;
20+
}
21+
22+
public void setStoretype(String storetype) {
23+
this.storetype = storetype;
24+
}
25+
26+
public File getKeystore() {
27+
return keystore;
28+
}
29+
30+
public void setKeystore(File keystore) {
31+
this.keystore = keystore;
32+
}
33+
34+
public File getCertfile() {
35+
return certfile;
36+
}
37+
38+
public void setCertfile(File certfile) {
39+
this.certfile = certfile;
40+
}
41+
42+
public File getKeyfile() {
43+
return keyfile;
44+
}
45+
46+
public void setKeyfile(File keyfile) {
47+
this.keyfile = keyfile;
48+
}
49+
50+
public String getStorepass() {
51+
return storepass;
52+
}
53+
54+
public void setStorepass(String storepass) {
55+
this.storepass = storepass;
56+
}
57+
58+
public String getAlias() {
59+
return alias;
60+
}
61+
62+
public void setAlias(String alias) {
63+
this.alias = alias;
64+
}
65+
66+
public String getKeypass() {
67+
return keypass;
68+
}
69+
70+
public void setKeypass(String keypass) {
71+
this.keypass = keypass;
72+
}
73+
74+
public String getAlg() {
75+
return alg;
76+
}
77+
78+
public void setAlg(String alg) {
79+
this.alg = alg;
80+
}
81+
82+
@Override
83+
public String toString() {
84+
String keypass = this.keypass != null ? StringUtils.repeat("*", this.keypass.length()) : "";
85+
String storepass = this.storepass != null ? StringUtils.repeat("*", this.storepass.length()) : "";
86+
return "WindowsSigning [storetype=" + storetype + ", keystore=" + keystore + ", certfile=" + certfile
87+
+ ", keyfile=" + keyfile + ", storepass=" + storepass + ", alias=" + alias + ", keypass=" + keypass + ", alg=" + alg
88+
+ "]";
89+
}
90+
91+
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* Creates a MSI file including all app folder's content only for
1313
* Windows so app could be easily distributed
1414
*/
15-
public class GenerateMsi extends ArtifactGenerator {
15+
public class GenerateMsi extends WindowsArtifactGenerator {
1616

1717
public GenerateMsi() {
1818
super("MSI installer");
@@ -59,6 +59,9 @@ public File apply(Packager packager) throws Exception {
5959
throw new Exception("MSI installer file generation failed!");
6060
}
6161

62+
// sign installer
63+
sign(msiFile, windowsPackager);
64+
6265
return msiFile;
6366
}
6467

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* Creates a Setup file including all app folder's content only for
1212
* Windows so app could be easily distributed
1313
*/
14-
public class GenerateSetup extends ArtifactGenerator {
14+
public class GenerateSetup extends WindowsArtifactGenerator {
1515

1616
public GenerateSetup() {
1717
super("Setup installer");
@@ -48,6 +48,9 @@ public File apply(Packager packager) throws Exception {
4848
throw new Exception("Windows setup file generation failed!");
4949
}
5050

51+
// sign installer
52+
sign(setupFile, windowsPackager);
53+
5154
return setupFile;
5255
}
5356

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package io.github.fvarrui.javapackager.packagers;
2+
3+
import java.io.File;
4+
5+
import io.github.fvarrui.javapackager.utils.Logger;
6+
import io.github.fvarrui.javapackager.utils.SignerException;
7+
import io.github.fvarrui.javapackager.utils.SignerHelper;
8+
9+
public abstract class WindowsArtifactGenerator extends ArtifactGenerator {
10+
11+
private static final String TIMESTAMPING_AUTHORITY = "http://timestamp.comodoca.com/authenticode";
12+
13+
public WindowsArtifactGenerator() {
14+
super();
15+
}
16+
17+
public WindowsArtifactGenerator(String artifactName) {
18+
super(artifactName);
19+
}
20+
21+
protected void sign(File file, WindowsPackager packager) {
22+
if (packager.getWinConfig().getSigning() == null)
23+
return;
24+
25+
Logger.infoIndent("Signing " + file);
26+
27+
File keystore = packager.getWinConfig().getSigning().getKeystore();
28+
File certfile = packager.getWinConfig().getSigning().getCertfile();
29+
File keyfile = packager.getWinConfig().getSigning().getKeyfile();
30+
String alg = packager.getWinConfig().getSigning().getAlg();
31+
String storetype = packager.getWinConfig().getSigning().getStoretype();
32+
String storepass = packager.getWinConfig().getSigning().getStorepass();
33+
String alias = packager.getWinConfig().getSigning().getAlias();
34+
String keypass = packager.getWinConfig().getSigning().getKeypass();
35+
String tsa = TIMESTAMPING_AUTHORITY;
36+
String displayName = packager.getDisplayName();
37+
String url = packager.getUrl();
38+
39+
try {
40+
41+
SignerHelper helper = new SignerHelper();
42+
helper.name(displayName);
43+
helper.url(url);
44+
helper.alg(alg);
45+
helper.keystore(keystore);
46+
helper.storepass(storepass);
47+
helper.storetype(storetype);
48+
helper.alias(alias);
49+
helper.certfile(certfile);
50+
helper.keyfile(keyfile);
51+
helper.keypass(keypass);
52+
helper.tsaurl(tsa);
53+
helper.sign(file);
54+
55+
Logger.infoUnindent(file + " successfully signed!");
56+
57+
} catch (SignerException e) {
58+
59+
Logger.errorUnindent(file + " could not be signed", e);
60+
61+
}
62+
63+
}
64+
65+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.github.fvarrui.javapackager.utils;
2+
3+
@SuppressWarnings("serial")
4+
public class SignerException extends Exception {
5+
6+
public SignerException(String message) {
7+
super(message);
8+
}
9+
10+
public SignerException(String message, Throwable cause) {
11+
super(message, cause);
12+
}
13+
14+
}

0 commit comments

Comments
 (0)