# -*- coding: utf-8 -*-
#
# Copyright (C) 2007 daelstorm. All rights reserved.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# Previous copyright below
# Copyright (c) 2003-2004 Hyriand. All rights reserved.
#
# Based on code from PySoulSeek, original copyright note:
# Copyright (c) 2001-2003 Alexander Kanavin. All rights reserved.
import struct
import types
import zlib
import os, sys
from utils import _
from utils import *
from logfacility import log
from itertools import count
""" This module contains message classes, that networking and UI thread
exchange. Basically there are three types of messages: internal messages,
server messages and p2p messages (between clients)."""
counter = count(100)
def newId():
global counter
Id = counter.next()
return Id
# Python objects cannot be used as a source to determine the network object,
# since diff. OS/Arch will have diff. ranges for Integers, Longs, etc.
#
# By default they are all unsigned unless noted otherwise
class NetworkBaseType(object):
"""Base class for other network types."""
def __init__(self, value):
self.value = value
class NetowrkShortIntTye(NetworkBaseType):
"""Cast to 0 :
try:
import socket
pos, self.ip = pos+4, socket.inet_ntoa(self.strrev(message[pos:pos+4]))
# Unknown number
except Exception, error:
log.addwarning("Error unpacking IP address: %s" % (error,))
try:
# MD5 hexdigest of the password you sent
if len(message[pos:]) > 0:
pos, self.checksum = self.getObject(message, types.StringType, pos)
#print self.checksum
except Exception, error:
# Not an official client on the official server
pass
class ChangePassword(ServerMessage):
""" We sent this to the server to change our password
We receive a response if our password changes. """
def __init__(self, password=None):
self.password = password
def makeNetworkMessage(self):
return self.packObject(self.password)
def parseNetworkMessage(self, message):
pos, self.password = self.getObject(message, types.StringType)
class SetWaitPort(ServerMessage):
""" Send this to server to indicate port number that we listen on."""
def __init__(self, port=None):
self.port = port
def makeNetworkMessage(self):
#print "22-" + repr(self.packObject(self.port))
#print "22+" + repr(self.packObject(NetworkIntType(self.port)))
return self.packObject(NetworkIntType(self.port))
class GetPeerAddress(ServerMessage):
""" Used to find out a peer's (ip, port) address."""
def __init__(self, user = None):
self.user = user
def makeNetworkMessage(self):
return self.packObject(self.user)
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
import socket
pos, self.ip = pos+4, socket.inet_ntoa(self.strrev(message[pos:pos+4]))
pos, self.port = self.getObject(message, types.IntType, pos, 1)
class AddUser(ServerMessage):
""" Used to be kept updated about a user's status."""
def __init__(self, user = None):
self.user = user
self.status = None
self.avgspeed = None
self.downloadnum = None
self.files = None
self.dirs = None
self.country = None
self.privileged = None
def makeNetworkMessage(self):
return self.packObject(self.user)
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
pos, self.userexists = pos+1, ord(message[pos])
if len(message[pos:]) > 0:
pos, self.status = self.getObject(message, types.IntType, pos)
pos, self.avgspeed = self.getObject(message, types.IntType, pos)
pos, self.downloadnum = self.getObject(message, types.LongType, pos, getsignedint = 1)
pos, self.files = self.getObject(message, types.IntType, pos)
pos, self.dirs = self.getObject(message, types.IntType, pos)
if len(message[pos:]) > 0:
pos, self.country = self.getObject(message, types.StringType, pos)
class Unknown6(ServerMessage):
""" Message 6 """
def __init__(self, user=None):
self.user = user
def makeNetworkMessage(self):
return self.packObject(self.user)
def parseNetworkMessage(self, message):
self.debug()
pass
class RemoveUser(ServerMessage):
""" Used when we no longer want to be kept updated about a user's status."""
def __init__(self, user = None):
self.user = user
def makeNetworkMessage(self):
return self.packObject(self.user)
class GetUserStatus(ServerMessage):
""" Server tells us if a user has gone away or has returned"""
def __init__(self, user = None):
self.user = user
self.privileged = None
def makeNetworkMessage(self):
return self.packObject(self.user)
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
pos, self.status = self.getObject(message, types.IntType, pos)
# Exception handler is for Soulfind compatibility
try:
pos, self.privileged = pos+1, ord(message[pos])
except:
pass
class SetStatus(ServerMessage):
""" We send our new status to the server """
def __init__(self, status = None):
self.status = status
def makeNetworkMessage(self):
return self.packObject(self.status)
class NotifyPrivileges(ServerMessage):
""" Server tells us something about privileges"""
def __init__(self, token = None, user = None):
self.token = token
self.user = user
def parseNetworkMessage(self, message):
pos, self.token = self.getObject(message, types.IntType)
pos, self.user = self.getObject(message, types.StringType, pos)
def makeNetworkMessage(self):
#print "21-" + repr(self.packObject(self.token))
#print "21+" + repr(self.packObject(NetworkIntType(self.token)))
return self.packObject(self.token) + self.packObject(self.user)
class AckNotifyPrivileges(ServerMessage):
def __init__(self, token = None):
self.token = token
def parseNetworkMessage(self, message):
pos, self.token = self.getObject(message, types.IntType)
def makeNetworkMessage(self):
#print "20-" + repr(self.packObject(self.token))
#print "20+" + repr(self.packObject(NetworkIntType(self.token)))
return self.packObject(NetworkIntType(self.token))
class JoinPublicRoom(ServerMessage):
"""We want to join the Public Chat"""
def __init__(self, unknown = 0):
self.unknown = unknown
def makeNetworkMessage(self):
return self.packObject(NetworkIntType(self.unknown))
class LeavePublicRoom(ServerMessage):
"""We want to leave the Public Chat"""
def __init__(self, unknown = 0):
self.unknown = unknown
def makeNetworkMessage(self):
return self.packObject(NetworkIntType(self.unknown))
class PublicRoomMessage(ServerMessage):
"""The server sends us messages from random chatrooms"""
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.user = self.getObject(message, types.StringType, pos)
pos, self.msg = self.getObject(message, types.StringType, pos)
class SayChatroom(ServerMessage):
""" Either we want to say something in the chatroom, or someone did."""
def __init__(self, room = None, msg = None):
self.room = room
self.msg = msg
def makeNetworkMessage(self):
return self.packObject(self.room)+self.packObject(self.msg)
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.user = self.getObject(message, types.StringType, pos)
pos, self.msg = self.getObject(message, types.StringType, pos)
class UserData:
""" When we join a room the server send us a bunch of these,
for each user."""
def __init__(self, list):
self.status = list[0]
self.avgspeed = list[1]
self.downloadnum = list[2]
self.something = list[3]
self.files = list[4]
self.dirs = list[5]
self.slotsfull = list[6]
self.country = list[7]
class JoinRoom(ServerMessage):
""" Server sends us this message when we join a room. Contains users list
with data on everyone."""
def __init__(self, room = None, private = None):
self.room = room
self.private = private
self.owner = None
self.operators = []
def makeNetworkMessage(self):
if self.private is not None:
return self.packObject(self.room) + self.packObject(self.private)
return self.packObject(self.room)
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos1 = pos
pos, self.users = self.getUsers(message[pos:])
pos = pos1 + pos
if len(message[pos:]) > 0:
self.private=True
pos, self.owner = self.getObject(message, types.StringType, pos)
if len(message[pos:]) > 0 and self.private:
pos, numops = self.getObject(message, types.IntType, pos)
for i in range(numops):
pos, operator = self.getObject(message, types.StringType, pos)
self.operators.append(operator)
def getUsers(self, message):
pos, numusers = self.getObject(message, types.IntType)
users = []
for i in range(numusers):
pos, username = self.getObject(message, types.StringType, pos)
users.append([username, None, None, None, None, None, None, None, None])
pos, statuslen = self.getObject(message, types.IntType, pos)
for i in range(statuslen):
pos, users[i][1] = self.getObject(message, types.IntType, pos)
pos, statslen = self.getObject(message, types.IntType, pos)
for i in range(statslen):
pos, users[i][2] = self.getObject(message, types.IntType, pos, getsignedint=1)
pos, users[i][3] = self.getObject(message, types.IntType, pos)
pos, users[i][4] = self.getObject(message, types.IntType, pos)
pos, users[i][5] = self.getObject(message, types.IntType, pos)
pos, users[i][6] = self.getObject(message, types.IntType, pos)
pos, slotslen = self.getObject(message, types.IntType, pos)
for i in range(slotslen):
pos, users[i][7] = self.getObject(message, types.IntType, pos)
if len(message[pos:]) > 0:
pos, countrylen = self.getObject(message, types.IntType, pos)
for i in range(countrylen):
pos, users[i][8] = self.getObject(message, types.StringType, pos)
usersdict={}
for i in users:
usersdict[i[0]] = UserData(i[1:])
return pos, usersdict
class PrivateRoomUsers(ServerMessage):
""" We get this when we've created a private room."""
def __init__(self, room = None, numusers = None, users = None):
self.room = room
self.numusers = numusers
self.users = users
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.numusers = self.getObject(message, types.IntType, pos)
self.users = []
for i in range(self.numusers):
pos, user = self.getObject(message, types.StringType, pos)
self.users.append(user)
class PrivateRoomOwned(ServerMessage):
""" We get this when we've created a private room."""
def __init__(self, room = None, number = None):
self.room = room
self.number = number
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.number = self.getObject(message, types.IntType, pos)
self.operators = []
for i in range(self.number):
pos, user = self.getObject(message, types.StringType, pos)
self.operators.append(user)
class PrivateRoomAddUser(ServerMessage):
""" We get / receive this when we add a user to a private room."""
def __init__(self, room = None, user = None):
self.room = room
self.user = user
def makeNetworkMessage(self):
return self.packObject(self.room) + self.packObject(self.user)
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.user = self.getObject(message, types.StringType, pos)
class PrivateRoomDismember(ServerMessage):
""" We do this to remove our own membership of a private room."""
def __init__(self, room = None):
self.room = room
def makeNetworkMessage(self):
return self.packObject(self.room)
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
class PrivateRoomDisown(ServerMessage):
""" We do this to stop owning a private room."""
def __init__(self, room = None):
self.room = room
def makeNetworkMessage(self):
return self.packObject(self.room)
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
class PrivateRoomSomething(ServerMessage):
"""Unknown"""
def __init__(self, room = None):
self.room = room
def makeNetworkMessage(self):
return self.packObject(self.room)
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
self.debug()
class PrivateRoomRemoveUser(ServerMessage):
""" We get this when we've removed a user from a private room."""
def __init__(self, room = None, user = None):
self.room = room
self.user = user
def makeNetworkMessage(self):
return self.packObject(self.room) + self.packObject(self.user)
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.user = self.getObject(message, types.StringType, pos)
class PrivateRoomAdded(ServerMessage):
""" We are sent this when we are added to a private room."""
def __init__(self, room = None):
self.room = room
def makeNetworkMessage(self):
return self.packObject(self.room)
def parseNetworkMessage(self, message):
self.room = self.getObject(message, types.StringType)[1]
class PrivateRoomRemoved(ServerMessage):
""" We are sent this when we are removed from a private room."""
def __init__(self, room = None):
self.room = room
def makeNetworkMessage(self):
return self.packObject(self.room)
def parseNetworkMessage(self, message):
self.room = self.getObject(message, types.StringType)[1]
class PrivateRoomToggle(ServerMessage):
""" We send this when we want to enable or disable invitations to private rooms"""
def __init__(self, enabled = None):
self.enabled = enabled
def makeNetworkMessage(self):
return chr(self.enabled)
def parseNetworkMessage(self, message):
# When this is received, we store it in the config, and disable the appropriate menu item
pos, self.enabled = 1, bool(ord(message[0]))
class PrivateRoomAddOperator(ServerMessage):
""" We send this to add private room operator abilities to a user"""
def __init__(self, room = None, user = None):
self.room = room
self.user = user
def makeNetworkMessage(self):
return self.packObject(self.room) + self.packObject(self.user)
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.user = self.getObject(message, types.StringType, pos)
class PrivateRoomRemoveOperator(ServerMessage):
""" We send this to remove privateroom operator abilities from a user"""
def __init__(self, room = None, user = None):
self.room = room
self.user = user
def makeNetworkMessage(self):
return self.packObject(self.room) + self.packObject(self.user)
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.user = self.getObject(message, types.StringType, pos)
class PrivateRoomOperatorAdded(ServerMessage):
""" We receive this when given privateroom operator abilities"""
def __init__(self, room = None):
self.room = room
def makeNetworkMessage(self):
return self.packObject(self.room)
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
class PrivateRoomOperatorRemoved(ServerMessage):
""" We receive this when privateroom operator abilities are removed"""
def __init__(self, room = None):
self.room = room
def makeNetworkMessage(self):
return self.packObject(self.room)
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
#pos, self.username = self.getObject(message, types.StringType, pos)
class LeaveRoom(ServerMessage):
""" We send this when we want to leave a room."""
def __init__(self, room = None):
self.room = room
def makeNetworkMessage(self):
return self.packObject(self.room)
def parseNetworkMessage(self, message):
self.room = self.getObject(message, types.StringType)[1]
class UserJoinedRoom(ServerMessage):
""" Server tells us someone has just joined the room."""
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.username = self.getObject(message, types.StringType, pos)
i = [None, None, None, None, None, None, None, None]
pos, i[0] = self.getObject(message, types.IntType, pos)
pos, i[1] = self.getObject(message, types.IntType, pos, getsignedint=1)
for j in range(2, 7):
pos, i[j] =(self.getObject(message, types.IntType, pos))
if len(message[pos:]) > 0:
pos, i[7] = self.getObject(message, types.StringType, pos)
self.userdata = UserData(i)
class UserLeftRoom(ServerMessage):
""" Server tells us someone has just left the room."""
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.username = self.getObject(message, types.StringType, pos)
class RoomTickerState(ServerMessage):
""" Message 113 """
def __init__(self):
self.room = None
self.user = None
self.msgs = {}
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, n = self.getObject(message, types.IntType, pos)
for i in range(n):
pos, user = self.getObject(message, types.StringType, pos)
pos, msg = self.getObject(message, types.StringType, pos)
self.msgs[user] = msg
class RoomTickerAdd(ServerMessage):
""" Message 114 """
def __init__(self):
self.room = None
self.user = None
self.msg = None
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.user = self.getObject(message, types.StringType, pos)
pos, self.msg = self.getObject(message, types.StringType, pos)
class RoomTickerRemove(ServerMessage):
""" Message 115 """
def __init__(self, room = None):
self.user = None
self.room = room
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.user = self.getObject(message, types.StringType, pos)
class RoomTickerSet(ServerMessage):
""" Message 116 """
def __init__(self, room = None, msg = None):
self.room = room
if not msg:
self.msg = ""
else:
self.msg = msg
def makeNetworkMessage(self):
return self.packObject(self.room) + self.packObject(self.msg)
class ConnectToPeer(ServerMessage):
""" Either we ask server to tell someone else we want to establish a
connection with him or server tells us someone wants to connect with us.
Used when the side that wants a connection can't establish it, and tries
to go the other way around.
"""
def __init__(self, token = None, user = None, type = None):
self.token = token
self.user = user
self.type = type
def makeNetworkMessage(self):
return self.packObject(NetworkIntType(self.token))+self.packObject(self.user)+self.packObject(self.type)
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
pos, self.type = self.getObject(message, types.StringType, pos)
import socket
pos, self.ip = pos+4, socket.inet_ntoa(self.strrev(message[pos:pos+4]))
pos, self.port = self.getObject(message, types.IntType, pos, 1)
pos, self.token = self.getObject(message, types.IntType, pos)
if len(message[pos:]) > 0:
# Don't know what this is, may be some kind of status
pos, self.unknown = pos+1, ord(message[pos])
class MessageUser(ServerMessage):
""" Chat phrase sent to someone or received by us in private"""
def __init__(self, user = None, msg = None):
self.user = user
self.msg = msg
def makeNetworkMessage(self):
return self.packObject(self.user)+self.packObject(self.msg)
def parseNetworkMessage(self, message):
pos, self.msgid = self.getObject(message, types.IntType)
pos, self.timestamp = self.getObject(message, types.IntType, pos)
pos, self.user = self.getObject(message, types.StringType, pos)
pos, self.msg = self.getObject(message, types.StringType, pos)
class MessageAcked(ServerMessage):
""" Confirmation of private chat message.
If we don't send it, the server will keep sending the chat phrase to us.
"""
def __init__(self, msgid = None):
self.msgid = msgid
def makeNetworkMessage(self):
return self.packObject(NetworkIntType(self.msgid))
class FileSearch(ServerMessage):
""" We send this to the server when we search for something."""
""" Server send this to tell us someone is searching for something."""
def __init__(self, requestid = None, text = None):
self.searchid = requestid
self.searchterm = text
if text:
self.searchterm = ' '.join([x for x in text.split() if x != '-'])
def makeNetworkMessage(self):
return self.packObject(NetworkIntType(self.searchid))+self.packObject(self.searchterm)
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
pos, self.searchid = self.getObject(message, types.IntType, pos)
pos, self.searchterm = self.getObject(message, types.StringType, pos)
class WishlistSearch(FileSearch):
pass
class QueuedDownloads(ServerMessage):
""" Server sends this to indicate if someone has download slots available
or not. """
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
pos, self.slotsfull = self.getObject(message, types.IntType, pos)
class SendSpeed(ServerMessage):
""" We used to send this after a finished download to let the server update
the speed statistics for a user"""
def __init__(self, user = None, speed = None):
self.user = user
self.speed = speed
def makeNetworkMessage(self):
print "14-" + repr(self.packObject(self.user)+self.packObject(self.speed))
print "14+" + repr(self.packObject(self.user)+self.packObject(NetworkIntType(self.speed)))
return self.packObject(self.user)+self.packObject(NetworkIntType(self.speed))
class SendUploadSpeed(ServerMessage):
""" We now send this after a finished upload to let the server update
the speed statistics for a user"""
def __init__(self, speed = None):
self.speed = speed
def makeNetworkMessage(self):
return self.packObject(NetworkIntType(self.speed))
class SharedFoldersFiles(ServerMessage):
""" We send this to server to indicate the number of folder and files
that we share """
def __init__(self, folders = None, files = None):
self.folders = folders
self.files = files
def makeNetworkMessage(self):
return self.packObject(NetworkIntType(self.folders))+self.packObject(NetworkIntType(self.files))
class GetUserStats(ServerMessage):
""" Server sends this to indicate change in user's statistics"""
def __init__(self, user = None):
self.user = user
self.country = None
def makeNetworkMessage(self):
return self.packObject(self.user)
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
pos, self.avgspeed = self.getObject(message, types.IntType, pos, getsignedint = 1)
pos, self.downloadnum = self.getObject(message, types.LongType, pos, getsignedint = 1)
pos, self.files = self.getObject(message, types.IntType, pos)
pos, self.dirs = self.getObject(message, types.IntType, pos)
class Relogged(ServerMessage):
""" Message 41 """
""" Server sends this if someone else logged in under our nickname
and then disconnects us """
def parseNetworkMessage(self, message):
pass
class PlaceInLineResponse(ServerMessage):
""" Server sends this to indicate change in place in queue while we're
waiting for files from other peer """
def __init__(self, user = None, req = None, place = None):
self.req = req
self.user = user
self.place = place
def makeNetworkMessage(self):
print "11-" + repr(self.packObject(self.user)+self.packObject(self.req)+self.packObject(self.place))
print "11+" + repr(self.packObject(self.user)+self.packObject(NetworkIntType(self.req))+self.packObject(NetworkIntType(self.place)))
return self.packObject(self.user)+self.packObject(NetworkIntType(self.req))+self.packObject(NetworkIntType(self.place))
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
pos, self.req = self.getObject(message, types.IntType, pos)
pos, self.place = self.getObject(message, types.IntType, pos)
#print self.user, self.req, self.place
class RoomAdded(ServerMessage):
""" Server tells us a new room has been added"""
def parseNetworkMessage(self, message):
self.room = self.getObject(message, types.StringType)[1]
class RoomRemoved(ServerMessage):
""" Server tells us a room has been removed"""
def parseNetworkMessage(self, message):
self.room = self.getObject(message, types.StringType)[1]
class RoomList(ServerMessage):
""" Server tells us a list of rooms"""
def __init__(self):
pass
def makeNetworkMessage(self):
return ""
def parseNetworkMessage(self, message):
pos, numrooms = self.getObject(message, types.IntType)
self.rooms = []
self.ownedprivaterooms = []
self.otherprivaterooms = []
for i in range(numrooms):
pos, room = self.getObject(message, types.StringType, pos)
self.rooms.append([room, None])
pos, numusercounts = self.getObject(message, types.IntType, pos)
for i in range(numusercounts):
pos, usercount = self.getObject(message, types.IntType, pos)
self.rooms[i][1] = usercount
if len(message[pos:]) == 0:
return
(pos, self.ownedprivaterooms) = self._getRooms(pos, message)
(pos, self.otherprivaterooms) = self._getRooms(pos, message)
def _getRooms(self, originalpos, message):
try:
pos, numberofrooms = self.getObject(message, types.IntType, originalpos)
rooms = []
for i in range(numberofrooms):
pos, room = self.getObject(message, types.StringType, pos)
rooms.append([room, None])
pos, numberofusers = self.getObject(message, types.IntType, pos)
for i in range(numberofusers):
pos, usercount = self.getObject(message, types.IntType, pos)
rooms[i][1] = usercount
return (pos, rooms)
except Exception, error:
log.addwarning(_("Exception during parsing %(area)s: %(exception)s") % {'area':'RoomList', 'exception':error})
return (originalpos, [])
class ExactFileSearch(ServerMessage):
""" Someone is searching for a file with an exact name """
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
pos, self.req = self.getObject(message, types.IntType, pos)
pos, self.file = self.getObject(message, types.StringType, pos)
pos, self.folder = self.getObject(message, types.StringType, pos)
pos, self.size = self.getObject(message, types.LongType, pos, getsignedint = 1)
pos, self.checksum = self.getObject(message, types.IntType, pos)
class AdminMessage(ServerMessage):
""" A global message from the admin has arrived """
def parseNetworkMessage(self, message):
self.msg = self.getObject(message, types.StringType)[1]
class GlobalUserList(JoinRoom):
""" We send this to get a global list of all users online """
def __init__(self):
pass
def makeNetworkMessage(self):
return ""
def parseNetworkMessage(self, message):
pos, self.users = self.getUsers(message)
class TunneledMessage(ServerMessage):
def __init__(self, user = None, req = None, code = None, msg = None):
self.user = user
self.req = req
self.code = code
self.msg = msg
def makeNetworkMessage(self, message):
print "10-" + repr(self.packObject(self.req)+self.packObject(self.code))
print "10+" + repr(self.packObject(NetworkInttype(self.req))+self.packObject(NetworkIntType(self.code)))
return (self.packObject(self.user) +
self.packObject(NetworkInttype(self.req)) +
self.packObject(NetworkIntType(self.code)) +
self.packObject(self.msg))
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
pos, self.code = self.getObject(message, types.IntType, pos)
pos, self.req = self.getObject(message, types.IntType, pos)
pos, ip = pos+4, socket.inet_ntoa(self.strrev(message[pos:pos+4]))
pos, port = self.getObject(message, types.IntType, pos, 1)
self.addr = (ip, port)
pos, self.msg = self.getObject(message, types.StringType, pos)
class ParentMinSpeed(ServerMessage):
""" Message 83 """
def __init__(self):
pass
def parseNetworkMessage(self, message):
pos, self.num = self.getObject(message, types.IntType)
class ParentSpeedRatio(ParentMinSpeed):
""" Message 84 """
def __init__(self):
pass
def parseNetworkMessage(self, message):
pos, self.num = self.getObject(message, types.IntType)
class SearchParent(ServerMessage):
""" Message 73 """
def __init__(self, parentip = None):
self.parentip = parentip
def makeNetworkMessage(self):
import socket
ip = socket.inet_aton(self.strunreverse(self.parentip))
return self.packObject(ip)
class Msg85(ServerMessage):
pass
class ParentInactivityTimeout(ServerMessage):
# 86
def __init__(self):
pass
def parseNetworkMessage(self, message):
pos, self.seconds = self.getObject(message, types.IntType)
class SearchInactivityTimeout(ServerMessage):
# 87
def __init__(self):
pass
def parseNetworkMessage(self, message):
pos, self.seconds = self.getObject(message, types.IntType)
class MinParentsInCache(ServerMessage):
def __init__(self):
pass
def parseNetworkMessage(self, message):
pos, self.num = self.getObject(message, types.IntType)
class Msg12547(ServerMessage):
def __init__(self, conn):
self.conn = conn
def parseNetworkMessage(self, message):
pass
class UploadQueueNotification(PeerMessage):
def __init__(self, conn):
self.conn = conn
def makeNetworkMessage(self):
return ""
def parseNetworkMessage(self, message):
return ""
class Msg89(ServerMessage):
def __init__(self):
pass
def parseNetworkMessage(self, message):
pass
class DistribAliveInterval(ServerMessage):
""" Message 90 """
def __init__(self):
pass
def parseNetworkMessage(self, message):
pos, self.seconds = self.getObject(message, types.IntType)
class WishlistInterval(ServerMessage):
""" Message 104"""
def __init__(self):
pass
def parseNetworkMessage(self, message):
pos, self.seconds = self.getObject(message, types.IntType)
class PrivilegedUsers(ServerMessage):
""" Message 69 """
""" A list of those who made a donation """
def __init__(self):
pass
def parseNetworkMessage(self, message):
try:
x = zlib.decompress(message)
message = x[4:]
except Exception, error:
pass
self.users = []
pos, numusers = self.getObject(message, types.IntType)
for i in range(numusers):
pos, user = self.getObject(message, types.StringType, pos)
self.users.append(user)
class CheckPrivileges(ServerMessage):
""" Message 92 """
def __init__(self):
pass
def makeNetworkMessage(self):
return ""
def parseNetworkMessage(self, message):
pos, self.seconds = self.getObject(message, types.IntType)
class AddToPrivileged(ServerMessage):
""" Message 91 """
def __init__(self):
pass
def parseNetworkMessage(self, message):
l2, self.user = self.getObject(message, types.StringType)
class CantConnectToPeer(ServerMessage):
""" Message 1001 """
""" We send this to say we can't connect to peer after it has asked us
to connect. We receive this if we asked peer to connect and it can't do
this. So this message means a connection can't be established either way.
"""
def __init__(self, token = None, user = None):
self.token = token
self.user = user
def makeNetworkMessage(self):
#X print "9-" + repr(self.packObject(self.token))
#X print "9+" + repr(self.packObject(NetworkIntType(self.token)))
return (self.packObject(NetworkIntType(self.token)) +
self.packObject(self.user))
def parseNetworkMessage(self, message):
pos, self.token = self.getObject(message, types.IntType)
#class CantCreateRoom(ServerMessage):
#""" Server tells us a new room cannot be created"""
#def parseNetworkMessage(self, message):
#self.room = self.getObject(message, types.StringType)[1]
class ServerPing(ServerMessage):
""" Message 32 """
def makeNetworkMessage(self):
return ""
def parseNetworkMessage(self, message):
pass
class AddThingILike(ServerMessage):
""" Add item to our likes list """
def __init__(self, thing = None):
self.thing = thing
def makeNetworkMessage(self):
return self.packObject(self.thing)
class AddThingIHate(AddThingILike):
pass
class RemoveThingILike(ServerMessage):
""" Remove item from our likes list """
def __init__(self, thing = None):
self.thing = thing
def makeNetworkMessage(self):
return self.packObject(self.thing)
class RemoveThingIHate(RemoveThingILike):
pass
class UserInterests(ServerMessage):
def __init__(self, user = None):
self.user = user
self.likes = None
self.hates = None
def makeNetworkMessage(self):
# Request a users' interests
return self.packObject(self.user)
def parseNetworkMessage(self, message, pos=0):
# Receive a users' interests
pos, self.user = self.getObject(message, types.StringType, pos)
pos, likesnum = self.getObject(message, types.IntType, pos)
self.likes = []
for i in range(likesnum):
pos, key = self.getObject(message, types.StringType, pos)
self.likes.append(key)
pos, hatesnum = self.getObject(message, types.IntType, pos)
self.hates = []
for i in range(hatesnum):
pos, key = self.getObject(message, types.StringType, pos)
self.hates.append(key)
class GlobalRecommendations(ServerMessage):
def __init__(self):
self.recommendations = None
self.unrecommendations = None
def makeNetworkMessage(self):
return ""
def parseNetworkMessage(self, message):
self.unpack_recommendations(message)
def unpack_recommendations(self, message, pos = 0):
self.recommendations = {}
self.unrecommendations = {}
pos, num = self.getObject(message, types.IntType, pos)
for i in range(num):
pos, key = self.getObject(message, types.StringType, pos)
pos, rating = self.getObject(message, types.IntType, pos, getsignedint=1)
self.recommendations[key] = rating
if len(message[pos:]) == 0:
return
pos, num2 = self.getObject(message, types.IntType, pos)
for i in range(num2):
pos, key = self.getObject(message, types.StringType, pos)
pos, rating = self.getObject(message, types.IntType, pos, getsignedint=1)
self.unrecommendations[key] = rating
class Recommendations(GlobalRecommendations):
pass
class ItemRecommendations(GlobalRecommendations):
def __init__(self, thing = None):
GlobalRecommendations.__init__(self)
self.thing = thing
def makeNetworkMessage(self):
return self.packObject(self.thing)
def parseNetworkMessage(self, message):
pos, self.thing = self.getObject(message, types.StringType)
self.unpack_recommendations(message, pos)
class SimilarUsers(ServerMessage):
def __init__(self):
self.users = None
def makeNetworkMessage(self):
return ""
def parseNetworkMessage(self, message):
self.users = {}
pos, num = self.getObject(message, types.IntType)
for i in range(num):
pos, user = self.getObject(message, types.StringType, pos)
pos, rating = self.getObject(message, types.IntType, pos)
self.users[user] = rating
class ItemSimilarUsers(ServerMessage):
def __init__(self, thing = None):
self.thing = thing
self.users = None
def makeNetworkMessage(self):
return self.packObject(self.thing)
def parseNetworkMessage(self, message):
self.users = []
pos, self.thing = self.getObject(message, types.StringType)
pos, num = self.getObject(message, types.IntType, pos)
for i in range(num):
pos, user = self.getObject(message, types.StringType, pos)
self.users.append(user)
class RoomSearch(ServerMessage):
def __init__(self, room=None, requestid = None, text = None):
self.room = room
self.searchid = requestid
self.searchterm = text
if text:
self.searchterm = ' '.join([x for x in text.split() if x != '-'])
def makeNetworkMessage(self):
print "8-" + repr(self.packObject(self.searchid))
print "8+" + repr(self.packObject(NetworkIntType(self.searchid)))
return (self.packObject(self.room) +
self.packObject(NetworkIntType(self.searchid)) +
self.packObject(self.searchterm))
def parseNetworkMessage(self, message):
pos, self.room = self.getObject(message, types.StringType)
pos, self.searchid = self.getObject(message, types.IntType, pos)
pos, self.searchterm = self.getObject(message, types.StringType, pos)
def __repr__(self):
return "RoomSearch(room=%s, requestid=%s, text=%s)" % (self.room, self.searchid, self.searchterm)
class UserSearch(ServerMessage):
def __init__(self, user=None, requestid = None, text = None):
self.suser = user
self.searchid = requestid
self.searchterm = text
def makeNetworkMessage(self):
print "7-" + repr(self.packObject(self.searchid))
print "7+" + repr(self.packObject(NetworkIntType(self.searchid)))
return (self.packObject(self.suser) +
self.packObject(NetworkIntType(self.searchid)) +
self.packObject(self.searchterm))
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
pos, self.searchid = self.getObject(message, types.IntType, pos)
pos, self.searchterm = self.getObject(message, types.StringType, pos)
class PierceFireWall(PeerMessage):
""" This is the very first message send by peer that established a
connection, if it has been asked by other peer to do so. Token is taken
from ConnectToPeer server message."""
def __init__(self, conn, token = None):
self.conn = conn
self.token = token
def makeNetworkMessage(self):
#X print "6-" + repr(self.packObject(self.token))
#X print "6+" + repr(self.packObject(NetworkIntType(self.token)))
return self.packObject(NetworkIntType(self.token))
def parseNetworkMessage(self, message):
pos, self.token = self.getObject(message, types.IntType)
class PeerInit(PeerMessage):
""" This message is sent by peer that initiated a connection, not
necessarily a peer that actually established it. Token apparently
can be anything. Type is 'P' if it's anything but filetransfer, 'F'
otherwise"""
def __init__(self, conn, user = None, type = None, token = None):
self.conn = conn
self.user = user
self.type = type
self.token = token
def makeNetworkMessage(self):
#X print "5-" + repr(self.packObject(self.token))
#X print "5+" + repr(self.packObject(NetworkIntType(self.token)))
return (self.packObject(self.user) +
self.packObject(self.type) +
self.packObject(NetworkIntType(self.token)))
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType)
pos, self.type = self.getObject(message, types.StringType, pos)
pos, self.token = self.getObject(message, types.IntType, pos)
class PMessageUser(PeerMessage):
""" Chat phrase sent to someone or received by us in private"""
def __init__(self, conn = None, user = None, msg = None):
self.conn = conn
self.user = user
self.msg = msg
def makeNetworkMessage(self):
return (self.packObject(0) +
self.packObject(0) +
self.packObject(self.user) +
self.packObject(self.msg))
def parseNetworkMessage(self, message):
pos, self.msgid = self.getObject(message, types.IntType)
pos, self.timestamp = self.getObject(message, types.IntType, pos)
pos, self.user = self.getObject(message, types.StringType, pos)
pos, self.msg = self.getObject(message, types.StringType, pos)
class UserInfoRequest(PeerMessage):
""" Ask other peer to send user information, picture and all."""
def __init__(self, conn):
self.conn = conn
def makeNetworkMessage(self):
return ""
def parseNetworkMessage(self, message):
pass
class UserInfoReply(PeerMessage):
""" Peer responds with this, when asked for user information."""
def __init__(self, conn, descr = None, pic = None, totalupl = None, queuesize = None, slotsavail = None, uploadallowed=None):
self.conn = conn
self.descr = descr
self.pic = pic
self.totalupl = totalupl
self.queuesize = queuesize
self.slotsavail = slotsavail
self.uploadallowed = uploadallowed
def parseNetworkMessage(self, message):
pos, self.descr = self.getObject(message, types.StringType)
pos, self.has_pic = pos+1, message[pos]
if ord(self.has_pic):
pos, self.pic = self.getObject(message, types.StringType, pos)
pos, self.totalupl = self.getObject(message, types.IntType, pos)
pos, self.queuesize = self.getObject(message, types.IntType, pos)
pos, self.slotsavail = pos+1, ord(message[pos])
if len(message[pos:]) >= 4:
pos, self.uploadallowed = self.getObject(message, types.IntType, pos)
def makeNetworkMessage(self):
if self.pic is not None:
pic = chr(1) + self.packObject(self.pic)
else:
pic = chr(0)
#X print "4-" + repr(self.packObject(self.descr) + pic + self.packObject(self.totalupl) + self.packObject(self.queuesize) + chr(self.slotsavail) + self.packObject(self.uploadallowed))
#X print "4+" + repr(self.packObject(self.descr) + pic + self.packObject(NetworkIntType(self.totalupl)) + self.packObject(NetworkIntType(self.queuesize)) + chr(self.slotsavail) + self.packObject(NetworkIntType(self.uploadallowed)))
return (self.packObject(self.descr) +
pic +
self.packObject(NetworkIntType(self.totalupl)) +
self.packObject(NetworkIntType(self.queuesize)) +
chr(self.slotsavail) +
self.packObject(NetworkIntType(self.uploadallowed)))
class SharedFileList(PeerMessage):
""" Peer responds with this when asked for a filelist."""
def __init__(self, conn, shares = None):
self.conn = conn
self.list = shares
self.built = None
def parseNetworkMessage(self, message, nozlib = False):
if not nozlib:
try:
message=zlib.decompress(message)
except Exception, error:
log.addwarning(_("Exception during parsing %(area)s: %(exception)s") % {'area':'SharedFileList', 'exception':error})
self.list={}
return
if not self.doubleParseNetworkMessage(message):
self.list = {}
def _parseNetworkMessage(self, message, sizetype):
shares = []
pos, ndir = self.getObject(message, types.IntType)
for i in range(ndir):
pos, directory = self.getObject(message, types.StringType, pos)
pos, nfiles = self.getObject(message, types.IntType, pos)
files = []
for j in range(nfiles):
pos, code = pos+1, ord(message[pos])
pos, name = self.getObject(message, types.StringType, pos)
pos, size = self.getObject(message, sizetype, pos, getsignedint = True, printerror=False)
if message[pos-1] == '\xff':
# Buggy SLSK?
# Some file sizes will be huge if unpacked as a signed
# LongType, namely somewhere in the area of 17179869 Terabytes.
# It would seem these files are indeed big, but in the Gigabyte range.
# The following will undo the damage (and if we fuck up it
# doesn't matter, it can never be worse than reporting 17
# exabytes for a single file)
size = struct.unpack("Q", '\xff'*struct.calcsize("Q"))[0] - size
pos, ext = self.getObject(message, types.StringType, pos, printerror=False)
pos, numattr = self.getObject(message, types.IntType, pos, printerror=False)
attrs = []
for k in range(numattr):
pos, attrnum = self.getObject(message, types.IntType, pos, printerror=False)
pos, attr = self.getObject(message, types.IntType, pos, printerror=False)
attrs.append(attr)
files.append([code, name, size, ext, attrs])
shares.append((directory, files))
self.list = shares
def makeNetworkMessage(self, nozlib = 0, rebuild=False):
# Elaborate hack, to save CPU
# Store packed message contents in self.built, and use
# instead of repacking it, unless rebuild is True
if not rebuild and self.built is not None:
return self.built
msg = ""
msg = msg + self.packObject(len(self.list.keys()))
for (key, value) in self.list.iteritems():
msg = msg + self.packObject(key.replace(os.sep,"\\")) + value
if not nozlib:
self.built = zlib.compress(msg)
else:
self.built = msg
return self.built
class GetSharedFileList(PeerMessage):
""" Ask the peer for a filelist. """
def __init__(self, conn):
self.conn = conn
def parseNetworkMessage(self, message):
pass
def makeNetworkMessage(self):
return ""
class FileSearchRequest(PeerMessage):
""" We send this to the peer when we search for something."""
""" Peer sends this to tell us he is searching for something."""
def __init__(self, conn, requestid = None, text = None):
self.conn = conn
self.requestid = requestid
self.text = text
def makeNetworkMessage(self):
print "2-" + repr(self.packObject(self.requestid)+self.packObject(self.text))
print "2+" + repr(self.packObject(NetworkIntType(self.requestid))+self.packObject(self.text))
return self.packObject(NetworkIntType(self.requestid))+self.packObject(self.text)
def parseNetworkMessage(self, message):
pos, self.searchid = self.getObject(message, types.IntType)
pos, self.searchterm = self.getObject(message, types.StringType, pos)
class FileSearchResult(PeerMessage):
""" Peer sends this when it has a file search match."""
def __init__(self, conn, user = None, geoip = None, token = None, shares = None, fileindex = None, freeulslots = None, ulspeed = None, inqueue = None, fifoqueue = None):
self.conn = conn
self.user = user
self.geoip = geoip
self.token = token
self.list = shares
self.fileindex = fileindex
self.freeulslots = freeulslots
self.ulspeed = ulspeed
self.inqueue = inqueue
self.fifoqueue = fifoqueue
self.pos = 0
def parseNetworkMessage(self, message):
message = zlib.decompress(message)
if not self.doubleParseNetworkMessage(message):
self.list = {}
def _parseNetworkMessage(self, message, sizetype):
self.pos, self.user = self.getObject(message, types.StringType)
self.pos, self.token = self.getObject(message, types.IntType, self.pos)
self.pos, nfiles = self.getObject(message, types.IntType, self.pos)
shares = []
for i in range(nfiles):
self.pos, code = self.pos+1, ord(message[self.pos])
self.pos, name = self.getObject(message, types.StringType, self.pos)
# suppressing errors with unpacking, can be caused by incorrect sizetype
self.pos, size = self.getObject(message, sizetype, self.pos, printerror=False)
self.pos, ext = self.getObject(message, types.StringType, self.pos, printerror=False)
self.pos, numattr = self.getObject(message, types.IntType, self.pos, printerror=False)
attrs = []
if numattr:
for j in range(numattr):
self.pos, attrnum = self.getObject(message, types.IntType, self.pos, printerror=False)
self.pos, attr = self.getObject(message, types.IntType, self.pos, printerror=False)
attrs.append(attr)
shares.append([code, name, size, ext, attrs])
self.list = shares
self.pos, self.freeulslots = self.pos+1, ord(message[self.pos])
self.pos, self.ulspeed = self.getObject(message, types.IntType, self.pos, getsignedint=1)
self.pos, self.inqueue = self.getObject(message, types.IntType, self.pos)
def makeNetworkMessage(self):
filelist = []
for i in self.list:
try:
filelist.append(self.fileindex[str(i)])
except:
pass
if self.fifoqueue:
queuesize = self.inqueue[0]
else:
count = 0
for i in filelist:
if i[0][-4:].lower() == ".ogg":
count += 1
else:
count -= 1
if count > 0:
queuesize = self.inqueue[1]
else:
queuesize = self.inqueue[0]
msg = (self.packObject(self.user) +
self.packObject(NetworkIntType(self.token)) +
self.packObject(NetworkIntType(len(filelist))))
for i in filelist:
msg += (chr(1) +
self.packObject(i[0].replace(os.sep,"\\")) +
self.packObject(NetworkLongLongType(i[1])))
if i[2] is None:
# No metadata
msg += self.packObject('')+self.packObject(0)
else:
#FileExtension, NumAttributes,
msg += self.packObject("mp3") + self.packObject(3)
msg += (self.packObject(0) +
self.packObject(NetworkIntType(i[2][0])) +
self.packObject(1) +
self.packObject(NetworkIntType(i[3])) +
self.packObject(2) +
self.packObject(i[2][1]))
msg += (chr(self.freeulslots) +
self.packObject(NetworkIntType(self.ulspeed)) +
self.packObject(NetworkIntType(queuesize)))
return zlib.compress(msg)
class FolderContentsRequest(PeerMessage):
""" Ask the peer to send us the contents of a single folder. """
def __init__(self, conn, directory = None):
self.conn = conn
self.dir = directory
def makeNetworkMessage(self):
return self.packObject(1)+self.packObject(self.dir)
def parseNetworkMessage(self, message):
pos, self.something = self.getObject(message, types.IntType)
pos, self.dir = self.getObject(message, types.StringType, pos)
class FolderContentsResponse(PeerMessage):
""" Peer tells us the contents of a particular folder (with all subfolders)
"""
def __init__(self, conn, directory = None, shares = None):
self.conn = conn
self.dir = directory
self.list = shares
def parseNetworkMessage(self, message):
try:
message = zlib.decompress(message)
except Exception, error:
log.addwarning(_("Exception during parsing %(area)s: %(exception)s") % {'area':'FolderContentsResponse', 'exception':error})
self.list = {}
return
if not self.doubleParseNetworkMessage(message):
self.list = {}
def _parseNetworkMessage(self, message, sizetype):
shares = {}
pos, nfolders = self.getObject(message, types.IntType)
for h in range(nfolders):
pos, folder = self.getObject(message, types.StringType, pos)
shares[folder]={}
pos, ndir = self.getObject(message, types.IntType, pos)
for i in range(ndir):
pos, directory = self.getObject(message, types.StringType, pos)
pos, nfiles = self.getObject(message, types.IntType, pos)
shares[folder][directory] = []
for j in range(nfiles):
pos, code = pos+1, ord(message[pos])
pos, name = self.getObject(message, types.StringType, pos, printerror=False)
pos, size = self.getObject(message, sizetype, pos, getsignedint = 1, printerror=False)
pos, ext = self.getObject(message, types.StringType, pos, printerror=False)
pos, numattr = self.getObject(message, types.IntType, pos, printerror=False)
attrs = []
for k in range(numattr):
pos, attrnum = self.getObject(message, types.IntType, pos, printerror=False)
pos, attr = self.getObject(message, types.IntType, pos, printerror=False)
attrs.append(attr)
shares[folder][directory].append([code, name, size, ext, attrs])
self.list = shares
def makeNetworkMessage(self):
msg = self.packObject(1) + self.packObject(self.dir) + self.packObject(1) + self.packObject(self.dir) + self.packObject(len(self.list))
for i in self.list:
msg = msg+chr(1)+self.packObject(i[0])+self.packObject(i[1])+self.packObject(0)
if i[2] is None:
msg = msg + self.packObject('')+self.packObject(0)
else:
msg = msg + self.packObject("mp3") + self.packObject(3)
msg = msg + self.packObject(0) + self.packObject(i[2][0])+self.packObject(1)+ self.packObject(i[3])+self.packObject(2)+self.packObject(i[2][1])
return zlib.compress(msg)
class TransferRequest(PeerMessage):
""" Request a file from peer, or tell a peer that we want to send a file to
them. """
def __init__(self, conn, direction = None, req = None, file = None, filesize = None, realfile = None):
self.conn = conn
self.direction = direction
self.req = req
self.file = file # virtual file
self.realfile = realfile
self.filesize = filesize
def makeNetworkMessage(self):
msg = self.packObject(self.direction)+self.packObject(self.req)+self.packObject(self.file)
if self.filesize is not None and self.direction == 1:
msg = msg + self.packObject(NetworkLongLongType(self.filesize))
return msg
def parseNetworkMessage(self, message):
pos, self.direction = self.getObject(message, types.IntType)
pos, self.req = self.getObject(message, types.IntType, pos)
pos, self.file = self.getObject(message, types.StringType, pos)
if self.direction == 1:
pos, self.filesize = self.getObject(message, types.IntType, pos)
class TransferResponse(PeerMessage):
""" Response to the TreansferRequest - either we (or other peer) agrees, or
tells the reason for rejecting filetransfer. """
def __init__(self, conn, allowed = None, reason = None, req = None, filesize=None):
self.conn = conn
self.allowed = allowed
self.req = req
self.reason = reason
self.filesize = filesize
def makeNetworkMessage(self):
msg = self.packObject(NetworkIntType(self.req)) + chr(self.allowed)
if self.reason is not None:
msg = msg + self.packObject(self.reason)
if self.filesize is not None:
msg = msg + self.packObject(NetworkLongLongType(self.filesize))
return msg
def parseNetworkMessage(self, message):
pos, self.req = self.getObject(message, types.IntType)
pos, self.allowed = pos+1, ord(message[pos])
if message[pos:] != "":
if self.allowed:
pos, self.filesize = self.getObject(message, types.IntType, pos)
else:
pos, self.reason = self.getObject(message, types.StringType, pos)
class PlaceholdUpload(PeerMessage):
def __init__(self, conn, file = None):
self.conn = conn
self.file = file
def makeNetworkMessage(self):
return self.packObject(self.file)
def parseNetworkMessage(self, message):
pos, self.file = self.getObject(message, types.StringType)
class QueueUpload(PlaceholdUpload):
pass
class UploadFailed(PlaceholdUpload):
pass
class PlaceInQueue(PeerMessage):
def __init__(self, conn, filename = None, place = None):
self.conn = conn
self.filename = filename
self.place = place
def makeNetworkMessage(self):
return self.packObject(self.filename) + self.packObject(NetworkIntType(self.place))
def parseNetworkMessage(self, message):
pos, self.filename = self.getObject(message, types.StringType)
pos, self.place = self.getObject(message, types.IntType, pos)
class PlaceInQueueRequest(PlaceholdUpload):
pass
class QueueFailed(PeerMessage):
def __init__(self, conn, file = None, reason = None):
self.conn = conn
self.file = file
self.reason = reason
def makeNetworkMessage(self):
return self.packObject(self.file)+self.packObject(self.reason)
def parseNetworkMessage(self, message):
pos, self.file = self.getObject(message, types.StringType)
pos, self.reason = self.getObject(message, types.StringType, pos)
class FileRequest(PeerMessage):
""" Request a file from peer, or tell a peer that we want to send a file to
them. """
def __init__(self, conn, req = None):
self.conn = conn
self.req = req
def makeNetworkMessage(self):
msg = self.packObject(self.req)
return msg
class HaveNoParent(ServerMessage): #71
def __init__(self, noparent = None):
self.noparent = noparent
def makeNetworkMessage(self):
return chr(self.noparent)
class DistribAlive(DistribMessage):
def __init__(self, conn):
self.conn = conn
def parseNetworkMessage(self, message):
pass
class DistribSearch(DistribMessage):
""" Search request that arrives through the distributed network """
def __init__(self, conn):
self.conn = conn
def parseNetworkMessage(self, message):
if not self.doubleParseNetworkMessage(message):
log.addwarning(u'Hitme')
return False
def _parseNetworkMessage(self, message, sizetype):
pos, self.something = self.getObject(message, sizetype, printerror=False)
pos, self.user = self.getObject(message, types.StringType, pos, printerror=False)
pos, self.searchid = self.getObject(message, sizetype, pos, printerror=False)
pos, self.searchterm = self.getObject(message, types.StringType, pos, printerror=False)
class DistribBranchLevel(DistribMessage):
def __init__(self, conn):
self.conn = conn
def parseNetworkMessage(self, message):
pos, self.value = self.getObject(message, types.IntType)
#print message.__repr__()
class DistribBranchRoot(DistribMessage):
def __init__(self, conn):
self.conn = conn
def parseNetworkMessage(self, message):
#pos, self.value = self.getObject(message, types.IntType)
pos, self.user = self.getObject(message, types.StringType)
#print self.something, self.user
class DistribChildDepth(DistribMessage):
def __init__(self, conn):
self.conn = conn
def parseNetworkMessage(self, message):
pos, self.value = self.getObject(message, types.IntType)
#print self.something, self.user
class DistribMessage9(DistribMessage):
def __init__(self, conn):
self.conn = conn
def parseNetworkMessage(self, message):
#pos, self.value = self.getObject(message, types.IntType)
try:
x = zlib.decompress(message)
except:
self.debug()
#message = x[4:]
#pos, self.user = self.getObject(message, types.StringType)
#self.debug()
#print self.something, self.user
class BranchLevel(ServerMessage):
def __init__(self):
pass
def parseNetworkMessage(self, message):
pos, self.value = self.getObject(message, types.IntType)
#print message.__repr__()
class BranchRoot(ServerMessage):
def __init__(self):
pass
def parseNetworkMessage(self, message):
#pos, self.value = self.getObject(message, types.IntType)
pos, self.user = self.getObject(message, types.StringType)
#print self.something, self.user
class AcceptChildren(ServerMessage):
def __init__(self, enabled = None):
self.enabled = enabled
def makeNetworkMessage(self):
return chr(self.enabled)
class ChildDepth(ServerMessage):
def __init__(self):
pass
def parseNetworkMessage(self, message):
pos, self.value = self.getObject(message, types.IntType)
class NetInfo(ServerMessage):
""" Information about what nodes have been added/removed in the network """
def __init__(self):
pass
def parseNetworkMessage(self, message):
self.list = {}
pos, num = self.getObject(message, types.IntType)
for i in range(num):
pos, username = self.getObject(message, types.StringType, pos)
import socket
pos, ip = pos+4, socket.inet_ntoa(self.strrev(message[pos:pos+4]))
pos, port = self.getObject(message, types.IntType, pos)
self.list[username] = (ip, port)
class SearchRequest(ServerMessage):
""" Search request that arrives through the server"""
def __init__(self):
pass
def parseNetworkMessage(self, message):
pos, self.code = 1, ord(message[0])
pos, self.something = self.getObject(message, types.IntType, pos)
pos, self.user = self.getObject(message, types.StringType, pos)
pos, self.searchid = self.getObject(message, types.IntType, pos)
pos, self.searchterm = self.getObject(message, types.StringType, pos)
class UserPrivileged(ServerMessage):
""" Discover whether a user is privileged or not """
def __init__(self, user = None):
self.user = user
self.privileged = None
def makeNetworkMessage(self):
return self.packObject(self.user)
def parseNetworkMessage(self, message):
pos, self.user = self.getObject(message, types.StringType, pos)
pos, self.privileged = pos+1, bool(ord(message[pos]))
class GivePrivileges(ServerMessage):
""" Give (part) of your privileges to another user on the network """
def __init__(self, user = None, days = None):
self.user = user
self.days = days
def makeNetworkMessage(self):
return self.packObject(self.user) + self.packObject(self.days)
class PopupMessage(object):
"""For messages that should be shown to the user prominently, for example
through a popup. Should be used sparsely."""
def __init__(self, title, message):
self.title = title
self.message = message