aboutsummaryrefslogtreecommitdiffstats
path: root/lang/python/examples/encrypt-to-all.py
diff options
context:
space:
mode:
Diffstat (limited to 'lang/python/examples/encrypt-to-all.py')
-rwxr-xr-xlang/python/examples/encrypt-to-all.py86
1 files changed, 35 insertions, 51 deletions
diff --git a/lang/python/examples/encrypt-to-all.py b/lang/python/examples/encrypt-to-all.py
index 5e126760..4586f938 100755
--- a/lang/python/examples/encrypt-to-all.py
+++ b/lang/python/examples/encrypt-to-all.py
@@ -1,21 +1,21 @@
#!/usr/bin/env python3
+#
+# Copyright (C) 2016 g10 Code GmbH
# Copyright (C) 2008 Igor Belyi <[email protected]>
# Copyright (C) 2002 John Goerzen <[email protected]>
#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
"""
This program will try to encrypt a simple message to each key on your
@@ -24,44 +24,28 @@ be skipped and it will re-try the encryption."""
import sys
import os
-from pyme import core
-from pyme.core import Data, Context
-
-core.check_version(None)
-
-plain = Data('This is my message.')
-
-c = Context()
-c.set_armor(1)
+import pyme
-def sendto(keylist):
- cipher = Data()
- c.op_encrypt(keylist, 1, plain, cipher)
- cipher.seek(0, os.SEEK_SET)
- return cipher.read()
-
-names = []
-for key in c.op_keylist_all(None, 0):
- try:
- print(" *** Found key for %s" % key.uids[0].uid)
+with pyme.Context(armor=True) as c:
+ recipients = list()
+ for key in c.keylist():
valid = 0
- for subkey in key.subkeys:
- keyid = subkey.keyid
- if keyid is None:
- break
- can_encrypt = subkey.can_encrypt
- valid += can_encrypt
- print(" Subkey %s: encryption %s" %
- (keyid, can_encrypt and "enabled" or "disabled"))
- except UnicodeEncodeError as e:
- print(e)
-
- if valid:
- names.append(key)
- else:
- print(" This key cannot be used for encryption; skipping.")
-
-passno = 0
-
-print("Encrypting to %d recipients" % len(names))
-sys.stdout.buffer.write(sendto(names))
+ if any(sk.can_encrypt for sk in key.subkeys):
+ recipients.append(key)
+ print("Adding recipient {0}.".format(key.uids[0].uid))
+
+ ciphertext = None
+ while not ciphertext:
+ print("Encrypting to %d recipients" % len(recipients))
+ try:
+ ciphertext, _, _ = c.encrypt(b'This is my message.',
+ recipients=recipients)
+ except pyme.errors.InvalidRecipients as e:
+ print("Encryption failed for these keys:\n{0!s}".format(e))
+
+ # filter out the bad keys
+ bad_keys = {bad.fpr for bad in e.recipients}
+ recipients = [r for r in recipients
+ if not r.subkeys[0].fpr in bad_keys]
+
+ sys.stdout.buffer.write(ciphertext)