[gnu.emacs.sources] MD4 support for GNUS

jv@mh.nl (Johan Vromans) (05/11/91)

This file defines the functions to have automatic validation and
insertion of MD4 signatures using GNUS.

See the recent postings in comp.sources.misc for a discussion of MD4.

#!/bin/sh
# This is a shell archive (produced by shar 3.49)
# To extract the files from this archive, save it to a file, remove
# everything above the "!/bin/sh" line above, and type "sh file_name".
#
# made 05/11/1991 14:27 UTC by jv@pronto
# Source directory /u1/users/jv
#
# existing files will NOT be overwritten unless -c is specified
#
# This shar contains:
# length  mode       name
# ------ ---------- ------------------------------------------
#   4010 -r--r--r-- md4.el
#
# ============= md4.el ==============
if test -f 'md4.el' -a X"$1" != X"-c"; then
	echo 'x - skipping md4.el (File already exists)'
else
echo 'x - extracting md4.el (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'md4.el' &&
X;; @(#)@ md4 1.1 - MD4 support for GNUS
X;;
X;; This file defines functions to calculate a MD4 signature, add
X;; it to outgoing postings, and validate it on incoming postings.
X;;
X;; It uses "gnus-Inews-article-hook", called by GNUS just before passing
X;; the articel to inews, to install the signature.
X;;
X;; "gnus-Article-prepare-hook" is used to validate the signature on
X;; an article if you read it.
X;;
X;; This file, if useful, is covered by the GPL.
X;;
X;;	Johan Vromans <jv@mh.nl>
X
X;; Customizations
X
X(defvar md4-command "md4" "*Where to find md4")
X
X(defvar md4-signature-header "X-Md4-Signature")
X
X(defvar md4-insertion t
X  "*Controls MD4 signature insertion. If nil, no signature is
X  calculated nor inserted.")
X
X(defvar md4-validation 1
X  "*Controls MD4 signature validation. If nil, no validation is
X  performed. If t, validation is performed, and failures are reported.
X  Any other value causes validation to be performed, and failures as
X  well as successes to be reported.")
X
X;; Hook definitions and insertions.
X
X(add-hook 'gnus-Inews-article-hook 'md4-add-signature)
X(add-hook 'gnus-Article-prepare-hook 'md4-validate-signature)
X;;
X;; Calcuates the MD4 signature for the article to be posted, which
X;; is assumed to be in the current buffer.
X;;
X(defun md4-add-signature ()
X  "Adds a MD4-signature to the article being posted. Must be called
Xfrom gnus-Inews-article-hook."
X  (interactive)
X
X  (if (null md4-insertion)
X      nil
X    (let (start-of-body end-of-body sigfile)
X
X      ;; .signature handling. may be system specific
X      (goto-char (point-max))
X      (setq end-of-body (point-marker))
X      (if (file-exists-p
X	   (setq sigfile
X		 (or gnus-signature-file (expand-file-name "~/.signature"))))
X	  (progn
X	    (insert "-- \n")		; that is what I get inserted...
X	    (insert-file sigfile))
X	(setq sigfile nil))
X
X      (goto-char (point-min))
X      (search-forward "\n\n")
X      (setq start-of-body (point-marker))	; remember where
X      
X      ;; Run md4 and add the signature.
X      (forward-line -1)
X      (insert md4-signature-header ": ")
X      (insert (md4-signature-region start-of-body (point-max)))
X      (insert "\n")
X
X      (if sigfile
X	  (delete-region end-of-body (point-max)))
X      )))
X
X;;
X;; Validate MD4 signature. A message is shown with the result.
X;; If the signature does not match, buffer "*MD4 Buffer*" holds more
X;; information.
X;;
X(defun md4-validate-signature ()
X  "Checks a MD4-signature in the article being read. May be called
Xfrom gnus-article-prepare-hook."
X  (interactive)
X
X  (if (null md4-validation)
X      nil
X    (let (start-of-body)
X      (goto-char (point-min))
X      (search-forward "\n\n")
X      (setq start-of-body (point-marker))	; remember where
X
X      ;; Check if a signature header is present
X      (goto-char (point-min))
X      (if (search-forward 
X	   (concat "\n" md4-signature-header ": ")
X	   start-of-body t)
X	  (let (signature (here (point)))
X	    (forward-line 1)
X	    (setq signature (buffer-substring here (1- (point))))
X
X	    ;; Validate
X	    (if (string= 
X		 signature
X		 (md4-signature-region start-of-body (point-max)))
X		(progn
X		  (if (not (equal md4-validation t))
X		      (message "MD4 signature valid."))
X		  (bury-buffer md4-buffer))
X	      (beep)
X	      (save-excursion
X		(set-buffer md4-buffer)
X		(goto-char (point-min))
X		(insert (message "MD4 signature mismatch!")
X			"\nPosted:     " signature
X			"\nCalculated: ")
X		(goto-char (point-min))))
X	    )))))
X
X(defun md4-signature-region (start end)
X  "Calculates MD4 signature."
X
X  ;; Get buffer and clear it
X  (setq md4-buffer (get-buffer-create "*MD4 Buffer*"))
X  (save-excursion
X    (set-buffer md4-buffer)
X    (erase-buffer))
X
X  ;; Run md4
X  (call-process-region start end
X		       md4-command nil md4-buffer nil)
X
X  ;; Verify normal result
X  (save-excursion
X    (set-buffer md4-buffer)
X    (if (= (buffer-size) 33)
X	(buffer-substring (point-min) (1- (point-max)))
X      (error "Unexpected result from %s: %s" md4-command
X	     (buffer-substring (point-min) (point-max))))))
SHAR_EOF
chmod 0444 md4.el ||
echo 'restore of md4.el failed'
Wc_c="`wc -c < 'md4.el'`"
test 4010 -eq "$Wc_c" ||
	echo 'md4.el: original size 4010, current size' "$Wc_c"
fi
exit 0
-- 
Johan Vromans				       jv@mh.nl via internet backbones
Multihouse Automatisering bv		       uucp: ..!{uunet,hp4nl}!mh.nl!jv
Doesburgweg 7, 2803 PL Gouda, The Netherlands  phone/fax: +31 1820 62911/62500
------------------------ "Arms are made for hugging" -------------------------

jv@mh.nl (Johan Vromans) (05/13/91)

In article <1991May11.143132.2114@pronto.mh.nl> jv@mh.nl (Johan Vromans) writes:

   This file defines the functions to have automatic validation and
   insertion of MD4 signatures using GNUS.

To use this, you also need the function add-hook. Here it is --

#!/bin/sh
# This is a shell archive (produced by shar 3.49)
# To extract the files from this archive, save it to a file, remove
# everything above the "!/bin/sh" line above, and type "sh file_name".
#
# made 05/13/1991 07:36 UTC by jv@largo
# Source directory /u1/users/jv
#
# existing files will NOT be overwritten unless -c is specified
#
# This shar contains:
# length  mode       name
# ------ ---------- ------------------------------------------
#    625 -rw-r--r-- add-hook.el
#
# ============= add-hook.el ==============
if test -f 'add-hook.el' -a X"$1" != X"-c"; then
	echo 'x - skipping add-hook.el (File already exists)'
else
echo 'x - extracting add-hook.el (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'add-hook.el' &&
X;; add-hook function by Dan LaLiberte <liberte@cs.uiuc.edu>
X(defun add-hook (hook-var hook-function)
X  "Prepend to the value of HOOK-VAR the function HOOK-FUNCTION, if it
Xis not already an element.
Xhook-var's value may be a single function or a list of functions."
X  (if (boundp hook-var)
X      (let ((value (symbol-value hook-var)))
X	(if (and (listp value) (not (eq (car value) 'lambda)))
X	    (and (not (memq hook-function value))
X		 (set hook-var
X		      (cons hook-function value)))
X	  (and (not (eq hook-function value))
X	       (set hook-var
X		    (list hook-function value)))))
X    (set hook-var hook-function)
X    ))
SHAR_EOF
chmod 0644 add-hook.el ||
echo 'restore of add-hook.el failed'
Wc_c="`wc -c < 'add-hook.el'`"
test 625 -eq "$Wc_c" ||
	echo 'add-hook.el: original size 625, current size' "$Wc_c"
fi
exit 0
-- 
Johan Vromans				       jv@mh.nl via internet backbones
Multihouse Automatisering bv		       uucp: ..!{uunet,hp4nl}!mh.nl!jv
Doesburgweg 7, 2803 PL Gouda, The Netherlands  phone/fax: +31 1820 62911/62500
------------------------ "Arms are made for hugging" -------------------------