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
Exemple #2
0
 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])
Exemple #4
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))
Exemple #5
0
 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()
Exemple #7
0
 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()
Exemple #9
0
 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"]
Exemple #10
0
 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
Exemple #11
0
 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