VirtualMailManager/handler.py
author Pascal Volk <user@localhost.localdomain.org>
Sun, 08 Jun 2014 17:15:55 +0000
branchv0.7.x
changeset 752 271bd82c05c0
parent 750 8931c6b8435e
child 753 3f1cecdcdfca
permissions -rw-r--r--
{man1,doc/web}: Added userdelete --delete-home's description.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
     1
# -*- coding: UTF-8 -*-
703
58815c004a61 Updated copyright notices to include the year 2014.
Pascal Volk <user@localhost.localdomain.org>
parents: 702
diff changeset
     2
# Copyright (c) 2007 - 2014, Pascal Volk
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
     3
# See COPYING for distribution information.
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
     4
"""
320
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 319
diff changeset
     5
   VirtualMailManager.handler
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 319
diff changeset
     6
   ~~~~~~~~~~~~~~~~~~~~~~~~~~
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
     7
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
     8
   A wrapper class. It wraps round all other classes and does some
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
     9
   dependencies checks.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    10
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
    11
   Additionally it communicates with the PostgreSQL database, creates
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
    12
   or deletes directories of domains or users.
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
    13
"""
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
    14
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
    15
import os
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
    16
import re
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
    17
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    18
from shutil import rmtree
648
9cf2cf762e26 VMM/handler: Reworked config file permission check.
Pascal Volk <user@localhost.localdomain.org>
parents: 643
diff changeset
    19
from stat import S_IRGRP, S_IROTH, S_IWGRP, S_IWOTH
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    20
from subprocess import Popen, PIPE
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    21
694
b1bfd4d1d9c0 Dropped pyPgSQL support.
Pascal Volk <user@localhost.localdomain.org>
parents: 686
diff changeset
    22
import psycopg2
b1bfd4d1d9c0 Dropped pyPgSQL support.
Pascal Volk <user@localhost.localdomain.org>
parents: 686
diff changeset
    23
320
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 319
diff changeset
    24
from VirtualMailManager.account import Account
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 319
diff changeset
    25
from VirtualMailManager.alias import Alias
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 319
diff changeset
    26
from VirtualMailManager.aliasdomain import AliasDomain
505
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
    27
from VirtualMailManager.catchall import CatchallAlias
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
    28
from VirtualMailManager.common import exec_ok, lisdir
320
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 319
diff changeset
    29
from VirtualMailManager.config import Config as Cfg
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
    30
from VirtualMailManager.constants import MIN_GID, MIN_UID, \
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
    31
     ACCOUNT_EXISTS, ALIAS_EXISTS, CONF_NOFILE, CONF_NOPERM, CONF_WRONGPERM, \
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
    32
     DATABASE_ERROR, DOMAINDIR_GROUP_MISMATCH, DOMAIN_INVALID, \
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
    33
     FOUND_DOTS_IN_PATH, INVALID_ARGUMENT, MAILDIR_PERM_MISMATCH, \
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
    34
     NOT_EXECUTABLE, NO_SUCH_ACCOUNT, NO_SUCH_ALIAS, NO_SUCH_BINARY, \
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
    35
     NO_SUCH_DIRECTORY, NO_SUCH_RELOCATED, RELOCATED_EXISTS, UNKNOWN_SERVICE, \
555
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
    36
     VMM_ERROR, LOCALPART_INVALID, TYPE_ACCOUNT, TYPE_ALIAS, TYPE_RELOCATED
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
    37
from VirtualMailManager.domain import Domain
371
3b2fd0b4e51b VMM/handler: Handler.alias_add() and Handler.relocated_add() use
Pascal Volk <neverseen@users.sourceforge.net>
parents: 366
diff changeset
    38
from VirtualMailManager.emailaddress import DestinationEmailAddress, \
555
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
    39
     EmailAddress, RE_LOCALPART
285
d30a94f5aef5 VMM/Handler: import the errors before raising them.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 283
diff changeset
    40
from VirtualMailManager.errors import \
d30a94f5aef5 VMM/Handler: import the errors before raising them.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 283
diff changeset
    41
     DomainError, NotRootError, PermissionError, VMMError
309
d21423478803 VMM/mailbox: Added to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 294
diff changeset
    42
from VirtualMailManager.mailbox import new as new_mailbox
736
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
    43
from VirtualMailManager.password import extract_scheme, verify_scheme
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
    44
from VirtualMailManager.quotalimit import QuotaLimit
320
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 319
diff changeset
    45
from VirtualMailManager.relocated import Relocated
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
    46
from VirtualMailManager.serviceset import ServiceSet, SERVICES
320
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 319
diff changeset
    47
from VirtualMailManager.transport import Transport
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    48
190
1903d4ce97d7 VMM/{,cli/}Handler: reverted most of cs cf1b5f22dbd2 added a cli handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
    49
283
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
    50
_ = lambda msg: msg
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
    51
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    52
CFG_FILE = 'vmm.cfg'
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    53
CFG_PATH = '/root:/usr/local/etc:/etc'
241
2493453f2c10 VMM/Handler: small code cleanups and an improved import statement.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
    54
RE_DOMAIN_SEARCH = """^[a-z0-9-\.]+$"""
283
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
    55
OTHER_TYPES = {
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
    56
    TYPE_ACCOUNT: (_('an account'), ACCOUNT_EXISTS),
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
    57
    TYPE_ALIAS: (_('an alias'), ALIAS_EXISTS),
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
    58
    TYPE_RELOCATED: (_('a relocated user'), RELOCATED_EXISTS),
283
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
    59
}
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    60
611
8e9b0046bc8f PEP8: Fixed all PEP8 related issues.
Pascal Volk <user@localhost.localdomain.org>
parents: 605
diff changeset
    61
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
    62
class Handler(object):
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
    63
    """Wrapper class to simplify the access on all the stuff from
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
    64
    VirtualMailManager"""
694
b1bfd4d1d9c0 Dropped pyPgSQL support.
Pascal Volk <user@localhost.localdomain.org>
parents: 686
diff changeset
    65
    __slots__ = ('_cfg', '_cfg_fname', '_dbh', '_warnings')
191
db77501aeaed VMM/Handler: __mailDirMake() add warning for skipped mailboxes.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 190
diff changeset
    66
190
1903d4ce97d7 VMM/{,cli/}Handler: reverted most of cs cf1b5f22dbd2 added a cli handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
    67
    def __init__(self, skip_some_checks=False):
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
    68
        """Creates a new Handler instance.
188
cf1b5f22dbd2 VMM/Handler: __init__ accepts now a config_type ('default'||'cli').
Pascal Volk <neverseen@users.sourceforge.net>
parents: 187
diff changeset
    69
190
1903d4ce97d7 VMM/{,cli/}Handler: reverted most of cs cf1b5f22dbd2 added a cli handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
    70
        ``skip_some_checks`` : bool
1903d4ce97d7 VMM/{,cli/}Handler: reverted most of cs cf1b5f22dbd2 added a cli handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
    71
            When a derived class knows how to handle all checks this
1903d4ce97d7 VMM/{,cli/}Handler: reverted most of cs cf1b5f22dbd2 added a cli handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
    72
            argument may be ``True``. By default it is ``False`` and
1903d4ce97d7 VMM/{,cli/}Handler: reverted most of cs cf1b5f22dbd2 added a cli handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
    73
            all checks will be performed.
188
cf1b5f22dbd2 VMM/Handler: __init__ accepts now a config_type ('default'||'cli').
Pascal Volk <neverseen@users.sourceforge.net>
parents: 187
diff changeset
    74
216
0c8c053b451c Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 215
diff changeset
    75
        Throws a NotRootError if your uid is greater 0.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    76
        """
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    77
        self._cfg_fname = ''
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
    78
        self._warnings = []
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    79
        self._cfg = None
196
65a3163bd113 VMM/{Alias,Handler}: reworked Alias class, adjusted Handler class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 192
diff changeset
    80
        self._dbh = None
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    81
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    82
        if os.geteuid():
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
    83
            raise NotRootError(_("You are not root.\n\tGood bye!\n"),
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
    84
                               CONF_NOPERM)
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
    85
        if self._check_cfg_file():
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    86
            self._cfg = Cfg(self._cfg_fname)
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    87
            self._cfg.load()
190
1903d4ce97d7 VMM/{,cli/}Handler: reverted most of cs cf1b5f22dbd2 added a cli handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
    88
        if not skip_some_checks:
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    89
            self._cfg.check()
190
1903d4ce97d7 VMM/{,cli/}Handler: reverted most of cs cf1b5f22dbd2 added a cli handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
    90
            self._chkenv()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    91
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
    92
    def _find_cfg_file(self):
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    93
        """Search the CFG_FILE in CFG_PATH.
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    94
        Raise a VMMError when no vmm.cfg could be found.
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    95
        """
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    96
        for path in CFG_PATH.split(':'):
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    97
            tmp = os.path.join(path, CFG_FILE)
