~ubuntu-branches/ubuntu/trusty/semi/trusty

1 by Tatsuya Kinoshita
Import upstream version 1.14.6+0.20040418
1
;;; mime-mc.el --- Mailcrypt interface for SEMI
2
3
;; Copyright (C) 1996,1997,1998 MORIOKA Tomohiko
4
5
;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
6
;; Keywords: PGP, security, MIME, multimedia, mail, news
7
8
;; This file is part of SEMI (Secure Emacs MIME Interface).
9
10
;; This program is free software; you can redistribute it and/or
11
;; modify it under the terms of the GNU General Public License as
12
;; published by the Free Software Foundation; either version 2, or (at
13
;; your option) any later version.
14
15
;; This program is distributed in the hope that it will be useful, but
16
;; WITHOUT ANY WARRANTY; without even the implied warranty of
17
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18
;; General Public License for more details.
19
20
;; You should have received a copy of the GNU General Public License
21
;; along with GNU Emacs; see the file COPYING.  If not, write to the
1.1.3 by Tatsuya Kinoshita
Import upstream version 1.14.6+0.20060328
22
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23
;; Boston, MA 02110-1301, USA.
1 by Tatsuya Kinoshita
Import upstream version 1.14.6+0.20040418
24
25
;;; Code:
26
27
(require 'mailcrypt)
28
(eval-and-compile (load "mc-pgp"))
29
30
(defun mime-mc-pgp-generic-parser (result)
31
  (let ((ret (mc-pgp-generic-parser result)))
32
    (if (consp ret)
33
	(vector (car ret)(cdr ret))
34
      )))
35
36
(defun mime-mc-process-region
37
  (beg end passwd program args parser &optional buffer boundary)
38
  (let ((obuf (current-buffer))
39
	(process-connection-type nil)
40
	mybuf result rgn proc)
41
    (unwind-protect
42
	(progn
43
	  (setq mybuf (or buffer (generate-new-buffer " *mailcrypt temp")))
44
	  (set-buffer mybuf)
45
	  (erase-buffer)
46
	  (set-buffer obuf)
47
	  (buffer-disable-undo mybuf)
48
	  (setq proc
49
		(apply 'start-process "*PGP*" mybuf program args))
50
	  (if passwd
51
	      (progn
52
		(process-send-string proc (concat passwd "\n"))
53
		(or mc-passwd-timeout (mc-deactivate-passwd t))))
54
	  (process-send-region proc beg end)
55
	  (process-send-eof proc)
56
	  (while (eq 'run (process-status proc))
57
	    (accept-process-output proc 5))
58
	  (setq result (process-exit-status proc))
59
	  ;; Hack to force a status_notify() in Emacs 19.29
60
	  (delete-process proc)
61
	  (set-buffer mybuf)
62
	  (goto-char (point-max))
63
	  (if (re-search-backward "\nProcess \\*PGP.*\n\\'" nil t)
64
	      (delete-region (match-beginning 0) (match-end 0)))
65
	  (goto-char (point-min))
66
	  ;; CRNL -> NL
67
	  (while (search-forward "\r\n" nil t)
68
	    (replace-match "\n"))
69
	  ;; Hurm.  FIXME; must get better result codes.
70
	  (if (stringp result)
71
	      (error "%s exited abnormally: '%s'" program result)
72
	    (setq rgn (funcall parser result))
73
	    ;; If the parser found something, migrate it
74
	    (if (consp rgn)
75
		(progn
76
		  (set-buffer obuf)
77
		  (if boundary
78
		      (save-restriction
79
			(narrow-to-region beg end)
80
			(goto-char beg)
81
			(insert (format "--%s\n" boundary))
82
			(goto-char (point-max))
83
			(insert (format "\n--%s
84
Content-Type: application/pgp-signature
85
Content-Transfer-Encoding: 7bit
86
87
" boundary))
88
			(insert-buffer-substring mybuf (car rgn) (cdr rgn))
89
			(goto-char (point-max))
90
			(insert (format "\n--%s--\n" boundary))
91
			)
92
		    (delete-region beg end)
93
		    (goto-char beg)
94
		    (insert-buffer-substring mybuf (car rgn) (cdr rgn))
95
		    )
96
		  (set-buffer mybuf)
97
		  (delete-region (car rgn) (cdr rgn)))))
98
	  ;; Return nil on failure and exit code on success
99
	  (if rgn result))
100
      ;; Cleanup even on nonlocal exit
101
      (if (and proc (eq 'run (process-status proc)))
102
	  (interrupt-process proc))
103
      (set-buffer obuf)
104
      (or buffer (null mybuf) (kill-buffer mybuf)))))
105
106
(defun mime-mc-pgp-sign-region (start end &optional id unclear boundary)
107
  ;; (if (not (boundp 'mc-pgp-user-id))
108
  ;;     (load "mc-pgp")
109
  ;;   )
110
  (let ((process-environment process-environment)
111
	(buffer (get-buffer-create mc-buffer-name))
112
	passwd args key
113
	(parser (function mc-pgp-generic-parser))
114
	(pgp-path mc-pgp-path)
115
	)
116
    (setq key (mc-pgp-lookup-key (or id mc-pgp-user-id)))
117
    (setq passwd
118
	  (mc-activate-passwd
119
	   (cdr key)
120
	   (format "PGP passphrase for %s (%s): " (car key) (cdr key))))
121
    (setenv "PGPPASSFD" "0")
122
    (setq args
123
	  (cons
124
	   (if boundary
125
	       "-fbast"
126
	     "-fast")
127
	   (list "+verbose=1" "+language=en"
128
		 (format "+clearsig=%s" (if unclear "off" "on"))
129
		 "+batchmode" "-u" (cdr key))))
130
    (if mc-pgp-comment
131
	(setq args (cons (format "+comment=%s" mc-pgp-comment) args))
132
      )
133
    (message "Signing as %s..." (car key))
134
    (if (mime-mc-process-region
135
	 start end passwd pgp-path args parser buffer boundary)
136
	(progn
137
	  (if boundary
138
	      (progn
139
		(goto-char (point-min))
140
		(insert
141
		 (format "\
142
--[[multipart/signed; protocol=\"application/pgp-signature\";
143
 boundary=\"%s\"; micalg=pgp-md5][7bit]]\n" boundary))
144
		))
145
	  (message "Signing as %s...done" (car key))
146
	  t)
147
      nil)))
148
149
(defun mime-mc-pgp-encrypt-region (recipients start end &optional id sign)
150
  (let ((mc-pgp-always-sign (if (eq sign 'maybe)
151
				mc-pgp-always-sign
152
			      'never)))
153
    (mc-pgp-encrypt-region
154
     (mc-split "\\([ \t\n]*,[ \t\n]*\\)+" recipients)
155
     start end id nil)
156
    ))
157
158
		
159
;;; @ end
160
;;;
161
162
(provide 'mime-mc)
163
164
;;; mime-mc.el ends here