From 2f77ae87df13892a949fa1b7b2d25713636f15ac Mon Sep 17 00:00:00 2001 From: Nexoniarz Date: Thu, 8 Oct 2026 15:17:58 +0200 Subject: [PATCH] Add nexopass-gui: the NexoPass window, sharing data with nexopass Co-Authored-By: Claude Opus 5.5 --- README.md | 2 ++ modules/scripts.nix | 28 +++++++++++++++++++++++++++- modules/scripts/nexopass.png | Bin 0 -> 25514 bytes 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 modules/scripts/nexopass.png diff --git a/README.md b/README.md index d47c3b5..18a674e 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ My personal NixOS system configuration. Passwords of 5-15 words or 12-64 characters, "did you mean" for typos, "stay unlocked" for a few minutes (kernel keyring), encrypted export/import shared with the NexoPass Android app, and `nexopass settings`. Run `nexopass help` for everything else. Apache License 2.0. +`nexopass-gui` is the [NexoPass](https://github.com/Nexoniarz/NexoPass) window (also on Android and Windows), fetched from its GitHub release. It uses the same files as `nexopass`, so both see the same accounts and app password. + --- *Made by **Nexoniarz*** diff --git a/modules/scripts.nix b/modules/scripts.nix index 292706f..2f830f4 100644 --- a/modules/scripts.nix +++ b/modules/scripts.nix @@ -1,14 +1,39 @@ -{ config, pkgs, ... }: +{ config, pkgs, lib, ... }: let vaultToggle = pkgs.writeShellScriptBin "vault-toggle" (builtins.readFile ./scripts/vault-toggle.sh); stripMetadata = pkgs.writeShellScriptBin "strip-metadata" (builtins.readFile ./scripts/strip-metadata.sh); + nexopass = pkgs.writeShellApplication { name = "nexopass"; runtimeInputs = with pkgs; [ libargon2 gnupg wl-clipboard keyutils coreutils gnused ]; runtimeEnv.NEXOPASS_WORDLIST = "${./scripts/eff_large_wordlist.txt}"; text = builtins.readFile ./scripts/nexopass.sh; }; + + # NexoPass window (github.com/Nexoniarz/NexoPass). Shares accounts, site + # lists and the app password with the nexopass command above. + nexopassGuiVersion = "1.3.1"; + nexopassGuiJar = pkgs.fetchurl { + url = "https://github.com/Nexoniarz/NexoPass/releases/download/v${nexopassGuiVersion}/NexoPass-linux-x64-${nexopassGuiVersion}.jar"; + hash = "sha256-WeUixuz+aLPsMDj+a0Gs09gfikMYYCf8uuZIN89CqVo="; + }; + nexopassGuiLibs = with pkgs; [ libGL libx11 libxext libxrender libxtst libxi libxrandr libxcursor fontconfig freetype ]; + nexopassGuiDesktop = pkgs.makeDesktopItem { + name = "nexopass"; + desktopName = "NexoPass"; + comment = "Passwords derived from a master"; + exec = "nexopass-gui"; + icon = "nexopass"; + categories = [ "Utility" "Security" ]; + }; + nexopassGui = pkgs.runCommand "nexopass-gui-${nexopassGuiVersion}" { nativeBuildInputs = [ pkgs.makeWrapper ]; } '' + makeWrapper ${pkgs.jdk17}/bin/java $out/bin/nexopass-gui \ + --add-flags "-Xmx1g -jar ${nexopassGuiJar}" \ + --prefix LD_LIBRARY_PATH : /run/opengl-driver/lib:${lib.makeLibraryPath nexopassGuiLibs} + install -Dm644 ${./scripts/nexopass.png} $out/share/icons/hicolor/512x512/apps/nexopass.png + install -Dm644 ${nexopassGuiDesktop}/share/applications/nexopass.desktop $out/share/applications/nexopass.desktop + ''; in { environment.systemPackages = with pkgs; [ @@ -17,5 +42,6 @@ in vaultToggle stripMetadata nexopass + nexopassGui ]; } diff --git a/modules/scripts/nexopass.png b/modules/scripts/nexopass.png new file mode 100644 index 0000000000000000000000000000000000000000..5531368484cd459616bf9e4fad2af7f1bbbba31d GIT binary patch literal 25514 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