VirtualMailManager/config.py
author Pascal Volk <neverseen@users.sourceforge.net>
Mon, 17 Jan 2011 14:43:35 +0000
branchv0.6.x
changeset 367 a6ad9895989d
parent 366 d6573da35b5f
child 384 d3a97f7fb98a
permissions -rw-r--r--
VMM/emailaddress: Added class DestinationEmailAddress.
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 -*-
366
d6573da35b5f Updated copyright notices to include the year 2011.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 359
diff changeset
     2
# Copyright (c) 2007 - 2011, Pascal Volk
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
     3
# See COPYING for distribution information.
200
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
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.config
301
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
     6
    ~~~~~~~~~~~~~~~~~~~~~~~~~
200
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
     7
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
     8
    VMM's configuration module for simplified configuration access.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
     9
"""
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    10
187
38b9a9859749 VMM/{,cli/Cli}Config: Moved interactive stuff to new CliConfig class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
    11
from ConfigParser import \
38b9a9859749 VMM/{,cli/Cli}Config: Moved interactive stuff to new CliConfig class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
    12
     Error, MissingSectionHeaderError, NoOptionError, NoSectionError, \
38b9a9859749 VMM/{,cli/Cli}Config: Moved interactive stuff to new CliConfig class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
    13
     ParsingError, RawConfigParser
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
    14
from cStringIO import StringIO
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 180
diff changeset
    15
348
ca7575401549 VMM/config: Use common.VERSION_RE, instead of defining the regexp two times.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 342
diff changeset
    16
from VirtualMailManager.common import VERSION_RE, \
326
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
    17
     exec_ok, expand_path, get_unicode, lisdir, version_hex
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 304
diff changeset
    18
from VirtualMailManager.constants import CONF_ERROR
287
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
    19
from VirtualMailManager.errors import ConfigError, VMMError
301
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
    20
from VirtualMailManager.maillocation import known_format
287
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
    21
from VirtualMailManager.password import verify_scheme as _verify_scheme
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    22
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
    23
DB_MUDULES = ('psycopg2', 'pypgsql')
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
    24
DB_SSL_MODES = ('allow', 'disabled', 'prefer', 'require', 'verify-ca',
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
    25
                'verify-full')
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    26
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
    27
_ = lambda msg: msg
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
    28
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
    29
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    30
class BadOptionError(Error):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    31
    """Raised when a option isn't in the format 'section.option'."""
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    32
    pass
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    33
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    34
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    35
class ConfigValueError(Error):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    36
    """Raised when creating or validating of new values fails."""
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    37
    pass
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    38
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    39
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    40
class NoDefaultError(Error):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    41
    """Raised when the requested option has no default value."""
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    42
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    43
    def __init__(self, section, option):
204
83938336c518 VMM/{,cli/}Config: fixed imports. Small code cleanups and cosmetic.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 201
diff changeset
    44
        Error.__init__(self, 'Option %r in section %r has no default value' %
83938336c518 VMM/{,cli/}Config: fixed imports. Small code cleanups and cosmetic.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 201
diff changeset
    45
                             (option, section))
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    46
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    47
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    48
class LazyConfig(RawConfigParser):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    49
    """The **lazy** derivate of the `RawConfigParser`.
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 180
diff changeset
    50
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    51
    There are two additional getters:
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 180
diff changeset
    52
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
    53
    `pget()`
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
    54
      The polymorphic getter, which returns a option's value with the
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
    55
      appropriate type.
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
    56
    `dget()`
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
    57
      Like `LazyConfig.pget()`, but returns the option's default, from
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
    58
      `LazyConfig._cfg['sectionname']['optionname'].default`, if the
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
    59
      option is not configured in a ini-like configuration file.
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    60
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
    61
    `set()` differs from `RawConfigParser`'s `set()` method. `set()`
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
    62
    takes the `section` and `option` arguments combined to a single
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
    63
    string in the form "section.option".
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    64
    """
