<?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
 */

/***********************************************************
 * 桼Ƚѥ饤֥
 *
 * $RCSfile$
 * $Revision$
 * $Date$
 **********************************************************/
/* CSVѷɽ̤Υå */
define("CSV_OK_MSG", "%08d %s OK %s<br>\n");
define("CSV_NG_MSG", "%08d %s NG %s<br>\n");

/* 桼ɽ */
define("MAXUCOUNT", 9999);
/* ݡֹ */
define("MAXPORT", 65535);
/* ᡼륢ɥ쥹Ĺ */
define("MAXMAIL", 256);
/* 桼̾ */
define("MAXUID", 32);
/* 票ꥢ̾ */
define("MAXNAME", 32);
/* quotaϲǽʸ */
define("MAXQUOTASIZE", 12);
/* quotaϲǽʸ */
define("MAXFORWARDNUMSIZE", 100);
/* postLDAPadmin̾ */
define("PLAOC", "postLDAPadmin");
/* ɲ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);
// forwardconfoff
define("FORWARD_OFF", "0");

/* ɽ(ǥե) */
define("COLUM_DEF", 5);

/* ȥѥե륿 */
define("DEL_FILTER", "(objectClass=*)");

/* ֤ */
define("FUNC_TRUE",   "1");
define("FUNC_FALSE",  "0");
define("FUNC_SYSERR", "-1");

/***********************************************************
 * check_userdata
 *
 * 桼ǡͥå
 *
 * []
 *        &$data     ϥǡ
 *
 * [֤]
 *        TRUE       
 *        FALSE      顼
 *
 **********************************************************/
function check_userdata($data)
{
    global $msgarr;
    global $web_conf;
    global $err_msg;
    global $log_msg;
    global $url_data;

    /* 桼̾Υå(ɬ) */
    if ($data["uid"] == "") {
        $err_msg = $msgarr['01001'][SCREEN_MSG];
        $log_msg = $msgarr['01001'][LOG_MSG];
        return FALSE;
    }
    if (check_name($data["uid"], MAXUID) === FALSE) {
        return FALSE;
    }

    /* ѥɤΥå(ɬ) */
    if (check_passwd($data["pass"], (int)$web_conf["global"]["minpasswordlength"], (int)$web_conf["global"]["maxpasswordlength"]) === FALSE) {
        return FALSE;
    }

    /* ᡼ܥå̤Υå */
    if (check_diskquota($data["quota"]) === FALSE) {
        return FALSE;
    }

    /* ᡼륨ꥢΥå */
    if ($data["alias"] != "") {
        if ($data["alias"] == $data["uid"]) {
            $err_msg = $msgarr['01002'][SCREEN_MSG];
            $log_msg = $msgarr['01002'][LOG_MSG];
            return FALSE;
        }
        if (check_name($data["alias"], MAXNAME) === FALSE) {
            $err_msg = $msgarr['01003'][SCREEN_MSG];
            $log_msg = $msgarr['01003'][LOG_MSG];
            return FALSE;
        }
    }

    /* ᡼žɥ쥹Υå */
    if ($data["transes"][0] != "") {
        if (check_mail($data["transes"][0]) === FALSE) {
            $err_msg = $msgarr['01004'][SCREEN_MSG];
            $log_msg = $msgarr['01004'][LOG_MSG];
            return FALSE;
        }
        /* ᡼¸å */
        if (!isset($data["save"])) {
            $err_msg = $msgarr['01005'][SCREEN_MSG];
            $log_msg = $msgarr['01005'][LOG_MSG];
            return FALSE;
        } elseif (check_flg($data["save"]) === FALSE) {
            $err_msg = $msgarr['01006'][SCREEN_MSG];
            $log_msg = $msgarr['01006'][LOG_MSG];
            return FALSE;
        }
    }

    // forwardconfonλϥȥƥΥåԤ
    if ($web_conf[$url_data['script']]['forwardconf'] === FORWARD_ON) {
        // Υå
        if ($data["order"] !== "") {
            if (check_csv_order($data["order"]) === FALSE) {
                $err_msg = $msgarr['01024'][SCREEN_MSG];
                $log_msg = $msgarr['01024'][LOG_MSG];
                return FALSE;
            }
        }

        // ƥΥå
        if ($data["article"] !== "") {
            if (check_csv_article($data["article"]) === FALSE) {
                $err_msg = $msgarr['01025'][SCREEN_MSG];
                $log_msg = $msgarr['01025'][LOG_MSG];
                return FALSE;
            }
        }
    }

    return TRUE;

}

/***********************************************************
 * check_csv_trans
 *
 * 桼žɥ쥹Υå
 *
 * []
 *        &$data     ϥǡ
 *
 * [֤]
 *        TRUE       
 *        FALSE      顼
 *
 **********************************************************/
function check_csv_trans(&$data)
{
    global $msgarr;
    global $err_msg;
    global $log_msg;
    global $domain;

    /* ᡼žɥ쥹Υå */
    if ($data['transes'][0] != "") {
        if ($data['transes'][0] == $data["mail"]) {
            $err_msg = $msgarr['01007'][SCREEN_MSG];
            $log_msg = $msgarr['01007'][LOG_MSG];
            return FALSE;
        }
        if (isset($data["mailalias"]) &&
            $data['transes'][0] == $data["mailalias"]) {
            $err_msg = $msgarr['01008'][SCREEN_MSG];
            $log_msg = $msgarr['01008'][LOG_MSG];
            return FALSE;
        }
        if ($data["save"] == ON) {
            /* ᡼Ĥξžɥ쥹˼᡼륢ɥ쥹ɲ */
            array_push($data["transes"], $data["mail"]);
        }
    }

    return TRUE;
}

/***********************************************************
 * check_add_data
 *
 * 桼ɲûͥå
 *
 * []
 *        &$data     ϥǡ
 *        $csvcheck  CSVեѤΥåե饰(ʣå뤫ɤ)
 * [֤]
 *       FUNC_TRUE      
 *       FUNC_FALSE     ۾
 *       FUNC_SYSERR    ۾郎ȯ
 *
 **********************************************************/
