Releases

  • Version 20220410

    NanashiNoGombe 2 years ago 203 commits to master since this release

    • --apiで書き込み時に署名が行われる際、リクエストボディのUTF-8化を行うように
      • 一部User-AgentでUTF-8が必須になったようなので、Content-Typeヘッダを見てUTF-8になっていないと思われる場合にUTF-8化を行います。
    • Luaスクリプトが指定されておらず--apiで書き込み時に署名が行われる際、署名関係のヘッダを常に更新するように
    • 一部の書き込みエラーで不必要にMonaKeyがリセットされることがあるのを抑制
    • Transfer-Encoding: chunkedなクライアントからのPOSTリクエストを正しく処理できるように
     
  • Version 20220406

    NanashiNoGombe 2 years ago 210 commits to master since this release

    • Luaの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オプションに与えるヘッダ名について大文字小文字を無視して既存のヘッダを上書きするようにした
    • サーバから100 Continueのレスポンスが返ってきた時にうまく処理できない問題を修正
    • Windows環境で--apiオプション使用時に書き込みリクエストに付与されるX-PostNonceヘッダの値が現在時刻からずれている問題を修正
     
  • Version 20220401

    NanashiNoGombe 2 years ago 224 commits to master since this release

    • bbs.cgiにPOSTされるリクエストボディのフィールドの順序を指定する--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への投稿に対しても署名を行います。
      • 現時点ではbbspinkのbbs.cgiは新しい書き込み仕様に関するヘッダを無視するようです。なお、新しい書き込み仕様で投稿する際にはyuki=akariのCookieは不要ですが、そうでない場合は必要になります。
    • -cオプションでを指定した時にMITM proxyとして動作するモードを実験的に追加
      • 詳細は補足を参照してください。
      • 実験的な機能のため、正式版のバイナリでは機能が無効化されています。試したい場合は自分でビルドするか、Windows向けにはテスト版のバイナリも配布しています。
    • bbs.cgiに対して送られる予定のリクエストヘッダにAcceptが存在しない場合には明示的にAcceptヘッダを送らないようにした
      • リクエストヘッダを改変する際に従来のAcceptヘッダがないとAccept: */*が送られるという (libcurlの仕様による) 挙動に依存している場合はご注意ください。
    • PUTOPTIONSのメソッドへの対応を追加

    MITMモードについて

    従来の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でビルドする場合はここのパッケージを利用するのが良さげです (特殊な圧縮形式だがマニュアルインストールも可)。

     
  • Version 20220326

    NanashiNoGombe 2 years ago 237 commits to master since this release

    • --apiオプションが指定されている場合、bbs.cgiへのPOST時に書き込み仕様向けのリクエストヘッダが自動生成されるようにした
      • 一応Luaスクリプトを使わずに新しい書き込み仕様に準拠したリクエストを生成することが可能ですが、近年のbbs.cgiはリクエストボディとの整合性も確認しているため、--bbscgi-headerオプションだけでは模倣が不完全になる可能性が高いです。基本的にはLuaスクリプトの使用をおすすめします。
      • ヘッダの生成はLuaスクリプトの実行後に行われるため、Luaスクリプト内では新しい書き込み仕様に関連したヘッダは生成せず、署名関係はproxy2ch側に任せるという使い方でも可です。
      • もちろん従来どおり全てをLuaスクリプト内で完結させても問題ありません。その場合は--apiオプション自体が不要ですが、--apiが指定されかつLuaスクリプトで署名が行われた形跡がある場合はこのオプションで本来行われるヘッダの生成はスキップされます。
    • APIの用途を指定する--api-usageオプションを追加
      • readpostallの3種類が指定できます。readはdatの読み込みのみ、postはbbs.cgiへのPOSTのみ、allは読み書き両方にAPIを使います。デフォルトはallです。
      • 読み込みにはAPIを使いたいが書き込みに関してはLuaスクリプトで処理するため不要という場合はreadを指定するとよいでしょう。
      • --apiオプションが指定されていない場合は特に効果はありません。
    • 払い出されたMonaKeyが初めて使われると思しきリクエストを投げる前に内部で待ち時間を入れるようにした
      • これは主に投稿確認画面を即OKすることによる「投稿間隔が短すぎます」エラーを防ぐ目的で入れています
    • 使っているMonaKeyが無効で払い出し要求が必要なケースにおいて内部で自動的に同じリクエストを再投稿するようにした
      • 新しい書き込み仕様に対応した主要なブラウザに準拠した挙動です
    • より多くのMonaKeyがリセットされるべきケースに対応
    • Luaのproxy2ch.convertShiftJISToUTF8において、バックエンドがlibiconvである場合にCP932に準拠しないUnicodeが生成されることがある問題に対処
      • 補足参照
    • Luaのユーティリティ関数proxy2ch.isKeyExpiredを追加

    bbs.cgiとUTF-8に関する補足

    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自体にパッチが当たっていることも多いようです)。

     
  • Version 20220319

    NanashiNoGombe 2 years ago 256 commits to master since this release

    • Luaスクリプトから使えるユーティリティ関数proxy2ch.encodeURIComponent, proxy2ch.convertShiftJISToUTF8を追加
      • 新しい書き込み仕様には直接関係ありませんが、UTF-8でbbs.cgiにPOSTする専ブラを模倣したい時に使います
      • 今の所はUTF-8でPOSTされるはずのUser-AgentでShift JISでポストしても拒否されることはないようです
      • 詳細はサンプルスクリプトを参照してください
      • WindowsとMacではOS依存のAPIで変換していますが、それ以外の環境ではiconvに依存するためビルドにはlibiconvが必要です。
    • MonaKeyの有効期限切れの際に自動でリセットするように
      • 一定期間書き込まないと切れるパターンと払い出しからの時間経過で切れるパターンが観測されたので対応しましたが、他にもたぶんありそうな気がします
    • bbs.cgiへのPOSTが成功しなかった時にサーバから返ってくるエラーを表示するように
     
  • Version 20220306

    NanashiNoGombe 2 years ago 267 commits to master since this release

    • luaスクリプトから呼び出せるユーティリティ関数等を追加
      • 追加された要素についての詳細はサンプルスクリプトを参照してください
      • 「新しい書き込み仕様」とやらにスクリプト単体で容易に対応するのに必要なものを追加しています
    • bbs.cgiへのリクエストでContent-Typeヘッダが存在しない場合はapplication/x-www-form-urlencodedを想定するようにした
    • bbs.cgiへのリクエストでContent-Typeヘッダのapplication/x-www-form-urlencodedの後に; charset=等が続く場合にluaスクリプトでリクエストを改変できない問題を修正
     
  • Version 20210528

    NanashiNoGombe 3 years ago 282 commits to master since this release

    • Luaスクリプトを用いてbbs.cgiへのリクエストを改変できるようにする---bbscgi-luaオプションを追加
      • 詳しくはREADMEサンプルスクリプトを参照してください
      • 配布のバイナリはWindows用はLua 5.4.2、Mac用はLua 5.4.3にstatic linkしてあります
    • nghttp2にリンクしたlibcurl 7.62以降を使っているとAPI経由でdatの取得に失敗する問題を修正
     
  • Version 20210519

    NanashiNoGombe 3 years ago 291 commits to master since this release

    • --bbscgi-headerでメタ文字列が機能しないおバカなミスを修正
    • --bbscgi-headerで使えるメタ文字列を増やした
    • --bbsmenuでBBSPINKのURLに対してhttps→httpの置換が行われない問題を修正
    • nghttp2にリンクされたlibcurlを使うと-sを指定した時にHTTP2なリクエストが行われる可能性がある問題を修正
    • libcurlのshared connection cacheはスレッドセーフにならないバグがあるらしいので使うのをやめた