PK!2ê<JJradar_client/__init__.pyimport requests from .utils import sign, verify_sig, authorize, InvalidRadarSignature def create_query(name, requires=None, props=None): default_requires = requires default_props = props def init(requires=None, **props): return { 'name': name, 'requires': requires or default_requires, 'props': props or default_props } return init def radar(url, public_key=None, secret_key=None, header_name='x-radar-signature'): signature = None if public_key and secret_key: signature = sign(public_key, secret_key) def request(*queries, headers=None): headers = headers or {} if signature: headers = {**headers, header_name: signature} return requests.post(url, json=queries, headers=headers).json() return request PK!£ùlÆ‚‚radar_client/utils.pyimport hmac from functools import wraps from radar_server import QueryErrors from base64 import b64encode, b64decode from hashlib import sha256 def sign(public_key, secret_key): sig = hmac.new(key=secret_key.encode(), msg=public_key.encode(), digestmod=sha256).digest() return f"{public_key}:{b64encode(sig).decode('utf8')}" class InvalidRadarSignature(QueryErrors): pass def verify_sig(msg, public_key, secret_key): pk, sig = sign(public_key, secret_key).split(':') if sig is None: raise InvalidRadarSignature('Missing a Radar signature header') result = hmac.compare_digest(msg, sig) if result is False: raise InvalidRadarSignature('Invalid Radar signature') return result def authorize(request, secret_key, header_name='x-radar-signature'): def verify_request(fn): @wraps(fn) def wrapper(*a, **kw): msg = request.headers.get(header_name) public_key, sig = msg.split(':') print(public_key, sig, secret_key) verify_sig(sig, public_key, secret_key) return fn(*a, **kw) return wrapper return verify_request PK!Hu)G×TU"radar_client-0.1.3.dist-info/WHEEL ÏHMÍÑ K-*ÎÌϳR0Ô3àrOÍK-J,É/²R(ÈO-)ª‰ê$qåç—èz딥æd&Y)”•¦r…$¦UVëæåç¥ê&æUrPK!H¤Øhaâo%radar_client-0.1.3.dist-info/METADATA•MK1 †ïý=*LÃ|,,”ÙEуè8.Êê9Ìı2m5íûïmÅ/ðä-yß'yC®)âˆÕ=q0ÞiYC%z´¤%'‡Õ0rQ|û%TЈ»ÅZ䃖âÂ[R/8¥}Õß<ô¢3¹ðK8]â“g-/‘i”ÝâFúÔY4³–ÏÙ9;'S–`ðVÜÒëb˜‚ڜ·›ÖE»‚RœÍ‚y4”öîØOŒÖ7ÉÝ´¤s¤NúÇX®šÿò°þI?7!~½#¿Ë£í&?bU´%ÔPÿSK!† ÖPWEÛdêPK!He†Ùýz#radar_client-0.1.3.dist-info/RECORD}ÎÁn‚0лßRP,V8ì@°TPÜ¥©¤ŒÁäï·‹‰»ø/¯eœµôZ‰¬–sJE-$¥ê÷º‚-Wè­wöeÐímhzd@Žy<ø8ËaZ2vÉÅþc›è#7Pb.€¡/gí³×KQuOòÂ}Ü“õµøDî{Õ„çC¤M |v¿jÀ“—H˜J~3¶д•þOSª¦B•‹N*¢Î›9q0öô´¸]*nŒ‚Š“Êÿëñ}“ä¹ ;F`U†ëIûàtÀX½†}Y+²6?™z¬Œ‘Œê4´EO»AÆÍÎê 3}B%a½hƒÓˆÖ¯ñÛÇpÀìPK!2ê<JJ¤radar_client/__init__.pyPK!£ùlÆ‚‚¤€radar_client/utils.pyPK!Hu)G×TU"€5radar_client-0.1.3.dist-info/WHEELPK!H¤Øhaâo%€Éradar_client-0.1.3.dist-info/METADATAPK!He†Ùýz#€î radar_client-0.1.3.dist-info/RECORDPK},