(uncompface): Be verbose when changing `uncompface-use-external'.
[gnus] / lisp / netrc.el
index 184128e..b561885 100644 (file)
 ;;; Code:
 
 ;;;
-;;; .netrc and .authinforc parsing
+;;; .netrc and .authinfo rc parsing
 ;;;
 
+;; autoload password
+(eval-and-compile
+  (autoload 'password-read "password"))
+
+(defgroup netrc nil
+ "Netrc configuration.")
+
+(defcustom netrc-encrypting-method nil
+  "Decoding method used for the netrc file.
+Use the OpenSSL symmetric ciphers here.  Leave nil for no
+decoding.  Encrypt the file with netrc-encrypt, but make sure you
+have set netrc-encrypting-method to a non-nil value."
+  :type '(choice
+         (const :tag "DES-3" "des3")
+         (const :tag "IDEA" "idea")
+         (const :tag "RC4" "rc4")
+         (string :tag "Explicit cipher name")
+         (const :tag "None" nil))
+  :group 'netrc)
+
+(defcustom netrc-openssl-path (executable-find "openssl")
+  "File path of the OpenSSL shell."
+  :type '(choice (file :tag "Location of openssl")
+                (const :tag "openssl is not installed" nil))
+  :group 'netrc)
+
+(defun netrc-encrypt (plain-file encrypted-file)
+  (interactive "fPlain File: \nFEncrypted File: ")
+  "Encrypt FILE to ENCRYPTED-FILE with netrc-encrypting-method cipher."
+  (when (and (file-exists-p plain-file)
+            (stringp encrypted-file)
+            netrc-encrypting-method
+            netrc-openssl-path)
+    (let ((buffer-file-coding-system 'binary)
+         (coding-system-for-read 'binary)
+         (coding-system-for-write 'binary)
+         (password 
+          (password-read
+           (format "OpenSSL Password for cipher %s? "
+                   netrc-encrypting-method)
+           (format "netrc-openssl-password-%s"
+                   netrc-encrypting-method))))
+      (when password
+       (with-temp-buffer
+         (insert-file-contents plain-file)
+         (setenv "NETRC_OPENSSL_PASSWORD" password)
+         (shell-command-on-region 
+          (point-min) 
+          (point-max)
+          (format "%s %s -pass env:NETRC_OPENSSL_PASSWORD -e"
+                  netrc-openssl-path
+                  netrc-encrypting-method)
+          t
+          t)
+         (write-file encrypted-file t))))))
+
 (defun netrc-parse (file)
+  (interactive "fFile to Parse: ")
   "Parse FILE and return an list of all entries in the file."
   (when (file-exists-p file)
     (with-temp-buffer
                      "password" "account" "macdef" "force"
                      "port"))
            alist elem result pair)
-       (insert-file-contents file)
+       (if (and netrc-encrypting-method
+                netrc-openssl-path)
+           (let ((buffer-file-coding-system 'binary)
+                 (coding-system-for-read 'binary)
+                 (coding-system-for-write 'binary)
+                 (password 
+                  (password-read
+                   (format "OpenSSL Password for cipher %s? "
+                           netrc-encrypting-method)
+                   (format "netrc-openssl-password-%s" 
+                           netrc-encrypting-method))))
+             (when password
+               (insert-file-contents file)
+               (setenv "NETRC_OPENSSL_PASSWORD" password)
+               (shell-command-on-region
+                (point-min) 
+                (point-max)
+                (format "%s %s -pass env:NETRC_OPENSSL_PASSWORD -d"
+                        netrc-openssl-path
+                        netrc-encrypting-method)
+                t
+                t)))
+         (insert-file-contents file))
        (goto-char (point-min))
        ;; Go through the file, line by line.
        (while (not (eobp))