forked from jacklam718/myDesktop
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmyDesktopServerProtocol.py
110 lines (88 loc) · 3.53 KB
/
myDesktopServerProtocol.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/python
from twisted.internet.protocol import Protocol, Factory
from twisted.python import log
from message_defines import messageTypes as msgTypes
import sys
log.startLogging(sys.stdout)
class RDCServerProtocol(Protocol):
def __init__(self):
self._packet = ""
self._expected_len = 0
self.state = "UNREGISTERED"
def dataReceived(self, data):
try:
print(len(data), data)
buffer = data.split('@')
self._expected_len, data = int(buffer[0]), '@'.join(buffer[1:])
cmd = eval(data[:self._expected_len])
for key in cmd.keys( ):
args = cmd[key]
self._expected_len = 0
self.handler(option=key, args=args)
except:
self.doFramebufferUpdate(dict(width=800, height=800))
print('\33[31mError!\33[0m')
def handler(self, option, args):
#log.msg('handler')
if option == msgTypes.AUTHENTICATION:
self._handleClientAuth(**args)
elif option == msgTypes.INITIALIZATION:
self.serverInitialization( )
elif option == msgTypes.FRAME_UPDATE:
self.doFramebufferUpdate(**args)
elif option == msgTypes.KEY_EVENT:
self.doKeyEvent(**args)
elif option == msgTypes.POINTER_EVENT:
self.doPointerEvent(**args)
elif option == msgTypes.COPY_TEXT:
self.doCopyText( )
elif option == msgTypes.CUT_TEXT:
self.doClientCutText( )
def serverInitialization(self):
pass
def connectionMade(self):
log.msg('connectionMade')
if not self.factory.password:
self.state = 'REGISTERED'
self.transport.write(self._pack(msgTypes.AUTHENTICATION, block=1))
else:
self.transport.write(self._pack(msgTypes.AUTHENTICATION, block=2))
#self.readyConnection(self)
def _handleClientAuth(self, client_password):
log.msg('_handleClientAuth')
if self.factory.password == str(client_password):
self.state = 'REGISTERED'
self.transport.write(self._pack(msgTypes.AUTH_RESULT, block=0))
elif self.factory.password != str(client_password):
self.transport.write(self._pack(msgTypes.AUTH_RESULT, block=1))
elif self._logTimes >= self.logMaxTimes:
self.transport.write(self._pack(msgTypes.AUTH_RESULT, block=2))
def _pack(self, key, **kw):
message = "{%s: %s}" % (key, kw)
message_len = len(message)
message = "%s@%s" % (message_len, message)
return message
def doFramebufferUpdate(self, width=1366, height=760):
framebuffer = self._makeFramebuffer(width, height)
self.transport.write(self._pack(msgTypes.FRAME_UPDATE, framebuffer=framebuffer))
def doKeyEvent(self, key, flag=1):
self.handleKeyEvent(key, flag)
def doPointerEvent(self, x, y, buttonmask, flag):
self.handleMouseEvent(x, y, buttonmask, flag)
def doCopyTextFromClient(self, text):
"""
copy text from text
"""
self.handleClientCopyText(text)
#----------------------------#
## Server >> Client message ##
#----------------------------#
def sendCutTextToClient(self, text):
"""
get server cut text to client
"""
self.transport(self._pack(msgTypes.CUT_TEXT, text=text))
class RDCFactory(Factory):
protocol = RDCServerProtocol
def __init__(self, password=None):
self.password = password