VirtualMailManager/account.py
author Pascal Volk <user@localhost.localdomain.org>
Sun, 16 Feb 2014 23:07:30 +0000
branchv0.7.x
changeset 731 77561c118f42
parent 726 46b37d7c848a
child 735 ddcad86f7386
permissions -rw-r--r--
VMM/password: Added function extract_scheme().
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: 675
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.
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
     4
"""
320
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
     5
    VirtualMailManager.account
302
32b4a39b5640 VMM/maillocation: Reworked class MailLocation to match the new
Pascal Volk <neverseen@users.sourceforge.net>
parents: 293
diff changeset
     6
    ~~~~~~~~~~~~~~~~~~~~~~~~~~
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
     7
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
     8
    Virtual Mail Manager's Account class to manage e-mail accounts.
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
     9
"""
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    10
532
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
    11
from VirtualMailManager.common import version_str, \
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
    12
     format_domain_default
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 306
diff changeset
    13
from VirtualMailManager.constants import \
252
af555e6967c8 VMM/Account: renamed function getAccountByID -> get_account_by_uid.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 250
diff changeset
    14
     ACCOUNT_EXISTS, ACCOUNT_MISSING_PASSWORD, ALIAS_PRESENT, \
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 306
diff changeset
    15
     INVALID_ARGUMENT, INVALID_MAIL_LOCATION, NO_SUCH_ACCOUNT, \
451
2408a3cd4bea VMM/account: Removed unused import.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 444
diff changeset
    16
     NO_SUCH_DOMAIN, VMM_ERROR
614
1ec3497a6733 VMM: Moved transport-validation to common.
Pascal Volk <user@localhost.localdomain.org>
parents: 613
diff changeset
    17
from VirtualMailManager.common import validate_transport
442
abcd73f5e980 VMM/account: Sorted imports …
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    18
from VirtualMailManager.domain import Domain
abcd73f5e980 VMM/account: Sorted imports …
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    19
from VirtualMailManager.emailaddress import EmailAddress
404
0c52094447b0 VMM/{account,domain}: Added a versions check to the update_quotalimit
Pascal Volk <neverseen@users.sourceforge.net>
parents: 390
diff changeset
    20
from VirtualMailManager.errors import VMMError, AccountError as AErr
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
    21
from VirtualMailManager.maillocation import MailLocation
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
    22
from VirtualMailManager.password import pwhash
442
abcd73f5e980 VMM/account: Sorted imports …
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    23
from VirtualMailManager.quotalimit import QuotaLimit
abcd73f5e980 VMM/account: Sorted imports …
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    24
from VirtualMailManager.transport import Transport
444
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
    25
from VirtualMailManager.serviceset import ServiceSet
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    26
444
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
    27
__all__ = ('Account', 'get_account_by_uid')
225
a51809f7940b VMM/Transport: reworked Transport class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
    28
a51809f7940b VMM/Transport: reworked Transport class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
    29
_ = lambda msg: msg
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
    30
cfg_dget = lambda option: None
225
a51809f7940b VMM/Transport: reworked Transport class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
    31
a51809f7940b VMM/Transport: reworked Transport class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
    32
121
7ccc05774118 Converted to new-style class, added __slots__, updated queries.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 115
diff changeset
    33
class Account(object):
3
a9b44e04bf01 * VirtualMailManager/Account.py:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 0
diff changeset
    34
    """Class to manage e-mail accounts."""
293
a77b67673aa6 VMM/Account: replaced attribute _mid : int by _mail : MailLocation.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
    35
    __slots__ = ('_addr', '_dbh', '_domain', '_mail', '_new', '_passwd',
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
    36
                 '_qlimit', '_services', '_transport', '_note', '_uid')