119
014335f38962 Small code cleanups (replaced dir+'/'+file by os.path.join()).
Pascal Volk <neverseen@users.sourceforge.net>
parents: 115
diff changeset
    98
            if os.path.isfile(tmp):
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    99
                self._cfg_fname = tmp
94
0d303d15549e * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 90
diff changeset
   100
                break
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   101
        if not self._cfg_fname:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   102
            raise VMMError(_("Could not find '%(cfg_file)s' in: "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   103
                             "'%(cfg_path)s'") % {'cfg_file': CFG_FILE,
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   104
                           'cfg_path': CFG_PATH}, CONF_NOFILE)
94
0d303d15549e * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 90
diff changeset
   105
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   106
    def _check_cfg_file(self):
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   107
        """Checks the configuration file, returns bool"""
648
9cf2cf762e26 VMM/handler: Reworked config file permission check.
Pascal Volk <user@localhost.localdomain.org>
parents: 643
diff changeset
   108
        GRPRW = S_IRGRP | S_IWGRP
9cf2cf762e26 VMM/handler: Reworked config file permission check.
Pascal Volk <user@localhost.localdomain.org>
parents: 643
diff changeset
   109
        OTHRW = S_IROTH | S_IWOTH
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   110
        self._find_cfg_file()
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   111
        fstat = os.stat(self._cfg_fname)
648
9cf2cf762e26 VMM/handler: Reworked config file permission check.
Pascal Volk <user@localhost.localdomain.org>
parents: 643
diff changeset
   112
        if (fstat.st_uid == fstat.st_gid and fstat.st_mode & OTHRW) or \
9cf2cf762e26 VMM/handler: Reworked config file permission check.
Pascal Volk <user@localhost.localdomain.org>
parents: 643
diff changeset
   113
           (fstat.st_uid != fstat.st_gid and fstat.st_mode & (GRPRW | OTHRW)):
470
807ad4df0774 VMM/handler: Added a comment for the Translation Project.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 458
diff changeset
   114
            # TP: Please keep the backticks around the command. `chmod 0600 …`
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   115
            raise PermissionError(_("wrong permissions for '%(file)s': "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   116
                                    "%(perms)s\n`chmod 0600 %(file)s` would "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   117
                                    "be great.") % {'file': self._cfg_fname,
648
9cf2cf762e26 VMM/handler: Reworked config file permission check.
Pascal Volk <user@localhost.localdomain.org>
parents: 643
diff changeset
   118
                                  'perms': oct(fstat.st_mode)[-4:]},
9cf2cf762e26 VMM/handler: Reworked config file permission check.
Pascal Volk <user@localhost.localdomain.org>
parents: 643
diff changeset
   119
                                  CONF_WRONGPERM)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   120
        else:
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   121
            return True
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   122
190
1903d4ce97d7 VMM/{,cli/}Handler: reverted most of cs cf1b5f22dbd2 added a cli handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   123
    def _chkenv(self):
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   124
        """Make sure our base_directory is a directory and that all
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   125
        required executables exists and are executable.
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   126
        If not, a VMMError will be raised"""
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   127
        dir_created = False
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   128
        basedir = self._cfg.dget('misc.base_directory')
168
fd496561acc6 vmm.cfg: a few re-renamed configuration options.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 166
diff changeset
   129
        if not os.path.exists(basedir):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   130
            old_umask = os.umask(0o006)
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   131
            os.makedirs(basedir, 0o771)
270
d3389645a91d configuration: Dropped setting misc.gid_mail.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   132
            os.chown(basedir, 0, 0)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   133
            os.umask(old_umask)
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   134
            dir_created = True
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   135
        if not dir_created and not lisdir(basedir):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   136
            raise VMMError(_("'%(path)s' is not a directory.\n(%(cfg_file)s: "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   137
                             "section 'misc', option 'base_directory')") %
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   138
                           {'path': basedir, 'cfg_file': self._cfg_fname},
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   139
                           NO_SUCH_DIRECTORY)
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   140
        for opt, val in self._cfg.items('bin'):
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
   141
            try:
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
   142
                exec_ok(val)
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   143
            except VMMError as err:
351
4bba5fb90b78 VMM/handler: Small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 341
diff changeset
   144
                if err.code in (NO_SUCH_BINARY, NOT_EXECUTABLE):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   145
                    raise VMMError(err.msg + _("\n(%(cfg_file)s: section "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   146
                                   "'bin', option '%(option)s')") %
351
4bba5fb90b78 VMM/handler: Small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 341
diff changeset
   147
                                   {'cfg_file': self._cfg_fname,
4bba5fb90b78 VMM/handler: Small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 341
diff changeset
   148
                                    'option': opt}, err.code)
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
   149
                else:
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 184
diff changeset
   150
                    raise
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   151
694
b1bfd4d1d9c0 Dropped pyPgSQL support.
Pascal Volk <user@localhost.localdomain.org>
parents: 686
diff changeset
   152
    def _db_connect(self):
355
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   153
        """Return a new psycopg2 connection object."""
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   154
        if self._dbh is None or \
694
b1bfd4d1d9c0 Dropped pyPgSQL support.
Pascal Volk <user@localhost.localdomain.org>
parents: 686
diff changeset
   155
          (isinstance(self._dbh, psycopg2.extensions.connection) and
355
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   156
           self._dbh.closed):
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   157
            try:
694
b1bfd4d1d9c0 Dropped pyPgSQL support.
Pascal Volk <user@localhost.localdomain.org>
parents: 686
diff changeset
   158
                self._dbh = psycopg2.connect(
355
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   159
                        host=self._cfg.dget('database.host'),
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   160
                        sslmode=self._cfg.dget('database.sslmode'),
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   161
                        port=self._cfg.dget('database.port'),
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   162
                        database=self._cfg.dget('database.name'),
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   163
                        user=self._cfg.pget('database.user'),
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   164
                        password=self._cfg.pget('database.pass'))
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   165
                self._dbh.set_client_encoding('utf8')
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   166
                dbc = self._dbh.cursor()
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   167
                dbc.execute("SET NAMES 'UTF8'")
48bf20b43f2e VMM/handler: Added support for psycopg2.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 351
diff changeset
   168
                dbc.close()
694
b1bfd4d1d9c0 Dropped pyPgSQL support.
Pascal Volk <user@localhost.localdomain.org>
parents: 686
diff changeset
   169
            except psycopg2.DatabaseError as err:
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   170
                raise VMMError(str(err), DATABASE_ERROR)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   171
251
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   172
    def _chk_other_address_types(self, address, exclude):
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   173
        """Checks if the EmailAddress *address* is known as `TYPE_ACCOUNT`,
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   174
        `TYPE_ALIAS` or `TYPE_RELOCATED`, but not as the `TYPE_*` specified
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   175
        by *exclude*.  If the *address* is known as one of the `TYPE_*`s
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   176
        the according `TYPE_*` constant will be returned.  Otherwise 0 will
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   177
        be returned."""
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   178
        assert exclude in (TYPE_ACCOUNT, TYPE_ALIAS, TYPE_RELOCATED) and \
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   179
                isinstance(address, EmailAddress)
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   180
        if exclude is not TYPE_ACCOUNT:
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   181
            account = Account(self._dbh, address)
283
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   182
            if account:
251
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   183
                return TYPE_ACCOUNT
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   184
        if exclude is not TYPE_ALIAS:
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   185
            alias = Alias(self._dbh, address)
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   186
            if alias:
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   187
                return TYPE_ALIAS
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   188
        if exclude is not TYPE_RELOCATED:
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   189
            relocated = Relocated(self._dbh, address)
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   190
            if relocated:
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   191
                return TYPE_RELOCATED
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   192
        return 0
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   193
283
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   194
    def _is_other_address(self, address, exclude):
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   195
        """Checks if *address* is known for an Account (TYPE_ACCOUNT),
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   196
        Alias (TYPE_ALIAS) or Relocated (TYPE_RELOCATED), except for
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   197
        *exclude*.  Returns `False` if the address is not known for other
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   198
        types.
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   199
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   200
        Raises a `VMMError` if the address is known.
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   201
        """
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   202
        other = self._chk_other_address_types(address, exclude)
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   203
        if not other:
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   204
            return False
341
6709d0faf2f5 VMM/…: Unified messages and removed non-ASCII quotes.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 337
diff changeset
   205
        # TP: %(a_type)s will be one of: 'an account', 'an alias' or
