コード例 #1
0
 def _encode_decode(self, encode, decode, message):
     result = encode(message)
     try:
         decode(None, 0, result[0])
         
     except DropPacket:
         raise
     except:
         pass
     return result
コード例 #2
0
    def _decode_mark_torrent(self, placeholder, offset, data):
        try:
            offset, dic = decode(data, offset)
        except ValueError:
            raise DropPacket("Unable to decode the payload")

        if not "infohash" in dic:
            raise DropPacket("Missing 'infohash'")
        infohash = dic["infohash"]
        if not (isinstance(infohash, str) and len(infohash) == 20):
            raise DropPacket("Invalid 'infohash' type or value")
        
        if not "timestamp" in dic:
            raise DropPacket("Missing 'timestamp'")
        timestamp = dic["timestamp"]
        if not isinstance(timestamp, (int, long)):
            raise DropPacket("Invalid 'timestamp' type or value")
        
        if not "type" in dic:
            raise DropPacket("Missing 'type'")
        type = dic["type"]
        if not (isinstance(type, unicode) and len(type) < 25):
            raise DropPacket("Invalid 'type' type or value")

        return offset, placeholder.meta.payload.implement(infohash, type, timestamp)
コード例 #3
0
    def _decode_comment(self, placeholder, offset, data):
        try:
            offset, dic = decode(data, offset)
        except ValueError:
            raise DropPacket("Unable to decode the payload")

        if not "text" in dic:
            raise DropPacket("Missing 'text'")
        text = dic["text"]
        if not (isinstance(text, unicode) and len(text) < 1024):
            raise DropPacket("Invalid 'text' type or value")
        
        if not "timestamp" in dic:
            raise DropPacket("Missing 'timestamp'")
        timestamp = dic["timestamp"]
        if not isinstance(timestamp, (int, long)):
            raise DropPacket("Invalid 'timestamp' type or value")

        reply_to_mid = dic.get("reply-to-mid", None)
        if reply_to_mid and not (isinstance(reply_to_mid, str) and len(reply_to_mid) == 20):
            raise DropPacket("Invalid 'reply-to-mid' type or value")
        
        reply_to_global_time = dic.get("reply-to-global-time", None)
        if reply_to_global_time and not isinstance(reply_to_global_time, (int, long)):
            raise DropPacket("Invalid 'reply-to-global-time' type")

        reply_after_mid = dic.get("reply-after-mid", None)
        if reply_after_mid and not (isinstance(reply_after_mid, str) and len(reply_after_mid) == 20):
            raise DropPacket("Invalid 'reply-after-mid' type or value")
        
        reply_after_global_time = dic.get("reply-after-global-time", None)
        if reply_after_global_time and not isinstance(reply_after_global_time, (int, long)):
            raise DropPacket("Invalid 'reply-after-global-time' type")

        playlist_mid = dic.get("playlist-mid", None)
        if playlist_mid and not (isinstance(playlist_mid, str) and len(playlist_mid) == 20):
            raise DropPacket("Invalid 'playlist-mid' type or value")
        
        playlist_global_time = dic.get("playlist-global-time", None)
        if playlist_global_time and not isinstance(playlist_global_time, (int, long)):
            raise DropPacket("Invalid 'playlist-global-time' type")
        
        if playlist_mid and playlist_global_time:
            try:
                packet_id, packet, message_name = self._get_message(playlist_global_time, playlist_mid)
                playlist = Packet(self._community.get_meta_message(message_name), packet, packet_id)
            except DropPacket:
                member = Member.get_instance(playlist_mid, public_key_available=False)
                raise DelayPacketByMissingMessage(self._community, member, [playlist_global_time])
        else:
            playlist = None
        
        infohash = dic.get("infohash", None)
        if infohash and not (isinstance(infohash, str) and len(infohash) == 20):
            raise DropPacket("Invalid 'infohash' type or value")
        return offset, placeholder.meta.payload.implement(text, timestamp, reply_to_mid, reply_to_global_time, reply_after_mid, reply_after_global_time, playlist, infohash)
