query("SELECT tld,mode FROM tld;");
while ($db->next_record()) {
list($key, $val) = $db->Record;
if (substr($domain, -1 - strlen($key)) == "." . $key) {
if ($sizefound < strlen($key)) {
$sizefound = strlen($key);
$found = $key;
$fmode = $val;
}
}
}
if ($dom->tld_no_check_at_all) {
return 0; // OK , the boss say that you can.
}
if (!$found || $fmode == 0) { // TLD not allowed at all
return -1;
}
if (($fmode != 4) && (!is_array($dns))) { // NO dns found in the whois, and domain MUST exists
return -2;
}
if ($fmode > 2) { // OK, in the case 3 4 5
return $found;
}
$n1 = false;
$n2 = false;
for ($i = 0; $i < count($dns); $i++) {
if (strtolower($dns[$i]) == strtolower($L_NS1)) {
$n1 = true;
}
if (strtolower($dns[$i]) == strtolower($L_NS2)) {
$n2 = true;
}
}
if ($fmode == 1 && $n1) {
return $found;
}
if ($fmode == 2 && $n1 && $n2) {
return $found;
}
return -3; // DNS incorrect in the whois
}
/**
* Check that a domain can be hosted in that server,
* without DNS managment.
* @global m_mysql $db
* @param string $domain
* @return int
*/
function checkhostallow_nodns($domain) {
global $db;
$sizefound = 0;
$found = "";
$db->query("SELECT tld,mode FROM tld;");
while ($db->next_record()) {
list($key, $val) = $db->Record;
if (substr($domain, -1 - strlen($key)) == "." . $key) {
if ($sizefound < strlen($key)) {
$sizefound = strlen($key);
$found = $key;
$fmode = $val;
}
}
}
// If we found a correct tld, let's find how many . before ;)
if (!$found || $fmode == 0) { // TLD not allowed at all
return 1;
}
if (count(explode(".", substr($domain, 0, -$sizefound))) > 2) {
return 1;
}
return 0;
}
/**
* Return the remote IP.
* If you are behind a proxy, use X_FORWARDED_FOR instead of REMOTE_ADDR
* @return string
*/
function get_remote_ip() {
return getenv('REMOTE_ADDR');
}
/**
* Check that $url is a correct url (http:// or https:// or ftp://)
*
* @param type $url
* @return boolean
*/
function checkurl($url) {
// TODO : add a path/file check
if (substr($url, 0, 7) != "http://" && substr($url, 0, 8) != "https://" && substr($url, 0, 6) != "ftp://") {
return false;
}
if (substr($url, 0, 7) == "http://") {
$fq = substr($url, 7);
}
if (substr($url, 0, 8) == "https://") {
$fq = substr($url, 8);
}
if (substr($url, 0, 6) == "ftp://") {
$fq = substr($url, 6);
}
$f = explode("/", $fq);
if (!is_array($f)) {
$f = array($f);
}
$t = checkfqdn($f[0]);
return !$t;
}
/**
* Check that TXT domain is correct
*
* @param string $txt
* @return boolean
*/
function checksubtxt($txt) {
return true;
}
/**
* Check that CNAME domain is correct
* @param string $cname
* @return boolean
*/
function checkcname($cname) {
if (($check = checkfqdn(rtrim($cname, ".")))) {
if ($check != 4) { // ALLOW non-fully qualified (no .)
return false; // bad FQDN
}
}
if (substr($cname, -1) != ".") {
// Not fully qualified :
if (strpos($cname, ".") === false) {
// NO DOT in the middle, no DOT elsewhere => seems fine
return true;
} else {
// NO DOT at the end, but A DOT ELSEWHERE => seems broken (please use fully qualified)
return false;
}
}
// fully qualified => fine
return true;
}
/**
* Check that $ip is a correct 4 Dotted ip
* @param string $ip
* @return type
*/
function checkip($ip) {
// return true or false whether the ip is correctly formatted
return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
}
/**
* Check that $ip is a correct ipv6 ip
* @param string $ip
* @return type
*/
function checkipv6($ip) {
// return true or false whether the ip is correctly formatted
return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
}
/**
* Check a login mail, cf http://www.bortzmeyer.org/arreter-d-interdire-des-adresses-legales.html
* @todo Check who is using that function and delete it when unused
* @param string $mail
* @return boolean
*/
function checkloginmail($mail) {
return true;
}
/**
* Check an email address, use filter_var with emails, which works great ;)
* @todo check who is using that function and delete it when unused
* @param string $mail
* @return boolean
*/
function checkmail($mail) {
if (filter_var($mail, FILTER_VALIDATE_EMAIL)) {
return FALSE;
} else {
return TRUE;
}
}
/**
* Check that a domain name is fqdn compliant
* @param string $fqdn
* @return int
*/
function checkfqdn($fqdn) {
// (RFC 1035 http://www.ietf.org/rfc/rfc1035.txt)
// Retourne 0 si tout va bien, sinon, retourne un code erreur...
// 1. Nom de domaine complet trop long.
// 2. L'un des membres est trop long.
// 3. Caractere interdit dans l'un des membres.
// 4. Le fqdn ne fait qu'un seul membre (il n'est donc pas fq...)
if (strlen($fqdn) > 255) {
return 1;
}
$members = explode(".", $fqdn);
if (count($members) > 1) {
$ret = 0;
} else {
$ret = 4;
}
reset($members);
while (list ($key, $val) = each($members)) {
if (strlen($val) > 63) {
return 2;
}
// Note: a.foo.net is a valid domain
// Note: RFC1035 tells us that a domain should not start by a digit, but every registrar allows such a domain to be created ... too bad.
if (!preg_match("#^[a-z0-9_]([a-z0-9-]*[a-z0-9])?$#i", $val)) {
return 3;
}
}
return $ret;
}
/**
* @global m_mem $mem
* @param string $path
* @return int
* return 0 if the path is not in the user's space
* return 1 if this is a directory
* return 2 if this is a regular file
*/
function checkuserpath($path) {
global $mem;
$user = $mem->user["login"];
$usar = substr($user, 0, 1);
if (substr($path, 0, 1) != "/") {
$path = "/" . $path;
}
$rpath = realpath(ALTERNC_HTML . "/$usar/$user$path");
if (!$rpath) { // if file or directory does not exist
return 1; // FIXME is it safe to say OK in this case ?
}
$userpath = getuserpath();
if (strpos($rpath, $userpath) === 0) {
if (is_dir(ALTERNC_HTML . "/$usar/$user$path")) {
return 1;
}
if (is_file(ALTERNC_HTML . "/$usar/$user$path")) {
return 2;
}
}
return 0;
}
/**
* get the home of the user
*
* @global m_mem $mem
* @args string $user the username, if null will use the global $mem. no
* security checks performed on path
* @return string the actual absolute path
*/
function getuserpath($user = null) {
if (is_null($user)) {
global $mem;
$user = $mem->user['login'];
}
return rtrim(ALTERNC_HTML, "/") . "/" . substr($user, 0, 1) . "/" . $user;
}
/**
* ECHOes checked="checked" only if the parameter is true
* useful for checkboxes and radio buttons
*
* @param boolean $test
* @param boolean $echo
*/
function cbox($test, $echo = true) {
if ($test) {
$return = " checked=\"checked\"";
} else {
$return = '';
}
if ($echo) {
echo $return;
}
return $return;
}
/**
* ECHOes selected="selected" only if the parameter is true
* useful for checkboxes and radio buttons
*
* @param boolean $bool
* @param boolean $echo
* @return string
*/
function selected($bool, $echo = TRUE) {
if ($bool) {
$return = " selected=\"selected\"";
} else {
$return = '';
}
if ($echo) {
echo $return;
}
return $return;
}
/**
*
* @param boolean $test
* @param string $tr
* @param string $fa
* @param integer $affiche
* @return string
*/
function ecif($test, $tr, $fa = "", $affiche = 1) {
if ($test) {
$retour = $tr;
} else {
$retour = $fa;
}
if ($affiche) {
echo $retour;
}
return $retour;
}
/**
*
* @param string $str
*/
function __($str) {
echo _($str);
}
/**
*
* @param boolean $test
* @param string $tr
* @param string $fa
* @return string
*/
function ife($test, $tr, $fa = "") {
if ($test) {
return $tr;
}
return $fa;
}
/**
*
* @param int|string $size
* @param integer $html
* @return string
*/
function format_size($size, $html = 0) {
// Retourne une taille formatt�e en Octets, Kilo-octets, M�ga-octets ou Giga-Octets, avec 2 d�cimales.
if ("-" == $size) {
return $size;
}
$size = (float) $size;
if ($size < 1024) {
$r = $size;
if ($size != 1) {
$r.=" " . _("Bytes");
} else {
$r.=" " . _("Byte");
}
} else {
$size = $size / 1024;
if ($size < 1024) {
$r = round($size, 2) . " " . _("Kb");
} else {
$size = $size / 1024;
if ($size < 1024) {
$r = round($size, 2) . " " . _("Mb");
} else {
$size = $size / 1024;
if ($size < 1024) {
$r = round($size, 2) . " " . _("Gb");
} else {
$r = round($size / 1024, 2) . " " . _("Tb");
}
}
}
}
if ($html) {
return str_replace(" ", " ", $r);
} else {
return $r;
}
}
/**
*
* @param int $hid
* @return string
*/
function getlinkhelp($hid) {
return "(?)";
}
/**
*
* @param int $hid
*/
function linkhelp($hid) {
echo getlinkhelp($hid);
}
/**
*
* @param string $format
* @param string $date
* @return string
*/
function format_date($format, $date) {
$d = substr($date, 8, 2);
$m = substr($date, 5, 2);
$y = substr($date, 0, 4);
$h = substr($date, 11, 2);
$i = substr($date, 14, 2);
if ($h > 12) {
$hh = $h - 12;
$am = "pm";
} else {
$hh = $h;
$am = "am";
}
// we want every number to be treated as a string.
$format=str_replace('$d', '$s', $format);
return sprintf($format, $d, $m, $y, $h, $i, $hh, $am);
}
/**
* Strip slashes if needed :
* @param string $str
* @return string
*/
function ssla($str) {
if (get_magic_quotes_gpc()) {
return stripslashes($str);
} else {
return $str;
}
}
/* ----------------------------------------------------------------- */
/** Hashe un mot de passe en clair en MD5 avec un salt al�atoire
* @param string $pass Mot de passe � crypter (max 32 caract�res)
* @return string Retourne le mot de passe crypt�
* @access private
*/
function _md5cr($pass, $salt = "") {
if (!$salt) {
$chars = "./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
for ($i = 0; $i < 12; $i++) {
$salt.=substr($chars, (mt_rand(0, strlen($chars))), 1);
}
$salt = "$1$" . $salt;
}
return crypt($pass, $salt);
}
/** split mysql database name between username and custom database name
* @param string $dbname database name
* @return array returns username as first element, custom name as second
*/
function split_mysql_database_name($dbname) {
$db_exploded_name = explode("_", $dbname);
return array($db_exploded_name[0],
implode("_", array_slice($db_exploded_name, 1)));
}
/* ----------------------------------------------------------------- */
/** Echappe les caract�res pouvant perturber un flux XML standard :
* @param string $string Chaine de caract�re � encoder en valeur xml.
* @return string Retourne la cha�ne modifi�e si besoin.
* @access private
*/
function xml_entities($string) {
return str_replace("<", "<", str_replace(">", ">", str_replace("&", "&", $string)));
}
/* ----------------------------------------------------------------- */
/** Converti un nombre de mois en une chaine plus lisible
* @param integer $months Nombre de mois
* @return string Cha�ne repr�sentant le nombre de mois
* @access private
*/
function pretty_months($months) {
if ($months % 12 == 0 && $months > 11) {
$years = $months / 12;
return "$years " . ($years > 1 ? _("years") : _("year"));
} else {
return "$months " . ($months > 1 ? _("months") : _("month"));
}
}
/* ----------------------------------------------------------------- */
/** Fabrique un drop-down pour les dur�es de comptes
* @name string $name Nom pour le composasnt
* @selected number Option selection�e du composant
* @return string Code html pour le drop-down
* @access private
*/
function duration_list($name, $selected = 0) {
$res = "