add mandatory capability

This commit is contained in:
speyrefitte
2014-06-02 18:03:26 +02:00
parent 7b43dcfe4d
commit 3c0a8e2505
3 changed files with 183 additions and 44 deletions

View File

@@ -363,14 +363,16 @@ class CompositeType(Type):
@param conditional : function call before read or write type
@param optional: boolean check before read if there is still data in stream
@param constant: if true check any changement of object during reading
@param readLen: max length to read
'''
def __init__(self, conditional = lambda:True, optional = False, constant = False):
def __init__(self, conditional = lambda:True, optional = False, constant = False, readLen = None):
'''
init list of simple value
'''
Type.__init__(self, conditional = conditional, optional = optional, constant = constant)
#list of ordoned type
self._typeName = []
self._readLen = readLen
def __setattr__(self, name, value):
'''
@@ -384,10 +386,17 @@ class CompositeType(Type):
def __read__(self, s):
'''
call read on each ordered subtype
call read on each ordered subtype
@param s: Stream
'''
readLen = 0
for name in self._typeName:
if not self._readLen is None and readLen + sizeof(self.__dict__[name]) > self._readLen.value:
#optional maybe be unread
if self.__dict__[name]._optional:
continue
else:
raise InvalidSize("Impossible to read type %s::%s : read size is too small"%(self.__class__, name))
try:
s.readType(self.__dict__[name])
except Exception as e:
@@ -399,6 +408,14 @@ class CompositeType(Type):
s.pos -= sizeof(self.__dict__[tmpName])
raise e
readLen += sizeof(self.__dict__[name])
selfSize = sizeof(self)
if readLen != selfSize:
#read end padding
s.read(selfSize - readLen)
print "Warning: type %s still have data after read, use as padding"%self.__class__
def __write__(self, s):
'''
call write on each ordered subtype
@@ -802,6 +819,7 @@ class ArrayType(Type):
create new object and read it
@param s: Stream
'''
self._array = []
for i in range(0, self._readLen.value):
element = self._typeFactory()
s.readType(element)

View File

