emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/xelb ddca322 2/2: Implement basic authentication during


From: Chris Feng
Subject: [elpa] externals/xelb ddca322 2/2: Implement basic authentication during connection setup
Date: Thu, 12 May 2016 16:18:44 +0000 (UTC)

branch: externals/xelb
commit ddca322b3ff473601cfa1e6ded834465b37ceb00
Author: Chris Feng <address@hidden>
Commit: Chris Feng <address@hidden>

    Implement basic authentication during connection setup
    
    * xcb.el (xcb:create-auth-info): Implement the MIT-MAGIC-COOKIE-1
    authentication protocol.
    (xcb:connect): Try sockets as well; deprecate the '_screen' argument.
    (xcb:display->socket): New function returns the socket path for an X11
    display name.
    (xcb:connect-to-display-with-auth-info): Use `xcb:create-auth-info';
    deprecate the '_screen' argument.
    (xcb:parse-display): Simplify regexps (don't know why they were written
    that way).
    (xcb:connect-to-socket): Use `xcb:display->socket' and 
`xcb:create-auth-info'.
---
 xcb.el |   60 ++++++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 44 insertions(+), 16 deletions(-)

diff --git a/xcb.el b/xcb.el
index 941d248..6cf9222 100644
--- a/xcb.el
+++ b/xcb.el
@@ -26,7 +26,6 @@
 ;; frequently used methods are:
 ;; + Open/Close connection
 ;;   - `xcb:connect'
-;;   - `xcb:connect-to-socket'
 ;;   - `xcb:disconnect'
 ;; + Request/Reply/Error (asynchronous)
 ;;   - `xcb:+request'
@@ -50,7 +49,6 @@
 ;; on what is going wrong.
 
 ;; Todo:
-;; + Authentication support when connecting to X server.
 ;; + Use XC-MISC extension for `xcb:generate-id' when IDs are used up.
 
 ;; References:
@@ -116,23 +114,34 @@ equal.  Otherwise a negative value would be returned."
    (data :initarg :data :initform "" :type string))
   :documentation "X connection authentication info.")
 
-(defun xcb:connect (&optional display screen)
-  "Connect to X server with display DISPLAY on screen SCREEN."
-  (xcb:connect-to-display-with-auth-info display nil screen))
+(defun xcb:connect (&optional display _screen)
+  "Connect to X server with display DISPLAY."
+  (declare (advertised-calling-convention (&optional display) "25.1"))
+  (unless display (setq display (frame-parameter nil 'display)))
+  (unless display (error "[XELB] No X display available"))
+  (let ((socket (xcb:display->socket display)))
+    (if (file-exists-p socket)
+        (xcb:connect-to-socket socket)
+      (xcb:connect-to-display-with-auth-info display))))
+
+(defun xcb:display->socket (display)
+  "Convert X11 display DISPLAY to its corresponding socket."
+  (concat "/tmp/.X11-unix/X"
+          (replace-regexp-in-string ".*:\\([^\\.]+\\).*" "\\1" display)))
 
 (defun xcb:connect-to-display-with-auth-info (&optional display auth _screen)
-  "Connect to X server with display DISPLAY, auth info AUTH on screen _SCREEN."
+  "Connect to X server with display DISPLAY, auth info AUTH."
+  (declare (advertised-calling-convention (&optional display auth) "25.1"))
   (unless display (setq display (frame-parameter nil 'display)))
   (unless display (error "[XELB] No X display available"))
   (let* ((tmp (xcb:parse-display display))
          (host (cdr (assoc 'host tmp)))
          (host (if (string= "" host) 'local host))
          (dpy (cdr (assoc 'display tmp)))
-         ;; (_screen (or _screen (cdr (assoc 'screen tmp))))
          (process (make-network-process :name "XELB"
                                         :host host
                                         :service (+ 6000 dpy)))
-         (auth-info (if auth auth (make-instance 'xcb:auth-info)))
+         (auth-info (if auth auth (xcb:create-auth-info)))
          (connection (make-instance 'xcb:connection
                                     :process process
                                     :display display :auth-info auth-info)))
@@ -142,14 +151,36 @@ equal.  Otherwise a negative value would be returned."
 (defun xcb:parse-display (name)
   "Parse X Display name NAME."
   (let ((host (replace-regexp-in-string "\\(.*\\):.*" "\\1" name))
-        (display
-         (replace-regexp-in-string ".*:\\([^\\.]+\\)\\(\\..*\\)?" "\\1" name))
+        (display (replace-regexp-in-string ".*:\\([^\\.]+\\).*" "\\1" name))
         (screen
-         (replace-regexp-in-string ".*:[^\\.]+\\.?\\(.*\\)?" "\\1" name)))
+         (replace-regexp-in-string ".*:[^\\.]+\\.?\\(.*\\)" "\\1" name)))
     (setq display (string-to-number display))
     (setq screen (if (string= "" screen) 0 (string-to-number screen)))
     `((host . ,host) (display . ,display) (screen . ,screen))))
 
+(defun xcb:create-auth-info ()
+  "Create the default `auth-info'."
+  (let ((xauth-output (shell-command-to-string
+                       "xauth list ${DISPLAY#localhost} 2>/dev/null"))
+        (name "MIT-MAGIC-COOKIE-1") ;only support MIT-MAGIC-COOKIE-1 protocol.
+        (data ""))
+    (if (string= "" xauth-output)
+        ;; No xauth entry available.
+        (setq name "")
+      (setq xauth-output (split-string xauth-output))
+      (if (string= name (car (last xauth-output 2)))
+          ;; The auth data is a 128-bit hex string.
+          (setq data
+                (concat
+                 (cl-loop for i in (number-sequence 0 30 2)
+                          collect (string-to-number
+                                   (substring (car (last xauth-output))
+                                              i (+ i 2))
+                                   16))))
+        ;; No xauth entry available.
+        (setq name "")))
+    (make-instance 'xcb:auth-info :name name :data data)))
+
 (defun xcb:connect-to-socket (&optional socket auth-info)
   "Connect to X server with socket SOCKET and authentication info AUTH-INFO."
   (unless (or socket (frame-parameter nil 'display))
@@ -163,12 +194,9 @@ equal.  Otherwise a negative value would be returned."
                       (replace-regexp-in-string "^.*?\\([0-9.]+\\)$" "\\1"
                                                 socket)))
       (setq display (frame-parameter nil 'display)
-            socket (concat "/tmp/.X11-unix/X"
-                           (replace-regexp-in-string
-                            ".*:\\([^\\.]+\\)\\(\\..*\\)?" "\\1"
-                            display))))
+            socket (xcb:display->socket display)))
     (let* ((process (make-network-process :name "XELB" :remote socket))
-           (auth (if auth-info auth-info (make-instance 'xcb:auth-info)))
+           (auth (if auth-info auth-info (xcb:create-auth-info)))
            (connection (make-instance 'xcb:connection
                                       :process process :display display
                                       :auth-info auth :socket socket)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]