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)
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)
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)
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)
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)
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)
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)
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()
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()
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))