bug fix in tpdu layer for server side

This commit is contained in:
citronneur
2014-07-12 15:46:59 +02:00
parent c09e466f48
commit d32bb1e22b
2 changed files with 53 additions and 7 deletions

View File

@@ -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"))

View File

@@ -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