correct some bugs

This commit is contained in:
sylvain
2013-10-13 19:44:31 +02:00
parent 81e570c2bd
commit 5b0eeb562a
4 changed files with 41 additions and 16 deletions

View File

@@ -27,14 +27,14 @@ class Layer(object):
if not self._presentation is None: if not self._presentation is None:
self._presentation.connect() self._presentation.connect()
def read(self, data): def recv(self, data):
''' '''
signal that data is available for this layer signal that data is available for this layer
call by transport layer call by transport layer
default is to pass data to presentation layer default is to pass data to presentation layer
''' '''
if not self._presentation is None: if not self._presentation is None:
self._presentation.read(data) self._presentation.recv(data)
def write(self, data): def write(self, data):
''' '''
@@ -42,4 +42,5 @@ class Layer(object):
write data for this layer write data for this layer
default pass data to transport layer default pass data to transport layer
''' '''
self.transport.write(data) if not self._transport is None:
self._transport.write(data)

View File

@@ -35,20 +35,21 @@ class ProtocolBuffer(protocol.Protocol):
#rest is for next event of automata #rest is for next event of automata
self._buffer = self._buffer[self._expectedLen:] self._buffer = self._buffer[self._expectedLen:]
#call recv function #call recv function
self.recv(expectedData) self.recvExpectedData(expectedData)
def expect(self, expectedLen, callback = None): def expect(self, expectedLen, callback = None):
''' '''
newt expected len new expected len
''' '''
self._expectedLen = expectedLen self._expectedLen = expectedLen
#default callback is recvExpectedData
if callback is None: if callback is None:
callback = self.__class__.recv callback = self.__class__.recvExpectedData
self.recv = callback self.recvExpectedData = callback
def recv(self, data): def recvExpectedData(self, data):
''' '''
call when expected data is receive call when expected data is receive
''' '''

View File

@@ -1,15 +1,15 @@
''' '''
Created on 5 sept. 2013
@author: sylvain @author: sylvain
''' '''
from rdpy.protocol.common.protocolbuffer import ProtocolBuffer from rdpy.protocol.common.protocolbuffer import ProtocolBuffer
from rdpy.protocol.common.layer import Layer from rdpy.protocol.common.layer import Layer
from rdpy.protocol.common.stream import Stream from rdpy.protocol.common.stream import Stream
class TPKT(ProtocolBuffer, Layer): class TPKT(ProtocolBuffer, Layer):
''' '''
classdocs TPKT layer in RDP protocol stack
this layer only handle size of packet
and determine if is a fast path packet
''' '''
def __init__(self, presentation = None): def __init__(self, presentation = None):
''' '''
@@ -25,39 +25,62 @@ class TPKT(ProtocolBuffer, Layer):
def connectionMade(self): def connectionMade(self):
''' '''
call when transport layer connection call when transport layer connection
is made is made (inherit from ProtocolBuffer)
''' '''
#header is on two bytes
self.expect(2, self.readHeader) self.expect(2, self.readHeader)
#no connection automata on this layer
self.connect() self.connect()
def readHeader(self, data): def readHeader(self, data):
'''
read header of TPKT packet
'''
#first read packet version #first read packet version
self._lastPacketVersion = data.read_uint8() self._lastPacketVersion = data.read_uint8()
#classic packet
if self._lastPacketVersion == 3: if self._lastPacketVersion == 3:
data.read_uint8() data.read_uint8()
#read end header
self.expect(2, self.readExtendedHeader) self.expect(2, self.readExtendedHeader)
else: else:
#is fast path packet
self._lastShortLength = data.read_uint8() self._lastShortLength = data.read_uint8()
if self._lastShortLength & 0x80: if self._lastShortLength & 0x80:
#size is 1 byte more
self.expect(1, self.readExtendedFastPathHeader) self.expect(1, self.readExtendedFastPathHeader)
return return
self.expect(self._lastShortLength - 2, self.readFastPath) self.expect(self._lastShortLength - 2, self.readFastPath)
def readExtendedHeader(self, data): def readExtendedHeader(self, data):
'''
header may be on 4 bytes
'''
#next state is read data
self.expect(data.read_beuint16() - 4, self.readData) self.expect(data.read_beuint16() - 4, self.readData)
def readExtendedFastPathHeader(self, data): def readExtendedFastPathHeader(self, data):
'''
fast ath header may be on 1 byte more
'''
self._lastShortLength &= ~0x80 self._lastShortLength &= ~0x80
self._lastShortLength = (self._lastShortLength << 8) + data.read_uint8() self._lastShortLength = (self._lastShortLength << 8) + data.read_uint8()
#next state is fast patn data
self.expect(self._lastShortLength - 3, self.readFastPath) self.expect(self._lastShortLength - 3, self.readFastPath)
def readFastPath(self, data): def readFastPath(self, data):
'''
fast path data
'''
pass pass
def readData(self, data): def readData(self, data):
self._protocol.dataReceived(data) '''
read classic TPKT packet
'''
#next state is pass to
self.recv(data)
self.expect(2, self.readHeader) self.expect(2, self.readHeader)
def write(self, data): def write(self, data):

View File

@@ -19,7 +19,7 @@ if __name__ == '__main__':
protocol = rfb.Rfb(rfb.Rfb.CLIENT) protocol = rfb.Rfb(rfb.Rfb.CLIENT)
w = widget.QRemoteDesktop(adaptor.RfbAdaptor(protocol)) w = widget.QRemoteDesktop(adaptor.RfbAdaptor(protocol))
w.resize(1000, 700) w.resize(1000, 700)
w.setWindowTitle('QVNCViewer') w.setWindowTitle('vncclient')
w.show() w.show()
from twisted.internet import reactor from twisted.internet import reactor
reactor.connectTCP("127.0.0.1", 5901, factory.RfbFactory(protocol)) reactor.connectTCP("127.0.0.1", 5901, factory.RfbFactory(protocol))