216
0c8c053b451c Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
    37
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    38
    def __init__(self, dbh, address):
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    39
        """Creates a new Account instance.
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    40
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    41
        When an account with the given *address* could be found in the
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    42
        database all relevant data will be loaded.
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    43
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    44
        Arguments:
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    45
694
b1bfd4d1d9c0 Dropped pyPgSQL support.
Pascal Volk <user@localhost.localdomain.org>
parents: 691
diff changeset
    46
        `dbh` : psycopg2._psycopg.connection
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    47
          A database connection for the database access.
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
    48
        `address` : VirtualMailManager.EmailAddress.EmailAddress
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    49
          The e-mail address of the (new) Account.
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    50
        """
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    51
        if not isinstance(address, EmailAddress):
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    52
            raise TypeError("Argument 'address' is not an EmailAddress")
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    53
        self._addr = address
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    54
        self._dbh = dbh
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    55
        self._domain = Domain(self._dbh, self._addr.domainname)
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    56
        if not self._domain.gid:
341
6709d0faf2f5 VMM/…: Unified messages and removed non-ASCII quotes.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 338
diff changeset
    57
            # TP: Hm, what “quotation marks” should be used?
6709d0faf2f5 VMM/…: Unified messages and removed non-ASCII quotes.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 338
diff changeset
    58
            # If you are unsure have a look at:
6709d0faf2f5 VMM/…: Unified messages and removed non-ASCII quotes.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 338
diff changeset
    59
            # http://en.wikipedia.org/wiki/Quotation_mark,_non-English_usage
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
    60
            raise AErr(_("The domain '%s' does not exist.") %
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    61
                       self._addr.domainname, NO_SUCH_DOMAIN)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    62
        self._uid = 0
293
a77b67673aa6 VMM/Account: replaced attribute _mid : int by _mail : MailLocation.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
    63
        self._mail = None
531
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
    64
        self._qlimit = None
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
    65
        self._services = None
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
    66
        self._transport = None
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
    67
        self._note = None
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    68
        self._passwd = None
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    69
        self._new = True
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    70
        self._load()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    71
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
    72
    def __bool__(self):
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
    73
        """Returns `True` if the Account is known, `False` if it's new."""
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
    74
        return not self._new
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
    75
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    76
    def _load(self):
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
    77
        """Load 'uid', 'mid', 'qid', 'ssid', 'tid' and 'note' from the
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
    78
        database and set _new to `False` - if the user could be found. """
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    79
        dbc = self._dbh.cursor()
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
    80
        dbc.execute('SELECT uid, mid, qid, ssid, tid, note FROM users '
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
    81
                    'WHERE gid = %s AND local_part = %s',
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
    82
                    (self._domain.gid, self._addr.localpart))
9
e3d3dbeb5b84 * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 8
diff changeset
    83
        result = dbc.fetchone()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    84
        dbc.close()
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
    85
        if result:
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
    86
            self._uid, _mid, _qid, _ssid, _tid, _note = result
531
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
    87
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
    88
            def load_helper(ctor, own, field, dbresult):
638
0de0b9e75c9f VMM: Partial PEP-308-ification.
Pascal Volk <user@localhost.localdomain.org>
parents: 614
diff changeset
    89
                cur = None if own is None else getattr(own, field)
531
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
    90
                if cur != dbresult:
559
cc0f67f99780 VMM: The Python 2.4.x compatibility commit.
Pascal Volk <user@localhost.localdomain.org>
parents: 543
diff changeset
    91
                    kwargs = {field: dbresult}
cc0f67f99780 VMM: The Python 2.4.x compatibility commit.
Pascal Volk <user@localhost.localdomain.org>
parents: 543
diff changeset
    92
                    if dbresult is None:
cc0f67f99780 VMM: The Python 2.4.x compatibility commit.
Pascal Volk <user@localhost.localdomain.org>
parents: 543
diff changeset
    93
                        return dbresult
cc0f67f99780 VMM: The Python 2.4.x compatibility commit.
Pascal Volk <user@localhost.localdomain.org>
parents: 543
diff changeset
    94
                    else:
cc0f67f99780 VMM: The Python 2.4.x compatibility commit.
Pascal Volk <user@localhost.localdomain.org>
parents: 543
diff changeset
    95
                        return ctor(self._dbh, **kwargs)
531
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
    96
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
    97
            self._qlimit = load_helper(QuotaLimit, self._qlimit, 'qid', _qid)
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
    98
            self._services = load_helper(ServiceSet, self._services, 'ssid',
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
    99
                                         _ssid)
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   100
            self._transport = load_helper(Transport, self._transport, 'tid',
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   101
                                          _tid)
