python: Support manipulating the TOFU policy.
[gpgme.git] / lang / python / tests / t-quick-key-manipulation.py
1 #!/usr/bin/env python
2
3 # Copyright (C) 2017 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 gpg
24
25 import support
26
27 alpha = "Alpha <alpha@invalid.example.net>"
28 bravo = "Bravo <bravo@invalid.example.net>"
29
30 with support.EphemeralContext() as ctx:
31     res = ctx.create_key(alpha, certify=True)
32     key = ctx.get_key(res.fpr)
33     assert len(key.subkeys) == 1, "Expected one primary key and no subkeys"
34     assert len(key.uids) == 1, "Expected exactly one UID"
35
36     def get_uid(uid):
37         key = ctx.get_key(res.fpr)
38         for u in key.uids:
39             if u.uid == uid:
40                 return u
41         return None
42
43     # sanity check
44     uid = get_uid(alpha)
45     assert uid, "UID alpha not found"
46     assert uid.revoked == 0
47
48     # add bravo
49     ctx.key_add_uid(key, bravo)
50     uid = get_uid(bravo)
51     assert uid, "UID bravo not found"
52     assert uid.revoked == 0
53
54     # revoke alpha
55     ctx.key_revoke_uid(key, alpha)
56     uid = get_uid(alpha)
57     assert uid, "UID alpha not found"
58     assert uid.revoked == 1
59     uid = get_uid(bravo)
60     assert uid, "UID bravo not found"
61     assert uid.revoked == 0
62
63     # try to revoke the last UID
64     try:
65         ctx.key_revoke_uid(key, alpha)
66         # IMHO this should fail.  issue2961.
67         # assert False, "Expected an error but got none"
68     except gpg.errors.GpgError:
69         pass
70
71     # Everything should be the same
72     uid = get_uid(alpha)
73     assert uid, "UID alpha not found"
74     assert uid.revoked == 1
75     uid = get_uid(bravo)
76     assert uid, "UID bravo not found"
77     assert uid.revoked == 0
78
79     # try to revoke a non-existent UID
80     try:
81         ctx.key_revoke_uid(key, "i dont exist")
82         # IMHO this should fail.  issue2963.
83         # assert False, "Expected an error but got none"
84     except gpg.errors.GpgError:
85         pass
86
87     # try to add an pre-existent UID
88     try:
89         ctx.key_add_uid(key, bravo)
90         assert False, "Expected an error but got none"
91     except gpg.errors.GpgError:
92         pass
93
94     # Check setting the TOFU policy.
95     with open("gpg.conf", "a") as handle:
96         handle.write("trust-model tofu+pgp\n")
97
98     for name, policy in [(name, getattr(gpg.constants.tofu.policy, name))
99                          for name in filter(lambda x: not x.startswith('__'),
100                                             dir(gpg.constants.tofu.policy))]:
101         if policy == gpg.constants.tofu.policy.NONE:
102             # We must not set the policy to NONE.
103             continue
104
105         ctx.key_tofu_policy(key, policy)
106
107         keys = list(ctx.keylist(key.uids[0].uid,
108                                 mode=(gpg.constants.keylist.mode.LOCAL
109                                       |gpg.constants.keylist.mode.WITH_TOFU)))
110         assert len(keys) == 1
111
112         if policy == gpg.constants.tofu.policy.AUTO:
113             # We cannot check that it is set to AUTO.
114             continue
115
116         for uid in keys[0].uids:
117             if uid.uid == alpha:
118                 # TOFU information of revoked UIDs is not updated.
119                 # XXX: Is that expected?
120                 continue
121             assert uid.tofu[0].policy == policy, \
122                 "Expected policy {0} ({1}), got {2}".format(policy, name,
123                                                             uid.tofu[0].policy)