6709d0faf2f5 VMM/…: Unified messages and removed non-ASCII quotes.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 337
diff changeset
   206
        # 'a relocated user'
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   207
        msg = _("There is already %(a_type)s with the address '%(address)s'.")
283
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   208
        raise VMMError(msg % {'a_type': OTHER_TYPES[other][0],
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   209
                              'address': address}, OTHER_TYPES[other][1])
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   210
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   211
    def _get_account(self, address):
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   212
        """Return an Account instances for the given address (str)."""
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 78
diff changeset
   213
        address = EmailAddress(address)
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   214
        self._db_connect()
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   215
        return Account(self._dbh, address)
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 78
diff changeset
   216
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   217
    def _get_alias(self, address):
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   218
        """Return an Alias instances for the given address (str)."""
197
d2712e8c724e VMM/{Relocated,Handler}: reworked Relocated class, adjusted Handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 196
diff changeset
   219
        address = EmailAddress(address)
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   220
        self._db_connect()
196
65a3163bd113 VMM/{Alias,Handler}: reworked Alias class, adjusted Handler class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 192
diff changeset
   221
        return Alias(self._dbh, address)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   222
505
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   223
    def _get_catchall(self, domain):
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   224
        """Return a CatchallAlias instances for the given domain (str)."""
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   225
        self._db_connect()
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   226
        return CatchallAlias(self._dbh, domain)
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   227
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   228
    def _get_relocated(self, address):
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   229
        """Return a Relocated instances for the given address (str)."""
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 78
diff changeset
   230
        address = EmailAddress(address)
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   231
        self._db_connect()
197
d2712e8c724e VMM/{Relocated,Handler}: reworked Relocated class, adjusted Handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 196
diff changeset
   232
        return Relocated(self._dbh, address)
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 78
diff changeset
   233
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   234
    def _get_domain(self, domainname):
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   235
        """Return a Domain instances for the given domain name (str)."""
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   236
        self._db_connect()
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   237
        return Domain(self._dbh, domainname)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   238
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   239
    def _get_disk_usage(self, directory):
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   240
        """Estimate file space usage for the given directory.
128
cf8116625866 Converted VirtualMailManager and Postconf to new-style classes.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 119
diff changeset
   241
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   242
        Arguments:
40
ab0748a5da9a * 'vmm'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 38
diff changeset
   243
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   244
        `directory` : basestring
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   245
          The directory to summarize recursively disk usage for
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   246
        """
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   247
        if lisdir(directory):
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   248
            return Popen([self._cfg.dget('bin.du'), "-hs", directory],
653
cf07e4468934 VMM: Post-2to3 fixes.
Pascal Volk <user@localhost.localdomain.org>
parents: 649
diff changeset
   249
                         stdout=PIPE).communicate()[0].decode().split('\t')[0]
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   250
        else:
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   251
            self._warnings.append(_('No such directory: %s') % directory)
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   252
            return 0
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   253
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   254
    def _make_domain_dir(self, domain):
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   255
        """Create a directory for the `domain` and its accounts."""
310
644e2cc4a441 VMM/Handler: Reworked __domDirMake and reamed to __make_domain_dir.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 309
diff changeset
   256
        cwd = os.getcwd()
644e2cc4a441 VMM/Handler: Reworked __domDirMake and reamed to __make_domain_dir.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 309
diff changeset
   257
        hashdir, domdir = domain.directory.split(os.path.sep)[-2:]
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   258
        dir_created = False
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   259
        os.chdir(self._cfg.dget('misc.base_directory'))
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   260
        old_umask = os.umask(0o022)
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   261
        if not os.path.exists(hashdir):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   262
            os.mkdir(hashdir, 0o711)
310
644e2cc4a441 VMM/Handler: Reworked __domDirMake and reamed to __make_domain_dir.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 309
diff changeset
   263
            os.chown(hashdir, 0, 0)
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   264
            dir_created = True
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   265
        if not dir_created and not lisdir(hashdir):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   266
            raise VMMError(_("'%s' is not a directory.") % hashdir,
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   267
                           NO_SUCH_DIRECTORY)
380
5aaf2dd6b146 VMM/handler: Handler._make_domain_dir(): Check if the domain
Pascal Volk <neverseen@users.sourceforge.net>
parents: 375
diff changeset
   268
        if os.path.exists(domain.directory):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   269
            raise VMMError(_("The file/directory '%s' already exists.") %
381
98223e5c95e0 VMM:/handler: Fixed typo introduced with the previous commit.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 380
diff changeset
   270
                           domain.directory, VMM_ERROR)
310
644e2cc4a441 VMM/Handler: Reworked __domDirMake and reamed to __make_domain_dir.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 309
diff changeset
   271
        os.mkdir(os.path.join(hashdir, domdir),
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   272
                 self._cfg.dget('domain.directory_mode'))
310
644e2cc4a441 VMM/Handler: Reworked __domDirMake and reamed to __make_domain_dir.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 309
diff changeset
   273
        os.chown(domain.directory, 0, domain.gid)
493
30365a87650d VMM/handler: Create domain directory with umask 0022.
Pascal Volk <user@localhost.localdomain.org>
parents: 470
diff changeset
   274
        os.umask(old_umask)
310
644e2cc4a441 VMM/Handler: Reworked __domDirMake and reamed to __make_domain_dir.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 309
diff changeset
   275
        os.chdir(cwd)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   276
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   277
    def _make_home(self, account):
309
d21423478803 VMM/mailbox: Added to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 294
diff changeset
   278
        """Create a home directory for the new Account *account*."""
329
41789df75339 VMM/account: Replaced property domain_directory by domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 327
diff changeset
   279
        domdir = account.domain.directory
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   280
        if not lisdir(domdir):
330
3fe8d6cdbe3a VMM/handler: _make_home() Create the domain directory if it
Pascal Volk <neverseen@users.sourceforge.net>
parents: 329
diff changeset
   281
            self._make_domain_dir(account.domain)
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   282
        os.umask(0o007)
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   283
        uid = account.uid
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   284
        os.chdir(domdir)
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   285
        os.mkdir('%s' % uid, self._cfg.dget('account.directory_mode'))
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   286
        os.chown('%s' % uid, uid, account.gid)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   287
337
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   288
    def _make_account_dirs(self, account):
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   289
        """Create all necessary directories for the account."""
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   290
        oldpwd = os.getcwd()
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   291
        self._make_home(account)
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   292
        mailbox = new_mailbox(account)
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   293
        mailbox.create()
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   294
        folders = self._cfg.dget('mailbox.folders').split(':')
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   295
        if any(folders):
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   296
            bad = mailbox.add_boxes(folders,
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   297
                                    self._cfg.dget('mailbox.subscribe'))
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   298
            if bad:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   299
                self._warnings.append(_("Skipped mailbox folders:") +
337
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   300
                                      '\n\t- ' + '\n\t- '.join(bad))
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   301
        os.chdir(oldpwd)
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   302
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   303
    def _delete_home(self, domdir, uid, gid):
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   304
        """Delete a user's home directory.
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   305
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   306
        Arguments:
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   307
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   308
        `domdir` : basestring
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   309
          The directory of the domain the user belongs to
329
41789df75339 VMM/account: Replaced property domain_directory by domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 327
diff changeset
   310
          (commonly AccountObj.domain.directory)
670
f374ef062c94 VMM/*: Post-2to3 fix. Updated some error messages/comments.
Pascal Volk <user@localhost.localdomain.org>
parents: 653
diff changeset
   311
        `uid` : int
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   312
          The user's UID (commonly AccountObj.uid)
670
f374ef062c94 VMM/*: Post-2to3 fix. Updated some error messages/comments.
Pascal Volk <user@localhost.localdomain.org>
parents: 653
diff changeset
   313
        `gid` : int
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   314
          The user's GID (commonly AccountObj.gid)
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   315
        """
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   316
        assert all(isinstance(xid, int) for xid in (uid, gid)) and \
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   317
                isinstance(domdir, str)
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   318
        if uid < MIN_UID or gid < MIN_GID:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   319
            raise VMMError(_("UID '%(uid)u' and/or GID '%(gid)u' are less "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   320
                             "than %(min_uid)u/%(min_gid)u.") % {'uid': uid,
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   321
                           'gid': gid, 'min_gid': MIN_GID, 'min_uid': MIN_UID},
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   322
                           MAILDIR_PERM_MISMATCH)
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   323
        if domdir.count('..'):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   324
            raise VMMError(_('Found ".." in domain directory path: %s') %
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   325
                           domdir, FOUND_DOTS_IN_PATH)
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   326
        if not lisdir(domdir):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   327
            raise VMMError(_("No such directory: %s") % domdir,
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   328
                           NO_SUCH_DIRECTORY)
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   329
        os.chdir(domdir)
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   330
        userdir = '%s' % uid
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   331
        if not lisdir(userdir):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   332
            self._warnings.append(_("No such directory: %s") %
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   333
                                  os.path.join(domdir, userdir))
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   334
            return
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   335
        mdstat = os.lstat(userdir)
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   336
        if (mdstat.st_uid, mdstat.st_gid) != (uid, gid):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   337
            raise VMMError(_('Detected owner/group mismatch in home '
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   338
                             'directory.'), MAILDIR_PERM_MISMATCH)
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   339
        rmtree(userdir, ignore_errors=True)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   340
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   341
    def _delete_domain_dir(self, domdir, gid):
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   342
        """Delete a domain's directory.
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   343
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   344
        Arguments:
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   345
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   346
        `domdir` : basestring
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   347
          The domain's directory (commonly DomainObj.directory)
670
f374ef062c94 VMM/*: Post-2to3 fix. Updated some error messages/comments.
Pascal Volk <user@localhost.localdomain.org>
parents: 653
diff changeset
   348
        `gid` : int
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   349
          The domain's GID (commonly DomainObj.gid)
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   350
        """
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   351
        assert isinstance(domdir, str) and isinstance(gid, int)
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   352
        if gid < MIN_GID:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   353
            raise VMMError(_("GID '%(gid)u' is less than '%(min_gid)u'.") %
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   354
                           {'gid': gid, 'min_gid': MIN_GID},
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   355
                           DOMAINDIR_GROUP_MISMATCH)
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   356
        if domdir.count('..'):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   357
            raise VMMError(_('Found ".." in domain directory path: %s') %
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   358
                           domdir, FOUND_DOTS_IN_PATH)
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   359
        if not lisdir(domdir):
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   360
            self._warnings.append(_('No such directory: %s') % domdir)
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   361
            return
