* Copyleft {@link http://alternc.net/ AlternC Team} * * @copyright AlternC-Team 2002-11-01 http://alternc.net/ * */ class m_dom { /** $domains : Cache des domaines du membre * @access private */ var $domains; /** $dns : Liste des dns trouvés par la fonction whois * @access private */ var $dns; /** Flag : a-t-on trouvé un sous-domaine Webmail pour ce domaine ? * @access private */ var $webmail; /** * Système de verrouillage du cron * Ce fichier permet de verrouiller le cron en attendant la validation * du domaine par update_domains.sh * @access private */ var $fic_lock_cron="/var/run/alternc/cron.lock"; /** * Le cron a-t-il été bloqué ? * Il faut appeler les fonctions privées lock et unlock entre les * appels aux domaines. * @access private */ var $islocked=false; var $type_local = "0"; var $type_url = "1"; var $type_ip = "2"; var $type_webmail = "3"; var $action_insert = "0"; var $action_update= "1"; var $action_delete = "2"; /* ----------------------------------------------------------------- */ /** * Constructeur */ function m_dom() { } /* ----------------------------------------------------------------- */ /** * Quota name */ function alternc_quota_names() { return "dom"; } /* ----------------------------------------------------------------- */ /** * Retourne un tableau contenant les domaines d'un membre. * * @return array retourne un tableau indexé contenant la liste des * domaines hébergés sur le compte courant. Retourne FALSE si une * erreur s'est produite. */ function enum_domains() { global $db,$err,$cuid; $err->log("dom","enum_domains"); $db->query("select * from domaines where compte='$cuid' order by domaine asc;"); $this->domains=array(); if ($db->num_rows()>0) { while ($db->next_record()) { $this->domains[]=$db->f("domaine"); } } return $this->domains; } /* ----------------------------------------------------------------- */ /** * Efface un domaine du membre courant, et tous ses sous-domaines * * Cette fonction efface un domaine et tous ses sous-domaines, ainsi que * les autres services attachés à celui-ci. Elle appelle donc les autres * classe. Chaque classe peut déclarer une fonction del_dom qui sera * appellée lors de la destruction d'un domaine. * * @param string $dom nom de domaine à effacer * @return boolean Retourne FALSE si une erreur s'est produite, TRUE sinon. */ function del_domain($dom) { global $db,$err,$classes,$cuid; $err->log("dom","del_domain",$dom); $dom=strtolower($dom); $db->query("SELECT * FROM domaines WHERE domaine='$dom';"); if ($db->num_rows()==0) { $err->raise("dom",1,$dom); return false; } $db->next_record(); if ($db->f("compte")!=$cuid) { $err->raise("dom",2,$dom); return false; } $db->query("INSERT INTO domaines_standby (compte,domaine,mx,gesdns,gesmx,action) SELECT compte,domaine,mx,gesdns,gesmx,2 FROM domaines WHERE domaine='$dom'"); // DELETE $db->query("DELETE FROM domaines WHERE domaine='$dom';"); $db->query("DELETE FROM sub_domaines WHERE domaine='$dom';"); // DEPENDANCE : // Lancement de del_dom sur les classes domain_sensitive : // Declenchons les autres classes. foreach($classes as $c) { if (method_exists($GLOBALS[$c],"alternc_del_domain")) { $GLOBALS[$c]->alternc_del_domain($dom); } } foreach($classes as $c) { if (method_exists($GLOBALS[$c],"alternc_del_mx_domain")) { $GLOBALS[$c]->alternc_del_mx_domain($dom); } } return true; } /* ----------------------------------------------------------------- */ /** * Installe un domaine sur le compte courant. * *

Si le domaine existe déjà ou est interdit, ou est celui du serveur, * l'installation est refusée. Si l'hébergement DNS est demandé, la fonction * checkhostallow vérifiera que le domaine peut être installé conformément * aux demandes des super-admin. * Si le dns n'est pas demandé, le domaine peut être installé s'il est en * seconde main d'un tld (exemple : test.eu.org ou test.com, mais pas * toto.test.org ou test.test.asso.fr)

*

Chaque classe peut définir une fonction add_dom($dom) qui sera * appellée lors de l'installation d'un nouveau domaine.

* * @param string $dom nom fqdn du domaine à installer * @param integer $dns 1 ou 0 pour héberger le DNS du domaine ou pas. * @param integer $noerase 1 ou 0 pour rendre le domaine inamovible ou non * @param integer $force 1 ou 0, si 1, n'effectue pas les tests de DNS. * force ne devrait être utilisé que par le super-admin. $ @return boolean Retourne FALSE si une erreur s'est produite, TRUE sinon. */ function add_domain($domain,$dns,$noerase=0,$force=0) { global $db,$err,$quota,$classes,$L_MX,$L_FQDN,$tld,$cuid; $err->log("dom","add_domain",$domain); $mx="1"; // Locked ? if (!$this->islocked) { $err->raise("dom",3); return false; } // Verifie que le domaine est rfc-compliant $domain=strtolower($domain); $t=checkfqdn($domain); if ($t) { $err->raise("dom",3+$t); return false; } // Interdit les domaines clés (table forbidden_domains) sauf en cas FORCE $db->query("select domain from forbidden_domains where domain='$domain'"); if ($db->num_rows() && !$force) { $err->raise("dom",22); return false; } if ($domain==$L_FQDN || $domain=="www.$L_FQDN") { $err->raise("dom",18); return false; } $db->query("SELECT compte FROM domaines WHERE domaine='$domain';"); if ($db->num_rows()) { $err->raise("dom",8); return false; } $db->query("SELECT compte FROM `sub_domaines` WHERE sub != \"\" AND concat( sub, \".\", domaine )='$domain' OR domaine='$domain';"); if ($db->num_rows()) { $err->raise("dom",8); return false; } $db->query("select compte from domaines_standby where domaine='$domain';"); if ($db->num_rows()!=0) { $err->raise("dom",9); return false; } $this->dns=$this->whois($domain); if (!$force) { $v=checkhostallow($domain,$this->dns); if ($v==-1) { $err->raise("dom",7); // TLD interdit return false; } if ($dns && $v==-2) { $err->raise("dom",12); // Domaine non trouvé dans le whois return false; } if ($dns && $v==-3) { $err->raise("dom",23); // Domaine non trouvé dans le whois return false; } if ($dns) $dns="1"; else $dns="0"; // mode 5 : force DNS to NO. if ($tld[$v]==5) $dns=0; // It must be a real domain (no subdomain) if (!$dns) { $v=checkhostallow_nodns($domain); if ($v) { $err->raise("dom",22); return false; } } } // Check the quota : if (!$quota->cancreate("dom")) { $err->raise("dom",10); return false; } if ($noerase) $noerase="1"; else $noerase="0"; $db->query("insert into domaines (compte,domaine,mx,gesdns,gesmx,noerase) values ('$cuid','$domain','$L_MX','$dns','$mx','$noerase');"); $db->query("insert into domaines_standby (compte,domaine,mx,gesdns,gesmx,action) values ('$cuid','$domain','$L_MX','$dns','$mx',0);"); // INSERT // Creation du repertoire dans www global $bro; $dest_root = $bro->get_userid_root($cuid); $dest_www = $dest_root . '/www'; $dest_www_domain = $dest_www . '/' . $domain; if (! is_dir($dest_www)) { echo "A: $dest_www"; mkdir($dest_www); } if (! is_dir($dest_www_domain)) { mkdir($dest_www_domain); } // Creation des 3 sous-domaines par défaut : Vide, www et mail $this->set_sub_domain($domain, '', $this->type_url, 'add', 'http://www.'.$domain); $this->set_sub_domain($domain, 'www', $this->type_local, 'add', '/www/' . $domain); $this->set_sub_domain($domain, 'mail', $this->type_webmail, 'add', ''); // DEPENDANCE : // Lancement de add_dom sur les classes domain_sensitive : // Declenchons les autres classes. foreach($classes as $c) { if (method_exists($GLOBALS[$c],"alternc_add_domain")) { $GLOBALS[$c]->alternc_add_domain($domain); } } foreach($classes as $c) { if (method_exists($GLOBALS[$c],"alternc_add_mx_domain")) { $GLOBALS[$c]->alternc_add_mx_domain($domain); } } return true; } /* ----------------------------------------------------------------- */ /** * Retourne les entrées DNS du domaine $domain issues du WHOIS. * * Cette fonction effectue un appel WHOIS($domain) sur Internet, * et extrait du whois les serveurs DNS du domaine demandé. En fonction * du TLD, on sait (ou pas) faire le whois correspondant. * Actuellement, les tld suivants sont supportés : * .com .net .org .be .info .ca .cx .fr .biz .name * * @param string $domain Domaine fqdn dont on souhaite les serveurs DNS * @return array Retourne un tableau indexé avec les NOMS fqdn des dns * du domaine demandé. Retourne FALSE si une erreur s'est produite. * */ function whois($domain) { global $db,$err; $err->log("dom","whois",$domain); // pour ajouter un nouveau TLD, utiliser le code ci-dessous. // echo "whois : $domain
"; ereg(".*\.([^\.]*)",$domain,$out); $ext=$out[1]; // pour ajouter un nouveau TLD, utiliser le code ci-dessous. // echo "ext: $ext
"; $egal=""; switch($ext) { case "com": case "net": $serveur="whois.crsnic.net"; $egal="="; break; case "org": $serveur="whois.pir.org"; break; case "be": $serveur="whois.dns.be"; break; case "eu": # source: http://www.iana.org/domains/root/db/eu.html $serveur="whois.eu"; break; case "info": $serveur="whois.afilias.net"; break; case "ca": $serveur="whois.cira.ca"; break; case "cc": $serveur="ccwhois.verisign-grs.com"; break; case "cx": $serveur="whois.nic.cx"; break; case "it": $serveur="whois.nic.it"; break; case "fr": $serveur="whois.nic.fr"; break; case "biz": $serveur="whois.nic.biz"; break; case "name": $serveur="whois.nic.name"; $egal="domain = "; break; case "ws": $serveur="whois.samoanic.ws"; break; case "re": $serveur="whois.nic.re"; break; default: $err->raise("dom",7); return false; break; } // pour ajouter un nouveau TLD, utiliser le code ci-dessous. // echo "serveur : $serveur
"; if (($fp=fsockopen($serveur, 43))>0) { fputs($fp, "$egal$domain\r\n"); $found = false; $state=0; while (!feof($fp)) { $ligne = fgets($fp,128); // pour ajouter un nouveau TLD, utiliser le code ci-dessous. // echo "| $ligne
"; switch($ext) { case "org": case "com": case "net": case "info": case "biz": case "name": case "cc": if (ereg("Name Server:", $ligne)) { $found = true; $tmp=strtolower(ereg_replace(chr(10), "",ereg_replace(chr(13),"",ereg_replace(" ","", ereg_replace("Name Server:","", $ligne))))); if ($tmp) $server[]=$tmp; } break; case "cx": $ligne = ereg_replace(chr(10), "",ereg_replace(chr(13),"",ereg_replace(" ","", $ligne))); if ($ligne=="" && $state==1) $state=2; if ($state==1) $server[]=strtolower($ligne); if ($ligne=="Nameservers:" && $state==0) { $state=1; $found = true; } break; case "eu": case "be": $ligne=preg_replace("/^ *([^ ]*) \(.*\)$/","\\1",trim($ligne)); if($found) $tmp = trim($ligne); if ($tmp) $server[]=$tmp; if ($ligne=="Nameservers:") { $state=1; $found=true; } break; case "it": if (ereg("nserver:", $ligne)) { $found=true; $tmp=strtolower(preg_replace("/nserver:\s*[^ ]*\s*([^\s]*)$/","\\1", $ligne)); if ($tmp) $server[]=$tmp; } break; case "fr": case "re": if (ereg("nserver:", $ligne)) { $found=true; $tmp=strtolower(preg_replace("/nserver:\s*([^\s]*)\s*.*$/","\\1", $ligne)); if ($tmp) $server[]=$tmp; } break; case "ca": case "ws"; if (ereg('^[[:space:]]*Name servers:[[:space:]]*$', $ligne)) { // found the server $state = 1; } elseif ($state) { if (ereg('^[^%]', $ligne) && $ligne = ereg_replace('[[:space:]]', "", $ligne)) { // first non-whitespace line is considered to be the nameservers themselves $found = true; $server[] = $ligne; } } break; } // switch } // while fclose($fp); } else { $err->raise("dom",11); return false; } if ($found) { return $server; } else { $err->raise("dom",12); return false; } } // whois /* ----------------------------------------------------------------- */ /** * vérifie la presence d'un champs mx valide sur un serveur DNS * */ function checkmx($domaine,$mx) { //initialise variables $mxhosts = array(); //récupére les champs mx if (!getmxrr($domaine,$mxhosts)) { //aucune hôte mx spécifié return 1; } else { //vérifie qu'un des hôtes est bien sur alternc $bolmx = 0; //décompose les différents champ MX coté alternc $arrlocalmx = split(",",$mx); //parcours les différents champ MX retournés foreach($mxhosts as $mxhost) { foreach($arrlocalmx as $localmx) { if ($mxhost==$localmx) { $bolmx = 1; } } } //définition de l'erreur selon reponse du parcours de mxhosts if ($bolmx == 0) { //aucun des champs MX ne correspond au serveur return 2; } else { //un champ mx correct a été trouvé return 0; } } } //checkmx /* ----------------------------------------------------------------- */ /** * retourne TOUTES les infos d'un domaine * * Note : si le domaine est en attente (présent dans * domaines_standby), une erreur est retournée * * @param string $dom Domaine dont on souhaite les informations * @return array Retourne toutes les infos du domaine sous la forme d'un * tableau associatif comme suit :
   *  $r["name"] =  Nom fqdn
   *  $r["dns"]  =  Gestion du dns ou pas ?
   *  $r["mx"]   =  Valeur du champs MX si "dns"=true
   *  $r["mail"] =  Heberge-t-on le mail ou pas ? (si "dns"=false)
   *  $r["nsub"] =  Nombre de sous-domaines
   *  $r["sub"]  =  tableau associatif des sous-domaines
   *  $r["sub"][0-(nsub-1)]["name"] = nom du sous-domaine (NON-complet)
   *  $r["sub"][0-(nsub-1)]["dest"] = Destination (url, ip, local ...)
   *  $r["sub"][0-(nsub-1)]["type"] = Type (0-n) de la redirection.
   *  
* Retourne FALSE si une erreur s'est produite. * */ function get_domain_all($dom) { global $db,$err,$cuid; $err->log("dom","get_domain_all",$dom); // Locked ? if (!$this->islocked) { $err->raise("dom",3); return false; } $t=checkfqdn($dom); if ($t) { $err->raise("dom",3+$t); return false; } $r["name"]=$dom; $db->query("select * from domaines_standby where compte='$cuid' and domaine='$dom'"); if ($db->num_rows()>0) { $err->raise("dom",13); return false; } $db->query("select * from domaines where compte='$cuid' and domaine='$dom'"); if ($db->num_rows()==0) { $err->raise("dom",1,$dom); return false; } $db->next_record(); $r["dns"]=$db->Record["gesdns"]; $r["mail"]=$db->Record["gesmx"]; $r["mx"]=$db->Record["mx"]; $r[noerase]=$db->Record[noerase]; $db->free(); $db->query("select count(*) as cnt from sub_domaines where compte='$cuid' and domaine='$dom'"); $db->next_record(); $r["nsub"]=$db->Record["cnt"]; $db->free(); $db->query("select * from sub_domaines where compte='$cuid' and domaine='$dom'"); // Pas de webmail, on le cochera si on le trouve. $this->webmail=0; for($i=0;$i<$r["nsub"];$i++) { $db->next_record(); $r["sub"][$i]=array(); $r["sub"][$i]["name"]=$db->Record["sub"]; $r["sub"][$i]["dest"]=$db->Record["valeur"]; $r["sub"][$i]["type"]=$db->Record["type"]; if ($db->Record["type"]==3) { // Webmail $this->webmail=1; $r["sub"][$i]["dest"]=_("Webmail access"); } } $db->free(); return $r; } // get_domain_all /* ----------------------------------------------------------------- */ /** * Retourne TOUTES les infos d'un sous domaine du compte courant. * * @param string $dom Domaine fqdn concerné * @param string $sub Sous-domaine dont on souhaite les informations * @return arrray Retourne un tableau associatif contenant les * informations du sous-domaine demandé.
   *  $r["name"]= nom du sous-domaine (NON-complet)
   *  $r["dest"]= Destination (url, ip, local ...)
   *  
* $r["type"]= Type (0-n) de la redirection. * Retourne FALSE si une erreur s'est produite. */ function get_sub_domain_all($dom,$sub) { global $db,$err,$cuid; $err->log("dom","get_sub_domain_all",$dom."/".$sub); // Locked ? if (!$this->islocked) { $err->raise("dom",3); return false; } $t=checkfqdn($dom); if ($t) { $err->raise("dom",3+$t); return false; } $db->query("select * from sub_domaines where compte='$cuid' and domaine='$dom' and sub='$sub'"); if ($db->num_rows()==0) { $err->raise("dom",14); return false; } $db->next_record(); $r=array(); $r["name"]=$db->Record["sub"]; $r["dest"]=$db->Record["valeur"]; $r["type"]=$db->Record["type"]; $db->free(); return $r; } // get_sub_domain_all /* ----------------------------------------------------------------- */ /** * Modifier les information du sous-domaine demandé. * * Note : si le sous-domaine $sub.$dom n'existe pas, il est créé.
* Note : TODO : vérification de concordance de $dest
* * @param string $dom Domaine dont on souhaite modifier/ajouter un sous domaine * @param string $subk Sous domaine à modifier / créer * @param integer $type Type de sous-domaine (local, ip, url ...) * @param string $action Action : vaut "add" ou "edit" selon que l'on * Crée (add) ou Modifie (edit) le sous-domaine * @param string $dest Destination du sous-domaine, dépend de la valeur * de $type (url, ip, dossier...) * @return boolean Retourne FALSE si une erreur s'est produite, TRUE sinon. */ function set_sub_domain($dom,$sub,$type,$action,$dest) { global $db,$err,$cuid; $err->log("dom","set_sub_domain",$dom."/".$sub); // Locked ? if (!$this->islocked) { $err->raise("dom",3); return false; } $dest=trim($dest); $sub=trim(trim($sub),"."); $dom=strtolower($dom); $sub=strtolower($sub); // if (!(($sub == '*') || ($sub=="") || (preg_match('/([a-z0-9][\.\-a-z0-9]*)?[a-z0-9]/', $sub)))) { $fqdn=checkfqdn($sub); // Special cases : * (all subdomains at once) and '' empty subdomain are allowed. if (($sub != '*' && $sub!='') && !($fqdn==0 || $fqdn==4)) { $err->raise("dom",24); return false; } if ($type==2) { // IP if (!checkip($dest)) { $err->raise("dom",19); return false; } } if ($type==1) { // URL if (!checkurl($dest)) { $err->raise("dom",20); return false; } } if ($type==0) { // LOCAL if (substr($dest,0,1)!="/") { $dest="/".$dest; } if (!checkuserpath($dest)) { $err->raise("dom",21); return false; } } // On a épuré $dir des problèmes eventuels ... On est en DESSOUS du dossier de l'utilisateur. $t=checkfqdn($dom); if ($t) { $err->raise("dom",3+$t); return false; } if (!$r=$this->get_sub_domain_all($dom,$sub)) { // Le sous-domaine n'existe pas, on le crée seulement si $action vaut add if ($action=="add") { $db->query("insert into sub_domaines (compte,domaine,sub,valeur,type) values ('$cuid','$dom','$sub','$dest',$type);"); $db->query("delete from sub_domaines_standby where domaine='$dom' and sub='$sub';"); $db->query("insert into sub_domaines_standby (compte,domaine,sub,valeur,type,action) values ('$cuid','$dom','$sub','$dest','$type',0);"); // INSERT } else { $err->raise("dom",14); return false; } } else { if ($action=="edit") { // On vérifie que des modifications ont bien eu lieu :) if ($r["type"]==$type && $r["dest"]==$dest) { $err->raise("dom",15); return false; } // OK, des modifs ont été faites, on valide : $db->query("update sub_domaines set type='$type', valeur='$dest' where domaine='$dom' and sub='$sub'"); $db->query("delete from sub_domaines_standby where domaine='$dom' and sub='$sub'"); $db->query("insert into sub_domaines_standby (compte,domaine,sub,valeur,type,action) values ('$cuid','$dom','$sub','$dest','$type',1);"); // UPDATE } else { $err->raise("dom",16); return false; } } return true; } // set_sub_domain /* ----------------------------------------------------------------- */ /** * Supprime le sous-domaine demandé * * @param string $dom Domaine dont on souhaite supprimer un sous-domaine * @param string $sub Sous-domaine que l'on souhaite supprimer * @return boolean Retourne FALSE si une erreur s'est produite, TRUE sinon. * */ function del_sub_domain($dom,$sub) { global $db,$err,$cuid; $err->log("dom","del_sub_domain",$dom."/".$sub); // Locked ? if (!$this->islocked) { $err->raise("dom",3); return false; } $t=checkfqdn($dom); if ($t) { $err->raise("dom",3+$t); return false; } if (!$r=$this->get_sub_domain_all($dom,$sub)) { // Le sous-domaine n'existe pas, erreur $err->raise("dom",14); return false; } else { // OK, on valide : $db->query("delete from sub_domaines where domaine='$dom' and sub='$sub'"); $db->query("delete from sub_domaines_standby where domaine='$dom' and sub='$sub'"); $db->query("insert into sub_domaines_standby (compte,domaine,sub,valeur,type,action) values ('$cuid','$dom','$sub','".$r["dest"]."','".$r["type"]."',2);"); // DELETE } return true; } // del_sub_domain /* ----------------------------------------------------------------- */ /** * Modifie les information du domaine précisé. * * @param string $dom Domaine du compte courant que l'on souhaite modifier * @param integer $dns Vaut 1 ou 0 pour héberger ou pas le DNS du domaine * @param integer $mx Nom fqdn du serveur mx, si le mx local est précisé, * on héberge alors les mails du domaine. * @param boolean $force Faut-il passer les checks DNS ou MX ? (admin only) * @return boolean appelle $mail->add_dom ou $ma->del_dom si besoin, en * fonction du champs MX. Retourne FALSE si une erreur s'est produite, * TRUE sinon. * */ function edit_domain($dom,$dns,$mx,$force=0) { global $db,$err,$L_MX,$classes,$cuid; $err->log("dom","edit_domain",$dom); // Locked ? if (!$this->islocked && !$force) { $err->raise("dom",3); return false; } if ($dns == 1 && !$force) { $this->dns=$this->whois($dom); $v=checkhostallow($dom,$this->dns); if ($v==-1) { $err->raise("dom",7); // TLD interdit return false; } if ($dns && $v==-2) { $err->raise("dom",12); // Domaine non trouvé dans le whois return false; } if ($dns && $v==-3) { $err->raise("dom",23); // Domaine non trouvé dans le whois return false; } } $t=checkfqdn($dom); if ($t) { $err->raise("dom",3+$t); return false; } if (!$r=$this->get_domain_all($dom)) { // Le domaine n'existe pas, Failure $err->raise("dom",4,$dom); return false; } if ($dns!="1") $dns="0"; // On vérifie que des modifications ont bien eu lieu :) if ($r["dns"]==$dns && $r["mx"]==$mx) { $err->raise("dom",15); return false; } // MX ? if ($mx==$L_MX) $gesmx="1"; else $gesmx="0"; //si gestion mx uniquement, vérification du dns externe if ($dns=="0" && $gesmx=="1" && !$force) { $vmx = $this->checkmx($dom,$mx); if ($vmx == 1) { // Aucun champ mx de spécifié sur le dns $err->raise("dom",25); return false; } if ($vmx == 2) { // Serveur non spécifié parmi les champx mx $err->raise("dom",25); return false; } } // OK, des modifs ont été faites, on valide : // DEPENDANCE : if ($gesmx && !$r["mail"]) { // on a associé le MX : on cree donc l'entree dans LDAP // Lancement de add_dom sur les classes domain_sensitive : foreach($classes as $c) { if (method_exists($GLOBALS[$c],"alternc_add_mx_domain")) { $GLOBALS[$c]->alternc_add_mx_domain($dom); } } } if (!$gesmx && $r["mail"]) { // on a dissocié le MX : on détruit donc l'entree dans LDAP // Lancement de del_dom sur les classes domain_sensitive : foreach($classes as $c) { if (method_exists($GLOBALS[$c],"alternc_del_mx_domain")) { $GLOBALS[$c]->alternc_del_mx_domain($dom); } } } $db->query("update domaines set gesdns='$dns', mx='$mx', gesmx='$gesmx' where domaine='$dom'"); $db->query("insert into domaines_standby (compte,domaine,mx,gesdns,gesmx,action) values ('$cuid','$dom','$mx','$dns','$gesmx',1);"); // UPDATE return true; } // edit_domain /****************************/ /* Slave dns ip managment */ /****************************/ /* ----------------------------------------------------------------- */ /** * Return the list of ip addresses and classes that are allowed access to domain list * through AXFR Transfers from the bind server. */ function enum_slave_ip() { global $db,$err; $db->query("SELECT * FROM slaveip;"); if (!$db->next_record()) { return false; } do { $res[]=$db->Record; } while ($db->next_record()); return $res; } /* ----------------------------------------------------------------- */ /** * Add an ip address (or a ip class) to the list of allowed slave ip access list. */ function add_slave_ip($ip,$class="32") { global $db,$err; if (!checkip($ip)) { $err->raise("dom",19); return false; } $class=intval($class); if ($class<8 || $class>32) $class=32; $db->query("SELECT * FROM slaveip WHERE ip='$ip' AND class='$class';"); if ($db->next_record()) { $err->raise("err",22); return false; } $db->query("INSERT INTO slaveip (ip,class) VALUES ('$ip','$class');"); $f=fopen(SLAVE_FLAG,"w"); fputs($f,"yopla"); fclose($f); return true; } /* ----------------------------------------------------------------- */ /** * Remove an ip address (or a ip class) from the list of allowed slave ip access list. */ function del_slave_ip($ip) { global $db,$err; if (!checkip($ip)) { $err->raise("dom",19); return false; } $db->query("DELETE FROM slaveip WHERE ip='$ip'"); $f=fopen(SLAVE_FLAG,"w"); fputs($f,"yopla"); fclose($f); return true; } /* ----------------------------------------------------------------- */ /** * Check for a slave account */ function check_slave_account($login,$pass) { global $db,$err; $db->query("SELECT * FROM slaveaccount WHERE login='$login' AND pass='$pass';"); if ($db->next_record()) { return true; } return false; } /* ----------------------------------------------------------------- */ /** * Out (echo) the complete hosted domain list : */ function echo_domain_list() { global $db,$err; $db->query("SELECT domaine FROM domaines WHERE gesdns=1 ORDER BY domaine"); while ($db->next_record()) { echo $db->f("domaine")."\n"; } return true; } /* ----------------------------------------------------------------- */ /** * Return the list of allowed slave accounts */ function enum_slave_account() { global $db,$err; $db->query("SELECT * FROM slaveaccount;"); $res=array(); while ($db->next_record()) { $res[]=$db->Record; } if (!count($res)) return false; return $res; } /* ----------------------------------------------------------------- */ /** * Add a slave account that will be allowed to access the domain list */ function add_slave_account($login,$pass) { global $db,$err; $db->query("SELECT * FROM slaveaccount WHERE login='$login'"); if ($db->next_record()) { $err->raise("err",23); return false; } $db->query("INSERT INTO slaveaccount (login,pass) VALUES ('$login','$pass')"); return true; } /* ----------------------------------------------------------------- */ /** * Remove a slave account */ function del_slave_account($login) { global $db,$err; $db->query("DELETE FROM slaveaccount WHERE login='$login'"); return true; } /*************/ /* Private */ /*************/ /* ----------------------------------------------------------------- */ /** * Lock tente de verrouiller le fichier lock du cron. Si tout va bien (toujours?) * retourne True, sinon retourne False * NOTE : le systeme de lock est asymétrique, si on a un fichier CRONLOCK, on * attends (que le cron ait fini son execution). * @access private */ function lock() { global $db,$err; $err->log("dom","lock"); if ($this->islocked) { $err->raise("dom",17); } while (file_exists($this->fic_lock_cron)) { sleep(2); } $this->islocked=true; return true; } /* ----------------------------------------------------------------- */ /** * unlock déverrouille le fichier lock du cron. Si tout va bien (toujours?) * retourne True, sinon retourne False * NOTE : actuellement, vu le système de lock asymetrique, on ne fait rien ;) * @access private */ function unlock() { global $db,$err; $err->log("dom","unlock"); if (!$this->islocked) { $err->raise("dom",3); } $this->islocked=false; return true; } /* ----------------------------------------------------------------- */ /** * Efface un compte (tous ses domaines) */ function alternc_del_member() { global $err; $err->log("dom","alternc_del_member"); $li=$this->enum_domains(); foreach($li as $dom) { $this->del_domain($dom); } return true; } /* ----------------------------------------------------------------- */ /** * Returns the used quota for the $name service for the current user. * @param $name string name of the quota * @return integer the number of service used or false if an error occured * @access private */ function alternc_get_quota($name) { global $db,$err,$cuid; if ($name=="dom") { $err->log("dom","get_quota"); $db->query("SELECT COUNT(*) AS cnt FROM domaines WHERE compte='$cuid'"); $db->next_record(); return $db->f("cnt"); } else return false; } /* ----------------------------------------------------------------- */ /** * Exporte toutes les informations domaine du compte. * @access private * EXPERIMENTAL 'sid' function ;) */ function alternc_export() { global $db,$err; $err->log("dom","export"); $this->enum_domains(); $str="\n"; foreach ($this->domains as $d) { $str.=" \n ".xml_entities($d)."\n"; $s=$this->get_domain_all($d); $str.=" ".xml_entities($s[dns])."\n"; $str.=" ".xml_entities($s[mx])."\n"; $str.=" ".xml_entities($s[mail])."\n"; if (is_array($s[sub])) { foreach ($s[sub] as $sub) { $str.=" "; $str.="".xml_entities($sub[name]).""; $str.="".xml_entities($sub[dest]).""; $str.="".xml_entities($sub[type]).""; $str.="\n"; } } $str.=" \n"; } $str.="\n"; return $str; } } /* Class m_domains */ ?>