diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..223f198 --- /dev/null +++ b/build.sh @@ -0,0 +1,46 @@ +#!/bin/bash +set -e + +JAVA=$(java --version | tr -d 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n' | cut -d ' ' -f 2 | cut -d '.' -f 1 | tr -d '\n\t ') + +if [ "$JAVA" -lt "14" ]; then + echo "Java 14+ must be used to compile with jpackage, java is $JAVA" + exit 1 +fi + + +if [ -z "${JAVA_HOME}" ]; then + JAVA_HOME=`type -p java|xargs readlink -f|xargs dirname|xargs dirname` + echo "Building with: $JAVA, $JAVA_HOME" +fi + +echo "cleaning" +./clean.sh + +HERE="$PWD" +RES_DIR="$HERE/../i2p.i2p/installer/resources" +I2P_JARS="$HERE/../i2p.i2p/pkg-temp/lib" +I2P_PKG="$HERE/../i2p.i2p/pkg-temp" + +echo "compiling custom launcher" +cp "$I2P_JARS"/*.jar build +cd java +"$JAVA_HOME"/bin/javac -d ../build -classpath "$HERE"/build/i2p.jar:"$HERE"/build/router.jar net/i2p/router/WinLauncher.java +cd .. + +echo "building launcher.jar" +cd build +"$JAVA_HOME"/bin/jar -cf launcher.jar net certificates geoip config webapps resources.csv +cd .. + +if [ -z $I2P_VERSION ]; then + I2P_VERSION=$("$JAVA_HOME"/bin/java -cp build/router.jar net.i2p.router.RouterVersion | sed "s/.*: //" | head -n 1) +fi +echo "preparing to invoke jpackage for I2P version $I2P_VERSION" + + +"$JAVA_HOME"/bin/jpackage --type app-image --name I2P --app-version "$I2P_VERSION" \ + --verbose \ + $JPACKAGE_OPTS \ + --resource-dir build \ + --input build --main-jar launcher.jar --main-class net.i2p.router.WinLauncher diff --git a/clean.sh b/clean.sh new file mode 100755 index 0000000..c72e339 --- /dev/null +++ b/clean.sh @@ -0,0 +1,18 @@ +#! /usr/bin/env sh + +rm -rf \ + build \ + eventlog.txt \ + hostsdb.blockfile \ + I2P \ + i2p_1.0-1_amd64.deb \ + libjbigi.so \ + libjcpuid.so \ + logs \ + peerProfiles \ + prngseed.rnd \ + router.config \ + wrapper.log \ + *.jar \ + *.exe \ + *.dmg \ No newline at end of file diff --git a/java/net/i2p/router/WinLauncher.java b/java/net/i2p/router/WinLauncher.java new file mode 100644 index 0000000..9eebd8a --- /dev/null +++ b/java/net/i2p/router/WinLauncher.java @@ -0,0 +1,46 @@ +package net.i2p.router; + +import java.io.*; +import java.util.*; + +/** + * Launches a router from a Mac App Bundle. Uses Java 9 APIs. + * Sets the following properties: + * i2p.dir.base - this points to the (read-only) resources inside the bundle + * i2p.dir.config - this points to the folder the configuration files are located in + * router.pid - the pid of the java process. + */ +public class WinLauncher { + + /** this is totally undocumented */ + private static final String APP_PATH = "jpackage.app-path"; + private static final String LOCALAPPDATA = System.getenv("LOCALAPPDATA"); + + public static void main(String[] args) throws Exception { + String path = System.getProperty(APP_PATH,"unknown"); + File f = new File(path); + File contents = f.getParentFile().getParentFile(); + + + File resources = new File(contents, "Resources"); + File bundleLocation = contents.getParentFile().getParentFile(); + + System.setProperty("i2p.dir.base", resources.getAbsolutePath()); + + System.setProperty("router.pid", String.valueOf(ProcessHandle.current().pid())); + + try { + //System.load(resources.getAbsolutePath() + "/libMacLauncher.jnilib"); + //disableAppNap(); + } catch (Throwable bad) { + // this is pretty bad - I2P is very slow if AppNap kicks in. + // TODO: hook up to a console warning or similar. + //bad.printStackTrace(); + } + + RouterLaunch.main(args); + } + + + +} diff --git a/src/nsis/i2pbrowser-installer.nsi b/src/nsis/i2pbrowser-installer.nsi index fa12b8a..a0d17b4 100644 --- a/src/nsis/i2pbrowser-installer.nsi +++ b/src/nsis/i2pbrowser-installer.nsi @@ -15,11 +15,14 @@ UniCode true var FFINSTEXE var FFNONTORINSTEXE var I2PINSTEXE +var USERLOCALAPPDATA + !define FFINSTEXE !define FFNONTORINSTEXE !define FFINSTEXE32 "$PROGRAMFILES32\Mozilla Firefox\" !define FFINSTEXE64 "$PROGRAMFILES64\Mozilla Firefox\" +!define USERLOCALAPPDATA "$LOCALAPPDATA" !define I2PINSTEXE !define I2PINSTEXE32 "$PROGRAMFILES32\i2p" @@ -193,24 +196,24 @@ Function routerDetect File /nonfatal /a /r "I2P\" File /nonfatal "I2P\config\jpackaged" - createDirectory "$LOCALAPPDATA\I2P\" - SetOutPath "$LOCALAPPDATA\I2P\" + createDirectory "$USERLOCALAPPDATA\I2P\" + SetOutPath "$USERLOCALAPPDATA\I2P\" File /nonfatal "I2P\config\clients.config" File /nonfatal "I2P\config\i2ptunnel.config" File /nonfatal "I2P\config\wrapper.config" File /nonfatal "I2P\config\hosts.txt" - createDirectory "$LOCALAPPDATA\I2P\webapps\" - SetOutPath "$LOCALAPPDATA\I2P\webapps\" + createDirectory "$USERLOCALAPPDATA\I2P\webapps\" + SetOutPath "$USERLOCALAPPDATA\I2P\webapps\" File /nonfatal /a /r "I2P\config\webapps\" - createDirectory "$LOCALAPPDATA\I2P\geoip\" - SetOutPath "$LOCALAPPDATA\I2P\geoip\" + createDirectory "$USERLOCALAPPDATA\I2P\geoip\" + SetOutPath "$USERLOCALAPPDATA\I2P\geoip\" File /nonfatal /a /r "I2P\config\geoip\" - createDirectory "$LOCALAPPDATA\I2P\certificates\" - SetOutPath "$LOCALAPPDATA\I2P\certificates\" + createDirectory "$USERLOCALAPPDATA\I2P\certificates\" + SetOutPath "$USERLOCALAPPDATA\I2P\certificates\" File /nonfatal /a /r "I2P\config\certificates\" Abort directory @@ -232,19 +235,19 @@ Section Install File /nonfatal /a /r "I2P\" File /nonfatal "I2P\config\jpackaged" - createDirectory "$LOCALAPPDATA\I2P\" - SetOutPath "$LOCALAPPDATA\I2P\" + createDirectory "$USERLOCALAPPDATA\I2P\" + SetOutPath "$USERLOCALAPPDATA\I2P\" - createDirectory "$LOCALAPPDATA\I2P\webapps\" - SetOutPath "$LOCALAPPDATA\I2P\webapps\" + createDirectory "$USERLOCALAPPDATA\I2P\webapps\" + SetOutPath "$USERLOCALAPPDATA\I2P\webapps\" File /nonfatal /a /r "I2P\config\webapps\" - createDirectory "$LOCALAPPDATA\I2P\geoip\" - SetOutPath "$LOCALAPPDATA\I2P\geoip\" + createDirectory "$USERLOCALAPPDATA\I2P\geoip\" + SetOutPath "$USERLOCALAPPDATA\I2P\geoip\" File /nonfatal /a /r "I2P\config\geoip\" - createDirectory "$LOCALAPPDATA\I2P\certificates\" - SetOutPath "$LOCALAPPDATA\I2P\certificates\" + createDirectory "$USERLOCALAPPDATA\I2P\certificates\" + SetOutPath "$USERLOCALAPPDATA\I2P\certificates\" File /nonfatal /a /r "I2P\config\certificates\" ${EndIf} @@ -256,7 +259,7 @@ Section Install FileWriteByte $0 "13" FileWriteByte $0 "10" ${If} ${FileExists} "$I2PINSTEXE\jpackaged" - FileWrite $0 'start /D "$LOCALAPPDATA\I2P\" "" "$I2PINSTEXE\i2p.exe"' + FileWrite $0 'start /D "$USERLOCALAPPDATA\I2P\" "" "$I2PINSTEXE\i2p.exe"' ${Else} FileWrite $0 'start "" "$I2PINSTEXE\i2p.exe"' ${EndIf} @@ -264,7 +267,7 @@ Section Install FileWriteByte $0 "10" FileWriteByte $0 "13" FileWriteByte $0 "10" - FileWrite $0 'start "" "$FFINSTEXE\firefox.exe" -no-remote -profile "$LOCALAPPDATA\${APPNAME}\firefox.profile.i2p" -url %1' + FileWrite $0 'start "" "$FFINSTEXE\firefox.exe" -no-remote -profile "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p" -url %1' FileWriteByte $0 "13" FileWriteByte $0 "10" FileWrite $0 exit @@ -277,7 +280,7 @@ Section Install FileWriteByte $0 "13" FileWriteByte $0 "10" ${If} ${FileExists} "$I2PINSTEXE\jpackaged" - FileWrite $0 'start /D "$LOCALAPPDATA\I2P\" "" "$I2PINSTEXE\i2p.exe"' + FileWrite $0 'start /D "$USERLOCALAPPDATA\I2P\" "" "$I2PINSTEXE\i2p.exe"' ${Else} FileWrite $0 'start "" "$I2PINSTEXE\i2p.exe"' ${EndIf} @@ -285,7 +288,7 @@ Section Install FileWriteByte $0 "10" FileWriteByte $0 "13" FileWriteByte $0 "10" - FileWrite $0 'start "" "$FFINSTEXE\firefox.exe" -no-remote -profile "$LOCALAPPDATA\${APPNAME}\firefox.profile.i2p" -private-window about:blank' + FileWrite $0 'start "" "$FFINSTEXE\firefox.exe" -no-remote -profile "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p" -private-window about:blank' FileWriteByte $0 "13" FileWriteByte $0 "10" FileWrite $0 exit @@ -302,7 +305,7 @@ Section Install FileWriteByte $0 "13" FileWriteByte $0 "10" ${If} ${FileExists} "$I2PINSTEXE\jpackaged" - FileWrite $0 'start /D "$LOCALAPPDATA\I2P\" "" "$I2PINSTEXE\i2p.exe"' + FileWrite $0 'start /D "$USERLOCALAPPDATA\I2P\" "" "$I2PINSTEXE\i2p.exe"' ${Else} FileWrite $0 'start "" "$I2PINSTEXE\i2p.exe"' ${EndIf} @@ -310,7 +313,7 @@ Section Install FileWriteByte $0 "10" FileWriteByte $0 "13" FileWriteByte $0 "10" - FileWrite $0 'start "" "$FFNONTORINSTEXE\firefox.exe" -no-remote -profile "$LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p" -url %1' + FileWrite $0 'start "" "$FFNONTORINSTEXE\firefox.exe" -no-remote -profile "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p" -url %1' FileWriteByte $0 "13" FileWriteByte $0 "10" FileWrite $0 exit @@ -326,37 +329,37 @@ Section Install File /r licenses\*.* # Install the profile - createDirectory "$LOCALAPPDATA\${APPNAME}\firefox.profile.i2p" - SetOutPath "$LOCALAPPDATA\${APPNAME}\firefox.profile.i2p" + createDirectory "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p" + SetOutPath "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p" File profile\user.js File profile\prefs.js File profile\bookmarks.html File profile\storage-sync.sqlite # Install the extensions - createDirectory "$LOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions" - SetOutPath "$LOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions" + createDirectory "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions" + SetOutPath "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions" File "profile\extensions\{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi" File profile\extensions\https-everywhere-eff@eff.org.xpi File profile\extensions\i2ppb@eyedeekay.github.io.xpi # Install the config profile - createDirectory "$LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p" - SetOutPath "$LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p" + createDirectory "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p" + SetOutPath "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p" File app-profile\user.js File app-profile\prefs.js File app-profile\bookmarks.html File app-profile\storage-sync.sqlite # Install the config extensions - createDirectory "$LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\extensions" - SetOutPath "$LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\extensions" + createDirectory "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\extensions" + SetOutPath "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\extensions" File profile\extensions\https-everywhere-eff@eff.org.xpi File profile\extensions\i2ppb@eyedeekay.github.io.xpi # Install the config userChrome - createDirectory "$LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\chrome" - SetOutPath "$LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\chrome" + createDirectory "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\chrome" + SetOutPath "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\chrome" File app-profile\chrome\userChrome.css SetOutPath "$INSTDIR" @@ -374,10 +377,10 @@ Section Install StrCpy $I2PAPPDATA "$I2PINSTEXE" IfFileExists "$APPDATA\I2P\clients.config.d" 0 +2 StrCpy $I2PAPPDATA "$APPDATA\I2P\" - IfFileExists "$LOCALAPPDATA\I2P\clients.config.d" 0 +2 - StrCpy $I2PAPPDATA "$LOCALAPPDATA\I2P\" - IfFileExists "$LOCALAPPDATA\I2P\clients.config" 0 +2 - StrCpy $I2PAPPDATA "$LOCALAPPDATA\I2P\" + IfFileExists "$USERLOCALAPPDATA\I2P\clients.config.d" 0 +2 + StrCpy $I2PAPPDATA "$USERLOCALAPPDATA\I2P\" + IfFileExists "$USERLOCALAPPDATA\I2P\clients.config" 0 +2 + StrCpy $I2PAPPDATA "$USERLOCALAPPDATA\I2P\" createDirectory "$I2PAPPDATA" @@ -415,25 +418,25 @@ Section "uninstall" Delete $INSTDIR\ui2pbrowser_icon.ico # Uninstall the profile - Delete $LOCALAPPDATA\${APPNAME}\firefox.profile.i2p\prefs.js - Delete $LOCALAPPDATA\${APPNAME}\firefox.profile.i2p\user.js - Delete $LOCALAPPDATA\${APPNAME}\firefox.profile.i2p\bookmarks.html - Delete $LOCALAPPDATA\${APPNAME}\firefox.profile.i2p\storage-sync.sqlite + Delete $USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p\prefs.js + Delete $USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p\user.js + Delete $USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p\bookmarks.html + Delete $USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p\storage-sync.sqlite - Delete $LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\prefs.js - Delete $LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\user.js - Delete $LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\bookmarks.html - Delete $LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\storage-sync.sqlite + Delete $USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\prefs.js + Delete $USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\user.js + Delete $USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\bookmarks.html + Delete $USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\storage-sync.sqlite # Uninstall the extensions - Delete "$LOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions\{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi" - Delete "$LOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions\https-everywhere-eff@eff.org.xpi" - Delete "$LOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions\i2ppb@eyedeekay.github.io.xpi" + Delete "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions\{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi" + Delete "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions\https-everywhere-eff@eff.org.xpi" + Delete "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions\i2ppb@eyedeekay.github.io.xpi" - Delete "$LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\extensions\https-everywhere-eff@eff.org.xpi" - Delete "$LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\extensions\i2ppb@eyedeekay.github.io.xpi" + Delete "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\extensions\https-everywhere-eff@eff.org.xpi" + Delete "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\extensions\i2ppb@eyedeekay.github.io.xpi" - Delete "$LOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\config\userChrome.css" + Delete "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.config.i2p\config\userChrome.css" # Remove shortcuts and folders Delete "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk" @@ -442,9 +445,9 @@ Section "uninstall" Delete "$DESKTOP\${APPNAME}.lnk" Delete "$DESKTOP\Private Browsing-${APPNAME}.lnk" rmDir "$SMPROGRAMS\${APPNAME}" - rmDir "$LOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions" - rmDir "$LOCALAPPDATA\${APPNAME}\firefox.profile.i2p" - rmDir "$LOCALAPPDATA\${APPNAME}" + rmDir "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p\extensions" + rmDir "$USERLOCALAPPDATA\${APPNAME}\firefox.profile.i2p" + rmDir "$USERLOCALAPPDATA\${APPNAME}" rmDir "$INSTDIR" # delete the uninstaller