def jscmp(a, b): a = jsonical.dumps(a, indent=4) b = jsonical.dumps(b, indent=4) if a != b: print a print b return False return True
def jsonrpc_dumps_sign(privkey, privkey_id, is_request, message_id, method='', params=[], result=None, error=None): '''Create the signature for given json-rpc data and returns signed json-rpc text stream''' # Build data object to sign sign_time = int(time.time()) data = { 'method': method, 'params': params, 'result': result, 'error': error, 'sign_time': sign_time } # Serialize data to sign and perform signing txt = jsonical.dumps(data) signature = sign(privkey, txt) # Reconstruct final data object and put signature if is_request: data = { 'id': message_id, 'method': method, 'params': params, 'sign': signature, 'sign_algo': 'ecdsa;SECP256k1', 'sign_id': privkey_id, 'sign_time': sign_time } else: data = { 'id': message_id, 'result': result, 'error': error, 'sign': signature, 'sign_algo': 'ecdsa;SECP256k1', 'sign_id': privkey_id, 'sign_time': sign_time } # Return original data extended with signature return jsonical.dumps(data)
def main(): parser = op.OptionParser(usage=__usage__, option_list=options()) opts, args = parser.parse_args() if len(args): parser.error("Unrecognized arguments: %s" % ' '.join(args)) pack = Pack(opts.pack) writer = None for data in stdin(): if data.get("type") == "insert": mesg = jsonical.dumps({"source": data["source"]}) if writer is not None: writer.close() writer = PackWriter(pack, mesg, None, None) elif data.get("type") == "diff": mesg = {"source": data["source"], "target": data["target"]} mesg = jsonical.dumps(mesg) if writer is not None: writer.close() writer = PackWriter(pack, mesg, None, None) elif data.get("type") == "keyword": if data.get("delete", False): writer.rem_keyword(data["keyword"]) else: writer.add_keyword(data["keyword"], data["value"]) elif data.get("type") == "reference": if data.get("delete", False): writer.rem_reference(data["refid"]) else: writer.add_reference(data["refid"], data["value"]) elif data.get("type") == "sequence": writer.add_sequence(data["seqid"], data["sequence"]) elif data.get("type") == "feature": if data.get("delete", False): writer.rem_feature(data["feature"]) else: writer.add_feature(data["feature"], prev=data.get("previous")) elif data.get("type") == "coords": writer.add_coords(data["old"], data["new"], data["coords"]) else: raise ValueError("Invalid type: %r" % data.get("type")) if writer is not None: writer.close()
def diff_refs(oldrefs, newrefs): itemize = lambda p: (hashlib.sha1(jsonical.dumps(p)).hexdigest().upper(), p) oldrefs = dict(map(itemize, oldrefs)) newrefs = dict(map(itemize, newrefs)) for o in oldrefs: if o not in newrefs: yield {"type": "reference", "refid": o, "delete": True} for n in newrefs: if n not in oldrefs: yield {"type": "reference", "refid": n, "value": newrefs[n]}
def jsonrpc_dumps_sign(privkey, privkey_id, is_request, message_id, method='', params=[], result=None, error=None): '''Create the signature for given json-rpc data and returns signed json-rpc text stream''' # Build data object to sign sign_time = int(time.time()) data = {'method': method, 'params': params, 'result': result, 'error': error, 'sign_time': sign_time} # Serialize data to sign and perform signing txt = jsonical.dumps(data) signature = sign(privkey, txt) # Reconstruct final data object and put signature if is_request: data = {'id': message_id, 'method': method, 'params': params, 'sign': signature, 'sign_algo': 'ecdsa;SECP256k1', 'sign_id': privkey_id, 'sign_time': sign_time} else: data = {'id': message_id, 'result': result, 'error': error, 'sign': signature, 'sign_algo': 'ecdsa;SECP256k1', 'sign_id': privkey_id, 'sign_time': sign_time} # Return original data extended with signature return jsonical.dumps(data)
def jsonrpc_loads_verify(pubkeys, txt): ''' Pubkeys is mapping (dict) of sign_id -> ecdsa public key. This method deserialize provided json-encoded data, load signature ID, perform the lookup for public key and check stored signature of the message. If signature is OK, returns message data. ''' data = json.loads(txt) signature_algo = data['sign_algo'] signature_id = data['sign_id'] signature_time = data['sign_time'] if signature_algo != 'ecdsa;SECP256k1': raise custom_exceptions.UnknownSignatureAlgorithmException( "%s is not supported" % signature_algo) try: pubkey = pubkeys[signature_id] except KeyError: raise custom_exceptions.UnknownSignatureIdException( "Public key for '%s' not found" % signature_id) signature = data['sign'] message_id = data['id'] method = data.get('method', '') params = data.get('params', []) result = data.get('result', None) error = data.get('error', None) # Build data object to verify data = { 'method': method, 'params': params, 'result': result, 'error': error, 'sign_time': signature_time } txt = jsonical.dumps(data) if not verify(pubkey, signature, txt): raise custom_exceptions.SignatureVerificationFailedException( "Signature doesn't match to given data") if method: # It's a request return {'id': message_id, 'method': method, 'params': params} else: # It's aresponse return {'id': message_id, 'result': result, 'error': error}
def jsonrpc_loads_verify(pubkeys, txt): ''' Pubkeys is mapping (dict) of sign_id -> ecdsa public key. This method deserialize provided json-encoded data, load signature ID, perform the lookup for public key and check stored signature of the message. If signature is OK, returns message data. ''' data = json.loads(txt) signature_algo = data['sign_algo'] signature_id = data['sign_id'] signature_time = data['sign_time'] if signature_algo != 'ecdsa;SECP256k1': raise custom_exceptions.UnknownSignatureAlgorithmException("%s is not supported" % signature_algo) try: pubkey = pubkeys[signature_id] except KeyError: raise custom_exceptions.UnknownSignatureIdException("Public key for '%s' not found" % signature_id) signature = data['sign'] message_id = data['id'] method = data.get('method', '') params = data.get('params', []) result = data.get('result', None) error = data.get('error', None) # Build data object to verify data = {'method': method, 'params': params, 'result': result, 'error': error, 'sign_time': signature_time} txt = jsonical.dumps(data) if not verify(pubkey, signature, txt): raise custom_exceptions.SignatureVerificationFailedException("Signature doesn't match to given data") if method: # It's a request return {'id': message_id, 'method': method, 'params': params} else: # It's aresponse return {'id': message_id, 'result': result, 'error': error}
def mkjs(data): return jsonical.dumps(data)
def modify(self, path, obj): self.commit.modify(path, jsonical.dumps(obj, indent=4) + "\n")
def jshash(self, arg): return hashlib.sha1(jsonical.dumps(arg)).hexdigest().upper()