204
83938336c518 VMM/{,cli/}Config: fixed imports. Small code cleanups and cosmetic.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 201
diff changeset
    65
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    66
    def __init__(self):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    67
        RawConfigParser.__init__(self)
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    68
        self._modified = False
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
    69
        # sample _cfg dict.  Create your own in your derived class.
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    70
        self._cfg = {
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    71
            'sectionname': {
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
    72
                'optionname': LazyConfigOption(int, 1, self.getint),
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    73
            }
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    74
        }
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    75
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    76
    def bool_new(self, value):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    77
        """Converts the string `value` into a `bool` and returns it.
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    78
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
    79
        | '1', 'on', 'yes' and 'true' will become `True`
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
    80
        | '0', 'off', 'no' and 'false' will become `False`
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    81
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
    82
        Throws a `ConfigValueError` for all other values, except bools.
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    83
        """
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    84
        if isinstance(value, bool):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    85
            return value
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    86
        if value.lower() in self._boolean_states:
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    87
            return self._boolean_states[value.lower()]
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    88
        else:
204
83938336c518 VMM/{,cli/}Config: fixed imports. Small code cleanups and cosmetic.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 201
diff changeset
    89
            raise ConfigValueError(_(u"Not a boolean: '%s'") %
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    90
                                   get_unicode(value))
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
    91
206
da07dd944ad1 VMM/Config: renamed LazyConfig's get_boolean() to getboolean().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 204
diff changeset
    92
    def getboolean(self, section, option):
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
    93
        """Returns the boolean value of the option, in the given
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
    94
        section.
206
da07dd944ad1 VMM/Config: renamed LazyConfig's get_boolean() to getboolean().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 204
diff changeset
    95
da07dd944ad1 VMM/Config: renamed LazyConfig's get_boolean() to getboolean().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 204
diff changeset
    96
        For a boolean True, the value must be set to '1', 'on', 'yes',
da07dd944ad1 VMM/Config: renamed LazyConfig's get_boolean() to getboolean().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 204
diff changeset
    97
        'true' or True. For a boolean False, the value must set to '0',
da07dd944ad1 VMM/Config: renamed LazyConfig's get_boolean() to getboolean().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 204
diff changeset
    98
        'off', 'no', 'false' or False.
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
    99
        If the option has another value assigned this method will raise
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   100
        a ValueError.
206
da07dd944ad1 VMM/Config: renamed LazyConfig's get_boolean() to getboolean().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 204
diff changeset
   101
        """
da07dd944ad1 VMM/Config: renamed LazyConfig's get_boolean() to getboolean().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 204
diff changeset
   102
        # if the setting was modified it may be still a boolean value lets see
da07dd944ad1 VMM/Config: renamed LazyConfig's get_boolean() to getboolean().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 204
diff changeset
   103
        tmp = self.get(section, option)
da07dd944ad1 VMM/Config: renamed LazyConfig's get_boolean() to getboolean().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 204
diff changeset
   104
        if isinstance(tmp, bool):
204
83938336c518 VMM/{,cli/}Config: fixed imports. Small code cleanups and cosmetic.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 201
diff changeset
   105
            return tmp
211
0b129678cfe1 VMM/Config: LazyConfig.getboolean(), convert the value in our getboolean.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 209
diff changeset
   106
        if not tmp.lower() in self._boolean_states:
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   107
            raise ValueError('Not a boolean: %s' % tmp)
211
0b129678cfe1 VMM/Config: LazyConfig.getboolean(), convert the value in our getboolean.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 209
diff changeset
   108
        return self._boolean_states[tmp.lower()]
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   109
187
38b9a9859749 VMM/{,cli/Cli}Config: Moved interactive stuff to new CliConfig class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
   110
    def _get_section_option(self, section_option):
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   111
        """splits ``section_option`` (section.option) in two parts and
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   112
        returns them as list ``[section, option]``, if:
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   113
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   114
          * it likes the format of ``section_option``
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   115
          * the ``section`` is known
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   116
          * the ``option`` is known
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   117
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   118
        Else one of the following exceptions will be thrown:
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   119
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   120
          * `BadOptionError`
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   121
          * `NoSectionError`
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   122
          * `NoOptionError`
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 180
diff changeset
   123
        """
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   124
        sect_opt = section_option.lower().split('.')
