unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Daiki Ueno <ueno@unixuser.org>
To: emacs-devel@gnu.org
Subject: secure plist store
Date: Wed, 29 Jun 2011 17:07:57 +0900	[thread overview]
Message-ID: <m3oc1hys9u.fsf_-_-ueno@unixuser.org> (raw)
In-Reply-To: <874o39n171.fsf-ueno@unixuser.org> (Daiki Ueno's message of "Wed,  29 Jun 2011 05:36:02 +0900")

[-- Attachment #1: Type: text/plain, Size: 2163 bytes --]

Daiki Ueno <ueno@unixuser.org> writes:

> If your statement in <87wrh0fh4g.fsf_-_@lifelogs.com>:
>
>   The decoding will happen late, probably in the funcall to obtain the
>   secret (and it will set some scoped variables to cache the data)
>
> is true, epg-encrypt-string is not necessarily to be optimized in that
> way, I think.  How about implementing your side first and profiling
> before the optimization?

I didn't notice that the field encryption code is already checked in.
However, it does not work for me at all and looks too complicated - also
it apparently does not benefit from GPG2 passphrase caching (see "(auth)
GnuPG and EasyPG Assistant Configuration").

I don't want to see that the Gnus password-caching feature becomes
harder and harder to use daily... Is it not feasible to stop reusing
netrc pieces and employ a new format, which is more GPG friendly?  Yeah,
I'm reluctant to repeat the same discussion - here is a
proof-of-concept implementation of searchable, partially encrypted,
persistent plist store, called plstore.el.

Creation:

(setq store (plstore-open (expand-file-name "~/.emacs.d/auth")))
(plstore-put store "foo" '(:host "foo.example.org" :user "test") nil)
(plstore-save store)

;; mark :user property as secret
(plstore-put store "bar" '(:host "bar.example.org") '(:user "test"))
(plstore-put store "baz" '(:host "baz.example.org") '(:user "test"))
(plstore-save store) ;<= will ask passphrase via GPG

Search:

(setq store (plstore-open (expand-file-name "auth.el" user-emacs-directory)))
(plstore-find store '(:host "foo.example.org"))
(plstore-find store '(:host "bar.example.org")) ;<= will ask passphrase via GPG

The file format of ~/.emacs.d/auth:

--8<---------------cut here---------------start------------->8---
(("baz" :secret-user t :host "baz.example.org")
 ("bar" :secret-user t :host "bar.example.org")
 ("foo" :host "foo.example.org" :port 80))
"-----BEGIN PGP MESSAGE-----
Version: GnuPG v2.0.17 (GNU/Linux)

jA0EAwMCXQZhP/0Se0DUyTQcC17GCo0CdT+RfFFskWp4aNYW/aOT/qbv24M1vPfx
TFi9AR7iVc6qlg+9cA3f3buYBGvp
=UEHH
-----END PGP MESSAGE-----
"
--8<---------------cut here---------------end--------------->8---


[-- Attachment #2: plstore.el --]
[-- Type: text/plain, Size: 9251 bytes --]

;;; plstore.el --- searchable, partially encrypted, persistent plist store
;; Copyright (C) 2011 Free Software Foundation, Inc.

;; Author: Daiki Ueno <ueno@unixuser.org>
;; Keywords: PGP, GnuPG

;; This file is part of GNU Emacs.

;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary

;; Creating:
;;
;; (setq store (plstore-open (expand-file-name "auth" user-emacs-directory)))
;; (plstore-put store "foo" '(:host "foo.example.org" :port 80) nil)
;; (plstore-save store)
;; ;; :user property is secret
;; (plstore-put store "bar" '(:host "bar.example.org") '(:user "test"))
;; (plstore-put store "baz" '(:host "baz.example.org") '(:user "test"))
;; (plstore-save store) ;<= will ask passphrase via GPG
;;
;; Searching:
;;
;; (setq store (plstore-open (expand-file-name "auth.el" user-emacs-directory)))
;; (plstore-find store '(:host "foo.example.org"))
;; (plstore-find store '(:host "bar.example.org")) ;<= will ask passphrase via GPG
;; 

;;; Code:

(require 'epg)
(require 'epa)				;epa-passphrase-callback-function

(defvar plstore-cache-passphrase-for-symmetric-encryption nil)
(defvar plstore-passphrase-alist nil)

(defun plstore-passphrase-callback-function (context key-id plstore)
  (if (and plstore-cache-passphrase-for-symmetric-encryption
	   (eq key-id 'SYM))
      (progn
	(let* ((file (file-truename (plstore-get-file plstore)))
	       (entry (assoc file plstore-passphrase-alist))
	      passphrase)
	  (or (copy-sequence (cdr entry))
	      (progn
		(unless entry
		  (setq entry (list file)
			plstore-passphrase-alist
			(cons entry
			      plstore-passphrase-alist)))
		(setq passphrase (epa-passphrase-callback-function context
								   key-id
								   file))
		(setcdr entry (copy-sequence passphrase))
		passphrase))))
    (epa-passphrase-callback-function context key-id
				      (plstore-get-file plstore))))

(defun plstore-get-file (this)
  (aref this 0))

(defun plstore-get-alist (this)
  (aref this 1))

(defun plstore-get-encrypted-data (this)
  (aref this 2))

(defun plstore-get-secret-alist (this)
  (aref this 3))

(defun plstore-get-merged-alist (this)
  (aref this 4))

(defun plstore-get-decrypted (this)
  (aref this 5))

(defun plstore-set-file (this file)
  (aset this 0 file))

(defun plstore-set-alist (this plist)
  (aset this 1 plist))

(defun plstore-set-encrypted-data (this encrypted-data)
  (aset this 2 encrypted-data))

(defun plstore-set-secret-alist (this secret-alist)
  (aset this 3 secret-alist))

(defun plstore-set-merged-alist (this merged-alist)
  (aset this 4 merged-alist))

(defun plstore-set-decrypted (this decrypted)
  (aset this 5 decrypted))

;;;###autoload
(defun plstore-open (file)
  "Create a plstore instance associated with FILE."
  (let ((store (vector
		file
		nil		     ;plist (plist)
		nil		     ;encrypted data (string)
		nil		     ;secret plist (plist)
		nil		     ;merged plist (plist)
		nil		     ;decrypted (bool)
		)))
    (condition-case nil
	(with-temp-buffer
	  (insert-file-contents (plstore-get-file store))
	  (goto-char (point-min))
	  (plstore-set-alist store (read (point-marker)))
	  (forward-sexp)
	  (plstore-set-encrypted-data store (read (point-marker)))
	  ;; merged plist initially contains only unencrypted plist
	  (plstore-set-merged-alist store (plstore-get-alist store)))
      (error))
    store))

(defun plstore--merge-secret (plstore)
  (let ((alist (plstore-get-secret-alist plstore))
	(modified-alist (plstore-get-merged-alist plstore))
	modified-plist
	modified-entry
	entry
	plist
	placeholder)
    (while alist
      (setq entry (car alist)
	    alist (cdr alist)
	    plist (cdr entry)
	    modified-entry (assoc (car entry) modified-alist)
	    modified-plist (cdr modified-entry))
      (while plist
	(setq placeholder
	      (plist-member
	       modified-plist
	       (intern (concat ":secret-"
			       (substring (symbol-name (car plist)) 1)))))
	(if placeholder
	    (setcar placeholder (car plist)))
	(setq modified-plist
	      (plist-put modified-plist (car plist) (car (cdr plist))))
	(setq plist (nthcdr 2 plist)))
      (setcdr modified-entry modified-plist))))

(defun plstore--decrypt (plstore)
  (if (and (not (plstore-get-decrypted plstore))
	   (plstore-get-encrypted-data plstore))
      (let ((context (epg-make-context 'OpenPGP))
	    plain)
	(epg-context-set-passphrase-callback
	 context
	 (cons #'plstore-passphrase-callback-function
	       plstore))
	(setq plain
	      (epg-decrypt-string context
				  (plstore-get-encrypted-data plstore)))
	(plstore-set-secret-alist plstore (car (read-from-string plain)))
	(plstore--merge-secret plstore)
	(plstore-set-decrypted plstore t))))

(defun plstore--match (entry keys skip-if-secret-found)
  (let ((result t) key-name key-value prop-value secret-name)
    (while keys
      (setq key-name (car keys)
	    key-value (car (cdr keys))
	    prop-value (plist-get (cdr entry) key-name))
	(unless (equal prop-value key-value)
	  (if skip-if-secret-found
	      (progn
		(setq secret-name
		      (intern (concat ":secret-"
				      (substring (symbol-name key-name) 1))))
		(if (plist-member (cdr entry) secret-name)
		    (setq result 'secret)
		  (setq result nil
			keys nil)))
	    (setq result nil
		  keys nil)))
	(setq keys (nthcdr 2 keys)))
    result))

(defun plstore-find (plstore keys)
  "Perform search on PLSTORE with KEYS.
KEYS is a plist."
  (let (entries alist entry match decrypt plist)
    ;; First, go through the merged plist alist and collect entries
    ;; matched with keys.
    (setq alist (plstore-get-merged-alist plstore))
    (while alist
      (setq entry (car alist)
	    alist (cdr alist)
	    match (plstore--match entry keys t))
      (if (eq match 'secret)
	  (setq decrypt t)
	(when match
	  (setq plist (cdr entry))
	  (while plist
	    (if (string-match "\\`:secret-" (symbol-name (car plist)))
		(setq decrypt t
		      plist nil))
	    (setq plist (nthcdr 2 plist)))
	  (setq entries (cons entry entries)))))
    ;; Second, decrypt the encrypted plist and try again.
    (when decrypt
      (setq entries nil)
      (plstore--decrypt plstore)
      (setq alist (plstore-get-merged-alist plstore))
      (while alist
	(setq entry (car alist)
	      alist (cdr alist)
	      match (plstore--match entry keys nil))
	(if match
	    (setq entries (cons entry entries)))))
    (nreverse entries)))

(defun plstore-put (plstore name keys secret-keys)
  "Put an entry with NAME in PLSTORE.
KEYS is a plist containing non-secret data.
SECRET-KEYS is a plist containing secret data."
  (let (entry
	plist
	secret-plist
	merged-plist
	symbol)
    (while secret-keys
      (setq symbol
	    (intern (concat ":secret-"
			    (substring (symbol-name (car secret-keys)) 1))))
      (setq plist (plist-put plist symbol t)
	    secret-plist (plist-put secret-plist
				    (car secret-keys) (car (cdr secret-keys)))
	    merged-plist (plist-put merged-plist
				    (car secret-keys) (car (cdr secret-keys)))
	    secret-keys (nthcdr 2 secret-keys)))
    (while keys
      (setq symbol
	    (intern (concat ":secret-"
			    (substring (symbol-name (car keys)) 1))))
      (setq plist (plist-put plist (car keys) (car (cdr keys)))
	    merged-plist (plist-put merged-plist (car keys) (car (cdr keys)))
	    keys (nthcdr 2 keys)))
    (setq entry (assoc name (plstore-get-alist plstore)))
    (if entry
	(setcdr entry plist)
      (plstore-set-alist
       plstore
       (cons (cons name plist) (plstore-get-alist plstore))))
    (when secret-plist
      (setq entry (assoc name (plstore-get-secret-alist plstore)))
      (if entry
	  (setcdr entry secret-plist)
	(plstore-set-secret-alist
	 plstore
	 (cons (cons name secret-plist) (plstore-get-secret-alist plstore)))))
    (setq entry (assoc name (plstore-get-merged-alist plstore)))
    (if entry
	(setcdr entry merged-plist)
      (plstore-set-merged-alist
       plstore
       (cons (cons name merged-plist) (plstore-get-merged-alist plstore))))))

(defun plstore-save (plstore)
  "Save the contents of PLSTORE associated with a FILE."
  (with-temp-buffer
    (insert (pp-to-string (plstore-get-alist plstore)))
    (if (plstore-get-secret-alist plstore)
	(let ((context (epg-make-context 'OpenPGP))
	      (pp-escape-newlines nil)
	      cipher)
	  (epg-context-set-armor context t)
	  (epg-context-set-passphrase-callback
	   context
	   (cons #'plstore-passphrase-callback-function
		 plstore))
	  (setq cipher (epg-encrypt-string context
					   (pp-to-string
					    (plstore-get-secret-alist plstore))
					   nil))
	  (insert (pp-to-string cipher))))
    (write-region (point-min) (point-max) (plstore-get-file plstore))))

(provide 'plstore)

;;; plstore.el ends here

[-- Attachment #3: Type: text/plain, Size: 275 bytes --]


As you see, secret properties are prefixed with ":secret-" and the value
is hidden, and the real properties are encrypted together in the GPG
data at the end.  If you decrypt the GPG data, you will see:

(("baz" :user "test")
 ("bar" :user "test"))

Regards,
-- 
Daiki Ueno

  reply	other threads:[~2011-06-29  8:07 UTC|newest]

Thread overview: 203+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-04-23 18:54 Emacs RPC Lars Magne Ingebrigtsen
2011-04-24  3:21 ` T.V. Raman
2011-04-24 20:04   ` Richard Stallman
2011-04-24 20:24     ` Lars Magne Ingebrigtsen
2011-04-25 17:55       ` Richard Stallman
2011-05-01 18:53         ` Lars Magne Ingebrigtsen
2011-05-02  2:13           ` Lars Magne Ingebrigtsen
2011-05-02 21:25             ` Chong Yidong
2011-05-02 22:54               ` Lars Magne Ingebrigtsen
2011-04-24 20:26     ` Daniel Colascione
2011-04-25 17:56       ` Richard Stallman
2011-04-24 17:40 ` Chong Yidong
2011-04-24 18:00   ` Lars Magne Ingebrigtsen
2011-04-24 19:56     ` Chong Yidong
2011-04-25  1:21     ` Ted Zlatanov
2011-04-25  1:26       ` Lars Magne Ingebrigtsen
2011-04-25  2:05         ` Ted Zlatanov
2011-04-25 12:57       ` Stefan Monnier
2011-04-25 12:59     ` Stefan Monnier
2011-04-25 17:00 ` Emacs RPC security (was: Emacs RPC) Ted Zlatanov
2011-04-25 17:35   ` Emacs RPC security Stefan Monnier
2011-04-25 18:02     ` Ted Zlatanov
2011-04-25 18:17       ` Daniel Colascione
2011-04-25 19:43         ` Ted Zlatanov
2011-04-25 18:38       ` Stefan Monnier
2011-04-25 18:57         ` Ted Zlatanov
2011-05-01 18:55       ` Lars Magne Ingebrigtsen
2011-05-01 22:02         ` Lars Magne Ingebrigtsen
2011-05-01 22:19           ` Opportunistic STARTTLS in smtpmail.el (was: Emacs RPC security) Lars Magne Ingebrigtsen
2011-05-02 15:20             ` Opportunistic STARTTLS in smtpmail.el James Cloos
2011-05-02 18:52             ` Ted Zlatanov
2011-05-02 18:59               ` Lars Magne Ingebrigtsen
2011-05-02 19:21                 ` Ted Zlatanov
2011-05-02 23:36                   ` Lars Magne Ingebrigtsen
2011-05-03  0:29                     ` Ted Zlatanov
2011-05-03  1:01                       ` Lars Magne Ingebrigtsen
2011-05-03  1:22                         ` Ted Zlatanov
2011-05-03 22:04                           ` Lars Magne Ingebrigtsen
2011-05-04  1:37                             ` Ted Zlatanov
2011-05-30 17:45                               ` Lars Magne Ingebrigtsen
2011-05-30 18:07                                 ` Robert Pluim
2011-05-30 18:14                                   ` Lars Magne Ingebrigtsen
2011-05-30 18:54                                     ` Robert Pluim
2011-05-30 19:13                                   ` Stefan Monnier
2011-05-30 19:43                                     ` Lars Magne Ingebrigtsen
2011-05-30 23:10                                       ` Lars Magne Ingebrigtsen
2011-05-31  7:11                                         ` Robert Pluim
2011-05-31 10:13                                         ` Ted Zlatanov
2011-05-31 18:19                                           ` Lars Magne Ingebrigtsen
2011-05-31 19:39                                             ` Ted Zlatanov
2011-05-31 20:32                                               ` Lars Magne Ingebrigtsen
2011-06-01  0:37                                                 ` Ted Zlatanov
2011-06-01  1:29                                                   ` Stefan Monnier
2011-06-01  2:04                                                     ` Ted Zlatanov
2011-06-01 12:37                                                       ` Stefan Monnier
2011-06-01 13:34                                                         ` Ted Zlatanov
2011-06-01 14:39                                                           ` Stefan Monnier
2011-06-01 15:14                                                             ` Ted Zlatanov
2011-06-02  4:09                                                               ` Stefan Monnier
2011-06-02  8:57                                                                 ` Robert Pluim
2011-06-02 11:45                                                                   ` Daiki Ueno
2011-06-02 12:24                                                                   ` Stefan Monnier
2011-06-02 14:20                                                                     ` Ted Zlatanov
2011-06-02 15:03                                                                       ` Daiki Ueno
2011-06-02 15:31                                                                         ` Ted Zlatanov
2011-06-03 21:54                                                                           ` Lars Magne Ingebrigtsen
2011-06-05 15:11                                                                             ` netrc field encryption in auth-source (was: Opportunistic STARTTLS in smtpmail.el) Ted Zlatanov
2011-06-26 10:09                                                                               ` netrc field encryption in auth-source Lars Magne Ingebrigtsen
2011-06-27 15:43                                                                                 ` GPGME (was: netrc field encryption in auth-source) Ted Zlatanov
2011-06-27 21:47                                                                                   ` GPGME Daiki Ueno
2011-06-28 11:56                                                                                     ` GPGME Ted Zlatanov
2011-06-28 20:36                                                                                       ` GPGME Daiki Ueno
2011-06-29  8:07                                                                                         ` Daiki Ueno [this message]
2011-06-29  8:25                                                                                           ` secure plist store Lars Magne Ingebrigtsen
2011-06-29  9:05                                                                                             ` Daiki Ueno
2011-06-29 10:46                                                                                               ` Ted Zlatanov
2011-06-29 11:30                                                                                                 ` Daiki Ueno
2011-06-29 12:38                                                                                                   ` Ted Zlatanov
2011-06-29 13:39                                                                                                     ` Daiki Ueno
2011-06-29 10:54                                                                                           ` Ted Zlatanov
2011-06-29 11:59                                                                                             ` Daiki Ueno
2011-06-29 12:58                                                                                               ` Ted Zlatanov
2011-06-29 14:34                                                                                               ` Ted Zlatanov
2011-06-29 18:31                                                                                                 ` Daiki Ueno
2011-06-30 12:23                                                                                                   ` Ted Zlatanov
2011-06-30 23:10                                                                                                     ` Daiki Ueno
2011-07-01 13:36                                                                                                       ` Ted Zlatanov
2011-06-29 14:37                                                                                               ` Ted Zlatanov
2011-06-29 14:36                                                                                           ` Ted Zlatanov
2011-06-30  7:43                                                                                             ` Daiki Ueno
2011-06-30 12:19                                                                                               ` Ted Zlatanov
2011-06-30 13:42                                                                                                 ` Daiki Ueno
2011-06-30 14:54                                                                                                   ` Ted Zlatanov
2011-06-30 22:18                                                                                                     ` Daiki Ueno
2011-06-30 22:34                                                                                                       ` Ted Zlatanov
2011-07-01  2:28                                                                                                         ` Daiki Ueno
2011-07-01 13:18                                                                                                           ` Ted Zlatanov
2011-07-03  2:13                                                                                                             ` Daiki Ueno
2011-06-29 11:09                                                                                         ` GPGME Ted Zlatanov
2011-06-29 13:15                                                                                           ` GPGME Daiki Ueno
2011-06-29 17:21                                                                                             ` GPGME Ted Zlatanov
2011-06-29 18:41                                                                                               ` GPGME Daiki Ueno
2011-06-30 12:46                                                                                                 ` GPGME Ted Zlatanov
2011-06-02 13:09                                                                 ` Opportunistic STARTTLS in smtpmail.el Ted Zlatanov
2011-06-02 13:44                                                                   ` Daiki Ueno
2011-06-03 21:50                                                   ` Lars Magne Ingebrigtsen
2011-05-31  1:25                                       ` Stefan Monnier
2011-05-31 18:21                                         ` Lars Magne Ingebrigtsen
2011-05-31 21:18                                           ` Stefan Monnier
2011-06-03 21:48                                             ` Lars Magne Ingebrigtsen
2011-06-05 14:55                                               ` Ted Zlatanov
2011-06-09 18:02                                                 ` Lars Magne Ingebrigtsen
2011-06-09 21:06                                                   ` Ted Zlatanov
2011-06-10 16:05                                                   ` netrc field encryption in auth-source (was: Opportunistic STARTTLS in smtpmail.el) Ted Zlatanov
2011-06-13 21:47                                                     ` netrc field encryption in auth-source Ted Zlatanov
2011-06-13 22:21                                                       ` Lars Magne Ingebrigtsen
2011-06-15 16:20                                                       ` Lars Magne Ingebrigtsen
2011-06-15 21:21                                                         ` Lars Magne Ingebrigtsen
2011-06-16  3:49                                                         ` Ted Zlatanov
2011-06-16  8:32                                                           ` Robert Pluim
2011-06-16 13:35                                                             ` Ted Zlatanov
2011-06-16 20:28                                                               ` Reiner Steib
2011-06-16 21:05                                                                 ` Lars Magne Ingebrigtsen
2011-06-17  1:03                                                                 ` should docstrings include all defcustom options? (was: netrc field encryption in auth-source) Ted Zlatanov
2011-06-17  7:17                                                               ` netrc field encryption in auth-source Robert Pluim
2011-06-17  9:32                                                                 ` Ted Zlatanov
2011-06-17  9:53                                                                   ` Robert Pluim
2011-06-17 10:21                                                                   ` Ted Zlatanov
2011-06-21 19:32                                                           ` Lars Magne Ingebrigtsen
2011-06-21 19:51                                                             ` Ted Zlatanov
2011-06-21 20:19                                                               ` Committing new smtpmail.el later tonight (was: netrc field encryption in auth-source) Lars Magne Ingebrigtsen
2011-06-21 21:01                                                                 ` Committing new smtpmail.el later tonight Lars Magne Ingebrigtsen
2011-06-21 22:07                                                                   ` Antoine Levitt
2011-06-21 22:17                                                                     ` Lars Magne Ingebrigtsen
2011-06-21 22:25                                                                       ` Antoine Levitt
2011-06-21 22:36                                                                         ` Lars Magne Ingebrigtsen
2011-06-21 22:46                                                                           ` Lars Magne Ingebrigtsen
2011-06-21 22:57                                                                             ` Lars Magne Ingebrigtsen
2011-06-22  9:01                                                                               ` Antoine Levitt
2011-06-22  8:27                                                                           ` Robert Pluim
2011-06-22  8:30                                                                             ` Lars Magne Ingebrigtsen
2011-06-22  8:52                                                                               ` Robert Pluim
2011-06-22  9:11                                                                                 ` Lars Magne Ingebrigtsen
2011-06-22  9:17                                                                                 ` Lars Magne Ingebrigtsen
2011-06-22  9:34                                                                                   ` Robert Pluim
2011-06-22  9:41                                                                                     ` Lars Magne Ingebrigtsen
2011-06-22 14:25                                                                                       ` Lars Magne Ingebrigtsen
2011-06-22 14:49                                                                                         ` Lars Magne Ingebrigtsen
2011-06-22 17:45                                                                                           ` Robert Pluim
2011-06-22 18:48                                                                                             ` Lars Magne Ingebrigtsen
2011-06-23  8:01                                                                                               ` Robert Pluim
2011-06-22 15:51                                                                                         ` Ted Zlatanov
2011-06-22 19:24                                                                                           ` Lars Magne Ingebrigtsen
2011-06-22 20:27                                                                                             ` Ted Zlatanov
2011-06-22 20:43                                                                                               ` Lars Magne Ingebrigtsen
2011-06-22 21:36                                                                                                 ` Ted Zlatanov
2011-06-22  2:52                                                                   ` Eli Zaretskii
2011-06-22 14:53                                                                     ` Lars Magne Ingebrigtsen
2011-06-22 15:50                                                                       ` Robert Pluim
2011-06-22 16:19                                                                       ` Eli Zaretskii
2011-06-22 17:16                                                                         ` Ted Zlatanov
2011-06-22 19:50                                                                           ` Eli Zaretskii
2011-06-22 19:56                                                                             ` Lars Magne Ingebrigtsen
2011-06-22 21:32                                                                             ` Ted Zlatanov
2011-06-22 20:27                                                                           ` Stefan Monnier
2011-06-22 20:38                                                                             ` Lars Magne Ingebrigtsen
2011-06-22 20:53                                                                               ` Lars Magne Ingebrigtsen
2011-06-22 15:55                                                                     ` Ted Zlatanov
2011-06-22 16:51                                                                       ` Eli Zaretskii
2011-06-22 15:56                                                                 ` Ted Zlatanov
2011-06-30 13:16                                                               ` netrc field encryption in auth-source Ted Zlatanov
2011-06-06 15:06                                               ` Opportunistic STARTTLS in smtpmail.el Stefan Monnier
2011-06-09 17:56                                                 ` Lars Magne Ingebrigtsen
2011-06-10 20:44                                                   ` Stefan Monnier
2011-05-03 15:20                   ` client certs and CRL lists for GnuTLS (was: Opportunistic STARTTLS in smtpmail.el) Ted Zlatanov
2011-05-03 15:25                     ` client certs and CRL lists for GnuTLS Lars Magne Ingebrigtsen
2011-05-03 15:47                       ` Ted Zlatanov
2011-05-03 21:54                         ` Lars Magne Ingebrigtsen
2011-05-04  1:39                           ` Ted Zlatanov
2011-05-08 20:59                             ` Chong Yidong
2011-05-09 10:52                               ` Ted Zlatanov
2011-05-09 15:00                                 ` Chong Yidong
2011-05-09 15:30                                   ` Gnus ERT tests inside Emacs (was: client certs and CRL lists for GnuTLS) Ted Zlatanov
2011-05-09 15:46                                     ` Gnus ERT tests inside Emacs David Engster
2011-05-09 15:58                                       ` Ted Zlatanov
2011-05-11 21:36                                         ` Ted Zlatanov
2011-05-02  9:37           ` Emacs RPC security Julien Danjou
2011-05-02 18:57           ` Ted Zlatanov
2011-05-02 19:48             ` Stefan Monnier
2011-05-02 19:56               ` Ted Zlatanov
2011-05-02 22:56                 ` Lars Magne Ingebrigtsen
2011-05-03  0:25                   ` Ted Zlatanov
2011-05-03  0:51                     ` Lars Magne Ingebrigtsen
2011-05-03  1:12                       ` Ted Zlatanov
2011-05-03  1:16                         ` Lars Magne Ingebrigtsen
2011-05-03  1:27                           ` Ted Zlatanov
2011-05-03  1:34                             ` Lars Magne Ingebrigtsen
2011-05-03  2:35                           ` Stefan Monnier
2011-05-03  6:24                         ` Harald Hanche-Olsen
2011-05-03 13:47                           ` Stefan Monnier
2011-05-03  0:35                 ` Stefan Monnier
2011-04-26 12:13 ` Emacs RPC Sebastian Rose
2011-04-26 13:18   ` Stefan Monnier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m3oc1hys9u.fsf_-_-ueno@unixuser.org \
    --to=ueno@unixuser.org \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).