From 0f94baacafe5ead6848626bc6c70618d3dc9325d Mon Sep 17 00:00:00 2001 From: Alexander Hess Date: Wed, 23 Sep 2026 15:05:23 +0200 Subject: [PATCH] Add (un-)mount ~/Vault toggle --- .config/gnome-settings/key-bindings.ini | 10 ++- .local/bin/nextcloud-restore | 2 +- .local/bin/vault-toggle | 101 ++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 3 deletions(-) create mode 100755 .local/bin/vault-toggle diff --git a/.config/gnome-settings/key-bindings.ini b/.config/gnome-settings/key-bindings.ini index ac690d7..0cb270c 100644 --- a/.config/gnome-settings/key-bindings.ini +++ b/.config/gnome-settings/key-bindings.ini @@ -93,7 +93,7 @@ # q | | Close the window | | | # ------------------+------------------------+------------------------+------------------------+------------------------+------------------------ # b | Split beside | | Toggle bluetooth | Randomize wallpaper | -# v | Split below | | | | +# v | Split below | | (Un-)Mount the ~/Vault | | # e | Split toggle | | Show battery load | | # s | Stacked layout | | | | # w | Tabbed layout | | Toggle WiFi | Toggle airplane mode | @@ -501,7 +501,7 @@ keyboard-brightness-toggle=['slash'] # Due to the structure of the below groups, # we must duplicate some of them to allow multiple bindings -custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/show_key_bindings/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/move_window_to_empty_workspace/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/list_windows/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/show_launcher_1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/show_launcher_2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/show_run_1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/show_run_2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_primary_terminal_1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_primary_terminal_2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_secondary_terminal_1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_secondary_terminal_2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_file_manager/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_firefox/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_chromium/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_google_chrome/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_evolution/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/dark_scheme_toggle/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/night_light_force/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/night_light_toggle/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/night_light_make_cooler/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/night_light_make_warmer/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/randomize_background/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/wifi_toggle/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/restart_gnome_shell/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/emoji_picker_type/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/emoji_picker_copy/'] +custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/show_key_bindings/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/move_window_to_empty_workspace/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/list_windows/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/show_launcher_1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/show_launcher_2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/show_run_1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/show_run_2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_primary_terminal_1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_primary_terminal_2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_secondary_terminal_1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_secondary_terminal_2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_file_manager/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_firefox/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_chromium/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_google_chrome/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/launch_evolution/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/dark_scheme_toggle/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/night_light_force/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/night_light_toggle/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/night_light_make_cooler/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/night_light_make_warmer/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/randomize_background/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/wifi_toggle/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/restart_gnome_shell/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/emoji_picker_type/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/emoji_picker_copy/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/vault_toggle/'] [org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/show_key_bindings] @@ -653,6 +653,12 @@ command='/home/user/.local/bin/rofimoji --action copy' name='Copy an emoji' +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/vault_toggle] +binding='v' +command='/home/user/.local/bin/vault-toggle' +name='(Un-)Mount the vault' + + [org/gnome/shell/keybindings] diff --git a/.local/bin/nextcloud-restore b/.local/bin/nextcloud-restore index 3d3f019..64c8d5a 100755 --- a/.local/bin/nextcloud-restore +++ b/.local/bin/nextcloud-restore @@ -113,7 +113,7 @@ set_key General optionalServerNotifications false set_key General showCallNotifications false set_key General showChatNotifications false -set_key General isVfsEnabled false +set_key General isVfsEnabled false # `true` is also not good for `gocryptfs` syncs set_key General confirmExternalStorage true set_key General useNewBigFolderSizeLimit false set_key General newBigFolderSizeLimit 999 diff --git a/.local/bin/vault-toggle b/.local/bin/vault-toggle new file mode 100755 index 0000000..1f90a53 --- /dev/null +++ b/.local/bin/vault-toggle @@ -0,0 +1,101 @@ +#!/bin/sh + +# Mount or unmount the `gocryptfs` ~/Vault synced via the ~/Cloud +# +# Triggered by v +# as defined in [org/gnome/settings-daemon/plugins/media-keys] +# in ~/.config/gnome-settings/key-bindings.ini +# +# The password is taken from the secret service (e.g., GNOME Keyring) +# and, if not stored there, asked for with a GUI prompt +# +# Store the password once with: +# secret-tool store --label='gocryptfs ~/Vault' gocryptfs vault +# +# Requires: +# - gocryptfs +# - libnotify-bin +# - libsecret-tools +# - zenity + +set -eu + + +CIPHER_DIR="$HOME/Cloud/Misc/Vault.enc" +MOUNT_POINT="$HOME/Vault" + + + +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} + + +_notify() { + _command_exists notify-send || return 0 + notify-send 'Vault' "$1" +} + + +# Print the password to stdout, +# instead of storing it in a variable +_password() { + if _command_exists secret-tool \ + && secret-tool lookup gocryptfs vault 2>/dev/null; then + return 0 + fi + zenity --password --title='Unlock the Vault' 2>/dev/null +} + + +_unmount() { + if _command_exists fusermount3; then + fusermount3 -u "$MOUNT_POINT" + else + fusermount -u "$MOUNT_POINT" + fi +} + + + +# Unmount if mounted + +if mountpoint -q "$MOUNT_POINT"; then + + if _unmount 2>/dev/null; then + _notify 'Locked' + exit 0 + fi + + # Most likely a shell or an app still has a file open inside + _notify 'Still in use => Close all files and shells inside first' + exit 1 + +fi + + + +# Mount otherwise + +if [ ! -f "$CIPHER_DIR/gocryptfs.conf" ]; then + _notify "No vault found at $CIPHER_DIR" + exit 1 +fi + + +# Nextcloud does not sync mode bits +# => Enforce owner-only access on every client, +# which `gocryptfs` also shows as the mode of the mount point +chmod 700 "$CIPHER_DIR" + + +mkdir -p "$MOUNT_POINT" + + +# `gocryptfs` reads the password from stdin if that is not a terminal +if _password | gocryptfs -idle 1h -quiet -sharedstorage "$CIPHER_DIR" "$MOUNT_POINT"; then + _notify 'Unlocked' +else + _notify 'Not unlocked (wrong or no password?)' + exit 1 +fi