200
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   125
        # TODO: cache it
342
b0c971f943dc VMM/config: LazyConfig._get_section_option check for empty section/option names.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 326
diff changeset
   126
        if len(sect_opt) != 2 or not sect_opt[0] or not sect_opt[1]:
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 287
diff changeset
   127
            raise BadOptionError(_(u"Bad format: '%s' - expected: "
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 287
diff changeset
   128
                                   u"section.option") %
204
83938336c518 VMM/{,cli/}Config: fixed imports. Small code cleanups and cosmetic.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 201
diff changeset
   129
                                 get_unicode(section_option))
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   130
        if not sect_opt[0] in self._cfg:
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   131
            raise NoSectionError(sect_opt[0])
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   132
        if not sect_opt[1] in self._cfg[sect_opt[0]]:
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   133
            raise NoOptionError(sect_opt[1], sect_opt[0])
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   134
        return sect_opt
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   135
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   136
    def items(self, section):
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   137
        """returns an iterable that returns key, value ``tuples`` from
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   138
        the given ``section``.
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   139
        """
264
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   140
        if section in self._sections:  # check if the section was parsed
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   141
            sect = self._sections[section]
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   142
        elif not section in self._cfg:
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   143
            raise NoSectionError(section)
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   144
        else:
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   145
            return ((k, self._cfg[section][k].default) \
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   146
                    for k in self._cfg[section].iterkeys())
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   147
        # still here? Get defaults and merge defaults with configured setting
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   148
        defaults = dict((k, self._cfg[section][k].default) \
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   149
                        for k in self._cfg[section].iterkeys())
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   150
        defaults.update(sect)
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   151
        if '__name__' in defaults:
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   152
            del defaults['__name__']
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   153
        return defaults.iteritems()
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   154
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   155
    def dget(self, option):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   156
        """Returns the value of the `option`.
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 180
diff changeset
   157
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   158
        If the option could not be found in the configuration file, the
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   159
        configured default value, from ``LazyConfig._cfg`` will be
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   160
        returned.
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 180
diff changeset
   161
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   162
        Arguments:
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 180
diff changeset
   163
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   164
        `option` : string
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   165
            the configuration option in the form "section.option"
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   166
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   167
        Throws a `NoDefaultError`, if no default value was passed to
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   168
        `LazyConfigOption.__init__()` for the `option`.
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   169
        """
187
38b9a9859749 VMM/{,cli/Cli}Config: Moved interactive stuff to new CliConfig class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
   170
        section, option = self._get_section_option(option)
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   171
        try:
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   172
            return self._cfg[section][option].getter(section, option)
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   173
        except (NoSectionError, NoOptionError):
264
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   174
            if not self._cfg[section][option].default is None:  # may be False
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   175
                return self._cfg[section][option].default
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   176
            else:
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   177
                raise NoDefaultError(section, option)
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   178
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   179
    def pget(self, option):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   180
        """Returns the value of the `option`."""
187
38b9a9859749 VMM/{,cli/Cli}Config: Moved interactive stuff to new CliConfig class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
   181
        section, option = self._get_section_option(option)
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   182
        return self._cfg[section][option].getter(section, option)
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   183
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   184
    def set(self, option, value):
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   185
        """Set the `value` of the `option`.
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 180
diff changeset
   186
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   187
        Throws a `ValueError` if `value` couldn't be converted using
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   188
        `LazyConfigOption.cls`.
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   189
        """
303
8dd3a107fd92 VMM/Config: Return mailbox.{folders,root} settings as Unicode.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 301
diff changeset
   190
        # pylint: disable=W0221
216
0c8c053b451c Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 215
diff changeset
   191
        # @pylint: _L A Z Y_
187
38b9a9859749 VMM/{,cli/Cli}Config: Moved interactive stuff to new CliConfig class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
   192
        section, option = self._get_section_option(option)
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   193
        val = self._cfg[section][option].cls(value)
