2 years ago 203 commits to master since this release
--api
で書き込み時に署名が行われる際、リクエストボディのUTF-8化を行うように
Content-Type
ヘッダを見てUTF-8になっていないと思われる場合にUTF-8化を行います。--api
で書き込み時に署名が行われる際、署名関係のヘッダを常に更新するようにTransfer-Encoding: chunked
なクライアントからのPOSTリクエストを正しく処理できるように2 years ago 210 commits to master since this release
willSendRequestToBbsCgi
関数に渡されるrequest
引数のheaders
フィールドの型をtable
から独自のuserdata
に変更
userdata
はHTTPヘッダのデータ構造向けのC++クラスのオブジェクトをラップしており、table
のように連想配列として使えますがキー名の大文字小文字を区別しません。table
型と同様に[]
を使った値のゲット/セットやpairs
を使ったキー/値のイテレーションは従来どおり可能であるため、文字列をキーとする連想配列としてアクセスする限りtable
型でないことを意識する必要はありません。そのため、従来のスクリプトを修正する必要は基本的にはないはずです。willSendRequestToBbsCgi
の戻り値となるtable
内のheaders
の型は従来どおり純粋なtable
型でも可なので、スクリプト内で新しいtable
を割り当てる処理をしていても修正の必要はありません。request.headers
と同じ型のuserdata
をLua内で1から新しいものを生成したい場合はHttpHeaders.new()
という関数が使えますが、通常はrequest.headers
をそのまま改変するだけで足りるはずです。--bbscgi-header
オプションに与えるヘッダ名について大文字小文字を無視して既存のヘッダを上書きするようにした--api
オプション使用時に書き込みリクエストに付与されるX-PostNonce
ヘッダの値が現在時刻からずれている問題を修正2 years ago 224 commits to master since this release
--bbscgi-postorder
オプションを追加
--bbscgi-postorder "FROM,mail,MESSAGE,bbs,key,time,submit"
とすると、FROM=A&mail=B&MESSAGE=C&bbs=D&key=E&time=F&submit=D
のように並び替えられます。指定しなかったフィールドは指定したものの後に続きます。--api
オプションでbbs.cgiに投稿する際に署名をする対象からbbspinkを除外
--api-usage
オプションにpostinclpink
allinclpink
が追加され、これらのオプションが指定されたときはbbspinkへの投稿に対しても署名を行います。yuki=akari
のCookieは不要ですが、そうでない場合は必要になります。-c
オプションでを指定した時にMITM proxyとして動作するモードを実験的に追加
Accept
が存在しない場合には明示的にAccept
ヘッダを送らないようにした
Accept
ヘッダがないとAccept: */*
が送られるという (libcurlの仕様による) 挙動に依存している場合はご注意ください。PUT
とOPTIONS
のメソッドへの対応を追加従来のproxy2chではhttpsなリクエストに介入することは不可能でしたが、MITMモードではそれを可能にします。例えばJaneStyleやChMate等のhttpsプロキシが利用可能な専ブラにおいてbbs.cgiへのPOSTリクエストに介入して好き放題できるようになります。
MITMモードを有効にするには-c
オプションと同時に--mitm
オプションを指定します。--mitm minimal
とすると5ch.netやbbspink.com等proxy2chが介入する可能性のあるドメインへの接続のみMITMを行い、--mitm all
とすると全てのHTTP CONNECTで受け取った接続に対してMITMを行います。
MITMモードでは--mitm-ca-cert
オプションでサーバ証明書の署名に使うPEM形式の(自己署名)認証局証明書を、--mitm-ca-key
オプションで--mitm-ca-cert
で指定した証明書に対応するPEM形式でパスフレーズなしの秘密鍵を指定する必要があります (同じファイル内に証明書と秘密鍵が同居していても可)。証明書と秘密鍵のペアは予め用意しておく必要がありますが、他のMITMなツール (mitmproxy等) で使っているものと共用でも可です。指定した証明書をOSなどのルート証明書ストアに入れて信頼できる証明書にしておくことによりMITMが可能になります。なお、proxy2chに--mitm-certgen
オプションを付けると自己署名証明書 (有効期限3年) と秘密鍵を生成してPEM形式で出力して終了するので、これをリダイレクトして使っても可です。
有効にするにはビルド時にUSE_MITM
マクロを定義する必要があります。OpenSSLのAPIに完全に依存しているため、どの環境でもビルドにはOpenSSLあるいはLibreSSLのヘッダ・ライブラリ類が必要です。OpenSSLを使う場合は1.1.1系を推奨します。3.0系にした場合はハンドシェイクで古い署名アルゴリズムを要求するクライアント (例えばJaneStyle) で動作しないようです。MinGWでビルドする場合はここのパッケージを利用するのが良さげです (特殊な圧縮形式だがマニュアルインストールも可)。
2 years ago 237 commits to master since this release
--api
オプションが指定されている場合、bbs.cgiへのPOST時に書き込み仕様向けのリクエストヘッダが自動生成されるようにした
--bbscgi-header
オプションだけでは模倣が不完全になる可能性が高いです。基本的にはLuaスクリプトの使用をおすすめします。--api
オプション自体が不要ですが、--api
が指定されかつLuaスクリプトで署名が行われた形跡がある場合はこのオプションで本来行われるヘッダの生成はスキップされます。--api-usage
オプションを追加
read
、post
、all
の3種類が指定できます。read
はdatの読み込みのみ、post
はbbs.cgiへのPOSTのみ、all
は読み書き両方にAPIを使います。デフォルトはall
です。read
を指定するとよいでしょう。--api
オプションが指定されていない場合は特に効果はありません。proxy2ch.convertShiftJISToUTF8
において、バックエンドがlibiconv
である場合にCP932に準拠しないUnicodeが生成されることがある問題に対処
proxy2ch.isKeyExpired
を追加
bbs.cgiがUTF-8を受け付けるようになったとは言え、5chの.datの中身は依然としてShift JISであり、厳密に言うとMicrosoftの方言であるCP932です。よってbbs.cgiがUTF-8なリクエストを処理する場合、UTF-8な文字列をCP932に変換し、変換できなかった文字はいわゆる数値文字参照の形でdatに書き込むことになります。もっとも数値文字参照が使えない (いわゆるBBS_UNICODE=change
な) 板ではその数値文字参照はエスケープされてしまうため、Shift JISでPOSTすることに対する利点は小さいです。従来はブラウザ側で行う必要があったCP932で使用不可なグリフを数値文字参照に変換する処理をbbs.cgiに委ねることができるようになったという程度です。将来的にはかつて2ch時代に計画されていたようなdat自体のUTF-8化も考えているのかもしれませんが。
さて、CP932とUnicodeを相互変換する場合、純粋なShift JIS (JIS X 0208) とは異なる変換規則が適用されているグリフがあります。代表的なものは波ダッシュ〜
で、このグリフはCP932でもShift JISでも0x81 0x60
ですが、CP932の変換規則ではWindowsの歴史的な事情によりUnicodeの全角チルダU+FF5E
に対応することになっています。Unicodeにも波ダッシュU+301C
が存在しますが、全角チルダです。このため、Microsoftの変換規則に厳密に従うと、UnicodeからCP932に戻す時にU+301C
があると、それは変換不可能なグリフ扱いされてしまいます。bbs.cgiの動作について先程 「UTF-8な文字列をCP932に変換し、変換できなかった文字はいわゆる数値文字参照の形でdatに書き込む」 と書きましたが、このときにこれが問題となります。U+301C
は波ダッシュに変換されてほしいところですが、bbs.cgiは〜
に変換してしまいます。libiconv
を使う場合はこの点に注意してCP932 to UTF-8変換を行う必要があります (この問題は有名らしくlibiconv
自体にパッチが当たっていることも多いようです)。
2 years ago 256 commits to master since this release
proxy2ch.encodeURIComponent
, proxy2ch.convertShiftJISToUTF8
を追加
2 years ago 267 commits to master since this release
Content-Type
ヘッダが存在しない場合はapplication/x-www-form-urlencoded
を想定するようにしたContent-Type
ヘッダのapplication/x-www-form-urlencoded
の後に; charset=
等が続く場合にluaスクリプトでリクエストを改変できない問題を修正3 years ago 291 commits to master since this release
--bbscgi-header
でメタ文字列が機能しないおバカなミスを修正--bbscgi-header
で使えるメタ文字列を増やした--bbsmenu
でBBSPINKのURLに対してhttps→httpの置換が行われない問題を修正-s
を指定した時にHTTP2なリクエストが行われる可能性がある問題を修正