No Description

NanashiNoGombe e8ad4c668c switch to read.cgi mode when redirection to kako.5ch.net occurs 1 week ago
lua cca01a4b2f Lua: update sample script 1 year ago
parson b8314636cd parson: do not escape slash in json by default 2 years ago
.gitignore 3d15608573 gitignore and LICENSE 3 years ago
BBS2chProxyAuth.cpp b0c89c3787 call updateSID() in getSID() 1 year ago
BBS2chProxyAuth.h 7fd198d6d3 lua: implement getSID() 1 year ago
BBS2chProxyBoardManager.cpp 0339d2052a strftime implementation on mingw doesn't support %T 1 year ago
BBS2chProxyBoardManager.h 715b096664 pragma once 1 year ago
BBS2chProxyConnection.cpp e8ad4c668c switch to read.cgi mode when redirection to kako.5ch.net occurs 1 week ago
BBS2chProxyConnection.h 691ebbb6dc --subject-to-lastmodify option, which generates subject.txt from lastmodify.txt 1 year ago
BBS2chProxyFormData.cpp e11b2725c2 encode/decodeURIComponent: function to class function 1 year ago
BBS2chProxyFormData.h e11b2725c2 encode/decodeURIComponent: function to class function 1 year ago
BBS2chProxyHTML2Dat.cpp 1cc55335b7 HTML2Dat: fix for the new read.cgi output 1 week ago
BBS2chProxyHTML2Dat.h 0c9b7d46c1 HTML2Dat: implement generator using itest.5ch.net json 5 months ago
BBS2chProxyHttpHeaders.cpp 732d80baf8 concatenate cookie headers with ; for convenience 7 months ago
BBS2chProxyHttpHeaders.h f7d2762a56 std::iterator -> std::iterator_traits 1 year ago
BBS2chProxyKeyManager.cpp d3c2f01bcf include required headers 6 months ago
BBS2chProxyKeyManager.h 73859362e4 --manage-bbscgi-cookies option: manage cookies sent to / received from bbs.cgi in proxy2ch side 7 months ago
BBS2chProxyPoster.cpp d85275e6d7 CURLOPT_COOKIELIST is only available on curl >= 7.14.1 5 months ago
BBS2chProxyPoster.h 73859362e4 --manage-bbscgi-cookies option: manage cookies sent to / received from bbs.cgi in proxy2ch side 7 months ago
BBS2chProxyRawSocket.cpp 58969769fe sendResponse/sendBasicHeaders can be member function 1 year ago
BBS2chProxyRawSocket.h be4ee318da socket I/O abstraction 2 years ago
BBS2chProxySecureSocket.cpp d03bbbcb76 OPENSSL_NO_SECURITY_DOWNGRADE macro 1 year ago
BBS2chProxySecureSocket.h a44a2c27b4 mitm: support GnuTLS as a backend 2 years ago
BBS2chProxyThreadInfo.h 6d18242d29 avoid using DataStorage class on html2dat and cache 1 year ago
BBS2chProxyThreadPool.h aa9e113be2 note about curl handle reusing and memory usage 2 years ago
BBS2chProxyURL.cpp 691ebbb6dc --subject-to-lastmodify option, which generates subject.txt from lastmodify.txt 1 year ago
BBS2chProxyURL.h 691ebbb6dc --subject-to-lastmodify option, which generates subject.txt from lastmodify.txt 1 year ago
IBBS2chProxySocket.h bc889e7312 forgot to commit 1 year ago
LICENSE 3d15608573 gitignore and LICENSE 3 years ago
Makefile adf5aa884e poster interface abstraction 1 year ago
Makefile.mingw adf5aa884e poster interface abstraction 1 year ago
README.md b697d2d55a README 1 year ago
dependencies e9c8745e0c make use of BBS2chProxyFormData in BBS2chProxyURL 1 year ago
hmac.c 0dc5be0a98 stop using deprecated SHA256_* functions on OpenSSL >= 3.0 1 year ago
hmac.h b35118e8f8 move hmac-related functions to a separate file 2 years ago
main.cpp 73859362e4 --manage-bbscgi-cookies option: manage cookies sent to / received from bbs.cgi in proxy2ch side 7 months ago
stringEncodingConverter.c 4d9f464332 some implementation of iconv silently convert characters which are not available in CP932 to geta, and require a fallback routine 1 year ago
stringEncodingConverter.h 49c509a32b utf-8 to sjis conversion with numeric character reference 1 year ago
utils.h fb4c729a44 force set Content-Type to text/plain for direct dat downloading 1 year ago