コード例 #4
0
    def _decode_modification(self, placeholder, offset, data):
        try:
            offset, dic = decode(data, offset)
        except ValueError:
            raise DropPacket("Unable to decode the payload")

        if not "modification-type" in dic:
            raise DropPacket("Missing 'modification-type'")
        modification_type = dic["modification-type"]
        if not isinstance(modification_type, unicode):
            raise DropPacket("Invalid 'modification_type' type") 
        
        if not "modification-value" in dic:
            raise DropPacket("Missing 'modification-value'")
        modification_value = dic["modification-value"]
        if not (isinstance(modification_value, unicode) and len(modification_value) < 1024):
            raise DropPacket("Invalid 'modification_value' type or value") 
        
        if not "timestamp" in dic:
            raise DropPacket("Missing 'timestamp'")
        timestamp = dic["timestamp"]
        if not isinstance(timestamp, (int, long)):
            raise DropPacket("Invalid 'timestamp' type or value")
        
        if not "modification-on-mid" in dic:
            raise DropPacket("Missing 'modification-on-mid'")
        modification_on_mid = dic["modification-on-mid"]
        if not (isinstance(modification_on_mid, str) and len(modification_on_mid) == 20):
            raise DropPacket("Invalid 'modification-on-mid' type or value")

        if not "modification-on-global-time" in dic:
            raise DropPacket("Missing 'modification-on-global-time'")
        modification_on_global_time = dic["modification-on-global-time"]
        if not isinstance(modification_on_global_time, (int, long)):
            raise DropPacket("Invalid 'modification-on-global-time' type")
        
        packet_id, packet, message_name = self._get_message(modification_on_global_time, modification_on_mid)
        modification_on = Packet(self._community.get_meta_message(message_name), packet, packet_id)
        
        prev_modification_mid = dic.get("prev-modification-mid", None)
        if prev_modification_mid and not (isinstance(prev_modification_mid, str) and len(prev_modification_mid) == 20):
            raise DropPacket("Invalid 'prev-modification-mid' type or value")
        
        prev_modification_global_time = dic.get("prev-modification-global-time", None)
        if prev_modification_global_time and not isinstance(prev_modification_global_time, (int, long)):
            raise DropPacket("Invalid 'prev-modification-global-time' type")
        
        try:
            packet_id, packet, message_name = self._get_message(prev_modification_global_time, prev_modification_mid)
            prev_modification_packet = Packet(self._community.get_meta_message(message_name), packet, packet_id)
        except:
            prev_modification_packet = None

        return offset, placeholder.meta.payload.implement(modification_type, modification_value, timestamp, modification_on, prev_modification_packet, prev_modification_mid, prev_modification_global_time)
コード例 #5
0
 def _decode_channelsearch(self, placeholder, offset, data):
     try:
         offset, payload = decode(data, offset)
     except ValueError:
         raise DropPacket("Unable to decode the channelcast-payload")
     
     if not isinstance(payload, list):
         raise DropPacket("Invalid payload type")
     
     for keyword in payload:
         if not isinstance(keyword, unicode):
             raise DropPacket("Invalid 'keyword' type")
     return offset, placeholder.meta.payload.implement(payload)
コード例 #6
0
 def _decode_channelcast(self, placeholder, offset, data):
     try:
         offset, payload = decode(data, offset)
     except ValueError:
         raise DropPacket("Unable to decode the channelcast-payload")
     
     if not isinstance(payload, dict):
         raise DropPacket("Invalid payload type")
     
     for cid, infohashes in payload.iteritems():
         if not (isinstance(cid, str) and len(cid) == 20):
             raise DropPacket("Invalid 'cid' type or value")
         
         for infohash in infohashes:        
             if not (isinstance(infohash, str) and len(infohash) == 20):
                 raise DropPacket("Invalid 'infohash' type or value")
     return offset, placeholder.meta.payload.implement(payload)
コード例 #7
0
    def _decode_channel(self, placeholder, offset, data):
        try:
            offset, values = decode(data, offset)
            if len(values) != 2:
                raise ValueError
        except ValueError:
            raise DropPacket("Unable to decode the channel-payload")

        name = values[0]
        if not (isinstance(name, unicode) and len(name) < 256):
            raise DropPacket("Invalid 'name' type or value")

        description = values[1]
        if not (isinstance(description, unicode) and len(description) < 1024):
            raise DropPacket("Invalid 'description' type or value")

        return offset, placeholder.meta.payload.implement(name, description)
