それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Keychain のコピー確認セキュリティ・ダイアログを何とかする

iCloud キーチェーンにlocal キーチェーンを大量にコピーしようとしたら

OSXのローカル・キーチェーンにあるパスワード変更を、iCloud キーチェーンにコピーししようとしたら

f:id:takuya_1st:20160531150819j:plain

ダイアログが出てきます。

OSXのアカウント・パスワードを入力してEnter押せばいいんだけど。とてもとてもじゃないけど800件も押してられない。

どうしよう?自動化だ!

ということで、AppleScript(JavaScript)を使って、自動化することにした。

パスワード入力フォームの処理

keychain をコピーしようとして表示されるダイアログは、Keychains.app が SecurityAgent によりアクセス権を要求している処理になる。

なので、 SecurityAgent が出している画面です。

var my_password = "*PASSWORD*"
var p  = app.processes.byName("SecurityAgent")


var w = p.windows.at(0)

var pass = w.textFields.at(0)
pass.value = my_password

var btn = w.buttons[1] //常に許可
btn.click()

この処理で常に許可を押し続けることが出来る。

既存と重複項目があるとき

重複項目があるときにコピーを拒否される動作は、Keychain側でパスワードエントリの重複を検出している。

したがって、このエラーダイアログを処理するには

var app = Application("System Events")

var p  = app.processes.byName("Keychain Access")

if ( p.windows.length > 1 )
{
 var w = p.windows.at(0)
 if (w.roleDescription() == "ダイアログ" ){
    btn = w.buttons[0]
   if (btn.name() == "OK") {
        btn.click()
    }
  }
}

このように、Keychainからダイアログのを探すことにした。

このふたつを組み合わせて

このふたつを組み合わせて、無限ループにしてやると、放っておくことで800件のKeychainの移動ができる。便利!

var app = Application("System Events")
var my_password = "***********"

var Sa = function (){
    var p  = app.processes.byName("SecurityAgent")

    try{
        p.id()
    }catch(e){
        return ;
    }

    if ( p.windows.length > 0 ) {
        var w = p.windows.at(0)
        var pass = w.textFields.at(0)
        pass.value = my_password
        var btn = w.buttons[1]
        btn.click()
    }


}

var Kc = function (){
  var p  = app.processes.byName("Keychain Access")
    try{
      if ( p.windows.length > 0 ){
     var w = p.windows.at(0)

   if (w.roleDescription() == "ダイアログ" ){
      btn = w.buttons[0]
     if (btn.name() == "OK") {
        btn.click()
      }
    }
        }

    }catch(e){
        return        ;
    }

}

while(1){
    delay(1.0)
    Sa()
    delay(1.0)
    Kc()
    delay(1.0)
}

自動化はすばらしい

キーチェーンをコピーするだけで絶望してたのがなんとかなった。

security コマンドすらアクセス出来ない iCloud キーチェーンって使い勝手悪過ぎなんだよ。。。

>security コマンド

iCloudが使えれば最高なんだけど無理っぽいんですよね

takuya@~/Desktop$ security list-keychains
    "/Users/takuya/Library/Keychains/login.keychain"
    "/Library/Keychains/System.keychain"

ログインのユーザーごとのキーチェーンしか出てこない。。。。

ここに icloud がないから、UI自動化なんて面倒なことをやらないといけないんだよ。

昔は使えたのになぁ。