diff lisp/net/netrc.el @ 85712:a3c27999decb

Update Gnus to No Gnus 0.7 from the Gnus CVS trunk Revision: emacs@sv.gnu.org/emacs--devo--0--patch-911
author Miles Bader <miles@gnu.org>
date Sun, 28 Oct 2007 09:18:39 +0000
parents 84cf1e2214c5
children d549ccffa35b 880960b70474
line wrap: on
line diff
--- a/lisp/net/netrc.el	Sun Oct 28 04:58:17 2007 +0000
+++ b/lisp/net/netrc.el	Sun Oct 28 09:18:39 2007 +0000
@@ -32,27 +32,45 @@
 ;;; Code:
 
 ;;;
-;;; .netrc and .authinforc parsing
+;;; .netrc and .authinfo rc parsing
 ;;;
 
 (defalias 'netrc-point-at-eol
   (if (fboundp 'point-at-eol)
       'point-at-eol
     'line-end-position))
+;; autoload encrypt
+
+(eval-and-compile
+  (autoload 'encrypt-find-model "encrypt")
+  (autoload 'encrypt-insert-file-contents "encrypt"))
+
+(defgroup netrc nil
+ "Netrc configuration."
+ :group 'comm)
+
+(defvar netrc-services-file "/etc/services"
+  "The name of the services file.")
 
 (defun netrc-parse (file)
-  "Parse FILE and return a list of all entries in the 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
       (let ((tokens '("machine" "default" "login"
 		      "password" "account" "macdef" "force"
 		      "port"))
+	    (encryption-model (encrypt-find-model file))
 	    alist elem result pair)
-	(insert-file-contents file)
+
+	(if encryption-model
+	    (encrypt-insert-file-contents file encryption-model)
+	  (insert-file-contents file))
+
 	(goto-char (point-min))
 	;; Go through the file, line by line.
 	(while (not (eobp))
-	  (narrow-to-region (point) (netrc-point-at-eol))
+	  (narrow-to-region (point) (point-at-eol))
 	  ;; For each line, get the tokens and values.
 	  (while (not (eobp))
 	    (skip-chars-forward "\t ")
@@ -113,16 +131,79 @@
     (when result
       (setq result (nreverse result))
       (while (and result
-		  (not (equal (or port defaultport "nntp")
-			      (or (netrc-get (car result) "port")
-				  defaultport "nntp"))))
+		  (not (netrc-port-equal
+			(or port defaultport "nntp")
+			(or (netrc-get (car result) "port")
+			    defaultport "nntp"))))
 	(pop result))
       (car result))))
 
+(defun netrc-machine-user-or-password (mode authinfo-file-or-list machines ports defaults)
+  "Get the user name or password according to MODE from AUTHINFO-FILE-OR-LIST.
+Matches a machine from MACHINES and a port from PORTS, giving
+default ports DEFAULTS to `netrc-machine'.
+
+MODE can be \"login\" or \"password\", suitable for passing to
+`netrc-get'."
+  (let ((authinfo-list (if (stringp authinfo-file-or-list)
+			   (netrc-parse authinfo-file-or-list)
+			 authinfo-file-or-list))
+	(ports (or ports '(nil)))
+	(defaults (or defaults '(nil)))
+	info)
+    (dolist (machine machines)
+      (dolist (default defaults)
+	(dolist (port ports)
+	  (let ((alist (netrc-machine authinfo-list machine port default)))
+	  (setq info (or (netrc-get alist mode) info))))))
+    info))
+
 (defun netrc-get (alist type)
   "Return the value of token TYPE from ALIST."
   (cdr (assoc type alist)))
 
+(defun netrc-port-equal (port1 port2)
+  (when (numberp port1)
+    (setq port1 (or (netrc-find-service-name port1) port1)))
+  (when (numberp port2)
+    (setq port2 (or (netrc-find-service-name port2) port2)))
+  (equal port1 port2))
+
+(defun netrc-parse-services ()
+  (when (file-exists-p netrc-services-file)
+    (let ((services nil))
+      (with-temp-buffer
+	(insert-file-contents netrc-services-file)
+	(while (search-forward "#" nil t)
+	  (delete-region (1- (point)) (point-at-eol)))
+	(goto-char (point-min))
+	(while (re-search-forward
+		"^ *\\([^ \n\t]+\\)[ \t]+\\([0-9]+\\)/\\([^ \t\n]+\\)" nil t)
+	  (push (list (match-string 1) (string-to-number (match-string 2))
+		      (intern (downcase (match-string 3))))
+		services))
+	(nreverse services)))))
+
+(defun netrc-find-service-name (number &optional type)
+  (let ((services (netrc-parse-services))
+	service)
+    (setq type (or type 'tcp))
+    (while (and (setq service (pop services))
+		(not (and (= number (cadr service))
+			  (eq type (caddr service)))))
+      )
+    (car service)))
+
+(defun netrc-find-service-number (name &optional type)
+  (let ((services (netrc-parse-services))
+	service)
+    (setq type (or type 'tcp))
+    (while (and (setq service (pop services))
+		(not (and (string= name (car service))
+			  (eq type (caddr service)))))
+      )
+    (cadr service)))
+
 (provide 'netrc)
 
 ;;; arch-tag: af9929cc-2d12-482f-936e-eb4366f9fa55