コード例 #8
0
    def _decode_moderation(self, placeholder, offset, data):
        try:
            offset, dic = decode(data, offset)
        except ValueError:
            raise DropPacket("Unable to decode the payload")

        if not "text" in dic:
            raise DropPacket("Missing 'text'")
        text = dic["text"]
        if not (isinstance(text, unicode) and len(text) < 1024):
            raise DropPacket("Invalid 'text' type or value")
        
        if not "timestamp" in dic:
            raise DropPacket("Missing 'timestamp'")
        timestamp = dic["timestamp"]
        if not isinstance(timestamp, (int, long)):
            raise DropPacket("Invalid 'timestamp' type or value")
        
        if not "severity" in dic:
            raise DropPacket("Missing 'severity'")
        severity = dic["severity"]
        if not isinstance(severity, (int, long)):
            raise DropPacket("Invalid 'severity' type or value")

        cause_mid = dic.get("cause-mid", None)
        if not (isinstance(cause_mid, str) and len(cause_mid) == 20):
            raise DropPacket("Invalid 'cause-mid' type or value")
        
        cause_global_time = dic.get("cause-global-time", None)
        if not isinstance(cause_global_time, (int, long)):
            raise DropPacket("Invalid 'cause-global-time' type")
        
        try:
            packet_id, packet, message_name = self._get_message(cause_global_time, cause_mid)
            cause_packet = Packet(self._community.get_meta_message(message_name), packet, packet_id)
            
        except DropPacket:
            member = Member.get_instance(cause_mid, public_key_available=False)
            raise DelayPacketByMissingMessage(self._community, member, [cause_global_time])
        
        return offset, placeholder.meta.payload.implement(text, timestamp, severity, cause_packet)
コード例 #9
0
 def _decode_torrent(self, placeholder, offset, data):
     uncompressed_data = zlib.decompress(data[offset:])
     offset = len(data)
     
     try:
         _, values = decode(uncompressed_data)
     except ValueError:
         raise DropPacket("Unable to decode the torrent-payload")
     
     infohash_time, name, files, trackers = values
     if len(infohash_time) != 28:
         raise DropPacket("Unable to decode the torrent-payload, got %d bytes expected 28"%(len(infohash_time)))
     infohash, timestamp = unpack_from('!20sQ', infohash_time)
         
     if not isinstance(name, unicode):
         raise DropPacket("Invalid 'name' type")
     
     if not isinstance(files, tuple):
         raise DropPacket("Invalid 'files' type")
     
     if len(files) == 0:
         raise DropPacket("Should have at least one file")
     
     for file in files:
         if len(file) != 2:
             raise DropPacket("Invalid 'file_len' type")
         
         path, length = file
         if not isinstance(path, unicode):
             raise DropPacket("Invalid 'files_path' type is %s"%type(path))
         if not isinstance(length, (int, long)):
             raise DropPacket("Invalid 'files_length' type is %s"%type(length))
     
     if not isinstance(trackers, tuple):
         raise DropPacket("Invalid 'trackers' type")
     for tracker in trackers:
         if not isinstance(tracker, str):
             raise DropPacket("Invalid 'tracker' type")
     
     return offset, placeholder.meta.payload.implement(infohash, timestamp, name, files, trackers)
コード例 #10
0
 def _decode_channelsearch_response(self, placeholder, offset, data):
     try:
         offset, payload = decode(data, offset)
     except ValueError:
         raise DropPacket("Unable to decode the channelcast-payload")
     
     if not isinstance(payload, tuple):
         raise DropPacket("Invalid payload type")
     
     keywords, torrents = payload
     for keyword in keywords:
         if not isinstance(keyword, unicode):
             raise DropPacket("Invalid 'keyword' type")
         
     for cid, infohashes in torrents.iteritems():
         if not (isinstance(cid, str) and len(cid) == 20):
             raise DropPacket("Invalid 'cid' type or value")
         
         for infohash in infohashes:        
             if not (isinstance(infohash, str) and len(infohash) == 20):
                 raise DropPacket("Invalid 'infohash' type or value")
         
     return offset, placeholder.meta.payload.implement(keywords, torrents)