200
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   194
        if self._cfg[section][option].validate:
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   195
            val = self._cfg[section][option].validate(val)
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   196
        if not RawConfigParser.has_section(self, section):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   197
            self.add_section(section)
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   198
        RawConfigParser.set(self, section, option, val)
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   199
        self._modified = True
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   200
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   201
    def has_section(self, section):
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   202
        """Checks if `section` is a known configuration section."""
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 180
diff changeset
   203
        return section.lower() in self._cfg
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   204
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   205
    def has_option(self, option):
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   206
        """Checks if the option (section.option) is a known
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   207
        configuration option.
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   208
        """
303
8dd3a107fd92 VMM/Config: Return mailbox.{folders,root} settings as Unicode.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 301
diff changeset
   209
        # pylint: disable=W0221
216
0c8c053b451c Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 215
diff changeset
   210
        # @pylint: _L A Z Y_
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   211
        try:
187
38b9a9859749 VMM/{,cli/Cli}Config: Moved interactive stuff to new CliConfig class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
   212
            self._get_section_option(option)
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   213
            return True
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   214
        except(BadOptionError, NoSectionError, NoOptionError):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   215
            return False
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   216
207
95be8f62bc0c VMM/Config: moved Config.sections() to class LazyConfig.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 206
diff changeset
   217
    def sections(self):
95be8f62bc0c VMM/Config: moved Config.sections() to class LazyConfig.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 206
diff changeset
   218
        """Returns an iterator object for all configuration sections."""
95be8f62bc0c VMM/Config: moved Config.sections() to class LazyConfig.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 206
diff changeset
   219
        return self._cfg.iterkeys()
95be8f62bc0c VMM/Config: moved Config.sections() to class LazyConfig.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 206
diff changeset
   220
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   221
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   222
class LazyConfigOption(object):
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   223
    """A simple container class for configuration settings.
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   224
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   225
    `LazyConfigOption` instances are required by `LazyConfig` instances,
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   226
    and instances of classes derived from `LazyConfig`, like the
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   227
    `Config` class.
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   228
    """
200
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   229
    __slots__ = ('__cls', '__default', '__getter', '__validate')
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   230
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   231
    def __init__(self, cls, default, getter, validate=None):
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   232
        """Creates a new `LazyConfigOption` instance.
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   233
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   234
        Arguments:
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   235
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   236
        `cls` : type
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   237
          The class/type of the option's value
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   238
        `default`
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   239
          Default value of the option. Use ``None`` if the option should
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   240
          not have a default value.
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   241
        `getter` : callable
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   242
          A method's name of `RawConfigParser` and derived classes, to
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   243
          get a option's value, e.g. `self.getint`.
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   244
        `validate` : NoneType or a callable
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   245
          None or any method, that takes one argument, in order to
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   246
          check the value, when `LazyConfig.set()` is called.
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   247
        """
200
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   248
        self.__cls = cls
264
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   249
        if not default is None:  # enforce the type of the default value
201
dbb0f7ed7858 VMM/Config: LazyConfigOption.__init__() cast 'default' to 'cls'.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 200
diff changeset
   250
            self.__default = self.__cls(default)
dbb0f7ed7858 VMM/Config: LazyConfigOption.__init__() cast 'default' to 'cls'.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 200
diff changeset
   251
        else:
dbb0f7ed7858 VMM/Config: LazyConfigOption.__init__() cast 'default' to 'cls'.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 200
diff changeset
   252
            self.__default = default
200
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   253
        if not callable(getter):
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   254
            raise TypeError('getter has to be a callable, got a %r' %
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   255
                            getter.__class__.__name__)
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   256
        self.__getter = getter
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   257
        if validate and not callable(validate):
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   258
            raise TypeError('validate has to be callable or None, got a %r' %
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   259
                            validate.__class__.__name__)
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   260
        self.__validate = validate
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   261
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   262
    @property
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   263
    def cls(self):
303
8dd3a107fd92 VMM/Config: Return mailbox.{folders,root} settings as Unicode.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 301
diff changeset
   264
        """The class of the option's value e.g. `str`, `unicode` or `bool`."""
