<?php

/*
 * postLdapAdmin
 *
 * Copyright (C) 2006,2007 DesigNET, INC.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

/*********************************************************
 * ̴ؿ饤֥
 *
 * $Source: /home/cvsroot/postLdapAdmin/lib/libcommon,v $
 * $Revision: 1.57 $
 * $Date: 2009/06/11 04:50:07 $
 *
 *********************************************************/

/* ١ǥ쥯ȥ */
define("BASEDIR", "../../");

/* ե֥ǥ쥯ȥ */
define("ETCDIR", "etc/");

/* ե̾ */
define("WEBCONF", "web.conf");
/* Ź沽ե̾ */
define("ADMKEY", "admin.key");

/* ǥ */
define("MAXDISKQUOTA", 999);
/* 桼ɽ */
define("MAXUCOUNT", 9999);
/* ݡֹ */
define("MAXPORT", 65535);
/* ᡼륢ɥ쥹Ĺ */
define("MAXMAIL", 256);
/* 桼̾ */
define("MAXUID", 32);
/* 票ꥢ̾ */
define("MAXNAME", 32);
/* ̾ */
define("MAXADMINNAME", 16);
/* ԥѥ */
define("MAXADMINPASS", 8);
/* ѥɺǾʸ */
define("MINPASSWD", 3);
/* ѥɺǾʸ */
define("MAXPASSWD", 8);

/* postLdapAdmin̾ */
define("PLAOC", "postLdapAdmin");

/* CRYPT */
define("CRYPT", "{CRYPT}");

/* ɲDN */
define("ADD_DN", "mail=%s,%s,%s");
/* ȥ긡DN */
define("SEARCH_DN", "%s,%s");

/* ե⡼ */
define("ADD_MODE", 0);
define("POST_ADD_MODE", 1);
define("MOD_MODE", 2);
define("POST_MOD_MODE", 3);

/* LDAP return code */
define("LDAP_NOUSER", 0);
define("LDAP_FOUNDUSER", 1);
define("LDAP_ERRUSER", 2);
define("LDAP_FOUNDALIAS", 3);
define("LDAP_FOUNDOTHER", 4);

/* ե饰ξ֤ ON:0 OFF:1*/
define("ON", "0");
define("OFF", "1");

/* ե */
$conf_keys = array(
                    "ldapserver" => "no_check",
                    "ldapport" => "check_port",
                    "ldapbinddn" => "no_check",
                    "ldapbindpw" => "no_check",
                    "ldapbasedn" => "no_check",
                    "referrerurl" => "no_check",
                    "diskquotadefault" => "check_diskquota",
                    "basemaildir" => "no_check",
                    "lineperpage" => "check_ucount",
                    "adminname" => "no_check",
                    "adminpasswd" => "no_check",
                    "logfile" => "no_check",
                    "ldapusersuffix" => "no_check",
                    "ldaplistsuffix" => "no_check",
                    "ldapscope" => "check_scope",
                    "ldapfilter" => "no_check",
                    "ldapmlfilter" => "no_check",
                    "ldapobjectclass" => "no_check",
                    "displayuser" => "no_check",
                    "displayml" => "no_check",
                    "ldapobjectclass" => "no_check",
                    "maildelcommand" => "no_check");

/* Υǥե */
$conf_def = array("ldapport" => 389,
                  "diskquotadefault" => "",
                  "lineperpage" => 10);

/*********************************************************
 * read_web_conf()
 *
 * եɤ߹ߡϢ $web_conf ˳Ǽ
 *
 * []
 *       ʤ
 * [֤]
 *       TRUE          
 *       FALSE         顼
 **********************************************************/
