Compare commits

...

92 Commits
1.1.0 ... 1.3.0

Author SHA1 Message Date
de6cdb7b42 Update changelog 2024-03-07 11:30:54 -05:00
fdeb86d356 use about:blank when url list is null 2024-03-07 11:22:28 -05:00
b25cb2c9b3 remove redundant menu item, don't worry about a thread for the Firefox, it doesn't even need to know if it's started, don't force logs into a file where logs don't belong 2024-03-07 11:00:13 -05:00
515e52eeb2 don't bother with update target for now 2024-03-05 18:09:48 -05:00
616a839c8b clang-format again 2024-03-05 18:06:04 -05:00
da5ae47278 cut plugin zip size by 49% 2024-03-05 17:25:02 -05:00
c37df87516 fix plugin jar package upload 2024-03-05 17:10:07 -05:00
980c59d031 separate ant call for plugin 2024-03-05 17:02:42 -05:00
b8b5c45126 no password on unsigned plugin 2024-03-05 16:56:39 -05:00
affc3e5d40 Add plugin zip to CI 2024-03-05 16:32:38 -05:00
f225bbb35e clang-format everything, whitespace-only changes 2024-03-05 16:31:28 -05:00
6ed3aae543 Add plugin zip to CI 2024-03-05 16:29:58 -05:00
aa54248eb8 inform the application about the plugin state 2024-03-04 20:12:14 -05:00
9a5c2bbe42 running state should simply reflect if Firefox is running 2024-03-04 18:32:02 -05:00
fccccfedfa running state should simply reflect if Firefox is running 2024-03-04 18:30:37 -05:00
3b8baa4db4 running state should simply reflect if Firefox is running 2024-03-04 18:26:15 -05:00
31f1483aa7 Fix build.xm; 2024-03-04 17:06:50 -05:00
1157eb666e add main to plugin jar 2024-03-04 16:27:40 -05:00
c300648c22 add main to plugin jar 2024-03-04 16:26:12 -05:00
267047f687 add main to plugin jar 2024-03-04 16:23:35 -05:00
1f6c3348a3 clients.config update 2024-03-04 16:10:07 -05:00
47962f350b clients.config update 2024-03-04 15:46:38 -05:00
625d13d4a3 fix file extensions of jar uploads 2024-03-04 15:42:09 -05:00
61aa5f4b1f build plugin deps in CI 2024-03-04 15:36:33 -05:00
d1d457a0fe add plugin jar to normal build 2024-03-01 21:45:10 -05:00
cac93e0f48 Call stop in StopperThread 2024-03-01 21:38:17 -05:00
e1401ea5d0 Re-create the I2P Plugin 2024-03-01 16:52:37 -05:00
8ce0bd3f12 fix rpm path 2024-02-23 00:52:00 -05:00
3c705909ea fix rpm path 2024-02-23 00:49:28 -05:00
5db2119370 add rpm-build 2024-02-23 00:18:34 -05:00
9f309457e6 switch back to Temurin 2024-02-22 23:25:21 -05:00
1bab795f26 use openjdk from fedora image 2024-02-22 22:52:25 -05:00
012e5d6d5b add xz to fedora image 2024-02-22 22:41:18 -05:00
74f946bbe8 rm torsocks from fedora image 2024-02-22 22:18:30 -05:00
e606cd68bb Add torsocks to fedora image 2024-02-22 21:08:01 -05:00
a833bb30bd Add temurin to fedora image 2024-02-22 21:03:04 -05:00
be5204bf76 Add utils to fedora image 2024-02-22 20:58:26 -05:00
7332ae013d Do a Fedora build too 2024-02-22 20:54:16 -05:00
7a008be8d7 Do a Fedora build too 2024-02-22 20:51:46 -05:00
4101a344a2 start recreating plugin 2024-02-21 00:48:04 -05:00
ff35bc7023 build mac dev builds 2024-02-20 23:57:37 -05:00
1249e78543 Remove redundant old scripts 2024-02-20 22:45:30 -05:00
af1c32ccc1 fix versions 2024-02-20 21:40:24 -05:00
50c2f33f55 don't zip twice 2024-02-20 21:33:30 -05:00
6178b723f5 don't count on poweshell aliases to be there 2024-02-20 21:24:15 -05:00
c71b30d5c1 try zipping in ci script instead of ant 2024-02-20 20:56:14 -05:00
7d66622db2 use powershell to zip windows in CI 2024-02-20 20:32:18 -05:00
fe8616491a attempt portable in CI 2024-02-20 19:30:45 -05:00
240b54d280 attempt portable in CI 2024-02-20 19:20:23 -05:00
903da4bb7a fix upload paths 2024-02-20 19:08:04 -05:00
ab936f08eb move other windows packaging script into ant 2024-02-20 19:04:39 -05:00
61431a027c move windows packaging script into ant 2024-02-20 19:03:26 -05:00
8cca947702 move windows packaging script into ant 2024-02-20 19:02:56 -05:00
ae888b9a06 assure gobin is in path at script level 2024-02-20 18:55:12 -05:00
e9c1d78a75 specify bash for some commands 2024-02-20 18:52:11 -05:00
e930adf49d try windows build 2024-02-20 18:49:40 -05:00
496db4a1f5 build both 2024-02-01 16:14:26 -05:00
4cf2854896 fix deb path 2024-02-01 16:12:13 -05:00
9e3a834f88 fix deb path 2024-02-01 16:11:36 -05:00
8fd2874722 upload deb in CI 2024-02-01 15:49:33 -05:00
83f49f5b12 Remove debian.sh and put it in build.xml instead 2024-02-01 15:44:17 -05:00
b7bb0b3da1 try uploading the portable jpackage in CI 2024-02-01 15:25:12 -05:00
7d10266562 try building the portable jpackage for linux in CI 2024-02-01 15:12:16 -05:00
53a1e0ff0f add chromium and jar artifacts 2024-02-01 15:10:00 -05:00
524896c03f change artifact names 2024-02-01 15:05:36 -05:00
effe91b6f6 upgrade node versions 2024-02-01 15:02:56 -05:00
f0616b82d4 add manifest-json-version 2024-02-01 14:53:38 -05:00
28153cc7a4 specify amo-version hash 2024-02-01 14:49:33 -05:00
069f6fb107 install dzip first since amo-version is most troublesome 2024-02-01 14:46:58 -05:00
6073584af8 force it to re-run with new amo-version 2024-02-01 14:44:50 -05:00
a4ec776107 force it to re-run with new amo-version 2024-02-01 14:36:19 -05:00
3b2c59f38c try and get github to build it 2024-02-01 14:05:08 -05:00
f0d9aad522 try and get github to build it 2024-02-01 13:58:36 -05:00
101d814777 try and get github to build it 2024-02-01 13:54:37 -05:00
ca5409b8b8 try and get github to build it 2024-02-01 13:50:48 -05:00
1397463841 try and get github to build it 2024-02-01 13:48:39 -05:00
fcfa56a4c9 try and get github to build it 2024-02-01 13:45:39 -05:00
8694c726c5 try and get github to build it 2024-02-01 13:43:56 -05:00
c2b4442e51 try and get github to build it 2024-02-01 12:47:23 -05:00
ac3b7163d8 try and get github to build it 2024-02-01 12:44:36 -05:00
14cd4268f4 update versions 2024-02-01 11:36:50 -05:00
db5f10764b page generation update for: 2023-12-27 17:21:02.723059604 -0500 EST m=+0.619748086 2023-12-27 17:21:02 -05:00
f2895049f5 page generation update for: 2023-12-27 16:57:46.740090032 -0500 EST m=+0.640553623 2023-12-27 16:57:46 -05:00
940808d3a2 page generation update for: 2023-12-27 16:54:23.201534121 -0500 EST m=+0.538381510 2023-12-27 16:54:23 -05:00
1eb1b4c65f update version nums 2023-12-27 16:43:52 -05:00
a9a178331e update plugin version, fix building on unix 2023-12-11 13:14:39 -05:00
6a6e688c87 fix the firefox tests 2023-07-11 14:20:14 -04:00
db3020c389 refactor I2PFirefoxProfileChecker.java 2023-07-11 14:10:34 -04:00
3f51a667ab refactor I2PFirefoxProfileChecker.java 2023-07-11 13:56:35 -04:00
1635421d0b include the javadoc 2023-07-11 13:48:16 -04:00
fdcd79aee9 include the javadoc 2023-07-11 13:46:22 -04:00
df325a0717 refactor I2PCommonBrowser.java for simplicity and readability 2023-07-11 13:19:59 -04:00
53 changed files with 1381 additions and 1022 deletions