200
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   265
        return self.__cls
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   266
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   267
    @property
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   268
    def default(self):
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   269
        """The option's default value, may be `None`"""
200
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   270
        return self.__default
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   271
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   272
    @property
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   273
    def getter(self):
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   274
        """The getter method or function to get the option's value"""
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   275
        return self.__getter
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   276
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   277
    @property
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   278
    def validate(self):
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   279
        """A method or function to validate the value"""
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   280
        return self.__validate
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   281
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   282
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   283
class Config(LazyConfig):
188
cf1b5f22dbd2 VMM/Handler: __init__ accepts now a config_type ('default'||'cli').
Pascal Volk <neverseen@users.sourceforge.net>
parents: 187
diff changeset
   284
    """This class is for reading vmm's configuration file."""
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   285
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   286
    def __init__(self, filename):
49
9bd033177377 * 'VirtualMailManager/Config.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 48
diff changeset
   287
        """Creates a new Config instance
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   288
120
928659c8ee9f Comments updated.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 113
diff changeset
   289
        Arguments:
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 180
diff changeset
   290
209
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   291
        `filename` : str
c705a9e38962 VMM{/Config}: reduced docstrings. Added doc to the repository.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 207
diff changeset
   292
          path to the configuration file
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   293
        """
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   294
        LazyConfig.__init__(self)
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   295
        self._cfg_filename = filename
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   296
        self._cfg_file = None
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   297
        self._missing = {}
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   298
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   299
        LCO = LazyConfigOption
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   300
        bool_t = self.bool_new
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   301
        self._cfg = {
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   302
            'account': {
206
da07dd944ad1 VMM/Config: renamed LazyConfig's get_boolean() to getboolean().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 204
diff changeset
   303
                'delete_directory': LCO(bool_t, False, self.getboolean),
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   304
                'directory_mode': LCO(int, 448, self.getint),
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   305
                'disk_usage': LCO(bool_t, False, self.getboolean),
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   306
                'password_length': LCO(int, 8, self.getint),
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   307
                'random_password': LCO(bool_t, False, self.getboolean),
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   308
                'imap': LCO(bool_t, True, self.getboolean),
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   309
                'pop3': LCO(bool_t, True, self.getboolean),
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   310
                'sieve': LCO(bool_t, True, self.getboolean),
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   311
                'smtp': LCO(bool_t, True, self.getboolean),
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   312
            },
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   313
            'bin': {
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   314
                'dovecotpw': LCO(str, '/usr/sbin/dovecotpw', self.get,
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   315
                                 exec_ok),
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   316
                'du': LCO(str, '/usr/bin/du', self.get, exec_ok),
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   317
                'postconf': LCO(str, '/usr/sbin/postconf', self.get, exec_ok),
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   318
            },
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   319
            'database': {
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   320
                'host': LCO(str, 'localhost', self.get),
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   321
                'module': LCO(str, 'psycopg2', self.get, check_db_module),
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   322
                'name': LCO(str, 'mailsys', self.get),
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   323
                'pass': LCO(str, None, self.get),
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   324
                'port': LCO(int, 5432, self.getint),
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   325
                'sslmode': LCO(str, 'prefer', self.get, check_db_ssl_mode),
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   326
                'user': LCO(str, None, self.get),
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   327
            },
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   328
            'domain': {
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   329
                'auto_postmaster': LCO(bool_t, True, self.getboolean),
206
da07dd944ad1 VMM/Config: renamed LazyConfig's get_boolean() to getboolean().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 204
diff changeset
   330
                'delete_directory': LCO(bool_t, False, self.getboolean),
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   331
                'directory_mode': LCO(int, 504, self.getint),
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   332
                'force_deletion': LCO(bool_t, False, self.getboolean),
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   333
            },
229
0fb2f12648a7 vmm.cfg: renamed maildir.folders to mailbox.folders. maildir.name
Pascal Volk <neverseen@users.sourceforge.net>
parents: 216
diff changeset
   334
            'mailbox': {
303
8dd3a107fd92 VMM/Config: Return mailbox.{folders,root} settings as Unicode.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 301
diff changeset
   335
                'folders': LCO(str, 'Drafts:Sent:Templates:Trash',
8dd3a107fd92 VMM/Config: Return mailbox.{folders,root} settings as Unicode.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 301
diff changeset
   336
                               self.unicode),
301
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   337
                'format': LCO(str, 'maildir', self.get, check_mailbox_format),
303
8dd3a107fd92 VMM/Config: Return mailbox.{folders,root} settings as Unicode.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 301
diff changeset
   338
                'root': LCO(str, 'Maildir', self.unicode),
304
df0f7b22540c VMM/Config: Added boolean option mailbox.subscribe.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 303
diff changeset
   339
                'subscribe': LCO(bool_t, True, self.getboolean),
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   340
            },
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   341
            'misc': {
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   342
                'base_directory': LCO(str, '/srv/mail', self.get, is_dir),
291
7ef3f117a230 VMM/password: adapted Blowfish/SHA-256/SHA-512 crypt() to recent
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   343
                'crypt_blowfish_rounds': LCO(int, 5, self.getint),
7ef3f117a230 VMM/password: adapted Blowfish/SHA-256/SHA-512 crypt() to recent
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   344
                'crypt_sha256_rounds': LCO(int, 5000, self.getint),
7ef3f117a230 VMM/password: adapted Blowfish/SHA-256/SHA-512 crypt() to recent
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   345
                'crypt_sha512_rounds': LCO(int, 5000, self.getint),
286
e2046d47688b VMM/Config: removed the default value of misc.dovecot_version.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 284
diff changeset
   346
                'dovecot_version': LCO(str, None, self.hexversion,
264
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   347
                                       check_version_format),
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   348
                'password_scheme': LCO(str, 'CRAM-MD5', self.get,
287
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   349
                                       verify_scheme),
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   350
                'transport': LCO(str, 'dovecot:', self.get),
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   351
            },
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   352
        }
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   353
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   354
    def load(self):
