Compare commits
No commits in common. "6fb76d1efd4937a3bc979921103403b0028a2a61" and "bf88128d255affb8552277bf39111c0e79c27104" have entirely different histories.
6fb76d1efd
...
bf88128d25
@ -836,44 +836,15 @@ This is `db-light' and `solarized-light'."
|
|||||||
|
|
||||||
;;; SSH-Key-Handling
|
;;; SSH-Key-Handling
|
||||||
|
|
||||||
(defun db/add-ssh-key-with-password (key-file password-fn)
|
(defun db/add-ssh-key-with-password (key-file password)
|
||||||
"Add key in KEY-FILE to currently running ssh-agent.
|
"Add key in KEY-FILE with PASSWORD to currently running ssh-agent."
|
||||||
|
|
||||||
PASSWORD-FN is supposed to be a function returning the password
|
|
||||||
for KEY-FILE."
|
|
||||||
;; XXX: check whether the key is already loaded in the current agent.
|
|
||||||
(with-environment-variables (("SSH_ASKPASS_REQUIRE" "never"))
|
(with-environment-variables (("SSH_ASKPASS_REQUIRE" "never"))
|
||||||
(let* ((key-file (expand-file-name key-file))
|
(with-temp-buffer
|
||||||
(proc (make-process :name "ssh-add"
|
(unless (zerop (call-process-region password nil ; XXX: only compute password when it's needed?
|
||||||
:buffer nil
|
"ssh-add" ; XXX: generalize to also allow pageant?
|
||||||
:command (list "ssh-add" key-file)
|
nil t nil
|
||||||
:filter #'(lambda (process output)
|
(expand-file-name key-file)))
|
||||||
(cond
|
(error "Adding SSH key %s failed: %s" key-file (buffer-string))))))
|
||||||
((string= (format "Enter passphrase for %s: "
|
|
||||||
key-file)
|
|
||||||
output)
|
|
||||||
(process-send-string process (funcall password-fn))
|
|
||||||
(process-send-string process "\n"))
|
|
||||||
((or (save-match-data
|
|
||||||
(string-match (format "^Identity added: %s" key-file)
|
|
||||||
output))
|
|
||||||
(string= output "\n"))
|
|
||||||
;; Ignore harmless output
|
|
||||||
t)
|
|
||||||
(t (message "Unknown output received from ssh-agent: %s" output))))
|
|
||||||
:sentinel #'(lambda (_ event)
|
|
||||||
(cond
|
|
||||||
((string= event "finished\n")
|
|
||||||
(message "Successfully added %s to local SSH agent"
|
|
||||||
key-file))
|
|
||||||
(t (message "Adding SSH key %s failed, ssh-add process reached state %s"
|
|
||||||
key-file
|
|
||||||
event)))))))
|
|
||||||
;; We are waiting for the process to finish, to not let its output
|
|
||||||
;; intermingle with others. XXX: is there a more standard way to wait for
|
|
||||||
;; a process to finish?
|
|
||||||
(while (process-live-p proc)
|
|
||||||
(sit-for 0.2)))))
|
|
||||||
|
|
||||||
(defcustom db/known-ssh-keys nil
|
(defcustom db/known-ssh-keys nil
|
||||||
"A alist mapping SSH key-files to their password entries.
|
"A alist mapping SSH key-files to their password entries.
|
||||||
@ -897,9 +868,7 @@ holding the password to unlock the key."
|
|||||||
;; XXX: error handling
|
;; XXX: error handling
|
||||||
(interactive)
|
(interactive)
|
||||||
(pcase-dolist (`(,ssh-key . ,pass-entry) db/known-ssh-keys)
|
(pcase-dolist (`(,ssh-key . ,pass-entry) db/known-ssh-keys)
|
||||||
(db/add-ssh-key-with-password ssh-key
|
(db/add-ssh-key-with-password ssh-key (apply #'db/password-from-storage pass-entry))))
|
||||||
#'(lambda ()
|
|
||||||
(apply #'db/password-from-storage pass-entry)))))
|
|
||||||
|
|
||||||
(cl-defgeneric db/password-from-storage (type entry-key)
|
(cl-defgeneric db/password-from-storage (type entry-key)
|
||||||
"Retrieve password from storage of type TYPE with lookup key ENTRY-KEY.")
|
"Retrieve password from storage of type TYPE with lookup key ENTRY-KEY.")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user