2010年9月10日金曜日

ストレージサーバ - その5 - ldap管理webアプリ

ストレージサーバのユーザ管理のための
ldapが管理データを操作するwebアプリを作成します。
以下を実行します。
# cd /mnt/storage
# mkdir webapp
# chown apache:apache webapp
# cd webapp
# mkdir user
# cd /var/www/localhost/htdocs/
# ln -s /mnt/storage/dav/user user
# cd /mnt/storage/dav/user
# mkdir top
# cd top
# touch init.php
# touch index.php
# touch term.php
# cd ..
# mkdir group
# cd group
# touch group.php
# touch init.php
# touch term.php
# touch user.php
# touch useradd.php
# touch userdel.php
# touch useredit.php
# touch usernew.php
ここで、
/mnt/storage/webapp/user/top/*.php
/mnt/storage/webapp/user/group/*.php
の各ファイルの内容については最後に記します。
httpdで公開する各ディレクトリ毎にアクセス管理ができるのですが、
例えば、project1 と project2 を作成する場合について説明します。
以下を実行します。
# cd /mnt/storage/webapp
# chown -R apache:apache user
# cd /mnt/storage/dav
# mkdir user
# cd user
# ln -s ../../webapp/user/top/index.php index.php
# ln -s ../../webapp/user/top/init.php init.php
# ln -s ../../webapp/user/top/term.php term.php
# mkdir project1
# cd project1
ここで
# vi .htaccess
で内容を以下のようにします。
SSLRequireSSL
AuthType Basic
AuthName "hoge-project1-user"
AuthLDAPURL ldap://localhost/ou=project1,o=hoge,c=com?cn
require valid-user
続いて以下を実行します。
# chmod 600 .htaccess
# ln -s ../../../webapp/user/group/group.php group.php
# ln -s ../../../webapp/user/group/init.php init.php
# ln -s ../../../webapp/user/group/term.php term.php
# ln -s ../../../webapp/user/group/user.php user.php
# ln -s ../../../webapp/user/group/useradd.php useradd.php
# ln -s ../../../webapp/user/group/userdel.php userdel.php
# ln -s ../../../webapp/user/group/useredit.php useredit.php
# ln -s ../../../webapp/user/group/usernew.php usernew.php
# echo '' > env.php
project2 についても同様に以下を実行していきます。
# cd ..
# mkdir project2
# cd project2
ここで
# vi .htaccess
で内容を以下のようにします。
SSLRequireSSL
AuthType Basic
AuthName "hoge-project2-user"
AuthLDAPURL ldap://localhost/ou=project2,o=hoge,c=com?cn
require valid-user
以下を実行します。
# chmod 600 .htaccess
# ln -s ../../../webapp/user/group/group.php group.php
# ln -s ../../../webapp/user/group/init.php init.php
# ln -s ../../../webapp/user/group/term.php term.php
# ln -s ../../../webapp/user/group/user.php user.php
# ln -s ../../../webapp/user/group/useradd.php useradd.php
# ln -s ../../../webapp/user/group/userdel.php userdel.php
# ln -s ../../../webapp/user/group/useredit.php useredit.php
# ln -s ../../../webapp/user/group/usernew.php usernew.php
# echo '' > env.php
以下を実行してパーミッションを整えます。
# cd /mnt/storage/dav
# chown -R apache:apache user
最後になりますが、各スクリプトのソースは以下になります。
# more /mnt/storage/webapp/user/top/init.php
<?
        $ldap=ldap_connect("hoge");
        if(!$ldap){
                echo "Could not connect to ldap server.<br/>";
                exit;
        }
        if(!ldap_bind($ldap,"cn=root,o=hoge,c=com","<パスワード>")){
                echo "Could not bind to ldap server.<br/>";
                exit;
        }
?>
# more /mnt/storage/webapp/user/top/term.php
<?
        ldap_unbind($ldap);
?>
# more /mnt/storage/webapp/user/top/index.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>User control</h1>
<?
        require("init.php");
?>
<?
        $entries=ldap_search($ldap,"o=hoge,c=com","(objectclass=organizationalUnit)",array("ou"));
?>
<table border="1">
<tr><th>group</th><th>> </th></tr>
<?
        for($entry=ldap_first_entry($ldap,$entries);$entry!=false;$entry=ldap_next_entry($ldap,$entry)){
                $value=ldap_get_values($ldap,$entry,"ou");
                printf("<tr><td>%s</td><td><a href=\"./%s/group.php?group=%s\">go</a></td></tr>\n",$value[0],$value[0],$value[0]);
        }
?>
<?
        require("term.php");
?>
</table>
</body>
</html>
# more /mnt/storage/webapp/user/group/init.php
<?
        $ldap=ldap_connect("hoge");
        if(!$ldap){
                echo "Could not connect to ldap server.<br/>";
                exit;
        }
        if(!ldap_bind($ldap,"cn=root,o=hoge,c=com","<パスワード>")){
                echo "Could not bind to ldap server.<br/>";
                exit;
        }
        require("./env.php");
?>
# more /mnt/storage/webapp/user/group/term.php
<?
        ldap_unbind($ldap);
?>
# more /mnt/storage/webapp/user/group/group.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        $entries=ldap_search($ldap,"ou=".$env_group.",o=hoge,c=com","(objectclass=organizationalPerson)",array("cn"));
?>
<table border="1">
<tr><th>user</th><th>
<?
        printf("<a href=\"./usernew.php?group=%s\">",$env_group);
?>
new</a></th></tr>
<?
        for($entry=ldap_first_entry($ldap,$entries);$entry!=false;$entry=ldap_next_entry($ldap,$entry)){
                $value=ldap_get_values($ldap,$entry,"cn");
                printf("<tr><td>%s</td><td><a href="./user.php?group=%s&user=%s\">edit</a></td><td><a href=\"./userdel.php?group=%s&user=%s\">del</a></td></tr>\n",$value[0],$env_group,$value[0],$env_group,$value[0]);
        }
?>
<?
        require("term.php");
?>
</table>
</body>
</html>
# more /mnt/storage/webapp/user/group/user.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        $entries=ldap_search($ldap,"cn=".$_GET["user"].",ou=".$env_group.",o=hoge,c=com","(objectclass=organizationalPerson)");
        $entry=ldap_first_entry($ldap,$entries);
        if($entry==false){
                echo "No user.<br/>";
                exit;
        }
        $value=ldap_get_values($ldap,$entry,"cn");
?>
<form action="./useredit.php" method="post">
<?
        printf("<input type=\"hidden\" name=\"group\" value=\"%s\">",$env_group);
        printf("<input type=\"hidden\" name=\"cn\" value=\"%s\">",$value[0]);
?>
<table>
<?
        printf("<tr><th>cn</th><td>%s</td></tr>",$value[0]);
        $value=ldap_get_values($ldap,$entry,"sn");
        printf("<tr><th>sn</th><td><input type=\"text\" name=\"sn\" value=\"%s\" /></td></tr>",$value[0]);
        $value=ldap_get_attributes($ldap,$entry);
        if($value["mail"]["count"]>0){
                $value=ldap_get_values($ldap,$entry,"mail");
                $mail=$value[0];
        }
        else
                $mail="";
        printf("<tr><th>mail</th><td><input type=\"text\" name=\"mail\" value=\"%s\" /></td></tr>",$mail);
?>
<tr><th>userPassword</th><td><input type="password" name="pass"></td></tr>
<tr><th align="right">(confirm)</th><td><input type="password" name="pass1"></td
></tr>
</table>
<input type="submit" value="OK">
</form>
<?
        require("term.php");
?>
</body>
</html>
# more /mnt/storage/webapp/user/group/useradd.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        if($_SERVER["REMOTE_USER"]!="root"){
                echo "root user only can.<br/>";
                exit();
        }
        if($_POST["pass"]!=$_POST["pass1"]){
                echo "password error.<br/>";
                exit();
        }
        $p=exec("slappasswd -s ".$_POST["pass"]);
        $data["objectclass"]="organizationalPerson";
        $data["cn"]=$_POST["cn"];
        $data["sn"]=$_POST["sn"];
        $data["userPassword"]=$p;
        $data["mail"]=$_POST["mail"];
        $r=ldap_add($ldap,"cn=".$_POST["cn"].",ou=".$env_group.",o=hoge,c=com",$data);
        if($r==true){
                echo "OK.<br/>";
        }
        else{
                echo "error.<br/>";
        }
?>
<?
        require("term.php");
?>
</body>
</html>
# more /mnt/storage/webapp/user/group/userdel.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        if($_SERVER["REMOTE_USER"]!="root"){
                echo "root user only can.<br/>";
                exit();
        }
        $r=ldap_delete($ldap,"cn=".$_GET["user"].",ou=".$env_group.",o=hoge,c=com");
        if($r==true){
                echo "OK.<br/>";
        }
        else{
                echo "error.<br/>";
        }
?>
<?
        require("term.php");
?>
</body>
</html>
# more /mnt/storage/webapp/user/group/useredit.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        if(($_SERVER["REMOTE_USER"]!="root")&&($_SERVER["REMOTE_USER"]!=$_POST["cn"])){
                echo "authentication error.<br/>";
                exit();
        }
        if($_POST["pass"]!=$_POST["pass1"]){
                echo "password error.<br/>";
                exit();
        }
        if($_POST["pass"]!=""){
                $p=exec("slappasswd -s ".$_POST["pass"]);
                $data["userPassword"]=$p;
        }
        $data["sn"]=$_POST["sn"];

        $entries=ldap_search($ldap,"cn=".$_POST["cn"].",ou=".$env_group.",o=hoge,c=com","(objectclass=organizationalPerson)");
        $entry=ldap_first_entry($ldap,$entries);
        if($entry==false){
                echo "No user.<br/>";
                exit;
        }
        $value=ldap_get_attributes($ldap,$entry);
        if($value["mail"]["count"]==0){
                $dummy["mail"]="";
                ldap_mod_add($ldap,"cn=".$_POST["cn"].",ou=".$env_group.",o=hoge,c=com",$dummy);
        }
        $data["mail"]=$_POST["mail"];

        $r=ldap_modify($ldap,"cn=".$_POST["cn"].",ou=".$env_group.",o=hoge,c=com",$data);
        if($r==true){
                echo "OK.<br/>";
        }
        else{
                echo "error.<br/>";
        }
?>
<?
        require("term.php");
?>
</body>
</html>
# more /mnt/storage/webapp/user/group/usernew.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        $entries=ldap_search($ldap,"ou=".$env_group.",o=hoge,c=com","(objectclass=organizationalPerson)",array("cn","sn","userPassword"));
        $entry=ldap_first_entry($ldap,$entries);
        if($entry==false){
                echo "No user.<br/>";
                exit;
        }
        $value=ldap_get_values($ldap,$entry,"cn");
?>
<form action="./useradd.php" method="post">
<?
        printf("<input type=\"hidden\" name=\"group\" value=\"%s\">",$env_group);
?>
<table>
<tr><th>cn</th><td><input type="text" name="cn"></td></tr>
<tr><th>sn</th><td><input type="text" name="sn"></td></tr>
<tr><th>mail</th><td><input type="text" name="mail"></td></tr>
<tr><th>userPassword</th><td><input type="password" name="pass"></td></tr>
<tr><th align="right">(confirm)</th><td><input type="password" name="pass1"></td
></tr>
</table>
<input type="submit" value="OK">
</form>
<?
        require("term.php");
?>
</body>
</html>

0 件のコメント:

コメントを投稿