120
928659c8ee9f Comments updated.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 113
diff changeset
   355
        """Loads the configuration, read only.
928659c8ee9f Comments updated.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 113
diff changeset
   356
216
0c8c053b451c Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 215
diff changeset
   357
        Raises a ConfigError if the configuration syntax is
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   358
        invalid.
120
928659c8ee9f Comments updated.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 113
diff changeset
   359
        """
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   360
        try:
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   361
            self._cfg_file = open(self._cfg_filename, 'r')
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   362
            self.readfp(self._cfg_file)
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   363
        except (MissingSectionHeaderError, ParsingError), err:
216
0c8c053b451c Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 215
diff changeset
   364
            raise ConfigError(str(err), CONF_ERROR)
175
b241272eb1bd VMM/VMM: allow configure subcommand also with missing settings.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 174
diff changeset
   365
        finally:
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   366
            if self._cfg_file and not self._cfg_file.closed:
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   367
                self._cfg_file.close()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   368
2
9b39f828aa8a * 'VirtualMailManager/Exceptions.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 0
diff changeset
   369
    def check(self):
120
928659c8ee9f Comments updated.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 113
diff changeset
   370
        """Performs a configuration check.
128
cf8116625866 Converted VirtualMailManager and Postconf to new-style classes.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 120
diff changeset
   371
264
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   372
        Raises a ConfigError if settings w/o a default value are missed.
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   373
        Or some settings have a invalid value.
120
928659c8ee9f Comments updated.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 113
diff changeset
   374
        """
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   375
        def iter_dict():
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   376
            for section, options in self._missing.iteritems():
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   377
                errmsg.write(_(u'* Section: %s\n') % section)
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   378
                errmsg.writelines(u'    %s\n' % option for option in options)
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   379
            self._missing.clear()
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   380
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   381
        errmsg = None
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   382
        self._chk_non_default()
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   383
        miss_vers = 'misc' in self._missing and \
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   384
                    'dovecot_version' in self._missing['misc']
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   385
        if self._missing:
