Compare commits

...

61 Commits

Author SHA1 Message Date
idk
93b197efb9 exclude .git directory from tarball 2022-09-08 10:41:06 -04:00
idk
09ffb8edbe fix date in changelog 2022-09-08 10:37:01 -04:00
idk
cdc3224eaa Generate a tarball of the exact tag or branch it's built from, upload it when we do a daily 2022-09-08 10:34:53 -04:00
idk
2eeb2106fc shorten first-run checks timeout. 2022-09-07 16:19:21 -04:00
idk
26a7944470 add safety checks around Windows config stuff 2022-09-07 12:40:05 -04:00
idk
b97d581fcc add safety checks around Windows config stuff 2022-09-07 12:37:57 -04:00
idk
615818976a add safety checks around Windows config stuff 2022-09-07 12:34:19 -04:00
idk
e6fc5a349d when launching into a router console disable the proxy timeout 2022-09-07 12:29:54 -04:00
idk
3718d2edb9 when launching into a router console disable the proxy timeout 2022-09-07 12:26:11 -04:00
idk
4a55a8d4ab bump i2pfirefox version again 2022-09-07 04:36:50 -04:00
idk
a3a45b01e5 bump i2pfirefox version 2022-09-07 03:25:46 -04:00
idk
e07c43f1eb make sure args are of right type 2022-09-07 02:59:26 -04:00
idk
fd75a7e244 Fix parsing of arguments 2022-09-07 02:28:23 -04:00
idk
0e77d53c15 bump i2pfirefox version 2022-09-07 00:05:07 -04:00
idk
4dd9448752 bump version 2022-09-06 21:57:25 -04:00
idk
b220697af2 update i2pfirefox package, point release 2022-09-06 21:53:53 -04:00
idk
d9cffc9520 update version 2022-09-06 15:45:53 -04:00
idk
c8590e4fe5 fix redundant option 2022-09-06 01:31:55 -04:00
idk
3c8b1b6d28 try an experiment where I build an MSI 2022-09-06 01:29:30 -04:00
idk
460837d7f5 bump again 2022-09-05 14:19:35 -04:00
idk
2bd3abe6bb re-add self-run of I2P.exe to save users a click, this needs testing but since I've got 3 VM's and 3 laptops on my desk right now I'm going to do it right now 2022-09-05 14:12:00 -04:00
idk
5ef6118b91 bump version again 2022-09-05 10:42:24 -04:00
idk
394f58f90e bump launcher lib again 2022-09-05 10:23:17 -04:00
idk
5ee89f98a9 chnge tunnel nickname of HTTP proxy 2022-09-05 03:01:11 -04:00
idk
6736d527a2 setNotRunning must be called on browser launch too 2022-09-05 02:55:35 -04:00
idk
ef203ba935 setNotRunning before launching the router, counter-intuitively but this is for determining whether we should launch the browser only. The other checks will still work for determining if a router is there. It only needs to be there for the first 21 or so seconds. 2022-09-05 02:00:54 -04:00
idk
3749f49641 setNotRunning before launching the router, counter-intuitively but this is for determining whether we should launch the browser only. The other checks will still work for determining if a router is there. It only needs to be there for the first 21 or so seconds. 2022-09-05 01:58:53 -04:00
idk
d63128096c Bump browserlauncher version 2022-09-05 01:51:28 -04:00
idk
51cb4c608a enable faster router startup 2022-09-05 01:47:16 -04:00
idk
f920fa8090 further accelerate startups 2022-09-05 00:41:51 -04:00
idk
252a80eb72 further accelerate startups 2022-09-05 00:41:20 -04:00
idk
ed7814cd74 enable faster startups 2022-09-04 23:56:07 -04:00
idk
073ba01da6 Lessen startup delay/timeout 2022-09-04 23:50:58 -04:00
idk
7caf03d6e4 Bump again 2022-09-04 23:12:52 -04:00
idk
c3934ab4e4 switch i2p.exe to /bin/false 2022-09-04 22:40:25 -04:00
idk
54ffdc2352 bump version and extend timeout again 2022-09-04 21:37:25 -04:00
idk
ab2548ecd4 bump version and extend timeout again 2022-09-04 21:34:14 -04:00
idk
5cf5d56738 check for up to a whole 20 seconds to see if a router is running instead of just 2 2022-09-04 14:45:10 -04:00
idk
262311390e prevent double-launch on the first run 2022-09-04 11:09:52 -04:00
idk
3ac2f2b4a2 switch to tag containing the addressbook fix 2022-09-04 08:35:29 -04:00
idk
00ca509e57 bump version 2022-09-04 02:04:37 -04:00
idk
a1826d40e8 rotate keys in tunnel config 2022-09-04 01:59:27 -04:00
idk
c8f3f0b960 rotate keys in tunnel config 2022-09-04 01:52:58 -04:00
idk
a80512cd5a add a note which indicates that the user.dir must be set for the launcher to relauch itself 2022-09-04 01:39:09 -04:00
idk
7e5579fd65 allow chromium-first mode while I wait for the VM to extract(again) 2022-09-04 00:52:48 -04:00
idk
934ab43b2a Download from sub-directory since my release now has multiple artifacts github puts it at a different place 2022-09-03 22:41:30 -04:00
idk
9214c2116c move version of browser wrapping bundle to version config file 2022-09-03 22:20:42 -04:00
idk
c02e466f80 move version of browser wrapping bundle to version config file 2022-09-03 21:57:07 -04:00
idk
59a1a3d9e6 update browser wrapping bundle 2022-09-03 21:42:39 -04:00
idk
a230a49af7 format everything for readability and so the brackets all line up again. All whitespace changes. 2022-09-03 21:17:44 -04:00
idk
079ef87c8f format everything for readability and so the brackets all line up again. All whitespace changes. 2022-09-03 21:13:27 -04:00
idk
f9a7f8ab2d Set user.dir after getting path 2022-09-03 20:51:33 -04:00
idk
3c8dd9dee9 fix indent 2022-09-03 19:09:47 -04:00
idk
65db834ec9 no directory abort 2022-09-03 19:08:57 -04:00
idk
b955dbe66e fix setoutpaths for runtime and app dir 2022-09-03 18:27:13 -04:00
idk
e367227714 enable the usability profile 2022-09-02 20:05:51 -04:00
idk
4a02ec418a Merge branch 'auto-configure-any-browser' into 'master'
WIP: This enables the jpackage to launch almost any browser as an I2P-enabled...

See merge request i2p-hackers/i2p.firefox!7
2022-09-02 02:51:05 +00:00
idk
4368b80c79 Merge branch 'master' into 'auto-configure-any-browser'
# Conflicts:
#   src/nsis/i2pbrowser-installer.nsi
2022-09-02 02:49:56 +00:00
idk
7dff65d67d Merge branch 'experimental-extension-loadout' into 'master'
WIP: add 2 extension loadouts, one "Usability" loadout, one "Strict" loadout

See merge request i2p-hackers/i2p.firefox!8
2022-09-02 02:48:58 +00:00
idk
0ad9406387 copy app, runtime individually instead of the parent dir 2022-09-01 21:33:32 -04:00
idk
21b396e343 add buildscript for experimental extension loadout 2022-08-29 19:56:13 -04:00
22 changed files with 864 additions and 472 deletions

View File

@ -83,10 +83,10 @@ src/I2P/config: build/I2P
rm -rf src/I2P/config/geoip src/I2P/config/webapps src/I2P/config/certificates
echo true | tee src/I2P/config/jpackaged
cp -v $(RES_DIR)/clients.config src/I2P/config/
cp -v $(RES_DIR)/i2ptunnel.config src/I2P/config/
cp -v $(RES_DIR)/wrapper.config src/I2P/config/
#grep -v 'router.updateURL' $(RES_DIR)/router.config > src/I2P/config/router.config
cat router.config > src/I2P/config/router.config
cat i2ptunnel.config > src/I2P/config/i2ptunnel.config
cp -v $(RES_DIR)/hosts.txt src/I2P/config/hosts.txt
cp -R $(RES_DIR)/certificates src/I2P/config/certificates
cp -R $(RES_DIR)/eepsite src/I2P/config/eepsite

View File