327
bb9ff81928f1 VMM/handler: Use more common.lisdir() in Handler's methods _chkenv,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 325
diff changeset
   362
        dirst = os.lstat(domdir)
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   363
        if dirst.st_gid != gid:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   364
            raise VMMError(_('Detected group mismatch in domain directory: '
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   365
                             '%s') % domdir, DOMAINDIR_GROUP_MISMATCH)
325
06c0457036a0 VMM/handler: Reworked methods _get_disk_usage, _delete_home and
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   366
        rmtree(domdir, ignore_errors=True)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   367
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   368
    def has_warnings(self):
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   369
        """Checks if warnings are present, returns bool."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   370
        return bool(len(self._warnings))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   371
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   372
    def get_warnings(self):
221
371ae0b4443d VMM/Alias: renamed Alias.add_destination() to add_destinations().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
   373
        """Returns a list with all available warnings and resets all
371ae0b4443d VMM/Alias: renamed Alias.add_destination() to add_destinations().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
   374
        warnings.
371ae0b4443d VMM/Alias: renamed Alias.add_destination() to add_destinations().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
   375
        """
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   376
        ret_val = self._warnings[:]
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   377
        del self._warnings[:]
221
371ae0b4443d VMM/Alias: renamed Alias.add_destination() to add_destinations().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
   378
        return ret_val
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   379
255
d2ddd4a6528d VMM/Handler: renamed some methods and added their missing docstrings:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   380
    def cfg_dget(self, option):
d2ddd4a6528d VMM/Handler: renamed some methods and added their missing docstrings:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   381
        """Get the configured value of the *option* (section.option).
d2ddd4a6528d VMM/Handler: renamed some methods and added their missing docstrings:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   382
        When the option was not configured its default value will be
d2ddd4a6528d VMM/Handler: renamed some methods and added their missing docstrings:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   383
        returned."""
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   384
        return self._cfg.dget(option)
40
ab0748a5da9a * 'vmm'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 38
diff changeset
   385
255
d2ddd4a6528d VMM/Handler: renamed some methods and added their missing docstrings:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   386
    def cfg_pget(self, option):
d2ddd4a6528d VMM/Handler: renamed some methods and added their missing docstrings:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   387
        """Get the configured value of the *option* (section.option)."""
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   388
        return self._cfg.pget(option)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   389
280
db35d2eec518 VMM/{Config,Handler}: moved Config.install() to Handler.cfg_install().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 278
diff changeset
   390
    def cfg_install(self):
db35d2eec518 VMM/{Config,Handler}: moved Config.install() to Handler.cfg_install().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 278
diff changeset
   391
        """Installs the cfg_dget method as ``cfg_dget`` into the built-in
db35d2eec518 VMM/{Config,Handler}: moved Config.install() to Handler.cfg_install().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 278
diff changeset
   392
        namespace."""
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   393
        import builtins
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   394
        assert 'cfg_dget' not in builtins.__dict__
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   395
        builtins.__dict__['cfg_dget'] = self._cfg.dget
280
db35d2eec518 VMM/{Config,Handler}: moved Config.install() to Handler.cfg_install().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 278
diff changeset
   396
686
5f4abdab738e VMM: Added option `-n NOTE' to {domain,user}add.
Pascal Volk <user@localhost.localdomain.org>
parents: 681
diff changeset
   397
    def domain_add(self, domainname, transport=None, note=None):
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   398
        """Wrapper around Domain's set_quotalimit, set_transport and save."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   399
        dom = self._get_domain(domainname)
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   400
        if transport is None:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   401
            dom.set_transport(Transport(self._dbh,
458
4ff0fa3ba0fa VMM/config: Moved some options to section `domain':
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   402
                              transport=self._cfg.dget('domain.transport')))
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   403
        else:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   404
            dom.set_transport(Transport(self._dbh, transport=transport))
686
5f4abdab738e VMM: Added option `-n NOTE' to {domain,user}add.
Pascal Volk <user@localhost.localdomain.org>
parents: 681
diff changeset
   405
        if note:
5f4abdab738e VMM: Added option `-n NOTE' to {domain,user}add.
Pascal Volk <user@localhost.localdomain.org>
parents: 681
diff changeset
   406
            dom.set_note(note)
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   407
        dom.set_quotalimit(QuotaLimit(self._dbh,
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   408
                           bytes=int(self._cfg.dget('domain.quota_bytes')),
458
4ff0fa3ba0fa VMM/config: Moved some options to section `domain':
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   409
                           messages=self._cfg.dget('domain.quota_messages')))
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
   410
        dom.set_serviceset(ServiceSet(self._dbh,
458
4ff0fa3ba0fa VMM/config: Moved some options to section `domain':
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   411
                                      imap=self._cfg.dget('domain.imap'),
4ff0fa3ba0fa VMM/config: Moved some options to section `domain':
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   412
                                      pop3=self._cfg.dget('domain.pop3'),
4ff0fa3ba0fa VMM/config: Moved some options to section `domain':
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   413
                                      sieve=self._cfg.dget('domain.sieve'),
4ff0fa3ba0fa VMM/config: Moved some options to section `domain':
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   414
                                      smtp=self._cfg.dget('domain.smtp')))
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   415
        dom.set_directory(self._cfg.dget('misc.base_directory'))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   416
        dom.save()
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   417
        self._make_domain_dir(dom)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   418
681
4cab983479db VMM: Code cleanup.
Pascal Volk <user@localhost.localdomain.org>
parents: 676
diff changeset
   419
    def domain_quotalimit(self, domainname, bytes_, messages=0, force=False):
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   420
        """Wrapper around Domain.update_quotalimit()."""
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   421
        if not all(isinstance(i, int) for i in (bytes_, messages)):
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   422
            raise TypeError("'bytes_' and 'messages' have to be "
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   423
                            "integers or longs.")
681
4cab983479db VMM: Code cleanup.
Pascal Volk <user@localhost.localdomain.org>
parents: 676
diff changeset
   424
        assert isinstance(force, bool)
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   425
        dom = self._get_domain(domainname)
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   426
        quotalimit = QuotaLimit(self._dbh, bytes=bytes_, messages=messages)
681
4cab983479db VMM: Code cleanup.
Pascal Volk <user@localhost.localdomain.org>
parents: 676
diff changeset
   427
        dom.update_quotalimit(quotalimit, force)
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   428
681
4cab983479db VMM: Code cleanup.
Pascal Volk <user@localhost.localdomain.org>
parents: 676
diff changeset
   429
    def domain_services(self, domainname, force=False, *services):
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
   430
        """Wrapper around Domain.update_serviceset()."""
681
4cab983479db VMM: Code cleanup.
Pascal Volk <user@localhost.localdomain.org>
parents: 676
diff changeset
   431
        assert isinstance(force, bool)
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
   432
        kwargs = dict.fromkeys(SERVICES, False)
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
   433
        for service in set(services):
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
   434
            if service not in SERVICES:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   435
                raise DomainError(_("Unknown service: '%s'") % service,
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
   436
                                  UNKNOWN_SERVICE)
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
   437
            kwargs[service] = True
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
   438
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
   439
        dom = self._get_domain(domainname)
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
   440
        serviceset = ServiceSet(self._dbh, **kwargs)
