diff --git a/site-lisp/org-password-manager.el b/site-lisp/org-password-manager.el new file mode 100644 index 0000000..3ddffa7 --- /dev/null +++ b/site-lisp/org-password-manager.el @@ -0,0 +1,259 @@ +;;; org-password-manager.el --- Password manager for Org Mode. + +;; Copyright (C) 2015 - Leandro Facchinetti + +;; Author: Leandro Facchinetti +;; Version: 0.0.1 +;; Keywords: password +;; URL: https://git.leafac.com/org-password-manager +;; Package-Requires: ((org "8.2.10") (s "1.9.0") (dash "2.13.0")) + +;; This file is not part of GNU Emacs. + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; [ARCHIVED] Org Password Manager + +;; Leandro Facchinetti + +;; Password manager for Org Mode. + +;; Version  0.0.1 +;; -------------------------------------------------------------------- +;; Documentation  https://www.leafac.com/software/org-password-manager +;; -------------------------------------------------------------------- +;; License  GNU General Public License Version 3 +;; -------------------------------------------------------------------- +;; Code of Conduct Contributor Covenant v1.4.0 +;; -------------------------------------------------------------------- +;; Distribution  MELPA +;; -------------------------------------------------------------------- +;; Source  https://git.leafac.com/org-password-manager +;; -------------------------------------------------------------------- +;; Bug Reports  Write emails to org-password-manager@leafac.com. +;; -------------------------------------------------------------------- +;; Contributions  Send patches and pull requests via email to +;; org-password-manager@leafac.com. +;; -------------------------------------------------------------------- + +;; 1. Overview + +;; Use GnuPG to encrypt the Org Mode files that contains credentials +;; instead of storing sensitive information in plain text. + +;; Use Org Mode files to store credentials and retrieve them securely. +;; Integrate with pwgen to generate passwords. + +;; 2. Installation + +;; Available from MELPA, add the repository to Emacs and install with +;; M-x package-install. Password creation requires pwgen. + +;; 3. Usage + +;; This section assumes the default configuration. + +;; Add credentials as properties named USERNAME and PASSWORD to headings in +;; Org Mode files. For example: + +;; * [[http://example.com][My favorite website]] +;;   :PROPERTIES: +;;   :USERNAME: leandro +;;   :PASSWORD: chunky-tempeh +;;   :END: +;;   +;; * SSH key +;;   :PROPERTIES: +;;   :PASSWORD: tofu +;;   :END: + +;; Passwords are cleared from the clipboard after 30 seconds. + +;; Retrieve usernames with C-c C-p u (org-password-manager-get-username) +;; and passwords with C-c C-p p (org-password-manager-get-password). If +;; point is not under a heading that contains credentials, Org Password +;; Manager asks for a heading. To force this behavior even when the point +;; is under a heading that contains credentials, use the C-u argument (for +;; example, C-u C-c C-p u). + +;; Generate passwords with C-c C-p g +;; (org-password-manager-generate-password). To customize the parameters to +;; pwgen, use the C-u argument (C-u C-c C-p g). + +;; 4. Configuration + +;; For the default configuration with the keybindings covered in the Usage +;; section, add the following to the Emacs configuration: + +;; (add-hook 'org-mode-hook 'org-password-manager-key-bindings) + +;; To customize the key bindings, start with the following code: + +;; (defun org-password-manager-key-bindings () +;;   "Binds keys for org-password-manager." +;;   (local-set-key (kbd "C-c C-p u") 'org-password-manager-get-username) +;;   (local-set-key (kbd "C-c C-p p") 'org-password-manager-get-password) +;;   (local-set-key (kbd "C-c C-p +;; g") 'org-password-manager-generate-password)) + +;; For Interactive Do (ido) support, add the following to the Emacs +;; configuration: + +;; (setq org-completion-use-ido t) + +;; For advanced configuration, refer to +;; M-x customize-group org-password-manager. + +;; 5. Changelog + +;; This section documents all notable changes to Org Password Manager. It +;; follows recommendations from Keep a CHANGELOG and uses Semantic +;; Versioning. Each released version is a Git tag. + +;; 5.1. Archived · 2018-02-27 + +;; This project is archived and no longer maintained. + +;; 5.2. 0.0.1 · 2015-07-29 + +;; 5.2.1. Added + +;; * Core functionality. + +;;; Code: + +(require 'org) +(require 's) +(require 'dash) + +(defgroup org-password-manager nil + "Minimal password manager for Emacs Org Mode." + :group 'org) + +(defcustom org-password-manager-default-pwgen-command "pwgen --secure --symbols --capitalize --numerals 25 1" + "The default `pwgen' command to use when generating passwords." + :group 'org-password-manager) + +(defcustom org-password-manager-default-password-wait-time "30 sec" + "The default period to wait before erasing the password from the clipboard. + +Must be compatible with `run-at-time'." + :group 'org-password-manager) + +(defcustom org-password-manager-scope 'agenda + "The scope used to search in org buffers. + +Supported scopes are defined in `org-map-entries'. By default, +the `agenda' scope searches through all agenda files." + :group 'org-password-manager) + +(defvar org-password-manager-history () + "The history of headings that were chosen for `org-password-manager'.") + +(defun org-password-manager-get-property (property-name &optional ask-for-input?) + "Get PROPERTY-NAME. + +If ASK-FOR-INPUT? is t, will ask for input even if point is on a +heading that contains the property." + (let ((display-property-name (capitalize property-name)) + (property (org-entry-get (point) property-name t)) + output-message heading) + (if (and property (not ask-for-input?)) + (setq heading (org-link-display-format (org-get-heading t t))) + (let* ((property-entries + (-filter #'cadr + (org-map-entries + (lambda () + (list + (org-link-display-format (org-get-heading t t)) + (org-entry-get (point) property-name))) + nil + org-password-manager-scope))) + (chosen-heading (funcall 'org-completing-read + (concat display-property-name " for: ") + property-entries + nil + nil + nil + 'org-password-manager-history + (car org-password-manager-history))) + (header-property-list (assoc chosen-heading property-entries))) + (if header-property-list + (setq heading (nth 0 header-property-list) + property (nth 1 header-property-list)) + (setq output-message (concat display-property-name + " for `" + chosen-heading + "' not found!"))))) + (if (and heading property) + (if (string= property-name "PASSWORD") + (progn + (funcall interprogram-cut-function property) + (run-at-time org-password-manager-default-password-wait-time nil (lambda () (funcall interprogram-cut-function ""))) + (setq output-message + (concat display-property-name " for `" heading "' securely copied to system's clipboard avoiding kill ring and will be removed in " org-password-manager-default-password-wait-time "."))) + (progn (kill-new property) + (setq output-message + (concat display-property-name " for `" heading "' copied to clipboard.")))) + (add-to-history 'org-password-manager-history heading)) + (message output-message))) + +;;;###autoload +(defun org-password-manager-get-username (&optional ask-for-input?) + "Get username. + +If ASK-FOR-INPUT? is t, will ask for input even if point is on a +heading that contains the username property." + (interactive "P") + (org-password-manager-get-property "USERNAME" ask-for-input?)) + +;;;###autoload +(defun org-password-manager-get-password (&optional ask-for-input?) + "Get password. + +If ASK-FOR-INPUT? is t, will ask for input even if point is on a +heading that contains the password property." + (interactive "P") + (org-password-manager-get-property "PASSWORD" ask-for-input?)) + +;;;###autoload +(defun org-password-manager-generate-password (&optional edit-pwgen-string?) + "Generate password. + +If EDIT-PWGEN-STRING? is t, let the user edit the pwgen command +line before running it." + (interactive "P") + (let* ((pwgen-string (if edit-pwgen-string? + (read-from-minibuffer "pwgen command to run: " org-password-manager-default-pwgen-command) + org-password-manager-default-pwgen-command)) + (generated-password (s-trim (shell-command-to-string pwgen-string)))) + (insert generated-password) + (funcall interprogram-cut-function generated-password) + (run-at-time org-password-manager-default-password-wait-time nil (lambda () (funcall interprogram-cut-function ""))) + (message (concat "Generated password inserted on buffer, securely copied to system's clipboard avoiding kill ring and will be removed in " org-password-manager-default-password-wait-time ".")))) + +;; Key bindings. + +;;;###autoload +(defun org-password-manager-key-bindings () + "Binds keys for org-password-manager." + (local-set-key (kbd "C-c C-p u") 'org-password-manager-get-username) + (local-set-key (kbd "C-c C-p p") 'org-password-manager-get-password) + (local-set-key (kbd "C-c C-p g") 'org-password-manager-generate-password)) + +(provide 'org-password-manager) + +;;; org-password-manager.el ends here