diff options
| author | Jun Hao <jun_hao@aol.com> | 2016-04-24 14:43:06 +0200 |
|---|---|---|
| committer | Lars Magne Ingebrigtsen <larsi@gnus.org> | 2016-04-24 14:43:06 +0200 |
| commit | 97ecff0783128edeb6fe5f6e441993c9bbf2a25a (patch) | |
| tree | 7c2360206ff452d5dc0ae118f2235002150bc683 | |
| parent | ef4ed84e72a323b3d29dc34df92d3f89ad4fc322 (diff) | |
| download | emacs-97ecff0783128edeb6fe5f6e441993c9bbf2a25a.tar.gz | |
Handle auth-source items with special characters on OS X
* lisp/auth-source.el
(auth-source-macos-keychain-search-items): Handle keychain
output correctly when has special chararcters (bug#22824).
| -rw-r--r-- | lisp/auth-source.el | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/lisp/auth-source.el b/lisp/auth-source.el index cfd21a523cd..d691b54d67e 100644 --- a/lisp/auth-source.el +++ b/lisp/auth-source.el @@ -1758,12 +1758,28 @@ entries for git.gnus.org: items))) items)) + +(defun auth-source--decode-octal-string (string) + "Convert octal string to utf-8 string. E.g: 'a\134b' to 'a\b'" + (let ((list (string-to-list string)) + (size (length string))) + (decode-coding-string + (apply #'unibyte-string + (loop for i = 0 then (+ i (if (eq (nth i list) ?\\) 4 1)) + for var = (nth i list) + while (< i size) + if (eq var ?\\) + collect (string-to-number + (concat (cl-subseq list (+ i 1) (+ i 4))) 8) + else + collect var)) + 'utf-8))) + (defun* auth-source-macos-keychain-search-items (coll _type _max host port &key label type user &allow-other-keys) - (let* ((keychain-generic (eq type 'macos-keychain-generic)) (args `(,(if keychain-generic "find-generic-password" @@ -1792,29 +1808,32 @@ entries for git.gnus.org: (goto-char (point-min)) (while (not (eobp)) (cond - ((looking-at "^password: \"\\(.+\\)\"$") + ((looking-at "^password: \\(?:0x[0-9A-F]+\\)? *\"\\(.+\\)\"") (setq ret (auth-source-macos-keychain-result-append ret keychain-generic "secret" - (lexical-let ((v (match-string 1))) + (lexical-let ((v (auth-source--decode-octal-string + (match-string 1)))) (lambda () v))))) ;; TODO: check if this is really the label ;; match 0x00000007 <blob>="AppleID" - ((looking-at "^[ ]+0x00000007 <blob>=\"\\(.+\\)\"") + ((looking-at + "^[ ]+0x00000007 <blob>=\\(?:0x[0-9A-F]+\\)? *\"\\(.+\\)\"") (setq ret (auth-source-macos-keychain-result-append ret keychain-generic "label" - (match-string 1)))) + (auth-source--decode-octal-string (match-string 1))))) ;; match "crtr"<uint32>="aapl" ;; match "svce"<blob>="AppleID" - ((looking-at "^[ ]+\"\\([a-z]+\\)\"[^=]+=\"\\(.+\\)\"") + ((looking-at + "^[ ]+\"\\([a-z]+\\)\"[^=]+=\\(?:0x[0-9A-F]+\\)? *\"\\(.+\\)\"") (setq ret (auth-source-macos-keychain-result-append ret keychain-generic - (match-string 1) - (match-string 2))))) + (auth-source--decode-octal-string (match-string 1)) + (auth-source--decode-octal-string (match-string 2)))))) (forward-line))) ;; return `ret' iff it has the :secret key (and (plist-get ret :secret) (list ret)))) |