681
4cab983479db VMM: Code cleanup.
Pascal Volk <user@localhost.localdomain.org>
parents: 676
diff changeset
   441
        dom.update_serviceset(serviceset, force)
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 426
diff changeset
   442
681
4cab983479db VMM: Code cleanup.
Pascal Volk <user@localhost.localdomain.org>
parents: 676
diff changeset
   443
    def domain_transport(self, domainname, transport, force=False):
557
1498abbb6c91 VMM/handler: Restored method Handler.domain_transport().
Pascal Volk <user@localhost.localdomain.org>
parents: 555
diff changeset
   444
        """Wrapper around Domain.update_transport()"""
681
4cab983479db VMM: Code cleanup.
Pascal Volk <user@localhost.localdomain.org>
parents: 676
diff changeset
   445
        assert isinstance(force, bool)
557
1498abbb6c91 VMM/handler: Restored method Handler.domain_transport().
Pascal Volk <user@localhost.localdomain.org>
parents: 555
diff changeset
   446
        dom = self._get_domain(domainname)
1498abbb6c91 VMM/handler: Restored method Handler.domain_transport().
Pascal Volk <user@localhost.localdomain.org>
parents: 555
diff changeset
   447
        trsp = Transport(self._dbh, transport=transport)
681
4cab983479db VMM: Code cleanup.
Pascal Volk <user@localhost.localdomain.org>
parents: 676
diff changeset
   448
        dom.update_transport(trsp, force)
557
1498abbb6c91 VMM/handler: Restored method Handler.domain_transport().
Pascal Volk <user@localhost.localdomain.org>
parents: 555
diff changeset
   449
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 536
diff changeset
   450
    def domain_note(self, domainname, note):
557
1498abbb6c91 VMM/handler: Restored method Handler.domain_transport().
Pascal Volk <user@localhost.localdomain.org>
parents: 555
diff changeset
   451
        """Wrapper around Domain.update_note()"""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   452
        dom = self._get_domain(domainname)
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 536
diff changeset
   453
        dom.update_note(note)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   454
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 330
diff changeset
   455
    def domain_delete(self, domainname, force=False):
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   456
        """Wrapper around Domain.delete()"""
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 330
diff changeset
   457
        if not isinstance(force, bool):
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 330
diff changeset
   458
            raise TypeError('force must be a bool')
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   459
        dom = self._get_domain(domainname)
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   460
        gid = dom.gid
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   461
        domdir = dom.directory
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 330
diff changeset
   462
        if self._cfg.dget('domain.force_deletion') or force:
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 330
diff changeset
   463
            dom.delete(True)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   464
        else:
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 330
diff changeset
   465
            dom.delete(False)
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   466
        if self._cfg.dget('domain.delete_directory'):
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   467
            self._delete_domain_dir(domdir, gid)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   468
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   469
    def domain_info(self, domainname, details=None):
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   470
        """Wrapper around Domain.get_info(), Domain.get_accounts(),
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   471
        Domain.get_aliase_names(), Domain.get_aliases() and
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   472
        Domain.get_relocated."""
62
869de537a020 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 55
diff changeset
   473
        if details not in [None, 'accounts', 'aliasdomains', 'aliases', 'full',
510
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 508
diff changeset
   474
                           'relocated', 'catchall']:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   475
            raise VMMError(_("Invalid argument: '%s'") % details,
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   476
                           INVALID_ARGUMENT)
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   477
        dom = self._get_domain(domainname)
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   478
        dominfo = dom.get_info()
702
01db2457bbed VMM/handler: Improved domaininfo subcommand.
Pascal Volk <user@localhost.localdomain.org>
parents: 675
diff changeset
   479
        if dominfo['domain name'].startswith('xn--') or \
01db2457bbed VMM/handler: Improved domaininfo subcommand.
Pascal Volk <user@localhost.localdomain.org>
parents: 675
diff changeset
   480
           dominfo['domain name'].count('.xn--'):
447
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 444
diff changeset
   481
            dominfo['domain name'] += ' (%s)' % \
653
cf07e4468934 VMM: Post-2to3 fixes.
Pascal Volk <user@localhost.localdomain.org>
parents: 649
diff changeset
   482
                         dominfo['domain name'].encode('utf-8').decode('idna')
62
869de537a020 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 55
diff changeset
   483
        if details is None:
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   484
            return dominfo
62
869de537a020 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 55
diff changeset
   485
        elif details == 'accounts':
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   486
            return (dominfo, dom.get_accounts())
62
869de537a020 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 55
diff changeset
   487
        elif details == 'aliasdomains':
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   488
            return (dominfo, dom.get_aliase_names())
62
869de537a020 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 55
diff changeset
   489
        elif details == 'aliases':
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   490
            return (dominfo, dom.get_aliases())
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 78
diff changeset
   491
        elif details == 'relocated':
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   492
            return(dominfo, dom.get_relocated())
510
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 508
diff changeset
   493
        elif details == 'catchall':
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 508
diff changeset
   494
            return(dominfo, dom.get_catchall())
62
869de537a020 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 55
diff changeset
   495
        else:
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 233
diff changeset
   496
            return (dominfo, dom.get_aliase_names(), dom.get_accounts(),
510
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 508
diff changeset
   497
                    dom.get_aliases(), dom.get_relocated(), dom.get_catchall())
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   498
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   499
    def aliasdomain_add(self, aliasname, domainname):
55
15c873f94ba6 * 'VirtualMailManager/Exceptions.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 54
diff changeset
   500
        """Adds an alias domain to the domain.
53
5b50eb306d37 * 'VirtualMailManager/DomainAlias.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 52
diff changeset
   501
244
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   502
        Arguments:
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   503
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   504
        `aliasname` : basestring
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   505
          The name of the alias domain
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   506
        `domainname` : basestring
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   507
          The name of the target domain
45
9e66138aad0b * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 44
diff changeset
   508
        """
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   509
        dom = self._get_domain(domainname)
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   510
        alias_dom = AliasDomain(self._dbh, aliasname)
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   511
        alias_dom.set_destination(dom)
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   512
        alias_dom.save()
53
5b50eb306d37 * 'VirtualMailManager/DomainAlias.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 52
diff changeset
   513
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   514
    def aliasdomain_info(self, aliasname):
244
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   515
        """Returns a dict (keys: "alias" and "domain") with the names of
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   516
        the alias domain and its primary domain."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   517
        self._db_connect()
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   518
        alias_dom = AliasDomain(self._dbh, aliasname)
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   519
        return alias_dom.info()
45
9e66138aad0b * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 44
diff changeset
   520
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   521
    def aliasdomain_switch(self, aliasname, domainname):
78
8f1e501b1bb1 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   522
        """Modifies the target domain of an existing alias domain.
8f1e501b1bb1 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   523
244
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   524
        Arguments:
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   525
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   526
        `aliasname` : basestring
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   527
          The name of the alias domain
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   528
        `domainname` : basestring
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   529
          The name of the new target domain
78
8f1e501b1bb1 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   530
        """
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   531
        dom = self._get_domain(domainname)
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   532
        alias_dom = AliasDomain(self._dbh, aliasname)
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   533
        alias_dom.set_destination(dom)
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   534
        alias_dom.switch()
78
8f1e501b1bb1 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   535
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   536
    def aliasdomain_delete(self, aliasname):
244
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   537
        """Deletes the given alias domain.
53
5b50eb306d37 * 'VirtualMailManager/DomainAlias.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 52
diff changeset
   538
244
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   539
        Argument:
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   540
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   541
        `aliasname` : basestring
698ba4208ddc VMM/Handler: adjusted Handler.aliasDomain*() methods to changes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 241
diff changeset
   542
          The name of the alias domain