306
504fd29b4712 VMM/Account: s/prefix/mbformat/ and pass the dbh to MailLocation.__init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 302
diff changeset
   102
            self._mail = MailLocation(self._dbh, mid=_mid)
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   103
            self._note = _note
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   104
            self._new = False
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   105
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   106
    def _set_uid(self):
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   107
        """Set the unique ID for the new Account."""
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   108
        assert self._uid == 0
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   109
        dbc = self._dbh.cursor()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   110
        dbc.execute("SELECT nextval('users_uid')")
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   111
        self._uid = dbc.fetchone()[0]
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   112
        dbc.close()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   113
9
e3d3dbeb5b84 * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 8
diff changeset
   114
    def _prepare(self, maillocation):
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   115
        """Check and set different attributes - before we store the
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   116
        information in the database.
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   117
        """
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   118
        if maillocation.dovecot_version > cfg_dget('misc.dovecot_version'):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   119
            raise AErr(_("The mailbox format '%(mbfmt)s' requires Dovecot "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   120
                         ">= v%(version)s.") % {
417
8209da83e256 VMM: Updated some messages. (doesn't, isn't) -> (does not, is not)
Pascal Volk <neverseen@users.sourceforge.net>
parents: 404
diff changeset
   121
                       'mbfmt': maillocation.mbformat,
306
504fd29b4712 VMM/Account: s/prefix/mbformat/ and pass the dbh to MailLocation.__init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 302
diff changeset
   122
                       'version': version_str(maillocation.dovecot_version)},
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   123
                       INVALID_MAIL_LOCATION)
613
7b3494f1a2ef VMM/account: Fixed account's transport check.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   124
        transport = self._transport or self._domain.transport
614
1ec3497a6733 VMM: Moved transport-validation to common.
Pascal Volk <user@localhost.localdomain.org>
parents: 613
diff changeset
   125
        validate_transport(transport, maillocation)
293
a77b67673aa6 VMM/Account: replaced attribute _mid : int by _mail : MailLocation.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   126
        self._mail = maillocation
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   127
        self._set_uid()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   128
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   129
    def _update_tables(self, column, value):
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   130
        """Update various columns in the users table.
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   131
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   132
        Arguments:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   133
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   134
        `column` : basestring
444
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   135
          Name of the table column. Currently: qid, ssid and tid
670
f374ef062c94 VMM/*: Post-2to3 fix. Updated some error messages/comments.
Pascal Volk <user@localhost.localdomain.org>
parents: 662
diff changeset
   136
        `value` : int
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   137
          The referenced key
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   138
        """
444
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   139
        if column not in ('qid', 'ssid', 'tid'):
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   140
            raise ValueError('Unknown column: %r' % column)
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   141
        dbc = self._dbh.cursor()
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   142
        dbc.execute('UPDATE users SET %s = %%s WHERE uid = %%s' % column,
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   143
                    (value, self._uid))
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   144
        if dbc.rowcount > 0:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   145
            self._dbh.commit()
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   146
        dbc.close()
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   147
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   148
    def _count_aliases(self):
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   149
        """Count all alias addresses where the destination address is the
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   150
        address of the Account."""
66
995d538a6eb5 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 65
diff changeset
   151
        dbc = self._dbh.cursor()
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 341
diff changeset
   152
        dbc.execute('SELECT COUNT(destination) FROM alias WHERE destination '
374
ecdba68c7a2c VMM/account: Account._count_aliases() cast the EmailAddress to str,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 366
diff changeset
   153
                    '= %s', (str(self._addr),))
66
995d538a6eb5 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 65
diff changeset
   154
        a_count = dbc.fetchone()[0]
995d538a6eb5 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 65
diff changeset
   155
        dbc.close()
995d538a6eb5 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 65
diff changeset
   156
        return a_count
995d538a6eb5 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 65
diff changeset
   157
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   158
    def _chk_state(self):
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   159
        """Raise an AccountError if the Account is new - not yet saved in the
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   160
        database."""
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   161
        if self._new:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   162
            raise AErr(_("The account '%s' does not exist.") % self._addr,
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   163
                       NO_SUCH_ACCOUNT)
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   164
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   165
    @property