240
.github/workflows/ant.yml vendored Normal file
View 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-${{ github.sha }}.zip
path: ./src/i2p.firefox.base.profile.zip
- name: Upload Firefox Profile Usability
uses: actions/upload-artifact@v4
with:
name: i2p.firefox.usability.profile-${{ github.sha }}.zip
path: ./src/i2p.firefox.usability.profile.zip
- name: Upload Chromium Profile Strict
uses: actions/upload-artifact@v4
with:
name: i2p.chromium.base.profile-${{ github.sha }}.zip
path: ./src/i2p.chromium.base.profile.zip
- name: Upload Chromium Profile Usability
uses: actions/upload-artifact@v4
with:
name: i2p.chromium.usability.profile-${{ github.sha }}.zip
path: ./src/i2p.chromium.usability.profile.zip
- name: Upload i2pfirefox.jar
uses: actions/upload-artifact@v4
with:
name: i2pfirefox-${{ github.sha }}.jar
path: ./src/build/i2pfirefox.jar
- name: Upload i2pfirefox-plugin.jar
uses: actions/upload-artifact@v4
with:
name: i2pfirefox-plugin-${{ github.sha }}.jar
path: ./src/build/i2pfirefox-plugin.jar
- name: Upload i2pbrowser.tar.gz
uses: actions/upload-artifact@v4
with:
name: i2pbrowser-${{ github.sha }}.tar.gz
path: ./i2pbrowser.tar.gz
- name: Upload i2pbrowser.deb
uses: actions/upload-artifact@v4
with:
name: i2pbrowser_${{ github.sha }}_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-${{ github.sha }}.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-${{ github.sha }}.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-${{ github.sha }}.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-${{ github.sha }}.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-${{ github.sha }}.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-${{ github.sha }}.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-${{ github.sha }}.pkg
path: ./i2pbrowser-1.0.0.pkg

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -468,13 +468,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -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
---------------

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -1035,13 +1035,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -55,7 +55,7 @@ For platform specific instructions, see
```sh
mkdir ~/tmp-i2pfirefox && cd ~/tmp-i2pfirefox
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.1.0/i2pfirefox.zip
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.2.0/i2pfirefox.zip
unzip i2pfirefox.zip
./i2pfirefox.cmd

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -153,28 +153,23 @@
Firefox
</h2>
<pre><code class="language-md">i2p-in-private-browsing
<<<<<<< HEAD
1.44
https://addons.mozilla.org/firefox/downloads/file/4020669/i2p_in_private_browsing-1.44.xpi
=======
1.48
https://addons.mozilla.org/firefox/downloads/file/4123613/i2p_in_private_browsing-1.48.xpi
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
1.50
https://addons.mozilla.org/firefox/downloads/file/4213716/i2p_in_private_browsing-1.50.xpi
noscript
11.4.24
https://addons.mozilla.org/firefox/downloads/file/4131645/noscript-11.4.24.xpi
11.4.29
https://addons.mozilla.org/firefox/downloads/file/4206186/noscript-11.4.29.xpi
localcdn-fork-of-decentraleyes
2.6.52
https://addons.mozilla.org/firefox/downloads/file/4129532/localcdn_fork_of_decentraleyes-2.6.52.xpi
2.6.60
https://addons.mozilla.org/firefox/downloads/file/4208268/localcdn_fork_of_decentraleyes-2.6.60.xpi
onion-in-container-browsing
0.82
https://addons.mozilla.org/firefox/downloads/file/3904685/onion_in_container_browsing-0.82.xpi
javascript-restrictor
0.13
https://addons.mozilla.org/firefox/downloads/file/4131644/javascript_restrictor-0.13.xpi
0.17
https://addons.mozilla.org/firefox/downloads/file/4190089/javascript_restrictor-0.17.xpi
ublock-origin
1.50.0
https://addons.mozilla.org/firefox/downloads/file/4121906/ublock_origin-1.50.0.xpi
1.54.0
https://addons.mozilla.org/firefox/downloads/file/4198829/ublock_origin-1.54.0.xpi
</code></pre>
<h2>
Chromium
@ -186,13 +181,13 @@ NoScript
11.4.18
https://clients2.google.com/service/update2/crx
LocalCDN
2.6.51
2.6.60
https://clients2.google.com/service/update2/crx
uBlock Origin
1.50.0
1.54.0
https://clients2.google.com/service/update2/crx
JShelter
0.13
__MSG_extensionName__
0.17
https://clients2.google.com/service/update2/crx
</code></pre>
<div id="sourcecode">
@ -203,13 +198,8 @@ https://clients2.google.com/service/update2/crx
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -9,20 +9,20 @@ i2p-in-private-browsing
1.48
https://addons.mozilla.org/firefox/downloads/file/4123613/i2p_in_private_browsing-1.48.xpi
noscript
11.4.24
https://addons.mozilla.org/firefox/downloads/file/4131645/noscript-11.4.24.xpi
11.4.29
https://addons.mozilla.org/firefox/downloads/file/4206186/noscript-11.4.29.xpi
localcdn-fork-of-decentraleyes
2.6.52
https://addons.mozilla.org/firefox/downloads/file/4129532/localcdn_fork_of_decentraleyes-2.6.52.xpi
2.6.64
https://addons.mozilla.org/firefox/downloads/file/4243456/localcdn_fork_of_decentraleyes-2.6.64.xpi
onion-in-container-browsing
0.82
https://addons.mozilla.org/firefox/downloads/file/3904685/onion_in_container_browsing-0.82.xpi
javascript-restrictor
0.13
https://addons.mozilla.org/firefox/downloads/file/4131644/javascript_restrictor-0.13.xpi
0.17
https://addons.mozilla.org/firefox/downloads/file/4190089/javascript_restrictor-0.17.xpi
ublock-origin
1.50.0
https://addons.mozilla.org/firefox/downloads/file/4121906/ublock_origin-1.50.0.xpi
1.56.0
https://addons.mozilla.org/firefox/downloads/file/4237670/ublock_origin-1.56.0.xpi
```
## Chromium
@ -35,12 +35,12 @@ NoScript
11.4.18
https://clients2.google.com/service/update2/crx
LocalCDN
2.6.52
2.6.64
https://clients2.google.com/service/update2/crx
uBlock Origin
1.50.0
1.56.0
https://clients2.google.com/service/update2/crx
JShelter
0.13
__MSG_extensionName__
0.17
https://clients2.google.com/service/update2/crx
```

299
build.xml
View File

@ -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">
<ant dir="src" target="jar" />
<ant dir="src" target="pluginjar" />
</target>
<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">
<buildnumber file="scripts/build.number" />
<property name="release.number" value="1.1.0" />
<property name="release.number" value="1.2.0" />
<exec executable="echo" osfamily="unix">
<arg value="${release.number}-${build.number}" />
</exec>
@ -339,6 +340,44 @@ Linux(because the top command will be run and the script will exit).\n\nBoth det
</exec>
</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">
<delete>
<!-- 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="scripts/plugin.config" todir="plugin/" overwrite="true" />
<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">
<arg value="update-only=true" />
</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=""/>
</condition>
</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 -->
<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">
<arg value="version=${release.number}-${build.number}" />
</exec>
<exec executable="scripts/makeplugin.sh" inputstring="${release.password.su3}" failonerror="true" >
<arg value="plugin" />
</exec>
<mkdir dir="i2p.plugins.firefox" />
<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-update.xpi2p" todir="i2p.plugins.firefox" overwrite="true" />
</target>
<target name="torrent">
<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">
<arg value="-i"/>
<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/I2PChromium.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>
</target>
<target name="debian" depends="jar">
<exec executable="bash" failonerror="true">
<arg value="--verbose"/>
<arg value="-c"/>
<arg value="./debian.sh"/>
<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="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>
</target>
<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="-c"/>
<arg value="./fedora.sh"/>
<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="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>
</target>

View File

@ -1,6 +1,6 @@
#! /usr/bin/env sh
export GITHUB_USER=eyedeekay
export GITHUB_REPO=i2p.plugins.firefox
export GITHUB_NAME="Updates extensions, last version with old plugin style"
export GITHUB_NAME="Updates extensions, plugin support temporarily removed(Stay on the old version)"
export GITHUB_DESCRIPTION=$(cat CHANGES.md VERSION.md)
export GITHUB_TAG=1.1.0
export GITHUB_TAG=1.3.0

View File

@ -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

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -542,13 +542,8 @@ if (i2pIsRunning()) {
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -1191,13 +1191,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -1041,13 +1041,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -375,13 +375,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -348,13 +348,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -266,13 +266,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -960,13 +960,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -1132,13 +1132,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -473,13 +473,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -480,13 +480,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -270,13 +270,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -669,13 +669,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -166,11 +166,7 @@
</code>
</h4>
<pre><code class="language-sh">mkdir ~/tmp-i2pbrowser &amp;&amp; cd ~/tmp-i2pbrowser
<<<<<<< HEAD
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.1.0/i2pbrowser.tar.gz
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.2.0/i2pbrowser.tar.gz
tar xvzf i2pbrowser.tar.gz &amp;&amp; cd i2pbrowser
## 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.
@ -260,13 +256,8 @@ tar xvzf i2pbrowser.tar.gz &amp;&amp; cd i2pbrowser
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -7,7 +7,7 @@ Linux. These packages are for the **`amd64`** architecture.
```sh
mkdir ~/tmp-i2pbrowser && cd ~/tmp-i2pbrowser
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.1.0/i2pbrowser.tar.gz
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.2.0/i2pbrowser.tar.gz
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 probably offers better security than vanilla Firefox.

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -159,11 +159,7 @@
file with any Java greater than Java 8.
</p>
<pre><code class="language-sh">mkdir ~/tmp-i2pfirefox &amp;&amp; cd ~/tmp-i2pfirefox
<<<<<<< HEAD
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.1.0/i2pfirefox.zip
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.2.0/i2pfirefox.zip
unzip i2pfirefox.zip
./cmd/i2pfirefox.cmd
@ -209,13 +205,8 @@ export JAVA_HOME=`/usr/libexec/java_home -v 17`
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -7,7 +7,7 @@ packages. You can use the `.jar` file with any Java greater than Java 8.
```sh
mkdir ~/tmp-i2pfirefox && cd ~/tmp-i2pfirefox
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.1.0/i2pfirefox.zip
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.2.0/i2pfirefox.zip
unzip i2pfirefox.zip
./cmd/i2pfirefox.cmd

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -278,13 +278,8 @@
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

Binary file not shown.

View File

@ -3,8 +3,8 @@
<title>
i2p.plugins.fire...
</title>
<meta name="author" content="unknown" />
<meta name="description" content="" />
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p.plugins.firefox" />
<meta name="keywords" content="main" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
@ -305,11 +305,7 @@
and a non-bundled Java
</h4>
<pre><code class="language-sh">mkdir ~/tmp-i2pfirefox &amp;&amp; cd ~/tmp-i2pfirefox
<<<<<<< HEAD
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.1.0/i2pfirefox.zip
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
wget https://github.com/eyedeekay/i2p.plugins.firefox/releases/download/1.2.0/i2pfirefox.zip
unzip i2pfirefox.zip
./i2pfirefox.cmd
@ -325,13 +321,8 @@ unzip i2pfirefox.zip
</span>
<ul>
<li>
<<<<<<< HEAD
<a href="https://i2pgit.org/idk/i2p.plugins.firefox">
Source Repository: (https://i2pgit.org/idk/i2p.plugins.firefox)
=======
<a href="https://github.com/eyedeekay/i2p.plugins.firefox">
Source Repository: (https://github.com/eyedeekay/i2p.plugins.firefox)
>>>>>>> 7cdf84bb265e7fda5b98d2386dab1855de8383eb
</a>
</li>
</ul>

View File

@ -1,6 +1,5 @@
clientApp.0.main=net.i2p.i2pfirefox.I2PBrowserPlugin
clientApp.0.name=I2PBrowserPlugin
clientApp.0.main=net.i2p.i2pfirefox.plugin.I2PBrowserPlugin
clientApp.0.name=i2pfirefox
clientApp.0.delay=0
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.jar,$I2P/lib/i2psnark.jar
clientApp.0.classpath=$PLUGIN/lib/i2pfirefox-plugin.jar

View File

@ -1,7 +1,7 @@
#! /usr/bin/env sh
. ./config.sh
./preprelease.sh
#./preprelease.sh
github-release release --user "${GITHUB_USER}" \
--repo "${GITHUB_REPO}" \
--name "${GITHUB_NAME}" \

View File

@ -1,6 +1,3 @@
#Build Number for ANT. Do not edit!
#Thu Jul 06 15:11:32 EDT 2023
build.number=500
>>>>>>>=7cdf84bb265e7fda5b98d2386dab1855de8383eb
=\=\=\=\=\=\=
<<<<<<<=HEAD
#Thu Mar 07 11:01:16 EST 2024
build.number=699

View File

@ -9,6 +9,7 @@
<pathelement location="${i2plib}/i2ptunnel.jar" />
<pathelement location="${i2plib}/i2psnark.jar" />
<pathelement location="${i2plib}/mstreaming.jar" />
<pathelement location="${i2plib}/desktopgui.jar" />
<pathelement location="${ant.home}/lib/ant.jar"/>
<pathelement location="${jettylib}/org.mortbay.jetty.jar"/>
<pathelement location="${jettylib}/jasper-runtime.jar" />
@ -40,11 +41,31 @@
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:${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}" />
</javac>
</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">
<jar destfile="build/i2pfirefox.jar" basedir="./build/obj" includes="**/*.class" >
<fileset file="i2p.firefox.base.profile.zip" />

View File

@ -1,6 +1,6 @@
package net.i2p.i2pfirefox;
import java.awt.AWTException;
/*import java.awt.AWTException;
import java.awt.Component;
import java.awt.Image;
import java.awt.Menu;
@ -13,7 +13,7 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseListener;*/
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
@ -46,26 +46,6 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
private final I2PChromium i2pChromium = new I2PChromium();
private final I2PGenericUnsafeBrowser i2pGeneral =
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 chromium = false;
public boolean generic = false;
@ -73,29 +53,37 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
public boolean usability = false;
public int privateBrowsing = 0;
private boolean outputConfig = false;
private boolean useSystray = true;
private void launchFirefox(int privateWindow, String[] url) {
logger.info("I2PFirefox" + privateWindow);
public void launchFirefox(int privateWindow, String[] url) {
String priv = privateWindow == 1 ? "private-window" : "long-profile";
logger.info("I2PFirefox" + priv);
i2pFirefox.usability = usability;
if (url == null)
url = new String[] {"about:blank"};
if (outputConfig)
i2pFirefox.storeFirefoxDefaults();
i2pFirefox.launch(privateWindow, url);
}
private void launchChromium(int privateWindow, String[] url) {
logger.info("I2PChromium" + privateWindow);
public void launchChromium(int privateWindow, String[] url) {
String priv = privateWindow == 1 ? "private-window" : "long-profile";
logger.info("I2PChromium" + priv);
i2pChromium.usability = usability;
if (url == null)
url = new String[] {"about:blank"};
if (outputConfig)
i2pChromium.storeChromiumDefaults();
i2pChromium.launch(privateWindow, url);
}
private void launchGeneric(int privateWindowInt, String[] url) {
String priv = privateWindowInt == 1 ? "private-window" : "long-profile";
boolean privateWindow = false;
if (url == null)
url = new String[] {"about:blank"};
if (privateWindowInt == 1)
privateWindow = true;
if (outputConfig)
i2pGeneral.storeGenericDefaults();
logger.info("I2PGeneric" + privateWindowInt);
logger.info("I2PGeneric" + priv);
i2pGeneral.launch(privateWindow, url);
}
@ -105,7 +93,7 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
*
* @since 0.0.16
*/
public I2PBrowser() { initIconFile(); }
public I2PBrowser() {}
/**
* Construct an I2PBrowser class which automatically determines which browser
@ -113,10 +101,7 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
*
* @since 0.0.18
*/
public I2PBrowser(String browserPath) {
this.BROWSER = browserPath;
initIconFile();
}
public I2PBrowser(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
*/
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 (chromium) {
this.launchChromium(privateWindow, url);
@ -224,6 +194,32 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
*/
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) {
String[] schemes = {"http", "https"};
for (String scheme : schemes) {
@ -239,7 +235,6 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
i2pBrowser.startup(args);
}
public ArrayList<String> parseArgs(String[] args) {
validateUserDir();
logger.info("I2PBrowser");
ArrayList<String> visitURL = new ArrayList<String>();
if (args != null) {
@ -270,9 +265,6 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
if (arg.equals("-outputconfig")) {
outputConfig = true;
}
if (arg.equals("-nosystray")) {
useSystray = false;
}
if (arg.equals("-noproxycheck")) {
logger.info("zeroing out proxy check");
this.setProxyTimeoutTime(0);
@ -288,181 +280,14 @@ public class I2PBrowser extends I2PGenericUnsafeBrowser {
public void startup(String[] args) {
ArrayList<String> visitURL = parseArgs(args);
try {
if (useSystray) {
startupSystray();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
shutdownSystray();
}
});
}
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {}
});
} catch (Exception e) {
logger.warning(e.toString());
}
this.launch(this.privateBrowsing,
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;
}
}

View File

@ -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.
}
}

View File

@ -29,6 +29,7 @@ import java.util.stream.Stream;
public class I2PChromium extends I2PChromiumProfileUnpacker {
private final String[] CHROMIUM_SEARCH_PATHS = CHROMIUM_FINDER();
private Process p = null;
private String chromePath;
/**
* Construct an I2PChromium class which manages an instance of Chromium and
@ -60,34 +61,35 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
public void storeChromiumDefaults() {
List<String> list = new ArrayList<String>();
list = Arrays.asList(chromiumPathsWindows());
prop.setProperty("chromium.paths.windows",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("chromium.paths.windows",
list.stream().collect(Collectors.joining(",")));
list = Arrays.asList(chromiumPathsUnix());
prop.setProperty("chromium.paths.linux",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("chromium.paths.linux",
list.stream().collect(Collectors.joining(",")));
list = Arrays.asList(chromiumPathsOSX());
prop.setProperty("chromium.paths.osx",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("chromium.paths.osx",
list.stream().collect(Collectors.joining(",")));
list = Arrays.asList(chromiumBinsWindows());
prop.setProperty("chromium.bins.windows",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("chromium.bins.windows",
list.stream().collect(Collectors.joining(",")));
list = Arrays.asList(chromiumBinsUnix());
prop.setProperty("chromium.bins.linux",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("chromium.bins.linux",
list.stream().collect(Collectors.joining(",")));
list = Arrays.asList(chromiumBinsUnix());
prop.setProperty("chromium.bins.osx",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("chromium.bins.osx",
list.stream().collect(Collectors.joining(",")));
try (OutputStream fos = new FileOutputStream(
new File(runtimeDirectory(""), "browser.config"))) {
prop.store(fos, "Chromium Configuration Section");
getProperties().store(fos, "Chromium Configuration Section");
} catch (IOException ioe) {
logger.warning(ioe.toString());
}
}
private String[] chromiumPathsUnix() {
String chromiumPathsProp = prop.getProperty("chromium.paths.unix");
String chromiumPathsProp =
getProperties().getProperty("chromium.paths.unix");
if (chromiumPathsProp != null)
if (!chromiumPathsProp.equals(""))
return chromiumPathsProp.split(",");
@ -98,12 +100,12 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
private String[] chromiumBinsUnix() {
String chromiumPathsProp;
if (isOSX()) {
chromiumPathsProp = prop.getProperty("chromium.bins.osx");
chromiumPathsProp = getProperties().getProperty("chromium.bins.osx");
if (chromiumPathsProp != null)
if (!chromiumPathsProp.equals(""))
return chromiumPathsProp.split(",");
}
chromiumPathsProp = prop.getProperty("chromium.bins.unix");
chromiumPathsProp = getProperties().getProperty("chromium.bins.unix");
if (chromiumPathsProp != null)
if (!chromiumPathsProp.equals(""))
return chromiumPathsProp.split(",");
@ -126,7 +128,8 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
return exePath;
}
private String[] chromiumPathsOSX() {
String chromiumPathsProp = prop.getProperty("chromium.paths.osx");
String chromiumPathsProp =
getProperties().getProperty("chromium.paths.osx");
if (chromiumPathsProp != null)
if (!chromiumPathsProp.equals(""))
return chromiumPathsProp.split(",");
@ -149,7 +152,8 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
}
private String[] chromiumPathsWindows() {
String chromiumPathsProp = prop.getProperty("chromium.paths.windows");
String chromiumPathsProp =
getProperties().getProperty("chromium.paths.windows");
if (chromiumPathsProp != null)
if (!chromiumPathsProp.equals(""))
return chromiumPathsProp.split(",");
@ -182,7 +186,8 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
};
}
private String[] chromiumBinsWindows() {
String chromiumPathsProp = prop.getProperty("chromium.bins.windows");
String chromiumPathsProp =
getProperties().getProperty("chromium.bins.windows");
if (chromiumPathsProp != null)
if (!chromiumPathsProp.equals(""))
return chromiumPathsProp.split(",");
@ -384,11 +389,13 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
File chromeFile = new File(chrome);
if (chromeFile.exists()) {
// if it does, return it
chromePath = chrome;
return chrome;
}
}
String[] chromees = onlyValidChromiums();
if (chromees.length > 0) {
chromePath = chromees[0];
return chromees[0];
} else {
return "";
@ -667,7 +674,7 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
}
public Process launchAndDetatch(int privateWindow, String[] url) {
validateUserDir();
validateUserDirectory();
if (waitForProxy()) {
String profileDirectory = this.profileDirectory(this.usabilityMode());
if (this.validateProfileDirectory(profileDirectory)) {
@ -764,6 +771,25 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
*/
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) {
String[] schemes = {"http", "https"};
for (String scheme : schemes) {
@ -777,7 +803,7 @@ public class I2PChromium extends I2PChromiumProfileUnpacker {
public static void main(String[] args) {
int privateBrowsing = 0;
I2PChromium i2pChromium = new I2PChromium();
i2pChromium.validateUserDir();
i2pChromium.validateUserDirectory();
i2pChromium.logger.info("I2PChromium");
i2pChromium.logger.info("checking for private browsing");
ArrayList<String> visitURL = new ArrayList<String>();

View File

@ -33,46 +33,57 @@ import java.util.zip.ZipInputStream;
*/
public class I2PCommonBrowser {
public Properties prop = new Properties();
private Properties prop = new Properties();
public Logger logger = Logger.getLogger("browserlauncher");
private FileHandler fh;
static int CONFIGURED_TIMEOUT = 200;
int CONFIGURED_TIMEOUT = 200;
public I2PCommonBrowser() {
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");
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
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.load(propsInput);
System.out.println(prop);
} catch (IOException io) {
logger.warning(io.toString());
prop.load(inputStream);
} catch (IOException exception) {
logger.warning(exception.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");
String userDir = System.getProperty("user.dir");
String userHome = System.getProperty("user.home");
File userDirFile = new File(userDir);
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().equals(
userHomeFile.getAbsolutePath())) {
@ -87,8 +98,9 @@ public class I2PCommonBrowser {
} else {
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 {
logger.info("user.dir does not exist");
}
@ -98,11 +110,13 @@ public class I2PCommonBrowser {
} else {
logger.info("user.dir cannot run from inside Program Files");
}
if (isWindows())
if (isWindows()) {
userHome = new File(userHome, "AppData/Local/I2P").getAbsolutePath();
}
File defaultPathFile = new File(userHome, "i2p/i2pbrowser");
if (!defaultPathFile.exists())
if (!defaultPathFile.exists()) {
defaultPathFile.mkdirs();
}
if (!defaultPathFile.isDirectory()) {
logger.info(
"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());
}
/**
* Get the operating system.
*
* @return the name of the operating system (Windows, Linux, BSD, Mac, or
* Unknown)
*/
public String getOperatingSystem() {
String os = System.getProperty("os.name");
if (os.startsWith("Windows")) {
if (isWindows()) {
return "Windows";
} else if (os.contains("Linux")) {
} else if (isLinux()) {
return "Linux";
} else if (os.contains("BSD")) {
} else if (isBSD()) {
return "BSD";
} else if (os.contains("Mac")) {
} else if (isOSX()) {
return "Mac";
}
return "Unknown";
}
/**
* Determines if the current operating system is Windows.
*
* @return true if the current operating system is Windows, false otherwise
*/
protected boolean isWindows() {
String osName = System.getProperty("os.name");
logger.info("os.name" + osName);
if (osName.contains("windows"))
return true;
if (osName.contains("Windows"))
return true;
if (osName.contains("WINDOWS"))
return true;
return false;
}
protected boolean isOSX() {
String osName = System.getProperty("os.name");
logger.info("os.name" + osName);
if (osName.contains("OSX"))
return true;
if (osName.contains("osx"))
return true;
if (osName.contains("mac"))
return true;
if (osName.contains("Mac"))
return true;
if (osName.contains("apple"))
return true;
if (osName.contains("Apple"))
return true;
if (osName.contains("Darwin"))
return true;
if (osName.contains("darwin"))
return true;
return false;
}
// public void logger.info(String line) { logger.info(line); }
private File logFile() {
validateUserDir();
String userDir = System.getProperty("user.dir");
File log = new File(userDir, "logs");
if (!log.exists())
log.mkdirs();
return new File(log, "browserlauncher.log");
String osName = System.getProperty("os.name").toLowerCase();
return osName.contains("windows");
}
/**
* get the runtime directory, creating it if create=true
* Determines if the current operating system is macOS.
*
* @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
* @return true if the operating system is macOS, false otherwise
*/
protected boolean isOSX() {
String osName = System.getProperty("os.name").toLowerCase();
return osName.contains("osx") || osName.contains("mac") ||
osName.contains("apple") || osName.contains("darwin");
}
/**
* Determines whether the current operating system is Linux.
*
* @return true if the operating system is Linux, false otherwise
*/
protected boolean isLinux() {
String osName = System.getProperty("os.name").toLowerCase();
return osName.contains("linux");
}
/**
* Checks if the current operating system is a BSD variant.
*
* @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); }
/**
* Returns the log file for the browser launcher.
*
* @return the log file for the browser launcher
*/
/*private File logFile() {
// 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.
*
* @param create If true, create the runtime directory if it does not exist.
* @param override The runtime directory override.
* @return The runtime directory, or null if it could not be created.
* @since 0.0.19
*/
protected File runtimeDirectory(boolean create, String override) {
String rtd = runtimeDirectory(override);
File rtdFile = new File(rtd);
if (create) {
if (!rtdFile.exists()) {
rtdFile.mkdir();
}
String runtimeDir = runtimeDirectory(override);
File runtimeDirFile = new File(runtimeDir);
if (create && !runtimeDirFile.exists()) {
runtimeDirFile.mkdir();
}
return new File(rtd);
return runtimeDirFile;
}
/**
* 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
* @since 0.0.19
* @param override the name of the environment variable to override the
* runtime
* directory
* @return the runtime directory path as a string
*/
protected String runtimeDirectory(String override) {
// get the I2P_BROWSER_DIR environment variable
String rtd = System.getenv(override);
// if it is not null and not empty
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;
}
String runtimeDir = System.getenv(override);
if (isDirectoryValid(runtimeDir)) {
return runtimeDir;
}
// 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");
if (userDir != null && !userDir.isEmpty()) {
File userDir1 = new File(userDir);
if (userDir1.exists()) {
return userDir1.toString();
}
if (isDirectoryValid(userDir)) {
return userDir;
}
String homeDir = System.getProperty("user.home");
if (homeDir != null && !homeDir.isEmpty()) {
File homeDir1 = new File(homeDir + "/.i2p");
if (homeDir1.exists()) {
return homeDir.toString();
if (isDirectoryValid(homeDir)) {
String i2pDir = homeDir + "/.i2p";
if (isDirectoryValid(i2pDir)) {
return homeDir;
}
File homeDir2 = new File(homeDir + "/i2p");
if (homeDir2.exists()) {
return homeDir2.toString();
String altI2pDir = homeDir + "/i2p";
if (isDirectoryValid(altI2pDir)) {
return altI2pDir;
}
}
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
* @since 0.0.19
*/
protected String profileDirectory(String envVar, String browser, String base,
boolean app) {
String pd = System.getenv(envVar);
if (pd != null && !pd.isEmpty()) {
File pdf = new File(pd);
if (pdf.exists() && pdf.isDirectory()) {
return pd;
String profileDir = System.getenv(envVar);
if (profileDir != null && !profileDir.isEmpty()) {
File profileDirFile = new File(profileDir);
if (profileDirFile.exists() && profileDirFile.isDirectory()) {
return profileDir;
}
}
String rtd = runtimeDirectory("");
return profileDir(rtd, browser, base, app);
String runtimeDir = runtimeDirectory("");
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,
boolean app) {
String appString = "";
if (app) {
appString = ".app";
}
File profileDir =
new File(file, "i2p." + browser + ".profile." + base + appString);
String appString = app ? ".app" : "";
String profileDirName =
String.format("i2p.%s.profile.%s%s", browser, base, appString);
File profileDir = new File(file, profileDirName);
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,
String base) {
logger.info("Unpacking base profile to " + profileDirectory);
@ -309,64 +364,101 @@ public class I2PCommonBrowser {
return true;
}
protected void copyDirectory(File sourceDirectory, File destinationDirectory,
String browser, String base) throws IOException {
destinationDirectory = new File(destinationDirectory.toString().replace(
/**
* Copy a directory from sourceDir to destDir, excluding certain files based
* 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", ""));
if (!destinationDirectory.exists()) {
destinationDirectory.mkdir();
if (!destDir.exists()) {
destDir.mkdir();
}
for (String f : sourceDirectory.list()) {
copyDirectoryCompatibilityMode(new File(sourceDirectory, f),
new File(destinationDirectory, f), browser,
base);
for (String file : sourceDir.list()) {
copyDirectoryCompatibilityMode(new File(sourceDir, file),
new File(destDir, file), browser, 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)
throws IOException {
if (source.isDirectory()) {
copyDirectory(source, destination, browser, base);
if (sourceDirectory.isDirectory()) {
copyDirectory(sourceDirectory, destinationDirectory, browser, base);
} 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 {
byte[] buf = new byte[8192];
int length;
while ((length = source.read(buf)) != -1) {
target.write(buf, 0, length);
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = source.read(buffer)) != -1) {
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)
throws IOException {
try (InputStream in = new FileInputStream(sourceFile);
OutputStream out = new FileOutputStream(destinationFile)) {
byte[] buf = new byte[1024];
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buf)) > 0) {
out.write(buf, 0, length);
while ((length = in.read(buffer)) > 0) {
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) {
File profileDir = new File(profileDirectory);
if (!profileDir.exists()) {
logger.info("Profile directory does not exist");
return false;
}
if (!profileDir.isDirectory()) {
logger.info("Profile directory is not a directory");
return false;
}
File frf = new File(profileDir, "first-run");
if (frf.exists()) {
frf.delete();
// is a first run
File firstRunFile = new File(profileDir, "first-run");
if (firstRunFile.exists()) {
firstRunFile.delete();
return true;
}
return false;
@ -392,18 +484,20 @@ public class I2PCommonBrowser {
public boolean waitForProxy(int timeout) {
return waitForProxy(timeout, 4444);
}
/**
* Waits for an HTTP proxy on the specified port to be ready.
* Returns false on timeout of the specified number of seconds.
*
* @param timeout the number of seconds to wait for the proxy to be ready.
* @param port the port to wait for the proxy to be ready on.
* @param port the port to wait for the proxy to be ready on.
* @return true if the proxy is ready, false if it is not.
* @since 0.0.1
*/
public boolean waitForProxy(int timeout, int port) {
return waitForProxy(timeout, port, "localhost");
}
/**
* Waits for an HTTP proxy on the specified port to be ready.
* Returns false on timeout of the specified number of seconds.
@ -411,19 +505,17 @@ public class I2PCommonBrowser {
* returns true.
*
* @param timeout the number of seconds to wait for the proxy to be ready.
* @param port the port to wait for the proxy to be ready on.
* @param host the host to wait for the proxy to be ready on.
* @param port the port to wait for the proxy to be ready on.
* @param host the host to wait for the proxy to be ready on.
* @return true if the proxy is ready, false if it is not.
* @since 0.0.1
*/
public boolean waitForProxy(int timeout, int port, String host) {
logger.info("waiting up to " + timeout + "seconds for a proxy");
if (timeout <= 0) {
return true;
}
for (int i = 0; i < timeout; i++) {
logger.info("Waiting for proxy");
if (checkifPortIsOccupied(port, host)) {
if (isPortOccupied(port, host)) {
return true;
}
try {
@ -434,15 +526,23 @@ public class I2PCommonBrowser {
}
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 {
Socket socket = new Socket(host, port);
socket.close();
new Socket(host, port).close();
return true;
} catch (IOException e) {
return false;
}
}
/**
* Alters the proxy timeout to customized value time, in seconds.
* May be zero.
@ -452,36 +552,50 @@ public class I2PCommonBrowser {
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) {
StringBuilder val = new StringBuilder("");
for (int x = 0; x < arr.length; x++) {
val.append(" \"");
val.append(arr[x]);
val.append("\"");
StringBuilder result = new StringBuilder();
for (String item : arr) {
result.append(" \"").append(item).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) {
try {
Thread.sleep(millis);
} catch (InterruptedException bad) {
bad.printStackTrace();
throw new RuntimeException(bad);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
public File searchFile(File file, String search) {
if (file.isDirectory()) {
File[] arr = file.listFiles();
for (File f : arr) {
File found = searchFile(f, search);
if (found != null)
return found;
/**
* Searches for a file in a given directory and its subdirectories.
*
* @param directory the directory to search in
* @param search the name of the file to search for
* @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 {
if (file.getName().equals(search)) {
return file;
if (directory.getName().equals(search)) {
return directory;
}
}
return null;

View File

@ -30,6 +30,7 @@ import java.util.stream.Stream;
public class I2PFirefox extends I2PFirefoxProfileUnpacker {
private final String[] FIREFOX_SEARCH_PATHS = FIREFOX_FINDER();
private Process process = null;
private String firefoxPath;
public boolean usability = false;
private String baseMode() {
@ -58,34 +59,34 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
public void storeFirefoxDefaults() {
List<String> list = new ArrayList<String>();
list = Arrays.asList(firefoxPathsWindows());
prop.setProperty("firefox.paths.windows",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("firefox.paths.windows",
list.stream().collect(Collectors.joining(",")));
list = Arrays.asList(firefoxPathsUnix());
prop.setProperty("firefox.paths.linux",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("firefox.paths.linux",
list.stream().collect(Collectors.joining(",")));
list = Arrays.asList(firefoxPathsOSX());
prop.setProperty("firefox.paths.osx",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("firefox.paths.osx",
list.stream().collect(Collectors.joining(",")));
list = Arrays.asList(firefoxBinsWindows());
prop.setProperty("firefox.bins.windows",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("firefox.bins.windows",
list.stream().collect(Collectors.joining(",")));
list = Arrays.asList(firefoxBinsUnix());
prop.setProperty("firefox.bins.linux",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("firefox.bins.linux",
list.stream().collect(Collectors.joining(",")));
list = Arrays.asList(firefoxBinsUnix());
prop.setProperty("firefox.bins.osx",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("firefox.bins.osx",
list.stream().collect(Collectors.joining(",")));
try (OutputStream fos = new FileOutputStream(
new File(runtimeDirectory(""), "browser.config"))) {
prop.store(fos, "Firefox Configuration Section");
getProperties().store(fos, "Firefox Configuration Section");
} catch (IOException ioe) {
logger.warning(ioe.toString());
}
}
public String[] firefoxPathsUnix() {
String firefoxPathsProp = prop.getProperty("firefox.paths.unix");
String firefoxPathsProp = getProperties().getProperty("firefox.paths.unix");
if (firefoxPathsProp != null)
if (!firefoxPathsProp.equals(""))
return firefoxPathsProp.split(",");
@ -96,12 +97,12 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
public String[] firefoxBinsUnix() {
String firefoxPathsProp;
if (isOSX()) {
firefoxPathsProp = prop.getProperty("firefox.bins.osx");
firefoxPathsProp = getProperties().getProperty("firefox.bins.osx");
if (firefoxPathsProp != null)
if (!firefoxPathsProp.equals(""))
return firefoxPathsProp.split(",");
}
firefoxPathsProp = prop.getProperty("firefox.bins.unix");
firefoxPathsProp = getProperties().getProperty("firefox.bins.unix");
if (firefoxPathsProp != null)
if (!firefoxPathsProp.equals(""))
return firefoxPathsProp.split(",");
@ -124,7 +125,7 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
return exePath;
}
public String[] firefoxPathsOSX() {
String firefoxPathsProp = prop.getProperty("firefox.paths.osx");
String firefoxPathsProp = getProperties().getProperty("firefox.paths.osx");
if (firefoxPathsProp != null)
if (!firefoxPathsProp.equals(""))
return firefoxPathsProp.split(",");
@ -147,7 +148,8 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
return exePath;
}
public String[] firefoxPathsWindows() {
String firefoxPathsProp = prop.getProperty("firefox.paths.windows");
String firefoxPathsProp =
getProperties().getProperty("firefox.paths.windows");
if (firefoxPathsProp != null)
if (!firefoxPathsProp.equals(""))
return firefoxPathsProp.split(",");
@ -180,7 +182,8 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
};
}
private String[] firefoxBinsWindows() {
String firefoxPathsProp = prop.getProperty("firefox.bins.windows");
String firefoxPathsProp =
getProperties().getProperty("firefox.bins.windows");
if (firefoxPathsProp != null)
if (!firefoxPathsProp.equals(""))
return firefoxPathsProp.split(",");
@ -377,6 +380,9 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
* @since 0.0.1
*/
public String topFirefox() {
if (firefoxPath != null) {
return firefoxPath;
}
// get the FIREFOX environment variable
String firefox = System.getenv("FIREFOX");
// if it is not null and not empty
@ -385,11 +391,13 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
File firefoxFile = new File(firefox);
if (firefoxFile.exists()) {
// if it does, return it
firefoxPath = firefox;
return firefox;
}
}
String[] firefoxes = onlyValidFirefoxes();
if (firefoxes.length > 0) {
firefoxPath = firefoxes[0];
return firefoxes[0];
} else {
return "";
@ -692,7 +700,7 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
return launchAndDetatch(privateWindowInt, url);
}
public Process launchAndDetatch(int privateWindow, String[] url) {
validateUserDir();
validateUserDirectory();
boolean app = false;
if (privateWindow == 2)
app = true;
@ -827,6 +835,25 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
*/
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) {
String[] schemes = {"http", "https"};
for (String scheme : schemes) {
@ -841,7 +868,7 @@ public class I2PFirefox extends I2PFirefoxProfileUnpacker {
public static void main(String[] args) {
int privateBrowsing = 0;
I2PFirefox i2pFirefox = new I2PFirefox();
i2pFirefox.validateUserDir();
i2pFirefox.validateUserDirectory();
i2pFirefox.logger.info("checking for private browsing");
i2pFirefox.logger.info("I2PFirefox");
ArrayList<String> visitURL = new ArrayList<String>();

View File

@ -27,21 +27,24 @@ import java.util.Scanner;
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) {
I2PFirefoxProfileChecker pc = new I2PFirefoxProfileChecker();
String profileDirectory = pc.profileDirectory(false, "base");
I2PFirefoxProfileChecker profileChecker = new I2PFirefoxProfileChecker();
String profileDirectory = profileChecker.profileDirectory(false, "base");
if (profileDirectory == null) {
pc.logger.info("No profile directory found");
profileChecker.logger.info("No profile directory found");
return;
}
pc.logger.info("Profile directory: " + profileDirectory);
boolean ok = pc.validateProfileDirectory(profileDirectory);
if (ok) {
pc.logger.info("Profile directory is valid");
profileChecker.logger.info("Profile directory: " + profileDirectory);
boolean isProfileValid =
profileChecker.validateProfileDirectory(profileDirectory);
if (isProfileValid) {
profileChecker.logger.info("Profile directory is valid");
} 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) {
File profileDir = new File(profileDirectory);
if (!profileDir.exists()) {
logger.info("Profile directory does not exist");
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");
if (!profileDir.exists() || !profileDir.isDirectory() ||
!profileDir.canRead() || !profileDir.canWrite()) {
return false;
}
if (!validateFile(profileDir + "/prefs.js")) {
logger.info("prefs.js is not valid");
return false;
}
if (!validateFile(profileDir + "/user.js")) {
logger.info("user.js is not valid");
return false;
}
if (!validateExtensionDirectory(profileDir + "/extensions")) {
logger.info("extensions directory is invalid");
return false;
}
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) {
// String profile = profileDirectory();
File profileDir = new File(profile);
if (profileDir.exists()) {
File prefOverrides = new File(profile, "prefs.js");
if (prefOverrides.exists()) {
undoHttpsOnlyMode(prefOverrides);
undoHomepage(prefOverrides);
}
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);
}
cleanUpFile(new File(profile, "prefs.js"));
cleanUpFile(new File(profile, "user.js"));
cleanUpFile(new File(profile, "user-overrides.js"));
return true;
}
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) {
String oldString = "\"dom.security.https_only_mode\", true";
String newString = "\"dom.security.https_only_mode\", false";
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) {
String oldString = "\"browser.startup.homepage\", true";
File file = new File("Student.txt");
String newString =
String oldStringToFind = "\"browser.startup.homepage\", true";
String newStringToReplace =
"\"browser.startup.homepage\", \"http://127.0.0.1:7657\"";
try {
try (Scanner scanner = new Scanner(file)) {
// now read the file line by line...
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.contains("browser.startup.homepage")) {
oldString = line.toString();
return undoValue(oldString, newString, fileToBeModified);
}
try (Scanner scanner = new Scanner(fileToBeModified)) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.contains(oldStringToFind)) {
return undoValue(line, newStringToReplace, fileToBeModified);
}
}
} catch (FileNotFoundException e) {
@ -145,6 +146,15 @@ public class I2PFirefoxProfileChecker extends I2PCommonBrowser {
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,
File fileToBeModified) {
String oldContent = "";
@ -173,58 +183,38 @@ public class I2PFirefoxProfileChecker extends I2PCommonBrowser {
}
return false;
}
/**
* 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
* @since 0.0.1
*/
public boolean validateFile(String file) {
File f = new File(file);
if (!f.exists()) {
logger.info("User JavaScript file does not exist");
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");
public boolean validateFile(String filePath) {
File file = new File(filePath);
if (!file.exists() || !file.isFile() || !file.canRead() ||
!file.canWrite()) {
return false;
}
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
* @since 0.0.1
*/
public boolean validateExtensionDirectory(String extensionDirectory) {
File extensionDir = new File(extensionDirectory);
if (!extensionDir.exists()) {
logger.info("Extension directory does not exist");
return false;
}
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");
if (!extensionDir.exists() || !extensionDir.isDirectory() ||
!extensionDir.canRead() || !extensionDir.canWrite()) {
return false;
}
return true;
}
}

View File

@ -40,7 +40,7 @@ public class I2PGenericUnsafeBrowser extends I2PCommonBrowser {
// For now, we're just assuming. So don't use this until I understand the
// situation better, unless you think you know better.
private String[] browsers() {
String genericPathsProp = prop.getProperty("generic.bins.unix");
String genericPathsProp = getProperties().getProperty("generic.bins.unix");
if (genericPathsProp != null)
return genericPathsProp.split(",");
return new String[] {
@ -66,11 +66,11 @@ public class I2PGenericUnsafeBrowser extends I2PCommonBrowser {
List<String> list = new ArrayList<String>();
list = Arrays.asList(browsers());
prop.setProperty("generic.bins.unix",
list.stream().collect(Collectors.joining(",")));
getProperties().setProperty("generic.bins.unix",
list.stream().collect(Collectors.joining(",")));
try (OutputStream fos = new FileOutputStream(
new File(runtimeDirectory(""), "browser.config"))) {
prop.store(fos, "Chromium Configuration Section");
getProperties().store(fos, "Chromium Configuration Section");
} catch (IOException ioe) {
logger.warning(ioe.toString());
}
@ -366,7 +366,7 @@ public class I2PGenericUnsafeBrowser extends I2PCommonBrowser {
}
public Process launchAndDetatch(boolean privateWindow, String[] url) {
validateUserDir();
validateUserDirectory();
if (waitForProxy()) {
ProcessBuilder pb;
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) {
String[] schemes = {"http", "https"};
@ -418,7 +436,7 @@ public class I2PGenericUnsafeBrowser extends I2PCommonBrowser {
public static void main(String[] args) {
I2PGenericUnsafeBrowser i2pBrowser = new I2PGenericUnsafeBrowser();
i2pBrowser.validateUserDir();
i2pBrowser.validateUserDirectory();
boolean privateBrowsing = false;
i2pBrowser.logger.info("checking for private browsing");
ArrayList<String> visitURL = new ArrayList<String>();

View File

@ -20,6 +20,5 @@ import javax.script.*;
* @since 1.0.6
*/
public class I2PLibreWolf {
private static final ScriptEngineManager sem = new ScriptEngineManager();
private final ScriptEngine ee = sem.getEngineByName("Nashorn");
// TODO: provide a librewolf updater here.
}

View File

@ -0,0 +1,203 @@
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 lmh;
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/");
}
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/");
}
public String getDisplayName() { return "I2P Browser"; }
public String getName() { return "I2P Browser"; }
public ClientAppState getState() { return ClientAppState.STOPPED; }
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(lmh);
}
}
changeState(ClientAppState.STOPPED);
}
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");
lmh = dtg.addMenu("Launch I2P Browser", new Starter(dtg));
dtg.showMenu(lmh);
dtg.enableMenu(lmh);
} 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
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.
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 0.9.61
*/
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");
}
}
public class StarterThread implements Runnable {
public void run() {
_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");
}
}
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();
}
}
}

View File

@ -1,5 +1,8 @@
#! /usr/bin/env sh
ant distclean
ant jar
./test/test.sh
./test/test-chromium.sh
./test/test-firefox.sh

View File

@ -1,7 +1,7 @@
#! /usr/bin/env sh
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

View File

@ -1,7 +1,7 @@
#! /usr/bin/env sh
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

View File

@ -1,7 +1,7 @@
#! /usr/bin/env sh
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

View File

@ -1,7 +1,7 @@
#! /usr/bin/env sh
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

View File

@ -1,7 +1,7 @@
#! /usr/bin/env sh
ant distclean
cd src && ant jar && cd ..
ant jar
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

View File

@ -1,7 +1,7 @@
#! /usr/bin/env sh
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

View File

@ -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

View File

@ -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

View File

@ -4,9 +4,7 @@ git pull --all
. ./config.sh
. "${HOME}/github-release-config.sh"
ant distclean jar
./windows.sh
./windows-exe.sh
./windows-portable.sh
ant windows-msi-release
msisum=$(sha256sum "i2pbrowser-${GITHUB_TAG}.msi")
github-release upload --user "${GITHUB_USER}" \
--repo "${GITHUB_REPO}" \
@ -16,6 +14,7 @@ github-release upload --user "${GITHUB_USER}" \
--file "i2pbrowser-${GITHUB_TAG}.msi" \
--replace
echo "Uploaded MSI package"
ant windows-exe-release
exesum=$(sha256sum "i2pbrowser-${GITHUB_TAG}.exe")
github-release upload --user "${GITHUB_USER}" \
--repo "${GITHUB_REPO}" \
@ -25,6 +24,7 @@ github-release upload --user "${GITHUB_USER}" \
--file "i2pbrowser-${GITHUB_TAG}.exe" \
--replace
echo "Uploaded EXE package"
ant windows-portable-release
zipsum=$(sha256sum "i2pbrowser-portable-${GITHUB_TAG}.zip")
github-release upload --user "${GITHUB_USER}" \
--repo "${GITHUB_REPO}" \

View File

@ -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