1838 lines
235 KiB
HTML
1838 lines
235 KiB
HTML
|
|
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
|
|
<title>gnupg — python-gnupg 0.3.1 documentation</title>
|
|
|
|
<link rel="stylesheet" href="../_static/haiku.css" type="text/css" />
|
|
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
|
<link rel="stylesheet" href="../_static/print.css" type="text/css" />
|
|
|
|
<script type="text/javascript">
|
|
var DOCUMENTATION_OPTIONS = {
|
|
URL_ROOT: '../',
|
|
VERSION: '0.3.1',
|
|
COLLAPSE_INDEX: false,
|
|
FILE_SUFFIX: '.html',
|
|
HAS_SOURCE: true
|
|
};
|
|
</script>
|
|
<script type="text/javascript" src="../_static/jquery.js"></script>
|
|
<script type="text/javascript" src="../_static/underscore.js"></script>
|
|
<script type="text/javascript" src="../_static/doctools.js"></script>
|
|
<script type="text/javascript" src="../_static/theme_extras.js"></script>
|
|
<link rel="top" title="python-gnupg 0.3.1 documentation" href="../index.html" />
|
|
<link rel="up" title="Module code" href="index.html" />
|
|
</head>
|
|
<body>
|
|
<div class="header"><h1 class="heading"><a href="../index.html">
|
|
<span>python-gnupg 0.3.1 documentation</span></a></h1>
|
|
<h2 class="heading"><span>gnupg</span></h2>
|
|
</div>
|
|
<div class="topnav">
|
|
|
|
<p>
|
|
<a class="uplink" href="../index.html">Contents</a>
|
|
</p>
|
|
|
|
</div>
|
|
<div class="content">
|
|
|
|
|
|
<h1>Source code for gnupg</h1><div class="highlight"><pre>
|
|
<span class="c">#!/usr/bin/env python</span>
|
|
<span class="c">#-*- encoding: utf-8 -*-</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd">gnupg.py</span>
|
|
<span class="sd">========</span>
|
|
<span class="sd">A Python interface to GnuPG.</span>
|
|
|
|
<span class="sd">This is a modified version of python-gnupg-0.3.0, which was created by Vinay</span>
|
|
<span class="sd">Sajip, which itself is a modification of GPG.py written by Steve Traugott,</span>
|
|
<span class="sd">which in turn is a modification of the pycrypto GnuPG interface written by</span>
|
|
<span class="sd">A.M. Kuchling.</span>
|
|
|
|
<span class="sd">This version is patched to exclude calls to :class:`subprocess.Popen([...],</span>
|
|
<span class="sd">shell=True)`, and it also attempts to provide sanitization of arguments</span>
|
|
<span class="sd">presented to gnupg, in order to avoid potential vulnerabilities.</span>
|
|
|
|
<span class="sd">:Info: see <https://www.github.com/isislovecruft/python-gnupg></span>
|
|
<span class="sd">:Authors: A.M. Kuchling, Steve Traugott, Vinay Sajip, Isis Lovecruft</span>
|
|
<span class="sd">:Date: $Date: 2013-04-04 01:11:01 +0000 (Thursday, April 4, 2013) $</span>
|
|
<span class="sd">:Description: Documentation of python-gnupg, a Python module for GnuPG.</span>
|
|
|
|
<span class="sd">Previous Authors' Documentation:</span>
|
|
<span class="sd">--------------------------------</span>
|
|
|
|
<span class="sd">Steve Traugott's documentation:</span>
|
|
<span class="sd"> Portions of this module are derived from A.M. Kuchling's well-designed</span>
|
|
<span class="sd"> GPG.py, using Richard Jones' updated version 1.3, which can be found in</span>
|
|
<span class="sd"> the pycrypto CVS repository on Sourceforge:</span>
|
|
|
|
<span class="sd"> http://pycrypto.cvs.sourceforge.net/viewvc/pycrypto/gpg/GPG.py</span>
|
|
|
|
<span class="sd"> This module is *not* forward-compatible with amk's; some of the old</span>
|
|
<span class="sd"> interface has changed. For instance, since I've added decrypt</span>
|
|
<span class="sd"> functionality, I elected to initialize with a 'gpghome' argument instead</span>
|
|
<span class="sd"> of 'keyring', so that gpg can find both the public and secret keyrings.</span>
|
|
<span class="sd"> I've also altered some of the returned objects in order for the caller to</span>
|
|
<span class="sd"> not have to know as much about the internals of the result classes.</span>
|
|
|
|
<span class="sd"> While the rest of ISconf is released under the GPL, I am releasing this</span>
|
|
<span class="sd"> single file under the same terms that A.M. Kuchling used for pycrypto.</span>
|
|
|
|
<span class="sd"> Steve Traugott, stevegt@terraluna.org</span>
|
|
<span class="sd"> Thu Jun 23 21:27:20 PDT 2005</span>
|
|
|
|
<span class="sd">Vinay Sajip's documentation:</span>
|
|
<span class="sd"> This version of the module has been modified from Steve Traugott's version</span>
|
|
<span class="sd"> (see http://trac.t7a.org/isconf/browser/trunk/lib/python/isconf/GPG.py) by</span>
|
|
<span class="sd"> Vinay Sajip to make use of the subprocess module (Steve's version uses</span>
|
|
<span class="sd"> os.fork() and so does not work on Windows). Renamed to gnupg.py to avoid</span>
|
|
<span class="sd"> confusion with the previous versions.</span>
|
|
|
|
<span class="sd"> A unittest harness (test_gnupg.py) has also been added.</span>
|
|
|
|
<span class="sd"> Modifications Copyright (C) 2008-2012 Vinay Sajip. All rights reserved.</span>
|
|
|
|
<span class="sd">"""</span>
|
|
|
|
<span class="n">__module__</span> <span class="o">=</span> <span class="s">'gnupg'</span>
|
|
<span class="n">__version__</span> <span class="o">=</span> <span class="s">"0.3.1"</span>
|
|
<span class="n">__author__</span> <span class="o">=</span> <span class="s">"Isis Agora Lovecruft"</span>
|
|
<span class="n">__date__</span> <span class="o">=</span> <span class="s">"12 Febuary 2013"</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">locale</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="kn">from</span> <span class="nn">io</span> <span class="kn">import</span> <span class="n">StringIO</span>
|
|
<span class="kn">from</span> <span class="nn">io</span> <span class="kn">import</span> <span class="n">BytesIO</span>
|
|
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
|
|
<span class="kn">from</span> <span class="nn">cStringIO</span> <span class="kn">import</span> <span class="n">StringIO</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">codecs</span>
|
|
<span class="kn">import</span> <span class="nn">locale</span>
|
|
<span class="kn">import</span> <span class="nn">logging</span>
|
|
<span class="kn">import</span> <span class="nn">os</span>
|
|
<span class="kn">import</span> <span class="nn">re</span>
|
|
<span class="kn">import</span> <span class="nn">socket</span>
|
|
<span class="kn">from</span> <span class="nn">subprocess</span> <span class="kn">import</span> <span class="n">Popen</span>
|
|
<span class="kn">from</span> <span class="nn">subprocess</span> <span class="kn">import</span> <span class="n">PIPE</span>
|
|
<span class="kn">import</span> <span class="nn">sys</span>
|
|
<span class="kn">import</span> <span class="nn">tempfile</span>
|
|
<span class="kn">import</span> <span class="nn">threading</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="kn">import</span> <span class="nn">logging.NullHandler</span> <span class="kn">as</span> <span class="nn">NullHandler</span>
|
|
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
|
|
<div class="viewcode-block" id="NullHandler"><a class="viewcode-back" href="../gnupg.html#gnupg.NullHandler">[docs]</a> <span class="k">class</span> <span class="nc">NullHandler</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Handler</span><span class="p">):</span>
|
|
<div class="viewcode-block" id="NullHandler.handle"><a class="viewcode-back" href="../gnupg.html#gnupg.NullHandler.handle">[docs]</a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
|
|
<span class="k">pass</span></div></div>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="nb">unicode</span>
|
|
<span class="n">_py3k</span> <span class="o">=</span> <span class="bp">False</span>
|
|
<span class="k">except</span> <span class="ne">NameError</span><span class="p">:</span>
|
|
<span class="n">_py3k</span> <span class="o">=</span> <span class="bp">True</span>
|
|
|
|
|
|
<span class="n">ESCAPE_PATTERN</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r'</span><span class="se">\\</span><span class="s">x([0-9a-f][0-9a-f])'</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">I</span><span class="p">)</span>
|
|
|
|
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__module__</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">logger</span><span class="o">.</span><span class="n">handlers</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">NullHandler</span><span class="p">())</span>
|
|
|
|
|
|
<div class="viewcode-block" id="ProtectedOption"><a class="viewcode-back" href="../gnupg.html#gnupg.ProtectedOption">[docs]</a><span class="k">class</span> <span class="nc">ProtectedOption</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="sd">"""Raised when the option passed to GPG is disallowed."""</span>
|
|
</div>
|
|
<div class="viewcode-block" id="UsageError"><a class="viewcode-back" href="../gnupg.html#gnupg.UsageError">[docs]</a><span class="k">class</span> <span class="nc">UsageError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="sd">"""Raised when incorrect usage of the API occurs.."""</span>
|
|
|
|
</div>
|
|
<span class="k">def</span> <span class="nf">_copy_data</span><span class="p">(</span><span class="n">instream</span><span class="p">,</span> <span class="n">outstream</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Copy data from one stream to another.</span>
|
|
|
|
<span class="sd"> :param instream: A file descriptor to read from.</span>
|
|
<span class="sd"> :param outstream: A file descriptor to write to.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">sent</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">instream</span><span class="p">,</span> <span class="n">BytesIO</span><span class="p">),</span> <span class="s">"instream is not a file"</span>
|
|
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">outstream</span><span class="p">,</span> <span class="nb">file</span><span class="p">),</span> <span class="s">"outstream is not a file"</span>
|
|
<span class="k">except</span> <span class="ne">AssertionError</span> <span class="k">as</span> <span class="n">ae</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="n">ae</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">stdin</span><span class="p">,</span> <span class="s">'encoding'</span><span class="p">):</span>
|
|
<span class="n">enc</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">encoding</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">enc</span> <span class="o">=</span> <span class="s">'ascii'</span>
|
|
|
|
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="n">instream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">break</span>
|
|
<span class="n">sent</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"sending chunk (</span><span class="si">%d</span><span class="s">): </span><span class="si">%r</span><span class="s">"</span><span class="p">,</span> <span class="n">sent</span><span class="p">,</span> <span class="n">data</span><span class="p">[:</span><span class="mi">256</span><span class="p">])</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">outstream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">UnicodeError</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">outstream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">enc</span><span class="p">))</span>
|
|
<span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s">'Error sending data: Broken pipe'</span><span class="p">)</span>
|
|
<span class="k">break</span>
|
|
<span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span>
|
|
<span class="c"># Can sometimes get 'broken pipe' errors even when the</span>
|
|
<span class="c"># data has all been sent</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s">'Error sending data: Broken pipe'</span><span class="p">)</span>
|
|
<span class="k">break</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">outstream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
<span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s">'Got IOError while trying to close FD outstream'</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"closed output, </span><span class="si">%d</span><span class="s"> bytes sent"</span><span class="p">,</span> <span class="n">sent</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_fix_unsafe</span><span class="p">(</span><span class="nb">input</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Find characters used to escape from a string into a shell, and wrap them</span>
|
|
<span class="sd"> in quotes if they exist. Regex pilfered from python-3.x shlex module.</span>
|
|
|
|
<span class="sd"> :param input: The input intended for the gnupg process.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c">## xxx do we want to add ';'?</span>
|
|
<span class="n">_unsafe</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r'[^\w@%+=:,./-]'</span><span class="p">,</span> <span class="mi">256</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">_unsafe</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="nb">input</span><span class="p">))</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">input</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">clean</span> <span class="o">=</span> <span class="s">"'"</span> <span class="o">+</span> <span class="nb">input</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">"'"</span><span class="p">,</span> <span class="s">"'</span><span class="se">\"</span><span class="s">'</span><span class="se">\"</span><span class="s">'"</span><span class="p">)</span> <span class="o">+</span> <span class="s">"'"</span>
|
|
<span class="k">return</span> <span class="n">clean</span>
|
|
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">None</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_has_readwrite</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Determine if the real uid/gid of the executing user has read and write</span>
|
|
<span class="sd"> permissions for a directory or a file.</span>
|
|
|
|
<span class="sd"> :type path: C{str}</span>
|
|
<span class="sd"> :param path: The path to the directory or file to check permissions for.</span>
|
|
|
|
<span class="sd"> :rtype: C{bool}</span>
|
|
<span class="sd"> :param: True if real uid/gid has read+write permissions, False otherwise.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">R_OK</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">W_OK</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_hyphenate</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">add_prefix</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Change underscores to hyphens so that object attributes can be easily</span>
|
|
<span class="sd"> tranlated to GPG option names.</span>
|
|
|
|
<span class="sd"> :type input: C{str}</span>
|
|
<span class="sd"> :param input: The attribute to hyphenate.</span>
|
|
|
|
<span class="sd"> :type add_prefix: C{bool}</span>
|
|
<span class="sd"> :param add_prefix: If True, add leading hyphens to the input.</span>
|
|
|
|
<span class="sd"> :rtype: C{str}</span>
|
|
<span class="sd"> :return: The :param:input with underscores changed to hyphens.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="s">'--'</span> <span class="k">if</span> <span class="n">add_prefix</span> <span class="k">else</span> <span class="s">''</span>
|
|
<span class="n">ret</span> <span class="o">+=</span> <span class="nb">input</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'_'</span><span class="p">,</span> <span class="s">'-'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ret</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_is_allowed</span><span class="p">(</span><span class="nb">input</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Check that an option or argument given to GPG is in the set of allowed</span>
|
|
<span class="sd"> options, the latter being a strict subset of the set of all options known</span>
|
|
<span class="sd"> to GPG.</span>
|
|
|
|
<span class="sd"> :type input: C{str}</span>
|
|
<span class="sd"> :param input: An input meant to be parsed as an option or flag to the GnuPG</span>
|
|
<span class="sd"> process. Should be formatted the same as an option or flag</span>
|
|
<span class="sd"> to the commandline gpg, i.e. "--encrypt-files".</span>
|
|
|
|
<span class="sd"> :type _possible: C{frozenset}</span>
|
|
<span class="sd"> :ivar _possible: All known GPG options and flags.</span>
|
|
|
|
<span class="sd"> :type _allowed: C{frozenset}</span>
|
|
<span class="sd"> :ivar _allowed: All allowed GPG options and flags, e.g. all GPG options and</span>
|
|
<span class="sd"> flags which we are willing to acknowledge and parse. If we</span>
|
|
<span class="sd"> want to support a new option, it will need to have its own</span>
|
|
<span class="sd"> parsing class and its name will need to be added to this</span>
|
|
<span class="sd"> set.</span>
|
|
|
|
<span class="sd"> :rtype: C{Exception} or C{str}</span>
|
|
<span class="sd"> :raise: UsageError if :ivar:_allowed is not a subset of :ivar:_possible.</span>
|
|
<span class="sd"> ProtectedOption if :param:input is not in the set :ivar:_allowed.</span>
|
|
<span class="sd"> :return: The original parameter :param:input, unmodified and unsanitized,</span>
|
|
<span class="sd"> if no errors occur.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">_all</span> <span class="o">=</span> <span class="p">(</span><span class="s">"""</span>
|
|
<span class="s">--allow-freeform-uid --multifile</span>
|
|
<span class="s">--allow-multiple-messages --no</span>
|
|
<span class="s">--allow-multisig-verification --no-allow-freeform-uid</span>
|
|
<span class="s">--allow-non-selfsigned-uid --no-allow-multiple-messages</span>
|
|
<span class="s">--allow-secret-key-import --no-allow-non-selfsigned-uid</span>
|
|
<span class="s">--always-trust --no-armor</span>
|
|
<span class="s">--armor --no-armour</span>
|
|
<span class="s">--armour --no-ask-cert-expire</span>
|
|
<span class="s">--ask-cert-expire --no-ask-cert-level</span>
|
|
<span class="s">--ask-cert-level --no-ask-sig-expire</span>
|
|
<span class="s">--ask-sig-expire --no-auto-check-trustdb</span>
|
|
<span class="s">--attribute-fd --no-auto-key-locate</span>
|
|
<span class="s">--attribute-file --no-auto-key-retrieve</span>
|
|
<span class="s">--auto-check-trustdb --no-batch</span>
|
|
<span class="s">--auto-key-locate --no-comments</span>
|
|
<span class="s">--auto-key-retrieve --no-default-keyring</span>
|
|
<span class="s">--batch --no-default-recipient</span>
|
|
<span class="s">--bzip2-compress-level --no-disable-mdc</span>
|
|
<span class="s">--bzip2-decompress-lowmem --no-emit-version</span>
|
|
<span class="s">--card-edit --no-encrypt-to</span>
|
|
<span class="s">--card-status --no-escape-from-lines</span>
|
|
<span class="s">--cert-digest-algo --no-expensive-trust-checks</span>
|
|
<span class="s">--cert-notation --no-expert</span>
|
|
<span class="s">--cert-policy-url --no-force-mdc</span>
|
|
<span class="s">--change-pin --no-force-v3-sigs</span>
|
|
<span class="s">--charset --no-force-v4-certs</span>
|
|
<span class="s">--check-sig --no-for-your-eyes-only</span>
|
|
<span class="s">--check-sigs --no-greeting</span>
|
|
<span class="s">--check-trustdb --no-groups</span>
|
|
<span class="s">--cipher-algo --no-literal</span>
|
|
<span class="s">--clearsign --no-mangle-dos-filenames</span>
|
|
<span class="s">--command-fd --no-mdc-warning</span>
|
|
<span class="s">--command-file --no-options</span>
|
|
<span class="s">--comment --no-permission-warning</span>
|
|
<span class="s">--completes-needed --no-pgp2</span>
|
|
<span class="s">--compress-algo --no-pgp6</span>
|
|
<span class="s">--compression-algo --no-pgp7</span>
|
|
<span class="s">--compress-keys --no-pgp8</span>
|
|
<span class="s">--compress-level --no-random-seed-file</span>
|
|
<span class="s">--compress-sigs --no-require-backsigs</span>
|
|
<span class="s">--ctapi-driver --no-require-cross-certification</span>
|
|
<span class="s">--dearmor --no-require-secmem</span>
|
|
<span class="s">--dearmour --no-rfc2440-text</span>
|
|
<span class="s">--debug --no-secmem-warning</span>
|
|
<span class="s">--debug-all --no-show-notation</span>
|
|
<span class="s">--debug-ccid-driver --no-show-photos</span>
|
|
<span class="s">--debug-level --no-show-policy-url</span>
|
|
<span class="s">--decrypt --no-sig-cache</span>
|
|
<span class="s">--decrypt-files --no-sig-create-check</span>
|
|
<span class="s">--default-cert-check-level --no-sk-comments</span>
|
|
<span class="s">--default-cert-expire --no-strict</span>
|
|
<span class="s">--default-cert-level --notation-data</span>
|
|
<span class="s">--default-comment --not-dash-escaped</span>
|
|
<span class="s">--default-key --no-textmode</span>
|
|
<span class="s">--default-keyserver-url --no-throw-keyid</span>
|
|
<span class="s">--default-preference-list --no-throw-keyids</span>
|
|
<span class="s">--default-recipient --no-tty</span>
|
|
<span class="s">--default-recipient-self --no-use-agent</span>
|
|
<span class="s">--default-sig-expire --no-use-embedded-filename</span>
|
|
<span class="s">--delete-keys --no-utf8-strings</span>
|
|
<span class="s">--delete-secret-and-public-keys --no-verbose</span>
|
|
<span class="s">--delete-secret-keys --no-version</span>
|
|
<span class="s">--desig-revoke --openpgp</span>
|
|
<span class="s">--detach-sign --options</span>
|
|
<span class="s">--digest-algo --output</span>
|
|
<span class="s">--disable-ccid --override-session-key</span>
|
|
<span class="s">--disable-cipher-algo --passphrase</span>
|
|
<span class="s">--disable-dsa2 --passphrase-fd</span>
|
|
<span class="s">--disable-mdc --passphrase-file</span>
|
|
<span class="s">--disable-pubkey-algo --passphrase-repeat</span>
|
|
<span class="s">--display --pcsc-driver</span>
|
|
<span class="s">--display-charset --personal-cipher-preferences</span>
|
|
<span class="s">--dry-run --personal-cipher-prefs</span>
|
|
<span class="s">--dump-options --personal-compress-preferences</span>
|
|
<span class="s">--edit-key --personal-compress-prefs</span>
|
|
<span class="s">--emit-version --personal-digest-preferences</span>
|
|
<span class="s">--enable-dsa2 --personal-digest-prefs</span>
|
|
<span class="s">--enable-progress-filter --pgp2</span>
|
|
<span class="s">--enable-special-filenames --pgp6</span>
|
|
<span class="s">--enarmor --pgp7</span>
|
|
<span class="s">--enarmour --pgp8</span>
|
|
<span class="s">--encrypt --photo-viewer</span>
|
|
<span class="s">--encrypt-files --pipemode</span>
|
|
<span class="s">--encrypt-to --preserve-permissions</span>
|
|
<span class="s">--escape-from-lines --primary-keyring</span>
|
|
<span class="s">--exec-path --print-md</span>
|
|
<span class="s">--exit-on-status-write-error --print-mds</span>
|
|
<span class="s">--expert --quick-random</span>
|
|
<span class="s">--export --quiet</span>
|
|
<span class="s">--export-options --reader-port</span>
|
|
<span class="s">--export-ownertrust --rebuild-keydb-caches</span>
|
|
<span class="s">--export-secret-keys --recipient</span>
|
|
<span class="s">--export-secret-subkeys --recv-keys</span>
|
|
<span class="s">--fast-import --refresh-keys</span>
|
|
<span class="s">--fast-list-mode --remote-user</span>
|
|
<span class="s">--fetch-keys --require-backsigs</span>
|
|
<span class="s">--fingerprint --require-cross-certification</span>
|
|
<span class="s">--fixed-list-mode --require-secmem</span>
|
|
<span class="s">--fix-trustdb --rfc1991</span>
|
|
<span class="s">--force-mdc --rfc2440</span>
|
|
<span class="s">--force-ownertrust --rfc2440-text</span>
|
|
<span class="s">--force-v3-sigs --rfc4880</span>
|
|
<span class="s">--force-v4-certs --run-as-shm-coprocess</span>
|
|
<span class="s">--for-your-eyes-only --s2k-cipher-algo</span>
|
|
<span class="s">--gen-key --s2k-count</span>
|
|
<span class="s">--gen-prime --s2k-digest-algo</span>
|
|
<span class="s">--gen-random --s2k-mode</span>
|
|
<span class="s">--gen-revoke --search-keys</span>
|
|
<span class="s">--gnupg --secret-keyring</span>
|
|
<span class="s">--gpg-agent-info --send-keys</span>
|
|
<span class="s">--gpgconf-list --set-filename</span>
|
|
<span class="s">--gpgconf-test --set-filesize</span>
|
|
<span class="s">--group --set-notation</span>
|
|
<span class="s">--help --set-policy-url</span>
|
|
<span class="s">--hidden-encrypt-to --show-keyring</span>
|
|
<span class="s">--hidden-recipient --show-notation</span>
|
|
<span class="s">--homedir --show-photos</span>
|
|
<span class="s">--honor-http-proxy --show-policy-url</span>
|
|
<span class="s">--ignore-crc-error --show-session-key</span>
|
|
<span class="s">--ignore-mdc-error --sig-keyserver-url</span>
|
|
<span class="s">--ignore-time-conflict --sign</span>
|
|
<span class="s">--ignore-valid-from --sign-key</span>
|
|
<span class="s">--import --sig-notation</span>
|
|
<span class="s">--import-options --sign-with</span>
|
|
<span class="s">--import-ownertrust --sig-policy-url</span>
|
|
<span class="s">--interactive --simple-sk-checksum</span>
|
|
<span class="s">--keyid-format --sk-comments</span>
|
|
<span class="s">--keyring --skip-verify</span>
|
|
<span class="s">--keyserver --status-fd</span>
|
|
<span class="s">--keyserver-options --status-file</span>
|
|
<span class="s">--lc-ctype --store</span>
|
|
<span class="s">--lc-messages --strict</span>
|
|
<span class="s">--limit-card-insert-tries --symmetric</span>
|
|
<span class="s">--list-config --temp-directory</span>
|
|
<span class="s">--list-key --textmode</span>
|
|
<span class="s">--list-keys --throw-keyid</span>
|
|
<span class="s">--list-only --throw-keyids</span>
|
|
<span class="s">--list-options --trustdb-name</span>
|
|
<span class="s">--list-ownertrust --trusted-key</span>
|
|
<span class="s">--list-packets --trust-model</span>
|
|
<span class="s">--list-public-keys --try-all-secrets</span>
|
|
<span class="s">--list-secret-keys --ttyname</span>
|
|
<span class="s">--list-sig --ttytype</span>
|
|
<span class="s">--list-sigs --ungroup</span>
|
|
<span class="s">--list-trustdb --update-trustdb</span>
|
|
<span class="s">--load-extension --use-agent</span>
|
|
<span class="s">--local-user --use-embedded-filename</span>
|
|
<span class="s">--lock-multiple --user</span>
|
|
<span class="s">--lock-never --utf8-strings</span>
|
|
<span class="s">--lock-once --verbose</span>
|
|
<span class="s">--logger-fd --verify</span>
|
|
<span class="s">--logger-file --verify-files</span>
|
|
<span class="s">--lsign-key --verify-options</span>
|
|
<span class="s">--mangle-dos-filenames --version</span>
|
|
<span class="s">--marginals-needed --warranty</span>
|
|
<span class="s">--max-cert-depth --with-colons</span>
|
|
<span class="s">--max-output --with-fingerprint</span>
|
|
<span class="s">--merge-only --with-key-data</span>
|
|
<span class="s">--min-cert-level --yes</span>
|
|
<span class="s">"""</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
|
|
<span class="n">_possible</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">(</span><span class="n">_all</span><span class="p">)</span>
|
|
|
|
<span class="c">## these are the allowed options we will handle so far, all others should</span>
|
|
<span class="c">## be dropped. this dance is so that when new options are added later, we</span>
|
|
<span class="c">## merely add the to the _allowed list, and the `` _allowed.issubset``</span>
|
|
<span class="c">## assertion will check that GPG will recognise them</span>
|
|
<span class="c">##</span>
|
|
<span class="c">## xxx key fetching/retrieving options: [fetch_keys, merge_only, recv_keys]</span>
|
|
<span class="c">##</span>
|
|
<span class="c">## xxx which ones do we want as defaults?</span>
|
|
<span class="c">## eg, --no-show-photos would mitigate things like</span>
|
|
<span class="c">## https://www-01.ibm.com/support/docview.wss?uid=swg21620982</span>
|
|
<span class="n">_allowed</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="s">'--list-packets'</span><span class="p">,</span> <span class="s">'--delete-keys'</span><span class="p">,</span> <span class="s">'--delete-secret-keys'</span><span class="p">,</span>
|
|
<span class="s">'--encrypt'</span><span class="p">,</span> <span class="s">'--print-mds'</span><span class="p">,</span> <span class="s">'--print-md'</span><span class="p">,</span> <span class="s">'--sign'</span><span class="p">,</span>
|
|
<span class="s">'--encrypt-files'</span><span class="p">,</span> <span class="s">'--gen-key'</span><span class="p">,</span> <span class="s">'--decrypt'</span><span class="p">,</span> <span class="s">'--decrypt-files'</span><span class="p">,</span>
|
|
<span class="s">'--list-keys'</span><span class="p">,</span> <span class="s">'--import'</span><span class="p">,</span> <span class="s">'--verify'</span><span class="p">,</span> <span class="s">'--version'</span><span class="p">,</span>
|
|
<span class="s">'--status-fd'</span><span class="p">,</span> <span class="s">'--no-tty'</span><span class="p">,</span> <span class="s">'--homedir'</span><span class="p">,</span> <span class="s">'--no-default-keyring'</span><span class="p">,</span>
|
|
<span class="s">'--keyring'</span><span class="p">,</span> <span class="s">'--passphrase-fd'</span><span class="p">,</span> <span class="s">'--fingerprint'</span><span class="p">,</span> <span class="s">'--with-colons'</span><span class="p">])</span>
|
|
|
|
<span class="c">## check that _allowed is a subset of _possible</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">assert</span> <span class="n">_allowed</span><span class="o">.</span><span class="n">issubset</span><span class="p">(</span><span class="n">_possible</span><span class="p">),</span> \
|
|
<span class="s">'_allowed is not subset of known options, difference: </span><span class="si">%s</span><span class="s">'</span> \
|
|
<span class="o">%</span> <span class="n">_allowed</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">_possible</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AssertionError</span> <span class="k">as</span> <span class="n">ae</span><span class="p">:</span> <span class="c">## 'as' syntax requires python>=2.6</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"gnupg._is_allowed(): </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">ae</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="n">UsageError</span><span class="p">(</span><span class="n">ae</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
|
|
|
|
<span class="c">## if we got a list of args, join them</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="nb">input</span> <span class="o">=</span> <span class="s">' '</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">input</span><span class="p">])</span>
|
|
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">input</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">'_'</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">input</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">'--'</span><span class="p">):</span>
|
|
<span class="n">hyphenated</span> <span class="o">=</span> <span class="n">_hyphenate</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">add_prefix</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">hyphenated</span> <span class="o">=</span> <span class="n">_hyphenate</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">hyphenated</span> <span class="o">=</span> <span class="nb">input</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">assert</span> <span class="n">hyphenated</span> <span class="ow">in</span> <span class="n">_allowed</span>
|
|
<span class="k">except</span> <span class="ne">AssertionError</span> <span class="k">as</span> <span class="n">ae</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s">"Dropping option '</span><span class="si">%s</span><span class="s">'..."</span>
|
|
<span class="o">%</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="n">hyphenated</span><span class="p">))</span>
|
|
<span class="k">raise</span> <span class="n">ProtectedOption</span><span class="p">(</span><span class="s">"Option '</span><span class="si">%s</span><span class="s">' not supported."</span>
|
|
<span class="o">%</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="n">hyphenated</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"Got allowed option '</span><span class="si">%s</span><span class="s">'."</span>
|
|
<span class="o">%</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="n">hyphenated</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="nb">input</span>
|
|
<span class="k">return</span> <span class="bp">None</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_is_file</span><span class="p">(</span><span class="nb">input</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Check that the size of the thing which is supposed to be a filename has</span>
|
|
<span class="sd"> size greater than zero, without following symbolic links or using</span>
|
|
<span class="sd"> :func:`os.path.isfile`.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">assert</span> <span class="n">os</span><span class="o">.</span><span class="n">lstat</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span><span class="o">.</span><span class="n">st_size</span> <span class="o">></span> <span class="mi">0</span><span class="p">,</span> <span class="s">"not a file: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="nb">input</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">AssertionError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">)</span> <span class="k">as</span> <span class="n">error</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">error</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">False</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">True</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_is_sequence</span><span class="p">(</span><span class="n">instance</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span><span class="nb">list</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span><span class="nb">tuple</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_make_binary_stream</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">encoding</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">_py3k</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">str</span><span class="p">:</span>
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="kn">from</span> <span class="nn">io</span> <span class="kn">import</span> <span class="n">BytesIO</span>
|
|
<span class="n">rv</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
|
|
<span class="n">rv</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">rv</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_sanitise</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Take an arg or the key portion of a kwarg and check that it is in the set</span>
|
|
<span class="sd"> of allowed GPG options and flags, and that it has the correct type. Then,</span>
|
|
<span class="sd"> attempt to escape any unsafe characters. If an option is not allowed,</span>
|
|
<span class="sd"> drop it with a logged warning. Returns a dictionary of all sanitised,</span>
|
|
<span class="sd"> allowed options.</span>
|
|
|
|
<span class="sd"> Each new option that we support that is not a boolean, but instead has</span>
|
|
<span class="sd"> some extra inputs, i.e. "--encrypt-file foo.txt", will need some basic</span>
|
|
<span class="sd"> safety checks added here.</span>
|
|
|
|
<span class="sd"> GnuPG has three-hundred and eighteen commandline flags. Also, not all</span>
|
|
<span class="sd"> implementations of OpenPGP parse PGP packets and headers in the same way,</span>
|
|
<span class="sd"> so there is added potential there for messing with calls to GPG.</span>
|
|
|
|
<span class="sd"> For information on the PGP message format specification, see:</span>
|
|
<span class="sd"> https://www.ietf.org/rfc/rfc1991.txt</span>
|
|
|
|
<span class="sd"> If you're asking, "Is this *really* necessary?": No. Not really. See:</span>
|
|
<span class="sd"> https://xkcd.com/1181/</span>
|
|
|
|
<span class="sd"> :type args: C{str}</span>
|
|
<span class="sd"> :param args: (optional) The boolean arguments which will be passed to the</span>
|
|
<span class="sd"> GnuPG process.</span>
|
|
<span class="sd"> :rtype: C{str}</span>
|
|
<span class="sd"> :param: :ivar:sanitised</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_check_arg_and_value</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Check that a single :param:arg is an allowed option. If it is allowed,</span>
|
|
<span class="sd"> quote out any escape characters in :param:values, and add the pair to</span>
|
|
<span class="sd"> :ivar:sanitised.</span>
|
|
|
|
<span class="sd"> :type arg: C{str}</span>
|
|
|
|
<span class="sd"> :param arg: The arguments which will be passed to the GnuPG process,</span>
|
|
<span class="sd"> and, optionally their corresponding values. The values are</span>
|
|
<span class="sd"> any additional arguments following the GnuPG option or</span>
|
|
<span class="sd"> flag. For example, if we wanted to pass "--encrypt</span>
|
|
<span class="sd"> --recipient isis@leap.se" to gpg, then "--encrypt" would be</span>
|
|
<span class="sd"> an arg without a value, and "--recipient" would also be an</span>
|
|
<span class="sd"> arg, with a value of "isis@leap.se".</span>
|
|
<span class="sd"> :type sanitised: C{str}</span>
|
|
<span class="sd"> :ivar sanitised: The sanitised, allowed options.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">safe_values</span> <span class="o">=</span> <span class="nb">str</span><span class="p">()</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">allowed_flag</span> <span class="o">=</span> <span class="n">_is_allowed</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">assert</span> <span class="n">allowed_flag</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">,</span> \
|
|
<span class="s">"_check_arg_and_value(): got None for allowed_flag"</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">AssertionError</span><span class="p">,</span> <span class="n">ProtectedOption</span><span class="p">)</span> <span class="k">as</span> <span class="n">error</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">error</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"Dropping option '</span><span class="si">%s</span><span class="s">'..."</span> <span class="o">%</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">safe_values</span> <span class="o">+=</span> <span class="p">(</span><span class="n">allowed_flag</span> <span class="o">+</span> <span class="s">" "</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="n">value_list</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">' '</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">value_list</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">' '</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"_check_values(): got non-string for values"</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">value_list</span><span class="p">:</span>
|
|
<span class="n">safe_value</span> <span class="o">=</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">allowed_flag</span> <span class="o">==</span> <span class="s">'--encrypt'</span> <span class="ow">or</span> <span class="s">'--encrypt-files'</span> \
|
|
<span class="ow">or</span> <span class="s">'--decrypt'</span> <span class="ow">or</span> <span class="s">'--decrypt-file'</span> \
|
|
<span class="ow">or</span> <span class="s">'--import'</span> <span class="ow">or</span> <span class="s">'--verify'</span><span class="p">:</span>
|
|
<span class="c">## xxx what other things should we check for?</span>
|
|
<span class="c">## Place checks here:</span>
|
|
<span class="k">if</span> <span class="n">_is_file</span><span class="p">(</span><span class="n">safe_value</span><span class="p">):</span>
|
|
<span class="n">safe_values</span> <span class="o">+=</span> <span class="p">(</span><span class="n">safe_value</span> <span class="o">+</span> <span class="s">" "</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"Got non-filename for </span><span class="si">%s</span><span class="s"> option: </span><span class="si">%s</span><span class="s">"</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">allowed_flag</span><span class="p">,</span> <span class="n">safe_value</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">safe_values</span> <span class="o">+=</span> <span class="p">(</span><span class="n">safe_value</span> <span class="o">+</span> <span class="s">" "</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"Got non-checked value: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">safe_value</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">safe_values</span>
|
|
|
|
<span class="n">checked</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="k">if</span> <span class="n">args</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"_sanitise(): Got arg string: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">arg</span><span class="p">)</span>
|
|
<span class="c">## if we're given a string with a bunch of options in it split</span>
|
|
<span class="c">## them up and deal with them separately</span>
|
|
<span class="k">if</span> <span class="n">arg</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">' '</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">filo</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="n">filo</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
|
|
<span class="n">is_flag</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">'-'</span><span class="p">)</span>
|
|
<span class="n">new_arg</span><span class="p">,</span> <span class="n">new_value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(),</span> <span class="nb">str</span><span class="p">()</span>
|
|
<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">filo</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">is_flag</span><span class="p">(</span><span class="n">filo</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
|
|
<span class="n">new_arg</span> <span class="o">=</span> <span class="n">filo</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">filo</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">while</span> <span class="ow">not</span> <span class="n">is_flag</span><span class="p">(</span><span class="n">filo</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
|
|
<span class="n">new_value</span> <span class="o">+=</span> <span class="p">(</span><span class="n">filo</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span> <span class="o">+</span> <span class="s">' '</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"Got non-flag argument: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">filo</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">filo</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="n">safe</span> <span class="o">=</span> <span class="n">_check_arg_and_value</span><span class="p">(</span><span class="n">new_arg</span><span class="p">,</span> <span class="n">new_value</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">safe</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">safe</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">!=</span> <span class="s">''</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"_sanitise(): appending args: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">safe</span><span class="p">)</span>
|
|
<span class="n">checked</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">safe</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">safe</span> <span class="o">=</span> <span class="n">_check_arg_and_value</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"_sanitise(): appending args: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">safe</span><span class="p">)</span>
|
|
<span class="n">checked</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">safe</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span> <span class="c">## happens with '--version'</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"_sanitise(): Got arg list: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">arg</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">'--'</span><span class="p">):</span>
|
|
<span class="n">safe</span> <span class="o">=</span> <span class="n">_check_arg_and_value</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"_sanitise(): appending args: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">safe</span><span class="p">)</span>
|
|
<span class="n">checked</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">safe</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"_sanitise(): got non string or list arg: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="n">sanitised</span> <span class="o">=</span> <span class="s">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">checked</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">sanitised</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_sanitise_list</span><span class="p">(</span><span class="n">arg_list</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> A generator for running through a list of gpg options and sanitising them.</span>
|
|
|
|
<span class="sd"> :type arg_list: C{list}</span>
|
|
<span class="sd"> :param arg_list: A list of options and flags for gpg.</span>
|
|
<span class="sd"> :rtype: C{generator}</span>
|
|
<span class="sd"> :return: A generator whose next() method returns each of the items in</span>
|
|
<span class="sd"> :param:arg_list after calling :func:_sanitise with that item as a</span>
|
|
<span class="sd"> parameter.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg_list</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">arg_list</span><span class="p">:</span>
|
|
<span class="n">safe_arg</span> <span class="o">=</span> <span class="n">_sanitise</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">safe_arg</span> <span class="o">!=</span> <span class="s">""</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">safe_arg</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_threaded_copy_data</span><span class="p">(</span><span class="n">instream</span><span class="p">,</span> <span class="n">outstream</span><span class="p">):</span>
|
|
<span class="n">wr</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">_copy_data</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">instream</span><span class="p">,</span> <span class="n">outstream</span><span class="p">))</span>
|
|
<span class="n">wr</span><span class="o">.</span><span class="n">setDaemon</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'data copier: </span><span class="si">%r</span><span class="s">, </span><span class="si">%r</span><span class="s">, </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">wr</span><span class="p">,</span> <span class="n">instream</span><span class="p">,</span> <span class="n">outstream</span><span class="p">)</span>
|
|
<span class="n">wr</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="n">wr</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_underscore</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">remove_prefix</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Change hyphens to underscores so that GPG option names can be easily</span>
|
|
<span class="sd"> tranlated to object attributes.</span>
|
|
|
|
<span class="sd"> :type input: C{str}</span>
|
|
<span class="sd"> :param input: The input intended for the gnupg process.</span>
|
|
|
|
<span class="sd"> :type remove_prefix: C{bool}</span>
|
|
<span class="sd"> :param remove_prefix: If True, strip leading hyphens from the input.</span>
|
|
|
|
<span class="sd"> :rtype: C{str}</span>
|
|
<span class="sd"> :return: The :param:input with hyphens changed to underscores.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">remove_prefix</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">input</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'-'</span><span class="p">,</span> <span class="s">'_'</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">input</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s">'-'</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'-'</span><span class="p">,</span> <span class="s">'_'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_which</span><span class="p">(</span><span class="n">executable</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">X_OK</span><span class="p">):</span>
|
|
<span class="sd">"""Borrowed from Twisted's :mod:twisted.python.proutils .</span>
|
|
|
|
<span class="sd"> Search PATH for executable files with the given name.</span>
|
|
|
|
<span class="sd"> On newer versions of MS-Windows, the PATHEXT environment variable will be</span>
|
|
<span class="sd"> set to the list of file extensions for files considered executable. This</span>
|
|
<span class="sd"> will normally include things like ".EXE". This fuction will also find files</span>
|
|
<span class="sd"> with the given name ending with any of these extensions.</span>
|
|
|
|
<span class="sd"> On MS-Windows the only flag that has any meaning is os.F_OK. Any other</span>
|
|
<span class="sd"> flags will be ignored.</span>
|
|
|
|
<span class="sd"> Note: This function does not help us prevent an attacker who can already</span>
|
|
<span class="sd"> manipulate the environment's PATH settings from placing malicious code</span>
|
|
<span class="sd"> higher in the PATH. It also does happily follows links.</span>
|
|
|
|
<span class="sd"> :type name: C{str}</span>
|
|
<span class="sd"> :param name: The name for which to search.</span>
|
|
<span class="sd"> :type flags: C{int}</span>
|
|
<span class="sd"> :param flags: Arguments to L{os.access}.</span>
|
|
<span class="sd"> :rtype: C{list}</span>
|
|
<span class="sd"> :param: A list of the full paths to files found, in the order in which</span>
|
|
<span class="sd"> they were found.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">exts</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'PATHEXT'</span><span class="p">,</span> <span class="s">''</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">pathsep</span><span class="p">))</span>
|
|
<span class="n">path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'PATH'</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">path</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'PATH'</span><span class="p">,</span> <span class="s">''</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">pathsep</span><span class="p">):</span>
|
|
<span class="n">p</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">executable</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">flags</span><span class="p">):</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">exts</span><span class="p">:</span>
|
|
<span class="n">pext</span> <span class="o">=</span> <span class="n">p</span> <span class="o">+</span> <span class="n">e</span>
|
|
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">pext</span><span class="p">,</span> <span class="n">flags</span><span class="p">):</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pext</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_write_passphrase</span><span class="p">(</span><span class="n">stream</span><span class="p">,</span> <span class="n">passphrase</span><span class="p">,</span> <span class="n">encoding</span><span class="p">):</span>
|
|
<span class="n">passphrase</span> <span class="o">=</span> <span class="s">'</span><span class="si">%s</span><span class="se">\n</span><span class="s">'</span> <span class="o">%</span> <span class="n">passphrase</span>
|
|
<span class="n">passphrase</span> <span class="o">=</span> <span class="n">passphrase</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">passphrase</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"Wrote passphrase."</span><span class="p">)</span>
|
|
|
|
|
|
<div class="viewcode-block" id="Verify"><a class="viewcode-back" href="../gnupg.html#gnupg.Verify">[docs]</a><span class="k">class</span> <span class="nc">Verify</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Handle status messages for --verify"""</span>
|
|
|
|
<span class="n">TRUST_UNDEFINED</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">TRUST_NEVER</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="n">TRUST_MARGINAL</span> <span class="o">=</span> <span class="mi">2</span>
|
|
<span class="n">TRUST_FULLY</span> <span class="o">=</span> <span class="mi">3</span>
|
|
<span class="n">TRUST_ULTIMATE</span> <span class="o">=</span> <span class="mi">4</span>
|
|
|
|
<span class="n">TRUST_LEVELS</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s">"TRUST_UNDEFINED"</span> <span class="p">:</span> <span class="n">TRUST_UNDEFINED</span><span class="p">,</span>
|
|
<span class="s">"TRUST_NEVER"</span> <span class="p">:</span> <span class="n">TRUST_NEVER</span><span class="p">,</span>
|
|
<span class="s">"TRUST_MARGINAL"</span> <span class="p">:</span> <span class="n">TRUST_MARGINAL</span><span class="p">,</span>
|
|
<span class="s">"TRUST_FULLY"</span> <span class="p">:</span> <span class="n">TRUST_FULLY</span><span class="p">,</span>
|
|
<span class="s">"TRUST_ULTIMATE"</span> <span class="p">:</span> <span class="n">TRUST_ULTIMATE</span><span class="p">,</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpg</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">gpg</span> <span class="o">=</span> <span class="n">gpg</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">valid</span> <span class="o">=</span> <span class="bp">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">creation_date</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">signature_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">key_id</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">pubkey_fingerprint</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">expire_timestamp</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sig_timestamp</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">trust_text</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">trust_level</span> <span class="o">=</span> <span class="bp">None</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">valid</span>
|
|
|
|
<span class="n">__bool__</span> <span class="o">=</span> <span class="n">__nonzero__</span>
|
|
|
|
<div class="viewcode-block" id="Verify.handle_status"><a class="viewcode-back" href="../gnupg.html#gnupg.Verify.handle_status">[docs]</a> <span class="k">def</span> <span class="nf">handle_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRUST_LEVELS</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">trust_text</span> <span class="o">=</span> <span class="n">key</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">trust_level</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRUST_LEVELS</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s">"RSA_OR_IDEA"</span><span class="p">,</span> <span class="s">"NODATA"</span><span class="p">,</span> <span class="s">"IMPORT_RES"</span><span class="p">,</span> <span class="s">"PLAINTEXT"</span><span class="p">,</span>
|
|
<span class="s">"PLAINTEXT_LENGTH"</span><span class="p">,</span> <span class="s">"POLICY_URL"</span><span class="p">,</span> <span class="s">"DECRYPTION_INFO"</span><span class="p">,</span>
|
|
<span class="s">"DECRYPTION_OKAY"</span><span class="p">,</span> <span class="s">"INV_SGNR"</span><span class="p">):</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"BADSIG"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">valid</span> <span class="o">=</span> <span class="bp">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'signature bad'</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">key_id</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"GOODSIG"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">valid</span> <span class="o">=</span> <span class="bp">True</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'signature good'</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">key_id</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"VALIDSIG"</span><span class="p">:</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">creation_date</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sig_timestamp</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">expire_timestamp</span><span class="p">)</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">()[:</span><span class="mi">4</span><span class="p">]</span>
|
|
<span class="c"># may be different if signature is made with a subkey</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">pubkey_fingerprint</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'signature valid'</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"SIG_ID"</span><span class="p">:</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">signature_id</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">creation_date</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">)</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"ERRSIG"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">valid</span> <span class="o">=</span> <span class="bp">False</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">key_id</span><span class="p">,</span>
|
|
<span class="n">algo</span><span class="p">,</span> <span class="n">hash_algo</span><span class="p">,</span>
|
|
<span class="n">cls</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">)</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">()[:</span><span class="mi">5</span><span class="p">]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'signature error'</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"DECRYPTION_FAILED"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">valid</span> <span class="o">=</span> <span class="bp">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">key_id</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'decryption failed'</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"NO_PUBKEY"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">valid</span> <span class="o">=</span> <span class="bp">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">key_id</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'no public key'</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s">"KEYEXPIRED"</span><span class="p">,</span> <span class="s">"SIGEXPIRED"</span><span class="p">):</span>
|
|
<span class="c"># these are useless in verify, since they are spit out for any</span>
|
|
<span class="c"># pub/subkeys on the key, not just the one doing the signing.</span>
|
|
<span class="c"># if we want to check for signatures with expired key,</span>
|
|
<span class="c"># the relevant flag is EXPKEYSIG.</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s">"EXPKEYSIG"</span><span class="p">,</span> <span class="s">"REVKEYSIG"</span><span class="p">):</span>
|
|
<span class="c"># signed with expired or revoked key</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">valid</span> <span class="o">=</span> <span class="bp">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">key_id</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="p">((</span><span class="s">'</span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">'</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="n">key</span><span class="p">[:</span><span class="mi">3</span><span class="p">],</span> <span class="n">key</span><span class="p">[</span><span class="mi">3</span><span class="p">:]))</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"Unknown status message: </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
|
|
</div></div>
|
|
<div class="viewcode-block" id="ImportResult"><a class="viewcode-back" href="../gnupg.html#gnupg.ImportResult">[docs]</a><span class="k">class</span> <span class="nc">ImportResult</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Handle status messages for --import"""</span>
|
|
|
|
<span class="n">counts</span> <span class="o">=</span> <span class="s">'''count no_user_id imported imported_rsa unchanged</span>
|
|
<span class="s"> n_uids n_subk n_sigs n_revoc sec_read sec_imported</span>
|
|
<span class="s"> sec_dups not_imported'''</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpg</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">gpg</span> <span class="o">=</span> <span class="n">gpg</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">imported</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fingerprints</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="p">:</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">not_imported</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">fingerprints</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span>
|
|
<span class="k">return</span> <span class="bp">True</span>
|
|
|
|
<span class="n">__bool__</span> <span class="o">=</span> <span class="n">__nonzero__</span>
|
|
|
|
<span class="n">ok_reason</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s">'0'</span><span class="p">:</span> <span class="s">'Not actually changed'</span><span class="p">,</span>
|
|
<span class="s">'1'</span><span class="p">:</span> <span class="s">'Entirely new key'</span><span class="p">,</span>
|
|
<span class="s">'2'</span><span class="p">:</span> <span class="s">'New user IDs'</span><span class="p">,</span>
|
|
<span class="s">'4'</span><span class="p">:</span> <span class="s">'New signatures'</span><span class="p">,</span>
|
|
<span class="s">'8'</span><span class="p">:</span> <span class="s">'New subkeys'</span><span class="p">,</span>
|
|
<span class="s">'16'</span><span class="p">:</span> <span class="s">'Contains private key'</span><span class="p">,</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="n">problem_reason</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s">'0'</span><span class="p">:</span> <span class="s">'No specific reason given'</span><span class="p">,</span>
|
|
<span class="s">'1'</span><span class="p">:</span> <span class="s">'Invalid Certificate'</span><span class="p">,</span>
|
|
<span class="s">'2'</span><span class="p">:</span> <span class="s">'Issuer Certificate missing'</span><span class="p">,</span>
|
|
<span class="s">'3'</span><span class="p">:</span> <span class="s">'Certificate Chain too long'</span><span class="p">,</span>
|
|
<span class="s">'4'</span><span class="p">:</span> <span class="s">'Error storing certificate'</span><span class="p">,</span>
|
|
<span class="p">}</span>
|
|
|
|
<div class="viewcode-block" id="ImportResult.handle_status"><a class="viewcode-back" href="../gnupg.html#gnupg.ImportResult.handle_status">[docs]</a> <span class="k">def</span> <span class="nf">handle_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"IMPORTED"</span><span class="p">:</span>
|
|
<span class="c"># this duplicates info we already see in import_ok & import_problem</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"NODATA"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">'fingerprint'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
|
|
<span class="s">'problem'</span><span class="p">:</span> <span class="s">'0'</span><span class="p">,</span> <span class="s">'text'</span><span class="p">:</span> <span class="s">'No valid data found'</span><span class="p">})</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"IMPORT_OK"</span><span class="p">:</span>
|
|
<span class="n">reason</span><span class="p">,</span> <span class="n">fingerprint</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="n">reasons</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">code</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ok_reason</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
|
<span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span> <span class="o">|</span> <span class="nb">int</span><span class="p">(</span><span class="n">code</span><span class="p">)</span> <span class="o">==</span> <span class="nb">int</span><span class="p">(</span><span class="n">reason</span><span class="p">):</span>
|
|
<span class="n">reasons</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
|
|
<span class="n">reasontext</span> <span class="o">=</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">reasons</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">'fingerprint'</span><span class="p">:</span> <span class="n">fingerprint</span><span class="p">,</span>
|
|
<span class="s">'ok'</span><span class="p">:</span> <span class="n">reason</span><span class="p">,</span> <span class="s">'text'</span><span class="p">:</span> <span class="n">reasontext</span><span class="p">})</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fingerprints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fingerprint</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"IMPORT_PROBLEM"</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">reason</span><span class="p">,</span> <span class="n">fingerprint</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="k">except</span><span class="p">:</span>
|
|
<span class="n">reason</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="n">fingerprint</span> <span class="o">=</span> <span class="s">'<unknown>'</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">'fingerprint'</span><span class="p">:</span> <span class="n">fingerprint</span><span class="p">,</span>
|
|
<span class="s">'problem'</span><span class="p">:</span> <span class="n">reason</span><span class="p">,</span> <span class="s">'text'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">problem_reason</span><span class="p">[</span><span class="n">reason</span><span class="p">]})</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"IMPORT_RES"</span><span class="p">:</span>
|
|
<span class="n">import_res</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="p">)):</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">counts</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="nb">int</span><span class="p">(</span><span class="n">import_res</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"KEYEXPIRED"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">'fingerprint'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
|
|
<span class="s">'problem'</span><span class="p">:</span> <span class="s">'0'</span><span class="p">,</span> <span class="s">'text'</span><span class="p">:</span> <span class="s">'Key expired'</span><span class="p">})</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"SIGEXPIRED"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">'fingerprint'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
|
|
<span class="s">'problem'</span><span class="p">:</span> <span class="s">'0'</span><span class="p">,</span> <span class="s">'text'</span><span class="p">:</span> <span class="s">'Signature expired'</span><span class="p">})</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"Unknown status message: </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
|
|
</div>
|
|
<div class="viewcode-block" id="ImportResult.summary"><a class="viewcode-back" href="../gnupg.html#gnupg.ImportResult.summary">[docs]</a> <span class="k">def</span> <span class="nf">summary</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">l</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">l</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'</span><span class="si">%d</span><span class="s"> imported'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">imported</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">not_imported</span><span class="p">:</span>
|
|
<span class="n">l</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'</span><span class="si">%d</span><span class="s"> not imported'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">not_imported</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="s">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
|
|
</div></div>
|
|
<div class="viewcode-block" id="ListKeys"><a class="viewcode-back" href="../gnupg.html#gnupg.ListKeys">[docs]</a><span class="k">class</span> <span class="nc">ListKeys</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span>
|
|
<span class="sd">""" Handle status messages for --list-keys.</span>
|
|
|
|
<span class="sd"> Handle pub and uid (relating the latter to the former).</span>
|
|
|
|
<span class="sd"> Don't care about (info from src/DETAILS):</span>
|
|
|
|
<span class="sd"> crt = X.509 certificate</span>
|
|
<span class="sd"> crs = X.509 certificate and private key available</span>
|
|
<span class="sd"> ssb = secret subkey (secondary key)</span>
|
|
<span class="sd"> uat = user attribute (same as user id except for field 10).</span>
|
|
<span class="sd"> sig = signature</span>
|
|
<span class="sd"> rev = revocation signature</span>
|
|
<span class="sd"> pkd = public key data (special field format, see below)</span>
|
|
<span class="sd"> grp = reserved for gpgsm</span>
|
|
<span class="sd"> rvk = revocation key</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpg</span><span class="p">):</span>
|
|
<span class="nb">super</span><span class="p">(</span><span class="n">ListKeys</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">gpg</span> <span class="o">=</span> <span class="n">gpg</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">curkey</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fingerprints</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">uids</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<div class="viewcode-block" id="ListKeys.key"><a class="viewcode-back" href="../gnupg.html#gnupg.ListKeys.key">[docs]</a> <span class="k">def</span> <span class="nf">key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
|
|
<span class="nb">vars</span> <span class="o">=</span> <span class="p">(</span><span class="s">"""</span>
|
|
<span class="s"> type trust length algo keyid date expires dummy ownertrust uid</span>
|
|
<span class="s"> """</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">curkey</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nb">vars</span><span class="p">)):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">curkey</span><span class="p">[</span><span class="nb">vars</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">curkey</span><span class="p">[</span><span class="s">'uids'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">curkey</span><span class="p">[</span><span class="s">'uid'</span><span class="p">]:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">curkey</span><span class="p">[</span><span class="s">'uids'</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">curkey</span><span class="p">[</span><span class="s">'uid'</span><span class="p">])</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">curkey</span><span class="p">[</span><span class="s">'uid'</span><span class="p">]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">curkey</span><span class="p">[</span><span class="s">'subkeys'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">curkey</span><span class="p">)</span>
|
|
</div>
|
|
<span class="n">pub</span> <span class="o">=</span> <span class="n">sec</span> <span class="o">=</span> <span class="n">key</span>
|
|
|
|
<div class="viewcode-block" id="ListKeys.fpr"><a class="viewcode-back" href="../gnupg.html#gnupg.ListKeys.fpr">[docs]</a> <span class="k">def</span> <span class="nf">fpr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">curkey</span><span class="p">[</span><span class="s">'fingerprint'</span><span class="p">]</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fingerprints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">9</span><span class="p">])</span>
|
|
</div>
|
|
<div class="viewcode-block" id="ListKeys.uid"><a class="viewcode-back" href="../gnupg.html#gnupg.ListKeys.uid">[docs]</a> <span class="k">def</span> <span class="nf">uid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
|
|
<span class="n">uid</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span>
|
|
<span class="n">uid</span> <span class="o">=</span> <span class="n">ESCAPE_PATTERN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="k">lambda</span> <span class="n">m</span><span class="p">:</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="mi">16</span><span class="p">)),</span> <span class="n">uid</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">curkey</span><span class="p">[</span><span class="s">'uids'</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">uid</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">uids</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">uid</span><span class="p">)</span>
|
|
</div>
|
|
<div class="viewcode-block" id="ListKeys.sub"><a class="viewcode-back" href="../gnupg.html#gnupg.ListKeys.sub">[docs]</a> <span class="k">def</span> <span class="nf">sub</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
|
|
<span class="n">subkey</span> <span class="o">=</span> <span class="p">[</span><span class="n">args</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="mi">11</span><span class="p">]]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">curkey</span><span class="p">[</span><span class="s">'subkeys'</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">subkey</span><span class="p">)</span>
|
|
</div>
|
|
<div class="viewcode-block" id="ListKeys.handle_status"><a class="viewcode-back" href="../gnupg.html#gnupg.ListKeys.handle_status">[docs]</a> <span class="k">def</span> <span class="nf">handle_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">pass</span>
|
|
</div></div>
|
|
<div class="viewcode-block" id="Crypt"><a class="viewcode-back" href="../gnupg.html#gnupg.Crypt">[docs]</a><span class="k">class</span> <span class="nc">Crypt</span><span class="p">(</span><span class="n">Verify</span><span class="p">):</span>
|
|
<span class="sd">"""Handle status messages for --encrypt and --decrypt"""</span>
|
|
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpg</span><span class="p">):</span>
|
|
<span class="n">Verify</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpg</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">''</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ok</span> <span class="o">=</span> <span class="bp">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">''</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="k">return</span> <span class="bp">True</span>
|
|
<span class="k">return</span> <span class="bp">False</span>
|
|
|
|
<span class="n">__bool__</span> <span class="o">=</span> <span class="n">__nonzero__</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gpg</span><span class="o">.</span><span class="n">encoding</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">gpg</span><span class="o">.</span><span class="n">decode_errors</span><span class="p">)</span>
|
|
|
|
<div class="viewcode-block" id="Crypt.handle_status"><a class="viewcode-back" href="../gnupg.html#gnupg.Crypt.handle_status">[docs]</a> <span class="k">def</span> <span class="nf">handle_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s">"ENC_TO"</span><span class="p">,</span> <span class="s">"USERID_HINT"</span><span class="p">,</span> <span class="s">"GOODMDC"</span><span class="p">,</span> <span class="s">"END_DECRYPTION"</span><span class="p">,</span>
|
|
<span class="s">"BEGIN_SIGNING"</span><span class="p">,</span> <span class="s">"NO_SECKEY"</span><span class="p">,</span> <span class="s">"ERROR"</span><span class="p">,</span> <span class="s">"NODATA"</span><span class="p">,</span>
|
|
<span class="s">"CARDCTRL"</span><span class="p">):</span>
|
|
<span class="c"># in the case of ERROR, this is because a more specific error</span>
|
|
<span class="c"># message will have come first</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s">"NEED_PASSPHRASE"</span><span class="p">,</span> <span class="s">"BAD_PASSPHRASE"</span><span class="p">,</span> <span class="s">"GOOD_PASSPHRASE"</span><span class="p">,</span>
|
|
<span class="s">"MISSING_PASSPHRASE"</span><span class="p">,</span> <span class="s">"DECRYPTION_FAILED"</span><span class="p">,</span>
|
|
<span class="s">"KEY_NOT_CREATED"</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">"_"</span><span class="p">,</span> <span class="s">" "</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"NEED_PASSPHRASE_SYM"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'need symmetric passphrase'</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"BEGIN_DECRYPTION"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'decryption incomplete'</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"BEGIN_ENCRYPTION"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'encryption incomplete'</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"DECRYPTION_OKAY"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'decryption ok'</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ok</span> <span class="o">=</span> <span class="bp">True</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"END_ENCRYPTION"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'encryption ok'</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ok</span> <span class="o">=</span> <span class="bp">True</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"INV_RECP"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'invalid recipient'</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"KEYEXPIRED"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'key expired'</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"SIG_CREATED"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'sig created'</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"SIGEXPIRED"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'sig expired'</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">Verify</span><span class="o">.</span><span class="n">handle_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
|
|
</div></div>
|
|
<div class="viewcode-block" id="GenKey"><a class="viewcode-back" href="../gnupg.html#gnupg.GenKey">[docs]</a><span class="k">class</span> <span class="nc">GenKey</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Handle status messages for --gen-key"""</span>
|
|
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpg</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">gpg</span> <span class="o">=</span> <span class="n">gpg</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span> <span class="o">=</span> <span class="bp">None</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">:</span> <span class="k">return</span> <span class="bp">True</span>
|
|
<span class="k">return</span> <span class="bp">False</span>
|
|
|
|
<span class="n">__bool__</span> <span class="o">=</span> <span class="n">__nonzero__</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span> <span class="ow">or</span> <span class="s">''</span>
|
|
|
|
<div class="viewcode-block" id="GenKey.handle_status"><a class="viewcode-back" href="../gnupg.html#gnupg.GenKey.handle_status">[docs]</a> <span class="k">def</span> <span class="nf">handle_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s">"PROGRESS"</span><span class="p">,</span> <span class="s">"GOOD_PASSPHRASE"</span><span class="p">,</span> <span class="s">"NODATA"</span><span class="p">,</span> <span class="s">"KEY_NOT_CREATED"</span><span class="p">):</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"KEY_CREATED"</span><span class="p">:</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">)</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"Unknown status message: </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
|
|
</div></div>
|
|
<div class="viewcode-block" id="DeleteResult"><a class="viewcode-back" href="../gnupg.html#gnupg.DeleteResult">[docs]</a><span class="k">class</span> <span class="nc">DeleteResult</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Handle status messages for --delete-key and --delete-secret-key"""</span>
|
|
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpg</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">gpg</span> <span class="o">=</span> <span class="n">gpg</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">'ok'</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">status</span>
|
|
|
|
<span class="n">problem_reason</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s">'1'</span><span class="p">:</span> <span class="s">'No such key'</span><span class="p">,</span>
|
|
<span class="s">'2'</span><span class="p">:</span> <span class="s">'Must delete secret key first'</span><span class="p">,</span>
|
|
<span class="s">'3'</span><span class="p">:</span> <span class="s">'Ambigious specification'</span><span class="p">,</span>
|
|
<span class="p">}</span>
|
|
|
|
<div class="viewcode-block" id="DeleteResult.handle_status"><a class="viewcode-back" href="../gnupg.html#gnupg.DeleteResult.handle_status">[docs]</a> <span class="k">def</span> <span class="nf">handle_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"DELETE_PROBLEM"</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">problem_reason</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="s">"Unknown error: </span><span class="si">%r</span><span class="s">"</span>
|
|
<span class="o">%</span> <span class="n">value</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"Unknown status message: </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
|
|
</div></div>
|
|
<div class="viewcode-block" id="Sign"><a class="viewcode-back" href="../gnupg.html#gnupg.Sign">[docs]</a><span class="k">class</span> <span class="nc">Sign</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Handle status messages for --sign"""</span>
|
|
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpg</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">gpg</span> <span class="o">=</span> <span class="n">gpg</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span> <span class="o">=</span> <span class="bp">None</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span>
|
|
|
|
<span class="n">__bool__</span> <span class="o">=</span> <span class="n">__nonzero__</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gpg</span><span class="o">.</span><span class="n">encoding</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">gpg</span><span class="o">.</span><span class="n">decode_errors</span><span class="p">)</span>
|
|
|
|
<div class="viewcode-block" id="Sign.handle_status"><a class="viewcode-back" href="../gnupg.html#gnupg.Sign.handle_status">[docs]</a> <span class="k">def</span> <span class="nf">handle_status</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s">"USERID_HINT"</span><span class="p">,</span> <span class="s">"NEED_PASSPHRASE"</span><span class="p">,</span> <span class="s">"BAD_PASSPHRASE"</span><span class="p">,</span>
|
|
<span class="s">"GOOD_PASSPHRASE"</span><span class="p">,</span> <span class="s">"BEGIN_SIGNING"</span><span class="p">,</span> <span class="s">"CARDCTRL"</span><span class="p">,</span>
|
|
<span class="s">"INV_SGNR"</span><span class="p">,</span> <span class="s">"NODATA"</span><span class="p">):</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">"SIG_CREATED"</span><span class="p">:</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">algo</span><span class="p">,</span> <span class="n">hashalgo</span><span class="p">,</span> <span class="n">cls</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">)</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"Unknown status message: </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
|
|
</div></div>
|
|
<div class="viewcode-block" id="GPG"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG">[docs]</a><span class="k">class</span> <span class="nc">GPG</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Encapsulate access to the gpg executable"""</span>
|
|
<span class="n">decode_errors</span> <span class="o">=</span> <span class="s">'strict'</span>
|
|
|
|
<span class="n">result_map</span> <span class="o">=</span> <span class="p">{</span><span class="s">'crypt'</span><span class="p">:</span> <span class="n">Crypt</span><span class="p">,</span>
|
|
<span class="s">'delete'</span><span class="p">:</span> <span class="n">DeleteResult</span><span class="p">,</span>
|
|
<span class="s">'generate'</span><span class="p">:</span> <span class="n">GenKey</span><span class="p">,</span>
|
|
<span class="s">'import'</span><span class="p">:</span> <span class="n">ImportResult</span><span class="p">,</span>
|
|
<span class="s">'list'</span><span class="p">:</span> <span class="n">ListKeys</span><span class="p">,</span>
|
|
<span class="s">'sign'</span><span class="p">:</span> <span class="n">Sign</span><span class="p">,</span>
|
|
<span class="s">'verify'</span><span class="p">:</span> <span class="n">Verify</span><span class="p">,}</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gpgbinary</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">gpghome</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
|
|
<span class="n">verbose</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">use_agent</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
|
|
<span class="n">keyring</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">secring</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">pubring</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
|
|
<span class="n">options</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Initialize a GnuPG process wrapper.</span>
|
|
|
|
<span class="sd"> :type gpgbinary: C{str}</span>
|
|
<span class="sd"> :param gpgbinary: Name for GnuPG binary executable. If the absolute</span>
|
|
<span class="sd"> path is not given, the evironment variable $PATH is</span>
|
|
<span class="sd"> searched for the executable and checked that the</span>
|
|
<span class="sd"> real uid/gid of the user has sufficient permissions.</span>
|
|
<span class="sd"> :type gpghome: C{str}</span>
|
|
<span class="sd"> :param gpghome: Full pathname to directory containing the public and</span>
|
|
<span class="sd"> private keyrings. Default is whatever GnuPG defaults</span>
|
|
<span class="sd"> to.</span>
|
|
|
|
<span class="sd"> :type keyring: C{str}</span>
|
|
<span class="sd"> :param keyring: raises C{DeprecationWarning}. Use :param:secring.</span>
|
|
|
|
<span class="sd"> :type secring: C{str}</span>
|
|
<span class="sd"> :param secring: Name of alternative secret keyring file to use. If left</span>
|
|
<span class="sd"> unspecified, this will default to using 'secring.gpg'</span>
|
|
<span class="sd"> in the :param:gpghome directory, and create that file</span>
|
|
<span class="sd"> if it does not exist.</span>
|
|
|
|
<span class="sd"> :type pubring: C{str}</span>
|
|
<span class="sd"> :param pubring: Name of alternative public keyring file to use. If left</span>
|
|
<span class="sd"> unspecified, this will default to using 'pubring.gpg'</span>
|
|
<span class="sd"> in the :param:gpghome directory, and create that file</span>
|
|
<span class="sd"> if it does not exist.</span>
|
|
|
|
<span class="sd"> :options: A list of additional options to pass to the GPG binary.</span>
|
|
|
|
<span class="sd"> :rtype: C{Exception} or C{}</span>
|
|
<span class="sd"> :raises: RuntimeError with explanation message if there is a problem</span>
|
|
<span class="sd"> invoking gpg.</span>
|
|
<span class="sd"> :returns:</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">gpghome</span><span class="p">:</span>
|
|
<span class="n">gpghome</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">(),</span> <span class="s">'gnupg'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span> <span class="o">=</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="n">gpghome</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">):</span>
|
|
<span class="n">message</span> <span class="o">=</span> <span class="p">(</span><span class="s">"Creating gpg home dir: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">gpghome</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"GPG.__init__(): </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">message</span><span class="p">)</span>
|
|
<span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">,</span> <span class="mh">0x1C0</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isabs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">):</span>
|
|
<span class="n">message</span> <span class="o">=</span> <span class="p">(</span><span class="s">"Got non-abs gpg home dir path: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"GPG.__init__(): </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">message</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">message</span> <span class="o">=</span> <span class="p">(</span><span class="s">"Unsuitable gpg home dir: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">gpghome</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"GPG.__init__(): </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">message</span><span class="p">)</span>
|
|
|
|
<span class="c">## find the absolute path, check that it is not a link, and check that</span>
|
|
<span class="c">## we have exec permissions</span>
|
|
<span class="nb">bin</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="k">if</span> <span class="n">gpgbinary</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isabs</span><span class="p">(</span><span class="n">gpgbinary</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span> <span class="nb">bin</span> <span class="o">=</span> <span class="n">_which</span><span class="p">(</span><span class="n">gpgbinary</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">except</span> <span class="ne">IndexError</span> <span class="k">as</span> <span class="n">ie</span><span class="p">:</span> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">ie</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">bin</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span> <span class="nb">bin</span> <span class="o">=</span> <span class="n">_which</span><span class="p">(</span><span class="s">'gpg'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">"gpg is not installed"</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">assert</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isabs</span><span class="p">(</span><span class="nb">bin</span><span class="p">),</span> <span class="s">"Path to gpg binary not absolute"</span>
|
|
<span class="k">assert</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">islink</span><span class="p">(</span><span class="nb">bin</span><span class="p">),</span> <span class="s">"Path to gpg binary is symbolic link"</span>
|
|
<span class="k">assert</span> <span class="n">os</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="nb">bin</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">X_OK</span><span class="p">),</span> <span class="s">"Lacking +x perms for gpg binary"</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">AssertionError</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">)</span> <span class="k">as</span> <span class="n">ae</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"GPG.__init__(): </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">ae</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">gpgbinary</span> <span class="o">=</span> <span class="nb">bin</span>
|
|
|
|
<span class="k">if</span> <span class="n">keyring</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">DeprecationWarning</span><span class="p">(</span>
|
|
<span class="s">"Option 'keyring' changing to 'secring'"</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">DeprecationWarning</span> <span class="k">as</span> <span class="n">dw</span><span class="p">:</span>
|
|
<span class="n">log</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">dw</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
|
|
<span class="k">finally</span><span class="p">:</span>
|
|
<span class="n">secring</span> <span class="o">=</span> <span class="n">keyring</span>
|
|
|
|
<span class="n">secring</span> <span class="o">=</span> <span class="s">'secring.gpg'</span> <span class="k">if</span> <span class="n">secring</span> <span class="ow">is</span> <span class="bp">None</span> <span class="k">else</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="n">secring</span><span class="p">)</span>
|
|
<span class="n">pubring</span> <span class="o">=</span> <span class="s">'pubring.gpg'</span> <span class="k">if</span> <span class="n">pubring</span> <span class="ow">is</span> <span class="bp">None</span> <span class="k">else</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="n">pubring</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">secring</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">,</span> <span class="n">secring</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">pubring</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">,</span> <span class="n">pubring</span><span class="p">)</span>
|
|
<span class="c">## XXX should eventually be changed throughout to 'secring', but until</span>
|
|
<span class="c">## then let's not break backward compatibility</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">keyring</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">secring</span>
|
|
|
|
<span class="k">for</span> <span class="n">ring</span> <span class="ow">in</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">secring</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pubring</span><span class="p">]:</span>
|
|
<span class="k">if</span> <span class="n">ring</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">ring</span><span class="p">):</span>
|
|
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">ring</span><span class="p">,</span> <span class="s">'a+'</span><span class="p">)</span> <span class="k">as</span> <span class="n">ringfile</span><span class="p">:</span>
|
|
<span class="n">ringfile</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">" "</span><span class="p">)</span>
|
|
<span class="n">ringfile</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">assert</span> <span class="n">_has_readwrite</span><span class="p">(</span><span class="n">ring</span><span class="p">),</span> \
|
|
<span class="p">(</span><span class="s">"Need r+w for </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">ring</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AssertionError</span> <span class="k">as</span> <span class="n">ae</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">ae</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="n">_sanitise</span><span class="p">(</span><span class="n">options</span><span class="p">)</span> <span class="k">if</span> <span class="n">options</span> <span class="k">else</span> <span class="bp">None</span>
|
|
|
|
<span class="c">## xxx TODO: hack the locale module away so we can use this on android</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">getpreferredencoding</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="c"># This happens on Jython!</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">encoding</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">,</span> <span class="s">"Got None for self.gpghome"</span>
|
|
<span class="k">assert</span> <span class="n">_has_readwrite</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">),</span> <span class="p">(</span><span class="s">"Home dir </span><span class="si">%s</span><span class="s"> needs r+w"</span>
|
|
<span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">)</span>
|
|
<span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">gpgbinary</span><span class="p">,</span> <span class="s">"Could not find gpgbinary </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">full</span>
|
|
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">verbose</span><span class="p">,</span> <span class="nb">bool</span><span class="p">),</span> <span class="s">"'verbose' must be boolean"</span>
|
|
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">use_agent</span><span class="p">,</span> <span class="nb">bool</span><span class="p">),</span> <span class="s">"'use_agent' must be boolean"</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">:</span>
|
|
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="nb">str</span><span class="p">),</span> <span class="p">(</span><span class="s">"options not formatted: </span><span class="si">%s</span><span class="s">"</span>
|
|
<span class="o">%</span> <span class="n">options</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">AssertionError</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">)</span> <span class="k">as</span> <span class="n">ae</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"GPG.__init__(): </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">ae</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">ae</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">verbose</span> <span class="o">=</span> <span class="n">verbose</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">use_agent</span> <span class="o">=</span> <span class="n">use_agent</span>
|
|
|
|
<span class="n">proc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_subprocess</span><span class="p">([</span><span class="s">"--version"</span><span class="p">])</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_map</span><span class="p">[</span><span class="s">'list'</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_collect_output</span><span class="p">(</span><span class="n">proc</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">stdin</span><span class="o">=</span><span class="n">proc</span><span class="o">.</span><span class="n">stdin</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">proc</span><span class="o">.</span><span class="n">returncode</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">"Error invoking gpg: </span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">"</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">proc</span><span class="o">.</span><span class="n">returncode</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">stderr</span><span class="p">))</span>
|
|
|
|
<div class="viewcode-block" id="GPG.make_args"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.make_args">[docs]</a> <span class="k">def</span> <span class="nf">make_args</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">passphrase</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Make a list of command line elements for GPG. The value of ``args``</span>
|
|
<span class="sd"> will be appended. The ``passphrase`` argument needs to be True if</span>
|
|
<span class="sd"> a passphrase will be sent to GPG, else False.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">gpgbinary</span><span class="p">,</span> <span class="s">'--status-fd 2 --no-tty'</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">:</span>
|
|
<span class="n">cmd</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'--homedir "</span><span class="si">%s</span><span class="s">"'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">gpghome</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">keyring</span><span class="p">:</span>
|
|
<span class="n">cmd</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'--no-default-keyring --keyring "</span><span class="si">%s</span><span class="s">"'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">keyring</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">passphrase</span><span class="p">:</span>
|
|
<span class="n">cmd</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'--batch --passphrase-fd 0'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_agent</span><span class="p">:</span>
|
|
<span class="n">cmd</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'--use-agent'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">:</span>
|
|
<span class="p">[</span><span class="n">cmd</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">opt</span><span class="p">)</span> <span class="k">for</span> <span class="n">opt</span> <span class="ow">in</span> <span class="nb">iter</span><span class="p">(</span><span class="n">_sanitise_list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">))]</span>
|
|
<span class="k">if</span> <span class="n">args</span><span class="p">:</span>
|
|
<span class="p">[</span><span class="n">cmd</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="nb">iter</span><span class="p">(</span><span class="n">_sanitise_list</span><span class="p">(</span><span class="n">args</span><span class="p">))]</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"make_args(): Using command: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">cmd</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">cmd</span>
|
|
</div>
|
|
<span class="k">def</span> <span class="nf">_open_subprocess</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">passphrase</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
|
|
<span class="c"># Internal method: open a pipe to a GPG subprocess and return</span>
|
|
<span class="c"># the file objects for communicating with it.</span>
|
|
<span class="n">cmd</span> <span class="o">=</span> <span class="s">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">make_args</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">passphrase</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span>
|
|
<span class="k">print</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"</span><span class="si">%s</span><span class="s">"</span><span class="p">,</span> <span class="n">cmd</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">Popen</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">stdin</span><span class="o">=</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">stderr</span><span class="o">=</span><span class="n">PIPE</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_read_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
|
|
<span class="c"># Internal method: reads all the stderr output from GPG, taking notice</span>
|
|
<span class="c"># only of lines that begin with the magic [GNUPG:] prefix.</span>
|
|
<span class="c">#</span>
|
|
<span class="c"># Calls methods on the response object for each valid token found,</span>
|
|
<span class="c"># with the arg being the remainder of the status line.</span>
|
|
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
|
|
<span class="n">line</span> <span class="o">=</span> <span class="n">stream</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">break</span>
|
|
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
|
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span>
|
|
<span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"</span><span class="si">%s</span><span class="s">"</span><span class="p">,</span> <span class="n">line</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">line</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">9</span><span class="p">]</span> <span class="o">==</span> <span class="s">'[GNUPG:] '</span><span class="p">:</span>
|
|
<span class="c"># Chop off the prefix</span>
|
|
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="p">[</span><span class="mi">9</span><span class="p">:]</span>
|
|
<span class="n">L</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">keyword</span> <span class="o">=</span> <span class="n">L</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">L</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">value</span> <span class="o">=</span> <span class="n">L</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">value</span> <span class="o">=</span> <span class="s">""</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">handle_status</span><span class="p">(</span><span class="n">keyword</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="s">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_read_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
|
|
<span class="c"># Read the contents of the file from GPG's stdout</span>
|
|
<span class="n">chunks</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">break</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"chunk: </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="n">data</span><span class="p">[:</span><span class="mi">256</span><span class="p">])</span>
|
|
<span class="n">chunks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">_py3k</span><span class="p">:</span>
|
|
<span class="c"># Join using b'' or '', as appropriate</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">data</span><span class="p">)()</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">chunks</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">chunks</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_collect_output</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">process</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">writer</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">stdin</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Drain the subprocesses output streams, writing the collected output</span>
|
|
<span class="sd"> to the result. If a writer thread (writing to the subprocess) is given,</span>
|
|
<span class="sd"> make sure it's joined before returning. If a stdin stream is given,</span>
|
|
<span class="sd"> close it before returning.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">stderr</span> <span class="o">=</span> <span class="n">codecs</span><span class="o">.</span><span class="n">getreader</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)(</span><span class="n">process</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
|
|
<span class="n">rr</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_read_response</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="n">result</span><span class="p">))</span>
|
|
<span class="n">rr</span><span class="o">.</span><span class="n">setDaemon</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'stderr reader: </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">rr</span><span class="p">)</span>
|
|
<span class="n">rr</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
|
|
|
|
<span class="n">stdout</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">stdout</span>
|
|
<span class="n">dr</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_read_data</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="n">result</span><span class="p">))</span>
|
|
<span class="n">dr</span><span class="o">.</span><span class="n">setDaemon</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'stdout reader: </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">dr</span><span class="p">)</span>
|
|
<span class="n">dr</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
|
|
|
|
<span class="n">dr</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
|
|
<span class="n">rr</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">writer</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
|
|
<span class="n">writer</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
|
|
<span class="n">process</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">stdin</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">stdin</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
<span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span>
|
|
<span class="k">pass</span>
|
|
<span class="n">stderr</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
<span class="n">stdout</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_handle_io</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">passphrase</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">binary</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Handle a call to GPG - pass input data, collect output data.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">passphrase</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
|
|
<span class="n">ask_passphrase</span> <span class="o">=</span> <span class="bp">True</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">ask_passphrase</span> <span class="o">=</span> <span class="bp">False</span>
|
|
<span class="n">p</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_subprocess</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">ask_passphrase</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">binary</span><span class="p">:</span>
|
|
<span class="n">stdin</span> <span class="o">=</span> <span class="n">codecs</span><span class="o">.</span><span class="n">getwriter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)(</span><span class="n">p</span><span class="o">.</span><span class="n">stdin</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">stdin</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">stdin</span>
|
|
<span class="k">if</span> <span class="n">passphrase</span><span class="p">:</span>
|
|
<span class="n">_write_passphrase</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="n">passphrase</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="n">writer</span> <span class="o">=</span> <span class="n">_threaded_copy_data</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">stdin</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_collect_output</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="n">stdin</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="c">#</span>
|
|
<span class="c"># SIGNATURE METHODS</span>
|
|
<span class="c">#</span>
|
|
<div class="viewcode-block" id="GPG.sign"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.sign">[docs]</a> <span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""sign message"""</span>
|
|
<span class="n">f</span> <span class="o">=</span> <span class="n">_make_binary_stream</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sign_file</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.sign_file"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.sign_file">[docs]</a> <span class="k">def</span> <span class="nf">sign_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">keyid</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">passphrase</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">clearsign</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
|
|
<span class="n">detach</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">binary</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
|
|
<span class="sd">"""sign file"""</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"sign_file: </span><span class="si">%s</span><span class="s">"</span><span class="p">,</span> <span class="nb">file</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">binary</span><span class="p">:</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s">'-s'</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s">'-sa'</span><span class="p">]</span>
|
|
|
|
<span class="k">if</span> <span class="n">clearsign</span><span class="p">:</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"--clearsign"</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">detach</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
|
|
<span class="s">"Cannot use --clearsign and --detach-sign simultaneously."</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
|
|
<span class="s">"Using default GPG behaviour: --clearsign only."</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">detach</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">clearsign</span><span class="p">:</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"--detach-sign"</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">keyid</span><span class="p">:</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'--default-key "</span><span class="si">%s</span><span class="s">"'</span> <span class="o">%</span> <span class="n">keyid</span><span class="p">)</span>
|
|
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_map</span><span class="p">[</span><span class="s">'sign'</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="c">#We could use _handle_io here except for the fact that if the</span>
|
|
<span class="c">#passphrase is bad, gpg bails and you can't write the message.</span>
|
|
<span class="n">p</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_subprocess</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">passphrase</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">stdin</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">stdin</span>
|
|
<span class="k">if</span> <span class="n">passphrase</span><span class="p">:</span>
|
|
<span class="n">_write_passphrase</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="n">passphrase</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="n">writer</span> <span class="o">=</span> <span class="n">_threaded_copy_data</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">stdin</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span>
|
|
<span class="n">logging</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s">"error writing message"</span><span class="p">)</span>
|
|
<span class="n">writer</span> <span class="o">=</span> <span class="bp">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_collect_output</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">writer</span><span class="p">,</span> <span class="n">stdin</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.verify"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.verify">[docs]</a> <span class="k">def</span> <span class="nf">verify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
|
|
<span class="sd">"""Verify the signature on the contents of the string 'data'</span>
|
|
|
|
<span class="sd"> >>> gpg = GPG(gpghome="keys")</span>
|
|
<span class="sd"> >>> input = gpg.gen_key_input(Passphrase='foo')</span>
|
|
<span class="sd"> >>> key = gpg.gen_key(input)</span>
|
|
<span class="sd"> >>> assert key</span>
|
|
<span class="sd"> >>> sig = gpg.sign('hello',keyid=key.fingerprint,passphrase='bar')</span>
|
|
<span class="sd"> >>> assert not sig</span>
|
|
<span class="sd"> >>> sig = gpg.sign('hello',keyid=key.fingerprint,passphrase='foo')</span>
|
|
<span class="sd"> >>> assert sig</span>
|
|
<span class="sd"> >>> verify = gpg.verify(sig.data)</span>
|
|
<span class="sd"> >>> assert verify</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">f</span> <span class="o">=</span> <span class="n">_make_binary_stream</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">verify_file</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
|
<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.verify_file"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.verify_file">[docs]</a> <span class="k">def</span> <span class="nf">verify_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">data_filename</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Verify the signature on the contents of a file or file-like</span>
|
|
<span class="sd"> object. Can handle embedded signatures as well as detached</span>
|
|
<span class="sd"> signatures. If using detached signatures, the file containing the</span>
|
|
<span class="sd"> detached signature should be specified as the :param:data_filename.</span>
|
|
|
|
<span class="sd"> :param file: A file descriptor object. Its type will be checked with</span>
|
|
<span class="sd"> :func:_is_file.</span>
|
|
<span class="sd"> :param data_filename: A file containing the GPG signature data for</span>
|
|
<span class="sd"> :param:file. If given, :param:file is verified</span>
|
|
<span class="sd"> via this detached signature.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c">## attempt to wrap any escape characters in quotes:</span>
|
|
<span class="n">safe_file</span> <span class="o">=</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span>
|
|
|
|
<span class="c">## check that :param:`file` is actually a file:</span>
|
|
<span class="n">_is_file</span><span class="p">(</span><span class="n">safe_file</span><span class="p">)</span>
|
|
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'verify_file: </span><span class="si">%r</span><span class="s">, </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">safe_file</span><span class="p">,</span> <span class="n">data_filename</span><span class="p">)</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_map</span><span class="p">[</span><span class="s">'verify'</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s">'--verify'</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">data_filename</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_io</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">safe_file</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">binary</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">safe_data_filename</span> <span class="o">=</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="n">data_filename</span><span class="p">)</span>
|
|
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'Handling detached verification'</span><span class="p">)</span>
|
|
<span class="n">fd</span><span class="p">,</span> <span class="n">fn</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">mkstemp</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="s">'pygpg'</span><span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">safe_file</span><span class="p">)</span> <span class="k">as</span> <span class="n">sf</span><span class="p">:</span>
|
|
<span class="n">contents</span> <span class="o">=</span> <span class="n">sf</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
|
|
<span class="n">os</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
|
|
<span class="n">os</span><span class="o">.</span><span class="n">close</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'Wrote to temp file: </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">contents</span><span class="p">)</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fn</span><span class="p">)</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'"</span><span class="si">%s</span><span class="s">"'</span> <span class="o">%</span> <span class="n">safe_data_filename</span><span class="p">)</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">p</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_subprocess</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_collect_output</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">stdin</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">stdin</span><span class="p">)</span>
|
|
<span class="k">finally</span><span class="p">:</span>
|
|
<span class="n">os</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="n">fn</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="c">#</span>
|
|
<span class="c"># KEY MANAGEMENT</span>
|
|
<span class="c">#</span></div>
|
|
<div class="viewcode-block" id="GPG.import_keys"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.import_keys">[docs]</a> <span class="k">def</span> <span class="nf">import_keys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key_data</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Import the key_data into our keyring.</span>
|
|
|
|
<span class="sd"> >>> import shutil</span>
|
|
<span class="sd"> >>> shutil.rmtree("keys")</span>
|
|
<span class="sd"> >>> gpg = GPG(gpghome="keys")</span>
|
|
<span class="sd"> >>> input = gpg.gen_key_input()</span>
|
|
<span class="sd"> >>> result = gpg.gen_key(input)</span>
|
|
<span class="sd"> >>> print1 = result.fingerprint</span>
|
|
<span class="sd"> >>> result = gpg.gen_key(input)</span>
|
|
<span class="sd"> >>> print2 = result.fingerprint</span>
|
|
<span class="sd"> >>> pubkey1 = gpg.export_keys(print1)</span>
|
|
<span class="sd"> >>> seckey1 = gpg.export_keys(print1,secret=True)</span>
|
|
<span class="sd"> >>> seckeys = gpg.list_keys(secret=True)</span>
|
|
<span class="sd"> >>> pubkeys = gpg.list_keys()</span>
|
|
<span class="sd"> >>> assert print1 in seckeys.fingerprints</span>
|
|
<span class="sd"> >>> assert print1 in pubkeys.fingerprints</span>
|
|
<span class="sd"> >>> str(gpg.delete_keys(print1))</span>
|
|
<span class="sd"> 'Must delete secret key first'</span>
|
|
<span class="sd"> >>> str(gpg.delete_keys(print1,secret=True))</span>
|
|
<span class="sd"> 'ok'</span>
|
|
<span class="sd"> >>> str(gpg.delete_keys(print1))</span>
|
|
<span class="sd"> 'ok'</span>
|
|
<span class="sd"> >>> str(gpg.delete_keys("nosuchkey"))</span>
|
|
<span class="sd"> 'No such key'</span>
|
|
<span class="sd"> >>> seckeys = gpg.list_keys(secret=True)</span>
|
|
<span class="sd"> >>> pubkeys = gpg.list_keys()</span>
|
|
<span class="sd"> >>> assert not print1 in seckeys.fingerprints</span>
|
|
<span class="sd"> >>> assert not print1 in pubkeys.fingerprints</span>
|
|
<span class="sd"> >>> result = gpg.import_keys('foo')</span>
|
|
<span class="sd"> >>> assert not result</span>
|
|
<span class="sd"> >>> result = gpg.import_keys(pubkey1)</span>
|
|
<span class="sd"> >>> pubkeys = gpg.list_keys()</span>
|
|
<span class="sd"> >>> seckeys = gpg.list_keys(secret=True)</span>
|
|
<span class="sd"> >>> assert not print1 in seckeys.fingerprints</span>
|
|
<span class="sd"> >>> assert print1 in pubkeys.fingerprints</span>
|
|
<span class="sd"> >>> result = gpg.import_keys(seckey1)</span>
|
|
<span class="sd"> >>> assert result</span>
|
|
<span class="sd"> >>> seckeys = gpg.list_keys(secret=True)</span>
|
|
<span class="sd"> >>> pubkeys = gpg.list_keys()</span>
|
|
<span class="sd"> >>> assert print1 in seckeys.fingerprints</span>
|
|
<span class="sd"> >>> assert print1 in pubkeys.fingerprints</span>
|
|
<span class="sd"> >>> assert print2 in pubkeys.fingerprints</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c">## xxx need way to validate that key_data is actually a valid GPG key</span>
|
|
<span class="c">## it might be possible to use --list-packets and parse the output</span>
|
|
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_map</span><span class="p">[</span><span class="s">'import'</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'import_keys: </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">key_data</span><span class="p">[:</span><span class="mi">256</span><span class="p">])</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="n">_make_binary_stream</span><span class="p">(</span><span class="n">key_data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_io</span><span class="p">([</span><span class="s">'--import'</span><span class="p">],</span> <span class="n">data</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">binary</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'import_keys result: </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">__dict__</span><span class="p">)</span>
|
|
<span class="n">data</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.recv_keys"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.recv_keys">[docs]</a> <span class="k">def</span> <span class="nf">recv_keys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keyserver</span><span class="p">,</span> <span class="o">*</span><span class="n">keyids</span><span class="p">):</span>
|
|
<span class="sd">"""Import a key from a keyserver</span>
|
|
|
|
<span class="sd"> >>> import shutil</span>
|
|
<span class="sd"> >>> shutil.rmtree("keys")</span>
|
|
<span class="sd"> >>> gpg = GPG(gpghome="keys")</span>
|
|
<span class="sd"> >>> result = gpg.recv_keys('pgp.mit.edu', '3FF0DB166A7476EA')</span>
|
|
<span class="sd"> >>> assert result</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">safe_keyserver</span> <span class="o">=</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="n">keyserver</span><span class="p">)</span>
|
|
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_map</span><span class="p">[</span><span class="s">'import'</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="n">_make_binary_stream</span><span class="p">(</span><span class="s">""</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s">'--keyserver'</span><span class="p">,</span> <span class="n">keyserver</span><span class="p">,</span> <span class="s">'--recv-keys'</span><span class="p">]</span>
|
|
|
|
<span class="k">if</span> <span class="n">keyids</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">keyids</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
|
|
<span class="n">safe_keyids</span> <span class="o">=</span> <span class="s">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
|
<span class="p">[(</span><span class="k">lambda</span><span class="p">:</span> <span class="n">_fix_unsafe</span><span class="p">(</span><span class="n">k</span><span class="p">))()</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">keyids</span><span class="p">])</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'recv_keys: </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">safe_keyids</span><span class="p">)</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">safe_keyids</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_io</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">binary</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
|
<span class="n">data</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'recv_keys result: </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">__dict__</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.delete_keys"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.delete_keys">[docs]</a> <span class="k">def</span> <span class="nf">delete_keys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fingerprints</span><span class="p">,</span> <span class="n">secret</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
|
|
<span class="n">which</span><span class="o">=</span><span class="s">'key'</span>
|
|
<span class="k">if</span> <span class="n">secret</span><span class="p">:</span>
|
|
<span class="n">which</span><span class="o">=</span><span class="s">'secret-key'</span>
|
|
<span class="k">if</span> <span class="n">_is_sequence</span><span class="p">(</span><span class="n">fingerprints</span><span class="p">):</span>
|
|
<span class="n">fingerprints</span> <span class="o">=</span> <span class="s">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">fingerprints</span><span class="p">)</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s">'--batch --delete-</span><span class="si">%s</span><span class="s"> "</span><span class="si">%s</span><span class="s">"'</span> <span class="o">%</span> <span class="p">(</span><span class="n">which</span><span class="p">,</span> <span class="n">fingerprints</span><span class="p">)]</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_map</span><span class="p">[</span><span class="s">'delete'</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="n">p</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_subprocess</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_collect_output</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">stdin</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">stdin</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.export_keys"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.export_keys">[docs]</a> <span class="k">def</span> <span class="nf">export_keys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keyids</span><span class="p">,</span> <span class="n">secret</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
|
|
<span class="sd">"""export the indicated keys. 'keyid' is anything gpg accepts"""</span>
|
|
<span class="n">which</span><span class="o">=</span><span class="s">''</span>
|
|
<span class="k">if</span> <span class="n">secret</span><span class="p">:</span>
|
|
<span class="n">which</span><span class="o">=</span><span class="s">'-secret-key'</span>
|
|
<span class="k">if</span> <span class="n">_is_sequence</span><span class="p">(</span><span class="n">keyids</span><span class="p">):</span>
|
|
<span class="n">keyids</span> <span class="o">=</span> <span class="s">' '</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s">'"</span><span class="si">%s</span><span class="s">"'</span> <span class="o">%</span> <span class="n">k</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">keyids</span><span class="p">])</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s">"--armor --export</span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">which</span><span class="p">,</span> <span class="n">keyids</span><span class="p">)]</span>
|
|
<span class="n">p</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_subprocess</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
|
|
<span class="c"># gpg --export produces no status-fd output; stdout will be</span>
|
|
<span class="c"># empty in case of failure</span>
|
|
<span class="c">#stdout, stderr = p.communicate()</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_map</span><span class="p">[</span><span class="s">'delete'</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span> <span class="c"># any result will do</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_collect_output</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">stdin</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">stdin</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'export_keys result: </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">decode_errors</span><span class="p">)</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.list_keys"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.list_keys">[docs]</a> <span class="k">def</span> <span class="nf">list_keys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">secret</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
|
|
<span class="sd">"""List the keys currently in the keyring.</span>
|
|
|
|
<span class="sd"> >>> import shutil</span>
|
|
<span class="sd"> >>> shutil.rmtree("keys")</span>
|
|
<span class="sd"> >>> gpg = GPG(gpghome="keys")</span>
|
|
<span class="sd"> >>> input = gpg.gen_key_input()</span>
|
|
<span class="sd"> >>> result = gpg.gen_key(input)</span>
|
|
<span class="sd"> >>> print1 = result.fingerprint</span>
|
|
<span class="sd"> >>> result = gpg.gen_key(input)</span>
|
|
<span class="sd"> >>> print2 = result.fingerprint</span>
|
|
<span class="sd"> >>> pubkeys = gpg.list_keys()</span>
|
|
<span class="sd"> >>> assert print1 in pubkeys.fingerprints</span>
|
|
<span class="sd"> >>> assert print2 in pubkeys.fingerprints</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">which</span><span class="o">=</span><span class="s">'keys'</span>
|
|
<span class="k">if</span> <span class="n">secret</span><span class="p">:</span>
|
|
<span class="n">which</span><span class="o">=</span><span class="s">'secret-keys'</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="s">"--list-</span><span class="si">%s</span><span class="s"> --fixed-list-mode --fingerprint --with-colons"</span> <span class="o">%</span> <span class="p">(</span><span class="n">which</span><span class="p">,)</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="n">args</span><span class="p">]</span>
|
|
<span class="n">p</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_subprocess</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
|
|
|
|
<span class="c"># there might be some status thingumy here I should handle... (amk)</span>
|
|
<span class="c"># ...nope, unless you care about expired sigs or keys (stevegt)</span>
|
|
|
|
<span class="c"># Get the response information</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_map</span><span class="p">[</span><span class="s">'list'</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_collect_output</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">stdin</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">stdin</span><span class="p">)</span>
|
|
<span class="n">lines</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">decode_errors</span><span class="p">)</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
|
|
<span class="n">valid_keywords</span> <span class="o">=</span> <span class="s">'pub uid sec fpr sub'</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span>
|
|
<span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"line: </span><span class="si">%r</span><span class="s">"</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">rstrip</span><span class="p">())</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="p">:</span>
|
|
<span class="k">break</span>
|
|
<span class="n">L</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">':'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">L</span><span class="p">:</span>
|
|
<span class="k">continue</span>
|
|
<span class="n">keyword</span> <span class="o">=</span> <span class="n">L</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">keyword</span> <span class="ow">in</span> <span class="n">valid_keywords</span><span class="p">:</span>
|
|
<span class="nb">getattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">keyword</span><span class="p">)(</span><span class="n">L</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.gen_key"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.gen_key">[docs]</a> <span class="k">def</span> <span class="nf">gen_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Generate a key; you might use gen_key_input() to create the control</span>
|
|
<span class="sd"> input.</span>
|
|
|
|
<span class="sd"> >>> gpg = GPG(gpghome="keys")</span>
|
|
<span class="sd"> >>> input = gpg.gen_key_input()</span>
|
|
<span class="sd"> >>> result = gpg.gen_key(input)</span>
|
|
<span class="sd"> >>> assert result</span>
|
|
<span class="sd"> >>> result = gpg.gen_key('foo')</span>
|
|
<span class="sd"> >>> assert not result</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s">"--gen-key --batch"</span><span class="p">]</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_map</span><span class="p">[</span><span class="s">'generate'</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="n">f</span> <span class="o">=</span> <span class="n">_make_binary_stream</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_io</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">binary</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
|
<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.gen_key_input"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.gen_key_input">[docs]</a> <span class="k">def</span> <span class="nf">gen_key_input</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Generate --gen-key input per gpg doc/DETAILS</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">parms</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
|
<span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'_'</span><span class="p">,</span><span class="s">'-'</span><span class="p">)</span><span class="o">.</span><span class="n">title</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">():</span> <span class="c"># skip empty strings</span>
|
|
<span class="n">parms</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
|
|
<span class="n">parms</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s">'Key-Type'</span><span class="p">,</span> <span class="s">'RSA'</span><span class="p">)</span>
|
|
<span class="n">parms</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s">'Key-Length'</span><span class="p">,</span> <span class="mi">2048</span><span class="p">)</span>
|
|
<span class="n">parms</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s">'Name-Real'</span><span class="p">,</span> <span class="s">"Autogenerated Key"</span><span class="p">)</span>
|
|
<span class="n">parms</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s">'Name-Comment'</span><span class="p">,</span> <span class="s">"Generated by gnupg.py"</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">logname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">'LOGNAME'</span><span class="p">]</span>
|
|
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
|
|
<span class="n">logname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">'USERNAME'</span><span class="p">]</span>
|
|
<span class="n">hostname</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">()</span>
|
|
<span class="n">parms</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s">'Name-Email'</span><span class="p">,</span> <span class="s">"</span><span class="si">%s</span><span class="s">@</span><span class="si">%s</span><span class="s">"</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">logname</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">' '</span><span class="p">,</span> <span class="s">'_'</span><span class="p">),</span> <span class="n">hostname</span><span class="p">))</span>
|
|
<span class="n">out</span> <span class="o">=</span> <span class="s">"Key-Type: </span><span class="si">%s</span><span class="se">\n</span><span class="s">"</span> <span class="o">%</span> <span class="n">parms</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">'Key-Type'</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">parms</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
|
<span class="n">out</span> <span class="o">+=</span> <span class="s">"</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="se">\n</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
|
|
<span class="n">out</span> <span class="o">+=</span> <span class="s">"</span><span class="si">%c</span><span class="s">ommit</span><span class="se">\n</span><span class="s">"</span>
|
|
<span class="k">return</span> <span class="n">out</span>
|
|
|
|
<span class="c"># Key-Type: RSA</span>
|
|
<span class="c"># Key-Length: 1024</span>
|
|
<span class="c"># Name-Real: ISdlink Server on %s</span>
|
|
<span class="c"># Name-Comment: Created by %s</span>
|
|
<span class="c"># Name-Email: isdlink@%s</span>
|
|
<span class="c"># Expire-Date: 0</span>
|
|
<span class="c"># %commit</span>
|
|
<span class="c">#</span>
|
|
<span class="c">#</span>
|
|
<span class="c"># Key-Type: DSA</span>
|
|
<span class="c"># Key-Length: 1024</span>
|
|
<span class="c"># Subkey-Type: ELG-E</span>
|
|
<span class="c"># Subkey-Length: 1024</span>
|
|
<span class="c"># Name-Real: Joe Tester</span>
|
|
<span class="c"># Name-Comment: with stupid passphrase</span>
|
|
<span class="c"># Name-Email: joe@foo.bar</span>
|
|
<span class="c"># Expire-Date: 0</span>
|
|
<span class="c"># Passphrase: abc</span>
|
|
<span class="c"># %pubring foo.pub</span>
|
|
<span class="c"># %secring foo.sec</span>
|
|
<span class="c"># %commit</span>
|
|
|
|
<span class="c">#</span>
|
|
<span class="c"># ENCRYPTION</span>
|
|
<span class="c">#</span></div>
|
|
<div class="viewcode-block" id="GPG.encrypt_file"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.encrypt_file">[docs]</a> <span class="k">def</span> <span class="nf">encrypt_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">recipients</span><span class="p">,</span> <span class="n">sign</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
|
|
<span class="n">always_trust</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">passphrase</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
|
|
<span class="n">armor</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">output</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">symmetric</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
|
|
<span class="sd">"""Encrypt the message read from the file-like object :param:file ."""</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s">'--encrypt'</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">symmetric</span><span class="p">:</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s">'--symmetric'</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s">'--encrypt'</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">_is_sequence</span><span class="p">(</span><span class="n">recipients</span><span class="p">):</span>
|
|
<span class="n">recipients</span> <span class="o">=</span> <span class="p">(</span><span class="n">recipients</span><span class="p">,)</span>
|
|
<span class="k">for</span> <span class="n">recipient</span> <span class="ow">in</span> <span class="n">recipients</span><span class="p">:</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'--recipient "</span><span class="si">%s</span><span class="s">"'</span> <span class="o">%</span> <span class="n">recipient</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">armor</span><span class="p">:</span> <span class="c"># create ascii-armored output - set to False for binary output</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'--armor'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">output</span><span class="p">:</span> <span class="c"># write the output to a file with the specified name</span>
|
|
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">output</span><span class="p">):</span>
|
|
<span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">output</span><span class="p">)</span> <span class="c"># to avoid overwrite confirmation message</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'--output "</span><span class="si">%s</span><span class="s">"'</span> <span class="o">%</span> <span class="n">output</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">sign</span><span class="p">:</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'--sign --default-key "</span><span class="si">%s</span><span class="s">"'</span> <span class="o">%</span> <span class="n">sign</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">always_trust</span><span class="p">:</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"--always-trust"</span><span class="p">)</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_map</span><span class="p">[</span><span class="s">'crypt'</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_io</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">passphrase</span><span class="o">=</span><span class="n">passphrase</span><span class="p">,</span> <span class="n">binary</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'encrypt result: </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.encrypt"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.encrypt">[docs]</a> <span class="k">def</span> <span class="nf">encrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">recipients</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""Encrypt the message contained in the string :param:data .</span>
|
|
|
|
<span class="sd"> >>> import shutil</span>
|
|
<span class="sd"> >>> if os.path.exists("keys"):</span>
|
|
<span class="sd"> ... shutil.rmtree("keys")</span>
|
|
<span class="sd"> >>> gpg = GPG(gpghome="keys")</span>
|
|
<span class="sd"> >>> input = gpg.gen_key_input(passphrase='foo')</span>
|
|
<span class="sd"> >>> result = gpg.gen_key(input)</span>
|
|
<span class="sd"> >>> print1 = result.fingerprint</span>
|
|
<span class="sd"> >>> input = gpg.gen_key_input()</span>
|
|
<span class="sd"> >>> result = gpg.gen_key(input)</span>
|
|
<span class="sd"> >>> print2 = result.fingerprint</span>
|
|
<span class="sd"> >>> result = gpg.encrypt("hello",print2)</span>
|
|
<span class="sd"> >>> message = str(result)</span>
|
|
<span class="sd"> >>> assert message != 'hello'</span>
|
|
<span class="sd"> >>> result = gpg.decrypt(message)</span>
|
|
<span class="sd"> >>> assert result</span>
|
|
<span class="sd"> >>> str(result)</span>
|
|
<span class="sd"> 'hello'</span>
|
|
<span class="sd"> >>> result = gpg.encrypt("hello again",print1)</span>
|
|
<span class="sd"> >>> message = str(result)</span>
|
|
<span class="sd"> >>> result = gpg.decrypt(message,passphrase='bar')</span>
|
|
<span class="sd"> >>> result.status in ('decryption failed', 'bad passphrase')</span>
|
|
<span class="sd"> True</span>
|
|
<span class="sd"> >>> assert not result</span>
|
|
<span class="sd"> >>> result = gpg.decrypt(message,passphrase='foo')</span>
|
|
<span class="sd"> >>> result.status == 'decryption ok'</span>
|
|
<span class="sd"> True</span>
|
|
<span class="sd"> >>> str(result)</span>
|
|
<span class="sd"> 'hello again'</span>
|
|
<span class="sd"> >>> result = gpg.encrypt("signed hello",print2,sign=print1,passphrase='foo')</span>
|
|
<span class="sd"> >>> result.status == 'encryption ok'</span>
|
|
<span class="sd"> True</span>
|
|
<span class="sd"> >>> message = str(result)</span>
|
|
<span class="sd"> >>> result = gpg.decrypt(message)</span>
|
|
<span class="sd"> >>> result.status == 'decryption ok'</span>
|
|
<span class="sd"> True</span>
|
|
<span class="sd"> >>> assert result.fingerprint == print1</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="n">_make_binary_stream</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">encrypt_file</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">recipients</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">data</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.decrypt"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.decrypt">[docs]</a> <span class="k">def</span> <span class="nf">decrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Decrypt the contents of a string or file-like object :param:message .</span>
|
|
|
|
<span class="sd"> :param message: A string or file-like object to decrypt.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="n">_make_binary_stream</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">decrypt_file</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">data</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</div>
|
|
<div class="viewcode-block" id="GPG.decrypt_file"><a class="viewcode-back" href="../gnupg.html#gnupg.GPG.decrypt_file">[docs]</a> <span class="k">def</span> <span class="nf">decrypt_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">always_trust</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">passphrase</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
|
|
<span class="n">output</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Decrypt the contents of a file-like object :param:file .</span>
|
|
|
|
<span class="sd"> :param file: A file-like object to decrypt.</span>
|
|
<span class="sd"> :param always_trust: Instruct GnuPG to ignore trust checks.</span>
|
|
<span class="sd"> :param passphrase: The passphrase for the secret key used for decryption.</span>
|
|
<span class="sd"> :param output: A file to write the decrypted output to.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s">"--decrypt"</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">output</span><span class="p">:</span> <span class="c"># write the output to a file with the specified name</span>
|
|
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">output</span><span class="p">):</span>
|
|
<span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">output</span><span class="p">)</span> <span class="c"># to avoid overwrite confirmation message</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'--output "</span><span class="si">%s</span><span class="s">"'</span> <span class="o">%</span> <span class="n">output</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">always_trust</span><span class="p">:</span>
|
|
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"--always-trust"</span><span class="p">)</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_map</span><span class="p">[</span><span class="s">'crypt'</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_io</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">passphrase</span><span class="p">,</span> <span class="n">binary</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'decrypt result: </span><span class="si">%r</span><span class="s">'</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</pre></div></div></div>
|
|
|
|
</div>
|
|
<div class="bottomnav">
|
|
|
|
<p>
|
|
<a class="uplink" href="../index.html">Contents</a>
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="footer">
|
|
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
|
</div>
|
|
</body>
|
|
</html> |