bug fix in tpdu layer for server side
This commit is contained in:
@@ -36,12 +36,12 @@ class RDPClientController(pdu.PDUClientListener):
|
|||||||
"""
|
"""
|
||||||
#list of observer
|
#list of observer
|
||||||
self._clientObserver = []
|
self._clientObserver = []
|
||||||
#transport layer
|
#PDU layer
|
||||||
self._pduLayer = pdu.PDU(self)
|
self._pduLayer = pdu.PDU(self)
|
||||||
#multi channel service
|
#multi channel service
|
||||||
self._mcsLayer = mcs.MCS(LayerMode.CLIENT, self._pduLayer)
|
self._mcsLayer = mcs.MCS(LayerMode.CLIENT, self._pduLayer)
|
||||||
#transport pdu layer
|
#transport pdu layer
|
||||||
self._tpduLayer = tpdu.TPDU(LayerMode.CLIENT, self._mcsLayer)
|
self._tpduLayer = tpdu.createClient(self._mcsLayer)
|
||||||
#transport packet (protocol layer)
|
#transport packet (protocol layer)
|
||||||
self._tpktLayer = tpkt.TPKT(self._tpduLayer, self._pduLayer)
|
self._tpktLayer = tpkt.TPKT(self._tpduLayer, self._pduLayer)
|
||||||
|
|
||||||
@@ -186,7 +186,30 @@ class RDPClientController(pdu.PDUClientListener):
|
|||||||
|
|
||||||
except InvalidValue:
|
except InvalidValue:
|
||||||
print "try send bad key event"
|
print "try send bad key event"
|
||||||
|
|
||||||
|
class RDPServerController(pdu.PDUServerListener):
|
||||||
|
"""
|
||||||
|
Controller use in server side mode
|
||||||
|
"""
|
||||||
|
def __init__(self, privateKeyFileName, certificateFileName):
|
||||||
|
"""
|
||||||
|
@param privateKeyFileName: file contain server private key
|
||||||
|
@param certficiateFileName: file that contain public key
|
||||||
|
"""
|
||||||
|
self._pduLayer = pdu.PDU(self)
|
||||||
|
#multi channel service
|
||||||
|
self._mcsLayer = mcs.MCS(LayerMode.SERVER, self._pduLayer)
|
||||||
|
#transport pdu layer
|
||||||
|
self._tpduLayer = tpdu.createServer(self._mcsLayer, privateKeyFileName, certificateFileName)
|
||||||
|
#transport packet (protocol layer)
|
||||||
|
self._tpktLayer = tpkt.TPKT(self._tpduLayer, self._pduLayer)
|
||||||
|
|
||||||
|
def getProtocol(self):
|
||||||
|
"""
|
||||||
|
@return: the twisted protocol layer
|
||||||
|
in RDP case is TPKT layer
|
||||||
|
"""
|
||||||
|
return self._tpktLayer;
|
||||||
|
|
||||||
class ClientFactory(protocol.Factory):
|
class ClientFactory(protocol.Factory):
|
||||||
"""
|
"""
|
||||||
@@ -225,12 +248,15 @@ class ServerFactory(protocol.Factory):
|
|||||||
Function call from twisted and build rdp protocol stack
|
Function call from twisted and build rdp protocol stack
|
||||||
@param addr: destination address
|
@param addr: destination address
|
||||||
"""
|
"""
|
||||||
|
controller = RDPServerController(self._privateKeyFileName, self._certificateFileName)
|
||||||
|
return controller.getProtocol()
|
||||||
#pduLayer = pdu.PDU(pdu.PDUServerListener())
|
#pduLayer = pdu.PDU(pdu.PDUServerListener())
|
||||||
#return tpkt.TPKT(tpdu.createServer(mcs.createServer(pduLayer), self._privateKeyFileName, self._certificateFileName));
|
#return tpkt.TPKT(tpdu.createServer(mcs.createServer(pduLayer), self._privateKeyFileName, self._certificateFileName));
|
||||||
|
|
||||||
def buildObserver(self):
|
def buildObserver(self, controller):
|
||||||
"""
|
"""
|
||||||
Build observer use for connection
|
Build observer use for connection
|
||||||
|
@param controller: RDP stack controller
|
||||||
"""
|
"""
|
||||||
raise CallPureVirtualFuntion("%s:%s defined by interface %s"%(self.__class__, "buildObserver", "ServerFactory"))
|
raise CallPureVirtualFuntion("%s:%s defined by interface %s"%(self.__class__, "buildObserver", "ServerFactory"))
|
||||||
|
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ class TPDU(LayerAutomata, StreamSender):
|
|||||||
|
|
||||||
self.setNextState(self.recvData)
|
self.setNextState(self.recvData)
|
||||||
#connection is done send to presentation
|
#connection is done send to presentation
|
||||||
LayerAutomata.connect(self)
|
self._presentation.connect(self)
|
||||||
|
|
||||||
def recvConnectionRequest(self, data):
|
def recvConnectionRequest(self, data):
|
||||||
"""
|
"""
|
||||||
@@ -231,17 +231,19 @@ class TPDU(LayerAutomata, StreamSender):
|
|||||||
def sendConnectionConfirm(self):
|
def sendConnectionConfirm(self):
|
||||||
"""
|
"""
|
||||||
Write connection confirm message
|
Write connection confirm message
|
||||||
|
Start TLS connection
|
||||||
Next state is recvData
|
Next state is recvData
|
||||||
@see : http://msdn.microsoft.com/en-us/library/cc240501.aspx
|
@see : http://msdn.microsoft.com/en-us/library/cc240501.aspx
|
||||||
"""
|
"""
|
||||||
message = TPDUConnectMessage(MessageType.X224_TPDU_CONNECTION_CONFIRM)
|
message = TPDUConnectMessage(MessageType.X224_TPDU_CONNECTION_CONFIRM)
|
||||||
message.protocolNeg.code.value = NegociationType.TYPE_RDP_NEG_REQ
|
message.protocolNeg.code.value = NegociationType.TYPE_RDP_NEG_RSP
|
||||||
message.protocolNeg.selectedProtocol.value = self._selectedProtocol
|
message.protocolNeg.selectedProtocol.value = self._selectedProtocol
|
||||||
self._transport.send(message)
|
self._transport.send(message)
|
||||||
#_transport is TPKT and transport is TCP layer of twisted
|
#_transport is TPKT and transport is TCP layer of twisted
|
||||||
self._transport.transport.startTLS(ServerTLSContext(self._serverPrivateKeyFileName, self._serverCertificateFileName))
|
self._transport.transport.startTLS(ServerTLSContext(self._serverPrivateKeyFileName, self._serverCertificateFileName))
|
||||||
#connection is done send to presentation
|
#connection is done send to presentation
|
||||||
LayerAutomata.connect(self)
|
self.setNextState(self.recvData)
|
||||||
|
self._presentation.connect()
|
||||||
|
|
||||||
def send(self, message):
|
def send(self, message):
|
||||||
"""
|
"""
|
||||||
@@ -250,6 +252,24 @@ class TPDU(LayerAutomata, StreamSender):
|
|||||||
@param message: network.Type message
|
@param message: network.Type message
|
||||||
"""
|
"""
|
||||||
self._transport.send((TPDUDataHeader(), message))
|
self._transport.send((TPDUDataHeader(), message))
|
||||||
|
|
||||||
|
def createClient(mcsLayer):
|
||||||
|
"""
|
||||||
|
Factory for client TPDU automata
|
||||||
|
@param mcsLayer: presentation layer of TPDU
|
||||||
|
"""
|
||||||
|
return TPDU(LayerMode.CLIENT, mcsLayer)
|
||||||
|
|
||||||
|
def createServer(mcsLayer, privateKeyFileName, certificateFileName):
|
||||||
|
"""
|
||||||
|
Factory for server TPDU automata
|
||||||
|
@param mcsLayer: presentation layer of TPDU
|
||||||
|
@param privateKeyFileName: file contain server private key
|
||||||
|
@param certficiateFileName: file that contain public key
|
||||||
|
"""
|
||||||
|
tpduLayer = TPDU(LayerMode.SERVER, mcsLayer)
|
||||||
|
tpduLayer.initTLSServerInfos(privateKeyFileName, certificateFileName)
|
||||||
|
return tpduLayer
|
||||||
|
|
||||||
#open ssl needed
|
#open ssl needed
|
||||||
from twisted.internet import ssl
|
from twisted.internet import ssl
|
||||||
|
|||||||
Reference in New Issue
Block a user