はい、ログイン情報を教えて下さい ユーザID,メールアドレス

はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- M M の投稿
返信数: 13

(現状)

はい、ログイン情報を教えて下さいボタンを押すと、ユーザIDまたはメールアドレスのうち1つだけ入力。

(改善)

ユーザIDとメールアドレス両方入力すると登録しているメールアドレスに送信される。

moodle\server\moodle\login

forgot_password.phpというファイルを修正すれば良いという所まで分かっています。だが、どこを修正をすれば良いのかわかりません。

宜しくお願いします。

M M への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- Tatsuya Shirai の投稿

> forgot_password.phpというファイルを修正すれば良いという所まで分かっています。だが、どこを修正をすれば良いのかわかりません。

 いえ,多分,そちらではなく,login/forgot_password_form.phpのfunction validation()の方だと思います.フォームに入力されたデータの正当性を調べる関数です.この条件を満たすかどうか,自動チェックされます.

 まず,最初のif文で,ユーザ名とEmail両方を入力した場合と,ユーザ名もEmail両方とも入力しなかった場合はエラーとしています.ここを後者のみ有効とする必要があるでしょう.次のif文の条件でEmailのみ入力された場合のチェックを行い,最後のelseでユーザ名のチェックを行っていると思います.

 動作確認は全く行っていません.多分,以下のような修正でご希望の動きをする可能性があります.


     function validation($data, $files) {
        global $CFG;

        $errors = parent::validation($data, $files);

//       if ((!empty($data['username']) and !empty($data['email'])) or (empty($data['username']) and empty($data['email']))) {
         if ((empty($data['username']) and empty($data['email'])) {
            $errors['username'] = get_string('usernameoremail');
            $errors['email']    = get_string('usernameoremail');

        } else if (!empty($data['email'])) {
            if (!validate_email($data['email'])) {
                $errors['email'] = get_string('invalidemail');

(省略)

                if (!$user and empty($CFG->protectusernames)) {
                    $errors['email'] = get_string('emailnotfound');
                }
            }
            $emailuser = $user;  // 追加

//      } else {
            if ($user = get_complete_user_data('username', $data['username'])) {
                if (empty($user->confirmed)) {
                    $errors['email'] = get_string('confirmednot');
                }
                if ($user->id != $emailuser->id) $erro['email'] = get_string('confirmednot');  // 追加
            }
            if (!$user and empty($CFG->protectusernames)) {
                $errors['username'] = get_string('usernamenotfound');
            }
        }

        return $errors;
    }

 


 赤い行が修正箇所です.1つ目の部分はif文の条件の A or B を B のみとしています.これでユーザ名とEmailを同時に入力してもエラーにならなくなります.ただし,その後の青い行で示した箇所の get_string('usernameoremail');ですが,多分,実情を表さないメッセージになると思います.いっそのこと,get_string('confirmednot'); にした方が良いかも知れません.なんにせよ,フォームのコメントから変える必要はありますね.


 いまは検証する時間的余裕がありません.よくチェックして下さい.たとえば,(1)実在しないユーザ名と実在しないEmailアドレスを入力する,(2)実在しないユーザ名だけいを入力する,(3)実在しないEmailアドレスを入力する,(4)実在するユーザ名だけ入力する,(5)実在するEmailアドレスだけ入力する,(6)実在するユーザ名と,そのユーザとは別の実在するユーザのEmailアドレスを入力する.これらがすべてNGであることを確認するのは最低限,必要です.その上で,(7)実在するユーザ名とそのユーザのEmailアドレスを入力して,正しくメールが送信されることを確認しましょう.

#次にmoodle.orgで返信できるのは来週の月曜日の夕方です.頑張って下さい.

Tatsuya Shirai への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- M M の投稿

get_string('usernameoremail');

get_string('confirmednot');

2つの方法を試した結果、画面に何も出ませんでした。

添付 _.jpg
M M への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- M M の投稿
forgot_password_form.phpを添付しておきます.
M M への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- Tatsuya Shirai の投稿

だめです.文字コードがシフトJISです.UTF-8で保存し直してリトライして下さい.

Tatsuya Shirai への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- M M の投稿

UTF-8で保存し直してリトライしてみましたが、ダメでした.

M M への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- Tatsuya Shirai の投稿
先の投稿に書きましたように、月曜の夜までは戻れません。頑張って下さい。

さて、二つの質問があります。

Q1 なぜユーザ名と電子メールアドレスの両方を正しく入力しなくてはならない、という厳しい条件に改造しようと考えているのでしょうか? 批判をしているのではなく、純粋な疑問です。

Q2 Johnさん、PHPの参考書をお持ちですか?
Tatsuya Shirai への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- M M の投稿

Q1

ユーザ名と電子メールアドレスの両方を正しく入力しなくてはならないと条件をつける理由

① Aさんは、Bさんのメールアドレスだけ知っていれば、簡単にパスワードを変更できる。

② AさんがCさんとは友人であったが、一つの事で嫌いになったと仮定

AさんはCさんに意地悪しようと思い、Cさんのメールアドレスだけを知っていたのでパスワードを変更できる.

Q2

PHPの参考書は持っていません.

おすすめの書籍を教えて下さい.

M M への返信

このフォーラム投稿は削除されました。

このフォーラム投稿のコンテンツは削除されたため現在アクセスすることはできません。
削除済みユーザ への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- Tatsuya Shirai の投稿

 そうですね.基本的に電子メールアドレスを持っていないとパスワードの自主的な変更はできなかったはずです.井伊さん(でよろしいのでしょうか?)の仰るように,パスワードを忘れてしまったユーザに対して,システムは電子メールを送ります.それをもし他者が受信できてしまうならば乗っ取りが可能ですが,もう,そういう状態だとMoodle以前の状態です.

 なぜ,ユーザ名,あるいは電子メールアドレスのいずれか一方だけを入力してくれ,とMoodleが要求しているのか.それはもし両方とも別のユーザのものでありながら正しかった場合です.Aさんのユーザ名とBさんの電子メールアドレス.さぁ,Moodleはどちらに電子メールを送れば良いのか?

 ユーザ名を忘れるユーザは多いですね.また,学籍番号をユーザ名としている場合は間違えて別のユーザのユーザ名を入力してしまうかも知れません.そういう意味では電子メールアドレスを優先するべきかも知れませんね.(でも,学生は自分のつけた複雑な電子メールアドレスを覚えていない^^;)


 Johnさんの心配しているのは乗っ取りではないのかも知れませんよ. > 井伊さん

 退屈しのぎに,他人のユーザ名を片っ端から入力して嫌がらせをする者はいるかも知れません.なにせログイン前ですから,誰がこのイジワルを行っているのかは誰にも分かりません.もしこういうイタズラが横行しているのであれば,Johnさんの要望も納得できます.

M M への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- Tatsuya Shirai の投稿

 回答ありがとうございます.

 私も,それ以外の方々も皆,本業の傍らでボランティアとしてこのフォーラムに返答を行っています.ボランティアといっても天使の心ではありません.私たちの得る報酬は知的好奇心と自己満足です(笑).ですので,「なぜ,そのような要望を持つのか」をこのように回答して頂くと,グッとやる気がでます.もしそうでなければ報酬として金銭をお支払い頂けないと誰も質問には応じないでしょう.

 PHPの最低限の勉強は行った方が良いでしょう.少なくとも関数のリファレンスは紙の書籍を傍らに置いておくことを勧めます.残念ながら良い参考書には私は出会えませんでしたので推薦できません.リファレンスとしては「PHPポケットリファレンス」(技術評論社,大垣靖男 著, ISBN4-7741-2502-4, 定価2380税別)を使っています.「この関数はどういう関数だろう」という関数名による索引と「こういうことをしたい場合は...」という目的に応じた索引があり,最低限の条件は満たしています.あまり大きな本では無いので,机の上に置いても邪魔ではない,という点が優れていますね.

 PHPの勉強については,「そふぃのPHP入門」(http://nyx.pu1.net/)が入門向きですね.検索を掛けるとこのページに到達することが多いので,人気も高いのでしょう.

Tatsuya Shirai への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- Tatsuya Shirai の投稿

 いま時間ができましたので,試してみました.

 当方の環境では(正常な場合に対してのみですが)動作しました.つまり,ユーザAさんのユーザ名と電子メールアドレスの両方を正しく入力した場合で,そのAさん宛にパスワード変更の手続きをアナウンスする電子メールが送信されました.

 片一方だけを入力した場合や,どちらかが間違っていた場合や,Aさんのユーザ名とBさんの電子メールアドレスを入力した場合,については,未チェックです.

Tatsuya Shirai への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- Tatsuya Shirai の投稿

 if文のカッコが正しく対応していませんでした.

     function validation($data, $files) {
        global $CFG;

        $errors = parent::validation($data, $files);

//       if ((!empty($data['username']) and !empty($data['email'])) or (empty($data['username']) and empty($data['email']))) {
         if (empty($data['username']) and empty($data['email'])) {
            $errors['username'] = get_string('usernameoremail');
            $errors['email']    = get_string('usernameoremail');

        } else if (!empty($data['email'])) {

赤い行のif文,こちらの頭のカッコ('(')が一つ余分でしたね.これでどうですか?
ちなみにget_string()は表示されるエラーメッセージの種類ですので,動作に影響はありません.無関係です.

 繰り返しますが,すべての入力パターンに対して検証を行った訳ではありません.Johnさん,以前に挙げたパターンを試してみてご報告頂けませんか? よろしく!

Tatsuya Shirai への返信

Re: はい、ログイン情報を教えて下さい ユーザID,メールアドレス

- Tatsuya Shirai の投稿

 本格的に取り組んでみました.

 先に示した方法では不十分です.エラーが出る場合もありそうですし,セキュリティ(ユーザ名やメールアドレスの保護)上にも問題がありそうです.もし本格的にこの対策が必要な方がいるのであれば修正点を示しますが,意外と大規模な修正が必要です.fs_moodle3.18.00以降には搭載します(デフォルトではOff).