;;; gnus-nocem.el --- NoCeM pseudo-cancellation treatment
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2004
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2004, 2005
;; Free Software Foundation, Inc.
:group 'gnus-nocem
:type 'integer)
-(defcustom gnus-nocem-verifyer 'mc-verify
+(defcustom gnus-nocem-verifyer (lambda ()
+ (pgg-verify-region (point-min) (point-max)))
"*Function called to verify that the NoCeM message is valid.
-One likely value is `mc-verify'. If the function in this variable
-isn't bound, the message will be used unconditionally."
+One likely value is the function using `pgg-verify-region'.
+If the function in this variable isn't bound, the message will be used
+unconditionally."
:group 'gnus-nocem
- :type '(radio (function-item mc-verify)
+ :type '(radio (function (lambda ()
+ (pgg-verify-region (point-min) (point-max))))
+ (function-item mc-verify)
(function :tag "other")))
(defcustom gnus-nocem-liberal-fetch nil
(defun gnus-fill-real-hashtb ()
"Fill up a hash table with the real-name mappings from the user's active file."
- (setq gnus-nocem-real-group-hashtb (gnus-make-hashtable
- (length gnus-newsrc-alist)))
+ (if (hash-table-p gnus-nocem-real-group-hashtb)
+ (clrhash gnus-nocem-real-group-hashtb)
+ (setq gnus-nocem-real-group-hashtb (make-hash-table :test 'equal)))
(mapcar (lambda (group)
(setq group (gnus-group-real-name (car group)))
- (gnus-sethash group t gnus-nocem-real-group-hashtb))
+ (puthash group t gnus-nocem-real-group-hashtb))
gnus-newsrc-alist))
(defun gnus-nocem-scan-groups ()
;; We get the name of the issuer.
(narrow-to-region b e)
(setq issuer (mail-fetch-field "issuer")
- type (mail-fetch-field "issuer"))
+ type (mail-fetch-field "type"))
(widen)
(if (not (gnus-nocem-message-wanted-p issuer type))
(message "invalid NoCeM issuer: %s" issuer)
(while (setq condition (pop conditions))
(cond
((stringp condition)
- (setq wanted (string-match condition type)))
+ (when (string-match condition type)
+ (setq wanted t)))
((and (consp condition)
(eq (car condition) 'not)
(stringp (cadr condition)))
- (setq wanted (not (string-match (cadr condition) type))))
+ (when (string-match (cadr condition) type)
+ (setq wanted nil)))
(t
(error "Invalid NoCeM condition: %S" condition))))
wanted))))
(defun gnus-nocem-verify-issuer (person)
"Verify using PGP that the canceler is who she says she is."
- (if (fboundp gnus-nocem-verifyer)
+ (if (functionp gnus-nocem-verifyer)
(ignore-errors
(funcall gnus-nocem-verifyer))
;; If we don't have Mailcrypt, then we use the message anyway.
(while (search-forward "\t" nil t)
(cond
((not (ignore-errors
- (setq group (let ((obarray gnus-nocem-real-group-hashtb))
- (read buf)))))
+ (setq group (gnus-group-real-name (symbol-name (read buf))))
+ (gethash group gnus-nocem-real-group-hashtb)))
;; An error.
)
- ((not (symbolp group))
- ;; Ignore invalid entries.
- )
- ((not (boundp group))
- ;; Make sure all entries in the hashtb are bound.
- (set group nil))
(t
- (when (gnus-gethash (gnus-group-real-name (symbol-name group))
- gnus-nocem-real-group-hashtb)
- ;; Valid group.
- (beginning-of-line)
- (while (eq (char-after) ?\t)
- (forward-line -1))
- (setq id (buffer-substring (point) (1- (search-forward "\t"))))
- (unless (gnus-gethash id gnus-nocem-hashtb)
- ;; only store if not already present
- (gnus-sethash id t gnus-nocem-hashtb)
- (push id ncm))
- (forward-line 1)
- (while (eq (char-after) ?\t)
- (forward-line 1))))))
+ ;; Valid group.
+ (beginning-of-line)
+ (while (eq (char-after) ?\t)
+ (forward-line -1))
+ (setq id (buffer-substring (point) (1- (search-forward "\t"))))
+ (unless (if (hash-table-p gnus-nocem-hashtb)
+ (gethash id gnus-nocem-hashtb)
+ (setq gnus-nocem-hashtb (make-hash-table :test 'equal))
+ nil)
+ ;; only store if not already present
+ (puthash id t gnus-nocem-hashtb)
+ (push id ncm))
+ (forward-line 1)
+ (while (eq (char-after) ?\t)
+ (forward-line 1)))))
(when ncm
(setq gnus-nocem-touched-alist t)
(push (cons (let ((time (current-time))) (setcdr (cdr time) nil) time)
(prev pprev)
(expiry (days-to-time gnus-nocem-expiry-wait))
entry)
- (setq gnus-nocem-hashtb (gnus-make-hashtable (* (length alist) 51)))
+ (if (hash-table-p gnus-nocem-hashtb)
+ (clrhash gnus-nocem-hashtb)
+ (setq gnus-nocem-hashtb (make-hash-table :test 'equal)))
(while (setq entry (car alist))
(if (not (time-less-p (time-since (car entry)) expiry))
;; This entry has expired, so we remove it.
;; This is ok, so we enter it into the hashtable.
(setq entry (cdr entry))
(while entry
- (gnus-sethash (car entry) t gnus-nocem-hashtb)
+ (puthash (car entry) t gnus-nocem-hashtb)
(setq entry (cdr entry))))
(setq alist (cdr alist)))))
(defun gnus-nocem-unwanted-article-p (id)
"Say whether article ID in the current group is wanted."
(and gnus-nocem-hashtb
- (gnus-gethash id gnus-nocem-hashtb)))
+ (gethash id gnus-nocem-hashtb)))
(provide 'gnus-nocem)
@item gnus-nocem-verifyer
@vindex gnus-nocem-verifyer
-@findex mc-verify
-\e$B$3$l$O\e(B NoCeM \e$BH/9T<T$,C/$G$"$k$+$H8@$C$F$$$k$+$r>ZL@$9$k4X?t$G$J$/$F$O$J\e(B
-\e$B$j$^$;$s!#=i4|@_Dj$G$O\e(B @code{mc-verify} \e$B$G$"$j!"$3$l$O\e(B Mailcrypt \e$B4X?t$G\e(B
-\e$B$9!#$b$7$3$l$,Hs>o$KCY$/$F!"$"$J$?$,>ZL@7k2L$r5$$K$7$J$$\e(B (\e$B$3$l$O$?$V$s4m\e(B
-\e$B81$G$9\e(B) \e$B$N$G$"$l$P!"$3$NJQ?t$r\e(B @code{nil} \e$B$K$9$k$3$H$,$G$-$^$9!#\e(B
-
-\e$B$b$7=pL>:Q$_$N\e(B NoCeM \e$B%a%C%;!<%8$r>ZL@:Q$_!"L$=pL>$N%a%C%;!<%8$rL$>Z\e(B
-\e$BL@\e(B (\e$B$G$b$=$l$r;H$&\e(B) \e$B$H$7$?$$$N$J$i!"0J2<$N$h$&$K$9$k$3$H$,$G$-$^$9!#\e(B
+@findex pgg-verify-region
+\e$B$3$l$O\e(B NoCeM \e$BH/9T<T$,K\?M$G$"$k$3$H$r8!>Z$9$k4X?t$G$J$/$F$O$J$j$^$;$s!#\e(B
+\e$B=i4|@_Dj$G$O!"0J2<$K<($9\e(B @code{pgg-verify-region} \e$B$r;H$&4X?t$G\e(B
+\e$B$9\e(B (\e$BCp\e(B: Gnus \e$B$G$O\e(B @code{pgg-verify} \e$B$,%G%#%U%)%k%H$G$9\e(B)\e$B!#\e(B
@lisp
-(setq gnus-nocem-verifyer 'my-gnus-mc-verify)
-
-(defun my-gnus-mc-verify ()
- (not (eq 'forged
- (ignore-errors
- (if (mc-verify)
- t
- 'forged)))))
+(lambda ()
+ (pgg-verify-region (point-min) (point-max)))
@end lisp
-\e$B$^$"!"$3$l$O$?$V$s4m81$G$7$g$&$1$I$M!#\e(B
+\e$B$3$l$O8!>Z$K@.8y$7$?$iHs\e(B-@code{nil} \e$B$rJV$7!"$=$&$G$J$1$l$P\e(B (NoCeM \e$B%a%C%;!<\e(B
+\e$B%8$,=pL>$5$l$F$$$J$$>l9g$r4^$_$^$9\e(B) @code{nil} \e$B$rJV$7$^$9!#$b$7$3$l$,Hs\e(B
+\e$B>o$KCY$/$F!"8!>Z7k2L$r5$$K$7$J$$\e(B (\e$B$3$l$O$?$V$s4m81$G$9\e(B) \e$B$N$G$"$l$P!"$3$N\e(B
+\e$BJQ?t$r\e(B @code{nil} \e$B$K$9$k$3$H$,$G$-$^$9!#\e(B
+
+\e$B0JA0!"%G%U%)%k%H$O\e(B Mailcrypt \e$B$N4X?t$G$"$k\e(B @code{mc-verify} \e$B$G$7$?!#$^$@\e(B
+\e$B$=$l$r;H$&$3$H$,$G$-$^$9$,!"\e(BPGP \e$B$N8x3+80$r\e(B GnuPG \e$B$N80B+$K2C$($k$3$H$r1^\e(B
+\e$B$o$J$1$l$P!"\e(BGnuPG \e$B$H$H$b$KF0:n$9$k%G%#%U%)%k%H$N4X?t$KJQ$($k$3$H$,$G$-$^\e(B
+\e$B$9!#\e(B
@item gnus-nocem-directory
@vindex gnus-nocem-directory
@item gnus-nocem-verifyer
@vindex gnus-nocem-verifyer
-@findex mc-verify
+@findex pgg-verify-region
This should be a function for verifying that the NoCeM issuer is who she
-says she is. The default is @code{mc-verify}, which is a Mailcrypt
-function. If this is too slow and you don't care for verification
-(which may be dangerous), you can set this variable to @code{nil}.
-
-If you want signed NoCeM messages to be verified and unsigned messages
-not to be verified (but used anyway), you could do something like:
+says she is. The default is the function using @code{pgg-verify-region}
+shown below:
@lisp
-(setq gnus-nocem-verifyer 'my-gnus-mc-verify)
-
-(defun my-gnus-mc-verify ()
- (not (eq 'forged
- (ignore-errors
- (if (mc-verify)
- t
- 'forged)))))
+(lambda ()
+ (pgg-verify-region (point-min) (point-max)))
@end lisp
-This might be dangerous, though.
+It returns non-@code{nil} if the verification is successful, otherwise
+(including the case the NoCeM message was not signed) returns
+@code{nil}. If this is too slow and you don't care for verification
+(which may be dangerous), you can set this variable to @code{nil}.
+
+Formerly the default was @code{mc-verify}, which is a Mailcrypt
+function. While you can still use it, you can change it into the
+default function running with GnuPG if you are willing to add the
+@acronym{PGP} public keys to GnuPG's keyring.
@item gnus-nocem-directory
@vindex gnus-nocem-directory