# HG changeset patch # User Pascal Volk # Date 1219812752 0 # Node ID 7ae95b9938c486c46fd07ccec49f90402e517705 # Parent e4d25f50164deec75b71abb4d854850e4b1d1423 * 'VirtualMailManager/VirtualMailManager.py' - Implemented VirtualMailManager.__subscribeFL() for the 'subscriptions' file. - Modified VirtualMailManager.__mailDirMake() for configurable folders inside the Maildir. * 'VirtualMailManager/Config.py' * 'vmm.cfg' - Updated Maildir options * 'update_config_0.4.x-0.5.py' - Added to repository * 'man/de/man5/vmm.cfg.5' * 'man/man5/vmm.cfg.5' - updated diff -r e4d25f50164d -r 7ae95b9938c4 VirtualMailManager/Config.py --- a/VirtualMailManager/Config.py Tue Aug 26 01:53:48 2008 +0000 +++ b/VirtualMailManager/Config.py Wed Aug 27 04:52:32 2008 +0000 @@ -56,7 +56,8 @@ ['name', 'mailsys'] ] self.__mdopts = [ - ['folder', 'Maildir'], + ['name', 'Maildir'], + ['folders', 'Drafts:Sent:Templates:Trash'], ['mode', 448], ['diskusage', 'false'], ['delete', 'false'] diff -r e4d25f50164d -r 7ae95b9938c4 VirtualMailManager/VirtualMailManager.py --- a/VirtualMailManager/VirtualMailManager.py Tue Aug 26 01:53:48 2008 +0000 +++ b/VirtualMailManager/VirtualMailManager.py Wed Aug 27 04:52:32 2008 +0000 @@ -37,6 +37,7 @@ RE_DOMAIN_SRCH = """^[a-z0-9-\.]+$""" RE_LOCALPART = """[^\w!#$%&'\*\+-\.\/=?^_`{\|}~]""" RE_MAILLOCATION = """^[\w]{1,20}$""" +RE_MBOX_NAMES = """^[\x20-\x25\x27-\x7E]*$""" class VirtualMailManager: """The main class for vmm""" @@ -278,10 +279,21 @@ gid) os.chdir(oldpwd) + def __subscribeFL(self, folderlist, uid, gid): + fname = self.__Cfg.get('maildir', 'name') + '/subscriptions' + sf = file(fname, 'w') + for f in folderlist: + sf.write(f+'\n') + sf.flush() + sf.close() + os.chown(fname, uid, gid) + os.chmod(fname, 384) + def __mailDirMake(self, domdir, uid, gid): """Creates maildirs and maildir subfolders. Keyword arguments: + domdir -- the path to the domain directory uid -- user id from the account gid -- group id from the account """ @@ -289,9 +301,14 @@ oldpwd = os.getcwd() os.chdir(domdir) - maildir = '%s' % self.__Cfg.get('maildir', 'folder') - folders = [maildir , maildir+'/.Drafts', maildir+'/.Sent', - maildir+'/.Templates', maildir+'/.Trash'] + re.compile(RE_MBOX_NAMES) + maildir = self.__Cfg.get('maildir', 'name') + folders = [maildir] + for folder in self.__Cfg.get('maildir', 'folders').split(':'): + folder = folder.strip() + if len(folder) and not folder.count('..')\ + and re.match(RE_MBOX_NAMES, folder): + folders.append('%s/.%s' % (maildir, folder)) subdirs = ['cur', 'new', 'tmp'] mode = self.__Cfg.getint('maildir', 'mode') @@ -301,6 +318,8 @@ self.__makedir(folder, mode, uid, gid) for subdir in subdirs: self.__makedir(folder+'/'+subdir, mode, uid, gid) + self.__subscribeFL([f.replace(maildir+'/.', '') for f in folders[1:]], + uid, gid) os.chdir(oldpwd) def __userDirDelete(self, domdir, uid, gid): @@ -560,7 +579,7 @@ if password is None: password = self._readpass() acc.setPassword(self.__pwhash(password)) - acc.save(self.__Cfg.get('maildir', 'folder'), + acc.save(self.__Cfg.get('maildir', 'name'), self.__Cfg.getboolean('services', 'smtp'), self.__Cfg.getboolean('services', 'pop3'), self.__Cfg.getboolean('services', 'imap'), diff -r e4d25f50164d -r 7ae95b9938c4 man/de/man5/vmm.cfg.5 --- a/man/de/man5/vmm.cfg.5 Tue Aug 26 01:53:48 2008 +0000 +++ b/man/de/man5/vmm.cfg.5 Wed Aug 27 04:52:32 2008 +0000 @@ -1,5 +1,5 @@ .\" $Id$ -.TH vmm.cfg 5 "17. Jun 2008" "Pascal Volk" +.TH vmm.cfg 5 "27. Aug 2008" "Pascal Volk" .SH NAME vmm.cfg \- Konfigurationsdatei für vmm .SH SYNOPSIS @@ -71,10 +71,17 @@ Im \fBmaildir\fP-Abschnitt werden die für die Maildirs erforderlichen Optionen festgelegt. .TP -\fBfolder\fP (\fIString\fP) +\fBname\fP (\fIString\fP) Standard-Name des Maildir-Verzeichnisses im Verzeichnis des jeweiligen Anwenders. .TP +\fBfolders\fP (\fIString\fP) +Eine durch Doppelpunkten getrennte Liste mit Verzeichnisnamen, die innerhalb des +Maildirs erstellt werden sollen. +.br +Sollen innerhalb des Maildirs keine Verzeichnisse angelegt werden, ist dieser +Optionen ein einzelner Doppelpunkt (':') als Wert zuzuweisen. +.TP \fBmode\fP (\fIInt\fP) Zugriffsbits des Maildirs in Dezimal-Schreibweise (Basis 10). .br @@ -92,7 +99,9 @@ \fBBeispiel\fP: [maildir] .br -folder = Maildir +name = Maildir +.br +folders = Drafts:Sent:Templates:Trash:INBOX.News .br mode = 448 .br diff -r e4d25f50164d -r 7ae95b9938c4 man/man5/vmm.cfg.5 --- a/man/man5/vmm.cfg.5 Tue Aug 26 01:53:48 2008 +0000 +++ b/man/man5/vmm.cfg.5 Wed Aug 27 04:52:32 2008 +0000 @@ -1,5 +1,5 @@ .\" $Id$ -.TH vmm.cfg 5 "11. Jun 2008" "Pascal Volk" +.TH vmm.cfg 5 "27. Aug 2008" "Pascal Volk" .SH NAME vmm.cfg \- configuration file for vmm .SH SYNOPSIS @@ -64,9 +64,15 @@ .SH MAILDIR SECTION The \fBmaildir\fP section is used to specify some options for the Maildirs. .TP -\fBfolder\fP (\fIString\fP) +\fBname\fP (\fIString\fP) Default name of the maildir folder in users home directory. .TP +\fBfolders\fP (\fIString\fP) +A colon separated list of folder names, that should be created. +.br +If no folders should be created inside the Maildir, set the value of this option +to a single colon (':'). +.TP \fBmode\fP (\fIInt\fP) Access mode for the maildir in decimal (base 10) notation. For example: \'drwx------' -> octal 0700 -> decimal 448 @@ -81,7 +87,9 @@ \fBExample\fP: [maildir] .br -folder = Maildir +name = Maildir +.br +folders = Drafts:Sent:Templates:Trash:INBOX.News .br mode = 448 .br diff -r e4d25f50164d -r 7ae95b9938c4 update_config_0.4.x-0.5.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/update_config_0.4.x-0.5.py Wed Aug 27 04:52:32 2008 +0000 @@ -0,0 +1,31 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# Copyright 2008 VEB IT +# See COPYING for distribution information. +# $Id$ + +from ConfigParser import ConfigParser +from shutil import copy2 + +cf = '/usr/local/etc/vmm.cfg' +fh = file(cf, 'r') +cp = ConfigParser() +cp.readfp(fh) +fh.close() + +if not cp.has_option('maildir', 'name') or not cp.has_option('maildir', + 'folders') or cp.has_option('maildir', 'folder'): + copy2(cf, cf+'.bak_upd_0.4.x-0.5') + fh = file(cf, 'w') + if not cp.has_option('maildir', 'name'): + if cp.has_option('maildir', 'folder'): + cp.set('maildir', 'name', cp.get('maildir', 'folder')) + cp.remove_option('maildir', 'folder') + else: + cp.set('maildir', 'name', 'Maildir') + if not cp.has_option('maildir', 'folders'): + cp.set('maildir', 'folders', 'Drafts:Sent:Templates:Trash') + if cp.has_option('maildir', 'folder'): + cp.remove_option('maildir', 'folder') + cp.write(fh) + fh.close() diff -r e4d25f50164d -r 7ae95b9938c4 upgrade.sh --- a/upgrade.sh Tue Aug 26 01:53:48 2008 +0000 +++ b/upgrade.sh Wed Aug 27 04:52:32 2008 +0000 @@ -80,3 +80,7 @@ [ -d ${DOC_DIR}/examples ] || mkdir -m 0755 -p ${DOC_DIR}/examples install -m 0644 ${INSTALL_OPTS} pgsql-*.cf ${DOC_DIR}/examples install -m 0644 ${INSTALL_OPTS} vmm.cfg ${DOC_DIR}/examples + +# update config file +./update_config_0.4.x-0.5.py + diff -r e4d25f50164d -r 7ae95b9938c4 vmm.cfg --- a/vmm.cfg Tue Aug 26 01:53:48 2008 +0000 +++ b/vmm.cfg Wed Aug 27 04:52:32 2008 +0000 @@ -20,8 +20,11 @@ # Mail directories # [maildir] -; default name of the Maildir folder (String) -folder = Maildir +; Default name of the Maildir folder (String) +name = Maildir +; A colon separated list of folder names, that should be created (String) +; e.g.: folders = Drafts:Sent:Templates:Trash +folders = Drafts:Sent:Templates:Trash ; Permissions for maildirs (Int) ; octal 0700 -> decimal 448 mode = 448