Compare commits
38 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
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>
|
||||||
|
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
|
||||||
|
@@ -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>
|
||||||
|
2
build.sh
2
build.sh
@@ -66,7 +66,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
|
||||||
|
@@ -1,3 +1,9 @@
|
|||||||
|
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.
|
||||||
|
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=shared clients
|
||||||
|
tunnel.0.option.outbound.nickname=shared clients
|
||||||
|
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
|
||||||
|
|
@@ -2,16 +2,17 @@
|
|||||||
|
|
||||||
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.22
|
||||||
|
export I2PFIREFOX_VERSION=0.0.22
|
||||||
#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=1
|
||||||
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.1
|
||||||
export VERSION=i2p-1.8.0
|
export VERSION=i2p-jpackage-1.9.1
|
||||||
|
|
||||||
#Uncomment this to build from the tip of the master.
|
#Uncomment this to build from the tip of the master.
|
||||||
#I2P_VERSION=1.8.0
|
#I2P_VERSION=1.8.0
|
||||||
|
@@ -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>
|
||||||
|
@@ -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,238 @@ 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");
|
|
||||||
I2PFirefox i2pFirefox = new I2PFirefox();
|
|
||||||
System.out.println("I2PFirefox");
|
|
||||||
i2pFirefox.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;
|
||||||
|
|
||||||
// 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;
|
logger.info("checking for private browsing");
|
||||||
try (var ignored = new ServerSocket(portNr)) {
|
if (args[0].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.");
|
||||||
|
}
|
||||||
|
if (args[0].equals("-chromium")) {
|
||||||
|
chromiumFirst = true;
|
||||||
|
logger.info("Chromium will be selected before Firefox.");
|
||||||
|
}
|
||||||
|
if (args[0].equals("-usability")) {
|
||||||
|
usabilityMode = true;
|
||||||
|
logger.info(
|
||||||
|
"Usability mode is true, using alternate extensions loadout.");
|
||||||
}
|
}
|
||||||
return portFree;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean i2pIsRunning() {
|
|
||||||
sleep(2000);
|
|
||||||
// check if there's something listening on port 7657(Router Console)
|
|
||||||
if (!isAvailable(7657)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// check if there's something listening on port 7654(I2CP)
|
|
||||||
if (!isAvailable(7654)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// check for the existence of router.ping file, if it's less then 2 minutes old,
|
|
||||||
// exit
|
|
||||||
File home = selectHome();
|
|
||||||
File ping = new File(home, "router.ping");
|
|
||||||
if (ping.exists()) {
|
|
||||||
long diff = System.currentTimeMillis() - ping.lastModified();
|
|
||||||
if (diff < 60 * 1000) {
|
|
||||||
logger.info("router.ping exists and is less than 1 minute old, I2P appears to be running already.");
|
|
||||||
logger.info("If I2P is not running, wait 60 seconds and try again.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Runnable REGISTER_UPP = () -> {
|
File programs = selectProgramFile();
|
||||||
|
if (!programs.exists())
|
||||||
// first wait for the RouterContext to appear
|
programs.mkdirs();
|
||||||
RouterContext ctx;
|
else if (!programs.isDirectory()) {
|
||||||
while ((ctx = (RouterContext) RouterContext.getCurrentContext()) == null) {
|
logger.warning(
|
||||||
sleep(1000);
|
programs +
|
||||||
}
|
" exists but is not a directory. Please get it out of the way");
|
||||||
|
System.exit(1);
|
||||||
// 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 {
|
File home = selectHome();
|
||||||
String path_override = System.getenv("I2P_CONFIG");
|
if (!home.exists())
|
||||||
if (path_override != null) {
|
home.mkdirs();
|
||||||
File path = new File(path_override);
|
else if (!home.isDirectory()) {
|
||||||
if (path != null && path.exists()) {
|
logger.warning(
|
||||||
if (path.isDirectory())
|
home +
|
||||||
return path.getAbsoluteFile();
|
" exists but is not a directory. Please get it out of the way");
|
||||||
else
|
System.exit(1);
|
||||||
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() {
|
if (i2pIsRunning()) {
|
||||||
String path_override = System.getenv("I2P");
|
logger.warning("I2P is already running");
|
||||||
if (path_override != null) {
|
I2PBrowser i2pBrowser = new I2PBrowser();
|
||||||
File path = new File(path_override);
|
i2pBrowser.usability = usabilityMode;
|
||||||
if (path.exists()) {
|
i2pBrowser.chromiumFirst = chromiumFirst;
|
||||||
if (path.isDirectory())
|
i2pBrowser.firefox = !chromiumFirst;
|
||||||
return path.getAbsoluteFile();
|
i2pBrowser.chromium = chromiumFirst;
|
||||||
else
|
System.out.println("I2PBrowser");
|
||||||
throw new RuntimeException("I2P is not a directory: " + path);
|
i2pBrowser.launch(privateBrowsing);
|
||||||
}
|
return;
|
||||||
}
|
|
||||||
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() {
|
System.setProperty("i2p.dir.base", programs.getAbsolutePath());
|
||||||
File log = new File(selectProgramFile(), "log");
|
System.setProperty("i2p.dir.config", home.getAbsolutePath());
|
||||||
if (!log.exists())
|
System.setProperty("router.pid",
|
||||||
log.mkdirs();
|
String.valueOf(ProcessHandle.current().pid()));
|
||||||
return new File(log, "launcher.log");
|
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();
|
||||||
|
|
||||||
|
// 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 i2pIsRunning() {
|
||||||
|
sleep(2000);
|
||||||
|
// check if there's something listening on port 7657(Router Console)
|
||||||
|
if (!isAvailable(7657)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// check if there's something listening on port 7654(I2CP)
|
||||||
|
if (!isAvailable(7654)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// check for the existence of router.ping file, if it's less then 2 minutes
|
||||||
|
// old, exit
|
||||||
|
File home = selectHome();
|
||||||
|
File ping = new File(home, "router.ping");
|
||||||
|
if (ping.exists()) {
|
||||||
|
long diff = System.currentTimeMillis() - ping.lastModified();
|
||||||
|
if (diff < 60 * 1000) {
|
||||||
|
logger.info(
|
||||||
|
"router.ping exists and is less than 1 minute old, I2P appears to be running already.");
|
||||||
|
logger.info("If I2P is not running, wait 60 seconds and try again.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 {
|
||||||
|
String path_override = System.getenv("I2P_CONFIG");
|
||||||
|
if (path_override != null) {
|
||||||
|
File path = new File(path_override);
|
||||||
|
if (path != null && path.exists()) {
|
||||||
|
if (path.isDirectory())
|
||||||
|
return path.getAbsoluteFile();
|
||||||
|
else
|
||||||
|
throw new RuntimeException("I2P_CONFIG is not a directory: " + path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (SystemVersion.isWindows()) {
|
||||||
|
File home = new File(System.getProperty("user.home"));
|
||||||
|
File appData = new File(home, "AppData");
|
||||||
|
File local = new File(appData, "Local");
|
||||||
|
File i2p;
|
||||||
|
i2p = new File(local, "I2P");
|
||||||
|
logger.info("Windows jpackage wrapper started, using: " + i2p +
|
||||||
|
" as base config");
|
||||||
|
return i2p.getAbsoluteFile();
|
||||||
|
} else {
|
||||||
|
File jrehome = new File(System.getProperty("java.home"));
|
||||||
|
File programs = new File(jrehome.getParentFile().getParentFile(), ".i2p");
|
||||||
|
logger.info("Linux portable jpackage wrapper started, using: " +
|
||||||
|
programs + " as base config");
|
||||||
|
return programs.getAbsoluteFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
@@ -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
|
||||||
|
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.1
|
||||||
|
@@ -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,70 +139,42 @@ 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
|
||||||
${If} ${Silent}
|
${If} ${Silent}
|
||||||
${Do}
|
${Do}
|
||||||
${FindProcess} "I2P.exe" $0
|
${FindProcess} "I2P.exe" $0
|
||||||
Sleep 500
|
Sleep 500
|
||||||
@@ -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.1
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
!define VERSIONMAJOR 1
|
!define VERSIONMAJOR 1
|
||||||
!define VERSIONMINOR 8
|
!define VERSIONMINOR 9
|
||||||
!define VERSIONBUILD 1
|
!define VERSIONBUILD 1
|
||||||
|
@@ -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.1
|
||||||
|
Reference in New Issue
Block a user