Compare commits

...

No commits in common. "imports/c8-beta/icedtea-web-1.7.1-9.el8" and "c8" have entirely different histories.

9 changed files with 894 additions and 4879 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/icedtea-web-1.7.1.tar.gz
SOURCES/icedtea-web-1.8.4.tar.gz

View File

@ -1 +1 @@
a484daa20cadefe4d4ba2c1e3b28dbb39c986f4b SOURCES/icedtea-web-1.7.1.tar.gz
08f339753946626f5f46d11120dce44d5e6f6540 SOURCES/icedtea-web-1.8.4.tar.gz

File diff suppressed because it is too large Load Diff

40
SOURCES/altjava.patch Normal file
View File

@ -0,0 +1,40 @@
--- IcedTea-Web-icedtea-web-1.8.4/shell-launcher/launchers.sh.in
+++ iIcedTea-Web-cedtea-web-1.8.4/shell-launcher/launchers.sh.in
@@ -193,6 +193,12 @@
shift
done
+java_dir="`dirname ${JAVA}`"
+alt_java="alt-java"
+if [ -e "$java_dir/$alt_java" ] ; then
+ JAVA="`dirname ${JAVA}`/$alt_java"
+fi
+
# TODO: inline args without using COMMAND[array] to unify linux/windows scripts
k=0
COMMAND[k]="${JAVA}"
--- IcedTea-Web-icedtea-web-1.8.4/rust-launcher/src/os_access.rs
+++ IcedTea-Web-icedtea-web-1.8.4/rust-launcher/src/os_access.rs
@@ -5,9 +5,19 @@
use log_helper;
pub fn create_java_cmd(os: &Os,jre_dir: &std::path::PathBuf, args: &Vec<String>) -> std::process::Command {
- let mut bin_java = jre_dir.clone();
- bin_java.push("bin");
- bin_java.push("java");
+ let mut alt_bin_java = jre_dir.clone();
+ alt_bin_java.push("bin");
+ alt_bin_java.push("alt-java");
+ let mut bin_java;
+ if alt_bin_java.exists() {
+ os.log("itw-rust-debug: alt-java found");
+ bin_java = alt_bin_java;
+ } else {
+ os.log("itw-rust-debug: alt-java NOT found");
+ bin_java = jre_dir.clone();
+ bin_java.push("bin");
+ bin_java.push("java");
+ }
let mut cmd = std::process::Command::new(&bin_java);
for ar in args.into_iter() {
cmd.arg(ar);

View File

@ -0,0 +1,735 @@
diff --git a/Makefile.am b/Makefile.am
index 3f73cff7..1112bf49 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -956,10 +956,10 @@ if ENABLE_NATIVE_LAUNCHERS
# there is curently harecoded sh, so it can somehow basically work
# see the DESKTOP_SUFFIX for final tuning
launcher.build/$(javaws) launcher.build/$(itweb_settings) launcher.build/$(policyeditor): rust-launcher/src/main.rs rust-launcher/Cargo.toml
- export ITW_TMP_REPLACEMENT=$(TESTS_DIR)/rust_tests_tmp ; \
- mkdir -p $$ITW_TMP_REPLACEMENT; \
filename=`basename $@` ; \
type=$${filename%.*} ; \
+ export ITW_TMP_REPLACEMENT=$(TESTS_DIR)/rust_tests_tmp/$$type ; \
+ mkdir -p $$ITW_TMP_REPLACEMENT; \
srcs=$(TOP_SRC_DIR)/rust-launcher ; \
outs=$(TOP_BUILD_DIR)/launcher.in.$$type ; \
mkdir -p launcher.build ; \
diff --git a/configure.ac b/configure.ac
index 5bcb1046..03796e39 100644
--- a/configure.ac
+++ b/configure.ac
@@ -71,7 +71,7 @@ AM_CONDITIONAL([ENABLE_NATIVE_LAUNCHERS], [test ! x"$RUSTC" = x -a ! x"$CARGO" =
build_linux=no
build_windows=no
case "${host_os}" in
- linux*)
+ linux*|freebsd*)
build_linux=yes
;;
cygwin*)
diff --git a/netx/net/sourceforge/jnlp/Launcher.java b/netx/net/sourceforge/jnlp/Launcher.java
index bcfd7b34..1ff42421 100644
--- a/netx/net/sourceforge/jnlp/Launcher.java
+++ b/netx/net/sourceforge/jnlp/Launcher.java
@@ -552,7 +552,7 @@ public class Launcher {
}
OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Starting application [" + mainName + "] ...");
-
+
Class<?> mainClass = app.getClassLoader().loadClass(mainName);
Method main = mainClass.getMethod("main", new Class<?>[] { String[].class });
@@ -572,6 +572,7 @@ public class Launcher {
main.setAccessible(true);
+ JNLPRuntime.addStartupTrackingEntry("invoking main()");
OutputController.getLogger().log("Invoking main() with args: " + Arrays.toString(args));
main.invoke(null, new Object[] { args });
diff --git a/netx/net/sourceforge/jnlp/OptionsDefinitions.java b/netx/net/sourceforge/jnlp/OptionsDefinitions.java
index c87b4a79..16ef46d3 100644
--- a/netx/net/sourceforge/jnlp/OptionsDefinitions.java
+++ b/netx/net/sourceforge/jnlp/OptionsDefinitions.java
@@ -78,6 +78,7 @@ public class OptionsDefinitions {
JNLP("-jnlp","BOJnlp", NumberOfArguments.ONE),
HTML("-html","BOHtml", NumberOfArguments.ONE_OR_MORE),
BROWSER("-browser", "BrowserArg", NumberOfArguments.ONE_OR_MORE),
+ STARTUP_TRACKER("-startuptracker","BOStartupTracker"),
//itweb settings
LIST("-list", "IBOList"),
GET("-get", "name", "IBOGet", NumberOfArguments.ONE_OR_MORE),
@@ -222,7 +223,8 @@ public class OptionsDefinitions {
OPTIONS.TRUSTNONE,
OPTIONS.JNLP,
OPTIONS.HTML,
- OPTIONS.BROWSER
+ OPTIONS.BROWSER,
+ OPTIONS.STARTUP_TRACKER
});
}
diff --git a/netx/net/sourceforge/jnlp/cache/CacheEntry.java b/netx/net/sourceforge/jnlp/cache/CacheEntry.java
index 3a241acb..c5f1f329 100644
--- a/netx/net/sourceforge/jnlp/cache/CacheEntry.java
+++ b/netx/net/sourceforge/jnlp/cache/CacheEntry.java
@@ -47,6 +47,8 @@ public class CacheEntry {
/** info about the cached file */
private final PropertiesFile properties;
+ private File localFile;
+
/**
* Create a CacheEntry for the resources specified as a remote
* URL.
@@ -58,8 +60,8 @@ public class CacheEntry {
this.location = location;
this.version = version;
- File infoFile = CacheUtil.getCacheFile(location, version);
- infoFile = new File(infoFile.getPath() + CacheDirectory.INFO_SUFFIX); // replace with something that can't be clobbered
+ this.localFile = CacheUtil.getCacheFile(location, version);
+ File infoFile = new File(localFile.getPath() + CacheDirectory.INFO_SUFFIX); // replace with something that can't be clobbered
properties = new PropertiesFile(infoFile, R("CAutoGen"));
}
@@ -130,7 +132,11 @@ public class CacheEntry {
* @return whether the cache contains the version
*/
public boolean isCurrent(long lastModified) {
- boolean cached = isCached();
+ return isCurrent(lastModified, null);
+ }
+
+ public boolean isCurrent(long lastModified, File cachedFile) {
+ boolean cached = isCached(cachedFile);
OutputController.getLogger().log("isCurrent:isCached " + cached);
if (!cached) {
@@ -153,7 +159,16 @@ public class CacheEntry {
* @return true if the resource is in the cache
*/
public boolean isCached() {
- File localFile = getCacheFile();
+ return isCached(null);
+ }
+
+ public boolean isCached(File cachedFile) {
+ final File localFile;
+ if (null == version && null != cachedFile) {
+ localFile = cachedFile;
+ } else {
+ localFile = getCacheFile();
+ }
if (!localFile.exists())
return false;
@@ -224,4 +239,7 @@ public class CacheEntry {
return properties.isHeldByCurrentThread();
}
+ public File getLocalFile() {
+ return localFile;
+ }
}
diff --git a/netx/net/sourceforge/jnlp/cache/CacheUtil.java b/netx/net/sourceforge/jnlp/cache/CacheUtil.java
index 486421b9..d298d203 100644
--- a/netx/net/sourceforge/jnlp/cache/CacheUtil.java
+++ b/netx/net/sourceforge/jnlp/cache/CacheUtil.java
@@ -422,14 +422,13 @@ public class CacheUtil {
* @return whether the cache contains the version
* @throws IllegalArgumentException if the source is not cacheable
*/
- public static boolean isCurrent(URL source, Version version, long lastModifed) {
+ public static boolean isCurrent(URL source, Version version, long lastModifed, CacheEntry entry, File cachedFile) {
if (!isCacheable(source, version))
throw new IllegalArgumentException(R("CNotCacheable", source));
try {
- CacheEntry entry = new CacheEntry(source, version); // could pool this
- boolean result = entry.isCurrent(lastModifed);
+ boolean result = entry.isCurrent(lastModifed, cachedFile);
OutputController.getLogger().log("isCurrent: " + source + " = " + result);
@@ -796,6 +795,8 @@ public class CacheUtil {
}
URL undownloaded[] = urlList.toArray(new URL[urlList.size()]);
+ final int maxUrls = Integer.parseInt(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_MAX_URLS_DOWNLOAD_INDICATOR));
+
listener = indicator.getListener(app, title, undownloaded);
do {
@@ -810,20 +811,30 @@ public class CacheUtil {
int percent = (int) ((100 * read) / Math.max(1, total));
+ int urlCounter = 0;
for (URL url : undownloaded) {
+ if (urlCounter > maxUrls) {
+ break;
+ }
listener.progress(url, "version",
tracker.getAmountRead(url),
tracker.getTotalSize(url),
percent);
+ urlCounter += 1;
}
} while (!tracker.waitForResources(resources, indicator.getUpdateRate()));
// make sure they read 100% until indicator closes
+ int urlCounter = 0;
for (URL url : undownloaded) {
+ if (urlCounter > maxUrls) {
+ break;
+ }
listener.progress(url, "version",
tracker.getTotalSize(url),
tracker.getTotalSize(url),
100);
+ urlCounter += 1;
}
} catch (InterruptedException ex) {
OutputController.getLogger().log(ex);
diff --git a/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java b/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java
index 1cd4df23..ff48662d 100644
--- a/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java
+++ b/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java
@@ -36,9 +36,14 @@
exception statement from your version. */
package net.sourceforge.jnlp.cache;
+import net.sourceforge.jnlp.config.DeploymentConfiguration;
+import net.sourceforge.jnlp.runtime.JNLPRuntime;
+
import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class CachedDaemonThreadPoolProvider {
@@ -81,6 +86,19 @@ public class CachedDaemonThreadPoolProvider {
}
}
- public static final ExecutorService DAEMON_THREAD_POOL = Executors.newCachedThreadPool(new DaemonThreadFactory());
+ public static synchronized ExecutorService getThreadPool() {
+ if (null == DAEMON_THREAD_POOL) {
+ final int nThreads = Integer.parseInt(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_BACKGROUND_THREADS_COUNT));
+ ThreadPoolExecutor pool = new ThreadPoolExecutor(nThreads, nThreads,
+ 60L, TimeUnit.SECONDS,
+ new LinkedBlockingQueue<Runnable>(),
+ new DaemonThreadFactory());
+ pool.allowCoreThreadTimeOut(true);
+ DAEMON_THREAD_POOL = pool;
+ }
+ return DAEMON_THREAD_POOL;
+ }
+
+ private static ExecutorService DAEMON_THREAD_POOL = null;
}
diff --git a/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java b/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java
index 643b46fd..e0a123bb 100644
--- a/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java
+++ b/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java
@@ -153,7 +153,12 @@ public class ResourceDownloader implements Runnable {
URLConnection connection = ConnectionFactory.getConnectionFactory().openConnection(location.URL); // this won't change so should be okay not-synchronized
connection.addRequestProperty("Accept-Encoding", "pack200-gzip, gzip");
- File localFile = CacheUtil.getCacheFile(resource.getLocation(), resource.getDownloadVersion());
+ File localFile = null;
+ if (resource.getRequestVersion() == resource.getDownloadVersion()) {
+ localFile = entry.getLocalFile();
+ } else {
+ localFile = CacheUtil.getCacheFile(resource.getLocation(), resource.getDownloadVersion());
+ }
Long size = location.length;
if (size == null) {
size = connection.getContentLengthLong();
@@ -162,7 +167,7 @@ public class ResourceDownloader implements Runnable {
if (lm == null) {
lm = connection.getLastModified();
}
- boolean current = CacheUtil.isCurrent(resource.getLocation(), resource.getRequestVersion(), lm) && resource.getUpdatePolicy() != UpdatePolicy.FORCE;
+ boolean current = CacheUtil.isCurrent(resource.getLocation(), resource.getRequestVersion(), lm, entry, localFile) && resource.getUpdatePolicy() != UpdatePolicy.FORCE;
if (!current) {
if (entry.isCached()) {
entry.markForDelete();
diff --git a/netx/net/sourceforge/jnlp/cache/ResourceTracker.java b/netx/net/sourceforge/jnlp/cache/ResourceTracker.java
index f4ad69be..972a10cf 100644
--- a/netx/net/sourceforge/jnlp/cache/ResourceTracker.java
+++ b/netx/net/sourceforge/jnlp/cache/ResourceTracker.java
@@ -28,10 +28,7 @@ import static net.sourceforge.jnlp.cache.Resource.Status.PROCESSING;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.List;
+import java.util.*;
import net.sourceforge.jnlp.DownloadOptions;
import net.sourceforge.jnlp.Version;
@@ -105,6 +102,7 @@ public class ResourceTracker {
/** the resources known about by this resource tracker */
private final List<Resource> resources = new ArrayList<>();
+ private final HashMap<String, Resource> resourcesMap = new HashMap<>();
/** download listeners for this tracker */
private final List<DownloadListener> listeners = new ArrayList<>();
@@ -155,6 +153,7 @@ public class ResourceTracker {
return;
resource.addTracker(this);
resources.add(resource);
+ resourcesMap.put(location.toString(), resource);
}
if (options == null) {
@@ -190,6 +189,7 @@ public class ResourceTracker {
if (resource != null) {
resources.remove(resource);
+ resourcesMap.remove(location.toString());
resource.removeTracker(this);
}
@@ -508,7 +508,7 @@ public class ResourceTracker {
* @param resource resource to be download
*/
protected void startDownloadThread(Resource resource) {
- CachedDaemonThreadPoolProvider.DAEMON_THREAD_POOL.execute(new ResourceDownloader(resource, lock));
+ CachedDaemonThreadPoolProvider.getThreadPool().execute(new ResourceDownloader(resource, lock));
}
static Resource selectByFilter(Collection<Resource> source, Filter<Resource> filter) {
@@ -569,6 +569,12 @@ public class ResourceTracker {
*/
private Resource getResource(URL location) {
synchronized (resources) {
+ if (null != location) {
+ Resource res = resourcesMap.get(location.toString());
+ if (null != res && UrlUtils.urlEquals(res.getLocation(), location)) {
+ return res;
+ }
+ }
for (Resource resource : resources) {
if (UrlUtils.urlEquals(resource.getLocation(), location))
return resource;
diff --git a/netx/net/sourceforge/jnlp/config/Defaults.java b/netx/net/sourceforge/jnlp/config/Defaults.java
index 8e316e4f..78f9b3e6 100644
--- a/netx/net/sourceforge/jnlp/config/Defaults.java
+++ b/netx/net/sourceforge/jnlp/config/Defaults.java
@@ -466,6 +466,21 @@ public class Defaults {
BasicValueValidators.getRangedIntegerValidator(0, 1000),
String.valueOf(10)// treshold when applet is considered as too small
},
+ {
+ DeploymentConfiguration.KEY_ENABLE_CACHE_FSYNC,
+ BasicValueValidators.getBooleanValidator(),
+ String.valueOf(false)
+ },
+ {
+ DeploymentConfiguration.KEY_BACKGROUND_THREADS_COUNT,
+ BasicValueValidators.getRangedIntegerValidator(1, 16),
+ String.valueOf(3)
+ },
+ {
+ DeploymentConfiguration.KEY_MAX_URLS_DOWNLOAD_INDICATOR,
+ BasicValueValidators.getRangedIntegerValidator(1, 1024),
+ String.valueOf(16)
+ },
//**************
//* Native (rust) only - beggin
//**************
diff --git a/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java b/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java
index de7425e3..84f77075 100644
--- a/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java
+++ b/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java
@@ -250,7 +250,10 @@ public final class DeploymentConfiguration {
public static final String KEY_SMALL_SIZE_OVERRIDE_TRESHOLD = "deployment.small.size.treshold";
public static final String KEY_SMALL_SIZE_OVERRIDE_WIDTH = "deployment.small.size.override.width";
public static final String KEY_SMALL_SIZE_OVERRIDE_HEIGHT = "deployment.small.size.override.height";
-
+ public static final String KEY_ENABLE_CACHE_FSYNC = "deployment.enable.cache.fsync";
+ public static final String KEY_BACKGROUND_THREADS_COUNT = "deployment.background.threads.count";
+ public static final String KEY_MAX_URLS_DOWNLOAD_INDICATOR = "deployment.max.urls.download.indicator";
+
public static final String TRANSFER_TITLE = "Legacy configuration and cache found. Those will be now transported to new locations";
private ConfigurationException loadingException = null;
diff --git a/netx/net/sourceforge/jnlp/resources/Messages.properties b/netx/net/sourceforge/jnlp/resources/Messages.properties
index 773f134b..0e87bce3 100644
--- a/netx/net/sourceforge/jnlp/resources/Messages.properties
+++ b/netx/net/sourceforge/jnlp/resources/Messages.properties
@@ -357,6 +357,7 @@ BXoffline = Prevent ITW network connection. Only cache will be used. Applicati
BOHelp1 = Prints out information about supported command and basic usage.
BOHelp2 = Prints out information about supported command and basic usage. Can also take an parameter, and then it prints detailed help for this command.
BOTrustnone = Instead of asking user, will foretold all answers as no.
+BOStartupTracker = Enable startup time tracker
# Itweb-settings boot commands
IBOList=Shows a list of all the IcedTea-Web settings and their current values.
diff --git a/netx/net/sourceforge/jnlp/runtime/Boot.java b/netx/net/sourceforge/jnlp/runtime/Boot.java
index 7317b989..a9990909 100644
--- a/netx/net/sourceforge/jnlp/runtime/Boot.java
+++ b/netx/net/sourceforge/jnlp/runtime/Boot.java
@@ -107,6 +107,10 @@ public final class Boot implements PrivilegedAction<Void> {
optionParser = new OptionParser(argsIn, OptionsDefinitions.getJavaWsOptions());
+ if (optionParser.hasOption(OptionsDefinitions.OPTIONS.STARTUP_TRACKER)) {
+ JNLPRuntime.initStartupTracker();
+ }
+
if (optionParser.hasOption(OptionsDefinitions.OPTIONS.VERBOSE)) {
JNLPRuntime.setDebug(true);
}
diff --git a/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java b/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java
index 9746f5d0..811d132e 100644
--- a/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java
+++ b/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java
@@ -43,6 +43,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.security.AccessController;
@@ -103,9 +104,11 @@ final class CachedJarFileCallback implements URLJarFileCallBack {
if (UrlUtils.isLocalFile(localUrl)) {
// if it is known to us, just return the cached file
- JarFile returnFile = new JarFile(localUrl.getPath());
+ JarFile returnFile=null;
try {
+ localUrl.toURI().getPath();
+ returnFile = new JarFile(localUrl.toURI().getPath());
// Blank out the class-path because:
// 1) Web Start does not support it
@@ -117,6 +120,8 @@ final class CachedJarFileCallback implements URLJarFileCallBack {
} catch (NullPointerException npe) {
// Discard NPE here. Maybe there was no manifest, maybe there were no attributes, etc.
+ } catch (URISyntaxException e) {
+ // should not happen as localUrl was built using localFile.toURI().toURL(), see JNLPClassLoader.activateJars(List<JARDesc>)
}
return returnFile;
diff --git a/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java b/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
index 3785707a..77576fdd 100644
--- a/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
+++ b/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
@@ -709,7 +709,9 @@ public class JNLPClassLoader extends URLClassLoader {
fillInPartJars(initialJars); // add in each initial part's lazy jars
}
+ JNLPRuntime.addStartupTrackingEntry("JARs download enter");
waitForJars(initialJars); //download the jars first.
+ JNLPRuntime.addStartupTrackingEntry("JARs download complete");
//A ZipException will propagate later on if the jar is invalid and not checked here
if (shouldFilterInvalidJars()) {
diff --git a/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java b/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java
index 295744db..919f78fd 100644
--- a/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java
+++ b/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java
@@ -170,6 +170,7 @@ public class JNLPRuntime {
private static Boolean onlineDetected = null;
+ private static long startupTrackerMoment = 0;
/**
* Header is not checked and so eg
@@ -891,6 +892,19 @@ public class JNLPRuntime {
JNLPRuntime.ignoreHeaders = ignoreHeaders;
}
+ // may only be called from Boot
+ public static void initStartupTracker() {
+ startupTrackerMoment = System.currentTimeMillis();
+ }
+
+ public static void addStartupTrackingEntry(String message) {
+ if (startupTrackerMoment > 0) {
+ long time = (System.currentTimeMillis() - startupTrackerMoment)/1000;
+ String msg = "Startup tracker: seconds elapsed: [" + time + "], message: [" + message + "]";
+ OutputController.getLogger().log(OutputController.Level.ERROR_ALL, msg);
+ }
+ }
+
private static boolean isPluginDebug() {
if (pluginDebug == null) {
try {
diff --git a/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java b/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java
index eb26dc69..7fd5d92f 100644
--- a/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java
+++ b/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java
@@ -39,15 +39,18 @@ import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Vector;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
import java.util.jar.JarEntry;
import java.util.regex.Pattern;
import net.sourceforge.jnlp.JARDesc;
import net.sourceforge.jnlp.JNLPFile;
import net.sourceforge.jnlp.LaunchException;
+import net.sourceforge.jnlp.cache.CachedDaemonThreadPoolProvider;
import net.sourceforge.jnlp.cache.ResourceTracker;
import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate;
+import net.sourceforge.jnlp.runtime.JNLPRuntime;
import net.sourceforge.jnlp.security.AppVerifier;
import net.sourceforge.jnlp.security.CertVerifier;
import net.sourceforge.jnlp.security.CertificateUtils;
@@ -226,37 +229,36 @@ public class JarCertVerifier implements CertVerifier {
private void verifyJars(List<JARDesc> jars, ResourceTracker tracker)
throws Exception {
+ List<String> filesToVerify = new ArrayList<>();
for (JARDesc jar : jars) {
+ File jarFile = tracker.getCacheFile(jar.getLocation());
- try {
-
- File jarFile = tracker.getCacheFile(jar.getLocation());
-
- // some sort of resource download/cache error. Nothing to add
- // in that case ... but don't fail here
- if (jarFile == null) {
- continue;
- }
+ // some sort of resource download/cache error. Nothing to add
+ // in that case ... but don't fail here
+ if (jarFile == null) {
+ continue;
+ }
- String localFile = jarFile.getAbsolutePath();
- if (verifiedJars.contains(localFile)
- || unverifiedJars.contains(localFile)) {
- continue;
- }
+ String localFile = jarFile.getAbsolutePath();
+ if (verifiedJars.contains(localFile)
+ || unverifiedJars.contains(localFile)) {
+ continue;
+ }
- VerifyResult result = verifyJar(localFile);
+ filesToVerify.add(localFile);
+ }
- if (result == VerifyResult.UNSIGNED) {
- unverifiedJars.add(localFile);
- } else if (result == VerifyResult.SIGNED_NOT_OK) {
- verifiedJars.add(localFile);
- } else if (result == VerifyResult.SIGNED_OK) {
- verifiedJars.add(localFile);
- }
- } catch (Exception e) {
- // We may catch exceptions from using verifyJar()
- // or from checkTrustedCerts
- throw e;
+ List<VerifiedJarFile> verified = verifyJarsParallel(filesToVerify);
+
+ for (VerifiedJarFile vjf : verified) {
+ VerifyResult result = verifyJarEntryCerts(vjf.file, vjf.hasManifest, vjf.entriesVec);
+ String localFile = vjf.file;
+ if (result == VerifyResult.UNSIGNED) {
+ unverifiedJars.add(localFile);
+ } else if (result == VerifyResult.SIGNED_NOT_OK) {
+ verifiedJars.add(localFile);
+ } else if (result == VerifyResult.SIGNED_OK) {
+ verifiedJars.add(localFile);
}
}
@@ -264,6 +266,31 @@ public class JarCertVerifier implements CertVerifier {
checkTrustedCerts(certPath);
}
+ private List<VerifiedJarFile> verifyJarsParallel(List<String> files) throws Exception {
+ JNLPRuntime.addStartupTrackingEntry("JARs verification enter");
+ List<Callable<VerifiedJarFile>> callables = new ArrayList<>(files.size());
+ for (final String fi : files) {
+ callables.add(new Callable<VerifiedJarFile>() {
+ @Override
+ public VerifiedJarFile call() throws Exception {
+ return verifyJar(fi);
+ }
+ });
+ }
+ List<Future<VerifiedJarFile>> futures = CachedDaemonThreadPoolProvider.getThreadPool().invokeAll(callables);
+ List<VerifiedJarFile> results = new ArrayList<>(files.size());
+ try {
+ for (Future<VerifiedJarFile> fu : futures) {
+ results.add(fu.get());
+ }
+ } catch (Exception e) {
+ OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e);
+ throw e;
+ }
+ JNLPRuntime.addStartupTrackingEntry("JARs verification complete");
+ return results;
+ }
+
/**
* Checks through all the jar entries of jarName for signers, storing all the common ones in the certs hash map.
*
@@ -273,15 +300,15 @@ public class JarCertVerifier implements CertVerifier {
* @throws Exception
* Will be thrown if there are any problems with the jar.
*/
- private VerifyResult verifyJar(String jarName) throws Exception {
+ private VerifiedJarFile verifyJar(String jarName) throws Exception {
try (JarFile jarFile = new JarFile(jarName, true)) {
- Vector<JarEntry> entriesVec = new Vector<JarEntry>();
+ List<JarEntry> entriesVec = new ArrayList<>();
byte[] buffer = new byte[8192];
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry je = entries.nextElement();
- entriesVec.addElement(je);
+ entriesVec.add(je);
InputStream is = jarFile.getInputStream(je);
try {
@@ -295,8 +322,7 @@ public class JarCertVerifier implements CertVerifier {
}
}
}
- return verifyJarEntryCerts(jarName, jarFile.getManifest() != null,
- entriesVec);
+ return new VerifiedJarFile(jarName, null != jarFile.getManifest(), entriesVec);
} catch (Exception e) {
OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e);
@@ -318,7 +344,7 @@ public class JarCertVerifier implements CertVerifier {
* Will be thrown if there are issues with entries.
*/
VerifyResult verifyJarEntryCerts(String jarName, boolean jarHasManifest,
- Vector<JarEntry> entries) throws Exception {
+ List<JarEntry> entries) throws Exception {
// Contains number of entries the cert with this CertPath has signed.
Map<CertPath, Integer> jarSignCount = new HashMap<>();
int numSignableEntriesInJar = 0;
@@ -629,4 +655,16 @@ public class JarCertVerifier implements CertVerifier {
}
return sum;
}
+
+ private static class VerifiedJarFile {
+ final String file;
+ final boolean hasManifest;
+ private final List<JarEntry> entriesVec;
+
+ private VerifiedJarFile(String file, boolean hasManifest, List<JarEntry> entriesVec) {
+ this.file = file;
+ this.hasManifest = hasManifest;
+ this.entriesVec = entriesVec;
+ }
+ }
}
diff --git a/netx/net/sourceforge/jnlp/util/PropertiesFile.java b/netx/net/sourceforge/jnlp/util/PropertiesFile.java
index 2f0918f6..c399ef20 100644
--- a/netx/net/sourceforge/jnlp/util/PropertiesFile.java
+++ b/netx/net/sourceforge/jnlp/util/PropertiesFile.java
@@ -23,6 +23,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
+import net.sourceforge.jnlp.config.DeploymentConfiguration;
+import net.sourceforge.jnlp.runtime.JNLPRuntime;
import net.sourceforge.jnlp.util.lockingfile.LockedFile;
import net.sourceforge.jnlp.util.logging.OutputController;
@@ -168,7 +170,9 @@ public class PropertiesFile extends Properties {
store(s, header);
// fsync()
- s.getChannel().force(true);
+ if (Boolean.parseBoolean(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_ENABLE_CACHE_FSYNC))) {
+ s.getChannel().force(true);
+ }
lastStore = file.lastModified();
} finally {
if (s != null) s.close();
diff --git a/tests/netx/unit/net/sourceforge/jnlp/runtime/CachedJarFileCallbackTest.java b/tests/netx/unit/net/sourceforge/jnlp/runtime/CachedJarFileCallbackTest.java
new file mode 100644
index 00000000..bc564db5
--- /dev/null
+++ b/tests/netx/unit/net/sourceforge/jnlp/runtime/CachedJarFileCallbackTest.java
@@ -0,0 +1,55 @@
+package net.sourceforge.jnlp.runtime;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.List;
+import java.util.jar.JarFile;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import net.sourceforge.jnlp.util.FileTestUtils;
+import net.sourceforge.jnlp.util.FileUtils;
+
+public class CachedJarFileCallbackTest {
+ private File tempDirectory;
+
+ @Before
+ public void before() throws IOException {
+ tempDirectory = FileTestUtils.createTempDirectory();
+ }
+
+ @After
+ public void after() throws IOException {
+ FileUtils.recursiveDelete(tempDirectory, tempDirectory.getParentFile());
+ }
+
+ @Test
+ public void testRetrieve() throws Exception {
+ List<String> names = Arrays.asList("test1.0.jar", "test@1.0.jar");
+
+ for (String name: names) {
+ // URL-encode the filename
+ name = URLEncoder.encode(name, StandardCharsets.UTF_8.name());
+ // create temp jar file
+ File jarFile = new File(tempDirectory, name);
+ FileTestUtils.createJarWithContents(jarFile /* no contents */);
+
+ // JNLPClassLoader.activateJars uses toUri().toURL() to get the local file URL
+ URL localUrl = jarFile.toURI().toURL();
+ URL remoteUrl = new URL("http://localhost/" + name);
+ // add jar to cache
+ CachedJarFileCallback cachedJarFileCallback = CachedJarFileCallback.getInstance();
+ cachedJarFileCallback.addMapping(remoteUrl, localUrl);
+ // retrieve from cache (throws exception if file not found)
+ try (JarFile fromCacheJarFile = cachedJarFileCallback.retrieve(remoteUrl)) {
+ // nothing to do, we just wanted to make sure that the local file existed
+ }
+ }
+ }
+}

View File

@ -1,91 +0,0 @@
diff -r b64b383a4561 netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java
--- a/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java Mon May 14 17:11:41 2018 +0200
+++ b/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java Wed May 23 10:35:17 2018 +0200
@@ -19,6 +19,9 @@
import static net.sourceforge.jnlp.runtime.Translator.R;
import java.awt.EventQueue;
+import java.awt.GraphicsEnvironment;
+import static java.awt.GraphicsEnvironment.isHeadless;
+import java.awt.HeadlessException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -741,8 +744,10 @@
}
if (!headless) {
try {
- new JWindow().getOwner();
- } catch (Exception ex) {
+ if (GraphicsEnvironment.isHeadless()) {
+ throw new HeadlessException();
+ }
+ } catch (HeadlessException ex) {
headless = true;
OutputController.getLogger().log(ex);
OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("HEADLESS_MISSCONFIGURED"));
diff -r 0b0da6841278 -r 348532e210c0 netx/net/sourceforge/jnlp/config/Defaults.java
--- a/netx/net/sourceforge/jnlp/config/Defaults.java Mon May 28 12:01:56 2018 +0200
+++ b/netx/net/sourceforge/jnlp/config/Defaults.java Mon May 28 12:29:35 2018 +0200
@@ -412,6 +412,11 @@
BasicValueValidators.getRangedIntegerValidator(0, 10000),
String.valueOf(500)
},
+ {
+ DeploymentConfiguration.IGNORE_HEADLESS_CHECK,
+ BasicValueValidators.getBooleanValidator(),
+ String.valueOf(false)
+ },
//JVM arguments for plugin
{
DeploymentConfiguration.KEY_PLUGIN_JVM_ARGUMENTS,
diff -r 0b0da6841278 -r 348532e210c0 netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java
--- a/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java Mon May 28 12:01:56 2018 +0200
+++ b/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java Mon May 28 12:29:35 2018 +0200
@@ -222,6 +222,8 @@
public static final String KEY_BROWSER_PATH = "deployment.browser.path";
public static final String KEY_UPDATE_TIMEOUT = "deployment.javaws.update.timeout";
+
+ public static final String IGNORE_HEADLESS_CHECK = "deployment.headless.ignore";
/*
* JVM arguments for plugin
diff -r 0b0da6841278 -r 348532e210c0 netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java
--- a/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java Mon May 28 12:01:56 2018 +0200
+++ b/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java Mon May 28 12:29:35 2018 +0200
@@ -739,18 +739,24 @@
//if (GraphicsEnvironment.isHeadless()) // jdk1.4+ only
// headless = true;
try {
- if ("true".equalsIgnoreCase(System.getProperty("java.awt.headless"))){
+ if ("true".equalsIgnoreCase(System.getProperty("java.awt.headless"))) {
headless = true;
}
if (!headless) {
- try {
- if (GraphicsEnvironment.isHeadless()) {
- throw new HeadlessException();
+ boolean noCheck = Boolean.valueOf(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.IGNORE_HEADLESS_CHECK));
+ if (noCheck) {
+ headless = false;
+ OutputController.getLogger().log(DeploymentConfiguration.IGNORE_HEADLESS_CHECK + " set to " + noCheck + ". Avoding headless check.");
+ } else {
+ try {
+ if (GraphicsEnvironment.isHeadless()) {
+ throw new HeadlessException();
+ }
+ } catch (HeadlessException ex) {
+ headless = true;
+ OutputController.getLogger().log(ex);
+ OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("HEADLESS_MISSCONFIGURED"));
}
- } catch (HeadlessException ex) {
- headless = true;
- OutputController.getLogger().log(ex);
- OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("HEADLESS_MISSCONFIGURED"));
}
}
} catch (SecurityException ex) {

View File

@ -1,40 +0,0 @@
# HG changeset patch
# User Jiri Vanek <jvanek@redhat.com>
# Date 1526310938 -7200
# Mon May 14 17:15:38 2018 +0200
# Node ID bcbef8d7bbd6369b3c8d545469e1c56e47075d9d
# Parent 4abd0f0897738289a19ef9238f02c6e9dafee6a4
AppletEnvironment.java: getDocumentBase no returns codeBase as fallback when documentBase is null.
Oracle Applications R12, Oracle Forms Java Webstart application is requesting getDocumentBase where it shouldn't, however they refuse to modify their code and add ITW to supported platforms
diff -r 4abd0f089773 -r bcbef8d7bbd6 ChangeLog
--- a/ChangeLog Fri Mar 02 10:41:29 2018 +0100
+++ b/ChangeLog Mon May 14 17:15:38 2018 +0200
@@ -1,3 +1,9 @@
+2018-05-14 Jiri Vanek <jvanek@redhat.com>
+
+ * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java: getDocumentBase now returns codeBase as fallback when
+ documentBase is null. Oracle Applications R12, Oracle Forms Java Webstart application is requesting getDocumentBase
+ where it shouldn't, however they refuse to modify their code and add ITW to supported platforms
+
2018-02-06 Jiri Vanek <jvanek@redhat.com>
Added test for javafx-desc
diff -r 4abd0f089773 -r bcbef8d7bbd6 netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java
--- a/netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java Fri Mar 02 10:41:29 2018 +0100
+++ b/netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java Mon May 14 17:15:38 2018 +0200
@@ -375,8 +375,12 @@
@Override
public URL getDocumentBase() {
checkDestroyed();
-
- return file.getApplet().getDocumentBase();
+ URL db = file.getApplet().getDocumentBase();
+ if (db == null) {
+ return getCodeBase();
+ } else {
+ return db;
+ }
}
// FIXME: Sun's applet code forces all parameters to lower case.

View File

@ -0,0 +1,11 @@
--- a/rust-launcher/cc.toml
+++ b/rust-launcher/Cargo.toml
@@ -2,7 +2,3 @@
name = "launcher"
version = "1.8.0"
authors = ["https://icedtea.classpath.org/wiki/IcedTea-Web"]
-
-[dependencies]
-[target.'cfg(windows)'.dependencies]
-dunce = "0.1.1"

View File

@ -1,3 +1,6 @@
#can rust have debuginfo? Verify and fix! Likely issue in Makefile of itw.
%global debug_package %{nil}
# Version of java
%define javaver 1.8.0
@ -16,19 +19,17 @@
%define preffered_java java-%{javaver}-openjdk
Name: icedtea-web
Version: 1.7.1
Release: 9%{?dist}
Version: 1.8.4
Release: 4%{?dist}
Summary: Additional Java components for OpenJDK - Java browser plug-in and Web Start implementation
# will become arched again with rust on board
BuildArch: noarch
Group: Applications/Internet
License: LGPLv2+ and GPLv2 with exceptions
URL: http://icedtea.classpath.org/wiki/IcedTea-Web
Source0: http://icedtea.classpath.org/download/source/%{name}-%{version}.tar.gz
Patch0: 1473-1480.patch
Patch2: oracleForms.patch
Patch3: headlessCheckSoftening_rhbz1581598.patch
Patch0: patchOutDunce.patch
Patch1: altjava.patch
Patch2: fed2f5b-22402bb.patch
BuildRequires: javapackages-tools
#for deprecated add_maven_depmap, see https://www.spinics.net/lists/fedora-devel/msg233211.html
@ -38,13 +39,14 @@ BuildRequires: desktop-file-utils
BuildRequires: glib2-devel
BuildRequires: autoconf
BuildRequires: automake
BuildRequires: gcc
BuildRequires: gcc-c++
BuildRequires: cargo
BuildRequires: junit
BuildRequires: hamcrest
BuildRequires: libappstream-glib
# new in 1.5 to have clean up for malformed XMLs
BuildRequires: tagsoup
# to apply binary tests for CVEs
BuildRequires: git
# For functionality and the OpenJDK dirs
Requires: %{preffered_java}
@ -54,33 +56,28 @@ Recommends: bash-completion
Requires(post): javapackages-tools
Requires(postun): javapackages-tools
# For the mozilla plugin dir
Requires: mozilla-filesystem%{?_isa}
# When itw builds against it, it have to be also in runtime
Requires: tagsoup
# Post requires alternatives to install tool alternatives.
Requires(post): %{_sbindir}/alternatives
# in version 1.7 and higher for --family switch
Requires(post): chkconfig >= 1.7
# jnlp protocols support
Requires(post): GConf2
# Postun requires alternatives to uninstall tool alternatives.
Requires(postun): %{_sbindir}/alternatives
# in version 1.7 and higher for --family switch
Requires(postun): chkconfig >= 1.7
# jnlp protocols support
Requires(postun): GConf2
# Standard JPackage plugin provides.
Provides: java-plugin = 1:%{javaver}
Provides: javaws = 1:%{javaver}
Provides: %{preffered_java}-javaws = 1:%{version}
Provides: %{preffered_java}-plugin = 1:%{version}
%description
The IcedTea-Web project provides a Java web browser plugin, an implementation
of Java Web Start (originally based on the Netx project) and a settings tool to
The IcedTea-Web project provides a an implementation of Java Web Start
(originally based on the Netx project) and a settings tool to
manage deployment settings for the aforementioned plugin and Web Start
implementations.
@ -103,11 +100,19 @@ BuildArch: noarch
%description devel
This package contains ziped sources of the IcedTea-Web project.
%package nativelaunchers
Summary: native launchers of icedtea-web
Group: Applications/Internet
Requires: %{name} = %{version}-%{release}
%description nativelaunchers
This package contains native launchers for faster starup
%prep
%setup -q
%setup -q -n IcedTea-Web-%{name}-%{version}
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%build
autoreconf -vfi
@ -120,7 +125,11 @@ CXXFLAGS="$RPM_OPT_FLAGS $RPM_LD_FLAGS" \
--libdir=%{_libdir} \
--program-suffix=%{binsuffix} \
--disable-native-plugin \
--with-itw-libs=DISTRIBUTION \
--with-modularjdk-file=%{_sysconfdir}/java/%{name} \
--enable-shell-launchers \
--prefix=%{_prefix}
make %{?_smp_mflags}
%install
@ -138,6 +147,12 @@ mv $RPM_BUILD_ROOT/%{_mandir}/man1/javaws.1 $RPM_BUILD_ROOT/%{_mandir}/man1/java
# Install desktop files.
install -d -m 755 $RPM_BUILD_ROOT%{_datadir}/{applications,pixmaps}
# patch desktops to use the legacy sh laucnhers
sed "s/.itweb /.itweb.sh /" -i javaws.desktop #there is javaws... %u
sed "s/.itweb$/.itweb.sh/" -i itweb-settings.desktop
sed "s/.itweb$/.itweb.sh/" -i policyeditor.desktop
desktop-file-install --vendor ''\
--dir $RPM_BUILD_ROOT%{_datadir}/applications javaws.desktop
desktop-file-install --vendor ''\
@ -153,7 +168,8 @@ DESTDIR=%{buildroot} appstream-util install metadata/%{name}-javaws.appdata.xml
# maven fragments generation
mkdir -p $RPM_BUILD_ROOT%{_javadir}
pushd $RPM_BUILD_ROOT%{_javadir}
ln -s ../%{name}/netx.jar %{name}.jar
ln -s ../%{name}/javaws.jar ../%{name}/netx.jar # backward copatinlity needed?
ln -s ../%{name}/javaws.jar %{name}.jar
ln -s ../%{name}/plugin.jar %{name}-plugin.jar
popd
mkdir -p $RPM_BUILD_ROOT/%{_mavenpomdir}
@ -163,39 +179,57 @@ cp metadata/%{name}-plugin.pom $RPM_BUILD_ROOT/%{_mavenpomdir}/%{name}-plugin.p
%add_maven_depmap %{name}.pom %{name}.jar
%add_maven_depmap %{name}-plugin.pom %{name}-plugin.jar
cp netx.build/lib/src.zip $RPM_BUILD_ROOT%{_datadir}/%{name}/netx.src.zip
cp netx.build/lib/src.zip $RPM_BUILD_ROOT%{_datadir}/%{name}/netx.src.zip # backward copatinlity needed?
cp netx.build/lib/src.zip $RPM_BUILD_ROOT%{_datadir}/%{name}/javaws.src.zip
cp liveconnect/lib/src.zip $RPM_BUILD_ROOT%{_datadir}/%{name}/plugin.src.zip
%find_lang %{name} --all-name --with-man
%check
make check
appstream-util validate $RPM_BUILD_ROOT/%{_datadir}/appdata/*.xml || :
#make check
#appstream-util validate $RPM_BUILD_ROOT/%{_datadir}/appdata/*.xml || :
%post
%post nativelaunchers
PRIORITY=%{priority}
let PRIORITY=PRIORITY-1
alternatives \
--install %{_bindir}/javaws javaws.%{_arch} %{_prefix}/bin/javaws%{binsuffix} %{priority} --family %{preffered_java}.%{_arch} \
--install %{_bindir}/javaws javaws.%{_arch} %{_prefix}/bin/javaws%{binsuffix} $PRIORITY --family %{preffered_java}.%{_arch} \
--slave %{_bindir}/itweb-settings itweb-settings %{_prefix}/bin/itweb-settings%{binsuffix} \
--slave %{_bindir}/policyeditor policyeditor %{_prefix}/bin/policyeditor%{binsuffix} \
--slave %{_bindir}/ControlPanel ControlPanel %{_prefix}/bin/itweb-settings%{binsuffix} \
--slave %{_mandir}/man1/javaws.1.gz javaws.1.gz %{_mandir}/man1/javaws%{binsuffix}.1.gz \
--slave %{_mandir}/man1/ControlPanel.1.gz ControlPanel.1.gz %{_mandir}/man1/itweb-settings.1.gz
%post
PRIORITY=%{priority}
alternatives \
--install %{_bindir}/javaws javaws.%{_arch} %{_prefix}/bin/javaws%{binsuffix}.sh $PRIORITY --family %{preffered_java}.%{_arch} \
--slave %{_bindir}/itweb-settings itweb-settings %{_prefix}/bin/itweb-settings%{binsuffix}.sh \
--slave %{_bindir}/policyeditor policyeditor %{_prefix}/bin/policyeditor%{binsuffix}.sh \
--slave %{_bindir}/ControlPanel ControlPanel %{_prefix}/bin/itweb-settings%{binsuffix}.sh \
--slave %{_mandir}/man1/javaws.1.gz javaws.1.gz %{_mandir}/man1/javaws%{binsuffix}.1.gz \
--slave %{_mandir}/man1/ControlPanel.1.gz ControlPanel.1.gz %{_mandir}/man1/itweb-settings.1.gz
gconftool-2 -s %{jnlphandler}/command '%{_prefix}/bin/javaws%{binsuffix} %s' --type String &> /dev/null || :
gconftool-2 -s %{jnlphandler}/command '%{_bindir}/javaws %s' --type String &> /dev/null || :
gconftool-2 -s %{jnlphandler}/enabled --type Boolean true &> /dev/null || :
gconftool-2 -s %{jnlpshandler}/command '%{_prefix}/bin/javaws%{binsuffix} %s' --type String &> /dev/null || :
gconftool-2 -s %{jnlpshandler}/command '%{_bindir}/javaws %s' --type String &> /dev/null || :
gconftool-2 -s %{jnlpshandler}/enabled --type Boolean true &> /dev/null || :
%posttrans
update-desktop-database &> /dev/null || :
exit 0
%postun nativelaunchers
if [ $1 -eq 0 ]
then
alternatives --remove javaws.%{_arch} %{_prefix}/bin/javaws%{binsuffix}
fi
exit 0
%postun
update-desktop-database &> /dev/null || :
if [ $1 -eq 0 ]
then
alternatives --remove javaws %{_prefix}/bin/javaws%{binsuffix}
alternatives --remove javaws.%{_arch} %{_prefix}/bin/javaws%{binsuffix}.sh
gconftool-2 -u %{jnlphandler}/command &> /dev/null || :
gconftool-2 -u %{jnlphandler}/enabled &> /dev/null || :
gconftool-2 -u %{jnlpshandler}/command &> /dev/null || :
@ -203,9 +237,18 @@ then
fi
exit 0
%files nativelaunchers
%{_prefix}/bin/javaws.itweb
%{_prefix}/bin/itweb-settings.itweb
%{_prefix}/bin/policyeditor.itweb
%license COPYING
%files -f .mfiles -f %{name}.lang
%{_sysconfdir}/bash_completion.d/*
%{_prefix}/bin/*
%config(noreplace) %{_sysconfdir}/java/%{name}/itw-modularjdk.args
%{_prefix}/bin/javaws.itweb.sh
%{_prefix}/bin/itweb-settings.itweb.sh
%{_prefix}/bin/policyeditor.itweb.sh
%{_datadir}/applications/*
%dir %{_datadir}/%{name}
%{_datadir}/%{name}/*.jar
@ -225,6 +268,39 @@ exit 0
%license COPYING
%changelog
* Mon Nov 30 2020 - Jiri Vanek <jvanek@redhat.com> -1.8.4-4
- added patch2, fed2f5b-22402bb.patch containing important fixes from future 1.8.5
- Resolves: rhbz#1900043
* Fri Nov 27 2020 - Jiri Vanek <jvanek@redhat.com> -1.8.4-2
- added native launchers, via separate subpackage, but efectively changed main package to arched one
- removed policyeditor man page, it was link to itself
- Resolves: rhbz#1900043
* Fri Nov 27 2020 - Jiri Vanek <jvanek@redhat.com> -1.8.4-1
- rebased to itw 1.8, ommiting native launchers
- Resolves: rhbz#1900043
* Fri Nov 20 2020 Jiri Vanek <jvanek@redhat.com> 1.7.1-18
- patched to use alt-java if available
- Added Patch6, altjava.patch
- Resolves: rhbz#1888633
* Thu Jul 18 2019 Jiri Vanek <jvanek@redhat.com> 1.7.1-16
- Added Patch5, testTuning.patch to make tests pass inclean envirnment
- Resolves: rhbz#1724958
* Thu Jul 18 2019 Jiri Vanek <jvanek@redhat.com> 1.7.1-16
- added patch1, patch4 and patch11 to fix CVE-2019-10182
- added patch2 to fix CVE-2019-10181
- added patch3 and patch33 to fix CVE-2019-10185
- Resolves: rhbz#1724958
- Resolves: rhbz#1725928
- Resolves: rhbz#1724989
* Fri Mar 22 2019 - Jiri Vanek <jvanek@redhat.com> -1.7.1-10
- added gating
* Mon Jul 16 2018 - Jiri Vanek <jvanek@redhat.com> -1.7.1-8
- removed rhino