diff --git a/bureau/admin/mail_doedit.php b/bureau/admin/mail_doedit.php index 7ad31c41..926a1a68 100644 --- a/bureau/admin/mail_doedit.php +++ b/bureau/admin/mail_doedit.php @@ -117,7 +117,7 @@ if (!$res=$mail->get_details($mail_id)) { } -if (!$error) $error=_("Your email has been edited successfully"); +if (!$error || !trim($error,"
")) $error=_("Your email has been edited successfully"); $_REQUEST["domain_id"]=$dom->get_domain_byname($res["domain"]); include("mail_list.php"); diff --git a/bureau/admin/mail_edit.php b/bureau/admin/mail_edit.php index beb8af78..b5a6258b 100644 --- a/bureau/admin/mail_edit.php +++ b/bureau/admin/mail_edit.php @@ -106,7 +106,7 @@ if (isset($error)) { ()
invoke("mail_edit_html",array($mail_id,$type)); + $html=$hooks->invoke("hook_mail_edit_html",array($mail_id,$type)); foreach($html as $h) echo $h; ?> diff --git a/bureau/class/m_admin.php b/bureau/class/m_admin.php index 386bac50..ce8a59d2 100644 --- a/bureau/class/m_admin.php +++ b/bureau/class/m_admin.php @@ -1,10 +1,9 @@ "This TLD is forbidden", - 1 => "primary DNS is checked in WHOIS db", - 2 => "primary & secondary DNS are checked in WHOIS db", - 3 => "Domain must exist, but don't do any DNS check", - 4 => "Domain can be installed, no check at all", - 5 => "Domain can be installed, force NO DNS hosting", - ); + public $tldmode=array(); /* ----------------------------------------------------------------- */ /** @@ -67,6 +59,15 @@ class m_admin { $db->query("SELECT su FROM membres WHERE uid='$cuid';"); $db->next_record(); $this->enabled=$db->f("su"); + + $this->tldmode=array( + 0 => _("This TLD is forbidden"), + 1 => _("primary DNS is checked in WHOIS db"), + 2 => _("primary & secondary DNS are checked in WHOIS db"), + 3 => _("Domain must exist, but don't do any DNS check"), + 4 => _("Domain can be installed, no check at all"), + 5 => _("Domain can be installed, force NO DNS hosting"), + ); } /* ----------------------------------------------------------------- */ @@ -1260,7 +1261,7 @@ EOF; $logins[]=$login; foreach($logins as $l) { if (strpos($password,$l)!==false) { - $err->raise("admin",17); + $err->raise("admin",_("The password policy prevents you to use your login name inside your password")); return false; } } diff --git a/bureau/class/m_dom.php b/bureau/class/m_dom.php index e20fdf59..4dd9f27f 100644 --- a/bureau/class/m_dom.php +++ b/bureau/class/m_dom.php @@ -1,6 +1,10 @@ raise("dom", 26); return false; } - $name=mysql_real_escape_string($name); - $description=mysql_real_escape_string($description); - $target=mysql_real_escape_string($target); - $entry=mysql_real_escape_string($entry); - $compatibility=mysql_real_escape_string($compatibility); - $enable=mysql_real_escape_string($enable); - $only_dns=intval($only_dns); - $need_dns=intval($need_dns); - $advanced=intval($advanced); + $name=mysql_real_escape_string($name); $description=mysql_real_escape_string($description); $target=mysql_real_escape_string($target); + $entry=mysql_real_escape_string($entry); $compatibility=mysql_real_escape_string($compatibility); $enable=mysql_real_escape_string($enable); + $only_dns=intval($only_dns); $need_dns=intval($need_dns); $advanced=intval($advanced); $db->query("UPDATE domaines_type SET description='$description', target='$target', entry='$entry', compatibility='$compatibility', enable='$enable', need_dns=$need_dns, only_dns=$only_dns, advanced='$advanced' where name='$name';"); return true; } @@ -262,35 +260,26 @@ class m_dom { * @return boolean Retourne FALSE si une erreur s'est produite, TRUE sinon. */ function del_domain($dom) { - global $db,$err,$classes,$cuid; + global $db,$err,$classes,$cuid,$hooks; $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); + + if (!$r=$this->get_domain_all($dom)) { return false; } + + // Call Hooks to delete the domain and the MX management: + // TODO : the 2 calls below are using an OLD hook call, FIXME: remove them when unused + $hooks->invoke("alternc_del_domain",array($dom)); + $hooks->invoke("alternc_del_mx_domain",array($dom)); + // New hook calls: + $hooks->invoke("hook_dom_del_domain",array($r["id"])); + $hooks->invoke("hook_dom_del_mx_domain",array($r["id"])); + + // Now mark the domain for deletion: $db->query("UPDATE sub_domaines SET web_action='DELETE' WHERE domaine='$dom';"); $db->query("UPDATE domaines SET dns_action='DELETE' 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; } @@ -316,7 +305,7 @@ class m_dom { $ @return boolean Retourne FALSE si une erreur s'est produite, TRUE sinon. */ function add_domain($domain,$dns,$noerase=0,$force=0,$isslave=0,$slavedom="") { - global $db,$err,$quota,$classes,$L_MX,$L_FQDN,$tld,$cuid,$bro; + global $db,$err,$quota,$classes,$L_MX,$L_FQDN,$tld,$cuid,$bro,$hooks; $err->log("dom","add_domain",$domain); // Locked ? @@ -332,7 +321,7 @@ class m_dom { return false; } // Interdit les domaines clés (table forbidden_domains) sauf en cas FORCE - $db->query("select domain from forbidden_domains where domain='$domain'"); + $db->query("SELECT domain FROM forbidden_domains WHERE domain='$domain'"); if ($db->num_rows() && !$force) { $err->raise("dom",22); return false; @@ -386,7 +375,11 @@ class m_dom { return false; } if ($noerase) $noerase="1"; else $noerase="0"; - $db->query("insert into domaines (compte,domaine,gesdns,gesmx,noerase,dns_action) values ('$cuid','$domain','$dns','1','$noerase','UPDATE');"); + $db->query("INSERT INTO domaines (compte,domaine,gesdns,gesmx,noerase,dns_action) VALUES ('$cuid','$domain','$dns','1','$noerase','UPDATE');"); + if (!($id=$db->lastid())) { + $err->raise("dom",_("An unexpected error occured when creating the domain")); + return false; + } if ($isslave) { $isslave=true; @@ -426,29 +419,22 @@ class m_dom { $this->set_sub_domain($domain, 'mail', $this->type_webmail, ''); } - // 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); - } - } + // TODO: Old hooks, FIXME: when unused remove them + $hooks->invoke("alternc_add_domain",array($domain)); + $hooks->invoke("alternc_add_mx_domain",array($domain)); if ($isslave) { - foreach($classes as $c) { - if (method_exists($GLOBALS[$c],"alternc_add_slave_domain")) { - $GLOBALS[$c]->alternc_add_slave_domain($domain,$slavedom); - } - } + $hooks->invoke("alternc_add_slave_domain",array($domain)); + } + // New Hooks: + $hooks->invoke("hook_dom_add_domain",array($id)); + $hooks->invoke("hook_dom_add_mx_domain",array($id)); + if ($isslave) { + $hooks->invoke("hook_dom_add_slave_domain",array($id)); } return true; } + /* ----------------------------------------------------------------- */ /** * Retourne les entrées DNS du domaine $domain issues du WHOIS. @@ -604,12 +590,12 @@ class m_dom { } } // whois + /* ----------------------------------------------------------------- */ /** * vérifie la presence d'un champs mx valide sur un serveur DNS * - */ - + */ function checkmx($domaine,$mx) { //initialise variables $mxhosts = array(); @@ -685,11 +671,11 @@ class m_dom { return false; } $db->next_record(); + $r["id"]=$db->Record["id"]; $r["dns"]=$db->Record["gesdns"]; $r["dns_action"]=$db->Record["dns_action"]; $r["dns_result"]=$db->Record["dns_result"]; $r["mail"]=$db->Record["gesmx"]; -// $r["mx"]=$db->Record["mx"]; // le champs mx n'existe plus dans domaines $r['noerase']=$db->Record['noerase']; $db->free(); $db->query("select count(*) as cnt from sub_domaines where compte='$cuid' and domaine='$dom'"); @@ -698,7 +684,6 @@ class m_dom { $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"); // 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(); @@ -709,12 +694,6 @@ class m_dom { $r["sub"][$i]["type_desc"]=$db->Record["type_desc"]; $r["sub"][$i]["only_dns"]=$db->Record["only_dns"]; $r["sub"][$i]["web_action"]=$db->Record["web_action"]; -/* - if ($db->Record["type"]==3) { // Webmail - $this->webmail=1; - $r["sub"][$i]["dest"]=_("Webmail access"); - } -*/ } $db->free(); return $r; @@ -748,14 +727,6 @@ class m_dom { $err->raise("dom",3+$t); return false; } -/* - if ( ! empty($value)) { - $type = " and valeur=\"".mysql_real_escape_string($value)."\""; - } - if ( ! empty($type)) { - $type = " and type=\"".mysql_real_escape_string($type)."\""; - } -*/ $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 sub='$sub' and ( length('$type')=0 or type='$type') and (length('$value')=0 or '$value'=valeur) and upper(dt.name)=upper(sd.type);"); if ($db->num_rows()==0) { $err->raise("dom",14); @@ -778,7 +749,6 @@ class m_dom { global $db,$err,$cuid; // check the type we can have in domaines_type.target - switch ($this->domains_type_target_values($type)) { case 'NONE': if (empty($value) or is_null($value)) {return true;} @@ -846,7 +816,7 @@ class m_dom { return true; } - // /* ----------------------------------------------------------------- */ + /* ----------------------------------------------------------------- */ /** * Modifier les information du sous-domaine demandé. * @@ -952,6 +922,7 @@ class m_dom { return true; } // del_sub_domain + /* ----------------------------------------------------------------- */ /** * Modifie les information du domaine précisé. @@ -966,7 +937,7 @@ class m_dom { * */ function edit_domain($dom,$dns,$gesmx,$force=0) { - global $db,$err,$L_MX,$classes,$cuid; + global $db,$err,$L_MX,$classes,$cuid,$hooks; $err->log("dom","edit_domain",$dom."/".$dns."/".$gesmx); // Locked ? if (!$this->islocked && !$force) { @@ -1022,24 +993,18 @@ class m_dom { } } - // OK, des modifs ont été faites, on valide : - // DEPENDANCE : - if ($gesmx && !$r["mail"]) { // on a associé le MX : on cree donc l'entree dans MySQL - // 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"]) { + // TODO: old hooks, FIXME: remove when unused + $hooks->invoke("alternc_add_mx_domain",array($domain)); + // New Hooks: + $hooks->invoke("hook_dom_add_mx_domain",array($r["id"])); } 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); - } - } + // TODO: old hooks, FIXME: remove when unused + $hooks->invoke("alternc_del_mx_domain",array($domain)); + // New Hooks: + $hooks->invoke("hook_dom_del_mx_domain",array($r["id"])); } $db->query("UPDATE domaines SET gesdns='$dns', gesmx='$gesmx' WHERE domaine='$dom'"); diff --git a/bureau/class/m_mail.php b/bureau/class/m_mail.php index fddd3d3a..aeb99ebd 100644 --- a/bureau/class/m_mail.php +++ b/bureau/class/m_mail.php @@ -124,7 +124,7 @@ class m_mail { * @param $dom_id integer the domain id. * @param $search string search that string in recipients or address. * @param $offset integer skip THAT much emails in the result. - * @param $count integer return no more than THAT much emails. + * @param $count integer return no more than THAT much emails. -1 for ALL. Offset is ignored then. * @result an array of each mail hosted under the domain. */ function enum_domain_mails($dom_id = null, $search="", $offset=0, $count=30){ @@ -138,11 +138,10 @@ class m_mail { $db->query("SELECT count(a.id) AS total FROM address a LEFT JOIN recipient r ON r.address_id=a.id WHERE $where;"); $db->next_record(); $this->total=$db->f("total"); - + if ($count!=-1) $limit="LIMIT $offset,$count"; else $limit=""; $db->query("SELECT a.id, a.address, a.password, a.`enabled`, a.mail_action, d.domaine AS domain, m.quota, m.quota*1024*1024 AS quotabytes, m.bytes AS used, NOT ISNULL(m.id) AS islocal, a.type, r.recipients, m.lastlogin FROM (address a LEFT JOIN mailbox m ON m.address_id=a.id) LEFT JOIN recipient r ON r.address_id=a.id, domaines d - WHERE $where AND d.id=a.domain_id - LIMIT $offset,$count;"); + WHERE $where AND d.id=a.domain_id $limit;"); if (! $db->next_record()) { $err->raise("mail",_("No mail found for this query")); return false; @@ -152,7 +151,7 @@ class m_mail { $details=$db->Record; // if necessary, fill the typedata with data from hooks ... if ($details["type"]) { - $result=$hooks->invoke("mail_get_details",array($details["id"])); // Will fill typedata if necessary + $result=$hooks->invoke("hook_mail_get_details",array($details["id"])); // Will fill typedata if necessary $details["typedata"]=implode("
",$result); } $res[]=$details; @@ -192,7 +191,7 @@ class m_mail { } // Call other classes to check we can create it: - $cancreate=$hooks->invoke('hooks_mail_cancreate',array($dom_id,$domain,$mail)); + $cancreate=$hooks->invoke("hook_mail_cancreate",array($dom_id,$mail)); if (in_array(false,$cancreate,true)) { return false; } @@ -239,7 +238,7 @@ class m_mail { $details=$db->Record; // if necessary, fill the typedata with data from hooks ... if ($details["type"]) { - $result=$hooks->invoke("mail_get_details",array($mail_id)); // Will fill typedata if necessary + $result=$hooks->invoke("hook_mail_get_details",array($mail_id)); // Will fill typedata if necessary $details["typedata"]=implode("
",$result); } return $details; @@ -271,6 +270,22 @@ class m_mail { } + /* ----------------------------------------------------------------- */ + /** Hook called when the DOMAIN class will delete a domain. + * + * @param $dom integer the number of the email to delete + * @return true if the email has been properly deleted + * or false if an error occured ($err is filled accordingly) + */ + function hook_dom_del_mx_domain($dom_id) { + $list=$this->enum_domain_mails($dom_id,"",0,-1); + foreach($list as $one) { + $this->delete($one["id"]); + } + return true; + } + + /* ----------------------------------------------------------------- */ /** Function used to delete a mail from the db * should be used by the web interface, not by third-party programs. @@ -478,7 +493,8 @@ class m_mail { $red=""; foreach($r as $m) { $m=trim($m); - if ($m && filter_var($m,FILTER_VALIDATE_EMAIL)) { + if ($m && filter_var($m,FILTER_VALIDATE_EMAIL) // Recipient Email is valid + && $m!=($me["address"]."@".$me["domain"])) { // And not myself (no loop allowed easily ;) ) $red.=$m."\n"; } }