<?php /* $Id: functions.php,v 1.9 2005/12/18 09:50:59 benjamin Exp $ ---------------------------------------------------------------------- AlternC - Web Hosting System Copyright (C) 2002 by the AlternC Development Team. http://alternc.org/ ---------------------------------------------------------------------- Based on: Valentin Lacambre's web hosting softwares: http://altern.org/ ---------------------------------------------------------------------- LICENSE This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (GPL) 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. To read the license please visit http://www.gnu.org/copyleft/gpl.html ---------------------------------------------------------------------- Original Author of file: Benjamin Sonntag, Franck Missoum Purpose of file: Miscellaneous functions globally used ---------------------------------------------------------------------- */ /* seed the random number generator : */ list($usec, $sec) = explode(' ', microtime()); mt_srand((float) $sec + ((float) $usec * 100000)); /* Format a field value for input or textarea : */ function fl($str) { return str_replace("<","<",str_replace("\"",""",$str)); } /* Check if a domain can be hosted on this server : Return a negative value in case of an error, or a string for the index in $tld */ function checkhostallow($domain,$dns) { global $L_NS1,$L_NS2,$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 (!$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 ($dns[$i]==$L_NS1) $n1=true; if ($dns[$i]==$L_NS2) $n2=true; } if ($fmode==1 && $n1) // OK return $found; if ($fmode==2 && $n1 && $n2) // OK return $found; return -3; // DNS incorrect in the whois } /* Check that a domain can be hosted in that server, without DNS managment. */ 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; } /* Check that $url is a correct url (http:// or https:// or ftp://) */ 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]); if ($t) return false; return true; } /* Check that $ip is a correct 4 Dotted ip */ function checkip($ip) { // return true or false whether the ip is correctly formatted if (!ereg("[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*",$ip)) return false; $l=explode(".",$ip); if ($l[0]>255 || $l[1]>255 || $l[2]>255 || $l[3]>255) return false; return true; } /* Check a login mail */ function checkloginmail($mail) { if (!preg_match("/^[a-zA-Z0-9_\.:\+\-]+$/",$mail)) { return false; } else { return true; } } /* " */ /* Check an email address, use checkloginmail and checkfqdn */ function checkmail($mail) { // Retourne 0 si tout va bien, sinon retourne un code erreur... // 1 s'il n'y a rien devant l'@ // 2 3 ou 4 si le domaine est incorrect. // 5 s'il y a caract�res interdits dans la partie gauche du @ // 6 si le mail contient aucun ou plus d'un @ $t=explode("@",$mail); if (count($t)!=2) { return 6; } $c=checkfqdn($t[1]); if ($c) return $c; // Verification de la partie gauche : if (!checkloginmail($t[0])) { if ($t[0]=="") { return 1; } else { return 5; } } return 0; } /* Check that a domain name is fqdn compliant */ 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. Caract?re interdit dans l'un des membres. if (strlen($fqdn)>255) return 1; $members=explode(".", $fqdn); if (count($members)>1) { reset($members); while (list ($key, $val) = each ($members)) { if (strlen($val)>63) return 2; if (!eregi("^[a-z0-9][a-z0-9-]*[a-z0-9]$",$val)) { /*"*/ return 3; } } } else { return 4; } return 0; } function checkuserpath($path) { /* 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 */ global $mem; $user=$mem->user["login"]; $usar=substr($user,0,1); if (substr($path,0,1)=="/") $path="/".$path; $rpath = realpath("/var/alternc/html/$usar/$user$path"); $userpath = realpath("/var/alternc/html/$usar/$user"); if(strpos($rpath,$userpath) === 0){ if (is_dir("/var/alternc/html/$usar/$user$path")) { return 1; } if (is_file("/var/alternc/html/$usar/$user$path")) { return 2; } } return 0; } /** * get the home of the user * * @args string $user the username, if null will use the global $mem. no * security checks performed on path * @returns string the actual absolute path * @see $L_ALTERNC_LOC */ function getuserpath($user = null) { global $L_ALTERNC_LOC; if (is_null($user)) { global $mem; $user = $mem->user['login']; } return $L_ALTERNC_LOC . "/html/".substr($user,0,1)."/".$user; } function cbox($test) { if ($test) echo (" checked=\"checked\""); } function ecif($test,$tr,$fa="") { if ($test) echo $tr; else echo $fa; } function __($str) { echo _($str); } function ife($test,$tr,$fa="") { if ($test) return $tr; else return $fa; } function format_size($size) { // 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"); } } } } return $r; } function getlinkhelp($hid) { return "(<a href=\"javascript:help($hid);\">?</a>)"; } function linkhelp($hid) { echo getlinkhelp($hid); } 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"; } return sprintf(_($format),$d,$m,$y,$h,$i,$hh,$am); } /* Strip slashes if needed : */ 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 number $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 = "<select name=\"$name\" id=\"$name\">"; foreach(array(0, 1, 2, 3, 4, 6, 12, 24) as $dur) { $res .= "<option value=\"$dur\""; if($selected == $dur) { $res .= ' selected'; } $res .= '>'; if($dur == 0) { $res .= _('Not managed'); } else { $res .= pretty_months($dur); } $res .= '</option>'; } $res .= '</select>'; return $res; } ?>