source: bureau/class/m_mail.php @ 63

Revision 63, 27.3 KB checked in by anarcat, 7 years ago (diff)

[project @ alternc: changeset 2003-05-01 13:56:09 by benjamin]
m_dom appelle maintenant add_mx_domain et del_mx_domain en event
m_mail réagit à ces fonctions en faisant le nécessaire.

Original author: benjamin
Date: 2003-05-01 13:56:09

Line 
1<?php
2/*
3 $Id: m_mail.php,v 1.5 2003/05/01 13:56:09 benjamin Exp $
4 ----------------------------------------------------------------------
5 LICENSE
6
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License (GPL)
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 To read the license please visit http://www.gnu.org/copyleft/gpl.html
18 ----------------------------------------------------------------------
19 Original Author of file: Benjamin Sonntag, Franck Missoum
20 Purpose of file: Manage Email accounts and aliases.
21 ----------------------------------------------------------------------
22*/
23/**
24* Classe de gestion des comptes mails de l'hébergé.
25*
26* Cette classe permet de gérer les comptes pop, alias
27* mail des domaines d'un membre hébergé.<br>
28* Copyleft {@link http://alternc.net/ AlternC Team}
29*
30* @copyright    AlternC-Team 2002-11-01 http://alternc.net/
31*
32*/
33class m_mail {
34
35  /** Membre dont on gère les mails */
36  var $uid=0;
37
38  var $alternc_quota_name="mail";
39
40  /** Connexion ldap
41   * @access private
42   */
43  var $ds=-1;
44
45  /** Liste des domaines
46   * @access private
47   */
48  var $domains;
49
50  /** Paramètres de connexion à LDAP */
51  var $ldap=array(
52                  "server"  => "",      "binddn"  => "",
53                  "bindpwd" => "",      "basedn"  => ""
54                  );
55
56  /* ----------------------------------------------------------------- */
57  /**
58   * Constructeur
59   */
60  function m_mail($membre=0) {
61    global $L_LDAP_HOST,$L_LDAP_ROOT,$L_LDAP_ROOTPWD,$L_LDAP_POSTFIX;
62    $this->uid=$membre;
63    $this->ldap=array(
64                      "server"  =>      $L_LDAP_HOST,
65                      "binddn"  =>      $L_LDAP_ROOT,
66                      "bindpwd" =>      $L_LDAP_ROOTPWD,
67                      "basedn"  =>      $L_LDAP_POSTFIX
68                      );
69  }
70
71  /* ----------------------------------------------------------------- */
72  /** Retourne la liste des domaines hébergés en mails sur le compte.
73   * @return array Tableau indexé des domaines hébergés en mail.
74   */
75  function enum_domains() {
76    global $db,$err;
77    $err->log("mail","enum_domains");
78    if (!is_array($this->domains)) {
79      $db->query("select * from domaines where compte=".$this->uid." AND gesmx=1;");
80      $this->domains=array();
81      if ($db->num_rows()>0) {
82        while ($db->next_record()) {
83          $this->domains[]=$db->f("domaine");
84        }
85      }
86    }
87    return $this->domains;
88  }
89
90  /* ----------------------------------------------------------------- */
91  /** Retourne la liste des mails du domaine $dom
92   * Retourne un tableau indexé de tableaux associatifs sous la forme :
93   * $a["mail"]=Adresse email
94   * $a["pop"]=1 ou 0 selon s'il s'agit d'un compte pop ou pas
95   * $a["size"]=taille en octets de la boite s'il s'agit d'un compte pop.
96   * @param string $dom Domaine dont on veut les mails
97   * @param integer $sort Champs de tri (0 pour non trié (default), 1 pour email, 2 pour type)
98   * @return array Tableau de mails comme indiqué ci-dessus ou FALSE si une erreur
99   *  s'est produite
100   */
101  function enum_doms_mails($dom,$sort=0) {
102    global $err;
103    $err->log("mail","enum_doms_mails",$dom);
104    if (!$this->_connectldap()) {
105      $err->raise("mail",1);
106      return false;
107    }
108    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(uid=".$this->uid.")(type=mail)(mail=*@".$dom."))",array("mail","pop"));
109    $info = ldap_get_entries($this->ds, $sr);
110    if ($info["count"]==0) {
111      $err->raise("mail",2,$dom);
112      return false;
113    }
114    $res=array();
115    for($i=0;$i<$info["count"];$i++) {
116      if ($info[$i]["pop"][0]) {
117        $size=exec("/usr/lib/alternc/du.pl /var/alternc/mail/".substr($info[$i]["mail"][0],0,1)."/".str_replace("@","_",$info[$i]["mail"][0]));
118        $size=$size*1024;
119      } else {
120        $size=0;
121      }
122      $res[$i]=array("mail" => $info[$i]["mail"][0],  "pop" => $info[$i]["pop"][0],"size"=>$size);
123    }
124    if ($sort==1) {
125        usort($res,array("m_mail","_cmp_mail"));
126    }
127    if ($sort==2) {
128        usort($res,array("m_mail","_cmp_type"));
129    }
130    $res["count"]=$info["count"];
131    return $res;
132  }
133
134 function _cmp_mail($a, $b)
135    {
136        $al = strtolower($a["mail"]);
137        $bl = strtolower($b["mail"]);
138        if ($al == $bl) return 0;
139        return ($al > $bl) ? +1 : -1;
140    }
141 function _cmp_type($a, $b)
142    {
143        $al = strtolower($a["pop"]);
144        $bl = strtolower($b["pop"]);
145        if ($al == $bl) {
146          $al = strtolower($a["mail"]);
147          $bl = strtolower($b["mail"]);
148          if ($al == $bl) return 0;
149        }
150        return ($al > $bl) ? +1 : -1;
151    }
152
153  /* ----------------------------------------------------------------- */
154  /** Retourne les détails d'un mail
155   * Le mail $mail est retourné sous la forme d'un tableaau associatif comme suit :
156   * $a["mail"]= Adresse email
157   * $a["login"]= Login pop
158   * $a["password"]= Mot de passe pop (crypté)
159   * $a["alias"]= Alias destination, 1 par ligne
160   * $a["pop"]= 1 ou 0 s'il s'agit d'un compte pop
161   * @param string $mail Mail dont on veut retourner le détail
162   * @return array Tableau associatif comme ci-dessus.
163   */
164  function get_mail_details($mail) {
165    global $err;
166    $err->log("mail","get_mail_details",$mail);
167    $t=explode("@",$mail);
168    $mdom=$t[0]; $dom=$t[1];
169    if (!$this->_connectldap()) {
170      $err->raise("mail",1);
171      return false;
172    }
173    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$mail.")(type=mail))");
174    $info = ldap_get_entries($this->ds, $sr);
175    if ($info["count"]==0) {
176      $err->raise("mail",3,$mail);
177      return false;
178    }
179    /* Ok, le mail existe, on le retourne donc... */
180    for ($i=0;$i<$info[0]["account"]["count"];$i++)
181      if ($info[0]["account"][$i]!=$mdom."_".$dom)
182        $account.=$info[0]["account"][$i]."\n";
183    /* Compte pop ? */
184    $pop=$info[0]["pop"][0];
185    if ($pop=="1") {
186      $sr=ldap_search($this->ds, "dc=users,".$this->ldap["basedn"], "(&(uid=".$mdom."_".$dom.")(objectclass=posixAccount))", array("uid","pass"));
187      $info = ldap_get_entries($this->ds, $sr);
188      if ($info["count"]>0) {
189        $login=$info[0]["uid"][0];
190        $pass=""; // No password available $info[0]["pass"][0];
191      }
192    }
193    $res=array("mail" => $mail, "login" => $login, "password" => $pass, "alias" => $account, "pop" => $pop);
194    return $res;
195  }
196
197  /*****************************************************************************/
198  /** Tell if a mail is available or not */
199  function available($mail) {
200    global $err;
201    $err->log("mail","available",$mail);
202    if (!$this->_connectldap()) {
203      $err->raise("mail",1);
204      return false;
205    }
206    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$mail.")(type=mail))");
207    $info = ldap_get_entries($this->ds, $sr);
208    return ($info["count"]==0);
209  }
210
211  /* ----------------------------------------------------------------- */
212  /** Crée un mail 'executeur' (wrapper) pour $login@$domain
213   * @param string $login partie gauche du @ pour le mail concerné
214   * @param string $domain partie droite du @ pour le mail concerné
215   * @param string $command Commande à exécuter, sans le | ni les "" (commande brute)
216   * @param string $type Type de wrapper à créer. Cette donnée sera stockée dans l'attribut ldap 'type'. NE PAS METTRE 'mail' ICI !!
217   * @return boolean TRUE si le wrapper a été créé, FALSE si une erreur s'est produite.
218   */
219  function add_wrapper($login,$domain,$command,$type) {
220    global $err;
221    if (!$this->_connectldap()) {
222      $err->raise("mail",1);
223      return false;
224    }
225    if (!$this->available($login."@".$domain)) {
226      $err->raise("mail",7,$login."@".$domain);
227      return false;
228    }
229    $res=array("mail" => $login."@".$domain, "uid" => $this->uid, "type" => $type, "objectclass" => "mail", "pop" => "0", "account"=>$login."_".$domain );
230    if (!ldap_add($this->ds,"mail=".$res["mail"].",dc=domains,".$this->ldap["basedn"],$res)) {
231      $err->raise("mail",5,ldap_error($this->ds));
232      return false;
233    }
234    $res=array("mail" => $login."_".$domain, "objectclass" => "alias", "alias"=>"\"| $command\"");
235    if (!ldap_add($this->ds,"mail=".$res["mail"].",dc=aliases,".$this->ldap["basedn"],$res)) {
236      $err->raise("mail",5,ldap_error($this->ds));
237      return false;
238    }
239    return true;
240  }
241
242  /* ----------------------------------------------------------------- */
243  /** Efface un mail 'executeur' (wrapper) pour $login@$domain
244   * @param string $login partie gauche du @ pour le mail concerné
245   * @param string $domain partie droite du @ pour le mail concerné
246   * @return boolean TRUE si le wrapper a été effacé, FALSE si une erreur s'est produite.
247   */
248  function del_wrapper($login,$domain) {
249    global $err;
250    if (!$this->_connectldap()) {
251      $err->raise("mail",1);
252      return false;
253    }
254    $ok=true;
255    if (!ldap_delete($this->ds,"mail=".$login."@".$domain.",dc=domains,".$this->ldap["basedn"])) {
256      $err->raise("mail",5,ldap_error($this->ds));
257      $ok=false;
258    }
259    if (!ldap_delete($this->ds,"mail=".$login."_".$domain.",dc=aliases,".$this->ldap["basedn"])) {
260      $err->raise("mail",5,ldap_error($this->ds));
261      $ok=false;
262    }
263    return $ok;
264  }
265
266
267  /* ----------------------------------------------------------------- */
268  /** Change le mot de passe du compte pop $mail
269   * @param string $mail Compte mail concerné
270   * @param string $pass Nouveau mot de passe
271   * @return boolean TRUE si le mot de passe a été changé, FALSE si une erreur s'est produite.
272   */
273  function change_password($mail,$pass) {
274    global $err;
275    $err->log("mail","change_password",$mail);
276    $t=explode("@",$mail);
277    $mail=$t[0];
278    $dom=$t[1];
279    //vérifie l'existence du mail à modifier
280    $sr=ldap_search($this->ds, "dc=domains,".$this->ldap["basedn"], "(&(mail=".$mail."@".$dom.")(type=mail))", array("mail","pop"));
281    $info = ldap_get_entries($this->ds, $sr);
282    if ($info["count"]==0) {
283      $err->raise("mail",3,$mail."@".$dom);
284      return false;
285    }
286    if ($info[0]["pop"][0]!=1) {
287      $err->raise("mail",15);
288      return false;
289    }
290    if (!$this->_updatepop($mail,$dom,$pass)) {
291      return false;
292    }
293    return true;
294  }
295
296  /* ----------------------------------------------------------------- */
297  /** Modifie les paramètres d'un compte email
298   * Tout peut être modifié dans l'email (sauf l'adresse elle-même)
299   * @param string $mail Adresse à modifier. Le domaine doit appartenir au membre
300   * @param integer $pop Doit-il etre un compte pop (1) ou juste un alias (0)
301   * @param string $pass Nouveau mot de passe pop, si pop=1
302   * @param string $alias Liste des destinataires auxiliaires, un par ligne.
303   * @return boolean TRUE si l'email a bien été modifié, FALSE si une erreur s'est produite.
304   */
305  function put_mail_details($mail,$pop,$pass,$alias) {
306    global $err;
307    $err->log("mail","put_mail_details",$mail);
308    $account=array();
309    $t=explode("@",$mail);
310    $mail=$t[0];
311    $dom=$t[1];
312    //vérifie si les champs obligatoires sont renseignés
313    if ($pop!="1" && $alias=="") {
314      $err->raise("mail",4);
315      return false;
316    }
317    if ($pop=="1"){
318      $account[]=$mail."_".$dom;
319    }
320    //vérifie la validité des alias :
321    if ($alias){
322      $a=explode("\n",$alias);
323      if (count($a)>0) {
324        reset($a);
325        for ($i=0;$i<count($a);$i++){
326          $a[$i]=trim($a[$i]);
327          if ($a[$i]){
328            if(checkmail($a[$i])!=0){
329              $err->raise("mail",14);
330              return false;
331            }
332            /* Remplissage des alias dans account[] */
333            $account[]=$a[$i];
334          }
335        }
336      }
337    }
338    if (!$this->_connectldap()) {
339      $err->raise("mail",1);
340      return false;
341    }
342    //vérifie l'existence du mail à modifier
343    $sr=ldap_search($this->ds, "dc=domains,".$this->ldap["basedn"], "(&(mail=".$mail."@".$dom.")(type=mail))", array("mail","pop"));
344    $info = ldap_get_entries($this->ds, $sr);
345    if ($info["count"]==0) {
346      $err->raise("mail",3,$mail);
347      return false;
348    }
349    // When we CREATE a pop account, we MUST give a password
350    if ($pop=="1" && $info[0]["pop"][0]!=1) {
351      if (!$pass) {
352        $err->raise("mail",4);
353        return false;
354      }
355    }
356    if ($pop) $pop="1"; else $pop="0";
357    $res=array("mail" => $mail."@".$dom, "uid" => $this->uid, "type" => "mail", "objectclass" => "mail", "pop"=> $pop);
358    $res["account"]=$account;
359    //modification du mail dans ldap-domains
360    if (!ldap_modify($this->ds,"mail=".$mail."@".$dom.",dc=domains,".$this->ldap["basedn"],$res)) {
361      $err->raise("mail",5,ldap_error($this->ds));
362      return false;
363    }
364    if ($pop=="1" && $info[0]["pop"][0]!=1) { /* Creation du compte pop */
365      if (!$this->_createpop($mail,$dom,$pass)) {
366        return false;
367      }
368    }
369    if ($pop!="1" && $info[0]["pop"][0]==1) { /* Destruction du compte pop */
370      if (!$this->_deletepop($mail,$dom)) {
371        return false;
372      }
373    }
374    if ($pop=="1" && $info[0]["pop"][0]==1 && $pass!="") { /* Modification du compte pop */
375      if (!$this->_updatepop($mail,$dom,$pass)) {
376        return false;
377      }
378    }
379    return true;
380  }
381
382  /* ----------------------------------------------------------------- */
383  /** Crée un compte email $mail sur le domaine $dom
384   * @param string $dom Domaine concerné, il doit appartenir au membre
385   * @param string $mail Email à créer, il ne doit pas exister ni en mail, ni en liste.
386   * @param integer $pop vaut 1 pour créer un compte pop, 0 pour un alias
387   * @param string $alias Liste des alias, un par ligne
388   * @return boolean TRUE si le compte a bien été créé, FALSE si une erreur s'est produite.
389   */
390  function add_mail($dom,$mail,$pop,$pass,$alias) {
391    global $quota,$err;
392    $err->log("mail","add_mail",$dom."/".$mail);
393    $account=array();
394    if ($mail) {
395      //vérifie la validité du login mail
396      if (!checkloginmail($mail)) {
397        $err->raise("mail",13);
398        return false;
399      }
400    }
401    //vérifie si les champs obligatoires sont renseignés
402    if (($pop=="1" && $pass=="")||($pop!="1" && $alias=="")){
403      $err->raise("mail",4);
404      return false;
405    }
406    if ($pop=="1"){
407      $account[]=$mail."_".$dom;
408    }
409    //vérifie la validité des alias :
410    if ($alias){
411      $a=explode("\n",$alias);
412      if (count($a)>0) {
413        reset($a);
414        for ($i=0;$i<count($a);$i++){
415          $a[$i]=trim($a[$i]);
416          if ($a[$i]){
417            if(checkmail($a[$i])!=0){
418              $err->raise("mail",14);
419              return false;
420            }
421            /* Remplissage des alias dans account[] */
422            $account[]=$a[$i];
423          }
424        }
425      }
426    }
427    //connexion ldap
428    if (!$this->_connectldap()) {
429      $err->raise("mail",1);
430      return false;
431    }
432    //verifie l'existence du domaine sur ldap-domains
433    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$dom.")(type=domain))",array("mail"));
434    $info = ldap_get_entries($this->ds, $sr);
435    if ($info["count"]==0) {
436      $err->raise("mail",6,$dom);
437      return false;
438    }
439    //vérifie l'inexistence du mail sur ldap-domains
440    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$mail."@".$dom.")(type=mail))",array("mail"));
441    $info = ldap_get_entries($this->ds, $sr);
442    if ($info["count"]>0) {
443      $err->raise("mail",7,$mail."@".$dom);
444      return false;
445    }
446    if ($pop!="1" && $pop!="0") $pop="0";
447    $res=array("mail" => $mail."@".$dom, "uid" => $this->uid, "type" => "mail", "objectclass" => "mail", "pop" => $pop);
448    $res["account"]=$account;
449    /* QuotaCheck */
450    if (!$quota->cancreate("mail")) {
451      $err->raise("mail",8);
452      return false;
453    }
454    $quota->inc("mail");
455    // Ajout du mail dans ldap-domains
456    if (!ldap_add($this->ds,"mail=".$mail."@".$dom.",dc=domains,".$this->ldap["basedn"],$res)) {
457      $err->raise("mail",5,ldap_error($this->ds));
458      return false;
459    }
460    // Ajout du compte pop dans ldap-users
461    if ($pop=="1") {
462      if (!$this->_createpop($mail,$dom,$pass))
463        return false;
464    }
465    return true;
466  }
467
468  /* ----------------------------------------------------------------- */
469  /** Efface le compte mail $mail
470   * @param string $mail Email à effacer
471   * @return boolean TRUE si le compte mail a bien été détruit, FALSE si une erreur s'est produite.
472   */
473  function del_mail($mail) {
474    global $quota,$err;
475    $err->log("mail","del_mail",$mail);
476    if (!$this->_connectldap()) {
477      $err->raise("mail",1);
478      return false;
479    }
480    /* TODO : verification des caracteres utilises dans $mail */
481    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$mail.")(type=mail))",array("mail","pop"));
482    $info = ldap_get_entries($this->ds, $sr);
483    if ($info["count"]==0) {
484      $err->raise("mail",3,$mail);
485      return false;
486    }
487    /* Ok, le mail existe, on le detruit donc... */
488    $t=explode("@",$mail);
489    $mdom=$t[0]; $dom=$t[1];
490    $quota->dec("mail");
491    $pop=$info[0]["pop"][0];
492    if (!ldap_delete($this->ds,"mail=".$mail.",dc=domains,".$this->ldap["basedn"])) {
493      $err->raise("mail",5,ldap_error($this->ds));
494      return false;
495    }
496    if ($pop=="1") {
497      if (!$this->_deletepop($mdom,$dom)) {
498        return false;
499      }
500    }
501    return true;
502  }
503
504  /* ----------------------------------------------------------------- */
505  /** Crée le compte pop $mail@$dom, avec pour mot de passe $pass
506   * @param string $mail Compte email à créer en pop
507   * @param string $dom Domaine sur lequel on crée le compte email
508   * @param string $pass Mot de passe du compte email.
509   * @return boolean TRUE si le compte pop a bien été créé, FALSE si une erreur est survenur
510   * @access private
511   */
512  function _createpop($mail,$dom,$pass) {
513    global $err;
514    $err->log("mail","_createpop",$mail."@".$dom);
515    $m=substr($mail,0,1);
516    $gecos=$mail;
517    if (!$mail) {
518      // Cas du CATCH-ALL
519      $gecos="Catch-All";
520      $m="_";
521    }
522    $res=array(
523               "uid" => $mail."_".$dom,
524               "gidnumber" => $this->uid,
525               "uidnumber" => 33,
526               "objectclass" => array("posixAccount","shadowAccount"),
527               "homeDirectory" => "/var/alternc/mail/".$m."/".$mail."_".$dom,
528               "gecos" => $gecos,
529               "status" => "y",
530               "userpassword" => "{CRYPT}".$this->_md5cr($pass)
531               );
532    @ldap_add($this->ds,"uid=".$mail."_".$dom.",dc=users,".$this->ldap["basedn"],$res);
533
534    $res=array(
535               "uid" => $mail."@".$dom,
536               "gidnumber" => $this->uid,
537               "uidnumber" => 33,
538               "objectclass" => array("posixAccount","shadowAccount"),
539               "homeDirectory" => "/var/alternc/mail/".$m."/".$mail."_".$dom,
540               "gecos" => $gecos,
541               "status" => "y",
542               "userpassword" => "{CRYPT}".$this->_md5cr($pass)
543               );
544    if (!ldap_add($this->ds,"uid=".$mail."@".$dom.",dc=users,".$this->ldap["basedn"],$res)) {
545      $err->raise("mail",5,ldap_error($this->ds));
546      return false;
547    } else {
548      $res=array(
549                 "mail" => $mail."_".$dom,
550                 "alias" => "/var/alternc/mail/".$m."/".$mail."_".$dom."/Maildir/",
551                 "objectclass" => "alias",
552                 );
553      // Cree le fichier pour squirrelmail :
554      $f=fopen("/var/lib/squirrelmail/data/".$mail."_".$dom.".pref","wb");
555      fputs($f,"email_address=$mail@$dom\nchosen_theme=default_theme.php\nlanguage=fr_FR\n");
556      fclose($f);
557      $f=fopen("/var/lib/squirrelmail/data/".$mail."@".$dom.".pref","wb");
558      fputs($f,"email_address=$mail@$dom\nchosen_theme=default_theme.php\nlanguage=fr_FR\n");
559      fclose($f);
560      if (!ldap_add($this->ds, "mail=".$mail."_".$dom.",dc=aliases,".$this->ldap["basedn"], $res)) {
561        $err->raise("mail",5,ldap_error($this->ds));
562        return false;
563      } else {
564        exec("/usr/lib/alternc/mail_add ".$mail."_".$dom." ".$this->uid);
565        exec("/bin/echo ".escapeshellarg($pass)." | /usr/sbin/saslpasswd -u postfix -c -p ".$mail."@".$dom);
566        exec("/bin/echo ".escapeshellarg($pass)." | /usr/sbin/saslpasswd -u postfix -c -p ".$mail."_".$dom);
567      }
568    }
569    return true;
570  }
571
572  /* ----------------------------------------------------------------- */
573  /** Met à jour un compte pop existant
574   * @param string $mail mail à modifier
575   * @param string $dom Domaine dont on modifie le compte pop
576   * @param string $pass Nouveau mot de passe.
577   * @return boolean TRUE si le compte pop a bien été modifié, FALSE si une erreur s'est produite.
578   * @access private
579   */
580  function _updatepop($mail,$dom,$pass) {
581    global $err;
582    $err->log("mail","_updatepop",$mail."@".$dom);
583    $m=substr($mail,0,1);
584    $gecos=$mail;
585    $res=array(
586               "uid" => $mail."_".$dom,
587               "gidnumber" => $this->uid,
588               "uidnumber" => 33,
589               "objectclass" => array("posixAccount","shadowAccount"),
590               "homeDirectory" => "/var/alternc/mail/".$m."/".$mail."_".$dom,
591               "gecos" => $mail,
592               "status" => "y",
593               "userpassword" => "{CRYPT}".$this->_md5cr($pass)
594               );
595    @ldap_modify($this->ds,"uid=".$mail."_".$dom.",dc=users,".$this->ldap["basedn"],$res);
596    $res=array(
597               "uid" => $mail."@".$dom,
598               "gidnumber" => $this->uid,
599               "uidnumber" => 33,
600               "objectclass" => array("posixAccount","shadowAccount"),
601               "homeDirectory" => "/var/alternc/mail/".$m."/".$mail."_".$dom,
602               "gecos" => $mail,
603               "status" => "y",
604               "userpassword" => "{CRYPT}".$this->_md5cr($pass)
605               );
606    if (!ldap_modify($this->ds,"uid=".$mail."@".$dom.",dc=users,".$this->ldap["basedn"],$res)) {
607      $err->raise("mail",5,ldap_error($this->ds));
608      return false;
609    }
610    exec("/bin/echo ".escapeshellarg($pass)." | /usr/sbin/saslpasswd -u postfix -p ".$mail."@".$dom);
611    exec("/bin/echo ".escapeshellarg($pass)." | /usr/sbin/saslpasswd -u postfix -p ".$mail."_".$dom);
612    return true;
613  }
614
615  /* ----------------------------------------------------------------- */
616  /** Détruit le compte pop $mail@$dom.
617   * @param string $mail Email dont on souhaite détruire le compte pop
618   * @param string $dom Domaine dont on souhaite détuire le compte pop.
619   * @return boolean TRUE si le compte pop a bien été détruit, FALSE si une erreur s'est produite.
620   * @access private
621   */
622  function _deletepop($mail,$dom) {
623    global $err;
624    $err->log("mail","_deletepop",$mail."@".$dom);
625    @ldap_delete($this->ds,"uid=".$mail."@".$dom.",dc=users,".$this->ldap["basedn"]);
626    if (!ldap_delete($this->ds,"uid=".$mail."_".$dom.",dc=users,".$this->ldap["basedn"])) {
627      $err->raise("mail",5,ldap_error($this->ds));
628      return false;
629    } else {
630      @unlink("/var/lib/squirrelmail/data/".$mail."_".$dom.".pref");
631      @unlink("/var/lib/squirrelmail/data/".$mail."_".$dom.".abook");
632      @unlink("/var/lib/squirrelmail/data/".$mail."@".$dom.".pref");
633      @unlink("/var/lib/squirrelmail/data/".$mail."@".$dom.".abook");
634      if (!ldap_delete($this->ds, "mail=".$mail."_".$dom.",dc=aliases,".$this->ldap["basedn"])) {
635        $err->raise("mail",5,ldap_error($this->ds));
636        return false;
637      } else {
638        exec("/usr/lib/alternc/mail_del ".$mail."_".$dom);
639      }
640    }
641    exec("/usr/sbin/saslpasswd -u postfix -d ".$mail."@".$dom);
642    exec("/usr/sbin/saslpasswd -u postfix -d ".$mail."_".$dom);
643    return true;
644  }
645
646  /* ----------------------------------------------------------------- */
647  /** Fonction appellée par domaines lorsqu'un domaine est effacé.
648   * Cette fonction efface tous les comptes mails du domaine concerné.
649   * @param string $dom Domaine à effacer
650   * @return boolean TRUE si le domaine a bien été effacé, FALSE si une erreur s'est produite.
651   * @access private
652   * TODO : Delete the wrappers !
653   */
654  function alternc_del_domain($dom) {
655    global $err,$quota;
656    $err->error=0;
657    $err->log("mail","del_dom",$dom);
658    if (!$this->_connectldap()) {
659      $err->raise("mail",1);
660      return false;
661    }
662    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$dom.")(type=domain))",array("mail"));
663    $info = ldap_get_entries($this->ds, $sr);
664    if ($info["count"]==0) {
665      $err->raise("mail",6,$dom);
666      return false;
667    }
668    /* Effacement de tous les mails de ce domaine : */
669    $a=$this->enum_doms_mails($dom);
670    if (is_array($a)) {
671      reset($a);
672      for($i=0;$i<$a["count"];$i++) {
673        $val=$a[$i];
674        if (!$this->del_mail($val["mail"])) {
675          $err->raise("mail",5,ldap_error($this->ds));
676        }
677      }
678      /* Mise à jour des quotas mails*/
679      $q=$quota->getquota("mail");
680      if (!is_array($q)) {
681        $err->raise("mail",10);
682        return false;
683      } else {
684        $u=$q["u"];
685        $new=$u-$a["count"];
686        if(!$quota->setquota("mail",$new,1)){
687          $err->raise("mail",10);
688          return false;
689        }
690      }
691    }
692    /* Effacement du domaine himself */
693    if (!ldap_delete($this->ds,"mail=$dom,dc=domains,".$this->ldap["basedn"])) {
694      $err->raise("mail",5,ldap_error($this->ds));
695    }
696    return true;
697    // TODO : EFFACER LES WRAPPERS !
698  }
699
700  /* ----------------------------------------------------------------- */
701  /** Fonction appellée par domaines lorsqu'un domaine est créé.
702   * Cette fonction crée les comptes par défaut du domaine concerné.
703   * @param string $dom Domaine à créer
704   * @return boolean TRUE si le domaine a bien été créé, FALSE si une erreur s'est produite.
705   * @access private
706   */
707  function alternc_add_domain($dom) {
708    global $err;
709    $err->log("mail","add_dom",$dom);
710    if (!$this->_connectldap()) {
711      $err->raise("mail",1);
712      return false;
713    }
714    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$dom.")(type=domain))",array("mail"));
715    $info = ldap_get_entries($this->ds, $sr);
716    if ($info["count"]>0) {
717      $err->raise("mail",9,$dom);
718      return false;
719    }
720    $res=array("mail" => $dom, "uid" => $this->uid, "type" => "domain", "objectclass" => "mail", "account"=> $dom);
721    if (!ldap_add($this->ds,"mail=$dom,dc=domains,".$this->ldap["basedn"],$res)) {
722      $err->raise("mail",5,ldap_error($this->ds));
723      return false;
724    }
725    return true;
726  }
727
728  /* TODO : alternc_quota_check */
729  function alternc_quota_check($id=-1) {
730    global $quota,$err;
731    if ($id==-1) $id=$this->uid;
732    return true;
733  }
734
735  function alternc_add_mx_domain($dom) {
736        $this->alternc_add_domain($dom);
737  }
738
739  function alternc_del_mx_domain($dom) {
740        $this->alternc_del_domain($dom);
741  }
742
743  /* ----------------------------------------------------------------- */
744  /** Connecte la classe au serveur LDAP si la connexion n'a pas été effectuée
745   * @return boolean TRUE si la connexion a eu lieu, FALSE si elle a échoué
746   * @access private.
747   */
748  function _connectldap() {
749    if ($this->ds==-1) {
750      if (!($this->ds=ldap_connect($this->ldap["server"]))) {
751        $this->ds=-1;
752        return false;
753      }
754      if (!(ldap_bind($this->ds,$this->ldap["binddn"],$this->ldap["bindpwd"]))) {
755        ldap_close($ds);
756        $this->ds=-1;
757        return false;
758      }
759      return true;
760    } else return true;
761  }
762
763  /* ----------------------------------------------------------------- */
764  /** Crypte un mot de passe en clair en MD5 avec un salt aléatoire
765   * @param string $pass Mot de passe à crypter (max 32 caractères)
766   * @return string Retourne le mot de passe crypté
767   * @access private
768   */
769  function _md5cr($pass) {
770    $salt="";     //generate a salt using characters [A-Z][a-z][0-9]./
771    $chars="./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
772    for ($i=0;$i<16;$i++) {
773      $salt.=substr($chars,(mt_rand(0,strlen($chars))),1);
774    }
775    return crypt($pass,"$1$".$salt);
776    /* " */
777  }
778
779} /* Class m_mail */
780
781?>
Note: See TracBrowser for help on using the repository browser.