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

/***********************************************************
 * SaMMAѥ饤֥
 *
 * $RCSfile: dglibsamma,v $
 * $Revision: 1.49 $
 * $Date: 2010/12/11 01:57:32 $
 **********************************************************/

/* ʸ󥳡 */
define("AUTO", "ASCII,JIS,UTF-8,EUC-JP,SJIS");
define("TMPL_ENCODING", "EUC-JP");
define("STRCODE", "JIS");
define("DEF_CODE", "SJIS");

/* BerkeleyDBΥϥɥ顼*/
define("DB_HANDLER", "db4");

/* ֤ */
define("SUCCESS", 0);
define("SUCCESS_EMPTY", 1);
define("FAIL", -1);
define("FAIL_DEL", -2);
define("FAIL_EXIST", -3);
define("FAIL_NO_EXIST", -4);

/*  */
define("DIR_MIN", 1);
define("DIR_MAX", 256);
define("COM_MIN", 1);
define("COM_MAX", 256);
define("STR_MIN", 1);
define("STR_MAX", 256);
define("FILE_MIN", 1);
define("FILE_MAX", 256);
define("PASS_MIN", 1);
define("PASS_MAX", 20);
define("PORT_MIN", 1);
define("PORT_MAX", 65535);
define("FILTER_MIN", 1);
define("FILTER_MAX", 128);

/* ̿å */
define("WELCOME", "Welcome to SaMMA");
define("OK_CODE", "+OK");
define("NG_CODE", "-NG");
define("EXIT_CODE", "exit\r\n");

/* LDAP */
define("ENC", "mailEncryptionAddr=%s");
define("ENC_DN", ENC . ",%s");
define("OBJECT_DN", "objectClass=%s");
define("SAMMA_OBJECT", "samma");

/* DBѥޥ */
define("MAKEMAP", "/usr/sbin/makemap");
define("ECHO_COM", "/bin/echo");
define("MAKEMAP_COM", ECHO_COM . " \"\" | " . MAKEMAP . " -e %s %s");
define("CONFIRM_DB", MAKEMAP . " -u %s %s >/dev/null 2>&1");

define("BUF_SIZE", 1024);

/*  */
define("ALL", "0");
define("TEMPLATE", "1");
define("TIMEOUT", "60");
define("NETSTAT_COM", "/bin/netstat -an | grep LISTEN | grep \" %s:%s \" >/dev/null 2>&1");

$reload = array("reload all\r\n", "reload tmpl\r\n");
$db_types = array("hash", "btree");

/* ɽ */
define("RANDOM", 1);
define("INDIVI", 0);
define("EFFECT", 1);
define("INEFFECT", 0);
define("DISP_EFFECT", "");
define("DISP_INEFFECT", "");
define("DISP_RANDOM", "");
define("DISP_NOPASS", "");
define("DISP_INDIVI", "");

/* ᡼륢ɥ쥹ʸ */
define("CHECK_STR1", ".-");
define("CHECK_STR2", "#$%&'*+-/=?^_{}~.");
define("CHECK_STR3", "!\"#$%&'()=-~^|@`[{;+:*]},<.>\/?_");
define("CHECK_STR4", "!\"#$%&'()=-~^|@`[{;+:*]},<.>\/?_ ");

/* ᡼륢ɥ쥹/ɥᥤӴؿ̾ */
define("DOMAIN_SORT", "domain_sort");

/* եƥ */
$logfacility = array("auth", "authpriv", "cron", "daemon", "kern", "lpr", 
                     "mail", "news", "syslog", "user", "uucp", "local0", 
                     "local1", "local2", "local3", "local4", "local5", 
                     "local6", "local7");

/* ʸ */
$str_code = array("SJIS", "EUCJP", "ISO2022JP", "UTF8");

/* ե̾ */
define("DEF_TMPL", "samma.tmpl.default");

/***************************************************************************
 * db_search
 *
 * ǡ١θԤ
 *
 * []
 *  $dbpath    ǡ١Υѥ
 *  $data      ǡθ(Ϥ)
 * [֤]
 *  SUCCESS        
 *  SUCCESS_EMPTY Υǡ
 *  FAIL          ۾
 **************************************************************************/
function db_search($dbpath, &$data)
{
    global $err_msg;

    /* եɤ߹߸å */
    $ret = is_readable_file($dbpath);
    if ($ret === FALSE) {
        return FAIL;
    }

    /* ǡ١Υץ */
    $dbh = dba_popen($dbpath, "r", DB_HANDLER);
    if ($dbh === FALSE) {
        $err_msg = "եΥץ˼Ԥޤ(" . $dbpath . ")";
        return FAIL;
    }

    /* ǽΥ */
    $key = dba_firstkey($dbh);
    if ($key === FALSE) {
        $data = array();
        dba_close($dbh);
        return SUCCESS_EMPTY;
    }

    /* ˼ꡢͤ */
    while ($key !== FALSE) {
        $data[$key] = dba_fetch($key, $dbh);
        if ($ret === FALSE) {
            $err_msg = "˼Ԥޤ(" . $dbpath . ")";
            dba_close($dbh);
            return FAIL;
        }
        $key = dba_nextkey($dbh);
    }

    dba_close($dbh);
    return SUCCESS;
}

/***************************************************************************
 * db_add
 *
 * ǡ١ϿԤ
 *
 * []
 *  $dbpath     ǡ١Υѥ
 *  $dbtype     ǡ١η
 *  $key        Ͽ
 *  $check_key  ʣå
 *  $value      Ͽ
 * [֤]
 *  SUCCESS     
 *  FAIL_EXIST  ˥ǡϿƤ 
 *  FAIL        ۾
 **************************************************************************/
