python: Fix skipping tests if running with GnuPG < 2.1.12.
[gpgme.git] / lang / python / tests / t-sig-notation.py
1 #!/usr/bin/env python
2
3 # Copyright (C) 2016 g10 Code GmbH
4 #
5 # This file is part of GPGME.
6 #
7 # GPGME is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
11 #
12 # GPGME is distributed in the hope that it will be useful, but WITHOUT
13 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
15 # Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this program; if not, see <http://www.gnu.org/licenses/>.
19
20 from __future__ import absolute_import, print_function, unicode_literals
21 del absolute_import, print_function, unicode_literals
22
23 import os
24 import gpg
25 import support
26 _ = support # to appease pyflakes.
27
28 expected_notations = {
29     "laughing@me": ("Just Squeeze Me", gpg.constants.sig.notation.HUMAN_READABLE),
30     "preferred-email-encoding@pgp.com": ("pgpmime",
31                                          gpg.constants.sig.notation.HUMAN_READABLE
32                                          | gpg.constants.sig.notation.CRITICAL),
33     None: ("http://www.gnu.org/policy/", 0),
34 }
35
36 # GnuPG prior to 2.1.13 did not report the critical flag correctly.
37 with gpg.Context() as c:
38     version = c.engine_info.version
39     have_correct_sig_data = not (version.startswith("1.")
40                                  or version.startswith("2.0.")
41                                  or version == "2.1.1"
42                                  or (version.startswith("2.1.1")
43                                      and version[5] < '3'))
44
45 def check_result(result):
46     assert len(result.signatures) == 1, "Unexpected number of signatures"
47     sig = result.signatures[0]
48     assert len(sig.notations) == len(expected_notations)
49
50     for r in sig.notations:
51         assert not 'name_len' in dir(r)
52         assert not 'value_len' in dir(r)
53         assert r.name in expected_notations
54         value, flags = expected_notations.pop(r.name)
55
56         assert r.value == value, \
57             "Expected {!r}, got {!r}".format(value, r.value)
58         assert r.human_readable \
59             == bool(flags & gpg.constants.sig.notation.HUMAN_READABLE)
60         assert r.critical \
61             == (bool(flags & gpg.constants.sig.notation.CRITICAL)
62                 if have_correct_sig_data else False)
63
64     assert len(expected_notations) == 0
65
66 source = gpg.Data("Hallo Leute\n")
67 signed = gpg.Data()
68
69 c = gpg.Context()
70 for name, (value, flags) in expected_notations.items():
71     c.sig_notation_add(name, value, flags)
72
73 c.op_sign(source, signed, gpg.constants.sig.mode.NORMAL)
74
75 signed.seek(0, os.SEEK_SET)
76 sink = gpg.Data()
77 c.op_verify(signed, None, sink)
78 result = c.op_verify_result()
79 check_result(result)