ページ 1 / 1
WebLoginによるパスワードの再発行 【解決済み】
Posted: 2010年2月11日(木) 20:22
by shintata
WebLoginのパスワードの再発行についてです
modxをインストール後のサンプルサイトです
サンプルサイトには何も手を加えていません
(ウェブユーザーは作成しました)
作成したウェブユーザーでログイン
→OK
パスワードを忘れた場合の再発行の手続きをします
「パスワードをお忘れですか?」
→メールアドレス入れて再発行
→メールが来る
メーラーはThunderbirdを使っています
届いたメールに書かれている、再発行したパスワードを有効にするためのURLが
http://hoge.com/index?webloginmode=actp&wli=2&wlk=hogehoge
となっています
ここに飛んでも再発行されたパスワードが有効になりません
で、ヤフーのフリーメールだったので、ブラウザからヤフーメールを参照したら、上記URLが
http://hoge.com/index?webloginmode=actp&wli=2&wlk=hogehoge
となっていたのです
しかも、こちらだと再発行されたパスワードが有効になります
「&」を実体参照したURLとしてないURLとで結果が違ってしまうんです
原因がわかっているにもかかわらず、直し方がわかりません…ナサケナイ
いますぐ直さないと困るわけではないので(まだユーザーいないし)、お暇なときに解決方法を教えてください
Re: WebLoginによるパスワードの再発行
Posted: 2010年2月12日(金) 08:34
by yama
これってMODxの問題というよりブラウザの問題のような気がしますが、両者で違いが出るのは不思議ですね。文字実体参照でamp;に展開するほうがいちおうvalidということになっていて、MODx管理画面のグローバル設定「XHTML形式のURL」でもデフォルトで「はい」になってますが・・ここをとりあえず「いいえ」にしておくと参照変換オフで揃うと思います。
Re: WebLoginによるパスワードの再発行
Posted: 2010年2月12日(金) 11:02
by sama55
yamaさんの対応方法でもいけることは確認しましたが、ちょっと影響が心配になりました。
局所的に対応するのであれば下でしょうか。(他にも数箇所ありそうですが。。。)
ソース : assets/snippets/weblogin/weblogin.common.inc.php (L62)
コード: 全て選択
// $message = str_replace("[+surl+]",$site_url,$message);
$message = str_replace("[+surl+]",htmlspecialchars_decode($site_url),$message);
※manager/includes/controls/modxmailer.inc.phpのL69で一括して・・・とも思いましたが、メールの本文に" "や"&"があるとまずいですもんね。。。
Re: WebLoginによるパスワードの再発行
Posted: 2010年2月12日(金) 13:42
by shintata
IE6~8、Firefox、Safari、Opera、Chrome(IE以外は最新版)で試してみました
実体参照のURL(amp;の方)だとダメ、実体参照じゃないURLだとOKでした
sama55 さんが書きました:yamaさんの対応方法でもいけることは確認しましたが、ちょっと影響が心配になりました。
局所的に対応するのであれば下でしょうか。(他にも数箇所ありそうですが。。。)
ソース : assets/snippets/weblogin/weblogin.common.inc.php (L62)
コード: 全て選択
// $message = str_replace("[+surl+]",$site_url,$message);
$message = str_replace("[+surl+]",htmlspecialchars_decode($site_url),$message);
※manager/includes/controls/modxmailer.inc.phpのL69で一括して・・・とも思いましたが、メールの本文に" "や"&"があるとまずいですもんね。。。
僕もグローバル設定で「いいえ」にしたらOKになりました
でもxml宣言したら実体参照しないとですしねぇ
weblogin.processor.inc.phpの104行目のとこにも同じ記述がありますがここも直しといた方が良いですかね?
(やっぱりPHP勉強しないとだめだなぁ…)
Re: WebLoginによるパスワードの再発行
Posted: 2010年2月12日(金) 14:24
by sama55
modxmailerのクラスインスタンスを作ってる箇所で、site_urlを埋め込んでるところはすべてでしょうね。
(X)HTMLコード上では実体参照は必須だと思いますが、modxmailerでphpmailerをプレーンテキストで送出するようオーバーロードしてますから、グローバル設定に関わらずデコード("&"のみに)するのが正解のよ~な気がします(ちょっと自信ないです

)。
メールをHTML形式で送れば問題ないのでしょうけど。。。
Re: WebLoginによるパスワードの再発行
Posted: 2010年2月13日(土) 14:03
by shintata
sama55 さんが書きました:modxmailerのクラスインスタンスを作ってる箇所で、site_urlを埋め込んでるところはすべてでしょうね。
(X)HTMLコード上では実体参照は必須だと思いますが、modxmailerでphpmailerをプレーンテキストで送出するようオーバーロードしてますから、グローバル設定に関わらずデコード("&"のみに)するのが正解のよ~な気がします(ちょっと自信ないです

)。
メールをHTML形式で送れば問題ないのでしょうけど。。。
weblogin.common.inc.phpの62行目をご指示いただいた通りに修正したらうまくいきました
でも、weblogin.processor.inc.phpの104行目も直したらエラーになっちゃいました
コード: 全て選択
Fatal error: Call to undefined function: htmlspecialchars_decode() in /home/sites/●●●●●/assets/snippets/weblogin/weblogin.processor.inc.php on line 104
元に戻したら大丈夫でした
PHPのわからない僕には何が何だかさっぱり…
でもweblogin.common.inc.phpの修正で解決したので、しばらくはこのまま様子見ます
不都合が生じたらまた報告しますのでよろしくお願いします
ありがとうございました
Re: WebLoginによるパスワードの再発行
Posted: 2010年2月14日(日) 10:04
by sama55
shintata さんが書きました:weblogin.common.inc.phpの62行目をご指示いただいた通りに修正したらうまくいきました
OK
shintata さんが書きました:でも、weblogin.processor.inc.phpの104行目も直したらエラーになっちゃいました
コード: 全て選択
Fatal error: Call to undefined function: htmlspecialchars_decode() in /home/sites/●●●●●/assets/snippets/weblogin/weblogin.processor.inc.php on line 104
元に戻したら大丈夫でした
エラーの内容が奇妙ですね。。。
htmlspecialchars_decode()のかわりにhtml_entity_decode()にしたらどうでしょ?
htmlspecialchars_decode関数はPHP5.1.0以上の実装で、html_entity_decode関数はPHP4.3.0以上のようですので、広範囲な環境をカバーするhtml_entity_decodeの方が良さそうです。html_entity_decodeのデフォルトキャラクタセットはISO-8859-1(latin-1)ですが、このケースではURLにマルチバイト文字は入らないと思いますので、関数の差し替えだけで問題ないと思います(システムの修正時はちゃんとキャラクタセットを指定した方がイイでしょうね ^^;)。
類似問題が発生する可能性のある箇所は下の4箇所?("MODxMailer"でgrepし、global $site_url; や $modx->makeUrl()でパスを引用/生成してるところ)
assets\snippets\weblogin\weblogin.common.inc.php(67): $mail = new MODxMailer();
assets\snippets\weblogin\weblogin.processor.inc.php(110): $mail = new MODxMailer();
manager\processors\save_user.processor.php(469): $mail = new MODxMailer();
manager\processors\save_web_user.processor.php(419): $mail = new MODxMailer();