function db_add($dbpath, $dbtype, $key, $check_key, $value)
{
    global $err_msg;

    /* եν񤭹߸å */
    /* ¸ߥå */
    if (file_exists($dbpath) === FALSE) {
        /* DB */
        $type = 0;
        if ($dbtype == "btree") {
            $type = 1;
        }
        if (make_db($dbpath, $type) === FALSE) {
            $err_msg = "DBѤ" . $err_msg;
            return FAIL;
        }
    } else {
        /*  ǥ쥯ȥå */
        if (is_dir($dbpath) === TRUE) {
            $err_msg = "ꤵ줿եϥǥ쥯ȥǤ($dbpath)";
            return FAIL;
        }
        /*  եν߸å */
        if (is_writable($dbpath) === FALSE) {
            $err_msg = "ե˽߸ޤ($dbpath)";
            return FAIL;
        }
    }

    /* ǡ١Υץ */
    $dbh = dba_popen($dbpath, "c", DB_HANDLER);
    if ($dbh === FALSE) {
        $err_msg = "եΥץ˼Ԥޤ(" . $dbpath . ")";
        return FAIL;
    }

    /* ɽѥ */
    $str = explode("!", $key, 2);
    if ($str[0] != $key) {
        $disp = $str[1];
    } else {
        $disp = $key;
    }

    /* ǡ¸ߤʤå */
    $ret = dba_fetch($key, $dbh);
    if ($ret !== FALSE) {
        $err_msg = "ϿƤޤ(" . $disp . ")";
        dba_close($dbh);
        return FAIL_EXIST;
    }

    /* оݤϴ"!"ʤоݤ""ʤʤ */
    $ret = dba_fetch($check_key, $dbh);
    if ($ret !== FALSE) {
        $err_msg = "ϿƤޤ(" . $disp . ")";
        dba_close($dbh);
        return FAIL_EXIST;
    }

    /* ǡ */
    $ret = dba_insert($key, $value, $dbh);
    if ($ret === FALSE) {
        $err_msg = "DBեι˼Ԥޤ(" . $dbpath . ")";
        dba_close($dbh);
        return FAIL;
    }

    dba_close($dbh);
    return SUCCESS;
}

/***************************************************************************
 * db_mod
 *
 * ǡ١ѹԤ(valueΤ)
 *
 * []
 *  $dbpath        ǡ١Υѥ
 *  $key           ѹ
 *  $value         ѹ
 * [֤]
 *  SUCCESS        
 *  FAIL_NO_EXIST  ǡϿƤʤ
 *  FAIL           ۾
 **************************************************************************/
function db_mod($dbpath, $key, $value)
{
    global $err_msg;

    /* ¸ߥå */
    if (file_exists($dbpath) === FALSE) {
        $err_msg = "ե뤬¸ߤޤ(" . $dbpath . ")";
        return FAIL;
    }

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

    /*  եν񤭹߸å */
    if (is_writable($dbpath) === FALSE) {
        $err_msg = "ե˽񤭹߸ޤ(" . $dbpath . ")";
        return FAIL;
    }

    /* ǡ١Υץ */
    $dbh = dba_popen($dbpath, "c", DB_HANDLER);
    if ($dbh === FALSE) {
        $err_msg = "եΥץ˼Ԥޤ(" . $dbpath . ")";
        return FAIL;
    }

    /* ɽ */
    $str = explode("!", $key, 2);
    if ($str[0] != $key) {
        $disp = $str[1];
    } else {
        $disp = $key;
    }

    /* ǡ¸ߤ뤫å */
    $ret = dba_fetch($key, $dbh);
    if ($ret === FALSE) {
        $err_msg = "ϿƤޤ(" . $disp . ")";
        dba_close($dbh);
        return FAIL_NO_EXIST;
    }

    /* ǡѹ */
    $ret = dba_replace($key, $value, $dbh);
    if ($ret === FALSE) {
        $err_msg = "DBեι˼Ԥޤ(" . $dbpath . ")";
        dba_close($dbh);
        return FAIL;
    }

    dba_close($dbh);
    return SUCCESS;
}

/***************************************************************************
 * db_del
 *
 * ǡ١κԤ
 *
 * []
 *  $dbpath    ǡ١Υѥ
 *  $key_data  
 * [֤]
 *  SUCCESS    
 *  FAIL       ۾
 *  FAIL_DEL   ǤʤΤä
 **************************************************************************/
function db_del($dbpath, $key_data)
{
    global $suc_msg;
    global $err_msg;
    $suc_value = "";
    $err_value = "";

    /* ¸ߥå */
    if (file_exists($dbpath) === FALSE) {
        $err_msg = "ե뤬¸ߤޤ(" . $dbpath . ")";
        return FAIL;
    }

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

    /*  եν񤭹߸å */
    if (is_writable($dbpath) === FALSE) {
        $err_msg = "ե˽񤭹߸ޤ(" . $dbpath . ")";
        return FAIL;
    }

    /* ǡ١Υץ */
    $dbh = dba_popen($dbpath, "c", DB_HANDLER);
    if ($dbh === FALSE) {
        $err_msg = "եΥץ˼Ԥޤ(" . $dbpath . ")";
        return FAIL;
    }

    /* ǡκ */
    foreach ($key_data as $value) {
        $ret = dba_delete($value, $dbh);

        $str = explode("!", $value, 2);
        if ($str[0] != $value) {
            $value = $str[1];
        }
        /* 顼å */
        if ($ret === FALSE) {
            if ($err_value == "") {
                $err_value .=  $value;
            } else {
                $err_value .= ", " . $value;
            }

        /* å */
        } else {
            if ($suc_value == "") {
                $suc_value .=  $value;
            } else {
                $suc_value .= ", " . $value;
            }
        }
    }

    if ($err_value != "") {
        if ($suc_value != "") {
            $suc_msg = "ޤ(" . $suc_value . ")";
        }
        $err_msg = "˼Ԥޤ(" . $err_value . ")";
        dba_close($dbh);
        return FAIL_DEL;
    }

    $suc_msg = "ޤ(" . $suc_value . ")";
    dba_close($dbh);
    return SUCCESS;
}

/***************************************************************************
 * read_file
 *
 * եɤ߹
 *
 * []
 *  $filepath  եΥѥ
 *  $filedata  ե(Ϥ)
 * [֤]
 *  TRUE       
 *  FALSE      ۾
 **************************************************************************/
