Blog

拡張性豊かにmod_trackback v1.0.1リリース

By Hiroyuki OYAMA Tue Sep 14 00:29:03 2004

気に入らなかった部分を修正し、ストレージの変更、コンテンツ生成ルールの追加、TrackBack Pingのvalidation追加など、簡単に機能追加できるプラグイン機構をくっつけました。

構造が何気に大きく変わったので、バージョン番号をモッサリあげています。とは言えデフォルトの機能はそんなに差はないような気がする(汗)

ダウンロード

ライセンスは例によって(しつこく)、GPLもしくはコマーシャルライセンスの2種類です。
mod_trackback-1.0.1.tar.gz
ご都合のよいライセンスを選び、ご利用くださいませ。

バージョン1.0.1のみどころ

いや見所ってほど大それたものではないのですが、mod_trackback 1.0.x以降はmod_trackback本体に手を加えずに下記の要素を簡単に拡張できるようになっています。
  1. 受け取ったTrackBack Pingの検証
  2. 受け取ったメッセージ(Trackbackね)の保存
  3. 保存したメッセージの読み出し
  4. メッセージを整形して配信
1番はTrackBack SPAM対策機能をサクッと追加するためのフックで、リクエストの内容に応じて受信の拒否や非表示で保存(ペンディング状態)といった判定処理を追加できます。デフォルトで組み込まれるのはTrackBack Pingのurlパラメータが"http://"もしくは"https://"の場合のみに受信するmodules/validate_url_scheme.cだけですが、必要に応じてチェックモジュールを数珠つなぎに追加することができます。

2番と3番は旧バージョンのしくみと同じで、Trackback pingで受け取ったメッセージを任意のストレージに書き込み/読み出しするためのフックです。デフォルトで組み込まれるモジュールはTrackback IDに対応したファイルに読み書きするmodules/storage_file.cです。

4番目はApacheのコンテンツハンドラと同じように任意のコンテンツ整形&送信処理を追加するフックで、__modeパラメータの値によって実行されるモジュールが選択されます。デフォルトで組み込まれているモジュールは
  • modules/contents_html.c:
    HTMLで整形表示。__mode=htmlで実行。
  • modules/contents_rss.c:
    RSSで整形表示。__mode=rssで実行。
  • modules/contents_javascript.c:
    document.write()するJavaScriptを出力。__mode=javascriptで実行。
  • modules/contents_count.c:
    Trackbackの件数のみを表示する。__mode=countで実行。
  • modules/contents_openwindow.c:
    Trackbackの件数表示および、あたらしいWindowで__mode=htmlを開くリンクを出力する。__mode=openwindowで実行。
ってな感じです。以前のバージョンでは__mode=javascriptの際には、メッセージの表示非表示を切り替えられるJavaScriptを出力していましたが、便利でしたが微妙に使い辛いのでstaticなdocumentをwriteするものにreplaceしています(と、無理矢理オトナ語ふう)。
また、サンプルとしてmodules/contents_helloworld.cなんてのも一応転がしてあります。

これらとは別に、テンプレートファイルを元に動的に整形表示するモジュールを付けても良かったのでしょうが、今回のリリースでは無しということで。実行時にテンプレートをパースする類いのモジュールは遅くなるので個人的にあんまり好きじゃなかったりするのは秘密です。

機能の追加方法

新たに機能追加する場合、mod_trackbackの拡張モジュールを記述し、configureスクリプトにそのパスを知らせてビルドします。以前のバージョンでは--with-storageなどとしていましたが、バージョン1.0.xでは--with-module=/path/to/my_module.cで追加する拡張モジュールを指定します。
例えばサンプルとして添付してあるcontents_helloworld.cを追加する場合は、configureスクリプトを以下のように実行します。
$ ./configure --with-module=modules/contents_helloworld.c
あとは make; make installするだけです。ディレクティブなど設定方法は従来と同じです。


もう一個例として、HTTP Proxy経由のTrackBack Pingを拒否する拡張モジュールvalidate_proxy.cをサンプルとして書いてみましょう。proxy経由か否かの判定はリクエストヘッダにX-Forwarded-Forが含まれるか否かだけをチェックします。
まず必要なのがmtb_module_rec構造体の定義です。mtb_module_recはApacheのmodule構造体と同様に、mod_trackbackとその拡張モジュールの間のI/Fになる構造体です。この構造体はinclude/module.hに下記のように定義してあります。
typedef struct mtb_module_rec {
    int (*validate_ping)(request_rec *r, mtb_message_rec *msg);
    int (*store_message)(request_rec *r, mtb_message_rec *msg);
    mtb_message_rec *(*load_message)(request_rec *r, const char *id);
    int (*send_contents)(request_rec *r, mtb_message_rec *msg);
} mtb_module_rec;
今回はTrackBack Pingの受信可否を決定する拡張モジュールを書くので1番目のフィールドvalidate_pingだけを使い、他はNULLで設定します。実際にチェックを行う関数check_proxyを定義して、mtb_module_rec構造体の1番目のフィールドにそのポインタをセットします:
#include "module.h"
#include "trackback.h"

static int check_proxy(request_rec *r, mtb_message_rec *msg)
{
    const char *str;

    str = ap_table_get(r->headers_in, "X-Forwarded-For");
    if (str != NULL) {
        ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r,
                      "validate_proxy: cannot proxy access: X-Forwarded-For: ''",
                      str);
        return BAD_REQUEST;
    }

    return OK;
}

mtb_module_rec mtb_validate_proxy_module = {
    check_proxy,
    NULL,
    NULL,
    NULL,
};
これだけ。TrackBack Pingの受信を許可する場合はreturn OK;、拒否する場合はBAD_REQUESTなどApacheの適当なエラー定数をreturnしてください。

この拡張モジュールと先ほどのhellowroldモジュールの2つを追加する場合は、configureスクリプトを次のように実行します。
$ ./configure --with-module="modules/contents_helloworld.c /path/to/validate_proxy.c"
あとはmake; make installするだけです。一応validate_proxy.cは配布パッケージに入れてありますので、よろしければお試しくださいませ。

Comments

Post a comment

Name:


URL:


Comments:


WebエンジニアのためのApacheモジュールプログラミングガイド

ApacheをHackする!
モジュールプログラミング強烈初体験!!
定価: 2,919円(税込)
ISBN: 4-7741-1799-4

hiroyuki_oyama IM status

Apache Users

Apache Modules

CPAN


Home > Blog > 拡張性豊かにmod_trackback v1.0.1リリース