45
9e66138aad0b * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 44
diff changeset
   543
        """
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   544
        self._db_connect()
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   545
        alias_dom = AliasDomain(self._dbh, aliasname)
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   546
        alias_dom.delete()
45
9e66138aad0b * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 44
diff changeset
   547
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   548
    def domain_list(self, pattern=None):
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   549
        """Wrapper around function search() from module Domain."""
320
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 319
diff changeset
   550
        from VirtualMailManager.domain import search
35
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   551
        like = False
241
2493453f2c10 VMM/Handler: small code cleanups and an improved import statement.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   552
        if pattern and (pattern.startswith('%') or pattern.endswith('%')):
2493453f2c10 VMM/Handler: small code cleanups and an improved import statement.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   553
            like = True
2493453f2c10 VMM/Handler: small code cleanups and an improved import statement.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   554
            if not re.match(RE_DOMAIN_SEARCH, pattern.strip('%')):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   555
                raise VMMError(_("The pattern '%s' contains invalid "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   556
                                 "characters.") % pattern, DOMAIN_INVALID)
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   557
        self._db_connect()
196
65a3163bd113 VMM/{Alias,Handler}: reworked Alias class, adjusted Handler class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 192
diff changeset
   558
        return search(self._dbh, pattern=pattern, like=like)
35
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   559
555
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   560
    def address_list(self, typelimit, pattern=None):
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   561
        """TODO"""
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   562
        llike = dlike = False
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   563
        lpattern = dpattern = None
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   564
        if pattern:
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   565
            parts = pattern.split('@', 2)
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   566
            if len(parts) == 2:
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   567
                # The pattern includes '@', so let's treat the
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   568
                # parts separately to allow for pattern search like %@domain.%
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   569
                lpattern = parts[0]
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   570
                llike = lpattern.startswith('%') or lpattern.endswith('%')
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   571
                dpattern = parts[1]
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   572
                dlike = dpattern.startswith('%') or dpattern.endswith('%')
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   573
638
0de0b9e75c9f VMM: Partial PEP-308-ification.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   574
                checkp = lpattern.strip('%') if llike else lpattern
555
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   575
                if len(checkp) > 0 and re.search(RE_LOCALPART, checkp):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   576
                    raise VMMError(_("The pattern '%s' contains invalid "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   577
                                     "characters.") % pattern,
611
8e9b0046bc8f PEP8: Fixed all PEP8 related issues.
Pascal Volk <user@localhost.localdomain.org>
parents: 605
diff changeset
   578
                                   LOCALPART_INVALID)
555
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   579
            else:
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   580
                # else just match on domains
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   581
                # (or should that be local part, I don't know…)
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   582
                dpattern = parts[0]
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   583
                dlike = dpattern.startswith('%') or dpattern.endswith('%')
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   584
638
0de0b9e75c9f VMM: Partial PEP-308-ification.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   585
            checkp = dpattern.strip('%') if dlike else dpattern
555
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   586
            if len(checkp) > 0 and not re.match(RE_DOMAIN_SEARCH, checkp):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   587
                raise VMMError(_("The pattern '%s' contains invalid "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   588
                                 "characters.") % pattern, DOMAIN_INVALID)
555
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   589
        self._db_connect()
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   590
        from VirtualMailManager.common import search_addresses
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   591
        return search_addresses(self._dbh, typelimit=typelimit,
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   592
                                lpattern=lpattern, llike=llike,
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   593
                                dpattern=dpattern, dlike=dlike)
499c63f52462 Provide list{addresses,aliases,users,relocated} subcommands
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   594
686
5f4abdab738e VMM: Added option `-n NOTE' to {domain,user}add.
Pascal Volk <user@localhost.localdomain.org>
parents: 681
diff changeset
   595
    def user_add(self, emailaddress, password, note=None):
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   596
        """Wrapper around Account.set_password() and Account.save()."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   597
        acc = self._get_account(emailaddress)
337
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   598
        if acc:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   599
            raise VMMError(_("The account '%s' already exists.") %
337
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   600
                           acc.address, ACCOUNT_EXISTS)
422
33a45e4c80c4 VMM: Deleted a few unused variables.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   601
        self._is_other_address(acc.address, TYPE_ACCOUNT)
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   602
        acc.set_password(password)
686
5f4abdab738e VMM: Added option `-n NOTE' to {domain,user}add.
Pascal Volk <user@localhost.localdomain.org>
parents: 681
diff changeset
   603
        if note:
5f4abdab738e VMM: Added option `-n NOTE' to {domain,user}add.
Pascal Volk <user@localhost.localdomain.org>
parents: 681
diff changeset
   604
            acc.set_note(note)
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   605
        acc.save()
337
150ddcc8b315 VMM/{,cli/}handler: user_add: Check earlier if the account exists.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 335
diff changeset
   606
        self._make_account_dirs(acc)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   607
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   608
    def alias_add(self, aliasaddress, *targetaddresses):
196
65a3163bd113 VMM/{Alias,Handler}: reworked Alias class, adjusted Handler class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 192
diff changeset
   609
        """Creates a new `Alias` entry for the given *aliasaddress* with
221
371ae0b4443d VMM/Alias: renamed Alias.add_destination() to add_destinations().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
   610
        the given *targetaddresses*."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   611
        alias = self._get_alias(aliasaddress)
375
4cbaf8d229f9 VMM/{,cli/}handler: Moved the 'address-in-use check' (introduced
Pascal Volk <neverseen@users.sourceforge.net>
parents: 373
diff changeset
   612
        if not alias:
4cbaf8d229f9 VMM/{,cli/}handler: Moved the 'address-in-use check' (introduced
Pascal Volk <neverseen@users.sourceforge.net>
parents: 373
diff changeset
   613
            self._is_other_address(alias.address, TYPE_ALIAS)
611
8e9b0046bc8f PEP8: Fixed all PEP8 related issues.
Pascal Volk <user@localhost.localdomain.org>
parents: 605
diff changeset
   614
        destinations = [DestinationEmailAddress(addr, self._dbh)
8e9b0046bc8f PEP8: Fixed all PEP8 related issues.
Pascal Volk <user@localhost.localdomain.org>
parents: 605
diff changeset
   615
                        for addr in targetaddresses]
221
371ae0b4443d VMM/Alias: renamed Alias.add_destination() to add_destinations().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
   616
        warnings = []
281
59ff7c719697 VMM/Alias: moved the postconf stuff from the Handlers to Alias class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 280
diff changeset
   617
        destinations = alias.add_destinations(destinations, warnings)
221
371ae0b4443d VMM/Alias: renamed Alias.add_destination() to add_destinations().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
   618
        if warnings:
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   619
            self._warnings.append(_('Ignored destination addresses:'))
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   620
            self._warnings.extend(('  * %s' % w for w in warnings))
221
371ae0b4443d VMM/Alias: renamed Alias.add_destination() to add_destinations().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
   621
        for destination in destinations:
371
3b2fd0b4e51b VMM/handler: Handler.alias_add() and Handler.relocated_add() use
Pascal Volk <neverseen@users.sourceforge.net>
parents: 366
diff changeset
   622
            if destination.gid and \
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 285
diff changeset
   623
               not self._chk_other_address_types(destination, TYPE_RELOCATED):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   624
                self._warnings.append(_("The destination account/alias '%s' "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   625
                                        "does not exist.") % destination)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   626
750
8931c6b8435e VMM/handler: Handler.user_delete() Added parameter `delete_home'.
Pascal Volk <user@localhost.localdomain.org>
parents: 736
diff changeset
   627
    def user_delete(self, emailaddress, delete_home, force=False):
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   628
        """Wrapper around Account.delete(...)"""
750
8931c6b8435e VMM/handler: Handler.user_delete() Added parameter `delete_home'.
Pascal Volk <user@localhost.localdomain.org>
parents: 736
diff changeset
   629
        if not isinstance(delete_home, bool):
8931c6b8435e VMM/handler: Handler.user_delete() Added parameter `delete_home'.
Pascal Volk <user@localhost.localdomain.org>
parents: 736
diff changeset
   630
            raise TypeError('delete_home must be a bool')
333
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 331
diff changeset
   631
        if not isinstance(force, bool):
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 331
diff changeset
   632
            raise TypeError('force must be a bool')
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   633
        acc = self._get_account(emailaddress)
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   634
        if not acc:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   635
            raise VMMError(_("The account '%s' does not exist.") %
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   636
                           acc.address, NO_SUCH_ACCOUNT)
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   637
        uid = acc.uid
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   638
        gid = acc.gid
329
41789df75339 VMM/account: Replaced property domain_directory by domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 327
diff changeset
   639
        dom_dir = acc.domain.directory
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   640
        acc_dir = acc.home
333
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 331
diff changeset
   641
        acc.delete(force)
750
8931c6b8435e VMM/handler: Handler.user_delete() Added parameter `delete_home'.
Pascal Volk <user@localhost.localdomain.org>
parents: 736
diff changeset
   642
        if delete_home or self._cfg.dget('account.delete_directory'):
47
191d5a5adc4a * Removed gettext import and setup in VirtualMailManager/:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 45
diff changeset
   643
            try:
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   644
                self._delete_home(dom_dir, uid, gid)
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   645
            except VMMError as err:
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   646
                if err.code in (FOUND_DOTS_IN_PATH, MAILDIR_PERM_MISMATCH,
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   647
                                NO_SUCH_DIRECTORY):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   648
                    warning = _("""\
