From c7acf2b1bf1ec6c3a17b0b598e62e4190a1f1844 Mon Sep 17 00:00:00 2001 From: awwpotato Date: Wed, 6 Aug 2025 21:18:47 -0700 Subject: [PATCH] mullvad-vpn: add module --- modules/programs/mullvad-vpn.nix | 52 +++++++++++++++++++ .../programs/mullvad-vpn/basic-config.nix | 45 ++++++++++++++++ .../modules/programs/mullvad-vpn/default.nix | 3 ++ 3 files changed, 100 insertions(+) create mode 100644 modules/programs/mullvad-vpn.nix create mode 100644 tests/modules/programs/mullvad-vpn/basic-config.nix create mode 100644 tests/modules/programs/mullvad-vpn/default.nix diff --git a/modules/programs/mullvad-vpn.nix b/modules/programs/mullvad-vpn.nix new file mode 100644 index 000000000..f22bb6b04 --- /dev/null +++ b/modules/programs/mullvad-vpn.nix @@ -0,0 +1,52 @@ +{ + lib, + pkgs, + config, + ... +}: +let + cfg = config.programs.mullvad-vpn; + jsonFormat = pkgs.formats.json { }; +in +{ + meta.maintainers = [ lib.maintainers.awwpotato ]; + + options.programs.mullvad-vpn = { + enable = lib.mkEnableOption "Mullvad VPN"; + package = lib.mkPackageOption pkgs "mullvad-vpn" { nullable = true; }; + + settings = lib.mkOption { + inherit (jsonFormat) type; + default = { }; + description = '' + Written to {file}`XDG_CONFIG_HOME/Mullvad VPN/gui_settings.json` or + {file}`~/Library/Application Support/Mullvad VPN/gui_settings.json`. + See + for options. + ''; + example = { + preferredLocale = "system"; + autoConnect = false; + enableSystemNotifications = true; + monochromaticIcon = false; + startMinimized = false; + unpinnedWindow = true; + browsedForSplitTunnelingApplications = [ ]; + changelogDisplayedForVersion = ""; + updateDismissedForVersion = ""; + animateMap = true; + }; + }; + }; + + config = lib.mkIf cfg.enable { + home.package = lib.mkIf (cfg.package != null) [ cfg.package ]; + + home.file."${ + if pkgs.stdenv.hostPlatform.isDarwin then "Library/Application Support" else config.xdg.configHome + }/Mullvad VPN/gui_settings.json" = + lib.mkIf (cfg.settings != { }) { + source = jsonFormat.generate "mullvad-gui-settings" cfg.settings; + }; + }; +} diff --git a/tests/modules/programs/mullvad-vpn/basic-config.nix b/tests/modules/programs/mullvad-vpn/basic-config.nix new file mode 100644 index 000000000..292d6eb9a --- /dev/null +++ b/tests/modules/programs/mullvad-vpn/basic-config.nix @@ -0,0 +1,45 @@ +{ pkgs, ... }: +{ + programs.mullvad-vpn = { + enable = true; + settings = { + preferredLocale = "system"; + autoConnect = false; + enableSystemNotifications = true; + monochromaticIcon = false; + startMinimized = false; + unpinnedWindow = true; + browsedForSplitTunnelingApplications = [ ]; + changelogDisplayedForVersion = ""; + updateDismissedForVersion = ""; + animateMap = true; + }; + }; + + nmt.script = + let + configFile = + if pkgs.stdenv.isDarwin then + "home-files/Library/Application\\ Support/Mullvad\\ VPN/gui_settings.json" + else + "home-files/.config/Mullvad\\ VPN/gui_settings.json"; + in + '' + assertFileExists ${configFile} + assertFileContent ${configFile} \ + ${pkgs.writeText "settings-expected" '' + { + "animateMap": true, + "autoConnect": false, + "browsedForSplitTunnelingApplications": [], + "changelogDisplayedForVersion": "", + "enableSystemNotifications": true, + "monochromaticIcon": false, + "preferredLocale": "system", + "startMinimized": false, + "unpinnedWindow": true, + "updateDismissedForVersion": "" + } + ''} + ''; +} diff --git a/tests/modules/programs/mullvad-vpn/default.nix b/tests/modules/programs/mullvad-vpn/default.nix new file mode 100644 index 000000000..1365b83a1 --- /dev/null +++ b/tests/modules/programs/mullvad-vpn/default.nix @@ -0,0 +1,3 @@ +{ + mullvad-vpn-basic-config = ./basic-config.nix; +}