README.md

これは何?

5ch.netからdatを取得し、クライアントに返すプロクシです。 接続先が*.2ch.netの場合、内部でURLを*.5ch.netに変換した上で接続を行います。

使い方

起動し、各ブラウザのプロクシ設定を変更してください。デフォルトではポート9080で接続を受け付けます。以下のオプションが指定可能です。

  • -p port

    ポート番号を指定します。デフォルトは9080です。

  • -t timeout

    タイムアウト(秒) を指定します。デフォルトは30秒です。

  • -a user-agent

    proxy2chからリクエストを行う際のUser-Agentヘッダを指定した値で上書きします。指定しない場合はクライアントがヘッダに付与した値がそのまま送信されます。

  • -g

    全ての接続を受け付けます。これを指定しない場合は、同じマシンからlocalhost(127.0.0.1)への接続のみを受け付けます。

  • -c

    HTTP CONNECTリクエストを受け付けます。httpsなプロクシとして動作するようになりますが、このオプション単体ではリクエストの改変は行えないので透過的なプロクシとしてのみ機能します。

  • -4

    強制的にIPv4で接続します。

  • --proxy server:port

    プログラムが使うプロクシサーバを指定します。
    socks4://192.168.1.1:1080のように頭にsocks4://socks5://を付けると、socksプロクシを指定できます。

  • -b backlog

    listen関数で接続を待ち受けるソケットのbacklogの値を指定します。デフォルトは32です。

  • -s

    *.2ch.net, *.5ch.net, *.bbspink.comドメインへの接続をhttpsで行います。

  • --api AppKey:HmacKey

    このオプションを指定すると、5ch/bbspinkの読み書きにAPIを利用します。読み込みはread.cgi経由ではなくAPIで直接datを取得します。いわゆるApp keyとHMAC keyの2つをコロンで連結して与えてください。なお、bbspinkへの書き込みについてはbbs.cgiがAPIに対応していないためデフォルトではAPIは使われません。2023年7月10日をもってAPIが停止したため、このオプションを指定しても動作しません。

  • --api-usage read|post|all|postinclpink|allinclpink

    --apiオプションが指定されたときにAPIを使う用途を指定します。readを指定すると読み込みのみ、postを指定すると書き込みのみ、allを指定すると読み書き両方にAPIを使います。デフォルト値はallです。postinclpinkあるいはallinclpinkを指定することでbbspinkへの書き込みにもAPIを使うことができます。

  • --api-auth-ua user-agent

  • --api-dat-ua user-agent

    APIのSID取得時、dat取得時のUser-Agentヘッダの値を指定します。

  • --api-auth-xua X-2ch-UA

  • --api-dat-xua X-2ch-UA

    APIのSID取得時、dat取得時のX-2ch-UAヘッダの値を指定します。

  • --api-server server

    APIのゲートウェイサーバを指定します。デフォルト値はapi.5ch.netです。

  • --api-override

    APIを使ったdat取得リクエストを受け取った場合、proxy2chが代わりに取得して返すようになります。--apiオプションと同時に指定した場合、proxy2chで指定したAPIキーを使って取得したものを返します。--apiオプションを指定しない場合、read.cgi経由あるいは直接 (--direct-datと併用した場合) 取得したものを返します。MITMが有効になっていなくてもオプション自体は有効ですが、APIリクエストは基本的にhttpsで来るはずなのでMITM前提です。

  • --chunked

    素通しする接続に対して、Transfer-Encoding: chunkedなレスポンスをchunkedなまま送り返します。
    SofTalk WEBというソフトがこのオプションを指定しないと動かないようです。

  • --verbose

    多少詳しくログを表示します。

  • --bbsmenu URL

    URLで指定したアドレスを板リストとみなし、HTMLのリンク中に出現する"5ch.net"の文字列を"2ch.net"に、"https://"を"http://"にそれぞれ置換します。

  • --bbscgi-header "header: value"

    5ch.netのbbs.cgiに接続要求する際、指定したheaderのリクエストヘッダの値をvalueに上書き (存在しない場合は追加) します。オプションを複数指定することで複数のヘッダを書き換えることができます。
    valueの部分に%HOST%もしくは%BOARD%もしくは %THREAD%という文字列が含まれている場合、%HOST%はリクエスト先URLのホスト名に、%BOARD%はリクエストボディから取得した掲示板の名前に、%THREAD%はリクエストボディから取得したスレッドのkeyにそれぞれ置き換えられます。

  • --bbscgi-postorder "field1,field2,..."

    5ch.netのbbs.cgiに接続要求する際、指定した順序にリクエストボディのフィールドを並べ替えます。順序はカンマ区切りでフィールド名を指定してください。指定しなかったフィールドは指定したものの後に続きます。

  • --bbscgi-utf8 none|api|all

    5ch.netのbbs.cgiにPOSTされるリクエストボディを (Shift JISから) UTF-8に変換するかどうかを指定します。noneを指定すると変換は行われません。apiを指定すると--apiオプションによって書き込みにAPIが使用されるときにのみ変換が行われます。allを指定するとAPIが使用されるかによらず変換が行われます。デフォルト値はapiです。なお、allを指定した場合でもLuaスクリプトでAPI関係のヘッダが追加された場合には (署名が不一致になる可能性があるため) 変換はスキップされます。 変換元のリクエストボディが既にUTF-8になっていると思われる場合はそのまま送信されますが、その場合も含めてContent-Typeヘッダにapplication/x-www-form-urlencoded; charset=UTF-8という値が暗黙のうちにセットされます。

  • --bbscgi-lua path

    5ch/bbspinkのbbs.cgiPOSTリクエストが送られる直前にproxy2chから呼び出されるLuaスクリプトのパスを指定します。
    このスクリプトにwillSendRequestToBbsCgiという関数を定義することにより、proxy2chがbbs.cgiに対して送るリクエストヘッダ/ボディを自由に改変することができます。詳しくはサンプルスクリプトを参照してください。
    --bbscgi-headerオプションと同時に指定した場合、まず--bbscgi-headerオプションによりヘッダの改変が行われ、その後にこのオプションで指定したスクリプトが実行されます。

  • --gikofix

    ギコナビで5ch.netに書き込めない問題を解消します。bbs.cgiにPOSTする際のbody末尾の余計な改行を取り除きます。

  • --mitm minimal|all

    -cオプションと同時に指定することでいわゆるMITM proxyとして動作するようになります。--mitm minimalとすると5ch.netやbbspink.com等proxy2chが介入する可能性のあるドメインへの接続のみMITMを行い、--mitm allとすると全てのHTTP CONNECTで受け取った接続に対してMITMを行います。

  • --mitm-ca-cert path

    MITMモードでサーバ証明書の署名に使うPEM形式の(自己署名)認証局証明書を指定します。

  • --mitm-ca-key path

    MITMモードでサーバ証明書の署名に使うPEM形式でパスフレーズなしの秘密鍵を指定します。

  • --mitm-certgen

    --mitm-ca-cert--mitm-ca-keyで使える自己署名CA証明書 (有効期限3年) と秘密鍵を生成してPEM形式で標準出力に出力して終了します。

  • --num-threads #threads

    スレッドプール内で待機させるスレッド数を指定します。デフォルト値は8です。

  • --keystore path

    APIを使った書き込み時に払い出されたMonaKeyを保存するJSONファイルをのパスを指定します。このオプションを指定するとMonaKeyが更新された時にパスのファイルが作成・更新され、起動時にファイルに保存されたMonaKeyが復元されるようになります。

  • --direct-dat

    dat取得リクエストを受け取った時、read.cgiの出力を加工するのではなく、/板名/dat/***.dat (現行ログ) あるいは/板名/oyster/***/***.dat (過去ログ) にあるファイルを直接取得して返します。