@@ -543,11 +543,54 @@ class InputFlags(object):
class BrushSupport(object):
'''
Brush support of client
@see: http://msdn.microsoft.com/en-us/library/cc240564.aspx
'''
BRUSH_DEFAULT = 0x00000000
BRUSH_COLOR_8x8 = 0x00000001
BRUSH_COLOR_FULL = 0x00000002
@ConstAttributes
@TypeAttributes(UInt16Le)
class GlyphSupport(object):
'''
Use by glyph order
@see: http://msdn.microsoft.com/en-us/library/cc240565.aspx
'''
GLYPH_SUPPORT_NONE = 0x0000
GLYPH_SUPPORT_PARTIAL = 0x0001
GLYPH_SUPPORT_FULL = 0x0002
GLYPH_SUPPORT_ENCODE = 0x0003
@ConstAttributes
@TypeAttributes(UInt32Le)
class OffscreenSupportLevel(object):
'''
Use to determine offscreen cache level supported
@see: http://msdn.microsoft.com/en-us/library/cc240550.aspx
'''
FALSE = 0x00000000
TRUE = 0x00000001
@ConstAttributes
@TypeAttributes(UInt32Le)
class VirtualChannelCompressionFlag(object):
'''
Use to determine virtual channel compression
@see: http://msdn.microsoft.com/en-us/library/cc240551.aspx
'''
VCCAPS_NO_COMPR = 0x00000000
VCCAPS_COMPR_SC = 0x00000001
VCCAPS_COMPR_CS_8K = 0x00000002
@ConstAttributes
@TypeAttributes(UInt16Le)
class SoundFlag(object):
'''
Use in sound capability to inform it
@see: http://msdn.microsoft.com/en-us/library/cc240552.aspx
'''
NONE = 0x0000
SOUND_BEEPS_FLAG = 0x0001
class RDPInfo(CompositeType):
'''
client informations
@@ -621,6 +664,17 @@ class ShareDataHeader(CompositeType):
self.pduType2 = UInt8(pduType2.value, constant = True)
self.compressedType = UInt8()
self.compressedLength = UInt16Le()
class CacheEntry(CompositeType):
'''
Use in capability cache exchange
@see: http://msdn.microsoft.com/en-us/library/cc240566.aspx
'''
def __init__(self):
CompositeType.__init__(self)
self.cacheEntries = UInt16Le()
self.cacheMaximumCellSize = UInt16Le()
class Capability(CompositeType):
'''
@@ -629,7 +683,7 @@ class Capability(CompositeType):
'''
def __init__(self, capabilitySetType = UInt16Le(), capability = None):
CompositeType.__init__(self)
self.capabilitySetType = capabilitySetType
self.capabilitySetType = UInt16Le(capabilitySetType.value, constant = (not capability is None))
self.lengthCapability = UInt16Le(lambda:sizeof(self))
def CapabilityFactory():
@@ -637,13 +691,27 @@ class Capability(CompositeType):
closure for capability factory
'''
if self.capabilitySetType == CapsType.CAPSTYPE_GENERAL:
return GeneralCapability()
return GeneralCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_BITMAP:
return BitmapCapability()
return BitmapCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_ORDER:
return OrderCapability()
return OrderCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_BITMAPCACHE:
return BitmapCacheCapability()
return BitmapCacheCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_POINTER:
return PointerCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_INPUT:
return InputCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_BRUSH:
return BrushCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_GLYPHCACHE:
return GlyphCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_OFFSCREENCACHE:
return OffscreenBitmapCacheCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_VIRTUALCHANNEL:
return VirtualChannelCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_SOUND:
return SoundCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
else:
return String(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
@@ -659,8 +727,8 @@ class GeneralCapability(CompositeType):
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
'''
def __init__(self):
CompositeType.__init__(self)
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.osMajorType = UInt16Le()
self.osMinorType = UInt16Le()
self.protocolVersion = UInt16Le(0x0200, constant = True)
@@ -680,8 +748,8 @@ class BitmapCapability(CompositeType):
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240554.aspx
'''
def __init__(self):
CompositeType.__init__(self)
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.preferredBitsPerPixel = UInt16Le()
self.receive1BitPerPixel = UInt16Le(0x0001)
self.receive4BitsPerPixel = UInt16Le(0x0001)
@@ -703,8 +771,8 @@ class OrderCapability(CompositeType):
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240556.aspx
'''
def __init__(self):
CompositeType.__init__(self)
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.terminalDescriptor = String("\x00" * 16, readLen = UInt8(16))
self.pad4octetsA = UInt32Le(0)
self.desktopSaveXGranularity = UInt16Le(1)
@@ -713,7 +781,7 @@ class OrderCapability(CompositeType):
self.maximumOrderLevel = UInt16Le(1)
self.numberFonts = UInt16Le(0)
self.orderFlags = OrderFlag.NEGOTIATEORDERSUPPORT
self.orderSupport = ArrayType(UInt8, readLen = UInt8(32))
self.orderSupport = ArrayType(UInt8, init = [UInt8(0) for i in range (0, 32)], readLen = UInt8(32))
self.textFlags = UInt16Le()
self.orderSupportExFlags = UInt16Le()
self.pad4octetsB = UInt32Le()
@@ -729,8 +797,8 @@ class BitmapCacheCapability(CompositeType):
client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240559.aspx
'''
def __init__(self):
CompositeType.__init__(self)
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.pad1 = UInt32Le()
self.pad2 = UInt32Le()
self.pad3 = UInt32Le()
@@ -752,9 +820,9 @@ class PointerCapability(CompositeType):
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240562.aspx
'''
def __init__(self):
CompositeType.__init__(self)
self.colorPointerFlag = Boolean.TRUE
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.colorPointerFlag = UInt16Le(1)
self.colorPointerCacheSize = UInt16Le()
self.pointerCacheSize = UInt16Le()
@@ -765,20 +833,20 @@ class InputCapability(CompositeType):
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240563.aspx
'''
def __init__(self, client = False):
CompositeType.__init__(self)
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.inputFlags = UInt16Le()
self.pad2octetsA = UInt16Le()
#same value as gcc.ClientCoreSettings.kbdLayout
self.keyboardLayout = UInt32Le(conditional = lambda:client)
self.keyboardLayout = UInt32Le()
#same value as gcc.ClientCoreSettings.keyboardType
self.keyboardType = UInt32Le(conditional = lambda:client)
self.keyboardType = UInt32Le()
#same value as gcc.ClientCoreSettings.keyboardSubType
self.keyboardSubType = UInt32Le(conditional = lambda:client)
self.keyboardSubType = UInt32Le()
#same value as gcc.ClientCoreSettings.keyboardFnKeys
self.keyboardFunctionKey = UInt32Le(conditional = lambda:client)
#same value as gcc.ClientCoreSettings.imeFileName
self.imeFileName = String("\x00" * 64, conditional = lambda:client)
self.keyboardFunctionKey = UInt32Le()
#same value as gcc.ClientCoreSettingrrs.imeFileName
self.imeFileName = String("\x00" * 64, readLen = UInt8(64))
class BrushCapability(CompositeType):
'''
@@ -786,10 +854,60 @@ class BrushCapability(CompositeType):
client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240564.aspx
'''
def __init__(self):
CompositeType.__init__(self)
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.brushSupportLevel = BrushSupport.BRUSH_DEFAULT
class GlyphCapability(CompositeType):
'''
Use in font order
client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240565.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.glyphCache = ArrayType(CacheEntry, init = [CacheEntry() for i in range(0,10)], readLen = UInt8(10))
self.fragCache = UInt32Le()
#all fonts are sent with bitmap format (very expensive)
self.glyphSupportLevel = GlyphSupport.GLYPH_SUPPORT_NONE
self.pad2octets = UInt16Le()
class OffscreenBitmapCacheCapability(CompositeType):
'''
use to cached bitmap in offscreen area
client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240550.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.offscreenSupportLevel = OffscreenSupportLevel.FALSE
self.offscreenCacheSize = UInt16Le()
self.offscreenCacheEntries = UInt16Le()
class VirtualChannelCapability(CompositeType):
'''
use to determine virtual channel compression
client -> server
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240551.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.flags = VirtualChannelCompressionFlag.VCCAPS_NO_COMPR
self.VCChunkSize = UInt32Le(optional = True)
class SoundCapability(CompositeType):
'''
use to exchange sound capability
client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240552.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.soundFlags = SoundFlag.NONE
self.pad2octetsA = UInt16Le()
class DemandActivePDU(CompositeType):
'''
@see: http://msdn.microsoft.com/en-us/library/cc240485.aspx
@@ -814,7 +932,7 @@ class ConfirmActivePDU(CompositeType):
'''
def __init__(self, userId = UInt16Le()):
CompositeType.__init__(self)
self.shareControlHeader = ShareControlHeader(lambda:sizeof(self), PDUType.PDUTYPE_CONFIRMACTIVEPDU, userId)
self.shareDataHeader = ShareControlHeader(lambda:sizeof(self), PDUType.PDUTYPE_CONFIRMACTIVEPDU, userId)
self.shareId = UInt32Le()
self.originatorId = UInt16Le(0x03EA, constant = True)
self.lengthSourceDescriptor = UInt16Le(lambda:sizeof(self.sourceDescriptor))
@@ -830,7 +948,7 @@ class SynchronizePDU(CompositeType):
'''
def __init__(self, userId = UInt16Le()):
CompositeType.__init__(self)
self.shareControlHeader = ShareDataHeader(lambda:sizeof(self), PDUType2.PDUTYPE2_SYNCHRONIZE, userId)
self.shareDataHeader = ShareDataHeader(lambda:sizeof(self), PDUType2.PDUTYPE2_SYNCHRONIZE, userId)
self.messageType = UInt16Le(1, constant = True)
self.targetUser = UInt16Le()
@@ -840,7 +958,7 @@ class ControlPDU(CompositeType):
'''
def __init__(self, userId = UInt16Le()):
CompositeType.__init__(self)
self.shareControlHeader = ShareDataHeader(lambda:sizeof(self), PDUType2.PDUTYPE2_CONTROL, userId)
self.shareDataHeader = ShareDataHeader(lambda:sizeof(self), PDUType2.PDUTYPE2_CONTROL, userId)
self.action = UInt16Le()
self.grantId = UInt16Le()
self.controlId = UInt32Le()
@@ -887,7 +1005,7 @@ class ErrorInfoPDU(CompositeType):
'''
def __init__(self):
CompositeType.__init__(self)
self.shareControlHeader = ShareDataHeader(lambda:sizeof(self), PDUType2.PDUTYPE2_SET_ERROR_INFO_PDU)
self.shareDataHeader = ShareDataHeader(lambda:sizeof(self), PDUType2.PDUTYPE2_SET_ERROR_INFO_PDU)
#use to collect error info pdu
self.errorInfo = UInt32Le()
@@ -911,7 +1029,8 @@ class PDU(LayerAutomata):
CapsType.CAPSTYPE_BITMAP : Capability(CapsType.CAPSTYPE_BITMAP, BitmapCapability()),
CapsType.CAPSTYPE_ORDER : Capability(CapsType.CAPSTYPE_ORDER, OrderCapability()),
CapsType.CAPSTYPE_POINTER : Capability(CapsType.CAPSTYPE_POINTER, PointerCapability()),
CapsType.CAPSTYPE_INPUT : Capability(CapsType.CAPSTYPE_INPUT, InputCapability())
CapsType.CAPSTYPE_INPUT : Capability(CapsType.CAPSTYPE_INPUT, InputCapability()),
CapsType.CAPSTYPE_VIRTUALCHANNEL : Capability(CapsType.CAPSTYPE_VIRTUALCHANNEL, VirtualChannelCapability())
}
#client capabilities
self._clientCapabilities = {
@@ -920,8 +1039,12 @@ class PDU(LayerAutomata):
CapsType.CAPSTYPE_ORDER : Capability(CapsType.CAPSTYPE_ORDER, OrderCapability()),
CapsType.CAPSTYPE_BITMAPCACHE : Capability(CapsType.CAPSTYPE_BITMAPCACHE, BitmapCacheCapability()),
CapsType.CAPSTYPE_POINTER : Capability(CapsType.CAPSTYPE_POINTER, PointerCapability()),
CapsType.CAPSTYPE_INPUT : Capability(CapsType.CAPSTYPE_INPUT, InputCapability(client = True)),
CapsType.CAPSTYPE_BRUSH : Capability(CapsType.CAPSTYPE_BRUSH, BrushCapability())
CapsType.CAPSTYPE_INPUT : Capability(CapsType.CAPSTYPE_INPUT, InputCapability()),
CapsType.CAPSTYPE_BRUSH : Capability(CapsType.CAPSTYPE_BRUSH, BrushCapability()),
CapsType.CAPSTYPE_GLYPHCACHE : Capability(CapsType.CAPSTYPE_GLYPHCACHE, GlyphCapability()),
CapsType.CAPSTYPE_OFFSCREENCACHE : Capability(CapsType.CAPSTYPE_OFFSCREENCACHE, OffscreenBitmapCacheCapability()),
CapsType.CAPSTYPE_VIRTUALCHANNEL : Capability(CapsType.CAPSTYPE_VIRTUALCHANNEL, VirtualChannelCapability()),
CapsType.CAPSTYPE_SOUND : Capability(CapsType.CAPSTYPE_SOUND, SoundCapability())
}
#share id between client and server
self._shareId = UInt32Le()
@@ -976,7 +1099,7 @@ class PDU(LayerAutomata):
'''
try:
data.readType(pdu)
except Exception:
except Exception as e:
#maybe an error message
errorInfoPDU = ErrorInfoPDU()
try:
@@ -985,8 +1108,8 @@ class PDU(LayerAutomata):
if ErrorInfo._MESSAGES_.has_key(errorInfoPDU.errorInfo):
message = ErrorInfo._MESSAGES_[errorInfoPDU.errorInfo]
raise ErrorReportedFromPeer("Receive PDU Error info : %s"%message)
except:
raise InvalidExpectedDataException("Invalid PDU")
except InvalidExpectedDataException:
raise e
def recvDemandActivePDU(self, data):
'''
@@ -1013,7 +1136,6 @@ class PDU(LayerAutomata):
synchronizePDU = SynchronizePDU()
self.readPDU(data, synchronizePDU)
if synchronizePDU.targetUser != self._channelId:
raise InvalidExpectedDataException("receive synchronize for an invalide user")
@@ -1038,11 +1160,10 @@ class PDU(LayerAutomata):
bitmapCapability.preferredBitsPerPixel = self._transport._clientSettings.core.colorDepth
bitmapCapability.desktopWidth = self._transport._clientSettings.core.desktopWidth
bitmapCapability.desktopHeight = self._transport._clientSettings.core.desktopHeight
#init order capability
orderCapability = self._clientCapabilities[CapsType.CAPSTYPE_ORDER].capability._value
orderCapability.orderFlags |= OrderFlag.ZEROBOUNDSDELTASSUPPORT
orderCapability.orderSupport = [UInt8(0) for i in range (0, 32)]
#init input capability
inputCapability = self._clientCapabilities[CapsType.CAPSTYPE_INPUT].capability._value

View File

@@ -13,5 +13,5 @@ from rdpy.network.layer import LayerMode
if __name__ == '__main__':
from twisted.internet import reactor
reactor.connectTCP("192.168.135.198", 3389, rdp.Factory(LayerMode.CLIENT))
reactor.connectTCP("192.168.135.59", 3389, rdp.Factory(LayerMode.CLIENT))
reactor.run()