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!| 00radar_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 class Request: headers = {'x-radar-signature': 'foo:FHkzIYqqvAuLEKKzpcNGhMjZQ0G88QpHNtxycPd0GFE='} auth = authorize(Request, 'bar') a = auth(lambda a: a) a('fringo') PK!Hu)GTU"radar_client-0.1.2.dist-info/WHEEL HM K-*ϳR03rOK-J,/R(O-)$qzd&Y)r$UV&UrPK!Huo%radar_client-0.1.2.dist-info/METADATAOK09*C.,AEY=X#MToo"Ofͼa){`RA-z%'a6+AZ䃖[*_pJyEgrp'Z^"(ōdZ>gLY[qKa 4.Tḷw~bָIv%#u?rO Xm7@AuN-2@EdPK!H-Nz#radar_client-0.1.2.dist-info/RECORD}αr0o 4[`]r $}xg)=3Bx%!Jw_Η+G[8BU {LY*0ڤk5hgKP)2{jk vO MuMUeh BNy[gqxP5]}ucsVi hUiBb_xG8;v#_;&Wx ت; SM0PK!2<JJradar_client/__init__.pyPK!| 00radar_client/utils.pyPK!Hu)GTU"radar_client-0.1.2.dist-info/WHEELPK!Huo%w radar_client-0.1.2.dist-info/METADATAPK!H-Nz# radar_client-0.1.2.dist-info/RECORDPK}