doc: python bindings howto

* Another retrofitting of the HOWTO Python example code, this time
  following adjustments to python-mode configuration and having
  trawled through the org-mode mailing lists for clues.
This commit is contained in:
Ben McGinnes 2018-07-23 00:21:05 +10:00
parent b47e1bb98a
commit d7c5366d58

View File

@ -340,7 +340,7 @@ pattern is upper or lower case.
So this is the best method:
#+begin_src python
#+begin_src python -i
import gpg
k = gpg.Context().keylist(pattern="258E88DCBD3CD44D8E7AB43F6ECB6AF0DEADBEEF")
@ -349,7 +349,7 @@ So this is the best method:
This is passable and very likely to be common:
#+begin_src python
#+begin_src python -i
import gpg
k = gpg.Context().keylist(pattern="0x6ECB6AF0DEADBEEF")
@ -358,7 +358,7 @@ This is passable and very likely to be common:
And this is a really bad idea:
#+begin_src python
#+begin_src python -i
import gpg
k = gpg.Context().keylist(pattern="0xDEADBEEF")
@ -369,7 +369,7 @@ Alternatively it may be that the intention is to create a list of keys
which all match a particular search string. For instance all the
addresses at a particular domain, like this:
#+begin_src python
#+begin_src python -i
import gpg
ncsc = gpg.Context().keylist(pattern="ncsc.mil")
@ -386,7 +386,7 @@ Counting the number of keys in your public keybox (=pubring.kbx=), the
format which has superseded the old keyring format (=pubring.gpg= and
=secring.gpg=), or the number of secret keys is a very simple task.
#+begin_src python
#+begin_src python -i
import gpg
c = gpg.Context()
@ -424,7 +424,7 @@ secret keys as well.
This first example demonstrates selecting the current key of Werner
Koch, which is due to expire at the end of 2018:
#+begin_src python
#+begin_src python -i
import gpg
fingerprint = "80615870F5BAD690333686D0F2AD85AC1E42B367"
@ -434,7 +434,7 @@ Koch, which is due to expire at the end of 2018:
Whereas this example demonstrates selecting the author's current key
with the =secret= key word argument set to =True=:
#+begin_src python
#+begin_src python -i
import gpg
fingerprint = "DB4724E6FA4286C92B4E55C4321E4E2373590E5D"
@ -463,7 +463,7 @@ keyservers via the web using the requests module. Since requests
returns the content as a bytes literal object, we can then use that
directly to import the resulting data into our keybox.
#+begin_src python
#+begin_src python -i
import gpg
import os.path
import requests
@ -538,7 +538,7 @@ alternative, the =key_export_minimal()= method, will do the same thing
except producing a minimised output with extra signatures and third
party signatures or certifications removed.
#+begin_src python
#+begin_src python -i
import gpg
import os.path
import sys
@ -593,7 +593,7 @@ pattern has been entered for =logrus=, but it has not matched any
keys. When the search pattern itself is set to =None= this triggers
the exporting of the entire public keybox.
#+begin_src python
#+begin_src python -i
import gpg
import os.path
import sys
@ -657,7 +657,7 @@ The following example exports the secret key to a file which is then
set with the same permissions as the output files created by the
command line secret key export options.
#+begin_src python
#+begin_src python -i
import gpg
import os
import os.path
@ -718,7 +718,7 @@ readable and writable by the user. It also exports the secret key(s)
twice in order to output both GPG binary (=.gpg=) and ASCII armoured
(=.asc=) files.
#+begin_src python
#+begin_src python -i
import gpg
import os
import os.path
@ -850,7 +850,7 @@ trust model settings for recipient keys (defaults to =False=);
=expect_sign=, prepare for signing (defaults to =False=); =compress=,
compresses the plaintext prior to encryption (defaults to =True=).
#+begin_src python
#+begin_src python -i
import gpg
a_key = "0x12345678DEADBEEF"
@ -858,8 +858,7 @@ compresses the plaintext prior to encryption (defaults to =True=).
Since the text in this case must be bytes, it is most likely that
the input form will be a separate file which is opened with "rb"
as this is the simplest method of obtaining the correct data
format.
as this is the simplest method of obtaining the correct data format.
"""
c = gpg.Context(armor=True)
@ -875,7 +874,7 @@ plaintext input read from a file, the recipient keys used for
encryption regardless of key trust status and the encrypted output
also encrypted to any preconfigured keys set in the =gpg.conf= file:
#+begin_src python
#+begin_src python -i
import gpg
a_key = "0x12345678DEADBEEF"
@ -912,7 +911,7 @@ email address on the =gnupg.org= domain,[fn:3] but does /not/ encrypt
to a default key or other key which is configured to normally encrypt
to.
#+begin_src python
#+begin_src python -i
import gpg
text = b"""Oh look, another test message.
@ -947,7 +946,7 @@ All it would take to change the above example to sign the message
and also encrypt the message to any configured default keys would
be to change the =c.encrypt= line to this:
#+begin_src python
#+begin_src python -i
ciphertext, result, sign_result = c.encrypt(text, recipients=logrus,
always_trust=True,
add_encrypt_to=True)
@ -963,7 +962,7 @@ are not trusted (e.g. not signed or locally signed) then the
encryption will raise an error. It is possible to mitigate this
somewhat with something more like this:
#+begin_src python
#+begin_src python -i
import gpg
with open("secret_plans.txt.asc", "rb") as afile:
@ -1015,7 +1014,7 @@ to modify the Context prior to conducting the decryption and since the
Context is only used once, setting it to =c= simply adds lines for no
gain.
#+begin_src python
#+begin_src python -i
import gpg
ciphertext = input("Enter path and filename of encrypted file: ")
@ -1060,7 +1059,7 @@ default key specified and there is more than one secret key available
it may be necessary to specify the key or keys with which to sign
messages and files.
#+begin_src python
#+begin_src python -i
import gpg
logrus = input("Enter the email address or string to match signing keys to: ")
@ -1101,7 +1100,7 @@ multiple keys are involved; from the preferences saved into the key
itself or by comparison with the preferences with all other keys
involved.
#+begin_src python
#+begin_src python -i
import gpg
text0 = """Declaration of ... something.
@ -1121,7 +1120,7 @@ reading the input data from another file and writing the result to a
new file will be performed more like the way it is done in the next
example. Even if the output format is ASCII armoured.
#+begin_src python
#+begin_src python -i
import gpg
with open("/path/to/statement.txt", "rb") as tfile:
@ -1144,7 +1143,7 @@ Detached signatures will often be needed in programmatic uses of
GPGME, either for signing files (e.g. tarballs of code releases) or as
a component of message signing (e.g. PGP/MIME encoded email).
#+begin_src python
#+begin_src python -i
import gpg
text0 = """Declaration of ... something.
@ -1162,7 +1161,7 @@ a component of message signing (e.g. PGP/MIME encoded email).
As with normal signatures, detached signatures are best handled as
byte literals, even when the output is ASCII armoured.
#+begin_src python
#+begin_src python -i
import gpg
with open("/path/to/statement.txt", "rb") as tfile:
@ -1185,7 +1184,7 @@ Though PGP/in-line messages are no longer encouraged in favour of
PGP/MIME, there is still sometimes value in utilising in-line
signatures. This is where clear-signed messages or text is of value.
#+begin_src python
#+begin_src python -i
import gpg
text0 = """Declaration of ... something.
@ -1203,7 +1202,7 @@ signatures. This is where clear-signed messages or text is of value.
In spite of the appearance of a clear-signed message, the data handled
by GPGME in signing it must still be byte literals.
#+begin_src python
#+begin_src python -i
import gpg
with open("/path/to/statement.txt", "rb") as tfile:
@ -1230,7 +1229,7 @@ with files and data with detached signatures.
The following example is intended for use with the default signing
method where the file was not ASCII armoured:
#+begin_src python
#+begin_src python -i
import gpg
import time
@ -1262,7 +1261,7 @@ method where the file was not ASCII armoured:
Whereas this next example, which is almost identical would work with
normal ASCII armoured files and with clear-signed files:
#+begin_src python
#+begin_src python -i
import gpg
import time
@ -1295,7 +1294,7 @@ In both of the previous examples it is also possible to compare the
original data that was signed against the signed data in =data= to see
if it matches with something like this:
#+begin_src python
#+begin_src python -i
with open(filename, "rb") as afile:
text = afile.read()
@ -1311,7 +1310,7 @@ returned since it is already being explicitly referenced in the first
argument of =c.verify=. So =data= is =None= and only the information
in =result= is available.
#+begin_src python
#+begin_src python -i
import gpg
import time
@ -1340,7 +1339,7 @@ in =result= is available.
pass
#+end_src
#+begin_src python
#+begin_src python -i
import gpg
import time
@ -1424,7 +1423,7 @@ be the passphrase and if =passphrase= is set to =True= then gpg-agent
will launch pinentry to prompt for a passphrase. For the sake of
convenience, these examples will keep =passphrase= set to =None=.
#+begin_src python
#+begin_src python -i
import gpg
c = gpg.Context()
@ -1452,7 +1451,7 @@ already set and the correct directory and file permissions.
The successful generation of the key can be confirmed via the returned
=GenkeyResult= object, which includes the following data:
#+begin_src python
#+begin_src python -i
print("""
Fingerprint: {0}
Primary Key: {1}
@ -1519,7 +1518,7 @@ primary key. Since Danger Mouse is a security conscious secret agent,
this subkey will only be valid for about six months, half the length
of the primary key.
#+begin_src python
#+begin_src python -i
import gpg
c = gpg.Context()
@ -1532,7 +1531,7 @@ of the primary key.
As with the primary key, the results here can be checked with:
#+begin_src python
#+begin_src python -i
print("""
Fingerprint: {0}
Primary Key: {1}
@ -1575,7 +1574,7 @@ ID to an existing key is much simpler. The method used to do this is
=key_add_uid= and the only arguments it takes are for the =key= and
the new =uid=.
#+begin_src python
#+begin_src python -i
import gpg
c = gpg.Context()
@ -1612,7 +1611,7 @@ Unsurprisingly the result of this is:
Revoking a user ID is a fairly similar process, except that it uses
the =key_revoke_uid= method.
#+begin_src python
#+begin_src python -i
import gpg
c = gpg.Context()
@ -1652,7 +1651,7 @@ it is case sensitive.
To sign Danger Mouse's key for just the initial user ID with a
signature which will last a little over a month, do this:
#+begin_src python
#+begin_src python -i
import gpg
c = gpg.Context()
@ -1683,7 +1682,7 @@ MUAs readily.
The following code, however, provides a work-around for obtaining this
information in Python.
#+begin_src python
#+begin_src python -i
import subprocess
lines = subprocess.getoutput("gpgconf --list-options gpg").splitlines()