From 04627f08992741f1d1a859fc8b74aa84e42cfe07 Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Tue, 6 Mar 2018 11:02:39 +0200 Subject: [PATCH] gpg: collect OPTIONs from agent --- libagent/gpg/agent.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/libagent/gpg/agent.py b/libagent/gpg/agent.py index 892e1f2..04e3182 100644 --- a/libagent/gpg/agent.py +++ b/libagent/gpg/agent.py @@ -80,21 +80,19 @@ class AgentStop(Exception): class Handler(object): """GPG agent requests' handler.""" + # pylint: disable=too-many-instance-attributes def __init__(self, device, pubkey_bytes): """C-tor.""" self.client = client.Client(device=device) - # Cache ASSUAN commands' arguments between commands - self.keygrip = None - self.digest = None - self.algo = None # Cache public keys from GnuPG self.pubkey_bytes = pubkey_bytes # "Clone" existing GPG version self.version = keyring.gpg_version() + self.reset() self.handlers = { - b'RESET': None, - b'OPTION': None, + b'RESET': lambda *_: self.reset(), + b'OPTION': lambda _, args: self.handle_option(*args), b'SETKEYDESC': None, b'NOP': None, b'GETINFO': lambda conn, _: keyring.sendline(conn, b'D ' + self.version), @@ -109,6 +107,18 @@ class Handler(object): b'SCD': self.handle_scd, } + def reset(self): + """Reset agent's state variables.""" + self.keygrip = None + self.digest = None + self.algo = None + self.options = [] + + def handle_option(self, opt): + """Store GPG agent-related options (e.g. for pinentry).""" + self.options.append(opt) + log.debug('options: %s', self.options) + def handle_scd(self, conn, args): """No support for smart-card device protocol.""" reply = {