400 lines
11 KiB
PHP
400 lines
11 KiB
PHP
<?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<63>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. 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;
|
||
if (!eregi("^[a-z0-9][a-z0-9-]*[a-z0-9]$",$val)) {
|
||
/*"*/ return 3;
|
||
}
|
||
}
|
||
return $ret;
|
||
}
|
||
|
||
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<74>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<61>atoire
|
||
* @param string $pass Mot de passe <20> crypter (max 32 caract<63>res)
|
||
* @return string Retourne le mot de passe crypt<70>
|
||
* @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<63>res pouvant perturber un flux XML standard :
|
||
* @param string $string Chaine de caract<63>re <20> encoder en valeur xml.
|
||
* @return string Retourne la cha<68>ne modifi<66>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<68>ne repr<70>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<75>es de comptes
|
||
* @name string $name Nom pour le composasnt
|
||
* @selected number Option selection<6F>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;
|
||
}
|
||
|
||
|
||
?>
|