2
9b39f828aa8a * 'VirtualMailManager/Exceptions.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 0
diff changeset
   386
            errmsg = StringIO()
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   387
            errmsg.write(_(u'Check of configuration file %s failed.\n') %
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   388
                         self._cfg_filename)
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   389
            errmsg.write(_(u'Missing options, which have no default value.\n'))
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   390
            iter_dict()
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   391
        self._chk_possible_values(miss_vers)
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   392
        if self._missing:
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   393
            if not errmsg:
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   394
                errmsg = StringIO()
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   395
                errmsg.write(_(u'Check of configuration file %s failed.\n') %
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   396
                             self._cfg_filename)
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   397
                errmsg.write(_(u'Invalid configuration values.\n'))
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   398
            else:
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   399
                errmsg.write('\n' + _(u'Invalid configuration values.\n'))
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   400
            iter_dict()
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   401
        if errmsg:
216
0c8c053b451c Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 215
diff changeset
   402
            raise ConfigError(errmsg.getvalue(), CONF_ERROR)
264
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   403
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   404
    def hexversion(self, section, option):
272
446483386914 VMM/Config: Added method Config.install() -> global cfg_dget().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 270
diff changeset
   405
        """Converts the version number (e.g.: 1.2.3) from the *option*'s
446483386914 VMM/Config: Added method Config.install() -> global cfg_dget().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 270
diff changeset
   406
        value to an int."""
264
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   407
        return version_hex(self.get(section, option))
2
9b39f828aa8a * 'VirtualMailManager/Exceptions.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 0
diff changeset
   408
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   409
    def unicode(self, section, option):
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   410
        """Returns the value of the `option` from `section`, converted
287
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   411
        to Unicode."""
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   412
        return get_unicode(self.get(section, option))
69
0c124160a991 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 68
diff changeset
   413
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   414
    def _chk_non_default(self):
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   415
        """Checks all section's options for settings w/o a default
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   416
        value. Missing items will be stored in _missing.
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   417
        """
174
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   418
        for section in self._cfg.iterkeys():
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   419
            missing = []
974bafa59330 VMM/Config: reworked configuration handling.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 173
diff changeset
   420
            for option, value in self._cfg[section].iteritems():
187
38b9a9859749 VMM/{,cli/Cli}Config: Moved interactive stuff to new CliConfig class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
   421
                if (value.default is None and
38b9a9859749 VMM/{,cli/Cli}Config: Moved interactive stuff to new CliConfig class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
   422
                    not RawConfigParser.has_option(self, section, option)):
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   423
                    missing.append(option)
200
983cf98d5881 VMM/Config: attributes of class LazyConfigOption are read-only now.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 188
diff changeset
   424
            if missing:
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   425
                self._missing[section] = missing
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   426
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   427
    def _chk_possible_values(self, miss_vers):
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   428
        """Check settings for which the possible values are known."""
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   429
        if not miss_vers:
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   430
            value = self.get('misc', 'dovecot_version')
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   431
            if not VERSION_RE.match(value):
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   432
                self._missing['misc'] = ['version: ' +\
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   433
                        _(u"Not a valid Dovecot version: '%s'") % value]
359
7fa919dab42c VMM/config: Added option mailbox.format to the configuration check.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 353
diff changeset
   434
        # section database
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   435
        db_err = []
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   436
        value = self.dget('database.module').lower()
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   437
        if value not in DB_MUDULES:
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   438
            db_err.append('module: ' + \
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   439
                          _(u"Unsupported database module: '%s'") % value)
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   440
        if value == 'psycopg2':
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   441
            value = self.dget('database.sslmode')
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   442
            if value not in DB_SSL_MODES:
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   443
                db_err.append('sslmode: ' + \
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   444
                              _(u"Unknown pgsql SSL mode: '%s'") % value)
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   445
        if db_err:
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   446
            self._missing['database'] = db_err
359
7fa919dab42c VMM/config: Added option mailbox.format to the configuration check.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 353
diff changeset
   447
        # section mailbox
7fa919dab42c VMM/config: Added option mailbox.format to the configuration check.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 353
diff changeset
   448
        value = self.dget('mailbox.format')
