Compare commits
61 Commits
auto-confi
...
20220908
Author | SHA1 | Date | |
---|---|---|---|
93b197efb9 | |||
09ffb8edbe | |||
cdc3224eaa | |||
2eeb2106fc | |||
26a7944470 | |||
b97d581fcc | |||
615818976a | |||
e6fc5a349d | |||
3718d2edb9 | |||
4a55a8d4ab | |||
a3a45b01e5 | |||
e07c43f1eb | |||
fd75a7e244 | |||
0e77d53c15 | |||
4dd9448752 | |||
b220697af2 | |||
d9cffc9520 | |||
c8590e4fe5 | |||
3c8b1b6d28 | |||
460837d7f5 | |||
2bd3abe6bb | |||
5ef6118b91 | |||
394f58f90e | |||
5ee89f98a9 | |||
6736d527a2 | |||
ef203ba935 | |||
3749f49641 | |||
d63128096c | |||
51cb4c608a | |||
f920fa8090 | |||
252a80eb72 | |||
ed7814cd74 | |||
073ba01da6 | |||
7caf03d6e4 | |||
c3934ab4e4 | |||
54ffdc2352 | |||
ab2548ecd4 | |||
5cf5d56738 | |||
262311390e | |||
3ac2f2b4a2 | |||
00ca509e57 | |||
a1826d40e8 | |||
c8f3f0b960 | |||
a80512cd5a | |||
7e5579fd65 | |||
934ab43b2a | |||
9214c2116c | |||
c02e466f80 | |||
59a1a3d9e6 | |||
a230a49af7 | |||
079ef87c8f | |||
f9a7f8ab2d | |||
3c8dd9dee9 | |||
65db834ec9 | |||
b955dbe66e | |||
e367227714 | |||
4a02ec418a | |||
4368b80c79 | |||
7dff65d67d | |||
0ad9406387 | |||
21b396e343 |
2
Makefile
2
Makefile
@ -83,10 +83,10 @@ src/I2P/config: build/I2P
|
|||||||
rm -rf src/I2P/config/geoip src/I2P/config/webapps src/I2P/config/certificates
|
rm -rf src/I2P/config/geoip src/I2P/config/webapps src/I2P/config/certificates
|
||||||
echo true | tee src/I2P/config/jpackaged
|
echo true | tee src/I2P/config/jpackaged
|
||||||
cp -v $(RES_DIR)/clients.config src/I2P/config/
|
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/
|
cp -v $(RES_DIR)/wrapper.config src/I2P/config/
|
||||||
#grep -v 'router.updateURL' $(RES_DIR)/router.config > src/I2P/config/router.config
|
#grep -v 'router.updateURL' $(RES_DIR)/router.config > src/I2P/config/router.config
|
||||||
cat 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 -v $(RES_DIR)/hosts.txt src/I2P/config/hosts.txt
|
||||||
cp -R $(RES_DIR)/certificates src/I2P/config/certificates
|
cp -R $(RES_DIR)/certificates src/I2P/config/certificates
|
||||||
cp -R $(RES_DIR)/eepsite src/I2P/config/eepsite
|
cp -R $(RES_DIR)/eepsite src/I2P/config/eepsite
|
||||||
|
3
build.sh
3
build.sh
@ -41,6 +41,7 @@ sleep 5s
|
|||||||
HERE="$PWD"
|
HERE="$PWD"
|
||||||
if [ ! -d "$HERE/../i2p.i2p.jpackage-build/" ]; then
|
if [ ! -d "$HERE/../i2p.i2p.jpackage-build/" ]; then
|
||||||
git clone -b "$VERSION" https://i2pgit.org/i2p-hackers/i2p.i2p "$HERE/../i2p.i2p.jpackage-build/"
|
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
|
fi
|
||||||
cd "$HERE/../i2p.i2p.jpackage-build/"
|
cd "$HERE/../i2p.i2p.jpackage-build/"
|
||||||
for i in $COUNT; do
|
for i in $COUNT; do
|
||||||
@ -66,7 +67,7 @@ if [ ! -f "$HERE/build/jna-platform.jar" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -f "$HERE/build/i2pfirefox.jar" ]; then
|
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
|
fi
|
||||||
|
|
||||||
cd java
|
cd java
|
||||||
|
@ -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
|
2022-08-28 idk
|
||||||
* Migrate away from batch scripts and simply launch a browser if I2P is already running.
|
* Migrate away from batch scripts and simply launch a browser if I2P is already running.
|
||||||
This is more flexible, stable, and simplet to install
|
This is more flexible, stable, and simplet to install
|
||||||
|
3
clean.sh
3
clean.sh
@ -28,5 +28,6 @@ rm -rf \
|
|||||||
wrapper.log \
|
wrapper.log \
|
||||||
*.jar \
|
*.jar \
|
||||||
*.exe \
|
*.exe \
|
||||||
*.dmg
|
*.dmg \
|
||||||
|
*.tar.gz
|
||||||
make clean
|
make clean
|
32
config.sh
32
config.sh
@ -3,16 +3,28 @@
|
|||||||
## If you need to use a different JVM, JDK, or other utility from
|
## If you need to use a different JVM, JDK, or other utility from
|
||||||
# build.sh, set it in this file, for example:
|
# build.sh, set it in this file, for example:
|
||||||
|
|
||||||
|
uname=$(uname)
|
||||||
|
|
||||||
#export PATH="$PATH:/c/Program Files/Java/jdk-17.0.3/bin/"
|
#export PATH="$PATH:/c/Program Files/Java/jdk-17.0.3/bin/"
|
||||||
#export JAVA_HOME="/c/Program Files/Java/jdk-17.0.3"
|
#export JAVA_HOME="/c/Program Files/Java/jdk-17.0.3"
|
||||||
# to use it for Oracle OpenJDK17
|
# to use it for Oracle OpenJDK17
|
||||||
|
|
||||||
## Other potential values(NOT exhaustive):
|
## 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/"
|
if [[ -n "$IS_WSL" || -n "$WSL_DISTRO_NAME" ]]; then
|
||||||
export PATH="/c/Program Files/Java/jdk-18.0.2/bin/:$PATH:/c/Program Files/Java/jdk-18.0.2/bin/"
|
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 PATH="/c/Program Files/Java/jdk-18.0.2/bin/:$PATH:/c/Program Files/Java/jdk-18.0.2/bin/"
|
||||||
export JAVA_HOME="/c/Program Files/Java/jdk-18.0.2"
|
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 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 JAVA_HOME="/c/Program Files/Eclipse Adoptium/jdk-17.0.3"
|
||||||
#export PATH="$PATH:/c/Program Files/OpenJDK/jdk-17.0.3/bin/"
|
#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 ANT_HOME="/c/apache-ant-1.10.9"
|
||||||
#export PATH="$PATH:$ANT_HOME/bin/"
|
#export PATH="$PATH:$ANT_HOME/bin/"
|
||||||
|
|
||||||
# Uncomment this to add signtool to the path so you don't have to fight with Visual Studio.
|
if [[ -n "$IS_WSL" || -n "$WSL_DISTRO_NAME" ]]; then
|
||||||
PATH="$PATH:/c/Program Files (x86)/Windows Kits/10/App Certification Kit/"
|
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/"
|
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
|
4
daily.sh
4
daily.sh
@ -49,3 +49,7 @@ tar -a -cf ../I2P.zip I2P
|
|||||||
ZIPCHECKSUM=$(sha256sum "../I2P.zip")
|
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"
|
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"
|
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
17
experimental.sh
Executable 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
192
i2ptunnel.config
Normal 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
|
||||||
|
|
16
i2pversion
16
i2pversion
@ -2,19 +2,15 @@
|
|||||||
|
|
||||||
JNA_VERSION=5.11.0
|
JNA_VERSION=5.11.0
|
||||||
export JNA_VERSION=5.11.0
|
export JNA_VERSION=5.11.0
|
||||||
|
I2PFIREFOX_VERSION=0.0.34
|
||||||
#Comment this out to build from an alternate branch or
|
export I2PFIREFOX_VERSION=0.0.34
|
||||||
|
# Comment this out to build from an alternate branch or
|
||||||
# the tip of the master branch.
|
# the tip of the master branch.
|
||||||
VERSIONMAJOR=1
|
VERSIONMAJOR=1
|
||||||
VERSIONMINOR=9
|
VERSIONMINOR=9
|
||||||
VERSIONBUILD=0
|
VERSIONBUILD=5
|
||||||
I2P_VERSION="$VERSIONMAJOR.$VERSIONMINOR.$VERSIONBUILD"
|
I2P_VERSION="$VERSIONMAJOR.$VERSIONMINOR.$VERSIONBUILD"
|
||||||
export I2P_VERSION="$VERSIONMAJOR.$VERSIONMINOR.$VERSIONBUILD"
|
export I2P_VERSION="$VERSIONMAJOR.$VERSIONMINOR.$VERSIONBUILD"
|
||||||
VERSION=i2p-1.9.0
|
VERSION=i2p-jpackage-1.9.4
|
||||||
export VERSION=i2p-1.9.0
|
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"
|
|
||||||
|
@ -5,29 +5,31 @@ import com.sun.jna.platform.win32.Kernel32;
|
|||||||
import com.sun.jna.platform.win32.Kernel32Util;
|
import com.sun.jna.platform.win32.Kernel32Util;
|
||||||
|
|
||||||
public class Elevator {
|
public class Elevator {
|
||||||
public static void main(String... args) {
|
public static void main(String... args) {
|
||||||
executeAsAdministrator("c:\\windows\\system32\\notepad.exe", "");
|
executeAsAdministrator("c:\\windows\\system32\\notepad.exe", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void executeAsAdministrator(String command, String args) {
|
public static void executeAsAdministrator(String command, String args) {
|
||||||
if (command == "" || command == null) {
|
if (command == "" || command == null) {
|
||||||
System.out.println("No command specified");
|
System.out.println("No command specified");
|
||||||
return;
|
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 + ")");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
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 + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
package net.i2p.router;
|
package net.i2p.router;
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import com.sun.jna.Native;
|
import com.sun.jna.Native;
|
||||||
import com.sun.jna.Pointer;
|
import com.sun.jna.Pointer;
|
||||||
import com.sun.jna.Structure;
|
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.WinNT.HANDLE;
|
||||||
import com.sun.jna.platform.win32.WinReg.HKEY;
|
import com.sun.jna.platform.win32.WinReg.HKEY;
|
||||||
import com.sun.jna.win32.W32APIOptions;
|
import com.sun.jna.win32.W32APIOptions;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
public interface Shell32X extends Shell32 {
|
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_HIDE = 0;
|
||||||
int SW_MAXIMIZE = 3;
|
int SW_MAXIMIZE = 3;
|
||||||
int SW_MINIMIZE = 6;
|
int SW_MINIMIZE = 6;
|
||||||
int SW_RESTORE = 9;
|
int SW_RESTORE = 9;
|
||||||
int SW_SHOW = 5;
|
int SW_SHOW = 5;
|
||||||
int SW_SHOWDEFAULT = 10;
|
int SW_SHOWDEFAULT = 10;
|
||||||
int SW_SHOWMAXIMIZED = 3;
|
int SW_SHOWMAXIMIZED = 3;
|
||||||
int SW_SHOWMINIMIZED = 2;
|
int SW_SHOWMINIMIZED = 2;
|
||||||
int SW_SHOWMINNOACTIVE = 7;
|
int SW_SHOWMINNOACTIVE = 7;
|
||||||
int SW_SHOWNA = 8;
|
int SW_SHOWNA = 8;
|
||||||
int SW_SHOWNOACTIVATE = 4;
|
int SW_SHOWNOACTIVATE = 4;
|
||||||
int SW_SHOWNORMAL = 1;
|
int SW_SHOWNORMAL = 1;
|
||||||
|
|
||||||
/** File not found. */
|
/** File not found. */
|
||||||
int SE_ERR_FNF = 2;
|
int SE_ERR_FNF = 2;
|
||||||
|
|
||||||
/** Path not found. */
|
/** Path not found. */
|
||||||
int SE_ERR_PNF = 3;
|
int SE_ERR_PNF = 3;
|
||||||
|
|
||||||
/** Access denied. */
|
/** Access denied. */
|
||||||
int SE_ERR_ACCESSDENIED = 5;
|
int SE_ERR_ACCESSDENIED = 5;
|
||||||
|
|
||||||
/** Out of memory. */
|
/** Out of memory. */
|
||||||
int SE_ERR_OOM = 8;
|
int SE_ERR_OOM = 8;
|
||||||
|
|
||||||
/** DLL not found. */
|
/** DLL not found. */
|
||||||
int SE_ERR_DLLNOTFOUND = 32;
|
int SE_ERR_DLLNOTFOUND = 32;
|
||||||
|
|
||||||
/** Cannot share an open file. */
|
/** Cannot share an open file. */
|
||||||
int SE_ERR_SHARE = 26;
|
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 {
|
public static class SHELLEXECUTEINFO extends Structure {
|
||||||
/*
|
/*
|
||||||
* DWORD cbSize;
|
* DWORD cbSize;
|
||||||
* ULONG fMask;
|
* ULONG fMask;
|
||||||
* HWND hwnd;
|
* HWND hwnd;
|
||||||
* LPCTSTR lpVerb;
|
* LPCTSTR lpVerb;
|
||||||
* LPCTSTR lpFile;
|
* LPCTSTR lpFile;
|
||||||
* LPCTSTR lpParameters;
|
* LPCTSTR lpParameters;
|
||||||
* LPCTSTR lpDirectory;
|
* LPCTSTR lpDirectory;
|
||||||
* int nShow;
|
* int nShow;
|
||||||
* HINSTANCE hInstApp;
|
* HINSTANCE hInstApp;
|
||||||
* LPVOID lpIDList;
|
* LPVOID lpIDList;
|
||||||
* LPCTSTR lpClass;
|
* LPCTSTR lpClass;
|
||||||
* HKEY hkeyClass;
|
* HKEY hkeyClass;
|
||||||
* DWORD dwHotKey;
|
* DWORD dwHotKey;
|
||||||
* union {
|
* union {
|
||||||
* HANDLE hIcon;
|
* HANDLE hIcon;
|
||||||
* HANDLE hMonitor;
|
* HANDLE hMonitor;
|
||||||
* } DUMMYUNIONNAME;
|
* } DUMMYUNIONNAME;
|
||||||
* HANDLE hProcess;
|
* HANDLE hProcess;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public int cbSize = size();
|
public int cbSize = size();
|
||||||
public int fMask;
|
public int fMask;
|
||||||
public HWND hwnd;
|
public HWND hwnd;
|
||||||
public WString lpVerb;
|
public WString lpVerb;
|
||||||
public WString lpFile;
|
public WString lpFile;
|
||||||
public WString lpParameters;
|
public WString lpParameters;
|
||||||
public WString lpDirectory;
|
public WString lpDirectory;
|
||||||
public int nShow;
|
public int nShow;
|
||||||
public HINSTANCE hInstApp;
|
public HINSTANCE hInstApp;
|
||||||
public Pointer lpIDList;
|
public Pointer lpIDList;
|
||||||
public WString lpClass;
|
public WString lpClass;
|
||||||
public HKEY hKeyClass;
|
public HKEY hKeyClass;
|
||||||
public int dwHotKey;
|
public int dwHotKey;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Actually:
|
* Actually:
|
||||||
* union {
|
* union {
|
||||||
* HANDLE hIcon;
|
* HANDLE hIcon;
|
||||||
* HANDLE hMonitor;
|
* HANDLE hMonitor;
|
||||||
* } DUMMYUNIONNAME;
|
* } DUMMYUNIONNAME;
|
||||||
*/
|
*/
|
||||||
public HANDLE hMonitor;
|
public HANDLE hMonitor;
|
||||||
public HANDLE hProcess;
|
public HANDLE hProcess;
|
||||||
|
|
||||||
protected List getFieldOrder() {
|
protected List getFieldOrder() {
|
||||||
return Arrays.asList(new String[] {
|
return Arrays.asList(new String[] {
|
||||||
"cbSize", "fMask", "hwnd", "lpVerb", "lpFile", "lpParameters",
|
"cbSize",
|
||||||
"lpDirectory", "nShow", "hInstApp", "lpIDList", "lpClass",
|
"fMask",
|
||||||
"hKeyClass", "dwHotKey", "hMonitor", "hProcess",
|
"hwnd",
|
||||||
});
|
"lpVerb",
|
||||||
}
|
"lpFile",
|
||||||
|
"lpParameters",
|
||||||
|
"lpDirectory",
|
||||||
|
"nShow",
|
||||||
|
"hInstApp",
|
||||||
|
"lpIDList",
|
||||||
|
"lpClass",
|
||||||
|
"hKeyClass",
|
||||||
|
"dwHotKey",
|
||||||
|
"hMonitor",
|
||||||
|
"hProcess",
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package net.i2p.router;
|
package net.i2p.router;
|
||||||
|
|
||||||
|
import static net.i2p.update.UpdateType.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
@ -8,24 +10,20 @@ import java.util.*;
|
|||||||
import java.util.logging.FileHandler;
|
import java.util.logging.FileHandler;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.logging.SimpleFormatter;
|
import java.util.logging.SimpleFormatter;
|
||||||
|
|
||||||
import net.i2p.crypto.*;
|
|
||||||
|
|
||||||
import net.i2p.app.ClientAppManager;
|
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.Router;
|
||||||
|
import net.i2p.router.RouterLaunch;
|
||||||
|
import net.i2p.update.*;
|
||||||
import net.i2p.update.UpdateManager;
|
import net.i2p.update.UpdateManager;
|
||||||
import net.i2p.update.UpdatePostProcessor;
|
import net.i2p.update.UpdatePostProcessor;
|
||||||
import net.i2p.util.SystemVersion;
|
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
|
* Launches a router from %PROGRAMFILES%/I2P using configuration data in
|
||||||
* %LOCALAPPDATA%/I2P.. Uses Java 9 APIs.
|
* %LOCALAPPDATA%/I2P.. Uses Java 9 APIs.
|
||||||
*
|
*
|
||||||
* Sets the following properties:
|
* Sets the following properties:
|
||||||
* i2p.dir.base - this points to the (read-only) resources inside the bundle
|
* 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
|
* 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.
|
* router.pid - the pid of the java process.
|
||||||
*/
|
*/
|
||||||
public class WinLauncher {
|
public class WinLauncher {
|
||||||
static Logger logger = Logger.getLogger("launcherlog");
|
static Logger logger = Logger.getLogger("launcherlog");
|
||||||
static FileHandler fh;
|
static FileHandler fh;
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
try {
|
try {
|
||||||
// This block configure the logger with handler and formatter
|
// This block configure the logger with handler and formatter
|
||||||
fh = new FileHandler(logFile().toString());
|
fh = new FileHandler(logFile().toString());
|
||||||
logger.addHandler(fh);
|
logger.addHandler(fh);
|
||||||
SimpleFormatter formatter = new SimpleFormatter();
|
SimpleFormatter formatter = new SimpleFormatter();
|
||||||
fh.setFormatter(formatter);
|
fh.setFormatter(formatter);
|
||||||
// the following statement is used to log any messages
|
// the following statement is used to log any messages
|
||||||
logger.info("My first log");
|
logger.info("My first log");
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
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);
|
|
||||||
}
|
}
|
||||||
|
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
|
if (args != null) {
|
||||||
public static boolean isAvailable(int portNr) {
|
if (args.length > 0) {
|
||||||
boolean portFree;
|
for (String arg : args) {
|
||||||
try (var ignored = new ServerSocket(portNr)) {
|
if (arg.equals("-private")) {
|
||||||
portFree = true;
|
privateBrowsing = true;
|
||||||
} catch (IOException e) {
|
logger.info(
|
||||||
portFree = false;
|
"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() {
|
File programs = selectProgramFile();
|
||||||
sleep(2000);
|
if (!programs.exists())
|
||||||
// check if there's something listening on port 7657(Router Console)
|
programs.mkdirs();
|
||||||
if (!isAvailable(7657)) {
|
else if (!programs.isDirectory()) {
|
||||||
return true;
|
logger.warning(
|
||||||
}
|
programs +
|
||||||
// check if there's something listening on port 7654(I2CP)
|
" exists but is not a directory. Please get it out of the way");
|
||||||
if (!isAvailable(7654)) {
|
System.exit(1);
|
||||||
return true;
|
}
|
||||||
}
|
|
||||||
// check for the existence of router.ping file, if it's less then 2 minutes old,
|
File home = selectHome();
|
||||||
// exit
|
if (!home.exists())
|
||||||
File home = selectHome();
|
home.mkdirs();
|
||||||
File ping = new File(home, "router.ping");
|
else if (!home.isDirectory()) {
|
||||||
if (ping.exists()) {
|
logger.warning(
|
||||||
long diff = System.currentTimeMillis() - ping.lastModified();
|
home +
|
||||||
if (diff < 60 * 1000) {
|
" exists but is not a directory. Please get it out of the way");
|
||||||
logger.info("router.ping exists and is less than 1 minute old, I2P appears to be running already.");
|
System.exit(1);
|
||||||
logger.info("If I2P is not running, wait 60 seconds and try again.");
|
}
|
||||||
return true;
|
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;
|
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
|
ClientAppManager cam;
|
||||||
RouterContext ctx;
|
while ((cam = ctx.clientAppManager()) == null) {
|
||||||
while ((ctx = (RouterContext) RouterContext.getCurrentContext()) == null) {
|
sleep(1000);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static File selectHome() { // throws Exception {
|
UpdateManager um;
|
||||||
String path_override = System.getenv("I2P_CONFIG");
|
while ((um = (UpdateManager)cam.getRegisteredApp(UpdateManager.APP_NAME)) ==
|
||||||
if (path_override != null) {
|
null) {
|
||||||
File path = new File(path_override);
|
sleep(1000);
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static File selectProgramFile() {
|
WindowsUpdatePostProcessor wupp = new WindowsUpdatePostProcessor(ctx);
|
||||||
String path_override = System.getenv("I2P");
|
um.register(wupp, UpdateType.ROUTER_SIGNED_SU3, SU3File.TYPE_EXE);
|
||||||
if (path_override != null) {
|
um.register(wupp, UpdateType.ROUTER_DEV_SU3, SU3File.TYPE_EXE);
|
||||||
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() {
|
private static void sleep(int millis) {
|
||||||
File log = new File(selectProgramFile(), "log");
|
try {
|
||||||
if (!log.exists())
|
Thread.sleep(millis);
|
||||||
log.mkdirs();
|
} catch (InterruptedException bad) {
|
||||||
return new File(log, "launcher.log");
|
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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,80 +1,88 @@
|
|||||||
package net.i2p.router;
|
package net.i2p.router;
|
||||||
|
|
||||||
import net.i2p.router.*;
|
|
||||||
import net.i2p.I2PAppContext;
|
|
||||||
|
|
||||||
import java.util.function.*;
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.util.function.*;
|
||||||
|
import net.i2p.I2PAppContext;
|
||||||
|
import net.i2p.router.*;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
class WinUpdateProcess implements Runnable {
|
class WinUpdateProcess implements Runnable {
|
||||||
private final RouterContext ctx;
|
private final RouterContext ctx;
|
||||||
private final Supplier<String> versionSupplier;
|
private final Supplier<String> versionSupplier;
|
||||||
private final Supplier<File> fileSupplier;
|
private final Supplier<File> fileSupplier;
|
||||||
private final Log _log;
|
private final Log _log;
|
||||||
|
|
||||||
WinUpdateProcess(RouterContext ctx, Supplier<String> versionSupplier, Supplier<File> fileSupplier) {
|
WinUpdateProcess(RouterContext ctx, Supplier<String> versionSupplier,
|
||||||
this.ctx = ctx;
|
Supplier<File> fileSupplier) {
|
||||||
this.versionSupplier = versionSupplier;
|
this.ctx = ctx;
|
||||||
this.fileSupplier = fileSupplier;
|
this.versionSupplier = versionSupplier;
|
||||||
this._log = ctx.logManager().getLog(WinUpdateProcess.class);
|
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 {
|
private void runUpdateInstaller() throws IOException {
|
||||||
if (ctx != null) {
|
String version = versionSupplier.get();
|
||||||
File workDir = new File(ctx.getConfigDir().getAbsolutePath(), "i2p_update_win");
|
File file = fileSupplier.get();
|
||||||
if (workDir.exists()) {
|
if (file == null)
|
||||||
if (workDir.isFile())
|
return;
|
||||||
throw new IOException(workDir + " exists but is a file, get it out of the way");
|
|
||||||
return workDir;
|
var workingDir = workDir();
|
||||||
} else {
|
var logFile = new File(workingDir, "log-" + version + ".txt");
|
||||||
workDir.mkdirs();
|
|
||||||
}
|
if (logFile.canWrite()) {
|
||||||
return workDir;
|
// check if we can write to the log file. If we can, use the
|
||||||
}
|
// ProcessBuilder to run the installer.
|
||||||
return null;
|
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 {
|
@Override
|
||||||
String version = versionSupplier.get();
|
public void run() {
|
||||||
File file = fileSupplier.get();
|
try {
|
||||||
if (file == null)
|
runUpdateInstaller();
|
||||||
return;
|
} catch (IOException ioe) {
|
||||||
|
_log.error("Error running updater, update may fail." + ioe);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,101 +1,100 @@
|
|||||||
package net.i2p.router;
|
package net.i2p.router;
|
||||||
|
|
||||||
|
import static net.i2p.update.UpdateType.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.lang.InterruptedException;
|
||||||
|
import java.lang.Process;
|
||||||
|
import java.lang.ProcessBuilder;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.*;
|
import java.util.concurrent.atomic.*;
|
||||||
|
|
||||||
import net.i2p.crypto.*;
|
|
||||||
import static net.i2p.update.UpdateType.*;
|
|
||||||
import net.i2p.I2PAppContext;
|
import net.i2p.I2PAppContext;
|
||||||
import net.i2p.update.UpdateType;
|
import net.i2p.crypto.*;
|
||||||
import net.i2p.update.UpdatePostProcessor;
|
import net.i2p.update.UpdatePostProcessor;
|
||||||
|
import net.i2p.update.UpdateType;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
import net.i2p.util.SystemVersion;
|
import net.i2p.util.SystemVersion;
|
||||||
|
|
||||||
import java.lang.ProcessBuilder;
|
|
||||||
import java.lang.Process;
|
|
||||||
import java.lang.InterruptedException;
|
|
||||||
|
|
||||||
public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
|
public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
|
||||||
private final Log _log;
|
private final Log _log;
|
||||||
private final RouterContext ctx;
|
private final RouterContext ctx;
|
||||||
private final AtomicBoolean hook = new AtomicBoolean();
|
private final AtomicBoolean hook = new AtomicBoolean();
|
||||||
private final String fileName = "i2p-jpackage-update.exe";
|
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) {
|
WindowsUpdatePostProcessor(RouterContext ctx) {
|
||||||
this.ctx = ctx;
|
this.ctx = ctx;
|
||||||
this._log = ctx.logManager().getLog(WindowsUpdatePostProcessor.class);
|
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() {
|
private File moveUpdateInstaller(File file) throws IOException {
|
||||||
return version;
|
if (this.ctx != null) {
|
||||||
}
|
File newFile = new File(workDir(), fileName);
|
||||||
|
boolean renamedStatus = file.renameTo(newFile);
|
||||||
public File getFile() {
|
if (renamedStatus)
|
||||||
return positionedFile;
|
return newFile;
|
||||||
}
|
else
|
||||||
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
throw new IOException(
|
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 {
|
private File workDir() throws IOException {
|
||||||
if (this.ctx != null) {
|
if (this.ctx != null) {
|
||||||
File workDir = new File(this.ctx.getConfigDir().getAbsolutePath(), "i2p_update_win");
|
File workDir =
|
||||||
if (workDir.exists()) {
|
new File(this.ctx.getConfigDir().getAbsolutePath(), "i2p_update_win");
|
||||||
if (workDir.isFile())
|
if (workDir.exists()) {
|
||||||
throw new IOException(workDir + " exists but is a file, get it out of the way");
|
if (workDir.isFile())
|
||||||
return null;
|
throw new IOException(workDir +
|
||||||
} else {
|
" exists but is a file, get it out of the way");
|
||||||
workDir.mkdirs();
|
|
||||||
}
|
|
||||||
return workDir;
|
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
|
} else {
|
||||||
|
workDir.mkdirs();
|
||||||
|
}
|
||||||
|
return workDir;
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
@ -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-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:
|
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:
|
build/jsr@javascriptrestrictor.xpi:
|
||||||
curl -L `cat JShelter.url` > build/jsr@javascriptrestrictor.xpi
|
curl -L `cat JShelter.url` > build/jsr@javascriptrestrictor.xpi
|
||||||
|
29
msi.sh
Executable file
29
msi.sh
Executable 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
|
@ -1,5 +1,5 @@
|
|||||||
router.updateURL=http://ekm3fu6fr5pxudhwjmdiea5dovc3jdi66hjgop4c7z7dfaw7spca.b32.i2p/i2pwinupdate.su3
|
router.updateURL=http://ekm3fu6fr5pxudhwjmdiea5dovc3jdi66hjgop4c7z7dfaw7spca.b32.i2p/i2pwinupdate.su3
|
||||||
router.newsURL=http://dn3tvalnjz432qkqsvpfdqrwpqkw3ye4n4i2uyfr4jexvo3sp5ka.b32.i2p/news/win/beta/news.su3
|
router.newsURL=http://dn3tvalnjz432qkqsvpfdqrwpqkw3ye4n4i2uyfr4jexvo3sp5ka.b32.i2p/news/win/beta/news.su3
|
||||||
router.backupNewsURL=http://tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq.b32.i2p/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
|
router.disableTunnelTesting=false
|
@ -1 +1 @@
|
|||||||
1.9.0
|
1.9.5
|
||||||
|
@ -5,7 +5,7 @@ UniCode true
|
|||||||
!define COMPANYNAME "I2P"
|
!define COMPANYNAME "I2P"
|
||||||
!define DESCRIPTION "This launches Firefox with a browser profile pre-configured to use 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 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 LAUNCH_TEXT "Start I2P?"
|
||||||
!define LICENSE_TITLE "Many Licenses"
|
!define LICENSE_TITLE "Many Licenses"
|
||||||
!define CONSOLE_URL "http://127.0.0.1:7657/home"
|
!define CONSOLE_URL "http://127.0.0.1:7657/home"
|
||||||
@ -145,10 +145,14 @@ FunctionEnd
|
|||||||
|
|
||||||
Function routerDetect
|
Function routerDetect
|
||||||
createDirectory $I2PINSTEXE
|
createDirectory $I2PINSTEXE
|
||||||
|
SetOutPath $I2PINSTEXE\app
|
||||||
|
File /nonfatal /a /r "I2P\app\"
|
||||||
|
SetOutPath $I2PINSTEXE\runtime
|
||||||
|
File /nonfatal /a /r "I2P\runtime\"
|
||||||
SetOutPath $I2PINSTEXE
|
SetOutPath $I2PINSTEXE
|
||||||
File /a /r "I2P\"
|
File /nonfatal /a /r "I2P\I2P.exe"
|
||||||
File /nonfatal /a /r "I2P\I2P.exe"
|
File /nonfatal /a /r "I2P\I2P.ico"
|
||||||
File "I2P\config\jpackaged"
|
File /nonfatal "I2P\config\jpackaged"
|
||||||
|
|
||||||
createDirectory "$I2PINSTEXE\"
|
createDirectory "$I2PINSTEXE\"
|
||||||
SetOutPath "$I2PINSTEXE\"
|
SetOutPath "$I2PINSTEXE\"
|
||||||
@ -167,12 +171,10 @@ Function routerDetect
|
|||||||
File /a /r "I2P/config/certificates"
|
File /a /r "I2P/config/certificates"
|
||||||
File /a /r "I2P/config/geoip"
|
File /a /r "I2P/config/geoip"
|
||||||
File /a /r "I2P/config/i2ptunnel.config"
|
File /a /r "I2P/config/i2ptunnel.config"
|
||||||
|
|
||||||
Abort directory
|
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|
||||||
Function installerFunction
|
Function installerFunction
|
||||||
${If} ${Silent}
|
${If} ${Silent}
|
||||||
${Do}
|
${Do}
|
||||||
${FindProcess} "I2P.exe" $0
|
${FindProcess} "I2P.exe" $0
|
||||||
Sleep 500
|
Sleep 500
|
||||||
@ -225,11 +227,9 @@ ${If} ${Silent}
|
|||||||
createDirectory "$SMPROGRAMS\${APPNAME}"
|
createDirectory "$SMPROGRAMS\${APPNAME}"
|
||||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\Browse I2P.lnk" "$I2PINSTEXE\I2P.exe" "" "$INSTDIR\ui2pbrowser_icon.ico"
|
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}\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.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\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"
|
SetOutPath "$INSTDIR"
|
||||||
|
|
||||||
SetShellVarContext current
|
SetShellVarContext current
|
||||||
|
@ -1 +1 @@
|
|||||||
!define I2P_VERSION 1.9.0
|
!define I2P_VERSION 1.9.5
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
!define VERSIONMAJOR 1
|
!define VERSIONMAJOR 1
|
||||||
!define VERSIONMINOR 9
|
!define VERSIONMINOR 9
|
||||||
!define VERSIONBUILD 0
|
!define VERSIONBUILD 5
|
||||||
|
@ -1 +1 @@
|
|||||||
1.9.0
|
1.9.5
|
||||||
|
Reference in New Issue
Block a user