function check_add_data(&$data, $csvcheck = FALSE)
{
    global $msgarr;
    global $err_msg;
    global $log_msg;
    global $domain;
    global $web_conf;
    $transes = array();
    /* 桼̾Υå(ɬ) */
    if ($data["uid"] == "") {
        $err_msg = $msgarr['01001'][SCREEN_MSG];
        $log_msg = $msgarr['01001'][LOG_MSG];
        return FUNC_FALSE;
    }
    if (check_name($data["uid"], MAXUID) === FALSE) {
        return FUNC_FALSE;
    }

    /* ѥɤΥå(ɬ) */
    if (check_passwd($data["pass"], (int)$web_conf["global"]["minpasswordlength"], (int)$web_conf["global"]["maxpasswordlength"]) === FALSE) {
        return FUNC_FALSE;
    }

    /* ᡼ܥå̤Υå */
    if (check_diskquota($data["quota"]) === FALSE) {
        return FUNC_FALSE;
    }

    /* ᡼륨ꥢΥå */
    if ($data["alias"] != "") {
        if ($data["alias"] == $data["uid"]) {
            $err_msg = $msgarr['01002'][SCREEN_MSG];
            $log_msg = $msgarr['01002'][LOG_MSG];
            return FUNC_FALSE;
        }
        if (check_name($data["alias"], MAXNAME) === FALSE) {
            $err_msg = $msgarr['01003'][SCREEN_MSG];
            $log_msg = $msgarr['01003'][LOG_MSG];
            return FUNC_FALSE;
        }
    }

    /* ѥɡѥ(ǧ)Υå */
    if ($data["pass"] != $data["re_pass"]) {
        $err_msg = $msgarr['01010'][SCREEN_MSG];
        $log_msg = $msgarr['01010'][LOG_MSG];
        return FUNC_FALSE;
    }

    /* 桼̾νʣå */
    $mail = $data["uid"] . "@" . $domain;
    if ($csvcheck === FALSE) {
        $ret = check_duplicate($mail);
        if ($ret == LDAP_FOUNDUSER || $ret == LDAP_FOUNDALIAS ||
            $ret == LDAP_FOUNDOTHER) {
            $err_msg = $msgarr['01011'][SCREEN_MSG];
            $log_msg = $msgarr['01011'][LOG_MSG];
            return FUNC_FALSE;
        } elseif ($ret == LDAP_ERRUSER) {
            return FUNC_SYSERR;
        }
    }
    $data["mail"] = $mail;

    /* ᡼žɥ쥹Υå */
    if ($data["trans"] != "") {
        if (check_mail ($data["trans"]) === FALSE) {
            $err_msg = $msgarr['01004'][SCREEN_MSG];
            $log_msg = $msgarr['01004'][LOG_MSG];
            return FUNC_FALSE;
        }
        /* ᡼¸å */
        if (!isset($data["save"])) {
            $err_msg = $msgarr['01005'][SCREEN_MSG];
            $log_msg = $msgarr['01005'][LOG_MSG];
            return FUNC_FALSE;
        } elseif (check_flg($data["save"]) === FALSE) {
            $err_msg = $msgarr['01006'][SCREEN_MSG];
            $log_msg = $msgarr['01006'][LOG_MSG];
            return FUNC_FALSE;
        }
    }

    /* ᡼륨ꥢνʣå */
    if ($data["alias"] != "") {
        $data["mailalias"] = $data["alias"] . "@" . $domain;
        $ret = check_duplicate($data["mailalias"]);
        if ($ret == LDAP_FOUNDUSER || $ret == LDAP_FOUNDALIAS ||
            $ret == LDAP_FOUNDOTHER) {
            $err_msg = $msgarr['01012'][SCREEN_MSG];
            $log_msg = $msgarr['01012'][LOG_MSG];
            return FUNC_FALSE;
        } elseif ($ret == LDAP_ERRUSER) {
            return FUNC_SYSERR;
        }
    }


    /* ᡼žɥ쥹Υå */
    if ($data['trans'] != "") {
        if ($data['trans'] == $mail) {
            $err_msg = $msgarr['01007'][SCREEN_MSG];
            $log_msg = $msgarr['01007'][LOG_MSG];
            return FUNC_FALSE;
        }
        if (isset($data["mailalias"]) && $data['trans'] == $data["mailalias"]) {
            $err_msg = $msgarr['01008'][SCREEN_MSG];
            $log_msg = $msgarr['01008'][LOG_MSG];
            return FUNC_FALSE;
        }
        if (isset ($data["save"]) && $data["save"] == ON) {
            /* ᡼Ĥξžɥ쥹˼᡼륢ɥ쥹ɲ */
            array_push($transes, $mail);
        }
        if ($data["trans"] != "") {
            array_push($transes, $data["trans"]);
        }

        $data["transes"] = $transes;
    }
    return FUNC_TRUE;
}

/*********************************************************
 * check_mod_data
 *
 * ϥեηå
 *
 * []
 *          &$data     ϥǡ
 * [֤]
 *          TRUE       
 *          FALSE      顼
 *
 **********************************************************/
function check_mod_data(&$data)
{
    global $msgarr;
    global $err_msg;
    global $log_msg;
    global $domain;
    global $ldapdata;
    global $web_conf;
    global $url_data;
    $transes = array();

    $mail = $data['mail'];

    if ((!isset($ldapdata[0]['userPassword'][0])) || $data["pass"] != ""
                                               || $data["re_pass"] != "") {
        /* ѥɤꤵƤʤȥǤХѥɤɬ */
        if ($data["pass"] == "") {
            $err_msg = $msgarr['01013'][SCREEN_MSG];
            $log_msg = $msgarr['01013'][LOG_MSG];
            return FALSE;
        }
        /* ѥɤΥå(ɬ) */
        if (check_passwd($data["pass"], (int)$web_conf["global"]["minpasswordlength"], 
            (int)$web_conf["global"]["maxpasswordlength"]) === FALSE) {
            return FALSE;
        }
        /* ѥɡѥ(ǧ)ΰץå */
        if ($data["pass"] != $data["re_pass"]) {
            $err_msg = $msgarr['01010'][SCREEN_MSG];
            $log_msg = $msgarr['01010'][LOG_MSG];
            return FALSE;
        }
    }

    /* ᡼ܥå̤Υå(ɬ) */
    if ($data["quota"] != "") {
        if (check_diskquota($data["quota"]) === FALSE) {
            return FALSE;
        }
    }

    /* ᡼륨ꥢΥå */
    if ($data["alias"] != "") {
        if ($data["alias"] == $data["uid"]) {
            $err_msg = $msgarr['01002'][SCREEN_MSG];
            $log_msg = $msgarr['01002'][LOG_MSG];
            return FALSE;
        }
        if (check_name($data["alias"], MAXNAME) === FALSE) {
            $err_msg = $msgarr['01009'][SCREEN_MSG];
            $log_msg = $msgarr['01009'][LOG_MSG];
            return FALSE;
        }
    }

    /* ᡼žɥ쥹Υå */
    if ($data["trans"] != "") {
        if (check_mail ($data["trans"]) === FALSE) {
            $err_msg = $msgarr['01004'][SCREEN_MSG];
            $log_msg = $msgarr['01004'][LOG_MSG];
            return FALSE;
        }
        /* ᡼¸å */
        if (!isset($data["save"])) {
            $err_msg = $msgarr['01005'][SCREEN_MSG];
            $log_msg = $msgarr['01005'][LOG_MSG];
            return FALSE;
        } elseif (check_flg($data["save"]) === FALSE) {
            $err_msg = $msgarr['01006'][SCREEN_MSG];
            $log_msg = $msgarr['01006'][LOG_MSG];
            return FALSE;
        }
    }

    /* ᡼륨ꥢνʣå */
    if ($data["alias"] != "") {
        $data["mailalias"] = $data["alias"] . "@" . $domain;
        /* ꥢ񤭴ե饰ǥեȤON */
        $chflg = ON;

        if (isset($ldapdata[0]["mailAlias"][0])) {
            /* ꥢѹʤн񤭴ե饰:OFF */
            if ($data["mailalias"] == $ldapdata[0]["mailAlias"][0]) {
                $chflg = OFF;
            }
        }

        /* ꥢѹСʣå */
        if ($chflg == ON) {
            $ret = check_duplicate($data["mailalias"]);
            if ($ret == LDAP_FOUNDUSER || $ret == LDAP_FOUNDALIAS ||
                $ret == LDAP_FOUNDOTHER) {
                $err_msg = $msgarr['01012'][SCREEN_MSG];
                $log_msg = $msgarr['01012'][LOG_MSG];
                return FALSE;
            } elseif ($ret == LDAP_ERRUSER) {
                return FALSE;
            }
        }
    }

    // ᡼žɥ쥹Υå
    // forwardconfoffξ
    if ($web_conf[$url_data['script']]['forwardconf'] === FORWARD_OFF) {
        if ($data['trans'] != "") {
            if ($data['trans'] == $mail) {
                $err_msg = $msgarr['01007'][SCREEN_MSG];
                $log_msg = $msgarr['01007'][LOG_MSG];
                return FALSE;
            }
            if (isset($data["mailalias"]) && $data['trans'] == $data["mailalias"]) {
                $err_msg = $msgarr['01008'][SCREEN_MSG];
                $log_msg = $msgarr['01008'][LOG_MSG];
                return FALSE;
            }
            if ($data["save"] == ON) {
                /* ᡼Ĥξžɥ쥹˼᡼륢ɥ쥹ɲ */
                array_push($transes, $mail);
            }
            if ($data["trans"] != "") {
                array_push($transes, $data["trans"]);
            }
    
            $data["transes"] = $transes;
        }

    // forwardconfonξ֤mailForwardingAddrǤ򥭡
    } else {
        if (isset($ldapdata[0]['mailForwardingAddr'])) {
            $data["transes"] = $ldapdata[0]['mailForwardingAddr'];
        }
    }

    return TRUE;
}

