From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Jones Subject: [ANN] org-crypt Version 0.3 Date: Mon, 18 May 2009 10:40:47 -0600 Message-ID: <867i0euzxs.fsf@pmade.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1M65tn-0005I4-8T for emacs-orgmode@gnu.org; Mon, 18 May 2009 12:41:11 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1M65ti-0005Fk-F9 for emacs-orgmode@gnu.org; Mon, 18 May 2009 12:41:10 -0400 Received: from [199.232.76.173] (port=55877 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1M65ti-0005Fg-8J for emacs-orgmode@gnu.org; Mon, 18 May 2009 12:41:06 -0400 Received: from main.gmane.org ([80.91.229.2]:37728 helo=ciao.gmane.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1M65th-0007Wy-CO for emacs-orgmode@gnu.org; Mon, 18 May 2009 12:41:05 -0400 Received: from list by ciao.gmane.org with local (Exim 4.43) id 1M65tc-0007C1-NG for emacs-orgmode@gnu.org; Mon, 18 May 2009 16:41:00 +0000 Received: from 75-166-96-162.hlrn.qwest.net ([75.166.96.162]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 18 May 2009 16:41:00 +0000 Received: from mlists by 75-166-96-162.hlrn.qwest.net with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 18 May 2009 16:41:00 +0000 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org --=-=-= Sorry for the delays in getting this posted, I've been doing a lot of traveling lately. The attached version of org-crypt fixes a few bugs and is just about ready to be included in org proper. The only thing it might need before inclusion in org is automatic encryption via hooks. I'd like to find out how people feel about that. Should org-crypt attach itself to org-mode-hook so that it can decrypt encrypted entries after you open an org file? At first I thought yes, but now I'm leaning towards no, you should decrypt entries manually as needed. I do think that org-crypt should hook itself into before-save-hook so that all entries that *should* be encrypted are encrypted before the file touches the disk. A user of org-crypt shouldn't have to worry about setting up a hook, it should just happen automatically. Any suggestions on the best way to make that happen in org-crypt? --=-=-= Content-Type: application/emacs-lisp Content-Disposition: attachment; filename=org-crypt.el ;;; org-crypt.el --- Public key encryption for org-mode entries ;; Copyright (C) 2009 Peter Jones ;; Copyright (C) 2007 John Wiegley ;; Emacs Lisp Archive Entry ;; Filename: org-crypt.el ;; Version: 0.3 ;; Keywords: org-mode ;; Author: John Wiegley ;; Maintainer: Peter Jones ;; Description: Adds public key encryption to org-mode buffers ;; URL: http://www.newartisans.com/software/emacs.html ;; Compatibility: Emacs22 ;; This file is not part of GNU Emacs. ;; This 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 2, or (at your option) any later ;; version. ;; ;; This 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 GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, ;; MA 02111-1307, USA. ;;; Commentary: ;; Right now this is just a set of functions to play with. It depends ;; on the epg library. Here's how you would use it: ;; ;; 1. To mark an entry for encryption, tag the heading with "crypt". ;; You can change the tag to any complex tag matching string by ;; setting the `org-crypt-tag-matcher' variable. ;; ;; 2. Set the encryption key to use in the `org-crypt-key' variable, ;; or use `M-x org-set-property' to set the property CRYPTKEY to ;; any address in your public keyring. The text of the entry (but ;; not its properties or headline) will be encrypted for this user. ;; For them to read it, the corresponding secret key must be ;; located in the secret key ring of the account where you try to ;; decrypt it. This makes it possible to leave secure notes that ;; only the intended recipient can read in a shared-org-mode-files ;; scenario. ;; ;; 3. Next, at the top of your org-mode buffer, add this line: ;; ;; -*- mode: org; before-save-hook: (org-encrypt-entries) -*- ;; ;; This ensures that entries marked for encryption are encrypted ;; whenever the file is saved. If you want encryption to be ;; manual, use `org-encrypt-entries' or `org-encrypt-entry'. ;; ;; 4. To later decrypt an entry, use `org-decrypt-entries' or ;; `org-decrypt-entry'. It might be useful to bind this to a key, ;; like C-c C-/. I hope that in the future, C-c C-r can be might ;; overloaded to also decrypt an entry if it's encrypted, since ;; that fits nicely with the meaning of "reveal". ;; ;; TODO: ;; - Automatically hook into `before-save-hook' if so configured ;; - Allow symmetric encryption as well (require 'epg) (defgroup org-crypt nil "Org Crypt" :tag "Org Crypt" :group 'org) (defcustom org-crypt-tag-matcher "crypt" "The tag matcher used to find headings whose contents should be encrypted. See the \"Match syntax\" section of the org manual for more details." :type 'string :group 'org-crypt) (defcustom org-crypt-key nil "The default key to use when encrypting the contents of a heading. This can also be overridden in the CRYPTKEY property." :type 'string :group 'org-crypt) (defun org-crypt-key-for-heading () "Returns the encryption key for the current heading." (save-excursion (org-back-to-heading t) (or (org-entry-get nil "CRYPTKEY" 'selective) org-crypt-key (and (boundp 'epa-file-encrypt-to) epa-file-encrypt-to) (error "no crypt key set")))) (defun org-encrypt-entry () "Encrypt the content of the current headline." (interactive) (save-excursion (org-back-to-heading t) (forward-line) (let ((folded (org-invisible-p)) (epg-context (epg-make-context nil t t)) (crypt-key (org-crypt-key-for-heading)) (beg (point)) end encrypted-text) (when (and (not (looking-at "-----BEGIN PGP MESSAGE-----")) (progn (org-end-of-subtree t t) (org-back-over-empty-lines) t)) (setq end (point) encrypted-text (epg-encrypt-string epg-context (buffer-substring-no-properties beg end) (epg-list-keys epg-context crypt-key))) (delete-region beg end) (insert encrypted-text) (when folded (save-excursion (org-back-to-heading t) (hide-subtree))) nil)))) (defun org-decrypt-entry () (interactive) (save-excursion (org-back-to-heading t) (forward-line) (when (looking-at "-----BEGIN PGP MESSAGE-----") (let* ((beg (point)) (end (save-excursion (search-forward "-----END PGP MESSAGE-----") (forward-line) (point))) (epg-context (epg-make-context nil t t)) (decrypted-text (epg-decrypt-string epg-context (buffer-substring-no-properties beg end)))) (delete-region beg end) (insert decrypted-text) nil)))) (defun org-encrypt-entries () (interactive) (org-scan-tags 'org-encrypt-entry (cdr (org-make-tags-matcher org-crypt-tag-matcher)))) (defun org-decrypt-entries () (interactive) (org-scan-tags 'org-decrypt-entry (cdr (org-make-tags-matcher org-crypt-tag-matcher)))) (provide 'org-crypt) ;;; org-crypt.el ends here --=-=-= -- Peter Jones, http://pmade.com pmade inc. Louisville, CO US --=-=-= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Emacs-orgmode mailing list Remember: use `Reply All' to send replies to the list. Emacs-orgmode@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-orgmode --=-=-=--