03037c9250e08a44f23ec03b502f22d79b175cd5
[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 # Copyright (C) 2018 Ben McGinnes <ben@gnupg.org>
7 #
8 # This program is free software; you can redistribute it and/or modify it under
9 # the terms of the GNU General Public License as published by the Free Software
10 # Foundation; either version 2 of the License, or (at your option) any later
11 # version.
12 #
13 # This program is free software; you can redistribute it and/or modify it under
14 # the terms of the GNU Lesser General Public License as published by the Free
15 # Software Foundation; either version 2.1 of the License, or (at your option)
16 # any later version.
17 #
18 # This program is distributed in the hope that it will be useful, but WITHOUT
19 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
20 # FOR A PARTICULAR PURPOSE.  See the GNU General Public License and the GNU
21 # Lesser General Public Licensefor more details.
22 #
23 # You should have received a copy of the GNU General Public License and the GNU
24 # Lesser General Public along with this program; if not, see
25 # <http://www.gnu.org/licenses/>.
26
27 import gpg
28 import os
29 import os.path
30 import subprocess
31 import sys
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