python bindings: howto examples
[gpgme.git] / lang / python / examples / howto / export-secret-keys.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3
4 from __future__ import absolute_import, division, unicode_literals
5
6 import gpg
7 import os
8 import os.path
9 import subprocess
10 import sys
11
12 # Copyright (C) 2018 Ben McGinnes <ben@gnupg.org>
13 #
14 # This program is free software; you can redistribute it and/or modify it under
15 # the terms of the GNU General Public License as published by the Free Software
16 # Foundation; either version 2 of the License, or (at your option) any later
17 # version.
18 #
19 # This program is free software; you can redistribute it and/or modify it under
20 # the terms of the GNU Lesser General Public License as published by the Free
21 # Software Foundation; either version 2.1 of the License, or (at your option)
22 # any later version.
23 #
24 # This program is distributed in the hope that it will be useful, but WITHOUT
25 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
26 # FOR A PARTICULAR PURPOSE.  See the GNU General Public License and the GNU
27 # Lesser General Public Licensefor more details.
28 #
29 # You should have received a copy of the GNU General Public License and the GNU
30 # Lesser General Public along with this program; if not, see
31 # <http://www.gnu.org/licenses/>.
32
33 print("""
34 This script exports one or more secret keys as both ASCII armored and binary
35 file formats, saved in files within the user's GPG home directory.
36
37 The gpg-agent and pinentry are invoked to authorise the export.
38 """)
39
40 if sys.platform == "win32":
41     gpgconfcmd = "gpgconf.exe --list-dirs homedir"
42 else:
43     gpgconfcmd = "gpgconf --list-dirs homedir"
44
45 a = gpg.Context(armor=True)
46 b = gpg.Context()
47 c = gpg.Context()
48
49 if len(sys.argv) >= 4:
50     keyfile = sys.argv[1]
51     logrus = sys.argv[2]
52     homedir = sys.argv[3]
53 elif len(sys.argv) == 3:
54     keyfile = sys.argv[1]
55     logrus = sys.argv[2]
56     homedir = input("Enter the GPG configuration directory path (optional): ")
57 elif len(sys.argv) == 2:
58     keyfile = sys.argv[1]
59     logrus = input("Enter the UID matching the secret key(s) to export: ")
60     homedir = input("Enter the GPG configuration directory path (optional): ")
61 else:
62     keyfile = input("Enter the filename to save the secret key to: ")
63     logrus = input("Enter the UID matching the secret key(s) to export: ")
64     homedir = input("Enter the GPG configuration directory path (optional): ")
65
66 if homedir.startswith("~"):
67     if os.path.exists(os.path.expanduser(homedir)) is True:
68         c.home_dir = os.path.expanduser(homedir)
69     else:
70         pass
71 elif os.path.exists(homedir) is True:
72     c.home_dir = homedir
73 else:
74     pass
75
76 if c.home_dir is not None:
77     if c.home_dir.endswith("/"):
78         gpgfile = "{0}{1}.gpg".format(c.home_dir, keyfile)
79         ascfile = "{0}{1}.asc".format(c.home_dir, keyfile)
80     else:
81         gpgfile = "{0}/{1}.gpg".format(c.home_dir, keyfile)
82         ascfile = "{0}/{1}.asc".format(c.home_dir, keyfile)
83 else:
84     if os.path.exists(os.environ["GNUPGHOME"]) is True:
85         hd = os.environ["GNUPGHOME"]
86     else:
87         hd = subprocess.getoutput(gpgconfcmd)
88     gpgfile = "{0}/{1}.gpg".format(hd, keyfile)
89     ascfile = "{0}/{1}.asc".format(hd, keyfile)
90
91 try:
92     a_result = a.key_export_secret(pattern=logrus)
93     b_result = b.key_export_secret(pattern=logrus)
94 except:
95     a_result = a.key_export_secret(pattern=None)
96     b_result = b.key_export_secret(pattern=None)
97
98 if a_result is not None:
99     with open(ascfile, "wb") as f:
100         f.write(a_result)
101     os.chmod(ascfile, 0o600)
102 else:
103     pass
104
105 if b_result is not None:
106     with open(gpgfile, "wb") as f:
107         f.write(b_result)
108     os.chmod(gpgfile, 0o600)
109 else:
110     pass