Skip to content

Commit

Permalink
Merge pull request #233 from DanGraur/test_rest_api_fix
Browse files Browse the repository at this point in the history
Added a test suite for the REST API, which contains unit tests for th…
  • Loading branch information
qstokkink committed Oct 27, 2018
2 parents 02e9532 + 182aa17 commit f4b2ec6
Show file tree
Hide file tree
Showing 15 changed files with 1,859 additions and 59 deletions.
99 changes: 51 additions & 48 deletions ipv8/REST/attestation_endpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ def on_request_attestation(self, peer, attribute_name, metadata):
Return the measurement of an attribute for a certain peer.
"""
deferred = Deferred()
self.attestation_requests[(b64encode(peer.mid), attribute_name)] = (deferred, b64encode(json.dumps(metadata)))
self.attestation_requests[(b64encode(peer.mid), attribute_name)] = \
(deferred, b64encode(json.dumps(metadata).encode('utf-8')))
self.attestation_metadata[(peer, attribute_name)] = metadata
out = yield deferred
returnValue(out)
Expand All @@ -69,7 +70,7 @@ def on_verify_request(self, peer, attribute_hash):
block = self.identity_overlay.get_attestation_by_hash(attribute_hash)
if not block:
returnValue(None)
attribute_name = block.transaction["name"]
attribute_name = block.transaction[b"name"]
deferred = Deferred()
self.verify_requests[(b64encode(peer.mid), attribute_name)] = deferred
out = yield deferred
Expand Down Expand Up @@ -103,29 +104,29 @@ def render_GET(self, request):
type=peers -> [mid_b64]
type=attributes&mid=mid_b64 -> [(attribute_name, attribute_hash)]
"""
if not request.args or 'type' not in request.args:
if not request.args or b'type' not in request.args:
return ""
if request.args['type'][0] == 'outstanding':
if request.args[b'type'][0] == b'outstanding':
formatted = []
for k, v in self.attestation_requests.items():
formatted.append(k + (v[1], ))
return json.dumps(formatted)
if request.args['type'][0] == 'outstanding_verify':
return json.dumps([(x.decode('utf-8'), y, z.decode('utf-8')) for x, y, z in formatted]).encode('utf-8')
if request.args[b'type'][0] == b'outstanding_verify':
formatted = []
for k, v in self.verify_requests.items():
formatted.append(k)
return json.dumps(formatted)
if request.args['type'][0] == 'verification_output':
return json.dumps([(x.decode('utf-8'), y) for x, y in formatted]).encode('utf-8')
if request.args[b'type'][0] == b'verification_output':
formatted = {}
for k, v in self.verification_output.items():
formatted[b64encode(k)] = [(b64encode(a), m) for a, m in v]
return json.dumps(formatted)
if request.args['type'][0] == 'peers':
formatted[b64encode(k).decode('utf-8')] = [(b64encode(a).decode('utf-8'), m) for a, m in v]
return json.dumps(formatted).encode('utf-8')
if request.args[b'type'][0] == b'peers':
peers = self.session.network.get_peers_for_service(self.identity_overlay.master_peer.mid)
return json.dumps([b64encode(p.mid) for p in peers])
if request.args['type'][0] == 'attributes':
if 'mid' in request.args:
mid_b64 = request.args['mid'][0]
return json.dumps([b64encode(p.mid).decode('utf-8') for p in peers]).encode('utf-8')
if request.args[b'type'][0] == b'attributes':
if b'mid' in request.args:
mid_b64 = request.args[b'mid'][0]
peer = self.get_peer_from_mid(mid_b64)
else:
peer = self.identity_overlay.my_peer
Expand All @@ -136,13 +137,14 @@ def render_GET(self, request):
# Only include identity blocks we initiated (otherwise it would be an attestation)
if b.link_sequence_number == UNKNOWN_SEQ:
attester = b64encode(sha1(b.link_public_key).digest())
previous = trimmed.get((attester, b.transaction["name"]), None)
previous = trimmed.get((attester, b.transaction[b"name"]), None)
if not previous or previous.sequence_number < b.sequence_number:
trimmed[(attester, b.transaction["name"])] = b
return json.dumps([(b.transaction["name"], b64encode(b.transaction["hash"]), b.transaction["metadata"],
b64encode(sha1(b.link_public_key).digest()))
for b in trimmed.values()])
if request.args['type'][0] == 'drop_identity':
trimmed[(attester, b.transaction[b"name"])] = b
return json.dumps([(b.transaction[b"name"], b64encode(b.transaction[b"hash"]).decode('utf-8'),
b.transaction[b"metadata"],
b64encode(sha1(b.link_public_key).digest()).decode('utf-8'))
for b in trimmed.values()]).encode('utf-8')
if request.args[b'type'][0] == b'drop_identity':
self.identity_overlay.persistence.execute('DELETE FROM blocks')
self.identity_overlay.persistence.commit()
self.attestation_overlay.database.execute('DELETE FROM %s' % self.attestation_overlay.database.db_name)
Expand All @@ -151,7 +153,7 @@ def render_GET(self, request):
my_new_peer = Peer(default_eccrypto.generate_key(u"curve25519"))
self.identity_overlay.my_peer = my_new_peer
self.attestation_overlay.my_peer = my_new_peer
return ""
return b""

