Pages

Thursday, May 2, 2013

Auth-source in Emacs

前幾天將 Emacs 一口氣更新到 24.3 以後,發現有一堆東西都不太一樣了,一執行就回報一堆錯誤。畢竟現在已經有很多工作都在上面進行,工具有問題的話很麻煩,只好花點時間調整。

首先要找出有問題的套件,暫時移出路徑待修,結果一整理下來發現有一大堆根本不曉得為什麼存在的東西會報錯,把 mercurial log 叫出來一看才知道上次整修的時間已經是 2009 了。存在這麼多年卻完全沒印象的東西叫做垃圾,乾脆整個目錄都翻出來整理。(不過我要強調這只是倒垃圾,還不到 dot emacs bankruptcy 的程度XD)

後來在更新 g-client 設定時,發現在新版裡已經改用 auth-source 來取得認證所需的資訊。玩了一下發現這東西還真是不錯,可以把一些認證用的密碼資訊統一管理,並透過 api 來取得。大概瞭解運作方式後,馬上動手整合到跟認證有關的套件中。

auth-source 目前支援兩種用來取得認證資訊的 backend,分別是傳統的 .netrc 和 freedesktop 提出的 Secret Service API.netrc 雖然比較簡單,但對於有 un*x-like 環境使用經驗的人會比較熟悉,再加上 auth-source 支援 GPG 加密過的 .netrc,因此目標就是把敏感資訊都移到 .netrc 裡面管理。另一方面也是因為我沒有 Gnome 或 KDE 環境,沒辦法實驗 Secret Service API。

首先要告訴 auth-source 資料庫的位置,如果沒有特殊需求的話,預設會先找 ~/.authinfo,格式等同於 ~/.netrc。雖然這個檔案一般會將權限設為 600,但裡面存放的是明碼,總覺得不太保險。有使用 GPG 的話,可以將這個檔案加密使用,auth-source 可以處理加密後的檔案,預設檔名會是 ~/.authinfo.gpg。如果想改變存放位置,可以透過 auth-sources 指定路徑:

基本的 .netrc 內容格式如下:

machine <host> login <user> password <pass>

可以看到能儲存的資訊有 host、user、password 三種,而 auth-source 引入新的 key:port,可以用來儲存額外資訊,也可以當作搜尋時的 key 來使用。

使用方式並不難,只要透過 auth-source-search 這支函式,並在 spec 參數指定好用來搜尋的 key 就可以得到結果。例如我想取得某個站的認證密碼:

傳回來的資訊是一個 plist,可以透過 plist-get 取得需要的資訊。其中 secret 欄位的值有可能是一個用來取得真正密碼的函式,因此需要特別處理。除此之外,由於上面的例子中指定找不到就建立一組新資訊,在認證資訊不存在時,可以選擇是否儲存目前設定,一般會需要搭配 auth-source-creation-defaultsauth-source-creation-prompts 以提示使用者輸入不足的資訊:

同時,在第一次建立時也可以從 plist 取得儲存用的程序,直接執行就可以了。

執行這個函式會詢問儲存位置,也可以趁這個時候修改儲存內容。

完成這些工作,取得密碼後就可以丟給真正執行認證的函式處理了。

No comments:

Post a Comment