aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/net
diff options
context:
space:
mode:
authorMichael Albinus2020-06-09 13:43:30 +0200
committerMichael Albinus2020-06-09 13:43:30 +0200
commit4b21759b6f06f4560e5c8d7e4c52ce5c55393957 (patch)
treedaaec99610479ff2e0494630396bcd3bcea2c7c6 /lisp/net
parent3b93549597f187989e5508b638f297d0244e5cc6 (diff)
downloademacs-4b21759b6f06f4560e5c8d7e4c52ce5c55393957.tar.gz
emacs-4b21759b6f06f4560e5c8d7e4c52ce5c55393957.zip
Continue implementation of tramp-crypt.el
* lisp/net/tramp-crypt.el (tramp-crypt-do-encrypt-or-decrypt-file): Add leading "/" to infile. (tramp-crypt-add-directory): Fix docstring. Expand NAME. (tramp-crypt-remove-directory) (tramp-crypt-handle-file-name-all-completions) (tramp-crypt-handle-set-file-times): New defuns. (tramp-crypt-handle-file-executable-p) (tramp-crypt-handle-file-readable-p) (tramp-crypt-handle-file-system-info) (tramp-crypt-handle-set-file-modes): Fix implementation. * test/lisp/net/tramp-tests.el: Adapt call convention for (tramp--test-crypt-p).
Diffstat (limited to 'lisp/net')
-rw-r--r--lisp/net/tramp-crypt.el87
1 files changed, 64 insertions, 23 deletions
diff --git a/lisp/net/tramp-crypt.el b/lisp/net/tramp-crypt.el
index 220a4add91f..d9ba2e49f76 100644
--- a/lisp/net/tramp-crypt.el
+++ b/lisp/net/tramp-crypt.el
@@ -67,8 +67,6 @@
67 67
68;; If a remote directory shall not include crypted files anymore, it 68;; If a remote directory shall not include crypted files anymore, it
69;; must be indicated by the command `tramp-crypt-remove-directory'. 69;; must be indicated by the command `tramp-crypt-remove-directory'.
70;; Existing crypted files will be transformed into their unencrypted
71;; file names and contents.
72 70
73;;; Code: 71;;; Code:
74 72
@@ -160,7 +158,7 @@ If NAME doesn't belong to a crypted remote directory, retun nil."
160 (directory-files-and-attributes 158 (directory-files-and-attributes
161 . tramp-handle-directory-files-and-attributes) 159 . tramp-handle-directory-files-and-attributes)
162 (dired-compress-file . ignore) 160 (dired-compress-file . ignore)
163 ;; (dired-uncache . tramp-crypt-handle-dired-uncache) 161 (dired-uncache . tramp-handle-dired-uncache)
164 (exec-path . ignore) 162 (exec-path . ignore)
165 ;; `expand-file-name' performed by default handler. 163 ;; `expand-file-name' performed by default handler.
166 (file-accessible-directory-p . tramp-handle-file-accessible-directory-p) 164 (file-accessible-directory-p . tramp-handle-file-accessible-directory-p)
@@ -173,10 +171,10 @@ If NAME doesn't belong to a crypted remote directory, retun nil."
173 (file-in-directory-p . tramp-handle-file-in-directory-p) 171 (file-in-directory-p . tramp-handle-file-in-directory-p)
174 (file-local-copy . tramp-handle-file-local-copy) 172 (file-local-copy . tramp-handle-file-local-copy)
175 (file-modes . tramp-handle-file-modes) 173 (file-modes . tramp-handle-file-modes)
176 ;; (file-name-all-completions . tramp-crypt-handle-file-name-all-completions) 174 (file-name-all-completions . tramp-crypt-handle-file-name-all-completions)
177 ;; `file-name-as-directory' performed by default handler. 175 ;; `file-name-as-directory' performed by default handler.
178 ;; (file-name-case-insensitive-p . ignore) 176 (file-name-case-insensitive-p . ignore)
179 ;; (file-name-completion . tramp-handle-file-name-completion) 177 (file-name-completion . tramp-handle-file-name-completion)
180 ;; `file-name-directory' performed by default handler. 178 ;; `file-name-directory' performed by default handler.
181 ;; `file-name-nondirectory' performed by default handler. 179 ;; `file-name-nondirectory' performed by default handler.
182 ;; `file-name-sans-versions' performed by default handler. 180 ;; `file-name-sans-versions' performed by default handler.
@@ -193,11 +191,11 @@ If NAME doesn't belong to a crypted remote directory, retun nil."
193 (file-system-info . tramp-crypt-handle-file-system-info) 191 (file-system-info . tramp-crypt-handle-file-system-info)
194 ;; (file-truename . tramp-crypt-handle-file-truename) 192 ;; (file-truename . tramp-crypt-handle-file-truename)
195 ;; (file-writable-p . ignore) 193 ;; (file-writable-p . ignore)
196 (find-backup-file-name . ignore) 194 (find-backup-file-name . tramp-handle-find-backup-file-name)
197 ;; `get-file-buffer' performed by default handler. 195 ;; `get-file-buffer' performed by default handler.
198 (insert-directory . tramp-crypt-handle-insert-directory) 196 (insert-directory . tramp-crypt-handle-insert-directory)
199 ;; `insert-file-contents' performed by default handler. 197 ;; `insert-file-contents' performed by default handler.
200 ;; (load . tramp-crypt-handle-load) 198 (load . tramp-handle-load)
201 (make-auto-save-file-name . tramp-handle-make-auto-save-file-name) 199 (make-auto-save-file-name . tramp-handle-make-auto-save-file-name)
202 (make-directory . tramp-crypt-handle-make-directory) 200 (make-directory . tramp-crypt-handle-make-directory)
203 ;; (make-directory-internal . tramp-crypt-handle-not-implemented) 201 ;; (make-directory-internal . tramp-crypt-handle-not-implemented)
@@ -209,8 +207,8 @@ If NAME doesn't belong to a crypted remote directory, retun nil."
209 (set-file-acl . ignore) 207 (set-file-acl . ignore)
210 (set-file-modes . tramp-crypt-handle-set-file-modes) 208 (set-file-modes . tramp-crypt-handle-set-file-modes)
211 (set-file-selinux-context . ignore) 209 (set-file-selinux-context . ignore)
212 ;; (set-file-times . tramp-crypt-handle-not-implemented) 210 (set-file-times . tramp-crypt-handle-set-file-times)
213 ;; (set-visited-file-modtime . tramp-handle-set-visited-file-modtime) 211 (set-visited-file-modtime . tramp-handle-set-visited-file-modtime)
214 (shell-command . ignore) 212 (shell-command . ignore)
215 (start-file-process . ignore) 213 (start-file-process . ignore)
216 ;; `substitute-in-file-name' performed by default handler. 214 ;; `substitute-in-file-name' performed by default handler.
@@ -218,7 +216,7 @@ If NAME doesn't belong to a crypted remote directory, retun nil."
218 ;; `tramp-set-file-uid-gid' performed by default handler. 216 ;; `tramp-set-file-uid-gid' performed by default handler.
219 ;; (unhandled-file-name-directory . ignore) 217 ;; (unhandled-file-name-directory . ignore)
220 (vc-registered . ignore) 218 (vc-registered . ignore)
221 ;; (verify-visited-file-modtime . tramp-handle-verify-visited-file-modtime) 219 (verify-visited-file-modtime . tramp-handle-verify-visited-file-modtime)
222 (write-region . tramp-handle-write-region)) 220 (write-region . tramp-handle-write-region))
223 "Alist of handler functions for crypt method. 221 "Alist of handler functions for crypt method.
224Operations not mentioned here will be handled by the default Emacs primitives.") 222Operations not mentioned here will be handled by the default Emacs primitives.")
@@ -434,7 +432,8 @@ If OP ist `decrypt', the basename of INFILE must be an encrypted file name."
434 (if (eq op 'encrypt) 'raw-text coding-system-for-write))) 432 (if (eq op 'encrypt) 'raw-text coding-system-for-write)))
435 (tramp-crypt-send-command 433 (tramp-crypt-send-command
436 crypt-vec "cat" (and (eq op 'encrypt) "--reverse") 434 crypt-vec "cat" (and (eq op 'encrypt) "--reverse")
437 (file-name-directory infile) (file-name-nondirectory infile)) 435 (file-name-directory infile)
436 (concat "/" (file-name-nondirectory infile)))
438 (with-current-buffer (tramp-get-connection-buffer crypt-vec) 437 (with-current-buffer (tramp-get-connection-buffer crypt-vec)
439 (write-region nil nil outfile))))) 438 (write-region nil nil outfile)))))
440 439
@@ -452,18 +451,35 @@ See `tramp-crypt-do-encrypt-or-decrypt-file'."
452(defun tramp-crypt-add-directory (name) 451(defun tramp-crypt-add-directory (name)
453 "Mark remote directory NAME for encryption. 452 "Mark remote directory NAME for encryption.
454Files in that directory and all subdirectories will be encrypted 453Files in that directory and all subdirectories will be encrypted
455bofore copying to, and decrypted after copying from that 454before copying to, and decrypted after copying from that
456directory. File names will be also encrypted." 455directory. File names will be also encrypted."
457 (interactive "DRemote directory name: ") 456 (interactive "DRemote directory name: ")
458 (unless tramp-crypt-enabled 457 (unless tramp-crypt-enabled
459 (tramp-user-error nil "Feature is not enabled.")) 458 (tramp-user-error nil "Feature is not enabled."))
460 (unless (and (tramp-tramp-file-p name) (file-directory-p name)) 459 (unless (and (tramp-tramp-file-p name) (file-directory-p name))
461 (tramp-user-error nil "%s must be an existing remote directory." name)) 460 (tramp-user-error nil "%s must be an existing remote directory." name))
462 (setq name (file-name-as-directory name)) 461 (setq name (file-name-as-directory (expand-file-name name)))
463 (unless (member name tramp-crypt-directories) 462 (unless (member name tramp-crypt-directories)
464 (setq tramp-crypt-directories `(,name . ,tramp-crypt-directories))) 463 (setq tramp-crypt-directories (cons name tramp-crypt-directories)))
465 (tramp-register-file-name-handlers)) 464 (tramp-register-file-name-handlers))
466 465
466(defun tramp-crypt-remove-directory (name)
467 "Unmark remote directory NAME for encryption.
468Existing files in that directory and its subdirectories will be
469kept in their encrypted form."
470 (interactive "DRemote directory name: ")
471 (unless tramp-crypt-enabled
472 (tramp-user-error nil "Feature is not enabled."))
473 (setq name (file-name-as-directory (expand-file-name name)))
474 (when (and (member name tramp-crypt-directories)
475 (delete
476 tramp-crypt-encfs-config
477 (directory-files name nil directory-files-no-dot-files-regexp))
478 (yes-or-no-p
479 "There exist encrypted files, do you want to continue? "))
480 (setq tramp-crypt-directories (delete name tramp-crypt-directories))
481 (tramp-register-file-name-handlers)))
482
467;; `auth-source' requires a user. 483;; `auth-source' requires a user.
468(defun tramp-crypt-dissect-file-name (name) 484(defun tramp-crypt-dissect-file-name (name)
469 "Return a `tramp-file-name' structure for NAME. 485 "Return a `tramp-file-name' structure for NAME.
@@ -647,18 +663,35 @@ absolute file names."
647 663
648(defun tramp-crypt-handle-file-executable-p (filename) 664(defun tramp-crypt-handle-file-executable-p (filename)
649 "Like `file-executable-p' for Tramp files." 665 "Like `file-executable-p' for Tramp files."
650 (tramp-crypt-run-real-handler 666 (let (tramp-crypt-enabled)
651 #'file-executable-p (list (tramp-crypt-encrypt-file-name filename)))) 667 (file-executable-p (tramp-crypt-encrypt-file-name filename))))
668
669(defun tramp-crypt-handle-file-name-all-completions (filename directory)
670 "Like `file-name-all-completions' for Tramp files."
671 (all-completions
672 filename
673 (let* (completion-regexp-list
674 tramp-crypt-enabled
675 (directory (file-name-as-directory directory))
676 (enc-dir (tramp-crypt-encrypt-file-name directory)))
677 (mapcar
678 (lambda (x)
679 (substring
680 (tramp-crypt-decrypt-file-name (concat enc-dir x))
681 (length directory)))
682 (file-name-all-completions "" enc-dir)))))
652 683
653(defun tramp-crypt-handle-file-readable-p (filename) 684(defun tramp-crypt-handle-file-readable-p (filename)
654 "Like `file-readable-p' for Tramp files." 685 "Like `file-readable-p' for Tramp files."
655 (tramp-crypt-run-real-handler 686 (let (tramp-crypt-enabled)
656 #'file-readable-p (list (tramp-crypt-encrypt-file-name filename)))) 687 (file-readable-p (tramp-crypt-encrypt-file-name filename))))
657 688
658(defun tramp-crypt-handle-file-system-info (filename) 689(defun tramp-crypt-handle-file-system-info (filename)
659 "Like `file-system-info' for Tramp files." 690 "Like `file-system-info' for Tramp files."
660 (tramp-crypt-run-real-handler 691 (tramp-crypt-run-real-handler
661 #'file-system-info (list (tramp-crypt-encrypt-file-name filename)))) 692 ;; `file-system-info' exists since Emacs 27.1. Then, we can use
693 ;; #'file-system-info.
694 'file-system-info (list (tramp-crypt-encrypt-file-name filename))))
662 695
663(defun tramp-crypt-handle-insert-directory 696(defun tramp-crypt-handle-insert-directory
664 (filename switches &optional wildcard full-directory-p) 697 (filename switches &optional wildcard full-directory-p)
@@ -714,9 +747,17 @@ absolute file names."
714 "Like `set-file-modes' for Tramp files." 747 "Like `set-file-modes' for Tramp files."
715 (with-parsed-tramp-file-name filename nil 748 (with-parsed-tramp-file-name filename nil
716 (tramp-flush-file-properties v localname) 749 (tramp-flush-file-properties v localname)
717 (tramp-crypt-run-real-handler 750 (let (tramp-crypt-enabled)
718 #'set-file-modes 751 (tramp-compat-set-file-modes
719 (list (tramp-crypt-encrypt-file-name filename) mode flag)))) 752 (tramp-crypt-encrypt-file-name filename) mode flag))))
753
754(defun tramp-crypt-handle-set-file-times (filename &optional time flag)
755 "Like `set-file-times' for Tramp files."
756 (with-parsed-tramp-file-name filename nil
757 (tramp-flush-file-properties v localname)
758 (let (tramp-crypt-enabled)
759 (tramp-compat-set-file-times
760 (tramp-crypt-encrypt-file-name filename) time flag))))
720 761
721(add-hook 'tramp-unload-hook 762(add-hook 'tramp-unload-hook
722 (lambda () 763 (lambda ()