aboutsummaryrefslogtreecommitdiff
path: root/src/mailman_pgp/config/validator.py
blob: 101066302490e72f6d8d47ea7baa18206a94fc7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# Copyright (C) 2017 Jan Jancar
#
# This file is a part of the Mailman PGP plugin.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# this program.  If not, see <http://www.gnu.org/licenses/>.

"""Config validation and transforms."""
import builtins
import re
from configparser import ConfigParser

from mailman.utilities.modules import find_name


class ConfigValidator:
    """Validates a ConfigParser object against a schema."""

    def __init__(self, schema):
        self.schema = ConfigParser()
        self.schema.read_string(schema)

    def validate(self, cfg):
        """

        :param cfg:
        :type cfg: ConfigParser
        """
        for section in self.schema.sections():
            assert cfg.has_section(section)
            for option in self.schema.options(section):
                assert cfg.has_option(section, option)
                self._check_option(cfg.get(section, option),
                                   self.schema.get(section, option))

    def _check_option(self, value, schema):
        call = None
        try:
            call = getattr(builtins, schema)
        except:
            try:
                call = find_name(schema)
            except:
                if len(schema) != 0:
                    def call(value):
                        match = re.search(schema, value)
                        if match is None:
                            raise ValueError
                        return match

        if call is None:
            raise ValueError
        else:
            return call(value)