]> git.eshelyaron.com Git - emacs.git/commitdiff
lisp/auth-source-pass.el: Keep legitimate spaces inside data
authorTino Calancha <tino.calancha@gmail.com>
Sun, 27 Jun 2021 15:53:30 +0000 (17:53 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 2 Jul 2021 10:53:35 +0000 (12:53 +0200)
Users should be able to store a field as follows:
message: remember: Destroy the image and you will break the enemy

and later, recover the message untouched, i.e.:
"remember: Destroy the image and you will break the enemy"

* lisp/auth-source-pass.el (auth-source-pass--parse-data): Preserve
inner spaces at data.
* test/lisp/auth-source-pass-tests.el
(auth-source-pass-parse-with-colons-in-data): Add test.

lisp/auth-source-pass.el
test/lisp/auth-source-pass-tests.el

index c512c6fe4fa55f824213c251e9738b72d20a8623..914f8d2f1bf74a6e9a3d19b9edb322f7809f3a51 100644 (file)
@@ -167,15 +167,13 @@ The secret is the first line of CONTENTS."
 (defun auth-source-pass--parse-data (contents)
   "Parse the password-store data in the string CONTENTS and return an alist.
 CONTENTS is the contents of a password-store formatted file."
-  (let ((lines (split-string contents "\n" t "[ \t]+")))
+  (let ((lines (cdr (split-string contents "\n" t "[ \t]+"))))
     (seq-remove #'null
                 (mapcar (lambda (line)
-                          (let ((pair (mapcar (lambda (s) (string-trim s))
-                                              (split-string line ":"))))
-                            (when (> (length pair) 1)
-                              (cons (car pair)
-                                    (mapconcat #'identity (cdr pair) ":")))))
-                        (cdr lines)))))
+                          (when-let ((pos (seq-position line ?:)))
+                            (cons (string-trim (substring line 0 pos))
+                                  (string-trim (substring line (1+ pos))))))
+                        lines))))
 
 (defun auth-source-pass--do-debug (&rest msg)
   "Call `auth-source-do-debug` with MSG and a prefix."
index a2f84f20e8ef6fa00ce3ce70fc2ef63c47bd5e54..d050ac5b69532da7a179baa90d8e8c34b429a3ab 100644 (file)
                    '(("key1" . "val1")
                      ("key2" . "val2"))))))
 
+(ert-deftest auth-source-pass-parse-with-colons-in-data ()
+  (let ((content "pass\n--\nkey1 :val1\nkey2: please: keep my space after colon\n\n"))
+    (should (equal (auth-source-pass--parse-data content)
+                   '(("key1" . "val1")
+                     ("key2" . "please: keep my space after colon"))))))
+
 (defvar auth-source-pass--debug-log nil
   "Contains a list of all messages passed to `auth-source-do-debug`.")