emacs-diffs
[Top][All Lists]
Advanced

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

master b3e7d04: Rearrange detecting remote uid and gid in Tramp


From: Michael Albinus
Subject: master b3e7d04: Rearrange detecting remote uid and gid in Tramp
Date: Sun, 14 Jun 2020 09:31:26 -0400 (EDT)

branch: master
commit b3e7d046c3a94556fcaf6f9ce72aa2ecb20262a6
Author: Michael Albinus <michael.albinus@gmx.de>
Commit: Michael Albinus <michael.albinus@gmx.de>

    Rearrange detecting remote uid and gid in Tramp
    
    * lisp/net/tramp-adb.el (tramp-adb-file-name-handler-alist):
    * lisp/net/tramp-archive.el (tramp-archive-file-name-handler-alist):
    * lisp/net/tramp-rclone.el (tramp-rclone-file-name-handler-alist):
    * lisp/net/tramp-smb.el (tramp-smb-file-name-handler-alist):
    Add `tramp-get-remote-gid' and 'tramp-get-remote-uid'.
    
    * lisp/net/tramp-crypt.el (tramp-crypt-file-name-handler-alist):
    Add `file-ownership-preserved-p'.
    (tramp-crypt-add-directory): Check, that NAME is not quoted.
    (tramp-crypt-handle-file-ownership-preserved-p): New defun.
    (tramp-crypt-handle-insert-directory): Fix docstring.
    
    * lisp/net/tramp-gvfs.el (tramp-gvfs-file-name-handler-alist):
    Add `tramp-get-remote-gid' and 'tramp-get-remote-uid'.
    (tramp-gvfs-handle-file-readable-p): Call `tramp-get-remote-uid'.
    (tramp-gvfs-handle-get-remote-uid)
    (tramp-gvfs-handle-get-remote-gid): Rename from
    `tramp-gvfs-get-remote-{uid,gid}'.  Do not cache result.
    (tramp-gvfs-maybe-open-connection): No special handling for remote
    uid and gid.
    
    * lisp/net/tramp-sh.el (tramp-sh-file-name-handler-alist):
    Add `tramp-get-remote-gid' and 'tramp-get-remote-uid'.
    (tramp-sh-handle-get-remote-uid, tramp-sh-handle-get-remote-gid):
    Rename from `tramp-get-remote-{uid,gid}'.  Do not cache result.
    (tramp-sh-handle-file-ownership-preserved-p): Distinguish by GROUP
    when caching.
    
    * lisp/net/tramp-sudoedit.el (tramp-sudoedit-file-name-handler-alist):
    Add `tramp-get-remote-gid' and 'tramp-get-remote-uid'.
    (tramp-sudoedit-handle-get-remote-uid)
    (tramp-sudoedit-handle-get-remote-gid): Rename from
    `tramp-sudoedit-get-remote-{uid,gid}'.  Do not cache result.
    (tramp-sudoedit-handle-set-file-uid-gid)
    (tramp-sudoedit-handle-write-region): Call `tramp-get-remote-uid'
    and `tramp-get-remote-gid'.
    (tramp-sudoedit-maybe-open-connection): No special handling for
    remote uid and gid.
    
    * lisp/net/tramp.el (tramp-file-name-for-operation):
    Add `tramp-get-remote-gid' and 'tramp-get-remote-uid'.
    (tramp-handle-write-region, tramp-check-cached-permissions):
    Call `tramp-get-remote-uid' and `tramp-get-remote-gid'.
    (tramp-get-remote-uid, tramp-get-remote-gid): New defuns.
    (tramp-local-host-p): Simplify `tramp-get-remote-uid' call.
    
    * test/lisp/net/tramp-tests.el (tramp-test17-dired-with-wildcards)
    Skip if needed.
---
 lisp/net/tramp-adb.el        |  2 ++
 lisp/net/tramp-archive.el    |  4 ++-
 lisp/net/tramp-crypt.el      | 14 +++++++--
 lisp/net/tramp-gvfs.el       | 68 +++++++++++++++---------------------------
 lisp/net/tramp-rclone.el     |  2 ++
 lisp/net/tramp-sh.el         | 70 ++++++++++++++++----------------------------
 lisp/net/tramp-smb.el        |  2 ++
 lisp/net/tramp-sudoedit.el   | 37 ++++++++++-------------
 lisp/net/tramp.el            | 51 ++++++++++++++++++++++++--------
 test/lisp/net/tramp-tests.el |  2 ++
 10 files changed, 126 insertions(+), 126 deletions(-)

diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el
index fb98805..a7a5047 100644
--- a/lisp/net/tramp-adb.el
+++ b/lisp/net/tramp-adb.el
@@ -160,6 +160,8 @@ It is used for TCP/IP devices."
     (start-file-process . tramp-handle-start-file-process)
     (substitute-in-file-name . tramp-handle-substitute-in-file-name)
     (temporary-file-directory . tramp-handle-temporary-file-directory)
+    (tramp-get-remote-gid . ignore)
+    (tramp-get-remote-uid . ignore)
     (tramp-set-file-uid-gid . ignore)
     (unhandled-file-name-directory . ignore)
     (vc-registered . ignore)
diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el
index 24ee6fa..9502cc3 100644
--- a/lisp/net/tramp-archive.el
+++ b/lisp/net/tramp-archive.el
@@ -279,7 +279,9 @@ It must be supported by libarchive(3).")
     (start-file-process . tramp-archive-handle-not-implemented)
     ;; `substitute-in-file-name' performed by default handler.
     (temporary-file-directory . tramp-archive-handle-temporary-file-directory)
