Compare commits
94 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ad4216ce4 | ||
|
|
50d803d191 | ||
|
|
5d23b012ed | ||
|
|
299cf5ef3e | ||
|
|
fe68a39d94 | ||
|
|
2f0f99f609 | ||
|
|
cf67f6c476 | ||
|
|
4a7fb5f55c | ||
|
|
a34079c8ab | ||
|
|
bfcdabd794 | ||
|
|
733167ea8d | ||
|
|
36d61b3bf6 | ||
|
|
d403fd4b09 | ||
|
|
736071a992 | ||
|
|
81d9d13742 | ||
|
|
e66fc3440c | ||
|
|
f9e3d1b040 | ||
|
|
928ae1a85f | ||
|
|
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 | ||
|
|
c2485eeea0 | ||
|
|
603c10ed9f | ||
|
|
7806b6f232 | ||
|
|
21b396e343 | ||
|
|
3d67aa4dca | ||
|
|
646778680d | ||
|
|
910aeed82c | ||
|
|
2f0e553b20 | ||
|
|
bc33051d8d | ||
|
|
e4d0be36c9 | ||
|
|
9374b1b274 | ||
|
|
e4e3df90dc | ||
|
|
acb66c97d0 | ||
|
|
a8ac47966c | ||
|
|
acf67d93c6 | ||
|
|
07f7b84817 |
@@ -1,12 +1,13 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>
|
<title>
|
||||||
I2P Browsing Pro...
|
I2P Easy-Install...
|
||||||
</title>
|
</title>
|
||||||
<meta name="author" content="eyedeekay" />
|
<meta name="author" content="eyedeekay" />
|
||||||
<meta name="description" content="i2p.firefox" />
|
<meta name="description" content="i2p.firefox" />
|
||||||
<meta name="keywords" content="master" />
|
<meta name="keywords" content="master" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
@@ -98,6 +99,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
|
<img src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
4
Makefile
4
Makefile
@@ -78,15 +78,15 @@ build/I2P: I2P build
|
|||||||
cp -rv I2P build/I2P ; true
|
cp -rv I2P build/I2P ; true
|
||||||
cp "$(I2P_JBIGI)"/*windows*.dll build/I2P/runtime/lib; true
|
cp "$(I2P_JBIGI)"/*windows*.dll build/I2P/runtime/lib; true
|
||||||
|
|
||||||
src/I2P/config: build/I2P
|
src/I2P/config:
|
||||||
mkdir -p src/I2P/config
|
mkdir -p src/I2P/config
|
||||||
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
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
I2P Browsing Profile for Firefox
|
I2P Easy-Install Bundle for Windows(Also/formerly)I2P Browsing Profile for Firefox
|
||||||
================================
|
==================================================================================
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
---------
|
---------
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>
|
<title>
|
||||||
I2P Browsing Pro...
|
I2P Easy-Install...
|
||||||
</title>
|
</title>
|
||||||
<meta name="author" content="eyedeekay" />
|
<meta name="author" content="eyedeekay" />
|
||||||
<meta name="description" content="i2p.firefox" />
|
<meta name="description" content="i2p.firefox" />
|
||||||
<meta name="keywords" content="master" />
|
<meta name="keywords" content="master" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
@@ -135,6 +136,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
|
<img src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
7
build.sh
7
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.13/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
|
||||||
@@ -90,6 +91,9 @@ fi
|
|||||||
echo "preparing to invoke jpackage for I2P version $I2P_VERSION"
|
echo "preparing to invoke jpackage for I2P version $I2P_VERSION"
|
||||||
|
|
||||||
rm -rf I2P
|
rm -rf I2P
|
||||||
|
|
||||||
|
make src/I2P/config
|
||||||
|
|
||||||
"$JAVA_HOME"/bin/jpackage --type app-image --name I2P --app-version "$I2P_VERSION" \
|
"$JAVA_HOME"/bin/jpackage --type app-image --name I2P --app-version "$I2P_VERSION" \
|
||||||
--verbose \
|
--verbose \
|
||||||
--java-options "-Xmx512m" \
|
--java-options "-Xmx512m" \
|
||||||
@@ -100,6 +104,7 @@ rm -rf I2P
|
|||||||
--java-options "--add-opens java.base/java.util.Properties.defaults=ALL-UNNAMED" \
|
--java-options "--add-opens java.base/java.util.Properties.defaults=ALL-UNNAMED" \
|
||||||
$JPACKAGE_OPTS \
|
$JPACKAGE_OPTS \
|
||||||
--resource-dir build \
|
--resource-dir build \
|
||||||
|
--app-content src/I2P/config \
|
||||||
--input build --main-jar launcher.jar --main-class net.i2p.router.WinLauncher
|
--input build --main-jar launcher.jar --main-class net.i2p.router.WinLauncher
|
||||||
|
|
||||||
cp "$I2P_PKG/licenses/"* license/
|
cp "$I2P_PKG/licenses/"* license/
|
||||||
|
|||||||
@@ -1,3 +1,17 @@
|
|||||||
|
2022-09-08 idk
|
||||||
|
* Generate a source tarball when we checkout a branch of i2p.i2p
|
||||||
|
* Upload a source tarball when we do a daily build
|
||||||
|
* Clean up a source tarball when running the clean script. Regenerate tarball after cleaning.
|
||||||
|
|
||||||
|
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
|
||||||
|
* Improves compatibility with detatched and un-bundled routers on the same system
|
||||||
|
* Fixes bugs in Firefox path finding
|
||||||
|
|
||||||
2022-05-8 idk
|
2022-05-8 idk
|
||||||
* Add translations for Arabic, German, French, Italian, Japanese, Portuguese, Russian,
|
* Add translations for Arabic, German, French, Italian, Japanese, Portuguese, Russian,
|
||||||
and Chinese.
|
and Chinese.
|
||||||
|
|||||||
4
clean.sh
4
clean.sh
@@ -4,6 +4,7 @@ SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
|||||||
cd "$SCRIPT_DIR" || exit 1
|
cd "$SCRIPT_DIR" || exit 1
|
||||||
|
|
||||||
. "$SCRIPT_DIR/config.sh"
|
. "$SCRIPT_DIR/config.sh"
|
||||||
|
. "$SCRIPT_DIR/i2pversion"
|
||||||
|
|
||||||
if [ -f config_overide.sh ]; then
|
if [ -f config_overide.sh ]; then
|
||||||
. "$SCRIPT_DIR/config_override.sh"
|
. "$SCRIPT_DIR/config_override.sh"
|
||||||
@@ -11,8 +12,9 @@ fi
|
|||||||
|
|
||||||
cd ../i2p.i2p.jpackage-build/
|
cd ../i2p.i2p.jpackage-build/
|
||||||
ant distclean
|
ant distclean
|
||||||
|
git clean -fd
|
||||||
git checkout .
|
git checkout .
|
||||||
git checkout master
|
tar --exclude="$SCRIPT_DIR/../i2p.i2p.jpackage-build/.git" -cvzf "$SCRIPT_DIR/../i2p.i2p.jpackage-build.tar.gz" "$SCRIPT_DIR/../i2p.i2p.jpackage-build/"
|
||||||
cd "$SCRIPT_DIR" || exit 1
|
cd "$SCRIPT_DIR" || exit 1
|
||||||
rm -rf \
|
rm -rf \
|
||||||
build \
|
build \
|
||||||
|
|||||||
20
config.sh
20
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):
|
||||||
|
|
||||||
|
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/"
|
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/"
|
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"
|
JAVA_HOME="/c/Program Files/Java/jdk-18.0.2"
|
||||||
export 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"
|
||||||
|
|||||||
40
exe.sh
Executable file
40
exe.sh
Executable file
@@ -0,0 +1,40 @@
|
|||||||
|
#! /usr/bin/env sh
|
||||||
|
|
||||||
|
## EXPERIMENTAL. PROBABLY WON'T SEE THE LIGHT OF DAY BUT MAYBE I GET LUCKY.
|
||||||
|
|
||||||
|
# Motivation
|
||||||
|
|
||||||
|
. ./config.sh
|
||||||
|
. ./i2pversion
|
||||||
|
jpackage --name I2P-EXE --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 \
|
||||||
|
--app-content build/I2P/config/certificates \
|
||||||
|
--app-content build/I2P/config/eepsite \
|
||||||
|
--app-content build/I2P/config/geoip \
|
||||||
|
--app-content build/I2P/config/webapps \
|
||||||
|
--app-content build/I2P/config/clients.config \
|
||||||
|
--app-content build/I2P/config/hosts.txt \
|
||||||
|
--app-content build/I2P/config/i2ptunnel.config \
|
||||||
|
--app-content build/I2P/config/jpackaged \
|
||||||
|
--app-content build/I2P/config/router.config \
|
||||||
|
--app-content build/I2P/config/wrappper.config \
|
||||||
|
--input build \
|
||||||
|
--verbose \
|
||||||
|
--type exe \
|
||||||
|
--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
|
||||||
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
|
||||||
BIN
i2plogo.png
Normal file
BIN
i2plogo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
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
|
||||||
|
export I2PFIREFOX_VERSION=0.0.36
|
||||||
# Comment this out to build from an alternate branch or
|
# 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=8
|
VERSIONMINOR=9
|
||||||
VERSIONBUILD=1
|
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.8.8
|
VERSION=i2p-jpackage-1.9.4
|
||||||
export VERSION=i2p-1.8.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"
|
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>
|
<title>
|
||||||
I2P Browsing Pro...
|
I2P Easy-Install...
|
||||||
</title>
|
</title>
|
||||||
<meta name="author" content="eyedeekay" />
|
<meta name="author" content="eyedeekay" />
|
||||||
<meta name="description" content="i2p.firefox" />
|
<meta name="description" content="i2p.firefox" />
|
||||||
<meta name="keywords" content="master" />
|
<meta name="keywords" content="master" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
@@ -40,7 +41,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h1>
|
<h1>
|
||||||
I2P Browsing Profile for Firefox
|
I2P Easy-Install Bundle for Windows(Also/formerly)I2P Browsing Profile for Firefox
|
||||||
</h1>
|
</h1>
|
||||||
<h2>
|
<h2>
|
||||||
Features:
|
Features:
|
||||||
@@ -714,6 +715,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
|
<img src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
76
java/net/i2p/router/CopyConfigDir.java
Normal file
76
java/net/i2p/router/CopyConfigDir.java
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
package net.i2p.router;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
public class CopyConfigDir {
|
||||||
|
|
||||||
|
public boolean copyDirectory(String baseDir, String workDir) {
|
||||||
|
File baseFile = new File(baseDir);
|
||||||
|
File workFile = new File(workDir);
|
||||||
|
return copyDirectory(baseFile, workFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean copyDirectory(File baseDir, File workDir) {
|
||||||
|
for (File file : baseDir.listFiles()) {
|
||||||
|
System.out.println(file.getAbsolutePath());
|
||||||
|
if (file.isDirectory())
|
||||||
|
copyDirectory(file, new File(workDir, file.toString()));
|
||||||
|
if (file.isFile())
|
||||||
|
copyFileNeverOverwrite(file, new File(workDir, file.toString()));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean copyConfigDirectory(File baseDir, File workDir) {
|
||||||
|
for (File file : baseDir.listFiles()) {
|
||||||
|
System.out.println(file.getAbsolutePath());
|
||||||
|
if (file.isDirectory())
|
||||||
|
copyDirectory(file, new File(workDir, file.toString()));
|
||||||
|
if (file.isFile())
|
||||||
|
copyFileNeverOverwrite(file, new File(workDir, file.toString()));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean copyFileNeverOverwrite(String basePath, String workPath) {
|
||||||
|
File baseFile = new File(basePath);
|
||||||
|
File workFile = new File(workPath);
|
||||||
|
return copyFileNeverOverwrite(baseFile, workFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean copyFileNeverOverwrite(File basePath, File workPath) {
|
||||||
|
return copyFile(basePath, workPath, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean copyFile(File basePath, File workPath, boolean overWrite) {
|
||||||
|
if (!basePath.exists()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!overWrite && workPath.exists()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try (InputStream in =
|
||||||
|
new BufferedInputStream(new FileInputStream(basePath));
|
||||||
|
OutputStream out =
|
||||||
|
new BufferedOutputStream(new FileOutputStream(workPath))) {
|
||||||
|
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int lengthRead;
|
||||||
|
while ((lengthRead = in.read(buffer)) > 0) {
|
||||||
|
out.write(buffer, 0, lengthRead);
|
||||||
|
out.flush();
|
||||||
|
}
|
||||||
|
in.close();
|
||||||
|
out.close();
|
||||||
|
return true;
|
||||||
|
} catch (Throwable e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,9 +25,11 @@ public class Elevator {
|
|||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
int lastError = Kernel32.INSTANCE.GetLastError();
|
int lastError = Kernel32.INSTANCE.GetLastError();
|
||||||
String errorMessage = Kernel32Util.formatMessageFromLastErrorCode(lastError);
|
String errorMessage =
|
||||||
throw new RuntimeException("Error performing elevation: " + lastError + ": " + errorMessage + " (apperror="
|
Kernel32Util.formatMessageFromLastErrorCode(lastError);
|
||||||
+ execInfo.hInstApp + ")");
|
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,9 +10,11 @@ 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;
|
||||||
@@ -49,7 +49,8 @@ public interface Shell32X extends Shell32 {
|
|||||||
|
|
||||||
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);
|
||||||
|
|
||||||
@@ -101,11 +102,22 @@ public interface Shell32X extends Shell32 {
|
|||||||
|
|
||||||
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,19 +10,15 @@ 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
|
||||||
@@ -37,6 +35,104 @@ public class WinLauncher {
|
|||||||
static FileHandler fh;
|
static FileHandler fh;
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
|
setupLauncher();
|
||||||
|
boolean privateBrowsing = false;
|
||||||
|
boolean usabilityMode = false;
|
||||||
|
boolean chromiumFirst = false;
|
||||||
|
int proxyTimeoutTime = 200;
|
||||||
|
ArrayList<String> newArgsList = new ArrayList<String>();
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
File programs = programFile();
|
||||||
|
File home = homeDir();
|
||||||
|
|
||||||
|
// TODO: I want to minimize the amount of stuff I have to rely on NSIS for
|
||||||
|
// and if I
|
||||||
|
// 1. make the config directory inclusion part of the jpackage step
|
||||||
|
// and
|
||||||
|
// 2. make the launcher copy new or missing config files at launch
|
||||||
|
// then NSIS serves primarily as a way of providing multilanguage
|
||||||
|
// support in the installer. It has a higher degree of customization,
|
||||||
|
// but probably ceases to be necessary, I can make jpackage generate
|
||||||
|
// the installer, **and** I get to build every other kind of jpackage
|
||||||
|
// powered package.
|
||||||
|
|
||||||
|
if (launchBrowser(privateBrowsing, usabilityMode, chromiumFirst,
|
||||||
|
proxyTimeoutTime, newArgsList)) {
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
setNotStarting();
|
||||||
|
// wupp.i2pRouter.runRouter();
|
||||||
|
RouterLaunch.main(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void setupLauncher() {
|
||||||
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());
|
||||||
@@ -50,59 +146,67 @@ public class WinLauncher {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
boolean privateBrowsing = false;
|
|
||||||
if (args != null && args.length > 0) {
|
File jrehome = javaHome();
|
||||||
logger.info("checking for private browsing");
|
logger.info("jre home is: " + jrehome.getAbsolutePath());
|
||||||
if (args[0].equals("-private")) {
|
File appimagehome = appImageHome();
|
||||||
privateBrowsing = true;
|
logger.info("appimage home is: " + appimagehome.getAbsolutePath());
|
||||||
logger.info("private browsing is true, profile will be discarded at end of session");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static File programFile() {
|
||||||
File programs = selectProgramFile();
|
File programs = selectProgramFile();
|
||||||
if (!programs.exists())
|
if (!programs.exists())
|
||||||
programs.mkdirs();
|
programs.mkdirs();
|
||||||
else if (!programs.isDirectory()) {
|
else if (!programs.isDirectory()) {
|
||||||
logger.warning(programs + " exists but is not a directory. Please get it out of the way");
|
logger.warning(
|
||||||
|
programs +
|
||||||
|
" exists but is not a directory. Please get it out of the way");
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
return programs;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static File homeDir() {
|
||||||
File home = selectHome();
|
File home = selectHome();
|
||||||
if (!home.exists())
|
if (!home.exists())
|
||||||
home.mkdirs();
|
home.mkdirs();
|
||||||
else if (!home.isDirectory()) {
|
else if (!home.isDirectory()) {
|
||||||
logger.warning(home + " exists but is not a directory. Please get it out of the way");
|
logger.warning(
|
||||||
|
home +
|
||||||
|
" exists but is not a directory. Please get it out of the way");
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
return home;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean launchBrowser(boolean privateBrowsing,
|
||||||
|
boolean usabilityMode,
|
||||||
|
boolean chromiumFirst,
|
||||||
|
int proxyTimeoutTime,
|
||||||
|
ArrayList<String> newArgsList) {
|
||||||
if (i2pIsRunning()) {
|
if (i2pIsRunning()) {
|
||||||
logger.warning("I2P is already running");
|
logger.info("I2P is already running, launching an I2P browser");
|
||||||
I2PFirefox i2pFirefox = new I2PFirefox();
|
I2PBrowser i2pBrowser = new I2PBrowser();
|
||||||
System.out.println("I2PFirefox");
|
i2pBrowser.usability = usabilityMode;
|
||||||
i2pFirefox.launch(privateBrowsing);
|
i2pBrowser.chromiumFirst = chromiumFirst;
|
||||||
return;
|
i2pBrowser.firefox = !chromiumFirst;
|
||||||
|
i2pBrowser.chromium = chromiumFirst;
|
||||||
|
if (chromiumFirst) {
|
||||||
|
logger.warning("favoring Chromium instead of Firefox");
|
||||||
|
}
|
||||||
|
i2pBrowser.setProxyTimeoutTime(proxyTimeoutTime);
|
||||||
|
System.out.println("I2PBrowser");
|
||||||
|
String[] newArgs = newArgsList.toArray(new String[newArgsList.size()]);
|
||||||
|
setNotStarting();
|
||||||
|
i2pBrowser.launch(privateBrowsing, newArgs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
System.setProperty("i2p.dir.base", programs.getAbsolutePath());
|
// see
|
||||||
System.setProperty("i2p.dir.config", home.getAbsolutePath());
|
// https://stackoverflow.com/questions/434718/sockets-discover-port-availability-using-java
|
||||||
System.setProperty("router.pid", String.valueOf(ProcessHandle.current().pid()));
|
private static boolean isAvailable(int portNr) {
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
// see https://stackoverflow.com/questions/434718/sockets-discover-port-availability-using-java
|
|
||||||
public static boolean isAvailable(int portNr) {
|
|
||||||
boolean portFree;
|
boolean portFree;
|
||||||
try (var ignored = new ServerSocket(portNr)) {
|
try (var ignored = new ServerSocket(portNr)) {
|
||||||
portFree = true;
|
portFree = true;
|
||||||
@@ -112,65 +216,108 @@ public class WinLauncher {
|
|||||||
return portFree;
|
return portFree;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean i2pIsRunning() {
|
private static boolean i2pIsRunningCheck() {
|
||||||
sleep(2000);
|
|
||||||
// check if there's something listening on port 7657(Router Console)
|
// check if there's something listening on port 7657(Router Console)
|
||||||
if (!isAvailable(7657)) {
|
if (!isAvailable(7657))
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
// check if there's something listening on port 7654(I2CP)
|
// check if there's something listening on port 7654(I2CP)
|
||||||
if (!isAvailable(7654)) {
|
if (!isAvailable(7654))
|
||||||
|
return true;
|
||||||
|
if (checkPing())
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void setNotStarting() {
|
||||||
|
logger.info("removing startup file, the application has started");
|
||||||
|
File home = selectHome();
|
||||||
|
File starting = new File(home, "starting");
|
||||||
|
if (starting.exists()) {
|
||||||
|
starting.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void setStarting() {
|
||||||
|
logger.info("creating startup file, router is starting up");
|
||||||
|
File home = selectHome();
|
||||||
|
File starting = new File(home, "starting");
|
||||||
|
if (!starting.exists()) {
|
||||||
|
try {
|
||||||
|
starting.createNewFile();
|
||||||
|
} catch (IOException e) {
|
||||||
|
logger.info(e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean checkStarting() {
|
||||||
|
logger.info("checking startup file");
|
||||||
|
File home = selectHome();
|
||||||
|
File starting = new File(home, "starting");
|
||||||
|
if (starting.exists()) {
|
||||||
|
logger.info("startup file exists, I2P is already starting up");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// check for the existence of router.ping file, if it's less then 2 minutes old,
|
logger.info("startup file does not exist but we're running now");
|
||||||
// exit
|
setStarting();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for the existence of router.ping file, if it's less then 2
|
||||||
|
// minutes old, exit
|
||||||
|
private static boolean checkPing() {
|
||||||
File home = selectHome();
|
File home = selectHome();
|
||||||
File ping = new File(home, "router.ping");
|
File ping = new File(home, "router.ping");
|
||||||
if (ping.exists()) {
|
if (ping.exists()) {
|
||||||
long diff = System.currentTimeMillis() - ping.lastModified();
|
long diff = System.currentTimeMillis() - ping.lastModified();
|
||||||
if (diff < 60 * 1000) {
|
if (diff > 60 * 1000) {
|
||||||
logger.info("router.ping exists and is less than 1 minute old, I2P appears to be running already.");
|
logger.info(
|
||||||
logger.info("If I2P is not running, wait 60 seconds and try again.");
|
"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;
|
||||||
|
} else {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Runnable REGISTER_UPP = () -> {
|
private static boolean i2pIsRunning() {
|
||||||
|
if (checkStarting())
|
||||||
|
return true;
|
||||||
|
if (checkPing())
|
||||||
|
return true;
|
||||||
|
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
|
// first wait for the RouterContext to appear
|
||||||
RouterContext ctx;
|
RouterContext ctx;
|
||||||
while ((ctx = (RouterContext)RouterContext.getCurrentContext()) == null) {
|
while ((ctx = (RouterContext)RouterContext.getCurrentContext()) == null) {
|
||||||
sleep(1000);
|
sleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// then wait for the update manager
|
// then wait for the update manager
|
||||||
|
|
||||||
ClientAppManager cam;
|
ClientAppManager cam;
|
||||||
while ((cam = ctx.clientAppManager()) == null) {
|
while ((cam = ctx.clientAppManager()) == null) {
|
||||||
sleep(1000);
|
sleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateManager um;
|
UpdateManager um;
|
||||||
while ((um = (UpdateManager) cam.getRegisteredApp(UpdateManager.APP_NAME)) == null) {
|
while ((um = (UpdateManager)cam.getRegisteredApp(UpdateManager.APP_NAME)) ==
|
||||||
|
null) {
|
||||||
sleep(1000);
|
sleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
WindowsUpdatePostProcessor wupp = new WindowsUpdatePostProcessor(ctx);
|
WindowsUpdatePostProcessor wupp = new WindowsUpdatePostProcessor(ctx);
|
||||||
um.register(wupp, UpdateType.ROUTER_SIGNED_SU3, SU3File.TYPE_EXE);
|
um.register(wupp, UpdateType.ROUTER_SIGNED_SU3, SU3File.TYPE_EXE);
|
||||||
um.register(wupp, UpdateType.ROUTER_DEV_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 {
|
private static File selectHome() { // throws Exception {
|
||||||
String path_override = System.getenv("I2P_CONFIG");
|
String path_override = System.getenv("I2P_CONFIG");
|
||||||
if (path_override != null) {
|
if (path_override != null) {
|
||||||
@@ -183,17 +330,14 @@ public class WinLauncher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (SystemVersion.isWindows()) {
|
if (SystemVersion.isWindows()) {
|
||||||
File home = new File(System.getProperty("user.home"));
|
File i2p = appImageHome();
|
||||||
File appData = new File(home, "AppData");
|
logger.info("Checking for signs of life in I2P directory: " + i2p);
|
||||||
File local = new File(appData, "Local");
|
return i2p;
|
||||||
File i2p;
|
|
||||||
i2p = new File(local, "I2P");
|
|
||||||
logger.info("Windows jpackage wrapper started, using: " + i2p + " as base config");
|
|
||||||
return i2p.getAbsoluteFile();
|
|
||||||
} else {
|
} else {
|
||||||
File jrehome = new File(System.getProperty("java.home"));
|
File i2p = appImageHome();
|
||||||
File programs = new File(jrehome.getParentFile().getParentFile(), ".i2p");
|
File programs = new File(i2p, ".i2p");
|
||||||
logger.info("Linux portable jpackage wrapper started, using: " + programs + " as base config");
|
logger.info("Linux portable jpackage wrapper starting up, using: " +
|
||||||
|
programs + " as base config");
|
||||||
return programs.getAbsoluteFile();
|
return programs.getAbsoluteFile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -212,20 +356,134 @@ public class WinLauncher {
|
|||||||
if (SystemVersion.isWindows()) {
|
if (SystemVersion.isWindows()) {
|
||||||
File jrehome = new File(System.getProperty("java.home"));
|
File jrehome = new File(System.getProperty("java.home"));
|
||||||
File programs = jrehome.getParentFile();
|
File programs = jrehome.getParentFile();
|
||||||
logger.info("Windows portable jpackage wrapper found, using: " + programs + " as working config");
|
logger.info("Windows portable jpackage wrapper found, using: " +
|
||||||
|
programs + " as working config");
|
||||||
return programs.getAbsoluteFile();
|
return programs.getAbsoluteFile();
|
||||||
} else {
|
} else {
|
||||||
File jrehome = new File(System.getProperty("java.home"));
|
File jrehome = new File(System.getProperty("java.home"));
|
||||||
File programs = new File(jrehome.getParentFile().getParentFile(), "i2p");
|
File programs = new File(jrehome.getParentFile().getParentFile(), "i2p");
|
||||||
logger.info("Linux portable jpackage wrapper found, using: " + programs + " as working config");
|
logger.info("Linux portable jpackage wrapper found, using: " + programs +
|
||||||
|
" as working config");
|
||||||
return programs.getAbsoluteFile();
|
return programs.getAbsoluteFile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the OS name(windows, mac, linux only)
|
||||||
|
*
|
||||||
|
* @return os name in lower-case, "windows" "mac" or "linux"
|
||||||
|
*/
|
||||||
|
private static String osName() {
|
||||||
|
String osName = System.getProperty("os.name").toLowerCase();
|
||||||
|
if (osName.contains("windows"))
|
||||||
|
return "windows";
|
||||||
|
if (osName.contains("mac"))
|
||||||
|
return "mac";
|
||||||
|
return "linux";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the path to the java home, for jpackage this is related to the
|
||||||
|
* executable itself, which is handy to know. It's a directory called runtime,
|
||||||
|
* relative to the root of the app-image on each platform:
|
||||||
|
*
|
||||||
|
* Windows - Root of appimage is 1 directory above directory named runtime
|
||||||
|
* ./runtime
|
||||||
|
*
|
||||||
|
* Linux - Root of appimage is 2 directories above directory named runtime
|
||||||
|
* ./lib/runtime
|
||||||
|
*
|
||||||
|
* Mac OSX - Unknown for now
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static File javaHome() {
|
||||||
|
File jrehome = new File(System.getProperty("java.home"));
|
||||||
|
if (jrehome != null) {
|
||||||
|
if (jrehome.exists()) {
|
||||||
|
return jrehome;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the path to the root of the app-image root by getting the path to
|
||||||
|
* java.home and the OS, and traversing up to the app-image root based on that
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* @return the app-image root
|
||||||
|
*/
|
||||||
|
private static File appImageHome() {
|
||||||
|
File jreHome = javaHome();
|
||||||
|
if (jreHome != null) {
|
||||||
|
switch (osName()) {
|
||||||
|
case "windows":
|
||||||
|
return jreHome.getAbsoluteFile().getParentFile();
|
||||||
|
case "mac":
|
||||||
|
case "linux":
|
||||||
|
return jreHome.getAbsoluteFile().getParentFile().getParentFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the path to the default config of the app-image by getting the path to
|
||||||
|
* java.home and the OS, and traversing up to the app-image root based on that
|
||||||
|
* information, then appending lib/config to the end.
|
||||||
|
*
|
||||||
|
* @return the app-image root
|
||||||
|
*/
|
||||||
|
private static File appImageConfig() {
|
||||||
|
File aih = appImageHome();
|
||||||
|
if (aih == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String osName = osName();
|
||||||
|
switch (osName) {
|
||||||
|
case "windows":
|
||||||
|
File winConfigDir = new File(aih, "config");
|
||||||
|
if (winConfigDir != null) {
|
||||||
|
if (winConfigDir.exists()) {
|
||||||
|
return winConfigDir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "mac":
|
||||||
|
case "linux":
|
||||||
|
File linConfigDir = new File(aih, "lib/config");
|
||||||
|
if (linConfigDir != null) {
|
||||||
|
if (linConfigDir.exists()) {
|
||||||
|
return linConfigDir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set up the path to the log file
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
private static File logFile() {
|
private static File logFile() {
|
||||||
File log = new File(selectProgramFile(), "log");
|
File log = new File(selectProgramFile(), "logs");
|
||||||
if (!log.exists())
|
if (!log.exists())
|
||||||
log.mkdirs();
|
log.mkdirs();
|
||||||
return new File(log, "launcher.log");
|
return new File(log, "launcher.log");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sleep for 1 second
|
||||||
|
*
|
||||||
|
* @param millis
|
||||||
|
*/
|
||||||
|
private static void sleep(int millis) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(millis);
|
||||||
|
} catch (InterruptedException bad) {
|
||||||
|
bad.printStackTrace();
|
||||||
|
throw new RuntimeException(bad);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
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 {
|
||||||
@@ -13,7 +12,8 @@ class WinUpdateProcess implements Runnable {
|
|||||||
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,
|
||||||
|
Supplier<File> fileSupplier) {
|
||||||
this.ctx = ctx;
|
this.ctx = ctx;
|
||||||
this.versionSupplier = versionSupplier;
|
this.versionSupplier = versionSupplier;
|
||||||
this.fileSupplier = fileSupplier;
|
this.fileSupplier = fileSupplier;
|
||||||
@@ -22,10 +22,12 @@ class WinUpdateProcess implements Runnable {
|
|||||||
|
|
||||||
private File workDir() throws IOException {
|
private File workDir() throws IOException {
|
||||||
if (ctx != null) {
|
if (ctx != null) {
|
||||||
File workDir = new File(ctx.getConfigDir().getAbsolutePath(), "i2p_update_win");
|
File workDir =
|
||||||
|
new File(ctx.getConfigDir().getAbsolutePath(), "i2p_update_win");
|
||||||
if (workDir.exists()) {
|
if (workDir.exists()) {
|
||||||
if (workDir.isFile())
|
if (workDir.isFile())
|
||||||
throw new IOException(workDir + " exists but is a file, get it out of the way");
|
throw new IOException(workDir +
|
||||||
|
" exists but is a file, get it out of the way");
|
||||||
return workDir;
|
return workDir;
|
||||||
} else {
|
} else {
|
||||||
workDir.mkdirs();
|
workDir.mkdirs();
|
||||||
@@ -45,28 +47,34 @@ class WinUpdateProcess implements Runnable {
|
|||||||
var logFile = new File(workingDir, "log-" + version + ".txt");
|
var logFile = new File(workingDir, "log-" + version + ".txt");
|
||||||
|
|
||||||
if (logFile.canWrite()) {
|
if (logFile.canWrite()) {
|
||||||
// check if we can write to the log file. If we can, use the ProcessBuilder to
|
// check if we can write to the log file. If we can, use the
|
||||||
// run the installer.
|
// ProcessBuilder to run the installer.
|
||||||
ProcessBuilder pb = new ProcessBuilder(file.getAbsolutePath(), "/S", "/D=" + workingDir.getAbsolutePath());
|
ProcessBuilder pb = new ProcessBuilder(
|
||||||
|
file.getAbsolutePath(), "/S", "/D=" + workingDir.getAbsolutePath());
|
||||||
var env = pb.environment();
|
var env = pb.environment();
|
||||||
env.put("OLD_I2P_VERSION", version);
|
env.put("OLD_I2P_VERSION", version);
|
||||||
env.remove("RESTART_I2P");
|
env.remove("RESTART_I2P");
|
||||||
|
|
||||||
int exitCode = ctx.router().scheduledGracefulExitCode();
|
int exitCode = ctx.router().scheduledGracefulExitCode();
|
||||||
if (exitCode == Router.EXIT_HARD_RESTART || exitCode == Router.EXIT_GRACEFUL_RESTART)
|
if (exitCode == Router.EXIT_HARD_RESTART ||
|
||||||
|
exitCode == Router.EXIT_GRACEFUL_RESTART)
|
||||||
env.put("RESTART_I2P", "true");
|
env.put("RESTART_I2P", "true");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
pb.directory(workingDir).redirectErrorStream(true).redirectOutput(logFile).start();
|
pb.directory(workingDir)
|
||||||
|
.redirectErrorStream(true)
|
||||||
|
.redirectOutput(logFile)
|
||||||
|
.start();
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
_log.error("Unable to run update-program in background. Update will fail.");
|
_log.error(
|
||||||
|
"Unable to run update-program in background. Update will fail.");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// If we cant write to the log file and we're on Windows, use the elevator to
|
// If we cant write to the log file and we're on Windows, use the elevator
|
||||||
// execute the installer instead of the ProcessBuilder.
|
// to execute the installer instead of the ProcessBuilder.
|
||||||
Elevator.executeAsAdministrator(file.getAbsolutePath(), " /S /D=" + workingDir.getAbsolutePath());
|
Elevator.executeAsAdministrator(file.getAbsolutePath(),
|
||||||
|
" /S /D=" + workingDir.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,22 +1,21 @@
|
|||||||
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;
|
||||||
@@ -32,20 +31,18 @@ public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
|
|||||||
this._log = ctx.logManager().getLog(WindowsUpdatePostProcessor.class);
|
this._log = ctx.logManager().getLog(WindowsUpdatePostProcessor.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getVersion() {
|
public String getVersion() { return version; }
|
||||||
return version;
|
|
||||||
}
|
|
||||||
|
|
||||||
public File getFile() {
|
public File getFile() { return positionedFile; }
|
||||||
return positionedFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateDownloadedandVerified(UpdateType type, int fileType, String version, File file)
|
public void updateDownloadedandVerified(UpdateType type, int fileType,
|
||||||
|
String version, File file)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
_log.info("Got an update to post-process");
|
_log.info("Got an update to post-process");
|
||||||
if (SystemVersion.isWindows()) {
|
if (SystemVersion.isWindows()) {
|
||||||
|
|
||||||
if (type != UpdateType.ROUTER_SIGNED_SU3 && type != UpdateType.ROUTER_DEV_SU3) {
|
if (type != UpdateType.ROUTER_SIGNED_SU3 &&
|
||||||
|
type != UpdateType.ROUTER_DEV_SU3) {
|
||||||
_log.warn("Unsupported update type " + type);
|
_log.warn("Unsupported update type " + type);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -65,7 +62,8 @@ public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
|
|||||||
|
|
||||||
_log.info("adding shutdown hook");
|
_log.info("adding shutdown hook");
|
||||||
|
|
||||||
ctx.addFinalShutdownTask(new WinUpdateProcess(ctx, this::getVersion, this::getFile));
|
ctx.addFinalShutdownTask(
|
||||||
|
new WinUpdateProcess(ctx, this::getVersion, this::getFile));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,10 +83,12 @@ public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
|
|||||||
|
|
||||||
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 =
|
||||||
|
new File(this.ctx.getConfigDir().getAbsolutePath(), "i2p_update_win");
|
||||||
if (workDir.exists()) {
|
if (workDir.exists()) {
|
||||||
if (workDir.isFile())
|
if (workDir.isFile())
|
||||||
throw new IOException(workDir + " exists but is a file, get it out of the way");
|
throw new IOException(workDir +
|
||||||
|
" exists but is a file, get it out of the way");
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
workDir.mkdirs();
|
workDir.mkdirs();
|
||||||
@@ -97,5 +97,4 @@ public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,8 @@ src/app-profile/user.js:
|
|||||||
wget -O src/app-profile/user.js "https://github.com/arkenfox/user.js/raw/master/user.js"
|
wget -O src/app-profile/user.js "https://github.com/arkenfox/user.js/raw/master/user.js"
|
||||||
sed -i 's|user_pref("extensions.autoDisableScopes", 15);|user_pref("extensions.autoDisableScopes", 0);|g src/app-profile/user.js
|
sed -i 's|user_pref("extensions.autoDisableScopes", 15);|user_pref("extensions.autoDisableScopes", 0);|g src/app-profile/user.js
|
||||||
sed -i 's|user_pref("extensions.enabledScopes", 5);|user_pref("extensions.enabledScopes", 1);|g' src/app-profile/user.js
|
sed -i 's|user_pref("extensions.enabledScopes", 5);|user_pref("extensions.enabledScopes", 1);|g' src/app-profile/user.js
|
||||||
|
sed -i 's|user_pref("dom.security.https_only_mode", true);|user_pref("dom.security.https_only_mode", false);|g' src/app-profile/user.js
|
||||||
|
|
||||||
|
|
||||||
build/app-profile/user.js: build/app-profile src/app-profile/user.js
|
build/app-profile/user.js: build/app-profile src/app-profile/user.js
|
||||||
cp src/app-profile/user.js build/app-profile/user.js
|
cp src/app-profile/user.js build/app-profile/user.js
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ src/profile/user.js:
|
|||||||
wget -O src/profile/user.js "https://github.com/arkenfox/user.js/raw/master/user.js"
|
wget -O src/profile/user.js "https://github.com/arkenfox/user.js/raw/master/user.js"
|
||||||
sed -i 's|user_pref("extensions.autoDisableScopes", 15);|user_pref("extensions.autoDisableScopes", 0);|g src/profile/user.js
|
sed -i 's|user_pref("extensions.autoDisableScopes", 15);|user_pref("extensions.autoDisableScopes", 0);|g src/profile/user.js
|
||||||
sed -i 's|user_pref("extensions.enabledScopes", 5);|user_pref("extensions.enabledScopes", 1);|g' src/profile/user.js
|
sed -i 's|user_pref("extensions.enabledScopes", 5);|user_pref("extensions.enabledScopes", 1);|g' src/profile/user.js
|
||||||
|
sed -i 's|user_pref("dom.security.https_only_mode", true);|user_pref("dom.security.https_only_mode", false);|g' src/profile/user.js
|
||||||
|
|
||||||
build/profile/user.js: build/profile src/profile/user.js
|
build/profile/user.js: build/profile src/profile/user.js
|
||||||
cp src/profile/user.js build/profile/user.js
|
cp src/profile/user.js build/profile/user.js
|
||||||
|
|||||||
40
msi.sh
Executable file
40
msi.sh
Executable file
@@ -0,0 +1,40 @@
|
|||||||
|
#! /usr/bin/env sh
|
||||||
|
|
||||||
|
## EXPERIMENTAL. PROBABLY WON'T SEE THE LIGHT OF DAY BUT MAYBE I GET LUCKY.
|
||||||
|
|
||||||
|
# Motivation
|
||||||
|
|
||||||
|
. ./config.sh
|
||||||
|
. ./i2pversion
|
||||||
|
jpackage --name I2P-MSI --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 \
|
||||||
|
--app-content build/I2P/config/certificates \
|
||||||
|
--app-content build/I2P/config/eepsite \
|
||||||
|
--app-content build/I2P/config/geoip \
|
||||||
|
--app-content build/I2P/config/webapps \
|
||||||
|
--app-content build/I2P/config/clients.config \
|
||||||
|
--app-content build/I2P/config/hosts.txt \
|
||||||
|
--app-content build/I2P/config/i2ptunnel.config \
|
||||||
|
--app-content build/I2P/config/jpackaged \
|
||||||
|
--app-content build/I2P/config/router.config \
|
||||||
|
--app-content build/I2P/config/wrappper.config \
|
||||||
|
--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
|
||||||
10
showhider.css
Normal file
10
showhider.css
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/* edgar showhider CSS file */
|
||||||
|
#show {display:none; }
|
||||||
|
#hide {display:block; }
|
||||||
|
#show:target {display: block; }
|
||||||
|
#hide:target {display: none; }
|
||||||
|
|
||||||
|
#shownav {display:none; }
|
||||||
|
#hidenav {display:block; }
|
||||||
|
#shownav:target {display: block; }
|
||||||
|
#hidenav:target {display: none; }
|
||||||
2
sign.sh
2
sign.sh
@@ -40,6 +40,6 @@ if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
|||||||
linuxsign I2P-Profile-Installer-$I2P_VERSION.exe
|
linuxsign I2P-Profile-Installer-$I2P_VERSION.exe
|
||||||
cp "I2P-Profile-Installer-$I2P_VERSION.exe" "I2P-Profile-Installer-$I2P_VERSION-signed.exe"
|
cp "I2P-Profile-Installer-$I2P_VERSION.exe" "I2P-Profile-Installer-$I2P_VERSION-signed.exe"
|
||||||
else
|
else
|
||||||
signtool.exe sign "I2P-Profile-Installer-$I2P_VERSION.exe"
|
signtool.exe sign -a "I2P-Profile-Installer-$I2P_VERSION.exe"
|
||||||
cp "I2P-Profile-Installer-$I2P_VERSION.exe" "I2P-Profile-Installer-$I2P_VERSION-signed.exe"
|
cp "I2P-Profile-Installer-$I2P_VERSION.exe" "I2P-Profile-Installer-$I2P_VERSION-signed.exe"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -517,7 +517,7 @@ user_pref("security.mixed_content.block_display_content", true);
|
|||||||
* [SETTING] Privacy & Security>HTTPS-Only Mode (and manage exceptions)
|
* [SETTING] Privacy & Security>HTTPS-Only Mode (and manage exceptions)
|
||||||
* [TEST] http://example.com [upgrade]
|
* [TEST] http://example.com [upgrade]
|
||||||
* [TEST] http://httpforever.com/ [no upgrade] ***/
|
* [TEST] http://httpforever.com/ [no upgrade] ***/
|
||||||
user_pref("dom.security.https_only_mode", true); // [FF76+]
|
user_pref("dom.security.https_only_mode", false); // [FF76+]
|
||||||
// user_pref("dom.security.https_only_mode_pbm", true); // [FF80+]
|
// user_pref("dom.security.https_only_mode_pbm", true); // [FF80+]
|
||||||
/* 1245: enable HTTPS-Only mode for local resources [FF77+] ***/
|
/* 1245: enable HTTPS-Only mode for local resources [FF77+] ***/
|
||||||
// user_pref("dom.security.https_only_mode.upgrade_local", true);
|
// user_pref("dom.security.https_only_mode.upgrade_local", true);
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1.8.1
|
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"
|
||||||
@@ -14,21 +14,13 @@ UniCode true
|
|||||||
!include i2pbrowser-jpackage.nsi
|
!include i2pbrowser-jpackage.nsi
|
||||||
!include FindProcess.nsh
|
!include FindProcess.nsh
|
||||||
|
|
||||||
var FFINSTEXE
|
|
||||||
var FFNONTORINSTEXE
|
|
||||||
var I2PINSTEXE
|
var I2PINSTEXE
|
||||||
Var PARENTOPTIONS
|
|
||||||
|
|
||||||
SetOverwrite on
|
SetOverwrite on
|
||||||
!define FFINSTEXE
|
|
||||||
!define FFNONTORINSTEXE
|
|
||||||
!define FFINSTEXE32 "$PROGRAMFILES32\Mozilla Firefox\"
|
|
||||||
!define FFINSTEXE64 "$PROGRAMFILES64\Mozilla Firefox\"
|
|
||||||
|
|
||||||
!define I2PINSTEXE
|
!define I2PINSTEXE
|
||||||
!define I2PINSTEXE_USERMODE "$LOCALAPPDATA\i2p"
|
!define I2PINSTEXE_USERMODE "$LOCALAPPDATA\i2p"
|
||||||
|
|
||||||
|
|
||||||
!define RAM_NEEDED_FOR_64BIT 0x80000000
|
!define RAM_NEEDED_FOR_64BIT 0x80000000
|
||||||
|
|
||||||
InstallDir "$PROGRAMFILES64\${COMPANYNAME}\${APPNAME}"
|
InstallDir "$PROGRAMFILES64\${COMPANYNAME}\${APPNAME}"
|
||||||
@@ -109,15 +101,15 @@ RequestExecutionLevel user
|
|||||||
!insertmacro MUI_LANGUAGE "Basque"
|
!insertmacro MUI_LANGUAGE "Basque"
|
||||||
!insertmacro MUI_LANGUAGE "Welsh"
|
!insertmacro MUI_LANGUAGE "Welsh"
|
||||||
# Commented out languages below do not compile on NSIS v2
|
# Commented out languages below do not compile on NSIS v2
|
||||||
# !insertmacro MUI_LANGUAGE "Asturian"
|
!insertmacro MUI_LANGUAGE "Asturian"
|
||||||
# !insertmacro MUI_LANGUAGE "Pashto"
|
!insertmacro MUI_LANGUAGE "Pashto"
|
||||||
# !insertmacro MUI_LANGUAGE "ScotsGaelic"
|
!insertmacro MUI_LANGUAGE "ScotsGaelic"
|
||||||
# !insertmacro MUI_LANGUAGE "Georgian"
|
!insertmacro MUI_LANGUAGE "Georgian"
|
||||||
# !insertmacro MUI_LANGUAGE "Vietnamese"
|
!insertmacro MUI_LANGUAGE "Vietnamese"
|
||||||
# !insertmacro MUI_LANGUAGE "Armenian"
|
!insertmacro MUI_LANGUAGE "Armenian"
|
||||||
# !insertmacro MUI_LANGUAGE "Corsican"
|
!insertmacro MUI_LANGUAGE "Corsican"
|
||||||
# !insertmacro MUI_LANGUAGE "Tatar"
|
!insertmacro MUI_LANGUAGE "Tatar"
|
||||||
# !insertmacro MUI_LANGUAGE "Hindi"
|
!insertmacro MUI_LANGUAGE "Hindi"
|
||||||
### END LANGUAGES
|
### END LANGUAGES
|
||||||
|
|
||||||
# small speed optimization
|
# small speed optimization
|
||||||
@@ -129,12 +121,6 @@ PageEx license
|
|||||||
licensetext "${LICENSE_TITLE}"
|
licensetext "${LICENSE_TITLE}"
|
||||||
licensedata "licenses\LICENSE.txt"
|
licensedata "licenses\LICENSE.txt"
|
||||||
PageExEnd
|
PageExEnd
|
||||||
PageEx directory
|
|
||||||
dirtext "${FIREFOX_MESSAGE}"
|
|
||||||
dirvar $FFINSTEXE
|
|
||||||
dirvar $FFNONTORINSTEXE
|
|
||||||
PageCallbacks firefoxDetect
|
|
||||||
PageExEnd
|
|
||||||
PageEx directory
|
PageEx directory
|
||||||
dirtext "${I2P_MESSAGE}"
|
dirtext "${I2P_MESSAGE}"
|
||||||
dirvar $I2PINSTEXE
|
dirvar $I2PINSTEXE
|
||||||
@@ -142,7 +128,7 @@ PageEx directory
|
|||||||
PageExEnd
|
PageExEnd
|
||||||
Page instfiles
|
Page instfiles
|
||||||
|
|
||||||
!include i2pbrowser-mozcompat.nsi
|
#!include i2pbrowser-mozcompat.nsi
|
||||||
|
|
||||||
Function .onInit
|
Function .onInit
|
||||||
StrCpy $I2PINSTEXE "${I2PINSTEXE_USERMODE}"
|
StrCpy $I2PINSTEXE "${I2PINSTEXE_USERMODE}"
|
||||||
@@ -153,66 +139,38 @@ Function .onInit
|
|||||||
StrCpy $I2PINSTEXE "${I2PINSTEXE_USERMODE}"
|
StrCpy $I2PINSTEXE "${I2PINSTEXE_USERMODE}"
|
||||||
${EndIf}
|
${EndIf}
|
||||||
!insertmacro MUI_LANGDLL_DISPLAY
|
!insertmacro MUI_LANGDLL_DISPLAY
|
||||||
Call ShouldInstall64Bit
|
#Call ShouldInstall64Bit
|
||||||
${If} $0 == 1
|
|
||||||
${If} ${FileExists} "${FFINSTEXE64}\firefox.exe"
|
|
||||||
StrCpy $FFINSTEXE "${FFINSTEXE64}"
|
|
||||||
StrCpy $FFNONTORINSTEXE "${FFINSTEXE64}"
|
|
||||||
${ElseIf} ${FileExists} "${FFINSTEXE32}\firefox.exe"
|
|
||||||
StrCpy $FFINSTEXE "${FFINSTEXE32}"
|
|
||||||
StrCpy $FFNONTORINSTEXE "${FFINSTEXE32}"
|
|
||||||
${EndIf}
|
|
||||||
${If} ${FileExists} "$PROFILE\OneDrive\Desktop\Tor Browser\Browser\firefox.exe"
|
|
||||||
StrCpy $FFINSTEXE "$PROFILE\OneDrive\Desktop\Tor Browser\Browser\"
|
|
||||||
${EndIf}
|
|
||||||
${If} ${FileExists} "$PROFILE\Desktop\Tor Browser\Browser\firefox.exe"
|
|
||||||
StrCpy $FFINSTEXE "$PROFILE\Desktop\Tor Browser\Browser\"
|
|
||||||
${EndIf}
|
|
||||||
${Else}
|
|
||||||
${If} ${FileExists} "${FFINSTEXE32}\firefox.exe"
|
|
||||||
StrCpy $FFINSTEXE "${FFINSTEXE32}"
|
|
||||||
StrCpy $FFNONTORINSTEXE "${FFINSTEXE32}"
|
|
||||||
${EndIf}
|
|
||||||
${If} ${FileExists} "$PROFILE\OneDrive\Desktop\Tor Browser\Browser\firefox.exe"
|
|
||||||
StrCpy $FFINSTEXE "$PROFILE\OneDrive\Desktop\Tor Browser\Browser\"
|
|
||||||
${EndIf}
|
|
||||||
${If} ${FileExists} "$PROFILE\Desktop\Tor Browser\Browser\firefox.exe"
|
|
||||||
StrCpy $FFINSTEXE "$PROFILE\Desktop\Tor Browser\Browser\"
|
|
||||||
${EndIf}
|
|
||||||
${EndIf}
|
|
||||||
# look for user installs
|
# look for user installs
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|
||||||
Function firefoxDetect
|
|
||||||
${If} ${FileExists} "$FFINSTEXE\firefox.exe"
|
|
||||||
Abort directory
|
|
||||||
${EndIf}
|
|
||||||
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 /nonfatal /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 /nonfatal "I2P\config\jpackaged"
|
File /nonfatal "I2P\config\jpackaged"
|
||||||
|
|
||||||
createDirectory "$I2PINSTEXE\"
|
createDirectory "$I2PINSTEXE\"
|
||||||
SetOutPath "$I2PINSTEXE\"
|
SetOutPath "$I2PINSTEXE\"
|
||||||
IfFileExists $I2PINSTEXE\router.config +2 0
|
IfFileExists $I2PINSTEXE\router.config +2 0
|
||||||
File /nonfatal /a /r "I2P/config/router.config"
|
File /a /r "I2P/config/router.config"
|
||||||
IfFileExists $I2PINSTEXE\clients.config +2 0
|
IfFileExists $I2PINSTEXE\clients.config +2 0
|
||||||
File /nonfatal /a /r "I2P/config/clients.config"
|
File /a /r "I2P/config/clients.config"
|
||||||
IfFileExists $I2PINSTEXE\wrapper.config +2 0
|
IfFileExists $I2PINSTEXE\wrapper.config +2 0
|
||||||
File /nonfatal /a /r "I2P/config/wrapper.config"
|
File /a /r "I2P/config/wrapper.config"
|
||||||
|
IfFileExists $I2PINSTEXE\hosts.txt +2 0
|
||||||
|
File /a /r "I2P/config/hosts.txt"
|
||||||
IfFileExists $I2PINSTEXE\eepsite +2 0
|
IfFileExists $I2PINSTEXE\eepsite +2 0
|
||||||
File /nonfatal /a /r "I2P/config/eepsite"
|
File /a /r "I2P/config/eepsite"
|
||||||
IfFileExists $I2PINSTEXE\webapps +2 0
|
IfFileExists $I2PINSTEXE\webapps +2 0
|
||||||
File /nonfatal /a /r "I2P/config/webapps"
|
File /a /r "I2P/config/webapps"
|
||||||
File /nonfatal /a /r "I2P/config/certificates"
|
File /a /r "I2P/config/certificates"
|
||||||
File /nonfatal /a /r "I2P/config/geoip"
|
File /a /r "I2P/config/geoip"
|
||||||
File /nonfatal /a /r "I2P/config/i2ptunnel.config"
|
File /a /r "I2P/config/i2ptunnel.config"
|
||||||
|
|
||||||
Abort directory
|
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|
||||||
Function installerFunction
|
Function installerFunction
|
||||||
@@ -236,27 +194,11 @@ ${If} ${Silent}
|
|||||||
${If} ${Silent}
|
${If} ${Silent}
|
||||||
ReadEnvStr $0 OLD_I2P_VERSION
|
ReadEnvStr $0 OLD_I2P_VERSION
|
||||||
${If} $0 < ${I2P_VERSION}
|
${If} $0 < ${I2P_VERSION}
|
||||||
rmDir /r $I2PINSTEXE/app
|
call routerDetect
|
||||||
rmDir /r $I2PINSTEXE/runtime
|
|
||||||
File /nonfatal /a /r "I2P\"
|
|
||||||
File /nonfatal "I2P\config\jpackaged"
|
|
||||||
|
|
||||||
createDirectory "$I2PINSTEXE\"
|
|
||||||
SetOutPath "$I2PINSTEXE\"
|
|
||||||
File /nonfatal /a /r "I2P/config/certificates"
|
|
||||||
File /nonfatal /a /r "I2P/config/geoip"
|
|
||||||
|
|
||||||
${EndIf}
|
${EndIf}
|
||||||
${Else}
|
${Else}
|
||||||
rmDir /r $I2PINSTEXE/app
|
call routerDetect
|
||||||
rmDir /r $I2PINSTEXE/runtime
|
|
||||||
File /nonfatal /a /r "I2P\"
|
|
||||||
File /nonfatal "I2P\config\jpackaged"
|
|
||||||
|
|
||||||
createDirectory "$I2PINSTEXE\"
|
|
||||||
SetOutPath "$I2PINSTEXE\"
|
|
||||||
File /nonfatal /a /r "I2P/config/certificates"
|
|
||||||
File /nonfatal /a /r "I2P/config/geoip"
|
|
||||||
|
|
||||||
${EndIf}
|
${EndIf}
|
||||||
${EndIf}
|
${EndIf}
|
||||||
@@ -284,12 +226,10 @@ ${If} ${Silent}
|
|||||||
SetOutPath "$I2PINSTEXE"
|
SetOutPath "$I2PINSTEXE"
|
||||||
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" "" "$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" "" "$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
|
||||||
@@ -308,7 +248,7 @@ ${If} ${Silent}
|
|||||||
SetOutPath "$I2PAPPDATA"
|
SetOutPath "$I2PAPPDATA"
|
||||||
|
|
||||||
IfFileExists "$LOCALAPPDATA\I2P\eepsite\docroot" +2 0
|
IfFileExists "$LOCALAPPDATA\I2P\eepsite\docroot" +2 0
|
||||||
File /nonfatal /a /r "I2P\eepsite"
|
File /a /r "I2P\eepsite"
|
||||||
|
|
||||||
createDirectory "$I2PINSTEXE"
|
createDirectory "$I2PINSTEXE"
|
||||||
SetOutPath "$I2PINSTEXE"
|
SetOutPath "$I2PINSTEXE"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
!define I2P_VERSION 1.8.1
|
!define I2P_VERSION 1.9.5
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
!define VERSIONMAJOR 1
|
!define VERSIONMAJOR 1
|
||||||
!define VERSIONMINOR 8
|
!define VERSIONMINOR 9
|
||||||
!define VERSIONBUILD 1
|
!define VERSIONBUILD 5
|
||||||
|
|||||||
@@ -517,7 +517,7 @@ user_pref("security.mixed_content.block_display_content", true);
|
|||||||
* [SETTING] Privacy & Security>HTTPS-Only Mode (and manage exceptions)
|
* [SETTING] Privacy & Security>HTTPS-Only Mode (and manage exceptions)
|
||||||
* [TEST] http://example.com [upgrade]
|
* [TEST] http://example.com [upgrade]
|
||||||
* [TEST] http://httpforever.com/ [no upgrade] ***/
|
* [TEST] http://httpforever.com/ [no upgrade] ***/
|
||||||
user_pref("dom.security.https_only_mode", true); // [FF76+]
|
user_pref("dom.security.https_only_mode", false); // [FF76+]
|
||||||
// user_pref("dom.security.https_only_mode_pbm", true); // [FF80+]
|
// user_pref("dom.security.https_only_mode_pbm", true); // [FF80+]
|
||||||
/* 1245: enable HTTPS-Only mode for local resources [FF77+] ***/
|
/* 1245: enable HTTPS-Only mode for local resources [FF77+] ***/
|
||||||
// user_pref("dom.security.https_only_mode.upgrade_local", true);
|
// user_pref("dom.security.https_only_mode.upgrade_local", true);
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1.8.1
|
1.9.5
|
||||||
|
|||||||
Reference in New Issue
Block a user