From ea0a93f5e0dc329db505535d0024f313be3efa6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20B=C3=BCchau?= Date: Sat, 17 Jun 2017 16:32:34 +0200 Subject: [PATCH] fix #8 and fix #10 - start gpg-agent if needed - don't even try to encrypt asymmetrically if no public keys are available --- configure | 50 +++++++- configure.ac | 1 + debian/changelog | 2 + .../de/LC_MESSAGES/thunar-custom-actions.po | 115 +++++++++++++----- m4/tuca.m4.in | 16 +++ .../system-uca/gpg.xml.m4 | 13 +- 6 files changed, 165 insertions(+), 32 deletions(-) diff --git a/configure b/configure index 4529bc6..2844d4c 100755 --- a/configure +++ b/configure @@ -588,6 +588,7 @@ ac_subst_vars='LTLIBOBJS LIBOBJS configure_vars makefile_include +gpg_connect_agent_bin gpg_agent_bin pinentry_gtk_2_bin sha256sum_bin @@ -685,7 +686,8 @@ md5sum_bin sha1sum_bin sha256sum_bin pinentry_gtk_2_bin -gpg_agent_bin' +gpg_agent_bin +gpg_connect_agent_bin' # Initialize some variables set by options. @@ -1338,6 +1340,8 @@ Some influential environment variables: path to pinentry-gtk-2 gpg_agent_bin path to gpg-agent + gpg_connect_agent_bin + path to gpg-connect-agent Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -2891,6 +2895,50 @@ test -n "$gpg_agent_bin" || as_fn_error $? "no gpg-agent (gnupg agent) found" "$ +# Extract the first word of "gpg-connect-agent", so it can be a program name with args. +set dummy gpg-connect-agent; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_gpg_connect_agent_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $gpg_connect_agent_bin in + [\\/]* | ?:[\\/]*) + ac_cv_path_gpg_connect_agent_bin="$gpg_connect_agent_bin" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_gpg_connect_agent_bin="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +gpg_connect_agent_bin=$ac_cv_path_gpg_connect_agent_bin +if test -n "$gpg_connect_agent_bin"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gpg_connect_agent_bin" >&5 +$as_echo "$gpg_connect_agent_bin" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +test -n "$gpg_connect_agent_bin" || as_fn_error $? "no gpg-connect-agent (gnupg agent control) found" "$LINENO" 5 + + + # Check for Python modules if test -z $PYTHON; diff --git a/configure.ac b/configure.ac index 5b606fe..5a75295 100644 --- a/configure.ac +++ b/configure.ac @@ -49,6 +49,7 @@ REQUIRE_PROG([sha1sum],[sha1sum_bin],[program]) REQUIRE_PROG([sha256sum],[sha256sum_bin],[program]) REQUIRE_PROG([pinentry-gtk-2],[pinentry_gtk_2_bin],[graphical password dialog]) REQUIRE_PROG([gpg-agent],[gpg_agent_bin],[gnupg agent]) +REQUIRE_PROG([gpg-connect-agent],[gpg_connect_agent_bin],[gnupg agent control]) # Check for Python modules AX_PYTHON_MODULE(lxml,fatal,python3) diff --git a/debian/changelog b/debian/changelog index ec83e46..369edb4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,8 @@ thunar-custom-actions (0.0.16) UNRELEASED; urgency=medium * add text to public key selection dialog + * stop asymmetric GPG encryption action if no keys are available + * start gpg-agent if needed -- Yann Büchau Thu, 15 Jun 2017 12:25:02 +0200 diff --git a/locale/de/LC_MESSAGES/thunar-custom-actions.po b/locale/de/LC_MESSAGES/thunar-custom-actions.po index 75a08b0..aeb2c21 100644 --- a/locale/de/LC_MESSAGES/thunar-custom-actions.po +++ b/locale/de/LC_MESSAGES/thunar-custom-actions.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-15 12:24+0200\n" -"PO-Revision-Date: 2017-06-15 12:27+0200\n" +"POT-Creation-Date: 2017-06-17 16:26+0200\n" +"PO-Revision-Date: 2017-06-17 16:22+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: de\n" @@ -18,6 +18,12 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: locale/tmp_only_uca_commands.sh:1 locale/tmp_only_uca_commands.sh:2 +#: locale/tmp_only_uca_commands.sh:3 +#, sh-format +msgid "Initialising gnupg..." +msgstr "Initialisiere gnupg..." + #: locale/tmp_only_uca_commands.sh:1 locale/tmp_only_uca_commands.sh:2 #, sh-format msgid "Encrypting" @@ -41,7 +47,14 @@ msgstr "$base überschreiben?" #: locale/tmp_only_uca_commands.sh:14 #, sh-format msgid "something went wrong copying the file $fileout over to $filefinalout." -msgstr "Etwas ist beim Kopieren der Datei $fileout nach $filefinalout schiefgegangen." +msgstr "" +"Etwas ist beim Kopieren der Datei $fileout nach $filefinalout schiefgegangen." + +#: locale/tmp_only_uca_commands.sh:2 +#, sh-format +msgid "Your local keyring does not contain any public keys." +msgstr "" +"Es befinden sich keine öffentlichen Schlüssel im lokalen Schlüsselbund." #: locale/tmp_only_uca_commands.sh:2 #, sh-format @@ -76,8 +89,13 @@ msgstr "Entschlüssele" #: locale/tmp_only_uca_commands.sh:3 #, sh-format -msgid "Could not decrypt $filebase. Wrong password?" -msgstr "Konnte $filebase nicht entschlüsseln. Falsches Passwort?" +msgid "Could not decrypt $filebase." +msgstr "Konnte $filebase nicht entschlüsseln." + +#: locale/tmp_only_uca_commands.sh:3 +#, sh-format +msgid "Wrong password or no appropriate private key available?" +msgstr "Falsches Passwort oder kein passender privater Schlüssel verfügbar?" #: locale/tmp_only_uca_commands.sh:4 #, sh-format @@ -256,7 +274,8 @@ msgstr "Optimiere PDF" #~ msgstr "Alle Signale entfernt" #~ msgid "Attempt to connect action '{}' to unregistered signal '{}'." -#~ msgstr "Versuch, die Aktion '{}' zu unregistriertem Signal '{}' zu verbinden." +#~ msgstr "" +#~ "Versuch, die Aktion '{}' zu unregistriertem Signal '{}' zu verbinden." #~ msgid "Connected action '{}' to signal '{}'" #~ msgstr "Verbinde die Aktion '{}' zum Signal '{}'" @@ -276,11 +295,15 @@ msgstr "Optimiere PDF" #~ msgid "Attempt to emit unregistered signal '{}'" #~ msgstr "Versuch, unregistriertes Signal '{}' zu emittieren" -#~ msgid "The current buffer is empty and no file is specified. No saving necessary." -#~ msgstr "Der Editor ist leer und keine Datei wurde angegeben. Speichern ist nicht notwendig." +#~ msgid "" +#~ "The current buffer is empty and no file is specified. No saving necessary." +#~ msgstr "" +#~ "Der Editor ist leer und keine Datei wurde angegeben. Speichern ist nicht " +#~ "notwendig." #~ msgid "Nonexistant or no file specified. Saving necessary!" -#~ msgstr "Nichtexistente oder gar keine Datei angegeben. Speichern ist notwendig!" +#~ msgstr "" +#~ "Nichtexistente oder gar keine Datei angegeben. Speichern ist notwendig!" #~ msgid "md5sum of file '{}' is '{}'" #~ msgstr "md5-Summe der Datei '{}' is '{}'" @@ -393,8 +416,13 @@ msgstr "Optimiere PDF" #~ msgid "display ensemble" #~ msgstr "Ensemble anzeigen" -#~ msgid "[slower] Based on the given day and amount tolerances, run an ensemble and display the 10% and 90% quantiles as darker shadow." -#~ msgstr "[langsamer] Auf Grundlage der Tages- und Betragstoleranzen wird ein Ensemble gerechnet und das 10%- und 90%-Quantil als dunkerer Schatten angezeigt." +#~ msgid "" +#~ "[slower] Based on the given day and amount tolerances, run an ensemble " +#~ "and display the 10% and 90% quantiles as darker shadow." +#~ msgstr "" +#~ "[langsamer] Auf Grundlage der Tages- und Betragstoleranzen wird ein " +#~ "Ensemble gerechnet und das 10%- und 90%-Quantil als dunkerer Schatten " +#~ "angezeigt." #~ msgid "end date" #~ msgstr "Enddatum" @@ -429,11 +457,18 @@ msgstr "Optimiere PDF" #~ msgid "There was a problem updating the graph." #~ msgstr "Es gab ein Problem beim Aktualisieren des Graphen." -#~ msgid "[WARNING] There was a problem updating the graph. Please check the input!" -#~ msgstr "[WARNUNG] Es gab ein Problem beim Aktualisieren des Graphen. Bitte Eingabe überprüfen!" +#~ msgid "" +#~ "[WARNING] There was a problem updating the graph. Please check the input!" +#~ msgstr "" +#~ "[WARNUNG] Es gab ein Problem beim Aktualisieren des Graphen. Bitte " +#~ "Eingabe überprüfen!" -#~ msgid "The gui is not running. Refusing to update the graph now! Remembering this for gui start." -#~ msgstr "Die Gui läuft nicht. Verzichte auf Graphaktualisierung! Wird aber für den Gui-Start gemerkt!" +#~ msgid "" +#~ "The gui is not running. Refusing to update the graph now! Remembering " +#~ "this for gui start." +#~ msgstr "" +#~ "Die Gui läuft nicht. Verzichte auf Graphaktualisierung! Wird aber für den " +#~ "Gui-Start gemerkt!" #~ msgid "Date region was changed." #~ msgstr "Datumsbereich wurde geändert." @@ -448,7 +483,9 @@ msgstr "Optimiere PDF" #~ msgstr "Enddatum vor Startdatum ausgewählt" #~ msgid "You selected an end date in the past. The graph will not updated." -#~ msgstr "Es wurde ein Enddatum in der Vergangenheit ausgewählt. Der Graph wird nicht aktualisiert." +#~ msgstr "" +#~ "Es wurde ein Enddatum in der Vergangenheit ausgewählt. Der Graph wird " +#~ "nicht aktualisiert." #~ msgid "Please choose a file" #~ msgstr "Bitte eine Datei auswählen" @@ -525,14 +562,24 @@ msgstr "Optimiere PDF" #~ msgid "Calculating md5sum of file '{}' didn't work!" #~ msgstr "Berechnen der md5-Summe für die Datei '{}' hat nicht funktioniert!" -#~ msgid "Yeah, the amount gets a pretty format, but the system is not yet perfect. Place the cursor after the comma and then type to add numbers after the comma..." -#~ msgstr "Ja, der Betrag wird automatisch schön formatiert, aber so richtig perfekt ist die Eingabe noch nicht. Zum Eingeben von Nachkommastellen, den Cursor bitte hinter das Komma platzieren..." +#~ msgid "" +#~ "Yeah, the amount gets a pretty format, but the system is not yet perfect. " +#~ "Place the cursor after the comma and then type to add numbers after the " +#~ "comma..." +#~ msgstr "" +#~ "Ja, der Betrag wird automatisch schön formatiert, aber so richtig perfekt " +#~ "ist die Eingabe noch nicht. Zum Eingeben von Nachkommastellen, den Cursor " +#~ "bitte hinter das Komma platzieren..." #~ msgid "To prevent recursion I won't react to this." #~ msgstr "Um Rekursion zu verhindern, wird nicht darauf reagiert." -#~ msgid "Somehow a date was selected from an unknown calendar. This should not have happened." -#~ msgstr "Irgendwie wurde ein Datum von einem unbekannten Kalender ausgewählt. Das hätte nicht passieren sollen." +#~ msgid "" +#~ "Somehow a date was selected from an unknown calendar. This should not " +#~ "have happened." +#~ msgstr "" +#~ "Irgendwie wurde ein Datum von einem unbekannten Kalender ausgewählt. Das " +#~ "hätte nicht passieren sollen." #~ msgid "Date range" #~ msgstr "Datumsbereich" @@ -625,13 +672,16 @@ msgstr "Optimiere PDF" #~ msgstr "untätig" #~ msgid "Request to stop logging on device {} - will terminate soon..." -#~ msgstr "Anfrage, die Datenaufzeichnung auf Gerät {} zu beenden - werde bald anhalten..." +#~ msgstr "" +#~ "Anfrage, die Datenaufzeichnung auf Gerät {} zu beenden - werde bald " +#~ "anhalten..." #~ msgid "Shutting down logging thread of device {}" #~ msgstr "Fahre Datenaufzeichnungs-Thread auf Gerät {} herunter" #~ msgid "logging thread for device {} was shut down properly." -#~ msgstr "Datenaufzeichnungsthread für Gerät {} wurde ordentlich heruntergefahren." +#~ msgstr "" +#~ "Datenaufzeichnungsthread für Gerät {} wurde ordentlich heruntergefahren." #~ msgid "Starting data logging on device {}" #~ msgstr "Beginne Datenaufzeichnung auf Gerät {}" @@ -679,19 +729,25 @@ msgstr "Optimiere PDF" #~ msgstr "gpio-dbus läuft nicht" #~ msgid "trying to start gpio-dbus via systemd's dbus interface..." -#~ msgstr "versuche, gpio-dbus über das DBus Interface von systemd zu starten..." +#~ msgstr "" +#~ "versuche, gpio-dbus über das DBus Interface von systemd zu starten..." #~ msgid "instructed systemd via dbus to start gpio-dbus." #~ msgstr "systemd wurde über dbus angewiesen, gpio-dbus zu starten." #~ msgid "gpio-dbus was successfully started via systemd's dbus interface." -#~ msgstr "gpio-dbus erfolgreich über das DBus-Interface von systemd gestartet." +#~ msgstr "" +#~ "gpio-dbus erfolgreich über das DBus-Interface von systemd gestartet." #~ msgid "gpio-dbus startup took too long via systemd, didn't work." -#~ msgstr "gpio-dbus über systemd zu starten, hat zu lange gedauert, nicht funktioniert." +#~ msgstr "" +#~ "gpio-dbus über systemd zu starten, hat zu lange gedauert, nicht " +#~ "funktioniert." #~ msgid "starting gpio-dbus via systemd's dbus interface didn't work." -#~ msgstr "gpio-dbus über das DBus Interface von systemd zu starten, hat nicht funktioniert." +#~ msgstr "" +#~ "gpio-dbus über das DBus Interface von systemd zu starten, hat nicht " +#~ "funktioniert." #~ msgid "starting gpio-dbus via 'at now'..." #~ msgstr "starte gpio-dbus über 'at now'..." @@ -700,7 +756,9 @@ msgstr "Optimiere PDF" #~ msgstr "gpio-dbus erfolgreich über 'at now' gestartet." #~ msgid "gpio-dbus startup took too long via 'at now', didn't work." -#~ msgstr "gpio-dbus über 'at now' zu starten, hat zu lange gedauert, nicht funktioniert." +#~ msgstr "" +#~ "gpio-dbus über 'at now' zu starten, hat zu lange gedauert, nicht " +#~ "funktioniert." #~ msgid "no DEVNAME environment variable given. Nothing more to do." #~ msgstr "keine DEVNAME Umgebungsvariable. Nichts mehr zu tun." @@ -709,7 +767,8 @@ msgstr "Optimiere PDF" #~ msgstr "DEVNAME Umgebungsvariable: {}" #~ msgid "DEVNAME environment variable '{}' is a non-existant file. Aborting." -#~ msgstr "DEVNAME Umgebungsvariable '{}' ist keine existierende Datei. Abbruch." +#~ msgstr "" +#~ "DEVNAME Umgebungsvariable '{}' ist keine existierende Datei. Abbruch." #, fuzzy #~ msgid "getting monitored_devices..." diff --git a/m4/tuca.m4.in b/m4/tuca.m4.in index 9a86310..0f21e09 100644 --- a/m4/tuca.m4.in +++ b/m4/tuca.m4.in @@ -25,6 +25,7 @@ define(<~TUCA_SHA256SUM~>,<~@sha256sum_bin@~>)dnl define(<~TUCA_PINENTRY_GTK_2~>,<~@pinentry_gtk_2_bin@~>)dnl define(<~TUCA_GPG2K_PARSER~>,<~@bindir@/parse-gpg2-k~>) define(<~TUCA_GPG_AGENT~>,<~@gpg_agent_bin@~>) +define(<~TUCA_GPG_CONNECT_AGENT~>,<~@gpg_connect_agent_bin@~>) dnl metadata from ./configure define(<~TUCA_PACKAGE_NAME~>,<~@PACKAGE_NAME@~>)dnl dnl paths from ./configure @@ -234,3 +235,18 @@ define(<~TUCA_CMD~>,<~dnl TUCA_INIT();dnl <~$1~>dnl ~>)dnl +dnl +dnl TUCA_GPG_INIT() +dnl - make sure gpg is usable by initialising some things +dnl +define(<~TUCA_GPG_INIT~>,<~dnl +if ! TUCA_GPG_AGENT();then dnl check if agent is not running + TUCA_PROGRESSBAR(dnl + TUCA_PROGRESSBAR_TEXT(TUCA_TRANSLATE(Initialising gnupg...));dnl show text + TUCA_GPG2() --list-public-keys;dnl make sure a ~/.gnupg directory exists + TUCA_GPG_CONNECT_AGENT() /bye;dnl start the gpg-agent + TUCA_GPG_AGENT() --pinentry-program="TUCA_PINENTRY_GTK_2()" dnl tell gpg-agent to use pinentry-gtk-2 + pulse,dnl let the progressbar only pulse + );dnl +fi<~~>dnl +~>)dnl diff --git a/share/thunar-custom-actions/system-uca/gpg.xml.m4 b/share/thunar-custom-actions/system-uca/gpg.xml.m4 index 6aa744a..d48d7d7 100644 --- a/share/thunar-custom-actions/system-uca/gpg.xml.m4 +++ b/share/thunar-custom-actions/system-uca/gpg.xml.m4 @@ -9,6 +9,7 @@ include(tuca.m4)dnl Symmetrisch verschlüsseln mit GPG Encrypt symmetrically with GPG TUCA_CMD(dnl + TUCA_GPG_INIT();dnl initialise gpg PASSWORD=$(TUCA_PASSWORD(TUCA_TRANSLATE(File password))) || exit;dnl TUCA_PROGRESSBAR(dnl TUCA_LOOP(dnl @@ -35,6 +36,11 @@ include(tuca.m4)dnl Asymmetrisch verschlüsseln mit GPG Encrypt asymmetrically with GPG TUCA_CMD(dnl + TUCA_GPG_INIT();dnl initialise gpg + if test -z "$(TUCA_GPG2() --list-public-keys | TUCA_GPG2K_PARSER())";then dnl test for public keys + TUCA_ERROR(TUCA_TRANSLATE(Your local keyring does not contain any public keys.));dnl + exit;dnl + fi;dnl RECIPIENT_KEY="$(TUCA_GPG2() --list-public-keys | TUCA_GPG2K_PARSER() |dnl TUCA_ZENITY() --list --print-column=1 dnl --column="TUCA_TRANSLATE(Public Key)" dnl @@ -43,7 +49,8 @@ include(tuca.m4)dnl --text="TUCA_TRANSLATE(Select a recipient key from the list below.)"dnl --title="TUCA_TRANSLATE(Recipient key)"dnl )";dnl - TUCA_GPG_AGENT() --pinentry-program="TUCA_PINENTRY_GTK_2()";dnl + TUCA_GPG_CONNECT_AGENT() /bye;dnl start the gpg-agent + TUCA_GPG_AGENT() --pinentry-program="TUCA_PINENTRY_GTK_2()";dnl tell gpg-agent to use pinentry-gtk-2 TUCA_PROGRESSBAR(dnl TUCA_LOOP(dnl TUCA_CREATE_FILE(dnl @@ -71,12 +78,12 @@ include(tuca.m4)dnl Entschlüsseln mit GPG Decrypt with GPG TUCA_CMD(dnl - TUCA_GPG_AGENT() --pinentry-program="TUCA_PINENTRY_GTK_2()";dnl + TUCA_GPG_INIT();dnl initialise gpg TUCA_PROGRESSBAR(dnl TUCA_LOOP(dnl TUCA_CREATE_FILE(dnl TUCA_GPG2() --batch --yes --decrypt -o TUCA_OUT() TUCA_IN() || dnl - TUCA_ERROR(TUCA_TRANSLATE(Could not decrypt $TUCA_FILE_BASE_VAR(). Wrong password?));dnl + TUCA_ERROR(TUCA_TRANSLATE(Could not decrypt $TUCA_FILE_BASE_VAR().) TUCA_TRANSLATE(Wrong password or no appropriate private key available?));dnl ,dnl command TUCA_FILE(),dnl input $(dirname TUCA_FILE())/$(basename TUCA_FILE() | TUCA_PERL() -pe 's#\.\w+<~$~>##g'),dnl output name