-    ;; `tramp-set-file-uid-gid' performed by default handler.
+    (tramp-get-remote-gid . ignore)
+    (tramp-get-remote-uid . ignore)
+    (tramp-set-file-uid-gid . ignore)
     (unhandled-file-name-directory . ignore)
     (vc-registered . ignore)
     (verify-visited-file-modtime . tramp-handle-verify-visited-file-modtime)
diff --git a/lisp/net/tramp-crypt.el b/lisp/net/tramp-crypt.el
index e63d836..4f01f1b 100644
--- a/lisp/net/tramp-crypt.el
+++ b/lisp/net/tramp-crypt.el
@@ -182,7 +182,7 @@ If NAME doesn't belong to a crypted remote directory, retun 
nil."
     (file-notify-add-watch . ignore)
     (file-notify-rm-watch . ignore)
     (file-notify-valid-p . ignore)
-    ;; (file-ownership-preserved-p . ignore)
+    (file-ownership-preserved-p . 
tramp-crypt-handle-file-ownership-preserved-p)
     (file-readable-p . tramp-crypt-handle-file-readable-p)
     (file-regular-p . tramp-handle-file-regular-p)
     ;; `file-remote-p' performed by default handler.
@@ -213,6 +213,8 @@ If NAME doesn't belong to a crypted remote directory, retun 
nil."
     (start-file-process . ignore)
     ;; `substitute-in-file-name' performed by default handler.
     ;; (temporary-file-directory . tramp-crypt-handle-temporary-file-directory)
+    ;; `tramp-get-remote-gid' performed by default handler.
+    ;; `tramp-get-remote-uid' performed by default handler.
     (tramp-set-file-uid-gid . tramp-crypt-handle-set-file-uid-gid)
     ;; (unhandled-file-name-directory . ignore)
     (vc-registered . ignore)
@@ -465,6 +467,8 @@ directory.  File names will be also encrypted."
     (tramp-user-error nil "Feature is not enabled."))
   (unless (and (tramp-tramp-file-p name) (file-directory-p name))
     (tramp-user-error nil "%s must be an existing remote directory." name))
+  (when (tramp-compat-file-name-quoted-p name)
+    (tramp-user-error nil "%s must not be quoted." name))
   (setq name (file-name-as-directory (expand-file-name name)))
   (unless (member name tramp-crypt-directories)
     (setq tramp-crypt-directories (cons name tramp-crypt-directories)))
@@ -694,6 +698,11 @@ absolute file names."
   (let (tramp-crypt-enabled)
     (file-readable-p (tramp-crypt-encrypt-file-name filename))))
 
+(defun tramp-crypt-handle-file-ownership-preserved-p (filename &optional group)
+  "Like `file-ownership-preserved-p' for Tramp files."
+  (let (tramp-crypt-enabled)
+    (file-ownership-preserved-p (tramp-crypt-encrypt-file-name filename) 
group)))
+
 (defun tramp-crypt-handle-file-system-info (filename)
   "Like `file-system-info' for Tramp files."
   (tramp-crypt-run-real-handler
@@ -708,7 +717,8 @@ absolute file names."
 
 (defun tramp-crypt-handle-insert-directory
   (filename switches &optional wildcard full-directory-p)
-  "Like `insert-directory' for Tramp files."
+  "Like `insert-directory' for Tramp files.
+WILDCARD is not supported."
   ;; This package has been added to Emacs 27.1.
   (when (load "text-property-search" 'noerror 'nomessage)
     (let (tramp-crypt-enabled)
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index 89e9b13..36166ad 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -821,6 +821,8 @@ It has been changed in GVFS 1.14.")
     (start-file-process . ignore)
     (substitute-in-file-name . tramp-handle-substitute-in-file-name)
     (temporary-file-directory . tramp-handle-temporary-file-directory)
+    (tramp-get-remote-gid . tramp-gvfs-handle-get-remote-gid)
+    (tramp-get-remote-uid . tramp-gvfs-handle-get-remote-uid)
     (tramp-set-file-uid-gid . tramp-gvfs-handle-set-file-uid-gid)
     (unhandled-file-name-directory . ignore)
     (vc-registered . ignore)
@@ -1506,7 +1508,7 @@ If FILE-SYSTEM is non-nil, return file system attributes."
               ;; If the user is different from what we guess to be
               ;; the user, we don't know.  Let's check, whether
               ;; access is restricted explicitly.
-              (and (/= (tramp-gvfs-get-remote-uid v 'integer)
+              (and (/= (tramp-get-remote-uid v 'integer)
                        (tramp-compat-file-attribute-user-id
                         (file-attributes filename 'integer)))
                    (not
@@ -1589,6 +1591,26 @@ If FILE-SYSTEM is non-nil, return file system 
attributes."
               (current-time)
             time)))))
 
+(defun tramp-gvfs-handle-get-remote-uid (vec id-format)
+  "The uid of the remote connection VEC, in ID-FORMAT.
+ID-FORMAT valid values are `string' and `integer'."
+  (if (equal id-format 'string)
+      (tramp-file-name-user vec)
+    (when-let
+       ((localname (tramp-get-connection-property vec "default-location" nil)))
+      (tramp-compat-file-attribute-user-id
+       (file-attributes
+       (tramp-make-tramp-file-name vec localname) id-format)))))
+
+(defun tramp-gvfs-handle-get-remote-gid (vec id-format)
+  "The gid of the remote connection VEC, in ID-FORMAT.
+ID-FORMAT valid values are `string' and `integer'."
+  (when-let
+      ((localname (tramp-get-connection-property vec "default-location" nil)))
+    (tramp-compat-file-attribute-group-id
+     (file-attributes
+      (tramp-make-tramp-file-name vec localname) id-format))))
+
 (defun tramp-gvfs-handle-set-file-uid-gid (filename &optional uid gid)
   "Like `tramp-set-file-uid-gid' for Tramp files."
   (with-parsed-tramp-file-name filename nil
@@ -2057,39 +2079,6 @@ and 
\"org.gtk.Private.RemoteVolumeMonitor.VolumeRemoved\" signals."
 
 ;; Connection functions.
 
-(defun tramp-gvfs-get-remote-uid (vec id-format)
-  "The uid of the remote connection VEC, in ID-FORMAT.
-ID-FORMAT valid values are `string' and `integer'."
-  (with-tramp-connection-property vec (format "uid-%s" id-format)
-    (let ((user (tramp-file-name-user vec))
-         (localname
-          (tramp-get-connection-property vec "default-location" nil)))
-      (cond
-       ((and (equal id-format 'string) user))
-       (localname
-       (tramp-compat-file-attribute-user-id
-        (file-attributes
-         (tramp-make-tramp-file-name vec localname) id-format)))
-       ((equal id-format 'integer) tramp-unknown-id-integer)
-       ((equal id-format 'string) tramp-unknown-id-string)))))
-
-(defun tramp-gvfs-get-remote-gid (vec id-format)
-  "The gid of the remote connection VEC, in ID-FORMAT.
-ID-FORMAT valid values are `string' and `integer'."
-  (with-tramp-connection-property vec (format "gid-%s" id-format)
-    (let ((localname
-          (tramp-get-connection-property vec "default-location" nil)))
-      (cond
-       (localname
-       (tramp-compat-file-attribute-group-id
-        (file-attributes
-         (tramp-make-tramp-file-name vec localname) id-format)))
-       ((equal id-format 'integer) tramp-unknown-id-integer)
-       ((equal id-format 'string) tramp-unknown-id-string)))))
-
-(defvar tramp-gvfs-get-remote-uid-gid-in-progress nil
-  "Indication, that remote uid and gid determination is in progress.")
-
 (defun tramp-gvfs-get-remote-prefix (vec)
   "The prefix of the remote connection VEC.
 This is relevant for GNOME Online Accounts."
@@ -2229,16 +2218,7 @@ connection if a previous connection has died for some 
reason."
 
        ;; Mark it as connected.
        (tramp-set-connection-property
-        (tramp-get-connection-process vec) "connected" t))))
-
-  ;; In `tramp-check-cached-permissions', the connection properties
-  ;; "{uid,gid}-{integer,string}" are used.  We set them to proper values.
-  (unless tramp-gvfs-get-remote-uid-gid-in-progress
-    (let ((tramp-gvfs-get-remote-uid-gid-in-progress t))
-      (tramp-gvfs-get-remote-uid vec 'integer)
-      (tramp-gvfs-get-remote-gid vec 'integer)
-      (tramp-gvfs-get-remote-uid vec 'string)
-      (tramp-gvfs-get-remote-gid vec 'string))))
+        (tramp-get-connection-process vec) "connected" t)))))
 
 (defun tramp-gvfs-gio-tool-p (vec)
   "Check, whether the gio tool is available."
diff --git a/lisp/net/tramp-rclone.el b/lisp/net/tramp-rclone.el
index 08bba33..f635d3c 100644
--- a/lisp/net/tramp-rclone.el
+++ b/lisp/net/tramp-rclone.el
@@ -135,6 +135,8 @@
     (start-file-process . ignore)
     (substitute-in-file-name . tramp-handle-substitute-in-file-name)
     (temporary-file-directory . tramp-handle-temporary-file-directory)
+    (tramp-get-remote-gid . ignore)
+    (tramp-get-remote-uid . ignore)
     (tramp-set-file-uid-gid . ignore)
     (unhandled-file-name-directory . ignore)
     (vc-registered . ignore)
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index bcbb724..fad841a 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -1039,6 +1039,8 @@ of command line.")
     (start-file-process . tramp-handle-start-file-process)
     (substitute-in-file-name . tramp-handle-substitute-in-file-name)
     (temporary-file-directory . tramp-handle-temporary-file-directory)
+    (tramp-get-remote-gid . tramp-sh-handle-get-remote-gid)
+    (tramp-get-remote-uid . tramp-sh-handle-get-remote-uid)
     (tramp-set-file-uid-gid . tramp-sh-handle-set-file-uid-gid)
     (unhandled-file-name-directory . ignore)
     (vc-registered . tramp-sh-handle-vc-registered)
@@ -1467,6 +1469,26 @@ of."
            (if (eq flag 'nofollow) "-h" "")
            (tramp-shell-quote-argument localname)))))))
 
+(defun tramp-sh-handle-get-remote-uid (vec id-format)
+  "The uid of the remote connection VEC, in ID-FORMAT.
+ID-FORMAT valid values are `string' and `integer'."
+  (ignore-errors
+    (cond
+     ((tramp-get-remote-id vec) (tramp-get-remote-uid-with-id vec id-format))
+     ((tramp-get-remote-perl vec) (tramp-get-remote-uid-with-perl vec 
id-format))
+     ((tramp-get-remote-python vec)
+      (tramp-get-remote-uid-with-python vec id-format)))))
+
+(defun tramp-sh-handle-get-remote-gid (vec id-format)
+  "The gid of the remote connection VEC, in ID-FORMAT.
+ID-FORMAT valid values are `string' and `integer'."
+  (ignore-errors
+    (cond
+     ((tramp-get-remote-id vec) (tramp-get-remote-gid-with-id vec id-format))
+     ((tramp-get-remote-perl vec) (tramp-get-remote-gid-with-perl vec 
id-format))
+     ((tramp-get-remote-python vec)
+      (tramp-get-remote-gid-with-python vec id-format)))))
+
 (defun tramp-sh-handle-set-file-uid-gid (filename &optional uid gid)
   "Like `tramp-set-file-uid-gid' for Tramp files."
   ;; Modern Unices allow chown only for root.  So we might need
@@ -1669,8 +1691,10 @@ of."
 (defun tramp-sh-handle-file-ownership-preserved-p (filename &optional group)
   "Like `file-ownership-preserved-p' for Tramp files."
   (with-parsed-tramp-file-name filename nil
-    (with-tramp-file-property v localname "file-ownership-preserved-p"
-      (let ((attributes (file-attributes filename)))
+    (with-tramp-file-property
+       v localname
+       (format "file-ownership-preserved-p%s" (if group "-group" ""))
+      (let ((attributes (file-attributes filename 'integer)))
        ;; Return t if the file doesn't exist, since it's true that no
        ;; information would be lost by an (attempted) delete and create.
        (or (null attributes)
@@ -5778,27 +5802,6 @@ This command is returned only if 
`delete-by-moving-to-trash' is non-nil."
               "import os; print (os.getuid())"
     "import os, pwd; print ('\\\"' + pwd.getpwuid(os.getuid())[0] + 
'\\\"')"))))
 
-(defun tramp-get-remote-uid (vec id-format)
-  "The uid of the remote connection VEC, in ID-FORMAT.
-ID-FORMAT valid values are `string' and `integer'."
-  (with-tramp-connection-property vec (format "uid-%s" id-format)
-    (let ((res
-          (ignore-errors
-            (cond
-             ((tramp-get-remote-id vec)
-              (tramp-get-remote-uid-with-id vec id-format))
-             ((tramp-get-remote-perl vec)
-              (tramp-get-remote-uid-with-perl vec id-format))
-             ((tramp-get-remote-python vec)
-              (tramp-get-remote-uid-with-python vec id-format))))))
-      ;; Ensure there is a valid result.
-      (cond
-       ((and (equal id-format 'integer) (not (integerp res)))
-       tramp-unknown-id-integer)
-       ((and (equal id-format 'string) (not (stringp res)))
-       tramp-unknown-id-string)
-       (t res)))))
-
 (defun tramp-get-remote-gid-with-id (vec id-format)
   "Implement `tramp-get-remote-gid' for Tramp files using `id'."
   (tramp-send-command-and-read
@@ -5829,27 +5832,6 @@ ID-FORMAT valid values are `string' and `integer'."
               "import os; print (os.getgid())"
     "import os, grp; print ('\\\"' + grp.getgrgid(os.getgid())[0] + 
'\\\"')"))))
 
-(defun tramp-get-remote-gid (vec id-format)
-  "The gid of the remote connection VEC, in ID-FORMAT.
-ID-FORMAT valid values are `string' and `integer'."
-  (with-tramp-connection-property vec (format "gid-%s" id-format)
-    (let ((res
-          (ignore-errors
-            (cond
-             ((tramp-get-remote-id vec)
-              (tramp-get-remote-gid-with-id vec id-format))
-             ((tramp-get-remote-perl vec)
-              (tramp-get-remote-gid-with-perl vec id-format))
-             ((tramp-get-remote-python vec)
-              (tramp-get-remote-gid-with-python vec id-format))))))
-      ;; Ensure there is a valid result.
-      (cond
-       ((and (equal id-format 'integer) (not (integerp res)))
-       tramp-unknown-id-integer)
-       ((and (equal id-format 'string) (not (stringp res)))
-       tramp-unknown-id-string)
-       (t res)))))
-
 (defun tramp-get-remote-busybox (vec)
   "Determine remote `busybox' command."
   (with-tramp-connection-property vec "busybox"
diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el
index 2088d23..3980add 100644
--- a/lisp/net/tramp-smb.el
+++ b/lisp/net/tramp-smb.el
@@ -293,6 +293,8 @@ See `tramp-actions-before-shell' for more info.")
     (start-file-process . tramp-smb-handle-start-file-process)
     (substitute-in-file-name . tramp-smb-handle-substitute-in-file-name)
     (temporary-file-directory . tramp-handle-temporary-file-directory)
+    (tramp-get-remote-gid . ignore)
+    (tramp-get-remote-uid . ignore)
     (tramp-set-file-uid-gid . ignore)
     (unhandled-file-name-directory . ignore)
     (vc-registered . ignore)
diff --git a/lisp/net/tramp-sudoedit.el b/lisp/net/tramp-sudoedit.el
index 68e68a2..05242ff 100644
--- a/lisp/net/tramp-sudoedit.el
+++ b/lisp/net/tramp-sudoedit.el
@@ -132,6 +132,8 @@ See `tramp-actions-before-shell' for more info.")
     (start-file-process . ignore)
     (substitute-in-file-name . tramp-handle-substitute-in-file-name)
     (temporary-file-directory . tramp-handle-temporary-file-directory)
+    (tramp-get-remote-gid . tramp-sudoedit-handle-get-remote-gid)
+    (tramp-get-remote-uid . tramp-sudoedit-handle-get-remote-uid)
     (tramp-set-file-uid-gid . tramp-sudoedit-handle-set-file-uid-gid)
     (unhandled-file-name-directory . ignore)
     (vc-registered . ignore)
@@ -689,21 +691,19 @@ component is used as the target of the symlink."
            (tramp-flush-file-property v localname "file-selinux-context"))
          t)))))
 
-(defun tramp-sudoedit-get-remote-uid (vec id-format)
+(defun tramp-sudoedit-handle-get-remote-uid (vec id-format)
   "The uid of the remote connection VEC, in ID-FORMAT.
 ID-FORMAT valid values are `string' and `integer'."
-  (with-tramp-connection-property vec (format "uid-%s" id-format)
-    (if (equal id-format 'integer)
-       (tramp-sudoedit-send-command-and-read vec "id" "-u")
-      (tramp-sudoedit-send-command-string vec "id" "-un"))))
+  (if (equal id-format 'integer)
+      (tramp-sudoedit-send-command-and-read vec "id" "-u")
+    (tramp-sudoedit-send-command-string vec "id" "-un")))
 
-(defun tramp-sudoedit-get-remote-gid (vec id-format)
+(defun tramp-sudoedit-handle-get-remote-gid (vec id-format)
   "The gid of the remote connection VEC, in ID-FORMAT.
 ID-FORMAT valid values are `string' and `integer'."
-  (with-tramp-connection-property vec (format "gid-%s" id-format)
-    (if (equal id-format 'integer)
-       (tramp-sudoedit-send-command-and-read vec "id" "-g")
-      (tramp-sudoedit-send-command-string vec "id" "-gn"))))
+  (if (equal id-format 'integer)
+      (tramp-sudoedit-send-command-and-read vec "id" "-g")
+    (tramp-sudoedit-send-command-string vec "id" "-gn")))
 
 (defun tramp-sudoedit-handle-set-file-uid-gid (filename &optional uid gid)
   "Like `tramp-set-file-uid-gid' for Tramp files."
@@ -711,8 +711,8 @@ ID-FORMAT valid values are `string' and `integer'."
       (tramp-sudoedit-send-command
        v "chown"
        (format "%d:%d"
-              (or uid (tramp-sudoedit-get-remote-uid v 'integer))
-              (or gid (tramp-sudoedit-get-remote-gid v 'integer)))
+              (or uid (tramp-get-remote-uid v 'integer))
+              (or gid (tramp-get-remote-gid v 'integer)))
        (tramp-unquote-file-local-name filename))))
 
 (defun tramp-sudoedit-handle-write-region
@@ -721,10 +721,10 @@ ID-FORMAT valid values are `string' and `integer'."
   (with-parsed-tramp-file-name filename nil
     (let* ((uid (or (tramp-compat-file-attribute-user-id
                     (file-attributes filename 'integer))
-                   (tramp-sudoedit-get-remote-uid v 'integer)))
+                   (tramp-get-remote-uid v 'integer)))
           (gid (or (tramp-compat-file-attribute-group-id
                     (file-attributes filename 'integer))
-                   (tramp-sudoedit-get-remote-gid v 'integer)))
+                   (tramp-get-remote-gid v 'integer)))
           (flag (and (eq mustbenew 'excl) 'nofollow))
           (modes (tramp-default-file-modes filename flag)))
       (prog1
@@ -785,14 +785,7 @@ connection if a previous connection has died for some 
reason."
       (tramp-set-connection-local-variables vec)
 
       ;; Mark it as connected.
-      (tramp-set-connection-property p "connected" t))
-
-    ;; In `tramp-check-cached-permissions', the connection properties
-    ;; "{uid,gid}-{integer,string}" are used.  We set them to proper values.
-    (tramp-sudoedit-get-remote-uid vec 'integer)
-    (tramp-sudoedit-get-remote-gid vec 'integer)
-    (tramp-sudoedit-get-remote-uid vec 'string)
-    (tramp-sudoedit-get-remote-gid vec 'string)))
+      (tramp-set-connection-property p "connected" t))))
 
 (defun tramp-sudoedit-send-command (vec &rest args)
   "Send commands ARGS to connection VEC.
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index b045e41..f3c065e 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -2280,6 +2280,9 @@ Must be handled by the callers."
     (when (processp (nth 0 args))
       (with-current-buffer (process-buffer (nth 0 args))
        default-directory)))
+   ;; VEC.
+   ((member operation '(tramp-get-remote-gid tramp-get-remote-uid))
+    (tramp-make-tramp-file-name (nth 0 args)))
    ;; Unknown file primitive.
    (t (error "Unknown file I/O primitive: %s" operation))))
 
@@ -3903,10 +3906,12 @@ of."
     (let ((tmpfile (tramp-compat-make-temp-file filename))
          (modes (tramp-default-file-modes
                  filename (and (eq mustbenew 'excl) 'nofollow)))
-         (uid (tramp-compat-file-attribute-user-id
-               (file-attributes filename 'integer)))
-         (gid (tramp-compat-file-attribute-group-id
-               (file-attributes filename 'integer))))
+         (uid (or (tramp-compat-file-attribute-user-id
+                   (file-attributes filename 'integer))
+                  (tramp-get-remote-uid v 'integer)))
+         (gid (or (tramp-compat-file-attribute-group-id
+                   (file-attributes filename 'integer))
+                  (tramp-get-remote-gid v 'integer))))
       (when (and append (file-exists-p filename))
        (copy-file filename tmpfile 'ok))
       ;; The permissions of the temporary file should be set.  If
@@ -4612,12 +4617,8 @@ be granted."
                 (concat "file-attributes-" suffix) nil)
                (file-attributes
                 (tramp-make-tramp-file-name vec) (intern suffix))))
-              (remote-uid
-               (tramp-get-connection-property
-                vec (concat "uid-" suffix) nil))
-              (remote-gid
-               (tramp-get-connection-property
-                vec (concat "gid-" suffix) nil))
+              (remote-uid (tramp-get-remote-uid vec (intern suffix)))
+              (remote-gid (tramp-get-remote-gid vec (intern suffix)))
              (unknown-id
               (if (string-equal suffix "string")
                   tramp-unknown-id-string tramp-unknown-id-integer)))
@@ -4651,6 +4652,32 @@ be granted."
                        (tramp-compat-file-attribute-group-id
                         file-attr))))))))))))
 
+(defun tramp-get-remote-uid (vec id-format)
+  "The uid of the remote connection VEC, in ID-FORMAT.
+ID-FORMAT valid values are `string' and `integer'."
+  (with-tramp-connection-property vec (format "uid-%s" id-format)
+    (or (when-let
+           ((handler
+             (find-file-name-handler
+              (tramp-make-tramp-file-name vec) 'tramp-get-remote-uid)))
+         (funcall handler #'tramp-get-remote-uid vec id-format))
+       ;; Ensure there is a valid result.
+       (and (equal id-format 'integer) tramp-unknown-id-integer)
+       (and (equal id-format 'string) tramp-unknown-id-string))))
+
+(defun tramp-get-remote-gid (vec id-format)
+  "The gid of the remote connection VEC, in ID-FORMAT.
+ID-FORMAT valid values are `string' and `integer'."
+  (with-tramp-connection-property vec (format "gid-%s" id-format)
+    (or (when-let
+           ((handler
+             (find-file-name-handler
+              (tramp-make-tramp-file-name vec) 'tramp-get-remote-uid)))
+         (funcall handler #'tramp-get-remote-gid vec id-format))
+       ;; Ensure there is a valid result.
+       (and (equal id-format 'integer) tramp-unknown-id-integer)
+       (and (equal id-format 'string) tramp-unknown-id-string))))
+
 (defun tramp-local-host-p (vec)
   "Return t if this points to the local host, nil otherwise.
 This handles also chrooted environments, which are not regarded as local."
@@ -4673,9 +4700,7 @@ This handles also chrooted environments, which are not 
regarded as local."
        vec (tramp-compat-temporary-file-directory) 'nohop))
      ;; On some systems, chown runs only for root.
      (or (zerop (user-uid))
-        ;; This is defined in tramp-sh.el.  Let's assume this is
-        ;; loaded already.
-        (zerop (tramp-compat-funcall 'tramp-get-remote-uid vec 'integer))))))
+        (zerop (tramp-get-remote-uid vec 'integer))))))
 
 (defun tramp-get-remote-tmpdir (vec)
   "Return directory for temporary files on the remote host identified by VEC."
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index 9667b34..cb30a36 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -2998,6 +2998,8 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
   (skip-unless (tramp--test-enabled))
   (skip-unless (tramp--test-sh-p))
   (skip-unless (not (tramp--test-rsync-p)))
+  ;; Wildcards are not supported in tramp-crypt.el.
+  (skip-unless (not (tramp--test-crypt-p)))
   ;; Since Emacs 26.1.
   (skip-unless (fboundp 'insert-directory-wildcard-in-dir-p))
 



reply via email to

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