Example #1
0
    def recvConfirmActivePDU(self, s):
        """
        @summary: Receive confirm active PDU from client
        Capabilities exchange
        Wait Client Synchronize PDU
        @param s: Stream
        """
        pdu = data.PDU()
        s.readType(pdu)

        if pdu.shareControlHeader.pduType.value != data.PDUType.PDUTYPE_CONFIRMACTIVEPDU:
            #not a blocking error because in deactive reactive sequence
            #input can be send too but ignored
            log.debug("Ignore message type %s during connection sequence" %
                      hex(pdu.shareControlHeader.pduType.value))
            return

        for cap in pdu.pduMessage.capabilitySets._array:
            self._clientCapabilities[cap.capabilitySetType] = cap

        #find use full flag
        self._clientFastPathSupported = bool(
            self._clientCapabilities[
                caps.CapsType.CAPSTYPE_GENERAL].capability.extraFlags.value
            & caps.GeneralExtraFlag.FASTPATH_OUTPUT_SUPPORTED)

        #secure checksum cap here maybe protocol (another) design error
        self._transport._enableSecureCheckSum = bool(
            self._clientCapabilities[
                caps.CapsType.CAPSTYPE_GENERAL].capability.extraFlags
            & caps.GeneralExtraFlag.ENC_SALTED_CHECKSUM)

        self.setNextState(self.recvClientSynchronizePDU)
Example #2
0
    def recvDemandActivePDU(self, s):
        """
        @summary: Receive demand active PDU which contains 
        Server capabilities. In this version of RDPY only
        Restricted group of capabilities are used.
        Send Confirm Active PDU
        Send Finalize PDU
        Wait Server Synchronize PDU
        @param s: Stream
        """
        pdu = data.PDU()
        s.readType(pdu)

        if pdu.shareControlHeader.pduType.value != data.PDUType.PDUTYPE_DEMANDACTIVEPDU:
            #not a blocking error because in deactive reactive sequence
            #input can be send too but ignored
            log.debug("Ignore message type %s during connection sequence" %
                      hex(pdu.shareControlHeader.pduType.value))
            return

        self._shareId = pdu.pduMessage.shareId.value

        for cap in pdu.pduMessage.capabilitySets._array:
            self._serverCapabilities[cap.capabilitySetType] = cap

        #secure checksum cap here maybe protocol (another) design error
        self._transport._enableSecureCheckSum = bool(
            self._serverCapabilities[
                caps.CapsType.CAPSTYPE_GENERAL].capability.extraFlags
            & caps.GeneralExtraFlag.ENC_SALTED_CHECKSUM)

        self.sendConfirmActivePDU()
        #send synchronize
        self.sendClientFinalizeSynchronizePDU()
        self.setNextState(self.recvServerSynchronizePDU)
Example #3
0
 def recvPDU(self, s):
     """
     @summary: Main receive function after connection sequence
     @param s: Stream from transport layer
     """
     pdu = data.PDU()
     s.readType(pdu)
     if pdu.shareControlHeader.pduType.value == data.PDUType.PDUTYPE_DATAPDU:
         self.readDataPDU(pdu.pduMessage)
Example #4
0
File: layer.py Project: zha0/rdpy
 def recvPDU(self, s):
     """
     @summary: Main receive function after connection sequence
     @param s: Stream from transport layer
     """
     pdu = data.PDU()
     s.readType(pdu)
     if pdu.shareControlHeader.pduType.value == data.PDUType.PDUTYPE_DATAPDU:
         self.readDataPDU(pdu.pduMessage)
     elif pdu.shareControlHeader.pduType.value == data.PDUType.PDUTYPE_DEACTIVATEALLPDU:
         #use in deactivation-reactivation sequence
         #next state is either a capabilities re exchange or disconnection
         #http://msdn.microsoft.com/en-us/library/cc240454.aspx
         self.setNextState(self.recvDemandActivePDU)
