[comp.sources.misc] v19i062: md4.el - MD4 support for GNUS, Part01/01

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

Submitted-by: Johan Vromans <jv@mh.nl>
Posting-number: Volume 19, Issue 62
Archive-name: md4.el/part01

md4.el defines the functions to have automatic validation and
insertion of MD4 signatures using GNUS.

Johan
-----
#!/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


-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.

exit 0 # Just in case...
-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.