MacのBathyScapheやThousandのように、システムのプロクシ設定を利用し独自のプロクシ設定が不可能な場合は、付属のproxy.pacのようなプロクシ設定ファイルを使うと良いかと思います。 最近のOSX(10.10だけ?)では、同じドメインのサーバに対して既にキープアライブ状態の接続があるとプロクシ経由での接続を行ってくれないらしく、そのような場合はproxy_yosemite.pacのようにプロクシ経由にするアドレスを増やしてみるといいかもしれません (究極的には全ての2ch.net/bbspink.com向けの接続をプロクシ経由にすれば解決するはず)。

なおOSX 10.11.5以降では、安全性のためにpacファイルに完全な(ドメイン名以降のファイルパスを含む)URLが渡されない仕様になったらしく、urlのマッチングを使用したpacファイルは機能しません。proxy_10.11.5.pacのように2ch.net/bbspink全体を対象にするか、各ブラウザが独自にプロクシ設定に対応することを期待する以外ないようです。

注意

read.cgi経由モードでは、既に直接datを取得したことのあるスレッドに対してこのプロクシ経由で差分取得を行う場合、(主に半角スペースの個数を厳密に再現できないために)不整合が起こる可能性があります。この場合、一度ログを削除して再取得を試みてください。API経由とread.cgi経由を切り替えて使うような場合も同様の問題が起こります。

