|
|
1.1 root 1: To: [email protected] (Derek Atkins) 2: In-reply-to: [email protected]'s message of 1 Mar 1993 03:59:41 GMT 3: Subject: Request for Mailer Scripts 4: BCC: jtkohl 5: Full-name: John T Kohl 6: X-US-Snail: DEC, 110 Spit Brook Road, M/S ZKO3-3/U14, Nashua, NH 03062 7: --text follows this line-- 8: here's some elisp I got from Bill Sommerfeld, and hacked up a bit 9: myself: 10: ;;; 11: ;;; wrapper for the "Pretty-Good-Privacy" program. 12: ;;; 13: 14: (defvar pgp-program (expand-file-name "/usr/local/bin/pgp") 15: "*Name of the PGP executable") 16: (defvar pgp-sender-name "jtkohl@zk3" 17: "*Name of secret key to use for signing/encrypting messages with PGP") 18: 19: (require 'rmail) 20: (require 'terminal) 21: (require 'backquote) 22: 23: (defvar pgp-encrypt-mail t) 24: (defvar pgp-sign-mail t) 25: (defvar pgp-output-mode-map nil 26: "Keymap used in PGP Output mode") 27: 28: (defvar pgp-finished) 29: (make-variable-buffer-local 'pgp-finished) 30: (set-default 'pgp-finished nil) 31: (defvar termhook-finished) 32: (make-variable-buffer-local 'termhook-finished) 33: (set-default 'termhook-finished nil) 34: 35: (defun pgp-output-quit () 36: (interactive) 37: (let ((buffer (current-buffer))) 38: (switch-to-buffer 39: (if (and (boundp 'pgp-prev-buffer) (bufferp pgp-prev-buffer)) 40: pgp-prev-buffer 41: (other-buffer buffer))) 42: (bury-buffer buffer))) 43: 44: (defun pgp-keymap-init () 45: (setq pgp-output-mode-map (make-keymap)) 46: (suppress-keymap pgp-output-mode-map) 47: (define-key pgp-output-mode-map " " 'scroll-up) 48: (define-key pgp-output-mode-map "\177" 'scroll-down) 49: (define-key pgp-output-mode-map "q" 'pgp-output-quit)) 50: 51: (if (not pgp-output-mode-map) 52: (pgp-keymap-init)) 53: 54: (defun pgp-output-mode () 55: (interactive) 56: (fundamental-mode) 57: (setq mode-name "PGP-Output") 58: (setq major-mode 'pgp-output-mode) 59: (setq buffer-read-only t) 60: (setq buffer-auto-save-file-name nil) 61: (use-local-map pgp-output-mode-map)) 62: 63: 64: ;; a "continuation".. what we do after pgp is done.. 65: ;; this could set the current buffer (the terminal emulator one) 66: ;; into a new major mode (pgp-after-mode) to let you do things like: 67: ;; a) easily dismiss the pgp window 68: ;; b) view any output files. 69: ;; c) see what the "labelling" on the files was 70: ;; (i.e., signature, encrypted); this shows up in mode line, not file! 71: 72: (defun pgp-continue-frob (out-filename prev-buffer) 73: (cond ((file-exists-p out-filename) 74: (set-buffer (get-buffer-create "*PGP Output*")) 75: (make-variable-buffer-local 'pgp-prev-buffer) 76: (setq pgp-prev-buffer nil) 77: (setq buffer-read-only nil) 78: (erase-buffer) 79: (insert-file-contents out-filename) 80: (delete-file out-filename) 81: (switch-to-buffer "*PGP Output*") 82: (pgp-output-mode) 83: (setq pgp-prev-buffer prev-buffer)) 84: (t (message "PGP command completed with no output file" )))) 85: 86: (defun pgp-continue-in-place (out-file buf min max cont) 87: (cond ((file-exists-p out-file) 88: (switch-to-buffer buf) 89: (goto-char min) 90: (delete-region min max) 91: (insert-file-contents out-file) 92: (delete-file out-file) 93: (apply cont nil)) 94: (t (message "PGP command completed with no output file")))) 95: 96: (defun pgp-mail-continue () 97: (mail-to) 98: (insert (save-excursion 99: (set-buffer "*PGP*") ;!!! 100: (goto-char (point-min)) 101: (re-search-forward "Recipient's") 102: (re-search-forward "user ID: \\(.*$\\)") 103: (buffer-substring (match-beginning 1) (match-end 1))))) 104: 105: (defvar pgp-base-file-name nil 106: "Default base file name for PGP temp files; defaults to a file in 107: /tmp with your UNIX user id in it.") 108: 109: (defun pgp-check-tempname () 110: (if pgp-base-file-name 111: () 112: (setq pgp-base-file-name (format "/tmp/pgp%d" (user-real-uid))))) 113: 114: (defun pgp-frob-region-1 (min max cont1 &optional opt1 opt2) 115: (pgp-check-tempname) 116: (let ((temp-filename (format "%s.txt" pgp-base-file-name)) 117: (out-filename (format "%s.asc" pgp-base-file-name)) 118: (prev-buffer (current-buffer))) 119: (if (file-exists-p temp-filename) 120: (delete-file temp-filename)) 121: (if (file-exists-p out-filename) 122: (delete-file out-filename)) 123: (write-region min max temp-filename) 124: 125: (let ((buf (get-buffer-create "*PGP*"))) 126: (switch-to-buffer buf) 127: (erase-buffer) 128: (let ((terminal-mode-hook 129: (function 130: (lambda () 131: (make-variable-buffer-local 'terminal-finished-hook) 132: (setq terminal-finished-hook (apply cont1 out-filename prev-buffer nil)) 133: (setq termhook-finished t) 134: (if (and 135: (boundp 'pgp-finished) 136: pgp-finished) 137: (let ((nhooks terminal-finished-hook)) 138: (fundamental-mode) ; in the *PGP* buffer; nukes hooks! 139: (run-hooks 'nhooks))))))) 140: (terminal-emulator buf 141: pgp-program 142: (nconc (list "-o" out-filename) 143: opt1 144: (list temp-filename) 145: opt2)))))) 146: 147: (defun pgp-frob-region (min max &optional opt1 opt2) 148: (pgp-frob-region-1 min max 149: (function 150: (lambda (out-filename buf) 151: (` (lambda () 152: (pgp-continue-frob 153: (, out-filename) 154: (, buf)))))) 155: opt1 opt2)) 156: 157: (defun pgp-frob-region-in-place (min max &optional opt1 opt2 cont) 158: (let ((cur-buf (current-buffer))) 159: (pgp-frob-region-1 min max 160: (function 161: (lambda (out-filename buf) 162: (` (lambda () 163: (pgp-continue-in-place (, out-filename) 164: (, cur-buf) 165: (, min) 166: (, max) 167: (quote (, cont))))))) 168: opt1 opt2))) 169: 170: (defun pgp-encrypt-ascii-region (min max to) 171: (interactive "r\nsRecipient name: ") 172: (pgp-frob-region min max (list "-eaw") (list to))) 173: 174: (defun pgp-decrypt-ascii-region (min max) 175: (interactive "r") 176: (pgp-frob-region min max nil nil)) 177: 178: (defun pgp-sign-ascii-region (min max) 179: "Sign the region with PGP, using cleartext signatures." 180: (interactive "r") 181: (pgp-frob-region min max (list "-swat") nil)) 182: 183: (defun pgp-encrypt-ascii-buffer (to) 184: "Encrypt a buffer and use PGP armor for the output." 185: (interactive "sRecipient name: ") 186: (pgp-encrypt-ascii-region (point-min) (point-max) to)) 187: 188: (defun pgp-decrypt-ascii-buffer () 189: "Apply PGP to the current buffer." 190: (interactive) 191: (pgp-decrypt-ascii-region (point-min) (point-max))) 192: 193: (defun pgp-sign-encrypt-ascii-buffer (to) 194: (interactive "sRecipient name: ") 195: (pgp-frob-region (point-min) (point-max) (list "-seaw") (list to))) 196: 197: (defun pgp-sign-ascii-buffer () 198: "Sign the current buffer with PGP, using cleartext signatures." 199: (interactive) 200: (pgp-sign-ascii-region (point-min) (point-max))) 201: 202: (defun pgp-sign-encrypt-ascii-buffer-in-place (to) 203: (interactive "s(in place) Recipient name: ") 204: (pgp-frob-region-in-place (point-min) (point-max) (list "-seaw") (list to))) 205: 206: (defun pgp-sign-encrypt-ascii-region (min max to) 207: (interactive "r\nsRecipient name: ") 208: (pgp-frob-region min max (list "-seaw") (list to))) 209: 210: (defvar pgp-mail-frob-flags "-easw" 211: "*Flags to pass to pgp for frobbing mail.") 212: 213: (defun pgp-frob-mail (to) 214: "Take an in-progress mail message and 'frob' it." 215: (interactive "sMail Recipient name: ") 216: (goto-char (point-min)) 217: (re-search-forward mail-header-separator) 218: (goto-char (match-beginning 0)) 219: (forward-line 1) 220: (save-excursion 221: (insert (buffer-substring (point-min) (point)))) 222: (pgp-frob-region-in-place (point) (point-max) 223: (list pgp-mail-frob-flags "-u" pgp-sender-name) 224: (list to) 225: 'pgp-mail-continue)) 226: 227: (global-set-key "\C-c\C-p\C-e" 'pgp-encrypt-ascii-buffer) 228: (global-set-key "\C-c\C-p\C-r" 'pgp-encrypt-ascii-region) 229: (global-set-key "\C-c\C-p\C-s" 'pgp-sign-ascii-buffer) 230: (global-set-key "\C-c\C-p\C-m" 'pgp-frob-mail) 231: (global-set-key "\C-c\C-p\C-d" 'pgp-decrypt-ascii-buffer) 232: 233: (global-set-key "\C-cpm" 'pgp-frob-mail) 234: (define-key rmail-mode-map "V" 'pgp-decrypt-ascii-buffer) 235: 236: ;;; How to deal with the race? the sentinel may get called 237: ;;; *before* terminal-emulator finishes its initialization. So we set 238: ;;; up a local variable here so that our terminal-mode-hook will undo 239: ;;; the damage if PGP is finished. 240: ;; 241: ;; from terminal.el, modified: 242: 243: (defun te-sentinel (process message) 244: (cond ((eq (process-status process) 'run)) 245: ((null (buffer-name (process-buffer process)))) ;deleted 246: (t (let ((b (current-buffer)) 247: (done-hooks (and ; added: WES 248: (boundp 'terminal-finished-hook) 249: terminal-finished-hook))) 250: (save-excursion 251: (set-buffer (process-buffer process)) 252: (setq buffer-read-only nil) 253: (goto-char (point-max)) 254: (delete-blank-lines) 255: (delete-horizontal-space) 256: (insert "\n*******\n" message "*******\n") 257: (fundamental-mode) ; added/moved: WES/JTK 258: (setq pgp-finished t) ; JTK 259: (sit-for 1)) 260: (if (and (eq b (process-buffer process)) 261: (waiting-for-user-input-p)) 262: (progn (goto-char (point-max)) 263: (recenter -1))) 264: (run-hooks 'done-hooks))))) ;added: WES 265: 266:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.