Compare commits
260 Commits
20220920.j
...
i2p-firefo
Author | SHA1 | Date | |
---|---|---|---|
4246f60930 | |||
601b1db8d5 | |||
c47b7c0f76 | |||
d4cc7dcfdf | |||
58a7ce4fd4 | |||
f8870cd12d | |||
aff0563fc3 | |||
6d460a9042 | |||
8809ddaac7 | |||
958f33db7f | |||
0bfeaaf841 | |||
134ebeb1d0 | |||
b4a3691aae | |||
03748e0c0e | |||
d4a40e8c86 | |||
d38fadc902 | |||
dbb865603a | |||
456b26a860 | |||
62284056c3 | |||
41c06c821c | |||
d32c850ede | |||
f5f4d1c014 | |||
4ad846d151 | |||
6dfeaded43 | |||
57b500a614 | |||
078e542ef0 | |||
81d81adc4c | |||
b82986ccf4 | |||
4ef50bb85a | |||
b8809bed47 | |||
16fc4da41c | |||
2c44a9c8ad | |||
35666caefd | |||
bf89c119a7 | |||
1277dae92b | |||
a4476dc990 | |||
1e959d0aa1 | |||
8f6e7bc83c | |||
fc84098dc9 | |||
52a33b5334 | |||
e055eb8aa9 | |||
8d1eb7e01f | |||
ab1d7047ca | |||
9a190ae75d | |||
38aa89e586 | |||
9b10707f14 | |||
79f3337056 | |||
7a550091f2 | |||
4767e1fba2 | |||
ef99328eed | |||
936966ee4c | |||
07aed0ab00 | |||
d70eb26dbf | |||
df2802bf5d | |||
4fdc0a5dc9 | |||
e619b3fd19 | |||
e1e61ec7b2 | |||
3d7444e33e | |||
b75da98147 | |||
3d70bc5e59 | |||
ab7b24bb0d | |||
9baefba911 | |||
f48d8017c5 | |||
d01d0bb513 | |||
5e26057f9c | |||
8be149e02f | |||
d73832f1f6 | |||
a7ae0ec8f7 | |||
6ec4834a08 | |||
82d111d598 | |||
2ed7e7ef98 | |||
bdf8715ce5 | |||
175e811ac3 | |||
b3ff9d50f8 | |||
31135cc664 | |||
5c91612f90 | |||
c65df41f76 | |||
1a78538525 | |||
8ec161aceb | |||
c76541979a | |||
6f14dc1a3a | |||
7a32f97f29 | |||
790300e996 | |||
6a4aa0b74c | |||
32e26956bf | |||
b8c1c44e66 | |||
0a52d64847 | |||
23e77ef901 | |||
3f419675fe | |||
99a779d89f | |||
2ce03a426c | |||
ab9965e0b8 | |||
6491551577 | |||
ec13b0f94b | |||
11b7096fa5 | |||
1959aac3a8 | |||
1414fe3b53 | |||
03a3487aa7 | |||
bb55985bb8 | |||
95fbcde2dc | |||
157821ef91 | |||
371428e03c | |||
9e90df0181 | |||
893f1f9043 | |||
d76c1ff567 | |||
56be9ed3e0 | |||
e3e19ca4d4 | |||
144e6ba9e0 | |||
b2fdfc1e89 | |||
b1db589787 | |||
a3da3c2ace | |||
5e27d8588a | |||
2a185f5fe3 | |||
f0f194242b | |||
b9c6b6db49 | |||
c14077606b | |||
f53a7759e4 | |||
0566665a24 | |||
9d8da8b65a | |||
cbf693dfb3 | |||
2b24239267 | |||
706ae974bc | |||
d7544ced5f | |||
ec44c0f6e3 | |||
10fe05066c | |||
a5c7bac581 | |||
7eeb2e4523 | |||
9cae0f78ad | |||
99438cfc33 | |||
eba4ebe3d0 | |||
7f24838725 | |||
673725304c | |||
7cf2bf455a | |||
d177435b50 | |||
33fb6ab6d5 | |||
29827366fb | |||
edfe44bc3b | |||
432e2c54f8 | |||
8894c946bc | |||
bc9b4a0250 | |||
35841c7887 | |||
e3afb9de1d | |||
3b11def66c | |||
e152513043 | |||
81dd3ed5ef | |||
0630f77a4c | |||
204fda1a11 | |||
9e1ef2d546 | |||
688bc1b0f3 | |||
dd566165dd | |||
57833edc36 | |||
a19fcd9ea5 | |||
bfddc378cd | |||
fd712293b4 | |||
068fbee70e | |||
377c836887 | |||
99a4959c12 | |||
922ec66f95 | |||
298c87f457 | |||
fcacf59a48 | |||
8d06c9079b | |||
c0fb7dcf67 | |||
019581479b | |||
65fb9e1847 | |||
402cede106 | |||
673d6b469f | |||
dd47ffd902 | |||
b2f92840e5 | |||
0cffa15047 | |||
0a6dae1aac | |||
6e3fcd3285 | |||
57fa862f01 | |||
2225b47459 | |||
78989a8bbd | |||
e7025ae941 | |||
d7423eb595 | |||
4cb8febe3b | |||
039faf8280 | |||
3a17a3926d | |||
e09d2a41ec | |||
848fabd27c | |||
da58c26935 | |||
c84522a244 | |||
d8953824c5 | |||
b67235b2a9 | |||
00bf0f267e | |||
a1d07cffee | |||
c678c6eca2 | |||
2a162fb4c1 | |||
e594ce9bb5 | |||
4a312198ff | |||
f0fb375e13 | |||
f19a5ca002 | |||
45deb5ac28 | |||
7403cf2e8f | |||
046090ea11 | |||
00098cbf53 | |||
c4980a61f0 | |||
20b5ffdb17 | |||
4a6926fcbf | |||
5b12f20406 | |||
da29268898 | |||
79f016cb1c | |||
e19ce19368 | |||
2e4f110c30 | |||
1bb8238e68 | |||
6bfec5d6ef | |||
f7c6251f30 | |||
1a1e25a52f | |||
b8b19786b1 | |||
8c2c839337 | |||
f56771ac8a | |||
e0d5d61518 | |||
c4c40eee8f | |||
2db71e402d | |||
6e9df08473 | |||
b98b488f70 | |||
52b34a5d6a | |||
c1b20d4f2b | |||
c656b80674 | |||
4ceddb976d | |||
8f14378aee | |||
c5af86adfd | |||
9469293bcf | |||
44ce8335a1 | |||
8a9ce211f3 | |||
037250ae46 | |||
f93c4660da | |||
2f516f0c11 | |||
f3d871d64b | |||
51a82601f0 | |||
85e30d36d7 | |||
7e21d86ab4 | |||
6fbe64d8e2 | |||
91beec4f75 | |||
5f3a3d46f6 | |||
23d013765a | |||
b3ff2dfdbf | |||
d58aeb6b19 | |||
5d2e5dc69b | |||
8fd6d6f45f | |||
7f0d5eb0b2 | |||
cd8be4196e | |||
3548ea0ed6 | |||
730b9ed267 | |||
67e0b87d97 | |||
1424913447 | |||
c0cb68f972 | |||
52c91e1e65 | |||
9e6ea435af | |||
308055143f | |||
53f731f945 | |||
7ec56455cd | |||
c11f982088 | |||
58e1276072 | |||
20240c9e75 | |||
4079d6a8b1 | |||
8b893d1116 | |||
0d209bb2a8 | |||
186493b154 |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@ -0,0 +1 @@
|
||||
* -text
|
118
.github/workflows/ant.yml
vendored
Normal file
118
.github/workflows/ant.yml
vendored
Normal file
@ -0,0 +1,118 @@
|
||||
|
||||
name: Java CI
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
|
||||
nsis:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: Vampire/setup-wsl@v3
|
||||
with:
|
||||
distribution: Ubuntu-20.04
|
||||
- name: Set git to use LF
|
||||
run: |
|
||||
git config --global core.autocrlf false
|
||||
git config --global core.eol lf
|
||||
git config --global user.email "github@i2p.net"
|
||||
git config --global user.name "eyedeekay Github CI Build"
|
||||
- uses: actions/checkout@v4
|
||||
- run: wsl apt-get update
|
||||
- run: wsl apt-get install -y nsis nsis-common nsis-pluginapi wget dos2unix curl jq gpg gettext
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '21'
|
||||
distribution: 'temurin'
|
||||
- name: build with script
|
||||
run: bash -c "./buildscripts/unsigned.sh; ls *.exe"
|
||||
- name: Upload I2P-Easy-Install-Bundle-unsigned.exe
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: I2P-Easy-Install-Bundle-unsigned.exe
|
||||
path: I2P-Easy-Install-Bundle-*.exe
|
||||
|
||||
buildjpackagexe:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '21'
|
||||
distribution: 'temurin'
|
||||
- name: build with script
|
||||
run: bash -c "./buildscripts/exe.sh; ls *.exe"
|
||||
- name: Upload I2P-Easy-Install-Bundle-unsigned.exe
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: I2P-EXE-unsigned.exe
|
||||
path: I2P-EXE-*.exe
|
||||
|
||||
buildjpackagmsi:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '21'
|
||||
distribution: 'temurin'
|
||||
- name: build with script
|
||||
run: bash -c "./buildscripts/msi.sh; ls *.msi"
|
||||
- name: Upload I2P-Easy-Install-Bundle-unsigned.msi
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: I2P-MSI-unsigned.msi
|
||||
path: I2P-MSI-*.msi
|
||||
|
||||
buildzip:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: Vampire/setup-wsl@v3
|
||||
with:
|
||||
distribution: Ubuntu-20.04
|
||||
- name: Set git to use LF
|
||||
run: |
|
||||
git config --global core.autocrlf false
|
||||
git config --global core.eol lf
|
||||
git config --global user.email "github@i2p.net"
|
||||
git config --global user.name "eyedeekay Github CI Build"
|
||||
- uses: actions/checkout@v4
|
||||
- run: wsl apt-get update
|
||||
- run: wsl apt-cache search 7zip
|
||||
- run: wsl apt-get install -y nsis nsis-common nsis-pluginapi wget dos2unix curl jq gpg gettext zip p7zip-full ca-certificates
|
||||
- run: choco install wget
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '21'
|
||||
distribution: 'temurin'
|
||||
- name: build with script
|
||||
run: bash -c "./buildscripts/zip.sh; ls -d * */* "
|
||||
- name: Upload I2P-windows-portable.zip
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: I2P-windows-portable.zip
|
||||
path: I2P-windows-portable.zip
|
||||
|
||||
buildtgz:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '21'
|
||||
distribution: 'temurin'
|
||||
- run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y nsis nsis-common nsis-pluginapi wget dos2unix curl jq gpg gettext
|
||||
- name: build with script
|
||||
run: ./buildscripts/targz.sh; ls *.tar.gz
|
||||
- name: Upload I2P.tar.gz
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: I2P.tar.gz
|
||||
path: I2P.tar.gz
|
90
.github/workflows/release.yml
vendored
Normal file
90
.github/workflows/release.yml
vendored
Normal file
@ -0,0 +1,90 @@
|
||||
name: Release
|
||||
|
||||
#on: [push]
|
||||
|
||||
on:
|
||||
push:
|
||||
# Sequence of patterns matched against refs/tags
|
||||
tags:
|
||||
- 'i2p-firefox-*.*.*' # Release i2p-firefox-1.2.3
|
||||
- 'i2p-firefox-*.*.*-*' # Release i2p-firefox-1.2.3
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
sparse-checkout: |
|
||||
changelog.txt docs/RELEASE.md
|
||||
sparse-checkout-cone-mode: false
|
||||
- name: sleep 15 minutes
|
||||
run: |
|
||||
echo "sleeping 20 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 19 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 18 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 17 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 16 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 15 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 14 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 13 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 12 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 11 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 10 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 9 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 8 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 7 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 6 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 5 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 4 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 3 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 2 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 1 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
- name: Download artifacts
|
||||
id: download-artifact
|
||||
uses: dawidd6/action-download-artifact@v3
|
||||
with:
|
||||
skip_unpack: true
|
||||
workflow: ant.yml
|
||||
if_no_artifact_found: fail
|
||||
# remove .zip file extension
|
||||
- run: for f in *.zip; do unzip "$f"; rm "$f"; done
|
||||
- run: echo "" | tee -a changelog.txt
|
||||
- run: echo "## Checksums" | tee -a changelog.txt
|
||||
- run: echo "" | tee -a changelog.txt
|
||||
- run: echo '```' | tee -a changelog.txt
|
||||
- run: sha256sum * | tee -a changelog.txt
|
||||
- run: echo '```' | tee -a changelog.txt
|
||||
- run: echo "" | tee -a changelog.txt
|
||||
- run: echo '```' | tee -a changelog.txt
|
||||
- run: file * | tee -a changelog.txt
|
||||
- run: echo '```' | tee -a changelog.txt
|
||||
- run: echo "" | tee -a changelog.txt
|
||||
- run: cat docs/RELEASE.md changelog.txt > RELEASE.md
|
||||
- name: Upload artifacts
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: "*"
|
||||
bodyFile: "RELEASE.md"
|
9
.gitignore
vendored
9
.gitignore
vendored
@ -21,4 +21,11 @@ cmd
|
||||
*.jar
|
||||
*.zip
|
||||
*.tar.gz
|
||||
config_override.sh
|
||||
config_override.sh
|
||||
i2pkeys
|
||||
onionkeys
|
||||
tlskeys
|
||||
tmp
|
||||
/.stfolder/
|
||||
/.vscode/
|
||||
*github-release-config*.sh*
|
46
Dockerfile
Normal file
46
Dockerfile
Normal file
@ -0,0 +1,46 @@
|
||||
FROM debian:sid
|
||||
|
||||
## Originally found at: https://yusuke.blog/2021/10/19/3149 and updated to Java 20.
|
||||
## This does not work yet.
|
||||
|
||||
RUN dpkg --add-architecture i386
|
||||
RUN apt-get update
|
||||
RUN apt-get install -y curl fakeroot unzip gnupg dos2unix make nsis* dos2unix curl jq
|
||||
|
||||
# install JDK
|
||||
RUN curl --output /opt/java20.zip https://download.java.net/java/GA/jdk20.0.1/b4887098932d415489976708ad6d1a4b/9/GPL/openjdk-20.0.1_windows-x64_bin.zip \
|
||||
&& cd /opt/ \
|
||||
&& unzip java20.zip \
|
||||
&& rm java20.zip
|
||||
ENV JAVA_HOME /opt/jdk-20.0.1
|
||||
|
||||
# install Wine
|
||||
RUN apt-get update
|
||||
RUN apt install --install-recommends wine wine64* wine-binfmt fonts-wine -y
|
||||
RUN wine --version
|
||||
RUN wine wineboot --init
|
||||
|
||||
# install WIX TOOLSET
|
||||
RUN mkdir /opt/wix311 \
|
||||
&& cd /opt/wix311 \
|
||||
&& curl -L --output /opt/wix311/wix311.zip https://github.com/wixtoolset/wix3/releases/download/wix3112rtm/wix311-binaries.zip \
|
||||
&& unzip wix311.zip \
|
||||
&& rm wix311.zip
|
||||
|
||||
# WIX TOOLSET is requring .NET.
|
||||
RUN curl --output winetricks https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks &&\
|
||||
chmod +x winetricks && \
|
||||
mv -v winetricks /usr/local/bin
|
||||
|
||||
# DONNO why dotnet48 installation fails with "warning: exit status 5 - user selected 'Cancel' "
|
||||
# https://forum.winehq.org/viewtopic.php?f=8&t=35724
|
||||
#ENV WINEPREFIX=/dotnet-test
|
||||
#RUN /usr/local/bin/winetricks --optout -q dotnet48
|
||||
|
||||
ENV WINEPATH /opt/jdk-20.0.1/bin\;/opt/wix311
|
||||
|
||||
WORKDIR /root
|
||||
COPY . /root
|
||||
RUN echo "wine /opt/jdk-20.0.1/bin/jpackage.exe $@" > /opt/jdk-20.0.1/bin/jpackage
|
||||
RUN chmod +x /opt/jdk-20.0.1/bin/jpackage
|
||||
CMD ./buildscripts/build.sh
|
126
Makefile
126
Makefile
@ -7,89 +7,37 @@ preset=`rm .version; make version`
|
||||
|
||||
-include .version
|
||||
|
||||
PROFILE_VERSION=$(MAJOR).$(MINOR).$(BUILD)
|
||||
PROFILE_VERSION=$(VERSIONMAJOR).$(VERSIONMINOR).$(VERSIONBUILD)
|
||||
|
||||
all: version prep install.exe
|
||||
all: version install.exe
|
||||
|
||||
tag:
|
||||
git tag $(PROFILE_VERSION)
|
||||
fmt:
|
||||
find . -name '*.java' -exec clang-format -i {} \;
|
||||
|
||||
version:
|
||||
echo !define VERSIONMAJOR $(VERSIONMAJOR) > src/nsis/i2pbrowser-version.nsi
|
||||
echo !define VERSIONMINOR $(VERSIONMINOR) >> src/nsis/i2pbrowser-version.nsi
|
||||
echo !define VERSIONBUILD $(VERSIONBUILD) >> src/nsis/i2pbrowser-version.nsi
|
||||
sed 's|!define VERSION||g' src/nsis/i2pbrowser-version.nsi | sed 's| |=|g' > .version
|
||||
rm -f version.txt
|
||||
make version.txt i2pbrowser-jpackage.nsi
|
||||
./buildscripts/version.sh
|
||||
|
||||
version.txt:
|
||||
echo "$(PROFILE_VERSION)" > src/profile/version.txt
|
||||
echo "$(PROFILE_VERSION)" > src/app-profile/version.txt
|
||||
|
||||
i2pbrowser-jpackage.nsi:
|
||||
echo "!define I2P_VERSION $(PROFILE_VERSION)" > src/nsis/i2pbrowser-jpackage.nsi
|
||||
|
||||
jpackage: version I2P build/I2P/config all
|
||||
jpackage: version I2P build/I2P all
|
||||
|
||||
help: version
|
||||
@echo "I2P-Easy-Install-Bundle-$(PROFILE_VERSION)"
|
||||
@echo "$(SIGNER)"
|
||||
@echo "$(I2P_VERSION)"
|
||||
@echo "$(MAJOR).$(MINOR).$(BUILD)"
|
||||
@echo "$(preset)"
|
||||
|
||||
prep: #launchers build/licenses profile.tgz app-profile.tgz profile build/I2P build/I2P/config #
|
||||
make build/licenses
|
||||
echo "licenses" >make.log
|
||||
make build/I2P
|
||||
echo "buildi2p" >make.log
|
||||
make build/I2P/config
|
||||
echo "buildi2pconfig" >make.log
|
||||
cp src/nsis/*.nsi build
|
||||
echo "nsi1" >make.log
|
||||
cp src/nsis/*.nsh build
|
||||
echo "nsi2" >make.log
|
||||
cp src/icons/*.ico build
|
||||
|
||||
install.exe: #build/licenses
|
||||
cd build && makensis i2pbrowser-installer.nsi && cp I2P-Easy-Install-Bundle-*.exe ../ && echo "built windows installer"
|
||||
|
||||
export RES_DIR="../i2p.i2p.jpackage-build/installer/resources"
|
||||
export PKG_DIR="../i2p.i2p.jpackage-build/pkg-temp"
|
||||
export I2P_JBIGI="../i2p.i2p.jpackage-build/installer/lib/jbigi"
|
||||
install.exe:
|
||||
./buildscripts/unsigned.sh
|
||||
|
||||
distclean: clean
|
||||
rm -rf I2P
|
||||
|
||||
I2P:
|
||||
./build.sh
|
||||
./buildscripts/build.sh
|
||||
|
||||
build/I2P: I2P build
|
||||
rm -rf build/I2P
|
||||
cp -rv I2P build/I2P ; true
|
||||
cp "$(I2P_JBIGI)"/*windows*.dll build/I2P/runtime/lib; true
|
||||
cp -v I2P build/I2P
|
||||
|
||||
src/I2P/config:
|
||||
mkdir -p src/I2P/config
|
||||
rm -rf src/I2P/config/geoip src/I2P/config/webapps src/I2P/config/certificates
|
||||
echo true | tee src/I2P/config/jpackaged
|
||||
cp -v $(RES_DIR)/clients.config src/I2P/config/
|
||||
cp -v $(RES_DIR)/wrapper.config src/I2P/config/
|
||||
#grep -v 'router.updateURL' $(RES_DIR)/router.config > src/I2P/config/router.config
|
||||
cat router.config > src/I2P/config/router.config
|
||||
cat i2ptunnel.config > src/I2P/config/i2ptunnel.config
|
||||
cp -v $(RES_DIR)/hosts.txt src/I2P/config/hosts.txt
|
||||
cp -R $(RES_DIR)/certificates src/I2P/config/certificates
|
||||
cp -R $(RES_DIR)/eepsite src/I2P/config/eepsite
|
||||
mkdir -p src/I2P/config/geoip
|
||||
cp -v $(RES_DIR)/GeoLite2-Country.mmdb.gz src/I2P/config/geoip/GeoLite2-Country.mmdb.gz
|
||||
cp -R "$(PKG_DIR)"/webapps src/I2P/config/webapps
|
||||
cd src/I2P/config/geoip && gunzip GeoLite2-Country.mmdb.gz; cd ../../..
|
||||
|
||||
build/I2P/config: src/I2P/config build/I2P
|
||||
cp -rv src/I2P/config build/I2P/config
|
||||
# cp -rv build/I2P/* I2P/
|
||||
# cp -rv src/I2P/config build/I2P/.i2p
|
||||
build/I2P: build/I2P
|
||||
|
||||
#
|
||||
# Warning: a displayed license file of more than 28752 bytes
|
||||
@ -97,60 +45,12 @@ build/I2P/config: src/I2P/config build/I2P
|
||||
# Possibly related: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=895064
|
||||
#
|
||||
build/licenses: build
|
||||
mkdir -p build/licenses
|
||||
cp license/* build/licenses
|
||||
cp LICENSE.md build/licenses/MIT.txt
|
||||
cat build/licenses/LICENSE.index \
|
||||
build/licenses/EPL.txt \
|
||||
build/licenses/GPL+CLASSPATH.txt \
|
||||
build/licenses/HTTPS-Everywhere.txt \
|
||||
build/licenses/LICENSE.tor \
|
||||
build/licenses/MIT.txt \
|
||||
build/licenses/MPL2.txt \
|
||||
build/licenses/NoScript.txt \
|
||||
build/licenses/NSS.txt \
|
||||
build/licenses/I2P.txt > build/licenses/LICENSE.txt
|
||||
unix2dos build/licenses/LICENSE.txt
|
||||
./buildscripts/licenses.sh
|
||||
|
||||
clean:
|
||||
rm -rf build app-profile-*.tgz profile-*.tgz I2P-Easy-Install-Bundle-*.exe *.deb src/I2P/config *.su3 .version *.url make.log
|
||||
git clean -fdx src build
|
||||
./buildscripts/clean.sh
|
||||
|
||||
build:
|
||||
@echo "creating build directory"
|
||||
mkdir -p build
|
||||
|
||||
include makefiles/su.mk
|
||||
|
||||
include makefiles/su-unsigned.mk
|
||||
|
||||
include makefiles/debian.mk
|
||||
|
||||
I2P_DATE=`date +%Y-%m-%d`
|
||||
|
||||
MAGNET=`bttools torrent printinfo i2pwinupdate.su3.torrent | grep 'MagNet' | sed 's|MagNet: ||g' | sed 's|%3A|:|g'| sed 's|%2F|/|g'`
|
||||
MAGNET_TESTING=`bttools torrent printinfo i2pwinupdate-testing.su3.torrent | grep 'MagNet' | sed 's|MagNet: ||g' | sed 's|%3A|:|g'| sed 's|%2F|/|g'`
|
||||
|
||||
BLANK=`awk '! NF { print NR; exit }' changelog.txt`
|
||||
|
||||
I2P.zip: I2P-jpackage-windows-$(I2P_VERSION).zip
|
||||
|
||||
I2P-jpackage-windows-$(I2P_VERSION).zip:
|
||||
sh -c 'powershell Compress-Archive I2P I2P-jpackage-windows-$(I2P_VERSION).zip || zip I2P-jpackage-windows-$(I2P_VERSION).zip -r I2P'
|
||||
|
||||
changelog:
|
||||
head -n "$(BLANK)" changelog.txt
|
||||
|
||||
release-jpackage: I2P-jpackage-windows-$(I2P_VERSION).zip
|
||||
head -n "$(BLANK)" changelog.txt | gothub release -p -u eyedeekay -r i2p -t i2p-jpackage-windows-$(I2P_VERSION) -n i2p-jpackage-windows-$(I2P_VERSION) -d -; true
|
||||
|
||||
update-release-jpackage:
|
||||
head -n "$(BLANK)" changelog.txt | gothub edit -p -u eyedeekay -r i2p -t i2p-jpackage-windows-$(I2P_VERSION) -n i2p-jpackage-windows-$(I2P_VERSION) -d -; true
|
||||
|
||||
delete-release-jpackage:
|
||||
gothub delete -u eyedeekay -r i2p -t i2p-jpackage-windows-$(I2P_VERSION); true
|
||||
|
||||
upload-release-jpackage:
|
||||
gothub upload -R -u eyedeekay -r i2p -t i2p-jpackage-windows-$(I2P_VERSION) -n "i2p-jpackage-windows-$(I2P_VERSION)" -f "./I2P-jpackage-windows-$(I2P_VERSION).zip"
|
||||
|
||||
jpackage-release: release-jpackage upload-release-jpackage
|
||||
|
85
README.md
85
README.md
@ -1,5 +1,5 @@
|
||||
I2P Easy-Install Bundle for Windows(Also/formerly)I2P Browsing Profile for Firefox
|
||||
==================================================================================
|
||||
I2P Easy-Install Bundle for Windows, (Formerly)I2P Browsing Profile for Firefox
|
||||
===============================================================================
|
||||
|
||||
Features:
|
||||
---------
|
||||
@ -13,6 +13,13 @@ Features:
|
||||
Build Dependencies:
|
||||
-------------------
|
||||
|
||||
**SHORTCUT:** All the build artifacts can be produced by the description in the `.yaml` files in `.github/workflows`.
|
||||
These can be run on Github's infrastructure, or on a local(Windows) PC using https://github.com/nektos/act.
|
||||
Doing things this way deals with all the dependency issues that Windows doesn't really give you a good way to deal with automatically.
|
||||
It also guarantees that the same base container and environment gets used for every build no matter what machine it runs on.
|
||||
I highly recommend you use either Github CI or `nektos/act` for dev builds of this software, as it **automates literally every one of the steps**.
|
||||
CI-based builds follow the `WSL` version of the instructions.
|
||||
|
||||
To build this, you will need the following software packages
|
||||
(all available in Debian and Ubuntu, see WSL section below):
|
||||
|
||||
@ -57,7 +64,7 @@ The Windows build tools listed above must be installed on the Windows host machi
|
||||
TODO: Add links to the respective instructions for each of these.
|
||||
|
||||
**Note that after the dependencies are installed, this step is automated**
|
||||
**with `./build.sh`.**
|
||||
**with `./buildscripts/build.sh`.**
|
||||
|
||||
In order to include a jpackaged(dependency-free) I2P router in the Profile
|
||||
Bundle you will need to build the jpackaged I2P router as an "App Image" on
|
||||
@ -127,10 +134,10 @@ Ubuntu in WSL.
|
||||
ant clean pkg
|
||||
cd ..
|
||||
|
||||
7. Move into the i2p.firefox directory. Run the `./build.sh` script.
|
||||
7. Move into the i2p.firefox directory. Run the `./buildscripts/build.sh` script.
|
||||
|
||||
cd i2p.firefox
|
||||
./build.sh
|
||||
./buildscripts/build.sh
|
||||
|
||||
8. Compile the NSIS installer using WSL.
|
||||
|
||||
@ -143,18 +150,9 @@ I highly recommend you look into the Chocolatey package manager, which makes it
|
||||
easier to configure these tools and keep them up to date.
|
||||
|
||||
**Prerequisites:** In addition to the other prerequisites, you will need to to have
|
||||
`make` installed with `cygwin`. If you are using this method, you cannot use the
|
||||
automated build scripts without a hack. You will need to create a file called `wsl`
|
||||
in a place that is in the path used by `git-bash.exe` sessions, with the content:
|
||||
|
||||
```
|
||||
#! /usr/bin/env bash
|
||||
$@
|
||||
```
|
||||
|
||||
For our purposes, as long as everything else is set up and you're using git bash,
|
||||
that is enough to make the scripts compatible with `cygwin`. Cygwin builds without
|
||||
git bash are not likely to work.
|
||||
`make` installed with `cygwin`. For our purposes, as long as everything else is
|
||||
set up and you're using git bash, that is enough to make the scripts compatible with
|
||||
`cygwin`. Cygwin builds without git bash are not likely to work.
|
||||
|
||||
1. Run the Cygwin `setup-$arch.exe` for your platform to set up new packages. Select the `make` `jq` `dos2unix` and `curl` packages.
|
||||
2. Open a cygwin terminal.
|
||||
@ -170,12 +168,10 @@ git bash are not likely to work.
|
||||
ant clean pkg
|
||||
cd ..
|
||||
|
||||
5. Move into the i2p.firefox directory. Run the `./build.sh` script.
|
||||
5. Move into the i2p.firefox directory. Run the `./buildscripts/unsigned.sh` script.
|
||||
|
||||
cd i2p.firefox
|
||||
./build.sh
|
||||
|
||||
6. Run `make` to build the installer.
|
||||
./buildscripts/unsigned.sh
|
||||
|
||||
Doing a Release
|
||||
---------------
|
||||
@ -189,52 +185,7 @@ bundle is Zlatinb. Standard Windows signing tools are used.
|
||||
./release.sh
|
||||
```
|
||||
|
||||
produces the binary.
|
||||
|
||||
Building a signed update file
|
||||
-----------------------------
|
||||
|
||||
Building a signed update file for automatically updating a Windows I2P router
|
||||
requires you to either be using linux, or have Go installed in your Cygwin or WSL environment.
|
||||
On Linux(Where I sign the su3 files), this works:
|
||||
|
||||
make su3
|
||||
|
||||
to run the signing tool if necessary and then package the installer in a
|
||||
signed update file.
|
||||
|
||||
Docker Support
|
||||
--------------
|
||||
|
||||
**MOVED, DEPRECATION NOTICE:** Most of this functionality has been moved
|
||||
to http://git.idk.i2p/idk/i2p.plugins.firefox which is more stable,
|
||||
easier to build and use, and easier to incorporate into other
|
||||
projects.
|
||||
|
||||
- https://git.idk.i2p/idk/i2p.plugins.firefox/-/blob/main/docker.sh
|
||||
|
||||
Unix Support
|
||||
------------
|
||||
|
||||
**MOVED. DEPRECATION NOTICE:** Most of this functionality has been moved
|
||||
to http://git.idk.i2p/idk/i2p.plugins.firefox which is more stable,
|
||||
easier to build and use, and easier to incorporate into other
|
||||
projects. It is the better option for nearly every non-Windows case
|
||||
right now. You can get binary packages from:
|
||||
|
||||
- https://github.com/eyedeekay/i2p.plugins.firefox/releases
|
||||
|
||||
or look at
|
||||
|
||||
- https://i2pgit.org/idk/i2p.plugins.firefox/-/blob/master/PACKAGES.md
|
||||
|
||||
for instructions on how to build your own packages. These packages are
|
||||
unofficial! Although I do dogfood most of them and the `.jar` gets thorough
|
||||
testing.
|
||||
|
||||
**The only remotely interesting Unix functionality that remains in this**
|
||||
**repository is the construction of a portable. You can use `targz.sh` to**
|
||||
**generate that.**
|
||||
produces the binary and the su3.
|
||||
|
||||
Issues
|
||||
------
|
||||
|
29
UPDATES.md
29
UPDATES.md
@ -1,29 +0,0 @@
|
||||
Setting up an Update Server for an I2P Bundle
|
||||
=============================================
|
||||
|
||||
It is important to set up a signed update server so that people are able to
|
||||
safely and anonymously update your I2P bundle.
|
||||
|
||||
The quick way:
|
||||
--------------
|
||||
|
||||
This process depends on my ability to push releases to github. If you are
|
||||
forking, setting up a dev server, or taking over because I got hit by a bus,
|
||||
you'll need to do it the complete way.
|
||||
|
||||
For as long as I am building updates, you will be able to mirror the jpackaged
|
||||
Windows bundle by cloning the repository `https://github.com/eyedeekay/i2p` and
|
||||
running the `make docker run` target in that repository. You can retrieve the
|
||||
base32 address of your update server by viewing the log with
|
||||
`docker logs eephttpd-jpackage | grep b32.i2p | tee eephttpd-address.md`. To
|
||||
update the site, run `./update.site.sh` in that repository.
|
||||
|
||||
Once you have cloned the repository and started the container with
|
||||
`make docker run`, you can simply add `path/to/repo/update-site.sh` to your
|
||||
`crontab` and it will update at an interval of your choosing.
|
||||
|
||||
The complete way:
|
||||
-----------------
|
||||
|
||||
TODO: describe how to do it with less of the awesome fancy stuff I put together
|
||||
to make it easier on myself to keep an update server going.
|
@ -1,4 +0,0 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
curl -s "https://addons.mozilla.org/api/v5/addons/addon/$1/versions/?page_size=1" | jq '.results | .[0] | .file | .url' | tr -d '"'
|
||||
|
47
build.sh
47
build.sh
@ -1,47 +0,0 @@
|
||||
#! /usr/bin/env bash
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f config_overide.sh ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DIR/launcher.sh"
|
||||
|
||||
if [ -z $I2P_VERSION ]; then
|
||||
I2P_VERSION=$("$JAVA_HOME"/bin/java -cp build/router.jar net.i2p.router.RouterVersion | sed "s/.*: //" | head -n 1 | sed 's|-|.|g')
|
||||
fi
|
||||
echo "preparing to invoke jpackage for I2P version $I2P_VERSION"
|
||||
|
||||
rm -rf I2P
|
||||
|
||||
make src/I2P/config
|
||||
|
||||
"$JAVA_HOME"/bin/jpackage --type app-image --name I2P --app-version "$I2P_VERSION" \
|
||||
--verbose \
|
||||
--java-options "-Xmx512m" \
|
||||
--java-options "--add-opens java.base/java.lang=ALL-UNNAMED" \
|
||||
--java-options "--add-opens java.base/sun.nio.fs=ALL-UNNAMED" \
|
||||
--java-options "--add-opens java.base/java.nio=ALL-UNNAMED" \
|
||||
--java-options "--add-opens java.base/java.util.Properties=ALL-UNNAMED" \
|
||||
--java-options "--add-opens java.base/java.util.Properties.defaults=ALL-UNNAMED" \
|
||||
$JPACKAGE_OPTS \
|
||||
--resource-dir build \
|
||||
--app-content src/I2P/config \
|
||||
--app-content src/icons/windowsUIToopie2.png \
|
||||
--app-content src/icons/ui2pbrowser_icon.ico \
|
||||
--icon src/icons/windowsUIToopie2.png \
|
||||
--input build --main-jar launcher.jar --main-class net.i2p.router.WinLauncher
|
||||
|
||||
cp "$I2P_PKG/licenses/"* license/
|
||||
cp "$HERE/../i2p.i2p.jpackage-build/LICENSE.txt" license/I2P.txt
|
83
buildscripts/build.sh
Executable file
83
buildscripts/build.sh
Executable file
@ -0,0 +1,83 @@
|
||||
#! /usr/bin/env bash
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f config_overide.sh ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
"$SCRIPT_DIR"/buildscripts/version.sh
|
||||
"$SCRIPT_DIR"/buildscripts/licenses.sh
|
||||
|
||||
if [ -z $machine ]; then
|
||||
unameOut="$(uname -s)"
|
||||
case "${unameOut}" in
|
||||
Linux*) machine=Linux;;
|
||||
Darwin*) machine=Mac;;
|
||||
*) machine="UNKNOWN:${unameOut}"
|
||||
esac
|
||||
fi
|
||||
|
||||
ICON="$SCRIPT_DIR/src/icons/ui2pbrowser_icon.ico"
|
||||
|
||||
if [ "$machine" = "Mac" ]; then
|
||||
rm -rf I2P
|
||||
"$SCRIPT_DIR"/buildscripts/getprebuilt.sh
|
||||
exit 0
|
||||
elif [ "$machine" = "Linux" ]; then
|
||||
rm -rf I2P
|
||||
"$SCRIPT_DIR"/buildscripts/getprebuilt.sh
|
||||
exit 0
|
||||
elif [ "$machine" = "unix" ]; then
|
||||
ICON="$SCRIPT_DIR"/src/icons/windowsUIToopie2.png
|
||||
export EXTRACODE="unix"
|
||||
export EXTRA=" public final static String EXTRA = \"-$EXTRACODE\";"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DI"$SCRIPT_DIR"/buildscripts/launcher.sh"
|
||||
|
||||
if [ -z $I2P_VERSION ]; then
|
||||
I2P_VERSION=$("$JAVA_HOME"/bin/java -cp $SCRIPT_DIR/build/router.jar net.i2p.router.RouterVersion | sed "s/.*: //" | head -n 1 | sed 's|-|.|g')
|
||||
fi
|
||||
|
||||
echo "preparing to invoke jpackage for I2P version $I2P_VERSION"
|
||||
|
||||
rm -rf I2P
|
||||
|
||||
if [ ! -d "I2P" ]; then
|
||||
"$JAVA_HOME"/bin/jpackage --type app-image --name I2P --app-version "$I2P_VERSION" \
|
||||
--verbose \
|
||||
--java-options "-Xmx512m" \
|
||||
--java-options "--add-opens java.base/java.lang=ALL-UNNAMED" \
|
||||
--java-options "--add-opens java.base/sun.nio.fs=ALL-UNNAMED" \
|
||||
--java-options "--add-opens java.base/java.nio=ALL-UNNAMED" \
|
||||
--java-options "--add-opens java.base/java.util.Properties=ALL-UNNAMED" \
|
||||
--java-options "--add-opens java.base/java.util.Properties.defaults=ALL-UNNAMED" \
|
||||
$JPACKAGE_OPTS \
|
||||
--resource-dir $SCRIPT_DIR/build \
|
||||
--app-content "$SCRIPT_DIR"/src/I2P/config \
|
||||
--app-content "$SCRIPT_DIR"/src/unix/torbrowser.sh \
|
||||
--app-content "$SCRIPT_DIR"/src/win/torbrowser-windows.sh \
|
||||
--app-content "$SCRIPT_DIR"/src/icons/windowsUIToopie2.png \
|
||||
--app-content "$SCRIPT_DIR"/src/icons/ui2pbrowser_icon.ico \
|
||||
--icon "${ICON}" \
|
||||
--input $SCRIPT_DIR/build --main-jar launcher.jar --main-class net.i2p.router.WinLauncher
|
||||
fi
|
||||
|
||||
cp "$I2P_PKG/licenses/"* license/
|
||||
cp "$SCRIPT_DIR/../i2p.i2p.jpackage-build/LICENSE.txt" license/I2P.txt
|
||||
|
||||
|
||||
mkdir -p "$SCRIPT_DIR"/build/I2P
|
||||
cp -rv "$SCRIPT_DIR"/I2P/* "$SCRIPT_DIR"/build/I2P
|
||||
cp -rv src/I2P/config build/I2P/config
|
@ -1,6 +1,6 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
@ -31,4 +31,5 @@ rm -rf \
|
||||
*.jar \
|
||||
*.exe \
|
||||
*.dmg
|
||||
make clean
|
||||
rm -rf build app-profile-*.tgz profile-*.tgz I2P-Easy-Install-Bundle-*.exe *.deb src/I2P/config *.su3 .version *.url make.log
|
||||
git clean -fdx src build onionkeys tlskeys i2pkeys
|
@ -1,6 +1,6 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
@ -25,7 +25,7 @@ fi
|
||||
# GITHUB_USERNAME=your github username
|
||||
git clean -fd
|
||||
git checkout .
|
||||
./targz.sh
|
||||
"$SCRIPT_DIR"/buildscripts/targz.sh
|
||||
|
||||
. "$HOME/github-release-config.sh"
|
||||
|
||||
@ -50,3 +50,4 @@ sleep 2s
|
||||
ZIPCHECKSUM=$(sha256sum "I2P.tar.gz")
|
||||
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P.tar.gz" -l "$ZIPCHECKSUM" -t "$TODAYSDATE" -n "I2P.tar.gz"
|
||||
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P.tar.gz" -l "$ZIPCHECKSUM" -t "$TODAYSDATE" -n "I2P.tar.gz"
|
||||
|
52
buildscripts/daily-portable-windows.sh
Executable file
52
buildscripts/daily-portable-windows.sh
Executable file
@ -0,0 +1,52 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f config_overide.sh ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
### How to set up this script:
|
||||
#
|
||||
# This script will not work unless you give it a Github API key.
|
||||
# You need to create a file in your $HOME directory, which on
|
||||
# Windows will by /c/Users/yourusername, called github-release-config.sh,
|
||||
# containing this key as the variable GITHUB_TOKEN.
|
||||
# github-release-config.sh must also contain:
|
||||
# GITHUB_USERNAME=your github username
|
||||
git clean -fd
|
||||
git checkout .
|
||||
|
||||
. "$HOME/github-release-config.sh"
|
||||
|
||||
if [ -f ./i2pversion_override ]; then
|
||||
. ./i2pversion_override
|
||||
fi
|
||||
|
||||
TODAYSDATE=$(date +%Y%m%d)
|
||||
|
||||
if [ -z "$DESCRIPTION" ]; then
|
||||
DESCRIPTION="Daily unsigned build of i2p.firefox for $TODAYSDATE
|
||||
===================================================
|
||||
|
||||
These builds are automatically built on a daily basis and may have serious bugs.
|
||||
They are intended for testing purposes only, use them at your own risk.
|
||||
"
|
||||
fi
|
||||
|
||||
echo github-release release -p -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "$TODAYSDATE" -d "$DESCRIPTION" -t "$TODAYSDATE"
|
||||
github-release release -p -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "$TODAYSDATE" -d "$DESCRIPTION" -t "$TODAYSDATE"
|
||||
|
||||
"$SCRIPT_DIR"/buildscripts/zip.sh
|
||||
WINZIPCHECKSUM=$(sha256sum "I2P-windows-portable.zip")
|
||||
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P-windows-portable.zip" -l "$WINZIPCHECKSUM" -t "$TODAYSDATE" -n "I2P-windows-portable.zip"
|
||||
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P-windows-portable.zip" -l "$WINZIPCHECKSUM" -t "$TODAYSDATE" -n "I2P-windows-portable.zip"
|
@ -1,6 +1,6 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
cp -v "$SCRIPT_DIR/config_override.example.sh" config_override.sh
|
||||
@ -25,7 +25,7 @@ fi
|
||||
git clean -fd
|
||||
git checkout .
|
||||
cp -v "$SCRIPT_DIR/config_override.example.sh" config_override.sh
|
||||
./unsigned.sh
|
||||
"$SCRIPT_DIR"/buildscripts/unsigned.sh
|
||||
|
||||
. "$HOME/github-release-config.sh"
|
||||
|
@ -1,6 +1,6 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
@ -22,7 +22,7 @@ mv "$SCRIPT_DIR/config_override.sh" "$SCRIPT_DIR/config_override.sh.bak"
|
||||
# GITHUB_USERNAME=your github username
|
||||
git clean -fd
|
||||
git checkout .
|
||||
./unsigned.sh
|
||||
"$SCRIPT_DIR"/buildscripts/unsigned.sh
|
||||
|
||||
. "$HOME/github-release-config.sh"
|
||||
|
||||
@ -51,7 +51,6 @@ powershell Compress-Archive -force I2P 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"
|
||||
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"
|
@ -1,6 +1,6 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
cp -v "$SCRIPT_DIR/config_override.example.sh" config_override.sh
|
@ -1,6 +1,6 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
@ -2,11 +2,12 @@
|
||||
|
||||
## EXPERIMENTAL. PROBABLY WON'T SEE THE LIGHT OF DAY BUT MAYBE I GET LUCKY.
|
||||
|
||||
# Motivation
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. ./config.sh
|
||||
. ./i2pversion
|
||||
./build.sh
|
||||
./buildscripts/build.sh
|
||||
jpackage --name I2P-EXE --app-version "$I2P_VERSION" \
|
||||
--verbose \
|
||||
--java-options "-Xmx512m" \
|
||||
@ -16,10 +17,10 @@ jpackage --name I2P-EXE --app-version "$I2P_VERSION" \
|
||||
--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 src/I2P/config \
|
||||
--app-content src/icons/windowsUIToopie2.png \
|
||||
--icon src/icons/windowsUIToopie2.png \
|
||||
--input build \
|
||||
--app-content "$SCRIPT_DIR"/src/I2P/config \
|
||||
--app-content "$SCRIPT_DIR"/src/icons/windowsUIToopie2.png \
|
||||
--icon "$SCRIPT_DIR"/src/icons/windowsUIToopie2.png \
|
||||
--input "$SCRIPT_DIR/build" \
|
||||
--verbose \
|
||||
--type exe \
|
||||
--win-dir-chooser \
|
16
buildscripts/experimental.sh
Executable file
16
buildscripts/experimental.sh
Executable file
@ -0,0 +1,16 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
"$SCRIPT_DIR"/buildscripts/clean.sh
|
||||
"$SCRIPT_DIR"/buildscripts/version.sh
|
||||
"$SCRIPT_DIR"/buildscripts/licenses.sh
|
||||
"$SCRIPT_DIR"/buildscripts/build.sh
|
||||
"$SCRIPT_DIR"/buildscripts/nsis.sh
|
64
buildscripts/getprebuilt.sh
Executable file
64
buildscripts/getprebuilt.sh
Executable file
@ -0,0 +1,64 @@
|
||||
#! /usr/bin/env bash
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f config_overide.sh ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
"$SCRIPT_DIR"/buildscripts/version.sh
|
||||
echo "version set"
|
||||
"$SCRIPT_DIR"/buildscripts/licenses.sh
|
||||
echo "licenses generated"
|
||||
. "$HOME/github-release-config.sh"
|
||||
|
||||
if [ -z $TODAYSDATE ]; then
|
||||
TODAYSDATE=$(date -d '-1 day' '+%Y%m%d')
|
||||
fi
|
||||
|
||||
if [ ! -f I2P.zip ]; then
|
||||
echo github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "I2P.zip" -t "$TODAYSDATE"
|
||||
github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "I2P.zip" -t "$TODAYSDATE"
|
||||
fi
|
||||
unzip -FF I2P.zip || true
|
||||
echo "unzipped prebuilt router"
|
||||
sleep 3
|
||||
|
||||
echo "moved prebuilt router"
|
||||
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
export I2P_PKG="$SCRIPT_DIR/../i2p.i2p.jpackage-build/pkg-temp"
|
||||
export RES_DIR="$SCRIPT_DIR/../i2p.i2p.jpackage-build/installer/resources"
|
||||
export I2P_JARS="$I2P_PKG/lib"
|
||||
export I2P_JBIGI="$SCRIPT_DIR/../i2p.i2p.jpackage-build/installer/lib/jbigi"
|
||||
export I2P_JBIGI_JAR="$SCRIPT_DIR/../i2p.i2p.jpackage-build/build/jbigi.jar"
|
||||
|
||||
mkdir -p "$SCRIPT_DIR/src/I2P/config"
|
||||
rm -rf "$SCRIPT_DIR/src/I2P/config/geoip" "$SCRIPT_DIR/src/I2P/config/webapps" "$SCRIPT_DIR/src/I2P/config/certificates"
|
||||
cp -v "$RES_DIR/clients.config" "$SCRIPT_DIR/src/I2P/config/"
|
||||
cp -v "$RES_DIR/wrapper.config" "$SCRIPT_DIR/src/I2P/config/"
|
||||
#grep -v 'router.updateURL' $(RES_DIR)/router.config > "$SCRIPT_DIR"/src/I2P/config/router.config
|
||||
cat router.config > "$SCRIPT_DIR/src/I2P/config/router.config"
|
||||
cat i2ptunnel.config > "$SCRIPT_DIR/src/I2P/config/i2ptunnel.config"
|
||||
cp -v "$RES_DIR/hosts.txt" "$SCRIPT_DIR/src/I2P/config/hosts.txt"
|
||||
cp -r "$RES_DIR/certificates" "$SCRIPT_DIR/src/I2P/config/certificates"
|
||||
cp -r "$RES_DIR/eepsite" "$SCRIPT_DIR/src/I2P/config/eepsite"
|
||||
mkdir -p "$SCRIPT_DIR/src/I2P/config/geoip"
|
||||
cp -v "$RES_DIR/GeoLite2-Country.mmdb.gz" "$SCRIPT_DIR/src/I2P/config/geoip/GeoLite2-Country.mmdb.gz"
|
||||
#cp -r "$I2P_PKG/webapps" "$SCRIPT_DIR/src/I2P/config/webapps"
|
||||
cd "$SCRIPT_DIR/src/I2P/config/geoip" && gunzip GeoLite2-Country.mmdb.gz; cd "$SCRIPT_DIR"
|
||||
|
||||
mkdir -p "$SCRIPT_DIR"/build/I2P
|
||||
cp -rv "$SCRIPT_DIR"/I2P/* "$SCRIPT_DIR"/build/I2P
|
||||
cp -rv "$SCRIPT_DIR"/src/I2P/config "$SCRIPT_DIR"/build/I2P/config
|
139
buildscripts/launcher.sh
Executable file
139
buildscripts/launcher.sh
Executable file
@ -0,0 +1,139 @@
|
||||
#! /usr/bin/env bash
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
COUNT="Ten Nine Eight Seven Six Five Four Three Two One"
|
||||
|
||||
which java
|
||||
export JAVA=$(java --version | tr -d 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n' | cut -d ' ' -f 2 | cut -d '.' -f 1 | tr -d '\n\t\- ')
|
||||
|
||||
if [ "$JAVA" -lt "14" ]; then
|
||||
echo "Java 14+ must be used to compile with jpackage, java is $JAVA"
|
||||
exit 1
|
||||
fi
|
||||
if [ "$JAVA" -lt "17" ]; then
|
||||
echo "It is highly recommended that you use Java 17+ to build release packages"
|
||||
fi
|
||||
|
||||
if [ -z "${JAVA_HOME}" ]; then
|
||||
export JAVA_HOME=$(type -p java|xargs readlink -f|xargs dirname|xargs dirname)
|
||||
fi
|
||||
if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
||||
export JAVA_HOME=$(type -p java|xargs readlink -f|xargs dirname|xargs dirname)
|
||||
fi
|
||||
echo "Building with: $JAVA, $JAVA_HOME"
|
||||
sleep 5s
|
||||
|
||||
"$SCRIPT_DIR"/buildscripts/version.sh
|
||||
"$SCRIPT_DIR"/buildscripts/licenses.sh
|
||||
|
||||
#SCRIPT_DIR="$PWD"
|
||||
export I2P_PKG="$SCRIPT_DIR/../i2p.i2p.jpackage-build/pkg-temp"
|
||||
export RES_DIR="$SCRIPT_DIR/../i2p.i2p.jpackage-build/installer/resources"
|
||||
export I2P_JARS="$I2P_PKG/lib"
|
||||
export I2P_JBIGI="$SCRIPT_DIR/../i2p.i2p.jpackage-build/installer/lib/jbigi"
|
||||
export I2P_JBIGI_JAR="$SCRIPT_DIR/../i2p.i2p.jpackage-build/build/jbigi.jar"
|
||||
if [ ! -d "$SCRIPT_DIR/../i2p.i2p.jpackage-build/" ]; then
|
||||
git clone --depth=1 -b "$VERSION" https://i2pgit.org/i2p-hackers/i2p.i2p "$SCRIPT_DIR/../i2p.i2p.jpackage-build/"
|
||||
fi
|
||||
cd "$SCRIPT_DIR/../i2p.i2p.jpackage-build/"
|
||||
OLDEXTRA=$(find . -name RouterVersion.java -exec grep 'String EXTRA' {} \;)
|
||||
if [ -z "$EXTRA" ]; then
|
||||
export EXTRACODE="win"
|
||||
export EXTRA=" public final static String EXTRA = \"-$EXTRACODE\";"
|
||||
fi
|
||||
if [ "$VERSION" = master ]; then
|
||||
VERSIONDATE="$(date +%m%d)"
|
||||
fi
|
||||
find . -name RouterVersion.java -exec sed -i "s|$OLDEXTRA|$EXTRA|g" {} \;
|
||||
git switch - || :
|
||||
git pull --tags
|
||||
git checkout -b "i2p-$VERSION$VERSIONDATE-$EXTRACODE" || :
|
||||
git commit -am "i2p-$VERSION$VERSIONDATE-$EXTRACODE" || :
|
||||
git archive --format=tar.gz --output="$SCRIPT_DIR/../i2p.firefox/i2p.i2p.jpackage-build.tar.gz" "i2p-$VERSION$VERSIONDATE-$EXTRACODE"
|
||||
git checkout "i2p-$VERSION$VERSIONDATE-$EXTRACODE" || :
|
||||
|
||||
for i in $COUNT; do
|
||||
echo -n "$i...."; sleep 1s
|
||||
done
|
||||
ant distclean pkg || true
|
||||
ant jbigi
|
||||
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
mkdir -p "$SCRIPT_DIR/src/I2P/config"
|
||||
rm -rf "$SCRIPT_DIR/src/I2P/config/geoip" "$SCRIPT_DIR/src/I2P/config/webapps" "$SCRIPT_DIR/src/I2P/config/certificates"
|
||||
cp -v "$RES_DIR/clients.config" "$SCRIPT_DIR/src/I2P/config/"
|
||||
cp -v "$RES_DIR/wrapper.config" "$SCRIPT_DIR/src/I2P/config/"
|
||||
#grep -v 'router.updateURL' $(RES_DIR)/router.config > "$SCRIPT_DIR"/src/I2P/config/router.config
|
||||
cat router.config > "$SCRIPT_DIR/src/I2P/config/router.config"
|
||||
cat i2ptunnel.config > "$SCRIPT_DIR/src/I2P/config/i2ptunnel.config"
|
||||
cp -v "$RES_DIR/hosts.txt" "$SCRIPT_DIR/src/I2P/config/hosts.txt"
|
||||
cp -R "$RES_DIR/certificates" "$SCRIPT_DIR/src/I2P/config/certificates"
|
||||
cp -R "$RES_DIR/eepsite" "$SCRIPT_DIR/src/I2P/config/eepsite"
|
||||
mkdir -p "$SCRIPT_DIR/src/I2P/config/geoip"
|
||||
cp -v "$RES_DIR/GeoLite2-Country.mmdb.gz" "$SCRIPT_DIR/src/I2P/config/geoip/GeoLite2-Country.mmdb.gz"
|
||||
cp -R "$I2P_PKG/webapps" "$SCRIPT_DIR/src/I2P/config/webapps"
|
||||
cd "$SCRIPT_DIR/src/I2P/config/geoip" && gunzip GeoLite2-Country.mmdb.gz; cd ../../..
|
||||
|
||||
echo "compiling custom launcher"
|
||||
mkdir -p "$SCRIPT_DIR/build"
|
||||
cp "$I2P_JARS"/*.jar "$SCRIPT_DIR/build"
|
||||
cp "$I2P_JBIGI_JAR" "$SCRIPT_DIR/build"
|
||||
if [ ! -f "$SCRIPT_DIR/build/jna.jar" ]; then
|
||||
echo "downloading jna"
|
||||
wget_download "https://repo1.maven.org/maven2/net/java/dev/jna/jna/$JNA_VERSION/jna-$JNA_VERSION.jar" -O "$SCRIPT_DIR/build/jna.jar"
|
||||
fi
|
||||
|
||||
if [ ! -f "$SCRIPT_DIR/build/jna-platform.jar" ]; then
|
||||
echo "downloading jna-platform"
|
||||
wget_download "https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/$JNA_VERSION/jna-platform-$JNA_VERSION.jar" -O "$SCRIPT_DIR/build/jna-platform.jar"
|
||||
fi
|
||||
|
||||
if [ ! -f "$SCRIPT_DIR/build/i2pfirefox.zip" ]; then
|
||||
echo "downloading i2pfirefox jars"
|
||||
wget_download "https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/$I2PFIREFOX_VERSION/plugin.zip" -O "$SCRIPT_DIR/build/i2pfirefox.zip"
|
||||
fi
|
||||
|
||||
if [ ! -d "$SCRIPT_DIR/build/I2P/config/plugins/i2pfirefox" ]; then
|
||||
mkdir -p "$SCRIPT_DIR/build/I2P/config/plugins/"
|
||||
unzip "$SCRIPT_DIR/build/i2pfirefox.zip" -d "$SCRIPT_DIR/build/I2P/config/plugins/"
|
||||
rm -rf "$SCRIPT_DIR/build/I2P/config/plugins/i2pfirefox"
|
||||
mv "$SCRIPT_DIR/build/I2P/config/plugins/plugin" "$SCRIPT_DIR/build/I2P/config/plugins/i2pfirefox"
|
||||
fi
|
||||
|
||||
for dll in "$I2P_JBIGI/"*windows*.dll; do
|
||||
jar uf "$SCRIPT_DIR/build/jbigi.jar" "$dll"
|
||||
done
|
||||
|
||||
cd "$SCRIPT_DIR"/java
|
||||
"$JAVA_HOME"/bin/javac -Xlint:deprecation -d ../build -classpath "$SCRIPT_DIR/build/i2pfirefox.jar:$SCRIPT_DIR/build/jna.jar:$SCRIPT_DIR/build/jna-platform.jar":"$SCRIPT_DIR/build/i2p.jar:$SCRIPT_DIR/build/router.jar:$SCRIPT_DIR/build/routerconsole.jar:$SCRIPT_DIR/build/jbigi.jar" \
|
||||
net/i2p/router/CopyConfigDir.java \
|
||||
net/i2p/router/WindowsServiceUtil.java \
|
||||
net/i2p/router/WindowsAppUtil.java \
|
||||
net/i2p/router/I2PAppUtil.java \
|
||||
net/i2p/router/WinUpdatePostProcessor.java \
|
||||
net/i2p/router/WinLauncher.java \
|
||||
net/i2p/router/WinUpdateProcess.java \
|
||||
net/i2p/router/ZipUpdateProcess.java
|
||||
|
||||
cd ..
|
||||
|
||||
#echo "building launcher.jar"
|
||||
cd "$SCRIPT_DIR/build"
|
||||
"$JAVA_HOME"/bin/jar -cf launcher.jar net
|
||||
cd ..
|
31
buildscripts/licenses.sh
Executable file
31
buildscripts/licenses.sh
Executable file
@ -0,0 +1,31 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
mkdir -p "$SCRIPT_DIR"/build/licenses
|
||||
cp "$SCRIPT_DIR"/license/* "$SCRIPT_DIR"/build/licenses
|
||||
cp "$SCRIPT_DIR"/LICENSE.md "$SCRIPT_DIR"/build/licenses/MIT.txt
|
||||
cat "$SCRIPT_DIR"/build/licenses/LICENSE.index \
|
||||
"$SCRIPT_DIR"/build/licenses/EPL.txt \
|
||||
"$SCRIPT_DIR"/build/licenses/GPL+CLASSPATH.txt \
|
||||
"$SCRIPT_DIR"/build/licenses/HTTPS-Everywhere.txt \
|
||||
"$SCRIPT_DIR"/build/licenses/LICENSE.tor \
|
||||
"$SCRIPT_DIR"/build/licenses/MIT.txt \
|
||||
"$SCRIPT_DIR"/build/licenses/MPL2.txt \
|
||||
"$SCRIPT_DIR"/build/licenses/NoScript.txt \
|
||||
"$SCRIPT_DIR"/build/licenses/NSS.txt \
|
||||
"$SCRIPT_DIR"/build/licenses/I2P.txt > "$SCRIPT_DIR"/build/licenses/LICENSE.txt
|
||||
unix2dos "$SCRIPT_DIR"/build/licenses/LICENSE.txt
|
@ -2,12 +2,13 @@
|
||||
|
||||
## EXPERIMENTAL. PROBABLY WON'T SEE THE LIGHT OF DAY BUT MAYBE I GET LUCKY.
|
||||
|
||||
# Motivation
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. ./config.sh
|
||||
. ./i2pversion
|
||||
|
||||
./build.sh
|
||||
"$SCRIPT_DIR"/buildscripts/build.sh
|
||||
jpackage --name I2P-MSI --app-version "$I2P_VERSION" \
|
||||
--verbose \
|
||||
--java-options "-Xmx512m" \
|
||||
@ -17,10 +18,10 @@ jpackage --name I2P-MSI --app-version "$I2P_VERSION" \
|
||||
--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 src/I2P/config \
|
||||
--app-content src/icons/windowsUIToopie2.png \
|
||||
--icon src/icons/windowsUIToopie2.png \
|
||||
--input build \
|
||||
--app-content "$SCRIPT_DIR"/src/I2P/config \
|
||||
--app-content "$SCRIPT_DIR"/src/icons/windowsUIToopie2.png \
|
||||
--icon "$SCRIPT_DIR"/src/icons/windowsUIToopie2.png \
|
||||
--input "$SCRIPT_DIR/build" \
|
||||
--verbose \
|
||||
--type msi \
|
||||
--win-dir-chooser \
|
65
buildscripts/news.sh
Executable file
65
buildscripts/news.sh
Executable file
@ -0,0 +1,65 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
if [ -z "$I2P_NEWSXML" ]; then
|
||||
if [ -d "../i2p.newsxml" ]; then
|
||||
export I2P_NEWSXML="../i2p.newsxml"
|
||||
else
|
||||
echo "i2p.newsxml is not in the parent directory and I2P_NEWSXML is unset"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
cd "$I2P_NEWSXML" || exit 1
|
||||
export TITLE="Easy-Install for Windows Release $I2P_VERSION"
|
||||
echo "$TITLE"
|
||||
export AUTHOR=idk
|
||||
echo "$AUTHOR"
|
||||
export EDITOR=true
|
||||
echo "canceled manual editor"
|
||||
export I2P_OS=win
|
||||
echo "$I2P_OS"
|
||||
export I2P_BRANCH=beta
|
||||
echo "$I2P_VERSION"
|
||||
export SUMMARY_HERE=$(head -n 1 "$SCRIPT_DIR/docs/RELEASE.md" | sed "s|# ||g")
|
||||
echo "$SUMMARY_HERE"
|
||||
export CONTENT_HERE=$(tail -n +2 "$SCRIPT_DIR/docs/RELEASE.md" | markdown)
|
||||
echo "$CONTENT_HERE"
|
||||
./create_new_entry.sh
|
||||
|
||||
export DATE=$(date +%Y-%m-%d)
|
||||
echo "$DATE"
|
||||
MAGNET=$(transmission-show -m "$SCRIPT_DIR/i2pwinupdate.su3.torrent" 2>&1 3>&1 | tail -n 1)
|
||||
|
||||
TORRENTJSON='['
|
||||
TORRENTJSON+=' {'
|
||||
TORRENTJSON+=" \"date\": \"$DATE\","
|
||||
TORRENTJSON+=" \"version\": \"$I2P_VERSION\","
|
||||
TORRENTJSON+=" \"minVersion\": \"1.5.0\","
|
||||
TORRENTJSON+=" \"minJavaVersion\": \"1.8\","
|
||||
TORRENTJSON+=" \"updates\": {"
|
||||
TORRENTJSON+=" \"su3\": {"
|
||||
TORRENTJSON+=" \"torrent\": \"$MAGNET\","
|
||||
TORRENTJSON+=" \"url\": ["
|
||||
TORRENTJSON+=" \"http://ekm3fu6fr5pxudhwjmdiea5dovc3jdi66hjgop4c7z7dfaw7spca.b32.i2p/i2pwinupdate.su3\""
|
||||
TORRENTJSON+=' ]'
|
||||
TORRENTJSON+=' }'
|
||||
TORRENTJSON+=' }'
|
||||
TORRENTJSON+=' }'
|
||||
TORRENTJSON+=']'
|
||||
|
||||
echo "$TORRENTJSON" | jq
|
21
buildscripts/nsis.sh
Executable file
21
buildscripts/nsis.sh
Executable file
@ -0,0 +1,21 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
cp "$SCRIPT_DIR"/src/nsis/*.nsi "$SCRIPT_DIR"/build
|
||||
cp "$SCRIPT_DIR"/src/nsis/*.nsh "$SCRIPT_DIR"/build
|
||||
cp "$SCRIPT_DIR"/src/icons/*.ico "$SCRIPT_DIR"/build
|
||||
cd "$SCRIPT_DIR"/build && makensisi i2pbrowser-installer.nsi && cp I2P-Easy-Install-Bundle-*.exe ../ && echo "built windows installer"
|
42
buildscripts/release-download.sh
Executable file
42
buildscripts/release-download.sh
Executable file
@ -0,0 +1,42 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
mv "$SCRIPT_DIR/config_override.sh" "$SCRIPT_DIR/config_override.sh.bak"
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
### How to set up this script:
|
||||
#
|
||||
# This script will not work unless you give it a Github API key.
|
||||
# You need to create a file in your $HOME directory, which on
|
||||
# Windows will by /c/Users/yourusername, called github-release-config.sh,
|
||||
# containing this key as the variable GITHUB_TOKEN.
|
||||
# github-release-config.sh must also contain:
|
||||
# GITHUB_USERNAME=your github username
|
||||
|
||||
. "$HOME/github-release-config.sh"
|
||||
|
||||
if [ -f ./i2pversion_override ]; then
|
||||
. ./i2pversion_override
|
||||
fi
|
||||
|
||||
|
||||
|
||||
echo github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "I2P-Easy-Install-Bundle-$I2P_VERSION.exe" -t "$I2P_VERSION"
|
||||
github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "I2P-Easy-Install-Bundle-$I2P_VERSION.exe" -t "$I2P_VERSION"
|
||||
|
||||
echo github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "I2P.zip" -t "$I2P_VERSION"
|
||||
github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "I2P.zip" -t "$I2P_VERSION"
|
||||
|
||||
echo github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "i2p.i2p.jpackage-build.tar.gz" -t "$I2P_VERSION"
|
||||
github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "i2p.i2p.jpackage-build.tar.gz" -t "$I2P_VERSION"
|
||||
|
||||
echo github-release download -u "$GITHUB_USERNAME" -r i2p -t "$I2P_VERSION" -n "./I2P-jpackage-windows-$I2P_VERSION.zip"
|
||||
github-release download -u "$GITHUB_USERNAME" -r i2p -t "$I2P_VERSION" -n "./I2P-jpackage-windows-$I2P_VERSION.zip"
|
50
buildscripts/release-support.sh
Executable file
50
buildscripts/release-support.sh
Executable file
@ -0,0 +1,50 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
mv "$SCRIPT_DIR/config_override.sh" "$SCRIPT_DIR/config_override.sh.bak"
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
### How to set up this script:
|
||||
#
|
||||
# This script will not work unless you give it a Github API key.
|
||||
# You need to create a file in your $HOME directory, which on
|
||||
# Windows will by /c/Users/yourusername, called github-release-config.sh,
|
||||
# containing this key as the variable GITHUB_TOKEN.
|
||||
# github-release-config.sh must also contain:
|
||||
# GITHUB_USERNAME=your github username
|
||||
|
||||
. "$HOME/github-release-config.sh"
|
||||
|
||||
if [ -f ./i2pversion_override ]; then
|
||||
. ./i2pversion_override
|
||||
fi
|
||||
|
||||
echo github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "i2pwinupdate.su3" -t "$I2P_VERSION"
|
||||
github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "i2pwinupdate.su3" -t "$I2P_VERSION"
|
||||
|
||||
echo github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "i2pwinupdate.su3.torrent" -t "$I2P_VERSION"
|
||||
github-release download -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "i2pwinupdate.su3.torrent" -t "$I2P_VERSION"
|
||||
|
||||
if [ ! -z "$I2P_SNARK_DIR" ]; then
|
||||
if [ "$I2P_SNARK_DIR" = "$HOME/.i2p/i2psnark" ]; then
|
||||
cp -v "i2pwinupdate.su3" "$I2P_SNARK_DIR"
|
||||
cp -v "i2pwinupdate.su3.torrent" "$I2P_SNARK_DIR"
|
||||
fi
|
||||
if [ "$I2P_SNARK_DIR" = "$LOCALAPPDATA/i2p/i2psnark/" ]; then
|
||||
cp -v "i2pwinupdate.su3" "$I2P_SNARK_DIR"
|
||||
cp -v "i2pwinupdate.su3.torrent" "$I2P_SNARK_DIR"
|
||||
fi
|
||||
if [ "$I2P_SNARK_DIR" = "/var/lib/i2p/i2p-config/i2psnark/" ]; then
|
||||
sudo cp -v "i2pwinupdate.su3" "$I2P_SNARK_DIR"
|
||||
sudo cp -v "i2pwinupdate.su3.torrent" "$I2P_SNARK_DIR"
|
||||
sudo chown i2psvc:i2psvc "$I2P_SNARK_DIR/i2pwinupdate.su3" "$I2P_SNARK_DIR/i2pwinupdate.su3.torrent"
|
||||
fi
|
||||
fi
|
44
buildscripts/release-torrent.sh
Executable file
44
buildscripts/release-torrent.sh
Executable file
@ -0,0 +1,44 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
mv "$SCRIPT_DIR/config_override.sh" "$SCRIPT_DIR/config_override.sh.bak"
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
### How to set up this script:
|
||||
#
|
||||
# This script will not work unless you give it a Github API key.
|
||||
# You need to create a file in your $HOME directory, which on
|
||||
# Windows will by /c/Users/yourusername, called github-release-config.sh,
|
||||
# containing this key as the variable GITHUB_TOKEN.
|
||||
# github-release-config.sh must also contain:
|
||||
# GITHUB_USERNAME=your github username
|
||||
|
||||
. "$HOME/github-release-config.sh"
|
||||
|
||||
if [ -f ./i2pversion_override ]; then
|
||||
. ./i2pversion_override
|
||||
fi
|
||||
|
||||
cp -v "I2P-Easy-Install-Bundle-$I2P_VERSION.exe" "I2P-Easy-Install-Bundle-$I2P_VERSION-signed.exe"
|
||||
java -cp "$I2P_LIBS/*" net.i2p.crypto.SU3File sign -c ROUTER -f EXE I2P-Easy-Install-Bundle-$I2P_VERSION-signed.exe I2P-Easy-Install-Bundle-$I2P_VERSION-signed.su3 "$HOME/.i2p-plugin-keys/news-su3-keystore.ks" $I2P_VERSION $SIGNER
|
||||
rm -f i2pwinupdate.su3.torrent
|
||||
cp -v I2P-Easy-Install-Bundle-$I2P_VERSION-signed.su3 i2pwinupdate.su3
|
||||
|
||||
java -cp "$I2P_LIBS/*" "org.klomp.snark.Storage" -a http://tracker2.postman.i2p/announce.php -a http://w7tpbzncbcocrqtwwm3nezhnnsw4ozadvi2hmvzdhrqzfxfum7wa.b32.i2p/a -a http://mb5ir7klpc2tj6ha3xhmrs3mseqvanauciuoiamx2mmzujvg67uq.b32.i2p/a -c "$SIGNER" -m "Official torrent for Windows Easy-Install version $I2P_VERSION" i2pwinupdate.su3
|
||||
echo "~~~~~~~~~~"
|
||||
MAGNET=$(transmission-show -m "i2pwinupdate.su3.torrent" 2>&1 3>&1 | tail -n 1)
|
||||
echo "$MAGNET"
|
||||
ZIPCHECKSUM=$(sha256sum "i2pwinupdate.su3")
|
||||
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "i2pwinupdate.su3" -l "$ZIPCHECKSUM" -t "$I2P_VERSION" -n "i2pwinupdate.su3"
|
||||
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "i2pwinupdate.su3" -l "$ZIPCHECKSUM" -t "$I2P_VERSION" -n "i2pwinupdate.su3"
|
||||
ZIPCHECKSUM=$(sha256sum "i2pwinupdate.su3.torrent")
|
||||
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "i2pwinupdate.su3.torrent" -l "$ZIPCHECKSUM" -t "$I2P_VERSION" -n "i2pwinupdate.su3.torrent"
|
||||
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "i2pwinupdate.su3.torrent" -l "$ZIPCHECKSUM" -t "$I2P_VERSION" -n "i2pwinupdate.su3.torrent"
|
73
buildscripts/release-upload.sh
Executable file
73
buildscripts/release-upload.sh
Executable file
@ -0,0 +1,73 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
mv "$SCRIPT_DIR/config_override.sh" "$SCRIPT_DIR/config_override.sh.bak"
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
### How to set up this script:
|
||||
#
|
||||
# This script will not work unless you give it a Github API key.
|
||||
# You need to create a file in your $HOME directory, which on
|
||||
# Windows will by /c/Users/yourusername, called github-release-config.sh,
|
||||
# containing this key as the variable GITHUB_TOKEN.
|
||||
# github-release-config.sh must also contain:
|
||||
# GITHUB_USERNAME=your github username
|
||||
git clean -fd
|
||||
git checkout .
|
||||
"$SCRIPT_DIR"/buildscripts/unsigned.sh
|
||||
|
||||
. "$HOME/github-release-config.sh"
|
||||
|
||||
if [ -f ./i2pversion_override ]; then
|
||||
. ./i2pversion_override
|
||||
fi
|
||||
|
||||
BLANK=$(awk '! NF { print NR; exit }' changelog.txt)
|
||||
|
||||
DESCRIPTION="Release build of i2p.firefox for $I2P_VERSION
|
||||
==========================================================
|
||||
|
||||
$(head -n $BLANK changelog.txt)"
|
||||
|
||||
echo github-release release -p -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "$I2P_VERSION" -d "$DESCRIPTION" -t "$I2P_VERSION"
|
||||
github-release release -p -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "$I2P_VERSION" -d "$DESCRIPTION" -t "$I2P_VERSION"
|
||||
sleep 2s;
|
||||
EXECHECKSUM=$(sha256sum "I2P-Easy-Install-Bundle-$I2P_VERSION.exe")
|
||||
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P-Easy-Install-Bundle-$I2P_VERSION.exe" -l "$EXECHECKSUM" -t "$I2P_VERSION" -n "I2P-Easy-Install-Bundle-$I2P_VERSION.exe"
|
||||
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P-Easy-Install-Bundle-$I2P_VERSION.exe" -l "$EXECHECKSUM" -t "$I2P_VERSION" -n "I2P-Easy-Install-Bundle-$I2P_VERSION.exe"
|
||||
powershell Compress-Archive -force I2P I2P.zip
|
||||
ZIPCHECKSUM=$(sha256sum "I2P.zip")
|
||||
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P.zip" -l "$ZIPCHECKSUM" -t "$I2P_VERSION" -n "I2P.zip"
|
||||
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P.zip" -l "$ZIPCHECKSUM" -t "$I2P_VERSION" -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 "$I2P_VERSION" -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 "$I2P_VERSION" -n "i2p.i2p.jpackage-build.tar.gz"
|
||||
sh -c "powershell Compress-Archive I2P I2P-jpackage-windows-$I2P_VERSION.zip || zip I2P-jpackage-windows-$I2P_VERSION.zip -r I2P"
|
||||
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "i2p-jpackage-windows-$I2P_VERSION.zip" -t "$I2P_VERSION" -f "./I2P-jpackage-windows-$I2P_VERSION.zip"
|
||||
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "i2p-jpackage-windows-$I2P_VERSION.zip" -t "$I2P_VERSION" -f "./I2P-jpackage-windows-$I2P_VERSION.zip"
|
||||
|
||||
GITHUB_USERNAME=i2p
|
||||
echo github-release release -p -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "$I2P_VERSION" -d "$DESCRIPTION" -t "$I2P_VERSION"
|
||||
github-release release -p -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "$I2P_VERSION" -d "$DESCRIPTION" -t "$I2P_VERSION"
|
||||
sleep 2s;
|
||||
EXECHECKSUM=$(sha256sum "I2P-Easy-Install-Bundle-$I2P_VERSION.exe")
|
||||
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P-Easy-Install-Bundle-$I2P_VERSION.exe" -l "$EXECHECKSUM" -t "$I2P_VERSION" -n "I2P-Easy-Install-Bundle-$I2P_VERSION.exe"
|
||||
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P-Easy-Install-Bundle-$I2P_VERSION.exe" -l "$EXECHECKSUM" -t "$I2P_VERSION" -n "I2P-Easy-Install-Bundle-$I2P_VERSION.exe"
|
||||
powershell Compress-Archive -force I2P I2P.zip
|
||||
ZIPCHECKSUM=$(sha256sum "I2P.zip")
|
||||
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P.zip" -l "$ZIPCHECKSUM" -t "$I2P_VERSION" -n "I2P.zip"
|
||||
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -f "I2P.zip" -l "$ZIPCHECKSUM" -t "$I2P_VERSION" -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 "$I2P_VERSION" -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 "$I2P_VERSION" -n "i2p.i2p.jpackage-build.tar.gz"
|
||||
sh -c "powershell Compress-Archive I2P I2P-jpackage-windows-$I2P_VERSION.zip || zip I2P-jpackage-windows-$I2P_VERSION.zip -r I2P"
|
||||
echo github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "i2p-jpackage-windows-$I2P_VERSION.zip" -t "$I2P_VERSION" -f "./I2P-jpackage-windows-$I2P_VERSION.zip"
|
||||
github-release upload -R -u "$GITHUB_USERNAME" -r "i2p.firefox" -n "i2p-jpackage-windows-$I2P_VERSION.zip" -t "$I2P_VERSION" -f "./I2P-jpackage-windows-$I2P_VERSION.zip"
|
@ -1,6 +1,6 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
@ -9,5 +9,5 @@ if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
./unsigned.sh
|
||||
./sign.sh
|
||||
"$SCRIPT_DIR"/buildscripts/unsigned.sh
|
||||
"$SCRIPT_DIR"/buildscripts/sign.sh
|
@ -1,6 +1,6 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
@ -40,6 +40,8 @@ if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
||||
linuxsign I2P-Easy-Install-Bundle-$I2P_VERSION.exe
|
||||
cp "I2P-Easy-Install-Bundle-$I2P_VERSION.exe" "I2P-Easy-Install-Bundle-$I2P_VERSION-signed.exe"
|
||||
else
|
||||
signtool.exe sign -a "I2P-Easy-Install-Bundle-$I2P_VERSION.exe"
|
||||
#signtool.exe sign -a "I2P-Easy-Install-Bundle-$I2P_VERSION.exe"
|
||||
echo "WARNING: Signing is temporarily disabled for the installer."
|
||||
sleep 5s
|
||||
cp "I2P-Easy-Install-Bundle-$I2P_VERSION.exe" "I2P-Easy-Install-Bundle-$I2P_VERSION-signed.exe"
|
||||
fi
|
31
buildscripts/targz.sh
Executable file
31
buildscripts/targz.sh
Executable file
@ -0,0 +1,31 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
export machine=unix
|
||||
"$SCRIPT_DIR"/buildscripts/clean.sh
|
||||
"$SCRIPT_DIR"/buildscripts/build.sh
|
||||
cd "$SCRIPT_DIR/I2P" || exit 1
|
||||
|
||||
TORSOCKS=$(which torsocks)
|
||||
if [ -f "${TORSOCKS}" ]; then
|
||||
. "${TORSOCKS}" on
|
||||
fi
|
||||
"$SCRIPT_DIR"/src/unix/torbrowser.sh
|
||||
version="$(curl -s https://aus1.torproject.org/torbrowser/update_3/release/downloads.json | jq -r ".version")"
|
||||
. "${TORSOCKS}" off
|
||||
locale="en-US" # mention your locale. default = en-US
|
||||
if [ -d /etc/default/locale ]; then
|
||||
. /etc/default/locale
|
||||
locale=$(echo "${LANG}" | cut -d . -f1)
|
||||
fi
|
||||
rm -vrf "tor-browser_${locale}"
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
tar czvf I2P.tar.gz I2P
|
14
buildscripts/unsigned.sh
Executable file
14
buildscripts/unsigned.sh
Executable file
@ -0,0 +1,14 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || cd ../ ; SCRIPT_DIR=$(pwd)
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
"$SCRIPT_DIR"/buildscripts/clean.sh
|
||||
"$SCRIPT_DIR"/buildscripts/build.sh
|
||||
"$SCRIPT_DIR"/buildscripts/nsis.sh
|
26
buildscripts/version.sh
Executable file
26
buildscripts/version.sh
Executable file
@ -0,0 +1,26 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
echo "!define VERSIONMAJOR $VERSIONMAJOR" > "$SCRIPT_DIR"/src/nsis/i2pbrowser-version.nsi
|
||||
echo "!define VERSIONMINOR $VERSIONMINOR" >> "$SCRIPT_DIR"/src/nsis/i2pbrowser-version.nsi
|
||||
echo "!define VERSIONBUILD $VERSIONBUILD" >> "$SCRIPT_DIR"/src/nsis/i2pbrowser-version.nsi
|
||||
echo "!define I2P_VERSION $I2P_VERSION" > "$SCRIPT_DIR"/src/nsis/i2pbrowser-jpackage.nsi
|
||||
|
||||
mkdir -p "$SCRIPT_DIR"/build
|
||||
echo "$I2P_VERSION" > "$SCRIPT_DIR"/build/version.txt
|
||||
echo "$I2P_VERSION" > "$SCRIPT_DIR"/build/version.txt
|
||||
sed 's|!define VERSION||g' "$SCRIPT_DIR"/src/nsis/i2pbrowser-version.nsi | sed 's| |=|g' > .version
|
34
buildscripts/zip.sh
Executable file
34
buildscripts/zip.sh
Executable file
@ -0,0 +1,34 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)/..
|
||||
cd "$SCRIPT_DIR" || cd ../ ; SCRIPT_DIR=$(pwd)
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
"$SCRIPT_DIR"/buildscripts/clean.sh
|
||||
"$SCRIPT_DIR"/buildscripts/build.sh
|
||||
cd "$SCRIPT_DIR/I2P" || exit 1
|
||||
|
||||
TORSOCKS=$(which torsocks)
|
||||
if [ -f "${TORSOCKS}" ]; then
|
||||
. "${TORSOCKS}" on
|
||||
fi
|
||||
which wsl && wsl ../src/win/torbrowser-windows.sh
|
||||
which wsl || "$SCRIPT_DIR"/src/win/torbrowser-windows.sh
|
||||
version="$(curl -s https://aus1.torproject.org/torbrowser/update_3/release/downloads.json | jq -r ".version")"
|
||||
. "${TORSOCKS}" off
|
||||
locale="en-US" # mention your locale. default = en-US
|
||||
if [ -d /etc/default/locale ]; then
|
||||
. /etc/default/locale
|
||||
locale=$(echo "${LANG}" | cut -d . -f1)
|
||||
fi
|
||||
rm -vrf "tor-browser_${locale}"
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
rm -rf I2P-portable && cp -r I2P I2P-portable
|
||||
|
||||
which zip && zip -r I2P-windows-portable.zip I2P-portable
|
||||
which zip || powershell Compress-Archive -force I2P-portable I2P-windows-portable.zip
|
@ -1,3 +1,7 @@
|
||||
2023-01-23 idk
|
||||
* Move build scripts to their own directory and make them use correct paths when moved
|
||||
* Add EXTRA to router when generating embedded router jars.
|
||||
|
||||
2022-09-20 idk
|
||||
* improve compatibility with local service installs and with un-bundled installs side-by-side with bundled intalls
|
||||
* version 1.9.7
|
||||
|
96
config.sh
96
config.sh
@ -5,22 +5,71 @@
|
||||
|
||||
uname=$(uname)
|
||||
|
||||
#export PATH="$PATH:/c/Program Files/Java/jdk-17.0.3/bin/"
|
||||
#export JAVA_HOME="/c/Program Files/Java/jdk-17.0.3"
|
||||
# to use it for Oracle OpenJDK18
|
||||
# Third-party builders should always override this in config_override.sh
|
||||
if [ -z "$SIGNER" ]; then
|
||||
SIGNER=hankhill19580@gmail.com
|
||||
export SIGNER=hankhill19580@gmail.com
|
||||
fi
|
||||
|
||||
if [ -z "$I2P_LIBS" ]; then
|
||||
if [ -d "$HOME/i2p/lib/" ]; then
|
||||
I2P_LIBS="$HOME/i2p/lib/"
|
||||
fi
|
||||
if [ -d "$LOCALAPPDATA/i2p/lib/" ]; then
|
||||
I2P_LIBS="$LOCALAPPDATA/i2p/lib/"
|
||||
fi
|
||||
if [ -d "/usr/share/i2p/lib/" ]; then
|
||||
I2P_LIBS="/usr/share/i2p/lib/"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$I2P_SNARK_DIR" ]; then
|
||||
if [ -d "$HOME/.i2p/i2psnark" ]; then
|
||||
I2P_SNARK_DIR="$HOME/.i2p/i2psnark"
|
||||
fi
|
||||
if [ -d "$LOCALAPPDATA/i2p/i2psnark/" ]; then
|
||||
I2P_SNARK_DIR="$LOCALAPPDATA/i2p/i2psnark/"
|
||||
fi
|
||||
if [ -d "/var/lib/i2p/i2p-config/i2psnark/" ]; then
|
||||
I2P_SNARK_DIR="/var/lib/i2p/i2p-config/i2psnark/"
|
||||
fi
|
||||
fi
|
||||
|
||||
NSIS_PATH="/c/Program Files (x86)/NSIS/Bin"
|
||||
PATH="$NSIS_PATH:$PATH:$NSIS_PATH/"
|
||||
export PATH="$NSIS_PATH:$PATH:$NSIS_PATH/"
|
||||
|
||||
wget_download(){
|
||||
which powershell && powershell Invoke-WebRequest $@ && return
|
||||
wget $@
|
||||
}
|
||||
|
||||
makensisi(){
|
||||
which makensis && makensis $@ && return
|
||||
which wsl && wsl makensis $@ && return
|
||||
}
|
||||
|
||||
make_make(){
|
||||
which make && make $@ && return
|
||||
which wsl && wsl make $@ && return
|
||||
}
|
||||
|
||||
if [[ -n "$IS_WSL" || -n "$WSL_DISTRO_NAME" ]]; then
|
||||
PATH="/c/Program Files/Java/jdk-18.0.2/bin/:$PATH:/c/Program Files/Java/jdk-18.0.2/bin/"
|
||||
export PATH="/c/Program Files/Java/jdk-18.0.2/bin/:$PATH:/c/Program Files/Java/jdk-18.0.2/bin/"
|
||||
JAVA_HOME="/c/Program Files/Java/jdk-18.0.2"
|
||||
export JAVA_HOME="/c/Program Files/Java/jdk-18.0.2"
|
||||
JAVA_HOME=$(java -XshowSettings:properties -version 2>&1 | findstr "java.home" | sed 's| java.home = ||g')
|
||||
export JAVA_HOME="$JAVA_HOME"
|
||||
PATH="$JAVA_HOME/bin/:$PATH:$JAVA_HOME/bin/"
|
||||
export PATH="$JAVA_HOME/bin/:$PATH:$JAVA_HOME/bin/"
|
||||
HOST=win32
|
||||
export HOST=win32
|
||||
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"
|
||||
JAVA_HOME=$(java -XshowSettings:properties -version 2>&1 | findstr "java.home" | sed 's| java.home = ||g')
|
||||
export JAVA_HOME="$JAVA_HOME"
|
||||
PATH="$JAVA_HOME/bin/:$PATH:$JAVA_HOME/bin/"
|
||||
export PATH="$JAVA_HOME/bin/:$PATH:$JAVA_HOME/bin/"
|
||||
HOST=win32
|
||||
export HOST=win32
|
||||
fi
|
||||
|
||||
|
||||
@ -28,10 +77,10 @@ fi
|
||||
## This isn't a default install location, obviously, it's where I unzipped it.
|
||||
## It won't work for you unless you kurtly tell Windows that your name is `user`
|
||||
## every time you make an account, like I do.
|
||||
#PATH="/c/Users/user/Downloads/openjdk-19_windows-x64_bin/jdk-19/bin/:$PATH:/c/Users/user/Downloads/openjdk-19_windows-x64_bin/jdk-19/bin/"
|
||||
#export PATH="/c/Users/user/Downloads/openjdk-19_windows-x64_bin/jdk-19/bin/:$PATH:/c/Users/user/Downloads/openjdk-19_windows-x64_bin/jdk-19/bin/"
|
||||
#JAVA_HOME=/c/Users/user/Downloads/openjdk-19_windows-x64_bin/jdk-19
|
||||
#export JAVA_HOME=/c/Users/user/Downloads/openjdk-19_windows-x64_bin/jdk-19
|
||||
#PATH="/c/Users/user/Downloads/openjdk-20_windows-x64_bin/jdk-20/bin/:$PATH:/c/Users/user/Downloads/openjdk-20_windows-x64_bin/jdk-20/bin/"
|
||||
#export PATH="/c/Users/user/Downloads/openjdk-20_windows-x64_bin/jdk-20/bin/:$PATH:/c/Users/user/Downloads/openjdk-20_windows-x64_bin/jdk-20/bin/"
|
||||
#JAVA_HOME=/c/Users/user/Downloads/openjdk-20_windows-x64_bin/jdk-20
|
||||
#export JAVA_HOME=/c/Users/user/Downloads/openjdk-20_windows-x64_bin/jdk-20
|
||||
|
||||
## Other potential values(NOT exhaustive):
|
||||
|
||||
@ -68,15 +117,28 @@ fi
|
||||
# You can also use this to temporarily add applications into the PATH that are
|
||||
# required to build this if you do not wish to edit your PATH across the entire
|
||||
# Windows session, and for setting ANT_HOME
|
||||
#export ANT_HOME="/c/apache-ant-1.10.9"
|
||||
#export PATH="$PATH:$ANT_HOME/bin/"
|
||||
if [ -d "/c/apache-ant-"* ]; then
|
||||
ANT_HOME=$(ls -d /c/apache-ant-*)
|
||||
export ANT_HOME="$ANT_HOME"
|
||||
export PATH="$PATH:$ANT_HOME/bin/"
|
||||
fi
|
||||
|
||||
if [ -d "/c/mktorrent"* ]; then
|
||||
MKTORRENT_HOME=$(ls -d /c/mktorrent*)
|
||||
export MKTORRENT_HOME="$MKTORRENT_HOME"
|
||||
export PATH="$PATH:$MKTORRENT_HOME/bin/"
|
||||
fi
|
||||
|
||||
if [[ -n "$IS_WSL" || -n "$WSL_DISTRO_NAME" ]]; then
|
||||
PATH="$PATH:/c/Program Files (x86)/Windows Kits/10/App Certification Kit/"
|
||||
export PATH="$PATH:/c/Program Files (x86)/Windows Kits/10/App Certification Kit/"
|
||||
PATH="$PATH:C:\Users\user\Downloads\m4-1.4.14-1-bin\bin"
|
||||
export PATH="$PATH:C:\Users\user\Downloads\m4-1.4.14-1-bin\bin"
|
||||
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/"
|
||||
PATH="$PATH:C:\Users\user\Downloads\m4-1.4.14-1-bin\bin"
|
||||
export PATH="$PATH:C:\Users\user\Downloads\m4-1.4.14-1-bin\bin"
|
||||
fi
|
@ -1 +0,0 @@
|
||||
A browser profile and accompanying script for launching it. Used to combine I2P with Firefox in a reasonably safe way.
|
99
docs/GOALS.md
Normal file
99
docs/GOALS.md
Normal file
@ -0,0 +1,99 @@
|
||||
Feature Goals
|
||||
=============
|
||||
|
||||
For information about the "Goals guiding the Goals" see: `[PRINCIPLES]`.
|
||||
|
||||
While Windows is the primary platform, some goals may represent cross-platform
|
||||
utility as well. Since a portable jpackage really only needs slightly different
|
||||
arguments on different platforms, cross-platform support is often low-cost.
|
||||
|
||||
- **See Also:**
|
||||
- *Browser Integrations are provided by browser extensions which are contained in their own repositories.*
|
||||
- Firefox:
|
||||
- [git.idk.i2p/idk/I2P-in-Private-Browsing-Mode-Firefox](http://git.idk.i2p/idk/I2P-in-Private-Browsing-Mode-Firefox/)
|
||||
- [i2pgit.org/idk/I2P-in-Private-Browsing-Mode-Firefox](https://i2pgit.org/idk/I2P-in-Private-Browsing-Mode-Firefox/)
|
||||
- [github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox](https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/)
|
||||
- Chromium:
|
||||
- [git.idk.i2p/idk/I2P-Configuration-For-Chromium](http://git.idk.i2p/idk/I2P-Configuration-For-Chromium/)
|
||||
- [i2pgit.org/idk/I2P-Configuration-For-Chromium](https://i2pgit.org/idk/I2P-Configuration-For-Chromium/)
|
||||
- [github.com/eyedeekay/I2P-Configuration-For-Chromium](https://github.com/eyedeekay/I2P-Configuration-For-Chromium/)
|
||||
- *Browser profile management are provided by a freestanding, cross-platform library which is contained in its own repository.*
|
||||
- [git.idk.i2p/idk/i2p.plugins.firefox](http://git.idk.i2p/idk/i2p.plugins.firefox)
|
||||
- [i2pgit.org/idk/i2p.plugins.firefox](https://i2pgit.org/idk/i2p.plugins.firefox)
|
||||
- [github.com/eyedeekay/i2p.plugins.firefox](https://github.com/eyedeekay/i2p.plugins.firefox)
|
||||
|
||||
Build Methods
|
||||
-------------
|
||||
|
||||
- `[X]` Cleanly separate jpackage generation phase from NSIS generation phase
|
||||
- `[X]` Enable archive builds for generating Windows `.exe`'s from Linux hosts
|
||||
|
||||
Installation Methods
|
||||
--------------------
|
||||
|
||||
- `[X]` NSIS installer
|
||||
- `[X]` Portable, directory-based install
|
||||
- `[ ]` Windows Service Support
|
||||
|
||||
Update Methods
|
||||
--------------
|
||||
|
||||
- `[X]` NSIS installer in Default Directory
|
||||
- `[X]` NSIS installer in Portable Directory
|
||||
- `[X]` Handle admin and non-admin updates automatically
|
||||
- `[ ]` Zip-Only portable updater
|
||||
|
||||
Launcher
|
||||
--------
|
||||
|
||||
- `[X]` Detect and handle un-bundled routers on the host system, policy of non-interference
|
||||
- `[X]` Wait for router console to be ready to launch router-console browser
|
||||
- `[X]` Wait for proxy to be ready to launch I2P Web Browser
|
||||
- `[X]` Launch browser instead of router when a repeat-launch is detected
|
||||
- `[X]` GUI component for launching each available component
|
||||
- `[X]` Introduce `browser.properties` for customization
|
||||
- `[ ]` Registry-based browser discovery [Firefox](http://git.idk.i2p/idk/i2p.plugins.firefox/-/issues/3) [Chromium](http://git.idk.i2p/idk/i2p.plugins.firefox/-/issues/4)
|
||||
|
||||
Browser Configuration All
|
||||
-------------------------
|
||||
|
||||
- `[X]` Use identical extensions in Firefox-based and Chromium-based browsers wherever possible
|
||||
- `[X]` Always use a dedicated, I2P Easy-Install specific profile directory
|
||||
- `[X]` Always configure an HTTP Proxy, and safe access to the router console
|
||||
- `[X]` Provide I2P-Specific integrations to the browser UI through WebExtensions
|
||||
- `[X]` Operate in "Strict" mode where the maximum level of defenses are up
|
||||
- `[X]` Operate in "Usability" mode where defense is balanced with utility
|
||||
- `[X]` Operate in "App" mode where we work as a single-purpose window where it is hard to access arbitrary, potentially malicious resources
|
||||
- `[X]` All I2P-Specific profiles should be possible to generate automatically, sight-unseen
|
||||
|
||||
Browser Configuration Firefox
|
||||
-----------------------------
|
||||
|
||||
- `[X]` When using Firefox, download extension updates automatically, from AMO, using an outproxy
|
||||
- `[X]` Integrate I2P in Private Browsing for to provide UI for I2P within Firefox
|
||||
- `[X]` Prevent WebRTC proxy escapes by setting mode `4` `disable_non_proxied_udp` or higher
|
||||
- `[X]` Customize panel for Firefox `App` mode(Not required for Chromiums)
|
||||
|
||||
Browser Configuration Chromium
|
||||
------------------------------
|
||||
|
||||
- `[X]` When using Chromium, load extensions from source and freeze them without updates to prevent unproxied updating.
|
||||
- `[X]` Integrate `I2PChrome.js` to provide UI for I2P within Chrome
|
||||
- `[X]` Prevent WebRTC proxy escapes by setting mode `4` `disable_non_proxied_udp`
|
||||
|
||||
Browser Configuration Strict Mode
|
||||
---------------------------------
|
||||
|
||||
- `[X]` Disable Javascript by default with NoScript
|
||||
- `[X]` Enforce HTTPS where available with HTTPS Everywhere **OR** HTTPS only Mode
|
||||
- `[ ]` Proactively enumerate and disable "Fine" fingerprinting vectors where possible(ongoing)
|
||||
- `[ ]` When running in Tor Browser, look as much like Tor Browser as possible but use an outproxy(ongoing)
|
||||
|
||||
Browser Configuration Usability Mode
|
||||
------------------------------------
|
||||
|
||||
- `[X]` Enable Javascript by default but limit it with jShelter
|
||||
- `[X]` Enforce HTTPS where available with HTTPS Everywhere **OR** HTTPS only Mode
|
||||
- `[X]` Limit attempts to fetch useless junk like advertising with an up-to-date uBlock Origin
|
||||
- `[X]` Limit attempts to reach clearnet CDN's with LocalCDN
|
||||
- `[X]` Isolate `.onion` traffic from `outproxy` traffic and `.i2p` traffic using Onion in Container Tabs
|
123
docs/PRINCIPLES.md
Normal file
123
docs/PRINCIPLES.md
Normal file
@ -0,0 +1,123 @@
|
||||
Guidance
|
||||
========
|
||||
|
||||
This document explains the ideas which are guiding the development of
|
||||
features specific to the I2P Easy-Install bundle.
|
||||
|
||||
The general idea is that it is possible, on most platforms, to make I2P
|
||||
post-install configuration much simpler and much less error-prone. Each
|
||||
section of this document has guidance for a different "Meta-Feature" of
|
||||
the I2P Easy-Install Bundle. For granular, specific information about
|
||||
goals both achieved and un-achieved see `[GOALS]`.
|
||||
|
||||
- **Sections:**
|
||||
|
||||
1. Guidance for Browser Profile Configuration
|
||||
|
||||
Guidance for Browser Profile Configuration
|
||||
------------------------------------------
|
||||
|
||||
- **See also:**
|
||||
- [git.idk.i2p/idk/i2p.plugins.firefox](http://git.idk.i2p/idk/i2p.plugins.firefox)
|
||||
- [i2pgit.org/idk/i2p.plugins.firefox](https://i2pgit.org/idk/i2p.plugins.firefox)
|
||||
- [github.com/eyedeekay/i2p.plugins.firefox](https://github.com/eyedeekay/i2p.plugins.firefox)
|
||||
|
||||
The I2P Easy-Install Bundle for Windows considers basic configuration tasks
|
||||
"Features" when they can be automated. The quintessential example of this
|
||||
is **``Browser Profile Configuration``** where it injects settings into a
|
||||
pre-existing browser from the host system. Solving this problem pre-dates
|
||||
the evolution of `i2p.firefox` into a fully-fledged I2P router distribution
|
||||
and has been the defining goal of this project for its entire existence.
|
||||
|
||||
However, what good browser profile configuration is, is as complicated as
|
||||
how to deploy it. I2P has a unique opportunity to decide how it will handle
|
||||
problems related to browsing in its own context while the network grows
|
||||
and synthesize a useful number of safe browser configurations while also
|
||||
reducing existing browser config fragmentation.
|
||||
|
||||
Easy-Install attempts to limit the number of "Coarse Fingerprints" which it will
|
||||
produce by default to a predictable number. A Coarse Fingerprint is basically
|
||||
a fingerprint "That we know we're making" by offering the ability to configure
|
||||
something differently.
|
||||
|
||||
- **That means:**
|
||||
|
||||
1. It considers the browser integral to the interactive use of the I2P network by a large fraction of users.
|
||||
2. It considers effective browser configuration **impossible for a single user to achieve** because effective browser configuration must have the characteristic of being reflected en-masse(anti-fingerprinting measures are only remotely effective when widely used).
|
||||
3. The browser profile it injects inherits the runtime security characteristics of the **host browser**.
|
||||
4. The browser profile it injects obtains runtime privacy characteristics of the **easy-install bundle**
|
||||
5. The number of coarse browser fingerprint sets is reduced from indeterminately large to `[supported browsers]*[variant configurations]`
|
||||
6. It attempts to balance flexibility with privacy, and accommodate people's preferences where possible.
|
||||
7. It considers browser vendors better at providing browser updates than the I2P Project
|
||||
|
||||
Browser Configurations and Coarse Fingerprints
|
||||
----------------------------------------------
|
||||
|
||||
At this time it offers configuration for Tor Browser, Firefox, Waterfox, and
|
||||
LibreWolf for Firefox-based browsers, and Ungoogled-Chromium, Chromium, Brave,
|
||||
Chrome, and Edgium configuration for Chromium-based browsers. That is a total
|
||||
of **Nine(9)** main browsers. There are **Two(2)** variant configurations,
|
||||
which correspond to "Strict" and "Usability" Modes. That makes a total of
|
||||
**Eighteen(18)** coarse browser fingerprints produced by this bundle. It also
|
||||
has the ability to launch in a "Restricted to Apps" mode where it is only
|
||||
possible to visit I2P sites using links on the I2P application interface(router
|
||||
console, hidden services manager) itself.
|
||||
|
||||
### Strict Mode
|
||||
|
||||
This is not on its face as good as having an almost entirely unified browser
|
||||
fingerprint like Tor Browser attempts to have. It is a simple fact that 18
|
||||
is greater than one. Every active attempt to gain granularity from a browser
|
||||
outside of off-the-shelf Fingerprinting techniques is classified as "Fine"
|
||||
fingerprinting. It is unpredictable, and harder to defend against, more likely
|
||||
to exhibit novelty, and more likely to be affected by the host browser's
|
||||
security. When fingerprinters get this creative disabling Javascript by default
|
||||
is the most complete defense. This is the primary characteristic of Strict Mode,
|
||||
it disables Javascript by default with NoScript. **Strict Mode is the only**
|
||||
**partial defense against fine-fingerprinting offered by this product.** Even
|
||||
disabling Javascript does not close all fine fingerprinting vectors, but it
|
||||
does close most of them and reduce attack surface significantly. It is recommended
|
||||
in combination with Tor Browser, and attempts to be somewhat closer to Tor Browser
|
||||
than Usability Mode. It is the default mode of operation.
|
||||
|
||||
### Usability Mode
|
||||
|
||||
In contrast to Strict Mode, Usability mode offers the greatest agreeable number
|
||||
of browser features enabled by default, including a restricted subset of Javascript.
|
||||
It makes no attempt at all to look like Tor Browser, even when using Tor Browser
|
||||
as a host browser. It does attempt to optimize the browser for use within I2P, including
|
||||
specific optimizations to keep traffic in-network or even retrieve information which is
|
||||
stored on the localhost(while avoiding cache timing attacks). It does this by deploying
|
||||
an alternative loadout of extensions, including ones which block advertising by default
|
||||
and which include a cache of CDN resources in local browser storage.
|
||||
|
||||
### Firefox-Based Browsers
|
||||
|
||||
Because of the relatively high configurability of Firefox-based browser
|
||||
telemetry, Firefox-based browsers are preferred over Chromium-based browsers.
|
||||
Chromium-based browsers will be used by default **only** if a Firefox based
|
||||
browser is unavailable. Only Firefox-variant releases of the Extended Support
|
||||
Release or of the latest stable release are supportable. If a variant lags
|
||||
behind Firefox releases, it will be dropped. The primary reason for the default
|
||||
"Ordering" of Firefox Profile Selection is the speed at which updates can be
|
||||
expected to be applied.
|
||||
|
||||
### Chromium-Based Browsers
|
||||
|
||||
Chromium-based browser selection is more subjective and slightly more ad-hoc.
|
||||
Chromium browsers are chosen based on the variant's stated goals and perceived
|
||||
efficacy in pursuing those goals. For example, if a Chromium distribution is
|
||||
focused on removing telemetry or providing anti-fingerprinting, it is chosen
|
||||
before a Chromium that is provided by Google or integrated tightly with the
|
||||
host OS. This is a matter of judgement on my part and if you disagree you should
|
||||
open an issue and argue with me. I'm not infallible, I'll listen.
|
||||
|
||||
### All other browsers
|
||||
|
||||
With all other browsers attempts at anti-fingerprinting are a moot point. It offers
|
||||
limited configuration options using widely-supported generic browser configuration
|
||||
means. If it doesn't recognize a Firefox or Chromium browser on the host, then it
|
||||
sets the common proxy environment variables `http_proxy` `https_proxy` `ALL_PROXY`
|
||||
and `NO_PROXY` to their appropriate values before launching the browser configuration
|
||||
and attempts to set a directory for the runtime configuration(Profile) by changing
|
||||
to the profile directory.
|
33
docs/RELEASE.md
Normal file
33
docs/RELEASE.md
Normal file
@ -0,0 +1,33 @@
|
||||
# I2P Easy-Install Bundle for Windows 2.4.9
|
||||
|
||||
This is a pre-release of the I2P Easy-Install Bundle for Windows.
|
||||
This changes how the I2P bundle and browser profile manager are installed and integrated with the host system.
|
||||
The Easy-Install bundle is now a "portable" system that can be moved to different locations within or between Windows file-systems while retaining all built-in functionality.
|
||||
A shortcut for starting the I2P router is still provided by the installer for convenience, but the shortcuts for starting the I2P Browser are now integrated with the I2P desktop UI.
|
||||
|
||||
The browser profile manager itself has been split away from the monolithic I2P router+Java/jpackage, and moved into an I2P plugin managed by the router.
|
||||
While this was done primarily to reduce how complex the existing code was, this also results in behavior which is closer to the main distribution of I2P for Windows and will lead to a more flexible installer, which can bundle additional default plugins and may be suitable for installation as a Windows service.
|
||||
I2P Plugins can also be updated independently of the router that hosts them, so it will be possible to update the browser profile manager independently of the router itself.
|
||||
It also means that the browser profile manager can be un-installed by uninstalling the plugin, and much more importantly that the browser profile manager is now compatible with all Java I2P distributions.
|
||||
|
||||
**Why a dev build 3 weeks before the release?**
|
||||
|
||||
By further delineating the components of the bundle, these changes also affected how the release process happens.
|
||||
In particular the build process of each component has been encapsulated in a CI description which can be reproduced on a local PC.
|
||||
This simplifies and automates the build process by ensuring that up-to-date build tools are installed in a brand-new container for every build.
|
||||
In effect this should speed up the release process for I2P Easy-Install for Windows considerably.
|
||||
This release is a test-run of the new process, so I can document what is going on.
|
||||
It breaks down roughly like this:
|
||||
|
||||
- It takes ~22 minutes to compile all the targets for the `i2p.plugins.firefox` and make the resulting artifacts available. During this process, I must insert 1 HSM and enter 1 password. (This part used to be about 30 steps, now it takes 1)
|
||||
- It takes ~22 minutes to compile all the targets for the `i2p.firefox` project and make the resulting artifacts available. This process produces only unsigned artifacts identified by their hashes, and is non-interactive. (This part used to be around 60 steps the first time, and 40 steps each additional time)
|
||||
- `i2p.firefox` updates are signed in their `.su3` form. The `NSIS`-powered `.exe` installer is the current updater. The next step is to sign *just this installer* and generate a torrent of the result. (This process used to depend on the previous build process and couldn't be done independently. Now it takes about 30 seconds)
|
||||
- Generate and sign a newsfeed to notify the users of an update. This process is the only process that is **slower** when containerized, because there are dozens of feeds to be signed in their respective containers. It takes about an hour.
|
||||
|
||||
For you the end user, nothing much should change.
|
||||
You'll get your updates a lot faster, and have more options available for testing.
|
||||
The same installer is used for the updater, and the process is handled the same way.
|
||||
However for developers, testers, and maintainers, this release will result in big changes for the better.
|
||||
|
||||
This release still embeds a `2.4.0` Java I2P router. No changes have been made to update the embedded router.
|
||||
Network behavior will be unchanged until the official `2.5.0` release.
|
25
docs/UPDATES.md
Normal file
25
docs/UPDATES.md
Normal file
@ -0,0 +1,25 @@
|
||||
Setting up an Update Server for an I2P Bundle
|
||||
=============================================
|
||||
|
||||
It is important to set up a signed update server so that people are able to
|
||||
safely and anonymously update your I2P bundle. There are two sort of "Levels"
|
||||
to what you might do to provide updates to your users. Each of them requires the
|
||||
generation of a [signed newsfeed](https://eyedeekay.github.io/Hopefully-Holistic-Guide-to-I2P-Dev-Build-Update-Hosting/),
|
||||
which also serves as a way to provide information to your users about updates,
|
||||
features, and security events.
|
||||
|
||||
This project, `i2p.firefox` a.k.a. the "I2P Easy Install Bundle" uses the "Executable"
|
||||
update subtype, meaning that it capable of installing itself by executing code as the
|
||||
user who runs the update, which is usually the main user of a Windows 10 or 11 PC.
|
||||
This update subtype is highly flexible, but requires the creation of a "Scripted" using
|
||||
something like `NSIS`, `wixl`, or custom code. Other update types include ZIP (used by
|
||||
the core I2P product) and DMG(used by Mac OSX).
|
||||
|
||||
Static HTTP Update URL over I2P
|
||||
===============================
|
||||
|
||||
Bittorrent Update URL over I2P
|
||||
==============================
|
||||
|
||||
[If you choose to do this, consider using zzzot to host your open tracker instead of a normal site](https://github.com/i2p/i2p.plugins.zzzot),
|
||||
which you can obtain from [this I2P link](http://stats.i2p/i2p/plugins/zzzot.su3).
|
@ -1,15 +0,0 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
./clean.sh
|
||||
wsl make distclean
|
||||
./build.sh
|
||||
wsl make
|
@ -21,7 +21,7 @@ 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.proxyList=exit.stormycloud.i2p
|
||||
tunnel.0.i2cpHost=127.0.0.1
|
||||
tunnel.0.i2cpPort=7654
|
||||
tunnel.0.option.inbound.nickname=HTTP Proxy
|
||||
@ -31,7 +31,7 @@ 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.i2ptunnel.httpclient.SSLOutproxies=exit.stormycloud.i2p
|
||||
tunnel.0.option.inbound.length=3
|
||||
tunnel.0.option.inbound.lengthVariance=0
|
||||
tunnel.0.option.outbound.length=3
|
||||
|
34
i2pversion
34
i2pversion
@ -1,16 +1,26 @@
|
||||
#! /usr/bin/env sh
|
||||
|
||||
JNA_VERSION=5.11.0
|
||||
export JNA_VERSION=5.11.0
|
||||
I2PFIREFOX_VERSION=0.0.36
|
||||
export I2PFIREFOX_VERSION=0.0.36
|
||||
# Comment this out to build from an alternate branch or
|
||||
# the tip of the master branch.
|
||||
VERSIONMAJOR=1
|
||||
VERSIONMINOR=9
|
||||
VERSIONBUILD=7
|
||||
JNA_VERSION=5.12.1
|
||||
export JNA_VERSION=5.12.1
|
||||
I2PFIREFOX_VERSION=1.4.991
|
||||
export I2PFIREFOX_VERSION=1.4.991
|
||||
|
||||
export GITHUB_TAG=$(git describe --tags --abbrev=0 | sed 's|i2p||g' | tr -d [a-z-])
|
||||
VERSIONMAJOR=$(echo "$GITHUB_TAG" | cut -d . -f 1)
|
||||
VERSIONMINOR=$(echo "$GITHUB_TAG" | cut -d . -f 2)
|
||||
VERSIONBUILD=$(echo "$GITHUB_TAG" | cut -d . -f 3)
|
||||
if [ -z "$VERSIONBUILD" ]; then
|
||||
VERSIONBUILD=2
|
||||
fi
|
||||
if [ -z "$VERSIONMINOR" ]; then
|
||||
VERSIONMINOR=4
|
||||
fi
|
||||
if [ -z "$VERSIONMAJOR" ]; then
|
||||
VERSIONMAJOR=0
|
||||
fi
|
||||
I2P_VERSION="$VERSIONMAJOR.$VERSIONMINOR.$VERSIONBUILD"
|
||||
export I2P_VERSION="$VERSIONMAJOR.$VERSIONMINOR.$VERSIONBUILD"
|
||||
VERSION=i2p-jpackage-1.9.4
|
||||
export VERSION=i2p-jpackage-1.9.4
|
||||
|
||||
# Comment this out to build from an alternate branch or
|
||||
# the tip of the master branch.
|
||||
VERSION=i2p-2.4.0
|
||||
export VERSION=i2p-2.4.0
|
@ -9,35 +9,23 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.logging.FileHandler;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.logging.SimpleFormatter;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
public class CopyConfigDir extends WindowsServiceUtil {
|
||||
static final Logger logger = Logger.getLogger("configlog");
|
||||
public class CopyConfigDir extends I2PAppUtil {
|
||||
final Log logger;
|
||||
|
||||
public static void initLogger() {
|
||||
try {
|
||||
// This block configure the logger with handler and formatter
|
||||
FileHandler fh = new FileHandler(logFile().toString());
|
||||
logger.addHandler(fh);
|
||||
SimpleFormatter formatter = new SimpleFormatter();
|
||||
fh.setFormatter(formatter);
|
||||
// the following statement is used to log any messages
|
||||
logger.info("My first log");
|
||||
} catch (SecurityException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
public CopyConfigDir(RouterContext ctx) {
|
||||
logger = ctx.logManager().getLog(CopyConfigDir.class);
|
||||
}
|
||||
|
||||
public static boolean copyDirectory(String baseDir, String workDir) {
|
||||
public boolean copyDirectory(String baseDir, String workDir) {
|
||||
File baseFile = new File(baseDir);
|
||||
File workFile = new File(workDir);
|
||||
return copyDirectory(baseFile, workFile);
|
||||
}
|
||||
|
||||
public static boolean copyDirectory(File baseDir, File workDir) {
|
||||
public boolean copyDirectory(File baseDir, File workDir) {
|
||||
for (File file : baseDir.listFiles()) {
|
||||
String fPath = file.getAbsolutePath().replace(
|
||||
file.getParentFile().getAbsolutePath(), "");
|
||||
@ -46,13 +34,13 @@ public class CopyConfigDir extends WindowsServiceUtil {
|
||||
if (copyDirectory(file, new File(newPath)))
|
||||
return false;
|
||||
if (file.isFile())
|
||||
if (!copyFile(file, new File(newPath), true))
|
||||
if (0 == copyFile(file, new File(newPath), true))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean copyConfigDirectory(File baseDir, File workDir) {
|
||||
public boolean copyConfigDirectory(File baseDir, File workDir) {
|
||||
for (File file : baseDir.listFiles()) {
|
||||
// System.out.println(file.getAbsolutePath());
|
||||
String fPath = file.getAbsolutePath().replace(
|
||||
@ -61,37 +49,52 @@ public class CopyConfigDir extends WindowsServiceUtil {
|
||||
if (file.isDirectory())
|
||||
if (!copyConfigDirectory(file, new File(newPath)))
|
||||
return false;
|
||||
if (file.isFile())
|
||||
if (!copyFileNeverOverwrite(
|
||||
file,
|
||||
new File(newPath))) // new File(workDir, file.toString())))
|
||||
if (file.isFile()) {
|
||||
int cnr = copyFileNeverOverwrite(file, new File(newPath));
|
||||
if (0 == cnr)
|
||||
return false;
|
||||
if (1 == cnr) {
|
||||
logger.info(
|
||||
"using jpackaged configs in a jpackaged install, creating jpackaged file");
|
||||
File jpackagedConfigsInUse = new File(appImageHome(), "jpackaged");
|
||||
if (!jpackagedConfigsInUse.exists()) {
|
||||
try {
|
||||
jpackagedConfigsInUse.createNewFile();
|
||||
} catch (IOException e) {
|
||||
logger.warn(
|
||||
"Error creating jpackaged file, delete config files manually when uninstalling");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (-1 == cnr) {
|
||||
logger.info(
|
||||
"not overwriting existing config file, not creating jpackaged file");
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean copyFileNeverOverwrite(String basePath,
|
||||
String workPath) {
|
||||
public int copyFileNeverOverwrite(String basePath, String workPath) {
|
||||
File baseFile = new File(basePath);
|
||||
File workFile = new File(workPath);
|
||||
return copyFileNeverOverwrite(baseFile, workFile);
|
||||
}
|
||||
|
||||
public static boolean copyFileNeverOverwrite(File basePath, File workPath) {
|
||||
public int copyFileNeverOverwrite(File basePath, File workPath) {
|
||||
return copyFile(basePath, workPath, false);
|
||||
}
|
||||
|
||||
public static boolean copyFile(File basePath, File workPath,
|
||||
boolean overWrite) {
|
||||
public int copyFile(File basePath, File workPath, boolean overWrite) {
|
||||
if (!basePath.exists()) {
|
||||
logger.info(basePath.getAbsolutePath() + " doesn't exist, not copying");
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!overWrite && workPath.exists()) {
|
||||
logger.info(workPath.getAbsolutePath() +
|
||||
" already exists, not overwriting");
|
||||
return true;
|
||||
return -1;
|
||||
}
|
||||
|
||||
File workDir = workPath.getParentFile();
|
||||
@ -111,180 +114,35 @@ public class CopyConfigDir extends WindowsServiceUtil {
|
||||
}
|
||||
in.close();
|
||||
out.close();
|
||||
return true;
|
||||
return 1;
|
||||
} catch (Throwable e) {
|
||||
logger.warning(e.toString());
|
||||
logger.warning("failed to copy " + basePath.getAbsolutePath() + " to " +
|
||||
workPath.getAbsolutePath());
|
||||
return false;
|
||||
logger.warn(e.toString());
|
||||
logger.warn("failed to copy " + basePath.getAbsolutePath() + " to " +
|
||||
workPath.getAbsolutePath());
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
protected 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);
|
||||
}
|
||||
}
|
||||
File i2p = appImageHome();
|
||||
logger.info("Checking for signs of life in I2P_CONFIG directory: " + i2p);
|
||||
return i2p;
|
||||
}
|
||||
|
||||
protected 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);
|
||||
}
|
||||
}
|
||||
File i2p = appImageHome();
|
||||
logger.info("Checking for signs of life in I2P directory: " + i2p);
|
||||
return i2p;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
protected 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
|
||||
*/
|
||||
protected 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 binary 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, then getting the binary path on a per-platform basis. The path
|
||||
* returned will be relative to the root.
|
||||
*
|
||||
* @return the app-image root
|
||||
*/
|
||||
protected static String appImageExe() {
|
||||
File aih = appImageHome();
|
||||
if (aih != null) {
|
||||
switch (osName()) {
|
||||
case "windows":
|
||||
return "I2P.exe";
|
||||
case "mac":
|
||||
case "linux":
|
||||
return "./bin/I2P";
|
||||
}
|
||||
}
|
||||
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 the config directory to the end onn a
|
||||
* per-platform basis
|
||||
*
|
||||
* @return the app-image root
|
||||
*/
|
||||
protected 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;
|
||||
}
|
||||
|
||||
protected static boolean copyConfigDir() {
|
||||
protected boolean copyConfigDir() {
|
||||
File appImageConfigDir = appImageConfig();
|
||||
File appImageHomeDir = selectHome();
|
||||
return copyConfigDirectory(appImageConfigDir, appImageHomeDir);
|
||||
}
|
||||
|
||||
protected static String routerConfig() {
|
||||
File appImageHomeDir = selectHome();
|
||||
File routerConf = new File(appImageHomeDir, "router.config");
|
||||
if (routerConf != null) {
|
||||
if (routerConf.exists()) {
|
||||
return routerConf.getAbsolutePath();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* set up the path to the log file
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected File logFile() { return logFile("launcher.log"); }
|
||||
|
||||
/**
|
||||
* set up the path to the log file
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected static File logFile() { return logFile("launcher.log"); }
|
||||
|
||||
/**
|
||||
* set up the path to the log file
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected static File logFile(String p) {
|
||||
File log = new File(selectProgramFile(), "logs");
|
||||
protected File logFile(String p) {
|
||||
File log = new File(selectHome(), "logs");
|
||||
if (!log.exists())
|
||||
log.mkdirs();
|
||||
return new File(log, p);
|
||||
|
@ -1,35 +0,0 @@
|
||||
package net.i2p.router;
|
||||
|
||||
import com.sun.jna.WString;
|
||||
import com.sun.jna.platform.win32.Kernel32;
|
||||
import com.sun.jna.platform.win32.Kernel32Util;
|
||||
|
||||
public class Elevator {
|
||||
public static void main(String... args) {
|
||||
executeAsAdministrator("c:\\windows\\system32\\notepad.exe", "");
|
||||
}
|
||||
|
||||
public static void executeAsAdministrator(String command, String args) {
|
||||
if (command == "" || command == null) {
|
||||
System.out.println("No command specified");
|
||||
return;
|
||||
}
|
||||
Shell32X.SHELLEXECUTEINFO execInfo = new Shell32X.SHELLEXECUTEINFO();
|
||||
execInfo.lpFile = new WString(command);
|
||||
if (args != null)
|
||||
execInfo.lpParameters = new WString(args);
|
||||
execInfo.nShow = Shell32X.SW_SHOWDEFAULT;
|
||||
execInfo.fMask = Shell32X.SEE_MASK_NOCLOSEPROCESS;
|
||||
execInfo.lpVerb = new WString("runas");
|
||||
boolean result = Shell32X.INSTANCE.ShellExecuteEx(execInfo);
|
||||
|
||||
if (!result) {
|
||||
int lastError = Kernel32.INSTANCE.GetLastError();
|
||||
String errorMessage =
|
||||
Kernel32Util.formatMessageFromLastErrorCode(lastError);
|
||||
throw new RuntimeException("Error performing elevation: " + lastError +
|
||||
": " + errorMessage +
|
||||
" (apperror=" + execInfo.hInstApp + ")");
|
||||
}
|
||||
}
|
||||
}
|
106
java/net/i2p/router/I2PAppUtil.java
Normal file
106
java/net/i2p/router/I2PAppUtil.java
Normal file
@ -0,0 +1,106 @@
|
||||
package net.i2p.router;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
public class I2PAppUtil extends WindowsAppUtil {
|
||||
public String ServiceUpdaterString() {
|
||||
return "http://tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq.b32.i2p/news.su3";
|
||||
}
|
||||
public String ServiceBackupUpdaterString() {
|
||||
return "http://dn3tvalnjz432qkqsvpfdqrwpqkw3ye4n4i2uyfr4jexvo3sp5ka.b32.i2p/news.su3";
|
||||
}
|
||||
public String ServiceStaticUpdaterString() {
|
||||
return "http://echelon.i2p/i2p/i2pupdate.sud,http://stats.i2p/i2p/i2pupdate.sud";
|
||||
}
|
||||
|
||||
public String getProgramFilesInstall() {
|
||||
String programFiles = System.getenv("PROGRAMFILES");
|
||||
if (programFiles != null) {
|
||||
File programFilesI2P = new File(programFiles, "i2p/i2p.exe");
|
||||
if (programFilesI2P.exists())
|
||||
return programFilesI2P.getAbsolutePath();
|
||||
}
|
||||
String programFiles86 = System.getenv("PROGRAMFILES86");
|
||||
if (programFiles86 != null) {
|
||||
File programFiles86I2P = new File(programFiles86, "i2p/i2p.exe");
|
||||
if (programFiles86I2P.exists())
|
||||
return programFiles86I2P.getAbsolutePath();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean checkProgramFilesInstall() {
|
||||
String programFiles = System.getenv("PROGRAMFILES");
|
||||
if (programFiles != null) {
|
||||
File programFilesI2P = new File(programFiles, "i2p/i2p.exe");
|
||||
if (programFilesI2P.exists())
|
||||
return true;
|
||||
}
|
||||
String programFiles86 = System.getenv("PROGRAMFILES86");
|
||||
if (programFiles86 != null) {
|
||||
File programFiles86I2P = new File(programFiles86, "i2p/i2p.exe");
|
||||
if (programFiles86I2P.exists())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean promptUserInstallStartIfAvailable() {
|
||||
if (osName() != "windows") {
|
||||
return true;
|
||||
}
|
||||
if (checkProgramFilesInstall()) {
|
||||
int a;
|
||||
String message =
|
||||
"It appears you have an existing, unbundled I2P rotuer installed.\n";
|
||||
message +=
|
||||
"However, it is not running yet. Please start it using the shortcut on the desktop.\n";
|
||||
message +=
|
||||
"If you click \"No\", the Easy-Install router will be launched instead.\n";
|
||||
a = JOptionPane.showConfirmDialog(null, message,
|
||||
"I2P Service detected not running",
|
||||
JOptionPane.YES_NO_OPTION);
|
||||
if (a == JOptionPane.NO_OPTION) {
|
||||
// Do nothing here, this will continue on to launch a jpackaged router
|
||||
return true;
|
||||
} else {
|
||||
try {
|
||||
String pfi = getProgramFilesInstall();
|
||||
if (pfi != null)
|
||||
Runtime.getRuntime().exec(new String[] {pfi});
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the path to the binary 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, then getting the binary path on a per-platform basis. The path
|
||||
* returned will be relative to the root.
|
||||
*
|
||||
* @return the app-image root
|
||||
*/
|
||||
protected String appImageExe() {
|
||||
File aih = appImageHome();
|
||||
if (aih != null) {
|
||||
// get the name of the aih directory itself, which will be the default
|
||||
// name of the executable as well
|
||||
String baseName = "I2P";
|
||||
switch (osName()) {
|
||||
case "windows":
|
||||
return baseName + ".exe";
|
||||
case "mac":
|
||||
case "linux":
|
||||
return "./bin/" + baseName;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,123 +0,0 @@
|
||||
package net.i2p.router;
|
||||
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.Structure;
|
||||
import com.sun.jna.WString;
|
||||
import com.sun.jna.platform.win32.Shell32;
|
||||
import com.sun.jna.platform.win32.WinDef.HINSTANCE;
|
||||
import com.sun.jna.platform.win32.WinDef.HWND;
|
||||
import com.sun.jna.platform.win32.WinNT.HANDLE;
|
||||
import com.sun.jna.platform.win32.WinReg.HKEY;
|
||||
import com.sun.jna.win32.W32APIOptions;
|
||||
import java.util.*;
|
||||
|
||||
public interface Shell32X extends Shell32 {
|
||||
Shell32X INSTANCE = (Shell32X)Native.loadLibrary(
|
||||
"shell32", Shell32X.class, W32APIOptions.UNICODE_OPTIONS);
|
||||
|
||||
int SW_HIDE = 0;
|
||||
int SW_MAXIMIZE = 3;
|
||||
int SW_MINIMIZE = 6;
|
||||
int SW_RESTORE = 9;
|
||||
int SW_SHOW = 5;
|
||||
int SW_SHOWDEFAULT = 10;
|
||||
int SW_SHOWMAXIMIZED = 3;
|
||||
int SW_SHOWMINIMIZED = 2;
|
||||
int SW_SHOWMINNOACTIVE = 7;
|
||||
int SW_SHOWNA = 8;
|
||||
int SW_SHOWNOACTIVATE = 4;
|
||||
int SW_SHOWNORMAL = 1;
|
||||
|
||||
/** File not found. */
|
||||
int SE_ERR_FNF = 2;
|
||||
|
||||
/** Path not found. */
|
||||
int SE_ERR_PNF = 3;
|
||||
|
||||
/** Access denied. */
|
||||
int SE_ERR_ACCESSDENIED = 5;
|
||||
|
||||
/** Out of memory. */
|
||||
int SE_ERR_OOM = 8;
|
||||
|
||||
/** DLL not found. */
|
||||
int SE_ERR_DLLNOTFOUND = 32;
|
||||
|
||||
/** Cannot share an open file. */
|
||||
int SE_ERR_SHARE = 26;
|
||||
|
||||
int SEE_MASK_NOCLOSEPROCESS = 0x00000040;
|
||||
|
||||
int ShellExecute(int i, String lpVerb, String lpFile, String lpParameters,
|
||||
String lpDirectory, int nShow);
|
||||
|
||||
boolean ShellExecuteEx(SHELLEXECUTEINFO lpExecInfo);
|
||||
|
||||
public static class SHELLEXECUTEINFO extends Structure {
|
||||
/*
|
||||
* DWORD cbSize;
|
||||
* ULONG fMask;
|
||||
* HWND hwnd;
|
||||
* LPCTSTR lpVerb;
|
||||
* LPCTSTR lpFile;
|
||||
* LPCTSTR lpParameters;
|
||||
* LPCTSTR lpDirectory;
|
||||
* int nShow;
|
||||
* HINSTANCE hInstApp;
|
||||
* LPVOID lpIDList;
|
||||
* LPCTSTR lpClass;
|
||||
* HKEY hkeyClass;
|
||||
* DWORD dwHotKey;
|
||||
* union {
|
||||
* HANDLE hIcon;
|
||||
* HANDLE hMonitor;
|
||||
* } DUMMYUNIONNAME;
|
||||
* HANDLE hProcess;
|
||||
*/
|
||||
|
||||
public int cbSize = size();
|
||||
public int fMask;
|
||||
public HWND hwnd;
|
||||
public WString lpVerb;
|
||||
public WString lpFile;
|
||||
public WString lpParameters;
|
||||
public WString lpDirectory;
|
||||
public int nShow;
|
||||
public HINSTANCE hInstApp;
|
||||
public Pointer lpIDList;
|
||||
public WString lpClass;
|
||||
public HKEY hKeyClass;
|
||||
public int dwHotKey;
|
||||
|
||||
/*
|
||||
* Actually:
|
||||
* union {
|
||||
* HANDLE hIcon;
|
||||
* HANDLE hMonitor;
|
||||
* } DUMMYUNIONNAME;
|
||||
*/
|
||||
public HANDLE hMonitor;
|
||||
public HANDLE hProcess;
|
||||
|
||||
protected List getFieldOrder() {
|
||||
return Arrays.asList(new String[] {
|
||||
"cbSize",
|
||||
"fMask",
|
||||
"hwnd",
|
||||
"lpVerb",
|
||||
"lpFile",
|
||||
"lpParameters",
|
||||
"lpDirectory",
|
||||
"nShow",
|
||||
"hInstApp",
|
||||
"lpIDList",
|
||||
"lpClass",
|
||||
"hKeyClass",
|
||||
"dwHotKey",
|
||||
"hMonitor",
|
||||
"hProcess",
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@ -1,27 +1,22 @@
|
||||
package net.i2p.router;
|
||||
|
||||
import static net.i2p.update.UpdateType.*;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.InetAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.util.*;
|
||||
import java.util.logging.FileHandler;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.logging.SimpleFormatter;
|
||||
import net.i2p.app.ClientAppManager;
|
||||
import net.i2p.crypto.*;
|
||||
import net.i2p.i2pfirefox.*;
|
||||
import net.i2p.router.Router;
|
||||
import net.i2p.router.RouterLaunch;
|
||||
import net.i2p.update.*;
|
||||
import net.i2p.update.UpdateManager;
|
||||
import net.i2p.update.UpdatePostProcessor;
|
||||
import net.i2p.update.UpdateType.*;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* Launches a router from %PROGRAMFILES%/I2P using configuration data in
|
||||
* %LOCALAPPDATA%/I2P.. Uses Java 9 APIs.
|
||||
* Launches a router from %WORKINGDIR%/I2P using configuration data in
|
||||
* %WORKINGDIR%/I2P.. Uses Java 9 APIs.
|
||||
*
|
||||
* Sets the following properties:
|
||||
* i2p.dir.base - this points to the (read-only) resources inside the bundle
|
||||
@ -29,66 +24,18 @@ import net.i2p.update.UpdatePostProcessor;
|
||||
* appdata
|
||||
* router.pid - the pid of the java process.
|
||||
*/
|
||||
public class WinLauncher extends CopyConfigDir {
|
||||
static WindowsUpdatePostProcessor wupp = null;
|
||||
private static Router i2pRouter;
|
||||
|
||||
public static void main(String[] args) {
|
||||
setupLauncher();
|
||||
initLogger();
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class WinLauncher extends I2PAppUtil {
|
||||
private final CopyConfigDir copyConfigDir;
|
||||
WinUpdatePostProcessor wupp = null;
|
||||
private Router i2pRouter;
|
||||
private final Log logger;
|
||||
public WinLauncher() {
|
||||
File programs = programFile();
|
||||
File home = homeDir();
|
||||
|
||||
System.setProperty("i2p.dir.base", programs.getAbsolutePath());
|
||||
System.setProperty(
|
||||
"i2p.dir.base",
|
||||
new File(programs.getAbsolutePath(), "config").getAbsolutePath());
|
||||
System.setProperty("i2p.dir.config", home.getAbsolutePath());
|
||||
System.setProperty("router.pid",
|
||||
String.valueOf(ProcessHandle.current().pid()));
|
||||
@ -99,117 +46,69 @@ public class WinLauncher extends CopyConfigDir {
|
||||
* to find the JVM and Runtime bundle. This broke Windows 11 installs.
|
||||
*/
|
||||
System.setProperty("user.dir", programs.getAbsolutePath());
|
||||
logger.info("\t" + System.getProperty("user.dir"));
|
||||
logger.info("\t" + System.getProperty("i2p.dir.base"));
|
||||
logger.info("\t" + System.getProperty("i2p.dir.config"));
|
||||
logger.info("\t" + System.getProperty("router.pid"));
|
||||
boolean continuerunning = promptServiceStartIfAvailable("i2p");
|
||||
|
||||
i2pRouter = new Router(routerConfig(), System.getProperties());
|
||||
copyConfigDir = new CopyConfigDir(i2pRouter.getContext());
|
||||
logger = i2pRouter.getContext().logManager().getLog(WinLauncher.class);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
var launcher = new WinLauncher();
|
||||
launcher.setupLauncher();
|
||||
int proxyTimeoutTime = 200;
|
||||
|
||||
launcher.logger.info("\t" + System.getProperty("user.dir"));
|
||||
launcher.logger.info("\t" + System.getProperty("i2p.dir.base"));
|
||||
launcher.logger.info("\t" + System.getProperty("i2p.dir.config"));
|
||||
launcher.logger.info("\t" + System.getProperty("router.pid"));
|
||||
boolean continuerunning = launcher.promptServiceStartIfAvailable("i2p");
|
||||
if (!continuerunning) {
|
||||
logger.severe(
|
||||
launcher.logger.error(
|
||||
"Service startup failure, please start I2P service with services.msc");
|
||||
System.exit(2);
|
||||
} else {
|
||||
fixServiceConfig();
|
||||
}
|
||||
continuerunning = promptUserInstallStartIfAvailable();
|
||||
continuerunning = launcher.promptUserInstallStartIfAvailable();
|
||||
if (!continuerunning) {
|
||||
logger.severe("User-install startup required.");
|
||||
launcher.logger.error("User-install startup required.");
|
||||
System.exit(2);
|
||||
} else {
|
||||
fixServiceConfig();
|
||||
}
|
||||
|
||||
// This actually does most of what we use NSIS for if NSIS hasn't
|
||||
// already done it, which essentially makes this whole thing portable.
|
||||
if (!copyConfigDir()) {
|
||||
logger.severe("Cannot copy the configuration directory");
|
||||
if (!launcher.copyConfigDir.copyConfigDir()) {
|
||||
launcher.logger.error("Cannot copy the configuration directory");
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
if (launchBrowser(privateBrowsing, usabilityMode, chromiumFirst,
|
||||
proxyTimeoutTime, newArgsList)) {
|
||||
System.exit(0);
|
||||
}
|
||||
i2pRouter = new Router(routerConfig(), System.getProperties());
|
||||
if (!isInstalled("i2p")) {
|
||||
if (i2pRouter.saveConfig("routerconsole.browser", null)) {
|
||||
logger.info("removed routerconsole.browser config");
|
||||
}
|
||||
if (i2pRouter.saveConfig("routerconsole.browser",
|
||||
appImageExe() + " -noproxycheck")) {
|
||||
logger.info("updated routerconsole.browser config " + appImageExe());
|
||||
if (!launcher.isInstalled("i2p")) {
|
||||
if (launcher.i2pRouter.saveConfig("routerconsole.browser", "NUL")) {
|
||||
launcher.logger.info("updated routerconsole.browser config " +
|
||||
launcher.appImageExe());
|
||||
}
|
||||
}
|
||||
logger.info("Router is configured");
|
||||
launcher.logger.info("Router is configured");
|
||||
|
||||
Thread registrationThread = new Thread(REGISTER_UPP);
|
||||
Thread registrationThread = new Thread(launcher.REGISTER_UPP);
|
||||
registrationThread.setName("UPP Registration");
|
||||
registrationThread.setDaemon(true);
|
||||
registrationThread.start();
|
||||
|
||||
setNotStarting();
|
||||
|
||||
i2pRouter.runRouter();
|
||||
launcher.i2pRouter.runRouter();
|
||||
}
|
||||
|
||||
private static void fixServiceConfig() {
|
||||
// If the user installed the Easy bundle before installing the
|
||||
// regulalr bundle, then they have a config file which contains the
|
||||
// wrong update URL. Check for it, and change it back if necessary.
|
||||
// closes #23
|
||||
i2pRouter = new Router(routerConfig(), System.getProperties());
|
||||
if (isInstalled("i2p") || checkProgramFilesInstall()) {
|
||||
String newsURL = i2pRouter.getConfigSetting("router.newsURL");
|
||||
if (newsURL != null) {
|
||||
if (newsURL.contains("win/beta")) {
|
||||
logger.info(
|
||||
"checked router.newsURL config, containes win/beta in a service install, invalid update type");
|
||||
if (i2pRouter.saveConfig("router.newsURL", ServiceUpdaterString())) {
|
||||
logger.info("updated routerconsole.browser config " +
|
||||
appImageExe());
|
||||
}
|
||||
}
|
||||
}
|
||||
String backupNewsURL = i2pRouter.getConfigSetting("router.backupNewsURL");
|
||||
if (backupNewsURL != null) {
|
||||
if (backupNewsURL.contains("win/beta")) {
|
||||
logger.info(
|
||||
"checked router.backupNewsURL config, containes win/beta in a service install, invalid update type");
|
||||
if (i2pRouter.saveConfig("router.backupNewsURL",
|
||||
ServiceBackupUpdaterString())) {
|
||||
logger.info("updated routerconsole.browser config " +
|
||||
appImageExe());
|
||||
}
|
||||
}
|
||||
}
|
||||
String updateURL = i2pRouter.getConfigSetting("router.updateURL");
|
||||
if (updateURL != null) {
|
||||
if (updateURL.contains("i2pwinupdate.su3")) {
|
||||
logger.info(
|
||||
"checked router.updateURL config, containes win/beta in a service install, invalid update type");
|
||||
if (i2pRouter.saveConfig("router.updateURL",
|
||||
ServiceStaticUpdaterString())) {
|
||||
logger.info("updated routerconsole.browser config " +
|
||||
appImageExe());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void setupLauncher() {
|
||||
private void setupLauncher() {
|
||||
File jrehome = javaHome();
|
||||
logger.info("jre home is: " + jrehome.getAbsolutePath());
|
||||
File appimagehome = appImageHome();
|
||||
logger.info("appimage home is: " + appimagehome.getAbsolutePath());
|
||||
}
|
||||
|
||||
private static File programFile() {
|
||||
File programs = selectProgramFile();
|
||||
private File programFile() {
|
||||
File programs = selectHome();
|
||||
if (!programs.exists())
|
||||
programs.mkdirs();
|
||||
else if (!programs.isDirectory()) {
|
||||
logger.warning(
|
||||
logger.warn(
|
||||
programs +
|
||||
" exists but is not a directory. Please get it out of the way");
|
||||
System.exit(1);
|
||||
@ -217,12 +116,12 @@ public class WinLauncher extends CopyConfigDir {
|
||||
return programs;
|
||||
}
|
||||
|
||||
private static File homeDir() {
|
||||
private File homeDir() {
|
||||
File home = selectHome();
|
||||
if (!home.exists())
|
||||
home.mkdirs();
|
||||
else if (!home.isDirectory()) {
|
||||
logger.warning(
|
||||
logger.warn(
|
||||
home +
|
||||
" exists but is not a directory. Please get it out of the way");
|
||||
System.exit(1);
|
||||
@ -230,34 +129,9 @@ public class WinLauncher extends CopyConfigDir {
|
||||
return home;
|
||||
}
|
||||
|
||||
private static boolean launchBrowser(boolean privateBrowsing,
|
||||
boolean usabilityMode,
|
||||
boolean chromiumFirst,
|
||||
int proxyTimeoutTime,
|
||||
ArrayList<String> newArgsList) {
|
||||
if (i2pIsRunning()) {
|
||||
logger.info("I2P is already running, launching an I2P browser");
|
||||
I2PBrowser i2pBrowser = new I2PBrowser();
|
||||
i2pBrowser.usability = usabilityMode;
|
||||
i2pBrowser.chromiumFirst = chromiumFirst;
|
||||
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;
|
||||
}
|
||||
|
||||
// see
|
||||
// https://stackoverflow.com/questions/434718/sockets-discover-port-availability-using-java
|
||||
private static boolean isAvailable(int portNr) {
|
||||
private boolean isAvailable(int portNr) {
|
||||
boolean portFree;
|
||||
try (var ignored = new ServerSocket(portNr)) {
|
||||
portFree = true;
|
||||
@ -267,88 +141,7 @@ public class WinLauncher extends CopyConfigDir {
|
||||
return portFree;
|
||||
}
|
||||
|
||||
private static boolean i2pIsRunningCheck() {
|
||||
// check if there's something listening on port 7657(Router Console)
|
||||
if (!isAvailable(7657))
|
||||
return true;
|
||||
// check if there's something listening on port 7654(I2CP)
|
||||
if (!isAvailable(7654))
|
||||
return true;
|
||||
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;
|
||||
}
|
||||
logger.info("startup file does not exist but we're running now");
|
||||
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 ping = new File(home, "router.ping");
|
||||
if (ping.exists()) {
|
||||
long diff = System.currentTimeMillis() - ping.lastModified();
|
||||
if (diff > 60 * 1000) {
|
||||
logger.info(
|
||||
"router.ping exists and is more than 1 minute old, I2P does not appear to be running.");
|
||||
logger.info("If I2P is running, report this as a bug.");
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
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 = () -> {
|
||||
private final Runnable REGISTER_UPP = () -> {
|
||||
RouterContext ctx;
|
||||
while ((ctx = i2pRouter.getContext()) == null) {
|
||||
sleep(1000);
|
||||
@ -363,7 +156,7 @@ public class WinLauncher extends CopyConfigDir {
|
||||
null) {
|
||||
sleep(1000);
|
||||
}
|
||||
WindowsUpdatePostProcessor wupp = new WindowsUpdatePostProcessor(ctx);
|
||||
WinUpdatePostProcessor wupp = new WinUpdatePostProcessor(ctx);
|
||||
um.register(wupp, UpdateType.ROUTER_SIGNED_SU3, SU3File.TYPE_EXE);
|
||||
um.register(wupp, UpdateType.ROUTER_DEV_SU3, SU3File.TYPE_EXE);
|
||||
};
|
||||
@ -373,7 +166,7 @@ public class WinLauncher extends CopyConfigDir {
|
||||
*
|
||||
* @param millis
|
||||
*/
|
||||
private static void sleep(int millis) {
|
||||
private void sleep(int millis) {
|
||||
try {
|
||||
Thread.sleep(millis);
|
||||
} catch (InterruptedException bad) {
|
||||
|
@ -16,7 +16,7 @@ import net.i2p.update.UpdateType;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.SystemVersion;
|
||||
|
||||
public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
|
||||
public class WinUpdatePostProcessor implements UpdatePostProcessor {
|
||||
private final Log _log;
|
||||
private final RouterContext ctx;
|
||||
private final AtomicBoolean hook = new AtomicBoolean();
|
||||
@ -26,9 +26,9 @@ public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
|
||||
|
||||
private volatile File positionedFile = null;
|
||||
|
||||
WindowsUpdatePostProcessor(RouterContext ctx) {
|
||||
WinUpdatePostProcessor(RouterContext ctx) {
|
||||
this.ctx = ctx;
|
||||
this._log = ctx.logManager().getLog(WindowsUpdatePostProcessor.class);
|
||||
this._log = ctx.logManager().getLog(WinUpdatePostProcessor.class);
|
||||
}
|
||||
|
||||
public String getVersion() { return version; }
|
||||
@ -39,14 +39,13 @@ public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
|
||||
String version, File file)
|
||||
throws IOException {
|
||||
_log.info("Got an update to post-process");
|
||||
if (type != UpdateType.ROUTER_SIGNED_SU3 &&
|
||||
type != UpdateType.ROUTER_DEV_SU3) {
|
||||
_log.warn("Unsupported update type " + type);
|
||||
return;
|
||||
}
|
||||
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;
|
||||
@ -64,6 +63,21 @@ public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
|
||||
|
||||
ctx.addFinalShutdownTask(
|
||||
new WinUpdateProcess(ctx, this::getVersion, this::getFile));
|
||||
} else {
|
||||
if (fileType == SU3File.TYPE_ZIP) {
|
||||
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 ZipUpdateProcess(ctx, this::getVersion, this::getFile));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -47,34 +47,34 @@ class WinUpdateProcess implements Runnable {
|
||||
File workingDir = workDir();
|
||||
File 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());
|
||||
Map<String, String> env = pb.environment();
|
||||
env.put("OLD_I2P_VERSION", version);
|
||||
env.remove("RESTART_I2P");
|
||||
// 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());
|
||||
Map<String, String> 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");
|
||||
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());
|
||||
try {
|
||||
Process p = pb.directory(workingDir)
|
||||
.redirectErrorStream(true)
|
||||
.redirectOutput(logFile)
|
||||
.start();
|
||||
exitCode = p.waitFor();
|
||||
if (exitCode != 0)
|
||||
_log.error("Update failed with exit code " + exitCode + " see " +
|
||||
logFile.getAbsolutePath() + " for more details");
|
||||
} catch (IOException ex) {
|
||||
_log.error(
|
||||
"Unable to run update program in background. Update will fail.", ex);
|
||||
} catch (InterruptedException ex) {
|
||||
_log.error(
|
||||
"Unable to run update program in background. Update will fail.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
143
java/net/i2p/router/WindowsAppUtil.java
Normal file
143
java/net/i2p/router/WindowsAppUtil.java
Normal file
@ -0,0 +1,143 @@
|
||||
package net.i2p.router;
|
||||
|
||||
import java.io.File;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
public class WindowsAppUtil extends WindowsServiceUtil {
|
||||
private File checkPathEnvironmentVariable(String name) {
|
||||
String path_override = System.getenv(name);
|
||||
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(name + " is not a directory: " + path);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected File selectHome() { // throws Exception {
|
||||
File i2p = checkPathEnvironmentVariable("JPACKAGE_HOME");
|
||||
if (i2p == null)
|
||||
i2p = appImageHome();
|
||||
return i2p;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
protected 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
|
||||
*/
|
||||
protected 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 binary 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, then getting the binary path on a per-platform basis. The path
|
||||
* returned will be relative to the root.
|
||||
*
|
||||
* @return the app-image root
|
||||
*/
|
||||
protected String appImageExe() {
|
||||
File aih = appImageHome();
|
||||
if (aih != null) {
|
||||
// get the name of the aih directory itself, which will be the default
|
||||
// name of the executable as well
|
||||
String baseName = aih.getName();
|
||||
switch (osName()) {
|
||||
case "windows":
|
||||
return baseName + ".exe";
|
||||
case "mac":
|
||||
case "linux":
|
||||
return "./bin/" + baseName;
|
||||
}
|
||||
}
|
||||
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 the config directory to the end onn a
|
||||
* per-platform basis
|
||||
*
|
||||
* @return the app-image root
|
||||
*/
|
||||
protected 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;
|
||||
}
|
||||
|
||||
protected String routerConfig() {
|
||||
File appImageHomeDir = selectHome();
|
||||
File routerConf = new File(appImageHomeDir, "router.config");
|
||||
if (routerConf != null) {
|
||||
if (routerConf.exists()) {
|
||||
return routerConf.getAbsolutePath();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -31,7 +31,7 @@ import javax.swing.JOptionPane;
|
||||
|
||||
public class WindowsServiceUtil {
|
||||
public WindowsServiceUtil() {}
|
||||
public static String queryService(String serviceName) {
|
||||
public String queryService(String serviceName) {
|
||||
String result = "";
|
||||
String line;
|
||||
ProcessBuilder pb = new ProcessBuilder("sc", "query", serviceName);
|
||||
@ -54,7 +54,7 @@ public class WindowsServiceUtil {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
public static String getStatePrefix(String qResult) {
|
||||
public String getStatePrefix(String qResult) {
|
||||
String statePrefix = "STATE : ";
|
||||
// get the first occurrence of "STATE", then find the
|
||||
// next occurrence of of ":" after that. Count the
|
||||
@ -70,7 +70,7 @@ public class WindowsServiceUtil {
|
||||
}
|
||||
return statePrefix;
|
||||
}
|
||||
public static int getServiceStateInt(String serviceName) {
|
||||
public int getServiceStateInt(String serviceName) {
|
||||
// String statePrefix = "STATE : ";
|
||||
String qResult = queryService(serviceName);
|
||||
String statePrefix = getStatePrefix(qResult);
|
||||
@ -86,14 +86,14 @@ public class WindowsServiceUtil {
|
||||
return -2;
|
||||
}
|
||||
|
||||
public static boolean isInstalled(String serviceName) {
|
||||
public boolean isInstalled(String serviceName) {
|
||||
if (getServiceState(serviceName).equals("uninstalled")) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean isStart(String serviceName) {
|
||||
public boolean isStart(String serviceName) {
|
||||
if (getServiceState(serviceName).equals("started")) {
|
||||
return true;
|
||||
}
|
||||
@ -106,7 +106,7 @@ public class WindowsServiceUtil {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean promptServiceStartIfAvailable(String serviceName) {
|
||||
public boolean promptServiceStartIfAvailable(String serviceName) {
|
||||
if (osName() != "windows") {
|
||||
return true;
|
||||
}
|
||||
@ -145,88 +145,14 @@ public class WindowsServiceUtil {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return isStart("i2p");
|
||||
return isStart(serviceName);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static String ServiceUpdaterString() {
|
||||
return "http://tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq.b32.i2p/news.su3";
|
||||
}
|
||||
public static String ServiceBackupUpdaterString() {
|
||||
return "http://dn3tvalnjz432qkqsvpfdqrwpqkw3ye4n4i2uyfr4jexvo3sp5ka.b32.i2p/news.su3";
|
||||
}
|
||||
public static String ServiceStaticUpdaterString() {
|
||||
return "http://echelon.i2p/i2p/i2pupdate.sud,http://stats.i2p/i2p/i2pupdate.sud";
|
||||
}
|
||||
|
||||
public static String getProgramFilesInstall() {
|
||||
String programFiles = System.getenv("PROGRAMFILES");
|
||||
if (programFiles != null) {
|
||||
File programFilesI2P = new File(programFiles, "i2p/i2p.exe");
|
||||
if (programFilesI2P.exists())
|
||||
return programFilesI2P.getAbsolutePath();
|
||||
}
|
||||
String programFiles86 = System.getenv("PROGRAMFILES86");
|
||||
if (programFiles86 != null) {
|
||||
File programFiles86I2P = new File(programFiles86, "i2p/i2p.exe");
|
||||
if (programFiles86I2P.exists())
|
||||
return programFiles86I2P.getAbsolutePath();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean checkProgramFilesInstall() {
|
||||
String programFiles = System.getenv("PROGRAMFILES");
|
||||
if (programFiles != null) {
|
||||
File programFilesI2P = new File(programFiles, "i2p/i2p.exe");
|
||||
if (programFilesI2P.exists())
|
||||
return true;
|
||||
}
|
||||
String programFiles86 = System.getenv("PROGRAMFILES86");
|
||||
if (programFiles86 != null) {
|
||||
File programFiles86I2P = new File(programFiles86, "i2p/i2p.exe");
|
||||
if (programFiles86I2P.exists())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean promptUserInstallStartIfAvailable() {
|
||||
if (osName() != "windows") {
|
||||
return true;
|
||||
}
|
||||
if (checkProgramFilesInstall()) {
|
||||
int a;
|
||||
String message =
|
||||
"It appears you have an existing, unbundled I2P rotuer installed.\n";
|
||||
message +=
|
||||
"However, it is not running yet. Please start it using the shortcut on the desktop.\n";
|
||||
message +=
|
||||
"If you click \"No\", the jpackage router will be launched instead.\n";
|
||||
a = JOptionPane.showConfirmDialog(null, message,
|
||||
"I2P Service detected not running",
|
||||
JOptionPane.YES_NO_OPTION);
|
||||
if (a == JOptionPane.NO_OPTION) {
|
||||
// Do nothing here, this will continue on to launch a jpackaged router
|
||||
return true;
|
||||
} else {
|
||||
try {
|
||||
String pfi = getProgramFilesInstall();
|
||||
if (pfi != null)
|
||||
Runtime.getRuntime().exec(pfi);
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static String getServiceState(String serviceName) {
|
||||
public String getServiceState(String serviceName) {
|
||||
String stateString = "uninstalled";
|
||||
int state = getServiceStateInt(serviceName);
|
||||
switch (state) {
|
||||
@ -260,7 +186,7 @@ public class WindowsServiceUtil {
|
||||
*
|
||||
* @return os name in lower-case, "windows" "mac" or "linux"
|
||||
*/
|
||||
protected static String osName() {
|
||||
protected String osName() {
|
||||
String osName = System.getProperty("os.name").toLowerCase();
|
||||
if (osName.contains("windows"))
|
||||
return "windows";
|
||||
@ -269,11 +195,12 @@ public class WindowsServiceUtil {
|
||||
return "linux";
|
||||
}
|
||||
public static void main(String args[]) {
|
||||
WindowsServiceUtil wsu = new WindowsServiceUtil();
|
||||
// when querying the I2P router service installed by the IzPack installer
|
||||
// this is the correct call.
|
||||
String state = getServiceState("i2p");
|
||||
int stateInt = getServiceStateInt("i2p");
|
||||
String state = wsu.getServiceState("i2p");
|
||||
int stateInt = wsu.getServiceStateInt("i2p");
|
||||
System.out.println("i2p state: " + state + " code: " + stateInt);
|
||||
promptServiceStartIfAvailable("i2p");
|
||||
wsu.promptServiceStartIfAvailable("i2p");
|
||||
}
|
||||
}
|
||||
|
112
java/net/i2p/router/ZipUpdateProcess.java
Normal file
112
java/net/i2p/router/ZipUpdateProcess.java
Normal file
@ -0,0 +1,112 @@
|
||||
package net.i2p.router;
|
||||
|
||||
import java.io.*;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
import java.util.function.*;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.router.*;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
public class ZipUpdateProcess implements Runnable {
|
||||
private final RouterContext ctx;
|
||||
private final Supplier<String> versionSupplier;
|
||||
private final Supplier<File> fileSupplier;
|
||||
private final Log _log;
|
||||
|
||||
ZipUpdateProcess(RouterContext ctx, Supplier<String> versionSupplier,
|
||||
Supplier<File> fileSupplier) {
|
||||
this.ctx = ctx;
|
||||
this.versionSupplier = versionSupplier;
|
||||
this.fileSupplier = fileSupplier;
|
||||
this._log = ctx.logManager().getLog(ZipUpdateProcess.class);
|
||||
}
|
||||
|
||||
private File workDir() throws IOException {
|
||||
if (ctx != null) {
|
||||
File workDir =
|
||||
new File(ctx.getConfigDir().getAbsolutePath(), "i2p_update_zip");
|
||||
if (workDir.exists()) {
|
||||
if (workDir.isFile())
|
||||
throw new IOException(workDir +
|
||||
" exists but is a file, get it out of the way");
|
||||
return workDir;
|
||||
} else {
|
||||
workDir.mkdirs();
|
||||
}
|
||||
return workDir;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void unzipUpdateInstaller() throws IOException {
|
||||
String version = versionSupplier.get();
|
||||
File file = fileSupplier.get();
|
||||
if (file == null)
|
||||
return;
|
||||
|
||||
File workingDir = workDir();
|
||||
File zipFile = new File(workingDir, "i2pupdate_portable.zip");
|
||||
File destDir = ctx.getConfigDir();
|
||||
|
||||
String errors = unzip(zipFile.getAbsolutePath(), destDir.getAbsolutePath());
|
||||
_log.error(errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
unzipUpdateInstaller();
|
||||
} catch (IOException ioe) {
|
||||
_log.error("Error running updater, update may fail." + ioe);
|
||||
}
|
||||
}
|
||||
|
||||
// copied wholesale from this example:
|
||||
// https://www.digitalocean.com/community/tutorials/java-unzip-file-example
|
||||
// It doesn't check for zip-slips, but that's fine because if somebody's able
|
||||
// to deliver a malicious update then they can just run code anyway so there's
|
||||
// no point.
|
||||
private static String unzip(String zipFilePath, String destDir) {
|
||||
File dir = new File(destDir);
|
||||
// create output directory if it doesn't exist
|
||||
if (!dir.exists())
|
||||
dir.mkdirs();
|
||||
FileInputStream fis;
|
||||
// buffer for read and write data to file
|
||||
byte[] buffer = new byte[1024];
|
||||
try {
|
||||
fis = new FileInputStream(zipFilePath);
|
||||
ZipInputStream zis = new ZipInputStream(fis);
|
||||
ZipEntry ze = zis.getNextEntry();
|
||||
while (ze != null) {
|
||||
String fileName = ze.getName();
|
||||
File newFile = new File(destDir + File.separator + fileName);
|
||||
System.out.println("Unzipping to " + newFile.getAbsolutePath());
|
||||
// create directories for sub directories in zip
|
||||
new File(newFile.getParent()).mkdirs();
|
||||
FileOutputStream fos = new FileOutputStream(newFile);
|
||||
int len;
|
||||
while ((len = zis.read(buffer)) > 0) {
|
||||
fos.write(buffer, 0, len);
|
||||
}
|
||||
fos.close();
|
||||
// close this ZipEntry
|
||||
zis.closeEntry();
|
||||
ze = zis.getNextEntry();
|
||||
}
|
||||
// close last ZipEntry
|
||||
zis.closeEntry();
|
||||
zis.close();
|
||||
fis.close();
|
||||
} catch (IOException e) {
|
||||
return e.toString();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
88
launcher.sh
88
launcher.sh
@ -1,88 +0,0 @@
|
||||
#! /usr/bin/env bash
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/i2pversion"
|
||||
|
||||
if [ -f i2pversion_override ]; then
|
||||
. "$SCRIPT_DIR/i2pversion_override"
|
||||
fi
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
COUNT="Ten Nine Eight Seven Six Five Four Three Two One"
|
||||
|
||||
which java
|
||||
export JAVA=$(java --version | tr -d 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n' | cut -d ' ' -f 2 | cut -d '.' -f 1 | tr -d '\n\t\- ')
|
||||
|
||||
if [ "$JAVA" -lt "14" ]; then
|
||||
echo "Java 14+ must be used to compile with jpackage, java is $JAVA"
|
||||
exit 1
|
||||
fi
|
||||
if [ "$JAVA" -lt "17" ]; then
|
||||
echo "It is highly recommended that you use Java 17+ to build release packages"
|
||||
fi
|
||||
|
||||
if [ -z "${JAVA_HOME}" ]; then
|
||||
export JAVA_HOME=`type -p java|xargs readlink -f|xargs dirname|xargs dirname`
|
||||
fi
|
||||
if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
||||
export JAVA_HOME=`type -p java|xargs readlink -f|xargs dirname|xargs dirname`
|
||||
fi
|
||||
echo "Building with: $JAVA, $JAVA_HOME"
|
||||
sleep 5s
|
||||
|
||||
HERE="$PWD"
|
||||
if [ ! -d "$HERE/../i2p.i2p.jpackage-build/" ]; then
|
||||
git clone -b "$VERSION" https://i2pgit.org/i2p-hackers/i2p.i2p "$HERE/../i2p.i2p.jpackage-build/"
|
||||
tar --exclude="$HERE/../i2p.i2p.jpackage-build/.git" -cvzf i2p.i2p.jpackage-build.tar.gz "$HERE/../i2p.i2p.jpackage-build/"
|
||||
fi
|
||||
cd "$HERE/../i2p.i2p.jpackage-build/"
|
||||
for i in $COUNT; do
|
||||
echo -n "$i...."; sleep 1s
|
||||
done
|
||||
ant distclean pkg || true
|
||||
|
||||
cd "$HERE"
|
||||
export I2P_PKG="$HERE/../i2p.i2p.jpackage-build/pkg-temp"
|
||||
export RES_DIR="$HERE/../i2p.i2p.jpackage-build/installer/resources"
|
||||
export I2P_JARS="$I2P_PKG/lib"
|
||||
export I2P_JBIGI="$HERE/../i2p.i2p.jpackage-build/installer/lib/jbigi"
|
||||
|
||||
echo "compiling custom launcher"
|
||||
mkdir -p build
|
||||
cp "$I2P_JARS"/*.jar build
|
||||
if [ ! -f "$HERE/build/jna.jar" ]; then
|
||||
wget -O "$HERE/build/jna.jar" "https://repo1.maven.org/maven2/net/java/dev/jna/jna/$JNA_VERSION/jna-$JNA_VERSION.jar"
|
||||
fi
|
||||
|
||||
if [ ! -f "$HERE/build/jna-platform.jar" ]; then
|
||||
wget -O "$HERE/build/jna-platform.jar" "https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/$JNA_VERSION/jna-platform-$JNA_VERSION.jar"
|
||||
fi
|
||||
|
||||
if [ ! -f "$HERE/build/i2pfirefox.jar" ]; then
|
||||
wget -O "$HERE/build/i2pfirefox.jar" "https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/$I2PFIREFOX_VERSION/i2pfirefox.jar"
|
||||
fi
|
||||
|
||||
cd java
|
||||
"$JAVA_HOME"/bin/javac -d ../build -classpath "$HERE/build/i2pfirefox.jar:$HERE/build/jna.jar":"$HERE/build/jna-platform.jar":"$HERE/build/i2p.jar":"$HERE/build/router.jar":"$HERE/build/routerconsole.jar" \
|
||||
net/i2p/router/CopyConfigDir.java \
|
||||
net/i2p/router/Elevator.java \
|
||||
net/i2p/router/Shell32X.java \
|
||||
net/i2p/router/WinLauncher.java \
|
||||
net/i2p/router/WindowsUpdatePostProcessor.java \
|
||||
net/i2p/router/WinUpdateProcess.java \
|
||||
net/i2p/router/WindowsServiceUtil.java
|
||||
|
||||
cd ..
|
||||
|
||||
#echo "building launcher.jar"
|
||||
cd build
|
||||
"$JAVA_HOME"/bin/jar -cf launcher.jar net
|
||||
cd ..
|
@ -1,4 +0,0 @@
|
||||
orig:
|
||||
tar --exclude=debian --exclude=.git -cvzf ../i2p-firefox-profile_$(PROFILE_VERSION).orig.tar.gz .
|
||||
|
||||
## HOWTO: Don't bother. See http://i2pgit.org/idk/i2p.plugins.firefox debian jpackages.
|
@ -1 +0,0 @@
|
||||
# DEPRECATED: see https://i2pgit.org/idk/i2p.plugins.firefox for much better replacement.
|
@ -1 +0,0 @@
|
||||
#DEPRECATED moved to i2p.plugins.firefox as "Base/Strict Mode"
|
@ -1,39 +0,0 @@
|
||||
install:
|
||||
install -D -m644 src/unix/i2pbrowserrc /etc/i2pbrowser/i2pbrowserrc
|
||||
install -D -m644 src/unix/i2pbrowserdebianrc /etc/i2pbrowser/i2pbrowserdebianrc
|
||||
install -D -m755 build/profile/i2pbrowser.sh /usr/local/bin/i2pbrowser
|
||||
install -D -m755 build/app-profile/i2pconfig.sh /usr/local/bin/i2pconfig
|
||||
install -D -m755 src/unix/i2p-config-service-setup.sh /usr/local/bin/i2p-config-service-setup
|
||||
cp -vr build/profile /var/lib/i2pbrowser/profile
|
||||
cp -vr build/app-profile /var/lib/i2pbrowser/app-profile
|
||||
cp -vr src/icons /var/lib/i2pbrowser/icons
|
||||
cp src/unix/desktop/i2pbrowser.desktop /usr/share/applications
|
||||
cp src/unix/desktop/i2pconfig.desktop /usr/share/applications
|
||||
|
||||
uninstall:
|
||||
rm -rfv /etc/i2pbrowser \
|
||||
/var/lib/i2pbrowser \
|
||||
/etc/i2pbrowser/i2pbrowserrc \
|
||||
/usr/local/bin/i2pbrowser \
|
||||
/usr/local/bin/i2pconfig \
|
||||
/usr/local/bin/i2p-config-service-setup \
|
||||
/usr/share/applications/i2pbrowser.desktop \
|
||||
/usr/share/applications/i2pconfig.desktop
|
||||
|
||||
checkinstall: .version
|
||||
checkinstall \
|
||||
--default \
|
||||
--install=no \
|
||||
--fstrans=yes \
|
||||
--pkgname=i2p-firefox \
|
||||
--pkgversion=$(PROFILE_VERSION) \
|
||||
--pkggroup=net \
|
||||
--pkgrelease=1 \
|
||||
--pkgsource="https://i2pgit.org/i2p-hackers/i2p.firefox" \
|
||||
--maintainer="$(SIGNER)" \
|
||||
--requires="firefox,wget" \
|
||||
--suggests="i2p,i2p-router,syndie,tor,tsocks" \
|
||||
--nodoc \
|
||||
--deldoc=yes \
|
||||
--deldesc=yes \
|
||||
--backup=no
|
@ -1 +0,0 @@
|
||||
#DEPRECATED moved to i2p.plugins.firefox as "Usability Mode"
|
@ -1,35 +0,0 @@
|
||||
|
||||
prepupdate-unsignedexe:
|
||||
cp -v "I2P-Profile-Installer-$(PROFILE_VERSION).su3" i2pwinupdate-unsignedexe.su3
|
||||
|
||||
su3-unsignedexe: $(GOPATH)/src/i2pgit.org/idk/su3-tools/su3-tools
|
||||
$(GOPATH)/src/i2pgit.org/idk/su3-tools/su3-tools -name "I2P-Profile-Installer-$(PROFILE_VERSION)" -signer "$(SIGNER)" -version "$(I2P_VERSION)"
|
||||
java -cp "$(HOME)/i2p/lib/*" net.i2p.crypto.SU3File sign -c ROUTER -f EXE I2P-Profile-Installer-$(PROFILE_VERSION).exe I2P-Profile-Installer-$(PROFILE_VERSION)-signed.su3 "$(HOME)/.i2p-plugin-keys/news-su3-keystore.ks" "$(I2P_VERSION)" $(SIGNER)
|
||||
|
||||
i2pwinupdate-unsignedexe.su3.torrent: prepupdate-unsignedexe su3-unsignedexe
|
||||
mktorrent \
|
||||
--announce=http://tracker2.postman.i2p/announce.php \
|
||||
--announce=http://w7tpbzncbcocrqtwwm3nezhnnsw4ozadvi2hmvzdhrqzfxfum7wa.b32.i2p/a \
|
||||
--announce=http://mb5ir7klpc2tj6ha3xhmrs3mseqvanauciuoiamx2mmzujvg67uq.b32.i2p/a \
|
||||
i2pwinupdate-unsignedexe.su3
|
||||
|
||||
torrent-unsignedexe: i2pwinupdate-unsignedexe.su3.torrent
|
||||
|
||||
testing-releases.json: torrent-unsignedexe
|
||||
mkdir -p ../i2p.newsxml/data/win/testing/
|
||||
@echo "[" | tee ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " {" | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " \"date\": \"$(I2P_DATE)\"," | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " \"version\": \"$(I2P_VERSION)\"," | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " \"minVersion\": \"1.5.0\"," | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " \"minJavaVersion\": \"1.8\"," | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " \"updates\": {" | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " \"su3\": {" | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " \"torrent\": \"$(MAGNET_TESTING)\"," | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " \"url\": [" | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " \"http://ekm3fu6fr5pxudhwjmdiea5dovc3jdi66hjgop4c7z7dfaw7spca.b32.i2p/i2pwinupdate.su3\"" | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " ]" | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " }" | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " }" | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo " }" | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
||||
@echo "]" | tee -a ../i2p.newsxml/data/win/testing/releases.json
|
@ -1,41 +0,0 @@
|
||||
GOPATH=$(HOME)/go
|
||||
|
||||
$(GOPATH)/src/i2pgit.org/idk/su3-tools/su3-tools:
|
||||
git clone https://i2pgit.org/idk/su3-tools $(GOPATH)/src/i2pgit.org/idk/su3-tools; true
|
||||
git pull --all
|
||||
cd $(GOPATH)/src/i2pgit.org/idk/su3-tools && \
|
||||
go mod vendor && go build
|
||||
|
||||
prepupdate:
|
||||
cp -v "I2P-Profile-Installer-$(PROFILE_VERSION)-signed.su3" i2pwinupdate.su3
|
||||
|
||||
su3: $(GOPATH)/src/i2pgit.org/idk/su3-tools/su3-tools
|
||||
$(GOPATH)/src/i2pgit.org/idk/su3-tools/su3-tools -name "I2P-Profile-Installer-$(PROFILE_VERSION)-signed" -signer "$(SIGNER)" -version "$(I2P_VERSION)"
|
||||
java -cp "$(HOME)/i2p/lib/*" net.i2p.crypto.SU3File sign -c ROUTER -f EXE I2P-Profile-Installer-$(PROFILE_VERSION)-signed.exe I2P-Profile-Installer-$(PROFILE_VERSION)-signed.su3 "$(HOME)/.i2p-plugin-keys/news-su3-keystore.ks" $(PROFILE_VERSION) $(SIGNER)
|
||||
|
||||
i2pwinupdate.su3.torrent: prepupdate su3
|
||||
mktorrent \
|
||||
--announce=http://tracker2.postman.i2p/announce.php \
|
||||
--announce=http://w7tpbzncbcocrqtwwm3nezhnnsw4ozadvi2hmvzdhrqzfxfum7wa.b32.i2p/a \
|
||||
--announce=http://mb5ir7klpc2tj6ha3xhmrs3mseqvanauciuoiamx2mmzujvg67uq.b32.i2p/a \
|
||||
i2pwinupdate.su3
|
||||
|
||||
torrent: i2pwinupdate.su3.torrent
|
||||
|
||||
releases.json:
|
||||
@echo "[" | tee ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " {" | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " \"date\": \"$(I2P_DATE)\"," | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " \"version\": \"$(PROFILE_VERSION)\"," | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " \"minVersion\": \"1.5.0\"," | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " \"minJavaVersion\": \"1.8\"," | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " \"updates\": {" | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " \"su3\": {" | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " \"torrent\": \"$(MAGNET)\"," | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " \"url\": [" | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " \"http://ekm3fu6fr5pxudhwjmdiea5dovc3jdi66hjgop4c7z7dfaw7spca.b32.i2p/i2pwinupdate.su3\"" | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " ]" | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " }" | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " }" | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo " }" | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
||||
@echo "]" | tee -a ../i2p.newsxml/data/win/beta/releases.json
|
@ -1,19 +0,0 @@
|
||||
<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
||||
<!-- This is an automatically generated file.
|
||||
It will be read and overwritten.
|
||||
DO NOT EDIT! -->
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
|
||||
<TITLE>Bookmarks</TITLE>
|
||||
<H1>Bookmarks Menu</H1>
|
||||
|
||||
<DL><p>
|
||||
<DT><A HREF="place:type=6&sort=14&maxResults=10" ADD_DATE="1539649423" LAST_MODIFIED="1539649424">Recent Tags</A>
|
||||
<HR> <DT><A HREF="http://legwork.i2p/yacysearch.html?query=%s&verify=cacheonly&contentdom=text&nav=location%2Chosts%2Cauthors%2Cnamespace%2Ctopics%2Cfiletype%2Cprotocol%2Clanguage&startRecord=0&indexof=off&meanCount=5&resource=global&prefermaskfilter=&maximumRecords=10&timezoneOffset=0" ADD_DATE="1539652098" LAST_MODIFIED="1539652098" SHORTCUTURL="legwork.i2p">Search YaCy 'legwork': Search Page</A>
|
||||
<DD>Software HTTP Freeware Home Page
|
||||
<DT><H3 ADD_DATE="1539649419" LAST_MODIFIED="1539649423" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar</H3>
|
||||
<DL><p>
|
||||
<DT><A HREF="place:sort=8&maxResults=10" ADD_DATE="1539649423" LAST_MODIFIED="1539649423">Most Visited</A>
|
||||
<DT><A HREF="http://i2p-projekt.i2p/" ADD_DATE="1538511080" LAST_MODIFIED="1538511080">I2P Anonymous Network</A>
|
||||
<DD>Anonymous peer-to-peer distributed communication layer built with open source tools and designed to run any traditional Internet service such as email, IRC or web hosting.
|
||||
</DL><p>
|
||||
</DL>
|
@ -1,45 +0,0 @@
|
||||
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
|
||||
|
||||
/* only needed once */
|
||||
|
||||
@namespace html url("http://www.w3.org/1999/xhtml");
|
||||
#PersonalToolbar,
|
||||
#PanelUI-Button,
|
||||
#PanelUI-menu-button,
|
||||
#star-button,
|
||||
#forward-button,
|
||||
#home-button,
|
||||
#bookmarks-toolbar-button,
|
||||
#library-button,
|
||||
#sidebar-button,
|
||||
#pocket-button,
|
||||
#fxa-toolbar-menu-button,
|
||||
#reader-mode-button,
|
||||
#identity-icon {
|
||||
visibility: collapse;
|
||||
}
|
||||
|
||||
#urlbar-background {
|
||||
background-color: black !important;
|
||||
}
|
||||
|
||||
|
||||
/* Remove back button circle */
|
||||
|
||||
#back-button:not(:hover),
|
||||
#back-button:not(:hover)>.toolbarbutton-icon {
|
||||
background: transparent !important;
|
||||
border: none !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
#back-button:hover,
|
||||
#back-button:hover>.toolbarbutton-icon {
|
||||
border: none !important;
|
||||
border-radius: 2px !important;
|
||||
}
|
||||
|
||||
#urlbar-container,
|
||||
#nav-bar {
|
||||
visibility: collapse !important
|
||||
}
|
@ -1,65 +0,0 @@
|
||||
user_pref("extensions.https_everywhere._observatory.enabled", false);
|
||||
user_pref("extensions.https_everywhere.options.autoUpdateRulesets", false);
|
||||
user_pref("extensions.https_everywhere.globalEnabled", false);
|
||||
user_pref("extensions.https_everywhere._observatory.submit_during_tor", false);
|
||||
user_pref("extensions.https_everywhere._observatory.submit_during_nontor", false);
|
||||
user_pref("extensions.https_everywhere._observatory.use_custom_proxy", true);
|
||||
user_pref("extensions.https_everywhere._observatory.proxy_host", "127.0.0.1");
|
||||
user_pref("extensions.https_everywhere._observatory.proxy_port", 4444);
|
||||
|
||||
user_pref("extensions.torbutton.use_nontor_proxy", true);
|
||||
|
||||
//For socket conversion: in the future, I'll need to make TBB communicate with
|
||||
//i2p over a unix socket. Fortunately, this is how you do that. It will be
|
||||
//configurable in a similar way to the host:port configuration when that happens.
|
||||
//user_pref("extensions.torlauncher.socks_port_use_ipc", );
|
||||
//user_pref("extensions.torlauncher.socks_ipc_path", "");
|
||||
|
||||
user_pref("extensions.torlauncher.start_tor", false);
|
||||
//user_pref("extensions.torlauncher.default_bridge_type", "");
|
||||
user_pref("extensions.torlauncher.prompt_at_startup", false);
|
||||
|
||||
// Resist-fingerprinting and first-party isolation enable
|
||||
|
||||
user_pref("privacy.resistFingerprinting", true);
|
||||
user_pref("privacy.firstparty.isolate", true);
|
||||
|
||||
// Use i2p http proxy for all connections and set homepage to safe local form.
|
||||
|
||||
// DON'T allow access to the admin panel from the profile we browse i2p with.
|
||||
user_pref("network.proxy.no_proxies_on", "127.0.0.1:7657,localhost:7657,127.0.0.1:7662,localhost:7662,127.0.0.1:7669,localhost:7669");
|
||||
user_pref("network.proxy.type", 1);
|
||||
user_pref("network.proxy.http", "127.0.0.1");
|
||||
user_pref("network.proxy.http_port", 4444);
|
||||
user_pref("network.proxy.ssl", "127.0.0.1");
|
||||
user_pref("network.proxy.ssl_port", 4444);
|
||||
user_pref("network.proxy.ftp", "127.0.0.1");
|
||||
user_pref("network.proxy.ftp_port", 4444);
|
||||
user_pref("network.proxy.socks", "127.0.0.1");
|
||||
user_pref("network.proxy.socks_port", 4444);
|
||||
user_pref("network.proxy.share_proxy_settings", true);
|
||||
user_pref("browser.startup.homepage", "about:blank");
|
||||
user_pref("dom.security.https_only_mode", false);
|
||||
user_pref("keyword.enabled", false);
|
||||
user_pref("extensions.allowPrivateBrowsingByDefault", true);
|
||||
user_pref("extensions.PrivateBrowsing.notification", false);
|
||||
|
||||
user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
|
||||
user_pref("extensions.pocket.enabled", false);
|
||||
user_pref("browser.newtabpage.activity-stream.showSponsoredTopSites", false);
|
||||
user_pref("browser.newtabpage.activity-stream.showSponsored", false);
|
||||
user_pref("services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsored", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.section.topstories", false);
|
||||
user_pref("browser.newtabpage.activity-stream.default.sites", "http://127.0.0.1:7657/home,http://127.0.0.1:7657/i2psnark/,http://127.0.0.1:7657/susimail/");
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.topsites", true);
|
||||
user_pref("ui.use_standins_for_native_colors", true);
|
||||
user_pref("webgl.disable-extensions", true);
|
||||
user_pref("webgl.min_capability_mode", true);
|
||||
user_pref("webgl.disable-fail-if-major-performance-caveat", true);
|
||||
user_pref("webgl.enable-webgl2", false);
|
||||
user_pref("media.navigator.enabled", false);
|
||||
user_pref("dom.w3c_touch_events.enabled", false);
|
||||
user_pref("browser.display.use_system_colors", false);
|
||||
user_pref("extensions.autoDisableScopes", 0);
|
||||
user_pref("extensions.enabledScopes", 1);
|
Binary file not shown.
@ -1,229 +0,0 @@
|
||||
/*
|
||||
Overrides#
|
||||
for Extension Preferences# Tor Browser Bundle# Do not edit this file.##This file is modified from a file included in the Tor Browser Bundle.##Copyright 2017 The Tor Project.See LICENSE.tor#
|
||||
for licensing information.
|
||||
|
||||
HTTPS Everywhere Preferences:
|
||||
*/
|
||||
user_pref("extensions.https_everywhere._observatory.popup_shown", true);
|
||||
user_pref("extensions.https_everywhere.toolbar_hint_shown", true);
|
||||
|
||||
/*
|
||||
NoScript Preferences: #In order to disable all scripts by
|
||||
default, uncomment the following line...#user_pref("capability.policy.maonoscript.javascript.enabled", "noAccess");#
|
||||
and comment out the following line
|
||||
*/
|
||||
user_pref("capability.policy.maonoscript.javascript.enabled", "allAccess");
|
||||
user_pref("capability.policy.maonoscript.sites", "[System+Principal] about: about:tbupdate about:tor chrome: resource: blob: mediasource: moz-extension: moz-safe-about: about:neterror about:certerror about:feeds about:tabcrashed about:cache");
|
||||
user_pref("noscript.default", "[System+Principal] about: about:tbupdate about:tor chrome: resource: blob: mediasource: moz-extension: moz-safe-about: about:neterror about:certerror about:feeds about:tabcrashed about:cache");
|
||||
user_pref("noscript.mandatory", "[System+Principal] about: about:tbupdate about:tor chrome: resource: blob: mediasource: moz-extension: moz-safe-about: about:neterror about:certerror about:feeds about:tabcrashed about:cache");
|
||||
user_pref("noscript.ABE.enabled", false);
|
||||
user_pref("noscript.ABE.notify", false);
|
||||
user_pref("noscript.ABE.wanIpAsLocal", false);
|
||||
user_pref("noscript.confirmUnblock", false);
|
||||
user_pref("noscript.contentBlocker", true);
|
||||
user_pref("noscript.firstRunRedirection", false);
|
||||
user_pref("noscript.global", true);
|
||||
user_pref("noscript.gtemp", "");
|
||||
user_pref("noscript.opacizeObject", 3);
|
||||
user_pref("noscript.forbidWebGL", true);
|
||||
user_pref("noscript.forbidFonts", true);
|
||||
user_pref("noscript.options.tabSelectedIndexes", "5,0,0");
|
||||
user_pref("noscript.policynames", "");
|
||||
user_pref("noscript.secureCookies", true);
|
||||
user_pref("noscript.showAllowPage", false);
|
||||
user_pref("noscript.showBaseDomain", false);
|
||||
user_pref("noscript.showDistrust", false);
|
||||
user_pref("noscript.showRecentlyBlocked", false);
|
||||
user_pref("noscript.showTemp", false);
|
||||
user_pref("noscript.showTempToPerm", false);
|
||||
user_pref("noscript.showUntrusted", false);
|
||||
user_pref("noscript.STS.enabled", false);
|
||||
user_pref("noscript.subscription.lastCheck", -142148139);
|
||||
user_pref("noscript.temp", "");
|
||||
user_pref("noscript.untrusted", "");
|
||||
user_pref("noscript.forbidMedia", true);
|
||||
user_pref("noscript.allowWhitelistUpdates", false);
|
||||
user_pref("noscript.fixLinks", false);
|
||||
// Now handled by plugins.click_to_play // Not in this one.
|
||||
user_pref("noscript.forbidFlash", true);
|
||||
user_pref("noscript.forbidSilverlight", true);
|
||||
user_pref("noscript.forbidJava", true);
|
||||
user_pref("noscript.forbidPlugins", true);
|
||||
// Usability tweaks
|
||||
user_pref("noscript.showPermanent", false);
|
||||
user_pref("noscript.showTempAllowPage", true);
|
||||
user_pref("noscript.showRevokeTemp", true);
|
||||
user_pref("noscript.notify", false);
|
||||
user_pref("noscript.autoReload", true);
|
||||
user_pref("noscript.autoReload.allTabs", false);
|
||||
user_pref("noscript.cascadePermissions", true);
|
||||
user_pref("noscript.restrictSubdocScripting", true);
|
||||
user_pref("noscript.showVolatilePrivatePermissionsToggle", false);
|
||||
user_pref("noscript.volatilePrivatePermissions", true);
|
||||
user_pref("noscript.clearClick", 0);
|
||||
|
||||
user_pref("intl.locale.matchOS", false);
|
||||
|
||||
user_pref("extensions.https_everywhere._observatory.enabled", false);
|
||||
user_pref("extensions.https_everywhere.options.autoUpdateRulesets", false);
|
||||
user_pref("extensions.https_everywhere.globalEnabled", false);
|
||||
user_pref("extensions.https_everywhere._observatory.submit_during_tor", false);
|
||||
user_pref("extensions.https_everywhere._observatory.submit_during_nontor", false);
|
||||
user_pref("extensions.https_everywhere._observatory.use_custom_proxy", true);
|
||||
user_pref("extensions.https_everywhere._observatory.proxy_host", "127.0.0.1");
|
||||
user_pref("extensions.https_everywhere._observatory.proxy_port", 4444);
|
||||
|
||||
user_pref("extensions.torbutton.use_nontor_proxy", true);
|
||||
|
||||
//For socket conversion: in the future, I'll need to make TBB communicate with
|
||||
//i2p over a unix socket. Fortunately, this is how you do that. It will be
|
||||
//configurable in a similar way to the host:port configuration when that happens.
|
||||
//user_pref("extensions.torlauncher.socks_port_use_ipc", );
|
||||
//user_pref("extensions.torlauncher.socks_ipc_path", "");
|
||||
|
||||
// TODO: this is a Tor Browser specific setting which is ignored on Firefox. If
|
||||
// I make it true, the SOCKS outproxy will have something to connect to. But I
|
||||
// need to test more to find out if that's prudent.
|
||||
user_pref("extensions.torlauncher.start_tor", false);
|
||||
//user_pref("extensions.torlauncher.default_bridge_type", "");
|
||||
user_pref("extensions.torlauncher.prompt_at_startup", false);
|
||||
|
||||
// Resist-fingerprinting and first-party isolation enable
|
||||
|
||||
user_pref("privacy.resistFingerprinting", true);
|
||||
user_pref("privacy.firstparty.isolate", true);
|
||||
|
||||
// Use i2p http proxy for all connections and set homepage to safe local form.
|
||||
|
||||
// DON'T allow access to the admin panel from the profile we browse i2p with.
|
||||
user_pref("network.proxy.no_proxies_on", "127.0.0.1:7657,localhost:7657,127.0.0.1:7662,localhost:7662,127.0.0.1:7669,localhost:7669");
|
||||
user_pref("network.proxy.type", 1);
|
||||
user_pref("network.proxy.http", "127.0.0.1");
|
||||
user_pref("network.proxy.http_port", 4444);
|
||||
user_pref("network.proxy.ssl", "127.0.0.1");
|
||||
user_pref("network.proxy.ssl_port", 4444);
|
||||
user_pref("network.proxy.ftp", "127.0.0.1");
|
||||
user_pref("network.proxy.ftp_port", 4444);
|
||||
user_pref("network.proxy.socks", "127.0.0.1");
|
||||
user_pref("network.proxy.socks_port", 4444);
|
||||
user_pref("network.proxy.share_proxy_settings", true);
|
||||
user_pref("browser.startup.homepage", "http://127.0.0.1:7657/home");
|
||||
|
||||
// Privacy-harden and disable irrelevant features.
|
||||
user_pref("app.normandy.api_url", "");
|
||||
user_pref("app.normandy.enabled", false);
|
||||
user_pref("app.update.auto", false);
|
||||
user_pref("app.update.enabled", false);
|
||||
user_pref("beacon.enabled", false);
|
||||
user_pref("browser.aboutHomeSnippets.updateUrl", "");
|
||||
user_pref("browser.cache.disk_cache_ssl", false);
|
||||
user_pref("browser.cache.disk.enable", false);
|
||||
user_pref("browser.cache.offline.enable", false);
|
||||
user_pref("browser.disableResetPrompt", true);
|
||||
user_pref("browser.display.use_document_fonts", 0);
|
||||
user_pref("browser.fixup.alternate.enabled", false);
|
||||
user_pref("browser.formfill.enable", false);
|
||||
user_pref("browser.library.activity-stream.enabled", false);
|
||||
user_pref("browser.newtabpage.activity-stream.disableSnippets", true);
|
||||
user_pref("browser.newtabpage.activity-stream.enabled", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.snippets", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.telemetry", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.topsites", false);
|
||||
user_pref("browser.newtabpage.activity-stream.prerender", false);
|
||||
user_pref("browser.newtabpage.activity-stream.showSearch", false);
|
||||
user_pref("browser.newtabpage.enhanced", false);
|
||||
user_pref("browser.newtabpage.introShown", true);
|
||||
user_pref("browser.newtab.preload", false);
|
||||
user_pref("browser.onboarding.enabled", false);
|
||||
user_pref("browser.pagethumbnails.capturing_disabled", true);
|
||||
user_pref("browser.safebrowsing.appRepURL", "");
|
||||
user_pref("browser.safebrowsing.blockedURIs.enabled", false);
|
||||
user_pref("browser.safebrowsing.downloads.enabled", false);
|
||||
user_pref("browser.safebrowsing.downloads.remote.enabled", false);
|
||||
user_pref("browser.safebrowsing.downloads.remote.url", "");
|
||||
user_pref("browser.safebrowsing.enabled", false);
|
||||
user_pref("browser.safebrowsing.malware.enabled", false);
|
||||
user_pref("browser.safebrowsing.phishing.enabled", false);
|
||||
user_pref("browser.search.geoip.timeout", 1);
|
||||
user_pref("browser.search.suggest.enabled", false);
|
||||
user_pref("browser.selfsupport.url", "");
|
||||
user_pref("browser.send_pings", false);
|
||||
user_pref("browser.shell.checkDefaultBrowser", false);
|
||||
user_pref("browser.startup.homepage_override.mstone", "ignore");
|
||||
user_pref("browser.startup.page", 0);
|
||||
user_pref("browser.toolbarbuttons.introduced.pocket-button", true);
|
||||
user_pref("browser.urlbar.speculativeConnect.enabled", false);
|
||||
user_pref("browser.urlbar.trimURLs", false);
|
||||
user_pref("datareporting.healthreport.uploadEnabled", false);
|
||||
user_pref("datareporting.policy.dataSubmissionEnabled", false);
|
||||
user_pref("dom.battery.enabled", false);
|
||||
user_pref("dom.enable_performance", false);
|
||||
user_pref("dom.enable_performance_navigation_timing", false);
|
||||
user_pref("dom.enable_resource_timing", false);
|
||||
user_pref("dom.event.clipboardevents.enabled", false);
|
||||
user_pref("dom.gamepad.enabled", false);
|
||||
user_pref("dom.indexedDB.enabled", false);
|
||||
user_pref("dom.min_timeout_value", 400);
|
||||
user_pref("dom.push.connection.enabled", false);
|
||||
user_pref("dom.push.enabled", false);
|
||||
user_pref("dom.serviceWorkers.enabled", false);
|
||||
user_pref("dom.serviceWorkers.interception.enabled", false);
|
||||
user_pref("dom.storage.enabled", false);
|
||||
user_pref("dom.webaudio.enabled", false);
|
||||
user_pref("extensions.autoDisableScopes", 0);
|
||||
user_pref("extensions.enabledScopes", 1);
|
||||
user_pref("extensions.getAddons.cache.enabled", false);
|
||||
user_pref("extensions.getAddons.showPane", false);
|
||||
user_pref("extensions.pocket.enabled", false);
|
||||
user_pref("extensions.screenshots.disabled", true);
|
||||
user_pref("extensions.webservice.discoverURL", "");
|
||||
user_pref("geo.enabled", false);
|
||||
user_pref("geo.wifi.uri", "");
|
||||
user_pref("gfx.downloadable_fonts.disable_cache", true);
|
||||
user_pref("javascript.options.shared_memory", false);
|
||||
user_pref("layout.css.visited_links_enabled", false);
|
||||
user_pref("media.autoplay.enabled", false);
|
||||
user_pref("media.cache_size", 0);
|
||||
user_pref("media.navigator.enabled", false);
|
||||
user_pref("media.peerconnection.ice.no_host", true);
|
||||
user_pref("media.video_stats.enabled", false);
|
||||
user_pref("captivedetect.canonicalURL", "");
|
||||
user_pref("network.captive-portal-service.enabled", false);
|
||||
user_pref("network.cookie.cookieBehavior", 1);
|
||||
user_pref("network.cookie.lifetimePolicy", 2);
|
||||
user_pref("network.dns.disablePrefetch", true);
|
||||
user_pref("network.http.referer.spoofSource", true);
|
||||
user_pref("network.http.referer.trimmingPolicy", 2);
|
||||
user_pref("network.http.referer.XOriginPolicy", 2);
|
||||
user_pref("network.prefetch-next", false);
|
||||
user_pref("privacy.donottrackheader.enabled", true);
|
||||
user_pref("privacy.donottrackheader.value", 1);
|
||||
user_pref("toolkit.telemetry.archive.enabled", false);
|
||||
user_pref("toolkit.telemetry.coverage.opt-out", true);
|
||||
user_pref("toolkit.telemetry.enabled", false);
|
||||
user_pref("toolkit.telemetry.server", "");
|
||||
user_pref("toolkit.telemetry.unified", false);
|
||||
user_pref("webgl.disabled", true);
|
||||
user_pref("browser.chrome.errorReporter.infoURL", "");
|
||||
user_pref("breakpad.reportURL", "");
|
||||
//user_pref("browser.newtabpage.activity-stream.default.sites", "");
|
||||
user_pref("browser.newtabpage.activity-stream.showSponsoredTopSites", false);
|
||||
user_pref("browser.newtabpage.activity-stream.showSponsored", false);
|
||||
user_pref("services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsored", false);
|
||||
user_pref("browser.newtabpage.enabled", true);
|
||||
user_pref("browser.newtabpage.activity-stream.default.sites", "http://planet.i2p/,http://legwork.i2p/,http://i2pwiki.i2p/,http://i2pforums.i2p/,http://zzz.i2p/");
|
||||
user_pref("dom.security.https_only_mode", false);
|
||||
user_pref("keyword.enabled", false);
|
||||
user_pref("extensions.allowPrivateBrowsingByDefault", true);
|
||||
user_pref("extensions.PrivateBrowsing.notification", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.topsites", true);
|
||||
user_pref("ui.use_standins_for_native_colors", true);
|
||||
user_pref("webgl.disable-extensions", true);
|
||||
user_pref("webgl.min_capability_mode", true);
|
||||
user_pref("webgl.disable-fail-if-major-performance-caveat", true);
|
||||
user_pref("webgl.enable-webgl2", false);
|
||||
user_pref("dom.w3c_touch_events.enabled", false);
|
||||
user_pref("browser.privatebrowsing.autostart", false);
|
||||
user_pref("browser.display.use_system_colors", false);
|
File diff suppressed because it is too large
Load Diff
@ -1 +0,0 @@
|
||||
1.9.7
|
Binary file not shown.
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 67 KiB |
@ -11,13 +11,126 @@
|
||||
|
||||
!ifndef FindProcess
|
||||
!define FindProcess '!insertmacro FindProcess'
|
||||
|
||||
!ifndef un.FindProcess
|
||||
!define un.FindProcess '!insertmacro un.FindProcess'
|
||||
|
||||
!macro FindProcess ProcessList BoolReturn
|
||||
Push '${ProcessList}'
|
||||
Call FindProcess
|
||||
Pop ${BoolReturn}
|
||||
!macroend
|
||||
|
||||
!macro un.FindProcess ProcessList BoolReturn
|
||||
Push '${ProcessList}'
|
||||
Call un.FindProcess
|
||||
Pop ${BoolReturn}
|
||||
!macroend
|
||||
|
||||
Function un.FindProcess
|
||||
# return True if any process in ProcessList is active
|
||||
Exch $0 ; get ProcessList, save $0
|
||||
Push $1
|
||||
Push $2
|
||||
Push $R0
|
||||
Push $R1
|
||||
Push $R2
|
||||
|
||||
StrCpy $2 "$0," ; $2 = ProcessList
|
||||
|
||||
Push 0 ; set return value = False
|
||||
|
||||
# method based upon one by Phoenix1701@gmail.com 1/27/07
|
||||
|
||||
System::Alloc 1024
|
||||
Pop $R0 ; process list buffer
|
||||
|
||||
# get an array of all process ids
|
||||
System::Call "Psapi::EnumProcesses(i R0, i 1024, *i .R1)i .r0"
|
||||
${Unless} $0 = 0
|
||||
|
||||
IntOp $R1 $R1 / 4 ; Divide by sizeof(DWORD) to get $R1 process count
|
||||
IntOp $R1 $R1 - 1 ; decr for 0 base loop
|
||||
|
||||
ClearErrors
|
||||
${For} $R2 0 $R1
|
||||
# get a PID from the array
|
||||
IntOp $0 $R2 << 2
|
||||
IntOp $0 $0 + $R0 ; buffer.dword[i]
|
||||
System::Call "*$0(i .r0)" ; Get next PID
|
||||
|
||||
${Unless} $0 = 0
|
||||
Push $0
|
||||
Call un.GetProcessName
|
||||
Pop $1
|
||||
|
||||
# is this process one we are looking for?
|
||||
${WordFind} '$2' ',' 'E/$1' $0
|
||||
${Unless} ${Errors}
|
||||
# yes, change return value
|
||||
Pop $0 ; discard old result
|
||||
Push 1 ; set return True
|
||||
|
||||
# exit the loop
|
||||
${Break}
|
||||
${EndUnless}
|
||||
${EndUnless}
|
||||
${Next}
|
||||
|
||||
${EndUnless}
|
||||
|
||||
System::Free $R0
|
||||
|
||||
Pop $0 ; get return value
|
||||
Pop $R2 ; restore registers
|
||||
Pop $R1
|
||||
Pop $R0
|
||||
Pop $2
|
||||
Pop $1
|
||||
Exch $0
|
||||
FunctionEnd
|
||||
|
||||
Function un.GetProcessName
|
||||
# ( Pid -- ProcessName )
|
||||
Exch $2 ; get Pid, save $2
|
||||
Push $0
|
||||
Push $1
|
||||
Push $3
|
||||
Push $R0
|
||||
|
||||
System::Call "Kernel32::OpenProcess(i 1040, i 0, i r2)i .r3"
|
||||
|
||||
StrCpy $2 "<unknown>" ; set return value
|
||||
|
||||
${Unless} $3 = 0 ; $3 is hProcess
|
||||
# get hMod array
|
||||
System::Alloc 1024
|
||||
Pop $R0
|
||||
|
||||
# params: Pid, &hMod, sizeof(hMod), &cb
|
||||
System::Call "Psapi::EnumProcessModules(i r3, i R0, i 1024, *i .r1)i .r0"
|
||||
|
||||
${Unless} $0 = 0
|
||||
# get first hMod
|
||||
System::Call "*$R0(i .r0)"
|
||||
|
||||
# get BaseName; params: Pid, hMod, szBuffer, sizeof(szBuffer)
|
||||
System::Call "Psapi::GetModuleBaseName(i r3, i r0, t .r2, i 256)i .r0"
|
||||
${EndUnless}
|
||||
|
||||
System::Free $R0
|
||||
System::Call "kernel32::CloseHandle(i r3)"
|
||||
${EndUnless}
|
||||
|
||||
Pop $R0 ; restore registers
|
||||
Pop $3
|
||||
Pop $1
|
||||
Pop $0
|
||||
Exch $2 ; save process name
|
||||
FunctionEnd
|
||||
!endif
|
||||
|
||||
|
||||
Function FindProcess
|
||||
# return True if any process in ProcessList is active
|
||||
Exch $0 ; get ProcessList, save $0
|
||||
@ -119,4 +232,4 @@ Function GetProcessName
|
||||
Pop $0
|
||||
Exch $2 ; save process name
|
||||
FunctionEnd
|
||||
!endif
|
||||
!endif
|
||||
|
@ -1,28 +1,27 @@
|
||||
# This now requires v3
|
||||
UniCode true
|
||||
|
||||
!define APPNAME "I2PBrowser-Launcher"
|
||||
!define APPNAME "i2peasy"
|
||||
!define COMPANYNAME "I2P"
|
||||
!define DESCRIPTION "This is a tool which contains an I2P router, a bundled JVM, and a tool for automatically configuring a browser to use with I2P."
|
||||
!define I2P_MESSAGE "Could not find I2P. Installing portable Jpackaged I2P."
|
||||
!define I2P_MESSAGE "Please choose a directory."
|
||||
!define LAUNCH_TEXT "Start I2P?"
|
||||
!define LICENSE_TITLE "Many Licenses"
|
||||
!define CONSOLE_URL "http://127.0.0.1:7657/home"
|
||||
|
||||
!include i2pbrowser-version.nsi
|
||||
!include i2pbrowser-jpackage.nsi
|
||||
!include FindProcess.nsh
|
||||
|
||||
var I2PINSTEXE
|
||||
#var INSTDIR
|
||||
|
||||
SetOverwrite on
|
||||
|
||||
!define I2PINSTEXE
|
||||
!define I2PINSTEXE_USERMODE "$LOCALAPPDATA\i2p"
|
||||
!define INSTDIR
|
||||
!define I2PINSTEXE_USERMODE "$LOCALAPPDATA\${APPNAME}"
|
||||
|
||||
!define RAM_NEEDED_FOR_64BIT 0x80000000
|
||||
|
||||
InstallDir "$PROGRAMFILES64\${COMPANYNAME}\${APPNAME}"
|
||||
InstallDir $LOCALAPPDATA\${APPNAME}
|
||||
|
||||
# rtf or txt file - remember if it is txt, it must be in the DOS text format (\r\n)
|
||||
LicenseData "licenses\LICENSE.txt"
|
||||
@ -122,53 +121,38 @@ PageEx license
|
||||
PageExEnd
|
||||
PageEx directory
|
||||
dirtext "${I2P_MESSAGE}"
|
||||
dirvar $I2PINSTEXE
|
||||
dirvar $INSTDIR
|
||||
PageCallbacks routerDetect
|
||||
PageExEnd
|
||||
Page instfiles
|
||||
|
||||
Function .onInit
|
||||
StrCpy $I2PINSTEXE "${I2PINSTEXE_USERMODE}"
|
||||
UserInfo::GetAccountType
|
||||
pop $0
|
||||
${If} $0 != "admin"
|
||||
StrCpy $INSTDIR "$LOCALAPPDATA\${COMPANYNAME}\${APPNAME}"
|
||||
StrCpy $I2PINSTEXE "${I2PINSTEXE_USERMODE}"
|
||||
${EndIf}
|
||||
# Note: This is all redundant and I know it.
|
||||
# Admin installs have been migrated to user-mode installs.
|
||||
# But I'm leaving it because I might need it again if I support service installs.
|
||||
StrCpy $INSTDIR "${I2PINSTEXE_USERMODE}"
|
||||
!insertmacro MUI_LANGDLL_DISPLAY
|
||||
#Call ShouldInstall64Bit
|
||||
# look for user installs
|
||||
FunctionEnd
|
||||
|
||||
Function routerDetect
|
||||
createDirectory $I2PINSTEXE
|
||||
SetOutPath $I2PINSTEXE\app
|
||||
createDirectory $INSTDIR
|
||||
SetOutPath $INSTDIR\app
|
||||
File /a /r "I2P\app\"
|
||||
SetOutPath $I2PINSTEXE\runtime
|
||||
SetOutPath $INSTDIR\runtime
|
||||
File /a /r "I2P\runtime\"
|
||||
SetOutPath $I2PINSTEXE
|
||||
SetOutPath $INSTDIR\config
|
||||
File /a /r "I2P\config\"
|
||||
SetOutPath $INSTDIR
|
||||
File /a /r "I2P\I2P.exe"
|
||||
# The NSIS Installer uses an ico icon, the jpackage-only ones use png
|
||||
File /a /r "I2P\ui2pbrowser_icon.ico"
|
||||
File "I2P\config\jpackaged"
|
||||
|
||||
createDirectory "$I2PINSTEXE\"
|
||||
SetOutPath "$I2PINSTEXE\"
|
||||
IfFileExists $I2PINSTEXE\router.config +2 0
|
||||
File /a /r "I2P/config/router.config"
|
||||
IfFileExists $I2PINSTEXE\clients.config +2 0
|
||||
File /a /r "I2P/config/clients.config"
|
||||
IfFileExists $I2PINSTEXE\wrapper.config +2 0
|
||||
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
|
||||
File /a /r "I2P/config/eepsite"
|
||||
IfFileExists $I2PINSTEXE\webapps +2 0
|
||||
File /a /r "I2P/config/webapps"
|
||||
File /a /r "I2P/config/certificates"
|
||||
File /a /r "I2P/config/geoip"
|
||||
File /a /r "I2P/config/i2ptunnel.config"
|
||||
createDirectory "$INSTDIR\"
|
||||
SetOutPath "$INSTDIR\"
|
||||
File /a /r "I2P\config\certificates\"
|
||||
File /a /r "I2P\config\geoip\"
|
||||
FunctionEnd
|
||||
|
||||
Function installerFunction
|
||||
@ -184,56 +168,42 @@ Function installerFunction
|
||||
SetOutPath $INSTDIR
|
||||
File ui2pbrowser_icon.ico
|
||||
|
||||
# Update jpackaged I2P router, if it exists
|
||||
${If} ${FileExists} "$I2PINSTEXE\jpackaged"
|
||||
createDirectory $I2PINSTEXE
|
||||
SetOutPath $I2PINSTEXE
|
||||
|
||||
${If} ${Silent}
|
||||
ReadEnvStr $0 OLD_I2P_VERSION
|
||||
${If} $0 < ${I2P_VERSION}
|
||||
call routerDetect
|
||||
|
||||
${EndIf}
|
||||
${Else}
|
||||
call routerDetect
|
||||
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
# Update jpackaged I2P router
|
||||
call routerDetect
|
||||
|
||||
# Install the launcher scripts
|
||||
createDirectory "$INSTDIR"
|
||||
#SetOutPath "$INSTDIR"
|
||||
#File "win/*"
|
||||
|
||||
# Install the licenses
|
||||
createDirectory "$INSTDIR\licenses"
|
||||
SetOutPath "$INSTDIR\licenses"
|
||||
File /a /r "licenses/*"
|
||||
File /a /r "licenses\"
|
||||
|
||||
SetOutPath "$I2PINSTEXE"
|
||||
SetOutPath "$INSTDIR"
|
||||
createDirectory "$SMPROGRAMS\${APPNAME}"
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\Browse I2P.lnk" "$I2PINSTEXE\I2P.exe" "" "$INSTDIR\ui2pbrowser_icon.ico"
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\Browse I2P - Temporary Identity.lnk" "$I2PINSTEXE\I2P.exe -private" "" "$INSTDIR\ui2pbrowser_icon.ico"
|
||||
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\Browse I2P.lnk" "$INSTDIR\I2P.exe" "" "$INSTDIR\ui2pbrowser_icon.ico"
|
||||
Delete "$SMPROGRAMS\${APPNAME}\Browse I2P - Temporary Identity.lnk"
|
||||
|
||||
CreateShortCut "$DESKTOP\Browse I2P.lnk" "$I2PINSTEXE\I2P.exe" "" "$INSTDIR\ui2pbrowser_icon.ico"
|
||||
CreateShortCut "$DESKTOP\Browse I2P - Temporary Identity.lnk" "$I2PINSTEXE\I2P.exe -private" "" "$INSTDIR\ui2pbrowser_icon.ico"
|
||||
CreateShortCut "$DESKTOP\Browse I2P.lnk" "$INSTDIR\I2P.exe" "" "$INSTDIR\ui2pbrowser_icon.ico"
|
||||
Delete "$DESKTOP\Browse I2P - Temporary Identity.lnk"
|
||||
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\Uninstall I2P Easy-Install Bundle.lnk" "$INSTDIR\uninstall-i2pbrowser.exe" "" "$INSTDIR\ui2pbrowser_icon.ico"
|
||||
SetOutPath "$INSTDIR"
|
||||
|
||||
SetShellVarContext current
|
||||
|
||||
IfFileExists "$LOCALAPPDATA\I2P\eepsite\docroot" +2 0
|
||||
IfFileExists "$INSTDIR\eepsite\docroot" +2 0
|
||||
File /a /r "I2P\eepsite"
|
||||
|
||||
createDirectory "$I2PINSTEXE"
|
||||
SetOutPath "$I2PINSTEXE"
|
||||
createDirectory "$INSTDIR"
|
||||
SetOutPath "$INSTDIR"
|
||||
|
||||
SetOutPath "$INSTDIR"
|
||||
# create the uninstaller
|
||||
WriteUninstaller "$INSTDIR\uninstall-i2pbrowser.exe"
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\Uninstall I2P Easy-Install Bundle.lnk" "$INSTDIR\uninstall-i2pbrowser.exe" "" "$INSTDIR\ui2pbrowser_icon.ico"
|
||||
|
||||
# create a shortcut to the uninstaller
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\Uninstall-${APPNAME}.lnk" "$INSTDIR\uninstall-i2pbrowser.exe"
|
||||
FunctionEnd
|
||||
|
||||
|
||||
@ -244,13 +214,23 @@ SectionEnd
|
||||
|
||||
# uninstaller section start
|
||||
Section "uninstall"
|
||||
# Uninstall the launcher scripts
|
||||
Delete $INSTDIR\*
|
||||
rmDir /r "$INSTDIR\"
|
||||
${If} ${FileExists} "$I2PINSTEXE\jpackaged"
|
||||
Delete $I2PINSTEXE\*
|
||||
rmDir /r "$I2PINSTEXE"
|
||||
# Don't try to uninstall until the router is fully shut down.
|
||||
${un.FindProcess} "I2P.exe" $0
|
||||
${If} $0 <> 0
|
||||
MessageBox MB_OK "I2P is still running, uninstaller is paused. Uninstaller will continue after I2P has shut down."
|
||||
${Do}
|
||||
${un.FindProcess} "I2P.exe" $0
|
||||
Sleep 500
|
||||
${LoopWhile} $0 <> 0
|
||||
${EndIf}
|
||||
|
||||
# Uninstall the launcher scripts
|
||||
rmDir /r "$INSTDIR\app"
|
||||
rmDir /r "$INSTDIR\config"
|
||||
rmDir /r "$INSTDIR\runtime"
|
||||
Delete "$INSTDIR\ui2pbrowser_icon.ico"
|
||||
Delete "$INSTDIR\windowsUItoopie2.png"
|
||||
Delete "$INSTDIR\I2P.exe"
|
||||
|
||||
# Remove shortcuts and folders
|
||||
Delete "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk"
|
||||
@ -262,16 +242,27 @@ Section "uninstall"
|
||||
Delete "$DESKTOP\${APPNAME}.lnk"
|
||||
Delete "$DESKTOP\Private Browsing-${APPNAME}.lnk"
|
||||
rmDir /r "$SMPROGRAMS\${APPNAME}"
|
||||
rmDir /r "$INSTDIR\firefox.profile.i2p\extensions"
|
||||
rmDir /r "$INSTDIR\firefox.profile.i2p"
|
||||
rmDir /r "$LOCALAPPDATA\${APPNAME}"
|
||||
rmDir /r "$INSTDIR"
|
||||
|
||||
#### SUPER SUPER EXTRA IMPORTANT!
|
||||
### RELATED: line 169
|
||||
## IF YOU DO THIS WRONG YOU WILL BREAK CONFIGS:
|
||||
## The purpose of the `jpackaged` file has changed, as has the point
|
||||
## where it is created.
|
||||
# 1. The jpackaged file is now created only **after** the jpackage itself
|
||||
# has migrated default configs into the $INSTDIR. IF THEY ALREADY EXIST,
|
||||
# it WILL NOT BE CREATED, even if there is a jpackage present. This is
|
||||
# intentional behavior.
|
||||
# 2. The jpackaged file now indicates that the configurations were created
|
||||
# by running the jpackage, and not by an un-bundled router. If it is not
|
||||
# present, then we have already deleted everything we are responsible for
|
||||
# and don't need to do the section below.
|
||||
${If} ${FileExists} "$INSTDIR\jpackaged"
|
||||
Delete $INSTDIR\*
|
||||
rmDir /r "$INSTDIR"
|
||||
${EndIf}
|
||||
# delete the uninstaller
|
||||
Delete "$INSTDIR\uninstall-i2pbrowser.exe"
|
||||
|
||||
# uninstaller section end
|
||||
|
||||
SectionEnd
|
||||
|
||||
!define MUI_FINISHPAGE_RUN
|
||||
@ -280,26 +271,14 @@ SectionEnd
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
|
||||
Function LaunchLink
|
||||
SetOutPath "$I2PINSTEXE"
|
||||
StrCpy $OUTDIR $I2PINSTEXE
|
||||
SetOutPath "$INSTDIR"
|
||||
StrCpy $OUTDIR $INSTDIR
|
||||
${If} ${Silent}
|
||||
ReadEnvStr $0 RESTART_I2P
|
||||
${If} $0 != ""
|
||||
UserInfo::GetAccountType
|
||||
pop $0
|
||||
${If} $0 == "admin"
|
||||
ShellExecAsUser::ShellExecAsUser "open" "$DESKTOP\Browse I2P.lnk"
|
||||
${Else}
|
||||
ExecShell "" "$DESKTOP\Browse I2P.lnk"
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
${Else}
|
||||
UserInfo::GetAccountType
|
||||
pop $0
|
||||
${If} $0 == "admin"
|
||||
ShellExecAsUser::ShellExecAsUser "open" "$DESKTOP\Browse I2P.lnk"
|
||||
${Else}
|
||||
ExecShell "" "$DESKTOP\Browse I2P.lnk"
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
@ -1 +0,0 @@
|
||||
!define I2P_VERSION 1.9.7
|
@ -1,3 +1,3 @@
|
||||
!define VERSIONMAJOR 1
|
||||
!define VERSIONMINOR 9
|
||||
!define VERSIONBUILD 7
|
||||
!define VERSIONMAJOR 2
|
||||
!define VERSIONMINOR 4
|
||||
!define VERSIONBUILD 0
|
||||
|
@ -1,19 +0,0 @@
|
||||
<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
||||
<!-- This is an automatically generated file.
|
||||
It will be read and overwritten.
|
||||
DO NOT EDIT! -->
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
|
||||
<TITLE>Bookmarks</TITLE>
|
||||
<H1>Bookmarks Menu</H1>
|
||||
|
||||
<DL><p>
|
||||
<DT><A HREF="place:type=6&sort=14&maxResults=10" ADD_DATE="1539649423" LAST_MODIFIED="1539649424">Recent Tags</A>
|
||||
<HR> <DT><A HREF="http://legwork.i2p/yacysearch.html?query=%s&verify=cacheonly&contentdom=text&nav=location%2Chosts%2Cauthors%2Cnamespace%2Ctopics%2Cfiletype%2Cprotocol%2Clanguage&startRecord=0&indexof=off&meanCount=5&resource=global&prefermaskfilter=&maximumRecords=10&timezoneOffset=0" ADD_DATE="1539652098" LAST_MODIFIED="1539652098" SHORTCUTURL="legwork.i2p">Search YaCy 'legwork': Search Page</A>
|
||||
<DD>Software HTTP Freeware Home Page
|
||||
<DT><H3 ADD_DATE="1539649419" LAST_MODIFIED="1539649423" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar</H3>
|
||||
<DL><p>
|
||||
<DT><A HREF="place:sort=8&maxResults=10" ADD_DATE="1539649423" LAST_MODIFIED="1539649423">Most Visited</A>
|
||||
<DT><A HREF="http://i2p-projekt.i2p/" ADD_DATE="1538511080" LAST_MODIFIED="1538511080">I2P Anonymous Network</A>
|
||||
<DD>Anonymous peer-to-peer distributed communication layer built with open source tools and designed to run any traditional Internet service such as email, IRC or web hosting.
|
||||
</DL><p>
|
||||
</DL>
|
@ -1,65 +0,0 @@
|
||||
user_pref("extensions.https_everywhere._observatory.enabled", false);
|
||||
user_pref("extensions.https_everywhere.options.autoUpdateRulesets", false);
|
||||
user_pref("extensions.https_everywhere.globalEnabled", false);
|
||||
user_pref("extensions.https_everywhere._observatory.submit_during_tor", false);
|
||||
user_pref("extensions.https_everywhere._observatory.submit_during_nontor", false);
|
||||
user_pref("extensions.https_everywhere._observatory.use_custom_proxy", true);
|
||||
user_pref("extensions.https_everywhere._observatory.proxy_host", "127.0.0.1");
|
||||
user_pref("extensions.https_everywhere._observatory.proxy_port", 4444);
|
||||
|
||||
user_pref("extensions.torbutton.use_nontor_proxy", true);
|
||||
|
||||
//For socket conversion: in the future, I'll need to make TBB communicate with
|
||||
//i2p over a unix socket. Fortunately, this is how you do that. It will be
|
||||
//configurable in a similar way to the host:port configuration when that happens.
|
||||
//user_pref("extensions.torlauncher.socks_port_use_ipc", );
|
||||
//user_pref("extensions.torlauncher.socks_ipc_path", "");
|
||||
|
||||
user_pref("extensions.torlauncher.start_tor", false);
|
||||
//user_pref("extensions.torlauncher.default_bridge_type", "");
|
||||
user_pref("extensions.torlauncher.prompt_at_startup", false);
|
||||
|
||||
// Resist-fingerprinting and first-party isolation enable
|
||||
|
||||
user_pref("privacy.resistFingerprinting", true);
|
||||
user_pref("privacy.firstparty.isolate", true);
|
||||
|
||||
// Use i2p http proxy for all connections and set homepage to safe local form.
|
||||
|
||||
// DON'T allow access to the admin panel from the profile we browse i2p with.
|
||||
user_pref("network.proxy.no_proxies_on", "127.0.0.1:7657,localhost:7657,127.0.0.1:7662,localhost:7662,127.0.0.1:7669,localhost:7669");
|
||||
user_pref("network.proxy.type", 1);
|
||||
user_pref("network.proxy.http", "127.0.0.1");
|
||||
user_pref("network.proxy.http_port", 4444);
|
||||
user_pref("network.proxy.ssl", "127.0.0.1");
|
||||
user_pref("network.proxy.ssl_port", 4444);
|
||||
user_pref("network.proxy.ftp", "127.0.0.1");
|
||||
user_pref("network.proxy.ftp_port", 4444);
|
||||
user_pref("network.proxy.socks", "127.0.0.1");
|
||||
user_pref("network.proxy.socks_port", 4444);
|
||||
user_pref("network.proxy.share_proxy_settings", true);
|
||||
user_pref("browser.startup.homepage", "about:blank");
|
||||
user_pref("dom.security.https_only_mode", false);
|
||||
user_pref("keyword.enabled", false);
|
||||
user_pref("extensions.allowPrivateBrowsingByDefault", true);
|
||||
user_pref("extensions.PrivateBrowsing.notification", false);
|
||||
user_pref("extensions.pocket.enabled", false);
|
||||
user_pref("browser.newtabpage.activity-stream.showSponsoredTopSites", false);
|
||||
user_pref("browser.newtabpage.activity-stream.showSponsored", false);
|
||||
user_pref("services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsored", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.section.topstories", false);
|
||||
user_pref("browser.newtabpage.activity-stream.default.sites", "http://planet.i2p/,http://legwork.i2p/,http://i2pwiki.i2p/,http://i2pforums.i2p/,http://zzz.i2p/");
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.topsites", true);
|
||||
user_pref("ui.use_standins_for_native_colors", true);
|
||||
user_pref("webgl.disable-extensions", true);
|
||||
user_pref("webgl.min_capability_mode", true);
|
||||
user_pref("webgl.disable-fail-if-major-performance-caveat", true);
|
||||
user_pref("webgl.enable-webgl2", false);
|
||||
user_pref("media.navigator.enabled", false);
|
||||
user_pref("dom.w3c_touch_events.enabled", false);
|
||||
user_pref("browser.privatebrowsing.autostart", false);
|
||||
user_pref("browser.display.use_system_colors", false);
|
||||
user_pref("dom.image-lazy-loading.enabled", false)
|
||||
user_pref("extensions.autoDisableScopes", 0);
|
||||
user_pref("extensions.enabledScopes", 1);
|
Binary file not shown.
@ -1,229 +0,0 @@
|
||||
/*
|
||||
Overrides#
|
||||
for Extension Preferences# Tor Browser Bundle# Do not edit this file.##This file is modified from a file included in the Tor Browser Bundle.##Copyright 2017 The Tor Project.See LICENSE.tor#
|
||||
for licensing information.
|
||||
|
||||
HTTPS Everywhere Preferences:
|
||||
*/
|
||||
user_pref("extensions.https_everywhere._observatory.popup_shown", true);
|
||||
user_pref("extensions.https_everywhere.toolbar_hint_shown", true);
|
||||
|
||||
/*
|
||||
NoScript Preferences: #In order to disable all scripts by
|
||||
default, uncomment the following line...#user_pref("capability.policy.maonoscript.javascript.enabled", "noAccess");#
|
||||
and comment out the following line
|
||||
*/
|
||||
user_pref("capability.policy.maonoscript.javascript.enabled", "allAccess");
|
||||
user_pref("capability.policy.maonoscript.sites", "[System+Principal] about: about:tbupdate about:tor chrome: resource: blob: mediasource: moz-extension: moz-safe-about: about:neterror about:certerror about:feeds about:tabcrashed about:cache");
|
||||
user_pref("noscript.default", "[System+Principal] about: about:tbupdate about:tor chrome: resource: blob: mediasource: moz-extension: moz-safe-about: about:neterror about:certerror about:feeds about:tabcrashed about:cache");
|
||||
user_pref("noscript.mandatory", "[System+Principal] about: about:tbupdate about:tor chrome: resource: blob: mediasource: moz-extension: moz-safe-about: about:neterror about:certerror about:feeds about:tabcrashed about:cache");
|
||||
user_pref("noscript.ABE.enabled", false);
|
||||
user_pref("noscript.ABE.notify", false);
|
||||
user_pref("noscript.ABE.wanIpAsLocal", false);
|
||||
user_pref("noscript.confirmUnblock", false);
|
||||
user_pref("noscript.contentBlocker", true);
|
||||
user_pref("noscript.firstRunRedirection", false);
|
||||
user_pref("noscript.global", true);
|
||||
user_pref("noscript.gtemp", "");
|
||||
user_pref("noscript.opacizeObject", 3);
|
||||
user_pref("noscript.forbidWebGL", true);
|
||||
user_pref("noscript.forbidFonts", true);
|
||||
user_pref("noscript.options.tabSelectedIndexes", "5,0,0");
|
||||
user_pref("noscript.policynames", "");
|
||||
user_pref("noscript.secureCookies", true);
|
||||
user_pref("noscript.showAllowPage", false);
|
||||
user_pref("noscript.showBaseDomain", false);
|
||||
user_pref("noscript.showDistrust", false);
|
||||
user_pref("noscript.showRecentlyBlocked", false);
|
||||
user_pref("noscript.showTemp", false);
|
||||
user_pref("noscript.showTempToPerm", false);
|
||||
user_pref("noscript.showUntrusted", false);
|
||||
user_pref("noscript.STS.enabled", false);
|
||||
user_pref("noscript.subscription.lastCheck", -142148139);
|
||||
user_pref("noscript.temp", "");
|
||||
user_pref("noscript.untrusted", "");
|
||||
user_pref("noscript.forbidMedia", true);
|
||||
user_pref("noscript.allowWhitelistUpdates", false);
|
||||
user_pref("noscript.fixLinks", false);
|
||||
// Now handled by plugins.click_to_play // Not in this one.
|
||||
user_pref("noscript.forbidFlash", true);
|
||||
user_pref("noscript.forbidSilverlight", true);
|
||||
user_pref("noscript.forbidJava", true);
|
||||
user_pref("noscript.forbidPlugins", true);
|
||||
// Usability tweaks
|
||||
user_pref("noscript.showPermanent", false);
|
||||
user_pref("noscript.showTempAllowPage", true);
|
||||
user_pref("noscript.showRevokeTemp", true);
|
||||
user_pref("noscript.notify", false);
|
||||
user_pref("noscript.autoReload", true);
|
||||
user_pref("noscript.autoReload.allTabs", false);
|
||||
user_pref("noscript.cascadePermissions", true);
|
||||
user_pref("noscript.restrictSubdocScripting", true);
|
||||
user_pref("noscript.showVolatilePrivatePermissionsToggle", false);
|
||||
user_pref("noscript.volatilePrivatePermissions", true);
|
||||
user_pref("noscript.clearClick", 0);
|
||||
|
||||
user_pref("intl.locale.matchOS", false);
|
||||
|
||||
user_pref("extensions.https_everywhere._observatory.enabled", false);
|
||||
user_pref("extensions.https_everywhere.options.autoUpdateRulesets", false);
|
||||
user_pref("extensions.https_everywhere.globalEnabled", false);
|
||||
user_pref("extensions.https_everywhere._observatory.submit_during_tor", false);
|
||||
user_pref("extensions.https_everywhere._observatory.submit_during_nontor", false);
|
||||
user_pref("extensions.https_everywhere._observatory.use_custom_proxy", true);
|
||||
user_pref("extensions.https_everywhere._observatory.proxy_host", "127.0.0.1");
|
||||
user_pref("extensions.https_everywhere._observatory.proxy_port", 4444);
|
||||
|
||||
user_pref("extensions.torbutton.use_nontor_proxy", true);
|
||||
|
||||
//For socket conversion: in the future, I'll need to make TBB communicate with
|
||||
//i2p over a unix socket. Fortunately, this is how you do that. It will be
|
||||
//configurable in a similar way to the host:port configuration when that happens.
|
||||
//user_pref("extensions.torlauncher.socks_port_use_ipc", );
|
||||
//user_pref("extensions.torlauncher.socks_ipc_path", "");
|
||||
|
||||
// TODO: this is a Tor Browser specific setting which is ignored on Firefox. If
|
||||
// I make it true, the SOCKS outproxy will have something to connect to. But I
|
||||
// need to test more to find out if that's prudent.
|
||||
user_pref("extensions.torlauncher.start_tor", false);
|
||||
//user_pref("extensions.torlauncher.default_bridge_type", "");
|
||||
user_pref("extensions.torlauncher.prompt_at_startup", false);
|
||||
|
||||
// Resist-fingerprinting and first-party isolation enable
|
||||
|
||||
user_pref("privacy.resistFingerprinting", true);
|
||||
user_pref("privacy.firstparty.isolate", true);
|
||||
|
||||
// Use i2p http proxy for all connections and set homepage to safe local form.
|
||||
|
||||
// DON'T allow access to the admin panel from the profile we browse i2p with.
|
||||
user_pref("network.proxy.no_proxies_on", "127.0.0.1:7657,localhost:7657,127.0.0.1:7662,localhost:7662,127.0.0.1:7669,localhost:7669");
|
||||
user_pref("network.proxy.type", 1);
|
||||
user_pref("network.proxy.http", "127.0.0.1");
|
||||
user_pref("network.proxy.http_port", 4444);
|
||||
user_pref("network.proxy.ssl", "127.0.0.1");
|
||||
user_pref("network.proxy.ssl_port", 4444);
|
||||
user_pref("network.proxy.ftp", "127.0.0.1");
|
||||
user_pref("network.proxy.ftp_port", 4444);
|
||||
user_pref("network.proxy.socks", "127.0.0.1");
|
||||
user_pref("network.proxy.socks_port", 4444);
|
||||
user_pref("network.proxy.share_proxy_settings", true);
|
||||
user_pref("browser.startup.homepage", "http://127.0.0.1:7657/home");
|
||||
|
||||
// Privacy-harden and disable irrelevant features.
|
||||
user_pref("app.normandy.api_url", "");
|
||||
user_pref("app.normandy.enabled", false);
|
||||
user_pref("app.update.auto", false);
|
||||
user_pref("app.update.enabled", false);
|
||||
user_pref("beacon.enabled", false);
|
||||
user_pref("browser.aboutHomeSnippets.updateUrl", "");
|
||||
user_pref("browser.cache.disk_cache_ssl", false);
|
||||
user_pref("browser.cache.disk.enable", false);
|
||||
user_pref("browser.cache.offline.enable", false);
|
||||
user_pref("browser.disableResetPrompt", true);
|
||||
user_pref("browser.display.use_document_fonts", 0);
|
||||
user_pref("browser.fixup.alternate.enabled", false);
|
||||
user_pref("browser.formfill.enable", false);
|
||||
user_pref("browser.library.activity-stream.enabled", false);
|
||||
user_pref("browser.newtabpage.activity-stream.disableSnippets", true);
|
||||
user_pref("browser.newtabpage.activity-stream.enabled", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.snippets", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.telemetry", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.topsites", false);
|
||||
user_pref("browser.newtabpage.activity-stream.prerender", false);
|
||||
user_pref("browser.newtabpage.activity-stream.showSearch", false);
|
||||
user_pref("browser.newtabpage.enhanced", false);
|
||||
user_pref("browser.newtabpage.introShown", true);
|
||||
user_pref("browser.newtab.preload", false);
|
||||
user_pref("browser.onboarding.enabled", false);
|
||||
user_pref("browser.pagethumbnails.capturing_disabled", true);
|
||||
user_pref("browser.safebrowsing.appRepURL", "");
|
||||
user_pref("browser.safebrowsing.blockedURIs.enabled", false);
|
||||
user_pref("browser.safebrowsing.downloads.enabled", false);
|
||||
user_pref("browser.safebrowsing.downloads.remote.enabled", false);
|
||||
user_pref("browser.safebrowsing.downloads.remote.url", "");
|
||||
user_pref("browser.safebrowsing.enabled", false);
|
||||
user_pref("browser.safebrowsing.malware.enabled", false);
|
||||
user_pref("browser.safebrowsing.phishing.enabled", false);
|
||||
user_pref("browser.search.geoip.timeout", 1);
|
||||
user_pref("browser.search.suggest.enabled", false);
|
||||
user_pref("browser.selfsupport.url", "");
|
||||
user_pref("browser.send_pings", false);
|
||||
user_pref("browser.shell.checkDefaultBrowser", false);
|
||||
user_pref("browser.startup.homepage_override.mstone", "ignore");
|
||||
user_pref("browser.startup.page", 0);
|
||||
user_pref("browser.toolbarbuttons.introduced.pocket-button", true);
|
||||
user_pref("browser.urlbar.speculativeConnect.enabled", false);
|
||||
user_pref("browser.urlbar.trimURLs", false);
|
||||
user_pref("datareporting.healthreport.uploadEnabled", false);
|
||||
user_pref("datareporting.policy.dataSubmissionEnabled", false);
|
||||
user_pref("dom.battery.enabled", false);
|
||||
user_pref("dom.enable_performance", false);
|
||||
user_pref("dom.enable_performance_navigation_timing", false);
|
||||
user_pref("dom.enable_resource_timing", false);
|
||||
user_pref("dom.event.clipboardevents.enabled", false);
|
||||
user_pref("dom.gamepad.enabled", false);
|
||||
user_pref("dom.indexedDB.enabled", false);
|
||||
user_pref("dom.min_timeout_value", 400);
|
||||
user_pref("dom.push.connection.enabled", false);
|
||||
user_pref("dom.push.enabled", false);
|
||||
user_pref("dom.serviceWorkers.enabled", false);
|
||||
user_pref("dom.serviceWorkers.interception.enabled", false);
|
||||
user_pref("dom.storage.enabled", false);
|
||||
user_pref("dom.webaudio.enabled", false);
|
||||
user_pref("extensions.autoDisableScopes", 0);
|
||||
user_pref("extensions.enabledScopes", 1);
|
||||
user_pref("extensions.getAddons.cache.enabled", false);
|
||||
user_pref("extensions.getAddons.showPane", false);
|
||||
user_pref("extensions.pocket.enabled", false);
|
||||
user_pref("extensions.screenshots.disabled", true);
|
||||
user_pref("extensions.webservice.discoverURL", "");
|
||||
user_pref("geo.enabled", false);
|
||||
user_pref("geo.wifi.uri", "");
|
||||
user_pref("gfx.downloadable_fonts.disable_cache", true);
|
||||
user_pref("javascript.options.shared_memory", false);
|
||||
user_pref("layout.css.visited_links_enabled", false);
|
||||
user_pref("media.autoplay.enabled", false);
|
||||
user_pref("media.cache_size", 0);
|
||||
user_pref("media.navigator.enabled", false);
|
||||
user_pref("media.peerconnection.ice.no_host", true);
|
||||
user_pref("media.video_stats.enabled", false);
|
||||
user_pref("captivedetect.canonicalURL", "");
|
||||
user_pref("network.captive-portal-service.enabled", false);
|
||||
user_pref("network.cookie.cookieBehavior", 1);
|
||||
user_pref("network.cookie.lifetimePolicy", 2);
|
||||
user_pref("network.dns.disablePrefetch", true);
|
||||
user_pref("network.http.referer.spoofSource", true);
|
||||
user_pref("network.http.referer.trimmingPolicy", 2);
|
||||
user_pref("network.http.referer.XOriginPolicy", 2);
|
||||
user_pref("network.prefetch-next", false);
|
||||
user_pref("privacy.donottrackheader.enabled", true);
|
||||
user_pref("privacy.donottrackheader.value", 1);
|
||||
user_pref("toolkit.telemetry.archive.enabled", false);
|
||||
user_pref("toolkit.telemetry.coverage.opt-out", true);
|
||||
user_pref("toolkit.telemetry.enabled", false);
|
||||
user_pref("toolkit.telemetry.server", "");
|
||||
user_pref("toolkit.telemetry.unified", false);
|
||||
user_pref("webgl.disabled", true);
|
||||
user_pref("browser.chrome.errorReporter.infoURL", "");
|
||||
user_pref("breakpad.reportURL", "");
|
||||
//user_pref("browser.newtabpage.activity-stream.default.sites", "");
|
||||
user_pref("browser.newtabpage.activity-stream.showSponsoredTopSites", false);
|
||||
user_pref("browser.newtabpage.activity-stream.showSponsored", false);
|
||||
user_pref("services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsored", false);
|
||||
user_pref("browser.newtabpage.enabled", true);
|
||||
user_pref("browser.newtabpage.activity-stream.default.sites", "http://planet.i2p/,http://legwork.i2p/,http://i2pwiki.i2p/,http://i2pforums.i2p/,http://zzz.i2p/");
|
||||
user_pref("dom.security.https_only_mode", false);
|
||||
user_pref("keyword.enabled", false);
|
||||
user_pref("extensions.allowPrivateBrowsingByDefault", true);
|
||||
user_pref("extensions.PrivateBrowsing.notification", false);
|
||||
user_pref("browser.newtabpage.activity-stream.feeds.topsites", true);
|
||||
user_pref("ui.use_standins_for_native_colors", true);
|
||||
user_pref("webgl.disable-extensions", true);
|
||||
user_pref("webgl.min_capability_mode", true);
|
||||
user_pref("webgl.disable-fail-if-major-performance-caveat", true);
|
||||
user_pref("webgl.enable-webgl2", false);
|
||||
user_pref("dom.w3c_touch_events.enabled", false);
|
||||
user_pref("browser.privatebrowsing.autostart", false);
|
||||
user_pref("browser.display.use_system_colors", false);
|
1353
src/profile/user.js
1353
src/profile/user.js
File diff suppressed because it is too large
Load Diff
@ -1 +0,0 @@
|
||||
1.9.7
|
@ -1,9 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Terminal=false
|
||||
Exec=/usr/bin/i2pbrowser.sh
|
||||
Name=I2P Browser
|
||||
Categories=Network;WebBrowser;
|
||||
Icon=/var/lib/i2pbrowser/icons/ui2pbrowser_icon.ico
|
@ -1,9 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Terminal=false
|
||||
Exec=/usr/local/bin/i2pbrowser
|
||||
Name=I2P Browser
|
||||
Categories=Network;WebBrowser;
|
||||
Icon=/var/lib/i2pbrowser/icons/ui2pbrowser_icon.ico
|
@ -1,9 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Terminal=false
|
||||
Exec=/usr/bin/i2pconfig.sh
|
||||
Name=I2P Configuration
|
||||
Categories=Network;WebBrowser;
|
||||
Icon=/var/lib/i2pbrowser/icons/ui2pbrowser_icon.ico
|
@ -1,9 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Terminal=false
|
||||
Exec=/usr/local/bin/i2pconfig
|
||||
Name=I2P Configuration
|
||||
Categories=Network;WebBrowser;
|
||||
Icon=/var/lib/i2pbrowser/icons/ui2pbrowser_icon.ico
|
@ -1,21 +0,0 @@
|
||||
#! /usr/bin/env sh
|
||||
|
||||
# Works for Debian service installs. Sets up minified, custom profile for configuring I2P console.
|
||||
|
||||
if grep '^i2psvc:' /etc/passwd; then
|
||||
I2P_HOME=$(grep '^i2psvc:' /etc/passwd | sed 's|i2psvc:x:||g' | sed 's|:/usr/sbin/nologin||g' | tr -d ':1234567890' | sed 's|ip|i2p|g')
|
||||
ROUTER_CONFIG=$(sudo -u i2psvc ls $I2P_HOME/i2p-config/router.config)
|
||||
fi
|
||||
|
||||
installer(){
|
||||
|
||||
if [ $(sudo -u i2psvc ls $I2P_HOME/i2p-config/router.config) ]; then
|
||||
echo $I2P_HOME $ROUTER_CONFIG $0
|
||||
if ! sudo -u i2psvc grep -R 'routerconsole.browser' "$I2P_HOME/i2p-config/router.config" ; then
|
||||
echo "routerconsole.browser=/usr/local/bin/i2pconfig" | sudo tee -a "$I2P_HOME/i2p-config/router.config"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
installer
|
@ -1,44 +0,0 @@
|
||||
#! /usr/bin/env sh
|
||||
|
||||
if [ -f "/etc/i2pbrowser/i2pbrowserrc" ]; then
|
||||
. /etc/i2pbrowser/i2pbrowserrc
|
||||
fi
|
||||
|
||||
if [ ! -z $I2PROUTER ]; then
|
||||
"$I2PROUTER" start
|
||||
fi
|
||||
|
||||
if [ -z $BROWSING_PROFILE ]; then
|
||||
BROWSING_PROFILE="."
|
||||
fi
|
||||
|
||||
if [ ! -d "$BROWSING_PROFILE" ]; then
|
||||
mkdir -p "$BROWSING_PROFILE"
|
||||
cp -vr /var/lib/i2pbrowser/profile/* "$BROWSING_PROFILE"
|
||||
fi
|
||||
|
||||
if [ ! -f "$BROWSING_PROFILE/user.js" ]; then
|
||||
echo "user.js not present in $BROWSING_PROFILE, this is not a Firefox profile"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z $FIREFOX ]; then
|
||||
if [ -f "firefox/firefox" ]; then
|
||||
FIREFOX="./firefox/firefox"
|
||||
fi
|
||||
FIREFOX=$(which firefox-esr)
|
||||
if [ -z $FIREFOX ]; then
|
||||
FIREFOX=$(which firefox)
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z $FIREFOX ]; then
|
||||
echo "Firefox does not appear to be in your \$PATH."
|
||||
echo "Please install Firefox via a package manager, or"
|
||||
echo "or set the FIREFOX variable in your shell to the"
|
||||
echo "location of a Firefox executable."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo $FIREFOX --profile "$BROWSING_PROFILE" $@
|
||||
$FIREFOX --profile "$BROWSING_PROFILE" $@
|
@ -1,17 +0,0 @@
|
||||
|
||||
I2PROUTER=$(which i2prouter)
|
||||
|
||||
if [ -z $I2PROUTER ]; then
|
||||
I2PROUTER=/usr/sbin/i2prouter
|
||||
fi
|
||||
|
||||
if [ ! -f $I2PROUTER ]; then
|
||||
I2PROUTER="$HOME/i2p/i2prouter"
|
||||
fi
|
||||
|
||||
if [ ! -f $I2PROUTER ]; then
|
||||
I2PROUTER=""
|
||||
fi
|
||||
|
||||
wget -q -O - "http://localhost:7657" >/dev/null && I2PROUTER=""
|
||||
echo "$I2PROUTER"
|
@ -1,8 +0,0 @@
|
||||
|
||||
if [ -f /etc/i2pbrowser/i2pbrowserdebianrc ]; then
|
||||
. /etc/i2pbrowser/i2pbrowserdebianrc
|
||||
fi
|
||||
|
||||
CONFIGURING_PROFILE=$HOME/i2p/firefox/webapps
|
||||
BROWSING_PROFILE=$HOME/i2p/firefox/browsing
|
||||
ROUTER_CONSOLE="127.0.0.1:7657"
|
@ -1,60 +0,0 @@
|
||||
#! /usr/bin/env sh
|
||||
|
||||
if [ -f "/etc/i2pbrowser/i2pbrowserrc" ]; then
|
||||
. /etc/i2pbrowser/i2pbrowserrc
|
||||
fi
|
||||
|
||||
if [ ! -z $I2PROUTER ]; then
|
||||
"$I2PROUTER" start
|
||||
fi
|
||||
|
||||
if [ -f "$HOME/.i2p/router.config" ]; then
|
||||
if [ "$0" = "/usr/local/bin/i2pconfig" ]; then
|
||||
if ! grep -R 'routerconsole.browser' "$HOME/.i2p/router.config" ; then
|
||||
echo "routerconsole.browser=$0" | tee -a "$HOME/.i2p/router.config"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z $CONFIGURING_PROFILE ]; then
|
||||
CONFIGURING_PROFILE="."
|
||||
fi
|
||||
|
||||
if [ -z $ROUTER_CONSOLE ]; then
|
||||
ROUTER_CONSOLE="$1"
|
||||
if [ -z $1 ]; then
|
||||
ROUTER_CONSOLE="http://127.0.0.1:7657"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -d "$CONFIGURING_PROFILE" ]; then
|
||||
mkdir -p "$CONFIGURING_PROFILE"
|
||||
cp -vr /var/lib/i2pbrowser/app-profile/* "$CONFIGURING_PROFILE"
|
||||
fi
|
||||
|
||||
if [ ! -f "$CONFIGURING_PROFILE/user.js" ]; then
|
||||
echo "user.js not present in $CONFIGURING_PROFILE, this is not a Firefox profile"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z $FIREFOX ]; then
|
||||
if [ -f "firefox/firefox" ]; then
|
||||
FIREFOX="./firefox/firefox"
|
||||
fi
|
||||
FIREFOX=$(which firefox-esr)
|
||||
if [ -z $FIREFOX ]; then
|
||||
FIREFOX=$(which firefox)
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z $FIREFOX ]; then
|
||||
echo "Firefox does not appear to be in your \$PATH."
|
||||
echo "Please install Firefox via a package manager, or"
|
||||
echo "or set the FIREFOX variable in your shell to the"
|
||||
echo "location of a Firefox executable."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo $FIREFOX --profile "$CONFIGURING_PROFILE" "$ROUTER_CONSOLE" $@
|
||||
|
||||
$FIREFOX --profile "$CONFIGURING_PROFILE" "$ROUTER_CONSOLE" $@
|
28
src/unix/torbrowser.sh
Executable file
28
src/unix/torbrowser.sh
Executable file
@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
|
||||
TORSOCKS=$(which torsocks)
|
||||
if [ -f "${TORSOCKS}" ]; then
|
||||
. "${TORSOCKS}" on
|
||||
fi
|
||||
|
||||
version="$(curl -s https://aus1.torproject.org/torbrowser/update_3/release/downloads.json | jq -r ".version")"
|
||||
locale="en-US" # mention your locale. default = en-US
|
||||
if [ -d /etc/default/locale ]; then
|
||||
. /etc/default/locale
|
||||
locale=$(echo "${LANG}" | cut -d . -f1)
|
||||
fi
|
||||
|
||||
if [ ! -f ./tor.keyring ]; then
|
||||
gpg --auto-key-locate nodefault,wkd --locate-keys torbrowser@torproject.org
|
||||
gpg --output ./tor.keyring --export torbrowser@torproject.org
|
||||
fi
|
||||
|
||||
if [ ! -f "tor-browser-linux64-${version}_${locale}.tar.xz" ]; then
|
||||
wget -cv "https://www.torproject.org/dist/torbrowser/${version}/tor-browser-linux-x86_64-${version}.tar.xz"
|
||||
https://dist.torproject.org/torbrowser/13.0.9/
|
||||
wget -cv "https://www.torproject.org/dist/torbrowser/${version}/tor-browser-linux-x86_64-${version}.tar.xz.asc"
|
||||
fi
|
||||
|
||||
gpgv --keyring ./tor.keyring "tor-browser-linux-x86_64-${version}.tar.xz.asc" "tor-browser-linux-x86_64-${version}.tar.xz"
|
||||
|
||||
tar xvJf "tor-browser-linux-x86_64-${version}.tar.xz"
|
28
src/win/torbrowser-windows.sh
Executable file
28
src/win/torbrowser-windows.sh
Executable file
@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
|
||||
TORSOCKS=$(which torsocks)
|
||||
#if [ -f "${TORSOCKS}" ]; then
|
||||
# . "${TORSOCKS}" on
|
||||
#fi
|
||||
|
||||
version="$(curl -s https://aus1.torproject.org/torbrowser/update_3/release/downloads.json | jq -r ".version")"
|
||||
locale="en-US" # mention your locale. default = en-US
|
||||
if [ -d /etc/default/locale ]; then
|
||||
. /etc/default/locale
|
||||
locale=$(echo "${LANG}" | cut -d . -f1)
|
||||
fi
|
||||
|
||||
if [ ! -f ./tor.keyring ]; then
|
||||
gpg --auto-key-locate nodefault,wkd --locate-keys torbrowser@torproject.org
|
||||
gpg --output ./tor.keyring --export torbrowser@torproject.org
|
||||
fi
|
||||
|
||||
if [ ! -f "tor-browser-linux64-${version}_${locale}.exe" ]; then
|
||||
wget -cv "https://dist.torproject.org/torbrowser/${version}/tor-browser-windows-x86_64-portable-${version}.exe"
|
||||
wget -cv "https://dist.torproject.org/torbrowser/${version}/tor-browser-windows-x86_64-portable-${version}.exe.asc"
|
||||
fi
|
||||
|
||||
gpgv --keyring ./tor.keyring "tor-browser-windows-x86_64-portable-${version}.exe.asc" "tor-browser-windows-x86_64-portable-${version}.exe"
|
||||
|
||||
7z x "tor-browser-windows-x86_64-portable-${version}.exe" -o"Tor Browser"
|
||||
#7z --help
|
15
targz.sh
15
targz.sh
@ -1,15 +0,0 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
./clean.sh
|
||||
wsl make distclean
|
||||
./build.sh
|
||||
tar czvf I2P.tar.gz I2P
|
15
unsigned.sh
15
unsigned.sh
@ -1,15 +0,0 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
|
||||
cd "$SCRIPT_DIR" || exit 1
|
||||
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
|
||||
if [ -f "$SCRIPT_DIR/config_override.sh" ]; then
|
||||
. "$SCRIPT_DIR/config_override.sh"
|
||||
fi
|
||||
|
||||
./clean.sh
|
||||
wsl make distclean
|
||||
./build.sh
|
||||
wsl make
|
Reference in New Issue
Block a user