ラベル Ubiquity の投稿を表示しています。 すべての投稿を表示
ラベル Ubiquity の投稿を表示しています。 すべての投稿を表示

2010年8月22日日曜日

Ubiquity で不正な IP を調べる

以下のサイトでは、不正な IP がデータベース化されている。

DroneBL

DroneBL is a realtime monitor of abusable IPs, which has the goal of stopping abuse of infected machines.

EFnet RBL

The EFnet IRC Network RBL is comprised of a collection of data from several sources with the purpose of providing a "one stop shop" for IRC admins to block a multitude of undesirable clients.

Ubiquity でこれらのデータベースに IP アドレスを問い合わせ、何れかに登録されているかどうか調べたい。

インストールはこちらから。

使い方 : IP アドレスをブラウザ上で選択してから checkIP コマンドを実行。いづれかのデータベースに登録されている場合は true、そうでなければ false がプレビューに表示される。

 

ソースコードについて

上記二つのデータベースの問い合わせでは、単純にサイトの URL と IP を組み合わせてアクセスすると結果が HTML で返される。その中に含まれる文字列をチェックすることにより登録状態をチェック。

新たにデータベースを増やしたい場合は、問い合わせ先の URL と、問い合わせの結果が返されたら IP が存在することをチェックする述語 existp を記述して、dbSet に追加する。

CmdUtils.CreateCommand({
    names: ["checkIP"],
    preview: function preview(pblock, args){
        // プレビューをクリア
        pblock.innerHTML = "";
        
        /**
        * DB は IP を検索するサイト。
        *
        * {spec.url サイトの URL,
        * spec.existp サイトでの検索結果から、対象がサイトに存在するか判定する述語}
        *
        * @param {Object} spec
        */
        var db = function(spec){
            var that = {};
            
            // public --------------------------------------------
            
            /**
            * 与えられた IP が存在することを確認し、その結果に対して関数 f を適用する。
            * @param {Object} ip IP アドレス
            * @param {Function} f コールバック関数
            */
            var exists = function(ip, f){
                jq(ip, function(page){
                    f(spec.existp(page));
                });
            };
            that.exists = exists;
            
            /**
            * 与えられた IP に対する存否の結果ページを取得し、その結果に対して関数 f を適用する。
            * @param {Object} ip IP アドレス
            * @param {Function} f コールバック関数
            */
            var getHTML = function(ip, f){
                jq(ip, function(page){
                    f(page);
                });
            };
            that.getHTML = getHTML;
            
            // private --------------------------------------------
            
            /**
            * jQuery.get をラップした関数
            * @param {Object} ip
            * @param {Function} f
            */
            var jq = function(ip, f){
                jQuery.get(spec.url + ip, null, function(page){
                    f(page);
                });
            };
            
            return that;
        };
        
        /**
        * DB SET は検索対象の DB を集約。
        *
        * {spec.dbs db の配列}
        *
        * @param {Object} spec
        */
        var dbSet = function(spec){
            var that = {};
            
            /**
            * DB における IP アドレスの存否の結果を HTML で取得し、それに関数 f を適用する。
            * @param {Object} ip
            * @param {Function} f
            */
            var getHTML = function(ip, f){
                each(function(db){
                    db.getHTML(ip, function(page){
                        f(page);
                    });
                });
            };
            that.getHTML = getHTML;
            
            /**
            * いずれかの DB に与えられた IP が存在するか確認し、その結果に対して関数 f を適用する。
            *
            * @param {Object} ip
            * @param {Function} f
            */
            var exists = function(ip, f){
                var result = [];

                var allChecked = function(){
                    var b = false;
                    if (result.length === spec.dbs.length) {
                        for (var i = 0; i < spec.dbs.length; i++) {
                            b = b || result[i];
                        }
                        f(b);
                    }
                };
                
                each(function(db){
                    db.exists(ip, function(exists){
                        var idx = result.length;
                        exists ? result[idx] = true : result[idx] = false;
                        allChecked();
                    });
                });
            };
            that.exists = exists;
            
            // private ----------------------------------------------
            
            /**
            * 各 DB に対して関数 f を適用する
            * @param {Function} f
            */
            var each = function(f){
                for (var i = 0; i < spec.dbs.length; i++) {
                    f(spec.dbs[i]);
                }
            };
            
            return that;
        };
        
        // 各 DB の設定
        var dronebl = db({
            url: "http://dronebl.org/lookup_branded.do?ip=",
            existp: function(page){
                var msg = /This means that your IP is not listed in DroneBL/;
                return page.match(msg) ? false : true;
            }
        });
        
        var efnetrbl = db({
            url: "http://rbl.efnetrbl.org/?i=",
            existp: function(page){
                var msg = /was found in the database/;
                return page.match(msg) ? true : false;
            }
        });
        
        // ブラウザで選択された IP アドレス
        var ip = CmdUtils.getSelection("").match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/);
               
        // DB を集約
        dbSet({
            dbs: [dronebl, efnetrbl],
        }).exists(ip, function(b){
            pblock.innerHTML += b;
        });
    },
});

 

関連記事

2010年8月21日土曜日

Ubiquity で特定のサイトをプレビューに表示

Firefox のアドオン Ubiquity を使い、そのプレビューに特定のサイトの内容を表示したい。

予め下記のサイトの解説を読んでおき、基本的な書き方を確認。

API の解説は Ubiquity のコマンドで help 。 ハッキング にある 「コマンド API ドキュメント」 を参照。

 

Ubiquity とその他アプリケーションの設定

