Skip to content

Commit d8d9d91

Browse files
Fix predefined app image signing
1 parent f81dbab commit d8d9d91

File tree

4 files changed

+88
-23
lines changed

4 files changed

+88
-23
lines changed

src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacAppBundler.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,18 @@ public MacAppBundler() {
4343

4444
// Order is important!
4545
final var app = MacFromParams.APPLICATION.fetchFrom(params);
46-
final var env = BuildEnv.withAppImageDir(BuildEnvFromParams.BUILD_ENV.fetchFrom(params), output);
46+
final BuildEnv env;
4747

48-
MacPackagingPipeline.build(Optional.empty())
49-
.excludeDirFromCopying(output.getParent())
50-
.excludeDirFromCopying(OUTPUT_DIR.fetchFrom(params)).create().execute(env, app);
48+
if (StandardBundlerParam.hasPredefinedAppImage(params)) {
49+
env = BuildEnvFromParams.BUILD_ENV.fetchFrom(params);
50+
final var pkg = MacPackagingPipeline.createSignAppImagePackage(app, env);
51+
MacPackagingPipeline.build(Optional.of(pkg)).create().execute(env, pkg, output);
52+
} else {
53+
env = BuildEnv.withAppImageDir(BuildEnvFromParams.BUILD_ENV.fetchFrom(params), output);
54+
MacPackagingPipeline.build(Optional.empty())
55+
.excludeDirFromCopying(output.getParent())
56+
.excludeDirFromCopying(OUTPUT_DIR.fetchFrom(params)).create().execute(env, app);
57+
}
5158

5259
});
5360
setParamsValidator(MacAppBundler::doValidate);

src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromParams.java

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,19 @@
5454
import java.util.List;
5555
import java.util.Map;
5656
import java.util.Optional;
57+
import java.util.function.Predicate;
5758
import jdk.jpackage.internal.SigningConfigBuilder.StandardCertificateSelector;
5859
import jdk.jpackage.internal.model.ConfigException;
5960
import jdk.jpackage.internal.model.FileAssociation;
61+
import jdk.jpackage.internal.model.ApplicationLaunchers;
6062
import jdk.jpackage.internal.model.Launcher;
6163
import jdk.jpackage.internal.model.MacApplication;
6264
import jdk.jpackage.internal.model.MacDmgPackage;
6365
import jdk.jpackage.internal.model.MacFileAssociation;
6466
import jdk.jpackage.internal.model.MacLauncher;
6567
import jdk.jpackage.internal.model.MacPkgPackage;
6668
import jdk.jpackage.internal.model.RuntimeLayout;
69+
import static jdk.jpackage.internal.ApplicationBuilder.MainLauncherStartupInfo;
6770

6871

