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") try: 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) except DropPacket: member = self._community.get_member(mid=modification_on_mid) if not member: raise DelayPacketByMissingMember(self._community, modification_on_mid) raise DelayPacketByMissingMessage(self._community, member, modification_on_global_time) 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)
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 = self._community.get_member(mid=playlist_mid) if not member: raise DelayPacketByMissingMember(self._community, playlist_mid) 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)
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: members = self._community.dispersy.get_members_from_id(cause_mid) if not members: raise DelayPacketByMissingMember(self._community, cause_mid) member = members[0] raise DelayPacketByMissingMessage(self._community, member, cause_global_time) return offset, placeholder.meta.payload.implement( text, timestamp, severity, cause_packet)
def _decode_playlist_torrent(self, placeholder, offset, data): if len(data) < offset + 48: raise DropPacket("Unable to decode the payload") infohash, playlist_mid, playlist_global_time = unpack_from('!20s20sQ', data, offset) try: packet_id, packet, message_name = self._get_message(playlist_global_time, playlist_mid) except DropPacket: member = self._community.dispersy.get_member(mid=playlist_mid) if not member: raise DelayPacketByMissingMember(self._community, playlist_mid) raise DelayPacketByMissingMessage(self._community, member, playlist_global_time) playlist = Packet(self._community.get_meta_message(message_name), packet, packet_id) return offset + 48, placeholder.meta.payload.implement(infohash, playlist)