読者です 読者をやめる 読者になる 読者になる

それマグで!

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

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

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

osx

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自動化なんて面倒なことをやらないといけないんだよ。

昔は使えたのになぁ。

XMLHttpRequest で レスポンスを dom として html をパースする

javascript

xhr のリクエストでレスポンスをHTMLとして解釈する。

xhr で取得したHTMLをDOMとしてxpath/querySelectorしたい

var dom ;
xhr = new XMLHttpRequest()
xhr.responseType  = "document"
xhr.onload = function(e){ dom = e.target.responseXML;console.log(e.target.responseXML.title)}
xhr.open("get", "/" )
xhr.send()

ポイントは response type を設定すること。コレを設定するのが一番楽に解釈できる。

ていうか、コレ便利だわ。

dom として HTML parser に強制解釈させられるなら、JSON でレスポンス不要になるね

jsonだすより、HTMLでレスポンス書いて、Xpath/CSS Selector書いたほうが楽じゃんね。

iOS 9 で確認

iOS シミュレータの iOS 9 で確認したが、ちゃんと使うことが出来た。

iOS が対応してるなら、安心して使えますね。MDNにはSafari Mobile の対応状況が「?」になってるけどね。使えるんだから使おう。

どうせなら

response type で css とか js や image も使えるともっと便利なんだが。。 いちいちscript src / link rel style / new Image src を作るの面倒くさい

参考資料

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/HTML_in_XMLHttpRequest

残念。noip 無料DNSが30日毎に confirmation が必須化されたぽい

dyn に続き、 noip も制限がきつくなりました。

30日に一回はログインして confirm をクリックするか、メールで送られてきた、confirmation url にアクセスしないとダメなようだ

詳しくは no-ip の FAQ に youtube動画が貼られている。そこで解説されていた

noip の解説 → https://www.noip.com/support/knowledgebase/confirm-my-hostname-free-account-support-question-day/

どのような手順で更新するのか

メールが送られてきた

f:id:takuya_1st:20160529153718j:plain:w400

クリックすると、課金をurgeされる、課金しないを選ぶ。

f:id:takuya_1st:20160529153737j:plain:w400

re-captcha で not bot だと証明する。

f:id:takuya_1st:20160529153726j:plain:w400

つまり、無料ユーザ追い出しっぽい

無料ユーザは別のところに行けってことらしい。

困りましたねぇ。

買ってるドメイン名でDNSホスティングするにしても、TTL3600の、クソDNSサーバーしか提供されないGM●系とかばっかりだし。

さくらインターネットDNSサーバーか、GoogleDNSホスティング(google domains / google cloud dns ) しかないかなぁ。

クラウド運営するって結局サービス事業者の収益性によるポリシー変更1つで吹き飛ぶんだから、やっぱり過度に依存するのは考えものだわ