diff --git a/.gitignore b/.gitignore index 5b851ce..daa2630 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ build *.deb *.tgz -I2P-Profile-Installer-0.03.exe -I2P/ -router.info -router.keys.dat \ No newline at end of file +./I2P/ +i2pversion_override +*.crl +*.crt +*.pem \ No newline at end of file diff --git a/HTTPSEverywhere.url b/HTTPSEverywhere.url index 75233aa..6be5966 100644 --- a/HTTPSEverywhere.url +++ b/HTTPSEverywhere.url @@ -1 +1 @@ -https://addons.mozilla.org/firefox/downloads/file/3716461/2021.4.15/https_everywhere-2021.4.15-an+fx.xpi +https://addons.mozilla.org/firefox/downloads/file/3716461/2021.7.13/https_everywhere-2021.7.13-an+fx.xpi diff --git a/Makefile b/Makefile index c26f1f7..be33a4c 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,40 @@ -all: install.exe +-include i2pversion +-include i2pversion_override -prep: profile.tgz app-profile.tgz profile build/licenses build/I2P build/I2P/config +-include config.mk + +preset=`rm .version; make .version` + +include .version + +PROFILE_VERSION=$(MAJOR).$(MINOR).$(BUILD) + +all: .version install.exe + +tag: + git tag $(PROFILE_VERSION) + +.version: + sed 's|!define VERSION||g' src/nsis/i2pbrowser-version.nsi | sed 's| |=|g' > .version + make version.txt src/nsis/i2pbrowser_jpackage.nsi + +version.txt: + echo "$(PROFILE_VERSION)" > src/profile/version.txt + echo "$(PROFILE_VERSION)" > src/app-profile/version.txt + +src/nsis/i2pbrowser_jpackage.nsi: + echo "!define I2P_VERSION $(I2P_VERSION)" > src/nsis/i2pbrowser_jpackage.nsi + +jpackage: .version I2P all + +help: .version + @echo "I2P-Profile-Installer-$(PROFILE_VERSION)" + @echo "$(SIGNER)" + @echo "$(I2P_VERSION)" + @echo "$(MAJOR).$(MINOR).$(BUILD)" + @echo "$(preset)" + +prep: profile.tgz app-profile.tgz profile build/licenses build/I2P build/I2P/config launchers cp src/nsis/*.nsi build cp src/nsis/*.nsh build cp src/icons/*.ico build @@ -10,28 +44,41 @@ install.exe: prep export RES_DIR="../i2p.i2p/installer/resources" export PKG_DIR="../i2p.i2p/pkg-temp" +export I2P_JBIGI="../i2p.i2p/installer/lib/jbigi" + +distclean: clean + rm -rf I2P + +I2P: + ./build.sh build/I2P: build rm -rf build/I2P cp -rv I2P build/I2P ; true + cp "$(I2P_JBIGI)"/*windows*.dll build/I2P/runtime/lib; true configdir: src/I2P/config src/I2P/config: + mkdir src/I2P/config rm -rf src/I2P/config/geoip src/I2P/config/webapps src/I2P/config/certificates - echo true | tee src/I2P/config/jpackaged ; true - cp $(RES_DIR)/clients.config src/I2P/config/ ; true - cp $(RES_DIR)/i2ptunnel.config src/I2P/config/ ; true - cp $(RES_DIR)/wrapper.config src/I2P/config/ ; true - cp $(RES_DIR)/hosts.txt src/I2P/config/hosts.txt ; true - cp -R $(RES_DIR)/certificates src/I2P/config/certificates ; true - mkdir -p src/I2P/config/geoip ; true - cp $(RES_DIR)/GeoLite2-Country.mmdb.gz src/I2P/config/geoip/GeoLite2-Country.mmdb.gz ; true - cp -R "$(PKG_DIR)"/webapps src/I2P/config/webapps ; true - cd src/I2P/config/geoip && gunzip GeoLite2-Country.mmdb.gz; cd ../../.. ; true + echo true | tee src/I2P/config/jpackaged + cp -v $(RES_DIR)/clients.config src/I2P/config/ + cp -v $(RES_DIR)/i2ptunnel.config src/I2P/config/ + cp -v $(RES_DIR)/wrapper.config src/I2P/config/ + #grep -v 'router.updateURL' $(RES_DIR)/router.config > src/I2P/config/router.config + cat router.config >> src/I2P/config/router.config + cp -v $(RES_DIR)/hosts.txt src/I2P/config/hosts.txt + cp -R $(RES_DIR)/certificates src/I2P/config/certificates + cp -R $(RES_DIR)/eepsite src/I2P/config/eepsite + mkdir -p src/I2P/config/geoip + cp -v $(RES_DIR)/GeoLite2-Country.mmdb.gz src/I2P/config/geoip/GeoLite2-Country.mmdb.gz + cp -R "$(PKG_DIR)"/webapps src/I2P/config/webapps + cd src/I2P/config/geoip && gunzip GeoLite2-Country.mmdb.gz; cd ../../.. -build/I2P/config: build/I2P +build/I2P/config: build/I2P src/I2P/config cp -rv src/I2P/config build/I2P/config ; true + cp -rv src/I2P/config build/I2P/.i2p ; true # # Warning: a displayed license file of more than 28752 bytes @@ -45,7 +92,7 @@ build/licenses: build unix2dos build/licenses/LICENSE.index clean: - rm -rf build app-profile-*.tgz profile-*.tgz I2P-Profile-Installer-*.exe *.deb + rm -rf build app-profile-*.tgz profile-*.tgz I2P-Profile-Installer-*.exe *.deb src/I2P/config *.su3 build: @echo "creating build directory" @@ -53,9 +100,10 @@ build: profile: build/profile/user.js build/profile/prefs.js build/profile/bookmarks.html build/profile/storage-sync.sqlite copy-xpi -profile.tgz: profile - $(eval PROFILE_VERSION := $(shell cat src/profile/version.txt)) +profile.tgz: .version profile +# $(eval PROFILE_VERSION := $(shell cat src/profile/version.txt)) @echo "building profile tarball $(PROFILE_VERSION)" + bash -c 'ls I2P && cp -rv build/I2P build/profile/I2P'; true install -m755 src/unix/i2pbrowser.sh build/profile/i2pbrowser.sh cd build && tar -czf profile-$(PROFILE_VERSION).tgz profile && cp profile-$(PROFILE_VERSION).tgz ../ @@ -76,11 +124,12 @@ copy-xpi: build/NoScript.xpi build/HTTPSEverywhere.xpi build/i2prhz@eyedeekay.gi cp build/HTTPSEverywhere.xpi "build/profile/extensions/https-everywhere-eff@eff.org.xpi" cp build/i2prhz@eyedeekay.github.io.xpi build/profile/extensions/i2prhz@eyedeekay.github.io.xpi -app-profile: build/app-profile/user.js build/app-profile/prefs.js build/app-profile/chrome/userChrome.css build/app-profile/bookmarks.html build/app-profile/storage-sync.sqlite copy-app-xpi +app-profile: .version build/app-profile/user.js build/app-profile/prefs.js build/app-profile/chrome/userChrome.css build/app-profile/bookmarks.html build/app-profile/storage-sync.sqlite copy-app-xpi app-profile.tgz: app-profile - $(eval PROFILE_VERSION := $(shell cat src/app-profile/version.txt)) +# $(eval PROFILE_VERSION := $(shell cat src/app-profile/version.txt)) @echo "building app-profile tarball $(PROFILE_VERSION)" + bash -c 'ls I2P && cp -rv build/I2P build/app-profile/I2P'; true install -m755 src/unix/i2pconfig.sh build/app-profile/i2pconfig.sh cd build && tar -czf app-profile-$(PROFILE_VERSION).tgz app-profile && cp app-profile-$(PROFILE_VERSION).tgz ../ @@ -131,7 +180,20 @@ build/profile/extensions: build/profile build/profile: build mkdir -p build/profile - + +build/win: + mkdir -p build/win/ + +build/win/i2pbrowser.bat: + cp src/win/i2pbrowser.bat build/win/i2pbrowser.bat + +build/win/i2pconfig.bat: + cp src/win/i2pconfig.bat build/win/i2pconfig.bat + +build/win/i2pbrowser-private.bat: + cp src/win/i2pbrowser-private.bat build/win/i2pbrowser-private.bat + +launchers: build/win build/win/i2pbrowser.bat build/win/i2pbrowser-private.bat build/win/i2pconfig.bat build/app-profile/chrome: build/app-profile mkdir -p build/app-profile/chrome @@ -168,7 +230,7 @@ uninstall: /usr/share/applications/i2pbrowser.desktop \ /usr/share/applications/i2pconfig.desktop -checkinstall: +checkinstall: version checkinstall \ --default \ --install=no \ @@ -178,10 +240,21 @@ checkinstall: --pkggroup=net \ --pkgrelease=1 \ --pkgsource="https://i2pgit.org/i2p-hackers/i2p.firefox" \ - --maintainer="hankhill19580@gmail.com" \ - --requires="firefox,wget,i2p,i2p-router" \ + --maintainer="$(SIGNER)" \ + --requires="firefox,wget" \ --suggests="i2p,i2p-router,syndie,tor,tsocks" \ --nodoc \ --deldoc=yes \ --deldesc=yes \ --backup=no + +GOPATH=$(HOME)/go + +$(GOPATH)/src/i2pgit.org/idk/su3-tools/su3-tools: + git clone https://i2pgit.org/idk/su3-tools $(GOPATH)/src/i2pgit.org/idk/su3-tools; true + git pull --all + cd $(GOPATH)/src/i2pgit.org/idk/su3-tools && \ + go mod vendor && go build + +su3: $(GOPATH)/src/i2pgit.org/idk/su3-tools/su3-tools + $(GOPATH)/src/i2pgit.org/idk/su3-tools/su3-tools -name "I2P-Profile-Installer-$(PROFILE_VERSION)" -signer "$(SIGNER)" -version "$(I2P_VERSION)" diff --git a/NoScript.url b/NoScript.url index 41aed5b..73fb92c 100644 --- a/NoScript.url +++ b/NoScript.url @@ -1 +1 @@ -https://addons.mozilla.org/firefox/downloads/file/3534184/11.2.8/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi +https://addons.mozilla.org/firefox/downloads/file/3534184/11.2.11/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi diff --git a/README.md b/README.md index a3ed344..6e62640 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ To build this, you will need the following software packages (all available in D * nsis * dos2unix * curl + * jq to build a Debian package, you'll also need @@ -89,6 +90,123 @@ with `sudo service i2p start` then you can run the script: /usr/local/bin/i2p-config-service-setup +Including a jpackaged I2P Router(EXPERIMENTAL) +---------------------------------------------- + +In order to include a jpackaged(dependency-free) I2P router in the Profile +Bundle you will need to build the jpackaged I2P router as an "App Image" on +a Windows system and place it into a directory called `I2P` in your `i2p.firefox` +checkout. + +Assuming a working java and jpackage environment on your Windows system, the +following command should generate a suitable "App Image" in a directory +called "I2P." + + export I2P_VERSION=0.9.49 + cp -R ../i2p.i2p/pkg-temp/lib build/lib + jpackage --type app-image --name I2P --app-version "$I2P_VERSION" \ + --verbose \ + --resource-dir build/lib \ + --input build/lib --main-jar router.jar --main-class net.i2p.router.RouterLaunch + +Transfer the I2P directory to the machine where you build i2p.firefox if +necessary, then complete the regular build instructions. If a jpackaged I2P router +isn't present to use at build time, the inclusion will be skipped automatically +with a non-fatal warning. + +In the near future, I'll start providing a pre-built app image to ease the +build process for non-Windows users. + +End-to-End Windows build process using WSL +------------------------------------------ + +**If you've already done this once, you can just use:** `./build.sh && wsl make` +**in `git bash`** to automatically build an installer. + +**Prerequisites:** You need to have OpenJDK 14 or greater installed and configured +with your `%JAVA_HOME%` environment variable configured and `%JAVA_HOME%/bin` on +your `%PATH%`. You need to have Apache Ant installed and configured with `%ANT_HOME%` +environment variable configured and `%ANT_HOME%/bin` on your `%PATH%`. You must have +Cygwin installed. You must have `NSIS.exe` installed and `makensis` available on your +`%PATH%`. You must have Git for Windows installed. When installing git for Windows, +you should select "Checkout as is, commit as is" and leave line-endings alone. + + 1. [Set up Windows Subsystem for Linux per Microsoft's instructions](https://docs.microsoft.com/en-us/windows/wsl/install-win10#manual-installation-steps) + 2. [Install Ubuntu Focal per Microsoft's instructions](https://www.microsoft.com/store/apps/9n6svws3rx71) + 3. Open Git Bash. + 4. Install prerequisites `wsl sudo apt-get update && sudo apt-get install make nsis dos2unix curl jq` + 5. Clone `i2p.i2p` and `i2p.firefox` + + git clone https://github.com/i2p/i2p.i2p + git clone https://github.com/i2p/i2p.firefox + + 6. Move to the i2p.i2p directory. Build the .jar files required to build the App Image + inside i2p.i2p. Return to home. + + cd i2p.i2p + ant clean pkg + cd .. + + 7. Move into the i2p.firefox directory. Run the `./build.sh` script. + + cd i2p.firefox + ./build.sh + + 8. Compile the NSIS installer using WSL. + + wsl make + +End-to-End Windows build process using Cygwin +--------------------------------------------- + +**Prerequisites:** You need to have OpenJDK 14 or greater installed and configured +with your `%JAVA_HOME%` environment variable configured and `%JAVA_HOME%/bin` on +your `%PATH%`. You need to have Apache Ant installed and configured with `%ANT_HOME%` +environment variable configured and `%ANT_HOME%/bin` on your `%PATH%`. You must have +WSL and git bash installed. You must have `NSIS.exe` installed and `makensis` available on your +`%PATH%`. You must have Git for Windows installed. When installing git for Windows, you should +select "Checkout as is, commit as is" and leave line-endings alone. + +TODO: Add links to the respective instructions for each of these. + + 1. Run the Cygwin `setup-$arch.exe` for your platform to set up new packages. + Select the `make` `jq` `dos2unix` and `curl` packages. + 2. Open a cygwin terminal. + 3. Clone `i2p.i2p` and `i2p.firefox` + + git clone https://github.com/i2p/i2p.i2p + git clone https://github.com/i2p/i2p.firefox + + 3. Move to the i2p.i2p directory. Build the .jar files required to build the App Image + inside i2p.i2p. Return to home. + + cd i2p.i2p + ant clean pkg + cd .. + + 7. Move into the i2p.firefox directory. Run the `./build.sh` script. + + cd i2p.firefox + ./build.sh + + 5. Run `make` to build the installer. + +Building a signed update file +----------------------------- + +Building a signed update file for automatically updating a Windows I2P router +requires you to also have Go installed in your Cygwin or WSL environment. +With WSL, you can do this using the command: + + wsl sudo apt-get install golang-go + +With that dependency satisfied, you can then run: + + wsl make su3 + +to build the signing tool if necessary and then package the installer in a +signed update file. + Issues ------ diff --git a/UPDATES.md b/UPDATES.md new file mode 100644 index 0000000..6f5b842 --- /dev/null +++ b/UPDATES.md @@ -0,0 +1,29 @@ +Setting up an Update Server for an I2P Bundle +============================================= + +It is important to set up a signed update server so that people are able to +safely and anonymously update your I2P bundle. + +The quick way: +-------------- + +This process depends on my ability to push releases to github. If you are +forking, setting up a dev server, or taking over because I got hit by a bus, +you'll need to do it the complete way. + +For as long as I am building updates, you will be able to mirror the jpackaged +Windows bundle by cloning the repository `https://github.com/eyedeekay/i2p` and +running the `make docker run` target in that repository. You can retrieve the +base32 address of your update server by viewing the log with +`docker logs eephttpd-jpackage | grep b32.i2p | tee eephttpd-address.md`. To +update the site, run `./update.site.sh` in that repository. + +Once you have cloned the repository and started the container with +`make docker run`, you can simply add `path/to/repo/update-site.sh` to your +`crontab` and it will update at an interval of your choosing. + +The complete way: +----------------- + +TODO: describe how to do it with less of the awesome fancy stuff I put together +to make it easier on myself to keep an update server going. \ No newline at end of file diff --git a/amo-version.sh b/amo-version.sh index 8f85dbe..1d6e566 100755 --- a/amo-version.sh +++ b/amo-version.sh @@ -1,3 +1,4 @@ #! /usr/bin/env sh -curl -s https://addons.mozilla.org/api/v5/addons/addon/$1/versions/?page_size=1 | jq '.results | .[0] | .version' | tr -d '"' \ No newline at end of file +curl -s "https://addons.mozilla.org/api/v5/addons/addon/$1/versions/?page_size=1" | jq '.results | .[0] | .version' | tr -d '"' + diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..3a3ba16 --- /dev/null +++ b/build.sh @@ -0,0 +1,61 @@ +#!/bin/bash +set -e + +. i2pversion + +if [ -f i2pversion_override ]; then + . i2pversion_override +fi + +JAVA=$(java --version | tr -d 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n' | cut -d ' ' -f 2 | cut -d '.' -f 1 | tr -d '\n\t\- ') + +if [ "$JAVA" -lt "14" ]; then + echo "Java 14+ must be used to compile with jpackage, java is $JAVA" + exit 1 +fi +sleep 2s + +if [ -z "${JAVA_HOME}" ]; then + JAVA_HOME=`type -p java|xargs readlink -f|xargs dirname|xargs dirname` + echo "Building with: $JAVA, $JAVA_HOME" +fi + +echo "cleaning" +./clean.sh + +HERE="$PWD" +cd "$HERE/../i2p.i2p/" +git checkout "$VERSION" +ant distclean preppkg-windows || true + +cd "$HERE" +RES_DIR="$HERE/../i2p.i2p/installer/resources" +I2P_JARS="$HERE/../i2p.i2p/pkg-temp/lib" +I2P_JBIGI="$HERE/../i2p.i2p/installer/lib//jbigi" +I2P_PKG="$HERE/../i2p.i2p/pkg-temp" + +echo "compiling custom launcher" +mkdir build +cp "$I2P_JARS"/*.jar build + +cd java +"$JAVA_HOME"/bin/javac -d ../build -classpath "$HERE"/build/i2p.jar:"$HERE"/build/router.jar:"$HERE"/build/routerconsole.jar net/i2p/router/WinLauncher.java net/i2p/router/WindowsUpdatePostProcessor.java net/i2p/router/WinUpdateProcess.java +cd .. + +#echo "building launcher.jar" +cd build +"$JAVA_HOME"/bin/jar -cf launcher.jar net +cd .. + +if [ -z $I2P_VERSION ]; then + I2P_VERSION=$("$JAVA_HOME"/bin/java -cp build/router.jar net.i2p.router.RouterVersion | sed "s/.*: //" | head -n 1 | sed 's|-|.|g') +fi +echo "preparing to invoke jpackage for I2P version $I2P_VERSION" + + +"$JAVA_HOME"/bin/jpackage --type app-image --name I2P --app-version "$I2P_VERSION" \ + --verbose \ + $JPACKAGE_OPTS \ + --resource-dir build \ + --java-options "--illegal-access=permit" \ + --input build --main-jar launcher.jar --main-class net.i2p.router.WinLauncher diff --git a/clean.sh b/clean.sh new file mode 100755 index 0000000..d03bcbd --- /dev/null +++ b/clean.sh @@ -0,0 +1,17 @@ +#! /usr/bin/env sh + +rm -rf \ + build \ + eventlog.txt \ + hostsdb.blockfile \ + I2P \ + i2p_1.0-1_amd64.deb \ + libjbigi.so \ + libjcpuid.so \ + logs \ + peerProfiles \ + prngseed.rnd \ + wrapper.log \ + *.jar \ + *.exe \ + *.dmg \ No newline at end of file diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..d59fd33 --- /dev/null +++ b/config.mk @@ -0,0 +1,2 @@ +SIGNER=hankhill19580@gmail.com +export SIGNER=hankhill19580@gmail.com diff --git a/i2pversion b/i2pversion new file mode 100644 index 0000000..1967af4 --- /dev/null +++ b/i2pversion @@ -0,0 +1,15 @@ +#! /usr/bin/env sh + + +#Comment this out to build from an alternate branch or +# the tip of the master branch. +#I2P_VERSION=0.9.50 +#export I2P_VERSION=0.9.50 +#VERSION=i2p-$I2P_VERSION +#export VERSION="$VERSION" + +#Uncomment this to build from the tip of the master. +I2P_VERSION=0.9.50 +export I2P_VERSION=0.9.50 +VERSION=master +export VERSION="$VERSION" diff --git a/java/net/i2p/router/WinLauncher.java b/java/net/i2p/router/WinLauncher.java new file mode 100644 index 0000000..21e7946 --- /dev/null +++ b/java/net/i2p/router/WinLauncher.java @@ -0,0 +1,108 @@ +package net.i2p.router; + +import java.io.*; +import java.util.*; + +import net.i2p.crypto.*; + +import net.i2p.app.ClientAppManager; +import net.i2p.router.RouterLaunch; +import net.i2p.router.Router; +import net.i2p.update.UpdateManager; +import net.i2p.update.UpdatePostProcessor; +import net.i2p.util.SystemVersion; +import net.i2p.update.*; + +import static net.i2p.update.UpdateType.*; + +/** + * Launches a router from %PROGRAMFILES%/I2P using configuration data in + * %LOCALAPPDATA%/I2P.. Uses Java 9 APIs. + + * Sets the following properties: + * i2p.dir.base - this points to the (read-only) resources inside the bundle + * i2p.dir.config this points to the (read-write) config directory in local appdata + * router.pid - the pid of the java process. + */ +public class WinLauncher { + private static WindowsUpdatePostProcessor wupp = new WindowsUpdatePostProcessor(); + public static void main(String[] args) throws Exception { + File programs = wupp.selectProgramFile(); + if (!programs.exists()) + programs.mkdirs(); + else if (!programs.isDirectory()) { + System.err.println(programs + " exists but is not a directory. Please get it out of the way"); + System.exit(1); + } + + File home = selectHome(); + if (!home.exists()) + home.mkdirs(); + else if (!home.isDirectory()) { + System.err.println(home + " exists but is not a directory. Please get it out of the way"); + System.exit(1); + } + + System.setProperty("i2p.dir.base", programs.getAbsolutePath()); + System.setProperty("i2p.dir.config", home.getAbsolutePath()); + System.setProperty("router.pid", String.valueOf(ProcessHandle.current().pid())); + System.out.println("\t"+System.getProperty("i2p.dir.base") +"\n\t"+System.getProperty("i2p.dir.config")+"\n\t"+ System.getProperty("router.pid")); + + wupp.i2pRouter = new Router(System.getProperties()); + System.out.println("Router is configured"); + + Thread registrationThread = new Thread(REGISTER_UPP); + registrationThread.setName("UPP Registration"); + registrationThread.setDaemon(true); + registrationThread.start(); + + wupp.i2pRouter.runRouter(); + } + + private static final Runnable REGISTER_UPP = () -> { + + // first wait for the RouterContext to appear + RouterContext ctx; + while ((ctx = (RouterContext) wupp.i2pRouter.getContext().getCurrentContext()) == null) { + sleep(1000); + } + + // then wait for the update manager + ClientAppManager cam = ctx.clientAppManager(); + UpdateManager um; + while ((um = (UpdateManager) cam.getRegisteredApp(UpdateManager.APP_NAME)) == null) { + sleep(1000); + } + + wupp = new WindowsUpdatePostProcessor(ctx); + um.register(wupp, UpdateType.ROUTER_SIGNED_SU3, SU3File.TYPE_EXE); + um.register(wupp, UpdateType.ROUTER_DEV_SU3, SU3File.TYPE_EXE); + }; + + private static void sleep(int millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException bad) { + bad.printStackTrace(); + throw new RuntimeException(bad); + } + } + + private static File selectHome() { //throws Exception { + if (SystemVersion.isWindows()) { + File home = new File(System.getProperty("user.home")); + File appData = new File(home, "AppData"); + File local = new File(appData, "Local"); + File i2p; + i2p = new File(local, "I2P"); + System.out.println("Windows jpackage wrapper started, using: " + i2p + " as base config"); + return i2p.getAbsoluteFile(); + } else { + File jrehome = new File(System.getProperty("java.home")); + File programs = new File(jrehome.getParentFile().getParentFile(), ".i2p"); + System.out.println("Linux portable jpackage wrapper started, using: " + programs + " as base config"); + return programs.getAbsoluteFile(); + } + } + +} diff --git a/java/net/i2p/router/WinUpdateProcess.java b/java/net/i2p/router/WinUpdateProcess.java new file mode 100644 index 0000000..98a8aa4 --- /dev/null +++ b/java/net/i2p/router/WinUpdateProcess.java @@ -0,0 +1,72 @@ +package net.i2p.router; + +import net.i2p.router.*; +import net.i2p.I2PAppContext; + +import java.util.function.*; +import java.io.*; +import net.i2p.util.Log; + +class WinUpdateProcess implements Runnable { + private final RouterContext ctx; + private final Supplier versionSupplier; + private final Supplier fileSupplier; + + WinUpdateProcess(RouterContext ctx, Supplier versionSupplier, Supplier fileSupplier) { + this.ctx = ctx; + this.versionSupplier = versionSupplier; + this.fileSupplier = fileSupplier; + } + + private File workDir() throws IOException{ + if (ctx != null) { + File workDir = new File(ctx.getConfigDir().getAbsolutePath(), "i2p_update_win"); + if (workDir.exists()) { + if (workDir.isFile()) + throw new IOException(workDir + " exists but is a file, get it out of the way"); + return null; + } else { + workDir.mkdirs(); + } + return workDir; + } + return null; + } + + private void runUpdateInstaller() throws IOException { + String version = versionSupplier.get(); + File file = fileSupplier.get(); + if (file == null) + return; + + var workingDir = workDir(); + var logFile = new File(workingDir, "log-" + version + ".txt"); + + ProcessBuilder pb = new ProcessBuilder(file.getAbsolutePath()); + var env = pb.environment(); + env.put("OLD_I2P_VERSION", version); + env.remove("RESTART_I2P"); + + int exitCode = ctx.router().scheduledGracefulExitCode(); + if (exitCode == Router.EXIT_HARD_RESTART || exitCode == Router.EXIT_GRACEFUL_RESTART) + env.put("RESTART_I2P", "true"); + + try { + pb.directory(workingDir). + redirectErrorStream(true). + redirectOutput(logFile). + start(); + } catch (IOException ex) { + System.out.println("Unable to run update-program in background. Update will fail."); + } + } + + @Override + public void run() { + try { + runUpdateInstaller(); + } catch(IOException ioe) { + System.out.println("Error running updater, update may fail." + ioe); + } + } +} diff --git a/java/net/i2p/router/WindowsUpdatePostProcessor.java b/java/net/i2p/router/WindowsUpdatePostProcessor.java new file mode 100644 index 0000000..75a5851 --- /dev/null +++ b/java/net/i2p/router/WindowsUpdatePostProcessor.java @@ -0,0 +1,119 @@ +package net.i2p.router; + +import java.io.*; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.*; + + +import net.i2p.crypto.*; +import static net.i2p.update.UpdateType.*; +import net.i2p.I2PAppContext; +import net.i2p.update.UpdateType; +import net.i2p.update.UpdatePostProcessor; +import net.i2p.util.Log; +import net.i2p.util.SystemVersion; + +import java.lang.ProcessBuilder; +import java.lang.Process; +import java.lang.InterruptedException; + + +public class WindowsUpdatePostProcessor implements UpdatePostProcessor { + private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(WindowsUpdatePostProcessor.class); + private final RouterContext ctx; + protected static Router i2pRouter = null; + + private final AtomicBoolean hook = new AtomicBoolean(); + + private volatile String version; + + private volatile File positionedFile = null; + private final String fileName = "i2p-jpackage-update.exe"; + + WindowsUpdatePostProcessor() { + this.ctx = null; + } + + WindowsUpdatePostProcessor(RouterContext ctx) { + this.ctx = ctx; + } + + public String getVersion() { + return version; + } + + public File getFile() { + return positionedFile; + } + + public void updateDownloadedandVerified(UpdateType type, int fileType, String version, File file) throws IOException { + _log.info("Got an update to post-process"); + + if (type != UpdateType.ROUTER_SIGNED_SU3 && type != UpdateType.ROUTER_DEV_SU3) { + _log.warn("Unsupported update type " + type); + return; + } + + if (fileType != SU3File.TYPE_EXE) { + _log.warn("Unsupported file type " + fileType); + return; + } + + this.positionedFile = moveUpdateInstaller(file); + this.version = version; + + if (!hook.compareAndSet(false,true)) { + _log.info("shutdown hook was already set"); + return; + } + + _log.info("adding shutdown hook"); + ctx.addFinalShutdownTask(new WinUpdateProcess(ctx, this::getVersion, this::getFile)); + + } + + private File moveUpdateInstaller(File file) throws IOException { + RouterContext i2pContext = i2pRouter.getContext(); + if (i2pContext != null) { + File newFile = new File(workDir(), fileName); + boolean renamedStatus = file.renameTo(newFile); + if (renamedStatus) + return newFile; + else + throw new IOException("WindowsUpdatePostProcesssor unable to move file to working directory, update will fail"); + } + throw new IOException("Router context not available to WindowsUpdatePostProcesssor, unable to find working directory, update will fail"); + } + + private File workDir() throws IOException{ + RouterContext i2pContext = i2pRouter.getContext(); + if (i2pContext != null) { + File workDir = new File(i2pContext.getConfigDir().getAbsolutePath(), "i2p_update_win"); + if (workDir.exists()) { + if (workDir.isFile()) + throw new IOException(workDir + " exists but is a file, get it out of the way"); + return null; + } else { + workDir.mkdirs(); + } + return workDir; + } + return null; + } + + protected File selectProgramFile() { + if (SystemVersion.isWindows()) { + File jrehome = new File(System.getProperty("java.home")); + File programs = jrehome.getParentFile(); + System.out.println("Windows portable jpackage wrapper found, using: " + programs + " as working config"); + return programs.getAbsoluteFile(); + } else { + File jrehome = new File(System.getProperty("java.home")); + File programs = new File(jrehome.getParentFile().getParentFile(), "i2p"); + System.out.println("Linux portable jpackage wrapper found, using: " + programs + " as working config"); + return programs.getAbsoluteFile(); + } + } + +} \ No newline at end of file diff --git a/router.config b/router.config new file mode 100644 index 0000000..83512db --- /dev/null +++ b/router.config @@ -0,0 +1,3 @@ +router.updateURL=http://ekm3fu6fr5pxudhwjmdiea5dovc3jdi66hjgop4c7z7dfaw7spca.b32.i2p/i2pwinupdate.su3 +router.newsURL=http://tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq.b32.i2p/win/stable/news.su3 +router.backupNewsURL=http://dn3tvalnjz432qkqsvpfdqrwpqkw3ye4n4i2uyfr4jexvo3sp5ka.b32.i2p/news/win/stable/news.su3 diff --git a/src/app-profile/prefs.js b/src/app-profile/prefs.js index 193712b..11e8061 100644 --- a/src/app-profile/prefs.js +++ b/src/app-profile/prefs.js @@ -53,3 +53,10 @@ user_pref("browser.newtabpage.activity-stream.feeds.section.highlights", false); user_pref("browser.newtabpage.activity-stream.feeds.section.topstories", false); user_pref("browser.newtabpage.activity-stream.default.sites", "http://127.0.0.1:7657/home,http://127.0.0.1:7657/i2psnark/,http://127.0.0.1:7657/susimail/"); user_pref("browser.newtabpage.activity-stream.feeds.topsites", true); +user_pref("ui.use_standins_for_native_colors", true); +user_pref("webgl.disable-extensions", true); +user_pref("webgl.min_capability_mode", true); +user_pref("webgl.disable-fail-if-major-performance-caveat", true); +user_pref("webgl.enable-webgl2", false); +user_pref("media.navigator.enabled", false); +user_pref("dom.w3c_touch_events.enabled", false); diff --git a/src/app-profile/user.js b/src/app-profile/user.js index 985a1de..c4bb768 100644 --- a/src/app-profile/user.js +++ b/src/app-profile/user.js @@ -216,3 +216,9 @@ user_pref("keyword.enabled", false); user_pref("extensions.allowPrivateBrowsingByDefault", true); user_pref("extensions.PrivateBrowsing.notification", false); user_pref("browser.newtabpage.activity-stream.feeds.topsites", true); +user_pref("ui.use_standins_for_native_colors", true); +user_pref("webgl.disable-extensions", true); +user_pref("webgl.min_capability_mode", true); +user_pref("webgl.disable-fail-if-major-performance-caveat", true); +user_pref("webgl.enable-webgl2", false); +user_pref("dom.w3c_touch_events.enabled", false); diff --git a/src/app-profile/version.txt b/src/app-profile/version.txt index bd73f47..728cb37 100644 --- a/src/app-profile/version.txt +++ b/src/app-profile/version.txt @@ -1 +1 @@ -0.4 +0.04.0 diff --git a/src/nsis/FindProcess.nsh b/src/nsis/FindProcess.nsh new file mode 100644 index 0000000..7020bd2 --- /dev/null +++ b/src/nsis/FindProcess.nsh @@ -0,0 +1,122 @@ +/* FindProcess.nsh +* +* written by Donald Miller +* Mar 7, 2007 +* +*/ + +!include LogicLib.nsh +!include WordFunc.nsh +!insertmacro WordFind + +!ifndef FindProcess +!define FindProcess '!insertmacro FindProcess' + +!macro FindProcess ProcessList BoolReturn + Push '${ProcessList}' + Call FindProcess + Pop ${BoolReturn} +!macroend + +Function FindProcess + # return True if any process in ProcessList is active + Exch $0 ; get ProcessList, save $0 + Push $1 + Push $2 + Push $R0 + Push $R1 + Push $R2 + + StrCpy $2 "$0," ; $2 = ProcessList + + Push 0 ; set return value = False + + # method based upon one by Phoenix1701@gmail.com 1/27/07 + + System::Alloc 1024 + Pop $R0 ; process list buffer + + # get an array of all process ids + System::Call "Psapi::EnumProcesses(i R0, i 1024, *i .R1)i .r0" + ${Unless} $0 = 0 + + IntOp $R1 $R1 / 4 ; Divide by sizeof(DWORD) to get $R1 process count + IntOp $R1 $R1 - 1 ; decr for 0 base loop + + ClearErrors + ${For} $R2 0 $R1 + # get a PID from the array + IntOp $0 $R2 << 2 + IntOp $0 $0 + $R0 ; buffer.dword[i] + System::Call "*$0(i .r0)" ; Get next PID + + ${Unless} $0 = 0 + Push $0 + Call GetProcessName + Pop $1 + + # is this process one we are looking for? + ${WordFind} '$2' ',' 'E/$1' $0 + ${Unless} ${Errors} + # yes, change return value + Pop $0 ; discard old result + Push 1 ; set return True + + # exit the loop + ${Break} + ${EndUnless} + ${EndUnless} + ${Next} + + ${EndUnless} + + System::Free $R0 + + Pop $0 ; get return value + Pop $R2 ; restore registers + Pop $R1 + Pop $R0 + Pop $2 + Pop $1 + Exch $0 +FunctionEnd + +Function GetProcessName + # ( Pid -- ProcessName ) + Exch $2 ; get Pid, save $2 + Push $0 + Push $1 + Push $3 + Push $R0 + + System::Call "Kernel32::OpenProcess(i 1040, i 0, i r2)i .r3" + + StrCpy $2 "" ; set return value + + ${Unless} $3 = 0 ; $3 is hProcess + # get hMod array + System::Alloc 1024 + Pop $R0 + + # params: Pid, &hMod, sizeof(hMod), &cb + System::Call "Psapi::EnumProcessModules(i r3, i R0, i 1024, *i .r1)i .r0" + + ${Unless} $0 = 0 + # get first hMod + System::Call "*$R0(i .r0)" + + # get BaseName; params: Pid, hMod, szBuffer, sizeof(szBuffer) + System::Call "Psapi::GetModuleBaseName(i r3, i r0, t .r2, i 256)i .r0" + ${EndUnless} + + System::Free $R0 + System::Call "kernel32::CloseHandle(i r3)" + ${EndUnless} + + Pop $R0 ; restore registers + Pop $3 + Pop $1 + Pop $0 + Exch $2 ; save process name +FunctionEnd +!endif \ No newline at end of file diff --git a/src/nsis/i2pbrowser-installer.nsi b/src/nsis/i2pbrowser-installer.nsi index 072c435..0f8f19e 100644 --- a/src/nsis/i2pbrowser-installer.nsi +++ b/src/nsis/i2pbrowser-installer.nsi @@ -1,4 +1,4 @@ -# uncomment on v3 +# This now requires v3 UniCode true !define APPNAME "I2PBrowser-Launcher" @@ -11,11 +11,14 @@ UniCode true !define CONSOLE_URL "http://127.0.0.1:7657/home" !include i2pbrowser-version.nsi +!include i2pbrowser-jpackage.nsi +!include FindProcess.nsh var FFINSTEXE var FFNONTORINSTEXE var I2PINSTEXE + !define FFINSTEXE !define FFNONTORINSTEXE !define FFINSTEXE32 "$PROGRAMFILES32\Mozilla Firefox\" @@ -27,14 +30,14 @@ var I2PINSTEXE !define RAM_NEEDED_FOR_64BIT 0x80000000 -InstallDir "$PROGRAMFILES\${COMPANYNAME}\${APPNAME}" +InstallDir "$PROGRAMFILES64\${COMPANYNAME}\${APPNAME}" # rtf or txt file - remember if it is txt, it must be in the DOS text format (\r\n) LicenseData "licenses\LICENSE.index" # This will be in the installer/uninstaller's title bar Name "${COMPANYNAME} - ${APPNAME}" Icon ui2pbrowser_icon.ico -OutFile "I2P-Profile-Installer-${VERSIONMAJOR}.${VERSIONMINOR}${VERSIONBUILD}.exe" +OutFile "I2P-Profile-Installer-${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}.exe" RequestExecutionLevel admin @@ -169,10 +172,11 @@ Function .onInit StrCpy $FFINSTEXE "$PROFILE/Desktop/Tor Browser/Browser/" ${EndIf} ${EndIf} - ${If} ${FileExists} "${I2PINSTEXE32}/i2p.exe" + StrCpy $I2PINSTEXE "${I2PINSTEXE64}" + ${If} ${FileExists} "${I2PINSTEXE32}\i2p.exe" StrCpy $I2PINSTEXE "${I2PINSTEXE32}" ${EndIf} - ${If} ${FileExists} "${I2PINSTEXE64}/i2p.exe" + ${If} ${FileExists} "${I2PINSTEXE64}\i2p.exe" StrCpy $I2PINSTEXE "${I2PINSTEXE64}" ${EndIf} FunctionEnd @@ -185,6 +189,36 @@ FunctionEnd Function routerDetect ${If} ${FileExists} "$I2PINSTEXE" + Abort directory + ${Else} + createDirectory $I2PINSTEXE + SetOutPath $I2PINSTEXE + File /nonfatal /a /r "I2P\" + File /nonfatal "I2P\config\jpackaged" + + createDirectory "$I2PINSTEXE\" + SetOutPath "$I2PINSTEXE\" + File /nonfatal "I2P\config\clients.config" + File /nonfatal "I2P\config\i2ptunnel.config" + File /nonfatal "I2P\config\wrapper.config" + File /nonfatal "I2P\config\hosts.txt" + + createDirectory "$I2PINSTEXE\webapps\" + SetOutPath "$I2PINSTEXE\webapps\" + File /nonfatal /a /r "I2P\config\webapps\" + + createDirectory "$I2PINSTEXE\geoip\" + SetOutPath "$I2PINSTEXE\geoip\" + File /nonfatal /a /r "I2P\config\geoip\" + + createDirectory "$I2PINSTEXE\certificates\" + SetOutPath "$I2PINSTEXE\certificates\" + File /nonfatal /a /r "I2P\config\certificates\" + + createDirectory "$I2PINSTEXE\eepsite\" + SetOutPath "$I2PINSTEXE\eepsite\" + File /nonfatal /a /r "I2P\config\eepsite\" + Abort directory ${EndIf} FunctionEnd @@ -192,97 +226,71 @@ FunctionEnd # start default section Section Install + ${If} ${Silent} + ${Do} + ${FindProcess} "I2P.exe" $0 + Sleep 500 + ${LoopWhile} $0 <> 0 + ${EndIf} + # set the installation directory as the destination for the following actions createDirectory $INSTDIR SetOutPath $INSTDIR File ui2pbrowser_icon.ico - # Install the launcher scripts: This will need to be it's own section, since - # now I think we just need to let the user select if the user is using a non - # default Firefox path. - FileOpen $0 "$INSTDIR\i2pbrowser.bat" w - FileWrite $0 "@echo off" - FileWriteByte $0 "13" - FileWriteByte $0 "10" + # Update jpackaged I2P router, if it exists ${If} ${FileExists} "$I2PINSTEXE\jpackaged" - FileWrite $0 'start /D "%LOCALAPPDATA%\${APPNAME}" "" "$I2PINSTEXE\i2p.exe"' - ${Else} - FileWrite $0 'start "" "$I2PINSTEXE\i2p.exe"' + createDirectory $I2PINSTEXE + SetOutPath $I2PINSTEXE + + ${If} ${Silent} + ReadEnvStr $0 OLD_I2P_VERSION + ${If} $0 < ${I2P_VERSION} + File /nonfatal /a /r "I2P\" + File /nonfatal "I2P\config\jpackaged" + + createDirectory "$I2PINSTEXE\" + SetOutPath "$I2PINSTEXE\" + + createDirectory "$I2PINSTEXE\webapps\" + SetOutPath "$I2PINSTEXE\webapps\" + File /nonfatal /a /r "I2P\config\webapps\" + + createDirectory "$I2PINSTEXE\geoip\" + SetOutPath "$I2PINSTEXE\geoip\" + File /nonfatal /a /r "I2P\config\geoip\" + + createDirectory "$I2PINSTEXE\certificates\" + SetOutPath "$I2PINSTEXE\certificates\" + File /nonfatal /a /r "I2P\config\certificates\" + ${EndIf} + ${Else} + File /nonfatal /a /r "I2P\" + File /nonfatal "I2P\config\jpackaged" + + createDirectory "$I2PINSTEXE\" + SetOutPath "$I2PINSTEXE\" + + createDirectory "$I2PINSTEXE\webapps\" + SetOutPath "$I2PINSTEXE\webapps\" + File /nonfatal /a /r "I2P\config\webapps\" + + createDirectory "$I2PINSTEXE\geoip\" + SetOutPath "$I2PINSTEXE\geoip\" + File /nonfatal /a /r "I2P\config\geoip\" + + createDirectory "$I2PINSTEXE\certificates\" + SetOutPath "$I2PINSTEXE\certificates\" + File /nonfatal /a /r "I2P\config\certificates\" + ${EndIf} ${EndIf} - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 'if exist "%LOCALAPPDATA%\${APPNAME}\firefox.profile.i2p\" (' - FileWrite $0 ' echo "profile is configured"' - FileWrite $0 ') else (' - FileWrite $0 ' echo "configuring profile"' - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 ' xcopy /s /i /y "$INSTDIR\firefox.profile.i2p" "%LOCALAPPDATA%\${APPNAME}\firefox.profile.i2p"' - FileWrite $0 ')' - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 'start "" "$FFINSTEXE\firefox.exe" -no-remote -profile "%LOCALAPPDATA%\${APPNAME}\firefox.profile.i2p" -url %1' - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 exit - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileClose $0 - FileOpen $0 "$INSTDIR\i2pbrowser-private.bat" w - FileWrite $0 "@echo off" - FileWriteByte $0 "13" - FileWriteByte $0 "10" - ${If} ${FileExists} "$I2PINSTEXE\jpackaged" - FileWrite $0 'start /D "%LOCALAPPDATA%\${APPNAME}" "" "$I2PINSTEXE\i2p.exe"' - ${Else} - FileWrite $0 'start "" "$I2PINSTEXE\i2p.exe"' - ${EndIf} - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 'if exist "%LOCALAPPDATA%\${APPNAME}\firefox.profile.i2p\" (' - FileWrite $0 ' echo "profile is configured"' - FileWrite $0 ') else (' - FileWrite $0 ' echo "configuring profile"' - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 ' xcopy /s /i /y "$INSTDIR\firefox.profile.i2p" "%LOCALAPPDATA%\${APPNAME}\firefox.profile.i2p"' - FileWrite $0 ')' - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 'start "" "$FFINSTEXE\firefox.exe" -no-remote -profile "%LOCALAPPDATA%\${APPNAME}\firefox.profile.i2p" -private-window about:blank' - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 exit - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileClose $0 - - - # Install the launcher scripts: This will need to be it's own section, since - # now I think we just need to let the user select if the user is using a non - # default Firefox path. - FileOpen $0 "$INSTDIR\i2pconfig.bat" w - FileWrite $0 "@echo off" - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 'if exist "%LOCALAPPDATA%\${APPNAME}\firefox.profile.config.i2p\" (' - FileWrite $0 ' echo "profile is configured"' - FileWrite $0 ') else (' - FileWrite $0 ' echo "configuring profile"' - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 ' xcopy /s /i /y "$INSTDIR\firefox.profile.config.i2p" "%LOCALAPPDATA%\${APPNAME}\firefox.profile.config.i2p"' - FileWrite $0 ')' - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 'start "" "$FFNONTORINSTEXE\firefox.exe" -no-remote -profile "%LOCALAPPDATA%\${APPNAME}\firefox.profile.config.i2p" -url %1' - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileWrite $0 exit - FileWriteByte $0 "13" - FileWriteByte $0 "10" - FileClose $0 + # Install the launcher scripts + createDirectory "$INSTDIR\licenses" + SetOutPath "$INSTDIR" + File win/i2pbrowser.bat + File win/i2pbrowser-private.bat + File win/i2pconfig.bat # Install the licenses createDirectory "$INSTDIR\licenses" @@ -325,10 +333,13 @@ Section Install SetOutPath "$INSTDIR" createDirectory "$SMPROGRAMS\${APPNAME}" - CreateShortCut "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pbrowser.bat$\" ${CONSOLE_URL}" "$INSTDIR\ui2pbrowser_icon.ico" - CreateShortCut "$SMPROGRAMS\${APPNAME}\Private Browsing-${APPNAME}.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pbrowser-private.bat$\"" "$INSTDIR\ui2pbrowser_icon.ico" - CreateShortCut "$DESKTOP\${APPNAME}.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pbrowser.bat$\" ${CONSOLE_URL}" "$INSTDIR\ui2pbrowser_icon.ico" - CreateShortCut "$DESKTOP\Private Browsing-${APPNAME}.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pbrowser-private.bat$\"" "$INSTDIR\ui2pbrowser_icon.ico" + CreateShortCut "$SMPROGRAMS\${APPNAME}\Browse I2P.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pbrowser.bat$\" ${CONSOLE_URL}" "$INSTDIR\ui2pbrowser_icon.ico" + CreateShortCut "$SMPROGRAMS\${APPNAME}\Browse I2P - Temporary Identity.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pbrowser-private.bat$\"" "$INSTDIR\ui2pbrowser_icon.ico" +; CreateShortCut "$SMPROGRAMS\${APPNAME}\I2P Applications.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pconfig.bat$\"" "$INSTDIR\ui2pbrowser_icon.ico" + + CreateShortCut "$DESKTOP\Browse I2P.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pbrowser.bat$\" ${CONSOLE_URL}" "$INSTDIR\ui2pbrowser_icon.ico" + CreateShortCut "$DESKTOP\Browse I2P - Temporary Identity.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pbrowser-private.bat$\"" "$INSTDIR\ui2pbrowser_icon.ico" +; CreateShortCut "$DESKTOP\I2P Applications.lnk" "C:\Windows\system32\cmd.exe" "/c $\"$INSTDIR\i2pconfig.bat$\"" "$INSTDIR\ui2pbrowser_icon.ico" ;# Point the browser config setting in the base router.config FileOpen $0 "$I2PINSTEXE\router.config" a @@ -421,7 +432,10 @@ Section "uninstall" rmDir "$INSTDIR\firefox.profile.i2p" rmDir "$LOCALAPPDATA\${APPNAME}" rmDir "$INSTDIR" - + + ${If} ${FileExists} "$I2PINSTEXE\jpackaged" + rmDir "$I2PINSTEXE" + ${EndIf} # delete the uninstaller Delete "$INSTDIR\uninstall-i2pbrowser.exe" @@ -435,5 +449,12 @@ SectionEnd !insertmacro MUI_PAGE_FINISH Function LaunchLink - ExecShell "" "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk" + ${If} ${Silent} + ReadEnvStr $0 RESTART_I2P + ${If} $0 != "" + Exec "$INSTDIR\i2pbrowser.bat" + ${EndIf} + ${Else} + Exec "$INSTDIR\i2pbrowser.bat" + ${EndIf} FunctionEnd diff --git a/src/nsis/i2pbrowser-jpackage.nsi b/src/nsis/i2pbrowser-jpackage.nsi new file mode 100644 index 0000000..c5c464a --- /dev/null +++ b/src/nsis/i2pbrowser-jpackage.nsi @@ -0,0 +1 @@ +!define I2P_VERSION 0.9.50 \ No newline at end of file diff --git a/src/nsis/i2pbrowser-version.nsi b/src/nsis/i2pbrowser-version.nsi index 74dcffe..6e79be8 100644 --- a/src/nsis/i2pbrowser-version.nsi +++ b/src/nsis/i2pbrowser-version.nsi @@ -1,3 +1,3 @@ !define VERSIONMAJOR 0 !define VERSIONMINOR 04 -!define VERSIONBUILD +!define VERSIONBUILD 0 diff --git a/src/profile/prefs.js b/src/profile/prefs.js index 73feac8..0266b56 100644 --- a/src/profile/prefs.js +++ b/src/profile/prefs.js @@ -51,3 +51,10 @@ user_pref("browser.newtabpage.activity-stream.feeds.section.highlights", false); user_pref("browser.newtabpage.activity-stream.feeds.section.topstories", false); user_pref("browser.newtabpage.activity-stream.default.sites", "http://planet.i2p/,http://legwork.i2p/,http://i2pwiki.i2p/,http://i2pforums.i2p/,http://zzz.i2p/"); user_pref("browser.newtabpage.activity-stream.feeds.topsites", true); +user_pref("ui.use_standins_for_native_colors", true); +user_pref("webgl.disable-extensions", true); +user_pref("webgl.min_capability_mode", true); +user_pref("webgl.disable-fail-if-major-performance-caveat", true); +user_pref("webgl.enable-webgl2", false); +user_pref("media.navigator.enabled", false); +user_pref("dom.w3c_touch_events.enabled", false); diff --git a/src/profile/user.js b/src/profile/user.js index 99385e9..bf0ca04 100644 --- a/src/profile/user.js +++ b/src/profile/user.js @@ -170,7 +170,7 @@ user_pref("dom.serviceWorkers.enabled", false); user_pref("dom.serviceWorkers.interception.enabled", false); user_pref("dom.storage.enabled", false); user_pref("dom.webaudio.enabled", false); -user_pref("extensions.autoDisableScopes", 14); +user_pref("extensions.autoDisableScopes", 0); user_pref("extensions.getAddons.cache.enabled", false); user_pref("extensions.getAddons.showPane", false); user_pref("extensions.pocket.enabled", false); @@ -216,3 +216,9 @@ user_pref("keyword.enabled", false); user_pref("extensions.allowPrivateBrowsingByDefault", true); user_pref("extensions.PrivateBrowsing.notification", false); user_pref("browser.newtabpage.activity-stream.feeds.topsites", true); +user_pref("ui.use_standins_for_native_colors", true); +user_pref("webgl.disable-extensions", true); +user_pref("webgl.min_capability_mode", true); +user_pref("webgl.disable-fail-if-major-performance-caveat", true); +user_pref("webgl.enable-webgl2", false); +user_pref("dom.w3c_touch_events.enabled", false); diff --git a/src/profile/version.txt b/src/profile/version.txt index bd73f47..728cb37 100644 --- a/src/profile/version.txt +++ b/src/profile/version.txt @@ -1 +1 @@ -0.4 +0.04.0 diff --git a/src/win/i2pbrowser-private.bat b/src/win/i2pbrowser-private.bat new file mode 100644 index 0000000..5dea28b --- /dev/null +++ b/src/win/i2pbrowser-private.bat @@ -0,0 +1,38 @@ +@echo on + +if not exist "%ProgramFiles%\I2P\" ( + set "ProgramFiles=C:\Program Files" +) + +if exist "%ProgramFiles%\I2P\jpackaged" ( + start "i2p" /D "%LOCALAPPDATA%\I2P" "%ProgramFiles%\I2P\i2p.exe" +) else ( + start "i2p" "%ProgramFiles%\I2P\i2p.exe" +) + +timeout /t 3 + +if exist "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p\" ( + echo "profile is configured, updating extensions" + xcopy /s /i /y "%ProgramFiles%\I2P\I2PBrowser-Launcher\firefox.profile.i2p\extensions" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p\extensions" +) else ( + echo "configuring profile" + xcopy /s /i /y "%ProgramFiles%\I2P\I2PBrowser-Launcher\firefox.profile.i2p" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p" +) + +if exist "%USERPROFILE%/Desktop/Tor Browser/Browser/firefox.exe" ( + start "i2pbrowser" "%USERPROFILE%/Desktop/Tor Browser/Browser/firefox.exe" -no-remote -profile "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p" -private-window about:blank + exit +) + +if exist "%USERPROFILE%/OneDrive/Desktop/Tor Browser/Browser/firefox.exe" ( + start "i2pbrowser" "%USERPROFILE%/OneDrive/Desktop/Tor Browser/Browser/firefox.exe" -no-remote -profile "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p" -private-window about:blank + exit +) + +if exist "%ProgramFiles%\Mozilla Firefox\firefox.exe" ( + start "i2pbrowser" "%ProgramFiles%\Mozilla Firefox\firefox.exe" -no-remote -profile "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p" -private-window about:blank + exit +) + +exit diff --git a/src/win/i2pbrowser.bat b/src/win/i2pbrowser.bat new file mode 100644 index 0000000..00b983d --- /dev/null +++ b/src/win/i2pbrowser.bat @@ -0,0 +1,38 @@ +@echo on + +if not exist "%ProgramFiles%\I2P\" ( + set "ProgramFiles=C:\Program Files" +) + +if exist "%ProgramFiles%\I2P\jpackaged" ( + start "i2p" /D "%LOCALAPPDATA%\I2P" "%ProgramFiles%\I2P\i2p.exe" +) else ( + start "i2p" "%ProgramFiles%\I2P\i2p.exe" +) + +timeout /t 3 + +if exist "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p\" ( + echo "profile is configured, updating extensions" + xcopy /s /i /y "%ProgramFiles%\I2P\I2PBrowser-Launcher\firefox.profile.i2p\extensions" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p\extensions" +) else ( + echo "configuring profile" + xcopy /s /i /y "%ProgramFiles%\I2P\I2PBrowser-Launcher\firefox.profile.i2p" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p" +) + +if exist "%USERPROFILE%/Desktop/Tor Browser/Browser/firefox.exe" ( + start "i2pbrowser" "%USERPROFILE%/Desktop/Tor Browser/Browser/firefox.exe" -no-remote -profile "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p" -url %1 + exit +) + +if exist "%USERPROFILE%/OneDrive/Desktop/Tor Browser/Browser/firefox.exe" ( + start "i2pbrowser" "%USERPROFILE%/OneDrive/Desktop/Tor Browser/Browser/firefox.exe" -no-remote -profile "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p" -url %1 + exit +) + +if exist "%ProgramFiles%\Mozilla Firefox\firefox.exe" ( + start "i2pbrowser" "%ProgramFiles%\Mozilla Firefox\firefox.exe" -no-remote -profile "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p" -url %1 + exit +) + +exit diff --git a/src/win/i2pconfig.bat b/src/win/i2pconfig.bat new file mode 100644 index 0000000..17a4f2a --- /dev/null +++ b/src/win/i2pconfig.bat @@ -0,0 +1,13 @@ +@echo off + +if exist "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.config.i2p\" ( + echo "profile is configured" + xcopy /s /i /y "$INSTDIR\firefox.profile.i2p\extensions" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p\extensions" +) else ( + echo "configuring profile" + xcopy /s /i /y "$INSTDIR\firefox.profile.config.i2p" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.config.i2p" +) + +start "i2pconfig" "c:\Program Files\Mozilla Firefox\firefox.exe" -no-remote -profile "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.config.i2p" -url %1 + +exit