[icedtea-web] RFC: Patch to fix PR794 (Class-Path element processing)
Deepak Bhole
dbhole at redhat.com
Tue Sep 27 15:07:59 PDT 2011
Hi,
Attached patch fixes PR794:
http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=794
ChangeLog:
2011-09-27 Deepak Bhole <dbhole at redhat.com>
PR794: IcedTea-Web does not work if a Web Start app jar has a Class-Path
element in the manifest.
* netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java
(retrieve): Blank out the Class-Path elements in manifest.
* netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
(activateJars): Only load Class-Path elements if this is an applet. Add a
security mapping for jars from the Class-Path.
Okay for HEAD and 1.1?
1.0 needs a fix as well, but it is slightly different and not a priority so I will do it later.
Cheers,
Deepak
-------------- next part --------------
diff -r 0a1733685325 NEWS
--- a/NEWS Fri Sep 23 12:14:39 2011 -0400
+++ b/NEWS Tue Sep 27 18:02:12 2011 -0400
@@ -11,6 +11,8 @@
New in release 1.1.3 (2011-XX-XX):
* Plugin
- PR782: Support building against npapi-sdk as well
+* Common
+ - PR794: IcedTea-Web does not work if a Web Start app jar has a Class-Path element in the manifest
New in release 1.1.2 (2011-08-31):
* Plugin
diff -r 0a1733685325 netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java
--- a/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java Fri Sep 23 12:14:39 2011 -0400
+++ b/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java Tue Sep 27 18:02:12 2011 -0400
@@ -94,7 +94,24 @@
if (UrlUtils.isLocalFile(localUrl)) {
// if it is known to us, just return the cached file
- return new JarFile(localUrl.getPath());
+ JarFile returnFile = new JarFile(localUrl.getPath());
+
+ try {
+
+ // Blank out the class-path because:
+ // 1) Web Start does not support it
+ // 2) For the plug-in, we want to cache files from class-path so we do it manually
+ returnFile.getManifest().getMainAttributes().putValue("Class-Path", "");
+
+ if (JNLPRuntime.isDebug()) {
+ System.err.println("Class-Path attribute cleared for " + returnFile.getName());
+ }
+
+ } catch (NullPointerException npe) {
+ // Discard NPE here. Maybe there was no manifest, maybe there were no attributes, etc.
+ }
+
+ return returnFile;
} else {
// throw new IllegalStateException("a non-local file in cache");
return null;
diff -r 0a1733685325 netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
--- a/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java Fri Sep 23 12:14:39 2011 -0400
+++ b/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java Tue Sep 27 18:02:12 2011 -0400
@@ -669,6 +669,7 @@
// add jar
File localFile = tracker.getCacheFile(jar.getLocation());
try {
+ SecurityDesc jarSecurity = file.getSecurity();
URL location = jar.getLocation(); // non-cacheable, use source location
if (localFile != null) {
// TODO: Should be toURI().toURL()
@@ -736,8 +737,6 @@
CachedJarFileCallback.getInstance().addMapping(fakeRemote, fileURL);
addURL(fakeRemote);
- SecurityDesc jarSecurity = file.getSecurity();
-
if (file instanceof PluginBridge) {
URL codebase = null;
@@ -779,7 +778,15 @@
JarFile jarFile = new JarFile(localFile.getAbsolutePath());
Manifest mf = jarFile.getManifest();
- classpaths.addAll(getClassPathsFromManifest(mf, jar.getLocation().getPath()));
+
+ if (file instanceof PluginBridge) {
+ for (String classpath: getClassPathsFromManifest(mf, jar.getLocation().getPath())) {
+ URL codebaseURL = file.getCodeBase();
+ jarLocationSecurityMap.put(new URL(codebaseURL.getProtocol() + "://" + codebaseURL.getHost() + classpath), jarSecurity);
+ classpaths.add(classpath);
+ }
+ }
+
JarIndex index = JarIndex.getJarIndex(jarFile, null);
if (index != null)
jarIndexes.add(index);
More information about the distro-pkg-dev
mailing list