[tor-commits] [bridgedb/develop] Fix libgpgme signing error due to Python2.7 buffer() interface changes.

isis at torproject.org isis at torproject.org
Wed Apr 23 05:23:12 UTC 2014


commit 3debed96a8e04894b0064e8075ffd8c1dd4ce10b
Author: Isis Lovecruft <isis at torproject.org>
Date:   Wed Apr 23 05:08:10 2014 +0000

    Fix libgpgme signing error due to Python2.7 buffer() interface changes.
    
    See https://mail.python.org/pipermail/python-dev/2010-October/104917.html
        https://docs.python.org/2/c-api/buffer.html
        https://github.com/SoftwareIntrospectionLab/MininGit/issues/101#issuecomment-1602514
    
    We have to test if our Python2.7 version has the new or old builtin
    buffer() interface.
---
 lib/bridgedb/crypto.py |   27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/lib/bridgedb/crypto.py b/lib/bridgedb/crypto.py
index 4ce30b2..2feb556 100644
--- a/lib/bridgedb/crypto.py
+++ b/lib/bridgedb/crypto.py
@@ -61,6 +61,24 @@ from twisted.internet import ssl
 #: The hash digest to use for HMACs.
 DIGESTMOD = hashlib.sha1
 
+# Test to see if we have the old or new style buffer() interface. Trying
+# to use an old-style buffer on Python2.7 prior to version 2.7.5 will produce:
+#
+#     TypeError: 'buffer' does not have the buffer interface
+#
+#: ``True`` if we have the new-style
+#: `buffer <https://docs.python.org/2/c-api/buffer.html>` interface.
+NEW_BUFFER_INTERFACE = False
+try:
+    io.BytesIO(buffer('test'))
+except TypeError:
+    logging.warn(
+        "This Python version is too old! "\
+        "It doesn't support new-style buffer interfaces: "\
+        "https://mail.python.org/pipermail/python-dev/2010-October/104917.html")
+else:
+    NEW_BUFFER_INTERFACE = True
+
 
 class RSAKeyGenerationError(Exception):
     """Raised when there was an error creating an RSA keypair."""
@@ -395,8 +413,13 @@ def gpgSignMessage(gpgmeCtx, messageString, mode=None):
     if not mode:
         mode = gpgme.SIG_MODE_CLEAR
 
-    msgFile = io.BytesIO(buffer(messageString))
-    sigFile = io.BytesIO()
+    if NEW_BUFFER_INTERFACE:
+        msgFile = io.BytesIO(buffer(messageString))
+        sigFile = io.BytesIO()
+    else:
+        msgFile = io.StringIO(unicode(messageString))
+        sigFile = io.StringIO()
+
     sigList = gpgmeCtx.sign(msgFile, sigFile, mode)
     sigFile.seek(0)
     signature = sigFile.read()





More information about the tor-commits mailing list