function read_file($filepath, &$filedata)
{
    global $err_msg;

    /* ɤ߹߸å */
    $ret = is_readable_file($filepath);
    if ($ret === FALSE) {
        return FALSE;
    }

    /* եȤɤ */
    $data = file_get_contents($filepath);
    if ($data === FALSE) {
        $err_msg = "եɤ߹ߤ˼Ԥޤ(" . $filepath .")";
        return FALSE;
    }

    /* ʸѴΤ */
    $filedata = mb_convert_encoding($data, TMPL_ENCODING, AUTO);
    return TRUE;
}

/***************************************************************************
 * write_file
 *
 * եν񤭹
 *
 * []
 *  $filepath  եΥѥ
 *  $encode    󥳡ʸ
 *  $data      Ͽǡ 
 * [֤]
 *  TRUE        
 *  FALSE      ۾
 **************************************************************************/
function write_file($filepath, $encode, $data)
{
    global $err_msg;

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

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

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

    /* ǥ쥯ȥν񤭹߸å */
    $ret = is_writable(dirname($filepath));
    if ($ret === FALSE) {
        $err_msg = "ǥ쥯ȥ˽񤭹߸ޤ(" . $filepath . ")";
        return FALSE;
    }

    /* եκ */
    $tmppath = tempnam(dirname($filepath), "samma_");
    if ($tmppath === FALSE) {
        $err_msg = եκ˼Ԥޤ;
        return FALSE;
    }

    /* ե륪ץ */
    $fp = fopen($tmppath, 'w');
    if ($fp === FALSE) {
        $err_msg = "եΥץ˼Ԥޤ(" . $tmppath .")";
        unlink($tmppath);
        return FALSE;
    }

    /* 񤭹ߥǡʸѹ */
    $conv_data = mb_convert_encoding($data, $encode, AUTO);

    /* ǡΥХȿĴ٤ */
    $datalen = strlen($conv_data);

    /* ǡν񤭹 */
    $ret = fwrite($fp, $conv_data, $datalen);
    if ($ret === FALSE) {
        $err_msg = "եν񤭹ߤ˼Ԥޤ(" . $tmppath .")";
        fclose($fp);
        unlink($tmppath);
        return FALSE;
    }
    fclose($fp);

    /* եΰư */
    $ret = rename($tmppath, $filepath);
    if ($ret === FALSE) {
        $err_msg = "եΰư˼Ԥޤ(" . $tmppath .")";
        unlink($tmppath);
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * read_samma_conf()
 *
 * SaMMAեɤ߹ߡ
 * Ϣ $samma_conf ˳Ǽ
 *
 * []
 *	$samma_file	եѥ
 * [֤]
 *       TRUE          
 *       FALSE         ۾
 **********************************************************/
function read_samma_conf($samma_file)
{
    global $err_msg;
    global $samma_keys;
    global $samma_def;
    global $samma_conf;
    
    /* եɤ߹߸å */
    if (is_readable_file($samma_file) === FALSE) {
        $err_msg = htmlspecialchars($err_msg);
        return FALSE;
    }

    /* ե򥪡ץ */
    $fp = fopen($samma_file, "r");
    if ($fp === FALSE) {
        $err_msg = "ե뤬ץǤޤ(" .
                   htmlspecialchars($samma_file) . ")";
        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) == " ") {
            fclose($fp);
            set_error($samma_file, $line);
            return FALSE;
        }

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

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

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

    fclose($fp);
    return TRUE;
}

/*********************************************************
 * check_dir
 *
 * ǥ쥯ȥ̾¸ߥå
 *
 * []
 *	$dir_name	ǥ쥯ȥ̾
 * [֤]
 *       TRUE          
 *       FALSE         ۾
 **********************************************************/
function check_dir($dir_name)
{
    global $err_msg;

    /* ʸå */
    if (check_str($dir_name, CHECK_STR3, DIR_MIN, DIR_MAX) === FALSE) {
        $err_msg = "ǥ쥯ȥ" . $err_msg;
        return FALSE;
    }

    /* ¸ߥå */
    if (is_dir($dir_name) === FALSE) {
        $err_msg = "ǥ쥯ȥ꤬¸ߤޤ";
        return FALSE;
    }
    
    return TRUE;

}

/*********************************************************
 * check_str
 *
 * ʸå
 *
 * []
 *       $str          ʸ
 *       $sym          ĵ
 *       $min          Ǿʸ
 *       $max          ʸ
 * [֤]
 *       TRUE          
 *       FALSE         ۾
 **********************************************************/
function check_str($str, $sym = "", $min = STR_MIN, $max = STR_MAX)
{
    global $err_msg;

    /* ʸå */
    $letters = strlen($str);
    if ($letters < $min || $letters > $max) {
        $err_msg = "Ǥ";
        return FALSE;
    }

    /* Ⱦѱ羮ʸ국Τߵ */
    $num = "0123456789";
    $sl = "abcdefghijklmnopqrstuvwxyz";
    $ll = strtoupper($sl);
    $allow_letter = $num . $sl . $ll . $sym;
    if (strspn($str, $allow_letter) != $letters) {
        $err_msg = "Ǥ";
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * check_command
 *
 * ޥɥե롦¹Ըå
 *
 * []
 *	$com_name	ޥ
 * [֤]
 *       TRUE          
 *       FALSE         ۾
 **********************************************************/
function check_command($com_name)
{
    global $err_msg;

    /* ʸå */
    if (check_str($com_name, CHECK_STR3, COM_MIN, COM_MAX) === FALSE) {
        $err_msg = "ޥɥѥ" . $err_msg;
        return FALSE;
    }

    /* ¹Ըå */
    if (is_executable_file($com_name) === FALSE) {
        $err_msg = "ޥɥѥ" . $err_msg;
        return FALSE;
    }
    
    return TRUE;

}

/*********************************************************
 * is_executable_file()
 * եμ¹Ըå
 *
 * []
 *      $filename    åоݥե
 * [֤]
 *      TRUE         
 *      FALSE        ۾
 **********************************************************/
function is_executable_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_executable($filename) === FALSE) {
        $err_msg = "ե˼¹Ըޤ($filename)";
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * check_file
 *
 * եå
 *
 * []
 *	$filename	ޥ
 * [֤]
 *       SUCCESS		
 *       FAIL			۾
 *	 FAIL_NO_EXIST  	۾(եʤ)
 **********************************************************/
function check_file($filename)
{
    global $err_msg;
 
    /* ʸå */
    if (check_str($filename, CHECK_STR3, FILE_MIN, FILE_MAX) === FALSE) {
        $err_msg = "ե" . $err_msg;
        return FAIL;
    }

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

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

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

}

/*********************************************************
 * check_samma_pass
 *
 * SaMMAϢѥɥå
 *
 * []
 *	$pass		ѥ
 * [֤]
 *       TRUE          
 *       FALSE         ۾
 **********************************************************/
function check_samma_pass($pass)
{
    global $err_msg;

    /* ʸå */
    if (check_str($pass, CHECK_STR3, PASS_MIN, PASS_MAX) === FALSE) {
        $err_msg = "ѥɤ" . $err_msg;
        return FALSE;
    }
    
    return TRUE;

}

/*********************************************************
 * mod_samma_conf
 *
 * SaMMAĶե빹
 *
 * []
 *	$new_samma_conf		եǡ(Ϣ)
 * [֤]
 *       TRUE          
 *       FALSE         ۾
 **********************************************************/
function mod_samma_conf(&$new_samma_conf)
{
    global $err_msg;
    global $web_conf;
    global $samma_conf;

    $new_conf = "";

    /* ѹǡ(3ܤѹʤ) */
    if (isset($samma_conf["commandport"]) === TRUE) {
        $new_conf .= "commandport=" . $samma_conf["commandport"] . "\n";
    }

    if (isset($samma_conf["listenip"]) === TRUE ) {
        $new_conf .= "listenip=" . $samma_conf["listenip"] . "\n";
    }

    if (isset($samma_conf["listenport"]) === TRUE) {
        $new_conf .= "listenport=" . $samma_conf["listenport"] . "\n";
    }

    /* ǡ */
    foreach ($new_samma_conf as $key => $value) {
        /* 3ܤϹʤ */
        if ($key == "commandport" || $key == "listenip" || $key == "listenport") {
            continue;
        }

        /* dbե̵̾ */
        if ($key == "sd_dbfile" || $key == "sd_dbtype" || 
            $key == "rp_dbfile" || $key == "rp_dbtype") {
            continue;
        }

        /* LDAPСݡȤ̵ */
        if ($key == "ldapserver" || $key == "ldapport") {
            continue;
        }

        /* ξ̵ */
        if ($value == "") {
            continue;
        }

        /* ѹǡ */
        $new_conf .= $key . "=" . $value . "\n";
    }

    /* ե빹 */ 
    $ret = write_file($web_conf["postldapadmin"]["sammaconf"], STRCODE, $new_conf);
    if ($ret === FALSE) {
        $err_msg = "" . $err_msg;
        return FALSE;
    }

    /* ɽ */
    $ret = reload_samma(ALL);
    if ($ret === FALSE) {
        return FALSE;
    }
    
    return TRUE;

}

/*********************************************************
 * reload_samma
 *
 * SaMMAΥɤԤ
 *
 * []
 *	$flag		ɥե饰
 *			0: all 
 *			1: template
 * [֤]
 *       TRUE          
 *       FALSE         ۾
 **********************************************************/
function reload_samma($flag)
{
    global $samma_conf;
    global $err_msg;
    global $reload;
    global $commandpass;

    /* IP, ݡȼ */
    $ip = $samma_conf["listenip"];
    $port = $samma_conf["commandport"];

    /* ץǧ */
    $proc_com = sprintf(NETSTAT_COM, $ip, $port);
    $ret = system($proc_com, $result);
    if ($result != 0) {
        $err_msg = "SaMMAưƤޤ";
        return FALSE;
    }
    if ($ret === FALSE) {
        $err_msg = "SaMMAưƤޤ";
        return FALSE;
    }

    $buf = "";

    /* ³ */
    /* ³ԻwarningϤ */
    $fp = fsockopen($ip, $port, $errno, $errstr, TIMEOUT);
    if ($fp === FALSE) {
        $err_msg = "SaMMAؤ³˼Ԥޤ(" . $errno . ": " . $errstr . ")";
        return FALSE;
    }
    /* å */
    $buf = trim(fgets($fp, BUF_SIZE));
    if ($buf != WELCOME) {
        $err_msg = "SaMMAؤ³˼Ԥޤ";
        return FALSE;
    }

    $login = "login " . $commandpass . "\r\n";

    /*  */
    $ret = fputs ($fp, $login);
    if ($ret === FALSE) {
        $err_msg = "SaMMAؤΥ˼Ԥޤ";
        $ret = fputs ($fp, EXIT_CODE);
        if ($ret === FALSE) {
            $err_msg = "SaMMAؤΥ˼Ԥޤ";
            fclose($fp);
            return FALSE;
        }
        fclose($fp);
        return FALSE;
    }

    /* å */
    $buf = trim(fgets($fp, BUF_SIZE));
    if ($buf != OK_CODE) {
        $err_msg = "SaMMAؤΥ˼Ԥޤ(" . $buf . ")";
        $ret = fputs ($fp, EXIT_CODE);
        if ($ret === FALSE) {
            $err_msg = "SaMMAؤΥ˼Ԥޤ(" . $buf . ")";
            fclose($fp);
            return FALSE;
        }
        fclose($fp);
        return FALSE;
    }

    /* ȯ */
    $ret = fputs ($fp, $reload[$flag]);
    if ($ret === FALSE) {
        $err_msg = "SaMMAΥɤ˼Ԥޤ";
        fclose($fp);
        return FALSE;
    }

    /* å */
    $buf = trim(fgets($fp, BUF_SIZE));
    if ($buf != OK_CODE) {
        $err_msg = "SaMMAΥɤ˼Ԥޤ(" . $buf . ")";
        $ret = fputs ($fp, EXIT_CODE);
        if ($ret === FALSE) {
            $err_msg = "SaMMAΥɤ˼Ԥޤ("  . $buf . ")";
            fclose($fp);
            return FALSE;
        }
        fclose($fp);
        return FALSE;
    }

    /* ȡ */
    fputs ($fp, EXIT_CODE);
    fclose($fp);

    return TRUE;

}

/*********************************************************
 * make_db
 *
 * dbե
 *
 * []
 *	$db_file	dbե̾(Хѥ)
 *	$type		dbη
 *			0: hash 1: btree
 * [֤]
 *	TRUE		
 *	FALSE		۾
 **********************************************************/
function make_db($db_file, $type)
{
    global $err_msg;
    global $db_types;

    $dir_name = dirname($db_file);

    /*  ǥ쥯ȥå */
    if (is_dir($dir_name) === FALSE) {
        $err_msg = "ǥ쥯ȥ꤬¸ߤޤ($dir_name)";
        return FALSE;
    }

    /* ǥ쥯ȥ񤭹߸å */
    if (is_writable($dir_name) === FALSE) {
        $err_msg = "ǥ쥯ȥ˽߸ޤ($dir_name)";
        return FALSE;
    }

    /* makemapޥɼ¹ */
    $command = sprintf(MAKEMAP_COM, $db_types[$type], escapeshellcmd($db_file));
    $ret = system($command, $result);
    if ($result != 0) {
        $err_msg = "ե˼Ԥޤ";
        return FALSE;
    }
    if ($ret === FALSE) {
        $err_msg = "ե˼Ԥޤ";
        return FALSE;
    }

    return TRUE;
}

/***************************************************************************
 * page_location()
 *
 * åܥåΥԤ(Ūexitޤ)
 *
 * []
 *     $url   
 *     $bread åܥåǡ
 * [֤]
 *     ʤ
 ***************************************************************************/
function page_location($url, $bread = array())
{
    global $sesskey;

    $mypg = new page();

    $mypg->output_http_header();
    $mypg->display_header();

    print <<<EOD

<body onload="dgpSubmit('$url')">
...
<form method="post" name="common">
<input type="hidden" name="sk" value="$sesskey">

EOD;

/* ǡǤϤʤäȤ */
if (empty($bread) === FALSE) {
    foreach ($bread as $key => $val) {
        print("<input type=\"hidden\" name=\"delete[]\" value=\"" .
              htmlspecialchars($val) . "\">");
    }
}

print <<<EOD
</form>
</body>

EOD;

    exit;
}

/***************************************************************************
 * check_samma_mail
 *
 * ɥᥤ/᡼륢ɥ쥹å
 *
 * []
 *     $word         åʸ
 * [֤]
 *     TRUE          
 *     FALSE         ۾
 **************************************************************************/
function check_samma_mail($mail)
{
    global $err_msg;

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

    /* @ʸʬ䤹 */
    $elements = explode('@', $mail);

    /*  */
    $num = count($elements);

    /* ʸΥå */
    switch ($num) {
        case 1:
            /* ʸå*/
            $ret = check_str($elements[0], CHECK_STR1);
            if ($ret === FALSE) {
                return FALSE;
            }
            break;
        case 2:
            /* ᡼륢ɥ쥹å*/
            $ret = check_samma_domain($elements);
            if ($ret === FALSE) {
                return FALSE;
            }
            break;
        default;
            $err_msg = "Ǥ";
            return FALSE;
            break;
    }

    return TRUE;
}

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

    /* @Υå */
    /* ʸå */
    if (empty($mail[0]) === FALSE) {
        $ret = check_str($mail[0], CHECK_STR2);
        if ($ret === FALSE) {
            return FALSE;
        }
    }

    /*  @Υå */
    if (strlen($mail[1]) < 3) {
        $err_msg = "Ǥ";
        return FALSE;
    }

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

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

    /* 1İʾΥɥåȤɬ */
    $ret = strpos($mail[1], $must);
    if ($ret === FALSE) {
        $err_msg = "Ǥ";
        return FALSE;
    }

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

    /* ʸå */
    $ret = check_str($mail[1], CHECK_STR1);
    if ($ret === FALSE) {
        return FALSE;
    }

    return TRUE;
}

/*********************************************************
 * domain_sort()
 *
 * ɥᥤ᡼/ɥ쥹ȴؿ
 * (uksortؿƤӽФؿ)
 *
 **********************************************************/
function domain_sort($a, $b)
{
    $str1 = explode("!", $a, 2);
    if ($str1[0] != $a) {
        $a = $str1[1];
    }

    $str2 = explode("!", $b, 2);
    if ($str2[0] != $b) {
        $b = $str2[1];
    }

    /* $aС-1פ֤ */
    if ($a < $b) {
        return -1;
    } else {
        return 1;
    }
}

/***************************************************************************
 * db_key_mod
 *
 * ǡ١ѹԤ(keyѹ)
 *
 * []
 *  $dbpath        ǡ١Υѥ
 *  $old_key       ѹ
 *  $new_key       ѹ
 *  $value         ѹ
 * [֤]
 *  SUCCESS        
 *  FAIL_EXIST     ˥ǡϿƤ
 *  FAIL_NO_EXIST  ǡϿƤʤ
 *  FAIL           ۾
 **************************************************************************/
function db_key_mod($dbpath, $old_key, $new_key, $value)
{
    global $err_msg;

    /* ¸ߥå */
    if (file_exists($dbpath) === FALSE) {
        $err_msg = "ե뤬¸ߤޤ(" . $dbpath . ")";
        return FAIL;
    }

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

    /*  եν񤭹߸å */
    if (is_writable($dbpath) === FALSE) {
        $err_msg = "ե˽񤭹߸ޤ(" . $dbpath . ")";
        return FAIL;
    }

    /* ǡ١Υץ */
    $dbh = dba_popen($dbpath, "c", DB_HANDLER);
    if ($dbh === FALSE) {
        $err_msg = "եΥץ˼Ԥޤ(" . $dbpath . ")";
        return FAIL;
    }

    /* ɽ */
    $str = explode("!", $new_key, 2);
    if ($str[0] != $new_key) {
        $new_disp = $str[1];
    } else {
        $new_disp = $new_key;
    }

    /* ѹǡ¸ߤʤå */
    $ret = dba_fetch($new_key, $dbh);
    if ($ret !== FALSE) {
        $err_msg = "ϿƤޤ(" . $new_disp . ")";
        dba_close($dbh);
        return FAIL_EXIST;
    }

    /* ɽ */
    $str = explode("!", $old_key, 2);
    if ($str[0] != $old_key) {
        $old_disp = $str[1];
    } else {
        $old_disp = $old_key;
    }

    /* ѹǡ¸ߤ뤫å */
    $ret = dba_fetch($old_key, $dbh);
    if ($ret === FALSE) {
        $err_msg = "ϿƤޤ(" . $old_disp . ")";
        dba_close($dbh);
        return FAIL_NO_EXIST;
    }

    /* ǡ */
    $ret = dba_insert($new_key, $value, $dbh);
    if ($ret === FALSE) {
        $err_msg = "DBեι˼Ԥޤ(" . $dbpath . ")";
        dba_close($dbh);
        return FAIL;
    }

    /* ǡκ */
    $ret = dba_delete($old_key, $dbh);
    if ($ret === FALSE) {
        $err_msg = "DBեι˼Ԥޤ(" . $dbpath . ")";
        dba_close($dbh);
        return FAIL;
    }

    dba_close($dbh);
    return SUCCESS;
}

/***************************************************************************
 * ldap_enc_del
 *
 * LDAPȥ꡼κԤ
 *
 * []
 *  $userdn         桼dnǡ 
 *  $key            ɥ쥹
 * [֤]
 *  LDAP_OK         
 *  LDAP_ERR_BIND   Хɥ顼
 *  LDAP_ERR_NODATA ȥ꤬¸ߤʤ
 *  LDAP_ERR_DEL    LDAPΥȥκ˼
 *  LDAP_ERR_SEARCH 顼
 *  LDAP_ERR_PARAM  ʰ
 *  LDAP_ERR_OTHER  ¾Υ顼
 **************************************************************************/
function ldap_enc_del($userdn, $key)
{
    global $err_msg;
    global $suc_msg;
    $err_value = "";
    $suc_value = "";

    foreach ($key as $value) {

        /* dnκ */
        $del_dn = LDAP_filter_escape(sprintf(ENC_DN, $value, $userdn));

        /* LDAPκ */
        $ret = del_user_ldapdata($del_dn);

        $str = explode("!", $value, 2);
        if ($str[0] != $value) {
            $value = $str[1];
        }

        /* 顼å */
        if ($ret === LDAP_OK) {
            if ($suc_value == "") {
                $suc_value .=  $value;
            } else {
                $suc_value .= ", " . $value;
            }
        } elseif ($ret === LDAP_ERR_NODATA) {
            if ($err_value == "") {
                $err_value .=  $value;
            } else {
                $err_value .= ", " . $value;
            }
        } else {
            return $ret;
        }
    }

    if ($err_value != "") {
        if ($suc_value != "") {
            $suc_msg = "ޤ(" . $suc_value . ")";
        }
        $err_msg = "˼Ԥޤ(" . $err_value . ")";
        return LDAP_ERR_NODATA;
    }

    $suc_msg = "ޤ(" . $suc_value . ")";
    return LDAP_OK;
}

/***************************************************************************
 * ldap_mod
 *
 * LDAPѹԤ(ѥɤΤ)
 *
 * []
 *  $key           ѹ
 *  $pass          ѥ	
 * [֤]
 *  SUCCESS		
 *  FAIL_NO_EXIST	ǡϿƤʤ
 *  FAIL		۾
 **************************************************************************/
function ldap_mod($key, $value)
{
    global $err_msg;
    global $userdn;

    /* ɽ */
    $str = explode("!", $key, 2);
    if ($str[0] != $key) {
        $disp = $str[1];
    } else {
        $disp = $key;
    }

    /* ѥɤʤк */
    if ($value != "") {
        $attrs["mailEncryptionPassword"] = $value;
    } else {
        $attrs["mailEncryptionPassword"] = array();
    }

    /* DN */
    $dn = LDAP_filter_escape(sprintf(ENC_DN, $key, $userdn));

    /* LDAPǡι */
    $ret = LDAP_mod_entry($dn, $attrs);
    if ($ret === LDAP_ERR_NODATA) {
        return FAIL_NO_EXIST;
    } elseif ($ret !== LDAP_OK) {
        $err_msg = "ι˼Ԥޤ(" . $disp . ")";
        return FAIL;
    }

    return SUCCESS;
}

/***************************************************************************
 * ldap_key_mod
 *
 * LDAPѹԤ(keyѹ)
 *
 * []
 *  $old_key       ѹ
 *  $key           ѹ
 *  $value         ѹ
 * [֤]
 *  SUCCESS		
 *  FAIL_EXIST		۾(ȥ¸)
 *  FAIL		۾
 **************************************************************************/
function ldap_key_mod($old_key, $new_key, $value)
{
    global $err_msg;
    global $userdn;

    /* ѹ奭Υȥɲ */
    /* LDAPϿɬ°Υå */
    $attr = array("objectClass" => SAMMA_OBJECT,
		  "mailEncryptionAddr" => $new_key);

    if ($value != "") {
        $attr["mailEncryptionPassword"] = $value;
    }

    $dn = LDAP_filter_escape(sprintf(ENC_DN, $new_key, $userdn));

    /* LDAPɲ */
    $ret = LDAP_add_entry($dn, $attr);
    if ($ret === LDAP_ERR_DUPLICATE) {
        return FAIL_EXIST;
    } elseif ($ret !== LDAP_OK) {
        return FAIL;
    }

    /* ѹΥȥ */
    $del_dom[] = $old_key;
    $ret = ldap_enc_del($userdn, $del_dom);
    If ($ret === LDAP_ERR_NODATA) {
        return FAIL_NO_EXIST;
    } elseif ($ret !== LDAP_OK) {
        return FAIL;
    }

    return SUCCESS;
}

/***************************************************************************
 * page_location_search()
 *
 * åܥå, ݻΥԤ(Ūexitޤ)
 *
 * []
 *     $url   
 *     $msg   å
 *     $bread åܥåǡ
 * [֤]
 *     ʤ
 ***************************************************************************/
function page_location_search($url, $msg = NULL, $bread = array())
{
    global $sesskey;
    global $filter;
    global $page;
    global $form_name;
    global $name_match;
    global $dn;

    $mypg = new page();

    $mypg->output_http_header();
    $mypg->display_header();

    print <<<EOD

<body onload="dgpSubmit('$url')">
...
<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">
<input type="hidden" name="dn" value="$dn">

EOD;

    /* ǡǤϤʤäȤ */
    if (empty($bread) === FALSE) {
        foreach ($bread as $key => $val) {
            print("<input type=\"hidden\" name=\"delete[]\" value=\"" .
                  htmlspecialchars($val) . "\">");
        }
    }

    /* å */
    if (is_null($msg) === FALSE) {
        print <<<EOD
<input type="hidden" name="msg" value="$msg">

EOD;
    }

print <<<EOD
</form>
</body>
</html>

EOD;

    exit;
}

/*********************************************************
 * get_user_data()
 *
 * 桼μ
 *
 * []
 *      $userdn         桼̾
 *      $rp_data        ǡ(Ϣ)
 * [֤]
 *       TRUE         
 *       FALSE        ۾
 **********************************************************/
function get_user_data($userdn, &$rp_data)
{
    global $err_msg;

    $filter = sprintf(OBJECT_DN, SAMMA_OBJECT);
    $attrs = array();

    /* å */
    $msg = "";
    if ($err_msg != "") {
        $msg = $err_msg;
    }

    /* ȥμ */
    $ret = main_get_entry($userdn, $filter, $attrs, TYPE_ONELEVEL, $ldapdata);
    if ($ret === LDAP_ERR_NODATA) {
        /* ǡʤϥ顼ˤʤ(ΥåѤ) */
        $err_msg = $msg;
        return TRUE;
    } elseif ($ret !== LDAP_OK) {
        return FALSE;
    }

    /*  */
    $count = count($ldapdata);

    for ($i = 0; $i < $count; $i++) {
        if (isset($ldapdata[$i]["mailEncryptionAddr"][0]) === TRUE) {
            $dom = $ldapdata[$i]["mailEncryptionAddr"][0];
            $rp_data[$dom] = "";
            if (isset($ldapdata[$i]["mailEncryptionPassword"][0]) === TRUE) {
                $rp_data[$dom] = $ldapdata[$i]["mailEncryptionPassword"][0];
            }
        }
    }

    return TRUE;
}

/*********************************************************
 * check_rcptadd_data
 *
 * ɲåǡηå
 *
 * []
 *      $add_data       ɲåǡ
 *
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 **********************************************************/
function check_rcptadd_data($add_data)
{
    global $err_msg;

    /* å */
    if ($add_data["domain"] == "") {
        $err_msg = "ɥᥤ̾/᡼륢ɥ쥹ϤƤޤ";
        return FALSE;
    }

    /* 饸ܥå */
    if (check_flg($add_data["password"]) === FALSE ||
            check_flg($add_data["rule"]) === FALSE) {
        $err_msg = "ǡͤǤ";
        return FALSE;
    }

    /* ѥɥå() */
    if ($add_data["password"] == 0) {
        /* å */
        if ($add_data["indivipass"] == "") {
            $err_msg = "Ź沽ѥɤϤƤޤ" ;
            return FALSE;
        }
        /* å */
        if (check_samma_pass($add_data["indivipass"]) === FALSE) {
            $err_msg = "Ź沽" . $err_msg;
            return FALSE;
        }
    }

    /* ɥᥤ̾/᡼륢ɥ쥹å */
    if (check_samma_mail($add_data["domain"]) === FALSE) {
        $err_msg = "ɥᥤ̾/᡼륢ɥ쥹ηǤ";
        return FALSE;
    }

    return TRUE;

}
/*********************************************************
 * add_rcpt_data
 *
 * ǡɲ
 *
 * []
 *      $add_data       ɲåǡ
 *
 * [֤]
 *      SUCCESS        
 *      FAIL           ۾
 *      FAIL_EXIST     ۾(˥ǡ)
 **********************************************************/
function add_rcpt_data($add_data)
{
    global $err_msg;
    global $web_conf;
    global $url_data;
    global $userdn;

    /* LDAPϿɬ°Υå */
    $attr = array("objectClass" => SAMMA_OBJECT);

    /* Ͽǡ */
    $key = $add_data["domain"];
    $check_key = "!" . $key;
    if ($add_data["rule"] == 0) {
        $key = "!" . $key;
        $check_key = $key;
    }

    /* ʣå */
    /* оݤϴ"!"ʤоݤ""ʤʤ */
    $filter = "objectClass=" . SAMMA_OBJECT;
    $check_attrs = array("mailEncryptionAddr");
    $checkdn = LDAP_filter_escape(sprintf(ENC_DN, $check_key, $userdn));

    /* ȥμ */
    $ret = main_get_entry($checkdn, $filter, $check_attrs, TYPE_SUBTREE, $ldapdata);
    if ($ret === LDAP_OK) {
        $str = explode("!", $key, 2);
        if ($str[0] != $key) {
            $disp = $str[1];
        } else {
            $disp = $key;
        }
        $err_msg = "꤬¸ߤޤ(" . $disp . ")";
        return FAIL_EXIST;
    } elseif ($ret !== LDAP_ERR_NODATA) {
        return FAIL;
    }

    $attr["mailEncryptionAddr"] = $key;

    if ($add_data["password"] == 0) {
        $attr["mailEncryptionPassword"] = $add_data["indivipass"];
    }

    $dn = LDAP_filter_escape(sprintf(ENC_DN, $key, $userdn));

    /* LDAPɲ */
    $ret = LDAP_add_entry($dn, $attr);
    if ($ret === LDAP_ERR_DUPLICATE) {
        return FAIL_EXIST;
    } elseif ($ret !== LDAP_OK) {
        return FAIL;
    }

    return SUCCESS;

}

/*********************************************************
 * check_mod_data
 *
 * ѹǡηå
 *
 * []
 *      $mod_data       ѹǡ
 *
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 **********************************************************/
function check_rcptmod_data(&$mod_data)
{
    global $err_msg;

    /* å */
    if ($mod_data["domain"] == "" || $mod_data["disp_dom"] == "") {
        $err_msg = "ɥᥤ̾/᡼륢ɥ쥹ηǤ";
        return FALSE;
    }

    /* 饸ܥå */
    if (check_flg($mod_data["password"]) === FALSE ||
            check_flg($mod_data["rule"]) === FALSE) {
        $err_msg = "ǡͤǤ";
        return FALSE;
    }

    /* ѥɥå() */
    if ($mod_data["password"] == 0) {
        /* å */
        if ($mod_data["indivipass"] == "") {
            $err_msg = "Ź沽ѥɤϤƤޤ" ;
            return FALSE;
        }
        /* å */
        if (check_samma_pass($mod_data["indivipass"]) === FALSE) {
            $err_msg = "Ź沽" . $err_msg;
            return FALSE;
        }
    } else {
        $mod_data["indivipass"] = "";
    }

    /* ɥᥤ̾/᡼륢ɥ쥹å */
    if (check_samma_mail($mod_data["disp_dom"]) === FALSE) {
        $err_msg = "ɥᥤ̾/ɥ쥹ηǤ";
        return FALSE;
    }

    return TRUE;

}

/*********************************************************
 * mod_rcpt_data
 *
 * ǡι
 *
 * []
 *      $mod_data       ѹǡ
 *      $old_rule       ѹŹ沽롼
 *
 * [֤]
 *      SUCCESS		
 *      FAIL		۾
 *      FAIL_NO_EXIST	۾(ǡʤ)
 *      FAIL_EXIST	۾(ǡˤ)
 **********************************************************/
function mod_rcpt_data($mod_data,  $old_rule)
{

    /* Ͽǡ */
    $old_key = $mod_data["domain"];

    /* оݤоݤѹ */
    if ($old_rule == 1 && $mod_data["rule"] == 0) {
        $key = "!" . $old_key;
    /* оݤоݤѹ */
    } elseif ($old_rule == 0 && $mod_data["rule"] == 1) {
        $str = explode("!", $mod_data["domain"], 2);
        $key = $str[1];
    /* ѹʤ */
    } else {
        $key = $old_key;
    }

    /* ѥ */
    $value = "";
    if ($mod_data["password"] == 0) {
        $value = $mod_data["indivipass"];
    }

    /* Ź沽롼ѹʤϤΤޤѹ */
    if ($old_rule == $mod_data["rule"]) {

        /* LDAP */
        $ret = ldap_mod($key, $value);
        if ($ret !== SUCCESS) {
            return $ret;
        }
    } else {
        /* LDAP(ѹ) */
        $ret = ldap_key_mod($old_key, $key, $value);
        if ($ret !== SUCCESS) {
            return $ret;
        }
    }

    return SUCCESS;

}

/*********************************************************
 * get_one_data
 *
 * ǡ
 *
 * []
 *      $key            
 *      $data           ǡ(Ϣ󡦻Ϥ)
 *
 * [֤]
 *      TRUE            
 *      FALSE           ۾
 **********************************************************/
function get_one_data($key, &$data)
{
    global $err_msg;
    global $userdn;

    $filter = sprintf(OBJECT_DN, SAMMA_OBJECT);
    $attrs = array();
    $dn = LDAP_filter_escape(sprintf(ENC_DN, $key, $userdn));

    /* ǡ */
    $ret = main_get_entry($dn, $filter, $attrs, TYPE_SUBTREE, $ldapdata);
    if ($ret !== LDAP_OK) {
        return FALSE;
    }

    /* ǡ */
    $domain = $key;
    $rule = EFFECT;
    $password = RANDOM;
    $indivipass = "";

    /* оorо */
    $str = explode("!", $key, 2);
    if ($str[0] != $key) {
        $domain = $str[1];
        $rule = INEFFECT;
    }

    /* ѥ */
    if (isset($ldapdata[0]["mailEncryptionPassword"][0]) === TRUE) {
        $password = INDIVI;
        $indivipass = $ldapdata[0]["mailEncryptionPassword"][0];
    }

    /* ɽ */
    $data["disp_dom"] = $domain;
    $data["domain"] = $key;
    $data["rule"] = $rule;
    $data["password"] = $password;
    $data["indivipass"] = $indivipass;

    return TRUE;

}

/*********************************************************
 * LDAP_filter_escape()
 * ե륿Υ
 *
 * ե륿˻ꤵʸ(#, +)򥨥פޤ
 *
 * []
 *      $str   פʸ
 * [֤]
 *      string ׸ʸ
 **********************************************************/
function LDAP_filter_escape($str)
{
    $trans = array("#" => "\\#",
                   "+" => "\\+");

    return strtr($str, $trans);
}

/*********************************************************
 * check_ip_addr
 *
 * IPɥ쥹Υå
 *
 * []
 *	$ipaddr		åǡ
 *
 * [֤]
 *			TRUE
 *	۾		FALSE
 **********************************************************/
function check_ip_addr($ipaddr)
{
    global $err_msg;

    /* .פοå */
    $ip_num = explode(".", $ipaddr);
    $max = count($ip_num);
    /* ġ.פϣ */
    if ($max != 4) {
        $err_msg = "Ǥ";
        return FALSE;
    }

    /* ƿΥå */
    for ($i = 0; $i < $max; $i++) {
        /* ä饨顼 */
        if ($ip_num[$i] === "") {
           $err_msg = "Ǥ";
            return FALSE;
        }
        /* ʤä饨顼 */
        $num = "1234567890";
        $spn = strspn($ip_num[$i], $num);
        $len = strlen($ip_num[$i]);
        if ($spn != $len) {
            $err_msg = "Ǥ";
            return FALSE;
        }
        /* 0ʾ255ʲ */
        if ($ip_num < 0 || $ip_num[$i] > 255) {
            $err_msg = "Ǥ";
            return FALSE;
        }

    }
    return TRUE;
}
?>