@ -41,6 +41,7 @@ sleep 5s
HERE="$PWD"
if [ ! -d "$HERE/../i2p.i2p.jpackage-build/" ]; then
git clone -b "$VERSION" https://i2pgit.org/i2p-hackers/i2p.i2p "$HERE/../i2p.i2p.jpackage-build/"
tar --exclude="$HERE/../i2p.i2p.jpackage-build/.git" cvzf i2p.i2p.jpackage-build.tar.gz "$HERE/../i2p.i2p.jpackage-build/"
fi
cd "$HERE/../i2p.i2p.jpackage-build/"
for i in $COUNT; do
@ -66,7 +67,7 @@ if [ ! -f "$HERE/build/jna-platform.jar" ]; then
fi
if [ ! -f "$HERE/build/i2pfirefox.jar" ]; then
wget -O "$HERE/build/i2pfirefox.jar" https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/0.0.16/i2pfirefox.jar
wget -O "$HERE/build/i2pfirefox.jar" "https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/$I2PFIREFOX_VERSION/i2pfirefox.jar"
fi
cd java

View File

@ -1,3 +1,6 @@
2022-09-06 idk
* Point release 1.9.5, fixes a bug which occurs more often on Windows 11, fixes a SusiDNS issue
2022-08-28 idk
* Migrate away from batch scripts and simply launch a browser if I2P is already running.
This is more flexible, stable, and simplet to install

View File

@ -28,5 +28,6 @@ rm -rf \
wrapper.log \
*.jar \
*.exe \
*.dmg
*.dmg \
*.tar.gz
make clean

View File

@ -3,16 +3,28 @@
## If you need to use a different JVM, JDK, or other utility from
# build.sh, set it in this file, for example:
uname=$(uname)
#export PATH="$PATH:/c/Program Files/Java/jdk-17.0.3/bin/"
#export JAVA_HOME="/c/Program Files/Java/jdk-17.0.3"
# to use it for Oracle OpenJDK17
## Other potential values(NOT exhaustive):
PATH="/c/Program Files/Java/jdk-18.0.2/bin/:$PATH:/c/Program Files/Java/jdk-18.0.2/bin/"
export PATH="/c/Program Files/Java/jdk-18.0.2/bin/:$PATH:/c/Program Files/Java/jdk-18.0.2/bin/"
JAVA_HOME="/c/Program Files/Java/jdk-18.0.2"
export JAVA_HOME="/c/Program Files/Java/jdk-18.0.2"
if [[ -n "$IS_WSL" || -n "$WSL_DISTRO_NAME" ]]; then
PATH="/c/Program Files/Java/jdk-18.0.2/bin/:$PATH:/c/Program Files/Java/jdk-18.0.2/bin/"
export PATH="/c/Program Files/Java/jdk-18.0.2/bin/:$PATH:/c/Program Files/Java/jdk-18.0.2/bin/"
JAVA_HOME="/c/Program Files/Java/jdk-18.0.2"
export JAVA_HOME="/c/Program Files/Java/jdk-18.0.2"
fi
if [ "${uname}" != "Linux" ]; then
PATH="/c/Program Files/Java/jdk-18.0.2/bin/:$PATH:/c/Program Files/Java/jdk-18.0.2/bin/"
export PATH="/c/Program Files/Java/jdk-18.0.2/bin/:$PATH:/c/Program Files/Java/jdk-18.0.2/bin/"
JAVA_HOME="/c/Program Files/Java/jdk-18.0.2"
export JAVA_HOME="/c/Program Files/Java/jdk-18.0.2"
fi
#export PATH="$PATH:/c/Program Files/Eclipse Adoptium/jdk-17.0.3/bin/"
#export JAVA_HOME="/c/Program Files/Eclipse Adoptium/jdk-17.0.3"
#export PATH="$PATH:/c/Program Files/OpenJDK/jdk-17.0.3/bin/"
@ -49,6 +61,12 @@ export JAVA_HOME="/c/Program Files/Java/jdk-18.0.2"
#export ANT_HOME="/c/apache-ant-1.10.9"
#export PATH="$PATH:$ANT_HOME/bin/"
# Uncomment this to add signtool to the path so you don't have to fight with Visual Studio.
PATH="$PATH:/c/Program Files (x86)/Windows Kits/10/App Certification Kit/"
export PATH="$PATH:/c/Program Files (x86)/Windows Kits/10/App Certification Kit/"
if [[ -n "$IS_WSL" || -n "$WSL_DISTRO_NAME" ]]; then
PATH="$PATH:/c/Program Files (x86)/Windows Kits/10/App Certification Kit/"
export PATH="$PATH:/c/Program Files (x86)/Windows Kits/10/App Certification Kit/"
fi
if [ "${uname}" != "Linux" ]; then
PATH="$PATH:/c/Program Files (x86)/Windows Kits/10/App Certification Kit/"
export PATH="$PATH:/c/Program Files (x86)/Windows Kits/10/App Certification Kit/"
fi

View File

@ -49,3 +49,7 @@ tar -a -cf ../I2P.zip I2P
ZIPCHECKSUM=$(sha256sum "../I2P.zip")
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "../I2P.zip" -l "$ZIPCHECKSUM" -t "$TODAYSDATE" -n "I2P.zip"
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "../I2P.zip" -l "$ZIPCHECKSUM" -t "$TODAYSDATE" -n "I2P.zip"
TARCHECKSUM=$(sha256sum "i2p.i2p.jpackage-build.tar.gz")
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "i2p.i2p.jpackage-build.tar.gz" -l "Upstream I2P Router source code $TARCHECKSUM" -t "$TODAYSDATE" -n "i2p.i2p.jpackage-build.tar.gz"
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "i2p.i2p.jpackage-build.tar.gz" -l "Upstream I2P Router source code $TARCHECKSUM" -t "$TODAYSDATE" -n "i2p.i2p.jpackage-build.tar.gz"

17
experimental.sh Executable file
View File

@ -0,0 +1,17 @@
#! /usr/bin/env bash
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
cd "$SCRIPT_DIR" || exit 1
. "$SCRIPT_DIR/config.sh"
if [ -f config_overide.sh ]; then
. "$SCRIPT_DIR/config_override.sh"
fi
./clean.sh
wsl make distclean
wsl make clean-extensions
wsl make new-extensions
./build.sh
wsl make

192
i2ptunnel.config Normal file
View File

