[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Anonymous Encrypted Remailer Interface for Emacs



Hello,

  I finally wrote some code. This interface automates the wrapping of
messages for use with the encrypted anonymous remailers--provided
you're willing to enter into Emacs for the wrapping.

  I've sent & received several messages using it. Please let me know
if you find any problems.

enjoy,
michael

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
;;; anon-remail.el v1.0, anonymous remailer interface
;;; written by michael shiplett <[email protected]>
;;; Any comments or suggestions welcomed.

;;; License

;;; No implied or expressed warranty nor any other guarantee.
;;; Do what you want with this.


;;; Anonymous Encrypted Remailer Interface


;;; Usage:

;;; You must set ar-remailer-list to a list of anonymous
;;; remailer addresses. These must be in a valid mail ``To:''
;;; format. The initial recipients address must also be in a valid
;;; ``To:'' format; addresses depending on alias files will not
;;; work because your mail program (MH, Elm, mail, etc.) will
;;; not get a chance to process them before the message is wrapped.

;;; After writing your message, invoke ar-wrap-message. If you
;;; wish to sign the message, you should only sign the first
;;; wrapping.

;;; After the message has been wrapped, a list will appear in
;;; the minibuffer--this is the route the message will take.

;;; This package requires that you have mailcrypt configured
;;; for use with pgp (unless you send to ripem remailers).


;;; To Do:

;;; Modify mc-encrypt to take a boolean argument for
;;; signing the message.

;;; Allow for different remailer lists based on whether
;;; the transit delay one wants, e.g., fast, normal, or slow.


(require 'mailcrypt)

;; User Variables

(defvar ar-remailer-list nil "*List of remailers from which to choose.")
(defvar ar-hops 3 "*Number of remailers among which to pass message.")


;; Hooks

(defvar ar-start-hook nil)


;; Functions

(defun ar-wrap-message (&optional hops)
  "*Wrap the current message for a person and then wrap it for
HOPS remailers. If HOPS is nil, use the value of `ar-hops'."
  (interactive "P")
  (run-hooks 'ar-start-hook)
  (let ((remailer-path (list (mail-fetch-field "to" nil t))))
    (ar-wrap-message-for-individual)
    (if (not hops)
	(setq hops ar-hops))
    (while (< 0 hops)
      (let ((remailer (ar-choose-remailer)))
	;; `remailer-path' is to prevent us
	;; from sending to the same remailer twice
	;; in a row.
	;; It gives the path the message will take
	;; beginning with `(car remailer-path)'
	(while (string= remailer (car remailer-path))
	  (setq remailer (ar-choose-remailer)))
	(setq remailer-path (cons remailer remailer-path))
	(ar-wrap-for-remailer remailer)
	(setq hops (1- hops))))
    (message "%s" remailer-path)))



(defun ar-choose-remailer ()
  "*Select a random remailer from `ar-remailer-list'."
  (let (number-of-remailers remailer)
    ;; Choose a remailer
    (setq number-of-remailers (length ar-remailer-list))
    (or number-of-remailers
	(error "No remailers!"))
    (nth (random number-of-remailers) ar-remailer-list)))



(defun ar-wrap-for-remailer (remailer)
  "*Wrap the current mail buffer for mailing to a specified remailer."
  (let (recipient)
    ;; Keep track of whom should receive the resent message
    (setq recipient (mail-fetch-field "to" nil t))

    ;; Add the magic redirection words
    (goto-char (point-min))
    (search-forward (concat "\n" mail-header-separator "\n"))
    (setq start (point))
    (insert "::\nRequest-Remailing-To: " recipient "\n\n")

    ;; Wrap the message for the remailer
    (mc-encrypt-message remailer nil)

    ;; Add in the final magic remailer incantation
    (goto-char start)
    (insert "::\nEncrypted: PGP\n\n")

    ;; Set the message to be sent to the remailer
    (ar-set-recipient remailer)
    ))



(defun ar-wrap-message-for-individual ()
  "*Does the initial wrap for a message not intended for a remailer"
  ;; Figure out to whom the message is currently intended
  (let (recipient)
    (setq recipient (mail-fetch-field "to" nil t))
    (mc-encrypt-message recipient nil)
    ))



(defun ar-set-recipient (recipient)
  "*Set the ``To:'' field of a message. This will not work on
a multi-line ``To:''."
  (or recipient
   (error "No recipient!"))

  (goto-char (point-min))
  (search-forward "To:")
  (let ((beg (point)))
    (end-of-line)
    (delete-region beg (point)))
  (insert " " recipient))


(provide 'anon-remail)