-sオプションを指定した場合、使用するlibcurlがTLS/SSL対応でビルドされている必要があります。libcurlがバージョン1.1.0未満のOpenSSLもしくはバージョン2.9未満のLibreSSLを使う場合、スレッドセーフを保証するためにロック処理を行う関数を明示的に設定する必要がありますが、proxy2chはこれを行いません。これが原因でクラッシュが発生する可能性があるので、該当するバージョンのOpenSSL/LibreSSLをどうしても使わなければならない場合はこれを参考にロック処理を実装してください。

Luaについて

--bbscgi-luaオプションを使うためにはLuaのヘッダ類を用意した上でUSE_LUAマクロを定義してビルドし、libluaにリンクする必要があります。このオプションを使わないのであればLuaは不要です。

MITMモードについて

今の所実験的な機能です。-cオプションでhttpsプロクシを有効にした上でMITMモードを有効にするとhttpsなリクエストに介入することが可能になります。有効にするにはビルド時にUSE_MITMマクロを定義する必要があります。WindowsやMacにおいてもビルドにはOpenSSL (LibreSSL含む) あるいはGnuTLSのヘッダ・ライブラリ類が必要です。USE_GNUTLSマクロが定義されている場合はOpenSSLの代わりにGnuTLSがバックエンドとして使用されます。

OpenSSLを使う場合は1.1.1以降のバージョンを推奨します。3.0以降ではデフォルトではSHA-1を使う暗号スイートが低セキュリティとみなされており、JaneStyle等の古いOpenSSLに依存したアプリとのハンドシェイクが成立しません。そのため、セキュリティレベルを下げることで互換性の改善を行っています。この措置が不要な場合はOPENSSL_NO_SECURITY_DOWNGRADEマクロを定義してビルドを行ってください。

USE_ECDSA_KEYマクロを定義してビルドすると署名にRSA (2048bit) ではなくECDSA (P-256) を使うようになります。サーバ側の処理がRSAに比べて高速 (OpenSSLでのベンチマークでは数十倍の差) なので、貧弱なマシンで動作させる場合はCPU負荷が有意に小さくなる可能性があります。ただし、クライアントが古いOSで動作している場合は対応していない可能性があります。OSレベルでの対応状況はWindowsはVista以降、MacOSは10.6以降、iOSは4以降、Androidは4以降で対応のようです。

コンパイル方法

MacとLinux等Un*xでは、Makefileを使います。 Windows (MinGW/MSYS) の場合、Makefile.mingwを使います。

Macの場合、たぶんそのままコンパイルできるはずです。
その他Un*x系の場合、libcurlとlibiconv、libcrypto(OpenSSL)もしくはGnuTLSが入っていなければ入れましょう。libcurlがSSL/TLS非対応だとAPIに接続できないので注意してください。 Windowsの場合、MinGW/MSYSだけではライブラリが不足しており、コンパイラが認識するよう各ライブラリ/ヘッダ類を適切にインストールする必要があります。以下にMinGWを用いてWin32向けのバイナリを生成する際に必要なファイルの入手先の例を示します。

  • libcurl
  • pthread (MinGWに含まれていない場合)
  • regex (MinGWに含まれていない場合)
  • Lua (--bbscgi-luaオプションを使いたい場合のみ)
  • OpenSSL (MITMモードを使いたい場合のみ)