tests: Fix no gpg-agent upon removal of GNUPGHOME.

* tests/gpgscm/gnupg.scm (with-ephemeral-home-directory): Add
teadown-fn.
* tests/gpgsm/export.scm: Use -no-atexit version and stop-agent.
* tests/openpgp/decrypt-session-key.scm: Likewise.
* tests/openpgp/decrypt-unwrap-verify.scm: Likewise.
* tests/openpgp/defs.scm (have-opt-always-trust): Likewise.
(setup-environment-no-atexit): New.
(start-agent): Support no use of atexit.
* tests/gpgsm/gpgsm-defs.scm (setup-gpgsm-environment-no-atexit): New.
* tests/migrations/common.scm (untar-armored): Follow the change
of with-ephemeral-home-directory.

--

When gpg-agent detects homedir removal, it will automatically exit.
Then, call of 'gpgconf --kill all' will fail.  So, stop-agent should
be called before the removal of homedir.

Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
NIIBE Yutaka 2018-04-04 20:27:08 +09:00
parent cb1731c23c
commit 83529e1bd1
7 changed files with 28 additions and 13 deletions

View File

@ -28,17 +28,22 @@
;; Evaluate a sequence of expressions with an ephemeral home ;; Evaluate a sequence of expressions with an ephemeral home
;; directory. ;; directory.
(define-macro (with-ephemeral-home-directory setup-fn . expressions) (define-macro (with-ephemeral-home-directory setup-fn teardown-fn . expressions)
(let ((original-home-directory (gensym)) (let ((original-home-directory (gensym))
(ephemeral-home-directory (gensym)) (ephemeral-home-directory (gensym))
(setup (gensym))) (setup (gensym))
(teardown (gensym)))
`(let ((,original-home-directory (getenv "GNUPGHOME")) `(let ((,original-home-directory (getenv "GNUPGHOME"))
(,ephemeral-home-directory (mkdtemp)) (,ephemeral-home-directory (mkdtemp))
(,setup (delay (,setup-fn)))) (,setup (delay (,setup-fn)))
(,teardown (delay (,teardown-fn))))
(finally (unlink-recursively ,ephemeral-home-directory) (finally (unlink-recursively ,ephemeral-home-directory)
(dynamic-wind (dynamic-wind
(lambda () (lambda ()
(setenv "GNUPGHOME" ,ephemeral-home-directory #t) (setenv "GNUPGHOME" ,ephemeral-home-directory #t)
(with-working-directory ,ephemeral-home-directory (force ,setup))) (with-working-directory ,ephemeral-home-directory (force ,setup)))
(lambda () ,@expressions) (lambda () ,@expressions)
(lambda () (setenv "GNUPGHOME" ,original-home-directory #t))))))) (lambda ()
(setenv "GNUPGHOME" ,ephemeral-home-directory #t)
(with-working-directory ,ephemeral-home-directory (force ,teardown))
(setenv "GNUPGHOME" ,original-home-directory #t)))))))

View File

@ -25,7 +25,7 @@
(lambda (cert) (lambda (cert)
(lettmp (exported) (lettmp (exported)
(call-check `(,@gpgsm --output ,exported --export ,cert::uid::CN)) (call-check `(,@gpgsm --output ,exported --export ,cert::uid::CN))
(with-ephemeral-home-directory setup-gpgsm-environment (with-ephemeral-home-directory setup-gpgsm-environment-no-atexit stop-agent
(call-check `(,@gpgsm --import ,exported)) (call-check `(,@gpgsm --import ,exported))
(assert (sm-have-public-key? cert))))) (assert (sm-have-public-key? cert)))))
(lambda (cert) cert::uid::CN) (lambda (cert) cert::uid::CN)

View File

@ -99,3 +99,9 @@
(call-check `(,(tool 'gpgtar) --extract --directory=. ,(cadr *args*))) (call-check `(,(tool 'gpgtar) --extract --directory=. ,(cadr *args*)))
(create-gpgsm-gpghome)) (create-gpgsm-gpghome))
(start-agent)) (start-agent))
(define (setup-gpgsm-environment-no-atexit)
(if (member "--unpack-tarball" *args*)
(call-check `(,(tool 'gpgtar) --extract --directory=. ,(cadr *args*)))
(create-gpgsm-gpghome))
(start-agent #t))

View File

@ -39,7 +39,7 @@
(define GPGTAR (path-join (getenv "objdir") "tools" (qualify "gpgtar"))) (define GPGTAR (path-join (getenv "objdir") "tools" (qualify "gpgtar")))
(define (untar-armored source-name) (define (untar-armored source-name)
(with-ephemeral-home-directory (lambda ()) (with-ephemeral-home-directory (lambda ()) (lambda ())
(pipe:do (pipe:do
(pipe:open source-name (logior O_RDONLY O_BINARY)) (pipe:open source-name (logior O_RDONLY O_BINARY))
(pipe:spawn `(,@GPG --dearmor)) (pipe:spawn `(,@GPG --dearmor))

View File

@ -37,7 +37,7 @@
(lambda (name) (lambda (name)
(let* ((source (in-srcdir "tests" "openpgp" (string-append name ".asc"))) (let* ((source (in-srcdir "tests" "openpgp" (string-append name ".asc")))
(key (get-session-key source))) (key (get-session-key source)))
(with-ephemeral-home-directory setup-environment (with-ephemeral-home-directory setup-environment-no-atexit stop-agent
(tr:do (tr:do
(tr:open source) (tr:open source)
(tr:gpg "" `(--yes --decrypt --override-session-key ,key)) (tr:gpg "" `(--yes --decrypt --override-session-key ,key))

View File

@ -35,7 +35,7 @@
;; Then, verify the signature with a clean working directory ;; Then, verify the signature with a clean working directory
;; containing only Steve's public key. ;; containing only Steve's public key.
(with-ephemeral-home-directory setup-environment (with-ephemeral-home-directory setup-environment-no-atexit stop-agent
(call-check `(,@gpg --import ,steve's-key)) (call-check `(,@gpg --import ,steve's-key))
(call-check `(,@gpg --verify ,unwrapped))))) (call-check `(,@gpg --verify ,unwrapped)))))
'("encsig-2-keys-3" "encsig-2-keys-4"))) '("encsig-2-keys-3" "encsig-2-keys-4")))

View File

@ -201,7 +201,7 @@
(define have-opt-always-trust (define have-opt-always-trust
(catch #f (catch #f
(with-ephemeral-home-directory (lambda ()) (with-ephemeral-home-directory (lambda ()) (lambda ())
(call-check `(,(tool 'gpg) --gpgconf-test --always-trust))) (call-check `(,(tool 'gpg) --gpgconf-test --always-trust)))
#t)) #t))
@ -365,6 +365,10 @@
(create-gpghome) (create-gpghome)
(start-agent)) (start-agent))
(define (setup-environment-no-atexit)
(create-gpghome)
(start-agent #t))
(define (create-sample-files) (define (create-sample-files)
(log "Creating sample data files") (log "Creating sample data files")
(for-each (for-each
@ -448,12 +452,12 @@
(preset-passphrases)) (preset-passphrases))
;; Create the socket dir and start the agent. ;; Create the socket dir and start the agent.
(define (start-agent) (define (start-agent . args)
(log "Starting gpg-agent...") (log "Starting gpg-agent...")
(let ((gnupghome (getenv "GNUPGHOME"))) (let ((gnupghome (getenv "GNUPGHOME")))
(atexit (lambda () (if (null? args)
(with-home-directory gnupghome (atexit (lambda ()
(stop-agent))))) (with-home-directory gnupghome (stop-agent))))))
(catch (log "Warning: Creating socket directory failed:" (car *error*)) (catch (log "Warning: Creating socket directory failed:" (car *error*))
(gpg-conf '--create-socketdir)) (gpg-conf '--create-socketdir))
(call-check `(,(tool 'gpg-connect-agent) --verbose (call-check `(,(tool 'gpg-connect-agent) --verbose