93 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{
 | 
						|
  pkgs,
 | 
						|
  lib,
 | 
						|
  inputs,
 | 
						|
  config,
 | 
						|
  system,
 | 
						|
  ...
 | 
						|
}:
 | 
						|
 | 
						|
let
 | 
						|
  tomlFormat = pkgs.formats.toml { };
 | 
						|
  cfg = config.programs.captive-browser;
 | 
						|
  inherit (pkgs.stdenv.hostPlatform) isDarwin;
 | 
						|
in
 | 
						|
{
 | 
						|
  options.programs.captive-browser = {
 | 
						|
    enable = lib.mkEnableOption "Enable custom captive-browser in user PATH";
 | 
						|
    package = lib.mkPackageOption pkgs "captive-browser" { nullable = true; };
 | 
						|
    settings = lib.mkOption {
 | 
						|
      type = lib.types.submodule {
 | 
						|
        freeformType = tomlFormat.type;
 | 
						|
 | 
						|
        options = {
 | 
						|
          browser = lib.mkOption {
 | 
						|
            type = lib.types.str;
 | 
						|
            description = "command to invoke the browser with";
 | 
						|
 | 
						|
            # browser is the shell (/bin/sh) command executed once the proxy starts.
 | 
						|
            # When browser exits, the proxy exits. An extra env var PROXY is available.
 | 
						|
            #
 | 
						|
            # Here, we use a separate Chrome instance in Incognito mode, so that
 | 
						|
            # it can run (and be waited for) alongside the default one, and that
 | 
						|
            # it maintains no state across runs. To configure this browser open a
 | 
						|
            # normal window in it, settings will be preserved.
 | 
						|
            default = ''
 | 
						|
              ${cfg.browserCommand} \
 | 
						|
              --user-data-dir="$HOME/Library/Application Support/Google/Captive" \
 | 
						|
              --proxy-server="socks5://$PROXY" \
 | 
						|
              --proxy-bypass-list="<-loopback>" \
 | 
						|
              --no-first-run \
 | 
						|
              --new-window \
 | 
						|
              --incognito \
 | 
						|
              --no-default-browser-check \
 | 
						|
              --no-crash-upload \
 | 
						|
              --disable-extensions \
 | 
						|
              --disable-sync \
 | 
						|
              --disable-background-networking \
 | 
						|
              --disable-client-side-phishing-detection \
 | 
						|
              --disable-component-update \
 | 
						|
              --disable-translate \
 | 
						|
              --disable-web-resources \
 | 
						|
              --safebrowsing-disable-auto-update \
 | 
						|
              http://example.com
 | 
						|
            '';
 | 
						|
          };
 | 
						|
        };
 | 
						|
      };
 | 
						|
    };
 | 
						|
    interface = lib.mkOption {
 | 
						|
      type = lib.types.str;
 | 
						|
      description = "WLAN interface to use";
 | 
						|
    };
 | 
						|
    browserCommand = lib.mkOption {
 | 
						|
      type = lib.types.str;
 | 
						|
      default = if isDarwin then "open -n -W -a \"Google Chrome\" --args" else (lib.getExe pkgs.chromium);
 | 
						|
    };
 | 
						|
  };
 | 
						|
  config = lib.mkIf cfg.enable {
 | 
						|
    home.packages = [ cfg.package ];
 | 
						|
 | 
						|
    programs.captive-browser.settings = builtins.mapAttrs (_: lib.mkOptionDefault) {
 | 
						|
      # dhcp-dns is the shell (/bin/sh) command executed to obtain the DHCP
 | 
						|
      # DNS server address. The first match of an IPv4 regex is used.
 | 
						|
      # IPv4 only, because let's be real, it's a captive portal.
 | 
						|
      dhcp-dns =
 | 
						|
        if isDarwin then
 | 
						|
          "ipconfig getoption ${cfg.interface} domain_name_server"
 | 
						|
        else
 | 
						|
          "${lib.getExe pkgs.dhcpcd} -U ${cfg.interface} | grep domain_name_servers";
 | 
						|
 | 
						|
      # socks5-addr is the listen address for the SOCKS5 proxy server.
 | 
						|
      socks5-addr = "localhost:1666";
 | 
						|
    };
 | 
						|
    home.file.".config/captive-browser.toml" = lib.mkIf (isDarwin && !config.xdg.enable) {
 | 
						|
      source = tomlFormat.generate "captive-browser-config" cfg.settings;
 | 
						|
    };
 | 
						|
 | 
						|
    xdg.configFile."captive-browser.toml" = lib.mkIf (!(isDarwin && !config.xdg.enable)) {
 | 
						|
      source = tomlFormat.generate "captive-browser-config" cfg.settings;
 | 
						|
    };
 | 
						|
 | 
						|
  };
 | 
						|
}
 |