diff --git a/Makefile b/Makefile index 246fdf4..ee340db 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ prep: profile.tgz app-profile.tgz profile build/licenses build/I2P build/I2P/con cp src/nsis/*.nsh build cp src/icons/*.ico build -install.exe: +install.exe: build/licenses cd build && makensis i2pbrowser-installer.nsi && cp I2P-Profile-Installer-*.exe ../ && echo "built windows installer" export RES_DIR="../i2p.i2p.jpackage-build/installer/resources" @@ -66,7 +66,7 @@ src/I2P/config: build/I2P 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 + 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 diff --git a/README.md b/README.md index e972f10..63c421c 100644 --- a/README.md +++ b/README.md @@ -4,22 +4,22 @@ I2P Browsing Profile for Firefox Features: --------- - - Automatically select an up-to-date, secure Firefox or Tor Browser(On Windows) variant - - Automatically configure a profile for I2P - - Automatically block-list all non-I2P local destinations - - Enable first-party isolation, anti-fingerprinting, letterboxing - - Automatically sandbox I2P, Non-I2P, and I2P-Application cookiestores +- Automatically select an up-to-date, secure Firefox or Tor Browser(On Windows) variant +- Automatically configure a profile for I2P +- Automatically block-list all non-I2P local destinations +- Enable first-party isolation, anti-fingerprinting, letterboxing +- Automatically sandbox I2P, Non-I2P, and I2P-Application cookiestores Build Dependencies: ------------------- To build this, you will need the following software packages (all available in Debian) : - * make - * nsis - * dos2unix - * curl - * jq +- make +- nsis +- dos2unix +- curl +- jq In addition, you will need the NSIS plugin "ShellExecAsUser" which you can get from the [NSIS Wiki Page](https://nsis.sourceforge.io/ShellExecAsUser_plug-in). In order to install @@ -32,14 +32,13 @@ cp -rv Plugins/* /usr/share/nsis/Plugins/ To build a Debian package, you'll also need - * checkinstall +- checkinstall Preparation ----------- Before you build, run the targets - make clean-extensions make extensions @@ -99,8 +98,8 @@ with `sudo service i2p start` then you can run the script: /usr/local/bin/i2p-config-service-setup -Including a jpackaged I2P Router(EXPERIMENTAL) ----------------------------------------------- +Including a jpackaged I2P Router +-------------------------------- 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 @@ -168,6 +167,9 @@ you should select "Checkout as is, commit as is" and leave line-endings alone. End-to-End Windows build process using Cygwin --------------------------------------------- +I highly recommend you look into the Chocolatey package manager, which makes it much +easier to configure these tools and keep them up to date. + **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%` @@ -178,27 +180,26 @@ 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` +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 +4. 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 .. - 4. Move into the i2p.firefox directory. Run the `./build.sh` script. +5. Move into the i2p.firefox directory. Run the `./build.sh` script. cd i2p.firefox ./build.sh - 5. Run `make` to build the installer. +6. Run `make` to build the installer. Doing a Release --------------- diff --git a/build.sh b/build.sh index 83862f2..13efe1a 100755 --- a/build.sh +++ b/build.sh @@ -58,9 +58,22 @@ I2P_JBIGI="$HERE/../i2p.i2p.jpackage-build/installer/lib/jbigi" echo "compiling custom launcher" mkdir build cp "$I2P_JARS"/*.jar build +if [ ! -f "$HERE/build/jna.jar" ]; then + wget -O "$HERE/build/jna.jar" "https://repo1.maven.org/maven2/net/java/dev/jna/jna/$JNA_VERSION/jna-$JNA_VERSION.jar" +fi + +if [ ! -f "$HERE/build/jna-platform.jar" ]; then + wget -O "$HERE/build/jna-platform.jar" "https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/$JNA_VERSION/jna-platform-$JNA_VERSION.jar" +fi 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 +"$JAVA_HOME"/bin/javac -d ../build -classpath "$HERE/build/jna.jar":"$HERE/build/jna-platform.jar":"$HERE/build/i2p.jar":"$HERE/build/router.jar":"$HERE/build/routerconsole.jar" \ + net/i2p/router/Elevator.java \ + net/i2p/router/Shell32X.java \ + net/i2p/router/WinLauncher.java \ + net/i2p/router/WindowsUpdatePostProcessor.java \ + net/i2p/router/WinUpdateProcess.java + cd .. #echo "building launcher.jar" diff --git a/changelog.txt b/changelog.txt index 87229e6..7c618b6 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,12 @@ +2022-03-25 idk + * This release adds support for user-mode, non-privileged installation of the + jpackaged router and the browser profile. Admin installation is still supported + and detected automatically, to support existing bundles. + * On restart to update, will detect if a router requires admin rights to install + and will ask the user to authorize the update. In user-mode, no prompt will ever + be seen. + * Updates to the Firefox profiles to improve compatibility with more Firefoxes + 2022-02-10 idk * This release fixes automatic update using Bittorrent within the I2P network and the custom Update PostProcessor. diff --git a/i2pversion b/i2pversion index ab43478..cc0ca80 100644 --- a/i2pversion +++ b/i2pversion @@ -1,5 +1,7 @@ #! /usr/bin/env sh +JNA_VERSION=5.10.0 +export JNA_VERSION=5.10.0 #Comment this out to build from an alternate branch or # the tip of the master branch. diff --git a/java/net/i2p/router/Elevator.java b/java/net/i2p/router/Elevator.java new file mode 100644 index 0000000..2715a15 --- /dev/null +++ b/java/net/i2p/router/Elevator.java @@ -0,0 +1,33 @@ +package net.i2p.router; + +import com.sun.jna.WString; +import com.sun.jna.platform.win32.Kernel32; +import com.sun.jna.platform.win32.Kernel32Util; + +public class Elevator { + public static void main(String... args) { + executeAsAdministrator("c:\\windows\\system32\\notepad.exe", ""); + } + + public static void executeAsAdministrator(String command, String args) { + if (command == "" || command == null) { + System.out.println("No command specified"); + return; + } + Shell32X.SHELLEXECUTEINFO execInfo = new Shell32X.SHELLEXECUTEINFO(); + execInfo.lpFile = new WString(command); + if (args != null) + execInfo.lpParameters = new WString(args); + execInfo.nShow = Shell32X.SW_SHOWDEFAULT; + execInfo.fMask = Shell32X.SEE_MASK_NOCLOSEPROCESS; + execInfo.lpVerb = new WString("runas"); + boolean result = Shell32X.INSTANCE.ShellExecuteEx(execInfo); + + if (!result) { + int lastError = Kernel32.INSTANCE.GetLastError(); + String errorMessage = Kernel32Util.formatMessageFromLastErrorCode(lastError); + throw new RuntimeException("Error performing elevation: " + lastError + ": " + errorMessage + " (apperror=" + + execInfo.hInstApp + ")"); + } + } +} diff --git a/java/net/i2p/router/Shell32X.java b/java/net/i2p/router/Shell32X.java new file mode 100644 index 0000000..c7906eb --- /dev/null +++ b/java/net/i2p/router/Shell32X.java @@ -0,0 +1,111 @@ +package net.i2p.router; + +import java.util.*; + +import com.sun.jna.Native; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import com.sun.jna.WString; +import com.sun.jna.platform.win32.Shell32; +import com.sun.jna.platform.win32.WinDef.HINSTANCE; +import com.sun.jna.platform.win32.WinDef.HWND; +import com.sun.jna.platform.win32.WinNT.HANDLE; +import com.sun.jna.platform.win32.WinReg.HKEY; +import com.sun.jna.win32.W32APIOptions; + +public interface Shell32X extends Shell32 { + Shell32X INSTANCE = (Shell32X) Native.loadLibrary("shell32", Shell32X.class, W32APIOptions.UNICODE_OPTIONS); + + int SW_HIDE = 0; + int SW_MAXIMIZE = 3; + int SW_MINIMIZE = 6; + int SW_RESTORE = 9; + int SW_SHOW = 5; + int SW_SHOWDEFAULT = 10; + int SW_SHOWMAXIMIZED = 3; + int SW_SHOWMINIMIZED = 2; + int SW_SHOWMINNOACTIVE = 7; + int SW_SHOWNA = 8; + int SW_SHOWNOACTIVATE = 4; + int SW_SHOWNORMAL = 1; + + /** File not found. */ + int SE_ERR_FNF = 2; + + /** Path not found. */ + int SE_ERR_PNF = 3; + + /** Access denied. */ + int SE_ERR_ACCESSDENIED = 5; + + /** Out of memory. */ + int SE_ERR_OOM = 8; + + /** DLL not found. */ + int SE_ERR_DLLNOTFOUND = 32; + + /** Cannot share an open file. */ + int SE_ERR_SHARE = 26; + + int SEE_MASK_NOCLOSEPROCESS = 0x00000040; + + int ShellExecute(int i, String lpVerb, String lpFile, String lpParameters, String lpDirectory, int nShow); + + boolean ShellExecuteEx(SHELLEXECUTEINFO lpExecInfo); + + public static class SHELLEXECUTEINFO extends Structure { + /* + * DWORD cbSize; + * ULONG fMask; + * HWND hwnd; + * LPCTSTR lpVerb; + * LPCTSTR lpFile; + * LPCTSTR lpParameters; + * LPCTSTR lpDirectory; + * int nShow; + * HINSTANCE hInstApp; + * LPVOID lpIDList; + * LPCTSTR lpClass; + * HKEY hkeyClass; + * DWORD dwHotKey; + * union { + * HANDLE hIcon; + * HANDLE hMonitor; + * } DUMMYUNIONNAME; + * HANDLE hProcess; + */ + + public int cbSize = size(); + public int fMask; + public HWND hwnd; + public WString lpVerb; + public WString lpFile; + public WString lpParameters; + public WString lpDirectory; + public int nShow; + public HINSTANCE hInstApp; + public Pointer lpIDList; + public WString lpClass; + public HKEY hKeyClass; + public int dwHotKey; + + /* + * Actually: + * union { + * HANDLE hIcon; + * HANDLE hMonitor; + * } DUMMYUNIONNAME; + */ + public HANDLE hMonitor; + public HANDLE hProcess; + + protected List getFieldOrder() { + return Arrays.asList(new String[] { + "cbSize", "fMask", "hwnd", "lpVerb", "lpFile", "lpParameters", + "lpDirectory", "nShow", "hInstApp", "lpIDList", "lpClass", + "hKeyClass", "dwHotKey", "hMonitor", "hProcess", + }); + } + } + +} diff --git a/java/net/i2p/router/WinLauncher.java b/java/net/i2p/router/WinLauncher.java index 2043c15..2f1f9f9 100644 --- a/java/net/i2p/router/WinLauncher.java +++ b/java/net/i2p/router/WinLauncher.java @@ -1,6 +1,8 @@ package net.i2p.router; import java.io.*; +import java.net.InetAddress; +import java.net.Socket; import java.util.*; import net.i2p.crypto.*; @@ -49,6 +51,12 @@ public class WinLauncher { System.out.println("\t" + System.getProperty("i2p.dir.base") + "\n\t" + System.getProperty("i2p.dir.config") + "\n\t" + System.getProperty("router.pid")); + // do a quick check to see of port 7657 is already occupied + if (i2pIsRunning()) { + System.err.println("I2P is already running"); + System.exit(0); + } + // wupp.i2pRouter = new Router(System.getProperties()); System.out.println("Router is configured"); @@ -61,6 +69,18 @@ public class WinLauncher { RouterLaunch.main(args); } + private static boolean i2pIsRunning() { + // check if there's something listening on port 7657 + try { + InetAddress localhost = InetAddress.getLocalHost(); + Socket s = new Socket(localhost, 7657); + s.close(); + return true; + } catch (IOException e) { + return false; + } + } + private static final Runnable REGISTER_UPP = () -> { // first wait for the RouterContext to appear @@ -96,6 +116,16 @@ public class WinLauncher { } private static File selectHome() { // throws Exception { + String path_override = System.getenv("I2P_CONFIG"); + if (path_override != null) { + File path = new File(path_override); + if (path != null && path.exists()) { + if (path.isDirectory()) + return path.getAbsoluteFile(); + else + throw new RuntimeException("I2P_CONFIG is not a directory: " + path); + } + } if (SystemVersion.isWindows()) { File home = new File(System.getProperty("user.home")); File appData = new File(home, "AppData"); @@ -113,6 +143,16 @@ public class WinLauncher { } private static File selectProgramFile() { + String path_override = System.getenv("I2P"); + if (path_override != null) { + File path = new File(path_override); + if (path.exists()) { + if (path.isDirectory()) + return path.getAbsoluteFile(); + else + throw new RuntimeException("I2P is not a directory: " + path); + } + } if (SystemVersion.isWindows()) { File jrehome = new File(System.getProperty("java.home")); File programs = jrehome.getParentFile(); diff --git a/java/net/i2p/router/WinUpdateProcess.java b/java/net/i2p/router/WinUpdateProcess.java index 46dadcc..9dc6071 100644 --- a/java/net/i2p/router/WinUpdateProcess.java +++ b/java/net/i2p/router/WinUpdateProcess.java @@ -42,20 +42,29 @@ class WinUpdateProcess implements Runnable { 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"); + if (logFile.canWrite()) { + // check if we can write to the log file. If we can, use the ProcessBuilder to + // run the installer. + ProcessBuilder pb = new ProcessBuilder(file.getAbsolutePath(), "/S", "/D=" + workingDir.getAbsolutePath()); + var env = pb.environment(); + env.put("OLD_I2P_VERSION", version); + env.remove("RESTART_I2P"); - int exitCode = ctx.router().scheduledGracefulExitCode(); - if (exitCode == Router.EXIT_HARD_RESTART || exitCode == Router.EXIT_GRACEFUL_RESTART) - env.put("RESTART_I2P", "true"); + 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."); + 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."); + } + } else { + // If we cant write to the log file and we're on Windows, use the elevator to + // execute the installer instead of the ProcessBuilder. + Elevator.executeAsAdministrator(file.getAbsolutePath(), " /S /D=" + workingDir.getAbsolutePath()); } + } @Override diff --git a/java/net/i2p/router/WindowsUpdatePostProcessor.java b/java/net/i2p/router/WindowsUpdatePostProcessor.java index 45dc450..badad32 100644 --- a/java/net/i2p/router/WindowsUpdatePostProcessor.java +++ b/java/net/i2p/router/WindowsUpdatePostProcessor.java @@ -43,28 +43,30 @@ public class WindowsUpdatePostProcessor implements UpdatePostProcessor { public void updateDownloadedandVerified(UpdateType type, int fileType, String version, File file) throws IOException { _log.info("Got an update to post-process"); + if (SystemVersion.isWindows()) { - if (type != UpdateType.ROUTER_SIGNED_SU3 && type != UpdateType.ROUTER_DEV_SU3) { - _log.warn("Unsupported update type " + type); - return; + if (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)); } - - 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 { diff --git a/src/app-profile/prefs.js b/src/app-profile/prefs.js index 11e8061..233e2d3 100644 --- a/src/app-profile/prefs.js +++ b/src/app-profile/prefs.js @@ -60,3 +60,4 @@ user_pref("webgl.disable-fail-if-major-performance-caveat", true); user_pref("webgl.enable-webgl2", false); user_pref("media.navigator.enabled", false); user_pref("dom.w3c_touch_events.enabled", false); +user_pref("browser.display.use_system_colors", false); \ No newline at end of file diff --git a/src/app-profile/user.js b/src/app-profile/user.js index c4bb768..45fbbba 100644 --- a/src/app-profile/user.js +++ b/src/app-profile/user.js @@ -1,19 +1,18 @@ -# Overrides for Extension Preferences -# Tor Browser Bundle -# Do not edit this file. -# -# This file is modified from a file included in the Tor Browser Bundle. -# -# Copyright 2017 The Tor Project. See LICENSE.tor for licensing information. +/* +Overrides# +for Extension Preferences# Tor Browser Bundle# Do not edit this file.##This file is modified from a file included in the Tor Browser Bundle.##Copyright 2017 The Tor Project.See LICENSE.tor# +for licensing information. -# HTTPS Everywhere Preferences: +HTTPS Everywhere Preferences: +*/ user_pref("extensions.https_everywhere._observatory.popup_shown", true); user_pref("extensions.https_everywhere.toolbar_hint_shown", true); -# NoScript Preferences: -# In order to disable all scripts by default, uncomment the following line... -# user_pref("capability.policy.maonoscript.javascript.enabled", "noAccess"); -# and comment out the following line +/* +NoScript Preferences: #In order to disable all scripts by +default, uncomment the following line...#user_pref("capability.policy.maonoscript.javascript.enabled", "noAccess");# +and comment out the following line +*/ user_pref("capability.policy.maonoscript.javascript.enabled", "allAccess"); user_pref("capability.policy.maonoscript.sites", "[System+Principal] about: about:tbupdate about:tor chrome: resource: blob: mediasource: moz-extension: moz-safe-about: about:neterror about:certerror about:feeds about:tabcrashed about:cache"); user_pref("noscript.default", "[System+Principal] about: about:tbupdate about:tor chrome: resource: blob: mediasource: moz-extension: moz-safe-about: about:neterror about:certerror about:feeds about:tabcrashed about:cache"); @@ -106,7 +105,7 @@ user_pref("network.proxy.ftp_port", 4444); user_pref("network.proxy.socks", "127.0.0.1"); user_pref("network.proxy.socks_port", 4444); user_pref("network.proxy.share_proxy_settings", true); -user_pref("browser.startup.homepage", "about:blank"); +user_pref("browser.startup.homepage", "http://127.0.0.1:7657/home"); // Privacy-harden and disable irrelevant features. user_pref("app.normandy.api_url", ""); @@ -222,3 +221,4 @@ user_pref("webgl.min_capability_mode", true); user_pref("webgl.disable-fail-if-major-performance-caveat", true); user_pref("webgl.enable-webgl2", false); user_pref("dom.w3c_touch_events.enabled", false); +user_pref("browser.display.use_system_colors", false); \ No newline at end of file diff --git a/src/nsis/i2pbrowser-installer.nsi b/src/nsis/i2pbrowser-installer.nsi index 8f3555a..ab8169e 100644 --- a/src/nsis/i2pbrowser-installer.nsi +++ b/src/nsis/i2pbrowser-installer.nsi @@ -27,6 +27,8 @@ SetOverwrite on !define I2PINSTEXE !define I2PINSTEXE32 "$PROGRAMFILES32\i2p" !define I2PINSTEXE64 "$PROGRAMFILES64\i2p" +!define I2PINSTEXE_USERMODE "$LOCALAPPDATA\i2p" + !define RAM_NEEDED_FOR_64BIT 0x80000000 @@ -39,7 +41,7 @@ Name "${COMPANYNAME} - ${APPNAME}" Icon ui2pbrowser_icon.ico OutFile "I2P-Profile-Installer-${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}.exe" -RequestExecutionLevel admin +RequestExecutionLevel user !include LogicLib.nsh !include x64.nsh @@ -144,6 +146,13 @@ Page instfiles !include i2pbrowser-mozcompat.nsi Function .onInit + StrCpy $I2PINSTEXE "${I2PINSTEXE64}" + UserInfo::GetAccountType + pop $0 + ${If} $0 != "admin" + StrCpy $INSTDIR "$LOCALAPPDATA\${COMPANYNAME}\${APPNAME}" + StrCpy $I2PINSTEXE "${I2PINSTEXE_USERMODE}" + ${EndIf} !insertmacro MUI_LANGDLL_DISPLAY Call ShouldInstall64Bit ${If} $0 == 1 @@ -172,13 +181,18 @@ Function .onInit StrCpy $FFINSTEXE "$PROFILE\Desktop\Tor Browser\Browser\" ${EndIf} ${EndIf} - StrCpy $I2PINSTEXE "${I2PINSTEXE64}" - ${If} ${FileExists} "${I2PINSTEXE32}\i2p.exe" - StrCpy $I2PINSTEXE "${I2PINSTEXE32}" - ${EndIf} - ${If} ${FileExists} "${I2PINSTEXE64}\i2p.exe" + UserInfo::GetAccountType + pop $0 + ${If} $0 == "admin" StrCpy $I2PINSTEXE "${I2PINSTEXE64}" + ${If} ${FileExists} "${I2PINSTEXE32}\i2p.exe" + StrCpy $I2PINSTEXE "${I2PINSTEXE32}" + ${EndIf} + ${If} ${FileExists} "${I2PINSTEXE64}\i2p.exe" + StrCpy $I2PINSTEXE "${I2PINSTEXE64}" + ${EndIf} ${EndIf} + # look for user installs FunctionEnd Function firefoxDetect diff --git a/src/nsis/i2pbrowser-version.nsi b/src/nsis/i2pbrowser-version.nsi index 1e97f13..1b94c0a 100644 --- a/src/nsis/i2pbrowser-version.nsi +++ b/src/nsis/i2pbrowser-version.nsi @@ -1,3 +1,3 @@ !define VERSIONMAJOR 1 !define VERSIONMINOR 7 -!define VERSIONBUILD 4 \ No newline at end of file +!define VERSIONBUILD 4 diff --git a/src/profile/prefs.js b/src/profile/prefs.js index 7312217..8e4163e 100644 --- a/src/profile/prefs.js +++ b/src/profile/prefs.js @@ -58,6 +58,5 @@ user_pref("webgl.disable-fail-if-major-performance-caveat", true); user_pref("webgl.enable-webgl2", false); user_pref("media.navigator.enabled", false); user_pref("dom.w3c_touch_events.enabled", false); -user_pref("fission.autostart", true); -user_pref("gfx.webrender.all", false); -user_pref("privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts", false); \ No newline at end of file +user_pref("browser.privatebrowsing.autostart", false); +user_pref("browser.display.use_system_colors", false); \ No newline at end of file diff --git a/src/profile/user.js b/src/profile/user.js index 0a945b8..f6d2f77 100644 --- a/src/profile/user.js +++ b/src/profile/user.js @@ -1,15 +1,18 @@ -//# Overrides -//for Extension Preferences# Tor Browser Bundle# Do not edit this file.##This file is modified from a file included in the Tor Browser Bundle.##Copyright 2017 The Tor Project.See LICENSE.tor -//for licensing information. +/* +Overrides# +for Extension Preferences# Tor Browser Bundle# Do not edit this file.##This file is modified from a file included in the Tor Browser Bundle.##Copyright 2017 The Tor Project.See LICENSE.tor# +for licensing information. -//# HTTPS Everywhere Preferences: +HTTPS Everywhere Preferences: +*/ user_pref("extensions.https_everywhere._observatory.popup_shown", true); user_pref("extensions.https_everywhere.toolbar_hint_shown", true); -//# NoScript Preferences: #In order to disable all scripts by -//default, uncomment the following line... -//#user_pref("capability.policy.maonoscript.javascript.enabled", "noAccess");# -//and comment out the following line +/* +NoScript Preferences: #In order to disable all scripts by +default, uncomment the following line...#user_pref("capability.policy.maonoscript.javascript.enabled", "noAccess");# +and comment out the following line +*/ user_pref("capability.policy.maonoscript.javascript.enabled", "allAccess"); user_pref("capability.policy.maonoscript.sites", "[System+Principal] about: about:tbupdate about:tor chrome: resource: blob: mediasource: moz-extension: moz-safe-about: about:neterror about:certerror about:feeds about:tabcrashed about:cache"); user_pref("noscript.default", "[System+Principal] about: about:tbupdate about:tor chrome: resource: blob: mediasource: moz-extension: moz-safe-about: about:neterror about:certerror about:feeds about:tabcrashed about:cache"); @@ -79,6 +82,9 @@ user_pref("extensions.torbutton.use_nontor_proxy", true); //user_pref("extensions.torlauncher.socks_port_use_ipc", ); //user_pref("extensions.torlauncher.socks_ipc_path", ""); +// TODO: this is a Tor Browser specific setting which is ignored on Firefox. If +// I make it true, the SOCKS outproxy will have something to connect to. But I +// need to test more to find out if that's prudent. user_pref("extensions.torlauncher.start_tor", false); //user_pref("extensions.torlauncher.default_bridge_type", ""); user_pref("extensions.torlauncher.prompt_at_startup", false); @@ -102,7 +108,7 @@ user_pref("network.proxy.ftp_port", 4444); user_pref("network.proxy.socks", "127.0.0.1"); user_pref("network.proxy.socks_port", 4444); user_pref("network.proxy.share_proxy_settings", true); -user_pref("browser.startup.homepage", "about:blank"); +user_pref("browser.startup.homepage", "http://127.0.0.1:7657/home"); // Privacy-harden and disable irrelevant features. user_pref("app.normandy.api_url", ""); @@ -218,6 +224,5 @@ user_pref("webgl.min_capability_mode", true); user_pref("webgl.disable-fail-if-major-performance-caveat", true); user_pref("webgl.enable-webgl2", false); user_pref("dom.w3c_touch_events.enabled", false); -user_pref("fission.autostart", true); -user_pref("gfx.webrender.all", false); -user_pref("privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts", false); \ No newline at end of file +user_pref("browser.privatebrowsing.autostart", false); +user_pref("browser.display.use_system_colors", false); \ No newline at end of file diff --git a/src/win/i2pbrowser-private.bat b/src/win/i2pbrowser-private.bat index 5ce62aa..bbdd2b9 100644 --- a/src/win/i2pbrowser-private.bat +++ b/src/win/i2pbrowser-private.bat @@ -9,26 +9,31 @@ if exist "%ProgramFiles(x86)%\I2P" ( set "I2PPath=%ProgramFiles(x86)%\I2P" ) -netstat /o /a | find /i "listening" | find ":7657" >nul 2>nul && ( - echo I2P is already running -) || ( - if exist "%ProgramFiles%\I2P\jpackaged" ( - start "i2p" /D "%LOCALAPPDATA%\I2P" "%I2PPath%\i2p.exe" - ) else ( - start "i2p" "%I2PPath%\i2p.exe" - ) +set "I2PPath=%LocalAppData%\I2P\" +if exist "%LocalAppData%\I2P\I2P.exe" ( + set "I2PPath=%LocalAppData%\I2P\" +) + +if exist "%I2PPath%\jpackaged" ( + cd "%LOCALAPPDATA%\I2P" + start "i2p" /D "%LOCALAPPDATA%\I2P" "%I2PPath%\i2p.exe" +) else ( + start "i2p" "%I2PPath%\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" + xcopy /s /i /y "%I2PPath%\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" + xcopy /s /i /y "%I2PPath%\I2PBrowser-Launcher\firefox.profile.i2p" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p" ) +xcopy /s /i /y "%I2PPath%\I2PBrowser-Launcher\firefox.profile.i2p\user.js" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p\user.js" +xcopy /s /i /y "%I2PPath%\I2PBrowser-Launcher\firefox.profile.i2p\prefs.js" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p\prefs.js" + 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 diff --git a/src/win/i2pbrowser.bat b/src/win/i2pbrowser.bat index a28a547..aaca3f7 100644 --- a/src/win/i2pbrowser.bat +++ b/src/win/i2pbrowser.bat @@ -9,29 +9,31 @@ if exist "%ProgramFiles(x86)%\I2P" ( set "I2PPath=%ProgramFiles(x86)%\I2P" ) -netstat /o /a | find /i "listening" | find ":7657" >nul 2>nul && ( - echo I2P is already running -) || ( - if exist "%ProgramFiles%\I2P\jpackaged" ( - start "i2p" /D "%LOCALAPPDATA%\I2P" "%I2PPath%\i2p.exe" - ) else ( - start "i2p" "%I2PPath%\i2p.exe" - ) +set "I2PPath=%LocalAppData%\I2P\" +if exist "%LocalAppData%\I2P\I2P.exe" ( + set "I2PPath=%LocalAppData%\I2P\" ) - - +if exist "%I2PPath%\jpackaged" ( + cd "%LOCALAPPDATA%\I2P" + start "i2p" /D "%LOCALAPPDATA%\I2P" "%I2PPath%\i2p.exe" +) else ( + start "i2p" "%I2PPath%\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" + xcopy /s /i /y "%I2PPath%\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" + xcopy /s /i /y "%I2PPath%\I2PBrowser-Launcher\firefox.profile.i2p" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p" ) +xcopy /s /i /y "%I2PPath%\I2PBrowser-Launcher\firefox.profile.i2p\user.js" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p\user.js" +xcopy /s /i /y "%I2PPath%\I2PBrowser-Launcher\firefox.profile.i2p\prefs.js" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p\prefs.js" + 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 diff --git a/src/win/i2pconfig.bat b/src/win/i2pconfig.bat index 53916ad..b66e1c5 100644 --- a/src/win/i2pconfig.bat +++ b/src/win/i2pconfig.bat @@ -1,13 +1,30 @@ -@echo off +@echo on + +set "I2PPath=%ProgramFiles%\I2P\" +if exist "%ProgramFiles%\I2P\" ( + set "I2PPath=%ProgramFiles%\I2P\" +) + +if exist "%ProgramFiles(x86)%\I2P" ( + set "I2PPath=%ProgramFiles(x86)%\I2P" +) + +set "I2PPath=%LocalAppData%\I2P\" +if exist "%LocalAppData%\I2P\I2P.exe" ( + set "I2PPath=%LocalAppData%\I2P\" +) if exist "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.config.i2p\" ( echo "profile is configured" - xcopy /s /i /y "%ProgramFiles%\I2P\I2PBrowser-Launcher\firefox.profile.i2p\extensions" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.i2p\extensions" + xcopy /s /i /y "%I2PPath%\I2PBrowser-Launcher\firefox.profile.config.i2p\extensions" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.config.i2p\extensions" ) else ( echo "configuring profile" - xcopy /s /i /y "%ProgramFiles%\I2P\I2PBrowser-Launcher\firefox.profile.config.i2p" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.config.i2p" + xcopy /s /i /y "%I2PPath%\I2PBrowser-Launcher\firefox.profile.config.i2p" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.config.i2p" ) +xcopy /s /i /y "%I2PPath%\I2PBrowser-Launcher\firefox.profile.config.i2p\user.js" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.config.i2p\user.js" +xcopy /s /i /y "%I2PPath%\I2PBrowser-Launcher\firefox.profile.config.i2p\prefs.js" "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.config.i2p\prefs.js" + if exist "%ProgramFiles%\Mozilla Firefox\firefox.exe" ( start "i2pbrowser" "%ProgramFiles%\Mozilla Firefox\firefox.exe" -no-remote -profile "%LOCALAPPDATA%\I2PBrowser-Launcher\firefox.profile.config.i2p" -url %1 exit