@ -0,0 +1,192 @@
# NOTE: This I2P config file must use UTF-8 encoding
#
# If you have a 'split' directory installation, with configuration
# files in ~/.i2p (Linux), %LOCALAPPDATA%\I2P (Windows),
# or /Users/(user)/Library/Application Support/i2p (Mac), be sure to
# edit the file in the configuration directory, NOT the install directory.
# When running as a Linux daemon, the configuration directory is /var/lib/i2p
# and the install directory is /usr/share/i2p .
# When running as a Windows service, the configuration directory is \ProgramData\i2p
# and the install directory is \Program Files\i2p .
#
# On first run, this file will be split into individual config files
# in i2ptunnel.config.d/ in the configuration directory.
# Look in that directory for the file to edit.
#
# eepproxy
tunnel.0.name=I2P HTTP Proxy
tunnel.0.description=HTTP proxy for browsing eepsites and the web
tunnel.0.type=httpclient
tunnel.0.sharedClient=false
tunnel.0.interface=127.0.0.1
tunnel.0.listenPort=4444
tunnel.0.proxyList=false.i2p
tunnel.0.i2cpHost=127.0.0.1
tunnel.0.i2cpPort=7654
tunnel.0.option.inbound.nickname=HTTP Proxy
tunnel.0.option.outbound.nickname=HTTP Proxy
tunnel.0.option.i2cp.leaseSetEncType=4,0
tunnel.0.option.i2cp.reduceIdleTime=900000
tunnel.0.option.i2cp.reduceOnIdle=true
tunnel.0.option.i2cp.reduceQuantity=1
tunnel.0.option.i2p.streaming.connectDelay=1000
tunnel.0.option.i2ptunnel.httpclient.SSLOutproxies=false.i2p
tunnel.0.option.inbound.length=3
tunnel.0.option.inbound.lengthVariance=0
tunnel.0.option.outbound.length=3
tunnel.0.option.outbound.lengthVariance=0
tunnel.0.option.outbound.priority=10
tunnel.0.startOnLoad=true
tunnel.0.option.persistentClientKey=false
tunnel.0.option.i2cp.closeIdleTime=1800000
tunnel.0.option.i2cp.closeOnIdle=true
tunnel.0.option.i2cp.newDestOnResume=true
# irc
tunnel.1.name=Irc2P
tunnel.1.description=IRC tunnel to access the Irc2P network
tunnel.1.type=ircclient
tunnel.1.sharedClient=false
tunnel.1.interface=127.0.0.1
tunnel.1.listenPort=6668
tunnel.1.targetDestination=irc.postman.i2p:6667,irc.echelon.i2p:6667
tunnel.1.i2cpHost=127.0.0.1
tunnel.1.i2cpPort=7654
tunnel.1.option.inbound.nickname=Irc2P
tunnel.1.option.outbound.nickname=Irc2P
tunnel.1.option.i2cp.closeIdleTime=1200000
tunnel.1.option.i2cp.closeOnIdle=true
tunnel.1.option.i2cp.delayOpen=true
tunnel.1.option.i2cp.destination.sigType=7
tunnel.1.option.i2cp.leaseSetEncType=4,0
tunnel.1.option.i2cp.newDestOnResume=false
tunnel.1.option.i2cp.reduceIdleTime=600000
tunnel.1.option.i2cp.reduceOnIdle=true
tunnel.1.option.i2cp.reduceQuantity=1
tunnel.1.option.i2p.streaming.connectDelay=1000
tunnel.1.option.i2p.streaming.maxWindowSize=16
tunnel.1.option.inbound.length=3
tunnel.1.option.inbound.lengthVariance=0
tunnel.1.option.outbound.length=3
tunnel.1.option.outbound.lengthVariance=0
tunnel.1.option.outbound.priority=15
tunnel.1.startOnLoad=true
# local eepserver
tunnel.3.name=I2P webserver
tunnel.3.description=My eepsite
tunnel.3.type=httpserver
tunnel.3.targetHost=127.0.0.1
tunnel.3.targetPort=7658
tunnel.3.spoofedHost=mysite.i2p
tunnel.3.privKeyFile=eepsite/eepPriv.dat
tunnel.3.i2cpHost=127.0.0.1
tunnel.3.i2cpPort=7654
tunnel.3.option.inbound.nickname=eepsite
tunnel.3.option.outbound.nickname=eepsite
tunnel.3.option.i2cp.destination.sigType=7
tunnel.3.option.i2cp.leaseSetEncType=4,0
tunnel.3.option.inbound.length=3
tunnel.3.option.inbound.lengthVariance=0
tunnel.3.option.outbound.length=3
tunnel.3.option.outbound.lengthVariance=0
# uncomment for HTTPS to port 7668
#tunnel.3.option.targetForPort.443=127.0.0.1:7668
tunnel.3.startOnLoad=false
# postman's SMTP server - see hq.postman.i2p
tunnel.4.description=smtp server
tunnel.4.i2cpHost=127.0.0.1
tunnel.4.i2cpPort=7654
tunnel.4.interface=127.0.0.1
tunnel.4.listenPort=7659
tunnel.4.name=smtp.postman.i2p
tunnel.4.option.inbound.nickname=shared clients
tunnel.4.option.outbound.nickname=shared clients
tunnel.4.option.i2cp.leaseSetEncType=4,0
tunnel.4.option.i2cp.reduceIdleTime=900000
tunnel.4.option.i2cp.reduceOnIdle=true
tunnel.4.option.i2cp.reduceQuantity=1
tunnel.4.option.inbound.length=3
tunnel.4.option.inbound.lengthVariance=0
tunnel.4.option.outbound.length=3
tunnel.4.option.outbound.lengthVariance=0
tunnel.4.startOnLoad=true
tunnel.4.targetDestination=smtp.postman.i2p:25
tunnel.4.type=client
tunnel.4.sharedClient=true
# postman's POP3 server - see hq.postman.i2p
tunnel.2.name=pop3.postman.i2p
tunnel.2.description=pop3 server
tunnel.2.i2cpHost=127.0.0.1
tunnel.2.i2cpPort=7654
tunnel.2.interface=127.0.0.1
tunnel.2.listenPort=7660
tunnel.2.option.inbound.nickname=shared clients
tunnel.2.option.outbound.nickname=shared clients
tunnel.2.option.i2cp.leaseSetEncType=4,0
tunnel.2.option.i2cp.reduceIdleTime=900000
tunnel.2.option.i2cp.reduceOnIdle=true
tunnel.2.option.i2cp.reduceQuantity=1
tunnel.2.option.i2p.streaming.connectDelay=1000
tunnel.2.option.inbound.length=3
tunnel.2.option.inbound.lengthVariance=0
tunnel.2.option.outbound.length=3
tunnel.2.option.outbound.lengthVariance=0
tunnel.2.startOnLoad=true
tunnel.2.targetDestination=pop.postman.i2p:110
tunnel.2.type=client
tunnel.2.sharedClient=true
# HTTPS (CONNECT) outproxy
tunnel.5.name=I2P HTTPS Proxy
tunnel.5.description=HTTPS proxy for browsing eepsites and the web
tunnel.5.type=connectclient
tunnel.5.sharedClient=true
tunnel.5.interface=127.0.0.1
tunnel.5.listenPort=4445
tunnel.5.proxyList=outproxy-tor.meeh.i2p
tunnel.5.i2cpHost=127.0.0.1
tunnel.5.i2cpPort=7654
tunnel.5.option.inbound.nickname=shared clients
tunnel.5.option.outbound.nickname=shared clients
tunnel.5.option.i2cp.leaseSetEncType=4,0
tunnel.5.option.i2cp.reduceIdleTime=900000
tunnel.5.option.i2cp.reduceOnIdle=true
tunnel.5.option.i2cp.reduceQuantity=1
tunnel.5.option.i2p.streaming.connectDelay=1000
tunnel.5.option.inbound.length=3
tunnel.5.option.inbound.lengthVariance=0
tunnel.5.option.outbound.length=3
tunnel.5.option.outbound.lengthVariance=0
tunnel.5.startOnLoad=true
# I2P Git Repositories SSH Access
tunnel.6.description=I2P Git Repositories SSH Access
tunnel.6.interface=127.0.0.1
tunnel.6.listenPort=7670
tunnel.6.name=gitssh.idk.i2p
tunnel.6.option.i2cp.closeIdleTime=1800000
tunnel.6.option.i2cp.closeOnIdle=false
tunnel.6.option.i2cp.delayOpen=true
tunnel.6.option.i2cp.destination.sigType=7
tunnel.6.option.i2cp.leaseSetEncType=4
tunnel.6.option.i2cp.newDestOnResume=false
tunnel.6.option.i2cp.reduceIdleTime=1200000
tunnel.6.option.i2cp.reduceOnIdle=true
tunnel.6.option.i2cp.reduceQuantity=1
tunnel.6.option.inbound.backupQuantity=1
tunnel.6.option.inbound.length=3
tunnel.6.option.inbound.nickname=gitssh.idk.i2p
tunnel.6.option.inbound.quantity=3
tunnel.6.option.outbound.backupQuantity=1
tunnel.6.option.outbound.length=3
tunnel.6.option.outbound.nickname=gitssh.idk.i2p
tunnel.6.option.outbound.quantity=3
tunnel.6.sharedClient=false
tunnel.6.startOnLoad=false
tunnel.6.targetDestination=gitssh.idk.i2p
tunnel.6.type=client

View File

@ -2,19 +2,15 @@
JNA_VERSION=5.11.0
export JNA_VERSION=5.11.0
#Comment this out to build from an alternate branch or
I2PFIREFOX_VERSION=0.0.34
export I2PFIREFOX_VERSION=0.0.34
# Comment this out to build from an alternate branch or
# the tip of the master branch.
VERSIONMAJOR=1
VERSIONMINOR=9
VERSIONBUILD=0
VERSIONBUILD=5
I2P_VERSION="$VERSIONMAJOR.$VERSIONMINOR.$VERSIONBUILD"
export I2P_VERSION="$VERSIONMAJOR.$VERSIONMINOR.$VERSIONBUILD"
VERSION=i2p-1.9.0
export VERSION=i2p-1.9.0
VERSION=i2p-jpackage-1.9.4
export VERSION=i2p-jpackage-1.9.4
#Uncomment this to build from the tip of the master.
#I2P_VERSION=1.8.0
#export I2P_VERSION=1.8.0
#VERSION=master
#export VERSION="$VERSION"

