Unverified Commit 66ef631c authored by Isis Lovecruft's avatar Isis Lovecruft
Browse files

Add support for generating QRCodes with 'bridge://' schema for Orbot.

parent 438021c2
Loading
Loading
Loading
Loading
+17 −4
Changes for lib/bridgedb/qrcodes.py: 17 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -25,13 +25,15 @@ except ImportError:
                   "work. On Debian-based systems, this should be in the "
                   "python-qrcode package."))

def generateQR(bridgelines, imageFormat=u'JPEG'):

def generateQR(bridgelines, imageFormat=u'JPEG', bridgeSchema=False):
    """Generate a QRCode for the client's bridge lines.

    :param str bridgelines: The Bridge Lines which we are distributing to the
        client.
    :param bool bridgeSchema: If ``True``, prepend ``'bridge://'`` to the
        beginning of each bridge line before QR encoding.
    :rtype: str or ``None``

    :returns: The generated QRCode, as a string.
    """
    logging.debug("Attempting to encode bridge lines into a QRCode...")
@@ -43,16 +45,26 @@ def generateQR(bridgelines, imageFormat=u'JPEG'):
        logging.info("Not creating QRCode for bridgelines; no qrcode module.")

    try:
        if bridgeSchema:
            # See https://bugs.torproject.org/12639 for why bridge:// is used.
            # (Hopefully, Orbot will pick up the ACTION_VIEW intent.)
            schema = 'bridge://'
            prefixed = []
            for line in bridgelines.strip().split('\n'):
                prefixed.append(schema + line)
            bridgelines = '\n'.join(prefixed)

        logging.debug("QR encoding bridge lines: %s" % bridgelines)

        qr = qrcode.QRCode()
        qr.add_data(bridgelines)

        buf = cStringIO.StringIO()
        img = qr.make_image().resize([350, 350])
        img.save(buf, imageFormat)
        buf.seek(0)
        imgstr = buf.read()
        logging.debug("Got QRCode image string.")

        imgstr = buf.read()
        return imgstr

    except KeyError as error:
@@ -62,3 +74,4 @@ def generateQR(bridgelines, imageFormat=u'JPEG'):
    except Exception as error:
        logging.error(("There was an error while attempting to generate the "
                       "QRCode: %s") % str(error))