250
73cd082cd724 VMM/{Account,Alias,Relocated}: added a address property to the classes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 246
diff changeset
   166
    def address(self):
73cd082cd724 VMM/{Account,Alias,Relocated}: added a address property to the classes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 246
diff changeset
   167
        """The Account's EmailAddress instance."""
73cd082cd724 VMM/{Account,Alias,Relocated}: added a address property to the classes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 246
diff changeset
   168
        return self._addr
73cd082cd724 VMM/{Account,Alias,Relocated}: added a address property to the classes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 246
diff changeset
   169
73cd082cd724 VMM/{Account,Alias,Relocated}: added a address property to the classes
Pascal Volk <neverseen@users.sourceforge.net>
parents: 246
diff changeset
   170
    @property
329
41789df75339 VMM/account: Replaced property domain_directory by domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   171
    def domain(self):
41789df75339 VMM/account: Replaced property domain_directory by domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   172
        """The Domain to which the Account belongs to."""
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   173
        if self._domain:
329
41789df75339 VMM/account: Replaced property domain_directory by domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   174
            return self._domain
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   175
        return None
38
c44ea4526546 * 'VirtualMailManager/Alias.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   176
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   177
    @property
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   178
    def gid(self):
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   179
        """The Account's group ID."""
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   180
        if self._domain:
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   181
            return self._domain.gid
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   182
        return None
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   183
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   184
    @property
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   185
    def home(self):
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   186
        """The Account's home directory."""
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   187
        if not self._new:
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   188
            return '%s/%s' % (self._domain.directory, self._uid)
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   189
        return None
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   190
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   191
    @property
293
a77b67673aa6 VMM/Account: replaced attribute _mid : int by _mail : MailLocation.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   192
    def mail_location(self):
a77b67673aa6 VMM/Account: replaced attribute _mid : int by _mail : MailLocation.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   193
        """The Account's MailLocation."""
a77b67673aa6 VMM/Account: replaced attribute _mid : int by _mail : MailLocation.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   194
        return self._mail
a77b67673aa6 VMM/Account: replaced attribute _mid : int by _mail : MailLocation.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   195
a77b67673aa6 VMM/Account: replaced attribute _mid : int by _mail : MailLocation.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   196
    @property
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   197
    def note(self):
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   198
        """The Account's note."""
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   199
        return self._note
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   200
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   201
    @property
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   202
    def uid(self):
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   203
        """The Account's unique ID."""
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   204
        return self._uid
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   205
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   206
    def set_password(self, password):
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   207
        """Set a password for the new Account.
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   208
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   209
        If you want to update the password of an existing Account use
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   210
        Account.modify().
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   211
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   212
        Argument:
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   213
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   214
        `password` : basestring
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   215
          The password for the new Account.
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   216
        """
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   217
        if not self._new:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   218
            raise AErr(_("The account '%s' already exists.") % self._addr,
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   219
                       ACCOUNT_EXISTS)
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   220
        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
   221
            raise AErr(_("Could not accept password: '%s'") % password,
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   222
                       ACCOUNT_MISSING_PASSWORD)
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   223
        self._passwd = password
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   224
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   225
    def set_note(self, note):
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   226
        """Set the account's (optional) note.
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   227
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   228
        Argument:
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   229
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   230
        `note` : basestring or None
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   231
          The note, or None to remove
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   232
        """
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   233
        assert note is None or isinstance(note, str)
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   234
        self._note = note
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   235
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   236
    def save(self):
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   237
        """Save the new Account in the database."""
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   238
        if not self._new:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   239
            raise AErr(_("The account '%s' already exists.") % self._addr,
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   240
                       ACCOUNT_EXISTS)
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   241
        if not self._passwd:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   242
            raise AErr(_("No password set for account: '%s'") % self._addr,
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   243
                       ACCOUNT_MISSING_PASSWORD)
