source: bureau/class/m_mail.php @ 67

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

[project @ alternc: changeset 2003-05-07 17:16:53 by root]
Ajout du strtolower à la création d'un email

Original author: root
Date: 2003-05-07 17:16:53

Line 
1<?php
2/*
3 $Id: m_mail.php,v 1.6 2003/05/07 17:16:53 root 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    $mail=strtolower($mail);
395    if ($mail) {
396      //vérifie la validité du login mail
397      if (!checkloginmail($mail)) {
398        $err->raise("mail",13);
399        return false;
400      }
401    }
402    //vérifie si les champs obligatoires sont renseignés
403    if (($pop=="1" && $pass=="")||($pop!="1" && $alias=="")){
404      $err->raise("mail",4);
405      return false;
406    }
407    if ($pop=="1"){
408      $account[]=$mail."_".$dom;
409    }
410    //vérifie la validité des alias :
411    if ($alias){
412      $a=explode("\n",$alias);
413      if (count($a)>0) {
414        reset($a);
415        for ($i=0;$i<count($a);$i++){
416          $a[$i]=trim($a[$i]);
417          if ($a[$i]){
418            if(checkmail($a[$i])!=0){
419              $err->raise("mail",14);
420              return false;
421            }
422            /* Remplissage des alias dans account[] */
423            $account[]=$a[$i];
424          }
425        }
426      }
427    }
428    //connexion ldap
429    if (!$this->_connectldap()) {
430      $err->raise("mail",1);
431      return false;
432    }
433    //verifie l'existence du domaine sur ldap-domains
434    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$dom.")(type=domain))",array("mail"));
435    $info = ldap_get_entries($this->ds, $sr);
436    if ($info["count"]==0) {
437      $err->raise("mail",6,$dom);
438      return false;
439    }
440    //vérifie l'inexistence du mail sur ldap-domains
441    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$mail."@".$dom.")(type=mail))",array("mail"));
442    $info = ldap_get_entries($this->ds, $sr);
443    if ($info["count"]>0) {
444      $err->raise("mail",7,$mail."@".$dom);
445      return false;
446    }
447    if ($pop!="1" && $pop!="0") $pop="0";
448    $res=array("mail" => $mail."@".$dom, "uid" => $this->uid, "type" => "mail", "objectclass" => "mail", "pop" => $pop);
449    $res["account"]=$account;
450    /* QuotaCheck */
451    if (!$quota->cancreate("mail")) {
452      $err->raise("mail",8);
453      return false;
454    }
455    $quota->inc("mail");
456    // Ajout du mail dans ldap-domains
457    if (!ldap_add($this->ds,"mail=".$mail."@".$dom.",dc=domains,".$this->ldap["basedn"],$res)) {
458      $err->raise("mail",5,ldap_error($this->ds));
459      return false;
460    }
461    // Ajout du compte pop dans ldap-users
462    if ($pop=="1") {
463      if (!$this->_createpop($mail,$dom,$pass))
464        return false;
465    }
466    return true;
467  }
468
469  /* ----------------------------------------------------------------- */
470  /** Efface le compte mail $mail
471   * @param string $mail Email à effacer
472   * @return boolean TRUE si le compte mail a bien été détruit, FALSE si une erreur s'est produite.
473   */
474  function del_mail($mail) {
475    global $quota,$err;
476    $err->log("mail","del_mail",$mail);
477    if (!$this->_connectldap()) {
478      $err->raise("mail",1);
479      return false;
480    }
481    /* TODO : verification des caracteres utilises dans $mail */
482    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$mail.")(type=mail))",array("mail","pop"));
483    $info = ldap_get_entries($this->ds, $sr);
484    if ($info["count"]==0) {
485      $err->raise("mail",3,$mail);
486      return false;
487    }
488    /* Ok, le mail existe, on le detruit donc... */
489    $t=explode("@",$mail);
490    $mdom=$t[0]; $dom=$t[1];
491    $quota->dec("mail");
492    $pop=$info[0]["pop"][0];
493    if (!ldap_delete($this->ds,"mail=".$mail.",dc=domains,".$this->ldap["basedn"])) {
494      $err->raise("mail",5,ldap_error($this->ds));
495      return false;
496    }
497    if ($pop=="1") {
498      if (!$this->_deletepop($mdom,$dom)) {
499        return false;
500      }
501    }
502    return true;
503  }
504
505  /* ----------------------------------------------------------------- */
506  /** Crée le compte pop $mail@$dom, avec pour mot de passe $pass
507   * @param string $mail Compte email à créer en pop
508   * @param string $dom Domaine sur lequel on crée le compte email
509   * @param string $pass Mot de passe du compte email.
510   * @return boolean TRUE si le compte pop a bien été créé, FALSE si une erreur est survenur
511   * @access private
512   */
513  function _createpop($mail,$dom,$pass) {
514    global $err;
515    $err->log("mail","_createpop",$mail."@".$dom);
516    $m=substr($mail,0,1);
517    $gecos=$mail;
518    if (!$mail) {
519      // Cas du CATCH-ALL
520      $gecos="Catch-All";
521      $m="_";
522    }
523    $res=array(
524               "uid" => $mail."_".$dom,
525               "gidnumber" => $this->uid,
526               "uidnumber" => 33,
527               "objectclass" => array("posixAccount","shadowAccount"),
528               "homeDirectory" => "/var/alternc/mail/".$m."/".$mail."_".$dom,
529               "gecos" => $gecos,
530               "status" => "y",
531               "userpassword" => "{CRYPT}".$this->_md5cr($pass)
532               );
533    @ldap_add($this->ds,"uid=".$mail."_".$dom.",dc=users,".$this->ldap["basedn"],$res);
534
535    $res=array(
536               "uid" => $mail."@".$dom,
537               "gidnumber" => $this->uid,
538               "uidnumber" => 33,
539               "objectclass" => array("posixAccount","shadowAccount"),
540               "homeDirectory" => "/var/alternc/mail/".$m."/".$mail."_".$dom,
541               "gecos" => $gecos,
542               "status" => "y",
543               "userpassword" => "{CRYPT}".$this->_md5cr($pass)
544               );
545    if (!ldap_add($this->ds,"uid=".$mail."@".$dom.",dc=users,".$this->ldap["basedn"],$res)) {
546      $err->raise("mail",5,ldap_error($this->ds));
547      return false;
548    } else {
549      $res=array(
550                 "mail" => $mail."_".$dom,
551                 "alias" => "/var/alternc/mail/".$m."/".$mail."_".$dom."/Maildir/",
552                 "objectclass" => "alias",
553                 );
554      // Cree le fichier pour squirrelmail :
555      $f=fopen("/var/lib/squirrelmail/data/".$mail."_".$dom.".pref","wb");
556      fputs($f,"email_address=$mail@$dom\nchosen_theme=default_theme.php\nlanguage=fr_FR\n");
557      fclose($f);
558      $f=fopen("/var/lib/squirrelmail/data/".$mail."@".$dom.".pref","wb");
559      fputs($f,"email_address=$mail@$dom\nchosen_theme=default_theme.php\nlanguage=fr_FR\n");
560      fclose($f);
561      if (!ldap_add($this->ds, "mail=".$mail."_".$dom.",dc=aliases,".$this->ldap["basedn"], $res)) {
562        $err->raise("mail",5,ldap_error($this->ds));
563        return false;
564      } else {
565        exec("/usr/lib/alternc/mail_add ".$mail."_".$dom." ".$this->uid);
566        exec("/bin/echo ".escapeshellarg($pass)." | /usr/sbin/saslpasswd -u postfix -c -p ".$mail."@".$dom);
567        exec("/bin/echo ".escapeshellarg($pass)." | /usr/sbin/saslpasswd -u postfix -c -p ".$mail."_".$dom);
568      }
569    }
570    return true;
571  }
572
573  /* ----------------------------------------------------------------- */
574  /** Met à jour un compte pop existant
575   * @param string $mail mail à modifier
576   * @param string $dom Domaine dont on modifie le compte pop
577   * @param string $pass Nouveau mot de passe.
578   * @return boolean TRUE si le compte pop a bien été modifié, FALSE si une erreur s'est produite.
579   * @access private
580   */
581  function _updatepop($mail,$dom,$pass) {
582    global $err;
583    $err->log("mail","_updatepop",$mail."@".$dom);
584    $m=substr($mail,0,1);
585    $gecos=$mail;
586    $res=array(
587               "uid" => $mail."_".$dom,
588               "gidnumber" => $this->uid,
589               "uidnumber" => 33,
590               "objectclass" => array("posixAccount","shadowAccount"),
591               "homeDirectory" => "/var/alternc/mail/".$m."/".$mail."_".$dom,
592               "gecos" => $mail,
593               "status" => "y",
594               "userpassword" => "{CRYPT}".$this->_md5cr($pass)
595               );
596    @ldap_modify($this->ds,"uid=".$mail."_".$dom.",dc=users,".$this->ldap["basedn"],$res);
597    $res=array(
598               "uid" => $mail."@".$dom,
599               "gidnumber" => $this->uid,
600               "uidnumber" => 33,
601               "objectclass" => array("posixAccount","shadowAccount"),
602               "homeDirectory" => "/var/alternc/mail/".$m."/".$mail."_".$dom,
603               "gecos" => $mail,
604               "status" => "y",
605               "userpassword" => "{CRYPT}".$this->_md5cr($pass)
606               );
607    if (!ldap_modify($this->ds,"uid=".$mail."@".$dom.",dc=users,".$this->ldap["basedn"],$res)) {
608      $err->raise("mail",5,ldap_error($this->ds));
609      return false;
610    }
611    exec("/bin/echo ".escapeshellarg($pass)." | /usr/sbin/saslpasswd -u postfix -p ".$mail."@".$dom);
612    exec("/bin/echo ".escapeshellarg($pass)." | /usr/sbin/saslpasswd -u postfix -p ".$mail."_".$dom);
613    return true;
614  }
615
616  /* ----------------------------------------------------------------- */
617  /** Détruit le compte pop $mail@$dom.
618   * @param string $mail Email dont on souhaite détruire le compte pop
619   * @param string $dom Domaine dont on souhaite détuire le compte pop.
620   * @return boolean TRUE si le compte pop a bien été détruit, FALSE si une erreur s'est produite.
621   * @access private
622   */
623  function _deletepop($mail,$dom) {
624    global $err;
625    $err->log("mail","_deletepop",$mail."@".$dom);
626    @ldap_delete($this->ds,"uid=".$mail."@".$dom.",dc=users,".$this->ldap["basedn"]);
627    if (!ldap_delete($this->ds,"uid=".$mail."_".$dom.",dc=users,".$this->ldap["basedn"])) {
628      $err->raise("mail",5,ldap_error($this->ds));
629      return false;
630    } else {
631      @unlink("/var/lib/squirrelmail/data/".$mail."_".$dom.".pref");
632      @unlink("/var/lib/squirrelmail/data/".$mail."_".$dom.".abook");
633      @unlink("/var/lib/squirrelmail/data/".$mail."@".$dom.".pref");
634      @unlink("/var/lib/squirrelmail/data/".$mail."@".$dom.".abook");
635      if (!ldap_delete($this->ds, "mail=".$mail."_".$dom.",dc=aliases,".$this->ldap["basedn"])) {
636        $err->raise("mail",5,ldap_error($this->ds));
637        return false;
638      } else {
639        exec("/usr/lib/alternc/mail_del ".$mail."_".$dom);
640      }
641    }
642    exec("/usr/sbin/saslpasswd -u postfix -d ".$mail."@".$dom);
643    exec("/usr/sbin/saslpasswd -u postfix -d ".$mail."_".$dom);
644    return true;
645  }
646
647  /* ----------------------------------------------------------------- */
648  /** Fonction appellée par domaines lorsqu'un domaine est effacé.
649   * Cette fonction efface tous les comptes mails du domaine concerné.
650   * @param string $dom Domaine à effacer
651   * @return boolean TRUE si le domaine a bien été effacé, FALSE si une erreur s'est produite.
652   * @access private
653   * TODO : Delete the wrappers !
654   */
655  function alternc_del_domain($dom) {
656    global $err,$quota;
657    $err->error=0;
658    $err->log("mail","del_dom",$dom);
659    if (!$this->_connectldap()) {
660      $err->raise("mail",1);
661      return false;
662    }
663    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$dom.")(type=domain))",array("mail"));
664    $info = ldap_get_entries($this->ds, $sr);
665    if ($info["count"]==0) {
666      $err->raise("mail",6,$dom);
667      return false;
668    }
669    /* Effacement de tous les mails de ce domaine : */
670    $a=$this->enum_doms_mails($dom);
671    if (is_array($a)) {
672      reset($a);
673      for($i=0;$i<$a["count"];$i++) {
674        $val=$a[$i];
675        if (!$this->del_mail($val["mail"])) {
676          $err->raise("mail",5,ldap_error($this->ds));
677        }
678      }
679      /* Mise à jour des quotas mails*/
680      $q=$quota->getquota("mail");
681      if (!is_array($q)) {
682        $err->raise("mail",10);
683        return false;
684      } else {
685        $u=$q["u"];
686        $new=$u-$a["count"];
687        if(!$quota->setquota("mail",$new,1)){
688          $err->raise("mail",10);
689          return false;
690        }
691      }
692    }
693    /* Effacement du domaine himself */
694    if (!ldap_delete($this->ds,"mail=$dom,dc=domains,".$this->ldap["basedn"])) {
695      $err->raise("mail",5,ldap_error($this->ds));
696    }
697    return true;
698    // TODO : EFFACER LES WRAPPERS !
699  }
700
701  /* ----------------------------------------------------------------- */
702  /** Fonction appellée par domaines lorsqu'un domaine est créé.
703   * Cette fonction crée les comptes par défaut du domaine concerné.
704   * @param string $dom Domaine à créer
705   * @return boolean TRUE si le domaine a bien été créé, FALSE si une erreur s'est produite.
706   * @access private
707   */
708  function alternc_add_domain($dom) {
709    global $err;
710    $err->log("mail","add_dom",$dom);
711    if (!$this->_connectldap()) {
712      $err->raise("mail",1);
713      return false;
714    }
715    $sr=ldap_search($this->ds,"dc=domains,".$this->ldap["basedn"],"(&(mail=".$dom.")(type=domain))",array("mail"));
716    $info = ldap_get_entries($this->ds, $sr);
717    if ($info["count"]>0) {
718      $err->raise("mail",9,$dom);
719      return false;
720    }
721    $res=array("mail" => $dom, "uid" => $this->uid, "type" => "domain", "objectclass" => "mail", "account"=> $dom);
722    if (!ldap_add($this->ds,"mail=$dom,dc=domains,".$this->ldap["basedn"],$res)) {
723      $err->raise("mail",5,ldap_error($this->ds));
724      return false;
725    }
726    return true;
727  }
728
729  /* TODO : alternc_quota_check */
730  function alternc_quota_check($id=-1) {
731    global $quota,$err;
732    if ($id==-1) $id=$this->uid;
733    return true;
734  }
735
736  function alternc_add_mx_domain($dom) {
737        $this->alternc_add_domain($dom);
738  }
739
740  function alternc_del_mx_domain($dom) {
741        $this->alternc_del_domain($dom);
742  }
743
744  /* ----------------------------------------------------------------- */
745  /** Connecte la classe au serveur LDAP si la connexion n'a pas été effectuée
746   * @return boolean TRUE si la connexion a eu lieu, FALSE si elle a échoué
747   * @access private.
748   */
749  function _connectldap() {
750    if ($this->ds==-1) {
751      if (!($this->ds=ldap_connect($this->ldap["server"]))) {
752        $this->ds=-1;
753        return false;
754      }
755      if (!(ldap_bind($this->ds,$this->ldap["binddn"],$this->ldap["bindpwd"]))) {
756        ldap_close($ds);
757        $this->ds=-1;
758        return false;
759      }
760      return true;
761    } else return true;
762  }
763
764  /* ----------------------------------------------------------------- */
765  /** Crypte un mot de passe en clair en MD5 avec un salt aléatoire
766   * @param string $pass Mot de passe à crypter (max 32 caractères)
767   * @return string Retourne le mot de passe crypté
768   * @access private
769   */
770  function _md5cr($pass) {
771    $salt="";     //generate a salt using characters [A-Z][a-z][0-9]./
772    $chars="./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
773    for ($i=0;$i<16;$i++) {
774      $salt.=substr($chars,(mt_rand(0,strlen($chars))),1);
775    }
776    return crypt($pass,"$1$".$salt);
777    /* " */
778  }
779
780} /* Class m_mail */
781
782?>
Note: See TracBrowser for help on using the repository browser.