Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package icedtea-web for openSUSE:Factory checked in at 2021-05-19 17:49:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/icedtea-web (Old) and /work/SRC/openSUSE:Factory/.icedtea-web.new.2988 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "icedtea-web" Wed May 19 17:49:39 2021 rev:33 rq:894317 version:1.8.6 Changes: -------- --- /work/SRC/openSUSE:Factory/icedtea-web/icedtea-web.changes 2021-03-08 15:18:13.937981532 +0100 +++ /work/SRC/openSUSE:Factory/.icedtea-web.new.2988/icedtea-web.changes 2021-05-19 17:50:01.805371100 +0200 @@ -1,0 +2,8 @@ +Wed May 19 10:58:51 UTC 2021 - Ferdinand Thiessen <[email protected]> + +- Update to 1.8.6 + * JARs downloaded with URI-escaped characters don't get loaded + * Reduced number of threads spawned for downloading of resources + * handle broken XML in jnlp + +------------------------------------------------------------------- Old: ---- IcedTea-Web-icedtea-web-1.8.4.tar.gz New: ---- IcedTea-Web-icedtea-web-1.8.6.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ icedtea-web.spec ++++++ --- /var/tmp/diff_new_pack.ogXd19/_old 2021-05-19 17:50:02.321368937 +0200 +++ /var/tmp/diff_new_pack.ogXd19/_new 2021-05-19 17:50:02.325368920 +0200 @@ -29,7 +29,7 @@ %bcond_without docs %bcond_with plugin Name: icedtea-web -Version: 1.8.4 +Version: 1.8.6 Release: 0 Summary: Java Web Start implementation License: GPL-2.0-only WITH Classpath-exception-2.0 ++++++ IcedTea-Web-icedtea-web-1.8.4.tar.gz -> IcedTea-Web-icedtea-web-1.8.6.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/.gitattributes new/IcedTea-Web-icedtea-web-1.8.6/.gitattributes --- old/IcedTea-Web-icedtea-web-1.8.4/.gitattributes 1970-01-01 01:00:00.000000000 +0100 +++ new/IcedTea-Web-icedtea-web-1.8.6/.gitattributes 2021-02-23 13:05:13.000000000 +0100 @@ -0,0 +1,5 @@ +# Declare files that will always have LF line endings on checkout. +*.sh eol=lf + +# Declare files that will always have CRLF line endings on checkout. +*.bat text eol=crlf \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/build.yml new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/build.yml --- old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/build.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/build.yml 2021-02-23 13:05:13.000000000 +0100 @@ -0,0 +1,393 @@ +name: Build +on: + workflow_dispatch: + inputs: + release: + description: 'Set to True if are running a release' + required: true + default: 'False' + version: + description: 'If running a release, set the version e.g (icedtea-web-1.8.4)' + required: true + default: 'icedtea-web-1.8.x' + pull_request: + branches: + - 1.8 +jobs: + release: + if: github.event.inputs.release == 'True' + name: Create Draft release + runs-on: ubuntu-latest + outputs: + upload_url: ${{ steps.create_release.outputs.upload_url }} + steps: + - name: Create Draft Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.event.inputs.version }} + release_name: 'Official Release of ${{ github.event.inputs.version }}' + draft: true + prerelease: false + + linux: + if: always() + needs: release + name: Linux + runs-on: ubuntu-latest + container: centos:7 + steps: + - uses: actions/checkout@v2 + with: + path: icedtea-web + + - name: Install Dependencies + run: | + yum -y install autoconf bind-utils bzip2 cpio elfutils-libelf-devel gcc gcc-c++ glibc glibc-common glibc-devel \ + gmp-devel java-1.8.0-openjdk-devel libcurl-devel make mpfr-devel perl unzip which zip + curl -o tagsoup.jar "https://repo1.maven.org/maven2/org/ccil/cowan/tagsoup/tagsoup/1.2.1/tagsoup-1.2.1.jar" + sha256sum tagsoup.jar | awk '$1!="ac97f7b4b1d8e9337edfa0e34044f8d0efe7223f6ad8f3a85d54cc1018ea2e04"{exit 1}' + curl -o rhino.zip "https://ftp.mozilla.org/pub/mozilla.org/js/rhino1_6R7.zip" + sha256sum rhino.zip | awk '$1!="c94c6de3a29b3acbc4eee732e688f75a5d94bd02c9878be4ceb4d3cd220f3866"{exit 1}' + unzip -j rhino.zip "*/js.jar" + + - name: Compile rust + run: | + curl -o rust.tar.gz "https://static.rust-lang.org/dist/rust-1.34.1-x86_64-unknown-linux-gnu.tar.gz" + sha256sum rust.tar.gz | awk '$1!="8e2eead11bd5bf61409e29018d007c6fc874bcda2ff54db3d04d1691e779c14e"{exit 1}' + tar -zxf rust.tar.gz + cd rust-1.34.1-x86_64-unknown-linux-gnu + ./install.sh + + - name: Compile pkg-config + run: | + curl -o pkg-config.tar.gz "https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz" + sha256sum pkg-config.tar.gz | awk '$1!="6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591"{exit 1}' + tar -zxf pkg-config.tar.gz + cd pkg-config-0.29.2 + ./configure --with-internal-glib + make install + + - name: Compile automake + run: | + curl -o automake-1.13.1.tar.gz "https://ftp.gnu.org/gnu/automake/automake-1.13.1.tar.gz" + sha256sum automake-1.13.1.tar.gz | awk '$1!="51bc10031847e9965c4f2c16a0a66552309ce28ea82b1afa8cef736643ebaa27"{exit 1}' + tar -zxf automake-1.13.1.tar.gz + cd automake-1.13.1 + bash configure + make && make install + rm -rf /usr/local/bin/automake + ln -s /usr/local/bin/automake-1.13 /usr/local/bin/automake + + - name: Build + run: | + export ICEDTEAWEB_INSTALL="/icedtea-web-image" + export JAVA_EXE="$(which java)" + export JAVA_PATH="$(readlink -e "${JAVA_EXE}")" + export BIN_PATH="$(dirname "${JAVA_PATH}")" + export JRE_PATH="$(dirname "${BIN_PATH}")" + export JAVA_HOME="$(dirname "${JRE_PATH}")" + export TAGSOUP="${PWD}/tagsoup.jar" + export RHINO="${PWD}/js.jar" + export ACLOCAL_PATH="/usr/local/share/aclocal" + export PATH="/usr/local/bin:${PATH}" + export WORKSPACE="${PWD}" + pkg-config --version + cd icedtea-web + echo "Invoking autogen.sh" + ./autogen.sh + echo "Incoking IcedTea-Web configure" + ./configure --disable-native-plugin --prefix="${ICEDTEAWEB_INSTALL}" --with-itw-libs=BUNDLED --with-rhino="${RHINO}" --with-tagsoup="${TAGSOUP}" --with-jdk-home="${JAVA_HOME}" + echo "Build IcedTea-Web" + make DESTDIR="${WORKSPACE}" + + - name: Build Distribution + run: | + export WORKSPACE="${PWD}" + echo "Create IcedTea-Web Distribution" + cd icedtea-web + make linux-bin-dist DESTDIR="${WORKSPACE}" + find . -name "icedtea-web-*.linux.bin.zip" + for zip in icedtea-web-*.linux.bin.zip; do + sha256sum "$zip" > "$zip.sha256.txt" + done + + - uses: actions/upload-artifact@v2 + with: + name: icedtea-web_build_x86-64_linux + path: | + icedtea-web/icedtea-web-*.linux.bin.* + + - name: Upload binary + uses: actions/upload-release-asset@v1 + if: github.event.inputs.release == 'True' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.release.outputs.upload_url }} + asset_path: icedtea-web/${{ github.event.inputs.version }}.linux.bin.zip + asset_name: ${{ github.event.inputs.version }}.linux.bin.zip + asset_content_type: application/zip + + - name: Upload shasum + uses: actions/upload-release-asset@v1 + if: github.event.inputs.release == 'True' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.release.outputs.upload_url }} + asset_path: icedtea-web/${{ github.event.inputs.version }}.linux.bin.zip.sha256.txt + asset_name: ${{ github.event.inputs.version }}.linux.bin.zip.sha256.txt + asset_content_type: application/zip + + portable: + if: always() + needs: release + name: Portable + runs-on: ubuntu-latest + container: centos:7 + steps: + - uses: actions/checkout@v2 + with: + path: icedtea-web + + - name: Install Dependencies + run: | + yum -y install autoconf bind-utils bzip2 cpio elfutils-libelf-devel gcc gcc-c++ glibc glibc-common glibc-devel \ + gmp-devel java-1.8.0-openjdk-devel libcurl-devel make mpfr-devel perl unzip which zip + curl -o tagsoup.jar "https://repo1.maven.org/maven2/org/ccil/cowan/tagsoup/tagsoup/1.2.1/tagsoup-1.2.1.jar" + sha256sum tagsoup.jar | awk '$1!="ac97f7b4b1d8e9337edfa0e34044f8d0efe7223f6ad8f3a85d54cc1018ea2e04"{exit 1}' + curl -o mslinks.jar "https://repo1.maven.org/maven2/com/github/vatbub/mslinks/1.0.5/mslinks-1.0.5.jar" + sha256sum mslinks.jar | awk '$1!="e14d756f81b310b75baeb5baf219d25592b6a8635eb215c4059f17493b0cea5c"{exit 1}' + curl -o rhino.zip "https://ftp.mozilla.org/pub/mozilla.org/js/rhino1_6R7.zip" + sha256sum rhino.zip | awk '$1!="c94c6de3a29b3acbc4eee732e688f75a5d94bd02c9878be4ceb4d3cd220f3866"{exit 1}' + unzip -j rhino.zip "*/js.jar" + + - name: Compile pkg-config + run: | + curl -o pkg-config.tar.gz "https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz" + sha256sum pkg-config.tar.gz | awk '$1!="6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591"{exit 1}' + tar -zxf pkg-config.tar.gz + cd pkg-config-0.29.2 + ./configure --with-internal-glib + make install + + - name: Compile automake + run: | + curl -o automake-1.13.1.tar.gz "https://ftp.gnu.org/gnu/automake/automake-1.13.1.tar.gz" + sha256sum automake-1.13.1.tar.gz | awk '$1!="51bc10031847e9965c4f2c16a0a66552309ce28ea82b1afa8cef736643ebaa27"{exit 1}' + tar -zxf automake-1.13.1.tar.gz + cd automake-1.13.1 + bash configure + make && make install + rm -rf /usr/local/bin/automake + ln -s /usr/local/bin/automake-1.13 /usr/local/bin/automake + + - name: Build + run: | + export ICEDTEAWEB_INSTALL="/icedtea-web-image" + export JAVA_EXE="$(which java)" + export JAVA_PATH="$(readlink -e "${JAVA_EXE}")" + export BIN_PATH="$(dirname "${JAVA_PATH}")" + export JRE_PATH="$(dirname "${BIN_PATH}")" + export JAVA_HOME="$(dirname "${JRE_PATH}")" + export WORKSPACE="${PWD}" + pkg-config --version + cd icedtea-web + echo "Invoking autogen.sh" + ./autogen.sh + echo "Incoking IcedTea-Web configure" + ./configure --disable-native-plugin --enable-bats-on-linux --enable-shell-launchers --prefix="${ICEDTEAWEB_INSTALL}" --with-itw-libs=BUNDLED --with-rhino="${WORKSPACE}/js.jar" --with-mslinks="${WORKSPACE}/mslinks.jar" --with-tagsoup="${WORKSPACE}/tagsoup.jar" --with-jdk-home="${JAVA_HOME}" + echo "Build IcedTea-Web" + make DESTDIR="${WORKSPACE}/dest" + + - name: Build Distribution + run: | + export WORKSPACE="${PWD}" + echo "Create IcedTea-Web Distribution" + cd icedtea-web + make linux-bin-dist DESTDIR="${WORKSPACE}/dest" + find . -name "icedtea-web-*.linux.bin.zip" + for zip in icedtea-web-*.linux.bin.zip; do + zip_rename="${zip/linux/portable}" + mv "$zip" "$zip_rename" + sha256sum "$zip_rename" > "$zip_rename.sha256.txt" + done + + - uses: actions/upload-artifact@v2 + with: + name: icedtea-web_build_x86-64_portable + path: | + icedtea-web/icedtea-web-*.portable.bin.* + + - name: Upload binary + uses: actions/upload-release-asset@v1 + if: github.event.inputs.release == 'True' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.release.outputs.upload_url }} + asset_path: icedtea-web/${{ github.event.inputs.version }}.portable.bin.zip + asset_name: ${{ github.event.inputs.version }}.portable.bin.zip + asset_content_type: application/zip + + - name: Upload shasum + uses: actions/upload-release-asset@v1 + if: github.event.inputs.release == 'True' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.release.outputs.upload_url }} + asset_path: icedtea-web/${{ github.event.inputs.version }}.portable.bin.zip.sha256.txt + asset_name: ${{ github.event.inputs.version }}.portable.bin.zip.sha256.txt + asset_content_type: application/zip + + windows: + if: always() + needs: release + name: Windows + runs-on: windows-latest + steps: + - name: Restore cygwin packages from cache + id: cygwin + uses: actions/cache@v2 + with: + path: C:\cygwin_packages + key: cygwin-packages-${{ runner.os }}-v1 + + - name: Install Cygwin + run: | + Invoke-WebRequest -UseBasicParsing 'https://cygwin.com/setup-x86_64.exe' -OutFile 'C:\temp\cygwin.exe' + Invoke-WebRequest -UseBasicParsing 'https://cygwin.com/setup-x86_64.exe.sig' -OutFile 'C:\temp\cygwin.exe.sig' + gpg --keyserver keys.gnupg.net --recv-key 1A698DE9E2E56300 + gpg --keyserver keys.gnupg.net --recv-key 676041BA + gpg --keyid-format=long --with-fingerprint --verify 'C:\temp\cygwin.exe.sig' 'C:\temp\cygwin.exe' + Start-Process -Wait -FilePath 'C:\temp\cygwin.exe' -ArgumentList '--packages autoconf,automake,cpio,curl,gcc,git,gnupg,grep,libtool,make,mingw64-x86_64-gcc-core,perl,pkg-config,unzip,wget,zip --quiet-mode --download --local-install --delete-orphans --site https://mirrors.kernel.org/sourceware/cygwin/ --local-package-dir C:\cygwin_packages --root C:\cygwin64' + + - name: Set PATH + run: echo "C:\cygwin64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + - name: Cygwin git configuration + shell: bash + run: mkdir $HOME && git config --system core.autocrlf false + + - uses: actions/checkout@v2 + + - name: Install Dependencies + run: | + # Create C:/cygwin64/usr/share/java if it doesn't exist + New-Item -Path C:\cygwin64\usr\share\java -Type Directory + # Retrieve tagsoup jar + Invoke-WebRequest -UseBasicParsing 'https://repo1.maven.org/maven2/org/ccil/cowan/tagsoup/tagsoup/1.2.1/tagsoup-1.2.1.jar' -OutFile 'C:\cygwin64\usr\share\java\tagsoup.jar' + $checksum = (Get-FileHash -Algorithm SHA256 'C:\cygwin64\usr\share\java\tagsoup.jar' | Select-Object -ExpandProperty Hash) + If ($checksum -ne "AC97F7B4B1D8E9337EDFA0E34044F8D0EFE7223F6AD8F3A85D54CC1018EA2E04") { + Write-Host "Checksums did not match!" + exit 1 + } + # Retrieve mslinks jar + Invoke-WebRequest -UseBasicParsing 'https://repo1.maven.org/maven2/com/github/vatbub/mslinks/1.0.5/mslinks-1.0.5.jar' -OutFile 'C:\cygwin64\usr\share\java\mslinks.jar' + $checksum = (Get-FileHash -Algorithm SHA256 'C:\cygwin64\usr\share\java\mslinks.jar' | Select-Object -ExpandProperty Hash) + If ($checksum -ne "E14D756F81B310B75BAEB5BAF219D25592B6A8635EB215C4059F17493B0CEA5C") { + Write-Host "Checksums did not match!" + exit 1 + } + # Retrieve Wixgen jar + Invoke-WebRequest -UseBasicParsing 'https://github.com/akashche/wixgen/releases/download/1.7/wixgen.jar' -OutFile 'C:\cygwin64\usr\share\java\wixgen.jar' + $checksum = (Get-FileHash -Algorithm SHA256 'C:\cygwin64\usr\share\java\wixgen.jar' | Select-Object -ExpandProperty Hash) + If ($checksum -ne "57E68A91C46A2F4B1B41A3F93793E331D62D6D151DDC222FA4D3EC9CE876F967") { + Write-Host "Checksums did not match!" + exit 1 + } + # Retrieve Rhino + Invoke-WebRequest -UseBasicParsing 'https://ftp.mozilla.org/pub/mozilla.org/js/rhino1_6R7.zip' -OutFile 'rhino1_6R7.zip' + $checksum = (Get-FileHash -Algorithm SHA256 'rhino1_6R7.zip' | Select-Object -ExpandProperty Hash) + If ($checksum -ne "C94C6DE3A29B3ACBC4EEE732E688F75A5D94BD02C9878BE4CEB4D3CD220F3866") { + Write-Host "Checksums did not match!" + exit 1 + } + 7z.exe x rhino1_6R7.zip + Move-Item -Path rhino1_6R7\js.jar -Destination C:\cygwin64\usr\share\java + # Retrieve AzureSignTool + New-Item -Path C:\AzureSignTool -Type Directory + Invoke-WebRequest -UseBasicParsing 'https://github.com/vcsjones/AzureSignTool/releases/download/1.0.1/AzureSignTool.zip' -OutFile 'AzureSignTool.zip' + $checksum = (Get-FileHash -Algorithm SHA256 'AzureSignTool.zip' | Select-Object -ExpandProperty Hash) + If ($checksum -ne "4178B8E5DC6423E75DA2184C3B0D78167A0A59B82A20842884B780B1E815BA89") { + Write-Host "Checksums did not match!" + exit 1 + } + Expand-Archive -LiteralPath 'AzureSignTool.zip' -DestinationPath 'C:\AzureSignTool' + + - name: Enable 8dot3 shortnames + run: | + fsutil behavior set disable8dot3 0 + cmd /c dir /x "C:\Program Files (x86)" + fsutil file setshortname "C:\Program Files (x86)\WiX Toolset v3.11" "WIXTOO~1.14" + shell: cmd + + - name: Build + run: bash .github/workflows/windows_build.sh + shell: cmd + + - uses: actions/upload-artifact@v2 + with: + name: icedtea-web_build_x86-64_win + path: | + icedtea-web-*.win.bin.* + win-installer.build/icedtea-web-*.msi* + + - name: Codesign + run: bash .github/workflows/windows_sign.sh + if: github.event.inputs.release == 'True' + env: + description_url: 'https://adoptopenjdk.net' + key_vault_url: 'https://adoptopenjdk-codesign.vault.azure.net' + key_vault_certificate: 'LondonJavaCommunity' + key_vault_client_id: ${{ secrets.key_vault_client_id }} + key_vault_client_secret: ${{ secrets.key_vault_client_secret }} + shell: cmd + + - name: Upload binary + uses: actions/[email protected] + if: github.event.inputs.release == 'True' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.release.outputs.upload_url }} + asset_path: release/${{ github.event.inputs.version }}.win.bin.zip + asset_name: ${{ github.event.inputs.version }}.win.bin.zip + asset_content_type: application/zip + + - name: Upload shasum + uses: actions/[email protected] + if: github.event.inputs.release == 'True' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.release.outputs.upload_url }} + asset_path: release/${{ github.event.inputs.version }}.win.bin.zip.sha256.txt + asset_name: ${{ github.event.inputs.version }}.win.bin.zip.sha256.txt + asset_content_type: application/zip + + - name: Upload MSI + uses: actions/[email protected] + if: github.event.inputs.release == 'True' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.release.outputs.upload_url }} + asset_path: release/${{ github.event.inputs.version }}.msi + asset_name: ${{ github.event.inputs.version }}.msi + asset_content_type: application/zip + + - name: Upload MSI shasum + uses: actions/[email protected] + if: github.event.inputs.release == 'True' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.release.outputs.upload_url }} + asset_path: release/${{ github.event.inputs.version }}.msi.sha256.txt + asset_name: ${{ github.event.inputs.version }}.msi.sha256.txt + asset_content_type: application/zip diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/windows_build.sh new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/windows_build.sh --- old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/windows_build.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/windows_build.sh 2021-02-23 13:05:13.000000000 +0100 @@ -0,0 +1,27 @@ +#!/bin/bash +export WORKSPACE="${PWD}" +export RUSTFLAGS="-C target-feature=+crt-static" +export ICEDTEAWEB_INSTALL="$(cygpath -u "${WORKSPACE}/icedtea-web-image")" +export WIXPATH="$(cygpath -u "C:/PROGRA~2/WIXTOO~1.14/bin")" +export WIXGEN="$(cygpath -u "C:/cygwin64/usr/share/java/wixgen.jar")" +export PATH="${PATH}:/cygdrive/c/rust/bin:${WIXPATH}" +export JVM_HOME_SHORT="$(cygpath -d "${JAVA_HOME}")" +export JVMPATH="$(cygpath -u ${JVM_HOME_SHORT})" +echo "Configure IcedTea-Web" +./autogen.sh +./configure --disable-native-plugin --prefix="${ICEDTEAWEB_INSTALL}" --with-wix=${WIXPATH} --with-wixgen=${WIXGEN} --with-itw-libs=BUNDLED --with-jdk-home="${JVMPATH}" +echo "Build IcedTea-Web" +make +echo "Create IcedTea-Web Distribution" +make win-bin-dist +find . -name "icedtea-web-*.win.bin.zip" +echo "Create IcedTea-Web MSI" +make win-installer +find . -name "icedtea-web-*.msi" +echo "Generate shasums" +for zip in icedtea-web-*.win.bin.zip; do + shasum -a 256 "$zip" > "$zip.sha256.txt" +done +for msi in **/icedtea-web-*.msi; do + shasum -a 256 "$msi" > "$msi.sha256.txt" +done \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/windows_sign.sh new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/windows_sign.sh --- old/IcedTea-Web-icedtea-web-1.8.4/.github/workflows/windows_sign.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/IcedTea-Web-icedtea-web-1.8.6/.github/workflows/windows_sign.sh 2021-02-23 13:05:13.000000000 +0100 @@ -0,0 +1,44 @@ +#!/bin/bash +export WORKSPACE="${PWD}" +export TMP_PATH="$(cygpath -u "${WORKSPACE}/tmp")" +export RELEASE_PATH="$(cygpath -u "${WORKSPACE}/release")" +export ARCHIVE_NAME_WITH_PATH="$(find . -name "icedtea-web-*.win.bin.zip")" +export ARCHIVE_NAME="$(basename "${ARCHIVE_NAME_WITH_PATH}")" +export MSI_NAME_WITH_PATH="$(find . -name "icedtea-web-*.msi")" +export MSI_NAME="$(basename "${MSI_NAME_WITH_PATH}")" + +mkdir ${TMP_PATH} +mkdir ${RELEASE_PATH} + +unzip -q ${ARCHIVE_NAME} -d ${TMP_PATH} +cd ${TMP_PATH} + +echo "Signing Binary" +find . -type f -name '*.exe' > sign.txt + +/cygdrive/c/AzureSignTool/AzureSignTool.exe sign --file-digest sha256 --description-url "$description_url" \ +--no-page-hashing --timestamp-rfc3161 http://timestamp.digicert.com --timestamp-digest sha256 \ +--azure-key-vault-url "$key_vault_url" --azure-key-vault-client-id "$key_vault_client_id" \ +--azure-key-vault-client-secret "$key_vault_client_secret" --azure-key-vault-certificate "$key_vault_certificate" \ +--input-file-list sign.txt + +zip -rq ${ARCHIVE_NAME} * +cp ${ARCHIVE_NAME} ${RELEASE_PATH}/${ARCHIVE_NAME} + +echo "Signing Installer" +cp ${WORKSPACE}/win-installer.build/${MSI_NAME} ${TMP_PATH}/${MSI_NAME} + +/cygdrive/c/AzureSignTool/AzureSignTool.exe sign "${MSI_NAME}" --file-digest sha256 \ +--description-url "$description_url" --no-page-hashing --timestamp-rfc3161 http://timestamp.digicert.com \ +--timestamp-digest sha256 --azure-key-vault-url "$key_vault_url" --azure-key-vault-client-id "$key_vault_client_id" \ +--azure-key-vault-client-secret "$key_vault_client_secret" --azure-key-vault-certificate "$key_vault_certificate" + +cp ${TMP_PATH}/${MSI_NAME} ${RELEASE_PATH}/${MSI_NAME} + +ls ${RELEASE_PATH} + +cd $RELEASE_PATH + +for zip in icedtea-web-*; do + shasum -a 256 "$zip" > "$zip.sha256.txt" +done \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/ChangeLog new/IcedTea-Web-icedtea-web-1.8.6/ChangeLog --- old/IcedTea-Web-icedtea-web-1.8.4/ChangeLog 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/ChangeLog 2021-02-23 13:05:13.000000000 +0100 @@ -1,3 +1,18 @@ +2021-02-23 George Adams <[email protected]> + + Release changes + * Fix missing mslinks in Windows build + +2021-02-22 Hendrik Ebbers <[email protected]> + + Release changes + * Change so that it can also be built under freebsd + * fix for cargo test sometimes fails when make runs with several simultaneous jobs + * JARs downloaded with URI-escaped characters don't get loaded + * Reduced number of threads spawned for downloading of resources + * handle broken XML in jnlp + * Migrated to GitHub Action release support + 2020-06-03 Hendrik Ebbers <[email protected]> Release changes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/Makefile.am new/IcedTea-Web-icedtea-web-1.8.6/Makefile.am --- old/IcedTea-Web-icedtea-web-1.8.4/Makefile.am 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/Makefile.am 2021-02-23 13:05:13.000000000 +0100 @@ -956,10 +956,10 @@ # 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/NEWS new/IcedTea-Web-icedtea-web-1.8.6/NEWS --- old/IcedTea-Web-icedtea-web-1.8.4/NEWS 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/NEWS 2021-02-23 13:05:13.000000000 +0100 @@ -8,6 +8,17 @@ CVE-XXXX-YYYY: http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=XXXX-YYYY +New in release 1.8.6 (2021-02-23): +* Fix missing mslinks in Windows build + +New in release 1.8.5 (2021-02-22): +* Change so that it can also be built under freebsd +* fix for cargo test sometimes fails when make runs with several simultaneous jobs +* JARs downloaded with URI-escaped characters don't get loaded +* Reduced number of threads spawned for downloading of resources +* handle broken XML in jnlp +* Migrated to GitHub Action release support + New in release 1.8.4 (2020-06-03): * Backport of https://github.com/AdoptOpenJDK/IcedTea-Web/pull/389 * Backport of https://github.com/AdoptOpenJDK/IcedTea-Web/pull/384 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/configure.ac new/IcedTea-Web-icedtea-web-1.8.6/configure.ac --- old/IcedTea-Web-icedtea-web-1.8.4/configure.ac 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/configure.ac 2021-02-23 13:05:13.000000000 +0100 @@ -1,4 +1,4 @@ -AC_INIT([icedtea-web],[1.8.4],[[email protected]], [icedtea-web], [http://icedtea.classpath.org/wiki/IcedTea-Web]) +AC_INIT([icedtea-web],[1.8.6],[[email protected]], [icedtea-web], [http://icedtea.classpath.org/wiki/IcedTea-Web]) AM_INIT_AUTOMAKE([1.9 tar-pax foreign]) AC_CONFIG_FILES([Makefile netx.manifest]) AM_MAINTAINER_MODE([enable]) @@ -71,7 +71,7 @@ build_linux=no build_windows=no case "${host_os}" in - linux*) + linux*|freebsd*) build_linux=yes ;; cygwin*) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/Launcher.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/Launcher.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/Launcher.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/Launcher.java 2021-02-23 13:05:13.000000000 +0100 @@ -552,7 +552,7 @@ } 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 @@ main.setAccessible(true); + JNLPRuntime.addStartupTrackingEntry("invoking main()"); OutputController.getLogger().log("Invoking main() with args: " + Arrays.toString(args)); main.invoke(null, new Object[] { args }); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/OptionsDefinitions.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/OptionsDefinitions.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/OptionsDefinitions.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/OptionsDefinitions.java 2021-02-23 13:05:13.000000000 +0100 @@ -78,6 +78,7 @@ 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 @@ OPTIONS.TRUSTNONE, OPTIONS.JNLP, OPTIONS.HTML, - OPTIONS.BROWSER + OPTIONS.BROWSER, + OPTIONS.STARTUP_TRACKER }); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CacheEntry.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CacheEntry.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CacheEntry.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CacheEntry.java 2021-02-23 13:05:13.000000000 +0100 @@ -47,6 +47,8 @@ /** 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 @@ 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 @@ * @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 @@ * @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 @@ return properties.isHeldByCurrentThread(); } + public File getLocalFile() { + return localFile; + } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CacheUtil.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CacheUtil.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CacheUtil.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CacheUtil.java 2021-02-23 13:05:13.000000000 +0100 @@ -422,14 +422,13 @@ * @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 @@ } 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 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java 2021-02-23 13:05:13.000000000 +0100 @@ -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 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java 2021-02-23 13:05:13.000000000 +0100 @@ -153,7 +153,12 @@ 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 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/ResourceTracker.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/ResourceTracker.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/cache/ResourceTracker.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/cache/ResourceTracker.java 2021-02-23 13:05:13.000000000 +0100 @@ -28,10 +28,7 @@ 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 @@ /** 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 @@ return; resource.addTracker(this); resources.add(resource); + resourcesMap.put(location.toString(), resource); } if (options == null) { @@ -190,6 +189,7 @@ if (resource != null) { resources.remove(resource); + resourcesMap.remove(location.toString()); resource.removeTracker(this); } @@ -508,7 +508,7 @@ * @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 @@ */ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/config/Defaults.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/config/Defaults.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/config/Defaults.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/config/Defaults.java 2021-02-23 13:05:13.000000000 +0100 @@ -466,6 +466,21 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java 2021-02-23 13:05:13.000000000 +0100 @@ -250,7 +250,10 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/resources/Messages.properties new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/resources/Messages.properties --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/resources/Messages.properties 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/resources/Messages.properties 2021-02-23 13:05:13.000000000 +0100 @@ -357,6 +357,7 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/Boot.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/Boot.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/Boot.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/Boot.java 2021-02-23 13:05:13.000000000 +0100 @@ -107,6 +107,10 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java 2021-02-23 13:05:13.000000000 +0100 @@ -43,6 +43,7 @@ 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 @@ 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 @@ } 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java 2021-02-23 13:05:13.000000000 +0100 @@ -709,7 +709,9 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java 2021-02-23 13:05:13.000000000 +0100 @@ -170,6 +170,7 @@ private static Boolean onlineDetected = null; + private static long startupTrackerMoment = 0; /** * Header is not checked and so eg @@ -891,6 +892,19 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java 2021-02-23 13:05:13.000000000 +0100 @@ -39,15 +39,18 @@ 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 @@ 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; - } + filesToVerify.add(localFile); + } - VerifyResult result = verifyJar(localFile); + List<VerifiedJarFile> verified = verifyJarsParallel(filesToVerify); - 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; + 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 @@ 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 @@ * @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 @@ } } } - 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 @@ * 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 @@ } 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/util/PropertiesFile.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/util/PropertiesFile.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/jnlp/util/PropertiesFile.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/jnlp/util/PropertiesFile.java 2021-02-23 13:05:13.000000000 +0100 @@ -23,6 +23,8 @@ 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 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/nanoxml/XMLElement.java new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/nanoxml/XMLElement.java --- old/IcedTea-Web-icedtea-web-1.8.4/netx/net/sourceforge/nanoxml/XMLElement.java 2020-06-04 13:08:14.000000000 +0200 +++ new/IcedTea-Web-icedtea-web-1.8.6/netx/net/sourceforge/nanoxml/XMLElement.java 2021-02-23 13:05:13.000000000 +0100 @@ -1002,7 +1002,8 @@ } if (buf.length() == 0) { while (ch != '/') { - if (ch == '!') { + // jnlp files from a MFSys25 contain '<?-- JViewerVersion 3.30a -->', Treat as a comment + if (ch == '!' || ch == '?') { ch = this.readChar(); if (ch != '-') { throw this.expectedInput("Comment or Element"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IcedTea-Web-icedtea-web-1.8.4/tests/netx/unit/net/sourceforge/jnlp/runtime/CachedJarFileCallbackTest.java new/IcedTea-Web-icedtea-web-1.8.6/tests/netx/unit/net/sourceforge/jnlp/runtime/CachedJarFileCallbackTest.java --- old/IcedTea-Web-icedtea-web-1.8.4/tests/netx/unit/net/sourceforge/jnlp/runtime/CachedJarFileCallbackTest.java 1970-01-01 01:00:00.000000000 +0100 +++ new/IcedTea-Web-icedtea-web-1.8.6/tests/netx/unit/net/sourceforge/jnlp/runtime/CachedJarFileCallbackTest.java 2021-02-23 13:05:13.000000000 +0100 @@ -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", "[email protected]"); + + 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 + } + } + } +}
