ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Satoshi Hayakawa の投稿
返信数: 14
こんにちは。何時もお世話になっております
 さて、ユーザのアップロードについて、教えてください
ユーザ登録をリストからアップロードする時、"パスワードの変更を強制"にチェックをつけたいと考えています
しかし、ヘルプを見ても、"正しいインポートファイルの例です"にもありませんでした
チェックを入れるための"フォールド名"と"記入内容"を、ご存知の方がいらっしゃいましたらお教えください
宜しくお願い致します
Satoshi Hayakawa への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
>ユーザ登録をリストからアップロードする時、"パスワードの変更を強制"にチェックをつけたいと考えています
>しかし、ヘルプを見ても、"正しいインポートファイルの例です"にもありませんでした

ユーザアップロード用のプログラムを修正する必要があります。
下記プログラム修正をお試しください。笑顔

修正対象プログラム: admin/uploaduser.php
修正箇所: 277行目

[修正前]
} else { // new user
if ($user->id = insert_record("user", $user)) {
notify("$struser: $user->id = $user->username");
$usersnew++;
if (empty($user->password) && $createpassword) {
// passwords will be created and sent out on cron
insert_record('user_preferences', array( userid => $user->id,
name => 'create_password',
value => 1));
insert_record('user_preferences', array( userid => $user->id,
name => 'auth_forcepasswordchange',
value => 1));
}
} else {

[修正後]
} else { // new user
if ($user->id = insert_record("user", $user)) {
notify("$struser: $user->id = $user->username");
$usersnew++;
// if (empty($user->password) && $createpassword) {
// passwords will be created and sent out on cron
insert_record('user_preferences', array( userid => $user->id,
name => 'create_password',
value => 1));
insert_record('user_preferences', array( userid => $user->id,
name => 'auth_forcepasswordchange',
value => 1));
// }
} else {



Mitsuhiro Yoshida への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Satoshi Hayakawa の投稿

吉田様

こんにちは
毎回、ご指導ありがとうございます
phpの修正プログラムをありがとうございます
しかし、残念ながら、私には開発者権限がありません
その為、開発者に吉田様の修正プログラムを送り、変更をしてもらいます
ありがとうございます

Satoshi Hayakawa への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
「パスワード変更の強制」に関して、プログラムを修正しない方法もございます。
手順は下記のとおりです。

1. ユーザアップロード用のテキストファイルを作成する。
例)
username, firstname, lastname, email
user001, firstname001, lastname001, user001@moodleuser.com
user002, firstname002, lastname002, user002@moodleuser.com

2. Moodleサイトで「管理 > ユーザ > アカウント > ユーザのアップロード」に移動する。

3. 1.で作成したアップロード用のファイルを選択する。

4. アップロードオプションを選択する。
パスワードフィールドの取り扱い: 必要に応じてパスワードを作成する
既存のアカウントを更新する: No
リネームを許可する: No

5. 「ユーザのアップロード」ボタンをクリックする。

6. cronによる仮パスワードの自動発行
定期的に動作しますadmin/cron.phpが各ユーザの仮パスワードを作成し、
ユーザアップロード用のテキストファイルで指定されたメールアドレス宛に
ユーザIDおよび仮パスワードを記載した「パスワードの変更を促すメール」を
送信します。

Mitsuhiro Yoshida への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Satoshi Hayakawa の投稿

吉田様

こんにちは
出来ました!
お陰さまで、出来ました満面の笑顔
何度も、また毎回ご指導を戴きまして、ありがとうございます
これからも宜しくお願い致します

Satoshi Hayakawa への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
> お陰さまで、出来ました満面の笑顔
> 何度も、また毎回ご指導を戴きまして、ありがとうございます

どういたしまして。ウインク

このJapanese Moodleコースに「質問と答え」を蓄積することで、Moodleをご利用頂いています数多くの方々への有益な情報となります。
どのような内容でも、お気軽にご質問ください。

Mitsuhiro Yoshida への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Satoshi Hayakawa の投稿

こんにちは
今更ながら、追加で質問させて下さい
吉田様の例で登録を行った時、user001の方のパスワードは何になるのでしょうか?
例)
username, firstname, lastname, email
user001, firstname001, lastname001, user001@moodleuser.com

   ・ユーザ名:user001
   ・パスワード:???
パスワードに「ユーザ名」を入れたり、「ブランク」にしたりしましたが、ログインできませんでした

やはり、大勢のユーザに"パスワードの変更を強制"して、リスト登録するのは、難しいのでしょうか

Satoshi Hayakawa への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
> 吉田様の例で登録を行った時、user001の方のパスワードは何になるのでしょうか?

残念ですが、パスワードの推測はできないようです。

lib/wordlist.txtに登録されているデータを基に、lib/moodlelib.phpの5889行目の関数「generate_password()」で任意のパスワードが生成されます。

フォーラム等の投稿内容を定期的にメール送信する機能を持ったプログラムadmin/cron.phpが、前述の生成済みパスワードをユーザ宛にメール送信します。

この場合、ユーザに対して「パスワード変更を強制」しますが、仮パスワードの提示も含めて、そのインストラクションは各ユーザに送信されるメールに個別記載されています。ですから、そのメールを受信しない限り、どのようなパスワードが設定されたのか知ることはできません。

> やはり、大勢のユーザに"パスワードの変更を強制"して、リスト登録するのは、難しいのでしょうか

下記プログラム修正により可能だと思います。ウインク
http://moodle.org/mod/forum/discuss.php?d=84635&parent=374032
Mitsuhiro Yoshida への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Tatsuya Shirai の投稿

 前々からFAQとして出ているユーザアップロード時のファイルコードの問題ですが,もしかしたらadmin/uploaduser.phpの以下の修正を行うとExcelから出力したCSVファイルをそのまま読み込めるようになりませんか?

    $text = my_file_get_contents($filename);
    //trim utf-8 bom
    $textlib = new textlib();
    $text = $textlib->trim_utf8_bom($text);
    $text = mb_convert_encoding($text, 'UTF-8', 'auto');  // (ADD)
    //Fix mac/dos newlines
    $text = preg_replace('!\r\n?!',"\n",$text);
    $fp = fopen($filename, "w");
    fwrite($fp,$text);
    fclose($fp);

Moodle1.8.3+のadmin/uploaduser.phpの70行目近辺です.

 更に,このコードを見る限りでは,メモ帳などが出力するBOM (Byte Order Mark)を除去するコードが入っているように見えます.Moodle1.7のソースコード(2月頃)を見ると trim_utf8_bom()が入っていませんので,どこかの段階でこのコードが追加されたのでしょう.だとするとメモ帳(Notepad.exe)の出力も読み込めそうです.

 ちなみに,上記コードは未確認です.

Mitsuhiro Yoshida への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Tatsuya Shirai の投稿

 これもまた未確認(スミマセン,いまはユーザ登録の時期ではないので...)ですが,

(1) 12行目近辺

$createpassword = optional_param('createpassword', 0, PARAM_BOOL);
$updateaccounts = optional_param('updateaccounts', 0, PARAM_BOOL);
$allowrenames   = optional_param('allowrenames', 0, PARAM_BOOL);
$forcechangepassword = optional_param('forcechangepassword', 0, PARAM_BOOL); // (ADD)

require_login();

(2) 280行目近辺

                        if ($user->id = insert_record("user", $user)) {
                            notify("$struser: $user->id = $user->username");
                            $usersnew++;
//                          if (empty($user->password) && $createpassword) {
                            if ((empty($user->password) && $createpassword) || $forcechangepassword) {
                                // passwords will be created and sent out on cron
                                insert_record('user_preferences', array( userid => $user->id,
                                            name   => 'create_password',
                                            value  => 1));
                                insert_record('user_preferences', array( userid => $user->id,
                                            name   => 'auth_forcepasswordchange',
                                            value  => 1));
                            }

(3) 409行目近辺

echo '<tr><td>' . get_string('allowrenames', 'admin') . '</td><td>';
choose_from_menu($noyesoptions, 'allowrenames', $allowrenames);
echo '</td></tr>';

echo '<tr><td>' . 'パスワードの変更を強制する' . '</td><td>';  // (ADD)
choose_from_menu($noyesoptions, 'forcechangepassword', $forcechangepassword); // (ADD)
echo '</td></tr>';  // (ADD)
echo '</table><br />';
echo '<input type="submit" value="'.$struploadusers.'" />';
echo '</div></form><br />';
echo '</div>';

 このような感じで,フォームの入力を一つ追加するのも可能かな?(フォームが追加されること,初期値がNoになることは確認)
 この場合,アップロードファイルに入力済みのパスワードはどうなるのか,は推測に過ぎませんが,多分,無視されて新しい自動生成されたパスワードが設定されるのですよね?(吉田さん,正しいですか?) 「パスワードはユーザ名と同じだからね.ログインしたら直ぐに修正して!」は運用上,楽なのですが,セキュリティ上は非常にキケンですからねぇ.「オレのパスワードは1111だ」などと勘違いして豪語する学生もたまに居るし悲しい

 前々から,私もこういうオプションはあった方が良いと感じていました.ただ,ユーザ登録は年に1回(私は過去に1回のみ)しか行わないので,喉もと過ぎたらナントヤラでした.

Tatsuya Shirai への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Satoshi Hayakawa の投稿

こんにちは
お返事が送れて申し訳ありません(風邪で休んでいました)
 さて、沢山の助言を戴きまして、ありがとうございます
私なりの結論を申し上げます
 将来的には、プログラム修正を行いたいと思います
修正につきましては、吉田様と白井様の内容を開発者に見せ、相談いたします
 現状案と致しまして、以下の手順で回避できる事が分かりました

 1)ユーザアップロード用のテキストファイルを作成する。
    例)
    username, firstname, lastname, email
    user001, firstname001, lastname001, user001@moodleuser.com
    user002, firstname002, lastname002, user002@moodleuser.com
 2)”パスワードフィールドの取り扱い: 必要に応じてパスワードを作成する” を設定してアップロードする
  吉田様、ご指導の内容:2007年 11月 16日(金曜日) 18:47
 3)ユーザアップロード用のテキストファイルにパスワードを追加する
    例)
    username, password, firstname, lastname, email
    user001, user001, firstname001, lastname001, user001@moodleuser.com
    user002, user002, firstname002, lastname002, user002@moodleuser.com
 4)”既存のアカウントを更新する:Yes” に設定して再度アップロードする

  2度のアップロード作業ですが、プログラム修正なしで
   ・”パスワードの変更を強制”にチェックを入れ
   ・特定のパスワードを指定する
