Example #1
0
 def get_result(result):
     try:
         verify_key = nacl.signing.VerifyKey(node_to_ask.pubkey)
         verify_key.verify(result[1][0], result[1][1])
         m = objects.Metadata()
         m.ParseFromString(result[1][0])
         if not os.path.isfile(DATA_FOLDER + 'cache/' + m.avatar_hash.encode("hex")):
             self.get_image(node_to_ask, m.avatar_hash)
         return m
     except Exception:
         return None
    def follow(self, node_to_follow):
        """
        Sends a follow message to another node in the network. The node must be online
        to receive the message. The message contains a signed, serialized `Follower`
        protobuf object which the recipient will store and can send to other nodes,
        proving you are following them. The response is a signed `Metadata` protobuf
        that will store in the db.
        """
        def save_to_db(result):
            if result[0] and result[1][0] == "True":
                try:
                    u = objects.Following.User()
                    u.guid = node_to_follow.id
                    u.signed_pubkey = node_to_follow.signed_pubkey
                    m = objects.Metadata()
                    m.ParseFromString(result[1][1])
                    u.metadata.MergeFrom(m)
                    u.signature = result[1][2]
                    pubkey = node_to_follow.signed_pubkey[64:]
                    verify_key = nacl.signing.VerifyKey(pubkey)
                    verify_key.verify(result[1][1], result[1][2])
                    self.db.FollowData().follow(u)
                    return True
                except Exception:
                    return False
            else:
                return False

        proto = Profile(self.db).get(False)
        m = objects.Metadata()
        m.name = proto.name
        m.handle = proto.handle
        m.avatar_hash = proto.avatar_hash
        m.short_description = proto.short_description
        m.nsfw = proto.nsfw
        f = objects.Followers.Follower()
        f.guid = self.kserver.node.id
        f.following = node_to_follow.id
        f.signed_pubkey = self.kserver.node.signed_pubkey
        f.metadata.MergeFrom(m)
        signature = self.signing_key.sign(f.SerializeToString())[:64]
        d = self.protocol.callFollow(node_to_follow, f.SerializeToString(),
                                     signature)
        self.log.info("sending follow request to %s" % node_to_follow)
        return d.addCallback(save_to_db)
Example #3
0
 def save_to_db(result):
     if result[0] and result[1][0] == "True":
         try:
             u = objects.Following.User()
             u.guid = node_to_follow.id
             u.pubkey = node_to_follow.pubkey
             m = objects.Metadata()
             m.ParseFromString(result[1][1])
             u.metadata.MergeFrom(m)
             u.signature = result[1][2]
             verify_key = nacl.signing.VerifyKey(node_to_follow.pubkey)
             verify_key.verify(result[1][1], result[1][2])
             self.db.FollowData().follow(u)
             return True
         except Exception:
             return False
     else:
         return False