From: Magnus H. <leg...@us...> - 2007-08-29 01:45:44
|
Update of /cvsroot/emacs-jabber/emacs-jabber In directory sc8-pr-cvs17:/tmp/cvs-serv10930 Modified Files: jabber-conn.el jabber.el jabber-core.el jabber-sasl.el jabber-keymap.el jabber-util.el jabber-logon.el Log Message: Revision: ma...@fr...--2005/emacs-jabber--cvs-head--0--patch-396 Creator: Magnus Henoch <ma...@fr...> Add customization option for multiple accounts Based on a patch by Xavier Maillard. Index: jabber-sasl.el =================================================================== RCS file: /cvsroot/emacs-jabber/emacs-jabber/jabber-sasl.el,v retrieving revision 2.11 retrieving revision 2.12 diff -u -d -r2.11 -r2.12 --- jabber-sasl.el 24 Aug 2007 03:12:14 -0000 2.11 +++ jabber-sasl.el 29 Aug 2007 01:45:36 -0000 2.12 @@ -81,9 +81,11 @@ (cons client step)))))) (defun jabber-sasl-process-input (jc xml-data sasl-data) - (let ((sasl-read-passphrase (lexical-let ((bare-jid (jabber-connection-bare-jid jc))) - (lambda (prompt) - (jabber-read-password bare-jid prompt)))) + (let ((sasl-read-passphrase (lexical-let ((password (plist-get (fsm-get-state-data jc) :password)) + (bare-jid (jabber-connection-bare-jid jc))) + (if password + (lambda (prompt) password) + (lambda (prompt) (jabber-read-password bare-jid))))) (client (car sasl-data)) (step (cdr sasl-data))) (cond Index: jabber.el =================================================================== RCS file: /cvsroot/emacs-jabber/emacs-jabber/jabber.el,v retrieving revision 1.75 retrieving revision 1.76 diff -u -d -r1.75 -r1.76 --- jabber.el 24 Aug 2007 01:36:05 -0000 1.75 +++ jabber.el 29 Aug 2007 01:45:36 -0000 1.76 @@ -30,6 +30,43 @@ (defgroup jabber nil "Jabber instant messaging" :group 'applications) +(defcustom jabber-account-list nil + "List of Jabber accounts. +Each element of the list is a list describing a Jabber account +of the form (JID PASSWORD NETWORK-SERVER PORT CONNECTION-TYPE). + +JID is a full Jabber ID string (e.g. fo...@ba...d). You can also +specify the resource (e.g. fo...@ba...d/emacs). +PASSWORD is a string to authenticate ourself against the server. +It can be empty. +NETWORK-SERVER is a string identifying the address to connect to, +if it's different from the server part of the JID. +PORT is the port to use (default depends on connection type). +CONNECTION-TYPE is a symbol. Valid symbols are `starttls', +`network' and `ssl'. + +Only JID is mandatory. The rest can be guessed at run-time. + +Example: + ((\"xm...@ja.../emacs\" \"\" \"\" nil network) + (\"xm...@gm...\" \"\" \"talk.google.com\" 5223 ssl))" + :type '(repeat + (list :tag "Account information" + (string :tag "JID") + (string :tag "Password") + (string :tag "Network server") + (choice :tag "Port" + (const :tag "Default" nil) + (integer :tag "Override" 5222)) + (choice :tag "Connection type" + ;; XXX: detect whether we have STARTTLS? option + ;; for enforcing encryption? + (const :tag "STARTTLS" starttls) + (const :tag "Unencrypted" network) + (const :tag "Legacy SSL/TLS" ssl)))) + :group 'jabber-core) + +;; XXX: kill these four variables (defcustom jabber-username "emacs" "jabber username (user part of JID)" :type 'string @@ -70,6 +107,7 @@ :type 'integer :group 'jabber) +;; XXX: kill this one too (defcustom jabber-nickname jabber-username "jabber nickname, used in chat buffer prompts and as default groupchat nickname." :type 'string Index: jabber-util.el =================================================================== RCS file: /cvsroot/emacs-jabber/emacs-jabber/jabber-util.el,v retrieving revision 2.49 retrieving revision 2.50 diff -u -d -r2.49 -r2.50 --- jabber-util.el 24 Aug 2007 02:43:50 -0000 2.49 +++ jabber-util.el 29 Aug 2007 01:45:36 -0000 2.50 @@ -260,7 +260,7 @@ "Construct key for `password' library from BARE-JID." (concat "xmpp:" bare-jid)) -(defun jabber-read-password (bare-jid &optional prompt) +(defun jabber-read-password (bare-jid) "Read Jabber password, either from customized variable or from minibuffer. See `jabber-password'." (if jabber-password @@ -268,7 +268,7 @@ ;; variable jabber-password is a high-convenience low-security ;; alternative anyway. (copy-sequence jabber-password) - (let ((prompt (or prompt (format "Jabber password for %s: " bare-jid)))) + (let ((prompt (format "Jabber password for %s: " bare-jid))) (if (fboundp 'password-read-and-add) (password-read-and-add prompt (jabber-password-key bare-jid)) (read-passwd prompt))))) Index: jabber-core.el =================================================================== RCS file: /cvsroot/emacs-jabber/emacs-jabber/jabber-core.el,v retrieving revision 1.62 retrieving revision 1.63 diff -u -d -r1.62 -r1.63 --- jabber-core.el 28 Aug 2007 16:28:29 -0000 1.62 +++ jabber-core.el 29 Aug 2007 01:45:36 -0000 1.63 @@ -127,29 +127,77 @@ "Return non-nil if SASL functions are available." (featurep 'sasl)) -(defun jabber-connect (username server resource &optional registerp) - "connect to the jabber server and start a jabber xml stream -With prefix argument, register a new account." +(defun jabber-connect-all () + "Connect to all configured Jabber accounts. +See `jabber-account-list'. +If no accounts are configured, call `jabber-connect' interactively." + (interactive) + (if (null jabber-account-list) + (call-interactively 'jabber-connect) + ;; Only connect those accounts that are not yet connected. + (let ((already-connected (mapcar #'jabber-connection-bare-jid jabber-connections)) + (connected-one nil)) + (flet ((nonempty + (s) + (unless (zerop (length s)) s))) + (dolist (account jabber-account-list) + (unless (member (jabber-jid-user (car account)) already-connected) + (destructuring-bind (jid password network-server port connection-type) + account + (jabber-connect + (jabber-jid-username jid) + (jabber-jid-server jid) + (jabber-jid-resource jid) + nil (nonempty password) (nonempty network-server) + port connection-type)))))))) + +(defun jabber-connect (username server resource &optional + registerp password network-server + port connection-type) + "Connect to the Jabber server and start a Jabber XML stream. +With prefix argument, register a new account. +With double prefix argument, specify more connection details." (interactive - (let* ((default (when (and jabber-username jabber-server) - (if jabber-resource - (format "%s@%s/%s" - jabber-username - jabber-server - jabber-resource) - (format "%s@%s" - jabber-username - jabber-server)))) - (jid (read-string - (if default - (format "Enter your JID: (default %s) " default) - "Enter your JID: ") - nil nil default))) - (list (jabber-jid-username jid) - (jabber-jid-server jid) - (or (jabber-jid-resource jid) jabber-resource) - current-prefix-arg))) - ;; XXX: better way of specifying which account(s) to connect to. + (let* ((jid (completing-read "Enter your JID: " jabber-account-list)) + (entry (assoc jid jabber-account-list)) + password network-server port connection-type registerp) + (flet ((nonempty + (s) + (unless (zerop (length s)) s))) + (when entry + ;; If the user entered the JID of one of the preconfigured + ;; accounts, use that data. + (setq password (nonempty (nth 1 entry))) + (setq network-server (nonempty (nth 2 entry))) + (setq port (nth 3 entry)) + (setq connection-type (nth 4 entry))) + (when (equal current-prefix-arg '(16)) + ;; Double prefix arg: ask about everything. + ;; (except password, which is asked about later anyway) + (setq password nil) + (setq network-server + (read-string (format "Network server: (default `%s') " network-server) + nil nil network-server)) + (setq port + (car + (read-from-string + (read-string (format "Port: (default `%s') " port) + nil nil (if port (number-to-string port) "nil"))))) + (setq connection-type + (car + (read-from-string + (or (nonempty (completing-read + (format "Connection type: (default `%s') " connection-type) + '(("starttls" "network" "ssl")) t)) + (symbol-name connection-type))))) + (setq registerp (yes-or-no-p "Register new account? "))) + (when (equal current-prefix-arg '(4)) + (setq registerp t)) + + (list (jabber-jid-username jid) + (jabber-jid-server jid) + (jabber-jid-resource jid) + registerp password network-server port connection-type)))) (if (member (list username server) (mapcar @@ -164,26 +212,28 @@ ;;(jabber-clear-roster) (jabber-reset-choked) - (push (start-jabber-connection username - server - resource - registerp) + (push (start-jabber-connection username server resource + registerp password + network-server port connection-type) jabber-connections))) (define-state-machine jabber-connection - :start ((username server resource &optional registerp) + :start ((username server resource registerp password network-server port connection-type) "Start a Jabber connection." - (let ((connect-function - (jabber-get-connect-function jabber-connection-type)) + (let* ((connection-type + (or connection-type jabber-default-connection-type)) + (connect-function + (jabber-get-connect-function connection-type)) (send-function - (jabber-get-send-function jabber-connection-type))) - (funcall connect-function fsm server) + (jabber-get-send-function connection-type))) + (funcall connect-function fsm server network-server port) (list :connecting (list :send-function send-function :username username :server server :resource resource + :password password :registerp registerp))))) (define-enter-state jabber-connection nil Index: jabber-logon.el =================================================================== RCS file: /cvsroot/emacs-jabber/emacs-jabber/jabber-logon.el,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- jabber-logon.el 24 Aug 2007 03:12:14 -0000 1.14 +++ jabber-logon.el 29 Aug 2007 01:45:36 -0000 1.15 @@ -40,7 +40,8 @@ (let (auth) (if (jabber-xml-get-children (jabber-iq-query xml-data) 'digest) ;; SHA1 digest passwords allowed - (let ((passwd (jabber-read-password (jabber-connection-bare-jid jc)))) + (let ((passwd (or (plist-get (fsm-get-state-data jc) :password) + (jabber-read-password (jabber-connection-bare-jid jc))))) (if passwd (setq auth `(digest () ,(sha1 (concat session-id passwd)))))) ;; Plaintext passwords - allow on encrypted connections Index: jabber-keymap.el =================================================================== RCS file: /cvsroot/emacs-jabber/emacs-jabber/jabber-keymap.el,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- jabber-keymap.el 15 Apr 2007 23:53:09 -0000 1.9 +++ jabber-keymap.el 29 Aug 2007 01:45:36 -0000 1.10 @@ -41,7 +41,7 @@ (defvar jabber-global-keymap (let ((map (make-sparse-keymap))) - (define-key map "\C-c" 'jabber-connect) + (define-key map "\C-c" 'jabber-connect-all) (define-key map "\C-d" 'jabber-disconnect) (define-key map "\C-r" 'jabber-switch-to-roster-buffer) (define-key map "\C-j" 'jabber-chat-with) Index: jabber-conn.el =================================================================== RCS file: /cvsroot/emacs-jabber/emacs-jabber/jabber-conn.el,v retrieving revision 2.8 retrieving revision 2.9 diff -u -d -r2.8 -r2.9 --- jabber-conn.el 5 Feb 2007 21:59:02 -0000 2.8 +++ jabber-conn.el 29 Aug 2007 01:45:36 -0000 2.9 @@ -61,23 +61,24 @@ (integer :tag "Port number")) :group 'jabber-conn) -(defcustom jabber-connection-type +(defun jabber-have-starttls () + "Return true if we can use STARTTLS." + (and (featurep 'starttls) + (or (and (bound-and-true-p starttls-gnutls-program) + (executable-find starttls-gnutls-program)) + (and (bound-and-true-p starttls-program) + (executable-find starttls-program))))) + +(defconst jabber-default-connection-type (cond ;; Use STARTTLS if we can... - ((and (featurep 'starttls) - (or (and (bound-and-true-p starttls-gnutls-program) - (executable-find starttls-gnutls-program)) - (and (bound-and-true-p starttls-program) - (executable-find starttls-program)))) + ((jabber-have-starttls) 'starttls) ;; ...else default to unencrypted connection. (t 'network)) - "Type of connection to the jabber server, ssl or network most likely." - :type '(radio (const :tag "Encrypted connection, SSL" ssl) - (const :tag "Negotiate encrypted connection when available (STARTTLS)" starttls) - (const :tag "Standard TCP/IP connection" network)) - :group 'jabber-conn) + "Default connection type. +See `jabber-connect-methods'.") (defcustom jabber-connection-ssl-program nil "Program used for SSL/TLS connections. @@ -110,21 +111,21 @@ (let ((entry (assq jabber-connection-type jabber-connect-methods))) (nth 2 entry))) -(defun jabber-srv-targets (server) +(defun jabber-srv-targets (server network-server port) "Find host and port to connect to. +If NETWORK-SERVER and/or PORT are specified, use them. If we can't find SRV records, use standard defaults." - ;; XXX: per account ;; If the user has specified a host or a port, obey that. - (if (or jabber-network-server jabber-port) - (list (cons (or jabber-network-server server) - (or jabber-port 5222))) + (if (or network-server port) + (list (cons (or network-server server) + (or port 5222))) (or (condition-case nil (srv-lookup (concat "_xmpp-client._tcp." server)) (error nil)) (list (cons server 5222))))) ;; Plain TCP/IP connection -(defun jabber-network-connect (fsm server) +(defun jabber-network-connect (fsm server network-server port) "Connect to a Jabber server with a plain network connection. Send a message of the form (:connected CONNECTION) to FSM if connection succeeds. Send a message :connection-failed if @@ -132,7 +133,7 @@ ;; XXX: asynchronous connection (let ((coding-system-for-read 'utf-8) (coding-system-for-write 'utf-8) - (targets (jabber-srv-targets server))) + (targets (jabber-srv-targets server network-server port))) (catch 'connected (dolist (target targets) (condition-case e @@ -157,7 +158,7 @@ ;; SSL connection, we use openssl's s_client function for encryption ;; of the link ;; TODO: make this configurable -(defun jabber-ssl-connect (fsm server) +(defun jabber-ssl-connect (fsm server network-server port) "connect via OpenSSL or GnuTLS to a Jabber Server Send a message of the form (:connected CONNECTION) to FSM if connection succeeds. Send a message :connection-failed if @@ -179,8 +180,8 @@ (funcall connect-function "jabber" (generate-new-buffer jabber-process-buffer) - (or jabber-network-server server) - (or jabber-port 5223)))) + (or network-server server) + (or port 5223)))) (if connection (fsm-send fsm (list :connected connection)) (fsm-send fsm :connection-failed))))) @@ -191,14 +192,14 @@ (process-send-string connection string) (process-send-string connection "\n")) -(defun jabber-starttls-connect (fsm server) +(defun jabber-starttls-connect (fsm server network-server port) "Connect via GnuTLS to a Jabber Server. Send a message of the form (:connected CONNECTION) to FSM if connection succeeds. Send a message :connection-failed if connection fails." (let ((coding-system-for-read 'utf-8) (coding-system-for-write 'utf-8) - (targets (jabber-srv-targets server))) + (targets (jabber-srv-targets server network-server port))) (unless (fboundp 'starttls-open-stream) (error "starttls.el not available")) (catch 'connected |