From: Fredrik Tolf Date: Sun, 19 Mar 2017 17:15:32 +0000 (+0100) Subject: Merge branch 'master' of git://git.dolda.net/wrw X-Git-Url: http://dolda2000.com/gitweb/?p=wrw.git;a=commitdiff_plain;h=328e9684d09e1f415622ba3d7bc7fc446f54e1a1;hp=69eb6cbefcf769276e3e15c6f20e9d5af74fd326 Merge branch 'master' of git://git.dolda.net/wrw --- diff --git a/wrw/auth.py b/wrw/auth.py index 1858214..27e2a98 100644 --- a/wrw/auth.py +++ b/wrw/auth.py @@ -1,5 +1,5 @@ import binascii, hashlib, threading, time -from . import resp +from . import resp, proto class unauthorized(resp.httperror): def __init__(self, challenge, message=None, detail=None): @@ -31,11 +31,7 @@ def parsebasic(req): if mech != "basic": return None, None try: - data = data.encode("us-ascii") - except UnicodeError: - return None, None - try: - raw = binascii.a2b_base64(data) + raw = proto.unb64(data) except binascii.Error: return None, None try: diff --git a/wrw/proto.py b/wrw/proto.py index 482a23e..0e3c798 100644 --- a/wrw/proto.py +++ b/wrw/proto.py @@ -1,4 +1,4 @@ -import time, calendar +import time, calendar, collections, binascii, base64 statusinfo = { 400: ("Bad Request", "Invalid HTTP request."), @@ -195,3 +195,37 @@ def parurl(url, pars={}, **augment): return url + "?" + qs else: return url + +# Wrap these, since binascii is a bit funky. :P +def enhex(bs): + return base64.b16encode(bs).decode("us-ascii") +def unhex(es): + if not isinstance(es, collections.ByteString): + try: + es = es.encode("us-ascii") + except UnicodeError: + raise binascii.Error("non-ascii character in hex-string") + return base64.b16decode(es) +def enb32(bs): + return base64.b32encode(bs).decode("us-ascii") +def unb32(es): + if not isinstance(es, collections.ByteString): + try: + es = es.encode("us-ascii") + except UnicodeError: + raise binascii.Error("non-ascii character in base32-string") + if (len(es) % 8) != 0: + es += b"=" * (8 - (len(es) % 8)) + es = es.upper() # The whole point of Base32 is that it's case-insensitive :P + return base64.b32decode(es) +def enb64(bs): + return base64.b64encode(bs).decode("us-ascii") +def unb64(es): + if not isinstance(es, collections.ByteString): + try: + es = es.encode("us-ascii") + except UnicodeError: + raise binascii.Error("non-ascii character in base64-string") + if (len(es) % 4) != 0: + es += b"=" * (4 - (len(es) % 4)) + return base64.b64decode(es) diff --git a/wrw/session.py b/wrw/session.py index f9b4a3f..8141827 100644 --- a/wrw/session.py +++ b/wrw/session.py @@ -1,5 +1,5 @@ -import threading, time, pickle, random, os, binascii -from . import cookie, env +import threading, time, pickle, random, os +from . import cookie, env, proto __all__ = ["db", "get"] @@ -8,7 +8,7 @@ def gennonce(length): class session(object): def __init__(self, lock, expire=86400 * 7): - self.id = binascii.b2a_hex(gennonce(16)).decode("us-ascii") + self.id = proto.enhex(gennonce(16)) self.dict = {} self.lock = lock self.ctime = self.atime = self.mtime = int(time.time()) diff --git a/wrw/sp/cons.py b/wrw/sp/cons.py index b9437bf..d8b30a8 100644 --- a/wrw/sp/cons.py +++ b/wrw/sp/cons.py @@ -1,4 +1,4 @@ -import sys, collections.abc +import sys, collections import xml.dom.minidom class node(object): @@ -64,7 +64,7 @@ class context(object): new = self.nodefrom(child) if new is not None: node.children.append(new) - elif isinstance(child, collections.abc.Iterable): + elif isinstance(child, collections.Iterable): for ch in child: self.addchild(node, ch) else: