diff options
| author | Michael Albinus | 2020-06-09 13:43:30 +0200 |
|---|---|---|
| committer | Michael Albinus | 2020-06-09 13:43:30 +0200 |
| commit | 4b21759b6f06f4560e5c8d7e4c52ce5c55393957 (patch) | |
| tree | daaec99610479ff2e0494630396bcd3bcea2c7c6 /lisp/net | |
| parent | 3b93549597f187989e5508b638f297d0244e5cc6 (diff) | |
| download | emacs-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.el | 87 |
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. |
| 224 | Operations not mentioned here will be handled by the default Emacs primitives.") | 222 | Operations 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. |
| 454 | Files in that directory and all subdirectories will be encrypted | 453 | Files in that directory and all subdirectories will be encrypted |
| 455 | bofore copying to, and decrypted after copying from that | 454 | before copying to, and decrypted after copying from that |
| 456 | directory. File names will be also encrypted." | 455 | directory. 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. | ||
| 468 | Existing files in that directory and its subdirectories will be | ||
| 469 | kept 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 () |