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

Revision 1963, 9.9 KB checked in by anarcat, 6 years ago (diff)

push my "virtual mailman patch" supported in alternc

this changes the way lists are created and stored in the alternc
database to allow lists with similar names to exist on different domains
(ever wanted info@… and info@… be different lists?
this is it.) the stored "name" is foo-bar where the list address is
foo@…

this patch therefore removes the "one list name per site" limitation
from alternc itself, but you need to patch mailman itself for it to
support that functionality.

see  http://wiki.koumbit.net/VirtualMailman

this should work for both unpatched and patched mailman installations

  • 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
31/* you need to set VHOST_PATCH=1 in your /etc/alternc/local.sh if you
32 * apply Koumbit's vhost mailman patch */
33@define('L_VHOST_PATCH', 1)
34
35class m_mailman {
36
37  /* ----------------------------------------------------------------- */
38  function m_mailman() {
39  }
40
41  /* ----------------------------------------------------------------- */
42  /**
43   * Quota name
44   */
45  function alternc_quota_names() {
46    return "mailman";
47  }
48
49  /*****************************************************************************/
50  /** Return the mailing-lists managed by this member : */
51  function enum_ml($domain = null, $order_by = array('domain', 'list')) {
52    global $err,$db,$cuid;
53    $err->log("mailman","enum_ml");
54    $order_by = array_map("addslashes", $order_by);
55    $order = 'ORDER BY `' . join('`,`', $order_by) . '`';
56$query = "SELECT * FROM mailman WHERE uid=$cuid".
57        (is_null($domain) ? "" : " AND domain='" . addslashes($domain) ."'" ) .
58              " $order;";
59    $db->query($query);
60    if (!$db->num_rows()) {
61      $err->raise("mailman",1);
62      return array();
63    }
64    $mls=array();
65    while ($db->next_record()) {
66      $mls[]=$db->Record;
67    }
68    return $mls;
69  }
70
71  /*****************************************************************************/
72  function prefix_list() {
73    global $db,$err,$cuid;
74    $r=array();
75    $db->query("SELECT domaine FROM domaines WHERE compte='$cuid' AND gesmx = 1 ORDER BY domaine;");
76    while ($db->next_record()) {
77      $r[]=$db->f("domaine");
78    }
79    return $r;
80  }
81  /*****************************************************************************/
82  function select_prefix_list($current) {
83    global $db,$err;
84    $r=$this->prefix_list();
85    reset($r);
86    while (list($key,$val)=each($r)) {
87      if ($current==$val) $c=" selected=\"selected\""; else $c="";
88      echo "<option$c>$val</option>";
89    }
90    return true;
91  }
92
93  /*****************************************************************************/
94        /** Get list informations */
95        function get_lst($id)
96        {
97                global $db, $err, $cuid;
98                $err->log("mailman","get_list", $cuid);
99
100                $q = "SELECT * FROM mailman WHERE uid = '" . $cuid . "' && id = '" . $id . "'";
101                $db->query($q);
102                $db->next_record();
103                if (!$db->f("id"))
104                {
105                        $err->raise("mailman",9);
106                        return false;
107                }
108                $login = $db->f("list");
109                $domain = $db->f("domain");
110                return $login . "@" . $domain;
111        }
112
113  /*****************************************************************************/
114  /** Create a new list for this member : */
115  function add_lst($domain,$login,$owner,$password) {
116    global $db,$err,$quota,$mail,$cuid;
117    $err->log("mailman","add_lst",$login."@".$domain." - ".$owner);
118    /* the list' internal name */
119    if (L_VHOST_PATCH) {
120      $name = $login . '-' . $domain;
121    } else {
122      $name=$login;
123    }
124
125    if ($login=="") {
126      $err->raise("mailman",2);
127      return false;
128    }
129    if (!$owner || !$password) {
130      $err->raise("mailman",3);
131      return false;
132    }
133    if (checkmail($owner)) {
134      $err->raise("mailman",4);
135      return false;
136    }
137    $r=$this->prefix_list();
138    if (!in_array($domain,$r) || $domain=="") {
139      $err->raise("mailman",5);
140      return false;
141    }
142    $db->query("SELECT COUNT(*) AS cnt FROM mailman WHERE name='$name';");
143    $db->next_record();
144    if ($db->f("cnt")) {
145        $err->raise("mailman",10);
146        return false;
147    }
148    // Prefixe OK, on verifie la non-existence des mails que l'on va créer...
149    if (!$mail->available($login."@".$domain) ||
150        !$mail->available($login."-request@".$domain) ||
151        !$mail->available($login."-owner@".$domain) ||
152        !$mail->available($login."-admin@".$domain) ||
153        !$mail->available($login."-bounces@".$domain) ||
154        !$mail->available($login."-confirm@".$domain) ||
155        !$mail->available($login."-join@".$domain) ||
156        !$mail->available($login."-leave@".$domain) ||
157        !$mail->available($login."-subscribe@".$domain) ||
158        !$mail->available($login."-unsubscribe@".$domain)) {
159      // This is a mail account already !!!
160      $err->raise("mailman",6);
161      return false;
162    }
163    // Le compte n'existe pas, on vérifie le quota et on le créé.
164    if ($quota->cancreate("mailman")) {
165      // Creation de la liste : 1. recherche du nom de la liste
166      // CA NE MARCHE PAS !
167      $db->query("INSERT INTO mailman (uid,list,domain,name) VALUES ('$cuid','$login','$domain','$name');");
168      if (!$mail->add_wrapper($login,$domain,"/var/lib/mailman/mail/mailman post $name","mailman") ||
169          !$mail->add_wrapper($login."-request",$domain,"/var/lib/mailman/mail/mailman request $name","mailman") ||
170          !$mail->add_wrapper($login."-owner",$domain,"/var/lib/mailman/mail/mailman owner $name","mailman") ||
171          !$mail->add_wrapper($login."-admin",$domain,"/var/lib/mailman/mail/mailman admin $name","mailman") ||
172          !$mail->add_wrapper($login."-bounces",$domain,"/var/lib/mailman/mail/mailman bounces $name","mailman") ||
173          !$mail->add_wrapper($login."-confirm",$domain,"/var/lib/mailman/mail/mailman confirm $name","mailman") ||
174          !$mail->add_wrapper($login."-join",$domain,"/var/lib/mailman/mail/mailman join $name","mailman") ||
175          !$mail->add_wrapper($login."-leave",$domain,"/var/lib/mailman/mail/mailman leave $name","mailman") ||
176          !$mail->add_wrapper($login."-subscribe",$domain,"/var/lib/mailman/mail/mailman subscribe $name","mailman") ||
177          !$mail->add_wrapper($login."-unsubscribe",$domain,"/var/lib/mailman/mail/mailman unsubscribe $name","mailman")
178          ) {
179        $mail->del_wrapper($login,$domain);             $mail->del_wrapper($login."-request",$domain);
180        $mail->del_wrapper($login."-owner",$domain);    $mail->del_wrapper($login."-admin",$domain);
181        $mail->del_wrapper($login."-bounces",$domain);  $mail->del_wrapper($login."-confirm",$domain);
182        $mail->del_wrapper($login."-join",$domain);     $mail->del_wrapper($login."-leave",$domain);
183        $mail->del_wrapper($login."-subscribe",$domain);        $mail->del_wrapper($login."-unsubscribe",$domain);
184        $db->query("DELETE FROM mailman WHERE name='$name';");
185        return false;
186      }
187      // Wrapper created, sql ok, now let's create the list :)
188      exec("/usr/lib/alternc/mailman.create \"".escapeshellcmd($login."@".$domain)."\" \"".escapeshellcmd($owner)."\" \"".escapeshellcmd($password)."\"");
189      return true;
190    } else {
191      $err->raise("mailman",7); // quota
192      return false;
193    }
194  }
195
196  /*****************************************************************************/
197  function delete_lst($id) {
198    global $db,$err,$mail,$cuid;
199    $err->log("mailman","delete_lst",$id);
200
201    $db->query("SELECT * FROM mailman WHERE id=$id and uid='$cuid';");
202    $db->next_record();
203    if (!$db->f("id")) {
204      $err->raise("mailman",9);
205      return false;
206    }
207    exec("/usr/lib/alternc/mailman.delete ".escapeshellarg($db->f("name")));
208    $login=$db->f("list");
209    $domain=$db->f("domain");
210    $db->query("DELETE FROM mailman WHERE id=$id");
211    $mail->del_wrapper($login,$domain);         $mail->del_wrapper($login."-request",$domain);
212    $mail->del_wrapper($login."-owner",$domain);        $mail->del_wrapper($login."-admin",$domain);
213    $mail->del_wrapper($login."-bounces",$domain);      $mail->del_wrapper($login."-confirm",$domain);
214    $mail->del_wrapper($login."-join",$domain); $mail->del_wrapper($login."-leave",$domain);
215    $mail->del_wrapper($login."-subscribe",$domain);    $mail->del_wrapper($login."-unsubscribe",$domain);
216    return $login."@".$domain;
217  }
218
219  /* ----------------------------------------------------------------- */
220  /** Returns the list's members as a text file, one subscriber per
221   *   line.
222   */
223 function members($id) {
224    global $err,$db,$cuid;
225    $err->log("mailman","members");
226    $db->query("SELECT * FROM mailman WHERE uid='$cuid' AND id='$id';");
227    if (!$db->num_rows()) {
228      $err->raise("mailman",1);
229      return false;
230    }
231    $db->next_record();
232    passthru("/usr/lib/alternc/mailman.list ".$db->Record["list"]);
233  }
234
235
236  /* ----------------------------------------------------------------- */
237  /** Fonction appellée par domaines lorsqu'un domaine est effacé.
238   * Cette fonction efface tous les comptes mails du domaine concerné.
239   * @param string $dom Domaine à effacer
240   * @return boolean TRUE si le domaine a bien été effacé, FALSE si une erreur s'est produite.
241   * @access private
242   */
243  function alternc_del_mx_domain($dom) {
244    global $err;
245    $err->log("mailman","del_dom",$dom);
246
247    // Suppression des listes du domaine
248    $listes=$this->enum_ml($dom);
249    while (list($key,$val)=each($listes)) {
250      $this->delete_lst($val["id"]);
251    }
252    return true;
253  }
254
255  /* ----------------------------------------------------------------- */
256  function alternc_get_quota($name) {
257    global $err,$cuid,$db;
258    if ($name=="mailman") {
259      $db->query("SELECT COUNT(*) AS cnt FROM mailman WHERE uid='$cuid';");
260      $db->next_record();
261      return $db->f("cnt");
262    } else return false;
263  }
264
265} /* Class m_mailman */
266
267?>
Note: See TracBrowser for help on using the repository browser.