def rpc_get_ratings(self, sender, listing_hash=None): a = "ALL" if listing_hash is None else listing_hash.encode("hex") self.log.info("serving ratings for contract %s to %s" % (a, sender)) self.router.addContact(sender) try: ratings = [] if listing_hash: for rating in self.db.Ratings().get_ratings( listing_hash.encode("hex")): ratings.append( json.loads(rating[0], object_pairs_hook=OrderedDict)) else: proto = self.db.ListingsStore().get_proto() l = Listings() l.ParseFromString(proto) for listing in l.listing: for rating in self.db.Ratings().get_ratings( listing.contract_hash.encode("hex")): ratings.append( json.loads(rating[0], object_pairs_hook=OrderedDict)) ret = json.dumps(ratings).encode("zlib") return [str(ret), self.signing_key.sign(ret)[:64]] except Exception: self.log.warning("could not load ratings for contract %s" % a) return None
def parse_results(values): if values is not None: for v in values: try: val = Value() val.ParseFromString(v) n = objects.Node() n.ParseFromString(val.serializedData) node_to_ask = Node( n.guid, n.nodeAddress.ip, n.nodeAddress.port, n.publicKey, None if not n.HasField("relayAddress") else (n.relayAddress.ip, n.relayAddress.port), n.natType, n.vendor) if n.guid == KeyChain(self.factory.db).guid: proto = self.factory.db.listings.get_proto() l = Listings() l.ParseFromString(proto) for listing in l.listing: if listing.contract_hash == val.valueKey: respond(listing, node_to_ask) else: self.factory.mserver.get_contract_metadata(node_to_ask, val.valueKey)\ .addCallback(respond, node_to_ask) except Exception: pass
def test_addListing(self): self.ls.delete_all_listings() self.ls.add_listing(self.lm) l = self.ls.get_proto() val = Listings() val.ParseFromString(l) self.assertEqual(self.lm, val.listing[0])
def test_deleteListing(self): self.ls.delete_all_listings() self.ls.add_listing(self.lm) self.ls.delete_listing(self.test_hash) l = self.ls.get_proto() val = Listings() val.ParseFromString(l) self.assertEqual(0, len(val.listing)) # Try to delete when table is already empty self.ls.delete_all_listings() self.assertEqual(None, self.ls.delete_listing(self.test_hash))
def rpc_get_listings(self, sender): self.log.info("serving store listings to %s" % sender) self.router.addContact(sender) try: p = Profile(self.db).get() l = Listings() l.ParseFromString(self.db.ListingsStore().get_proto()) l.handle = p.handle l.avatar_hash = p.avatar_hash return [l.SerializeToString(), self.signing_key.sign(l.SerializeToString())[:64]] except Exception: self.log.warning("could not find any listings in the database") return None
def delete_listing(self, hash_value): cursor = self.db.cursor() ser = self.get_proto() if ser is None: return l = Listings() l.ParseFromString(ser) for listing in l.listing: if listing.contract_hash == hash_value: l.listing.remove(listing) cursor.execute('''INSERT OR REPLACE INTO listings(id, serializedListings) VALUES (?,?)''', (1, l.SerializeToString())) self.db.commit()
def rpc_get_contract_metadata(self, sender, contract_hash): self.log.info("serving metadata for contract %s to %s" % (contract_hash.encode("hex"), sender)) self.router.addContact(sender) try: proto = self.db.ListingsStore().get_proto() l = Listings() l.ParseFromString(proto) for listing in l.listing: if listing.contract_hash == contract_hash: ser = listing.SerializeToString() return [ser, self.signing_key.sign(ser)[:64]] except Exception: self.log.warning("could not find metadata for contract %s" % contract_hash.encode("hex")) return None
def add_listing(self, proto): """ Will also update an existing listing if the contract hash is the same. """ cursor = self.db.cursor() l = Listings() ser = self.get_proto() if ser is not None: l.ParseFromString(ser) for listing in l.listing: if listing.contract_hash == proto.contract_hash: l.listing.remove(listing) l.listing.extend([proto]) cursor.execute('''INSERT OR REPLACE INTO listings(id, serializedListings) VALUES (?,?)''', (1, l.SerializeToString())) self.db.commit()
def rpc_get_contract_metadata(self, sender, contract_hash): self.log.info("Fetching metadata for contract %s" % hexlify(contract_hash)) self.router.addContact(sender) try: proto = ListingsStore().get_proto() l = Listings() l.ParseFromString(proto) for listing in l.listing: if listing.contract_hash == contract_hash: ser = listing.SerializeToString() return [ser, self.signing_key.sign(ser)[:64]] except Exception: self.log.warning("Could not find metadata for contract %s" % hexlify(contract_hash)) return ["None"]
def rpc_get_listings(self, sender): self.log.info("serving store listings to %s" % sender) self.audit.record(sender.id.encode("hex"), "GET_LISTINGS") self.router.addContact(sender) try: p = Profile(self.db).get() l = Listings() l.ParseFromString(self.db.listings.get_proto()) l.handle = p.handle l.avatar_hash = p.avatar_hash for listing in l.listing: if listing.hidden: l.listing.remove(listing) return [ l.SerializeToString(), self.signing_key.sign(l.SerializeToString())[:64] ] except Exception: self.log.warning("could not find any listings in the database") return None
def parse_results(values): if values is not None: for v in values: try: val = Value() val.ParseFromString(v) n = objects.Node() n.ParseFromString(val.serializedData) node_to_ask = Node(n.guid, n.ip, n.port, n.signedPublicKey, True) if n.guid == KeyChain(self.factory.db).guid: proto = self.factory.db.ListingsStore().get_proto() l = Listings() l.ParseFromString(proto) for listing in l.listing: if listing.contract_hash == val.valueKey: respond(listing, node_to_ask) else: self.factory.mserver.get_contract_metadata(node_to_ask, val.valueKey)\ .addCallback(respond, node_to_ask) except Exception: pass