;;; Code:
-(require 'gnus-load)
+(require 'gnus)
(require 'nnmail)
(require 'gnus-art)
(require 'gnus-range)
-(defvar gnus-nocem-groups
+(defgroup gnus-nocem nil
+ "NoCeM pseudo-cancellation treatment"
+ :group 'gnus-score)
+
+(defcustom gnus-nocem-groups
'("alt.nocem.misc" "news.admin.net-abuse.announce")
- "*List of groups that will be searched for NoCeM messages.")
+ "List of groups that will be searched for NoCeM messages."
+ :group 'gnus-nocem
+ :type '(repeat (string :tag "Group")))
-(defvar gnus-nocem-issuers
- '("Automoose-1" ; The CancelMoose[tm] on autopilot.
- "clewis@ferret.ocunix.on.ca;" ; Chris Lewis -- Canadian angel & despammer.
- "jem@xpat.com;" ; John Milburn -- despammer in Korea.
- "red@redpoll.mrfs.oh.us (Richard E. Depew)" ; Spew/bincancel guy.
- )
- "*List of NoCeM issuers to pay attention to.")
+(defcustom gnus-nocem-issuers
+ '("AutoMoose-1" "Automoose-1" ; CancelMoose[tm]
+ "rbraver@ohww.norman.ok.us" ; Robert Braver
+ "clewis@ferret.ocunix.on.ca;" ; Chris Lewis
+ "jem@xpat.com;" ; Despammer from Korea
+ "snowhare@xmission.com" ; Benjamin "Snowhare" Franz
+ "red@redpoll.mrfs.oh.us (Richard E. Depew)"
+ )
+ "List of NoCeM issuers to pay attention to."
+ :group 'gnus-nocem
+ :type '(repeat string))
-(defvar gnus-nocem-directory
- (concat (file-name-as-directory gnus-article-save-directory) "NoCeM/")
- "*Directory where NoCeM files will be stored.")
+(defcustom gnus-nocem-directory
+ (nnheader-concat gnus-article-save-directory "NoCeM/")
+ "*Directory where NoCeM files will be stored."
+ :group 'gnus-nocem
+ :type 'directory)
-(defvar gnus-nocem-expiry-wait 15
- "*Number of days to keep NoCeM headers in the cache.")
+(defcustom gnus-nocem-expiry-wait 15
+ "*Number of days to keep NoCeM headers in the cache."
+ :group 'gnus-nocem
+ :type 'integer)
-(defvar gnus-nocem-verifyer nil
+(defcustom gnus-nocem-verifyer 'mc-verify
"*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.")
+isn't bound, the message will be used unconditionally."
+ :group 'gnus-nocem
+ :type '(radio (function-item mc-verify)
+ (function :tag "other")))
;;; Internal variables
(interactive)
(let ((groups gnus-nocem-groups)
group active gactive articles)
- (or (file-exists-p gnus-nocem-directory)
- (make-directory gnus-nocem-directory t))
+ (gnus-make-directory gnus-nocem-directory)
;; Load any previous NoCeM headers.
(gnus-nocem-load-cache)
;; Read the active file if it hasn't been read yet.
;; arrived.
(while (setq group (pop groups))
(if (not (setq gactive (gnus-activate-group group)))
- () ; This group doesn't exist.
+ () ; This group doesn't exist.
(setq active (nth 1 (assoc group gnus-nocem-active)))
(when (and (not (< (cdr gactive) (car gactive))) ; Empty group.
(or (not active)
(setq articles
(gnus-uncompress-range
(cons
- (if active (1+ (cdr active))
+ (if active (1+ (cdr active))
(car gactive))
(cdr gactive))))
group))
(gnus-nocem-check-article group (car headers)))
(setq headers (cdr headers)))))))
(setq gnus-nocem-active
- (cons (list group gactive)
+ (cons (list group gactive)
(delq (assoc group gnus-nocem-active)
gnus-nocem-active)))))
;; Save the results, if any.
(nnmail-days-to-time gnus-nocem-expiry-wait)))
(gnus-request-article-this-buffer (mail-header-number header) group)
(goto-char (point-min))
+ (when (re-search-forward "-----BEGIN PGP MESSAGE-----" nil t)
+ (delete-region (point-min) (match-beginning 0)))
+ (when (re-search-forward "-----END PGP MESSAGE-----\n?" nil t)
+ (delete-region (match-end 0) (point-max)))
+ (goto-char (point-min))
;; The article has to have proper NoCeM headers.
(when (and (setq b (search-forward "\n@@BEGIN NCM HEADERS\n" nil t))
(setq e (search-forward "\n@@BEGIN NCM BODY\n" nil t)))
;; We get the name of the issuer.
(narrow-to-region b e)
(setq issuer (mail-fetch-field "issuer"))
+ (widen)
(and (member issuer gnus-nocem-issuers) ; We like her...
(gnus-nocem-verify-issuer issuer) ; She is who she says she is..
(gnus-nocem-enter-article)))))) ; We gobble the message.
(defun gnus-nocem-verify-issuer (person)
"Verify using PGP that the canceler is who she says she is."
- (widen)
(if (fboundp gnus-nocem-verifyer)
(funcall gnus-nocem-verifyer)
- ;; If we don't have MailCrypt, then we use the message anyway.
+ ;; If we don't have Mailcrypt, then we use the message anyway.
t))
(defun gnus-nocem-enter-article ()
(when ncm
(setq gnus-nocem-touched-alist t)
(push (cons (let ((time (current-time))) (setcdr (cdr time) nil) time)
- ncm)
+ ncm)
gnus-nocem-alist)))))
(defun gnus-nocem-load-cache ()