47
191d5a5adc4a * Removed gettext import and setup in VirtualMailManager/:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 45
diff changeset
   649
The account has been successfully deleted from the database.
191d5a5adc4a * Removed gettext import and setup in VirtualMailManager/:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 45
diff changeset
   650
    But an error occurred while deleting the following directory:
333
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 331
diff changeset
   651
    '%(directory)s'
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 331
diff changeset
   652
    Reason: %(reason)s""") % {'directory': acc_dir, 'reason': err.msg}
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   653
                    self._warnings.append(warning)
47
191d5a5adc4a * Removed gettext import and setup in VirtualMailManager/:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 45
diff changeset
   654
                else:
191
db77501aeaed VMM/Handler: __mailDirMake() add warning for skipped mailboxes.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 190
diff changeset
   655
                    raise
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   656
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   657
    def alias_info(self, aliasaddress):
196
65a3163bd113 VMM/{Alias,Handler}: reworked Alias class, adjusted Handler class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 192
diff changeset
   658
        """Returns an iterator object for all destinations (`EmailAddress`
65a3163bd113 VMM/{Alias,Handler}: reworked Alias class, adjusted Handler class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 192
diff changeset
   659
        instances) for the `Alias` with the given *aliasaddress*."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   660
        alias = self._get_alias(aliasaddress)
283
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   661
        if alias:
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 208
diff changeset
   662
            return alias.get_destinations()
283
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   663
        if not self._is_other_address(alias.address, TYPE_ALIAS):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   664
            raise VMMError(_("The alias '%s' does not exist.") %
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   665
                           alias.address, NO_SUCH_ALIAS)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   666
618
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   667
    def alias_delete(self, aliasaddress, targetaddresses=None):
196
65a3163bd113 VMM/{Alias,Handler}: reworked Alias class, adjusted Handler class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 192
diff changeset
   668
        """Deletes the `Alias` *aliasaddress* with all its destinations from
618
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   669
        the database. If *targetaddresses* is not ``None``, only the given
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   670
        destinations will be removed from the alias."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   671
        alias = self._get_alias(aliasaddress)
618
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   672
        error = None
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   673
        if targetaddresses is None:
196
65a3163bd113 VMM/{Alias,Handler}: reworked Alias class, adjusted Handler class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 192
diff changeset
   674
            alias.delete()
65a3163bd113 VMM/{Alias,Handler}: reworked Alias class, adjusted Handler class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 192
diff changeset
   675
        else:
618
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   676
            destinations = [DestinationEmailAddress(addr, self._dbh)
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   677
                            for addr in targetaddresses]
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   678
            warnings = []
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   679
            try:
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   680
                alias.del_destinations(destinations, warnings)
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   681
            except VMMError as err:
618
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   682
                error = err
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   683
            if warnings:
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   684
                self._warnings.append(_('Ignored destination addresses:'))
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   685
                self._warnings.extend(('  * %s' % w for w in warnings))
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   686
            if error:
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   687
                raise error
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   688
505
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   689
    def catchall_add(self, domain, *targetaddresses):
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   690
        """Creates a new `CatchallAlias` entry for the given *domain* with
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   691
        the given *targetaddresses*."""
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   692
        catchall = self._get_catchall(domain)
611
8e9b0046bc8f PEP8: Fixed all PEP8 related issues.
Pascal Volk <user@localhost.localdomain.org>
parents: 605
diff changeset
   693
        destinations = [DestinationEmailAddress(addr, self._dbh)
8e9b0046bc8f PEP8: Fixed all PEP8 related issues.
Pascal Volk <user@localhost.localdomain.org>
parents: 605
diff changeset
   694
                        for addr in targetaddresses]
505
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   695
        warnings = []
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   696
        destinations = catchall.add_destinations(destinations, warnings)
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   697
        if warnings:
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   698
            self._warnings.append(_('Ignored destination addresses:'))
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   699
            self._warnings.extend(('  * %s' % w for w in warnings))
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   700
        for destination in destinations:
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   701
            if destination.gid and \
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   702
               not self._chk_other_address_types(destination, TYPE_RELOCATED):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   703
                self._warnings.append(_("The destination account/alias '%s' "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   704
                                        "does not exist.") % destination)
505
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   705
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   706
    def catchall_info(self, domain):
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   707
        """Returns an iterator object for all destinations (`EmailAddress`
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   708
        instances) for the `CatchallAlias` with the given *domain*."""
508
18870919ec48 Fixup catchall_info to return iterator, not self
martin f. krafft <madduck@madduck.net>
parents: 505
diff changeset
   709
        return self._get_catchall(domain).get_destinations()
505
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   710
618
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   711
    def catchall_delete(self, domain, targetaddresses=None):
505
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   712
        """Deletes the `CatchallAlias` for domain *domain* with all its
618
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   713
        destinations from the database.  If *targetaddresses* is not
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   714
        ``None``,  only those destinations will be removed from the alias."""
505
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   715
        catchall = self._get_catchall(domain)
618
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   716
        error = None
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   717
        if targetaddresses is None:
505
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   718
            catchall.delete()
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   719
        else:
618
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   720
            destinations = [DestinationEmailAddress(addr, self._dbh)
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   721
                            for addr in targetaddresses]
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   722
            warnings = []
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   723
            try:
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   724
                catchall.del_destinations(destinations, warnings)
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   725
            except VMMError as err:
618
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   726
                error = err
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   727
            if warnings:
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   728
                self._warnings.append(_('Ignored destination addresses:'))
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   729
                self._warnings.extend(('  * %s' % w for w in warnings))
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   730
            if error:
d8736bb80bdc VMM: {alias,catchall}delete: Accept multiple destinations.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   731
                raise error
505
3da8c919584f Provide catchall_* methods to the Handler class
martin f. krafft <madduck@madduck.net>
parents: 493
diff changeset
   732
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   733
    def user_info(self, emailaddress, details=None):
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   734
        """Wrapper around Account.get_info(...)"""
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 168
diff changeset
   735
        if details not in (None, 'du', 'aliases', 'full'):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   736
            raise VMMError(_("Invalid argument: '%s'") % details,
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   737
                           INVALID_ARGUMENT)
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   738
        acc = self._get_account(emailaddress)
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   739
        if not acc:
283
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   740
            if not self._is_other_address(acc.address, TYPE_ACCOUNT):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   741
                raise VMMError(_("The account '%s' does not exist.") %
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   742
                               acc.address, NO_SUCH_ACCOUNT)
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   743
        info = acc.get_info()
318
4dc2edf02d11 VMM//{,cli/}Handler: Reworked configuration related parts.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
   744
        if self._cfg.dget('account.disk_usage') or details in ('du', 'full'):
293
a77b67673aa6 VMM/Account: replaced attribute _mid : int by _mail : MailLocation.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   745
            path = os.path.join(acc.home, acc.mail_location.directory)
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   746
            info['disk usage'] = self._get_disk_usage(path)
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 168
diff changeset
   747
            if details in (None, 'du'):
90
1734eb5101c6 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 88
diff changeset
   748
                return info
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 168
diff changeset
   749
        if details in ('aliases', 'full'):
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   750
            return (info, acc.get_aliases())
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   751
        return info
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   752
255
d2ddd4a6528d VMM/Handler: renamed some methods and added their missing docstrings:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   753
    def user_by_uid(self, uid):
d2ddd4a6528d VMM/Handler: renamed some methods and added their missing docstrings:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   754
        """Search for an Account by its *uid*.
