Compare commits
123 Commits
Author | SHA1 | Date | |
---|---|---|---|
64aac910a6 | |||
246c27627b | |||
d529f353e4 | |||
89cff0c444 | |||
ff19ea685b | |||
e5f6f335ee | |||
bcfbf90be2 | |||
63922c3880 | |||
35570a119d | |||
b877b6141d | |||
62f23d360d | |||
c78614fea5 | |||
44cc27b968 | |||
274748d08b | |||
b4840b7355 | |||
6072b8552e | |||
7c0070cd15 | |||
8083c6c652 | |||
d9d13fac70 | |||
75049fa08e | |||
113caaa922 | |||
bf1b923750 | |||
286122d492 | |||
9ebc0eae81 | |||
de6cdb7b42 | |||
fdeb86d356 | |||
b25cb2c9b3 | |||
515e52eeb2 | |||
616a839c8b | |||
da5ae47278 | |||
c37df87516 | |||
980c59d031 | |||
b8b5c45126 | |||
affc3e5d40 | |||
f225bbb35e | |||
6ed3aae543 | |||
aa54248eb8 | |||
9a5c2bbe42 | |||
fccccfedfa | |||
3b8baa4db4 | |||
31f1483aa7 | |||
1157eb666e | |||
c300648c22 | |||
267047f687 | |||
1f6c3348a3 | |||
47962f350b | |||
625d13d4a3 | |||
61aa5f4b1f | |||
d1d457a0fe | |||
cac93e0f48 | |||
e1401ea5d0 | |||
8ce0bd3f12 | |||
3c705909ea | |||
5db2119370 | |||
9f309457e6 | |||
1bab795f26 | |||
012e5d6d5b | |||
74f946bbe8 | |||
e606cd68bb | |||
a833bb30bd | |||
be5204bf76 | |||
7332ae013d | |||
7a008be8d7 | |||
4101a344a2 | |||
ff35bc7023 | |||
1249e78543 | |||
af1c32ccc1 | |||
50c2f33f55 | |||
6178b723f5 | |||
c71b30d5c1 | |||
7d66622db2 | |||
fe8616491a | |||
240b54d280 | |||
903da4bb7a | |||
ab936f08eb | |||
61431a027c | |||
8cca947702 | |||
ae888b9a06 | |||
e9c1d78a75 | |||
e930adf49d | |||
496db4a1f5 | |||
4cf2854896 | |||
9e3a834f88 | |||
8fd2874722 | |||
83f49f5b12 | |||
b7bb0b3da1 | |||
7d10266562 | |||
53a1e0ff0f | |||
524896c03f | |||
effe91b6f6 | |||
f0616b82d4 | |||
28153cc7a4 | |||
069f6fb107 | |||
6073584af8 | |||
a4ec776107 | |||
3b2c59f38c | |||
f0d9aad522 | |||
101d814777 | |||
ca5409b8b8 | |||
1397463841 | |||
fcfa56a4c9 | |||
8694c726c5 | |||
c2b4442e51 | |||
ac3b7163d8 | |||
14cd4268f4 | |||
db5f10764b | |||
f2895049f5 | |||
940808d3a2 | |||
1eb1b4c65f | |||
a9a178331e | |||
6a6e688c87 | |||
db3020c389 | |||
3f51a667ab | |||
1635421d0b | |||
fdcd79aee9 | |||
df325a0717 | |||
aa95cab914 | |||
fffba3dd6d | |||
b5a257a57c | |||
7cdf84bb26 | |||
375774687b | |||
d930a201dd | |||
f97f960b90 |
240
.github/workflows/ant.yml
vendored
Normal file
240
.github/workflows/ant.yml
vendored
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
# Mostly copied from i2p.i2p, by way of: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-ant
|
||||||
|
# zlatinb did it originally, now I maintain it(idk)
|
||||||
|
|
||||||
|
name: Java CI
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: dependencies
|
||||||
|
run: sudo apt install gettext golang-go git ant
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Set up JDK 21
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
java-version: '21'
|
||||||
|
distribution: 'temurin'
|
||||||
|
- name : Generate override.properties
|
||||||
|
run: |
|
||||||
|
rm -f override.properties
|
||||||
|
echo "build.built-by=GitHub Actions" >> override.properties
|
||||||
|
echo "noExe=true" >> override.properties
|
||||||
|
- name: install crx3
|
||||||
|
run: go install github.com/mediabuyerbot/go-crx3/crx3@latest
|
||||||
|
- name: install dzip
|
||||||
|
run: go install github.com/delicb/dzip@latest
|
||||||
|
- name: install amo-version
|
||||||
|
run: go install github.com/eyedeekay/amo-version@a4f4119eac453a14d6b6184b656320eb72b5da3c
|
||||||
|
- name: install manifest-json-version
|
||||||
|
run: go install github.com/eyedeekay/manifest-json-version@latest
|
||||||
|
- run: git clone https://github.com/i2p/i2p.i2p ../i2p.i2p
|
||||||
|
- run: cd ../i2p.i2p && ant builddep
|
||||||
|
- name: build with Ant
|
||||||
|
run: |
|
||||||
|
export PATH=$PATH:$(go env GOPATH)/bin
|
||||||
|
ant distclean jpackage debian
|
||||||
|
- name: Upload Firefox Profile Strict
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2p.firefox.base.profile.zip
|
||||||
|
path: ./src/i2p.firefox.base.profile.zip
|
||||||
|
- name: Upload Firefox Profile Usability
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2p.firefox.usability.profile.zip
|
||||||
|
path: ./src/i2p.firefox.usability.profile.zip
|
||||||
|
- name: Upload Chromium Profile Strict
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2p.chromium.base.profile.zip
|
||||||
|
path: ./src/i2p.chromium.base.profile.zip
|
||||||
|
- name: Upload Chromium Profile Usability
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2p.chromium.usability.profile.zip
|
||||||
|
path: ./src/i2p.chromium.usability.profile.zip
|
||||||
|
- name: Upload i2pfirefox.jar
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2pfirefox.jar
|
||||||
|
path: ./src/build/i2pfirefox.jar
|
||||||
|
- name: Upload i2pfirefox-plugin.jar
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2pfirefox-plugin.jar
|
||||||
|
path: ./src/build/i2pfirefox-plugin.jar
|
||||||
|
- name: Upload i2pbrowser.tar.gz
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2pbrowser.tar.gz
|
||||||
|
path: ./i2pbrowser.tar.gz
|
||||||
|
- name: Upload i2pbrowser.deb
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2pbrowser_amd64.deb
|
||||||
|
path: ./i2pbrowser_1.0.0_amd64.deb
|
||||||
|
- name: build plugin with Ant
|
||||||
|
run: |
|
||||||
|
export PATH=$PATH:$(go env GOPATH)/bin
|
||||||
|
ant distclean pluginzip
|
||||||
|
- name: Upload i2pfirefox.zip (unsigned plugin)
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2pfirefox.zip
|
||||||
|
path: ./plugin.zip
|
||||||
|
|
||||||
|
|
||||||
|
buildrpm:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: fedora
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: dependencies
|
||||||
|
run: sudo yum install -y gettext golang-go git ant jq wget curl gpg xz ca-certificates rpm-build
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Set up JDK 21
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
java-version: '21'
|
||||||
|
distribution: 'temurin'
|
||||||
|
- run: echo [Adoptium] >> /etc/yum.repos.d/adoptium.repo
|
||||||
|
- run: echo name=Adoptium >> /etc/yum.repos.d/adoptium.repo
|
||||||
|
- run: . /etc/os-release; echo baseurl=https://packages.adoptium.net/artifactory/rpm/fedora/$VERSION_ID/x86_64/ >> /etc/yum.repos.d/adoptium.repo
|
||||||
|
- run: echo enabled=1 >> /etc/yum.repos.d/adoptium.repo
|
||||||
|
- run: echo gpgcheck=1 >> /etc/yum.repos.d/adoptium.repo
|
||||||
|
- run: echo gpgkey=https://packages.adoptium.net/artifactory/api/gpg/key/public >> /etc/yum.repos.d/adoptium.repo
|
||||||
|
- run: dnf clean all && rm -r /var/cache/dnf && dnf upgrade -y && dnf update -y
|
||||||
|
- run: dnf install -y temurin-21-jdk
|
||||||
|
- name: Generate override.properties
|
||||||
|
run: |
|
||||||
|
rm -f override.properties
|
||||||
|
echo "build.built-by=GitHub Actions" >> override.properties
|
||||||
|
echo "noExe=true" >> override.properties
|
||||||
|
- name: install crx3
|
||||||
|
run: go install github.com/mediabuyerbot/go-crx3/crx3@latest
|
||||||
|
- name: install dzip
|
||||||
|
run: go install github.com/delicb/dzip@latest
|
||||||
|
- name: install amo-version
|
||||||
|
run: go install github.com/eyedeekay/amo-version@a4f4119eac453a14d6b6184b656320eb72b5da3c
|
||||||
|
- name: install manifest-json-version
|
||||||
|
run: go install github.com/eyedeekay/manifest-json-version@latest
|
||||||
|
- run: git clone https://github.com/i2p/i2p.i2p ../i2p.i2p
|
||||||
|
- run: cd ../i2p.i2p && ant builddep
|
||||||
|
- name: build with Ant
|
||||||
|
run: |
|
||||||
|
export PATH=$PATH:$(go env GOPATH)/bin
|
||||||
|
ant distclean jpackage fedora
|
||||||
|
find . -name '*.rpm'
|
||||||
|
- name: Upload i2pbrowser.rpm
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2pbrowser.x86_64.rpm
|
||||||
|
path: ./i2pbrowser-1.0.0-1.x86_64.rpm
|
||||||
|
|
||||||
|
|
||||||
|
buildwin:
|
||||||
|
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'
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.21'
|
||||||
|
- name : Generate override.properties
|
||||||
|
run: |
|
||||||
|
bash -c 'rm -f override.properties'
|
||||||
|
bash -c 'echo "build.built-by=GitHub Actions" >> override.properties'
|
||||||
|
bash -c 'echo "noExe=true" >> override.properties'
|
||||||
|
- name: install crx3
|
||||||
|
run: go install github.com/mediabuyerbot/go-crx3/crx3@latest
|
||||||
|
- name: install dzip
|
||||||
|
run: go install github.com/delicb/dzip@latest
|
||||||
|
- name: install amo-version
|
||||||
|
run: go install github.com/eyedeekay/amo-version@a4f4119eac453a14d6b6184b656320eb72b5da3c
|
||||||
|
- name: install manifest-json-version
|
||||||
|
run: go install github.com/eyedeekay/manifest-json-version@latest
|
||||||
|
- run: git clone https://github.com/i2p/i2p.i2p ../i2p.i2p
|
||||||
|
- run: cd ../i2p.i2p && ant builddep
|
||||||
|
- name: build exe with Ant
|
||||||
|
run: |
|
||||||
|
ant windows
|
||||||
|
bash -c 'ls *.exe'
|
||||||
|
- name: Upload Firefox Profile EXE Installer
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2pbrowser-1.0.0.exe
|
||||||
|
path: ./i2pbrowser-1.0.0.exe
|
||||||
|
- name: build msi with Ant
|
||||||
|
run: |
|
||||||
|
ant windows-msi
|
||||||
|
bash -c 'ls *.msi'
|
||||||
|
- name: Upload Firefox Profile MSI Installer
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2pbrowser-1.0.0.msi
|
||||||
|
path: ./i2pbrowser-1.0.0.msi
|
||||||
|
- name: build portable zip with Ant
|
||||||
|
run: |
|
||||||
|
ant windows-portable
|
||||||
|
bash -c 'ls *.zip'
|
||||||
|
- name: Upload Firefox Profile Portable Zip
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2pbrowser-portable.zip
|
||||||
|
path: ./i2pbrowser-portable.zip
|
||||||
|
|
||||||
|
buildmac:
|
||||||
|
runs-on: macos-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Set up JDK 21
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
java-version: '21'
|
||||||
|
distribution: 'temurin'
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.21'
|
||||||
|
- name : Generate override.properties
|
||||||
|
run: |
|
||||||
|
bash -c 'rm -f override.properties'
|
||||||
|
bash -c 'echo "build.built-by=GitHub Actions" >> override.properties'
|
||||||
|
bash -c 'echo "noExe=true" >> override.properties'
|
||||||
|
- name: install crx3
|
||||||
|
run: go install github.com/mediabuyerbot/go-crx3/crx3@latest
|
||||||
|
- name: install dzip
|
||||||
|
run: go install github.com/delicb/dzip@latest
|
||||||
|
- name: install amo-version
|
||||||
|
run: go install github.com/eyedeekay/amo-version@a4f4119eac453a14d6b6184b656320eb72b5da3c
|
||||||
|
- name: install manifest-json-version
|
||||||
|
run: go install github.com/eyedeekay/manifest-json-version@latest
|
||||||
|
- run: git clone https://github.com/i2p/i2p.i2p ../i2p.i2p
|
||||||
|
- run: cd ../i2p.i2p && ant builddep
|
||||||
|
- name: build dmg with Ant
|
||||||
|
run: |
|
||||||
|
ant macos
|
||||||
|
bash -c 'ls *.dmg'
|
||||||
|
- name: Upload Firefox Profile DMG Installer
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2pbrowser-1.0.0.dmg
|
||||||
|
path: ./i2pbrowser-1.0.0.dmg
|
||||||
|
- name: build pkg with Ant
|
||||||
|
run: |
|
||||||
|
ant macos-pkg
|
||||||
|
bash -c 'ls *.pkg'
|
||||||
|
- name: Upload Firefox Profile PKG Installer
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: i2pbrowser-1.0.0.pkg
|
||||||
|
path: ./i2pbrowser-1.0.0.pkg
|
78
.github/workflows/release.yml
vendored
Normal file
78
.github/workflows/release.yml
vendored
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
name: Release
|
||||||
|
|
||||||
|
#on: [push]
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
# Sequence of patterns matched against refs/tags
|
||||||
|
tags:
|
||||||
|
- '*.*.*' # Release 1.2.3
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
sparse-checkout: |
|
||||||
|
CHANGES.md
|
||||||
|
sparse-checkout-cone-mode: false
|
||||||
|
- name: sleep 15 minutes
|
||||||
|
run: |
|
||||||
|
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: false
|
||||||
|
workflow: ant.yml
|
||||||
|
if_no_artifact_found: fail
|
||||||
|
# remove .zip file extension
|
||||||
|
- run: for f in *.zip; do mv "$f" "${f%.zip}"; done
|
||||||
|
- run: echo "" | tee -a CHANGES.md
|
||||||
|
- run: echo "## Checksums" | tee -a CHANGES.md
|
||||||
|
- run: echo "" | tee -a CHANGES.md
|
||||||
|
- run: echo '```' | tee -a CHANGES.md
|
||||||
|
- run: sha256sum * | tee -a CHANGES.md
|
||||||
|
- run: echo '```' | tee -a CHANGES.md
|
||||||
|
- run: echo "" | tee -a CHANGES.md
|
||||||
|
- run: echo '```' | tee -a CHANGES.md
|
||||||
|
- run: file * | tee -a CHANGES.md
|
||||||
|
- run: echo '```' | tee -a CHANGES.md
|
||||||
|
- run: echo "" | tee -a CHANGES.md
|
||||||
|
- name: Upload artifacts
|
||||||
|
uses: ncipollo/release-action@v1
|
||||||
|
with:
|
||||||
|
artifacts: "*"
|
||||||
|
bodyFile: "CHANGES.md"
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -36,3 +36,4 @@ i2p.plugins.firefox/
|
|||||||
/.cache
|
/.cache
|
||||||
/.mozilla
|
/.mozilla
|
||||||
/i2p.plugins.firefox.torrent.zip
|
/i2p.plugins.firefox.torrent.zip
|
||||||
|
/plugin
|
||||||
|
27
CHANGES.html
27
CHANGES.html
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -59,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="docs/I2PBrowserPlugin.html">
|
<a href="docs/I2PBrowserPlugin.html">
|
||||||
docs/I2PBrowserPlugin
|
docs/I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -114,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="docs/I2PLibreWolf.html">
|
<a href="docs/I2PLibreWolf.html">
|
||||||
docs/I2PLibreWolf
|
docs/I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -143,6 +146,23 @@
|
|||||||
<a id="returnhome" href="/">
|
<a id="returnhome" href="/">
|
||||||
/
|
/
|
||||||
</a>
|
</a>
|
||||||
|
<h2>
|
||||||
|
Thu, March 7
|
||||||
|
</h2>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
re-implement Plugin functions with Destop GUI API.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Fix several NPE’s
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Delete redundant code
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
CI/CD improvements, packaging improvements
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
<h2>
|
<h2>
|
||||||
Tue, January 17
|
Tue, January 17
|
||||||
</h2>
|
</h2>
|
||||||
@ -1326,12 +1346,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
|
Thu, March 7
|
||||||
|
------------
|
||||||
|
|
||||||
|
- re-implement Plugin functions with Destop GUI API.
|
||||||
|
- Fix several NPE's
|
||||||
|
- Delete redundant code
|
||||||
|
- CI/CD improvements, packaging improvements
|
||||||
|
|
||||||
Tue, January 17
|
Tue, January 17
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
10
LICENSE.html
10
LICENSE.html
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -59,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="docs/I2PBrowserPlugin.html">
|
<a href="docs/I2PBrowserPlugin.html">
|
||||||
docs/I2PBrowserPlugin
|
docs/I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -114,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="docs/I2PLibreWolf.html">
|
<a href="docs/I2PLibreWolf.html">
|
||||||
docs/I2PLibreWolf
|
docs/I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1893,12 +1896,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -55,7 +55,7 @@ For platform specific instructions, see
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
mkdir ~/tmp-i2pfirefox && cd ~/tmp-i2pfirefox
|
mkdir ~/tmp-i2pfirefox && cd ~/tmp-i2pfirefox
|
||||||
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.0.9/i2pfirefox.zip
|
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.3.0/i2pfirefox.zip
|
||||||
unzip i2pfirefox.zip
|
unzip i2pfirefox.zip
|
||||||
./i2pfirefox.cmd
|
./i2pfirefox.cmd
|
||||||
|
|
||||||
|
40
VERSION.html
40
VERSION.html
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -59,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="docs/I2PBrowserPlugin.html">
|
<a href="docs/I2PBrowserPlugin.html">
|
||||||
docs/I2PBrowserPlugin
|
docs/I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -114,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="docs/I2PLibreWolf.html">
|
<a href="docs/I2PLibreWolf.html">
|
||||||
docs/I2PLibreWolf
|
docs/I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -150,23 +153,23 @@
|
|||||||
Firefox
|
Firefox
|
||||||
</h2>
|
</h2>
|
||||||
<pre><code class="language-md">i2p-in-private-browsing
|
<pre><code class="language-md">i2p-in-private-browsing
|
||||||
1.44
|
1.48
|
||||||
https://addons.mozilla.org/firefox/downloads/file/4020669/i2p_in_private_browsing-1.44.xpi
|
https://addons.mozilla.org/firefox/downloads/file/4123613/i2p_in_private_browsing-1.48.xpi
|
||||||
noscript
|
noscript
|
||||||
11.4.16
|
11.4.29
|
||||||
https://addons.mozilla.org/firefox/downloads/file/4067473/noscript-11.4.16.xpi
|
https://addons.mozilla.org/firefox/downloads/file/4206186/noscript-11.4.29.xpi
|
||||||
localcdn-fork-of-decentraleyes
|
localcdn-fork-of-decentraleyes
|
||||||
2.6.46
|
2.6.64
|
||||||
https://addons.mozilla.org/firefox/downloads/file/4066709/localcdn_fork_of_decentraleyes-2.6.46.xpi
|
https://addons.mozilla.org/firefox/downloads/file/4243456/localcdn_fork_of_decentraleyes-2.6.64.xpi
|
||||||
onion-in-container-browsing
|
onion-in-container-browsing
|
||||||
0.82
|
0.82
|
||||||
https://addons.mozilla.org/firefox/downloads/file/3904685/onion_in_container_browsing-0.82.xpi
|
https://addons.mozilla.org/firefox/downloads/file/3904685/onion_in_container_browsing-0.82.xpi
|
||||||
javascript-restrictor
|
javascript-restrictor
|
||||||
0.11.1
|
0.17
|
||||||
https://addons.mozilla.org/firefox/downloads/file/3950710/javascript_restrictor-0.11.1.xpi
|
https://addons.mozilla.org/firefox/downloads/file/4190089/javascript_restrictor-0.17.xpi
|
||||||
ublock-origin
|
ublock-origin
|
||||||
1.46.0
|
1.56.0
|
||||||
https://addons.mozilla.org/firefox/downloads/file/4047353/ublock_origin-1.46.0.xpi
|
https://addons.mozilla.org/firefox/downloads/file/4237670/ublock_origin-1.56.0.xpi
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<h2>
|
<h2>
|
||||||
Chromium
|
Chromium
|
||||||
@ -175,16 +178,16 @@ https://addons.mozilla.org/firefox/downloads/file/4047353/ublock_origin-1.46.0.x
|
|||||||
1.29
|
1.29
|
||||||
https://clients2.google.com/service/update2/crx
|
https://clients2.google.com/service/update2/crx
|
||||||
NoScript
|
NoScript
|
||||||
11.4.16
|
11.4.18
|
||||||
https://clients2.google.com/service/update2/crx
|
https://clients2.google.com/service/update2/crx
|
||||||
LocalCDN
|
LocalCDN
|
||||||
2.6.45
|
2.6.64
|
||||||
https://clients2.google.com/service/update2/crx
|
https://clients2.google.com/service/update2/crx
|
||||||
uBlock Origin
|
uBlock Origin
|
||||||
1.46.0
|
1.56.0
|
||||||
https://clients2.google.com/service/update2/crx
|
https://clients2.google.com/service/update2/crx
|
||||||
JShelter
|
__MSG_extensionName__
|
||||||
0.11.1
|
0.17
|
||||||
https://clients2.google.com/service/update2/crx
|
https://clients2.google.com/service/update2/crx
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<div id="sourcecode">
|
<div id="sourcecode">
|
||||||
@ -1056,12 +1059,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
30
VERSION.md
30
VERSION.md
@ -6,23 +6,23 @@ Extension Versions
|
|||||||
|
|
||||||
```md
|
```md
|
||||||
i2p-in-private-browsing
|
i2p-in-private-browsing
|
||||||
1.44
|
1.48
|
||||||
https://addons.mozilla.org/firefox/downloads/file/4020669/i2p_in_private_browsing-1.44.xpi
|
https://addons.mozilla.org/firefox/downloads/file/4123613/i2p_in_private_browsing-1.48.xpi
|
||||||
noscript
|
noscript
|
||||||
11.4.16
|
11.4.29
|
||||||
https://addons.mozilla.org/firefox/downloads/file/4067473/noscript-11.4.16.xpi
|
https://addons.mozilla.org/firefox/downloads/file/4206186/noscript-11.4.29.xpi
|
||||||
localcdn-fork-of-decentraleyes
|
localcdn-fork-of-decentraleyes
|
||||||
2.6.46
|
2.6.64
|
||||||
https://addons.mozilla.org/firefox/downloads/file/4066709/localcdn_fork_of_decentraleyes-2.6.46.xpi
|
https://addons.mozilla.org/firefox/downloads/file/4243456/localcdn_fork_of_decentraleyes-2.6.64.xpi
|
||||||
onion-in-container-browsing
|
onion-in-container-browsing
|
||||||
0.82
|
0.82
|
||||||
https://addons.mozilla.org/firefox/downloads/file/3904685/onion_in_container_browsing-0.82.xpi
|
https://addons.mozilla.org/firefox/downloads/file/3904685/onion_in_container_browsing-0.82.xpi
|
||||||
javascript-restrictor
|
javascript-restrictor
|
||||||
0.11.1
|
0.17
|
||||||
https://addons.mozilla.org/firefox/downloads/file/3950710/javascript_restrictor-0.11.1.xpi
|
https://addons.mozilla.org/firefox/downloads/file/4190089/javascript_restrictor-0.17.xpi
|
||||||
ublock-origin
|
ublock-origin
|
||||||
1.46.0
|
1.56.0
|
||||||
https://addons.mozilla.org/firefox/downloads/file/4047353/ublock_origin-1.46.0.xpi
|
https://addons.mozilla.org/firefox/downloads/file/4237670/ublock_origin-1.56.0.xpi
|
||||||
```
|
```
|
||||||
|
|
||||||
## Chromium
|
## Chromium
|
||||||
@ -32,15 +32,15 @@ __MSG_extensionName__
|
|||||||
1.29
|
1.29
|
||||||
https://clients2.google.com/service/update2/crx
|
https://clients2.google.com/service/update2/crx
|
||||||
NoScript
|
NoScript
|
||||||
11.4.16
|
11.4.18
|
||||||
https://clients2.google.com/service/update2/crx
|
https://clients2.google.com/service/update2/crx
|
||||||
LocalCDN
|
LocalCDN
|
||||||
2.6.45
|
2.6.64
|
||||||
https://clients2.google.com/service/update2/crx
|
https://clients2.google.com/service/update2/crx
|
||||||
uBlock Origin
|
uBlock Origin
|
||||||
1.46.0
|
1.56.0
|
||||||
https://clients2.google.com/service/update2/crx
|
https://clients2.google.com/service/update2/crx
|
||||||
JShelter
|
__MSG_extensionName__
|
||||||
0.11.1
|
0.17
|
||||||
https://clients2.google.com/service/update2/crx
|
https://clients2.google.com/service/update2/crx
|
||||||
```
|
```
|
||||||
|
299
build.xml
299
build.xml
@ -175,6 +175,7 @@ Linux(because the top command will be run and the script will exit).\n\nBoth det
|
|||||||
|
|
||||||
<target name="jar" depends="versionMd,i2pFirefoxBaseProfileZip,i2pFirefoxUsabilityProfileZip,i2pChromiumBaseProfileZip,i2pChromiumUsabilityProfileZip">
|
<target name="jar" depends="versionMd,i2pFirefoxBaseProfileZip,i2pFirefoxUsabilityProfileZip,i2pChromiumBaseProfileZip,i2pChromiumUsabilityProfileZip">
|
||||||
<ant dir="src" target="jar" />
|
<ant dir="src" target="jar" />
|
||||||
|
<ant dir="src" target="pluginjar" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="i2pFirefoxBaseProfileZip">
|
<target name="i2pFirefoxBaseProfileZip">
|
||||||
@ -327,7 +328,7 @@ Linux(because the top command will be run and the script will exit).\n\nBoth det
|
|||||||
|
|
||||||
<target name="buildNum">
|
<target name="buildNum">
|
||||||
<buildnumber file="scripts/build.number" />
|
<buildnumber file="scripts/build.number" />
|
||||||
<property name="release.number" value="1.0.9" />
|
<property name="release.number" value="1.3.0" />
|
||||||
<exec executable="echo" osfamily="unix">
|
<exec executable="echo" osfamily="unix">
|
||||||
<arg value="${release.number}-${build.number}" />
|
<arg value="${release.number}-${build.number}" />
|
||||||
</exec>
|
</exec>
|
||||||
@ -339,6 +340,44 @@ Linux(because the top command will be run and the script will exit).\n\nBoth det
|
|||||||
</exec>
|
</exec>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
<target name="pluginzip" depends="all, buildNum">
|
||||||
|
<delete>
|
||||||
|
<!-- in installer but not update -->
|
||||||
|
<fileset dir="plugin/" includes="i2ptunnel.config i2pfirefox.config eepsite/docroot/index.html eepsite/docroot/robots.txt" />
|
||||||
|
</delete>
|
||||||
|
<delete dir="plugin/eepsite/docroot/torrents/" />
|
||||||
|
<!-- get version number -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- make the update xpi2p -->
|
||||||
|
<!-- this contains everything except i2ptunnel.config -->
|
||||||
|
<copy file="LICENSE.md" todir="plugin/" overwrite="true" />
|
||||||
|
<copy file="README.md" todir="plugin/" overwrite="true" />
|
||||||
|
<copy file="CHANGES.md" todir="plugin/" overwrite="true" />
|
||||||
|
<copy file="scripts/plugin.config" todir="plugin/" overwrite="true" />
|
||||||
|
<mkdir dir="plugin/lib/" />
|
||||||
|
<copy file="src/build/i2pfirefox-plugin.jar" todir="plugin/lib/" overwrite="true" />
|
||||||
|
<exec executable="echo" osfamily="unix" failonerror="true" output="plugin/plugin.config" append="true">
|
||||||
|
<arg value="update-only=true" />
|
||||||
|
</exec>
|
||||||
|
<exec executable="echo" osfamily="unix" failonerror="true" output="plugin/plugin.config" append="true">
|
||||||
|
<arg value="version=${release.number}-${build.number}" />
|
||||||
|
</exec>
|
||||||
|
|
||||||
|
<!-- make the install xpi2p -->
|
||||||
|
<copy file="scripts/plugin.config" todir="plugin/" overwrite="true" />
|
||||||
|
<!-- Files in installer but not update. Be sure to Add to delete fileset above and clean target below -->
|
||||||
|
<copy file="scripts/i2ptunnel.config" todir="plugin/" overwrite="true" />
|
||||||
|
<exec executable="echo" osfamily="unix" failonerror="true" output="plugin/plugin.config" append="true">
|
||||||
|
<arg value="version=${release.number}-${build.number}" />
|
||||||
|
</exec>
|
||||||
|
<exec executable="zip">
|
||||||
|
<arg value="-r"/>
|
||||||
|
<arg value="plugin.zip"/>
|
||||||
|
<arg value="plugin"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
<target name="plugin" depends="all, buildNum">
|
<target name="plugin" depends="all, buildNum">
|
||||||
<delete>
|
<delete>
|
||||||
<!-- in installer but not update -->
|
<!-- in installer but not update -->
|
||||||
@ -355,7 +394,7 @@ Linux(because the top command will be run and the script will exit).\n\nBoth det
|
|||||||
<copy file="CHANGES.md" todir="plugin/" overwrite="true" />
|
<copy file="CHANGES.md" todir="plugin/" overwrite="true" />
|
||||||
<copy file="scripts/plugin.config" todir="plugin/" overwrite="true" />
|
<copy file="scripts/plugin.config" todir="plugin/" overwrite="true" />
|
||||||
<mkdir dir="plugin/lib/" />
|
<mkdir dir="plugin/lib/" />
|
||||||
<copy file="src/build/i2pfirefox.jar" todir="plugin/lib/" overwrite="true" />
|
<copy file="src/build/i2pfirefox-plugin.jar" todir="plugin/lib/" overwrite="true" />
|
||||||
<exec executable="echo" osfamily="unix" failonerror="true" output="plugin/plugin.config" append="true">
|
<exec executable="echo" osfamily="unix" failonerror="true" output="plugin/plugin.config" append="true">
|
||||||
<arg value="update-only=true" />
|
<arg value="update-only=true" />
|
||||||
</exec>
|
</exec>
|
||||||
@ -368,12 +407,6 @@ Linux(because the top command will be run and the script will exit).\n\nBoth det
|
|||||||
<equals arg1="${release.password.su3}" arg2=""/>
|
<equals arg1="${release.password.su3}" arg2=""/>
|
||||||
</condition>
|
</condition>
|
||||||
</fail>
|
</fail>
|
||||||
<!-- this will fail if no su3 keys exist, as it needs the password twice -->
|
|
||||||
<exec executable="scripts/makeplugin.sh" inputstring="${release.password.su3}" failonerror="true" >
|
|
||||||
<arg value="plugin" />
|
|
||||||
</exec>
|
|
||||||
<move file="i2pfirefox.xpi2p" tofile="i2pfirefox-update.xpi2p" overwrite="true" />
|
|
||||||
<move file="i2pfirefox.su3" tofile="i2pfirefox-update.su3" overwrite="true" />
|
|
||||||
|
|
||||||
<!-- make the install xpi2p -->
|
<!-- make the install xpi2p -->
|
||||||
<copy file="scripts/plugin.config" todir="plugin/" overwrite="true" />
|
<copy file="scripts/plugin.config" todir="plugin/" overwrite="true" />
|
||||||
@ -382,14 +415,13 @@ Linux(because the top command will be run and the script will exit).\n\nBoth det
|
|||||||
<exec executable="echo" osfamily="unix" failonerror="true" output="plugin/plugin.config" append="true">
|
<exec executable="echo" osfamily="unix" failonerror="true" output="plugin/plugin.config" append="true">
|
||||||
<arg value="version=${release.number}-${build.number}" />
|
<arg value="version=${release.number}-${build.number}" />
|
||||||
</exec>
|
</exec>
|
||||||
|
|
||||||
<exec executable="scripts/makeplugin.sh" inputstring="${release.password.su3}" failonerror="true" >
|
<exec executable="scripts/makeplugin.sh" inputstring="${release.password.su3}" failonerror="true" >
|
||||||
<arg value="plugin" />
|
<arg value="plugin" />
|
||||||
</exec>
|
</exec>
|
||||||
<mkdir dir="i2p.plugins.firefox" />
|
<mkdir dir="i2p.plugins.firefox" />
|
||||||
<copy file="i2pfirefox.su3" todir="i2p.plugins.firefox" overwrite="true" />
|
<copy file="i2pfirefox.su3" todir="i2p.plugins.firefox" overwrite="true" />
|
||||||
<copy file="i2pfirefox-update.su3" todir="i2p.plugins.firefox" overwrite="true" />
|
|
||||||
<copy file="i2pfirefox.xpi2p" todir="i2p.plugins.firefox" overwrite="true" />
|
<copy file="i2pfirefox.xpi2p" todir="i2p.plugins.firefox" overwrite="true" />
|
||||||
<copy file="i2pfirefox-update.xpi2p" todir="i2p.plugins.firefox" overwrite="true" />
|
|
||||||
</target>
|
</target>
|
||||||
<target name="torrent">
|
<target name="torrent">
|
||||||
<delete file="i2p.plugins.firefox.torrent" failonerror="false" />
|
<delete file="i2p.plugins.firefox.torrent" failonerror="false" />
|
||||||
@ -427,7 +459,7 @@ Linux(because the top command will be run and the script will exit).\n\nBoth det
|
|||||||
<exec executable="clang-format">
|
<exec executable="clang-format">
|
||||||
<arg value="-i"/>
|
<arg value="-i"/>
|
||||||
<arg value="src/java/net/i2p/i2pfirefox/I2PBrowser.java"/>
|
<arg value="src/java/net/i2p/i2pfirefox/I2PBrowser.java"/>
|
||||||
<arg value="src/java/net/i2p/i2pfirefox/I2PBrowserPlugin.java"/>
|
<arg value="src/plugin/net/i2p/i2pfirefox/plugin/plugin/I2PBrowserPlugin.java"/>
|
||||||
<arg value="src/java/net/i2p/i2pfirefox/I2PCommonBrowser.java"/>
|
<arg value="src/java/net/i2p/i2pfirefox/I2PCommonBrowser.java"/>
|
||||||
<arg value="src/java/net/i2p/i2pfirefox/I2PChromium.java"/>
|
<arg value="src/java/net/i2p/i2pfirefox/I2PChromium.java"/>
|
||||||
<arg value="src/java/net/i2p/i2pfirefox/I2PChromiumProfileBuilder.java"/>
|
<arg value="src/java/net/i2p/i2pfirefox/I2PChromiumProfileBuilder.java"/>
|
||||||
@ -513,17 +545,248 @@ Linux(because the top command will be run and the script will exit).\n\nBoth det
|
|||||||
</exec>
|
</exec>
|
||||||
</target>
|
</target>
|
||||||
<target name="debian" depends="jar">
|
<target name="debian" depends="jar">
|
||||||
<exec executable="bash" failonerror="true">
|
<exec executable="jpackage" failonerror="true">
|
||||||
<arg value="--verbose"/>
|
<arg value="--type"/> <arg value="deb"/>
|
||||||
<arg value="-c"/>
|
<arg value="--linux-deb-maintainer"/> <arg value="hankhill19580@gmail.com"/>
|
||||||
<arg value="./debian.sh"/>
|
<arg value="--linux-menu-group"/> <arg value="Network;WebBrowser;P2P"/>
|
||||||
|
<arg value="--linux-app-category"/> <arg value="Network"/>
|
||||||
|
<arg value="--linux-package-deps"/> <arg value="firefox|chromium|brave|firefox-esr|librewolf|icecat"/>
|
||||||
|
<arg value="--linux-shortcut"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="1.0.0"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<target name="debian-release" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--type"/> <arg value="deb"/>
|
||||||
|
<arg value="--linux-deb-maintainer"/> <arg value="hankhill19580@gmail.com"/>
|
||||||
|
<arg value="--linux-menu-group"/> <arg value="Network;WebBrowser;P2P"/>
|
||||||
|
<arg value="--linux-app-category"/> <arg value="Network"/>
|
||||||
|
<arg value="--linux-package-deps"/> <arg value="firefox|chromium|brave|firefox-esr|librewolf|icecat"/>
|
||||||
|
<arg value="--linux-shortcut"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="${release.number}"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
</exec>
|
</exec>
|
||||||
</target>
|
</target>
|
||||||
<target name="fedora" depends="jar">
|
<target name="fedora" depends="jar">
|
||||||
<exec executable="bash" failonerror="true">
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--type"/> <arg value="rpm"/>
|
||||||
|
<arg value="--linux-menu-group"/> <arg value="Network;WebBrowser;P2P"/>
|
||||||
|
<arg value="--linux-app-category"/> <arg value="Network"/>
|
||||||
|
<arg value="--linux-package-deps"/> <arg value="firefox|chromium|brave|firefox-esr|librewolf|icecat"/>
|
||||||
|
<arg value="--linux-shortcut"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="1.0.0"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<target name="fedora-release" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--type"/> <arg value="rpm"/>
|
||||||
|
<arg value="--linux-menu-group"/> <arg value="Network;WebBrowser;P2P"/>
|
||||||
|
<arg value="--linux-app-category"/> <arg value="Network"/>
|
||||||
|
<arg value="--linux-package-deps"/> <arg value="firefox|chromium|brave|firefox-esr|librewolf|icecat"/>
|
||||||
|
<arg value="--linux-shortcut"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="${release.number}"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<target name="windows" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
<arg value="--verbose"/>
|
<arg value="--verbose"/>
|
||||||
<arg value="-c"/>
|
<arg value="--type"/> <arg value="exe"/>
|
||||||
<arg value="./fedora.sh"/>
|
<arg value="--win-dir-chooser"/>
|
||||||
|
<arg value="--win-help-url"/> <arg value="https://geti2p.net"/>
|
||||||
|
<arg value="--win-menu"/>
|
||||||
|
<arg value="--win-menu-group"/> <arg value="I2P Browser Configurer"/>
|
||||||
|
<arg value="--win-shortcut"/>
|
||||||
|
<arg value="--win-shortcut-prompt"/>
|
||||||
|
<arg value="--win-per-user-install"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="1.0.0"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<target name="windows-release" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--verbose"/>
|
||||||
|
<arg value="--type"/> <arg value="exe"/>
|
||||||
|
<arg value="--win-dir-chooser"/>
|
||||||
|
<arg value="--win-help-url"/> <arg value="https://geti2p.net"/>
|
||||||
|
<arg value="--win-menu"/>
|
||||||
|
<arg value="--win-menu-group"/> <arg value="I2P Browser Configurer"/>
|
||||||
|
<arg value="--win-shortcut"/>
|
||||||
|
<arg value="--win-shortcut-prompt"/>
|
||||||
|
<arg value="--win-per-user-install"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="${release.number}"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<target name="windows-msi" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--verbose"/>
|
||||||
|
<arg value="--type"/> <arg value="msi"/>
|
||||||
|
<arg value="--win-dir-chooser"/>
|
||||||
|
<arg value="--win-help-url"/> <arg value="https://geti2p.net"/>
|
||||||
|
<arg value="--win-menu"/>
|
||||||
|
<arg value="--win-menu-group"/> <arg value="I2P Browser Configurer"/>
|
||||||
|
<arg value="--win-shortcut"/>
|
||||||
|
<arg value="--win-shortcut-prompt"/>
|
||||||
|
<arg value="--win-per-user-install"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="1.0.0"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<target name="windows-msi-release" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--verbose"/>
|
||||||
|
<arg value="--type"/> <arg value="msi"/>
|
||||||
|
<arg value="--win-dir-chooser"/>
|
||||||
|
<arg value="--win-help-url"/> <arg value="https://geti2p.net"/>
|
||||||
|
<arg value="--win-menu"/>
|
||||||
|
<arg value="--win-menu-group"/> <arg value="I2P Browser Configurer"/>
|
||||||
|
<arg value="--win-shortcut"/>
|
||||||
|
<arg value="--win-shortcut-prompt"/>
|
||||||
|
<arg value="--win-per-user-install"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="${release.number}"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<target name="windows-portable" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--verbose"/>
|
||||||
|
<arg value="--type"/> <arg value="app-image"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser-portable"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="1.0.0"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
<copy file="LICENSE.md" todir="i2pbrowser-portable" overwrite="true"/>
|
||||||
|
<delete file="i2pbrowser-portable.zip"/>
|
||||||
|
<exec executable="powershell" failonerror="false">
|
||||||
|
<arg value="Compress-Archive"/>
|
||||||
|
<arg value="-LiteralPath"/> <arg value="i2pbrowser-portable"/>
|
||||||
|
<arg value="-DestinationPath"/> <arg value="i2pbrowser-portable.zip"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<target name="windows-portable-release" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--verbose"/>
|
||||||
|
<arg value="--type"/> <arg value="app-image"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser-portable"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="${release.number}"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
<copy file="LICENSE.md" todir="i2pbrowser-portable" overwrite="true"/>
|
||||||
|
<delete file="i2pbrowser-portable.zip"/>
|
||||||
|
<exec executable="powershell" failonerror="false">
|
||||||
|
<arg value="Compress-Archive"/>
|
||||||
|
<arg value="-LiteralPath"/> <arg value="i2pbrowser-portable"/>
|
||||||
|
<arg value="-DestinationPath"/> <arg value="i2pbrowser-portable-${release.number}.zip"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="macos" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--verbose"/>
|
||||||
|
<arg value="--type"/> <arg value="dmg"/>
|
||||||
|
<arg value="--mac-package-name"/> <arg value="I2P Browser"/>
|
||||||
|
<arg value="--mac-app-category"/> <arg value="Reference"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="1.0.0"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<target name="macos-release" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--verbose"/>
|
||||||
|
<arg value="--type"/> <arg value="dmg"/>
|
||||||
|
<arg value="--mac-package-name"/> <arg value="I2P Browser"/>
|
||||||
|
<arg value="--mac-app-category"/> <arg value="Reference"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="${release.number}"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<target name="macos-pkg" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--verbose"/>
|
||||||
|
<arg value="--type"/> <arg value="pkg"/>
|
||||||
|
<arg value="--mac-package-name"/> <arg value="I2P Browser"/>
|
||||||
|
<arg value="--mac-app-category"/> <arg value="Reference"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="1.0.0"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
<target name="macos-pkg-release" depends="jar">
|
||||||
|
<exec executable="jpackage" failonerror="true">
|
||||||
|
<arg value="--verbose"/>
|
||||||
|
<arg value="--type"/> <arg value="pkg"/>
|
||||||
|
<arg value="--mac-package-name"/> <arg value="I2P Browser"/>
|
||||||
|
<arg value="--mac-app-category"/> <arg value="Reference"/>
|
||||||
|
<arg value="--license-file"/> <arg value="LICENSE.md"/>
|
||||||
|
<arg value="--name"/> <arg value="i2pbrowser"/>
|
||||||
|
<arg value="--icon"/> <arg value="src/icon.png"/>
|
||||||
|
<arg value="--app-version"/> <arg value="${release.number}"/>
|
||||||
|
<arg value="--input"/> <arg value="src/build"/>
|
||||||
|
<arg value="--main-jar"/> <arg value="i2pfirefox.jar"/>
|
||||||
|
<arg value="--main-class"/> <arg value="net.i2p.i2pfirefox.I2PBrowser"/>
|
||||||
</exec>
|
</exec>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#! /usr/bin/env sh
|
#! /usr/bin/env sh
|
||||||
export GITHUB_USER=eyedeekay
|
export GITHUB_USER=eyedeekay
|
||||||
export GITHUB_REPO=i2p.plugins.firefox
|
export GITHUB_REPO=i2p.plugins.firefox
|
||||||
export GITHUB_NAME="Fixes release builds for Windows"
|
export GITHUB_NAME="Updates extensions, plugin support temporarily removed(Stay on the old version)"
|
||||||
export GITHUB_DESCRIPTION=$(cat CHANGES.md VERSION.md)
|
export GITHUB_DESCRIPTION=$(cat CHANGES.md VERSION.md)
|
||||||
export GITHUB_TAG=1.0.9
|
export GITHUB_TAG=1.4.0
|
24
darklight.css
Normal file
24
darklight.css
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/* edgar darklight CSS file */
|
||||||
|
#checkboxDarkLight:checked + .container {
|
||||||
|
background-color: #202020;
|
||||||
|
filter: invert(100%);
|
||||||
|
}
|
||||||
|
#checkboxDarkLight{
|
||||||
|
appearance: none;
|
||||||
|
width: 80px;
|
||||||
|
height: 40px;
|
||||||
|
background: black;
|
||||||
|
border-radius: 22px;
|
||||||
|
cursor: pointer;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
#checkboxDarkLight::before{
|
||||||
|
content: '';
|
||||||
|
width: 40px;
|
||||||
|
height: 35px;
|
||||||
|
background-color:white;
|
||||||
|
border-radius: 35px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: .3s linear;
|
||||||
|
}
|
||||||
|
|
17
debian.sh
17
debian.sh
@ -1,17 +0,0 @@
|
|||||||
#! /usr/bin/env sh
|
|
||||||
|
|
||||||
. ./config.sh
|
|
||||||
jpackage --verbose \
|
|
||||||
--type deb \
|
|
||||||
--linux-deb-maintainer hankhill19580@gmail.com \
|
|
||||||
--linux-menu-group "Network;WebBrowser;P2P" \
|
|
||||||
--linux-app-category "Network" \
|
|
||||||
--linux-package-deps "firefox|chromium|brave|firefox-esr|librewolf|icecat" \
|
|
||||||
--linux-shortcut \
|
|
||||||
--license-file LICENSE.md \
|
|
||||||
--name i2pbrowser \
|
|
||||||
--icon src/icon.png \
|
|
||||||
--app-version "$GITHUB_TAG" \
|
|
||||||
--input src/build \
|
|
||||||
--main-jar i2pfirefox.jar \
|
|
||||||
--main-class net.i2p.i2pfirefox.I2PBrowser
|
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1390,12 +1403,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -2039,12 +2052,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1889,12 +1902,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1223,12 +1236,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1196,12 +1209,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1114,12 +1127,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1808,12 +1821,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1980,12 +1993,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1321,12 +1334,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1328,12 +1341,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1118,12 +1131,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1517,12 +1530,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -153,7 +166,7 @@
|
|||||||
</code>
|
</code>
|
||||||
</h4>
|
</h4>
|
||||||
<pre><code class="language-sh">mkdir ~/tmp-i2pbrowser && cd ~/tmp-i2pbrowser
|
<pre><code class="language-sh">mkdir ~/tmp-i2pbrowser && cd ~/tmp-i2pbrowser
|
||||||
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.0.9/i2pbrowser.tar.gz
|
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.3.0/i2pbrowser.tar.gz
|
||||||
tar xvzf i2pbrowser.tar.gz && cd i2pbrowser
|
tar xvzf i2pbrowser.tar.gz && cd i2pbrowser
|
||||||
## THIS STEP IS OPTIONAL but it will force the system to use Tor Browser from within the i2pbrowser directory.
|
## THIS STEP IS OPTIONAL but it will force the system to use Tor Browser from within the i2pbrowser directory.
|
||||||
# This probably offers better security than vanilla Firefox.
|
# This probably offers better security than vanilla Firefox.
|
||||||
@ -1104,12 +1117,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -7,7 +7,7 @@ Linux. These packages are for the **`amd64`** architecture.
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
mkdir ~/tmp-i2pbrowser && cd ~/tmp-i2pbrowser
|
mkdir ~/tmp-i2pbrowser && cd ~/tmp-i2pbrowser
|
||||||
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.0.9/i2pbrowser.tar.gz
|
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.3.0/i2pbrowser.tar.gz
|
||||||
tar xvzf i2pbrowser.tar.gz && cd i2pbrowser
|
tar xvzf i2pbrowser.tar.gz && cd i2pbrowser
|
||||||
## THIS STEP IS OPTIONAL but it will force the system to use Tor Browser from within the i2pbrowser directory.
|
## THIS STEP IS OPTIONAL but it will force the system to use Tor Browser from within the i2pbrowser directory.
|
||||||
# This probably offers better security than vanilla Firefox.
|
# This probably offers better security than vanilla Firefox.
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -146,7 +159,7 @@
|
|||||||
file with any Java greater than Java 8.
|
file with any Java greater than Java 8.
|
||||||
</p>
|
</p>
|
||||||
<pre><code class="language-sh">mkdir ~/tmp-i2pfirefox && cd ~/tmp-i2pfirefox
|
<pre><code class="language-sh">mkdir ~/tmp-i2pfirefox && cd ~/tmp-i2pfirefox
|
||||||
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.0.9/i2pfirefox.zip
|
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.3.0/i2pfirefox.zip
|
||||||
unzip i2pfirefox.zip
|
unzip i2pfirefox.zip
|
||||||
./cmd/i2pfirefox.cmd
|
./cmd/i2pfirefox.cmd
|
||||||
|
|
||||||
@ -1053,12 +1066,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -7,7 +7,7 @@ packages. You can use the `.jar` file with any Java greater than Java 8.
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
mkdir ~/tmp-i2pfirefox && cd ~/tmp-i2pfirefox
|
mkdir ~/tmp-i2pfirefox && cd ~/tmp-i2pfirefox
|
||||||
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.0.9/i2pfirefox.zip
|
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.3.0/i2pfirefox.zip
|
||||||
unzip i2pfirefox.zip
|
unzip i2pfirefox.zip
|
||||||
./cmd/i2pfirefox.cmd
|
./cmd/i2pfirefox.cmd
|
||||||
|
|
||||||
|
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -23,19 +26,29 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="CHANGES.html">
|
||||||
|
CHANGES
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="LICENSE.html">
|
||||||
|
LICENSE
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="VERSION.html">
|
||||||
|
VERSION
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href=""></a>
|
<a href="index.html">
|
||||||
|
index.html
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="BUILD.html">
|
<a href="BUILD.html">
|
||||||
@ -49,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PBrowserPlugin.html">
|
<a href="I2PBrowserPlugin.html">
|
||||||
I2PBrowserPlugin
|
I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -104,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="I2PLibreWolf.html">
|
<a href="I2PLibreWolf.html">
|
||||||
I2PLibreWolf
|
I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -1126,12 +1139,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
24
docs/darklight.css
Normal file
24
docs/darklight.css
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/* edgar darklight CSS file */
|
||||||
|
#checkboxDarkLight:checked + .container {
|
||||||
|
background-color: #202020;
|
||||||
|
filter: invert(100%);
|
||||||
|
}
|
||||||
|
#checkboxDarkLight{
|
||||||
|
appearance: none;
|
||||||
|
width: 80px;
|
||||||
|
height: 40px;
|
||||||
|
background: black;
|
||||||
|
border-radius: 22px;
|
||||||
|
cursor: pointer;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
#checkboxDarkLight::before{
|
||||||
|
content: '';
|
||||||
|
width: 40px;
|
||||||
|
height: 35px;
|
||||||
|
background-color:white;
|
||||||
|
border-radius: 35px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: .3s linear;
|
||||||
|
}
|
||||||
|
|
BIN
docs/i2plogo.png
Normal file
BIN
docs/i2plogo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
@ -75,8 +75,6 @@ iframe {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
width: 36vw;
|
|
||||||
height: 64vh;
|
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
Binary file not shown.
12
index.html
12
index.html
@ -8,8 +8,11 @@
|
|||||||
<meta name="keywords" content="main" />
|
<meta name="keywords" content="main" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="darklight.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<input type="checkbox" id="checkboxDarkLight">
|
||||||
|
<div class="container">
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<a href="#shownav">
|
<a href="#shownav">
|
||||||
Show navigation
|
Show navigation
|
||||||
@ -59,7 +62,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="docs/I2PBrowserPlugin.html">
|
<a href="docs/I2PBrowserPlugin.html">
|
||||||
docs/I2PBrowserPlugin
|
docs/I2PBrowserPlugin.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -114,7 +117,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="docs/I2PLibreWolf.html">
|
<a href="docs/I2PLibreWolf.html">
|
||||||
docs/I2PLibreWolf
|
docs/I2PLibreWolf.html
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -302,7 +305,7 @@
|
|||||||
and a non-bundled Java
|
and a non-bundled Java
|
||||||
</h4>
|
</h4>
|
||||||
<pre><code class="language-sh">mkdir ~/tmp-i2pfirefox && cd ~/tmp-i2pfirefox
|
<pre><code class="language-sh">mkdir ~/tmp-i2pfirefox && cd ~/tmp-i2pfirefox
|
||||||
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.0.9/i2pfirefox.zip
|
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.3.0/i2pfirefox.zip
|
||||||
unzip i2pfirefox.zip
|
unzip i2pfirefox.zip
|
||||||
./i2pfirefox.cmd
|
./i2pfirefox.cmd
|
||||||
|
|
||||||
@ -1179,12 +1182,13 @@ Public License instead of this License.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://geti2p.net/">
|
<a href="https://geti2p.net/">
|
||||||
<img src="i2plogo.png"></img>
|
<img class="i2plogo" src="i2plogo.png"></img>
|
||||||
I2P
|
I2P
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
11
osx-dmg.sh
11
osx-dmg.sh
@ -1,5 +1,13 @@
|
|||||||
#! /usr/bin/env sh
|
#! /usr/bin/env sh
|
||||||
. ./config.sh
|
. ./config.sh
|
||||||
|
|
||||||
|
if [ -z "$I2P_SIGNER_USERPHRASE" ]; then
|
||||||
|
I2P_SIGNER_USERPHRASE=$(security find-identity -v -p codesigning | cut -d ' ' -f 4)
|
||||||
|
echo "Warning: using automatically configured signer ID, make sure this is the one you want: $I2P_SIGNER_USERPHRASE"
|
||||||
|
echo "continuing in 10 seconds"
|
||||||
|
sleep 10
|
||||||
|
fi
|
||||||
|
|
||||||
jpackage \
|
jpackage \
|
||||||
--verbose \
|
--verbose \
|
||||||
--type dmg \
|
--type dmg \
|
||||||
@ -8,4 +16,7 @@ jpackage \
|
|||||||
--icon src/icon.icns \
|
--icon src/icon.icns \
|
||||||
--input src/build \
|
--input src/build \
|
||||||
--main-jar i2pfirefox.jar \
|
--main-jar i2pfirefox.jar \
|
||||||
|
--mac-sign \
|
||||||
|
--mac-signing-key-user-name "$I2P_SIGNER_USERPHRASE" \
|
||||||
|
--mac-entitlements resources/entitlements.xml \
|
||||||
--main-class net.i2p.i2pfirefox.I2PBrowser
|
--main-class net.i2p.i2pfirefox.I2PBrowser
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
clientApp.0.main=net.i2p.i2pfirefox.I2PBrowserPlugin
|
clientApp.0.main=net.i2p.i2pfirefox.plugin.I2PBrowserPlugin
|
||||||
clientApp.0.name=I2PBrowserPlugin
|
clientApp.0.name=i2pfirefox
|
||||||
clientApp.0.delay=0
|
clientApp.0.delay=0
|
||||||
clientApp.0.startOnLoad=true
|
clientApp.0.startOnLoad=true
|
||||||
# we also use i2p.jar and i2ptunnel.jar, they are in the standard router classpath
|
clientApp.0.classpath=$PLUGIN/lib/i2pfirefox-plugin.jar
|
||||||
clientApp.0.classpath=$PLUGIN/lib/i2pfirefox.jar,$I2P/lib/i2psnark.jar
|
|
@ -12,4 +12,4 @@ READMELINE=`grep 'i2p.plugins.firefox/releases/download' docs/OSX.md | grep i2pf
|
|||||||
sed -i "s|${READMELINE}|wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/${GITHUB_TAG}/i2pfirefox.zip|g" docs/OSX.md
|
sed -i "s|${READMELINE}|wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/${GITHUB_TAG}/i2pfirefox.zip|g" docs/OSX.md
|
||||||
sed -i "s|${NUMLINE}| <property name=\"release.number\" value=\"$GITHUB_TAG\" />|g" build.xml
|
sed -i "s|${NUMLINE}| <property name=\"release.number\" value=\"$GITHUB_TAG\" />|g" build.xml
|
||||||
edgar && git push --all
|
edgar && git push --all
|
||||||
ant distclean versionMd jar plugin torrent freeZip jpackage debian fedora tarball
|
ant distclean versionMd jar plugin torrent freeZip jpackage debian tarball
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#! /usr/bin/env sh
|
#! /usr/bin/env sh
|
||||||
|
|
||||||
. ./config.sh
|
. ./config.sh
|
||||||
./preprelease.sh
|
#./preprelease.sh
|
||||||
github-release release --user "${GITHUB_USER}" \
|
github-release release --user "${GITHUB_USER}" \
|
||||||
--repo "${GITHUB_REPO}" \
|
--repo "${GITHUB_REPO}" \
|
||||||
--name "${GITHUB_NAME}" \
|
--name "${GITHUB_NAME}" \
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
#Build Number for ANT. Do not edit!
|
#Build Number for ANT. Do not edit!
|
||||||
#Sun Feb 12 20:31:18 UTC 2023
|
#Thu Mar 07 15:18:16 EST 2024
|
||||||
build.number=486
|
build.number=709
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
<pathelement location="${i2plib}/i2ptunnel.jar" />
|
<pathelement location="${i2plib}/i2ptunnel.jar" />
|
||||||
<pathelement location="${i2plib}/i2psnark.jar" />
|
<pathelement location="${i2plib}/i2psnark.jar" />
|
||||||
<pathelement location="${i2plib}/mstreaming.jar" />
|
<pathelement location="${i2plib}/mstreaming.jar" />
|
||||||
|
<pathelement location="${i2plib}/desktopgui.jar" />
|
||||||
<pathelement location="${ant.home}/lib/ant.jar"/>
|
<pathelement location="${ant.home}/lib/ant.jar"/>
|
||||||
<pathelement location="${jettylib}/org.mortbay.jetty.jar"/>
|
<pathelement location="${jettylib}/org.mortbay.jetty.jar"/>
|
||||||
<pathelement location="${jettylib}/jasper-runtime.jar" />
|
<pathelement location="${jettylib}/jasper-runtime.jar" />
|
||||||
@ -40,11 +41,31 @@
|
|||||||
debug="true" deprecation="on" source="${javac.version}" target="${javac.version}"
|
debug="true" deprecation="on" source="${javac.version}" target="${javac.version}"
|
||||||
destdir="./build/obj"
|
destdir="./build/obj"
|
||||||
includeAntRuntime="false"
|
includeAntRuntime="false"
|
||||||
classpath="${i2plib}/i2p.jar:${i2plib}/i2ptunnel.jar:${i2plib}/i2psnark.jar:${i2plib}/mstreaming.jar:${i2plib}/systray.jar:${jettylib}/org.mortbay.jetty.jar:${jettylib}/jetty-util.jar:${jettylib}/jetty-xml.jar" >
|
classpath="${i2plib}/i2p.jar:${i2plib}/i2ptunnel.jar:${i2plib}/i2psnark.jar:${i2plib}/mstreaming.jar:${i2plib}/systray.jar:${i2plib}/desktopgui.jar:${jettylib}/org.mortbay.jetty.jar:${jettylib}/jetty-util.jar:${jettylib}/jetty-xml.jar" >
|
||||||
<compilerarg line="${javac.compilerargs}" />
|
<compilerarg line="${javac.compilerargs}" />
|
||||||
</javac>
|
</javac>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
<target name="pluginjar" depends="jar">
|
||||||
|
<mkdir dir="./build" />
|
||||||
|
<mkdir dir="./build/obj" />
|
||||||
|
<javac
|
||||||
|
srcdir="./plugin"
|
||||||
|
debug="true" deprecation="on" source="${javac.version}" target="${javac.version}"
|
||||||
|
destdir="./build/obj"
|
||||||
|
includeAntRuntime="false"
|
||||||
|
classpath="${i2plib}/i2p.jar:${i2plib}/i2ptunnel.jar:${i2plib}/i2psnark.jar:${i2plib}/mstreaming.jar:${i2plib}/systray.jar:${i2plib}/desktopgui.jar:${jettylib}/org.mortbay.jetty.jar:${jettylib}/jetty-util.jar:${jettylib}/jetty-xml.jar:./build/i2pfirefox.jar" >
|
||||||
|
<compilerarg line="${javac.compilerargs}" />
|
||||||
|
</javac>
|
||||||
|
<jar destfile="build/i2pfirefox-plugin.jar" basedir="./build/obj" includes="**/*.class" >
|
||||||
|
<fileset file="i2p.firefox.base.profile.zip" />
|
||||||
|
<fileset file="i2p.firefox.usability.profile.zip" />
|
||||||
|
<fileset file="i2p.chromium.base.profile.zip" />
|
||||||
|
<fileset file="i2p.chromium.usability.profile.zip" />
|
||||||
|
<fileset file="icon.png" />
|
||||||
|
</jar>
|
||||||
|
</target>
|
||||||
|
|
||||||
<target name="jar" depends="builddep, compile">
|
<target name="jar" depends="builddep, compile">
|
||||||
<jar destfile="build/i2pfirefox.jar" basedir="./build/obj" includes="**/*.class" >
|
<jar destfile="build/i2pfirefox.jar" basedir="./build/obj" includes="**/*.class" >
|
||||||
<fileset file="i2p.firefox.base.profile.zip" />
|
<fileset file="i2p.firefox.base.profile.zip" />
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package net.i2p.i2pfirefox;
|
package net.i2p.i2pfirefox;
|
||||||
|
|
||||||
import java.awt.AWTException;
|
/*import java.awt.AWTException;
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
import java.awt.Menu;
|
import java.awt.Menu;
|
||||||
@ -13,7 +13,7 @@ import java.awt.event.ActionEvent;
|
|||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.awt.event.MouseListener;
|
import java.awt.event.MouseListener;*/
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
@ -46,26 +46,6 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
|
|||||||
private final I2PChromium i2pChromium = new I2PChromium();
|
private final I2PChromium i2pChromium = new I2PChromium();
|
||||||
private final I2PGenericUnsafeBrowser i2pGeneral =
|
private final I2PGenericUnsafeBrowser i2pGeneral =
|
||||||
new I2PGenericUnsafeBrowser();
|
new I2PGenericUnsafeBrowser();
|
||||||
private final Toolkit toolkit = Toolkit.getDefaultToolkit();
|
|
||||||
private final SystemTray tray = initTray();
|
|
||||||
private final Image image = toolkit.getImage("icon.png");
|
|
||||||
private final TrayIcon icon = initIcon();
|
|
||||||
private final PopupMenu menu = initMenu();
|
|
||||||
|
|
||||||
private final Menu submenuStrict = new Menu("Strict Mode");
|
|
||||||
private final MenuItem launchRegularBrowserStrict =
|
|
||||||
new MenuItem("Launch I2P Browser");
|
|
||||||
private final MenuItem launchPrivateBrowserStrict =
|
|
||||||
new MenuItem("Launch I2P Browser - Throwaway Session");
|
|
||||||
private final Menu submenuUsability = new Menu("Usability Mode");
|
|
||||||
private final MenuItem launchRegularBrowserUsability =
|
|
||||||
new MenuItem("Launch I2P Browser");
|
|
||||||
private final MenuItem launchPrivateBrowserUsability =
|
|
||||||
new MenuItem("Launch I2P Browser - Throwaway Session");
|
|
||||||
private final MenuItem launchConfigBrowserUsability =
|
|
||||||
new MenuItem("Launch I2P Console");
|
|
||||||
private final MenuItem closeItem = new MenuItem("Close");
|
|
||||||
|
|
||||||
public boolean firefox = false;
|
public boolean firefox = false;
|
||||||
public boolean chromium = false;
|
public boolean chromium = false;
|
||||||
public boolean generic = false;
|
public boolean generic = false;
|
||||||
@ -73,29 +53,37 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
|
|||||||
public boolean usability = false;
|
public boolean usability = false;
|
||||||
public int privateBrowsing = 0;
|
public int privateBrowsing = 0;
|
||||||
private boolean outputConfig = false;
|
private boolean outputConfig = false;
|
||||||
private boolean useSystray = true;
|
|
||||||
|
|
||||||
private void launchFirefox(int privateWindow, String[] url) {
|
public void launchFirefox(int privateWindow, String[] url) {
|
||||||
logger.info("I2PFirefox" + privateWindow);
|
String priv = privateWindow == 1 ? "private-window" : "long-profile";
|
||||||
|
logger.info("I2PFirefox" + priv);
|
||||||
i2pFirefox.usability = usability;
|
i2pFirefox.usability = usability;
|
||||||
|
if (url == null)
|
||||||
|
url = new String[] {"about:blank"};
|
||||||
if (outputConfig)
|
if (outputConfig)
|
||||||
i2pFirefox.storeFirefoxDefaults();
|
i2pFirefox.storeFirefoxDefaults();
|
||||||
i2pFirefox.launch(privateWindow, url);
|
i2pFirefox.launch(privateWindow, url);
|
||||||
}
|
}
|
||||||
private void launchChromium(int privateWindow, String[] url) {
|
public void launchChromium(int privateWindow, String[] url) {
|
||||||
logger.info("I2PChromium" + privateWindow);
|
String priv = privateWindow == 1 ? "private-window" : "long-profile";
|
||||||
|
logger.info("I2PChromium" + priv);
|
||||||
i2pChromium.usability = usability;
|
i2pChromium.usability = usability;
|
||||||
|
if (url == null)
|
||||||
|
url = new String[] {"about:blank"};
|
||||||
if (outputConfig)
|
if (outputConfig)
|
||||||
i2pChromium.storeChromiumDefaults();
|
i2pChromium.storeChromiumDefaults();
|
||||||
i2pChromium.launch(privateWindow, url);
|
i2pChromium.launch(privateWindow, url);
|
||||||
}
|
}
|
||||||
private void launchGeneric(int privateWindowInt, String[] url) {
|
private void launchGeneric(int privateWindowInt, String[] url) {
|
||||||
|
String priv = privateWindowInt == 1 ? "private-window" : "long-profile";
|
||||||
boolean privateWindow = false;
|
boolean privateWindow = false;
|
||||||
|
if (url == null)
|
||||||
|
url = new String[] {"about:blank"};
|
||||||
if (privateWindowInt == 1)
|
if (privateWindowInt == 1)
|
||||||
privateWindow = true;
|
privateWindow = true;
|
||||||
if (outputConfig)
|
if (outputConfig)
|
||||||
i2pGeneral.storeGenericDefaults();
|
i2pGeneral.storeGenericDefaults();
|
||||||
logger.info("I2PGeneric" + privateWindowInt);
|
logger.info("I2PGeneric" + priv);
|
||||||
i2pGeneral.launch(privateWindow, url);
|
i2pGeneral.launch(privateWindow, url);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,7 +93,7 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
|
|||||||
*
|
*
|
||||||
* @since 0.0.16
|
* @since 0.0.16
|
||||||
*/
|
*/
|
||||||
public I2PBrowser() { initIconFile(); }
|
public I2PBrowser() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct an I2PBrowser class which automatically determines which browser
|
* Construct an I2PBrowser class which automatically determines which browser
|
||||||
@ -113,10 +101,7 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
|
|||||||
*
|
*
|
||||||
* @since 0.0.18
|
* @since 0.0.18
|
||||||
*/
|
*/
|
||||||
public I2PBrowser(String browserPath) {
|
public I2PBrowser(String browserPath) { this.BROWSER = browserPath; }
|
||||||
this.BROWSER = browserPath;
|
|
||||||
initIconFile();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBrowser(String browserPath) { this.BROWSER = browserPath; }
|
public void setBrowser(String browserPath) { this.BROWSER = browserPath; }
|
||||||
|
|
||||||
@ -164,21 +149,6 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
|
|||||||
* @since 0.0.17
|
* @since 0.0.17
|
||||||
*/
|
*/
|
||||||
public void launch(int privateWindow, String[] url) {
|
public void launch(int privateWindow, String[] url) {
|
||||||
validateUserDir();
|
|
||||||
if (generic) {
|
|
||||||
this.launchGeneric(privateWindow, url);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ((chromium && firefox) || (!chromium && !firefox)) {
|
|
||||||
if (this.hasFirefox()) {
|
|
||||||
this.launchFirefox(privateWindow, url);
|
|
||||||
} else if (this.hasChromium()) {
|
|
||||||
this.launchChromium(privateWindow, url);
|
|
||||||
} else {
|
|
||||||
this.launchGeneric(privateWindow, url);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (chromiumFirst) {
|
if (chromiumFirst) {
|
||||||
if (chromium) {
|
if (chromium) {
|
||||||
this.launchChromium(privateWindow, url);
|
this.launchChromium(privateWindow, url);
|
||||||
@ -224,6 +194,32 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
|
|||||||
*/
|
*/
|
||||||
public void launch() { launch(false); }
|
public void launch() { launch(false); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop all running processes managed by the browser manager.
|
||||||
|
*
|
||||||
|
* @return true if successful, false if not
|
||||||
|
*/
|
||||||
|
public boolean stop() {
|
||||||
|
boolean r = true;
|
||||||
|
if (i2pFirefox != null)
|
||||||
|
r = i2pFirefox.stop();
|
||||||
|
if (i2pChromium != null)
|
||||||
|
r = i2pChromium.stop();
|
||||||
|
if (i2pGeneral != null)
|
||||||
|
r = i2pGeneral.stop();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean running() {
|
||||||
|
if (i2pFirefox != null)
|
||||||
|
return i2pFirefox.running();
|
||||||
|
if (i2pChromium != null)
|
||||||
|
return i2pChromium.running();
|
||||||
|
if (i2pGeneral != null)
|
||||||
|
return i2pGeneral.running();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private String ValidURL(String inUrl) {
|
private String ValidURL(String inUrl) {
|
||||||
String[] schemes = {"http", "https"};
|
String[] schemes = {"http", "https"};
|
||||||
for (String scheme : schemes) {
|
for (String scheme : schemes) {
|
||||||
@ -239,7 +235,6 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
|
|||||||
i2pBrowser.startup(args);
|
i2pBrowser.startup(args);
|
||||||
}
|
}
|
||||||
public ArrayList<String> parseArgs(String[] args) {
|
public ArrayList<String> parseArgs(String[] args) {
|
||||||
validateUserDir();
|
|
||||||
logger.info("I2PBrowser");
|
logger.info("I2PBrowser");
|
||||||
ArrayList<String> visitURL = new ArrayList<String>();
|
ArrayList<String> visitURL = new ArrayList<String>();
|
||||||
if (args != null) {
|
if (args != null) {
|
||||||
@ -270,9 +265,6 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
|
|||||||
if (arg.equals("-outputconfig")) {
|
if (arg.equals("-outputconfig")) {
|
||||||
outputConfig = true;
|
outputConfig = true;
|
||||||
}
|
}
|
||||||
if (arg.equals("-nosystray")) {
|
|
||||||
useSystray = false;
|
|
||||||
}
|
|
||||||
if (arg.equals("-noproxycheck")) {
|
if (arg.equals("-noproxycheck")) {
|
||||||
logger.info("zeroing out proxy check");
|
logger.info("zeroing out proxy check");
|
||||||
this.setProxyTimeoutTime(0);
|
this.setProxyTimeoutTime(0);
|
||||||
@ -288,181 +280,14 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
|
|||||||
public void startup(String[] args) {
|
public void startup(String[] args) {
|
||||||
ArrayList<String> visitURL = parseArgs(args);
|
ArrayList<String> visitURL = parseArgs(args);
|
||||||
try {
|
try {
|
||||||
if (useSystray) {
|
|
||||||
startupSystray();
|
|
||||||
|
|
||||||
Runtime.getRuntime().addShutdownHook(new Thread() {
|
Runtime.getRuntime().addShutdownHook(new Thread() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {}
|
||||||
shutdownSystray();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.warning(e.toString());
|
logger.warning(e.toString());
|
||||||
}
|
}
|
||||||
this.launch(this.privateBrowsing,
|
this.launch(this.privateBrowsing,
|
||||||
visitURL.toArray(new String[visitURL.size()]));
|
visitURL.toArray(new String[visitURL.size()]));
|
||||||
}
|
}
|
||||||
protected boolean createSystrayRunningFile() {
|
|
||||||
if (!systrayRunningExternally()) {
|
|
||||||
try {
|
|
||||||
File systrayIsRunningFile =
|
|
||||||
new File(runtimeDirectory(""), "systray.running");
|
|
||||||
FileWriter myWriter = new FileWriter(systrayIsRunningFile);
|
|
||||||
myWriter.write("systray.running file created");
|
|
||||||
myWriter.close();
|
|
||||||
return true;
|
|
||||||
} catch (IOException ioe) {
|
|
||||||
logger.warning(ioe.toString());
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
protected boolean systrayRunningExternally() {
|
|
||||||
File systrayIsRunningFile =
|
|
||||||
new File(runtimeDirectory(""), "systray.running");
|
|
||||||
if (systrayIsRunningFile.exists()) {
|
|
||||||
logger.info("Systray is already running in another process: " +
|
|
||||||
systrayIsRunningFile.toString());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
logger.info("Systray does not appear to be running");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
private SystemTray initTray() {
|
|
||||||
if (systrayRunningExternally()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (!SystemTray.isSupported()) {
|
|
||||||
logger.warning("SystemTray is not supported");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return SystemTray.getSystemTray();
|
|
||||||
}
|
|
||||||
|
|
||||||
private PopupMenu initMenu() {
|
|
||||||
PopupMenu menu = new PopupMenu();
|
|
||||||
return menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
private File initIconFile() {
|
|
||||||
File iconFile = new File(runtimeDirectory(""), "icon.png");
|
|
||||||
if (!iconFile.exists()) {
|
|
||||||
InputStream resources =
|
|
||||||
I2PBrowser.class.getClassLoader().getResourceAsStream("icon.png");
|
|
||||||
try {
|
|
||||||
OutputStream fos = new FileOutputStream(iconFile);
|
|
||||||
copy(resources, fos);
|
|
||||||
} catch (IOException e) {
|
|
||||||
logger.warning(e.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return iconFile;
|
|
||||||
}
|
|
||||||
private TrayIcon initIcon() {
|
|
||||||
TrayIcon icon = new TrayIcon(image, "I2P Browser Profile Controller", menu);
|
|
||||||
icon.addMouseListener(new MouseAdapter() {
|
|
||||||
public void mouseClicked(MouseEvent e) {
|
|
||||||
if (e.getClickCount() == 2) {
|
|
||||||
String[] args = {"-usability", "-app", "http://127.0.0.1:7657"};
|
|
||||||
main(args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
icon.setImageAutoSize(true);
|
|
||||||
return icon;
|
|
||||||
}
|
|
||||||
protected void startupSystray() {
|
|
||||||
if (!systrayRunningExternally()) {
|
|
||||||
logger.info("Setting up systray");
|
|
||||||
try {
|
|
||||||
if (useSystray) {
|
|
||||||
logger.info("Starting systray");
|
|
||||||
try {
|
|
||||||
if (systray()) {
|
|
||||||
logger.info("Systray started");
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
// TODO Auto-generated catch block
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
if (!createSystrayRunningFile()) {
|
|
||||||
logger.warning("Failed to create systray running file");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
logger.info("Adding icon to systray");
|
|
||||||
tray.add(icon);
|
|
||||||
} catch (AWTException e) {
|
|
||||||
logger.warning(e.toString());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.warning("Systray is already running externally");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
protected void shutdownSystray() {
|
|
||||||
if (tray != null)
|
|
||||||
tray.remove(icon);
|
|
||||||
if (systrayRunningExternally()) {
|
|
||||||
File systrayIsRunningFile =
|
|
||||||
new File(runtimeDirectory(""), "systray.running");
|
|
||||||
systrayIsRunningFile.delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public boolean systray() throws Exception {
|
|
||||||
if (tray == null)
|
|
||||||
throw new Exception("System Tray is Null Exception");
|
|
||||||
launchRegularBrowserStrict.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
String[] args = {"-strict"};
|
|
||||||
main(args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submenuStrict.add(launchRegularBrowserStrict);
|
|
||||||
logger.info("Added strict mode browser");
|
|
||||||
launchPrivateBrowserStrict.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
String[] args = {"-private", "-strict"};
|
|
||||||
main(args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submenuStrict.add(launchPrivateBrowserStrict);
|
|
||||||
logger.info("Added strict+private mode browser");
|
|
||||||
menu.add(submenuStrict);
|
|
||||||
logger.info("Added strict mode submenu");
|
|
||||||
launchRegularBrowserUsability.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
String[] args = {"-usability"};
|
|
||||||
main(args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submenuUsability.add(launchRegularBrowserUsability);
|
|
||||||
logger.info("Added usability mode browser");
|
|
||||||
launchPrivateBrowserUsability.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
String[] args = {"-private", "-strict"};
|
|
||||||
main(args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submenuUsability.add(launchPrivateBrowserUsability);
|
|
||||||
logger.info("Added usability+private mode browser");
|
|
||||||
launchConfigBrowserUsability.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
String[] args = {"-usability", "-app", "http://127.0.0.1:7657"};
|
|
||||||
main(args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
menu.add(submenuUsability);
|
|
||||||
menu.add(launchConfigBrowserUsability);
|
|
||||||
logger.info("Added config-only browser");
|
|
||||||
logger.info("Added usability mode submenu");
|
|
||||||
closeItem.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent e) { shutdownSystray(); }
|
|
||||||
});
|
|
||||||
menu.add(closeItem);
|
|
||||||
icon.setPopupMenu(menu);
|
|
||||||
logger.info("Added close menu item");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -1,188 +0,0 @@
|
|||||||
package net.i2p.i2pfirefox;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.logging.FileHandler;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
import java.util.logging.SimpleFormatter;
|
|
||||||
import net.i2p.I2PAppContext;
|
|
||||||
import net.i2p.app.ClientApp;
|
|
||||||
import net.i2p.app.ClientAppManager;
|
|
||||||
import net.i2p.app.ClientAppState;
|
|
||||||
import net.i2p.util.EepGet;
|
|
||||||
|
|
||||||
public class I2PBrowserPlugin extends I2PBrowser implements ClientApp {
|
|
||||||
private final I2PAppContext context;
|
|
||||||
private final ClientAppManager cam;
|
|
||||||
private final String[] args;
|
|
||||||
private volatile boolean got = false;
|
|
||||||
private volatile boolean shutdown = false;
|
|
||||||
public I2PBrowserPlugin(I2PAppContext context, ClientAppManager listener,
|
|
||||||
String[] args) {
|
|
||||||
this.cam = listener;
|
|
||||||
cam.notify(this, ClientAppState.UNINITIALIZED,
|
|
||||||
"Initializing Profile Manager Systray Plugin", null);
|
|
||||||
this.context = context;
|
|
||||||
this.args = args;
|
|
||||||
cam.notify(this, ClientAppState.INITIALIZED,
|
|
||||||
"Profile Manager Systray Plugin Initialized", null);
|
|
||||||
}
|
|
||||||
private File threadLogFile() {
|
|
||||||
validateUserDir();
|
|
||||||
String userDir = System.getProperty("user.dir");
|
|
||||||
File log = new File(userDir, "logs");
|
|
||||||
if (!log.exists())
|
|
||||||
log.mkdirs();
|
|
||||||
return new File(log, "browserlauncherthreadlogger.log");
|
|
||||||
}
|
|
||||||
public String getDisplayName() { return "Browser Profile Manager"; }
|
|
||||||
public String getName() { return "browserProfileManager"; }
|
|
||||||
public void shutdown(String[] args) {
|
|
||||||
this.shutdownSystray();
|
|
||||||
cam.notify(this, ClientAppState.STOPPING,
|
|
||||||
"Shutting down up profile manager systray", null);
|
|
||||||
got = true;
|
|
||||||
shutdown = true;
|
|
||||||
cam.unregister(this);
|
|
||||||
cam.notify(this, ClientAppState.STOPPED,
|
|
||||||
"Shutting down up profile manager systray", null);
|
|
||||||
}
|
|
||||||
private void downloadInBackground() throws IOException {
|
|
||||||
try {
|
|
||||||
Logger threadLogger = Logger.getLogger("browserlauncherupdatethread");
|
|
||||||
FileHandler fh = new FileHandler(threadLogFile().toString());
|
|
||||||
threadLogger.addHandler(fh);
|
|
||||||
SimpleFormatter formatter = new SimpleFormatter();
|
|
||||||
fh.setFormatter(formatter);
|
|
||||||
got = downloadTorrent();
|
|
||||||
while (!got) {
|
|
||||||
threadLogger.info("Working to download updates in the background");
|
|
||||||
if (shutdown) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
got = downloadTorrent();
|
|
||||||
try {
|
|
||||||
Thread.sleep(5000);
|
|
||||||
} catch (InterruptedException err) {
|
|
||||||
logger.warning(err.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (got) {
|
|
||||||
try {
|
|
||||||
File content = torrentFileContents();
|
|
||||||
if (content.exists()) {
|
|
||||||
content.delete();
|
|
||||||
}
|
|
||||||
} catch (IOException err) {
|
|
||||||
threadLogger.warning(err.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (IOException err) {
|
|
||||||
// just re-throw here
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void startup() {
|
|
||||||
shutdown = false;
|
|
||||||
cam.notify(this, ClientAppState.STARTING,
|
|
||||||
"Starting up profile manager systray", null);
|
|
||||||
Runnable r = new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
logger.info("Downloading in background thread");
|
|
||||||
try {
|
|
||||||
downloadInBackground();
|
|
||||||
} catch (IOException err) {
|
|
||||||
err.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
new Thread(r).start();
|
|
||||||
try {
|
|
||||||
this.startup(args);
|
|
||||||
cam.register(this);
|
|
||||||
cam.notify(this, ClientAppState.RUNNING,
|
|
||||||
"Starting up profile manager systray", null);
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.info(e.toString());
|
|
||||||
cam.notify(this, ClientAppState.START_FAILED,
|
|
||||||
"Error starting profile manager systray", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private File torrentDir() throws IOException {
|
|
||||||
File configDir = context.getConfigDir();
|
|
||||||
if (configDir == null) {
|
|
||||||
throw new IOException("The I2P Config directory is null");
|
|
||||||
}
|
|
||||||
if (!configDir.exists()) {
|
|
||||||
throw new IOException("The I2P Config directory does not exist");
|
|
||||||
}
|
|
||||||
File snarkDir = new File(configDir, "i2psnark");
|
|
||||||
if (snarkDir == null) {
|
|
||||||
throw new IOException("The Snark directory is null");
|
|
||||||
}
|
|
||||||
if (!snarkDir.exists()) {
|
|
||||||
throw new IOException("The Snark directory does not exist");
|
|
||||||
}
|
|
||||||
return snarkDir;
|
|
||||||
}
|
|
||||||
private File torrentFile() throws IOException {
|
|
||||||
try {
|
|
||||||
File torrents = torrentDir();
|
|
||||||
File torrent = new File(torrents, "i2p.plugins.firefox.torrent");
|
|
||||||
if (torrent == null) {
|
|
||||||
throw new IOException("Cannot download torrent, torrent file is null");
|
|
||||||
}
|
|
||||||
return torrent;
|
|
||||||
} catch (IOException err) {
|
|
||||||
logger.warning(err.toString());
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
private File torrentFileContents() throws IOException {
|
|
||||||
try {
|
|
||||||
File torrents = torrentDir();
|
|
||||||
File torrent = new File(torrents, "i2p.plugins.firefox");
|
|
||||||
if (torrent == null) {
|
|
||||||
throw new IOException("Torrent directory contents are null");
|
|
||||||
}
|
|
||||||
return torrent;
|
|
||||||
} catch (IOException err) {
|
|
||||||
logger.warning(err.toString());
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
private boolean downloadTorrent() {
|
|
||||||
try {
|
|
||||||
String url =
|
|
||||||
"http://idk.i2p/i2p.plugins.firefox/i2p.plugins.firefox.torrent";
|
|
||||||
String name = torrentFile().getAbsolutePath();
|
|
||||||
logger.info("Downloading " + url + " to " + name);
|
|
||||||
EepGet eepGet =
|
|
||||||
new EepGet(context, true, "127.0.0.1", 4444, 5, name, url);
|
|
||||||
if (eepGet.getNotModified()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return eepGet.fetch(60, 180, 60);
|
|
||||||
} catch (IOException err) {
|
|
||||||
logger.warning(err.toString());
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
public ClientAppState getState() {
|
|
||||||
if (shutdown && !systrayRunningExternally()) {
|
|
||||||
String msg = "Firefox profile manager systray is stopped";
|
|
||||||
logger.info(msg);
|
|
||||||
cam.notify(this, ClientAppState.STOPPED, msg, null);
|
|
||||||
return ClientAppState.STOPPED;
|
|
||||||
}
|
|
||||||
if (systrayRunningExternally()) {
|
|
||||||
String msg = "Firefox profile manager systray is running";
|
|
||||||
logger.info(msg);
|
|
||||||
cam.notify(this, ClientAppState.RUNNING, msg, null);
|
|
||||||
return ClientAppState.RUNNING;
|
|
||||||
}
|
|
||||||
return ClientAppState.FORKED; // Used as a euphemism for unknown here.
|
|
||||||
}
|
|
||||||
}
|
|
@ -29,6 +29,7 @@ import java.util.stream.Stream;
|
|||||||
public class I2PChromium extends I2PChromiumProfileUnpacker {
|
public class I2PChromium extends I2PChromiumProfileUnpacker {
|
||||||
private final String[] CHROMIUM_SEARCH_PATHS = CHROMIUM_FINDER();
|
private final String[] CHROMIUM_SEARCH_PATHS = CHROMIUM_FINDER();
|
||||||
private Process p = null;
|
private Process p = null;
|
||||||
|
private String chromePath;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct an I2PChromium class which manages an instance of Chromium and
|
* Construct an I2PChromium class which manages an instance of Chromium and
|
||||||
@ -60,34 +61,35 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
|
|||||||
public void storeChromiumDefaults() {
|
public void storeChromiumDefaults() {
|
||||||
List<String> list = new ArrayList<String>();
|
List<String> list = new ArrayList<String>();
|
||||||
list = Arrays.asList(chromiumPathsWindows());
|
list = Arrays.asList(chromiumPathsWindows());
|
||||||
prop.setProperty("chromium.paths.windows",
|
getProperties().setProperty("chromium.paths.windows",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
list = Arrays.asList(chromiumPathsUnix());
|
list = Arrays.asList(chromiumPathsUnix());
|
||||||
prop.setProperty("chromium.paths.linux",
|
getProperties().setProperty("chromium.paths.linux",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
list = Arrays.asList(chromiumPathsOSX());
|
list = Arrays.asList(chromiumPathsOSX());
|
||||||
prop.setProperty("chromium.paths.osx",
|
getProperties().setProperty("chromium.paths.osx",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
|
|
||||||
list = Arrays.asList(chromiumBinsWindows());
|
list = Arrays.asList(chromiumBinsWindows());
|
||||||
prop.setProperty("chromium.bins.windows",
|
getProperties().setProperty("chromium.bins.windows",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
list = Arrays.asList(chromiumBinsUnix());
|
list = Arrays.asList(chromiumBinsUnix());
|
||||||
prop.setProperty("chromium.bins.linux",
|
getProperties().setProperty("chromium.bins.linux",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
list = Arrays.asList(chromiumBinsUnix());
|
list = Arrays.asList(chromiumBinsUnix());
|
||||||
prop.setProperty("chromium.bins.osx",
|
getProperties().setProperty("chromium.bins.osx",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
try (OutputStream fos = new FileOutputStream(
|
try (OutputStream fos = new FileOutputStream(
|
||||||
new File(runtimeDirectory(""), "browser.config"))) {
|
new File(runtimeDirectory(""), "browser.config"))) {
|
||||||
prop.store(fos, "Chromium Configuration Section");
|
getProperties().store(fos, "Chromium Configuration Section");
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
logger.warning(ioe.toString());
|
logger.warning(ioe.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String[] chromiumPathsUnix() {
|
private String[] chromiumPathsUnix() {
|
||||||
String chromiumPathsProp = prop.getProperty("chromium.paths.unix");
|
String chromiumPathsProp =
|
||||||
|
getProperties().getProperty("chromium.paths.unix");
|
||||||
if (chromiumPathsProp != null)
|
if (chromiumPathsProp != null)
|
||||||
if (!chromiumPathsProp.equals(""))
|
if (!chromiumPathsProp.equals(""))
|
||||||
return chromiumPathsProp.split(",");
|
return chromiumPathsProp.split(",");
|
||||||
@ -98,12 +100,12 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
|
|||||||
private String[] chromiumBinsUnix() {
|
private String[] chromiumBinsUnix() {
|
||||||
String chromiumPathsProp;
|
String chromiumPathsProp;
|
||||||
if (isOSX()) {
|
if (isOSX()) {
|
||||||
chromiumPathsProp = prop.getProperty("chromium.bins.osx");
|
chromiumPathsProp = getProperties().getProperty("chromium.bins.osx");
|
||||||
if (chromiumPathsProp != null)
|
if (chromiumPathsProp != null)
|
||||||
if (!chromiumPathsProp.equals(""))
|
if (!chromiumPathsProp.equals(""))
|
||||||
return chromiumPathsProp.split(",");
|
return chromiumPathsProp.split(",");
|
||||||
}
|
}
|
||||||
chromiumPathsProp = prop.getProperty("chromium.bins.unix");
|
chromiumPathsProp = getProperties().getProperty("chromium.bins.unix");
|
||||||
if (chromiumPathsProp != null)
|
if (chromiumPathsProp != null)
|
||||||
if (!chromiumPathsProp.equals(""))
|
if (!chromiumPathsProp.equals(""))
|
||||||
return chromiumPathsProp.split(",");
|
return chromiumPathsProp.split(",");
|
||||||
@ -126,7 +128,8 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
|
|||||||
return exePath;
|
return exePath;
|
||||||
}
|
}
|
||||||
private String[] chromiumPathsOSX() {
|
private String[] chromiumPathsOSX() {
|
||||||
String chromiumPathsProp = prop.getProperty("chromium.paths.osx");
|
String chromiumPathsProp =
|
||||||
|
getProperties().getProperty("chromium.paths.osx");
|
||||||
if (chromiumPathsProp != null)
|
if (chromiumPathsProp != null)
|
||||||
if (!chromiumPathsProp.equals(""))
|
if (!chromiumPathsProp.equals(""))
|
||||||
return chromiumPathsProp.split(",");
|
return chromiumPathsProp.split(",");
|
||||||
@ -149,7 +152,8 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String[] chromiumPathsWindows() {
|
private String[] chromiumPathsWindows() {
|
||||||
String chromiumPathsProp = prop.getProperty("chromium.paths.windows");
|
String chromiumPathsProp =
|
||||||
|
getProperties().getProperty("chromium.paths.windows");
|
||||||
if (chromiumPathsProp != null)
|
if (chromiumPathsProp != null)
|
||||||
if (!chromiumPathsProp.equals(""))
|
if (!chromiumPathsProp.equals(""))
|
||||||
return chromiumPathsProp.split(",");
|
return chromiumPathsProp.split(",");
|
||||||
@ -182,7 +186,8 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
private String[] chromiumBinsWindows() {
|
private String[] chromiumBinsWindows() {
|
||||||
String chromiumPathsProp = prop.getProperty("chromium.bins.windows");
|
String chromiumPathsProp =
|
||||||
|
getProperties().getProperty("chromium.bins.windows");
|
||||||
if (chromiumPathsProp != null)
|
if (chromiumPathsProp != null)
|
||||||
if (!chromiumPathsProp.equals(""))
|
if (!chromiumPathsProp.equals(""))
|
||||||
return chromiumPathsProp.split(",");
|
return chromiumPathsProp.split(",");
|
||||||
@ -384,11 +389,13 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
|
|||||||
File chromeFile = new File(chrome);
|
File chromeFile = new File(chrome);
|
||||||
if (chromeFile.exists()) {
|
if (chromeFile.exists()) {
|
||||||
// if it does, return it
|
// if it does, return it
|
||||||
|
chromePath = chrome;
|
||||||
return chrome;
|
return chrome;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
String[] chromees = onlyValidChromiums();
|
String[] chromees = onlyValidChromiums();
|
||||||
if (chromees.length > 0) {
|
if (chromees.length > 0) {
|
||||||
|
chromePath = chromees[0];
|
||||||
return chromees[0];
|
return chromees[0];
|
||||||
} else {
|
} else {
|
||||||
return "";
|
return "";
|
||||||
@ -667,7 +674,7 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Process launchAndDetatch(int privateWindow, String[] url) {
|
public Process launchAndDetatch(int privateWindow, String[] url) {
|
||||||
validateUserDir();
|
validateUserDirectory();
|
||||||
if (waitForProxy()) {
|
if (waitForProxy()) {
|
||||||
String profileDirectory = this.profileDirectory(this.usabilityMode());
|
String profileDirectory = this.profileDirectory(this.usabilityMode());
|
||||||
if (this.validateProfileDirectory(profileDirectory)) {
|
if (this.validateProfileDirectory(profileDirectory)) {
|
||||||
@ -764,6 +771,25 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
|
|||||||
*/
|
*/
|
||||||
public void launch() { launch(false); }
|
public void launch() { launch(false); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop all running processes managed by the browser manager.
|
||||||
|
*
|
||||||
|
* @return true if successful, false if not
|
||||||
|
*/
|
||||||
|
public boolean stop() {
|
||||||
|
if (p != null) {
|
||||||
|
p.destroy();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean running() {
|
||||||
|
if (p != null)
|
||||||
|
return p.isAlive();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private String ValidURL(String inUrl) {
|
private String ValidURL(String inUrl) {
|
||||||
String[] schemes = {"http", "https"};
|
String[] schemes = {"http", "https"};
|
||||||
for (String scheme : schemes) {
|
for (String scheme : schemes) {
|
||||||
@ -777,7 +803,7 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
|
|||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
int privateBrowsing = 0;
|
int privateBrowsing = 0;
|
||||||
I2PChromium i2pChromium = new I2PChromium();
|
I2PChromium i2pChromium = new I2PChromium();
|
||||||
i2pChromium.validateUserDir();
|
i2pChromium.validateUserDirectory();
|
||||||
i2pChromium.logger.info("I2PChromium");
|
i2pChromium.logger.info("I2PChromium");
|
||||||
i2pChromium.logger.info("checking for private browsing");
|
i2pChromium.logger.info("checking for private browsing");
|
||||||
ArrayList<String> visitURL = new ArrayList<String>();
|
ArrayList<String> visitURL = new ArrayList<String>();
|
||||||
|
@ -33,46 +33,57 @@ import java.util.zip.ZipInputStream;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public class I2PCommonBrowser {
|
public class I2PCommonBrowser {
|
||||||
public Properties prop = new Properties();
|
private Properties prop = new Properties();
|
||||||
public Logger logger = Logger.getLogger("browserlauncher");
|
public Logger logger = Logger.getLogger("browserlauncher");
|
||||||
private FileHandler fh;
|
private FileHandler fh;
|
||||||
static int CONFIGURED_TIMEOUT = 200;
|
int CONFIGURED_TIMEOUT = 200;
|
||||||
|
|
||||||
public I2PCommonBrowser() {
|
public I2PCommonBrowser() {
|
||||||
try {
|
try {
|
||||||
// This block configure the logger with handler and formatter
|
|
||||||
fh = new FileHandler(logFile().toString());
|
|
||||||
logger.addHandler(fh);
|
|
||||||
SimpleFormatter formatter = new SimpleFormatter();
|
|
||||||
fh.setFormatter(formatter);
|
|
||||||
// the following statement is used to log any messages
|
|
||||||
logger.info("Browser log");
|
logger.info("Browser log");
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
loadPropertiesFile(new File(runtimeDirectory(""), "browser.config"));
|
loadPropertiesFile(new File(runtimeDirectory(""), "browser.config"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadPropertiesFile(File props) {
|
/**
|
||||||
try (InputStream propsInput = new FileInputStream(props)) {
|
* Loads a properties file.
|
||||||
|
*
|
||||||
|
* @param propertiesFile the file to load
|
||||||
|
*/
|
||||||
|
public void loadPropertiesFile(File propertiesFile) {
|
||||||
|
try (InputStream inputStream = new FileInputStream(propertiesFile)) {
|
||||||
prop = new Properties();
|
prop = new Properties();
|
||||||
prop.load(propsInput);
|
prop.load(inputStream);
|
||||||
System.out.println(prop);
|
} catch (IOException exception) {
|
||||||
} catch (IOException io) {
|
logger.warning(exception.toString());
|
||||||
logger.warning(io.toString());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void validateUserDir() {
|
/**
|
||||||
|
* Retrieves the properties of the object.
|
||||||
|
*
|
||||||
|
* @return the properties of the object
|
||||||
|
*/
|
||||||
|
public Properties getProperties() { return prop; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the user directory.
|
||||||
|
*
|
||||||
|
* @param None No parameters.
|
||||||
|
* @return None No return value.
|
||||||
|
*/
|
||||||
|
public void validateUserDirectory() {
|
||||||
logger.info("Validating user directory");
|
logger.info("Validating user directory");
|
||||||
String userDir = System.getProperty("user.dir");
|
String userDir = System.getProperty("user.dir");
|
||||||
String userHome = System.getProperty("user.home");
|
String userHome = System.getProperty("user.home");
|
||||||
File userDirFile = new File(userDir);
|
File userDirFile = new File(userDir);
|
||||||
File userHomeFile = new File(userHome);
|
File userHomeFile = new File(userHome);
|
||||||
logger.info("user.dir testing !" + userHomeFile.getAbsolutePath() +
|
|
||||||
".equals(" + userDirFile.getAbsolutePath() + ")");
|
logger.info("user.dir: " + userDirFile.getAbsolutePath());
|
||||||
|
logger.info("user.home: " + userHomeFile.getAbsolutePath());
|
||||||
|
|
||||||
if (!userDirFile.getAbsolutePath().contains("Program Files")) {
|
if (!userDirFile.getAbsolutePath().contains("Program Files")) {
|
||||||
if (!userDirFile.getAbsolutePath().equals(
|
if (!userDirFile.getAbsolutePath().equals(
|
||||||
userHomeFile.getAbsolutePath())) {
|
userHomeFile.getAbsolutePath())) {
|
||||||
@ -87,8 +98,9 @@ public class I2PCommonBrowser {
|
|||||||
} else {
|
} else {
|
||||||
logger.info("user.dir is not writable");
|
logger.info("user.dir is not writable");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
logger.info("user.dir is not actually a directory");
|
||||||
}
|
}
|
||||||
{ logger.info("user.dir is not actually a directory"); }
|
|
||||||
} else {
|
} else {
|
||||||
logger.info("user.dir does not exist");
|
logger.info("user.dir does not exist");
|
||||||
}
|
}
|
||||||
@ -98,11 +110,13 @@ public class I2PCommonBrowser {
|
|||||||
} else {
|
} else {
|
||||||
logger.info("user.dir cannot run from inside Program Files");
|
logger.info("user.dir cannot run from inside Program Files");
|
||||||
}
|
}
|
||||||
if (isWindows())
|
if (isWindows()) {
|
||||||
userHome = new File(userHome, "AppData/Local/I2P").getAbsolutePath();
|
userHome = new File(userHome, "AppData/Local/I2P").getAbsolutePath();
|
||||||
|
}
|
||||||
File defaultPathFile = new File(userHome, "i2p/i2pbrowser");
|
File defaultPathFile = new File(userHome, "i2p/i2pbrowser");
|
||||||
if (!defaultPathFile.exists())
|
if (!defaultPathFile.exists()) {
|
||||||
defaultPathFile.mkdirs();
|
defaultPathFile.mkdirs();
|
||||||
|
}
|
||||||
if (!defaultPathFile.isDirectory()) {
|
if (!defaultPathFile.isDirectory()) {
|
||||||
logger.info(
|
logger.info(
|
||||||
"default path exists and is not a directory, get it out of the way");
|
"default path exists and is not a directory, get it out of the way");
|
||||||
@ -110,160 +124,201 @@ public class I2PCommonBrowser {
|
|||||||
}
|
}
|
||||||
System.setProperty("user.dir", defaultPathFile.getAbsolutePath());
|
System.setProperty("user.dir", defaultPathFile.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the operating system.
|
||||||
|
*
|
||||||
|
* @return the name of the operating system (Windows, Linux, BSD, Mac, or
|
||||||
|
* Unknown)
|
||||||
|
*/
|
||||||
public String getOperatingSystem() {
|
public String getOperatingSystem() {
|
||||||
String os = System.getProperty("os.name");
|
if (isWindows()) {
|
||||||
if (os.startsWith("Windows")) {
|
|
||||||
return "Windows";
|
return "Windows";
|
||||||
} else if (os.contains("Linux")) {
|
} else if (isLinux()) {
|
||||||
return "Linux";
|
return "Linux";
|
||||||
} else if (os.contains("BSD")) {
|
} else if (isBSD()) {
|
||||||
return "BSD";
|
return "BSD";
|
||||||
} else if (os.contains("Mac")) {
|
} else if (isOSX()) {
|
||||||
return "Mac";
|
return "Mac";
|
||||||
}
|
}
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the current operating system is Windows.
|
||||||
|
*
|
||||||
|
* @return true if the current operating system is Windows, false otherwise
|
||||||
|
*/
|
||||||
protected boolean isWindows() {
|
protected boolean isWindows() {
|
||||||
String osName = System.getProperty("os.name");
|
String osName = System.getProperty("os.name").toLowerCase();
|
||||||
logger.info("os.name" + osName);
|
return osName.contains("windows");
|
||||||
if (osName.contains("windows"))
|
|
||||||
return true;
|
|
||||||
if (osName.contains("Windows"))
|
|
||||||
return true;
|
|
||||||
if (osName.contains("WINDOWS"))
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the current operating system is macOS.
|
||||||
|
*
|
||||||
|
* @return true if the operating system is macOS, false otherwise
|
||||||
|
*/
|
||||||
protected boolean isOSX() {
|
protected boolean isOSX() {
|
||||||
String osName = System.getProperty("os.name");
|
String osName = System.getProperty("os.name").toLowerCase();
|
||||||
logger.info("os.name" + osName);
|
return osName.contains("osx") || osName.contains("mac") ||
|
||||||
if (osName.contains("OSX"))
|
osName.contains("apple") || osName.contains("darwin");
|
||||||
return true;
|
}
|
||||||
if (osName.contains("osx"))
|
|
||||||
return true;
|
/**
|
||||||
if (osName.contains("mac"))
|
* Determines whether the current operating system is Linux.
|
||||||
return true;
|
*
|
||||||
if (osName.contains("Mac"))
|
* @return true if the operating system is Linux, false otherwise
|
||||||
return true;
|
*/
|
||||||
if (osName.contains("apple"))
|
protected boolean isLinux() {
|
||||||
return true;
|
String osName = System.getProperty("os.name").toLowerCase();
|
||||||
if (osName.contains("Apple"))
|
return osName.contains("linux");
|
||||||
return true;
|
}
|
||||||
if (osName.contains("Darwin"))
|
|
||||||
return true;
|
/**
|
||||||
if (osName.contains("darwin"))
|
* Checks if the current operating system is a BSD variant.
|
||||||
return true;
|
*
|
||||||
return false;
|
* @return true if the operating system is a BSD variant, false otherwise
|
||||||
|
*/
|
||||||
|
protected boolean isBSD() {
|
||||||
|
String osName = System.getProperty("os.name").toLowerCase();
|
||||||
|
return osName.contains("bsd");
|
||||||
}
|
}
|
||||||
|
|
||||||
// public void logger.info(String line) { logger.info(line); }
|
// public void logger.info(String line) { logger.info(line); }
|
||||||
|
|
||||||
private File logFile() {
|
/**
|
||||||
validateUserDir();
|
* Returns the log file for the browser launcher.
|
||||||
String userDir = System.getProperty("user.dir");
|
*
|
||||||
File log = new File(userDir, "logs");
|
* @return the log file for the browser launcher
|
||||||
if (!log.exists())
|
*/
|
||||||
log.mkdirs();
|
/*private File logFile() {
|
||||||
return new File(log, "browserlauncher.log");
|
// validateUserDirectory();
|
||||||
|
String userDirectory = System.getProperty("user.dir");
|
||||||
|
File logDirectory = new File(userDirectory, "logs");
|
||||||
|
if (!logDirectory.exists()) {
|
||||||
|
logDirectory.mkdirs();
|
||||||
}
|
}
|
||||||
|
return new File(logDirectory, "browserlauncher.log");
|
||||||
|
}*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the runtime directory, creating it if create=true
|
* Get the runtime directory, creating it if create=true.
|
||||||
*
|
*
|
||||||
* @param create if true, create the runtime directory if it does not exist
|
* @param create If true, create the runtime directory if it does not exist.
|
||||||
* @return the runtime directory, or null if it could not be created
|
* @param override The runtime directory override.
|
||||||
|
* @return The runtime directory, or null if it could not be created.
|
||||||
* @since 0.0.19
|
* @since 0.0.19
|
||||||
*/
|
*/
|
||||||
protected File runtimeDirectory(boolean create, String override) {
|
protected File runtimeDirectory(boolean create, String override) {
|
||||||
String rtd = runtimeDirectory(override);
|
String runtimeDir = runtimeDirectory(override);
|
||||||
File rtdFile = new File(rtd);
|
File runtimeDirFile = new File(runtimeDir);
|
||||||
if (create) {
|
if (create && !runtimeDirFile.exists()) {
|
||||||
if (!rtdFile.exists()) {
|
runtimeDirFile.mkdir();
|
||||||
rtdFile.mkdir();
|
|
||||||
}
|
}
|
||||||
}
|
return runtimeDirFile;
|
||||||
return new File(rtd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the correct runtime directory
|
* Returns the runtime directory path based on the given override parameter.
|
||||||
*
|
*
|
||||||
* @return the runtime directory, or null if it could not be created or found
|
* @param override the name of the environment variable to override the
|
||||||
* @since 0.0.19
|
* runtime
|
||||||
|
* directory
|
||||||
|
* @return the runtime directory path as a string
|
||||||
*/
|
*/
|
||||||
protected String runtimeDirectory(String override) {
|
protected String runtimeDirectory(String override) {
|
||||||
// get the I2P_BROWSER_DIR environment variable
|
String runtimeDir = System.getenv(override);
|
||||||
String rtd = System.getenv(override);
|
if (isDirectoryValid(runtimeDir)) {
|
||||||
// if it is not null and not empty
|
return runtimeDir;
|
||||||
if (rtd != null && !rtd.isEmpty()) {
|
|
||||||
// check if the file exists
|
|
||||||
File rtdFile = new File(rtd);
|
|
||||||
if (rtdFile.exists()) {
|
|
||||||
// if it does, return it
|
|
||||||
return rtd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// obtain the PLUGIN environment variable
|
|
||||||
String plugin = System.getenv("PLUGIN");
|
|
||||||
if (plugin != null && !plugin.isEmpty()) {
|
|
||||||
File pluginDir = new File(plugin);
|
|
||||||
if (pluginDir.exists()) {
|
|
||||||
return pluginDir.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String pluginDir = System.getenv("PLUGIN");
|
||||||
|
if (isDirectoryValid(pluginDir)) {
|
||||||
|
return pluginDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
String userDir = System.getProperty("user.dir");
|
String userDir = System.getProperty("user.dir");
|
||||||
if (userDir != null && !userDir.isEmpty()) {
|
if (isDirectoryValid(userDir)) {
|
||||||
File userDir1 = new File(userDir);
|
return userDir;
|
||||||
if (userDir1.exists()) {
|
|
||||||
return userDir1.toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String homeDir = System.getProperty("user.home");
|
String homeDir = System.getProperty("user.home");
|
||||||
if (homeDir != null && !homeDir.isEmpty()) {
|
if (isDirectoryValid(homeDir)) {
|
||||||
File homeDir1 = new File(homeDir + "/.i2p");
|
String i2pDir = homeDir + "/.i2p";
|
||||||
if (homeDir1.exists()) {
|
if (isDirectoryValid(i2pDir)) {
|
||||||
return homeDir.toString();
|
return homeDir;
|
||||||
}
|
}
|
||||||
File homeDir2 = new File(homeDir + "/i2p");
|
|
||||||
if (homeDir2.exists()) {
|
String altI2pDir = homeDir + "/i2p";
|
||||||
return homeDir2.toString();
|
if (isDirectoryValid(altI2pDir)) {
|
||||||
|
return altI2pDir;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the profile directory, creating it if necessary
|
* Checks if the given directory is valid.
|
||||||
*
|
*
|
||||||
|
* @param directory the directory to check
|
||||||
|
* @return true if the directory is valid, false otherwise
|
||||||
|
*/
|
||||||
|
private boolean isDirectoryValid(String directory) {
|
||||||
|
return directory != null && !directory.isEmpty() &&
|
||||||
|
new File(directory).exists();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the profile directory, creating it if necessary.
|
||||||
|
*
|
||||||
|
* @param envVar the environment variable name
|
||||||
|
* @param browser the browser name
|
||||||
|
* @param base the base directory
|
||||||
|
* @param app indicates if it is an app directory
|
||||||
* @return the profile directory, or null if it could not be created
|
* @return the profile directory, or null if it could not be created
|
||||||
* @since 0.0.19
|
* @since 0.0.19
|
||||||
*/
|
*/
|
||||||
protected String profileDirectory(String envVar, String browser, String base,
|
protected String profileDirectory(String envVar, String browser, String base,
|
||||||
boolean app) {
|
boolean app) {
|
||||||
String pd = System.getenv(envVar);
|
String profileDir = System.getenv(envVar);
|
||||||
if (pd != null && !pd.isEmpty()) {
|
if (profileDir != null && !profileDir.isEmpty()) {
|
||||||
File pdf = new File(pd);
|
File profileDirFile = new File(profileDir);
|
||||||
if (pdf.exists() && pdf.isDirectory()) {
|
if (profileDirFile.exists() && profileDirFile.isDirectory()) {
|
||||||
return pd;
|
return profileDir;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
String rtd = runtimeDirectory("");
|
String runtimeDir = runtimeDirectory("");
|
||||||
return profileDir(rtd, browser, base, app);
|
return profileDir(runtimeDir, browser, base, app);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A description of the entire Java function.
|
||||||
|
*
|
||||||
|
* @param file description of parameter
|
||||||
|
* @param browser description of parameter
|
||||||
|
* @param base description of parameter
|
||||||
|
* @param app description of parameter
|
||||||
|
* @return description of return value
|
||||||
|
*/
|
||||||
protected String profileDir(String file, String browser, String base,
|
protected String profileDir(String file, String browser, String base,
|
||||||
boolean app) {
|
boolean app) {
|
||||||
String appString = "";
|
String appString = app ? ".app" : "";
|
||||||
if (app) {
|
String profileDirName =
|
||||||
appString = ".app";
|
String.format("i2p.%s.profile.%s%s", browser, base, appString);
|
||||||
}
|
File profileDir = new File(file, profileDirName);
|
||||||
File profileDir =
|
|
||||||
new File(file, "i2p." + browser + ".profile." + base + appString);
|
|
||||||
return profileDir.getAbsolutePath();
|
return profileDir.getAbsolutePath();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unpacks the base profile to a specified directory.
|
||||||
|
*
|
||||||
|
* @param profileDirectory the directory where the profile will be unpacked
|
||||||
|
* @param browser the browser type
|
||||||
|
* @param base the base profile
|
||||||
|
* @return true if the profile was successfully unpacked, false otherwise
|
||||||
|
*/
|
||||||
protected boolean unpackProfile(String profileDirectory, String browser,
|
protected boolean unpackProfile(String profileDirectory, String browser,
|
||||||
String base) {
|
String base) {
|
||||||
logger.info("Unpacking base profile to " + profileDirectory);
|
logger.info("Unpacking base profile to " + profileDirectory);
|
||||||
@ -309,64 +364,101 @@ public class I2PCommonBrowser {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void copyDirectory(File sourceDirectory, File destinationDirectory,
|
/**
|
||||||
String browser, String base) throws IOException {
|
* Copy a directory from sourceDir to destDir, excluding certain files based
|
||||||
destinationDirectory = new File(destinationDirectory.toString().replace(
|
* on browser and base.
|
||||||
|
*
|
||||||
|
* @param sourceDir directory to be copied from
|
||||||
|
* @param destDir directory to be copied to
|
||||||
|
* @param browser the browser name
|
||||||
|
* @param base the base name
|
||||||
|
* @throws IOException if an I/O error occurs during copying
|
||||||
|
*/
|
||||||
|
protected void copyDirectory(File sourceDir, File destDir, String browser,
|
||||||
|
String base) throws IOException {
|
||||||
|
destDir = new File(destDir.toString().replace(
|
||||||
"i2p." + browser + "." + base + ".profile", ""));
|
"i2p." + browser + "." + base + ".profile", ""));
|
||||||
if (!destinationDirectory.exists()) {
|
if (!destDir.exists()) {
|
||||||
destinationDirectory.mkdir();
|
destDir.mkdir();
|
||||||
}
|
}
|
||||||
for (String f : sourceDirectory.list()) {
|
for (String file : sourceDir.list()) {
|
||||||
copyDirectoryCompatibilityMode(new File(sourceDirectory, f),
|
copyDirectoryCompatibilityMode(new File(sourceDir, file),
|
||||||
new File(destinationDirectory, f), browser,
|
new File(destDir, file), browser, base);
|
||||||
base);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void copyDirectoryCompatibilityMode(File source, File destination,
|
/**
|
||||||
|
* Copy a directory in compatibility mode.
|
||||||
|
*
|
||||||
|
* @param sourceDirectory the source directory to copy
|
||||||
|
* @param destinationDirectory the destination directory to copy to
|
||||||
|
* @param browser the browser
|
||||||
|
* @param base the base
|
||||||
|
* @throws IOException if an I/O error occurs
|
||||||
|
*/
|
||||||
|
private void copyDirectoryCompatibilityMode(File sourceDirectory,
|
||||||
|
File destinationDirectory,
|
||||||
String browser, String base)
|
String browser, String base)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
if (source.isDirectory()) {
|
if (sourceDirectory.isDirectory()) {
|
||||||
copyDirectory(source, destination, browser, base);
|
copyDirectory(sourceDirectory, destinationDirectory, browser, base);
|
||||||
} else {
|
} else {
|
||||||
copyFile(source, destination);
|
copyFile(sourceDirectory, destinationDirectory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copies the content from the source InputStream to the target OutputStream.
|
||||||
|
*
|
||||||
|
* @param source the InputStream to copy from
|
||||||
|
* @param target the OutputStream to copy to
|
||||||
|
* @throws IOException if an I/O error occurs during the copying process
|
||||||
|
*/
|
||||||
public void copy(InputStream source, OutputStream target) throws IOException {
|
public void copy(InputStream source, OutputStream target) throws IOException {
|
||||||
byte[] buf = new byte[8192];
|
byte[] buffer = new byte[8192];
|
||||||
int length;
|
int bytesRead;
|
||||||
while ((length = source.read(buf)) != -1) {
|
while ((bytesRead = source.read(buffer)) != -1) {
|
||||||
target.write(buf, 0, length);
|
target.write(buffer, 0, bytesRead);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copies a file from the source file to the destination file.
|
||||||
|
*
|
||||||
|
* @param sourceFile the source file to be copied
|
||||||
|
* @param destinationFile the destination file where the source file will be
|
||||||
|
* copied to
|
||||||
|
* @throws IOException if an I/O error occurs during the file copy process
|
||||||
|
*/
|
||||||
private void copyFile(File sourceFile, File destinationFile)
|
private void copyFile(File sourceFile, File destinationFile)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
try (InputStream in = new FileInputStream(sourceFile);
|
try (InputStream in = new FileInputStream(sourceFile);
|
||||||
OutputStream out = new FileOutputStream(destinationFile)) {
|
OutputStream out = new FileOutputStream(destinationFile)) {
|
||||||
byte[] buf = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
int length;
|
int length;
|
||||||
while ((length = in.read(buf)) > 0) {
|
while ((length = in.read(buffer)) > 0) {
|
||||||
out.write(buf, 0, length);
|
out.write(buffer, 0, length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the profile for the first run.
|
||||||
|
*
|
||||||
|
* @param profileDirectory the directory of the profile
|
||||||
|
* @return true if the profile is valid for the first run, false otherwise
|
||||||
|
*/
|
||||||
public boolean validateProfileFirstRun(String profileDirectory) {
|
public boolean validateProfileFirstRun(String profileDirectory) {
|
||||||
File profileDir = new File(profileDirectory);
|
File profileDir = new File(profileDirectory);
|
||||||
if (!profileDir.exists()) {
|
if (!profileDir.exists()) {
|
||||||
logger.info("Profile directory does not exist");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!profileDir.isDirectory()) {
|
if (!profileDir.isDirectory()) {
|
||||||
logger.info("Profile directory is not a directory");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
File frf = new File(profileDir, "first-run");
|
File firstRunFile = new File(profileDir, "first-run");
|
||||||
if (frf.exists()) {
|
if (firstRunFile.exists()) {
|
||||||
frf.delete();
|
firstRunFile.delete();
|
||||||
// is a first run
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -392,6 +484,7 @@ public class I2PCommonBrowser {
|
|||||||
public boolean waitForProxy(int timeout) {
|
public boolean waitForProxy(int timeout) {
|
||||||
return waitForProxy(timeout, 4444);
|
return waitForProxy(timeout, 4444);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Waits for an HTTP proxy on the specified port to be ready.
|
* Waits for an HTTP proxy on the specified port to be ready.
|
||||||
* Returns false on timeout of the specified number of seconds.
|
* Returns false on timeout of the specified number of seconds.
|
||||||
@ -404,6 +497,7 @@ public class I2PCommonBrowser {
|
|||||||
public boolean waitForProxy(int timeout, int port) {
|
public boolean waitForProxy(int timeout, int port) {
|
||||||
return waitForProxy(timeout, port, "localhost");
|
return waitForProxy(timeout, port, "localhost");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Waits for an HTTP proxy on the specified port to be ready.
|
* Waits for an HTTP proxy on the specified port to be ready.
|
||||||
* Returns false on timeout of the specified number of seconds.
|
* Returns false on timeout of the specified number of seconds.
|
||||||
@ -417,13 +511,11 @@ public class I2PCommonBrowser {
|
|||||||
* @since 0.0.1
|
* @since 0.0.1
|
||||||
*/
|
*/
|
||||||
public boolean waitForProxy(int timeout, int port, String host) {
|
public boolean waitForProxy(int timeout, int port, String host) {
|
||||||
logger.info("waiting up to " + timeout + "seconds for a proxy");
|
|
||||||
if (timeout <= 0) {
|
if (timeout <= 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < timeout; i++) {
|
for (int i = 0; i < timeout; i++) {
|
||||||
logger.info("Waiting for proxy");
|
if (isPortOccupied(port, host)) {
|
||||||
if (checkifPortIsOccupied(port, host)) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
@ -434,15 +526,23 @@ public class I2PCommonBrowser {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
public boolean checkifPortIsOccupied(int port, String host) {
|
|
||||||
|
/**
|
||||||
|
* Determines if a given port on a specified host is occupied.
|
||||||
|
*
|
||||||
|
* @param port the port number to check
|
||||||
|
* @param host the host address to check
|
||||||
|
* @return true if the port is occupied, false otherwise
|
||||||
|
*/
|
||||||
|
public boolean isPortOccupied(int port, String host) {
|
||||||
try {
|
try {
|
||||||
Socket socket = new Socket(host, port);
|
new Socket(host, port).close();
|
||||||
socket.close();
|
|
||||||
return true;
|
return true;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Alters the proxy timeout to customized value time, in seconds.
|
* Alters the proxy timeout to customized value time, in seconds.
|
||||||
* May be zero.
|
* May be zero.
|
||||||
@ -452,36 +552,50 @@ public class I2PCommonBrowser {
|
|||||||
public void setProxyTimeoutTime(int time) { CONFIGURED_TIMEOUT = time; }
|
public void setProxyTimeoutTime(int time) { CONFIGURED_TIMEOUT = time; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Joins the elements of the given string array into a single string.
|
||||||
*
|
*
|
||||||
|
* @param arr the string array to be joined
|
||||||
|
* @return the joined string
|
||||||
*/
|
*/
|
||||||
protected String join(String[] arr) {
|
protected String join(String[] arr) {
|
||||||
StringBuilder val = new StringBuilder("");
|
StringBuilder result = new StringBuilder();
|
||||||
for (int x = 0; x < arr.length; x++) {
|
for (String item : arr) {
|
||||||
val.append(" \"");
|
result.append(" \"").append(item).append("\"");
|
||||||
val.append(arr[x]);
|
|
||||||
val.append("\"");
|
|
||||||
}
|
}
|
||||||
return val.toString();
|
return result.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sleeps for a specified number of milliseconds.
|
||||||
|
*
|
||||||
|
* @param millis the number of milliseconds to sleep
|
||||||
|
*/
|
||||||
public void sleep(int millis) {
|
public void sleep(int millis) {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(millis);
|
Thread.sleep(millis);
|
||||||
} catch (InterruptedException bad) {
|
} catch (InterruptedException e) {
|
||||||
bad.printStackTrace();
|
throw new RuntimeException(e);
|
||||||
throw new RuntimeException(bad);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public File searchFile(File file, String search) {
|
|
||||||
if (file.isDirectory()) {
|
/**
|
||||||
File[] arr = file.listFiles();
|
* Searches for a file in a given directory and its subdirectories.
|
||||||
for (File f : arr) {
|
*
|
||||||
File found = searchFile(f, search);
|
* @param directory the directory to search in
|
||||||
if (found != null)
|
* @param search the name of the file to search for
|
||||||
return found;
|
* @return the found file or null if not found
|
||||||
|
*/
|
||||||
|
public File searchFile(File directory, String search) {
|
||||||
|
if (directory.isDirectory()) {
|
||||||
|
File[] files = directory.listFiles();
|
||||||
|
for (File file : files) {
|
||||||
|
File foundFile = searchFile(file, search);
|
||||||
|
if (foundFile != null)
|
||||||
|
return foundFile;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (file.getName().equals(search)) {
|
if (directory.getName().equals(search)) {
|
||||||
return file;
|
return directory;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -30,6 +30,7 @@ import java.util.stream.Stream;
|
|||||||
public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
||||||
private final String[] FIREFOX_SEARCH_PATHS = FIREFOX_FINDER();
|
private final String[] FIREFOX_SEARCH_PATHS = FIREFOX_FINDER();
|
||||||
private Process process = null;
|
private Process process = null;
|
||||||
|
private String firefoxPath;
|
||||||
public boolean usability = false;
|
public boolean usability = false;
|
||||||
|
|
||||||
private String baseMode() {
|
private String baseMode() {
|
||||||
@ -58,34 +59,34 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
|||||||
public void storeFirefoxDefaults() {
|
public void storeFirefoxDefaults() {
|
||||||
List<String> list = new ArrayList<String>();
|
List<String> list = new ArrayList<String>();
|
||||||
list = Arrays.asList(firefoxPathsWindows());
|
list = Arrays.asList(firefoxPathsWindows());
|
||||||
prop.setProperty("firefox.paths.windows",
|
getProperties().setProperty("firefox.paths.windows",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
list = Arrays.asList(firefoxPathsUnix());
|
list = Arrays.asList(firefoxPathsUnix());
|
||||||
prop.setProperty("firefox.paths.linux",
|
getProperties().setProperty("firefox.paths.linux",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
list = Arrays.asList(firefoxPathsOSX());
|
list = Arrays.asList(firefoxPathsOSX());
|
||||||
prop.setProperty("firefox.paths.osx",
|
getProperties().setProperty("firefox.paths.osx",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
|
|
||||||
list = Arrays.asList(firefoxBinsWindows());
|
list = Arrays.asList(firefoxBinsWindows());
|
||||||
prop.setProperty("firefox.bins.windows",
|
getProperties().setProperty("firefox.bins.windows",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
list = Arrays.asList(firefoxBinsUnix());
|
list = Arrays.asList(firefoxBinsUnix());
|
||||||
prop.setProperty("firefox.bins.linux",
|
getProperties().setProperty("firefox.bins.linux",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
list = Arrays.asList(firefoxBinsUnix());
|
list = Arrays.asList(firefoxBinsUnix());
|
||||||
prop.setProperty("firefox.bins.osx",
|
getProperties().setProperty("firefox.bins.osx",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
try (OutputStream fos = new FileOutputStream(
|
try (OutputStream fos = new FileOutputStream(
|
||||||
new File(runtimeDirectory(""), "browser.config"))) {
|
new File(runtimeDirectory(""), "browser.config"))) {
|
||||||
prop.store(fos, "Firefox Configuration Section");
|
getProperties().store(fos, "Firefox Configuration Section");
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
logger.warning(ioe.toString());
|
logger.warning(ioe.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String[] firefoxPathsUnix() {
|
public String[] firefoxPathsUnix() {
|
||||||
String firefoxPathsProp = prop.getProperty("firefox.paths.unix");
|
String firefoxPathsProp = getProperties().getProperty("firefox.paths.unix");
|
||||||
if (firefoxPathsProp != null)
|
if (firefoxPathsProp != null)
|
||||||
if (!firefoxPathsProp.equals(""))
|
if (!firefoxPathsProp.equals(""))
|
||||||
return firefoxPathsProp.split(",");
|
return firefoxPathsProp.split(",");
|
||||||
@ -96,12 +97,12 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
|||||||
public String[] firefoxBinsUnix() {
|
public String[] firefoxBinsUnix() {
|
||||||
String firefoxPathsProp;
|
String firefoxPathsProp;
|
||||||
if (isOSX()) {
|
if (isOSX()) {
|
||||||
firefoxPathsProp = prop.getProperty("firefox.bins.osx");
|
firefoxPathsProp = getProperties().getProperty("firefox.bins.osx");
|
||||||
if (firefoxPathsProp != null)
|
if (firefoxPathsProp != null)
|
||||||
if (!firefoxPathsProp.equals(""))
|
if (!firefoxPathsProp.equals(""))
|
||||||
return firefoxPathsProp.split(",");
|
return firefoxPathsProp.split(",");
|
||||||
}
|
}
|
||||||
firefoxPathsProp = prop.getProperty("firefox.bins.unix");
|
firefoxPathsProp = getProperties().getProperty("firefox.bins.unix");
|
||||||
if (firefoxPathsProp != null)
|
if (firefoxPathsProp != null)
|
||||||
if (!firefoxPathsProp.equals(""))
|
if (!firefoxPathsProp.equals(""))
|
||||||
return firefoxPathsProp.split(",");
|
return firefoxPathsProp.split(",");
|
||||||
@ -124,7 +125,7 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
|||||||
return exePath;
|
return exePath;
|
||||||
}
|
}
|
||||||
public String[] firefoxPathsOSX() {
|
public String[] firefoxPathsOSX() {
|
||||||
String firefoxPathsProp = prop.getProperty("firefox.paths.osx");
|
String firefoxPathsProp = getProperties().getProperty("firefox.paths.osx");
|
||||||
if (firefoxPathsProp != null)
|
if (firefoxPathsProp != null)
|
||||||
if (!firefoxPathsProp.equals(""))
|
if (!firefoxPathsProp.equals(""))
|
||||||
return firefoxPathsProp.split(",");
|
return firefoxPathsProp.split(",");
|
||||||
@ -147,7 +148,8 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
|||||||
return exePath;
|
return exePath;
|
||||||
}
|
}
|
||||||
public String[] firefoxPathsWindows() {
|
public String[] firefoxPathsWindows() {
|
||||||
String firefoxPathsProp = prop.getProperty("firefox.paths.windows");
|
String firefoxPathsProp =
|
||||||
|
getProperties().getProperty("firefox.paths.windows");
|
||||||
if (firefoxPathsProp != null)
|
if (firefoxPathsProp != null)
|
||||||
if (!firefoxPathsProp.equals(""))
|
if (!firefoxPathsProp.equals(""))
|
||||||
return firefoxPathsProp.split(",");
|
return firefoxPathsProp.split(",");
|
||||||
@ -180,7 +182,8 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
private String[] firefoxBinsWindows() {
|
private String[] firefoxBinsWindows() {
|
||||||
String firefoxPathsProp = prop.getProperty("firefox.bins.windows");
|
String firefoxPathsProp =
|
||||||
|
getProperties().getProperty("firefox.bins.windows");
|
||||||
if (firefoxPathsProp != null)
|
if (firefoxPathsProp != null)
|
||||||
if (!firefoxPathsProp.equals(""))
|
if (!firefoxPathsProp.equals(""))
|
||||||
return firefoxPathsProp.split(",");
|
return firefoxPathsProp.split(",");
|
||||||
@ -377,6 +380,9 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
|||||||
* @since 0.0.1
|
* @since 0.0.1
|
||||||
*/
|
*/
|
||||||
public String topFirefox() {
|
public String topFirefox() {
|
||||||
|
if (firefoxPath != null) {
|
||||||
|
return firefoxPath;
|
||||||
|
}
|
||||||
// get the FIREFOX environment variable
|
// get the FIREFOX environment variable
|
||||||
String firefox = System.getenv("FIREFOX");
|
String firefox = System.getenv("FIREFOX");
|
||||||
// if it is not null and not empty
|
// if it is not null and not empty
|
||||||
@ -385,11 +391,13 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
|||||||
File firefoxFile = new File(firefox);
|
File firefoxFile = new File(firefox);
|
||||||
if (firefoxFile.exists()) {
|
if (firefoxFile.exists()) {
|
||||||
// if it does, return it
|
// if it does, return it
|
||||||
|
firefoxPath = firefox;
|
||||||
return firefox;
|
return firefox;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
String[] firefoxes = onlyValidFirefoxes();
|
String[] firefoxes = onlyValidFirefoxes();
|
||||||
if (firefoxes.length > 0) {
|
if (firefoxes.length > 0) {
|
||||||
|
firefoxPath = firefoxes[0];
|
||||||
return firefoxes[0];
|
return firefoxes[0];
|
||||||
} else {
|
} else {
|
||||||
return "";
|
return "";
|
||||||
@ -692,7 +700,7 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
|||||||
return launchAndDetatch(privateWindowInt, url);
|
return launchAndDetatch(privateWindowInt, url);
|
||||||
}
|
}
|
||||||
public Process launchAndDetatch(int privateWindow, String[] url) {
|
public Process launchAndDetatch(int privateWindow, String[] url) {
|
||||||
validateUserDir();
|
validateUserDirectory();
|
||||||
boolean app = false;
|
boolean app = false;
|
||||||
if (privateWindow == 2)
|
if (privateWindow == 2)
|
||||||
app = true;
|
app = true;
|
||||||
@ -827,6 +835,25 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
|||||||
*/
|
*/
|
||||||
public void launch() { launch(false); }
|
public void launch() { launch(false); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop all running processes managed by the browser manager.
|
||||||
|
*
|
||||||
|
* @return true if successful, false if not
|
||||||
|
*/
|
||||||
|
public boolean stop() {
|
||||||
|
if (process != null) {
|
||||||
|
process.destroy();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean running() {
|
||||||
|
if (process != null)
|
||||||
|
return process.isAlive();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private String ValidURL(String inUrl) {
|
private String ValidURL(String inUrl) {
|
||||||
String[] schemes = {"http", "https"};
|
String[] schemes = {"http", "https"};
|
||||||
for (String scheme : schemes) {
|
for (String scheme : schemes) {
|
||||||
@ -841,7 +868,7 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
|
|||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
int privateBrowsing = 0;
|
int privateBrowsing = 0;
|
||||||
I2PFirefox i2pFirefox = new I2PFirefox();
|
I2PFirefox i2pFirefox = new I2PFirefox();
|
||||||
i2pFirefox.validateUserDir();
|
i2pFirefox.validateUserDirectory();
|
||||||
i2pFirefox.logger.info("checking for private browsing");
|
i2pFirefox.logger.info("checking for private browsing");
|
||||||
i2pFirefox.logger.info("I2PFirefox");
|
i2pFirefox.logger.info("I2PFirefox");
|
||||||
ArrayList<String> visitURL = new ArrayList<String>();
|
ArrayList<String> visitURL = new ArrayList<String>();
|
||||||
|
@ -27,21 +27,24 @@ import java.util.Scanner;
|
|||||||
public class I2PFirefoxProfileChecker extends I2PCommonBrowser {
|
public class I2PFirefoxProfileChecker extends I2PCommonBrowser {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param args unused
|
* The main method for executing the Java program.
|
||||||
|
*
|
||||||
|
* @param args the command line arguments
|
||||||
*/
|
*/
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
I2PFirefoxProfileChecker pc = new I2PFirefoxProfileChecker();
|
I2PFirefoxProfileChecker profileChecker = new I2PFirefoxProfileChecker();
|
||||||
String profileDirectory = pc.profileDirectory(false, "base");
|
String profileDirectory = profileChecker.profileDirectory(false, "base");
|
||||||
if (profileDirectory == null) {
|
if (profileDirectory == null) {
|
||||||
pc.logger.info("No profile directory found");
|
profileChecker.logger.info("No profile directory found");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pc.logger.info("Profile directory: " + profileDirectory);
|
profileChecker.logger.info("Profile directory: " + profileDirectory);
|
||||||
boolean ok = pc.validateProfileDirectory(profileDirectory);
|
boolean isProfileValid =
|
||||||
if (ok) {
|
profileChecker.validateProfileDirectory(profileDirectory);
|
||||||
pc.logger.info("Profile directory is valid");
|
if (isProfileValid) {
|
||||||
|
profileChecker.logger.info("Profile directory is valid");
|
||||||
} else {
|
} else {
|
||||||
pc.logger.info("Profile directory is invalid");
|
profileChecker.logger.info("Profile directory is invalid");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,80 +66,78 @@ public class I2PFirefoxProfileChecker extends I2PCommonBrowser {
|
|||||||
*/
|
*/
|
||||||
public boolean validateProfileDirectory(String profileDirectory) {
|
public boolean validateProfileDirectory(String profileDirectory) {
|
||||||
File profileDir = new File(profileDirectory);
|
File profileDir = new File(profileDirectory);
|
||||||
if (!profileDir.exists()) {
|
if (!profileDir.exists() || !profileDir.isDirectory() ||
|
||||||
logger.info("Profile directory does not exist");
|
!profileDir.canRead() || !profileDir.canWrite()) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!profileDir.isDirectory()) {
|
|
||||||
logger.info("Profile directory is not a directory");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!profileDir.canRead()) {
|
|
||||||
logger.info("Profile directory is not readable");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!profileDir.canWrite()) {
|
|
||||||
logger.info("Profile directory is not writable");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!validateFile(profileDir + "/prefs.js")) {
|
if (!validateFile(profileDir + "/prefs.js")) {
|
||||||
logger.info("prefs.js is not valid");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!validateFile(profileDir + "/user.js")) {
|
if (!validateFile(profileDir + "/user.js")) {
|
||||||
logger.info("user.js is not valid");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!validateExtensionDirectory(profileDir + "/extensions")) {
|
if (!validateExtensionDirectory(profileDir + "/extensions")) {
|
||||||
logger.info("extensions directory is invalid");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return deRestrictHTTPSAndSetupHomepage(profileDir.toString());
|
return deRestrictHTTPSAndSetupHomepage(profileDir.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify essential values in prefs.js, user.js, and user-overrides.js
|
||||||
|
*
|
||||||
|
* @param profile profile
|
||||||
|
* @return true if successful
|
||||||
|
*/
|
||||||
private boolean deRestrictHTTPSAndSetupHomepage(String profile) {
|
private boolean deRestrictHTTPSAndSetupHomepage(String profile) {
|
||||||
// String profile = profileDirectory();
|
|
||||||
File profileDir = new File(profile);
|
File profileDir = new File(profile);
|
||||||
if (profileDir.exists()) {
|
if (profileDir.exists()) {
|
||||||
File prefOverrides = new File(profile, "prefs.js");
|
cleanUpFile(new File(profile, "prefs.js"));
|
||||||
if (prefOverrides.exists()) {
|
cleanUpFile(new File(profile, "user.js"));
|
||||||
undoHttpsOnlyMode(prefOverrides);
|
cleanUpFile(new File(profile, "user-overrides.js"));
|
||||||
undoHomepage(prefOverrides);
|
return true;
|
||||||
}
|
|
||||||
File userSettings = new File(profile, "user.js");
|
|
||||||
if (userSettings.exists()) {
|
|
||||||
undoHttpsOnlyMode(userSettings);
|
|
||||||
undoHomepage(userSettings);
|
|
||||||
}
|
|
||||||
File userOverrides = new File(profile, "user-overrides.js");
|
|
||||||
if (userOverrides.exists()) {
|
|
||||||
undoHttpsOnlyMode(userOverrides);
|
|
||||||
undoHomepage(userOverrides);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleans up a file by undoing specific modifications if the file exists.
|
||||||
|
*
|
||||||
|
* @param file the file to be cleaned up
|
||||||
|
*/
|
||||||
|
private void cleanUpFile(File file) {
|
||||||
|
if (file.exists()) {
|
||||||
|
undoHttpsOnlyMode(file);
|
||||||
|
undoHomepage(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undo the HTTPS-only mode by modifying a file.
|
||||||
|
*
|
||||||
|
* @param fileToBeModified the file to be modified
|
||||||
|
* @return true if the undo operation is successful, false otherwise
|
||||||
|
*/
|
||||||
private boolean undoHttpsOnlyMode(File fileToBeModified) {
|
private boolean undoHttpsOnlyMode(File fileToBeModified) {
|
||||||
String oldString = "\"dom.security.https_only_mode\", true";
|
String oldString = "\"dom.security.https_only_mode\", true";
|
||||||
String newString = "\"dom.security.https_only_mode\", false";
|
String newString = "\"dom.security.https_only_mode\", false";
|
||||||
return undoValue(oldString, newString, fileToBeModified);
|
return undoValue(oldString, newString, fileToBeModified);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undo the modification of the homepage in a file.
|
||||||
|
*
|
||||||
|
* @param fileToBeModified the file to be modified
|
||||||
|
* @return true if the modification was successful, otherwise false
|
||||||
|
*/
|
||||||
private boolean undoHomepage(File fileToBeModified) {
|
private boolean undoHomepage(File fileToBeModified) {
|
||||||
String oldString = "\"browser.startup.homepage\", true";
|
String oldStringToFind = "\"browser.startup.homepage\", true";
|
||||||
File file = new File("Student.txt");
|
String newStringToReplace =
|
||||||
String newString =
|
|
||||||
"\"browser.startup.homepage\", \"http://127.0.0.1:7657\"";
|
"\"browser.startup.homepage\", \"http://127.0.0.1:7657\"";
|
||||||
try {
|
try (Scanner scanner = new Scanner(fileToBeModified)) {
|
||||||
try (Scanner scanner = new Scanner(file)) {
|
|
||||||
// now read the file line by line...
|
|
||||||
while (scanner.hasNextLine()) {
|
while (scanner.hasNextLine()) {
|
||||||
String line = scanner.nextLine();
|
String line = scanner.nextLine();
|
||||||
if (line.contains("browser.startup.homepage")) {
|
if (line.contains(oldStringToFind)) {
|
||||||
oldString = line.toString();
|
return undoValue(line, newStringToReplace, fileToBeModified);
|
||||||
return undoValue(oldString, newString, fileToBeModified);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
@ -145,6 +146,15 @@ public class I2PFirefoxProfileChecker extends I2PCommonBrowser {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undo the value by replacing the occurrences of the old string with the new
|
||||||
|
* string in the given file.
|
||||||
|
*
|
||||||
|
* @param oldString the string to be replaced
|
||||||
|
* @param newString the string to replace the old string with
|
||||||
|
* @param fileToBeModified the file to be modified
|
||||||
|
* @return true if the value was successfully undone, false otherwise
|
||||||
|
*/
|
||||||
public boolean undoValue(String oldString, String newString,
|
public boolean undoValue(String oldString, String newString,
|
||||||
File fileToBeModified) {
|
File fileToBeModified) {
|
||||||
String oldContent = "";
|
String oldContent = "";
|
||||||
@ -173,58 +183,38 @@ public class I2PFirefoxProfileChecker extends I2PCommonBrowser {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if the file is valid.
|
* Return true if the file is valid.
|
||||||
*
|
*
|
||||||
* @param file the file to check
|
* @param filePath the path of the file to check
|
||||||
* @return true if the file is valid, false otherwise
|
* @return true if the file is valid, false otherwise
|
||||||
* @since 0.0.1
|
* @since 0.0.1
|
||||||
*/
|
*/
|
||||||
public boolean validateFile(String file) {
|
public boolean validateFile(String filePath) {
|
||||||
File f = new File(file);
|
File file = new File(filePath);
|
||||||
if (!f.exists()) {
|
if (!file.exists() || !file.isFile() || !file.canRead() ||
|
||||||
logger.info("User JavaScript file does not exist");
|
!file.canWrite()) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!f.isFile()) {
|
|
||||||
logger.info("User JavaScript file is not a file");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!f.canRead()) {
|
|
||||||
logger.info("User JavaScript file is not readable");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!f.canWrite()) {
|
|
||||||
logger.info("User JavaScript file is not writable");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if the extension directory is valid.
|
* Validates the extension directory.
|
||||||
*
|
*
|
||||||
* @param extensionDirectory the extension directory to check
|
* @param extensionDirectory the extension directory to validate
|
||||||
* @return true if the extension directory is valid, false otherwise
|
* @return true if the extension directory is valid, false otherwise
|
||||||
* @since 0.0.1
|
* @since 0.0.1
|
||||||
*/
|
*/
|
||||||
public boolean validateExtensionDirectory(String extensionDirectory) {
|
public boolean validateExtensionDirectory(String extensionDirectory) {
|
||||||
File extensionDir = new File(extensionDirectory);
|
File extensionDir = new File(extensionDirectory);
|
||||||
if (!extensionDir.exists()) {
|
|
||||||
logger.info("Extension directory does not exist");
|
if (!extensionDir.exists() || !extensionDir.isDirectory() ||
|
||||||
return false;
|
!extensionDir.canRead() || !extensionDir.canWrite()) {
|
||||||
}
|
|
||||||
if (!extensionDir.isDirectory()) {
|
|
||||||
logger.info("Extension directory is not a directory");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!extensionDir.canRead()) {
|
|
||||||
logger.info("Extension directory is not readable");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!extensionDir.canWrite()) {
|
|
||||||
logger.info("Extension directory is not writable");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ public class I2PGenericUnsafeBrowser extends I2PCommonBrowser {
|
|||||||
// For now, we're just assuming. So don't use this until I understand the
|
// For now, we're just assuming. So don't use this until I understand the
|
||||||
// situation better, unless you think you know better.
|
// situation better, unless you think you know better.
|
||||||
private String[] browsers() {
|
private String[] browsers() {
|
||||||
String genericPathsProp = prop.getProperty("generic.bins.unix");
|
String genericPathsProp = getProperties().getProperty("generic.bins.unix");
|
||||||
if (genericPathsProp != null)
|
if (genericPathsProp != null)
|
||||||
return genericPathsProp.split(",");
|
return genericPathsProp.split(",");
|
||||||
return new String[] {
|
return new String[] {
|
||||||
@ -66,11 +66,11 @@ public class I2PGenericUnsafeBrowser extends I2PCommonBrowser {
|
|||||||
List<String> list = new ArrayList<String>();
|
List<String> list = new ArrayList<String>();
|
||||||
|
|
||||||
list = Arrays.asList(browsers());
|
list = Arrays.asList(browsers());
|
||||||
prop.setProperty("generic.bins.unix",
|
getProperties().setProperty("generic.bins.unix",
|
||||||
list.stream().collect(Collectors.joining(",")));
|
list.stream().collect(Collectors.joining(",")));
|
||||||
try (OutputStream fos = new FileOutputStream(
|
try (OutputStream fos = new FileOutputStream(
|
||||||
new File(runtimeDirectory(""), "browser.config"))) {
|
new File(runtimeDirectory(""), "browser.config"))) {
|
||||||
prop.store(fos, "Chromium Configuration Section");
|
getProperties().store(fos, "Chromium Configuration Section");
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
logger.warning(ioe.toString());
|
logger.warning(ioe.toString());
|
||||||
}
|
}
|
||||||
@ -366,7 +366,7 @@ public class I2PGenericUnsafeBrowser extends I2PCommonBrowser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Process launchAndDetatch(boolean privateWindow, String[] url) {
|
public Process launchAndDetatch(boolean privateWindow, String[] url) {
|
||||||
validateUserDir();
|
validateUserDirectory();
|
||||||
if (waitForProxy()) {
|
if (waitForProxy()) {
|
||||||
ProcessBuilder pb;
|
ProcessBuilder pb;
|
||||||
if (privateWindow) {
|
if (privateWindow) {
|
||||||
@ -404,6 +404,24 @@ public class I2PGenericUnsafeBrowser extends I2PCommonBrowser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Stop all running processes managed by the browser manager.
|
||||||
|
*
|
||||||
|
* @return true if successful, false if not
|
||||||
|
*/
|
||||||
|
public boolean stop() {
|
||||||
|
if (p != null) {
|
||||||
|
p.destroy();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean running() {
|
||||||
|
if (p != null)
|
||||||
|
return p.isAlive();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private String ValidURL(String inUrl) {
|
private String ValidURL(String inUrl) {
|
||||||
String[] schemes = {"http", "https"};
|
String[] schemes = {"http", "https"};
|
||||||
@ -418,7 +436,7 @@ public class I2PGenericUnsafeBrowser extends I2PCommonBrowser {
|
|||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
I2PGenericUnsafeBrowser i2pBrowser = new I2PGenericUnsafeBrowser();
|
I2PGenericUnsafeBrowser i2pBrowser = new I2PGenericUnsafeBrowser();
|
||||||
i2pBrowser.validateUserDir();
|
i2pBrowser.validateUserDirectory();
|
||||||
boolean privateBrowsing = false;
|
boolean privateBrowsing = false;
|
||||||
i2pBrowser.logger.info("checking for private browsing");
|
i2pBrowser.logger.info("checking for private browsing");
|
||||||
ArrayList<String> visitURL = new ArrayList<String>();
|
ArrayList<String> visitURL = new ArrayList<String>();
|
||||||
|
@ -20,6 +20,5 @@ import javax.script.*;
|
|||||||
* @since 1.0.6
|
* @since 1.0.6
|
||||||
*/
|
*/
|
||||||
public class I2PLibreWolf {
|
public class I2PLibreWolf {
|
||||||
private static final ScriptEngineManager sem = new ScriptEngineManager();
|
// TODO: provide a librewolf updater here.
|
||||||
private final ScriptEngine ee = sem.getEngineByName("Nashorn");
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,263 @@
|
|||||||
|
package net.i2p.i2pfirefox.plugin;
|
||||||
|
|
||||||
|
import java.awt.GraphicsEnvironment;
|
||||||
|
import java.io.File;
|
||||||
|
import net.i2p.I2PAppContext;
|
||||||
|
import net.i2p.app.ClientApp;
|
||||||
|
import net.i2p.app.ClientAppManager;
|
||||||
|
import net.i2p.app.ClientAppState;
|
||||||
|
import net.i2p.app.MenuCallback;
|
||||||
|
import net.i2p.app.MenuHandle;
|
||||||
|
import net.i2p.app.MenuService;
|
||||||
|
import net.i2p.desktopgui.ExternalMain;
|
||||||
|
import net.i2p.i2pfirefox.I2PBrowser;
|
||||||
|
import net.i2p.i2pfirefox.I2PFirefox;
|
||||||
|
import net.i2p.util.I2PAppThread;
|
||||||
|
import net.i2p.util.Log;
|
||||||
|
import net.i2p.util.SystemVersion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* I2PBrowserPlugin.java
|
||||||
|
* Copyright (C) 2022 idk <hankhill19580@gmail.com>
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the MIT License. See LICENSE.md for details.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* @description I2PBrowser is a class that is used to open a browser window to
|
||||||
|
* the I2P network. It automatically detects the operating system and available
|
||||||
|
* browsers, and selects the best one to use, with Tor Browser at the top for
|
||||||
|
* Firefox and Brave at the top for Chrome.
|
||||||
|
*
|
||||||
|
* @author idk
|
||||||
|
* @since 0.0.16
|
||||||
|
*/
|
||||||
|
public class I2PBrowserPlugin extends I2PBrowser implements ClientApp {
|
||||||
|
private final I2PAppContext _context;
|
||||||
|
private final Log _log;
|
||||||
|
private final ClientAppManager _mgr;
|
||||||
|
private final String _args[];
|
||||||
|
private static final String PROP_DTG_ENABLED = "desktopgui.enabled";
|
||||||
|
private final File pluginDir;
|
||||||
|
private final File profileDir;
|
||||||
|
private MenuHandle lmhs;
|
||||||
|
private MenuHandle lmhf;
|
||||||
|
/**
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public I2PBrowserPlugin() {
|
||||||
|
_context = new I2PAppContext();
|
||||||
|
_mgr = null;
|
||||||
|
_args = new String[] {};
|
||||||
|
_log = _context.logManager().getLog(I2PBrowserPlugin.class);
|
||||||
|
pluginDir = new File(_context.getAppDir(), "plugins/i2pfirefox/");
|
||||||
|
profileDir = new File(pluginDir, "profile/");
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public I2PBrowserPlugin(I2PAppContext ctx, ClientAppManager mgr,
|
||||||
|
String args[]) {
|
||||||
|
_context = ctx;
|
||||||
|
_mgr = mgr;
|
||||||
|
_args = args;
|
||||||
|
_log = ctx.logManager().getLog(I2PBrowserPlugin.class);
|
||||||
|
pluginDir = new File(_context.getAppDir(), "plugins/i2pfirefox/");
|
||||||
|
profileDir = new File(pluginDir, "profile/");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getDisplayName() { return "I2P Browser"; }
|
||||||
|
/**
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getName() { return "I2P Browser"; }
|
||||||
|
/**
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public ClientAppState getState() { return ClientAppState.STOPPED; }
|
||||||
|
/**
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public void shutdown(String[] args) {
|
||||||
|
if (!isSystrayEnabled()) {
|
||||||
|
_log.info("I2P Browser tray manager not supported");
|
||||||
|
} else {
|
||||||
|
_log.info("I2P Browser tray manager shutting down");
|
||||||
|
MenuService dtg = startTrayApp();
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
}
|
||||||
|
if (dtg != null) {
|
||||||
|
dtg.removeMenu(lmhs);
|
||||||
|
dtg.removeMenu(lmhf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
changeState(ClientAppState.STOPPED);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public void startup() {
|
||||||
|
changeState(ClientAppState.STOPPED);
|
||||||
|
if (!isSystrayEnabled()) {
|
||||||
|
_log.info("I2P Browser tray manager not supported");
|
||||||
|
try {
|
||||||
|
I2PBrowser i2pBrowser = new I2PBrowser(profileDir.getAbsolutePath());
|
||||||
|
String[] args = {"http://proxy.i2p"};
|
||||||
|
i2pBrowser.launchFirefox(0, args);
|
||||||
|
} catch (Exception e) {
|
||||||
|
_log.error("Error starting I2P Browser", e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
_log.info(
|
||||||
|
"Starting I2P Browser tray manager by testing http://proxy.i2p");
|
||||||
|
MenuService dtg = startTrayApp();
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
}
|
||||||
|
if (dtg != null) {
|
||||||
|
_log.info("I2P Browser integrating with I2P tray manager");
|
||||||
|
lmhs =
|
||||||
|
dtg.addMenu("Launch I2P Browser (Safe Mode)", new Starter(dtg));
|
||||||
|
dtg.showMenu(lmhs);
|
||||||
|
dtg.enableMenu(lmhs);
|
||||||
|
lmhf = dtg.addMenu("Launch I2P Browser (Flexible Mode)",
|
||||||
|
new FlexStarter(dtg));
|
||||||
|
dtg.showMenu(lmhf);
|
||||||
|
dtg.enableMenu(lmhf);
|
||||||
|
} else {
|
||||||
|
_log.info("I2P Browser tray manager not found");
|
||||||
|
}
|
||||||
|
I2PBrowser i2pBrowser = new I2PBrowser(profileDir.getAbsolutePath());
|
||||||
|
String[] args = {"http://proxy.i2p"};
|
||||||
|
i2pBrowser.launchFirefox(0, args);
|
||||||
|
} catch (Exception e) {
|
||||||
|
_log.error("Error starting I2P Browser tray manager", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copied directly from I2PSnark-standalone
|
||||||
|
/**
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private MenuService startTrayApp() {
|
||||||
|
try {
|
||||||
|
if (isSystrayEnabled()) {
|
||||||
|
System.setProperty("java.awt.headless", "false");
|
||||||
|
ExternalMain dtg =
|
||||||
|
new ExternalMain(_context, _context.clientAppManager(), null);
|
||||||
|
dtg.startup();
|
||||||
|
return dtg;
|
||||||
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copied directly from I2PSnark-standalone where it is used to determine
|
||||||
|
// whether to launchFirefox the tray app Our environment should basically
|
||||||
|
// never be headless, that doesn't make any sense, but something tells me I
|
||||||
|
// should leave that check in.
|
||||||
|
/**
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private boolean isSystrayEnabled() {
|
||||||
|
if (GraphicsEnvironment.isHeadless())
|
||||||
|
return false;
|
||||||
|
// default false except on OSX and Windows,
|
||||||
|
// and on Linux KDE and LXDE.
|
||||||
|
// Xubuntu XFCE works but doesn't look very good
|
||||||
|
// Ubuntu Unity was far too buggy to enable
|
||||||
|
// Ubuntu GNOME does not work, SystemTray.isSupported() returns false
|
||||||
|
String xdg = System.getenv("XDG_CURRENT_DESKTOP");
|
||||||
|
boolean dflt = SystemVersion.isWindows() || SystemVersion.isMac() ||
|
||||||
|
//"XFCE".equals(xdg) ||
|
||||||
|
"KDE".equals(xdg) || "LXDE".equals(xdg);
|
||||||
|
return _context.getProperty(PROP_DTG_ENABLED, dflt);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback when Start I2PBrowser is clicked in systray
|
||||||
|
*
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public class Starter implements MenuCallback {
|
||||||
|
private final MenuService _ms;
|
||||||
|
public Starter(MenuService ms) { _ms = ms; }
|
||||||
|
public void clicked(MenuHandle menu) {
|
||||||
|
// Thread t = new I2PAppThread(new StarterThread(),
|
||||||
|
//"I2PBrowser-Launcher start", true);
|
||||||
|
// t.start();
|
||||||
|
_log.info("I2P Browser starting up");
|
||||||
|
try {
|
||||||
|
I2PBrowser i2pBrowser = new I2PBrowser(profileDir.getAbsolutePath());
|
||||||
|
String[] args = {"http://proxy.i2p"};
|
||||||
|
i2pBrowser.launchFirefox(0, args);
|
||||||
|
} catch (Exception e) {
|
||||||
|
_log.error("Error starting I2P Browser", e);
|
||||||
|
}
|
||||||
|
_log.info("I2P Browser ran");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public class FlexStarter implements MenuCallback {
|
||||||
|
private final MenuService _ms;
|
||||||
|
public FlexStarter(MenuService ms) { _ms = ms; }
|
||||||
|
public void clicked(MenuHandle menu) {
|
||||||
|
// Thread t = new I2PAppThread(new StarterThread(),
|
||||||
|
//"I2PBrowser-Launcher start", true);
|
||||||
|
// t.start();
|
||||||
|
_log.info("I2P Browser starting up");
|
||||||
|
try {
|
||||||
|
I2PBrowser i2pBrowser = new I2PBrowser(profileDir.getAbsolutePath());
|
||||||
|
i2pBrowser.usability = true;
|
||||||
|
String[] args = {"http://proxy.i2p"};
|
||||||
|
i2pBrowser.launchFirefox(0, args);
|
||||||
|
} catch (Exception e) {
|
||||||
|
_log.error("Error starting I2P Browser", e);
|
||||||
|
}
|
||||||
|
_log.info("I2P Browser ran");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 1.4.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private synchronized void changeState(ClientAppState state) {
|
||||||
|
if (_mgr != null)
|
||||||
|
_mgr.notify(this, state, null, null);
|
||||||
|
}
|
||||||
|
public static void main(String[] args) {
|
||||||
|
I2PBrowserPlugin plugin = new I2PBrowserPlugin();
|
||||||
|
try {
|
||||||
|
plugin.startup();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -75,8 +75,6 @@ iframe {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
width: 36vw;
|
|
||||||
height: 64vh;
|
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
#! /usr/bin/env sh
|
#! /usr/bin/env sh
|
||||||
|
|
||||||
|
ant distclean
|
||||||
|
ant jar
|
||||||
|
|
||||||
./test/test.sh
|
./test/test.sh
|
||||||
./test/test-chromium.sh
|
./test/test-chromium.sh
|
||||||
./test/test-firefox.sh
|
./test/test-firefox.sh
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#! /usr/bin/env sh
|
#! /usr/bin/env sh
|
||||||
|
|
||||||
ant distclean
|
ant distclean
|
||||||
cd src && ant jar && cd ..
|
ant jar
|
||||||
|
|
||||||
rm -rf i2p.chromium.base.profile i2p.chromium.profile i2p.firefox.base.profile i2p.firefox.profile i2p.firefox.usability.profile tor-browser_en-US
|
rm -rf i2p.chromium.base.profile i2p.chromium.profile i2p.firefox.base.profile i2p.firefox.profile i2p.firefox.usability.profile tor-browser_en-US
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#! /usr/bin/env sh
|
#! /usr/bin/env sh
|
||||||
|
|
||||||
ant distclean
|
ant distclean
|
||||||
cd src && ant jar && cd ..
|
ant jar
|
||||||
|
|
||||||
rm -rf i2p.chromium.base.profile i2p.chromium.profile i2p.firefox.base.profile i2p.firefox.profile i2p.firefox.usability.profile tor-browser_en-US
|
rm -rf i2p.chromium.base.profile i2p.chromium.profile i2p.firefox.base.profile i2p.firefox.profile i2p.firefox.usability.profile tor-browser_en-US
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#! /usr/bin/env sh
|
#! /usr/bin/env sh
|
||||||
|
|
||||||
ant distclean
|
ant distclean
|
||||||
cd src && ant jar && cd ..
|
ant jar
|
||||||
|
|
||||||
rm -rf i2p.chromium.base.profile i2p.chromium.profile i2p.firefox.base.profile i2p.firefox.profile i2p.firefox.usability.profile tor-browser_en-US
|
rm -rf i2p.chromium.base.profile i2p.chromium.profile i2p.firefox.base.profile i2p.firefox.profile i2p.firefox.usability.profile tor-browser_en-US
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#! /usr/bin/env sh
|
#! /usr/bin/env sh
|
||||||
|
|
||||||
ant distclean
|
ant distclean
|
||||||
cd src && ant jar && cd ..
|
ant jar
|
||||||
|
|
||||||
rm -rf i2p.chromium.base.profile i2p.chromium.profile i2p.firefox.base.profile i2p.firefox.profile i2p.firefox.usability.profile
|
rm -rf i2p.chromium.base.profile i2p.chromium.profile i2p.firefox.base.profile i2p.firefox.profile i2p.firefox.usability.profile
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#! /usr/bin/env sh
|
#! /usr/bin/env sh
|
||||||
|
|
||||||
ant distclean
|
ant distclean
|
||||||
cd src && ant jar && cd ..
|
ant jar
|
||||||
|
|
||||||
echo "Testing UNSAFE auto-selector with no private and no URL parameters."
|
echo "Testing UNSAFE auto-selector with no private and no URL parameters."
|
||||||
java -cp ./src/build/i2pfirefox.jar net.i2p.i2pfirefox.I2PGenericUnsafeBrowser 2> gen.0.err 1> gen.0.log
|
java -cp ./src/build/i2pfirefox.jar net.i2p.i2pfirefox.I2PGenericUnsafeBrowser 2> gen.0.err 1> gen.0.log
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#! /usr/bin/env sh
|
#! /usr/bin/env sh
|
||||||
|
|
||||||
ant distclean
|
ant distclean
|
||||||
cd src && ant jar && cd ..
|
ant jar
|
||||||
|
|
||||||
rm -rf i2p.chromium.base.profile i2p.chromium.profile i2p.firefox.base.profile i2p.firefox.profile i2p.firefox.usability.profile tor-browser_en-US
|
rm -rf i2p.chromium.base.profile i2p.chromium.profile i2p.firefox.base.profile i2p.firefox.profile i2p.firefox.usability.profile tor-browser_en-US
|
||||||
|
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
#! /usr/bin/env sh
|
|
||||||
. ./config.sh
|
|
||||||
jpackage \
|
|
||||||
--verbose \
|
|
||||||
--type exe \
|
|
||||||
--win-dir-chooser \
|
|
||||||
--win-help-url "https://geti2p.net" \
|
|
||||||
--win-menu \
|
|
||||||
--win-menu-group "I2P Browser Configurer" \
|
|
||||||
--win-shortcut \
|
|
||||||
--win-shortcut-prompt \
|
|
||||||
--win-per-user-install \
|
|
||||||
--license-file LICENSE.md \
|
|
||||||
--icon src/icon.png \
|
|
||||||
--name i2pbrowser \
|
|
||||||
--app-version "$GITHUB_TAG" \
|
|
||||||
--input src/build \
|
|
||||||
--main-jar i2pfirefox.jar \
|
|
||||||
--main-class net.i2p.i2pfirefox.I2PBrowser
|
|
@ -1,19 +0,0 @@
|
|||||||
#! /usr/bin/env sh
|
|
||||||
. ./config.sh
|
|
||||||
mkdir -p tmp
|
|
||||||
cp -v LICENSE.md tmp/LICENSE.md
|
|
||||||
rm -rf i2pbrowser-portable
|
|
||||||
jpackage \
|
|
||||||
--verbose \
|
|
||||||
--type app-image \
|
|
||||||
--name i2pbrowser-portable \
|
|
||||||
--app-version "$GITHUB_TAG" \
|
|
||||||
--input src/build \
|
|
||||||
--main-jar i2pfirefox.jar \
|
|
||||||
--resource-dir tmp \
|
|
||||||
--icon src/icon.png \
|
|
||||||
--main-class net.i2p.i2pfirefox.I2PBrowser
|
|
||||||
rm -rf tmp
|
|
||||||
cp -v LICENSE.md i2pbrowser-portable/LICENSE.md
|
|
||||||
rm i2pbrowser-portable.zip -f
|
|
||||||
zip -r i2pbrowser-portable-${GITHUB_TAG}.zip i2pbrowser-portable
|
|
@ -4,9 +4,7 @@ git pull --all
|
|||||||
. ./config.sh
|
. ./config.sh
|
||||||
. "${HOME}/github-release-config.sh"
|
. "${HOME}/github-release-config.sh"
|
||||||
ant distclean jar
|
ant distclean jar
|
||||||
./windows.sh
|
ant windows-msi-release
|
||||||
./windows-exe.sh
|
|
||||||
./windows-portable.sh
|
|
||||||
msisum=$(sha256sum "i2pbrowser-${GITHUB_TAG}.msi")
|
msisum=$(sha256sum "i2pbrowser-${GITHUB_TAG}.msi")
|
||||||
github-release upload --user "${GITHUB_USER}" \
|
github-release upload --user "${GITHUB_USER}" \
|
||||||
--repo "${GITHUB_REPO}" \
|
--repo "${GITHUB_REPO}" \
|
||||||
@ -16,6 +14,7 @@ github-release upload --user "${GITHUB_USER}" \
|
|||||||
--file "i2pbrowser-${GITHUB_TAG}.msi" \
|
--file "i2pbrowser-${GITHUB_TAG}.msi" \
|
||||||
--replace
|
--replace
|
||||||
echo "Uploaded MSI package"
|
echo "Uploaded MSI package"
|
||||||
|
ant windows-exe-release
|
||||||
exesum=$(sha256sum "i2pbrowser-${GITHUB_TAG}.exe")
|
exesum=$(sha256sum "i2pbrowser-${GITHUB_TAG}.exe")
|
||||||
github-release upload --user "${GITHUB_USER}" \
|
github-release upload --user "${GITHUB_USER}" \
|
||||||
--repo "${GITHUB_REPO}" \
|
--repo "${GITHUB_REPO}" \
|
||||||
@ -25,6 +24,7 @@ github-release upload --user "${GITHUB_USER}" \
|
|||||||
--file "i2pbrowser-${GITHUB_TAG}.exe" \
|
--file "i2pbrowser-${GITHUB_TAG}.exe" \
|
||||||
--replace
|
--replace
|
||||||
echo "Uploaded EXE package"
|
echo "Uploaded EXE package"
|
||||||
|
ant windows-portable-release
|
||||||
zipsum=$(sha256sum "i2pbrowser-portable-${GITHUB_TAG}.zip")
|
zipsum=$(sha256sum "i2pbrowser-portable-${GITHUB_TAG}.zip")
|
||||||
github-release upload --user "${GITHUB_USER}" \
|
github-release upload --user "${GITHUB_USER}" \
|
||||||
--repo "${GITHUB_REPO}" \
|
--repo "${GITHUB_REPO}" \
|
||||||
|
19
windows.sh
19
windows.sh
@ -1,19 +0,0 @@
|
|||||||
#! /usr/bin/env sh
|
|
||||||
. ./config.sh
|
|
||||||
jpackage \
|
|
||||||
--verbose \
|
|
||||||
--type msi \
|
|
||||||
--win-dir-chooser \
|
|
||||||
--win-help-url "https://geti2p.net" \
|
|
||||||
--win-menu \
|
|
||||||
--win-menu-group "I2P Browser Configurer" \
|
|
||||||
--win-shortcut \
|
|
||||||
--win-shortcut-prompt \
|
|
||||||
--win-per-user-install \
|
|
||||||
--license-file LICENSE.md \
|
|
||||||
--icon src/icon.png \
|
|
||||||
--name i2pbrowser \
|
|
||||||
--app-version "$GITHUB_TAG" \
|
|
||||||
--input src/build \
|
|
||||||
--main-jar i2pfirefox.jar \
|
|
||||||
--main-class net.i2p.i2pfirefox.I2PBrowser
|
|
Reference in New Issue
Block a user