Редакция 2 | К новейшей редакции | Только различия | Не учитывать пробелы | Содержимое файла | Авторство | Последнее изменение | Открыть журнал | RSS
Редакция 2 | Редакция 3 | ||
---|---|---|---|
1 | # -*- coding: utf-8 -*-
|
1 | # -*- coding: utf-8 -*-
|
2 | import sys |
2 | import sys |
3 | 3 | ||
4 | class PacketProcessor:
|
4 | class PacketProcessor:
|
5 | """ Class for processing tcp packets,
|
5 | """ Class for processing tcp packets,
|
6 | and make DC++ packets. (Merge packets from
|
6 | and make DC++ packets. (Merge packets from
|
7 | one command). """
|
7 | one command). """
|
8 | def __init__(self): |
8 | def __init__(self): |
9 | """ Clear buffer and initialize class. """
|
9 | """ Clear buffer and initialize class. """
|
10 | buffer = "" |
10 | buffer = "" |
11 | 11 | ||
12 | def _isFull(self, command): |
12 | def _isFull(self, command): |
13 | """ Check buffer for full command. """
|
13 | """ Check buffer for full command. """
|
14 | if len(command) == 0: |
14 | if len(command) == 0: |
15 | return False |
15 | return False |
16 | if command[len(command) - 1] == '|': |
16 | if command[len(command) - 1] == '|': |
17 | return True |
17 | return True |
18 | else:
|
18 | else:
|
19 | return False |
19 | return False |
20 | 20 | ||
21 | def Process(self, socket, packet, commandProcessor): |
21 | def Process(self, socket, packet, commandProcessor): |
22 | """ Process new tcp packet. """
|
22 | """ Process new tcp packet. """
|
23 | # Save previous packets
|
23 | # Save previous packets
|
24 | prev = self.buffer |
24 | prev = self.buffer |
25 | # Clear buffer
|
25 | # Clear buffer
|
26 | self.buffer = "" |
26 | self.buffer = "" |
27 | # Merge previous and packet
|
27 | # Merge previous and packet
|
28 | buf = prev + packet
|
28 | buf = prev + packet
|
29 | # Split
|
29 | # Split
|
30 | commands = buf.split('|') |
30 | commands = buf.split('|') |
31 | # If Merge result not is full command.
|
31 | # If Merge result not is full command.
|
32 | if not self._isFull(buf): |
32 | if not self._isFull(buf): |
33 | # If count of commands in Merge result is 1
|
33 | # If count of commands in Merge result is 1
|
34 | if len(commands) == 1: |
34 | if len(commands) == 1: |
35 | # Save Merge result to buffer
|
35 | # Save Merge result to buffer
|
36 | self.buffer = commands[0] |
36 | self.buffer = commands[0] |
37 | commands = [] |
37 | commands = [] |
38 | else:
|
38 | else:
|
39 | # Save first from all commands to buffer
|
39 | # Save first from all commands to buffer
|
40 | self.buffer = commands[len(commands) - 1] |
40 | self.buffer = commands[len(commands) - 1] |
41 | commands = commands[0:len(commands)-1] |
41 | commands = commands[0:len(commands)-1] |
42 | # Process every command
|
42 | # Process every command
|
43 | for i in commands: |
43 | for i in commands: |
44 | commandProcessor(i, socket) |
44 | commandProcessor(i, socket) |
45 | 45 | ||
46 | def ClearBuffer(self): |
46 | def ClearBuffer(self): |
47 | self.buffer = "" |
47 | self.buffer = "" |
48 | 48 | ||
49 | 49 | ||
50 | def createKey(lock): |
50 | def createKey(lock): |
51 | """ Function create key from lock for DC connections. """
|
51 | """ Function create key from lock for DC connections. """
|
52 | key = {} |
52 | key = {} |
53 | for i in xrange(1, len(lock)): |
53 | for i in xrange(1, len(lock)): |
54 | key[i] = ord(lock[i]) ^ ord(lock[i-1]) |
54 | key[i] = ord(lock[i]) ^ ord(lock[i-1]) |
55 | key[0] = ord(lock[0]) ^ ord(lock[len(lock)-1]) ^ ord(lock[len(lock)-2]) ^ 5 |
55 | key[0] = ord(lock[0]) ^ ord(lock[len(lock)-1]) ^ ord(lock[len(lock)-2]) ^ 5 |
56 | for i in xrange(0, len(lock)): |
56 | for i in xrange(0, len(lock)): |
57 | key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15) |
57 | key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15) |
58 | out = '' |
58 | out = '' |
59 | for i in xrange(0, len(lock)): |
59 | for i in xrange(0, len(lock)): |
60 | out += unichr(key[i]) |
60 | out += unichr(key[i]) |
61 | out = out.replace(u'\0', u'/%DCN000%/').replace(u'\5', u'/%DCN005%/').replace(u'\44', u'/%DCN036%/') |
61 | out = out.replace(u'\0', u'/%DCN000%/').replace(u'\5', u'/%DCN005%/').replace(u'\44', u'/%DCN036%/') |
62 | out = out.replace(u'\140', u'/%DCN096%/').replace(u'\174', u'/%DCN124%/').replace(u'\176', u'/%DCN126%/') |
62 | out = out.replace(u'\140', u'/%DCN096%/').replace(u'\174', u'/%DCN124%/').replace(u'\176', u'/%DCN126%/') |
63 | return out
|
63 | return out
|
64 | 64 | ||
65 | 65 |