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";
}
}