diff --git a/bureau/class/m_dom.php b/bureau/class/m_dom.php
index 2f632999..64d50a7f 100644
--- a/bureau/class/m_dom.php
+++ b/bureau/class/m_dom.php
@@ -63,6 +63,7 @@ class m_dom {
* @access private
*/
var $islocked = false;
+
var $type_local = "VHOST";
var $type_url = "URL";
var $type_ip = "IP";
@@ -166,6 +167,7 @@ class m_dom {
}
+ // returns array(ALL,NONE,ADMIN)
function domains_type_enable_values() {
global $db, $msg, $cuid;
$msg->debug("dom", "domains_type_enable_values");
@@ -185,6 +187,7 @@ class m_dom {
/**
* @param integer $type
+ * all = 'NONE','URL','DIRECTORY','IP','IPV6','DOMAIN','TXT'
*/
function domains_type_target_values($type = null) {
global $db, $msg;
@@ -551,7 +554,7 @@ class m_dom {
}
- function domains_type_update($name, $description, $target, $entry, $compatibility, $enable, $only_dns, $need_dns, $advanced, $create_tmpdir, $create_targetdir) {
+ function domains_type_update($name, $description, $target, $entry, $compatibility, $enable, $only_dns, $need_dns, $advanced, $create_tmpdir, $create_targetdir,$has_https_option=0) {
global $msg, $db;
// The name MUST contain only letter and digits, it's an identifier after all ...
if (!preg_match("#^[a-z0-9]+$#", $name)) {
@@ -561,9 +564,10 @@ class m_dom {
$only_dns = intval($only_dns);
$need_dns = intval($need_dns);
$advanced = intval($advanced);
+ $has_https_option = intval($has_https_option);
$create_tmpdir = intval($create_tmpdir);
$create_targetdir = intval($create_targetdir);
- $db->query("UPDATE domaines_type SET description= ?, target= ?, entry= ?, compatibility= ?, enable= e, need_dns= ?, only_dns= ?, advanced= ?,create_tmpdir= ?,create_targetdir= ? where name= ?;", array($description, $target, $entry, $compatibility, $enable, $need_dns, $only_dns, $advanced, $create_tmpdir, $create_targetdir, $name));
+ $db->query("UPDATE domaines_type SET description= ?, target= ?, entry= ?, compatibility= ?, enable= e, need_dns= ?, only_dns= ?, advanced= ?,create_tmpdir= ?,create_targetdir= ?, has_https_option=? where name= ?;", array($description, $target, $entry, $compatibility, $enable, $need_dns, $only_dns, $advanced, $create_tmpdir, $create_targetdir, $has_https_option, $name));
return true;
}
@@ -922,177 +926,47 @@ class m_dom {
/**
- * 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.
+ * Return the NS of a server by interrogating its parent zone.
+ *
+ * @param string $domain FQDN we are searching for
+ * @return array Return the authoritative NS of this domain
+ * or FALSE if an error occurred
*
*/
function whois($domain) {
global $msg;
$msg->debug("dom", "whois", $domain);
- // pour ajouter un nouveau TLD, utiliser le code ci-dessous.
- // echo "whois : $domain
";
- preg_match("#.*\.([^\.]*)#", $domain, $out);
- $ext = $out[1];
- // pour ajouter un nouveau TLD, utiliser le code ci-dessous.
- // echo "ext: $ext
";
- $serveur = "";
- if (($fp = @fsockopen("whois.iana.org", 43)) > 0) {
- fputs($fp, "$domain\r\n");
- $found = false;
- $state = 0;
- while (!feof($fp)) {
- $ligne = fgets($fp, 128);
- if (preg_match('#^whois:#', $ligne)) {
- $serveur = preg_replace('/whois:\ */', '', $ligne, 1);
- }
+ $domain=trim($domain,"."); // strip initial/final .
+ $parent=$domain; $loopmax=32;
+ do {
+ $parent=substr($parent,strpos($parent,".")+1);
+ $parent=trim($parent,".");
+ if (!$parent) {
+ $msg->raise("ALERT", "dom", _("The domain has no parent. Check syntax"));
+ return false; // no . in this fqdn??
+ }
+ // ask the parent for its NS (no +trace)
+ $out=array();
+ exec("dig +short NS ".escapeshellarg($parent),$out);
+ $loopmax--;
+ } while (!count($out) && $loopmax); // will stop when : we have no parent, or
+ if (!count($out)) {
+ return false; // bad exit of the loop
+ }
+ $parentns=trim($out[0]);
+
+ // we take the first NS of the SOA of the parent and interrogate it for the child domain:
+ $out=array();
+ exec("dig NS ".escapeshellarg($domain)." ".escapeshellarg("@".$parentns),$out);
+ // we scan the dig result for authoritative information :
+ $ns=array();
+ foreach($out as $line) {
+ if (preg_match('#^'.str_replace(".","\\.",$domain).'\..*IN\s*NS\s*(.*)$#',$line,$mat)) {
+ $ns[]=trim($mat[1]);
}
}
- $serveur = str_replace(array(" ", "\n"), "", $serveur);
-
- $egal = "";
- switch ($ext) {
- case "net":
- $egal = "=";
- break;
- case "name":
- $egal = "domain = ";
- break;
- }
- $serveurList = array();
- // 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 (preg_match("#Name Server:#", $ligne)) {
- $found = true;
- $tmp = strtolower(str_replace(chr(10), "", str_replace(chr(13), "", str_replace(" ", "", str_replace("Name Server:", "", $ligne)))));
- if ($tmp) {
- $serveurList[] = $tmp;
- }
- }
- break;
- case "co":
- if (preg_match("#Name Server:#", $ligne)) {
- $found = true;
- $tmp = strtolower(str_replace(chr(10), "", str_replace(chr(13), "", str_replace(" ", "", str_replace("Name Server:", "", $ligne)))));
- if ($tmp)
- $serveurList[] = $tmp;
- }
- break;
- case "cx":
- $ligne = str_replace(chr(10), "", str_replace(chr(13), "", str_replace(" ", "", $ligne)));
- if ($ligne == "" && $state == 1) {
- $state = 2;
- }
- if ($state == 1) {
- $serveurList[] = strtolower($ligne);
- }
- if ($ligne == "Nameservers:" && $state == 0) {
- $state = 1;
- $found = true;
- }
- break;
- case "eu":
- case "be":
- $ligne = preg_replace("/^ *([^ ]*) \(.*\)$/", "\\1", trim($ligne));
- $tmp="";
- if ($found) {
- $tmp = trim($ligne);
- }
- if ($tmp) {
- $serveurList[] = $tmp;
- }
- if ($ligne == "Nameservers:") {
- $state = 1;
- $found = true;
- }
- break;
- case "im":
- if (preg_match('/Name Server:/', $ligne)) {
- $found = true;
- // weird regexp (trailing garbage after name server), but I could not make it work otherwise
- $tmp = strtolower(preg_replace('/Name Server: ([^ ]+)\..$/', "\\1", $ligne));
- $tmp = preg_replace('/[^-_a-z0-9\.]/', '', $tmp);
- if ($tmp) {
- $serveurList[] = $tmp;
- }
- }
- break;
- case "it":
- if (preg_match("#nserver:#", $ligne)) {
- $found = true;
- $tmp = strtolower(preg_replace("/nserver:\s*[^ ]*\s*([^\s]*)$/", "\\1", $ligne));
- if ($tmp) {
- $serveurList[] = $tmp;
- }
- }
- break;
- case "fr":
- case "re":
- if (preg_match("#nserver:#", $ligne)) {
- $found = true;
- $tmp = strtolower(preg_replace("#nserver:\s*([^\s]*)\s*.*$#", "\\1", $ligne));
- if ($tmp) {
- $serveurList[] = $tmp;
- }
- }
- break;
- case "ca":
- case "ws";
- if (preg_match('#Name servers#', $ligne)) {
- // found the server
- $state = 1;
- } elseif ($state) {
- if (preg_match('#^[^%]#', $ligne) && $ligne = preg_replace('#[[:space:]]#', "", $ligne)) {
- // first non-whitespace line is considered to be the nameservers themselves
- $found = true;
- $serveurList[] = $ligne;
- }
- }
- break;
- case "coop":
- if (preg_match('#Host Name:\s*([^\s]+)#', $ligne, $matches)) {
- $found = true;
- $serveurList[] = $matches[1];
- }
- } // switch
- } // while
- fclose($fp);
- } else {
- $msg->raise("ALERT", "dom", _("The Whois database is unavailable, please try again later"));
- return array();
- }
-
- if ($found) {
- return $serveurList;
- } else {
- $msg->raise("ALERT", "dom", _("The domain cannot be found in the Whois database"));
- return array();
- }
+ return $ns;
} // whois
@@ -1195,7 +1069,6 @@ class m_dom {
$db->next_record();
$r["nsub"] = $db->Record["cnt"];
$db->free();
- #$db->query("SELECT sd.*, dt.description AS type_desc, dt.only_dns FROM sub_domaines sd, domaines_type dt WHERE compte='$cuid' AND domaine='$dom' AND UPPER(dt.name)=UPPER(sd.type) ORDER BY sd.sub,sd.type");
$db->query("SELECT sd.*, dt.description AS type_desc, dt.only_dns, dt.advanced, dt.has_https_option FROM sub_domaines sd LEFT JOIN domaines_type dt on UPPER(dt.name)=UPPER(sd.type) WHERE compte= ? AND domaine= ? ORDER BY dt.advanced,sd.sub,sd.type ;", array($cuid, $dom));
// Pas de webmail, on le cochera si on le trouve.
$r["sub"] = array();
@@ -1268,6 +1141,8 @@ class m_dom {
return $https;
} else return "";
}
+
+
/**
* @param integer $type
* @param string $value
@@ -1594,7 +1469,7 @@ class m_dom {
// Can't have ttl == 0. There is also a check in function_dns
if ($ttl == 0) {
- $ttl = 86400;
+ $ttl = 3600;
}
$t = checkfqdn($dom);