function read_web_conf()
{
    global $domain;
    global $err_msg;
    global $conf_keys;
    global $conf_def;
    global $web_conf;

    /* ɥᥤե */
    $webconf_file = BASEDIR .  ETCDIR . $domain . "/" . WEBCONF;

    /* եɤ߹߸å */
    if (is_readable_file($webconf_file) === FALSE) {
        $err_msg = htmlspecialchars($err_msg);
        return FALSE;
    }

    /* ե򥪡ץ */
    $fp = fopen($webconf_file, "r");
    if ($fp === FALSE) {
        $err_msg = "ե뤬ץǤޤ(" .
                   htmlspecialchars($webconf_file) . ")";
        return FALSE;
    }

    /* եå */
    $ret = flock($fp, LOCK_EX);
    if ($ret === FALSE) {
        $err_msg = "եΥå˼Ԥޤ(" .
                   htmlspecialchars($webconf_file) . ")";
        fclose($fp);
        return FALSE;
    }

    /* Ԥν */
    $line = 0;

    /* եɤ߹ */
    while (feof($fp) === FALSE) {

        /* ʬХåե˳Ǽ */
        $buf = fgets($fp);
        if ($buf === FALSE) {
            break;
        }

        /* ζȲԤ */
        $buf = rtrim($buf);

        $line++;

        /* ԤƬ#ΥȹԤǤ̵ */
        if (substr($buf, 0, 1) == "#") {
            continue;
        }
        /* ԤǤ̵ */
        if (strlen($buf) == 0) {
            continue;
        }

        /* ԤλϤζڤʸʬ */
        $data = explode("=", $buf, 2);

        /* ͤnull,ѥ᡼ƬǤС顼 */
        if (($data[0] == "") || ($data[1] == "") ||
                                 substr("$data[1]", 0, 1) == " ") {
            flock ($fp, LOCK_UN);
            fclose($fp);
            set_error($webconf_file, $line);
            return FALSE;
        }

        /* ̾ʸƳǼ */
        $key = strtolower($data[0]);

        /* 줿ܤΥå */
        if(is_null($conf_keys[$key]) === TRUE) {
            flock ($fp, LOCK_UN);
            fclose($fp);
            set_error($webconf_file, $line);
            return FALSE;
        }

        /* ܤˤå */
        if ($conf_keys[$key]($data[1]) === FALSE) {
            flock ($fp, LOCK_UN);
            fclose($fp);
            set_error($webconf_file, $line);
            return FALSE;
        }

        /* ʣå */
        if (isset($web_conf[$key]) === TRUE) {
            $err_msg = "{$key}ʣƤޤ(" .
            htmlspecialchars($webconf_file) . ": {$line})";
            flock ($fp, LOCK_UN);
            fclose($fp);
            return FALSE;
        }

        /* ldapפ֤ */
        if ($key == "ldapscope") {
            $data[1] = set_ldapscope($data[1]);
        }

        /* ͤǼ */
        $web_conf[$key] = $data[1];

    }

    flock ($fp, LOCK_UN);
    fclose($fp);

    /* ̾ */
    $keys = array_keys($conf_keys);

    /* ٤ƤιܤͤåȤƤ뤫γǧ */
    foreach ($keys as $key) {
        /* åȤƤ餺ǥեͤꤵƤ硢 */
        if (!isset($web_conf[$key]) && isset($conf_def[$key])) {
            $web_conf[$key] = $conf_def[$key];
        }

        if (!isset($web_conf[$key]) === TRUE) {
            $err_msg = "" . $key . "ꤵƤޤ(" .
                       htmlspecialchars($webconf_file) . ")";
            return FALSE;
        }
    }

    return TRUE;
}

/*********************************************************
 * is_readable_file()
 * եɤ߹߸å
 *
 * []
 *      $filename  åоݥե
 * [֤]
 *      TRUE  
 *      FALSE 顼
 **********************************************************/
function is_readable_file($filename)
{
    global $err_msg;

    /* STATΥå奯ꥢ */
    clearstatcache();

    /* ¸ߤΥå */
    if (file_exists($filename) === FALSE) {
        $err_msg = "ե뤬¸ߤޤ($filename)";
        return FALSE;
    }

    /* ǥ쥯ȥ꤫Υå */
    if (is_dir($filename) === TRUE) {
        $err_msg = "ꤵ줿եϥǥ쥯ȥǤ($filename)";
        return FALSE;
    }

    /*  եɤ߹߸å */
    if (is_readable($filename) === FALSE) {
        $err_msg = "եɤ߹߸ޤ($filename)";
        return FALSE;
    }

    return TRUE;
}

/***********************************************************
 * is_writable_file()
 *
 * եν߸å
 *
 * []
 *      $filename       åоݥե
 * [֤]
 *      TRUE            
 *      FALSE           顼
 ************************************************************/
function is_writable_file($filename)
{
    global $err_msg;

    /* STATΥå奯ꥢ */
    clearstatcache();

    /* ¸ߥå */
    if (file_exists($filename) === FALSE) {
        if (is_writable(dirname($filename)) === FALSE) {
            $err_msg = "ǥ쥯ȥ˽߸ޤ($filename)";
            return FALSE;
        }
        return TRUE;
    }

    /*  ǥ쥯ȥå */
    if (is_dir($filename) === TRUE) {
        $err_msg = "ꤵ줿եϥǥ쥯ȥǤ($filename)";
        return FALSE;
    }

    /*  եν߸å */
    if (is_writable($filename) === FALSE) {
        $err_msg = "ե˽߸ޤ($filename)";
        return FALSE;
    }
    return TRUE;
}

/*********************************************************
 * no_check()
 *
 * ߡؿ
 *
 * []
 *       ʤ
 * [֤]
 *       TRUE   
 **********************************************************/
function no_check()
{
    return TRUE;
}

/*********************************************************
 * check_port()
 *
 * ݡֹå
 *
 * []
 *      $port           ݡֹ
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 **********************************************************/
function check_port($port)
{
    /* ȾѿΤߵ */
    $num = "0123456789";
    if (strspn($port, $num) != strlen($port)) {
        return FALSE;
    }

    /* 1ݡֹޤ */
    if (($port < 1) || ($port > MAXPORT)) {
        return FALSE;
    }
    return TRUE;
}