Ubiquity を使う前に、コマンド help > 各種設定 > 言語設定 において 「Parse 2 を使用」 のチェックをはずす。これがあるとコマンドが思ったように実行されなかった。

「ぴたすちお」 のようなマウスホイールの回転を 「カーソルの下のウィンドウに送る」設定がされている場合、Ubiquity 内のプレビューでスクロールができないので設定をはずしておく必要がある。

 

コマンドの編集

コマンド Command-Editor により、ブラウザ上でコードを編集できる。

コマンドテンプレートを挿入」 し、不必要なコードを削除。ここではコマンド名の設定とプレビューの表示関数だけ残す。

「ファイルに保存」 すると保存した場所が Ubiquity に記録されるので、後はエディタで直接編集するのが楽。

 

プレビューの表示

例えば、コマンド test を実行して、 Apple のサイトをプレビューに表示させたいとする。

iframe で外部サイトを表示させるなら、

CmdUtils.CreateCommand({
    names: ["test"],
    preview: function preview(pblock, args){
        pblock.innerHTML = '<iframe width="100%" height="475px" src="http://www.apple.com" />';
    },
});

preview 関数が Ubiquity のプレビュー表示に対応しており、その第1引数がプレビュー領域を指し示す。

 

テンプレートの使用

テンプレート機能を使うなら、「API ドキュメント」 より以下の関数を使う。

CmdUtils.renderTemplate(template, data)

Renders a template by substituting values from a dictionary. The templating language used is trimpath, which is defined at http://code.google.com/p/trimpath/wiki/JavaScriptTemplates.

renderTemplate 関数は第一引数がテンプレートで、第二引数は埋め込むデータ。

テンプレート内では、

${dataのプロパティ}

と記述することにより、値が置き換えられる。(詳しくは上記サイトを参照)

CmdUtils.CreateCommand({
    names: ["test"],
    preview: function preview(pblock, args){
        var data = {
            width: "100%",
            height: "475px",
            src: "http://www.apple.com"
        };
        var template = '<iframe width=${width} height=${height} src=${src} />';
        pblock.innerHTML = CmdUtils.renderTemplate(template, data);
    },
});

 

jQuery でアクセス

5 Documentation > Labs/Ubiquity/Bundled Libraries - MozillaWiki によると、

Ubiquity currently includes the following JavaScript libraries:

  • jQuery -- the awesome jQuery library
  • DateJS -- fantastic date natural language parser

Labs/Ubiquity/Ubiquity 0.1 Author Tutorial - MozillaWiki

Because we include jQuery with Ubiquity, it is simple to perform Ajax calls as well as parse returning data.

Ubiquity から他のサイトにアクセスするは jQuery を使えばいいと。

jQuery.get() – jQuery API によると

Description: Load data from the server using a HTTP GET request.

jQuery.get( url, [ data ], [ callback(data, textStatus, XMLHttpRequest) ], [ dataType ] )

  • url A string containing the URL to which the request is sent.
  • data A map or string that is sent to the server with the request.
  • callback(data, textStatus, XMLHttpRequest) A callback function that is executed if the request succeeds.
  • dataType The type of data expected from the server.

これを使うなら、

CmdUtils.CreateCommand({
    names: ["test"],
    preview: function preview(pblock, args){
        jQuery.get("http://www.apple.com", null, function(page){
            pblock.innerHTML = page;
        });
    },
});

 

選択された文字列の取得

URL を表わす文字列`http://XXXXX.XX.XXX’ があった場合、XXXXX.XX.XXX の部分を選択した後、コマンドを入力したらそのサイトをプレビューに表示するように変更したい。

ブラウザ中の選択した文字列を取得するには、API の CmdUtils より、

CmdUtils inherits ContextUtils. The methods are wrapped so that the context argument isn't needed. (i.e. CmdUtils.getSelection("") is equivalent to ContextUtils.getSelection(context, ""))

CmdUtils は ContextUtils を継承しているということなので、API の ContextUtils を見ると、

ContextUtils.getSelection(context, joint = "\n\n")

Returns a string containing the text and just the text of the user's current selection, i.e. with HTML tags stripped out.

joint is an optional string to join multiple selections.

これを使い、

CmdUtils.CreateCommand({
    names: ["test"],
    preview: function preview(pblock, args){
        jQuery.get("http://" + CmdUtils.getSelection(""), null, function(page){
            pblock.innerHTML = page;
        });
    },
});

 

jQuery.get の代替となる関数

CmdUtils には jQuery.get の代替となる  関数が定義されている。違いは、

The difference is that previewGet()/previewPost() is designed to handle command previews, which can be cancelled by the user between the time that it's requested and the time it displays. If the preview is cancelled, the given callback will not be called.

(API のドキュメントより)

これを用いるなら、

CmdUtils.CreateCommand({
    names: ["test"],
    preview: function preview(pblock, args){
        pblock.innerHTML = "";
        CmdUtils.previewGet(pblock, "http://" + CmdUtils.getSelection(""), null, function(page){
            pblock.innerHTML = page;
        });
    },
});

2009年9月15日火曜日

Ubiquity が正常に動作しない

Firefox のアドオン ubiquity を使って Gmail に Google Map を貼り付けようとしたら動作しなかった。

 

対策

Ctrl + Space で Ubiquity を呼出し、help コマンド。

メニュー より 「設定」の「言語設定」の 「Parser 2 (次世代パーサ)を使用」のチェックをはずして、再起動したら動作した。

090915-001

 

tinyurl のコマンドも正常に動作しないと思ったら、これが原因だったのか。。 (+_+)

 

参考