306
504fd29b4712 VMM/Account: s/prefix/mbformat/ and pass the dbh to MailLocation.__init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 302
diff changeset
   244
        self._prepare(MailLocation(self._dbh, mbfmt=cfg_dget('mailbox.format'),
504fd29b4712 VMM/Account: s/prefix/mbformat/ and pass the dbh to MailLocation.__init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 302
diff changeset
   245
                                   directory=cfg_dget('mailbox.root')))
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   246
        dbc = self._dbh.cursor()
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 341
diff changeset
   247
        dbc.execute('INSERT INTO users (local_part, passwd, uid, gid, mid, '
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   248
                    'qid, ssid, tid, note) '
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   249
                    'VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)',
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 341
diff changeset
   250
                    (self._addr.localpart,
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 341
diff changeset
   251
                     pwhash(self._passwd, user=self._addr), self._uid,
638
0de0b9e75c9f VMM: Partial PEP-308-ification.
Pascal Volk <user@localhost.localdomain.org>
parents: 614
diff changeset
   252
                     self._domain.gid, self._mail.mid,
0de0b9e75c9f VMM: Partial PEP-308-ification.
Pascal Volk <user@localhost.localdomain.org>
parents: 614
diff changeset
   253
                     self._qlimit.qid if self._qlimit else None,
0de0b9e75c9f VMM: Partial PEP-308-ification.
Pascal Volk <user@localhost.localdomain.org>
parents: 614
diff changeset
   254
                     self._services.ssid if self._services else None,
0de0b9e75c9f VMM: Partial PEP-308-ification.
Pascal Volk <user@localhost.localdomain.org>
parents: 614
diff changeset
   255
                     self._transport.tid if self._transport else None,
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   256
                     self._note))
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   257
        self._dbh.commit()
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   258
        dbc.close()
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   259
        self._new = False
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   260
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   261
    def modify(self, field, value):
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   262
        """Update the Account's *field* to the new *value*.
128
cf8116625866 Converted VirtualMailManager and Postconf to new-style classes.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 121
diff changeset
   263
726
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   264
        Possible values for *field* are: 'name' and 'note'.
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   265
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   266
        Arguments:
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   267
726
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   268
        `field` : str
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   269
          The attribute name: 'name', or 'note'
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   270
        `value` : str
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   271
          The new value of the attribute.
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   272
        """
726
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   273
        if field not in ('name', 'note'):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   274
            raise AErr(_("Unknown field: '%s'") % field, INVALID_ARGUMENT)
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   275
        self._chk_state()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   276
        dbc = self._dbh.cursor()
726
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   277
        dbc.execute('UPDATE users SET %s = %%s WHERE uid = %%s' % field,
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   278
                    (value, self._uid))
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   279
        if dbc.rowcount > 0:
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   280
            self._dbh.commit()
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   281
        dbc.close()
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   282
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   283
    def update_password(self, password, scheme=None):
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   284
        """Update the Account's password.
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   285
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   286
        The given *password* will be hashed using password.pwhash.
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   287
        When no *scheme* is specified, the configured scheme
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   288
        (misc.password_scheme) will be used.
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   289
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   290
        Arguments:
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   291
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   292
        `password' : str
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   293
          The Account's new plain text password
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   294
        `scheme' : str
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   295
          The password scheme used for password hashing; default None
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   296
        """
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   297
        self._chk_state()
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   298
        dbc = self._dbh.cursor()
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   299
        dbc.execute('UPDATE users SET passwd = %s WHERE uid = %s',
46b37d7c848a VMM/account: Added method Account.update_password.
Pascal Volk <user@localhost.localdomain.org>
parents: 711
diff changeset
   300
                    (pwhash(password, scheme, self._addr), self.uid))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   301
        if dbc.rowcount > 0:
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   302
            self._dbh.commit()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   303
        dbc.close()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   304
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   305
    def update_quotalimit(self, quotalimit):
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   306
        """Update the user's quota limit.
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   307
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   308
        Arguments:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   309
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   310
        `quotalimit` : VirtualMailManager.quotalimit.QuotaLimit
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   311
          the new quota limit of the domain.
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   312
        """
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   313
        self._chk_state()
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   314
        if quotalimit == self._qlimit:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   315
            return
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   316
        self._qlimit = quotalimit