/*********************************************************
 * check_scope()
 *
 * LDAPץå
 *
 * []
 *      $scope          
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 **********************************************************/
function check_scope($scope)
{
    switch ($scope) {
        case "base";
            return TRUE;
        case "one";
            return TRUE;
        case "sub";
            return TRUE;
    }

    return FALSE;
}

/*********************************************************
 * check_diskquota()
 *
 * ǥ̥å
 *
 * []
 *      $quota          ǥ
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 **********************************************************/
function check_diskquota($quota)
{
    global $err_msg;

    /* ȾѿΤߵ */
    $num = "0123456789";
    if (strspn($quota, $num) != strlen($quota)) {
        $err_msg = "᡼ܥå̤ηǤ";
        return FALSE;
    }

    /* 1-ǥ */
    if ($quota < 0 || $quota > MAXDISKQUOTA) {
        $err_msg = "᡼ܥå̤ηǤ";
        return FALSE;
    }
    return TRUE;
}

/*********************************************************
 * check_ucount()
 *
 * 桼ɽå
 *
 * []
 *      $ucount         桼ɽ
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 **********************************************************/
function check_ucount($ucount)
{
    /* ȾѿΤߵ */
    $num = "0123456789";
    if (strspn($ucount, $num) != strlen($ucount)) {
        return FALSE;
    }

    /* 1-桼ɽ */
    if ($ucount < 1 || $ucount > MAXUCOUNT) {
        return FALSE;
    }
    return TRUE;
}

/*********************************************************
 * check_passwd()
 *
 * ѥɥå
 *
 * []
 *      $passwd      ѥ
 *      $minlen      Ǿʸ
 *      $maxlen      ʸ
 * [֤]
 *      TRUE         
 *      FALSE        ۾
 **********************************************************/