事が出来ました
 しかし、作業的には2倍掛かるので、将来的にはプログラム修正が必要と考えます
 皆様、沢山のアドバイスをお寄せくださり、ありがとうございました


 

Tatsuya Shirai への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Tatsuya Shirai の投稿

 あまりにも無責任なので”パスワードの強制”を試してみました.

 まず,ユーザアップロードファイルのpasswordは無視されると書きましたが,これは私の間違いで,例えば,username が test1 で password が pass1 ならば,pass1は有効です.test1のユーザがpass1でログイン後に,新しいパスワードへの変更画面が出ました.ですので,”お手軽なパスワードを設定”も可能ですね青あざ

 もっとも,原因は私が,

if ((empty($user->password) && $createpassword) || $forcechangepassword) {

と甘い条件にしたせいです. || を && にし,さらに$user->passwordをemptyにし,$createpasswordをtrueにすれば,password欄は無視されます.

 ”必要に応じてパスワードを作成する”を選択すれば希望通りに”自動生成したパスワード”が送られるはずです.

 ちなみに上記修正ですが,新しくユーザを追加する場合は”パスワード変更の強制”が可能ですが,更新の場合はダメですね.

 

insert_record('user_preferences', array( userid => $user->id,
                                            name   => 'create_password',
                                            value  => 1));
insert_record('user_preferences', array( userid => $user->id,
                                            name   => 'auth_forcepasswordchange',
                                            value  => 1));

update_record('user_preferences', array( userid => $user->id,
                                            name   => 'create_password',
                                            value  => 1));
update_record('user_preferences', array( userid => $user->id,
                                            name   => 'auth_forcepasswordchange',
                                            value  => 1));

に変更して,一つ上のブロックに正しく組み込めば可能なような気もしますが...ちょっと自信が無いです.

Tatsuya Shirai への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Tatsuya Shirai の投稿

(2) の修正箇所を拡大して,$olduserが存在した場合かつ$updateacocountsがtrueの場合にも修正を適用しました.

                     if ($olduser = get_record("user", "username", $username, "mnethostid", $user->mnethostid)) {
                        if ($updateaccounts) {
                            // Record is being updated
                            $user->id = $olduser->id;
                            if (update_record('user', $user)) {
                                notify("$user->id , $user->username ".get_string('useraccountupdated', 'admin'));
                                $usersupdated++;
                            } else {
                                notify(get_string('usernotupdatederror', 'error', $username));
                                $userserrors++;
                                continue;
                            }
                            if ($forcechangepassword) {  // (ADD)
                                update_record('user_preferences', array( userid => $user->id,  // (ADD)
                                            name   => 'auth_forcepasswordchange',  // (ADD)
                                            value  => 1));  // (ADD
                            }  // (ADD)

                        } else {
                            //Record not added - user is already registered
                            //In this case, output userid from previous registration
                            //This can be used to obtain a list of userids for existing users
                            notify("$olduser->id ".get_string('usernotaddedregistered', 'error', $username));
                            $userserrors++;
                        }

                    } else { // new user
                        if ($user->id = insert_record("user", $user)) {
                            notify("$struser: $user->id = $user->username");
                            $usersnew++;
                            if (empty($user->password) && $createpassword) {
                                // passwords will be created and sent out on cron
                                insert_record('user_preferences', array( userid => $user->id,
                                            name   => 'create_password',
                                            value  => 1));
                                insert_record('user_preferences', array( userid => $user->id,
                                            name   => 'auth_forcepasswordchange',
                                            value  => 1));
                            }
                            if ($forcechangepassword) {  // (ADD)
                                update_record('user_preferences', array( userid => $user->id,  // (ADD)
                                            name   => 'auth_forcepasswordchange',  // (ADD)
                                            value  => 1));  // (ADD
                            }  // (ADD)

                        } else {

取り敢えずいまのところは大丈夫そうです.エラーチェックがあまり強くない(update_record()の失敗などをチェックしていないように見える)のが気になりますが.

 かなり開き直って,”パスワードの変更を強制するならばドンと来い”式(?)です.その分,シンプルです.ちなみに赤いブロックは上も下も全く同一内容です.

Tatsuya Shirai への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Hidenori Sugiyama の投稿
こんにちは、杉山です。
アップロード登録を行う必要があったため、修正を参考にさせて頂いたのですが、現在のコードでは更新時に少し問題があるようです。

更新時にupdate_record()を用いているため、user_preferencesに該当行がない場合(例えばアップロード登録を行ったユーザ)は値が設定されないようです。


moodleの他のコードを調べてみたところ、set_user_preference()という専用の関数が存在しました。この関数では、既存データが存在した場合は更新、存在しない場合は挿入という処理を行ってくれるようですので、こちらを用いた方が安全ではないかと思います。

if ($forcepasswordchange) {
set_user_preference("auth_forcepasswordchange", 1, $user->id);
}

手元で試した限りでは、この関数で新規・更新ともに問題なく動きました。
(念のため修正内容全体のdiffを添付しています。)

Hidenori Sugiyama への返信

Re: ユーザのアップロード登録による"パスワードの変更を強制"について(質問)

- Tatsuya Shirai の投稿

lib/moodlelib.phpの724行にある関数set_user_preference/3ですね.

 なるほど,確かに$nameで指定したレコードが存在しない場合は新しく作成していますね.自分でもコメントでupdateにはちょっと不安があるようなことを書いていますが,この関数ならば間違い無さそうです.情報提供ありがとうございました.手元のソースコードも修正を行いました.(2箇所とも)

 一応,手元では確認したつもりだったのですが,チェックが甘かったようです.これで来年度のユーザ登録がグッと楽になりそうです.

#Wikiの件でもお世話になりました.オープンソースの力を改めて実感ですね.