7fa919dab42c VMM/config: Added option mailbox.format to the configuration check.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 353
diff changeset
   449
        if not known_format(value):
7fa919dab42c VMM/config: Added option mailbox.format to the configuration check.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 353
diff changeset
   450
            self._missing['mailbox'] = ['format: ' +\
7fa919dab42c VMM/config: Added option mailbox.format to the configuration check.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 353
diff changeset
   451
                              _(u"Unsupported mailbox format: '%s'") % value]
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   452
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   453
326
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
   454
def is_dir(path):
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
   455
    """Check if the expanded path is a directory.  When the expanded path
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
   456
    is a directory the expanded path will be returned.  Otherwise a
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
   457
    ConfigValueError will be raised.
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
   458
    """
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
   459
    path = expand_path(path)
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
   460
    if lisdir(path):
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
   461
        return path
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
   462
    raise ConfigValueError(_(u"No such directory: %s") % get_unicode(path))
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
   463
8f8d9c4c8332 VMM/common: Replaced function is_dir() by lisdir().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 322
diff changeset
   464
353
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   465
def check_db_module(module):
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   466
    """Check if the *module* is a supported pgsql module."""
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   467
    if module.lower() in DB_MUDULES:
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   468
        return module
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   469
    raise ConfigValueError(_(u"Unsupported database module: '%s'") %
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   470
                           get_unicode(module))
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   471
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   472
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   473
def check_db_ssl_mode(ssl_mode):
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   474
    """Check if the *ssl_mode* is one of the SSL modes, known by pgsql."""
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   475
    if ssl_mode in DB_SSL_MODES:
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   476
        return ssl_mode
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   477
    raise ConfigValueError(_(u"Unknown pgsql SSL mode: '%s'") %
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   478
                           get_unicode(ssl_mode))
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   479
2ae40cd0d213 VMM/config: Extended configuration check and raise only a ConfigError.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 348
diff changeset
   480
301
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   481
def check_mailbox_format(format):
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   482
    """
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   483
    Check if the mailbox format *format* is supported.  When the *format*
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   484
    is supported it will be returned, otherwise a `ConfigValueError` will
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   485
    be raised.
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   486
    """
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   487
    format = format.lower()
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   488
    if known_format(format):
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   489
        return format
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   490
    raise ConfigValueError(_(u"Unsupported mailbox format: '%s'") %
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   491
                           get_unicode(format))
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   492
e1d3f027dd64 VMM/Config: Added function check_mailbox_format().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 298
diff changeset
   493
264
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   494
def check_version_format(version_string):
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   495
    """Check if the *version_string* has the proper format, e.g.: '1.2.3'.
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   496
    Returns the validated version string if it has the expected format.
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   497
    Otherwise a `ConfigValueError` will be raised.
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   498
    """
348
ca7575401549 VMM/config: Use common.VERSION_RE, instead of defining the regexp two times.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 342
diff changeset
   499
    if not VERSION_RE.match(version_string):
264
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   500
        raise ConfigValueError(_(u"Not a valid Dovecot version: '%s'") %
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   501
                               get_unicode(version_string))
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   502
    return version_string
04fea4d8b900 Use the complete Dovecot version, not only the concatenated major
Pascal Volk <neverseen@users.sourceforge.net>
parents: 262
diff changeset
   503
287
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   504
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   505
def verify_scheme(scheme):
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   506
    """Checks if the password scheme *scheme* can be accepted and returns
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   507
    the verified scheme.
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   508
    """
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   509
    try:
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   510
        scheme, encoding = _verify_scheme(scheme)
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   511
    except VMMError, err:  # 'cast' it
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   512
        raise ConfigValueError(err.msg)
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   513
    if not encoding:
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   514
        return scheme
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   515
    return '%s.%s' % (scheme, encoding)
1e77dd639fa3 VMM/password: moved the 'scheme check' code from pwhash() to the
Pascal Volk <neverseen@users.sourceforge.net>
parents: 286
diff changeset
   516
215
33f727efa7c4 PEP-8-ified the work of the last days.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 211
diff changeset
   517
del _