summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJun Hao <jun_hao@aol.com>2016-04-24 14:43:06 +0200
committerLars Magne Ingebrigtsen <larsi@gnus.org>2016-04-24 14:43:06 +0200
commit97ecff0783128edeb6fe5f6e441993c9bbf2a25a (patch)
tree7c2360206ff452d5dc0ae118f2235002150bc683
parentef4ed84e72a323b3d29dc34df92d3f89ad4fc322 (diff)
downloademacs-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.el35
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))))