############################################################################### # # ユーザ管理を行うアクションハンドラ # ############################################################################### package plugin::admin::AdminUserHandler; use strict; #============================================================================== # コンストラクタ #============================================================================== sub new { my $class = shift; my $self = {}; return bless $self,$class; } #============================================================================== # アクションハンドラメソッド #============================================================================== sub do_action { my $self = shift; my $wiki = shift; my $cgi = $wiki->get_CGI; $wiki->set_title("ユーザ管理"); if($cgi->param("delete") ne ""){ return $self->delete_user($wiki); } elsif($cgi->param("regist") ne ""){ return $self->user_form($wiki,{}); } elsif($cgi->param("update") ne ""){ my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file')); my $id = $cgi->param("update"); my ($pass,$type) = split(/\t/,$users->{$id}); return $self->user_form($wiki,{id=>$id,pass=>$pass,type=>$type}); } elsif($cgi->param("saveuser") ne ""){ return $self->save_user($wiki); } elsif($cgi->param("changepass") ne ""){ return $self->change_pass($wiki); } else { return $self->user_list($wiki); } } #============================================================================== # ユーザ一覧 #============================================================================== sub user_list { my $self = shift; my $wiki = shift; my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file')); my $buf .= "<h2>ユーザ一覧</h2>\n". "<table>\n". "<tr><th>ID</th><th>種別</th><th>操作</th></tr>\n"; foreach my $id (sort(keys(%$users))){ my ($pass,$type) = split(/\t/,$users->{$id}); $buf .= "<tr>\n"; $buf .= " <td>".&Util::escapeHTML($id)."</td>\n"; if($type==0){ $buf .= " <td>管理者</td>\n"; } else { $buf .= " <td>一般</td>\n"; } $buf .= " <td><a href=\"".$wiki->create_url({action=>"ADMINUSER",update=>$id})."\">変更</a> ". "<a href=\"".$wiki->create_url({action=>"ADMINUSER",delete=>$id})."\">削除</a></td>\n"; $buf .= "</tr>\n"; } $buf .= "</table>\n"; $buf .= "<form action=\"".$wiki->create_url()."\" method=\"GET\">\n". " <input type=\"submit\" name=\"regist\" value=\"ユーザの追加\">\n". " <input type=\"hidden\" name=\"action\" value=\"ADMINUSER\">\n". "</form>\n"; return $buf; } #============================================================================== # ユーザ追加・更新フォーム #============================================================================== sub user_form { my $self = shift; my $wiki = shift; my $data = shift; my $buf = "<form action=\"".$wiki->create_url()."\" method=\"POST\">\n"; if(defined($data->{id})){ $buf .= "<h2>ユーザの変更</h2>"; } else { $buf .= "<h2>ユーザの追加</h2>"; } $buf .= "<h3>ID</h3>\n"; if(defined($data->{id})){ $buf .= "<p><b>".&Util::escapeHTML($data->{id})."</b>(変更はできません)</p>\n"; $buf .= "<input type=\"hidden\" name=\"id\" value=\"".&Util::escapeHTML($data->{id})."\">\n"; } else { $buf .= "<p><input type=\"text\" name=\"id\" size=\"20\"></p>\n"; } if(!defined($data->{id})){ $buf .= "<h3>パスワード</h3>\n"; $buf .= "<p><input type=\"password\" name=\"pass\" size=\"20\"></p>\n"; } $buf .= "<h3>種別</h3>\n"; $buf .= "<p>\n"; $buf .= "<input type=\"radio\" name=\"type\" value=\"0\" id=\"type_0\""; if($data->{type}!=1){ $buf .= " checked"; } $buf .= "><label for=\"type_0\">管理者</label>\n"; $buf .= "<input type=\"radio\" name=\"type\" value=\"1\" id=\"type_1\""; if($data->{type}==1){ $buf .= " checked"; } $buf .= "><label for=\"type_1\">一般</label>\n"; $buf .= "</p>\n"; if(defined($data->{id})){ $buf .= "<input type=\"submit\" name=\"saveuser\" value=\"変更\">\n"; } else { $buf .= "<input type=\"submit\" name=\"saveuser\" value=\"追加\">\n"; } $buf .= "<input type=\"hidden\" name=\"action\" value=\"ADMINUSER\">\n"; $buf .= "</form>\n"; if(defined($data->{id})){ $buf .= "<form action=\"".$wiki->create_url()."\" method=\"POST\">\n"; $buf .= " <h2>パスワードの変更</h2>\n"; $buf .= " <h3>新しいパスワード</h3>\n"; $buf .= " <p><input type=\"password\" name=\"pass\" size=\"30\"></p>\n"; $buf .= " <input type=\"submit\" name=\"changepass\" value=\"変更\">\n"; $buf .= " <input type=\"hidden\" name=\"action\" value=\"ADMINUSER\">\n"; $buf .= " <input type=\"hidden\" name=\"id\" value=\"".&Util::escapeHTML($data->{id})."\">\n"; $buf .= "</form>\n"; } $buf .= "[<a href=\"". $wiki->create_url({ action=>"ADMINUSER" }) . "\">戻る</a>]\n"; return $buf; } #============================================================================== # ユーザ情報の保存 #============================================================================== sub save_user { my $self = shift; my $wiki = shift; my $cgi = $wiki->get_CGI; my $id = $cgi->param("id"); my $pass = $cgi->param("pass"); my $type = $cgi->param("type"); my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file')); if(!defined($users->{$id})){ if($id eq "" || $pass eq "" || $type eq ""){ return $wiki->error("ID、パスワード、ユーザ種別を指定してください。"); } } else { if($id eq "" || $type eq ""){ return $wiki->error("ID、ユーザ種別を指定してください。"); } } unless($id =~ /^[a-zA-Z0-9\-_]+$/ && (!defined($pass) || $pass =~ /^[a-zA-Z0-9\-_]+/)){ return $wiki->error("ID、パスワードには半角英数字しか使用できません。"); } if(defined($users->{$id})){ ($pass) = split(/\t/,$users->{$id}); $users->{$id} = "$pass\t$type"; } else { $users->{$id} = &Util::md5($pass,$id)."\t$type"; } &Util::save_config_hash($wiki,$wiki->config('userdat_file'),$users); $wiki->redirectURL( $wiki->create_url({ action=>"ADMINUSER"}) ); } #============================================================================== # パスワードの変更 #============================================================================== sub change_pass { my $self = shift; my $wiki = shift; my $cgi = $wiki->get_CGI(); my $id = $cgi->param("id"); my $pass = $cgi->param("pass"); my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file')); my ($p,$type) = split(/\t/,$users->{$id}); $users->{$id} = &Util::md5($pass,$id)."\t$type"; &Util::save_config_hash($wiki,$wiki->config('userdat_file'),$users); $wiki->redirectURL( $wiki->create_url({ action=>"ADMINUSER"}) ); } #============================================================================== # ユーザの削除 #============================================================================== sub delete_user { my $self = shift; my $wiki = shift; my $cgi = $wiki->get_CGI; my $id = $cgi->param("delete"); my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file')); my $saveusers = {}; foreach(sort(keys(%$users))){ if($_ ne $id){ $saveusers->{$_} = $users->{$_}; } } &Util::save_config_hash($wiki,$wiki->config('userdat_file'),$saveusers); $wiki->redirectURL( $wiki->create_url({ action=>"ADMINUSER"}) ); } 1;