2010年12月4日

Flash-Socket-Policy への応答を xinetd で行う

https://github.com/gimite/web-socket-js
Flash のソケット通信機能を経由すれば IE や現行の正式版の Firefox や Opera でも WebSocket と同じレベルの通信ができるということで、最近 gimite さんの web-socket-js を使ってみている。

Flash の場合アクセスを許可するためのポリシーファイルを配信しなければならないようなのだが、ServersMan@VPS の Debian には最初から xinetd が入っているようなのでこれを使って許可するようにしてみようと思う。
(もちろん WebSocket サーバ側で準備するのもいいけどポート843番は特権ポートなのでサーバをユーザ権限で動かしたい場合直接は listen できない模様)
まず /etc/services にポート843番に関する情報を追加する必要がある。
vim /etc/services
flsockpolicy tcp/843
次に登録したポートに対応した応答用の定義を追加する。
vim /etc/xinetd.d/flsockpolicy
service flsockpolicy
{
        disable         = no
        wait            = no
        socket_type     = stream
        flags           = IPv6
        user            = www-data
        group           = www-data
        server          = /usr/local/flsockpolicy/flsockpolicy
}
で、この server に書いた場所に実際に実行されるスクリプトファイルを設置する。
cd /usr/local/
mkdir flsockpolicy
cd flsockpolicy
vim flash-socket-policy.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <allow-access-from domain="flashが設置されているドメイン名" to-ports="アクセスを許可するポート番号"/>
</cross-domain-policy>
vim flsockpolicy
#!/bin/sh
read -n 23 INPUT
if [ $INPUT = '<policy-file-request/>' ]; then
  cat /usr/local/flsockpolicy/flash-socket-policy.xml
fi
chmod 700 flsockpolicy
chgrp www-data *
chown www-data *
準備が終わったら xinetd をリロード。
invoke-rc.d xinetd reload
テストする。
telnet 127.0.0.1 843
応答が返ってくるのが確認出来れば成功。


要求の内容もロクに確認しない適当スクリプトだけど Flash 経由で使えるようになったのでこれで問題ないようだ。


---- 2010-12-17 追記
ちゃんと受信してから返答しないと成功しないケースが多かったのでちゃんと内容を見るように修正。
Clip to Evernote