531
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   317
        if quotalimit is not None:
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   318
            assert isinstance(quotalimit, QuotaLimit)
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   319
            quotalimit = quotalimit.qid
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   320
        self._update_tables('qid', quotalimit)
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   321
444
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   322
    def update_serviceset(self, serviceset):
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   323
        """Assign a different set of services to the Account.
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   324
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   325
        Argument:
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   326
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   327
        `serviceset` : VirtualMailManager.serviceset.ServiceSet
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   328
          the new service set.
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   329
        """
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   330
        self._chk_state()
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   331
        if serviceset == self._services:
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   332
            return
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   333
        self._services = serviceset
531
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   334
        if serviceset is not None:
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   335
            assert isinstance(serviceset, ServiceSet)
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   336
            serviceset = serviceset.ssid
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   337
        self._update_tables('ssid', serviceset)
444
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   338
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   339
    def update_transport(self, transport):
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   340
        """Sets a new transport for the Account.
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   341
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   342
        Arguments:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   343
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   344
        `transport` : VirtualMailManager.transport.Transport
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   345
          the new transport
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   346
        """
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   347
        self._chk_state()
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   348
        if transport == self._transport:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   349
            return
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   350
        self._transport = transport
531
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   351
        if transport is not None:
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   352
            assert isinstance(transport, Transport)
614
1ec3497a6733 VMM: Moved transport-validation to common.
Pascal Volk <user@localhost.localdomain.org>
parents: 613
diff changeset
   353
            validate_transport(transport, self._mail)
531
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   354
            transport = transport.tid
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   355
        self._update_tables('tid', transport)
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   356
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   357
    def _get_info_transport(self):
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   358
        if self._transport:
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   359
            return self._transport.transport
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   360
        return format_domain_default(self._domain.transport.transport)
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   361
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   362
    def _get_info_serviceset(self):
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   363
        if self._services:
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   364
            services = self._services.services
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   365
            fmt = lambda s: s
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   366
        else:
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   367
            services = self._domain.serviceset.services
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   368
            fmt = format_domain_default
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   369
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   370
        ret = {}
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   371
        for service, state in services.items():
531
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   372
            # TP: A service (e.g. pop3 or imap) may be enabled/usable or
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   373
            # disabled/unusable for a user.
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   374
            ret[service] = fmt((_('disabled'), _('enabled'))[state])
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   375
        return ret
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   376
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   377
    def get_info(self):
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   378
        """Returns a dict with some information about the Account.
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   379
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   380
        The keys of the dict are: 'address', 'gid', 'home', 'imap'
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 389
diff changeset
   381
        'mail_location', 'name', 'pop3', 'sieve', 'smtp', transport', 'uid',
532
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
   382
        'uq_bytes', 'uq_messages', 'ql_bytes', 'ql_messages', and
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
   383
        'ql_domaindefault'.
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   384
        """
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   385
        self._chk_state()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   386
        dbc = self._dbh.cursor()
444
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   387
        dbc.execute('SELECT name, CASE WHEN bytes IS NULL THEN 0 ELSE bytes '
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   388
                    'END, CASE WHEN messages IS NULL THEN 0 ELSE messages END '
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   389
                    'FROM users LEFT JOIN userquota USING (uid) WHERE '
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   390
                    'users.uid = %s', (self._uid,))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   391
        info = dbc.fetchone()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   392
        dbc.close()
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   393
        if info:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   394
            info = dict(list(zip(('name', 'uq_bytes', 'uq_messages'), info)))
531
cf3eb03c1c4f Modify Account class to handle NULL references
martin f. krafft <madduck@madduck.net>
parents: 528
diff changeset
   395
            info.update(self._get_info_serviceset())
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   396
            info['address'] = self._addr
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   397
            info['gid'] = self._domain.gid
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   398
            info['home'] = '%s/%s' % (self._domain.directory, self._uid)
293
a77b67673aa6 VMM/Account: replaced attribute _mid : int by _mail : MailLocation.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   399
            info['mail_location'] = self._mail.mail_location
