typer
typer_jp****@yahoo*****
2003年 10月 28日 (火) 01:25:23 JST
ども。typer.加藤です。 早速ですが、BugTrack-wiki/136 のパスワード長に関する話で書いた crypt関数MD5対応パッチです。 とりあえず互換性はあり、MD5非対応なら従来通りの方法で暗号化するはずです。 が、その辺りの環境依存の部分での確認はできていませんので、 皆さんにレビューしていただければとおもいます。 #手元で確認したのはFreeBSD,debianです。 #SYS_V系、MacOSX、Win系での確認がとりたいところ。 あと、パッチ書いて思った点として、現在プラグイン(主にadmin)側の数箇所で 直接crypt関数を使って暗号化していますが、これをできれば本体等どこかにまと めておいた方がいいような気がします。 #加えて今後のためにユーザー情報を扱うインターフェースとしてまとまる #となおよいかと。 では、以下がパッチです。 --- plugin/admin/AccountHandler.pm.orig Mon Oct 13 11:54:49 2003 +++ plugin/admin/AccountHandler.pm Tue Oct 28 00:28:26 2003 @@ -84,7 +84,9 @@ # 他人がパスワードを変更してしまうことを防止するため、パスワードを変更 # する際には現在のパスワードを照合する必要がある。 - my $login = $wiki->login_check($id,crypt($pass_old,$id)); + my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file')); + my ($p) = split(/\t/,$users->{$id}); + my $login = $wiki->login_check($id,crypt($pass_old,$p)); if(defined($login)){ my $min_length = 2; @@ -105,7 +107,10 @@ my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file')); my ($p,$type) = split(/\t/,$users->{$id}); - $users->{$id} = crypt($pass,$id)."\t$type"; + # MD5形式で生成してみて非対応なら従来通りの方法で生成 + $p = crypt($pass,'$1$'.$id.'$'); + substr($p,0,3) ne '$1$' and $p = crypt($pass,$id); + $users->{$id} = "$p\t$type"; &Util::save_config_hash($wiki,$wiki->config('userdat_file'),$users); } else { return $wiki->error("現在のパスワードが違います。"); --- plugin/admin/AdminUserHandler.pm.orig Mon Oct 13 11:54:49 2003 +++ plugin/admin/AdminUserHandler.pm Tue Oct 28 00:29:23 2003 @@ -162,7 +162,10 @@ ($pass) = split(/\t/,$users->{$id}); $users->{$id} = "$pass\t$type"; } else { - $users->{$id} = crypt($pass,$id)."\t$type"; + # MD5形式で生成してみて非対応なら従来通りの方法で生成 + my $p = crypt($pass,'$1$'.$id.'$'); + substr($p,0,3) ne '$1$' and $p = crypt($pass,$id); + $users->{$id} = "$p\t$type"; } &Util::save_config_hash($wiki,$wiki->config('userdat_file'),$users); @@ -183,7 +186,10 @@ my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file')); my ($p,$type) = split(/\t/,$users->{$id}); - $users->{$id} = crypt($pass,$id)."\t$type"; + # MD5形式で生成してみて非対応なら従来通りの方法で生成 + my $p = crypt($pass,'$1$'.$id.'$'); + substr($p,0,3) ne '$1$' and $p = crypt($pass,$id); + $users->{$id} = "$p\t$type"; &Util::save_config_hash($wiki,$wiki->config('userdat_file'),$users); return "<p>パスワードを変更しました。</p>". --- plugin/admin/Login.pm.orig Mon Oct 13 11:54:49 2003 +++ plugin/admin/Login.pm Mon Oct 27 23:57:04 2003 @@ -35,7 +35,9 @@ my $id = $cgi->param("id"); my $pass = $cgi->param("pass"); if($id ne "" && $pass ne ""){ - my $login = $wiki->login_check($id,crypt($pass,$id)); + my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file')); + my ($p) = split(/\t/,$users->{$id}); + my $login = $wiki->login_check($id,crypt($pass,$p)); if(defined($login)){ my $session = $cgi->get_session($wiki); $session->param("wiki_id" ,$id); --- plugin/farm/Install.pm.orig Mon Oct 13 11:54:49 2003 +++ plugin/farm/Install.pm Tue Oct 28 00:29:41 2003 @@ -55,7 +55,10 @@ # 管理ユーザの作成(ここで作るのはちょっとアレかも・・・) open(USERDAT,">".$self->config('config_dir')."/$child/".$self->config('userdat_file')) or die $!; - print USERDAT "$id=".crypt($pass,$id)."\t0\n"; + # MD5形式で生成してみて非対応なら従来通りの方法で生成 + my $p = crypt($pass,'$1$'.$id.'$'); + substr($p,0,3) ne '$1$' and $p = crypt($pass,$id); + print USERDAT "$id=$p\t0\n"; close(USERDAT); # create_wikiフックの呼び出し -- typer typer_jp****@yahoo***** Noboru Katoh typer****@goenn*****