[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/autocrypt c1ce4d7446 53/94: Use eql specializers instea
From: |
ELPA Syncer |
Subject: |
[elpa] externals/autocrypt c1ce4d7446 53/94: Use eql specializers instead of derived-mode specializers |
Date: |
Sun, 26 Mar 2023 07:58:00 -0400 (EDT) |
branch: externals/autocrypt
commit c1ce4d74468ddf05c6fb893908a0858e7f98afbf
Author: Philip K <philipk@posteo.net>
Commit: Philip K <philipk@posteo.net>
Use eql specializers instead of derived-mode specializers
---
autocrypt-gnus.el | 10 +----
autocrypt-message.el | 21 +++------
autocrypt-mu4e.el | 35 ++-------------
autocrypt-rmail.el | 9 +---
autocrypt.el | 124 +++++++++++++++++++++++++++++++++++++--------------
5 files changed, 102 insertions(+), 97 deletions(-)
diff --git a/autocrypt-gnus.el b/autocrypt-gnus.el
index 149a113828..b0e16a2e11 100644
--- a/autocrypt-gnus.el
+++ b/autocrypt-gnus.el
@@ -24,17 +24,11 @@
(require 'gnus)
-;;;###autoload
-(cl-defmethod autocrypt-load-system ((_mode (derived-mode gnus-mode)))
- "Load this module."
- (require 'autocrypt-gnus))
-
-(cl-defmethod autocrypt-mode-hooks ((_mode (derived-mode gnus-mode)))
+(cl-defmethod autocrypt-mode-hooks ((_mode (eql gnus)))
"Return the hook to install autocrypt."
'(gnus-article-prepare-hook))
-(cl-defmethod autocrypt-get-header ((_mode (derived-mode gnus-mode))
- header)
+(cl-defmethod autocrypt-get-header ((_mode (eql gnus)) header)
"Return the value for HEADER."
(gnus-fetch-original-field header))
diff --git a/autocrypt-message.el b/autocrypt-message.el
index 65445e4737..9bf49e415a 100644
--- a/autocrypt-message.el
+++ b/autocrypt-message.el
@@ -24,14 +24,8 @@
(require 'message)
-;;;###autoload
-(cl-defmethod autocrypt-load-system ((_mode (derived-mode message-mode)))
- "Load this module."
- (require 'autocrypt-message))
-
-(cl-defmethod autocrypt-install ((_mode (derived-mode message-mode)))
+(cl-defmethod autocrypt-install ((_mode (eql message)))
"Install autocrypt hooks for message mode."
- (require 'autocrypt-message)
(add-hook 'message-setup-hook #'autocrypt-compose-setup)
(add-hook 'message-send-hook #'autocrypt-compose-pre-send)
(unless (lookup-key message-mode-map (kbd "C-c RET C-a"))
@@ -45,22 +39,19 @@
#'autocrypt-compose-setup)
(define-key message-mode-map (kbd "C-c RET C-a") nil)))
-(cl-defmethod autocrypt-get-header ((_ (derived-mode message-mode))
- header)
+(cl-defmethod autocrypt-get-header ((_ (eql message)) header)
"Return the value for HEADER."
(message-fetch-field header))
-(cl-defmethod autocrypt-add-header ((_mode (derived-mode message-mode))
- header value)
+(cl-defmethod autocrypt-add-header ((_mode (eql message)) header value)
"Insert HEADER with VALUE into the message head."
(message-add-header (concat header ": " value)))
-(cl-defmethod autocrypt-sign-encrypt ((_mode (derived-mode message-mode)))
+(cl-defmethod autocrypt-sign-encrypt ((_mode (eql message)))
"Sign and encrypt message."
(mml-secure-message-sign-encrypt "pgpmime"))
-(cl-defmethod autocrypt-sign-secure-attach ((_mode (derived-mode message-mode))
- payload)
+(cl-defmethod autocrypt-sign-secure-attach ((_mode (eql message)) payload)
"Attach and encrypt buffer PAYLOAD."
(mml-attach-buffer payload)
(mml-secure-part "pgpmime")
@@ -68,7 +59,7 @@
(lambda () (kill-buffer payload))
nil t))
-(cl-defmethod autocrypt-encrypted-p ((_mode (derived-mode message-mode)))
+(cl-defmethod autocrypt-encrypted-p ((_mode (eql message)))
"Check if the current message is encrypted."
(mml-secure-is-encrypted-p))
diff --git a/autocrypt-mu4e.el b/autocrypt-mu4e.el
index 71141debdb..0f03e2f811 100644
--- a/autocrypt-mu4e.el
+++ b/autocrypt-mu4e.el
@@ -24,52 +24,23 @@
(declare-function mu4e-view-raw-message "mu4e" () )
-;;; XXX: mu4e seems to share no common mode, and the `derived-mode'
-;;; specializer supports only one mode (currently). Therefore
-;;; the method definitions have to be duplicated.
-
-;;;###autoload
-(cl-defmethod autocrypt-load-system ((_mode (derived-mode mu4e-main-mode)))
- "Load this module."
- (require 'autocrypt-mu4e))
-
-(cl-defmethod autocrypt-install ((_mode (derived-mode mu4e-main-mode)))
+(cl-defmethod autocrypt-install ((_mode (eql mu4e)))
"Install autocrypt hooks for mu4e."
- (require 'autocrypt-mu4e)
(add-hook 'mu4e-view-mode-hook #'autocrypt-process-header)
(add-hook 'mu4e-compose-mode-hook #'autocrypt-compose-setup))
-(cl-defmethod autocrypt-uninstall ((_mode (derived-mode mu4e-main-mode)))
+(cl-defmethod autocrypt-uninstall ((_mode (eql mu4e)))
"Remove autocrypt hooks for mu4e."
(remove-hook 'mu4e-view-mode-hook #'autocrypt-process-header)
(remove-hook 'mu4e-compose-mode-hook #'autocrypt-compose-setup))
-(cl-defmethod autocrypt-get-header ((_mode (derived-mode mu4e-main-mode))
- header)
+(cl-defmethod autocrypt-get-header ((_mode (eql mu4e)) header)
"Ask mu4e to return HEADER."
(save-window-excursion
(with-current-buffer (mu4e-view-raw-message)
(prog1 (mail-fetch-field header)
(kill-buffer (current-buffer))))))
-;;;###autoload
-(cl-defmethod autocrypt-load-system ((_mode (derived-mode mu4e-view-mode)))
- "Load this module."
- (require 'autocrypt-mu4e))
-
-(cl-defmethod autocrypt-install ((_mode (derived-mode mu4e-view-mode)))
- "Install autocrypt hooks for mu4e."
- (autocrypt-install 'mu4e-main-mode))
-
-(cl-defmethod autocrypt-uninstall ((_mode (derived-mode mu4e-view-mode)))
- "Remove autocrypt hooks for mu4e."
- (autocrypt-uninstall 'mu4e-main-mode))
-
-(cl-defmethod autocrypt-get-header ((_mode (derived-mode mu4e-view-mode))
- header)
- "Ask mu4e to return HEADER."
- (autocrypt-get-header 'mu4e-main-mode header))
-
(provide 'autocrypt-mu4e)
;;; autocrypt-mu4e.el ends here
diff --git a/autocrypt-rmail.el b/autocrypt-rmail.el
index 01b22744e6..6c18fd2238 100644
--- a/autocrypt-rmail.el
+++ b/autocrypt-rmail.el
@@ -27,18 +27,11 @@
;;; NOTE: rmail does not use derived modes, so these methods match the
;;; exact mode.
-;;;###autoload
-(cl-defmethod autocrypt-load-system ((_mode (eql rmail-mode)))
- "Load this module."
- (require 'autocrypt-rmail))
-
(cl-defmethod autocrypt-mode-hooks ((_mode (eql rmail-mode)))
"Return the hook to install autocrypt."
- (require 'autocrypt-mu4e)
'(rmail-show-message-hook))
-(cl-defmethod autocrypt-get-header ((_mode (eql rmail-mode))
- header)
+(cl-defmethod autocrypt-get-header ((_mode (eql rmail-mode)) header)
"Ask Rmail to return HEADER."
(rmail-apply-in-message rmail-current-message
(lambda () (mail-fetch-field header))))
diff --git a/autocrypt.el b/autocrypt.el
index 3fe5d353db..69bb20c10b 100644
--- a/autocrypt.el
+++ b/autocrypt.el
@@ -27,7 +27,7 @@
(require 'cl-lib)
(require 'cl-generic)
-(require 'rx)
+(eval-when-compile (require 'rx))
(require 'epg)
(require 'ietf-drums)
@@ -72,6 +72,18 @@ process \"Autocrypt-Gossip\" headers when received."
;;; INTERNAL STATE
+(defvar autocrypt-backends
+ '(((mu4e-main-mode mu4e-view-mode) mu4e autocrypt-mu4e)
+ ((gnus-mode) gnus autocrypt-gnus)
+ ((rmail-mode) rmail autocrypt-rmail)
+ ((message-mode) message autocrypt-message))
+ "Alist of supported backends.
+Each entry consists of a list of major modes, the method
+specializer and optionally the feature that has to be loaded.")
+
+(defvar-local autocrypt-current-backend nil
+ "Currently active backend.")
+
(defvar autocrypt-accounts nil
"Alist of supported Autocrypt accounts.
@@ -100,10 +112,6 @@ Every member of this list has to be an instance of the
;;; MUA TRANSLATION LAYER
-(cl-defgeneric autocrypt-load-system (mode)
- "Load autocrypt methods for MODE."
- (ignore mode))
-
(cl-defgeneric autocrypt-mode-hooks (mode)
"Return a list of hooks for MODE that process headers.")
@@ -112,38 +120,83 @@ Every member of this list has to be an instance of the
(dolist (hook (autocrypt-mode-hooks mode))
(add-hook hook #'autocrypt-process-header)))
+(defun autocrypt--install ()
+ "Install necessary autocrypt functions into the MUA."
+ (cl-assert autocrypt-current-backend)
+ (autocrypt-install autocrypt-current-backend))
+
(cl-defgeneric autocrypt-uninstall (mode)
"Undo `autocrypt-install' for MODE."
(dolist (hook (autocrypt-mode-hooks mode))
(remove-hook hook #'autocrypt-process-header)))
+(defun autocrypt--uninstall ()
+ "Remove all modifications by autocrypt."
+ (cl-assert autocrypt-current-backend)
+ (autocrypt-install autocrypt-current-backend))
+
(cl-defgeneric autocrypt-get-header (_mode _header)
"Return the value of HEADER.")
+(defun autocrypt--get-header (header)
+ "Return the value of HEADER."
+ (cl-assert autocrypt-current-backend)
+ (autocrypt-get-header autocrypt-current-backend header))
+
(cl-defgeneric autocrypt-add-header (_mode _header _value)
"Insert HEADER with VALUE into message."
'n/a)
+(defun autocrypt--add-header (header value)
+ "Insert HEADER with VALUE into message."
+ (cl-assert autocrypt-current-backend)
+ (autocrypt-add-header autocrypt-current-backend header value))
+
(cl-defgeneric autocrypt-remove-header (_mode _header)
"Remove HEADER from message."
'n/a)
+(defun autocrypt--remove-header (header)
+ "Remove HEADER from message."
+ (cl-assert autocrypt-current-backend)
+ (autocrypt-remove-header autocrypt-current-backend header))
+
(cl-defgeneric autocrypt-sign-encrypt (_mode)
"Sign and encrypt this message."
'n/a)
+(defun autocrypt--sign-encrypt ()
+ "Sign and encrypt this message."
+ (cl-assert autocrypt-current-backend)
+ (autocrypt-sign-encrypt autocrypt-current-backend))
+
(cl-defgeneric autocrypt-secure-attach (_mode _payload)
"Add PAYLOAD as an encrypted attachment."
'n/a)
+(defun autocrypt--secure-attach (payload)
+ "Add PAYLOAD as an encrypted attachment."
+ (cl-assert autocrypt-current-backend)
+ (autocrypt--secure-attach autocrypt-current-backend payload))
+
(cl-defgeneric autocrypt-encrypted-p (_mode)
"Check the the current message is encrypted."
'n/a)
-(cl-defgeneric autocrypt-get-part (_mode _nr)
+(defun autocrypt--encrypted-p ()
"Check the the current message is encrypted."
+ (cl-assert autocrypt-current-backend)
+ (autocrypt-encrypted-p autocrypt-current-backend))
+
+(cl-defgeneric autocrypt-get-part (_mode _nr)
+ "Return the NR'th part of the current message."
'n/a)
+(defun autocrypt--get-part (nr)
+ "Return the NR'th part of the current message."
+ (cl-assert autocrypt-current-backend)
+ (autocrypt-get-part autocrypt-current-backend nr))
+
;;; INTERNAL FUNCTIONS
@@ -247,7 +300,7 @@ well-formed, otherwise returns just nil."
"Return a list of all recipients to this message."
(let (recipients)
(dolist (header '("To" "Cc" "Reply-To"))
- (let* ((f (autocrypt-get-header major-mode header))
+ (let* ((f (autocrypt--get-header header))
(r (and f (mail-extract-address-components f t))))
(setq recipients (nconc (mapcar #'cadr r) recipients))))
(delete-dups recipients)))
@@ -258,7 +311,7 @@ well-formed, otherwise returns just nil."
Argument DATE contains the time value of the \"From\" tag."
(let ((recip (autocrypt-list-recipients))
- (root (autocrypt-get-part major-mode 0))
+ (root (autocrypt--get-part 0))
(re (rx bol "Autocrypt-Gossip:" (* space)
(group (+ (or nonl (: "\n "))))
eol))
@@ -304,9 +357,9 @@ Argument DATE contains the time value of the \"From\" tag."
;; https://autocrypt.org/level1.html#updating-autocrypt-peer-state
(defun autocrypt-process-header ()
"Update internal autocrypt state."
- (let* ((from (autocrypt-canonicalise (autocrypt-get-header major-mode
"From")))
- (date (ietf-drums-parse-date (autocrypt-get-header major-mode
"Date")))
- (header (autocrypt-get-header major-mode "Autocrypt"))
+ (let* ((from (autocrypt-canonicalise (autocrypt--get-header "From")))
+ (date (ietf-drums-parse-date (autocrypt--get-header "Date")))
+ (header (autocrypt--get-header "Autocrypt"))
parse addr preference keydata peer)
(when header
(when (setq parse (autocrypt-parse-header header))
@@ -393,7 +446,7 @@ preference (\"prefer-encrypt\")."
Argument RECIPIENTS is a list of addresses this message is
addressed to."
(and autocrypt-do-gossip
- (autocrypt-encrypted-p major-mode)
+ (autocrypt--encrypted-p)
(< 1 (length recipients))
(cl-every
(lambda (rec)
@@ -405,39 +458,39 @@ addressed to."
"Check if Autocrypt is possible, and add pseudo headers."
(interactive)
(let ((recs (autocrypt-list-recipients))
- (from (autocrypt-canonicalise (autocrypt-get-header major-mode
"From"))))
+ (from (autocrypt-canonicalise (autocrypt--get-header "From"))))
;; encrypt message if applicable
(save-excursion
(cl-case (autocrypt-recommendation from recs)
(encrypt
- (autocrypt-sign-encrypt major-mode))
+ (autocrypt--sign-encrypt))
(available
- (autocrypt-add-header major-mode "Do-Autocrypt" "no"))
+ (autocrypt--add-header "Do-Autocrypt" "no"))
(discourage
- (autocrypt-add-header major-mode "Do-Discouraged-Autocrypt" "no"))))))
+ (autocrypt--add-header "Do-Discouraged-Autocrypt" "no"))))))
(defun autocrypt-compose-pre-send ()
"Insert Autocrypt headers before sending a message.
Will handle and remove \"Do-(Discourage-)Autocrypt\" if found."
(let* ((recs (autocrypt-list-recipients))
- (from (autocrypt-canonicalise (autocrypt-get-header major-mode
"From"))))
+ (from (autocrypt-canonicalise (autocrypt--get-header "From"))))
;; encrypt message if applicable
(when (eq (autocrypt-recommendation from recs) 'encrypt)
- (autocrypt-sign-encrypt major-mode))
+ (autocrypt--sign-encrypt))
;; check for manual autocrypt confirmations
- (let ((do-autocrypt (autocrypt-get-header major-mode "Do-Autocrypt"))
- (ddo-autocrypt (autocrypt-get-header major-mode
"Do-Discouraged-Autocrypt"))
+ (let ((do-autocrypt (autocrypt--get-header "Do-Autocrypt"))
+ (ddo-autocrypt (autocrypt--get-header "Do-Discouraged-Autocrypt"))
(query "Are you sure you want to use Autocrypt, even though it is
discouraged?"))
- (when (and (not (autocrypt-encrypted-p major-mode))
+ (when (and (not (autocrypt--encrypted-p))
(or (and do-autocrypt
(string= (downcase do-autocrypt) "yes"))
(and ddo-autocrypt
(string= (downcase ddo-autocrypt) "yes")
(yes-or-no-p query))))
- (autocrypt-sign-encrypt major-mode)))
- (autocrypt-remove-header major-mode "Do-Autocrypt")
- (autocrypt-remove-header major-mode "Do-Discouraged-Autocrypt")
+ (autocrypt--sign-encrypt)))
+ (autocrypt--remove-header "Do-Autocrypt")
+ (autocrypt--remove-header "Do-Discouraged-Autocrypt")
;; insert gossip data
(when (autocrypt-gossip-p recs)
(let ((payload (generate-new-buffer " *autocrypt gossip*")))
@@ -445,11 +498,11 @@ Will handle and remove \"Do-(Discourage-)Autocrypt\" if
found."
(dolist (addr (autocrypt-list-recipients))
(let ((header (autocrypt-generate-header addr t)))
(insert "Autocrypt-Gossip: " header "\n"))))
- (autocrypt-secure-attach major-mode payload)))
+ (autocrypt--secure-attach payload)))
;; insert autocrypt header
(let ((header (and from (autocrypt-generate-header from))))
(when header
- (autocrypt-add-header major-mode "Autocrypt" header)))))
+ (autocrypt--add-header "Autocrypt" header)))))
;;;###autoload
(defun autocrypt-create-account ()
@@ -494,18 +547,21 @@ Will handle and remove \"Do-(Discourage-)Autocrypt\" if
found."
;;;###autoload
(define-minor-mode autocrypt-mode
- "Enable Autocrypt support in current buffer.
-
-Behaviour shall adapt to current major mode. Should be added to
-the startup hook of your preferred MUA or mail-related major
-mode."
+ "Enable Autocrypt support in current buffer."
:group 'autocrypt
(if autocrypt-mode
(progn
(autocrypt-load-data)
- (autocrypt-load-system major-mode)
- (autocrypt-install major-mode))
- (autocrypt-uninstall major-mode)))
+ (catch 'found
+ (dolist (backend autocrypt-backends)
+ (when (apply #'derived-mode-p (car backend))
+ (setq autocrypt-current-backend (cadr backend))
+ (when (caddr backend)
+ (require (caddr backend)))
+ (throw 'found nil)))
+ (error "No autocrypt backend found"))
+ (autocrypt--install))
+ (autocrypt--uninstall)))
(provide 'autocrypt)
- [elpa] externals/autocrypt 599d5f3f5d 78/94: Further improve robustness of autocrypt-process-header, (continued)
- [elpa] externals/autocrypt 599d5f3f5d 78/94: Further improve robustness of autocrypt-process-header, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt 5fae83ac05 80/94: Inline autocrypt-find-function, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt dd400cbbdf 82/94: Prefer mu4e-view-rendered-hook if bound, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt 70f36f6e47 84/94: Run M-x repunctuate-sentences on README, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt d8e34fc3eb 88/94: Fold 'defalias' definitions for the MUA generic functions, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt 0e237a29c4 30/94: Save autocrypt accounts in autocrypt file, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt cc694e541b 35/94: Let autocrypt-mode-hooks return nil by default, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt 7cd50d277d 39/94: Remove default implementation for autocrypt-mode-hooks, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt 73764377c5 43/94: Fix autocrypt-message, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt 82b9a9eaa2 44/94: Fix autocrypt-mu4e, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt c1ce4d7446 53/94: Use eql specializers instead of derived-mode specializers,
ELPA Syncer <=
- [elpa] externals/autocrypt 5c7f4cfabf 58/94: Update headers, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt 75a0b62adb 64/94: Rename autocrypt-message--encrypted-p, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt 1444f1861f 83/94: Remember to remove hook as modified in dd400cb, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt cf63019b3f 89/94: Add a 'get-part' implementation for Gnus, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt a90aa6b644 94/94: Bump version to 0.4.1 for GNU ELPA, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt a3e77512f1 04/94: added .dir-locals.el, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt 6071d0a971 11/94: added missing require statements, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt cb40022cba 23/94: refactored message specific code into autocrypt-compose-* functions, ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt d771406544 28/94: Recognize mu4e modes in `autocrypt-get-mua', ELPA Syncer, 2023/03/26
- [elpa] externals/autocrypt 926b88e371 33/94: Use setup in README instead of use-package, ELPA Syncer, 2023/03/26