532
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
   400
            if self._qlimit:
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
   401
                info['ql_bytes'] = self._qlimit.bytes
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
   402
                info['ql_messages'] = self._qlimit.messages
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
   403
                info['ql_domaindefault'] = False
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
   404
            else:
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
   405
                info['ql_bytes'] = self._domain.quotalimit.bytes
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
   406
                info['ql_messages'] = self._domain.quotalimit.messages
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
   407
                info['ql_domaindefault'] = True
2bb40aaef94e Modify userinfo output to indicate when domain defaults are displayed
martin f. krafft <madduck@madduck.net>
parents: 531
diff changeset
   408
            info['transport'] = self._get_info_transport()
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 532
diff changeset
   409
            info['note'] = self._note
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   410
            info['uid'] = self._uid
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   411
            return info
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   412
        # nearly impossible‽
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   413
        raise AErr(_("Could not fetch information for account: '%s'") %
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 276
diff changeset
   414
                   self._addr, NO_SUCH_ACCOUNT)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   415
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   416
    def get_aliases(self):
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   417
        """Return a list with all alias e-mail addresses, whose destination
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   418
        is the address of the Account."""
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   419
        self._chk_state()
90
1734eb5101c6 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 82
diff changeset
   420
        dbc = self._dbh.cursor()
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 276
diff changeset
   421
        dbc.execute("SELECT address ||'@'|| domainname FROM alias, "
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 276
diff changeset
   422
                    "domain_name WHERE destination = %s AND domain_name.gid = "
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 276
diff changeset
   423
                    "alias.gid AND domain_name.is_primary ORDER BY address",
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 341
diff changeset
   424
                    (str(self._addr),))
90
1734eb5101c6 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 82
diff changeset
   425
        addresses = dbc.fetchall()
1734eb5101c6 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 82
diff changeset
   426
        dbc.close()
1734eb5101c6 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 82
diff changeset
   427
        aliases = []
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   428
        if addresses:
144
4c6aa6c29dd7 Small optimizations in Account.getAliases() and Alias.getInfo().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   429
            aliases = [alias[0] for alias in addresses]
90
1734eb5101c6 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 82
diff changeset
   430
        return aliases
1734eb5101c6 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 82
diff changeset
   431
333
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 329
diff changeset
   432
    def delete(self, force=False):
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   433
        """Delete the Account from the database.
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   434
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   435
        Argument:
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   436
333
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 329
diff changeset
   437
        `force` : bool
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 329
diff changeset
   438
          if *force* is `True`, all aliases, which points to the Account,
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 329
diff changeset
   439
          will be also deleted.  If there are aliases and *force* is
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   440
          `False`, an AccountError will be raised.
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   441
        """
333
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 329
diff changeset
   442
        if not isinstance(force, bool):
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 329
diff changeset
   443
            raise TypeError('force must be a bool')
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   444
        self._chk_state()
66
995d538a6eb5 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 65
diff changeset
   445
        dbc = self._dbh.cursor()
333
1ed85e696748 VMM/{account,handler}: Account delete, use the boolean keyword force too.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 329
diff changeset
   446
        if force:
661
29295afafa91 VMM/account: Fixed a typo in Account.delete().
Pascal Volk <user@localhost.localdomain.org>
parents: 614
diff changeset
   447
            dbc.execute('DELETE FROM users WHERE uid = %s', (self._uid,))
65
5506433db9a3 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 55
diff changeset
   448
            # delete also all aliases where the destination address is the same
5506433db9a3 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 55
diff changeset
   449
            # as for this account.
114
e671210b04b8 Fixed a libpq.OperationalError in Account.delete()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 113
diff changeset
   450
            dbc.execute("DELETE FROM alias WHERE destination = %s",
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 341
diff changeset
   451
                        (str(self._addr),))
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   452
            self._dbh.commit()
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   453
        else:  # check first for aliases
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   454
            a_count = self._count_aliases()
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   455
            if a_count > 0:
66
995d538a6eb5 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 65
diff changeset
   456
                dbc.close()
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   457
                raise AErr(_("There are %(count)d aliases with the "
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   458
                             "destination address '%(address)s'.") %
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   459
                           {'count': a_count, 'address': self._addr},
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   460
                           ALIAS_PRESENT)
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 341
diff changeset
   461
            dbc.execute('DELETE FROM users WHERE uid = %s', (self._uid,))
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   462
            self._dbh.commit()