Example #5
0
 def recvClientControlRequestPDU(self, s):
     """
     @summary: Receive last control PDU the request control PDU from client
     Wait Font List PDU
     @param s: Stream from transport layer
     """
     pdu = data.PDU()
     s.readType(pdu)
     if pdu.shareControlHeader.pduType.value != data.PDUType.PDUTYPE_DATAPDU or pdu.pduMessage.shareDataHeader.pduType2.value != data.PDUType2.PDUTYPE2_CONTROL or pdu.pduMessage.pduData.action.value != data.Action.CTRLACTION_REQUEST_CONTROL:
         #not a blocking error because in deactive reactive sequence
         #input can be send too but ignored
         log.debug("Ignore message type %s during connection sequence" %
                   hex(pdu.shareControlHeader.pduType.value))
         return
     self.setNextState(self.recvClientFontListPDU)
Example #6
0
 def recvClientSynchronizePDU(self, s):
     """
     @summary: Receive from client 
     Wait Control Cooperate PDU
     @param s: Stream from transport layer
     """
     pdu = data.PDU()
     s.readType(pdu)
     if pdu.shareControlHeader.pduType.value != data.PDUType.PDUTYPE_DATAPDU or pdu.pduMessage.shareDataHeader.pduType2.value != data.PDUType2.PDUTYPE2_SYNCHRONIZE:
         #not a blocking error because in deactive reactive sequence
         #input can be send too but ignored
         log.debug("Ignore message type %s during connection sequence" %
                   hex(pdu.shareControlHeader.pduType.value))
         return
     self.setNextState(self.recvClientControlCooperatePDU)
Example #7
0
    def recvServerControlCooperatePDU(self, s):
        """
        @summary: Receive control cooperate PDU from server
        Wait Control Granted PDU
        @param s: Stream from transport layer
        """
        pdu = data.PDU()
        s.readType(pdu)
        if pdu.shareControlHeader.pduType.value != data.PDUType.PDUTYPE_DATAPDU or pdu.pduMessage.shareDataHeader.pduType2.value != data.PDUType2.PDUTYPE2_CONTROL or pdu.pduMessage.pduData.action.value != data.Action.CTRLACTION_COOPERATE:
            #not a blocking error because in deactive reactive sequence
            #input can be send too but ignored
            log.debug("Ignore message type %s during connection sequence" %
                      hex(pdu.shareControlHeader.pduType.value))
            return

        self.setNextState(self.recvServerControlGrantedPDU)
Example #8
0
    def recvServerFontMapPDU(self, s):
        """
        @summary: Last useless connection packet from server to client
        Wait any PDU
        @param s: Stream from transport layer
        """
        pdu = data.PDU()
        s.readType(pdu)
        if pdu.shareControlHeader.pduType.value != data.PDUType.PDUTYPE_DATAPDU or pdu.pduMessage.shareDataHeader.pduType2.value != data.PDUType2.PDUTYPE2_FONTMAP:
            #not a blocking error because in deactive reactive sequence
            #input can be send too but ignored
            log.debug("Ignore message type %s during connection sequence" %
                      hex(pdu.shareControlHeader.pduType.value))
            return

        self.setNextState(self.recvPDU)
        #here i'm connected
        self._listener.onReady()
Example #9
0
    def recvClientFontListPDU(self, s):
        """
        @summary: Last synchronize packet from client to server
        Send Server Finalize PDUs
        Wait any PDU
        @param s: Stream from transport layer
        """
        pdu = data.PDU()
        s.readType(pdu)
        if pdu.shareControlHeader.pduType.value != data.PDUType.PDUTYPE_DATAPDU or pdu.pduMessage.shareDataHeader.pduType2.value != data.PDUType2.PDUTYPE2_FONTLIST:
            #not a blocking error because in deactive reactive sequence
            #input can be send but ignored
            log.debug("Ignore message type %s during connection sequence" %
                      hex(pdu.shareControlHeader.pduType.value))
            return

        #finalize server
        self.sendServerFinalizeSynchronizePDU()
        self.setNextState(self.recvPDU)
        #now i'm ready
        self._listener.onReady()
Example #10
0
 def sendPDU(self, pduMessage):
     """
     @summary: Send a PDU data to transport layer
     @param pduMessage: PDU message
     """
     self._transport.send(data.PDU(self._transport.getUserId(), pduMessage))