d2ddd4a6528d VMM/Handler: renamed some methods and added their missing docstrings:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   755
        Returns a dict (address, uid and gid) if a user could be found."""
320
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 319
diff changeset
   756
        from VirtualMailManager.account import get_account_by_uid
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   757
        self._db_connect()
255
d2ddd4a6528d VMM/Handler: renamed some methods and added their missing docstrings:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   758
        return get_account_by_uid(uid, self._dbh)
19
bf9a03c476fc * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 18
diff changeset
   759
727
695426b49de0 VMM/{cli,}/handler: Adjusted Handler.user_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   760
    def user_password(self, emailaddress, password, scheme=None):
695426b49de0 VMM/{cli,}/handler: Adjusted Handler.user_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   761
        """Wrapper for Account.update_password(...)."""
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   762
        if not isinstance(password, str) or not password:
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   763
            raise VMMError(_("Could not accept password: '%s'") % password,
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   764
                           INVALID_ARGUMENT)
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   765
        acc = self._get_account(emailaddress)
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   766
        if not acc:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   767
            raise VMMError(_("The account '%s' does not exist.") %
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   768
                           acc.address, NO_SUCH_ACCOUNT)
727
695426b49de0 VMM/{cli,}/handler: Adjusted Handler.user_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   769
        acc.update_password(password, scheme)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   770
736
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   771
    def user_pwhash(self, emailaddress, pwhash):
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   772
        """Wrapper for Account.modify('pwhash', ...)"""
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   773
        scheme = extract_scheme(pwhash)
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   774
        if not scheme:
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   775
            raise VMMError(_('Missing {SCHEME} prefix from password hash.'),
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   776
                           INVALID_ARGUMENT)
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   777
        else:
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   778
            scheme, encoding = verify_scheme(scheme)  # or die …
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   779
        acc = self._get_account(emailaddress)
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   780
        if not acc:
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   781
            raise VMMError(_("The account '%s' does not exist.") %
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   782
                           acc.address, NO_SUCH_ACCOUNT)
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   783
        acc.modify('pwhash', pwhash)
66a5f9a405da VMM/handler: Added method Handler.user_pwhash.
Pascal Volk <user@localhost.localdomain.org>
parents: 727
diff changeset
   784
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   785
    def user_name(self, emailaddress, name):
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   786
        """Wrapper for Account.modify('name', ...)."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   787
        acc = self._get_account(emailaddress)
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   788
        if not acc:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   789
            raise VMMError(_("The account '%s' does not exist.") %
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   790
                           acc.address, NO_SUCH_ACCOUNT)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   791
        acc.modify('name', name)
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   792
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 536
diff changeset
   793
    def user_note(self, emailaddress, note):
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 536
diff changeset
   794
        """Wrapper for Account.modify('note', ...)."""
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 536
diff changeset
   795
        acc = self._get_account(emailaddress)
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 536
diff changeset
   796
        if not acc:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   797
            raise VMMError(_("The account '%s' does not exist.") %
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 536
diff changeset
   798
                           acc.address, NO_SUCH_ACCOUNT)
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 536
diff changeset
   799
        acc.modify('note', note)
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 536
diff changeset
   800
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   801
    def user_quotalimit(self, emailaddress, bytes_, messages=0):
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   802
        """Wrapper for Account.update_quotalimit(QuotaLimit)."""
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   803
        acc = self._get_account(emailaddress)
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   804
        if not acc:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   805
            raise VMMError(_("The account '%s' does not exist.") %
533
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   806
                        acc.address, NO_SUCH_ACCOUNT)
605
b994444f7dee VMM/handler: Fixed user{quota,services,transport} subcommands.
Pascal Volk <user@localhost.localdomain.org>
parents: 568
diff changeset
   807
        if bytes_ == 'domain':
533
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   808
            quotalimit = None
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   809
        else:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   810
            if not all(isinstance(i, int) for i in (bytes_, messages)):
533
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   811
                raise TypeError("'bytes_' and 'messages' have to be "
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   812
                                "integers or longs.")
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   813
            quotalimit = QuotaLimit(self._dbh, bytes=bytes_,
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   814
                                    messages=messages)
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   815
        acc.update_quotalimit(quotalimit)
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   816
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   817
    def user_transport(self, emailaddress, transport):
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 381
diff changeset
   818
        """Wrapper for Account.update_transport(Transport)."""
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   819
        if not isinstance(transport, str) or not transport:
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   820
            raise VMMError(_("Could not accept transport: '%s'") % transport,
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   821
                           INVALID_ARGUMENT)
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   822
        acc = self._get_account(emailaddress)
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   823
        if not acc:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   824
            raise VMMError(_("The account '%s' does not exist.") %
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   825
                           acc.address, NO_SUCH_ACCOUNT)
638
0de0b9e75c9f VMM: Partial PEP-308-ification.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   826
        transport = None if transport == 'domain' \
0de0b9e75c9f VMM: Partial PEP-308-ification.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   827
                         else Transport(self._dbh, transport=transport)
533
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   828
        acc.update_transport(transport)
17
fe9be0081e5f * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 16
diff changeset
   829
444
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   830
    def user_services(self, emailaddress, *services):
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   831
        """Wrapper around Account.update_serviceset()."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   832
        acc = self._get_account(emailaddress)
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   833
        if not acc:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   834
            raise VMMError(_("The account '%s' does not exist.") %
533
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   835
                        acc.address, NO_SUCH_ACCOUNT)
605
b994444f7dee VMM/handler: Fixed user{quota,services,transport} subcommands.
Pascal Volk <user@localhost.localdomain.org>
parents: 568
diff changeset
   836
        if len(services) == 1 and services[0] == 'domain':
533
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   837
            serviceset = None
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   838
        else:
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   839
            kwargs = dict.fromkeys(SERVICES, False)
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   840
            for service in set(services):
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   841
                if service not in SERVICES:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   842
                    raise VMMError(_("Unknown service: '%s'") % service,
533
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   843
                                UNKNOWN_SERVICE)
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   844
                kwargs[service] = True
2676dbf43e1c Change UI to accept 'default' to restore inherited values
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   845
            serviceset = ServiceSet(self._dbh, **kwargs)
444
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   846
        acc.update_serviceset(serviceset)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   847
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   848
    def relocated_add(self, emailaddress, targetaddress):
197
d2712e8c724e VMM/{Relocated,Handler}: reworked Relocated class, adjusted Handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 196
diff changeset
   849
        """Creates a new `Relocated` entry in the database. If there is
d2712e8c724e VMM/{Relocated,Handler}: reworked Relocated class, adjusted Handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 196
diff changeset
   850
        already a relocated user with the given *emailaddress*, only the
d2712e8c724e VMM/{Relocated,Handler}: reworked Relocated class, adjusted Handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 196
diff changeset
   851
        *targetaddress* for the relocated user will be updated."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   852
        relocated = self._get_relocated(emailaddress)
375
4cbaf8d229f9 VMM/{,cli/}handler: Moved the 'address-in-use check' (introduced
Pascal Volk <neverseen@users.sourceforge.net>
parents: 373
diff changeset
   853
        if not relocated:
4cbaf8d229f9 VMM/{,cli/}handler: Moved the 'address-in-use check' (introduced
Pascal Volk <neverseen@users.sourceforge.net>
parents: 373
diff changeset
   854
            self._is_other_address(relocated.address, TYPE_RELOCATED)
373
1016a17684c1 VMM/handler: Handler.relocated_add() check if the target address'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 372
diff changeset
   855
        destination = DestinationEmailAddress(targetaddress, self._dbh)
1016a17684c1 VMM/handler: Handler.relocated_add() check if the target address'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 372
diff changeset
   856
        relocated.set_destination(destination)
1016a17684c1 VMM/handler: Handler.relocated_add() check if the target address'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 372
diff changeset
   857
        if destination.gid and \
1016a17684c1 VMM/handler: Handler.relocated_add() check if the target address'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 372
diff changeset
   858
           not self._chk_other_address_types(destination, TYPE_RELOCATED):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   859
            self._warnings.append(_("The destination account/alias '%s' "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   860
                                    "does not exist.") % destination)
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 78
diff changeset
   861
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   862
    def relocated_info(self, emailaddress):
197
d2712e8c724e VMM/{Relocated,Handler}: reworked Relocated class, adjusted Handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 196
diff changeset
   863
        """Returns the target address of the relocated user with the given
d2712e8c724e VMM/{Relocated,Handler}: reworked Relocated class, adjusted Handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 196
diff changeset
   864
        *emailaddress*."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   865
        relocated = self._get_relocated(emailaddress)
283
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   866
        if relocated:
251
0963ad2f5fe2 VMM/Handler: Implemented Handler._chk_other_address_types().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 244
diff changeset
   867
            return relocated.get_info()
283
ea6d052de24a VMM/Handler: code cleanups in the user/alias/relocated info methods.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 282
diff changeset
   868
        if not self._is_other_address(relocated.address, TYPE_RELOCATED):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   869
            raise VMMError(_("The relocated user '%s' does not exist.") %
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 310
diff changeset
   870
                           relocated.address, NO_SUCH_RELOCATED)
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 78
diff changeset
   871
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   872
    def relocated_delete(self, emailaddress):
197
d2712e8c724e VMM/{Relocated,Handler}: reworked Relocated class, adjusted Handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 196
diff changeset
   873
        """Deletes the relocated user with the given *emailaddress* from
d2712e8c724e VMM/{Relocated,Handler}: reworked Relocated class, adjusted Handler.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 196
diff changeset
   874
        the database."""
319
f4956b4ceba1 VMM//{,cli/}Handler: PEP-8-ified the Handler classes:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 318
diff changeset
   875
        relocated = self._get_relocated(emailaddress)
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 78
diff changeset
   876
        relocated.delete()
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 78
diff changeset
   877
277
e50ffc0b8468 VMM{,/cli}/Handler: adjusted user* methods to the changes in Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 272
diff changeset
   878
del _