2013-01-08 00:02:06 +01:00
|
|
|
;;; dispass.el --- Emacs wrapper for DisPass
|
2012-06-09 21:47:12 +02:00
|
|
|
|
|
|
|
;; Copyright (C) 2012 Tom Willemsen <tom@ryuslash.org>
|
|
|
|
|
|
|
|
;; Author: Tom Willemsen <tom@ryuslash.org>
|
|
|
|
;; Created: Jun 8, 2012
|
2012-12-03 22:51:38 +01:00
|
|
|
;; Version: 1.1.1
|
2012-07-08 22:45:53 +02:00
|
|
|
;; Keywords: processes
|
2012-07-09 22:37:55 +02:00
|
|
|
;; URL: http://ryuslash.org/projects/dispass.el.html
|
2012-06-09 21:47:12 +02:00
|
|
|
|
|
|
|
;; Permission to use, copy, modify, and distribute this software for any
|
|
|
|
;; purpose with or without fee is hereby granted, provided that the
|
|
|
|
;; above copyright notice and this permission notice appear in all
|
|
|
|
;; copies.
|
|
|
|
|
|
|
|
;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
|
|
|
|
;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
|
|
|
;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
|
|
|
;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
|
|
|
|
;; CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
|
|
;; OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
|
|
|
;; NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
|
|
;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
2012-12-16 17:32:36 +01:00
|
|
|
;; dispass.el is an emacs wrapper around DisPass
|
|
|
|
;; (http://dispass.babab.nl). For more information see the README.org
|
|
|
|
;; and NEWS files.
|
2012-12-03 22:51:38 +01:00
|
|
|
|
2012-06-09 21:47:12 +02:00
|
|
|
;;; Code:
|
2012-06-17 22:38:43 +02:00
|
|
|
(defgroup dispass nil
|
|
|
|
"Customization options for the DisPass wrapper."
|
|
|
|
:group 'external)
|
|
|
|
|
2012-07-06 00:26:27 +02:00
|
|
|
(defcustom dispass-default-length 30
|
|
|
|
"The default length to use when generating passphrases."
|
|
|
|
:package-version '(dispass . "1")
|
|
|
|
:group 'dispass
|
|
|
|
:type '(integer))
|
|
|
|
|
2012-06-17 22:38:43 +02:00
|
|
|
(defcustom dispass-executable "dispass"
|
|
|
|
"The location of the dispass executable."
|
|
|
|
:package-version '(dispass . "0.1a7.3")
|
|
|
|
:group 'dispass
|
|
|
|
:type '(string)
|
|
|
|
:risky t)
|
2012-06-09 21:47:12 +02:00
|
|
|
|
2012-09-15 16:09:41 +02:00
|
|
|
(defcustom dispass-labels-executable "dispass-label"
|
|
|
|
"The location of the dispass-label executable."
|
|
|
|
:package-version '(dispass . "1.1")
|
|
|
|
:group 'dispass
|
|
|
|
:type 'string
|
|
|
|
:risky t)
|
|
|
|
|
2012-07-05 02:14:58 +02:00
|
|
|
(defvar dispass-labels-mode-map
|
|
|
|
(let ((map (make-sparse-keymap)))
|
|
|
|
(set-keymap-parent map tabulated-list-mode-map)
|
2012-07-06 00:22:06 +02:00
|
|
|
(define-key map "c" 'dispass-create)
|
2012-07-06 00:30:15 +02:00
|
|
|
(define-key map "a" 'dispass-add-label)
|
2012-07-08 16:05:07 +02:00
|
|
|
(define-key map "d" 'dispass-remove-label)
|
2012-07-08 18:29:45 +02:00
|
|
|
map)
|
|
|
|
"Keymap for `dispass-labels-mode', uses
|
|
|
|
`tabulated-list-mode-map' as its parent.")
|
2012-07-05 02:14:58 +02:00
|
|
|
|
2012-06-09 21:47:12 +02:00
|
|
|
(defun dispass-process-sentinel (proc status)
|
|
|
|
"Report PROC's status change to STATUS."
|
|
|
|
(let ((status (substring status 0 -1))
|
|
|
|
(buffer (process-buffer proc)))
|
|
|
|
(unless (string-equal status "finished")
|
2012-06-17 14:44:46 +02:00
|
|
|
(message "dispass %s" status))
|
2012-06-09 21:47:12 +02:00
|
|
|
|
|
|
|
(unless (eq (current-buffer) proc)
|
|
|
|
(kill-buffer buffer))))
|
|
|
|
|
|
|
|
(defun dispass-erase-buffer (buffer)
|
|
|
|
"Completely erase the contents of BUFFER"
|
|
|
|
(save-current-buffer
|
|
|
|
(set-buffer buffer)
|
|
|
|
(buffer-disable-undo buffer)
|
|
|
|
(kill-buffer buffer)))
|
|
|
|
|
2013-01-08 00:35:57 +01:00
|
|
|
(defun dispass-label-at-point ()
|
|
|
|
"When in `dispass-labels-mode', get the label at `point'."
|
|
|
|
(let ((labels-mode-p (eq major-mode 'dispass-labels-mode)))
|
|
|
|
(tabulated-list-get-id)))
|
|
|
|
|
2012-06-09 21:47:12 +02:00
|
|
|
(defun dispass-process-filter-for (label)
|
|
|
|
"Create a function that will process any lines whilst keeping
|
|
|
|
an eye out for LABEL."
|
|
|
|
`(lambda (proc string)
|
|
|
|
"Process STRING coming from PROC."
|
2012-07-05 02:07:38 +02:00
|
|
|
(cond ((string-match "^\\(Password[^:]*\\|Again\\): ?$" string)
|
2012-11-18 21:03:32 +01:00
|
|
|
(process-send-string
|
|
|
|
proc
|
|
|
|
(concat (read-passwd
|
|
|
|
(concat (replace-regexp-in-string
|
|
|
|
"^[ \t\n]+\\|[ \t\n]+$" "" string) " ")
|
|
|
|
nil) "\n")))
|
2012-06-09 21:47:12 +02:00
|
|
|
|
2012-06-17 14:44:46 +02:00
|
|
|
((string-match (concat "^[ \t]*" ,label "[ \t]*\\(.+\\)$")
|
2012-06-09 21:47:12 +02:00
|
|
|
string)
|
|
|
|
(let ((buffer (process-buffer proc)))
|
|
|
|
(with-current-buffer buffer
|
|
|
|
(insert (match-string 1 string))
|
|
|
|
(clipboard-kill-ring-save (point-min) (point-max))
|
2012-11-18 21:04:14 +01:00
|
|
|
(message "Password copied to clipboard.")))))))
|
2012-06-09 21:47:12 +02:00
|
|
|
|
2012-06-17 14:44:46 +02:00
|
|
|
(defun dispass-start-process (label create length)
|
2012-07-05 01:11:07 +02:00
|
|
|
"Start dispass process. When CREATE is non-nil send along the
|
|
|
|
-c switch to make it ask for a password twice. When LENGTH is
|
2012-06-17 14:44:46 +02:00
|
|
|
an integer and greater than 0, send along the -l switch with
|
|
|
|
LENGTH."
|
|
|
|
(let ((args `("-o" ,label))
|
|
|
|
proc)
|
|
|
|
(when create
|
|
|
|
(setq args (append '("-c") args)))
|
|
|
|
|
|
|
|
(when (and (integerp length) (> length 0))
|
|
|
|
(setq args (append `("-l" ,(number-to-string length)) args)))
|
|
|
|
|
|
|
|
(setq proc (apply 'start-process "dispass" "*dispass*"
|
|
|
|
dispass-executable args))
|
2012-06-09 21:47:12 +02:00
|
|
|
(set-process-sentinel proc 'dispass-process-sentinel)
|
|
|
|
(set-process-filter proc (dispass-process-filter-for label))))
|
|
|
|
|
2012-09-15 16:09:41 +02:00
|
|
|
(defun dispass-get-labels ()
|
|
|
|
"Get the list of labels and their information."
|
|
|
|
(let ((result '()))
|
|
|
|
(with-temp-buffer
|
2012-12-03 22:51:15 +01:00
|
|
|
(insert (shell-command-to-string
|
|
|
|
(concat dispass-labels-executable " -l --script")))
|
|
|
|
(goto-char (point-min))
|
2012-09-15 16:09:41 +02:00
|
|
|
(while (re-search-forward
|
|
|
|
"^\\(\\(?:\\sw\\|\\s_\\)+\\) +\\([0-9]+\\) +\\(\\(?:\\sw\\|\\s_\\)+\\)"
|
|
|
|
nil t)
|
|
|
|
(let ((label (match-string 1))
|
|
|
|
(length (match-string 2))
|
|
|
|
(hashmethod (match-string 3)))
|
|
|
|
(add-to-list 'result
|
|
|
|
(list label
|
|
|
|
`[(,label
|
|
|
|
face link
|
|
|
|
help-echo ,(concat "Generate passphrase for " label)
|
|
|
|
follow-link t
|
|
|
|
dispass-label ,label
|
|
|
|
dispass-length ,length
|
|
|
|
action dispass-from-button)
|
|
|
|
,length
|
|
|
|
,hashmethod])))))
|
|
|
|
result))
|
|
|
|
|
2012-06-09 21:47:12 +02:00
|
|
|
;;;###autoload
|
2012-06-17 14:44:46 +02:00
|
|
|
(defun dispass-create (label &optional length)
|
2012-06-09 21:47:12 +02:00
|
|
|
"Create a new password for LABEL."
|
2012-07-08 18:29:45 +02:00
|
|
|
(interactive "MLabel: \nP")
|
2012-07-06 00:26:27 +02:00
|
|
|
(let ((length (or length dispass-default-length)))
|
2012-11-18 21:06:12 +01:00
|
|
|
(dispass-start-process label t length)))
|
2012-06-09 21:47:12 +02:00
|
|
|
|
|
|
|
;;;###autoload
|
2012-06-17 14:44:46 +02:00
|
|
|
(defun dispass (label &optional length)
|
2012-06-09 21:47:12 +02:00
|
|
|
"Recreate a password previously used."
|
2012-09-15 16:09:41 +02:00
|
|
|
(interactive (list
|
|
|
|
(completing-read
|
|
|
|
"Label: " (mapcar (lambda (elm) (elt elm 0))
|
|
|
|
(dispass-get-labels)))
|
|
|
|
current-prefix-arg))
|
2012-07-06 00:26:27 +02:00
|
|
|
(let ((length (or length dispass-default-length)))
|
|
|
|
(dispass-start-process label nil length)))
|
2012-06-09 21:47:12 +02:00
|
|
|
|
2012-07-05 01:11:07 +02:00
|
|
|
;; Labels management
|
2012-07-06 00:30:15 +02:00
|
|
|
;;;###autoload
|
|
|
|
(defun dispass-add-label (label length hashtype)
|
2013-01-08 00:35:57 +01:00
|
|
|
"Add LABEL with length LENGTH and hashtype HASHTYPE to DisPass."
|
|
|
|
(interactive
|
|
|
|
(list (read-from-minibuffer "Label: ")
|
|
|
|
(read-from-minibuffer
|
|
|
|
(format "Length (%d): " dispass-default-length) nil nil t nil
|
|
|
|
(number-to-string dispass-default-length))
|
|
|
|
(symbol-name (read-from-minibuffer
|
|
|
|
"Algorithm (dispass1): " nil nil t nil "dispass1"))))
|
|
|
|
(shell-command
|
|
|
|
(format "%s --add %s:%d:%s" dispass-labels-executable label length
|
|
|
|
hashtype)))
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun dispass-remove-label (label)
|
|
|
|
"Remove LABEL from DisPass, if LABEL is not given
|
2012-07-08 18:29:45 +02:00
|
|
|
`tabulated-list-get-id' will be used to get the currently
|
|
|
|
pointed-at label. If neither LABEL is not found an error is
|
|
|
|
thrown."
|
2013-01-08 00:35:57 +01:00
|
|
|
(interactive
|
|
|
|
(list (or (dispass-label-at-point)
|
|
|
|
(completing-read
|
|
|
|
"Label: " (mapcar (lambda (elm) (elt elm 0))
|
|
|
|
(dispass-get-labels))))))
|
|
|
|
|
|
|
|
(shell-command
|
|
|
|
(format "%s --remove %s" dispass-labels-executable label)))
|
2012-07-08 16:05:07 +02:00
|
|
|
|
2012-07-05 01:41:41 +02:00
|
|
|
(defun dispass-from-button (button)
|
|
|
|
"Call dispass with information from BUTTON."
|
|
|
|
(dispass (button-get button 'dispass-label)
|
|
|
|
(button-get button 'dispass-length)))
|
|
|
|
|
2012-07-05 01:11:07 +02:00
|
|
|
(defun dispass-labels--refresh ()
|
|
|
|
"Reload labels from dispass."
|
|
|
|
(setq tabulated-list-entries nil)
|
|
|
|
|
|
|
|
(let ((tmp-list '()))
|
2012-09-15 16:09:41 +02:00
|
|
|
(setq tabulated-list-entries (dispass-get-labels))))
|
2012-07-05 01:11:07 +02:00
|
|
|
|
|
|
|
(define-derived-mode dispass-labels-mode tabulated-list-mode "DisPass"
|
2012-07-05 02:14:58 +02:00
|
|
|
"Major mode for listing dispass labels.
|
|
|
|
|
2012-07-06 00:31:02 +02:00
|
|
|
\\<dispass-labels-mode-map>
|
2012-07-05 02:14:58 +02:00
|
|
|
\\{dispass-labels-mode-map}"
|
2012-07-05 01:11:07 +02:00
|
|
|
(setq tabulated-list-format [("Label" 30 t)
|
|
|
|
("Length" 6 nil)
|
|
|
|
("Hash" 0 t)]
|
|
|
|
tabulated-list-sort-key '("Label" . nil))
|
|
|
|
(add-hook 'tabulated-list-revert-hook 'dispass-labels--refresh)
|
|
|
|
(tabulated-list-init-header))
|
|
|
|
|
2012-07-05 01:45:55 +02:00
|
|
|
;;;###autoload
|
2012-07-05 01:11:07 +02:00
|
|
|
(defun dispass-list-labels ()
|
|
|
|
"Display a list of labels for dispass."
|
|
|
|
(interactive)
|
|
|
|
(let ((buffer (get-buffer-create "*DisPass Labels*")))
|
|
|
|
(with-current-buffer buffer
|
|
|
|
(dispass-labels-mode)
|
|
|
|
(dispass-labels--refresh)
|
|
|
|
(tabulated-list-print))
|
2012-07-05 02:20:39 +02:00
|
|
|
(switch-to-buffer-other-window buffer))
|
2012-07-05 01:11:07 +02:00
|
|
|
nil)
|
|
|
|
|
2012-06-09 21:47:12 +02:00
|
|
|
(provide 'dispass)
|
|
|
|
|
|
|
|
;;; dispass.el ends here
|