aboutsummaryrefslogtreecommitdiffstats
path: root/lang/python/tests/support.py
blob: a381270d203299bb944dc5949c86b920abf1d27d (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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# Copyright (C) 2016 g10 Code GmbH
#
# This file is part of GPGME.
#
# GPGME 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 2 of the License, or
# (at your option) any later version.
#
# GPGME 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 Lesser General
# Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, see <http://www.gnu.org/licenses/>.

from __future__ import absolute_import, print_function, unicode_literals
del absolute_import, print_function, unicode_literals

import contextlib
import shutil
import sys
import os
import tempfile
import time
import gpg

# known keys
alpha = "A0FF4590BB6122EDEF6E3C542D727CC768697734"
bob = "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2"
encrypt_only = "F52770D5C4DB41408D918C9F920572769B9FE19C"
sign_only = "7CCA20CCDE5394CEE71C9F0BFED153F12F18F45D"
no_such_key = "A" * 40

def make_filename(name):
    return os.path.join(os.environ['top_srcdir'], 'tests', 'gpg', name)

def in_srcdir(name):
    return os.path.join(os.environ['srcdir'], name)

def init_gpgme(proto):
    gpg.core.engine_check_version(proto)

verbose = int(os.environ.get('verbose', 0)) > 1
def print_data(data):
    if verbose:
        try:
            # See if it is a file-like object.
            data.seek(0, os.SEEK_SET)
            data = data.read()
        except:
            # Hope for the best.
            pass

        if hasattr(sys.stdout, "buffer"):
            sys.stdout.buffer.write(data)
        else:
            sys.stdout.write(data)

def mark_key_trusted(ctx, key):
    class Editor(object):
        def __init__(self):
            self.steps = ["trust", "save"]
        def edit(self, status, args, out):
            if args == "keyedit.prompt":
                result = self.steps.pop(0)
            elif args == "edit_ownertrust.value":
                result = "5"
            elif args == "edit_ownertrust.set_ultimate.okay":
                result = "Y"
            elif args == "keyedit.save.okay":
                result = "Y"
            else:
                result = None
            return result
    with gpg.Data() as sink:
        ctx.op_edit(key, Editor().edit, sink, sink)


# Python2/3 compatibility
if hasattr(tempfile, "TemporaryDirectory"):
    # Python3.2 and up
    TemporaryDirectory = tempfile.TemporaryDirectory
else:
    class TemporaryDirectory(object):
        def __enter__(self):
            self.path = tempfile.mkdtemp()
            return self.path
        def __exit__(self, *args):
            shutil.rmtree(self.path)

@contextlib.contextmanager
def EphemeralContext():
    with TemporaryDirectory() as tmp:
        home = os.environ['GNUPGHOME']
        shutil.copy(os.path.join(home, "gpg.conf"), tmp)
        shutil.copy(os.path.join(home, "gpg-agent.conf"), tmp)

        with gpg.Context(home_dir=tmp) as ctx:
            yield ctx

            # Ask the agent to quit.
            agent_socket = os.path.join(tmp, "S.gpg-agent")
            ctx.protocol = gpg.constants.protocol.ASSUAN
            ctx.set_engine_info(ctx.protocol, file_name=agent_socket)
            ctx.assuan_transact(["KILLAGENT"])

            # Block until it is really gone.
            while os.path.exists(agent_socket):
                time.sleep(.01)