/***********************************************************
 * add_user
 *
 * 桼ǡɲä
 *
 * []
 *       $data    ɲå桼ΥǡǼ줿Ϣ
 *
 * [֤]
 *       TRUE     
 *       FALSE    顼
 *
 **********************************************************/
function add_user($data)
{
    global $web_conf;
    global $msgarr;
    global $err_msg;
    global $log_msg;
    global $domain;
    global $attr;
    global $url_data;

    /* Ͽѥǡ */
    $user = $data["uid"];
    $pass = make_passwd($data["pass"]);
    if ($pass === FALSE) {
        return FALSE;
    }
    $mail = $data["mail"];
    $alias = $data["alias"];
    $maildir = $web_conf[$url_data["script"]]["basemaildir"] . "/" . $user . "/";
    $objectclass = mk_oc_list($web_conf[$url_data['script']]['ldapobjectclass']);

    // LDAPϿɬ°Υå
    $attr = array("objectClass" => $objectclass,
                  "uid" => $data["uid"],
                  "userPassword" => $pass,
                  "mail" => $mail,
                  "mailDirectory" => $maildir);

    // ɬܤǤϤʤ°Υå
    if ($data["quota"] != "") {
        $attr["quotaSize"] = $data["quota"];
    }
    if (isset($data["mailalias"])) {
        $attr["mailAlias"] = $data["mailalias"];
    }
    if (isset ($data["transes"]) && count($data["transes"]) != 0) {
        $attr["mailForwardingAddr"] = $data["transes"];
    }

    /* LDAPϿ */
    $add_dn = sprintf(ADD_DN, $mail, $web_conf[$url_data["script"]]["ldapusersuffix"], 
                      $web_conf[$url_data["script"]]["ldapbasedn"]);
    $ret = LDAP_add_entry($add_dn, $attr);
    if ($ret != LDAP_OK) {
        return FALSE;
    }

    return TRUE;
}

/***********************************************************
 * add_user_connect
 *
 * 桼ǡɲä(LDAP³ʤ)
 *
 * []
 *       $data    ɲå桼ΥǡǼ줿Ϣ
 *       $ds      LDAPID
 *
 * [֤]
 *       TRUE     
 *       FALSE    顼
 *
 **********************************************************/
