X-Git-Url: http://cgit.sxemacs.org/?p=riece;a=blobdiff_plain;f=lisp%2Friece-epg.el;h=f9ea17b11b547f5113740860e0e1531016c1c498;hp=542bcd2c629f13199d53ed827403687f1b1366df;hb=6f1709bbfcbb14b8486cc5423295f14b8c723bd8;hpb=419476bd3456c9ed74f1fb01c12c565737365173 diff --git a/lisp/riece-epg.el b/lisp/riece-epg.el index 542bcd2..f9ea17b 100644 --- a/lisp/riece-epg.el +++ b/lisp/riece-epg.el @@ -1,3 +1,28 @@ +;;; riece-epg.el --- Encrypt/decrypt messages add-on +;; Copyright (C) 2006 Daiki Ueno + +;; Author: Daiki Ueno +;; Keywords: IRC, riece + +;; This file is part of Riece. + +;; 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 2, 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 GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Code: + (require 'riece-message) (require 'riece-identity) @@ -34,6 +59,16 @@ passphrase))) (epg-passphrase-callback-function key-id nil))) +(defun riece-epg-funcall-clear-passphrase (identity function &rest args) + (condition-case error + (apply function args) + (error + (let ((entry (riece-identity-assoc identity riece-epg-passphrase-alist))) + (if entry + (setq riece-epg-passphrase-alist + (delq entry riece-epg-passphrase-alist)))) + (signal (car error) (cdr error))))) + (defun riece-command-enter-encrypted-message () "Encrypt the current line send send it to the current channel." (interactive) @@ -50,22 +85,40 @@ context (cons #'riece-epg-passphrase-callback-function riece-current-channel)) - (condition-case error - (setq string (epg-encrypt-string context string nil)) - (error - (if (setq entry (riece-identity-assoc riece-current-channel - riece-epg-passphrase-alist)) - (setcdr entry nil)) - (signal (car error) (cdr error)))) + (setq string (riece-epg-funcall-clear-passphrase riece-current-channel + #'epg-encrypt-string + context string nil)) (riece-command-send-message - (concat "[OpenPGP Encrypted:" (base64-encode-string string t) "]") + (concat "[encrypted:" (base64-encode-string string t) "]") nil) (let ((next-line-add-newlines t)) (next-line 1)))) +(defun riece-command-change-passphrase (identity passphrase) + "Change PASSPHRASE associated with IDENTITY." + (interactive + (let ((identity + (riece-completing-read-identity + "Channel/user: " + riece-current-channels nil t nil nil + (riece-format-identity riece-current-channel)))) + (list identity + (read-passwd (format "Passphrase for %s: " + (riece-format-identity identity)))))) + (let ((entry (riece-identity-assoc identity riece-epg-passphrase-alist))) + (if (equal passphrase "") + (if entry + (setq riece-epg-passphrase-alist + (delq entry riece-epg-passphrase-alist))) + (if entry + (setcdr entry passphrase) + (setq riece-epg-passphrase-alist + (cons (cons identity passphrase) + riece-epg-passphrase-alist)))))) + (defun riece-epg-message-filter (message) (if (get 'riece-epg 'riece-addon-enabled) - (when (string-match "\\`\\[OpenPGP Encrypted:\\(.*\\)]" + (when (string-match "\\`\\[encrypted:\\(.*\\)]" (riece-message-text message)) (let ((context (epg-make-context)) (string (match-string 1 (riece-message-text message))) @@ -78,22 +131,23 @@ (cons #'riece-epg-passphrase-callback-function (riece-message-target message))) (condition-case error - (riece-message-set-text - message - (concat - "[OpenPGP Decrypted:" - (decode-coding-string - (epg-decrypt-string context (base64-decode-string string)) - (if (consp coding-system) - (car coding-system) - coding-system)) - "]")) - (error - (if (setq entry (riece-identity-assoc - (riece-message-target message) - riece-epg-passphrase-alist)) - (setcdr entry nil)) - (message "%s" (cdr error))))))) + (progn + (setq string (base64-decode-string string)) + (riece-message-set-text + message + (concat + "[decrypted:" + (riece-with-server-buffer + (riece-identity-server (riece-message-target message)) + (decode-coding-string + (riece-epg-funcall-clear-passphrase + (riece-message-target message) + #'epg-decrypt-string context string) + (if (consp coding-system) + (car coding-system) + coding-system))) + "]"))) + (error (message "%s" (cdr error))))))) message) (defun riece-epg-insinuate () @@ -105,11 +159,15 @@ (defvar riece-command-mode-map) (defun riece-epg-enable () (define-key riece-command-mode-map - "\C-ce" 'riece-command-enter-encrypted-message)) + "\C-ce" 'riece-command-enter-encrypted-message) + (define-key riece-command-mode-map + "\C-c\C-ec" 'riece-command-change-passphrase)) (defun riece-epg-disable () (define-key riece-command-mode-map - "\C-ce" nil)) + "\C-ce" nil) + (define-key riece-command-mode-map + "\C-c\C-ec" nil)) (provide 'riece-epg)