source: alternc-mailman/trunk/bureau/class/m_mailman.php @ 1964

Revision 1964, 9.7 KB checked in by anarcat, 6 years ago (diff)

i forgot to remove a safety for the patch: we just store user-domain as a name in any case, it still works for non-patched installs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1<?php
2/*
3 $Id$
4 ----------------------------------------------------------------------
5 AlternC - Web Hosting System
6 Copyright (C) 2002 by the AlternC Development Team.
7 http://alternc.org/
8 ----------------------------------------------------------------------
9 Based on:
10 Valentin Lacambre's web hosting softwares: http://altern.org/
11 ----------------------------------------------------------------------
12 LICENSE
13
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License (GPL)
16 as published by the Free Software Foundation; either version 2
17 of the License, or (at your option) any later version.
18
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22 GNU General Public License for more details.
23
24 To read the license please visit http://www.gnu.org/copyleft/gpl.html
25 ----------------------------------------------------------------------
26 Original Author of file: Benjamin Sonntag
27 Purpose of file: Manage mailing-lists with Mailman
28 ----------------------------------------------------------------------
29*/
30
31class m_mailman {
32
33  /* ----------------------------------------------------------------- */
34  function m_mailman() {
35  }
36
37  /* ----------------------------------------------------------------- */
38  /**
39   * Quota name
40   */
41  function alternc_quota_names() {
42    return "mailman";
43  }
44
45  /*****************************************************************************/
46  /** Return the mailing-lists managed by this member : */
47  function enum_ml($domain = null, $order_by = array('domain', 'list')) {
48    global $err,$db,$cuid;
49    $err->log("mailman","enum_ml");
50    $order_by = array_map("addslashes", $order_by);
51    $order = 'ORDER BY `' . join('`,`', $order_by) . '`';
52$query = "SELECT * FROM mailman WHERE uid=$cuid".
53        (is_null($domain) ? "" : " AND domain='" . addslashes($domain) ."'" ) .
54              " $order;";
55    $db->query($query);
56    if (!$db->num_rows()) {
57      $err->raise("mailman",1);
58      return array();
59    }
60    $mls=array();
61    while ($db->next_record()) {
62      $mls[]=$db->Record;
63    }
64    return $mls;
65  }
66
67  /*****************************************************************************/
68  function prefix_list() {
69    global $db,$err,$cuid;
70    $r=array();
71    $db->query("SELECT domaine FROM domaines WHERE compte='$cuid' AND gesmx = 1 ORDER BY domaine;");
72    while ($db->next_record()) {
73      $r[]=$db->f("domaine");
74    }
75    return $r;
76  }
77  /*****************************************************************************/
78  function select_prefix_list($current) {
79    global $db,$err;
80    $r=$this->prefix_list();
81    reset($r);
82    while (list($key,$val)=each($r)) {
83      if ($current==$val) $c=" selected=\"selected\""; else $c="";
84      echo "<option$c>$val</option>";
85    }
86    return true;
87  }
88
89  /*****************************************************************************/
90        /** Get list informations */
91        function get_lst($id)
92        {
93                global $db, $err, $cuid;
94                $err->log("mailman","get_list", $cuid);
95
96                $q = "SELECT * FROM mailman WHERE uid = '" . $cuid . "' && id = '" . $id . "'";
97                $db->query($q);
98                $db->next_record();
99                if (!$db->f("id"))
100                {
101                        $err->raise("mailman",9);
102                        return false;
103                }
104                $login = $db->f("list");
105                $domain = $db->f("domain");
106                return $login . "@" . $domain;
107        }
108
109  /*****************************************************************************/
110  /** Create a new list for this member : */
111  function add_lst($domain,$login,$owner,$password) {
112    global $db,$err,$quota,$mail,$cuid;
113    $err->log("mailman","add_lst",$login."@".$domain." - ".$owner);
114    /* the list' internal name */
115    $name = $login . '-' . $domain;
116
117    if ($login=="") {
118      $err->raise("mailman",2);
119      return false;
120    }
121    if (!$owner || !$password) {
122      $err->raise("mailman",3);
123      return false;
124    }
125    if (checkmail($owner)) {
126      $err->raise("mailman",4);
127      return false;
128    }
129    $r=$this->prefix_list();
130    if (!in_array($domain,$r) || $domain=="") {
131      $err->raise("mailman",5);
132      return false;
133    }
134    $db->query("SELECT COUNT(*) AS cnt FROM mailman WHERE name='$name';");
135    $db->next_record();
136    if ($db->f("cnt")) {
137        $err->raise("mailman",10);
138        return false;
139    }
140    // Prefixe OK, on verifie la non-existence des mails que l'on va créer...
141    if (!$mail->available($login."@".$domain) ||
142        !$mail->available($login."-request@".$domain) ||
143        !$mail->available($login."-owner@".$domain) ||
144        !$mail->available($login."-admin@".$domain) ||
145        !$mail->available($login."-bounces@".$domain) ||
146        !$mail->available($login."-confirm@".$domain) ||
147        !$mail->available($login."-join@".$domain) ||
148        !$mail->available($login."-leave@".$domain) ||
149        !$mail->available($login."-subscribe@".$domain) ||
150        !$mail->available($login."-unsubscribe@".$domain)) {
151      // This is a mail account already !!!
152      $err->raise("mailman",6);
153      return false;
154    }
155    // Le compte n'existe pas, on vérifie le quota et on le créé.
156    if ($quota->cancreate("mailman")) {
157      // Creation de la liste : 1. recherche du nom de la liste
158      // CA NE MARCHE PAS !
159      $db->query("INSERT INTO mailman (uid,list,domain,name) VALUES ('$cuid','$login','$domain','$name');");
160      if (!$mail->add_wrapper($login,$domain,"/var/lib/mailman/mail/mailman post $name","mailman") ||
161          !$mail->add_wrapper($login."-request",$domain,"/var/lib/mailman/mail/mailman request $name","mailman") ||
162          !$mail->add_wrapper($login."-owner",$domain,"/var/lib/mailman/mail/mailman owner $name","mailman") ||
163          !$mail->add_wrapper($login."-admin",$domain,"/var/lib/mailman/mail/mailman admin $name","mailman") ||
164          !$mail->add_wrapper($login."-bounces",$domain,"/var/lib/mailman/mail/mailman bounces $name","mailman") ||
165          !$mail->add_wrapper($login."-confirm",$domain,"/var/lib/mailman/mail/mailman confirm $name","mailman") ||
166          !$mail->add_wrapper($login."-join",$domain,"/var/lib/mailman/mail/mailman join $name","mailman") ||
167          !$mail->add_wrapper($login."-leave",$domain,"/var/lib/mailman/mail/mailman leave $name","mailman") ||
168          !$mail->add_wrapper($login."-subscribe",$domain,"/var/lib/mailman/mail/mailman subscribe $name","mailman") ||
169          !$mail->add_wrapper($login."-unsubscribe",$domain,"/var/lib/mailman/mail/mailman unsubscribe $name","mailman")
170          ) {
171        $mail->del_wrapper($login,$domain);             $mail->del_wrapper($login."-request",$domain);
172        $mail->del_wrapper($login."-owner",$domain);    $mail->del_wrapper($login."-admin",$domain);
173        $mail->del_wrapper($login."-bounces",$domain);  $mail->del_wrapper($login."-confirm",$domain);
174        $mail->del_wrapper($login."-join",$domain);     $mail->del_wrapper($login."-leave",$domain);
175        $mail->del_wrapper($login."-subscribe",$domain);        $mail->del_wrapper($login."-unsubscribe",$domain);
176        $db->query("DELETE FROM mailman WHERE name='$name';");
177        return false;
178      }
179      // Wrapper created, sql ok, now let's create the list :)
180      exec("/usr/lib/alternc/mailman.create \"".escapeshellcmd($login."@".$domain)."\" \"".escapeshellcmd($owner)."\" \"".escapeshellcmd($password)."\"");
181      return true;
182    } else {
183      $err->raise("mailman",7); // quota
184      return false;
185    }
186  }
187
188  /*****************************************************************************/
189  function delete_lst($id) {
190    global $db,$err,$mail,$cuid;
191    $err->log("mailman","delete_lst",$id);
192
193    $db->query("SELECT * FROM mailman WHERE id=$id and uid='$cuid';");
194    $db->next_record();
195    if (!$db->f("id")) {
196      $err->raise("mailman",9);
197      return false;
198    }
199    exec("/usr/lib/alternc/mailman.delete ".escapeshellarg($db->f("name")));
200    $login=$db->f("list");
201    $domain=$db->f("domain");
202    $db->query("DELETE FROM mailman WHERE id=$id");
203    $mail->del_wrapper($login,$domain);         $mail->del_wrapper($login."-request",$domain);
204    $mail->del_wrapper($login."-owner",$domain);        $mail->del_wrapper($login."-admin",$domain);
205    $mail->del_wrapper($login."-bounces",$domain);      $mail->del_wrapper($login."-confirm",$domain);
206    $mail->del_wrapper($login."-join",$domain); $mail->del_wrapper($login."-leave",$domain);
207    $mail->del_wrapper($login."-subscribe",$domain);    $mail->del_wrapper($login."-unsubscribe",$domain);
208    return $login."@".$domain;
209  }
210
211  /* ----------------------------------------------------------------- */
212  /** Returns the list's members as a text file, one subscriber per
213   *   line.
214   */
215 function members($id) {
216    global $err,$db,$cuid;
217    $err->log("mailman","members");
218    $db->query("SELECT * FROM mailman WHERE uid='$cuid' AND id='$id';");
219    if (!$db->num_rows()) {
220      $err->raise("mailman",1);
221      return false;
222    }
223    $db->next_record();
224    passthru("/usr/lib/alternc/mailman.list ".$db->Record["list"]);
225  }
226
227
228  /* ----------------------------------------------------------------- */
229  /** Fonction appellée par domaines lorsqu'un domaine est effacé.
230   * Cette fonction efface tous les comptes mails du domaine concerné.
231   * @param string $dom Domaine à effacer
232   * @return boolean TRUE si le domaine a bien été effacé, FALSE si une erreur s'est produite.
233   * @access private
234   */
235  function alternc_del_mx_domain($dom) {
236    global $err;
237    $err->log("mailman","del_dom",$dom);
238
239    // Suppression des listes du domaine
240    $listes=$this->enum_ml($dom);
241    while (list($key,$val)=each($listes)) {
242      $this->delete_lst($val["id"]);
243    }
244    return true;
245  }
246
247  /* ----------------------------------------------------------------- */
248  function alternc_get_quota($name) {
249    global $err,$cuid,$db;
250    if ($name=="mailman") {
251      $db->query("SELECT COUNT(*) AS cnt FROM mailman WHERE uid='$cuid';");
252      $db->next_record();
253      return $db->f("cnt");
254    } else return false;
255  }
256
257} /* Class m_mailman */
258
259?>
Note: See TracBrowser for help on using the repository browser.