66
995d538a6eb5 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 65
diff changeset
   463
        dbc.close()
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   464
        self._new = True
293
a77b67673aa6 VMM/Account: replaced attribute _mid : int by _mail : MailLocation.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   465
        self._uid = 0
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   466
        self._addr = self._dbh = self._domain = self._passwd = None
444
95275b61ff8a VMM/account: Integrated class ServiceSet in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 442
diff changeset
   467
        self._mail = self._qlimit = self._services = self._transport = None
19
bf9a03c476fc * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 17
diff changeset
   468
225
a51809f7940b VMM/Transport: reworked Transport class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
   469
252
af555e6967c8 VMM/Account: renamed function getAccountByID -> get_account_by_uid.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 250
diff changeset
   470
def get_account_by_uid(uid, dbh):
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   471
    """Search an Account by its UID.
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   472
252
af555e6967c8 VMM/Account: renamed function getAccountByID -> get_account_by_uid.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 250
diff changeset
   473
    This function returns a dict (keys: 'address', 'gid' and 'uid'), if an
af555e6967c8 VMM/Account: renamed function getAccountByID -> get_account_by_uid.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 250
diff changeset
   474
    Account with the given *uid* exists.
af555e6967c8 VMM/Account: renamed function getAccountByID -> get_account_by_uid.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 250
diff changeset
   475
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   476
    Argument:
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   477
670
f374ef062c94 VMM/*: Post-2to3 fix. Updated some error messages/comments.
Pascal Volk <user@localhost.localdomain.org>
parents: 662
diff changeset
   478
    `uid` : int
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   479
      The Account unique ID.
694
b1bfd4d1d9c0 Dropped pyPgSQL support.
Pascal Volk <user@localhost.localdomain.org>
parents: 691
diff changeset
   480
    `dbh` : psycopg2._psycopg.connection
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   481
      a database connection for the database access.
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   482
    """
19
bf9a03c476fc * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 17
diff changeset
   483
    try:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   484
        uid = int(uid)
19
bf9a03c476fc * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 17
diff changeset
   485
    except ValueError:
670
f374ef062c94 VMM/*: Post-2to3 fix. Updated some error messages/comments.
Pascal Volk <user@localhost.localdomain.org>
parents: 662
diff changeset
   486
        raise AErr(_('UID must be an integer.'), INVALID_ARGUMENT)
19
bf9a03c476fc * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 17
diff changeset
   487
    if uid < 1:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   488
        raise AErr(_('UID must be greater than 0.'), INVALID_ARGUMENT)
19
bf9a03c476fc * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 17
diff changeset
   489
    dbc = dbh.cursor()
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 276
diff changeset
   490
    dbc.execute("SELECT local_part||'@'|| domain_name.domainname AS address, "
543
1b3bdce0bf87 Include account note in getuser output
martin f. krafft <madduck@madduck.net>
parents: 539
diff changeset
   491
                "uid, users.gid, note FROM users LEFT JOIN domain_name ON "
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 276
diff changeset
   492
                "(domain_name.gid = users.gid AND is_primary) WHERE uid = %s",
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 341
diff changeset
   493
                (uid,))
19
bf9a03c476fc * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 17
diff changeset
   494
    info = dbc.fetchone()
bf9a03c476fc * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 17
diff changeset
   495
    dbc.close()
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   496
    if not info:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   497
        raise AErr(_("There is no account with the UID: '%d'") % uid,
245
f9a6b6701cf9 VMM/Account: reworked class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 236
diff changeset
   498
                   NO_SUCH_ACCOUNT)
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 638
diff changeset
   499
    info = dict(list(zip(('address', 'uid', 'gid', 'note'), info)))
19
bf9a03c476fc * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 17
diff changeset
   500
    return info
bf9a03c476fc * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 17
diff changeset
   501
275
524f7ed5ad5b VMM/Account: some modifications and small improvements in class Account.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 266
diff changeset
   502
del _, cfg_dget