この前投稿したときに気が付いてはいたんですがこのブログというか掲示板、下のフォームから投稿できなくなってましたね。この時はサーバの調子が悪いのかと思ってとりあえず管理画面から投稿したんですが様子見ても直らないので調べてみました。
この掲示板は外部からFC2のXML-RPC API叩いて投稿できるようにしてるんですが、そのAPIを叩くCGIを作るには幾つかモジュールを自分で用意する必要がありました。
ところが、いつの間にやらサーバの方でモジュールをインストールしてくれてたようでそれが優先的に使われるようになってました。
で、そのインストールされたモジュール、具体的に言うとJCodeなんですがこの新しいバージョンは文字コードをuft-8に変換するのに問題があり変換できないとんでもない仕様らしく、お陰で文字変換をしないままFC2のAPIを叩くことになりそれが原因で正常に投稿できなかったようです。そこで、JCodeを使わず文字変換を行うようにしたことで一件落着させました。
もし、投稿できなかった方がいましたらゴメンナサイ。
Posted by Akky
新しいPCが届いたのでここ数日環境構築とか色々弄ってますがこれはダメかもわかりません。
致命的なのはVC++6.0がまともに使えません。他にも不具合たくさん。表示されるアイコンに32*32が無くなってるとか.hlpファイルがデフォでは読めないとか追加の関連付けはレジストリ弄らなきゃならないとかもう嫌です。
UACの過剰な警告も最初のうちは良いですがすぐに慣れちゃって警告の意味無くなっちゃいますよ。警告無視してボタンを押すようになるだけ。
以前株の大量誤発注で市場が混乱した事件がありましたがあれも担当者が警告画面に慣れちゃってて警告を無視してしまったのが原因でした。その轍を踏むだけです。警告を無視する人が増えるのが目に見えてます。
とりあえず、ソフトのVista対応とか考えていましたがそれは無しで。
こんな互換性の無いOS広まっちゃダメ。困る。ソフトをVista対応にしない事で少しでもVistaに移行するのを躊躇わせる為ささやかな抵抗です。そんな力は無いとは思いますケド。
Vistaがまともになるかシェアが8割9割になり対応せざるを得なくなるまでは。
Posted by Akky
どでかい穴が空いてたので修正版です。
結構危険度高いので早急にバージョンアップ願います。
序に他にも少し修正。
セキュリティーホールの詳細は
こちらをご覧下さい。
しかし、この穴の部分のコード今見るとやってる事が訳分からんですね。一体何を考えていたんだろうか当時の自分に問い詰めたい。何故そんな回りくどい事をして穴あけてんだと。
修正はifをwhileに変更するだけで済んだのですがアレでは他にも穴がある可能性があるのでその辺一新。コードも簡素になり処理速度もほんの僅か速くなってるかも。1msぐらい。
今回、JPCERT/CCより指摘を受けた訳ですが流石それを専門としてる所だけ有って
色々と秘密保持とか色々厳しかったですね。
詳細はPGP暗号化メールで連絡しますとか言われた時はどうしようかと思いましたよ。
メーラーはThunderbird使ってるのでPGP自体はプラグイン入れれば問題なかったんですが公開鍵をPGP公開サーバに登録してそのURLと鍵のフィンガープリント教えてくれと言われた時点で私の頭はオーバーフローしました。
で結局は面倒になって、「zipでくれ」とお願いして暗号化zipで詳細は貰いましたが。
その辺の経緯をまとめたら面白いと思うけど流石に不味いかな。
バージョンアップ、つまり情報公開日時も指定されたのでスクリプト組んで(と言ってもたった3行だけど)サーバのCRONジョブで指定時間にサイトの更新は自動で行うようにしておいたんだけどきちんと更新されてるか心配。もちろんこの記事もタイマー投稿でその時間に自動で公開されるよう書いてます。(前のエントリ書いたその後ですね)
もし、更新に失敗してたらアレなのでこちらからもダウンロードできる様リンク張っておきます。
もしサイトが更新されていなければこちらから落としてください。
7-zip32.dll Ver4.42.00.04 ダウンロード【18時14分 追記修正】
上手く更新できてましたね。CRONジョブ面白いかも。
ダウンロード先のリンクは修正しておきました。そのページから落としてください。
【/18時14分 追記修正】
以下、今回の修正内容の詳細です。
【“7-zip32.dll Ver4.42.00.04”の続きを読む】
Win32APIのPathCompactPathは長いファイル名を表示する際に表示領域から
はみ出してしまった分を...に置き換えて省略してくれる便利なAPIですが
SHLWAPI.DLLに実装されているのでIEが古いと使えません。
そこで自作して同じ機能の物を作成。
これ、実は結構簡単。キモはDrawTextEx。
引数にDT_PATH_ELLIPSISとDT_MODIFYSTRINGとDT_CALCRECTを指定すると
省略されたパスを取得できます。
DT_PATH_ELLIPSISはパスを省略させるフラグで
DT_MODIFYSTRINGは省略されたパスを保存するフラグで
DT_CALCRECTは描写を抑えるフラグになります。
これを組み合わせる事で省略されたパスを取得できます。
なぜDrawTextでは無くDrawTextExなのかというと
DrawTextの2番目の引数に変換するパスを渡す訳ですが
これLPCTSTR、つまりconst指定なので本来ならココに指定したバッファは
変更されてはいけないはずなんです。でも無理矢理変換してしまうようですが。
# これは完全に実装ミスだよなぁ。
それがDrawTextExだとconst指定ではないので安心です。
それを踏まえてコードを書くと以下のような感じです。
BOOL MyPathCompactPath(HDC hDC, LPTSTR lpszPath, UINT dx)
{
int nRes;
RECT rc = { 0, 0, dx, 0 };
nRes = ::DrawTextEx(hDC, lpszPath, -1, &rc,
DT_PATH_ELLIPSIS |
DT_MODIFYSTRING |
DT_CALCRECT, NULL);
return (nRes != 0);
}
オマケでPathSetDlgItemPathの代用
bool MyPathSetDlgItemPath(HWND hDlg, int id, LPCSTR pszPath)
{
char* lpsz = new char[::lstrlen(pszPath) + 4];
::lstrcpy(lpsz, pszPath);
HWND hItemWnd = ::GetDlgItem(hDlg, id);
HDC hDC = ::GetDC(hItemWnd);
HGDIOBJ hFont = (HGDIOBJ)::SendMessage(hItemWnd, WM_GETFONT,
0, 0);
HGDIOBJ hOldFont = ::SelectObject(hDC, hFont);
RECT rc;
int nRes;
::GetClientRect(hItemWnd, &rc);
nRes = ::DrawTextEx(hDC, lpsz, -1, &rc,
DT_PATH_ELLIPSIS |
DT_MODIFYSTRING |
DT_CALCRECT, NULL);
::SelectObject(hDC, hOldFont);
::ReleaseDC(hItemWnd, hDC);
::SetWindowText(hItemWnd, lpsz);
delete [] lpsz;
return (nRes != 0);
}
ポイントとしてデバイスコンテキストにきちんとフォントを設定してやらないと
きちんとコントロールに収まらないのでその辺を処理してます。
それからDrawTextExでDT_PATH_ELLIPSISフラグを設定すると
最大で4バイト長くなる場合が有るのでそのぶん多く確保してます。