def render_POST(self, request):
"""
Expand All @@ -160,41 +162,42 @@ def render_POST(self, request):
type=attest&mid=mid_b64&attribute_name=attribute_name&attribute_value=attribute_value_b64
type=verify&mid=mid_b64&attribute_hash=attribute_hash_b64&attribute_values=attribute_value_b64,...
"""
if not request.args or 'type' not in request.args:
return ""
if request.args['type'][0] == 'request':
mid_b64 = request.args['mid'][0]
attribute_name = request.args['attribute_name'][0]
if not request.args or b'type' not in request.args:
return b""
if request.args[b'type'][0] == b'request':
mid_b64 = request.args[b'mid'][0]
attribute_name = request.args[b'attribute_name'][0].decode('utf-8')
peer = self.get_peer_from_mid(mid_b64)
if peer:
_, key = generate_keypair()
metadata = {}
if 'metadata' in request.args:
metadata = json.loads(b64decode(request.args['metadata'][0]))
if b'metadata' in request.args:
metadata = json.loads(b64decode(request.args[b'metadata'][0]))
self.attestation_metadata[(self.identity_overlay.my_peer, attribute_name)] = metadata
self.attestation_overlay.request_attestation(peer, attribute_name, key, metadata)
return ""
if request.args['type'][0] == 'attest':
mid_b64 = request.args['mid'][0]
attribute_name = request.args['attribute_name'][0]
attribute_value_b64 = request.args['attribute_value'][0]
return b""
if request.args[b'type'][0] == b'attest':
mid_b64 = request.args[b'mid'][0]
attribute_name = request.args[b'attribute_name'][0].decode('utf-8')
attribute_value_b64 = request.args[b'attribute_value'][0]
outstanding = self.attestation_requests.pop((mid_b64, attribute_name))
outstanding[0].callback(b64decode(attribute_value_b64))
return ""
if request.args['type'][0] == 'allow_verify':
mid_b64 = request.args['mid'][0]
attribute_name = request.args['attribute_name'][0]
return b""
if request.args[b'type'][0] == b'allow_verify':
mid_b64 = request.args[b'mid'][0]
attribute_name = request.args[b'attribute_name'][0].decode('utf-8')
self.verify_requests[(mid_b64, attribute_name)].callback(True)
return ""
if request.args['type'][0] == 'verify':
mid_b64 = request.args['mid'][0]
attribute_hash = b64decode(request.args['attribute_hash'][0])
return b""
if request.args[b'type'][0] == b'verify':
mid_b64 = request.args[b'mid'][0]
attribute_hash = b64decode(request.args[b'attribute_hash'][0].decode('utf-8'))
reference_values = [binary_relativity_sha256_4(b64decode(v))
for v in request.args['attribute_values'][0].split(',')]
for v in request.args[b'attribute_values'][0].split(b',')]
peer = self.get_peer_from_mid(mid_b64)
if peer:
self.verification_output[b64decode(request.args['attribute_hash'][0])] =\
[(b64decode(v), 0.0) for v in request.args['attribute_values'][0].split(',')]
self.attestation_overlay.verify_attestation_values(peer.address, attribute_hash, reference_values, self.on_verification_results)
return ""
return ""
self.verification_output[b64decode(request.args[b'attribute_hash'][0])] =\
[(b64decode(v), 0.0) for v in request.args[b'attribute_values'][0].split(b',')]
self.attestation_overlay.verify_attestation_values(peer.address, attribute_hash, reference_values,
self.on_verification_results)
return b""
return b""
12 changes: 6 additions & 6 deletions ipv8/REST/root_endpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ def __init__(self, session):
"""
resource.Resource.__init__(self)
self.session = session
self.putChild("attestation", AttestationEndpoint(session))
self.putChild("network", NetworkEndpoint(session))
self.putChild("trustchain", TrustchainEndpoint(session))
self.putChild("overlays", OverlaysEndpoint(session))
self.putChild("dht", DHTEndpoint(session))
self.putChild("tunnel", TunnelEndpoint(session))
self.putChild(b'attestation', AttestationEndpoint(session))
self.putChild(b'network', NetworkEndpoint(session))
self.putChild(b'trustchain', TrustchainEndpoint(session))
self.putChild(b'overlays', OverlaysEndpoint(session))
self.putChild(b'dht', DHTEndpoint(session))
self.putChild(b'tunnel', TunnelEndpoint(session))
2 changes: 1 addition & 1 deletion ipv8/attestation/wallet/community.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ def on_attestation_complete(self, unserialized, secret_key, peer, name, hash):
"""
We got an Attestation delivered to us.
"""
self.attestation_keys[str(hash)] = secret_key
self.attestation_keys[cast_to_bin(hash)] = secret_key
self.database.insert_attestation(unserialized, secret_key)
self.attestation_request_complete_callback(self.my_peer, name, hash, peer)

Expand Down
Empty file added ipv8/test/REST/__init__.py
Empty file.
Loading

0 comments on commit f4b2ec6

Please sign in to comment.