diff options
| author | J08nY | 2017-08-10 01:28:31 +0200 |
|---|---|---|
| committer | J08nY | 2017-08-10 01:28:31 +0200 |
| commit | c3aba5bef7652b9fad509ba52a795c119646fff7 (patch) | |
| tree | dfb1c00347c99b2a541dc3650889a4886338a98a /src/mailman_pgp/database | |
| parent | 22a688b4f0579b1e1e51b4164934fe2afc357671 (diff) | |
| download | mailman-pgp-c3aba5bef7652b9fad509ba52a795c119646fff7.tar.gz mailman-pgp-c3aba5bef7652b9fad509ba52a795c119646fff7.tar.zst mailman-pgp-c3aba5bef7652b9fad509ba52a795c119646fff7.zip | |
Basic `key sign` command implementation.
Diffstat (limited to 'src/mailman_pgp/database')
| -rw-r--r-- | src/mailman_pgp/database/types.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/mailman_pgp/database/types.py b/src/mailman_pgp/database/types.py new file mode 100644 index 0000000..e86fb9f --- /dev/null +++ b/src/mailman_pgp/database/types.py @@ -0,0 +1,57 @@ +# 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/>. +from public import public +from sqlalchemy import Integer, TypeDecorator + + +@public +class EnumFlag(TypeDecorator): + """Simple bitwise flag from an `enum.Enum`, assumes it is unique.""" + impl = Integer + + def __init__(self, enum, *args, **kw): + super().__init__(*args, **kw) + self.enum = enum + + def process_bind_param(self, value, dialect): + # value is a set/frozenset of Enums. + if value is None: + return None + if not isinstance(value, (set, frozenset)): + raise ValueError + + int_value = 0 + for enum in reversed(self.enum): + int_value = int_value << 1 + if enum in value: + int_value += 1 + + return int_value + + def process_result_value(self, value, dialect): + # value is an integer. + if value is None: + return None + if value == 0: + return frozenset() + result = set() + for enum in self.enum: + if value % 2 == 1: + result.add(enum) + value = value >> 1 + + return frozenset(result) |