function check_passwd($passwd, $minlen, $maxlen)
{
    global $err_msg;

    /* ʸå */
    $letters = strlen($passwd);
    if ($letters < $minlen || $letters > $maxlen) {
        $err_msg = "ѥɤηǤ";
        return FALSE;
    }

    /* Ⱦѱ羮ʸ국Τߵ */
    $num = "0123456789";
    $sl = "abcdefghijklmnopqrstuvwxyz";
    $ll = strtoupper($sl);
    $sym = "!\"#$%&'()=-~^|@`[{;+:*]},<.>\/?_";
    $allow_letter = $num . $sl . $ll . $sym;
    if (strspn($passwd, $allow_letter) != $letters) {
        $err_msg = "ѥɤηǤ";
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * check_name()
 *
 * 桼̾å
 *
 * []
 *      $name        桼̾
 *      $maxlen      ʸ
 * [֤]
 *      TRUE         
 *      FALSE        ۾
 **********************************************************/
function check_name($name, $maxlen)
{
    global $err_msg;

    $letters = strlen($name);
    if ($letters > $maxlen) {
        $err_msg = "桼̾ηǤ";
        return FALSE;
    }

    /* ȾѱѾʸ[.-_]Τߵ */
    /* ƬϿޤȾѱʸ */
    $num = "0123456789";
    $sl = "abcdefghijklmnopqrstuvwxyz";
    $sym = ".-_";
    $allow_letter = $num . $sl . $sym;
    $head = substr($name, 0, 1);
    if (strspn($name, $allow_letter) != $letters ||
        strspn($head, $sym) == 1) {
        $err_msg = "桼̾ηǤ";
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * check_search_name()
 *
 * 桼̾å
 *
 * []
 *      $name        ̾
 *      $maxlen      ʸ
 * [֤]
 *      TRUE         
 *      FALSE        ۾
 **********************************************************/
function check_search_name($name)
{
    global $err_msg;

    /* ʸĹå */
    if (strlen($name) > MAXMAIL) {
        $err_msg = "桼̾ηǤ";
        return FALSE;
    }

    /* ȾѱѾʸʲεΤߵ */
    $num = "0123456789";
    $sl = "abcdefghijklmnopqrstuvwxyz";
    $ll = strtoupper($sl);
    $sym = "@!#$%&'*+-/=?^_{}~.";
    $allow_letter = $num . $sl . $ll . $sym;
    if (strspn($name, $allow_letter) != strlen($name)) {
        $err_msg = "桼̾ηǤ";
        return FALSE;
    }

    return TRUE;
}


/*********************************************************
 * check_mail()
 *
 * ᡼륢ɥ쥹Υå
 *
 * []
 *      $mail  ᡼륢ɥ쥹
 * [֤]
 *      TRUE    
 *      FALSE   顼
 **********************************************************/
function check_mail($mail)
{
    global $err_msg;

    /* ᡼륢ɥ쥹Ĺå */
    if (strlen($mail) > MAXMAIL) {
        $err_msg = "᡼륢ɥ쥹ηǤ";
        return FALSE;
    }

    /* @Ĥ˶ڤ뤫Υå */
    $buf = explode('@', $mail, 2);
    if (count($buf) != 2 || $buf[0] == "" || $buf[1] == "") {
        $err_msg = "᡼륢ɥ쥹ηǤ";
        return FALSE;
    }

    /* @Υå */
    /* ȾѱѾʸʲεΤߵ */
    $num = "0123456789";
    $sl = "abcdefghijklmnopqrstuvwxyz";
    $ll = strtoupper($sl);
    $sym = "!#$%&'*+-/=?^_{}~.";
    $allow_letter = $num . $sl . $ll . $sym;
    if (strspn($buf[0], $allow_letter) != strlen($buf[0])) {
        $err_msg = "᡼륢ɥ쥹ηǤ";
        return FALSE;
    }

    /*  @Υå */
    if (strlen($buf[1]) < 3) {
        $err_msg = "᡼륢ɥ쥹ηǤ";
        return FALSE;
    }

    $sym = "-_.";
    $must = ".";
    $must_not = "..";

    /* ɥåȤϤޤХ顼 */
    if (substr($buf[1], 0, 1) == $must) {
        $err_msg = "᡼륢ɥ쥹ηǤ";
        return FALSE;
    }

    /* 1İʾΥɥåȤɬܡ */
    if (strpos($buf[1], $must) === FALSE) {
        $err_msg = "᡼륢ɥ쥹ηǤ";
        return FALSE;
    }

    /* 2İʾΥɥåȤϢ³϶ػߡ */
    if (strpos($buf[1], $must_not) !== FALSE) {
        $err_msg = "᡼륢ɥ쥹ηǤ";
        return FALSE;
    }

    $allow_letter = $num . $sl . $ll . $sym;
    $length = strlen($buf[1]);
    if (strspn($buf[1], $allow_letter) != $length) {
        $err_msg = "᡼륢ɥ쥹ηǤ";
        return FALSE;
    }

    return TRUE;
}

/***********************************************************
 * check_flg()
 *
 * ͤONOFFΤŤ줫Ǥ뤳Ȥå
 *
 * []
 *      $flg    ե饰
 * [֤]
 *      TRUE    
 *      FALSE   顼
 **********************************************************/
function check_flg ($flg)
{
    if ($flg != ON && $flg != OFF) {
        return FALSE;
    }
    return TRUE;
}

/*********************************************************
 * set_error()
 *
 * եɤ߹߻Υ顼å򥻥åȤ롣
 *
 * []
 *      $filename       󤬳Ǽ줿ե
 *      $line           ʥǡĤä
 * [֤]
 *      ʤ
 **********************************************************/
function set_error($filename, $line)
{
    global $err_msg;
    $err_msg = "ηǤ (" .
               htmlspecialchars($filename) . " : {$line})";
}

/*********************************************************
 * get_userdata()
 *
 * 桼ξ
 *
 * []
 *        $userdn  桼DN
 * [֤]
 *        TRUE               
 *        FALSE              顼
 **********************************************************/
function get_userdata ($userdn)
{
    global $ldapdata;

    $filter = "objectClass=" . PLAOC;
    $attrs = array();

    /* ȥμ */
    $ret = main_get_entry($userdn, $filter, $attrs, TYPE_ONEENTRY, $ldapdata);
    if ($ret != LDAP_OK) {
        return FALSE;
    }
    return TRUE;
}

/*********************************************************
 * get_userdata_connect()
 *
 * 桼ξ
 *
 * []
 *        $userdn  桼DN
 *        $ds      LDAPID
 * [֤]
 *        TRUE               
 *        FALSE              顼
 **********************************************************/
function get_userdata_connect($userdn, $ds)
{
    global $ldapdata;

    $filter = "objectClass=" . PLAOC;
    $attrs = array();

    /* ȥμ */
    $ret = main_get_entry_connect($userdn, $ds, $filter, $attrs, TYPE_ONEENTRY,
                          $ldapdata);
    if ($ret != LDAP_OK) {
        return FALSE;
    }
    return TRUE;
}
/*********************************************************
 * to_MB()
 *
 * ᥬХȤѴ
 *
 * []
 *           $value     Ѵ(Х)
 * [֤]
 *           ᥬХȤѴ
 **********************************************************/
function to_MB($value)
{
    if ($value <= 0) {
        return 0;
    }

    /*  1MB 꾮 */
    if ($value < 1048576) {
        return 1;
    }

    $tmp = $value / 1048576;
    return (int) (round($tmp));
}


/***********************************************************
 * my_crypt()
 *
 * ѥɤŹ沽
 *
 * []
 *             $passwd           ѥ
 * [֤]
 *             $crypt_passwd     Ź沽줿ѥ
 ************************************************************/
function my_crypt($passwd)
{
    $salts = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L",
                   "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
                   "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
                   "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
                   "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7",
                   "8", "9", ".", "/" );

    $rand_key = array_rand($salts, 2);

    $salt = $salts[$rand_key[0]] . $salts[$rand_key[1]];

    $crypt_passwd = crypt($passwd, $salt);

    return $crypt_passwd;
}

/*********************************************************
 * check_duplicate()
 *
 * 桼̾᡼륨ꥢ᡼󥰥ꥹȥɥ쥹
 * ʣʤåԤ
 *
 * []
 *        $mail  ᡼륢ɥ쥹 
 * [֤]
 *        LDAP_FOUNDUSER    桼̾Ƚʣ
 *        LDAP_FOUNDALIAS   ꥢȽʣʬȤΥǡ
 *        LDAP_FOUNDOTHER   ¾ʣ
 *        LDAP_NOUSER       ʣʤ
 *        LDAP_ERRUSER      LDAP顼
 **********************************************************/
function check_duplicate($mail)
{
    global $err_msg;
    global $web_conf;
    global $domain;
    global $userdn;
    global $ldapdata;

    $ldapdata = array();
    /* filter */
    $filter = "(|(mail=" . $mail . ")(mailAlias=" . $mail . "))";
    $attrs = array();
    $scope = TYPE_SUBTREE;
    $dn = $web_conf["ldapbasedn"];

    /* ȥ */
    $ret = main_get_entry($dn, $filter, $attrs, $scope, $ldapdata);
    if ($ret == LDAP_OK) {
        /* 桼IDȽʣƤ뤫 */
        if ($mail == $ldapdata[0]['mail'][0] && $userdn == $ldapdata[0]['dn']) {
            return LDAP_FOUNDUSER;
        }
        /* ꥢȽʣƤƼʬȤΥǡ */
        if ($mail == $ldapdata[0]['mailAlias'][0] &&
            $userdn == $ldapdata[0]['dn']) {
            return LDAP_FOUNDALIAS;
        }
        /* ¾νʣ */
        return LDAP_FOUNDOTHER;
    }

    /* ʣʤ */
    if ($ret == LDAP_ERR_NODATA) {
        return LDAP_NOUSER;
    }

    /* ƥ२顼 */
    return LDAP_ERRUSER;
}

/*********************************************************
 * csv_check_duplicate()
 *
 * 桼̾᡼륨ꥢ᡼󥰥ꥹȥɥ쥹
 * ʣʤåԤ(LDAP³Ԥʤ
 *
 * []
 *        $mail  ᡼륢ɥ쥹 
 *        &$ds    LDAPID
 * [֤]
 *        LDAP_FOUNDUSER    桼̾Ƚʣ
 *        LDAP_FOUNDALIAS   ꥢȽʣʬȤΥǡ
 *        LDAP_FOUNDOTHER   ¾ʣ
 *        LDAP_NOUSER       ʣʤ
 *        LDAP_ERRUSER      LDAP顼
 **********************************************************/
function csv_check_duplicate($mail, &$ds)
{
    global $err_msg;
    global $web_conf;
    global $domain;
    global $userdn;
    global $ldapdata;

    $ldapdata = array();
    /* filter */
    $filter = "(|(mail=" . $mail . ")(mailAlias=" . $mail . "))";
    $attrs = array();
    $scope = TYPE_SUBTREE;
    $dn = $web_conf["ldapbasedn"];

    /* ȥ */
    $ret = main_get_entry_connect($dn, $ds, $filter, $attrs, $scope, $ldapdata);
    if ($ret == LDAP_OK) {
        /* 桼IDȽʣƤ뤫 */
        if ($mail == $ldapdata[0]['mail'][0] && $userdn == $ldapdata[0]['dn']) {
            return LDAP_FOUNDUSER;
        }
        /* ꥢȽʣƤƼʬȤΥǡ */
        if ($mail == $ldapdata[0]['mailAlias'][0] &&
            $userdn == $ldapdata[0]['dn']) {
            return LDAP_FOUNDALIAS;
        }
        /* ¾νʣ */
        return LDAP_FOUNDOTHER;
    }

    /* ʣʤ */
    if ($ret == LDAP_ERR_NODATA) {
        return LDAP_NOUSER;
    }

    /* ƥ२顼 */
    return LDAP_ERRUSER;
}

/***********************************************************
 * user_sort()
 *
 * 桼̥ȤӴؿ
 *
 * []
 *        $elem_1      1
 *        $elem_2      2
 * [֤]
 *        0            
 *       -1            
 *        1            礭
 ************************************************************/
function user_sort($elem_1, $elem_2)
{
    global $dispusr;

    $cmp_1 = $elem_1[$dispusr][0];
    $cmp_2 = $elem_2[$dispusr][0];

    return strcmp($cmp_1, $cmp_2);
}

/***********************************************************
 * ml_sort()
 *
 * ᡼󥰥ꥹȸ̥ȤӴؿ
 *
 * []
 *        $elem_1      1
 *        $elem_2      2
 * [֤]
 *        0            
 *       -1            
 *        1            礭
 ************************************************************/
function ml_sort($elem_1, $elem_2)
{
    global $displayml;

    $cmp_1 = $elem_1[$displayml][0];
    $cmp_2 = $elem_2[$displayml][0];

    return strcmp($cmp_1, $cmp_2);
}

/*********************************************************
 * write_web_conf()
 *
 * եƤ񤭹
 *
 * []
 *       $conf_file  ե
 *       $moddata    ѹ
 * [֤]
 *       TRUE          
 *       FALSE         顼
 **********************************************************/
function write_web_conf($conf_file, $moddata)
{
    global $domain;
    global $err_msg;
    global $web_conf;

    $tmp_file = $conf_file . time() . getmypid();

    /* եɹå */
    if (is_readable_file($conf_file) === FALSE) {
        return FALSE;
    }

    /* եνå */
    if (is_writable_file($tmp_file) === FALSE) {
        return FALSE;
    }

    /* ե򥪡ץ */
    $conf_fp = fopen($conf_file, "r");
    if ($conf_fp === FALSE) {
        $err_msg = "ե뤬ץǤޤ(" . $conf_file . ")";
        return FALSE;
    }

    /* եå */
    $ret = flock($conf_fp, LOCK_EX);
    if ($ret === FALSE) {
        $err_msg = "եΥå˼Ԥޤ(" . $conf_file . ")";
        fclose($conf_fp);
        return FALSE;
    }

    /* ե򥪡ץ */
    $tmp_fp = fopen($tmp_file, "x");
    if ($tmp_fp === FALSE) {
        $err_msg = "ե򥪡ץ󤹤뤳ȤǤޤ(" .
                   $tmp_file . ")";
        flock ($conf_fp, LOCK_UN);
        fclose($conf_fp);
        return FALSE;
    }

    $keys = array_keys($moddata);

    while(feof($conf_fp) === FALSE) {
        /* Ԥbuf˳Ǽ */
        $buf = fgets($conf_fp);
        if ($buf === FALSE) {
            break;
        }
         
        /* оݹԤ򸫤Ĥ񤭴 */
        foreach ($keys as $key) {
            if (strncasecmp($buf, $key, strlen($key)) == 0) {
                $data = explode("=", $buf, 2);
                $buf = $data[0] . "=" . $moddata[$key] . "\n";
            }
        }

        /* ե˽񤭹 */
        $ret = fwrite($tmp_fp, $buf);
        if ($ret === FALSE) {
            $err_msg = "եؤν񤭹ߤ˼Ԥޤ(" . $tmp_file
                       . ")";
            flock ($conf_fp, LOCK_UN);
            fclose($conf_fp);
            fclose($tmp_fp);
            unlink($tmp_file);
            return FALSE;
        }
    } 
    flock ($conf_fp, LOCK_UN);

    fclose($conf_fp);
    fclose($tmp_fp);

    /* ե֤ */
    $ret = rename($tmp_file, $conf_file);
    if ($ret === FALSE) {
        $err_msg = "եΥ͡˼Ԥޤ(" . $tmp_file . ")";
        unlink($tmp_file);
        return FALSE;
    }
        
    return TRUE;
}
/***********************************************************
 * result_log()
 *
 * եФ顼ϤԤ
 *
 * []
 *      $resultlog      顼å
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 ************************************************************/
function result_log($resultlog)
{
    global $env;
    global $err_log;
    global $web_conf;

    $log_time = date ('Ymd His');

    /* 񤭹ߤƤաɽ̾桼̾硣*/
    $msg = $log_time . " " . $_SERVER['LOGNAME'] . " " .
           $env['loginuser'] . " " . $resultlog . "\n";

    if (is_writable_file($web_conf['logfile']) === FALSE) {
        return FALSE;
    }

    if (($fp = fopen ($web_conf['logfile'], 'a')) === FALSE) {
        $err_log .= "եΥץ˼Ԥޤ(" .
                     $web_conf['logfile'] .")";
        return FALSE;
    }

    $ret = flock($fp, LOCK_EX);
    if ($ret === FALSE){
        $err_log .= "եΥå˼Ԥޤ(" .
                     $web_conf['logfile'] .")";
        fclose ($fp);
        return FALSE;
    }

    $ret = fwrite ($fp, $msg);
    if ($ret === FALSE) {
        $err_log .= "νϤ˼Ԥޤ(" .
                     $web_conf['logfile'] .")";
        flock ($fp, LOCK_UN);
        fclose ($fp);

        return FALSE;
    }
    flock ($fp, LOCK_UN);
    fclose ($fp);

    return TRUE;

}

/*********************************************************
 * check_admin_uname()
 *
 * ̾å
 *
 * []
 *      $admin_name Ϥ줿̾
 *      $maxlen     ʸ
 * [֤]
 *      TRUE         
 *      FALSE        ۾
 **********************************************************/
function check_admin_uname($admin_name, $maxlen)
{
    global $err_msg;

    if ($admin_name == "") {
        $err_msg = "̾ϤƤޤ";
        return FALSE;
    }

    $letters = strlen($admin_name);
    if ($letters > $maxlen) {
	$err_msg = "̾ηǤ";
	return FALSE;
    }

    /* ȾѱѾʸ[-_]Τߵ */
    /* ƬϿޤȾѱʸ */
    $num = "0123456789";
    $sl = "abcdefghijklmnopqrstuvwxyz";
    $sym = "-_";
    $allow_letter = $num . $sl . $sym;

    if (strspn($admin_name, $allow_letter) != $letters) {
	$err_msg = "̾ηǤ";
	return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * is_num_check()
 *
 * å
 *
 * []
 *      $num            
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 **********************************************************/
function is_num_check($num)
{

    if (($num < 0) || ($num > 4294967295) ||
        (!preg_match("/^[0-9]+$/", $num))) {
        return FALSE;
    }
    return TRUE;
}

/*********************************************************
 * get_addr_list()
 *
 * ե뤫᡼륢ɥ쥹ɤ߹ߡ񼰥å
 *
 * []
 *           $file      ե̾
 *           $addrs     ᡼륢ɥ쥹Ǽѿ
 * [֤]
 *           TRUE          
 *           FALSE         顼
 **********************************************************/
function get_addr_list($file, &$addrs)
{
    global $err_msg;

    $file = file($file);
    if ($file === FALSE) {
        $err_msg = "åץɥեɤ߹ळȤǤޤ";
        return FALSE;
    }

    if (($max = count($file)) == 0) {
        $err_msg = "Υե뤬åץɤޤ";
        return FALSE;
    }

    for ($i = 0, $err = 0, $line_num = 0, $addrs = array(), $logstr = ""; 
         $i < $max; $i++) {

        $line_num++;
        $line = trim($file[$i]);

        /*  ɥ쥹ν񼰥å */
        if (check_mail($line) === FALSE) {
            $err++;
            $err_msg .= "($line_num )<BR>" ;
            $logstr .= $err_msg;
        } else {

            /*  ɥ쥹νʣå */
            if (array_search($line, $addrs) !== FALSE) {
                $err++;
                $logstr .= "᡼륢ɥ쥹ʣƤޤ($line_num ܡ<BR>";
            }
        }
        $addrs[] = $line;
    }

    /*  顼 */
    if ($err != 0) {
        $err_msg = preg_replace("/<BR>$/i", "", $logstr);
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * print_admin_form()
 *
 * 桼ɲò̡Խ̤Υեɽ
 *
 * []
 *           $mode         ⡼
 *           $postdata     եफϤϢ
 *           $hiddendata   hiddenǡ
 * [֤]
 *           TRUE          
 *           FALSE         顼
 **********************************************************/
function print_admin_form($mode, $postdata, $hiddendata)
{
    global $dispusr;

    /* ǡν */
    $uid = "";
    $alias = "";
    $trans = "";
    $quota = "";
    $save_check[0] = "";
    $save_check[1] = "";

    /* ɽ⡼̤ν */
    if ($mode == ADD_MODE) {
        $quota = $postdata['quota'];
    } elseif ($mode == MOD_MODE) {
        $uid = $postdata['user'];
        if (isset($postdata['quota'])) {
            $quota = $postdata['quota'];
        }
        if (isset($postdata['mail'])) {
            $mail = $postdata['mail'];
        }
        if (isset($postdata['trans'])) {
            $trans = $postdata['trans'];
            if ($postdata['save'] == ON) {
                $save_check[0] = "checked";
            } else {
                $save_check[1] = "checked";
            }
        }
        if (isset($postdata['alias'])) {
            $alias = $postdata['alias'];
        }
    } elseif ($mode == POST_ADD_MODE || $mode == POST_MOD_MODE) {

        /* POST줿ǡѿ˳Ǽ */
        $uid = htmlspecialchars($postdata["uid"]);
        $quota = htmlspecialchars($postdata["quota"]);
        $alias = htmlspecialchars($postdata["alias"]);
        $trans = htmlspecialchars($postdata["trans"]);
        if (isset($postdata["save"])) {
            if ($postdata["save"] == ON) {
                $save_check[0] = "checked";
            } elseif ($postdata["save"] == OFF) {
                $save_check[1] = "checked";
            }
        } 
    }

    /* ⡼ɤˤäưۤʤHTMLǼ */
    if ($mode == ADD_MODE || $mode == POST_ADD_MODE) {
        $target = "admin_user_add.php";
        $uid_html = "<input type=\"text\" size=\"35\" name=\"uid\" maxlength=\"32\" value=\"{$uid}\">\n";
        $submit_html = "<input type=\"submit\" name=\"add\" value=\" Ͽ \">\n";

    } elseif ($mode == MOD_MODE || $mode == POST_MOD_MODE) {
        $target = "admin_user_mod.php";
        $uid_html = htmlspecialchars($dispusr) . "\n";
        $submit_html = "<input type=\"submit\" name=\"modify\" value=\"  \">\n" . 
                       "<input type=\"submit\" name=\"delete\" value=\"Ⱥ\" onClick=\"return msgConfirm('桼ޤ\\nǤ')\">\n";
    }


print <<<EOD

<script type="text/javascript">
<!--
window.onload = function() {
  var i;
  var len = document.data_form.save.length;
  if(document.data_form.trans.value == "") {
    for(i=0;i<len;i++) {
      document.data_form.save[i].disabled = true;
    }
  } else {
    for(i=0;i<len;i++) {
      document.data_form.save[i].disabled = false;
    }
  }
}
function check(n) {
  var i;
  var len = document.data_form.save.length;
  if(n == "") {
    for(i=0;i<len;i++) {
      document.data_form.save[i].disabled = true;
    }
  } else {
    for(i=0;i<len;i++) {
      document.data_form.save[i].disabled = false;
    }
  }
}
// -->
</script>

<form method="POST" action="{$target}" name="data_form">
<table class="table">
  <tr>
    <td class="key1">桼̾</td>
    <td class="value">
EOD;

print $uid_html;

print <<<EOD
    </td>
  </tr>
  <tr>
    <td class="key1">ѥ</td>
    <td class="value"><input type="password" name="pass" size="15" maxlength="8"></td>
  </tr>
  <tr>
    <td class="key1">ѥ(ǧ)</td>
    <td class="value"><input type="password" name="re_pass" size="15" maxlength="8"></td>
  </tr>
  <tr>
  <td class="key1">᡼ܥå</td>
  <td class="value">
    <input type="text" size="10" value="$quota" name="quota" maxlength="3">Mbytes
    </td>
  </tr>
  <tr>
    <td class="key1">᡼륨ꥢ</td>
    <td class="value">
    <input type="text" size="39" name="alias" value="$alias" maxlength="32">
    </td>
  </tr>
  <tr>
    <td class="key1">᡼žɥ쥹</td>
    <td class="value">
      <input type="text" name="trans" size="39" value="$trans" maxlength="256" onBlur="check(this.value)">
      <br>
      Ф˥᡼
      <input type="radio" name="save" value="0" {$save_check[0]} disabled>Ĥ
      <input type="radio" name="save" value="1" {$save_check[1]} disabled >Ĥʤ
    </td>
  </tr>
</table>
<br>

EOD;
    foreach($hiddendata as $hidkey => $hidval) {
        $hidval = htmlspecialchars($hidval);
        print "<input type=\"hidden\" name=\"{$hidkey}\" value=\"{$hidval}\">\n";
    }

    print $submit_html;

    print <<<EOD
<input type="submit" name="cancel" value="󥻥">
</form>
EOD;

}

/*********************************************************
 * set_ldapscope()
 *
 * եldapפ˱ơ
 * ѥפ򥻥åȤ롣
 *
 * []
 *           $scope        ʸ
 * [֤]
 *           $ldapscope    ѤΥ
 **********************************************************/
function set_ldapscope($scope)
{
    $scope = strtolower($scope);
    switch ($scope) {
        case "base";
            $ldapscope = TYPE_ONEENTRY;
            break;
        case "one";
            $ldapscope = TYPE_ONELEVEL;
            break;
        case "sub";
            $ldapscope = TYPE_SUBTREE;
            break;
    }
    return $ldapscope;
}

/*********************************************************
 * mk_filter()
 *
 * ե륿κ
 *
 * []
 *        $name        桼̾
 *        $name_match  ׾ פ: OFF 1
 *                              ޤ    : ON  0
 * [֤]
 *        $filter      ե륿
 **********************************************************/
function mk_filter($name, $name_match = 1)
{
    global $web_conf;
    global $domain;

    /* ե륿 */
    $name_filter = filter_escape($name);

    /* ե륿ɤ߹ */
    $filter = $web_conf["ldapfilter"];

    /* %sꤵƤ */
    $ret = strpos($filter, '%s');
    if ($ret !== FALSE) {
        if ($name_filter != "") {
            if ($name_match == ON) {
                $filter = str_replace("%s", "*" . $name_filter . "*@" . $domain, $filter);
            } else {
                $filter = str_replace("%s", $name_filter . "@" . $domain, $filter);
            }
        } else {
            $filter = str_replace("%s", "*", $filter);
        }
    } else {
        /* %u򸡺ʸִ */
        if ($name_filter != "") {
            if ($name_match == ON) {
                $filter = str_replace("%u", "*" . $name_filter . "*", $filter);
            } else {
                $filter = str_replace("%u", $name_filter, $filter);
            }
        } else {
            $filter = str_replace("%u", "*", $filter);
        }
        /* %dɥᥤִ */
        $filter = str_replace("%d", $domain, $filter);
    }

    $filter = "(&(objectClass=" . PLAOC . ")" . $filter . ")";

    return $filter;
}

/*********************************************************
 * mk_oc_list()
 *
 * ֥ȥ饹ΥꥹȺ
 *
 * []
 *       $oc_str        ʸ
 * [֤]
 *       $oc_list       ꥹ
 **********************************************************/
function mk_oc_list ($oc_str)
{
    $oc_list = rtrim($oc_str);
    $oc_list = explode(",", $oc_list);

    /* ̵ͤ */
    $oc_list = array_values(array_filter($oc_list));

    /* postLdapAdminObjectClassɲ */
    array_push($oc_list, PLAOC);

    return $oc_list;
}

?>