View File

@ -5,29 +5,31 @@ import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.Kernel32Util;
public class Elevator {
public static void main(String... args) {
executeAsAdministrator("c:\\windows\\system32\\notepad.exe", "");
}
public static void main(String... args) {
executeAsAdministrator("c:\\windows\\system32\\notepad.exe", "");
}
public static void executeAsAdministrator(String command, String args) {
if (command == "" || command == null) {
System.out.println("No command specified");
return;
}
Shell32X.SHELLEXECUTEINFO execInfo = new Shell32X.SHELLEXECUTEINFO();
execInfo.lpFile = new WString(command);
if (args != null)
execInfo.lpParameters = new WString(args);
execInfo.nShow = Shell32X.SW_SHOWDEFAULT;
execInfo.fMask = Shell32X.SEE_MASK_NOCLOSEPROCESS;
execInfo.lpVerb = new WString("runas");
boolean result = Shell32X.INSTANCE.ShellExecuteEx(execInfo);
if (!result) {
int lastError = Kernel32.INSTANCE.GetLastError();
String errorMessage = Kernel32Util.formatMessageFromLastErrorCode(lastError);
throw new RuntimeException("Error performing elevation: " + lastError + ": " + errorMessage + " (apperror="
+ execInfo.hInstApp + ")");
}
public static void executeAsAdministrator(String command, String args) {
if (command == "" || command == null) {
System.out.println("No command specified");
return;
}
Shell32X.SHELLEXECUTEINFO execInfo = new Shell32X.SHELLEXECUTEINFO();
execInfo.lpFile = new WString(command);
if (args != null)
execInfo.lpParameters = new WString(args);
execInfo.nShow = Shell32X.SW_SHOWDEFAULT;
execInfo.fMask = Shell32X.SEE_MASK_NOCLOSEPROCESS;
execInfo.lpVerb = new WString("runas");
boolean result = Shell32X.INSTANCE.ShellExecuteEx(execInfo);
if (!result) {
int lastError = Kernel32.INSTANCE.GetLastError();
String errorMessage =
Kernel32Util.formatMessageFromLastErrorCode(lastError);
throw new RuntimeException("Error performing elevation: " + lastError +
": " + errorMessage +
" (apperror=" + execInfo.hInstApp + ")");
}
}
}

View File

@ -1,7 +1,5 @@
package net.i2p.router;
import java.util.*;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
@ -12,100 +10,114 @@ import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.platform.win32.WinReg.HKEY;
import com.sun.jna.win32.W32APIOptions;
import java.util.*;
public interface Shell32X extends Shell32 {
Shell32X INSTANCE = (Shell32X) Native.loadLibrary("shell32", Shell32X.class, W32APIOptions.UNICODE_OPTIONS);
Shell32X INSTANCE = (Shell32X)Native.loadLibrary(
"shell32", Shell32X.class, W32APIOptions.UNICODE_OPTIONS);
int SW_HIDE = 0;
int SW_MAXIMIZE = 3;
int SW_MINIMIZE = 6;
int SW_RESTORE = 9;
int SW_SHOW = 5;
int SW_SHOWDEFAULT = 10;
int SW_SHOWMAXIMIZED = 3;
int SW_SHOWMINIMIZED = 2;
int SW_SHOWMINNOACTIVE = 7;
int SW_SHOWNA = 8;
int SW_SHOWNOACTIVATE = 4;
int SW_SHOWNORMAL = 1;
int SW_HIDE = 0;
int SW_MAXIMIZE = 3;
int SW_MINIMIZE = 6;
int SW_RESTORE = 9;
int SW_SHOW = 5;
int SW_SHOWDEFAULT = 10;
int SW_SHOWMAXIMIZED = 3;
int SW_SHOWMINIMIZED = 2;
int SW_SHOWMINNOACTIVE = 7;
int SW_SHOWNA = 8;
int SW_SHOWNOACTIVATE = 4;
int SW_SHOWNORMAL = 1;
/** File not found. */
int SE_ERR_FNF = 2;
/** File not found. */
int SE_ERR_FNF = 2;
/** Path not found. */
int SE_ERR_PNF = 3;
/** Path not found. */
int SE_ERR_PNF = 3;
/** Access denied. */
int SE_ERR_ACCESSDENIED = 5;
/** Access denied. */
int SE_ERR_ACCESSDENIED = 5;
/** Out of memory. */
int SE_ERR_OOM = 8;
/** Out of memory. */
int SE_ERR_OOM = 8;
/** DLL not found. */
int SE_ERR_DLLNOTFOUND = 32;
/** DLL not found. */
int SE_ERR_DLLNOTFOUND = 32;
/** Cannot share an open file. */
int SE_ERR_SHARE = 26;
/** Cannot share an open file. */
int SE_ERR_SHARE = 26;
int SEE_MASK_NOCLOSEPROCESS = 0x00000040;
int SEE_MASK_NOCLOSEPROCESS = 0x00000040;
int ShellExecute(int i, String lpVerb, String lpFile, String lpParameters, String lpDirectory, int nShow);
int ShellExecute(int i, String lpVerb, String lpFile, String lpParameters,
String lpDirectory, int nShow);
boolean ShellExecuteEx(SHELLEXECUTEINFO lpExecInfo);
boolean ShellExecuteEx(SHELLEXECUTEINFO lpExecInfo);
public static class SHELLEXECUTEINFO extends Structure {
/*
* DWORD cbSize;
* ULONG fMask;
* HWND hwnd;
* LPCTSTR lpVerb;
* LPCTSTR lpFile;
* LPCTSTR lpParameters;
* LPCTSTR lpDirectory;
* int nShow;
* HINSTANCE hInstApp;
* LPVOID lpIDList;
* LPCTSTR lpClass;
* HKEY hkeyClass;
* DWORD dwHotKey;
* union {
* HANDLE hIcon;
* HANDLE hMonitor;
* } DUMMYUNIONNAME;
* HANDLE hProcess;
*/
public static class SHELLEXECUTEINFO extends Structure {
/*
* DWORD cbSize;
* ULONG fMask;
* HWND hwnd;
* LPCTSTR lpVerb;
* LPCTSTR lpFile;
* LPCTSTR lpParameters;
* LPCTSTR lpDirectory;
* int nShow;
* HINSTANCE hInstApp;
* LPVOID lpIDList;
* LPCTSTR lpClass;
* HKEY hkeyClass;
* DWORD dwHotKey;
* union {
* HANDLE hIcon;
* HANDLE hMonitor;
* } DUMMYUNIONNAME;
* HANDLE hProcess;
*/
public int cbSize = size();
public int fMask;
public HWND hwnd;
public WString lpVerb;
public WString lpFile;
public WString lpParameters;
public WString lpDirectory;
public int nShow;
public HINSTANCE hInstApp;
public Pointer lpIDList;
public WString lpClass;
public HKEY hKeyClass;
public int dwHotKey;
public int cbSize = size();
public int fMask;
public HWND hwnd;
public WString lpVerb;
public WString lpFile;
public WString lpParameters;
public WString lpDirectory;
public int nShow;
public HINSTANCE hInstApp;
public Pointer lpIDList;
public WString lpClass;
public HKEY hKeyClass;
public int dwHotKey;
/*
* Actually:
* union {
* HANDLE hIcon;
* HANDLE hMonitor;
* } DUMMYUNIONNAME;
*/
public HANDLE hMonitor;
public HANDLE hProcess;
/*
* Actually:
* union {
* HANDLE hIcon;
* HANDLE hMonitor;
* } DUMMYUNIONNAME;
*/
public HANDLE hMonitor;
public HANDLE hProcess;
protected List getFieldOrder() {
return Arrays.asList(new String[] {
"cbSize", "fMask", "hwnd", "lpVerb", "lpFile", "lpParameters",
"lpDirectory", "nShow", "hInstApp", "lpIDList", "lpClass",
"hKeyClass", "dwHotKey", "hMonitor", "hProcess",
});
}
protected List getFieldOrder() {
return Arrays.asList(new String[] {
"cbSize",
"fMask",
"hwnd",
"lpVerb",
"lpFile",
"lpParameters",
"lpDirectory",
"nShow",
"hInstApp",
"lpIDList",
"lpClass",
"hKeyClass",
"dwHotKey",
"hMonitor",
"hProcess",
});
}
}
}

View File

@ -1,5 +1,7 @@
package net.i2p.router;
import static net.i2p.update.UpdateType.*;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
@ -8,24 +10,20 @@ import java.util.*;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import net.i2p.crypto.*;
import net.i2p.app.ClientAppManager;
import net.i2p.router.RouterLaunch;
import net.i2p.crypto.*;
import net.i2p.i2pfirefox.*;
import net.i2p.router.Router;
import net.i2p.router.RouterLaunch;
import net.i2p.update.*;
import net.i2p.update.UpdateManager;
import net.i2p.update.UpdatePostProcessor;
import net.i2p.util.SystemVersion;
import net.i2p.update.*;
import net.i2p.i2pfirefox.*;
import static net.i2p.update.UpdateType.*;
/**
* Launches a router from %PROGRAMFILES%/I2P using configuration data in
* %LOCALAPPDATA%/I2P.. 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 (read-write) config directory in local
@ -33,199 +31,311 @@ import static net.i2p.update.UpdateType.*;
* router.pid - the pid of the java process.
*/
public class WinLauncher {
static Logger logger = Logger.getLogger("launcherlog");
static FileHandler fh;
static Logger logger = Logger.getLogger("launcherlog");
static FileHandler fh;
public static void main(String[] args) throws Exception {
try {
// This block configure the logger with handler and formatter
fh = new FileHandler(logFile().toString());
logger.addHandler(fh);
SimpleFormatter formatter = new SimpleFormatter();
fh.setFormatter(formatter);
// the following statement is used to log any messages
logger.info("My first log");
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
boolean privateBrowsing = false;
if (args != null && args.length > 0) {
logger.info("checking for private browsing");
if (args[0].equals("-private")) {
privateBrowsing = true;
logger.info("private browsing is true, profile will be discarded at end of session");
}
}
File programs = selectProgramFile();
if (!programs.exists())
programs.mkdirs();
else if (!programs.isDirectory()) {
logger.warning(programs + " exists but is not a directory. Please get it out of the way");
System.exit(1);
}
File home = selectHome();
if (!home.exists())
home.mkdirs();
else if (!home.isDirectory()) {
logger.warning(home + " exists but is not a directory. Please get it out of the way");
System.exit(1);
}
if (i2pIsRunning()) {
logger.warning("I2P is already running");
I2PBrowser i2pBrowser = new I2PBrowser();
System.out.println("i2pBrowser");
i2pBrowser.launch(privateBrowsing);
return;
}
System.setProperty("i2p.dir.base", programs.getAbsolutePath());
System.setProperty("i2p.dir.config", home.getAbsolutePath());
System.setProperty("router.pid", String.valueOf(ProcessHandle.current().pid()));
logger.info("\t" + System.getProperty("i2p.dir.base") + "\n\t" + System.getProperty("i2p.dir.config")
+ "\n\t" + System.getProperty("router.pid"));
// wupp.i2pRouter = new Router(System.getProperties());
logger.info("Router is configured");
Thread registrationThread = new Thread(REGISTER_UPP);
registrationThread.setName("UPP Registration");
registrationThread.setDaemon(true);
registrationThread.start();
// wupp.i2pRouter.runRouter();
RouterLaunch.main(args);
public static void main(String[] args) throws Exception {
try {
// This block configure the logger with handler and formatter
fh = new FileHandler(logFile().toString());
logger.addHandler(fh);
SimpleFormatter formatter = new SimpleFormatter();
fh.setFormatter(formatter);
// the following statement is used to log any messages
logger.info("My first log");
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
boolean privateBrowsing = false;
boolean usabilityMode = false;
boolean chromiumFirst = false;
int proxyTimeoutTime = 200;
ArrayList<String> newArgsList = new ArrayList<String>();
// see https://stackoverflow.com/questions/434718/sockets-discover-port-availability-using-java
public static boolean isAvailable(int portNr) {
boolean portFree;
try (var ignored = new ServerSocket(portNr)) {
portFree = true;
} catch (IOException e) {
portFree = false;
if (args != null) {
if (args.length > 0) {
for (String arg : args) {
if (arg.equals("-private")) {
privateBrowsing = true;
logger.info(
"Private browsing is true, profile will be discarded at end of session.");
} else if (arg.equals("-chromium")) {
chromiumFirst = true;
logger.info("Chromium will be selected before Firefox.");
} else if (arg.equals("-usability")) {
usabilityMode = true;
logger.info(
"Usability mode is true, using alternate extensions loadout.");
} else if (arg.equals("-noproxycheck")) {
proxyTimeoutTime = 0;
logger.info("Proxy timeout time set to zero");
} else {
// make an effort to not let people launch into sites if the proxy
// isn't quite ready yet, but also disable the proxy timeout if
// they're reaching a router console
if (arg.startsWith("http://localhost:76")) {
newArgsList.add(arg);
proxyTimeoutTime = 0;
} else if (arg.startsWith("http://127.0.0.1:76")) {
newArgsList.add(arg);
proxyTimeoutTime = 0;
} else if (arg.startsWith("https://localhost:76")) {
newArgsList.add(arg);
proxyTimeoutTime = 0;
} else if (arg.startsWith("https://127.0.0.1:76")) {
newArgsList.add(arg);
proxyTimeoutTime = 0;
} else if (proxyTimeoutTime > 0) {
newArgsList.add(arg);
} else if (!isAvailable(4444)) {
newArgsList.add(arg);
}
}
}
return portFree;
}
}
private static boolean i2pIsRunning() {
sleep(2000);
// check if there's something listening on port 7657(Router Console)
if (!isAvailable(7657)) {
return true;
}
// check if there's something listening on port 7654(I2CP)
if (!isAvailable(7654)) {
return true;
}
// check for the existence of router.ping file, if it's less then 2 minutes old,
// exit
File home = selectHome();
File ping = new File(home, "router.ping");
if (ping.exists()) {
long diff = System.currentTimeMillis() - ping.lastModified();
if (diff < 60 * 1000) {
logger.info("router.ping exists and is less than 1 minute old, I2P appears to be running already.");
logger.info("If I2P is not running, wait 60 seconds and try again.");
return true;
}
}
File programs = selectProgramFile();
if (!programs.exists())
programs.mkdirs();
else if (!programs.isDirectory()) {
logger.warning(
programs +
" exists but is not a directory. Please get it out of the way");
System.exit(1);
}
File home = selectHome();
if (!home.exists())
home.mkdirs();
else if (!home.isDirectory()) {
logger.warning(
home +
" exists but is not a directory. Please get it out of the way");
System.exit(1);
}
if (i2pIsRunning()) {
setNotRunning();
logger.warning("I2P is already running");
I2PBrowser i2pBrowser = new I2PBrowser();
i2pBrowser.usability = usabilityMode;
i2pBrowser.chromiumFirst = chromiumFirst;
i2pBrowser.firefox = !chromiumFirst;
i2pBrowser.chromium = chromiumFirst;
i2pBrowser.setProxyTimeoutTime(proxyTimeoutTime);
System.out.println("I2PBrowser");
String[] newArgs = newArgsList.toArray(new String[newArgsList.size()]);
i2pBrowser.launch(privateBrowsing, newArgs);
return;
}
System.setProperty("i2p.dir.base", programs.getAbsolutePath());
System.setProperty("i2p.dir.config", home.getAbsolutePath());
System.setProperty("router.pid",
String.valueOf(ProcessHandle.current().pid()));
logger.info("\t" + System.getProperty("i2p.dir.base") + "\n\t" +
System.getProperty("i2p.dir.config") + "\n\t" +
System.getProperty("router.pid"));
/**
* IMPORTANT: You must set user.dir to the same directory where the
* jpackage is intstalled, or when the launcher tries to re-run itself
* to start the browser, it will start in the wrong directory and fail
* to find the JVM and Runtime bundle. This broke Windows 11 installs.
*/
System.setProperty("user.dir", programs.getAbsolutePath());
// wupp.i2pRouter = new Router(System.getProperties());
logger.info("Router is configured");
Thread registrationThread = new Thread(REGISTER_UPP);
registrationThread.setName("UPP Registration");
registrationThread.setDaemon(true);
registrationThread.start();
setNotRunning();
// wupp.i2pRouter.runRouter();
RouterLaunch.main(args);
}
// see
// https://stackoverflow.com/questions/434718/sockets-discover-port-availability-using-java
public static boolean isAvailable(int portNr) {
boolean portFree;
try (var ignored = new ServerSocket(portNr)) {
portFree = true;
} catch (IOException e) {
portFree = false;
}
return portFree;
}
private static boolean i2pIsRunningCheck() {
// check if there's something listening on port 7657(Router Console)
if (!isAvailable(7657)) {
return true;
}
// check if there's something listening on port 7654(I2CP)
if (!isAvailable(7654)) {
return true;
}
// check for the existence of router.ping file, if it's less then 2
// minutes old, exit
File home = selectHome();
File ping = new File(home, "router.ping");
if (ping.exists()) {
long diff = System.currentTimeMillis() - ping.lastModified();
if (diff < 60 * 1000) {
logger.info(
"router.ping exists and is less than 1 minute old, I2P appears to be running already.");
logger.info("If I2P is not running, wait 60 seconds and try again.");
return true;
}
}
return false;
}
private static void setNotRunning() {
File home = selectHome();
File running = new File(home, "running");
if (running.exists()) {
running.delete();
}
}
private static void setRunning() {
File home = selectHome();
File running = new File(home, "running");
if (!running.exists()) {
try {
running.createNewFile();
} catch (IOException e) {
logger.info(e.toString());
}
}
}
private static boolean i2pIsRunning() {
File home = selectHome();
File running = new File(home, "running");
if (running.exists()) {
return true;
}
setRunning();
File ping = new File(home, "router.ping");
if (ping.exists()) {
long diff = System.currentTimeMillis() - ping.lastModified();
if (diff > 60 * 1000) {
logger.info(
"router.ping exists and is more than 1 minute old, I2P does not appear to be running.");
logger.info("If I2P is running, report this as a bug.");
return false;
}
}
if (i2pIsRunningCheck())
return true;
for (int i = 0; i < 10; i++) {
if (i2pIsRunningCheck())
return true;
sleep(1000);
}
return false;
}
private static final Runnable REGISTER_UPP = () -> {
// first wait for the RouterContext to appear
RouterContext ctx;
while ((ctx = (RouterContext)RouterContext.getCurrentContext()) == null) {
sleep(1000);
}
private static final Runnable REGISTER_UPP = () -> {
// then wait for the update manager
// first wait for the RouterContext to appear
RouterContext ctx;
while ((ctx = (RouterContext) RouterContext.getCurrentContext()) == null) {
sleep(1000);
}
// then wait for the update manager
ClientAppManager cam;
while ((cam = ctx.clientAppManager()) == null) {
sleep(1000);
}
UpdateManager um;
while ((um = (UpdateManager) cam.getRegisteredApp(UpdateManager.APP_NAME)) == null) {
sleep(1000);
}
WindowsUpdatePostProcessor wupp = new WindowsUpdatePostProcessor(ctx);
um.register(wupp, UpdateType.ROUTER_SIGNED_SU3, SU3File.TYPE_EXE);
um.register(wupp, UpdateType.ROUTER_DEV_SU3, SU3File.TYPE_EXE);
};
private static void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException bad) {
bad.printStackTrace();
throw new RuntimeException(bad);
}
ClientAppManager cam;
while ((cam = ctx.clientAppManager()) == null) {
sleep(1000);
}
private static File selectHome() { // throws Exception {
String path_override = System.getenv("I2P_CONFIG");
if (path_override != null) {
File path = new File(path_override);
if (path != null && path.exists()) {
if (path.isDirectory())
return path.getAbsoluteFile();
else
throw new RuntimeException("I2P_CONFIG is not a directory: " + path);
}
}
if (SystemVersion.isWindows()) {
File home = new File(System.getProperty("user.home"));
File appData = new File(home, "AppData");
File local = new File(appData, "Local");
File i2p;
i2p = new File(local, "I2P");
logger.info("Windows jpackage wrapper started, using: " + i2p + " as base config");
return i2p.getAbsoluteFile();
} else {
File jrehome = new File(System.getProperty("java.home"));
File programs = new File(jrehome.getParentFile().getParentFile(), ".i2p");
logger.info("Linux portable jpackage wrapper started, using: " + programs + " as base config");
return programs.getAbsoluteFile();
}
UpdateManager um;
while ((um = (UpdateManager)cam.getRegisteredApp(UpdateManager.APP_NAME)) ==
null) {
sleep(1000);
}
private static File selectProgramFile() {
String path_override = System.getenv("I2P");
if (path_override != null) {
File path = new File(path_override);
if (path.exists()) {
if (path.isDirectory())
return path.getAbsoluteFile();
else
throw new RuntimeException("I2P is not a directory: " + path);
}
}
if (SystemVersion.isWindows()) {
File jrehome = new File(System.getProperty("java.home"));
File programs = jrehome.getParentFile();
logger.info("Windows portable jpackage wrapper found, using: " + programs + " as working config");
return programs.getAbsoluteFile();
} else {
File jrehome = new File(System.getProperty("java.home"));
File programs = new File(jrehome.getParentFile().getParentFile(), "i2p");
logger.info("Linux portable jpackage wrapper found, using: " + programs + " as working config");
return programs.getAbsoluteFile();
}
}
WindowsUpdatePostProcessor wupp = new WindowsUpdatePostProcessor(ctx);
um.register(wupp, UpdateType.ROUTER_SIGNED_SU3, SU3File.TYPE_EXE);
um.register(wupp, UpdateType.ROUTER_DEV_SU3, SU3File.TYPE_EXE);
};
private static File logFile() {
File log = new File(selectProgramFile(), "log");
if (!log.exists())
log.mkdirs();
return new File(log, "launcher.log");
private static void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException bad) {
bad.printStackTrace();
throw new RuntimeException(bad);
}
}
private static File selectHome() { // throws Exception {
String path_override = System.getenv("I2P_CONFIG");
if (path_override != null) {
File path = new File(path_override);
if (path != null && path.exists()) {
if (path.isDirectory())
return path.getAbsoluteFile();
else
throw new RuntimeException("I2P_CONFIG is not a directory: " + path);
}
}
if (SystemVersion.isWindows()) {
File home = new File(System.getProperty("user.home"));
File appData = new File(home, "AppData");
File local = new File(appData, "Local");
File i2p;
i2p = new File(local, "I2P");
logger.info("Windows jpackage wrapper starting up, using: " + i2p +
" as base config");
return i2p.getAbsoluteFile();
} else {
File jrehome = new File(System.getProperty("java.home"));
File programs = new File(jrehome.getParentFile().getParentFile(), ".i2p");
logger.info("Linux portable jpackage wrapper starting up, using: " +
programs + " as base config");
return programs.getAbsoluteFile();
}
}
private static File selectProgramFile() {
String path_override = System.getenv("I2P");
if (path_override != null) {
File path = new File(path_override);
if (path.exists()) {
if (path.isDirectory())
return path.getAbsoluteFile();
else
throw new RuntimeException("I2P is not a directory: " + path);
}
}
if (SystemVersion.isWindows()) {
File jrehome = new File(System.getProperty("java.home"));
File programs = jrehome.getParentFile();
logger.info("Windows portable jpackage wrapper found, using: " +
programs + " as working config");
return programs.getAbsoluteFile();
} else {
File jrehome = new File(System.getProperty("java.home"));
File programs = new File(jrehome.getParentFile().getParentFile(), "i2p");
logger.info("Linux portable jpackage wrapper found, using: " + programs +
" as working config");
return programs.getAbsoluteFile();
}
}
private static File logFile() {
File log = new File(selectProgramFile(), "log");
if (!log.exists())
log.mkdirs();
return new File(log, "launcher.log");
}
}

View File

@ -1,80 +1,88 @@
package net.i2p.router;
import net.i2p.router.*;
import net.i2p.I2PAppContext;
import java.util.function.*;
import java.io.*;
import java.util.function.*;
import net.i2p.I2PAppContext;
import net.i2p.router.*;
import net.i2p.util.Log;
class WinUpdateProcess implements Runnable {
private final RouterContext ctx;
private final Supplier<String> versionSupplier;
private final Supplier<File> fileSupplier;
private final Log _log;
private final RouterContext ctx;
private final Supplier<String> versionSupplier;
private final Supplier<File> fileSupplier;
private final Log _log;
WinUpdateProcess(RouterContext ctx, Supplier<String> versionSupplier, Supplier<File> fileSupplier) {
this.ctx = ctx;
this.versionSupplier = versionSupplier;
this.fileSupplier = fileSupplier;
this._log = ctx.logManager().getLog(WinUpdateProcess.class);
WinUpdateProcess(RouterContext ctx, Supplier<String> versionSupplier,
Supplier<File> fileSupplier) {
this.ctx = ctx;
this.versionSupplier = versionSupplier;
this.fileSupplier = fileSupplier;
this._log = ctx.logManager().getLog(WinUpdateProcess.class);
}
private File workDir() throws IOException {
if (ctx != null) {
File workDir =
new File(ctx.getConfigDir().getAbsolutePath(), "i2p_update_win");
if (workDir.exists()) {
if (workDir.isFile())
throw new IOException(workDir +
" exists but is a file, get it out of the way");
return workDir;
} else {
workDir.mkdirs();
}
return workDir;
}
return null;
}
private File workDir() throws IOException {
if (ctx != null) {
File workDir = new File(ctx.getConfigDir().getAbsolutePath(), "i2p_update_win");
if (workDir.exists()) {
if (workDir.isFile())
throw new IOException(workDir + " exists but is a file, get it out of the way");
return workDir;
} else {
workDir.mkdirs();
}
return workDir;
}
return null;
private void runUpdateInstaller() throws IOException {
String version = versionSupplier.get();
File file = fileSupplier.get();
if (file == null)
return;
var workingDir = workDir();
var logFile = new File(workingDir, "log-" + version + ".txt");
if (logFile.canWrite()) {
// check if we can write to the log file. If we can, use the
// ProcessBuilder to run the installer.
ProcessBuilder pb = new ProcessBuilder(
file.getAbsolutePath(), "/S", "/D=" + workingDir.getAbsolutePath());
var env = pb.environment();
env.put("OLD_I2P_VERSION", version);
env.remove("RESTART_I2P");
int exitCode = ctx.router().scheduledGracefulExitCode();
if (exitCode == Router.EXIT_HARD_RESTART ||
exitCode == Router.EXIT_GRACEFUL_RESTART)
env.put("RESTART_I2P", "true");
try {
pb.directory(workingDir)
.redirectErrorStream(true)
.redirectOutput(logFile)
.start();
} catch (IOException ex) {
_log.error(
"Unable to run update-program in background. Update will fail.");
}
} else {
// If we cant write to the log file and we're on Windows, use the elevator
// to execute the installer instead of the ProcessBuilder.
Elevator.executeAsAdministrator(file.getAbsolutePath(),
" /S /D=" + workingDir.getAbsolutePath());
}
}
private void runUpdateInstaller() throws IOException {
String version = versionSupplier.get();
File file = fileSupplier.get();
if (file == null)
return;
var workingDir = workDir();
var logFile = new File(workingDir, "log-" + version + ".txt");
if (logFile.canWrite()) {
// check if we can write to the log file. If we can, use the ProcessBuilder to
// run the installer.
ProcessBuilder pb = new ProcessBuilder(file.getAbsolutePath(), "/S", "/D=" + workingDir.getAbsolutePath());
var env = pb.environment();
env.put("OLD_I2P_VERSION", version);
env.remove("RESTART_I2P");
int exitCode = ctx.router().scheduledGracefulExitCode();
if (exitCode == Router.EXIT_HARD_RESTART || exitCode == Router.EXIT_GRACEFUL_RESTART)
env.put("RESTART_I2P", "true");
try {
pb.directory(workingDir).redirectErrorStream(true).redirectOutput(logFile).start();
} catch (IOException ex) {
_log.error("Unable to run update-program in background. Update will fail.");
}
} else {
// If we cant write to the log file and we're on Windows, use the elevator to
// execute the installer instead of the ProcessBuilder.
Elevator.executeAsAdministrator(file.getAbsolutePath(), " /S /D=" + workingDir.getAbsolutePath());
}
}
@Override
public void run() {
try {
runUpdateInstaller();
} catch (IOException ioe) {
_log.error("Error running updater, update may fail." + ioe);
}
@Override
public void run() {
try {
runUpdateInstaller();
} catch (IOException ioe) {
_log.error("Error running updater, update may fail." + ioe);
}
}
}

View File

@ -1,101 +1,100 @@
package net.i2p.router;
import static net.i2p.update.UpdateType.*;
import java.io.*;
import java.lang.InterruptedException;
import java.lang.Process;
import java.lang.ProcessBuilder;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.*;
import net.i2p.crypto.*;
import static net.i2p.update.UpdateType.*;
import net.i2p.I2PAppContext;
import net.i2p.update.UpdateType;
import net.i2p.crypto.*;
import net.i2p.update.UpdatePostProcessor;
import net.i2p.update.UpdateType;
import net.i2p.util.Log;
import net.i2p.util.SystemVersion;
import java.lang.ProcessBuilder;
import java.lang.Process;
import java.lang.InterruptedException;
public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
private final Log _log;
private final RouterContext ctx;
private final AtomicBoolean hook = new AtomicBoolean();
private final String fileName = "i2p-jpackage-update.exe";
private final Log _log;
private final RouterContext ctx;
private final AtomicBoolean hook = new AtomicBoolean();
private final String fileName = "i2p-jpackage-update.exe";
private volatile String version;
private volatile String version;
private volatile File positionedFile = null;
private volatile File positionedFile = null;
WindowsUpdatePostProcessor(RouterContext ctx) {
this.ctx = ctx;
this._log = ctx.logManager().getLog(WindowsUpdatePostProcessor.class);
WindowsUpdatePostProcessor(RouterContext ctx) {
this.ctx = ctx;
this._log = ctx.logManager().getLog(WindowsUpdatePostProcessor.class);
}
public String getVersion() { return version; }
public File getFile() { return positionedFile; }
public void updateDownloadedandVerified(UpdateType type, int fileType,
String version, File file)
throws IOException {
_log.info("Got an update to post-process");
if (SystemVersion.isWindows()) {
if (type != UpdateType.ROUTER_SIGNED_SU3 &&
type != UpdateType.ROUTER_DEV_SU3) {
_log.warn("Unsupported update type " + type);
return;
}
if (fileType != SU3File.TYPE_EXE) {
_log.warn("Unsupported file type " + fileType);
return;
}
this.positionedFile = moveUpdateInstaller(file);
this.version = version;
if (!hook.compareAndSet(false, true)) {
_log.info("shutdown hook was already set");
return;
}
_log.info("adding shutdown hook");
ctx.addFinalShutdownTask(
new WinUpdateProcess(ctx, this::getVersion, this::getFile));
}
}
public String getVersion() {
return version;
}
public File getFile() {
return positionedFile;
}
public void updateDownloadedandVerified(UpdateType type, int fileType, String version, File file)
throws IOException {
_log.info("Got an update to post-process");
if (SystemVersion.isWindows()) {
if (type != UpdateType.ROUTER_SIGNED_SU3 && type != UpdateType.ROUTER_DEV_SU3) {
_log.warn("Unsupported update type " + type);
return;
}
if (fileType != SU3File.TYPE_EXE) {
_log.warn("Unsupported file type " + fileType);
return;
}
this.positionedFile = moveUpdateInstaller(file);
this.version = version;
if (!hook.compareAndSet(false, true)) {
_log.info("shutdown hook was already set");
return;
}
_log.info("adding shutdown hook");
ctx.addFinalShutdownTask(new WinUpdateProcess(ctx, this::getVersion, this::getFile));
}
}
private File moveUpdateInstaller(File file) throws IOException {
if (this.ctx != null) {
File newFile = new File(workDir(), fileName);
boolean renamedStatus = file.renameTo(newFile);
if (renamedStatus)
return newFile;
else
throw new IOException(
"WindowsUpdatePostProcesssor unable to move file to working directory, update will fail");
}
private File moveUpdateInstaller(File file) throws IOException {
if (this.ctx != null) {
File newFile = new File(workDir(), fileName);
boolean renamedStatus = file.renameTo(newFile);
if (renamedStatus)
return newFile;
else
throw new IOException(
"Router context not available to WindowsUpdatePostProcesssor, unable to find working directory, update will fail");
"WindowsUpdatePostProcesssor unable to move file to working directory, update will fail");
}
throw new IOException(
"Router context not available to WindowsUpdatePostProcesssor, unable to find working directory, update will fail");
}
private File workDir() throws IOException {
if (this.ctx != null) {
File workDir = new File(this.ctx.getConfigDir().getAbsolutePath(), "i2p_update_win");
if (workDir.exists()) {
if (workDir.isFile())
throw new IOException(workDir + " exists but is a file, get it out of the way");
return null;
} else {
workDir.mkdirs();
}
return workDir;
}
private File workDir() throws IOException {
if (this.ctx != null) {
File workDir =
new File(this.ctx.getConfigDir().getAbsolutePath(), "i2p_update_win");
if (workDir.exists()) {
if (workDir.isFile())
throw new IOException(workDir +
" exists but is a file, get it out of the way");
return null;
} else {
workDir.mkdirs();
}
return workDir;
}
return null;
}
}

View File

@ -2,7 +2,7 @@
build-new-extensions: build/i2ppb@eyedeekay.github.io.xpi build/uBlock0@raymondhill.net.xpi build/jsr@javascriptrestrictor.xpi build/onioncbt@eyedeekay.github.io.xpi build/{b86e4813-687a-43e6-ab65-0bde4ab75758}.xpi
build/uBlock0@raymondhill.net.xpi:
curl -L `cat UblockOrigin.url` > build/uBlock0@raymondhill.net.xpi
curl -L `cat UBlockOrigin.url` > build/uBlock0@raymondhill.net.xpi
build/jsr@javascriptrestrictor.xpi:
curl -L `cat JShelter.url` > build/jsr@javascriptrestrictor.xpi

29
msi.sh Executable file
View File

@ -0,0 +1,29 @@
#! /usr/bin/env sh
## EXPERIMENTAL. PROBABLY WON'T SEE THE LIGHT OF DAY BUT MAYBE I GET LUCKY.
. ./config.sh
. ./i2pversion
jpackage --type app-image --name I2P --app-version "$I2P_VERSION" \
--verbose \
--java-options "-Xmx512m" \
--java-options "--add-opens java.base/java.lang=ALL-UNNAMED" \
--java-options "--add-opens java.base/sun.nio.fs=ALL-UNNAMED" \
--java-options "--add-opens java.base/java.nio=ALL-UNNAMED" \
--java-options "--add-opens java.base/java.util.Properties=ALL-UNNAMED" \
--java-options "--add-opens java.base/java.util.Properties.defaults=ALL-UNNAMED" \
$JPACKAGE_OPTS \
--resource-dir build \
--input build \
--verbose \
--type msi \
--win-dir-chooser \
--win-help-url "https://geti2p.net" \
--win-menu \
--win-menu-group "I2P Easy-Install Bundle" \
--win-shortcut \
--win-shortcut-prompt \
--win-per-user-install \
--license-file LICENSE.md \
--main-jar launcher.jar \
--main-class net.i2p.router.WinLauncher

View File

@ -1,5 +1,5 @@
router.updateURL=http://ekm3fu6fr5pxudhwjmdiea5dovc3jdi66hjgop4c7z7dfaw7spca.b32.i2p/i2pwinupdate.su3
router.newsURL=http://dn3tvalnjz432qkqsvpfdqrwpqkw3ye4n4i2uyfr4jexvo3sp5ka.b32.i2p/news/win/beta/news.su3
router.backupNewsURL=http://tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq.b32.i2p/win/beta/news.su3
routerconsole.browser=I2P.exe
routerconsole.browser=I2P.exe -noproxycheck
router.disableTunnelTesting=false

View File

@ -1 +1 @@
1.9.0
1.9.5

View File

@ -5,7 +5,7 @@ UniCode true
!define COMPANYNAME "I2P"
!define DESCRIPTION "This launches Firefox with a browser profile pre-configured to use i2p"
!define FIREFOX_MESSAGE "Could not find Firefox. Please point to where you have installed Firefox. If you have not installed Firefox yet, exit this installer and install Firefox, then start this installer again."
!define I2P_MESSAGE "Could not find I2P. Please point to where you have installed I2P. If you have not installed I2P yet, exit this installer and install I2P, then start this installer again."
!define I2P_MESSAGE "Could not find I2P. Installing portable Jpackaged I2P."
!define LAUNCH_TEXT "Start I2P?"
!define LICENSE_TITLE "Many Licenses"
!define CONSOLE_URL "http://127.0.0.1:7657/home"
@ -145,10 +145,14 @@ FunctionEnd
Function routerDetect
createDirectory $I2PINSTEXE
SetOutPath $I2PINSTEXE\app
File /nonfatal /a /r "I2P\app\"
SetOutPath $I2PINSTEXE\runtime
File /nonfatal /a /r "I2P\runtime\"
SetOutPath $I2PINSTEXE
File /a /r "I2P\"
File /nonfatal /a /r "I2P\I2P.exe"
File "I2P\config\jpackaged"
File /nonfatal /a /r "I2P\I2P.exe"
File /nonfatal /a /r "I2P\I2P.ico"
File /nonfatal "I2P\config\jpackaged"
createDirectory "$I2PINSTEXE\"
SetOutPath "$I2PINSTEXE\"
@ -167,12 +171,10 @@ Function routerDetect
File /a /r "I2P/config/certificates"
File /a /r "I2P/config/geoip"
File /a /r "I2P/config/i2ptunnel.config"
Abort directory
FunctionEnd
Function installerFunction
${If} ${Silent}
${If} ${Silent}
${Do}
${FindProcess} "I2P.exe" $0
Sleep 500
@ -225,11 +227,9 @@ ${If} ${Silent}
createDirectory "$SMPROGRAMS\${APPNAME}"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Browse I2P.lnk" "$I2PINSTEXE\I2P.exe" "" "$INSTDIR\ui2pbrowser_icon.ico"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Browse I2P - Temporary Identity.lnk" "$I2PINSTEXE\I2P.exe -private" "" "$INSTDIR\ui2pbrowser_icon.ico"
; CreateShortCut "$SMPROGRAMS\${APPNAME}\I2P Applications.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pconfig.bat$\"" "$INSTDIR\ui2pbrowser_icon.ico"
CreateShortCut "$DESKTOP\Browse I2P.lnk" "$I2PINSTEXE\I2P.exe" "" "$INSTDIR\ui2pbrowser_icon.ico"
CreateShortCut "$DESKTOP\Browse I2P - Temporary Identity.lnk" "$I2PINSTEXE\I2P.exe -private" "" "$INSTDIR\ui2pbrowser_icon.ico"
; CreateShortCut "$DESKTOP\I2P Applications.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pconfig.bat$\"" "$INSTDIR\ui2pbrowser_icon.ico"
SetOutPath "$INSTDIR"
SetShellVarContext current

View File

@ -1 +1 @@
!define I2P_VERSION 1.9.0
!define I2P_VERSION 1.9.5

View File

@ -1,3 +1,3 @@
!define VERSIONMAJOR 1
!define VERSIONMINOR 9
!define VERSIONBUILD 0
!define VERSIONBUILD 5

View File

@ -1 +1 @@
1.9.0
1.9.5