function add_user_connect($data, $ds)
{
    global $web_conf;
    global $msgarr;
    global $err_msg;
    global $log_msg;
    global $domain;
    global $attr;
    global $url_data;

    /* Ͽѥǡ */
    $user = $data["uid"];
    $pass = make_passwd($data["pass"]);
    if ($pass === FALSE) {
        return FALSE;
    }
    $mail = $data["mail"];
    $alias = $data["alias"];
    $maildir = $web_conf[$url_data["script"]]["basemaildir"] . "/" . $user . "/";
    $objectclass = mk_oc_list($web_conf[$url_data['script']]['ldapobjectclass']);

    /* LDAPϿɬ°Υå */
    $attr = array("objectClass" => $objectclass,
                  "uid" => $data["uid"],
                  "userPassword" => $pass,
                  "mail" => $mail,
                  "mailDirectory" => $maildir);

    /* ɬܤǤϤʤ°Υå */
    if ($data["quota"] != "") {
        $attr["quotaSize"] = $data["quota"];
    }
    if (isset($data["mailalias"])) {
        $attr["mailAlias"] = $data["mailalias"];
    }
    if ($data["transes"][0] != "") {
        $attr["mailForwardingAddr"] = $data["transes"];
    }

    // forwardconfonξϥȥƥ򥻥å
    if ($web_conf[$url_data['script']]['forwardconf'] === FORWARD_ON) {
        // ƥ򥻥åȤơmailForwardingAddr
        if ($data["order"][0] !== "") {
            $attr["mailFilterOrder"] = $data["order"];
        }
        if ($data["article"][0] !== "") {
            $attr["mailFilterArticle"] = explode(":", $data["article"]);
        }
        unset($attr["mailForwardingAddr"]);
    }

    /* LDAPϿ */
    $add_dn = sprintf(ADD_DN, $mail, $web_conf[$url_data["script"]]["ldapusersuffix"], 
                      $web_conf[$url_data["script"]]["ldapbasedn"]);
    $ret = LDAP_add_entry_connect($add_dn, $ds, $attr);
    if ($ret != LDAP_OK) {
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * mod_user
 *
 * 桼ν
 *
 * []
 *          $data  桼γǼ줿Ϣ
 * [֤]
 *          TRUE   
 *          FALSE  顼
 *
 **********************************************************/
function mod_user($data)
{
    global $msgarr;
    global $err_msg;
    global $log_msg;
    global $domain;
    global $user;
    global $ldapdata;
    global $web_conf;
    global $userdn;
    global $url_data;

    $enpass = "";

    if (isset($data["mailalias"])) {
        $alias = $data["mailalias"];
    } else {
        $alias = "";
    }
    if (isset($data["alias"])) {
        $alias_name = $data["alias"];
    } else {
        $alias_name = "";
    }
    if (isset($data["transes"])) {
        $transes = $data["transes"];
    } else {
        $transes = array();
    }

    /*ѥɰŹ沽*/
    if ($data["pass"] != "") {
        $enpass = make_passwd($data["pass"]);
        if ($enpass === FALSE) {
            return FALSE;
        }
        $attrs['userPassword'] = $enpass;
    }

    /* ǥ̤ѹʤк */
    if ($data["quota"] != "") {
        $attrs["quotaSize"] = $data["quota"];
    } else {
        $attrs["quotaSize"] = array();
    }

    /* Х᡼륨ꥢѹʤк */
    if ($alias != "") {
        $attrs["mailAlias"] = $alias;
    } else {
        $attrs["mailAlias"] = array();
    }

    /* ᡼žɥ쥹γǼ */
    if (count($transes) != 0) {
        $attrs["mailForwardingAddr"] = $transes;
    } else {
        $attrs["mailForwardingAddr"] = array();
    }

    // forwardconfoffmailFilterOrdermailFilterArticle¸ߤк
    if ($web_conf[$url_data['script']]['forwardconf'] === FORWARD_OFF) {
        if (isset($ldapdata[0]['mailFilterOrder'])) {
            $attrs["mailFilterOrder"][0] = "";
        }
        if (isset($ldapdata[0]['mailFilterArticle'])) {
            $attrs["mailFilterArticle"] = array();
        }
    }

    /* ᡼ǥ쥯ȥ°ʤк */
    if (!isset($ldapdata[0]["mailDirectory"][0])) {
        $attrs["mailDirectory"] = $web_conf[$url_data["script"]]["basemaildir"] . "/" . $user . "/";
    }

    /* LDAPǡι */
    $ret = LDAP_mod_entry($userdn, $attrs);
    if ($ret !== LDAP_OK && $ret != LDAP_ERR_NOATTR) {
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * mod_user_connect
 *
 * 桼ν(LDAP³ʤ)
 *
 * []
 *          $data  桼γǼ줿Ϣ
 *          $ds    LDAPID
 * [֤]
 *          TRUE   
 *          FALSE  顼
 *
 **********************************************************/
function mod_user_connect($data, $ds)
{
    global $msgarr;
    global $err_msg;
    global $log_msg;
    global $domain;
    global $ldapdata;
    global $web_conf;
    global $userdn;
    global $url_data;

    $user = $data["uid"];
    $enpass = "";

    if (isset($data["mailalias"])) {
        $alias = $data["mailalias"];
    } else {
        $alias = "";
    }
    if (isset($data["alias"])) {
        $alias_name = $data["alias"];
    } else {
        $alias_name = "";
    }
    if ($data["transes"][0] != "") {
        $transes = $data["transes"];
    } else {
        $transes = array();
    }

    /*ѥɰŹ沽*/
    if ($data["pass"] != "") {
        $enpass = make_passwd($data["pass"]);
        if ($enpass === FALSE) {
            return FALSE;
        }
        $attrs['userPassword'] = $enpass;
    }

    /* ǥ̤ѹʤк */
    if ($data["quota"] != "") {
        $attrs["quotaSize"] = $data["quota"];
    } else {
        $attrs["quotaSize"] = array();
    }

    /* Х᡼륨ꥢѹʤк */
    if ($alias != "") {
        $attrs["mailAlias"] = $alias;
    } else {
        $attrs["mailAlias"] = array();
    }

    /* ᡼žɥ쥹γǼ */
    if (count($transes) != 0) {
        $attrs["mailForwardingAddr"] = $transes;
    } else {
        $attrs["mailForwardingAddr"] = array();
    }

    // forwardconfoffmailFilterOrdermailFilterArticle¸ߤк
    if ($web_conf[$url_data['script']]['forwardconf'] === FORWARD_OFF) {
        if (isset($ldapdata[0]['mailFilterOrder'])) {
            $attrs["mailFilterOrder"][0] = "";
        }
        if (isset($ldapdata[0]['mailFilterArticle'])) {
            $attrs["mailFilterArticle"] = array();
        }

    // onξmailFilterOrdermailFilterArticleå
    } else {
        // ƥ򥻥åȤơmailForwardingAddr
        if ($data["order"][0] !== "") {
            $attrs["mailFilterOrder"][0] = $data["order"];
        } else {
            $attrs["mailFilterOrder"] = array();
        }
        if ($data["article"][0] !== "") {
            $attrs["mailFilterArticle"] = explode(":", $data["article"]);
        } else {
            $attrs["mailFilterArticle"] = array();
        }
        $attrs["mailForwardingAddr"] = array();
    }

    /* ᡼ǥ쥯ȥ°ʤк */
    if (!isset($ldapdata[0]["mailDirectory"][0])) {
        $attrs["mailDirectory"] = $web_conf[$url_data["script"]]["basemaildir"] . "/" . $user . "/";
    }

    /* LDAPǡι */
    $ret = LDAP_mod_entry_connect($userdn, $ds, $attrs);
    if ($ret !== LDAP_OK && $ret != LDAP_ERR_NOATTR) {
        return FALSE;
    }

    return TRUE;
}
/*********************************************************
 * del_user
 *
 * 桼
 *
 * []
 *         $user    оݥ桼
 * [֤]
 *         TRUE     
 *         FALSE    顼
 *
 **********************************************************/
function del_user($user)
{
    global $msgarr;
    global $err_msg;
    global $log_msg;
    global $web_conf;
    global $domain;
    global $userdn;
    global $ldapdata;
    global $url_data;

    $maildir = "";

    $delmail = $user . "@" . $domain;

    /* LDAPΥȥ */
    $ret = del_user_ldapdata($userdn);
    if ($ret == LDAP_ERR_NODATA) {
        /* ¸ߤʤ */
        $err_msg = "";
    } elseif ($ret != LDAP_OK) {
        return FALSE;
    }

    /* ᡼ǥ쥯ȥ¸ߥå */
    if (isset($ldapdata[0]['mailDirectory'][0])) {
        $maildir = $ldapdata[0]['mailDirectory'][0];
    }

    if ($maildir !== "") {
        /* ᡼ǥ쥯ȥޥɤ¹ */
        $delcmd = $web_conf[$url_data['script']]['maildelcommand'] . 
                  " " . $maildir . " > /dev/null 2>&1";
        system ($delcmd, $cmd_st);
        if ($cmd_st != 0) {
            $err_msg = $msgarr['01014'][SCREEN_MSG];
            $log_msg = sprintf($msgarr['01014'][LOG_MSG], $delcmd);
            return FALSE;
        }
    }

    /* ᡼󥰥ꥹȥɥ쥹 */
    $dn = sprintf(SEARCH_DN, $web_conf[$url_data["script"]]['ldaplistsuffix'], 
                  $web_conf[$url_data['script']]['ldapbasedn']);
    $filter = "(mailForwardingAddr=" . $delmail . ")";
    $attrs = array();

    $ret = main_get_entry($dn, $filter, $attrs, 
                          $web_conf[$url_data['script']]['ldapscope'], $mldata);
    if ($ret == LDAP_ERR_NODATA) {
        /* ¸ߤʤϤʤˤ⤷ʤ */
        $err_msg = "";
    } elseif ($ret != LDAP_OK) {
        return FALSE;
    } else {
        /* ᡼륢ɥ쥹° */
        for ($i = 0; isset($mldata[$i]["mail"][0]); $i++) {
            $del_mldn = sprintf(ADD_DN, $mldata[$i]["mail"][0],
                                $web_conf[$url_data['script']]['ldaplistsuffix'], 
                                $web_conf[$url_data['script']]['ldapbasedn']);
            $fwaddr = array();
            $modaddr = array();

            foreach ($mldata[$i]["mailForwardingAddr"] as $each) {
                if ($each != $delmail) {
                    array_push($fwaddr, $each);
                }
            }
            $modaddr["mailForwardingAddr"] = $fwaddr;
            $ret = LDAP_mod_entry($del_mldn, $modaddr);
            if ($ret !== LDAP_OK && $ret != LDAP_ERR_NOATTR) {
                return FALSE;
            }
            $log_tmp = sprintf($msgarr['01023'][LOG_MSG], $mldata[$i]["mail"][0]);
            result_log(OPERATION . ":OK:" . $log_tmp);
        }
    }
    return TRUE;
}

/*********************************************************
 * del_user_connect
 *
 * 桼
 *
 * []
 *         $user    оݥ桼
 *         $ds     LDAPID
 * [֤]
 *         TRUE     
          FALSE    顼
 *
 **********************************************************/
function del_user_connect($user, $ds)
{
    global $msgarr;
    global $err_msg;
    global $log_msg;
    global $web_conf;
    global $domain;
    global $userdn;
    global $ldapdata;
    global $url_data;

    $maildir = "";

    $delmail = $user . "@" . $domain;

    /* LDAPΥȥ */
    $ret = LDAP_del_entry($userdn);
    if ($ret == LDAP_ERR_NODATA) {
        /* ¸ߤʤ */
        $err_msg = "";
    } elseif ($ret != LDAP_OK) {
        return FALSE;
    }

    /* ᡼ǥ쥯ȥ¸ߥå */
    if (isset($ldapdata[0]['mailDirectory'][0])) {
        $maildir = $ldapdata[0]['mailDirectory'][0];
    }
    if ($maildir != "" && is_dir ($maildir)) {
        /* ᡼ǥ쥯ȥޥɤ¹ */
        $delcmd = $web_conf[$url_data['script']]['maildelcommand'] . 
                  " " . $maildir . " > /dev/null 2>&1";
        system ($delcmd, $cmd_st);
        if ($cmd_st != 0) {
            $err_msg = $msgarr['01014'][SCREEN_MSG];
            $log_msg = sprintf($msgarr['01014'][LOG_MSG], $delcmd);
            result_log (OPERATION . ":NG:" . $log_msg);
            return FALSE;
        }
    }

    /* ᡼󥰥ꥹȥɥ쥹 */
    $dn = sprintf(SEARCH_DN, $web_conf[$url_data['script']]['ldaplistsuffix'], 
                  $web_conf[$url_data['script']]['ldapbasedn']);
    $filter = "(mailForwardingAddr=" . $delmail . ")";
    $attrs = array();

    $ret = main_get_entry_connect($dn, $ds, $filter, $attrs,
                                  $web_conf[$url_data['script']]['ldapscope'], $mldata);
    if ($ret == LDAP_ERR_NODATA) {
        /* ¸ߤʤϤʤˤ⤷ʤ */
        $err_msg = "";
    } elseif ($ret != LDAP_OK) {
        return FALSE;
    } else {
        /* ᡼륢ɥ쥹° */
        for ($i = 0; isset($mldata[$i]["mail"][0]); $i++) {
            $del_mldn = sprintf(ADD_DN, $mldata[$i]["mail"][0],
                                $web_conf[$url_data['script']]['ldaplistsuffix'], 
                                $web_conf[$url_data['script']]['ldapbasedn']);
            $fwaddr = array();
            $modaddr = array();

            foreach ($mldata[$i]["mailForwardingAddr"] as $each) {
                if ($each != $delmail) {
                    array_push($fwaddr, $each);
                }
            }
            $modaddr["mailForwardingAddr"] = $fwaddr;
            $ret = LDAP_mod_entry_connect($del_mldn, $ds, $modaddr);
            if ($ret !== LDAP_OK && $ret != LDAP_ERR_NOATTR) {
                return FALSE;
            }
            $log_tmp = sprintf($msgarr['01023'][LOG_MSG], $mldata[$i]["mail"][0]);
            result_log(OPERATION . ":OK:" . $log_tmp);
        }
    }
    return TRUE;
}

/***********************************************************
 * dgp_location_search()
 *
 * Ԥ
 *
 * []
 *      $url
 * [֤]
 *      ʤ
 ************************************************************/
function dgp_location_search($url, $msg = null)
{
    global $sesskey;
    global $filter;
    global $page;
    global $form_name;
    global $name_match;

    output_http_header();
    display_header();

    print <<<EOD

<body onload="dgpSubmit('$url')">
...
<script type="text/javascript">
<!--
function dgpSubmit(url) {
    document.common.action = url;
    document.common.submit();
}
// -->
</script>
<form method="post" name="common">
<input type="hidden" name="sk" value="$sesskey">
<input type="hidden" name="page" value="$page">
<input type="hidden" name="filter" value="$filter">
<input type="hidden" name="form_name" value="$form_name">
<input type="hidden" name="name_match" value="$name_match">

EOD;

    /* å */
    if (!is_null($msg)) {
        print <<<EOD
<input type="hidden" name="msg" value="$msg">
 
EOD;
    }
 
    print <<<EOD
 
</form> 
</body>
</html>

EOD;
   exit;
    
}   

/*********************************************************
 * 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_quota()
 *
 * ñ̥å
 *
 * []
 *      $unit           ñ
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 **********************************************************/
function check_quota($unit)
{
    /* եΥñ̤ʸˤ */
    $unit = strtolower($unit);

    /* ǽʥñ̾ */
    $unit_data = array('b','kb','mb','gb');

    /* ñ̤ꤵƤ뤫Ĵ٤ */
    if (array_search($unit, $unit_data) === FALSE) {
        return FALSE;
    }
    return TRUE;
}

/*********************************************************
 * check_num()
 *
 * quotaηå
 *
 * []
 *      $size           quotaη
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 **********************************************************/
function check_num($size)
{
    /* ȾѿΤߵ */
    $num = "0123456789";
    if (strspn($size, $num) != strlen($size)) {
        return FALSE;
    }
    /* 1ϲǽʸޤ */
    if (($size < 1) || ($size > MAXQUOTASIZE)) {
        return FALSE;
    }
    return TRUE;
}

/*********************************************************
 * check_num_forward()
 *
 * forwardnumΥå
 *
 * []
 *      $size           forward_numη
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 **********************************************************/
function check_num_forward($size)
{
    /* ȾѿΤߵ */
    $num = "0123456789";
    if (strspn($size, $num) != strlen($size)) {
        return FALSE;
    }
    /* 1ϲǽʸޤ */
    if ($size < 1) {
        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 $msgarr;
    global $err_msg;
    global $log_msg;

    /* ȾѿΤߵ */
    $num = "0123456789";
    if (strspn($quota, $num) != strlen($quota)) {
        $err_msg = $msgarr['01015'][SCREEN_MSG];
        $log_msg = $msgarr['01015'][LOG_MSG];
        return FALSE;
    }

    /* 1-ǥ */
    if ($quota < 0) {
        $err_msg = $msgarr['01015'][SCREEN_MSG];
        $log_msg = $msgarr['01015'][LOG_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_name()
 *
 * 桼̾å
 *
 * []
 *      $name        桼̾
 *      $maxlen      ʸ
 * [֤]
 *      TRUE         
 *      FALSE        ۾
 **********************************************************/
function check_name($name, $maxlen)
{
    global $msgarr;
    global $err_msg;
    global $log_msg;
    global $web_conf;

    $letters = strlen($name);
    if ($letters > $maxlen) {
        $err_msg = $msgarr['01016'][SCREEN_MSG];
        $log_msg = $msgarr['01016'][LOG_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 = $msgarr['01016'][SCREEN_MSG];
        $log_msg = $msgarr['01016'][LOG_MSG];
        return FALSE;
    }

    /* web.confLocalPartRFCCheck1ξ */
    if (isset($web_conf["postldapadmin"]["localpartrfccheck"]) === TRUE &&
              $web_conf["postldapadmin"]["localpartrfccheck"] === "1") {
        /* ѡȤηå */
        if (check_localpart($name) === FALSE) {
            $err_msg = $msgarr['01016'][SCREEN_MSG];
            $log_msg = $msgarr['01016'][LOG_MSG];
            return FALSE;
        }
    }

    return TRUE;
}

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

    /* ʸĹå */
    if (strlen($name) > MAXMAIL) {
        $err_msg = $msgarr['01017'][SCREEN_MSG];
        $log_msg = $msgarr['01017'][LOG_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 = $msgarr['01017'][SCREEN_MSG];
        $log_msg = $msgarr['01017'][LOG_MSG];
        return FALSE;
    }

    return TRUE;
}

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

    /* ᡼륢ɥ쥹Ĺå */
    if (strlen($mail) > MAXMAIL) {
        $err_msg = $msgarr['01018'][SCREEN_MSG];
        $log_msg = $msgarr['01018'][LOG_MSG];
        return FALSE;
    }

    /* @Ĥ˶ڤ뤫Υå */
    $buf = explode('@', $mail, 2);
    if (count($buf) != 2 || $buf[0] == "" || $buf[1] == "") {
        $err_msg = $msgarr['01018'][SCREEN_MSG];
        $log_msg = $msgarr['01018'][LOG_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 = $msgarr['01018'][SCREEN_MSG];
        $log_msg = $msgarr['01018'][LOG_MSG];
        return FALSE;
    }

    /* web.confLocalPartRFCCheck1ξ */
    if (isset($web_conf["postldapadmin"]["localpartrfccheck"]) === TRUE &&
              $web_conf["postldapadmin"]["localpartrfccheck"] === "1") {
        /* ѡȤηå */
        if (check_localpart($buf[0]) === FALSE) {
            $err_msg = $msgarr['01018'][SCREEN_MSG];
            $log_msg = $msgarr['01018'][LOG_MSG];
            return FALSE;
        }
    }

    /*  @Υå */
    if (strlen($buf[1]) < 3) {
        $err_msg = $msgarr['01018'][SCREEN_MSG];
        $log_msg = $msgarr['01018'][LOG_MSG];
        return FALSE;
    }

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

    /* ɥåȤϤޤХ顼 */
    if (substr($buf[1], 0, 1) == $must) {
        $err_msg = $msgarr['01018'][SCREEN_MSG];
        $log_msg = $msgarr['01018'][LOG_MSG];
        return FALSE;
    }

    /* 1İʾΥɥåȤɬܡ */
    if (strpos($buf[1], $must) === FALSE) {
        $err_msg = $msgarr['01018'][SCREEN_MSG];
        $log_msg = $msgarr['01018'][LOG_MSG];
        return FALSE;
    }

    /* 2İʾΥɥåȤϢ³϶ػߡ */
    if (strpos($buf[1], $must_not) !== FALSE) {
        $err_msg = $msgarr['01018'][SCREEN_MSG];
        $log_msg = $msgarr['01018'][LOG_MSG];
        return FALSE;
    }

    $allow_letter = $num . $sl . $ll . $sym;
    $length = strlen($buf[1]);
    if (strspn($buf[1], $allow_letter) != $length) {
        $err_msg = $msgarr['01018'][SCREEN_MSG];
        $log_msg = $msgarr['01018'][LOG_MSG];
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * check_mail_forward()
 *
 * ᡼륢ɥ쥹Υå
 *
 * []
 *      $mail        ᡼륢ɥ쥹
 * [֤]
 *      TRUE         
 *      FALSE        ۾
 **********************************************************/
function check_mail_forward($mail)
{
    global $msgarr;
    global $err_msg;
    global $log_msg;
    global $web_conf;

    /* ᡼륢ɥ쥹Ĺå */
    if (strlen($mail) > FORWARD_LENGTH) {
        $err_msg = $msgarr['25004'][SCREEN_MSG];
        $log_msg = $msgarr['25004'][LOG_MSG];
        return FALSE;
    }

    /* @Ĥ˶ڤ뤫Υå */
    $buf = explode('@', $mail, 2);
    if (count($buf) != 2 || $buf[0] == "" || $buf[1] == "") {
        $err_msg = $msgarr['25004'][SCREEN_MSG];
        $log_msg = $msgarr['25004'][LOG_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 = $msgarr['25004'][SCREEN_MSG];
        $log_msg = $msgarr['25004'][LOG_MSG];
        return FALSE;
    }

    /* web.confLocalPartRFCCheck1ξ */
    if (isset($web_conf["postldapadmin"]["localpartrfccheck"]) === TRUE &&
              $web_conf["postldapadmin"]["localpartrfccheck"] === "1") {
        /* ѡȤηå */
        if (check_localpart($buf[0]) === FALSE) {
            $err_msg = $msgarr['25004'][SCREEN_MSG];
            $log_msg = $msgarr['25004'][LOG_MSG];
            return FALSE;
        }
    }

    /*  @Υå */
    if (strlen($buf[1]) < 3) {
        $err_msg = $msgarr['25004'][SCREEN_MSG];
        $log_msg = $msgarr['25004'][LOG_MSG];
        return FALSE;
    }

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

    /* ɥåȤϤޤХ顼 */
    if (substr($buf[1], 0, 1) == $must) {
        $err_msg = $msgarr['25004'][SCREEN_MSG];
        $log_msg = $msgarr['25004'][LOG_MSG];
        return FALSE;
    }

    /* 1İʾΥɥåȤɬܡ */
    if (strpos($buf[1], $must) === FALSE) {
        $err_msg = $msgarr['25004'][SCREEN_MSG];
        $log_msg = $msgarr['25004'][LOG_MSG];
        return FALSE;
    }

    /* 2İʾΥɥåȤϢ³϶ػߡ */
    if (strpos($buf[1], $must_not) !== FALSE) {
        $err_msg = $msgarr['25004'][SCREEN_MSG];
        $log_msg = $msgarr['25004'][LOG_MSG];
        return FALSE;
    }

    $allow_letter = $num . $sl . $ll . $sym;
    $length = strlen($buf[1]);
    if (strspn($buf[1], $allow_letter) != $length) {
        $err_msg = $msgarr['25004'][SCREEN_MSG];
        $log_msg = $msgarr['25004'][LOG_MSG];
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * check_forward_length()
 *
 * ᡼ž̤ͥå
 * 顼åϸƤӽФǥåȤ
 *
 * []
 *      $input_str   ʸ
 * [֤]
 *      TRUE         
 *      FALSE        ۾
 **********************************************************/
function check_forward_length($input_str)
{

    /* ᡼륢ɥ쥹Ĺå */
    if (strlen($input_str) > FORWARD_LENGTH) {
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * get_userdata()
 *
 * 桼ξ
 *
 * []
 *        $userdn      桼DN
 * [֤]
 *        TRUE         
 *        $ret         ۾
 **********************************************************/
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 $ret;
    }
    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;
}

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

    $ldapdata = array();
    /* filter */
    $filter = "(|(mail=" . $mail . ")(mailAlias=" . $mail . "))";
    $attrs = array();
    $scope = TYPE_SUBTREE;
    $dn = $web_conf[$url_data["script"]]["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 (isset($ldapdata[0]['mailAlias'][0]) &&
            $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 $msgarr;
    global $err_msg;
    global $log_msg;
    global $web_conf;
    global $domain;
    global $userdn;
    global $url_data;

    $ldapdata = array();
    /* filter */
    $filter = "(|(mail=" . $mail . ")(mailAlias=" . $mail . "))";
    $attrs = array();
    $scope = TYPE_SUBTREE;
    $dn = $web_conf[$url_data["script"]]["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 (isset($ldapdata[0]['mailAlias'][0]) &&
            $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);
}

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

    /* ϿΥե̤̾ϥå */
    if (empty($file)) {
        $err_msg = $msgarr['01019'][SCREEN_MSG];
        $log_msg = $msgarr['01019'][LOG_MSG];
        return FALSE;
    }

    $file = file($file);
    if ($file === FALSE) {
        $err_msg = $msgarr['01019'][SCREEN_MSG];
        $log_msg = $msgarr['01019'][LOG_MSG];
        return FALSE;
    }

    if (($max = count($file)) == 0) {
        $err_msg = $msgarr['01020'][SCREEN_MSG];
        $log_msg = $msgarr['01020'][LOG_MSG];
        return FALSE;
    }

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

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

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

            /*  ɥ쥹νʣå */
            if (array_search($line, $addrs) !== FALSE) {
                $err++;
                $logstr .= sprintf($msgarr['01022'][SCREEN_MSG], $line_num);
                $logstr_eng .= sprintf($msgarr['01022'][LOG_MSG], $line_num);
            }
        }
        $addrs[] = $line;
    }

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

    return TRUE;
}

/*********************************************************
 * set_admin_form_tag()
 *
 * 桼ɲò̡Խ̤Υɽ
 *
 * []
 *           $mode         ⡼
 *           $postdata     եफϤϢ
 *           $hiddendata   hiddenǡ
 *           $tag          
 * [֤]
 *           ʤ
 **********************************************************/
function set_admin_form_tag($mode, $postdata, $hiddendata, &$tag)
{
    global $dispusr;
    global $web_conf;
    global $url_data;

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


    /* quotaǤѿ */
    $quotasize = $web_conf[$url_data["script"]]["quotasize"];

    /* եΥñ̤ʸѴ */
    $conf_quota = strtolower($web_conf[$url_data["script"]]["quotaunit"]);

    /* եƤˤäơñ̤Ѥ */
    switch ($conf_quota) {
        case "b":
            $quotaunit = "bytes";
            break;
        case "kb":
            $quotaunit = "Kbytes";
            break;
        case "mb":
            $quotaunit = "Mbytes";
            break;
        case "gb":
            $quotaunit = "Gbytes";
            break;
    }

    /* ɽ⡼̤ν */
    if ($mode == ADD_MODE) {
        $quota = escape_html($postdata['quota']);
    } elseif ($mode == MOD_MODE) {
        $uid = escape_html($postdata['uid']);
        if (isset($postdata['quota'])) {
            $quota = escape_html($postdata['quota']);
        }
        if (isset($postdata['trans'])) {
            $trans = escape_html($postdata['trans']);
            if ($postdata['save'] == ON) {
                $save_check[0] = "checked";
            } else {
                $save_check[1] = "checked";
            }
        }
        if (isset($postdata['alias'])) {
            $alias = escape_html($postdata['alias']);
        }
    } elseif ($mode == POST_ADD_MODE || $mode == POST_MOD_MODE) {
        /* POST줿ǡѿ˳Ǽ */
        $uid = escape_html($postdata["uid"]);
        $quota = escape_html($postdata["quota"]);
        $alias = escape_html($postdata["alias"]);
        $trans = escape_html($postdata["trans"]);
        if (isset($postdata["save"])) {
            if ($postdata["save"] == ON) {
                $save_check[0] = "checked";
            } elseif ($postdata["save"] == OFF) {
                $save_check[1] = "checked";
            }
        }
    }

    /* å */
    $tag["<<QUOTASIZE>>"] = $quotasize;
    $tag["<<UID>>"] = $uid;
    $tag["<<QUOTA>>"] = $quota;
    $tag["<<QUOTAUNIT>>"] = $quotaunit;
    $tag["<<ALIAS>>"] = $alias;
    $tag["<<TRANS>>"] = $trans;
    $tag["<<SAVEON>>"] = $save_check[0];
    $tag["<<SAVEOFF>>"] = $save_check[1];
    $tag["<<MAXPASSLEN>>"] = $web_conf["global"]["maxpasswordlength"];

    $tag["<<HIDDEN>>"] = "";
    foreach($hiddendata as $hidkey => $hidval) {
        $hidval = escape_html($hidval);
        $tag["<<HIDDEN>>"] .= "<input type=\"hidden\" name=\"{$hidkey}\" value=\"{$hidval}\">\n";
    }
}

/*********************************************************
 * 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;
    global $url_data;

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

    /* ե륿ɤ߹ */
    $filter = $web_conf[$url_data["script"]]["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;
}
/*********************************************************
 * check_plugindata
 *
 * ץ饰ѥǡå
 *
 * []
 *	$string		ǡ
 * [֤]
 *	TRUE		
 *	FALSE		۾
 **********************************************************/
function check_plugindata($string)
{
    global $msgarr;
    global $err_msg;
    global $log_msg;

    /* ץ饰 */
    $data = explode(",", $string);
    $count = count($data);

    /* Ƽǡ */
    for ($i = 0; $i < $count; $i++) {
        $plugin = explode(":", $data[$i]);
        if (count($plugin) != 3) {
                $err_col = $i + 1;
                $err_msg = sprintf($msgarr['01021'][SCREEN_MSG], $err_col);
                $log_msg = sprintf($msgarr['01021'][LOG_MSG], $err_col);
                return FALSE;
        }
    }
    return TRUE;

}

/*********************************************************
 * set_plugindata
 *
 * ץ饰ѥǡå
 *	 $plugindata	ץ饰ѥǡ(Ϣ)
 *       		[*][name] ̾
 *	 		[*][filename] ե̾
 *	 		[*][image] ԽѲե̾
 *
 * []
 *	 ʤ
 * [֤]
 *	 ʤ
 **********************************************************/
function set_plugindata()
{
    global $web_conf;
    global $plugindata;

    /*  */
    $plugindata = array();

    /* åȤƤ */
    if (isset($web_conf["postldapadmin"]["searchuserbutton"]) === TRUE &&
              $web_conf["postldapadmin"]["searchuserbutton"] != "") {
        /* ץ饰 */
        $data = explode(",", $web_conf["postldapadmin"]["searchuserbutton"]);
        $count = count($data);

        /* Ƽǡ */
        for ($i = 0; $i < $count; $i++) {
            $plugin = explode(":", $data[$i], 3);

            /* Ǽ */
            $plugindata[$i]["name"] = $plugin[0];
            $plugindata[$i]["file"] = $plugin[1];
            $plugindata[$i]["image"] = $plugin[2];
        }
    }
    return;

}

/***************************************************************************
 * del_user_ldapdata
 *
 * ƵŪLDAPȥ꡼κԤ
 *
 * []
 *  $del_dn         dnǡ
 * [֤]
 *  LDAP_OK         
 *  LDAP_ERR_BIND   Хɥ顼
 *  LDAP_ERR_SEARCH 顼
 *  LDAP_ERR_PARAM  ʰ
 *  LDAP_ERR_NODATA ȥ꤬¸ߤʤ
 *  LDAP_ERR_OTHER  ¾Υ顼
 *  LDAP_ERR_DEL    LDAPΥȥκ˼
 **************************************************************************/
function del_user_ldapdata($del_dn)
{
    /* ȥ꡼θ */
    $ret = main_get_entry($del_dn, DEL_FILTER, array(), TYPE_ONELEVEL, $ldap_result);

    /* ̤Υȥ꡼ */
    if ($ret === LDAP_OK) {

        /* ƵŪ˥ȥ꡼ */
        for ($i = 0; isset($ldap_result[$i]['dn']); $i++) {
            $entry_ret = del_user_ldapdata($ldap_result[$i]['dn']);
            if ($entry_ret !== LDAP_OK) {
                return $entry_ret;
            }
        }
    }

    /* ꥨȥ꡼ */
    if ($ret === LDAP_ERR_NODATA || $ret === LDAP_OK) {

        $del_ret = LDAP_del_entry($del_dn);
        if ($del_ret !== LDAP_OK) {
            return $del_ret;
        }
    } else {
        return $ret;
    }

    return LDAP_OK;
}

/*********************************************************
 * make_passwd()
 *
 * ѥɤΰŹ沽
 *
 * []
 *       $pass            ѥ
 * [֤]
 *       TRUE            
 *       FALSE           ۾
 **********************************************************/
function make_passwd($pass)
{
    global $web_conf;
    global $err_msg;
    global $log_msg;
    global $pass_enc;

    /*Ź沽name¸ߤ뤳ȥå*/
    if (isset($pass_enc[$web_conf["global"]["passwordencrypt"]]["name"]) === FALSE) {
        $err_msg = "ѥɥ󥳡꤬Ǥ(" . $web_conf["global"]["passwordencrypt"] . ")";
        $log_msg = "Invalid Password Encrypt.(" . $web_conf["global"]["passwordencrypt"] . ")";
        return FALSE;
    }
    /*Ź沽schema¸ߤ뤳ȥå*/
    if (isset($pass_enc[$web_conf["global"]["passwordencrypt"]]["schema"]) === FALSE) {
        $err_msg = "ѥɥ󥳡꤬Ǥ(" . $web_conf["global"]["passwordencrypt"] . ")";
        $log_msg = "Invalid Password Encrypt.(" . $web_conf["global"]["passwordencrypt"] . ")";
        return FALSE;
    }
    /*Ź沽make_func¸ߤ뤳ȥå*/
    if (isset($pass_enc[$web_conf["global"]["passwordencrypt"]]["make_func"]) === FALSE) {
        $err_msg = "ѥɥ󥳡꤬Ǥ(" . $web_conf["global"]["passwordencrypt"] . ")";
        $log_msg = "Invalid Password Encrypt.(" . $web_conf["global"]["passwordencrypt"] . ")";
        return FALSE;
    }

    /**/
    return $pass_enc[$web_conf["global"]["passwordencrypt"]]["schema"] . 
           $pass_enc[$web_conf["global"]["passwordencrypt"]]["make_func"]($pass);
}

/*********************************************************
 * check_localpart()
 *
 * ᡼륢ɥ쥹Υѡȥå
 *
 * []
 *      $local       ᡼륢ɥ쥹
 * [֤]
 *      TRUE         
 *      FALSE        ۾
 **********************************************************/
function check_localpart($local)
{
    /* ʸ */
    $dot_atom = ".";
    $dot_continuous = "..";

    /* Ƭ.Ϸ顼 */
    if (substr($local, 0, 1) === $dot_atom) {
        return FALSE;
    }

    /* .Ϸ顼 */
    if (substr($local, -1, 1) === $dot_atom) {
        return FALSE;
    }

    /* .Ϣ³Ϸ顼 */
    if (strpos($local, $dot_continuous)) {
        return FALSE;
    }

    return TRUE;
}

?>