6972
final class MacFromParams {
@@ -81,15 +84,28 @@ private static MacApplication createMacApplication(
8184

8285
final var launcherFromParams = new LauncherFromParams(Optional.of(MacFromParams::createMacFa));
8386

84-
final var app = createApplicationBuilder(params, toFunction(launcherParams -> {
87+
final var superAppBuilder = createApplicationBuilder(params, toFunction(launcherParams -> {
8588
var launcher = launcherFromParams.create(launcherParams);
8689
return MacLauncher.create(launcher);
87-
}), APPLICATION_LAYOUT, predefinedRuntimeLayout).create();
90+
}), APPLICATION_LAYOUT, predefinedRuntimeLayout);
91+
92+
if (hasPredefinedAppImage(params)) {
93+
// Set the main launcher start up info.
94+
// AppImageFile assumes the main launcher start up info is available when
95+
// it is constructed from Application instance.
96+
// This happens when jpackage signs predefined app image.
97+
final var mainLauncherStartupInfo = new MainLauncherStartupInfo(PREDEFINED_APP_IMAGE_FILE.fetchFrom(params).getMainClass());
98+
final var launchers = superAppBuilder.launchers().orElseThrow();
99+
final var mainLauncher = ApplicationBuilder.overrideLauncherStartupInfo(launchers.mainLauncher(), mainLauncherStartupInfo);
100+
superAppBuilder.launchers(new ApplicationLaunchers(MacLauncher.create(mainLauncher), launchers.additionalLaunchers()));
101+
}
102+
103+
final var app = superAppBuilder.create();
88104

89105
final var appBuilder = new MacApplicationBuilder(app);
90106

91107
if (hasPredefinedAppImage(params)) {
92-
appBuilder.externalInfoPlistFile(PREDEFINED_APP_IMAGE.fetchFrom(params).resolve("Contents/Info.plist"));
108+
appBuilder.externalInfoPlistFile(PREDEFINED_APP_IMAGE.findIn(params).orElseThrow().resolve("Contents/Info.plist"));
93109
}
94110

95111
ICON.copyInto(params, appBuilder::icon);
@@ -100,10 +116,10 @@ private static MacApplication createMacApplication(
100116
final boolean sign;
101117
final boolean appStore;
102118

103-
if (hasPredefinedAppImage(params)) {
119+
if (hasPredefinedAppImage(params) && PACKAGE_TYPE.findIn(params).filter(Predicate.isEqual("app-image")).isEmpty()) {
104120
final var appImageFileExtras = new MacAppImageFileExtras(PREDEFINED_APP_IMAGE_FILE.fetchFrom(params));
105121
sign = appImageFileExtras.signed();
106-
appStore = APP_STORE.findIn(params).orElse(false);
122+
appStore = appImageFileExtras.appStore();
107123
} else {
108124
sign = SIGN_BUNDLE.findIn(params).orElse(false);
109125
appStore = APP_STORE.findIn(params).orElse(false);
@@ -200,6 +216,9 @@ private static MacFileAssociation createMacFa(FileAssociation fa, Map<String, ?
200216
static final BundlerParamInfo<String> APP_IMAGE_SIGN_IDENTITY = createStringBundlerParam(
201217
Arguments.CLIOptions.MAC_APP_IMAGE_SIGN_IDENTITY.getId());
202218

219+
private static final BundlerParamInfo<String> PACKAGE_TYPE = createStringBundlerParam(
220+
Arguments.CLIOptions.PACKAGE_TYPE.getId());
221+
203222
private static final BundlerParamInfo<String> FA_MAC_CFBUNDLETYPEROLE = createStringBundlerParam(
204223
Arguments.MAC_CFBUNDLETYPEROLE);
205224

src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPackagingPipeline.java

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525
package jdk.jpackage.internal;
2626

27+
import static jdk.jpackage.internal.ApplicationImageUtils.createWriteAppImageFileAction;
2728
import static jdk.jpackage.internal.util.PListWriter.writeArray;
2829
import static jdk.jpackage.internal.util.PListWriter.writeBoolean;
2930
import static jdk.jpackage.internal.util.PListWriter.writeDict;
@@ -39,9 +40,11 @@
3940
import java.nio.charset.StandardCharsets;
4041
import java.nio.file.Files;
4142
import java.nio.file.Path;
43+
import java.util.ArrayList;
4244
import java.util.HashMap;
4345
import java.util.List;
4446
import java.util.Map;
47+
import java.util.Objects;
4548
import java.util.Optional;
4649
import javax.xml.stream.XMLOutputFactory;
4750
import javax.xml.stream.XMLStreamException;
@@ -51,6 +54,7 @@
5154
import jdk.jpackage.internal.PackagingPipeline.BuildApplicationTaskID;
5255
import jdk.jpackage.internal.PackagingPipeline.CopyAppImageTaskID;
5356
import jdk.jpackage.internal.PackagingPipeline.PackageBuildEnv;
57+
import jdk.jpackage.internal.PackagingPipeline.PackageTaskID;
5458
import jdk.jpackage.internal.PackagingPipeline.PrimaryTaskID;
5559
import jdk.jpackage.internal.PackagingPipeline.TaskAction;
5660
import jdk.jpackage.internal.PackagingPipeline.TaskContext;
@@ -62,6 +66,7 @@
6266
import jdk.jpackage.internal.model.MacApplication;
6367
import jdk.jpackage.internal.model.MacFileAssociation;
6468
import jdk.jpackage.internal.model.Package;
69+
import jdk.jpackage.internal.model.PackageType;
6570
import jdk.jpackage.internal.model.PackagerException;
6671
import jdk.jpackage.internal.model.SigningConfig;
6772
import jdk.jpackage.internal.util.function.ThrowingConsumer;
@@ -81,6 +86,7 @@ enum MacBuildApplicationTaskID implements TaskID {
8186

8287
enum MacCopyAppImageTaskID implements TaskID {
8388
COPY_PACKAGE_FILE,
89+
REPLACE_APP_IMAGE_FILE,
8490
COPY_SIGN
8591
}
8692

@@ -117,6 +123,9 @@ static PackagingPipeline.Builder build(Optional<Package> pkg) {
117123
.task(MacBuildApplicationTaskID.PACKAGE_FILE)
118124
.packageAction(MacPackagingPipeline::writePackageFile)
119125
.addDependents(BuildApplicationTaskID.CONTENT).add()
126+
.task(MacCopyAppImageTaskID.REPLACE_APP_IMAGE_FILE)
127+
.addDependent(PrimaryTaskID.COPY_APP_IMAGE)
128+
.noaction().add()
120129
.task(MacCopyAppImageTaskID.COPY_PACKAGE_FILE)
121130
.packageAction(MacPackagingPipeline::writePackageFile)
122131
.addDependencies(CopyAppImageTaskID.COPY)
@@ -141,17 +150,49 @@ static PackagingPipeline.Builder build(Optional<Package> pkg) {
141150
.add();
142151

143152
pkg.ifPresent(p -> {
144-
if (p.isRuntimeInstaller() || (p.predefinedAppImage().isPresent() && ((MacApplication)p.app()).sign())) {
153+
final List<TaskID> disabledTasks = new ArrayList<>();
154+
155+
if (p.type() instanceof SignAppImagePackageType) {
156+
// This is a phony package signing predefined app image.
157+
// Don't create ".package" file.
158+
// Don't copy predefined app image, update it in place.
159+
// Disable running user script after app image ready.
160+
// Replace ".jpackage.xml" file.
161+
// Use app image layout.
162+
disabledTasks.add(MacCopyAppImageTaskID.COPY_PACKAGE_FILE);
163+
disabledTasks.add(CopyAppImageTaskID.COPY);
164+
disabledTasks.add(PackageTaskID.RUN_POST_IMAGE_USER_SCRIPT);
165+
builder.task(MacCopyAppImageTaskID.REPLACE_APP_IMAGE_FILE).applicationAction(createWriteAppImageFileAction()).add();
166+
builder.appImageLayoutForPackaging(Package::appImageLayout);
167+
} else if (p.isRuntimeInstaller() || (p.predefinedAppImage().isPresent() && ((MacApplication)p.app()).sign())) {
145168
// If this is a runtime package or a signed predefined app image,
146169
// don't create ".package" file and don't sign it.
147-
builder.task(MacCopyAppImageTaskID.COPY_PACKAGE_FILE).noaction().add();
148-
builder.task(MacCopyAppImageTaskID.COPY_SIGN).noaction().add();
170+
disabledTasks.add(MacCopyAppImageTaskID.COPY_PACKAGE_FILE);
171+
disabledTasks.add(MacCopyAppImageTaskID.COPY_SIGN);
172+
}
173+
174+
for (final var taskId : disabledTasks) {
175+
builder.task(taskId).noaction().add();
149176
}
150177
});
151178

152179
return builder;
153180
}
154181

182+
enum SignAppImagePackageType implements PackageType {
183+
VALUE;
184+
}
185+
186+
static Package createSignAppImagePackage(MacApplication app, BuildEnv env) {
187+
if (!app.sign()) {
188+
throw new IllegalArgumentException();
189+
}
190+
return toSupplier(() -> {
191+
return new PackageBuilder(app, SignAppImagePackageType.VALUE).predefinedAppImage(
192+
Objects.requireNonNull(env.appImageDir())).installDir(Path.of("/foo")).create();
193+
}).get();
194+
}
195+
155196
private static void copyAppImage(Package pkg, AppImageDesc srcAppImage,
156197
AppImageDesc dstAppImage) throws IOException {
157198
PackagingPipeline.copyAppImage(srcAppImage, dstAppImage, false/*!((MacApplication)pkg.app()).sign()*/);

src/jdk.jpackage/share/classes/jdk/jpackage/internal/AppImageBundler.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,20 +86,18 @@ public final boolean validate(Map<String, ? super Object> params)
8686
@Override
8787
public final Path execute(Map<String, ? super Object> params,
8888
Path outputParentDir) throws PackagerException {
89-
if (StandardBundlerParam.isRuntimeInstaller(params)) {
90-
return PREDEFINED_RUNTIME_IMAGE.fetchFrom(params);
91-
}
9289

93-
var predefinedAppImage = PREDEFINED_APP_IMAGE.fetchFrom(params);
94-
if (predefinedAppImage != null) {
95-
return predefinedAppImage;
96-
}
90+
final var predefinedAppImage = PREDEFINED_APP_IMAGE.fetchFrom(params);
9791

9892
try {
99-
Path rootDirectory = createRoot(params, outputParentDir);
100-
appImageSupplier.prepareApplicationFiles(params, rootDirectory);
101-
return rootDirectory;
102-
93+
if (predefinedAppImage == null) {
94+
Path rootDirectory = createRoot(params, outputParentDir);
95+
appImageSupplier.prepareApplicationFiles(params, rootDirectory);
96+
return rootDirectory;
97+
} else {
98+
appImageSupplier.prepareApplicationFiles(params, predefinedAppImage);
99+
return predefinedAppImage;
100+
}
103101
} catch (PackagerException pe) {
104102
throw pe;
105103
} catch (RuntimeException|IOException ex) {

0 commit comments

Comments
 (0)