Example #1
0
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
Example #2
0
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)
Example #3
0
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()
Example #4
0
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)
Example #6
0
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}    
Example #8
0
def mkjs(data):
    return jsonical.dumps(data)
Example #9
0
 def modify(self, path, obj):
     self.commit.modify(path, jsonical.dumps(obj, indent=4) + "\n")
Example #10
0
 def jshash(self, arg):
     return hashlib.sha1(jsonical.dumps(arg)).hexdigest().upper()