bug fix and code refactoring

This commit is contained in:
speyrefitte
2014-07-01 17:52:20 +02:00
parent c53841ac57
commit 4fa22177b4
8 changed files with 415 additions and 436 deletions

View File

@@ -261,7 +261,7 @@ class SimpleType(Type, CallableValue):
""" """
if not self.__dict__.has_key("_mask"): if not self.__dict__.has_key("_mask"):
mask = 0xff mask = 0xff
for i in range(1, self._typeSize): for _ in range(1, self._typeSize):
mask = mask << 8 | 0xff mask = mask << 8 | 0xff
self._mask = mask self._mask = mask
return self._mask return self._mask
@@ -844,7 +844,7 @@ class ArrayType(Type):
@param s: Stream @param s: Stream
''' '''
self._array = [] self._array = []
for i in range(0, self._readLen.value): for _ in range(0, self._readLen.value):
element = self._typeFactory() element = self._typeFactory()
s.readType(element) s.readType(element)
self._array.append(element) self._array.append(element)

View File

@@ -23,27 +23,20 @@ ASN.1 standard
""" """
from rdpy.network.type import UInt8, UInt16Be, UInt32Be, String from rdpy.network.type import UInt8, UInt16Be, UInt32Be, String
from rdpy.network.const import ConstAttributes, TypeAttributes
from rdpy.network.error import InvalidExpectedDataException, InvalidSize from rdpy.network.error import InvalidExpectedDataException, InvalidSize
@ConstAttributes
@TypeAttributes(UInt8)
class BerPc(object): class BerPc(object):
BER_PC_MASK = 0x20 BER_PC_MASK = 0x20
BER_PRIMITIVE = 0x00 BER_PRIMITIVE = 0x00
BER_CONSTRUCT = 0x20 BER_CONSTRUCT = 0x20
@ConstAttributes
@TypeAttributes(UInt8)
class Class(object): class Class(object):
BER_CLASS_MASK = 0xC0 BER_CLASS_MASK = 0xC0
BER_CLASS_UNIV = 0x00 BER_CLASS_UNIV = 0x00
BER_CLASS_APPL = 0x40 BER_CLASS_APPL = 0x40
BER_CLASS_CTXT = 0x80 BER_CLASS_CTXT = 0x80
BER_CLASS_PRIV = 0xC0 BER_CLASS_PRIV = 0xC0
@ConstAttributes
@TypeAttributes(UInt8)
class Tag(object): class Tag(object):
BER_TAG_MASK = 0x1F BER_TAG_MASK = 0x1F
BER_TAG_BOOLEAN = 0x01 BER_TAG_BOOLEAN = 0x01
@@ -111,7 +104,7 @@ def readUniversalTag(s, tag, pc):
""" """
byte = UInt8() byte = UInt8()
s.readType(byte) s.readType(byte)
return byte == ((Class.BER_CLASS_UNIV | berPC(pc)) | (Tag.BER_TAG_MASK & tag)) return byte.value == ((Class.BER_CLASS_UNIV | berPC(pc)) | (Tag.BER_TAG_MASK & tag))
def writeUniversalTag(tag, pc): def writeUniversalTag(tag, pc):
""" """
@@ -120,7 +113,7 @@ def writeUniversalTag(tag, pc):
@param pc: boolean @param pc: boolean
@return: UInt8 @return: UInt8
""" """
return ((Class.BER_CLASS_UNIV | berPC(pc)) | (Tag.BER_TAG_MASK & tag)) return UInt8((Class.BER_CLASS_UNIV | berPC(pc)) | (Tag.BER_TAG_MASK & tag))
def readApplicationTag(s, tag): def readApplicationTag(s, tag):
""" """
@@ -131,14 +124,14 @@ def readApplicationTag(s, tag):
""" """
byte = UInt8() byte = UInt8()
s.readType(byte) s.readType(byte)
if tag > UInt8(30): if tag.value > 30:
if byte != ((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | Tag.BER_TAG_MASK): if byte.value != ((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | Tag.BER_TAG_MASK):
raise InvalidExpectedDataException() raise InvalidExpectedDataException()
s.readType(byte) s.readType(byte)
if byte != tag: if byte.value != tag.value:
raise InvalidExpectedDataException("bad tag") raise InvalidExpectedDataException("bad tag")
else: else:
if byte != ((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | (Tag.BER_TAG_MASK & tag)): if byte.value != ((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | (Tag.BER_TAG_MASK & tag)):
raise InvalidExpectedDataException() raise InvalidExpectedDataException()
return readLength(s) return readLength(s)
@@ -146,13 +139,13 @@ def readApplicationTag(s, tag):
def writeApplicationTag(tag, size): def writeApplicationTag(tag, size):
""" """
Return structure that represent BER application tag Return structure that represent BER application tag
@param tag: UINt8 @param tag: int python that match an uint8(0xff)
@param size: size to rest of packet @param size: size to rest of packet
""" """
if tag > UInt8(30): if tag > 30:
return (((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | Tag.BER_TAG_MASK), tag, writeLength(size)) return (UInt8((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | Tag.BER_TAG_MASK), UInt8(tag), writeLength(size))
else: else:
return (((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | (Tag.BER_TAG_MASK & tag)), writeLength(size)) return (UInt8((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | (Tag.BER_TAG_MASK & tag)), writeLength(size))
def readBoolean(s): def readBoolean(s):
""" """
@@ -215,7 +208,7 @@ def readInteger(s):
def writeInteger(value): def writeInteger(value):
""" """
Write integer value Write integer value
@param param: int or python long @param param: INT or Python long
@return: BER integer structure @return: BER integer structure
""" """
if value <= 0xff: if value <= 0xff:
@@ -229,18 +222,18 @@ def readOctetString(s):
""" """
Read BER string structure Read BER string structure
@param s: stream @param s: stream
@return: String @return: string python
""" """
if not readUniversalTag(s, Tag.BER_TAG_OCTET_STRING, False): if not readUniversalTag(s, Tag.BER_TAG_OCTET_STRING, False):
raise InvalidExpectedDataException("Unexpected BER tag") raise InvalidExpectedDataException("Unexpected BER tag")
size = readLength(s) size = readLength(s)
return String(s.read(size.value)) return s.read(size.value)
def writeOctetstring(value): def writeOctetstring(value):
""" """
Write string in ber representation Write string in BER representation
@param value: string @param value: string
@return: string ber structure @return: string BER structure
""" """
return (writeUniversalTag(Tag.BER_TAG_OCTET_STRING, False), writeLength(len(value)), String(value)) return (writeUniversalTag(Tag.BER_TAG_OCTET_STRING, False), writeLength(len(value)), String(value))

View File

@@ -1,16 +1,34 @@
''' #
@author: citronneur # Copyright (c) 2014 Sylvain Peyrefitte
''' #
from rdpy.network.type import CompositeType, String, UInt8, UInt16Le, UInt32Le, sizeof, ArrayType, FactoryType # This file is part of rdpy.
from rdpy.network.const import ConstAttributes, TypeAttributes #
# rdpy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
@ConstAttributes """
@TypeAttributes(UInt16Le) Definition of structure use for capabilities nego
Use in PDU layer
"""
from rdpy.network.type import CompositeType, String, UInt8, UInt16Le, UInt32Le, sizeof, ArrayType, FactoryType
class CapsType(object): class CapsType(object):
''' """
different type of capabilities Different type of capabilities
@see: http://msdn.microsoft.com/en-us/library/cc240486.aspx @see: http://msdn.microsoft.com/en-us/library/cc240486.aspx
''' """
CAPSTYPE_GENERAL = 0x0001 CAPSTYPE_GENERAL = 0x0001
CAPSTYPE_BITMAP = 0x0002 CAPSTYPE_BITMAP = 0x0002
CAPSTYPE_ORDER = 0x0003 CAPSTYPE_ORDER = 0x0003
@@ -40,13 +58,11 @@ class CapsType(object):
CAPSETTYPE_BITMAP_CODECS = 0x001D CAPSETTYPE_BITMAP_CODECS = 0x001D
CAPSSETTYPE_FRAME_ACKNOWLEDGE = 0x001E CAPSSETTYPE_FRAME_ACKNOWLEDGE = 0x001E
@ConstAttributes
@TypeAttributes(UInt16Le)
class MajorType(object): class MajorType(object):
''' """
use in general capability Use in general capability
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx @see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
''' """
OSMAJORTYPE_UNSPECIFIED = 0x0000 OSMAJORTYPE_UNSPECIFIED = 0x0000
OSMAJORTYPE_WINDOWS = 0x0001 OSMAJORTYPE_WINDOWS = 0x0001
OSMAJORTYPE_OS2 = 0x0002 OSMAJORTYPE_OS2 = 0x0002
@@ -55,14 +71,12 @@ class MajorType(object):
OSMAJORTYPE_IOS = 0x0005 OSMAJORTYPE_IOS = 0x0005
OSMAJORTYPE_OSX = 0x0006 OSMAJORTYPE_OSX = 0x0006
OSMAJORTYPE_ANDROID = 0x0007 OSMAJORTYPE_ANDROID = 0x0007
@ConstAttributes
@TypeAttributes(UInt16Le)
class MinorType(object): class MinorType(object):
''' """
use in general capability Use in general capability
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx @see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
''' """
OSMINORTYPE_UNSPECIFIED = 0x0000 OSMINORTYPE_UNSPECIFIED = 0x0000
OSMINORTYPE_WINDOWS_31X = 0x0001 OSMINORTYPE_WINDOWS_31X = 0x0001
OSMINORTYPE_WINDOWS_95 = 0x0002 OSMINORTYPE_WINDOWS_95 = 0x0002
@@ -73,47 +87,39 @@ class MinorType(object):
OSMINORTYPE_NATIVE_XSERVER = 0x0007 OSMINORTYPE_NATIVE_XSERVER = 0x0007
OSMINORTYPE_PSEUDO_XSERVER = 0x0008 OSMINORTYPE_PSEUDO_XSERVER = 0x0008
OSMINORTYPE_WINDOWS_RT = 0x0009 OSMINORTYPE_WINDOWS_RT = 0x0009
@ConstAttributes
@TypeAttributes(UInt16Le)
class GeneralExtraFlag(object): class GeneralExtraFlag(object):
''' """
use in general capability Use in general capability
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx @see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
''' """
FASTPATH_OUTPUT_SUPPORTED = 0x0001 FASTPATH_OUTPUT_SUPPORTED = 0x0001
NO_BITMAP_COMPRESSION_HDR = 0x0400 NO_BITMAP_COMPRESSION_HDR = 0x0400
LONG_CREDENTIALS_SUPPORTED = 0x0004 LONG_CREDENTIALS_SUPPORTED = 0x0004
AUTORECONNECT_SUPPORTED = 0x0008 AUTORECONNECT_SUPPORTED = 0x0008
ENC_SALTED_CHECKSUM = 0x0010 ENC_SALTED_CHECKSUM = 0x0010
@ConstAttributes
@TypeAttributes(UInt8)
class Boolean(object): class Boolean(object):
FALSE = 0x00 FALSE = 0x00
TRUE = 0x01 TRUE = 0x01
@ConstAttributes
@TypeAttributes(UInt16Le)
class OrderFlag(object): class OrderFlag(object):
''' """
use in order capability Use in order capability
@see: http://msdn.microsoft.com/en-us/library/cc240556.aspx @see: http://msdn.microsoft.com/en-us/library/cc240556.aspx
''' """
NEGOTIATEORDERSUPPORT = 0x0002 NEGOTIATEORDERSUPPORT = 0x0002
ZEROBOUNDSDELTASSUPPORT = 0x0008 ZEROBOUNDSDELTASSUPPORT = 0x0008
COLORINDEXSUPPORT = 0x0020 COLORINDEXSUPPORT = 0x0020
SOLIDPATTERNBRUSHONLY = 0x0040 SOLIDPATTERNBRUSHONLY = 0x0040
ORDERFLAGS_EXTRA_FLAGS = 0x0080 ORDERFLAGS_EXTRA_FLAGS = 0x0080
@ConstAttributes
@TypeAttributes(UInt8)
class Order(object): class Order(object):
''' """
drawing orders supported Drawing orders supported
use in order capability Use in order capability
@see: http://msdn.microsoft.com/en-us/library/cc240556.aspx @see: http://msdn.microsoft.com/en-us/library/cc240556.aspx
''' """
TS_NEG_DSTBLT_INDEX = 0x00 TS_NEG_DSTBLT_INDEX = 0x00
TS_NEG_PATBLT_INDEX = 0x01 TS_NEG_PATBLT_INDEX = 0x01
TS_NEG_SCRBLT_INDEX = 0x02 TS_NEG_SCRBLT_INDEX = 0x02
@@ -135,25 +141,20 @@ class Order(object):
TS_NEG_ELLIPSE_SC_INDEX = 0x19 TS_NEG_ELLIPSE_SC_INDEX = 0x19
TS_NEG_ELLIPSE_CB_INDEX = 0x1A TS_NEG_ELLIPSE_CB_INDEX = 0x1A
TS_NEG_INDEX_INDEX = 0x1B TS_NEG_INDEX_INDEX = 0x1B
@ConstAttributes
@TypeAttributes(UInt16Le)
class OrderEx(object): class OrderEx(object):
''' """
extension orders Extension orders
use in order capability Use in order capability
''' """
ORDERFLAGS_EX_CACHE_BITMAP_REV3_SUPPORT = 0x0002 ORDERFLAGS_EX_CACHE_BITMAP_REV3_SUPPORT = 0x0002
ORDERFLAGS_EX_ALTSEC_FRAME_MARKER_SUPPORT = 0x0004 ORDERFLAGS_EX_ALTSEC_FRAME_MARKER_SUPPORT = 0x0004
@ConstAttributes
@TypeAttributes(UInt16Le)
class InputFlags(object): class InputFlags(object):
''' """
Input flag use in input capability Input flag use in input capability
@see: http://msdn.microsoft.com/en-us/library/cc240563.aspx @see: http://msdn.microsoft.com/en-us/library/cc240563.aspx
''' """
INPUT_FLAG_SCANCODES = 0x0001 INPUT_FLAG_SCANCODES = 0x0001
INPUT_FLAG_MOUSEX = 0x0004 INPUT_FLAG_MOUSEX = 0x0004
INPUT_FLAG_FASTPATH_INPUT = 0x0008 INPUT_FLAG_FASTPATH_INPUT = 0x0008
@@ -163,65 +164,55 @@ class InputFlags(object):
INPUT_FLAG_UNUSED2 = 0x0080 INPUT_FLAG_UNUSED2 = 0x0080
TS_INPUT_FLAG_MOUSE_HWHEEL = 0x0100 TS_INPUT_FLAG_MOUSE_HWHEEL = 0x0100
@ConstAttributes
@TypeAttributes(UInt32Le)
class BrushSupport(object): class BrushSupport(object):
''' """
Brush support of client Brush support of client
@see: http://msdn.microsoft.com/en-us/library/cc240564.aspx @see: http://msdn.microsoft.com/en-us/library/cc240564.aspx
''' """
BRUSH_DEFAULT = 0x00000000 BRUSH_DEFAULT = 0x00000000
BRUSH_COLOR_8x8 = 0x00000001 BRUSH_COLOR_8x8 = 0x00000001
BRUSH_COLOR_FULL = 0x00000002 BRUSH_COLOR_FULL = 0x00000002
@ConstAttributes
@TypeAttributes(UInt16Le)
class GlyphSupport(object): class GlyphSupport(object):
''' """
Use by glyph order Use by glyph order
@see: http://msdn.microsoft.com/en-us/library/cc240565.aspx @see: http://msdn.microsoft.com/en-us/library/cc240565.aspx
''' """
GLYPH_SUPPORT_NONE = 0x0000 GLYPH_SUPPORT_NONE = 0x0000
GLYPH_SUPPORT_PARTIAL = 0x0001 GLYPH_SUPPORT_PARTIAL = 0x0001
GLYPH_SUPPORT_FULL = 0x0002 GLYPH_SUPPORT_FULL = 0x0002
GLYPH_SUPPORT_ENCODE = 0x0003 GLYPH_SUPPORT_ENCODE = 0x0003
@ConstAttributes
@TypeAttributes(UInt32Le)
class OffscreenSupportLevel(object): class OffscreenSupportLevel(object):
''' """
Use to determine offscreen cache level supported Use to determine offscreen cache level supported
@see: http://msdn.microsoft.com/en-us/library/cc240550.aspx @see: http://msdn.microsoft.com/en-us/library/cc240550.aspx
''' """
FALSE = 0x00000000 FALSE = 0x00000000
TRUE = 0x00000001 TRUE = 0x00000001
@ConstAttributes
@TypeAttributes(UInt32Le)
class VirtualChannelCompressionFlag(object): class VirtualChannelCompressionFlag(object):
''' """
Use to determine virtual channel compression Use to determine virtual channel compression
@see: http://msdn.microsoft.com/en-us/library/cc240551.aspx @see: http://msdn.microsoft.com/en-us/library/cc240551.aspx
''' """
VCCAPS_NO_COMPR = 0x00000000 VCCAPS_NO_COMPR = 0x00000000
VCCAPS_COMPR_SC = 0x00000001 VCCAPS_COMPR_SC = 0x00000001
VCCAPS_COMPR_CS_8K = 0x00000002 VCCAPS_COMPR_CS_8K = 0x00000002
@ConstAttributes
@TypeAttributes(UInt16Le)
class SoundFlag(object): class SoundFlag(object):
''' """
Use in sound capability to inform it Use in sound capability to inform it
@see: http://msdn.microsoft.com/en-us/library/cc240552.aspx @see: http://msdn.microsoft.com/en-us/library/cc240552.aspx
''' """
NONE = 0x0000 NONE = 0x0000
SOUND_BEEPS_FLAG = 0x0001 SOUND_BEEPS_FLAG = 0x0001
class CacheEntry(CompositeType): class CacheEntry(CompositeType):
''' """
Use in capability cache exchange Use in capability cache exchange
@see: http://msdn.microsoft.com/en-us/library/cc240566.aspx @see: http://msdn.microsoft.com/en-us/library/cc240566.aspx
''' """
def __init__(self): def __init__(self):
CompositeType.__init__(self) CompositeType.__init__(self)
self.cacheEntries = UInt16Le() self.cacheEntries = UInt16Le()
@@ -229,50 +220,50 @@ class CacheEntry(CompositeType):
class Capability(CompositeType): class Capability(CompositeType):
''' """
A capability A capability
@see: http://msdn.microsoft.com/en-us/library/cc240486.aspx @see: http://msdn.microsoft.com/en-us/library/cc240486.aspx
''' """
def __init__(self, capabilitySetType = UInt16Le(), capability = None): def __init__(self, capabilitySetType = 0, capability = None):
CompositeType.__init__(self) CompositeType.__init__(self)
self.capabilitySetType = UInt16Le(capabilitySetType.value, constant = (not capability is None)) self.capabilitySetType = UInt16Le(capabilitySetType, constant = (not capability is None))
self.lengthCapability = UInt16Le(lambda:sizeof(self)) self.lengthCapability = UInt16Le(lambda:sizeof(self))
def CapabilityFactory(): def CapabilityFactory():
''' '''
closure for capability factory closure for capability factory
''' '''
if self.capabilitySetType == CapsType.CAPSTYPE_GENERAL: if self.capabilitySetType.value == CapsType.CAPSTYPE_GENERAL:
return GeneralCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return GeneralCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_BITMAP: elif self.capabilitySetType.value == CapsType.CAPSTYPE_BITMAP:
return BitmapCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return BitmapCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_ORDER: elif self.capabilitySetType.value == CapsType.CAPSTYPE_ORDER:
return OrderCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return OrderCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_BITMAPCACHE: elif self.capabilitySetType.value == CapsType.CAPSTYPE_BITMAPCACHE:
return BitmapCacheCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return BitmapCacheCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_POINTER: elif self.capabilitySetType.value == CapsType.CAPSTYPE_POINTER:
return PointerCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return PointerCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_INPUT: elif self.capabilitySetType.value == CapsType.CAPSTYPE_INPUT:
return InputCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return InputCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_BRUSH: elif self.capabilitySetType.value == CapsType.CAPSTYPE_BRUSH:
return BrushCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return BrushCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_GLYPHCACHE: elif self.capabilitySetType.value == CapsType.CAPSTYPE_GLYPHCACHE:
return GlyphCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return GlyphCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_OFFSCREENCACHE: elif self.capabilitySetType.value == CapsType.CAPSTYPE_OFFSCREENCACHE:
return OffscreenBitmapCacheCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return OffscreenBitmapCacheCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_VIRTUALCHANNEL: elif self.capabilitySetType.value == CapsType.CAPSTYPE_VIRTUALCHANNEL:
return VirtualChannelCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return VirtualChannelCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_SOUND: elif self.capabilitySetType.value == CapsType.CAPSTYPE_SOUND:
return SoundCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return SoundCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_CONTROL: elif self.capabilitySetType.value == CapsType.CAPSTYPE_CONTROL:
return ControlCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return ControlCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_ACTIVATION: elif self.capabilitySetType.value == CapsType.CAPSTYPE_ACTIVATION:
return WindowActivationCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return WindowActivationCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_FONT: elif self.capabilitySetType.value == CapsType.CAPSTYPE_FONT:
return FontCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return FontCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_COLORCACHE: elif self.capabilitySetType.value == CapsType.CAPSTYPE_COLORCACHE:
return ColorCacheCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return ColorCacheCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_SHARE: elif self.capabilitySetType.value == CapsType.CAPSTYPE_SHARE:
return ShareCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return ShareCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
else: else:
return String(readLen = UInt16Le(lambda:self.lengthCapability.value - 4)) return String(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
@@ -283,12 +274,12 @@ class Capability(CompositeType):
self.capability = FactoryType(capability) self.capability = FactoryType(capability)
class GeneralCapability(CompositeType): class GeneralCapability(CompositeType):
''' """
General capability (protocol version and compression mode) General capability (protocol version and compression mode)
client -> server client -> server
server -> client server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx @see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.osMajorType = UInt16Le() self.osMajorType = UInt16Le()
@@ -304,12 +295,12 @@ class GeneralCapability(CompositeType):
self.suppressOutputSupport = UInt8() self.suppressOutputSupport = UInt8()
class BitmapCapability(CompositeType): class BitmapCapability(CompositeType):
''' """
Bitmap format Capability Bitmap format Capability
client -> server client -> server
server -> client server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240554.aspx @see: http://msdn.microsoft.com/en-us/library/cc240554.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.preferredBitsPerPixel = UInt16Le() self.preferredBitsPerPixel = UInt16Le()
@@ -327,12 +318,12 @@ class BitmapCapability(CompositeType):
self.pad2octetsB = UInt16Le() self.pad2octetsB = UInt16Le()
class OrderCapability(CompositeType): class OrderCapability(CompositeType):
''' """
Order capability list all drawing order supported Order capability list all drawing order supported
client -> server client -> server
server -> client server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240556.aspx @see: http://msdn.microsoft.com/en-us/library/cc240556.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.terminalDescriptor = String("\x00" * 16, readLen = UInt8(16)) self.terminalDescriptor = String("\x00" * 16, readLen = UInt8(16))
@@ -342,8 +333,8 @@ class OrderCapability(CompositeType):
self.pad2octetsA = UInt16Le(0) self.pad2octetsA = UInt16Le(0)
self.maximumOrderLevel = UInt16Le(1) self.maximumOrderLevel = UInt16Le(1)
self.numberFonts = UInt16Le() self.numberFonts = UInt16Le()
self.orderFlags = OrderFlag.NEGOTIATEORDERSUPPORT self.orderFlags = UInt16Le(OrderFlag.NEGOTIATEORDERSUPPORT)
self.orderSupport = ArrayType(UInt8, init = [UInt8(0) for i in range (0, 32)], readLen = UInt8(32)) self.orderSupport = ArrayType(UInt8, init = [UInt8(0) for _ in range (0, 32)], readLen = UInt8(32))
self.textFlags = UInt16Le() self.textFlags = UInt16Le()
self.orderSupportExFlags = UInt16Le() self.orderSupportExFlags = UInt16Le()
self.pad4octetsB = UInt32Le() self.pad4octetsB = UInt32Le()
@@ -354,11 +345,11 @@ class OrderCapability(CompositeType):
self.pad2octetsE = UInt16Le() self.pad2octetsE = UInt16Le()
class BitmapCacheCapability(CompositeType): class BitmapCacheCapability(CompositeType):
''' """
Order use to cache bitmap very usefull Order use to cache bitmap very useful
client -> server client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240559.aspx @see: http://msdn.microsoft.com/en-us/library/cc240559.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.pad1 = UInt32Le() self.pad1 = UInt32Le()
@@ -375,13 +366,13 @@ class BitmapCacheCapability(CompositeType):
self.cache2MaximumCellSize = UInt16Le() self.cache2MaximumCellSize = UInt16Le()
class PointerCapability(CompositeType): class PointerCapability(CompositeType):
''' """
Use to indicate pointer handle of client Use to indicate pointer handle of client
Paint by server or per client Paint by server or per client
client -> server client -> server
server -> client server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240562.aspx @see: http://msdn.microsoft.com/en-us/library/cc240562.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.colorPointerFlag = UInt16Le() self.colorPointerFlag = UInt16Le()
@@ -389,12 +380,12 @@ class PointerCapability(CompositeType):
self.pointerCacheSize = UInt16Le() self.pointerCacheSize = UInt16Le()
class InputCapability(CompositeType): class InputCapability(CompositeType):
''' """
Use to indicate input capabilities Use to indicate input capabilities
client -> server client -> server
server -> client server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240563.aspx @see: http://msdn.microsoft.com/en-us/library/cc240563.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.inputFlags = UInt16Le() self.inputFlags = UInt16Le()
@@ -411,69 +402,69 @@ class InputCapability(CompositeType):
self.imeFileName = String("\x00" * 64, readLen = UInt8(64)) self.imeFileName = String("\x00" * 64, readLen = UInt8(64))
class BrushCapability(CompositeType): class BrushCapability(CompositeType):
''' """
Use to indicate brush capability Use to indicate brush capability
client -> server client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240564.aspx @see: http://msdn.microsoft.com/en-us/library/cc240564.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.brushSupportLevel = BrushSupport.BRUSH_DEFAULT self.brushSupportLevel = UInt32Le(BrushSupport.BRUSH_DEFAULT)
class GlyphCapability(CompositeType): class GlyphCapability(CompositeType):
''' """
Use in font order Use in font order
client -> server client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240565.aspx @see: http://msdn.microsoft.com/en-us/library/cc240565.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.glyphCache = ArrayType(CacheEntry, init = [CacheEntry() for i in range(0,10)], readLen = UInt8(10)) self.glyphCache = ArrayType(CacheEntry, init = [CacheEntry() for _ in range(0,10)], readLen = UInt8(10))
self.fragCache = UInt32Le() self.fragCache = UInt32Le()
#all fonts are sent with bitmap format (very expensive) #all fonts are sent with bitmap format (very expensive)
self.glyphSupportLevel = GlyphSupport.GLYPH_SUPPORT_NONE self.glyphSupportLevel = UInt16Le(GlyphSupport.GLYPH_SUPPORT_NONE)
self.pad2octets = UInt16Le() self.pad2octets = UInt16Le()
class OffscreenBitmapCacheCapability(CompositeType): class OffscreenBitmapCacheCapability(CompositeType):
''' """
use to cached bitmap in offscreen area use to cached bitmap in offscreen area
client -> server client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240550.aspx @see: http://msdn.microsoft.com/en-us/library/cc240550.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.offscreenSupportLevel = OffscreenSupportLevel.FALSE self.offscreenSupportLevel = UInt32Le(OffscreenSupportLevel.FALSE)
self.offscreenCacheSize = UInt16Le() self.offscreenCacheSize = UInt16Le()
self.offscreenCacheEntries = UInt16Le() self.offscreenCacheEntries = UInt16Le()
class VirtualChannelCapability(CompositeType): class VirtualChannelCapability(CompositeType):
''' """
use to determine virtual channel compression use to determine virtual channel compression
client -> server client -> server
server -> client server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240551.aspx @see: http://msdn.microsoft.com/en-us/library/cc240551.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.flags = VirtualChannelCompressionFlag.VCCAPS_NO_COMPR self.flags = UInt32Le(VirtualChannelCompressionFlag.VCCAPS_NO_COMPR)
self.VCChunkSize = UInt32Le(optional = True) self.VCChunkSize = UInt32Le(optional = True)
class SoundCapability(CompositeType): class SoundCapability(CompositeType):
''' """
use to exchange sound capability Use to exchange sound capability
client -> server client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240552.aspx @see: http://msdn.microsoft.com/en-us/library/cc240552.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.soundFlags = SoundFlag.NONE self.soundFlags = UInt16Le(SoundFlag.NONE)
self.pad2octetsA = UInt16Le() self.pad2octetsA = UInt16Le()
class ControlCapability(CompositeType): class ControlCapability(CompositeType):
''' """
client -> server but server ignore contents! Thanks krosoft for brandwidth client -> server but server ignore contents! Thanks krosoft for brandwidth
@see: http://msdn.microsoft.com/en-us/library/cc240568.aspx @see: http://msdn.microsoft.com/en-us/library/cc240568.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.controlFlags = UInt16Le() self.controlFlags = UInt16Le()
@@ -482,10 +473,10 @@ class ControlCapability(CompositeType):
self.detachInterest = UInt16Le(0x0002) self.detachInterest = UInt16Le(0x0002)
class WindowActivationCapability(CompositeType): class WindowActivationCapability(CompositeType):
''' """
client -> server but server ignore contents! Thanks krosoft for brandwidth client -> server but server ignore contents! Thanks krosoft for brandwidth
@see: http://msdn.microsoft.com/en-us/library/cc240569.aspx @see: http://msdn.microsoft.com/en-us/library/cc240569.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.helpKeyFlag = UInt16Le() self.helpKeyFlag = UInt16Le()
@@ -494,35 +485,35 @@ class WindowActivationCapability(CompositeType):
self.windowManagerKeyFlag = UInt16Le() self.windowManagerKeyFlag = UInt16Le()
class FontCapability(CompositeType): class FontCapability(CompositeType):
''' """
use to indicate font support Use to indicate font support
client -> server client -> server
server -> client server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240571.aspx @see: http://msdn.microsoft.com/en-us/library/cc240571.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.fontSupportFlags = UInt16Le(0x0001) self.fontSupportFlags = UInt16Le(0x0001)
self.pad2octets = UInt16Le() self.pad2octets = UInt16Le()
class ColorCacheCapability(CompositeType): class ColorCacheCapability(CompositeType):
''' """
client -> server client -> server
server -> client server -> client
@see: http://msdn.microsoft.com/en-us/library/cc241564.aspx @see: http://msdn.microsoft.com/en-us/library/cc241564.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.colorTableCacheSize = UInt16Le(0x0006) self.colorTableCacheSize = UInt16Le(0x0006)
self.pad2octets = UInt16Le() self.pad2octets = UInt16Le()
class ShareCapability(CompositeType): class ShareCapability(CompositeType):
''' """
use to advertise channel id of server Use to advertise channel id of server
client -> server client -> server
server -> client server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240570.aspx @see: http://msdn.microsoft.com/en-us/library/cc240570.aspx
''' """
def __init__(self, readLen = None): def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen) CompositeType.__init__(self, readLen = readLen)
self.nodeId = UInt16Le() self.nodeId = UInt16Le()

View File

@@ -1,9 +1,27 @@
''' #
@author sylvain # Copyright (c) 2014 Sylvain Peyrefitte
@summary gcc language #
@see: http://msdn.microsoft.com/en-us/library/cc240508.aspx # This file is part of rdpy.
''' #
from rdpy.network.const import ConstAttributes, TypeAttributes # rdpy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
"""
Implement GCC structure use in RDP protocol
http://msdn.microsoft.com/en-us/library/cc240508.aspx
"""
from rdpy.network.type import UInt8, UInt16Le, UInt32Le, CompositeType, String, UniString, Stream, sizeof from rdpy.network.type import UInt8, UInt16Le, UInt32Le, CompositeType, String, UniString, Stream, sizeof
import per import per
from rdpy.network.error import InvalidExpectedDataException from rdpy.network.error import InvalidExpectedDataException
@@ -12,76 +30,64 @@ t124_02_98_oid = ( 0, 0, 20, 124, 0, 1 )
h221_cs_key = "Duca"; h221_cs_key = "Duca";
h221_sc_key = "McDn"; h221_sc_key = "McDn";
@ConstAttributes
@TypeAttributes(UInt16Le)
class ServerToClientMessage(object): class ServerToClientMessage(object):
''' """
Server to Client block Server to Client block
gcc conference messages GCC conference messages
@see: http://msdn.microsoft.com/en-us/library/cc240509.aspx @see: http://msdn.microsoft.com/en-us/library/cc240509.aspx
''' """
SC_CORE = 0x0C01 SC_CORE = 0x0C01
SC_SECURITY = 0x0C02 SC_SECURITY = 0x0C02
SC_NET = 0x0C03 SC_NET = 0x0C03
@ConstAttributes
@TypeAttributes(UInt16Le)
class ClientToServerMessage(object): class ClientToServerMessage(object):
''' """
Client to Server block Client to Server block
gcc conference messages GCC conference messages
@see: http://msdn.microsoft.com/en-us/library/cc240509.aspx @see: http://msdn.microsoft.com/en-us/library/cc240509.aspx
''' """
CS_CORE = 0xC001 CS_CORE = 0xC001
CS_SECURITY = 0xC002 CS_SECURITY = 0xC002
CS_NET = 0xC003 CS_NET = 0xC003
CS_CLUSTER = 0xC004 CS_CLUSTER = 0xC004
CS_MONITOR = 0xC005 CS_MONITOR = 0xC005
@ConstAttributes
@TypeAttributes(UInt16Le)
class ColorDepth(object): class ColorDepth(object):
''' """
depth color Depth color
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx @see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
''' """
RNS_UD_COLOR_8BPP = 0xCA01 RNS_UD_COLOR_8BPP = 0xCA01
RNS_UD_COLOR_16BPP_555 = 0xCA02 RNS_UD_COLOR_16BPP_555 = 0xCA02
RNS_UD_COLOR_16BPP_565 = 0xCA03 RNS_UD_COLOR_16BPP_565 = 0xCA03
RNS_UD_COLOR_24BPP = 0xCA04 RNS_UD_COLOR_24BPP = 0xCA04
@ConstAttributes
@TypeAttributes(UInt16Le)
class HighColor(object): class HighColor(object):
''' """
high color of client High color of client
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx @see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
''' """
HIGH_COLOR_4BPP = 0x0004 HIGH_COLOR_4BPP = 0x0004
HIGH_COLOR_8BPP = 0x0008 HIGH_COLOR_8BPP = 0x0008
HIGH_COLOR_15BPP = 0x000f HIGH_COLOR_15BPP = 0x000f
HIGH_COLOR_16BPP = 0x0010 HIGH_COLOR_16BPP = 0x0010
HIGH_COLOR_24BPP = 0x0018 HIGH_COLOR_24BPP = 0x0018
@ConstAttributes
@TypeAttributes(UInt16Le)
class Support(object): class Support(object):
''' """
support depth flag Supported depth flag
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx @see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
''' """
RNS_UD_24BPP_SUPPORT = 0x0001 RNS_UD_24BPP_SUPPORT = 0x0001
RNS_UD_16BPP_SUPPORT = 0x0002 RNS_UD_16BPP_SUPPORT = 0x0002
RNS_UD_15BPP_SUPPORT = 0x0004 RNS_UD_15BPP_SUPPORT = 0x0004
RNS_UD_32BPP_SUPPORT = 0x0008 RNS_UD_32BPP_SUPPORT = 0x0008
@ConstAttributes
@TypeAttributes(UInt16Le)
class CapabilityFlags(object): class CapabilityFlags(object):
''' """
for more details on each flags click above For more details on each flags click above
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx @see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
''' """
RNS_UD_CS_SUPPORT_ERRINFO_PDU = 0x0001 RNS_UD_CS_SUPPORT_ERRINFO_PDU = 0x0001
RNS_UD_CS_WANT_32BPP_SESSION = 0x0002 RNS_UD_CS_WANT_32BPP_SESSION = 0x0002
RNS_UD_CS_SUPPORT_STATUSINFO_PDU = 0x0004 RNS_UD_CS_SUPPORT_STATUSINFO_PDU = 0x0004
@@ -94,14 +100,12 @@ class CapabilityFlags(object):
RNS_UD_CS_SUPPORT_DYNAMIC_TIME_ZONE = 0x0200 RNS_UD_CS_SUPPORT_DYNAMIC_TIME_ZONE = 0x0200
RNS_UD_CS_SUPPORT_HEARTBEAT_PDU = 0x0400 RNS_UD_CS_SUPPORT_HEARTBEAT_PDU = 0x0400
@ConstAttributes
@TypeAttributes(UInt8)
class ConnectionType(object): class ConnectionType(object):
''' """
this information is correct if This information is correct if
RNS_UD_CS_VALID_CONNECTION_TYPE flag is set on capabilityFlag RNS_UD_CS_VALID_CONNECTION_TYPE flag is set on capabilityFlag
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx @see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
''' """
CONNECTION_TYPE_MODEM = 0x01 CONNECTION_TYPE_MODEM = 0x01
CONNECTION_TYPE_BROADBAND_LOW = 0x02 CONNECTION_TYPE_BROADBAND_LOW = 0x02
CONNECTION_TYPE_SATELLITE = 0x03 CONNECTION_TYPE_SATELLITE = 0x03
@@ -110,41 +114,33 @@ class ConnectionType(object):
CONNECTION_TYPE_LAN = 0x06 CONNECTION_TYPE_LAN = 0x06
CONNECTION_TYPE_AUTODETECT = 0x07 CONNECTION_TYPE_AUTODETECT = 0x07
@ConstAttributes
@TypeAttributes(UInt32Le)
class Version(object): class Version(object):
''' """
supported version of RDP Supported version of RDP
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx @see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
''' """
RDP_VERSION_4 = 0x00080001 RDP_VERSION_4 = 0x00080001
RDP_VERSION_5_PLUS = 0x00080004 RDP_VERSION_5_PLUS = 0x00080004
@ConstAttributes
@TypeAttributes(UInt16Le)
class Sequence(object): class Sequence(object):
RNS_UD_SAS_DEL = 0xAA03 RNS_UD_SAS_DEL = 0xAA03
@ConstAttributes
@TypeAttributes(UInt32Le)
class Encryption(object): class Encryption(object):
''' """
encryption method supported Encryption methods supported
@deprecated: because rdpy use ssl but need to send to server... @deprecated: because rdpy use SSL but need to send to server...
@see: http://msdn.microsoft.com/en-us/library/cc240511.aspx @see: http://msdn.microsoft.com/en-us/library/cc240511.aspx
''' """
ENCRYPTION_FLAG_40BIT = 0x00000001 ENCRYPTION_FLAG_40BIT = 0x00000001
ENCRYPTION_FLAG_128BIT = 0x00000002 ENCRYPTION_FLAG_128BIT = 0x00000002
ENCRYPTION_FLAG_56BIT = 0x00000008 ENCRYPTION_FLAG_56BIT = 0x00000008
FIPS_ENCRYPTION_FLAG = 0x00000010 FIPS_ENCRYPTION_FLAG = 0x00000010
@ConstAttributes
@TypeAttributes(UInt32Le)
class ChannelOptions(object): class ChannelOptions(object):
''' """
channel options Channel options
@see: http://msdn.microsoft.com/en-us/library/cc240513.aspx @see: http://msdn.microsoft.com/en-us/library/cc240513.aspx
''' """
CHANNEL_OPTION_INITIALIZED = 0x80000000 CHANNEL_OPTION_INITIALIZED = 0x80000000
CHANNEL_OPTION_ENCRYPT_RDP = 0x40000000 CHANNEL_OPTION_ENCRYPT_RDP = 0x40000000
CHANNEL_OPTION_ENCRYPT_SC = 0x20000000 CHANNEL_OPTION_ENCRYPT_SC = 0x20000000
@@ -156,14 +152,12 @@ class ChannelOptions(object):
CHANNEL_OPTION_COMPRESS = 0x00400000 CHANNEL_OPTION_COMPRESS = 0x00400000
CHANNEL_OPTION_SHOW_PROTOCOL = 0x00200000 CHANNEL_OPTION_SHOW_PROTOCOL = 0x00200000
REMOTE_CONTROL_PERSISTENT = 0x00100000 REMOTE_CONTROL_PERSISTENT = 0x00100000
@ConstAttributes
@TypeAttributes(UInt32Le)
class KeyboardType(object): class KeyboardType(object):
''' """
Keyboard type Keyboard type
IBM_101_102_KEYS is the most common keyboard type IBM_101_102_KEYS is the most common keyboard type
''' """
IBM_PC_XT_83_KEY = 0x00000001 IBM_PC_XT_83_KEY = 0x00000001
OLIVETTI = 0x00000002 OLIVETTI = 0x00000002
IBM_PC_AT_84_KEY = 0x00000003 IBM_PC_AT_84_KEY = 0x00000003
@@ -171,14 +165,12 @@ class KeyboardType(object):
NOKIA_1050 = 0x00000005 NOKIA_1050 = 0x00000005
NOKIA_9140 = 0x00000006 NOKIA_9140 = 0x00000006
JAPANESE = 0x00000007 JAPANESE = 0x00000007
@ConstAttributes
@TypeAttributes(UInt32Le)
class KeyboardLayout(object): class KeyboardLayout(object):
''' """
Keyboard layout definition Keyboard layout definition
@see: http://technet.microsoft.com/en-us/library/cc766503%28WS.10%29.aspx @see: http://technet.microsoft.com/en-us/library/cc766503%28WS.10%29.aspx
''' """
ARABIC = 0x00000401 ARABIC = 0x00000401
BULGARIAN = 0x00000402 BULGARIAN = 0x00000402
CHINESE_US_KEYBOARD = 0x00000404 CHINESE_US_KEYBOARD = 0x00000404
@@ -201,64 +193,64 @@ class KeyboardLayout(object):
class ClientCoreSettings(CompositeType): class ClientCoreSettings(CompositeType):
''' """
class that represent core setting of client Class that represent core setting of client
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx @see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
''' """
def __init__(self): def __init__(self):
CompositeType.__init__(self) CompositeType.__init__(self)
self.rdpVersion = Version.RDP_VERSION_5_PLUS self.rdpVersion = UInt32Le(Version.RDP_VERSION_5_PLUS)
self.desktopWidth = UInt16Le(1280) self.desktopWidth = UInt16Le(1280)
self.desktopHeight = UInt16Le(800) self.desktopHeight = UInt16Le(800)
self.colorDepth = ColorDepth.RNS_UD_COLOR_8BPP self.colorDepth = UInt16Le(ColorDepth.RNS_UD_COLOR_8BPP)
self.sasSequence = Sequence.RNS_UD_SAS_DEL self.sasSequence = UInt16Le(Sequence.RNS_UD_SAS_DEL)
self.kbdLayout = KeyboardLayout.FRENCH self.kbdLayout = UInt32Le(KeyboardLayout.FRENCH)
self.clientBuild = UInt32Le(3790) self.clientBuild = UInt32Le(3790)
self.clientName = UniString("rdpy" + "\x00"*11, readLen = UInt8(30)) self.clientName = UniString("rdpy" + "\x00"*11, readLen = UInt8(30))
self.keyboardType = KeyboardType.IBM_101_102_KEYS self.keyboardType = UInt32Le(KeyboardType.IBM_101_102_KEYS)
self.keyboardSubType = UInt32Le(0) self.keyboardSubType = UInt32Le(0)
self.keyboardFnKeys = UInt32Le(12) self.keyboardFnKeys = UInt32Le(12)
self.imeFileName = String("\x00"*64, readLen = UInt8(64)) self.imeFileName = String("\x00"*64, readLen = UInt8(64))
self.postBeta2ColorDepth = ColorDepth.RNS_UD_COLOR_8BPP self.postBeta2ColorDepth = UInt16Le(ColorDepth.RNS_UD_COLOR_8BPP)
self.clientProductId = UInt16Le(1) self.clientProductId = UInt16Le(1)
self.serialNumber = UInt32Le(0) self.serialNumber = UInt32Le(0)
self.highColorDepth = HighColor.HIGH_COLOR_24BPP self.highColorDepth = UInt16Le(HighColor.HIGH_COLOR_24BPP)
self.supportedColorDepths = Support.RNS_UD_24BPP_SUPPORT | Support.RNS_UD_16BPP_SUPPORT | Support.RNS_UD_15BPP_SUPPORT self.supportedColorDepths = UInt16Le(Support.RNS_UD_32BPP_SUPPORT | Support.RNS_UD_24BPP_SUPPORT | Support.RNS_UD_16BPP_SUPPORT)
self.earlyCapabilityFlags = CapabilityFlags.RNS_UD_CS_SUPPORT_ERRINFO_PDU self.earlyCapabilityFlags = UInt16Le(CapabilityFlags.RNS_UD_CS_SUPPORT_ERRINFO_PDU)
self.clientDigProductId = String("\x00"*64, readLen = UInt8(64)) self.clientDigProductId = String("\x00"*64, readLen = UInt8(64))
self.connectionType = UInt8() self.connectionType = UInt8()
self.pad1octet = UInt8() self.pad1octet = UInt8()
self.serverSelectedProtocol = UInt32Le() self.serverSelectedProtocol = UInt32Le()
class ServerCoreSettings(CompositeType): class ServerCoreSettings(CompositeType):
''' """
server side core settings structure Server side core settings structure
@see: http://msdn.microsoft.com/en-us/library/cc240517.aspx @see: http://msdn.microsoft.com/en-us/library/cc240517.aspx
''' """
def __init__(self): def __init__(self):
CompositeType.__init__(self) CompositeType.__init__(self)
self.rdpVersion = Version.RDP_VERSION_5_PLUS self.rdpVersion = UInt32Le(Version.RDP_VERSION_5_PLUS)
self.clientRequestedProtocol = UInt32Le() self.clientRequestedProtocol = UInt32Le()
class ClientSecuritySettings(CompositeType): class ClientSecuritySettings(CompositeType):
''' """
client security setting Client security setting
@deprecated: because we use ssl @deprecated: because we use ssl
@see: http://msdn.microsoft.com/en-us/library/cc240511.aspx @see: http://msdn.microsoft.com/en-us/library/cc240511.aspx
''' """
def __init__(self): def __init__(self):
CompositeType.__init__(self) CompositeType.__init__(self)
self.encryptionMethods = UInt32Le() self.encryptionMethods = UInt32Le()
self.extEncryptionMethods = UInt32Le() self.extEncryptionMethods = UInt32Le()
class ServerSecuritySettings(CompositeType): class ServerSecuritySettings(CompositeType):
''' """
server security settings Server security settings
may be ignore because rdpy don't use May be ignored because rdpy don't use
RDP security level RDP security level
@deprecated: because we use ssl @deprecated: because we use SSL
@see: http://msdn.microsoft.com/en-us/library/cc240518.aspx @see: http://msdn.microsoft.com/en-us/library/cc240518.aspx
''' """
def __init__(self): def __init__(self):
CompositeType.__init__(self) CompositeType.__init__(self)
self.encryptionMethod = UInt32Le() self.encryptionMethod = UInt32Le()
@@ -266,12 +258,11 @@ class ServerSecuritySettings(CompositeType):
class ClientRequestedChannel(CompositeType): class ClientRequestedChannel(CompositeType):
''' """
channels structure share between Channels structure share between client and server
client and server
@see: http://msdn.microsoft.com/en-us/library/cc240512.aspx @see: http://msdn.microsoft.com/en-us/library/cc240512.aspx
@see: http://msdn.microsoft.com/en-us/library/cc240513.aspx @see: http://msdn.microsoft.com/en-us/library/cc240513.aspx
''' """
def __init__(self, name = "", options = UInt32Le()): def __init__(self, name = "", options = UInt32Le()):
CompositeType.__init__(self) CompositeType.__init__(self)
#name of channel #name of channel
@@ -280,9 +271,9 @@ class ClientRequestedChannel(CompositeType):
self.options = options self.options = options
class ClientSettings(object): class ClientSettings(object):
''' """
class which group all client settings supported by RDPY Class which group all client settings supported by RDPY
''' """
def __init__(self): def __init__(self):
self.core = ClientCoreSettings() self.core = ClientCoreSettings()
#list of ClientRequestedChannel read network gcc packet #list of ClientRequestedChannel read network gcc packet
@@ -290,9 +281,9 @@ class ClientSettings(object):
self.security = ClientSecuritySettings() self.security = ClientSecuritySettings()
class ServerSettings(object): class ServerSettings(object):
''' """
server settings Server settings
''' """
def __init__(self): def __init__(self):
#core settings of server #core settings of server
self.core = ServerCoreSettings() self.core = ServerCoreSettings()
@@ -302,11 +293,11 @@ class ServerSettings(object):
self.channelsId = [] self.channelsId = []
def writeConferenceCreateRequest(settings): def writeConferenceCreateRequest(settings):
''' """
write conference create request structure Write conference create request structure
@param settings: ClientSettings @param settings: ClientSettings
@return: struct that represent @return: structure that represent
''' """
userData = writeClientDataBlocks(settings) userData = writeClientDataBlocks(settings)
userDataStream = Stream() userDataStream = Stream()
userDataStream.writeType(userData) userDataStream.writeType(userData)
@@ -318,12 +309,12 @@ def writeConferenceCreateRequest(settings):
per.writeOctetStream(h221_cs_key, 4), per.writeOctetStream(userDataStream.getvalue())) per.writeOctetStream(h221_cs_key, 4), per.writeOctetStream(userDataStream.getvalue()))
def readConferenceCreateResponse(s): def readConferenceCreateResponse(s):
''' """
read response from server Read response from server
and return server settings read from this response and return server settings read from this response
@param s: Stream @param s: Stream
@return: ServerSettings @return: ServerSettings
''' """
per.readChoice(s) per.readChoice(s)
per.readObjectIdentifier(s, t124_02_98_oid) per.readObjectIdentifier(s, t124_02_98_oid)
per.readLength(s) per.readLength(s)
@@ -339,22 +330,22 @@ def readConferenceCreateResponse(s):
def writeClientDataBlocks(settings): def writeClientDataBlocks(settings):
''' """
write all blocks for client Write all blocks for client
and return gcc valid structure and return GCC valid structure
@param settings: ClientSettings @param settings: ClientSettings
''' """
return (writeClientCoreData(settings.core), return (writeClientCoreData(settings.core),
writeClientSecurityData(settings.security), writeClientSecurityData(settings.security),
writeClientNetworkData(settings.networkChannels)) writeClientNetworkData(settings.networkChannels))
def readServerDataBlocks(s): def readServerDataBlocks(s):
''' """
read gcc server data blocks Read GCC server data blocks
and return result in Server Settings object And return result in Server Settings object
@param s: Stream @param s: Stream
@return: ServerSettings @return: ServerSettings
''' """
settings = ServerSettings() settings = ServerSettings()
length = per.readLength(s) length = per.readLength(s)
while length > 0: while length > 0:
@@ -363,61 +354,61 @@ def readServerDataBlocks(s):
blockLength = UInt16Le() blockLength = UInt16Le()
s.readType((blockType, blockLength)) s.readType((blockType, blockLength))
#read core block #read core block
if blockType == ServerToClientMessage.SC_CORE: if blockType.value == ServerToClientMessage.SC_CORE:
s.readType(settings.core) s.readType(settings.core)
#read network block #read network block
elif blockType == ServerToClientMessage.SC_NET: elif blockType.value == ServerToClientMessage.SC_NET:
settings.channelsId = readServerSecurityData(s) settings.channelsId = readServerSecurityData(s)
#read security block #read security block
#unused in rdpy because use SSL layer #unused in rdpy because use SSL layer
elif blockType == ServerToClientMessage.SC_SECURITY: elif blockType.value == ServerToClientMessage.SC_SECURITY:
s.readType(settings.security) s.readType(settings.security)
else: else:
print "Unknow server block %s"%hex(type) print "Unknown server block %s"%hex(type)
length -= blockLength.value length -= blockLength.value
s.seek(marker + blockLength.value) s.seek(marker + blockLength.value)
return settings return settings
def writeClientCoreData(core): def writeClientCoreData(core):
''' """
write client settings in GCC language Write client settings in GCC language
@param settings: ClientSettings structure @param settings: ClientSettings structure
@return: structure that represent client data blocks @return: structure that represent client data blocks
''' """
return (ClientToServerMessage.CS_CORE, UInt16Le(sizeof(core) + 4), core) return (UInt16Le(ClientToServerMessage.CS_CORE), UInt16Le(sizeof(core) + 4), core)
def writeClientSecurityData(security): def writeClientSecurityData(security):
''' """
write security header block and security structure Write security header block and security structure
@param security: ClientSecuritySettings @param security: ClientSecuritySettings
@return: gcc client security data @return: GCC client security data
''' """
return (ClientToServerMessage.CS_SECURITY, UInt16Le(sizeof(security) + 4), security) return (UInt16Le(ClientToServerMessage.CS_SECURITY), UInt16Le(sizeof(security) + 4), security)
def writeClientNetworkData(channels): def writeClientNetworkData(channels):
''' """
write network packet whith channels infos Write network packet with channels infos
@param channels: list of ClientRequestedChannel @param channels: list of ClientRequestedChannel
@return: gcc network packet @return: GCC network packet
''' """
if len(channels) == 0: if len(channels) == 0:
return () return ()
return (ClientToServerMessage.CS_NET, UInt16Le(len(channels) * sizeof(ClientRequestedChannel()) + 8), UInt32Le(len(channels)), tuple(channels)) return (UInt16Le(ClientToServerMessage.CS_NET), UInt16Le(len(channels) * sizeof(ClientRequestedChannel()) + 8), UInt32Le(len(channels)), tuple(channels))
def readServerSecurityData(s): def readServerSecurityData(s):
''' """
read server security and fill it in settings Read server security and fill it in settings
read all channels accepted by server by server Read all channels accepted by server by server
@param s: Stream @param s: Stream
@return: list of channel id selected by server @return: list of channel id selected by server
@see: http://msdn.microsoft.com/en-us/library/cc240522.aspx @see: http://msdn.microsoft.com/en-us/library/cc240522.aspx
''' """
channelsId = [] channelsId = []
channelId = UInt16Le() channelId = UInt16Le()
numberOfChannels = UInt16Le() numberOfChannels = UInt16Le()
s.readType((channelId, numberOfChannels)) s.readType((channelId, numberOfChannels))
for i in range(0, numberOfChannels.value): for _ in range(0, numberOfChannels.value):
channelId = UInt16Le() channelId = UInt16Le()
s.readType(channelId) s.readType(channelId)
channelsId.append(channelId) channelsId.append(channelId)

View File

@@ -165,7 +165,7 @@ class MCS(LayerAutomata):
self.writeDomainParams(1, 1, 1, 0x420), self.writeDomainParams(1, 1, 1, 0x420),
self.writeDomainParams(0xffff, 0xfc17, 0xffff, 0xffff), self.writeDomainParams(0xffff, 0xfc17, 0xffff, 0xffff),
ber.writeOctetstring(ccReqStream.getvalue())) ber.writeOctetstring(ccReqStream.getvalue()))
self._transport.send((ber.writeApplicationTag(UInt8(Message.MCS_TYPE_CONNECT_INITIAL), sizeof(tmp)), tmp)) self._transport.send((ber.writeApplicationTag(Message.MCS_TYPE_CONNECT_INITIAL, sizeof(tmp)), tmp))
#we must receive a connect response #we must receive a connect response
self.setNextState(self.recvConnectResponse) self.setNextState(self.recvConnectResponse)

View File

@@ -25,13 +25,10 @@ In this layer are managed all mains bitmap update orders end user inputs
from rdpy.network.layer import LayerAutomata from rdpy.network.layer import LayerAutomata
from rdpy.network.type import CompositeType, UniString, String, UInt8, UInt16Le, UInt32Le, sizeof, ArrayType, FactoryType from rdpy.network.type import CompositeType, UniString, String, UInt8, UInt16Le, UInt32Le, sizeof, ArrayType, FactoryType
from rdpy.network.const import ConstAttributes, TypeAttributes
from rdpy.network.error import InvalidExpectedDataException, ErrorReportedFromPeer from rdpy.network.error import InvalidExpectedDataException, ErrorReportedFromPeer
import gcc, lic, caps import gcc, lic, caps
@ConstAttributes
@TypeAttributes(UInt16Le)
class SecurityFlag(object): class SecurityFlag(object):
""" """
Microsoft security flags Microsoft security flags
@@ -39,8 +36,6 @@ class SecurityFlag(object):
SEC_INFO_PKT = 0x0040 SEC_INFO_PKT = 0x0040
SEC_LICENSE_PKT = 0x0080 SEC_LICENSE_PKT = 0x0080
@ConstAttributes
@TypeAttributes(UInt32Le)
class InfoFlag(object): class InfoFlag(object):
""" """
Client capabilities informations Client capabilities informations
@@ -65,8 +60,6 @@ class InfoFlag(object):
INFO_VIDEO_DISABLE = 0x00400000 INFO_VIDEO_DISABLE = 0x00400000
INFO_CompressionTypeMask = 0x00001E00 INFO_CompressionTypeMask = 0x00001E00
@ConstAttributes
@TypeAttributes(UInt32Le)
class PerfFlag(object): class PerfFlag(object):
""" """
Network performances flag Network performances flag
@@ -80,17 +73,13 @@ class PerfFlag(object):
PERF_ENABLE_FONT_SMOOTHING = 0x00000080 PERF_ENABLE_FONT_SMOOTHING = 0x00000080
PERF_ENABLE_DESKTOP_COMPOSITION = 0x00000100 PERF_ENABLE_DESKTOP_COMPOSITION = 0x00000100
@ConstAttributes
@TypeAttributes(UInt16Le)
class AfInet(object): class AfInet(object):
""" """
IPv4 or IPv6 adress style IPv4 or IPv6 adress style
""" """
AF_INET = 0x00002 AF_INET = 0x00002
AF_INET6 = 0x0017 AF_INET6 = 0x0017
@ConstAttributes
@TypeAttributes(UInt16Le)
class PDUType(object): class PDUType(object):
""" """
Data PDU type primary index Data PDU type primary index
@@ -101,9 +90,7 @@ class PDUType(object):
PDUTYPE_DEACTIVATEALLPDU = 0x16 PDUTYPE_DEACTIVATEALLPDU = 0x16
PDUTYPE_DATAPDU = 0x17 PDUTYPE_DATAPDU = 0x17
PDUTYPE_SERVER_REDIR_PKT = 0x1A PDUTYPE_SERVER_REDIR_PKT = 0x1A
@ConstAttributes
@TypeAttributes(UInt8)
class PDUType2(object): class PDUType2(object):
""" """
Data PDU type secondary index Data PDU type secondary index
@@ -133,9 +120,7 @@ class PDUType2(object):
PDUTYPE2_ARC_STATUS_PDU = 0x32 PDUTYPE2_ARC_STATUS_PDU = 0x32
PDUTYPE2_STATUS_INFO_PDU = 0x36 PDUTYPE2_STATUS_INFO_PDU = 0x36
PDUTYPE2_MONITOR_LAYOUT_PDU = 0x37 PDUTYPE2_MONITOR_LAYOUT_PDU = 0x37
@ConstAttributes
@TypeAttributes(UInt8)
class StreamId(object): class StreamId(object):
""" """
Stream priority Stream priority
@@ -145,9 +130,7 @@ class StreamId(object):
STREAM_LOW = 0x01 STREAM_LOW = 0x01
STREAM_MED = 0x02 STREAM_MED = 0x02
STREAM_HI = 0x04 STREAM_HI = 0x04
@ConstAttributes
@TypeAttributes(UInt8)
class CompressionOrder(object): class CompressionOrder(object):
""" """
PDU compression order PDU compression order
@@ -158,8 +141,6 @@ class CompressionOrder(object):
PACKET_AT_FRONT = 0x40 PACKET_AT_FRONT = 0x40
PACKET_FLUSHED = 0x80 PACKET_FLUSHED = 0x80
@ConstAttributes
@TypeAttributes(UInt8)
class CompressionType(object): class CompressionType(object):
""" """
PDU compression type PDU compression type
@@ -170,8 +151,6 @@ class CompressionType(object):
PACKET_COMPR_TYPE_RDP6 = 0x2 PACKET_COMPR_TYPE_RDP6 = 0x2
PACKET_COMPR_TYPE_RDP61 = 0x3 PACKET_COMPR_TYPE_RDP61 = 0x3
@ConstAttributes
@TypeAttributes(UInt16Le)
class Action(object): class Action(object):
""" """
Action flag use in Control PDU packet Action flag use in Control PDU packet
@@ -182,8 +161,6 @@ class Action(object):
CTRLACTION_DETACH = 0x0003 CTRLACTION_DETACH = 0x0003
CTRLACTION_COOPERATE = 0x0004 CTRLACTION_COOPERATE = 0x0004
@ConstAttributes
@TypeAttributes(UInt16Le)
class PersistentKeyListFlag(object): class PersistentKeyListFlag(object):
""" """
Use to determine the number of persistent key packet Use to determine the number of persistent key packet
@@ -192,8 +169,6 @@ class PersistentKeyListFlag(object):
PERSIST_FIRST_PDU = 0x01 PERSIST_FIRST_PDU = 0x01
PERSIST_LAST_PDU = 0x02 PERSIST_LAST_PDU = 0x02
@ConstAttributes
@TypeAttributes(UInt16Le)
class BitmapFlag(object): class BitmapFlag(object):
""" """
Use in bitmap update PDU Use in bitmap update PDU
@@ -201,9 +176,7 @@ class BitmapFlag(object):
""" """
BITMAP_COMPRESSION = 0x0001 BITMAP_COMPRESSION = 0x0001
NO_BITMAP_COMPRESSION_HDR = 0x0400 NO_BITMAP_COMPRESSION_HDR = 0x0400
@ConstAttributes
@TypeAttributes(UInt16Le)
class UpdateType(object): class UpdateType(object):
""" """
Use in update PDU to determine which type of update Use in update PDU to determine which type of update
@@ -213,9 +186,7 @@ class UpdateType(object):
UPDATETYPE_BITMAP = 0x0001 UPDATETYPE_BITMAP = 0x0001
UPDATETYPE_PALETTE = 0x0002 UPDATETYPE_PALETTE = 0x0002
UPDATETYPE_SYNCHRONIZE = 0x0003 UPDATETYPE_SYNCHRONIZE = 0x0003
@ConstAttributes
@TypeAttributes(UInt32Le)
class ErrorInfo(object): class ErrorInfo(object):
""" """
Error code use in Error info PDU Error code use in Error info PDU
@@ -438,7 +409,7 @@ class RDPInfo(CompositeType):
#code page #code page
self.codePage = UInt32Le() self.codePage = UInt32Le()
#support flag #support flag
self.flag = InfoFlag.INFO_MOUSE | InfoFlag.INFO_UNICODE | InfoFlag.INFO_LOGONERRORS | InfoFlag.INFO_LOGONNOTIFY | InfoFlag.INFO_ENABLEWINDOWSKEY | InfoFlag.INFO_DISABLECTRLALTDEL self.flag = UInt32Le(InfoFlag.INFO_MOUSE | InfoFlag.INFO_UNICODE | InfoFlag.INFO_LOGONERRORS | InfoFlag.INFO_LOGONNOTIFY | InfoFlag.INFO_ENABLEWINDOWSKEY | InfoFlag.INFO_DISABLECTRLALTDEL)
self.cbDomain = UInt16Le(lambda:sizeof(self.domain) - 2) self.cbDomain = UInt16Le(lambda:sizeof(self.domain) - 2)
self.cbUserName = UInt16Le(lambda:sizeof(self.userName) - 2) self.cbUserName = UInt16Le(lambda:sizeof(self.userName) - 2)
self.cbPassword = UInt16Le(lambda:sizeof(self.password) - 2) self.cbPassword = UInt16Le(lambda:sizeof(self.password) - 2)
@@ -461,13 +432,13 @@ class RDPExtendedInfo(CompositeType):
""" """
def __init__(self, conditional): def __init__(self, conditional):
CompositeType.__init__(self, conditional = conditional) CompositeType.__init__(self, conditional = conditional)
self.clientAddressFamily = AfInet.AF_INET self.clientAddressFamily = UInt16Le(AfInet.AF_INET)
self.cbClientAddress = UInt16Le(lambda:sizeof(self.clientAddress)) self.cbClientAddress = UInt16Le(lambda:sizeof(self.clientAddress))
self.clientAddress = UniString(readLen = self.cbClientAddress) self.clientAddress = UniString(readLen = self.cbClientAddress)
self.cbClientDir = UInt16Le(lambda:sizeof(self.clientDir)) self.cbClientDir = UInt16Le(lambda:sizeof(self.clientDir))
self.clientDir = UniString(readLen = self.cbClientDir) self.clientDir = UniString(readLen = self.cbClientDir)
#TODO make tiomezone #TODO make tiomezone
#self.performanceFlags = PerfFlag.PERF_DISABLE_WALLPAPER | PerfFlag.PERF_DISABLE_MENUANIMATIONS | PerfFlag.PERF_DISABLE_CURSOR_SHADOW #self.performanceFlags = UInt32Le(PerfFlag.PERF_DISABLE_WALLPAPER | PerfFlag.PERF_DISABLE_MENUANIMATIONS | PerfFlag.PERF_DISABLE_CURSOR_SHADOW)
class ShareControlHeader(CompositeType): class ShareControlHeader(CompositeType):
""" """
@@ -475,29 +446,29 @@ class ShareControlHeader(CompositeType):
@see: http://msdn.microsoft.com/en-us/library/cc240576.aspx @see: http://msdn.microsoft.com/en-us/library/cc240576.aspx
""" """
def __init__(self, totalLength, pduType, userId): def __init__(self, totalLength, pduType, userId):
''' """
constructor Set pduType as constant
@param totalLength: total length of pdu packet @param totalLength: total length of pdu packet
''' """
CompositeType.__init__(self) CompositeType.__init__(self)
#share control header #share control header
self.totalLength = UInt16Le(totalLength) self.totalLength = UInt16Le(totalLength)
self.pduType = UInt16Le(pduType.value, constant = True) self.pduType = UInt16Le(pduType, constant = True)
self.PDUSource = UInt16Le(userId.value + 1001) self.PDUSource = UInt16Le(userId + 1001)
class ShareDataHeader(CompositeType): class ShareDataHeader(CompositeType):
""" """
PDU share data header PDU share data header
@see: http://msdn.microsoft.com/en-us/library/cc240577.aspx @see: http://msdn.microsoft.com/en-us/library/cc240577.aspx
""" """
def __init__(self, size, pduType2 = None, userId = UInt16Le(), shareId = UInt32Le()): def __init__(self, size, pduType2 = None, userId = 0, shareId = 0):
CompositeType.__init__(self) CompositeType.__init__(self)
self.shareControlHeader = ShareControlHeader(size, PDUType.PDUTYPE_DATAPDU, userId) self.shareControlHeader = ShareControlHeader(size, PDUType.PDUTYPE_DATAPDU, userId)
self.shareId = shareId self.shareId = UInt32Le(shareId)
self.pad1 = UInt8() self.pad1 = UInt8()
self.streamId = StreamId.STREAM_LOW self.streamId = UInt8(StreamId.STREAM_LOW)
self.uncompressedLength = UInt16Le(lambda:(UInt16Le(size).value - 14)) self.uncompressedLength = UInt16Le(lambda:(UInt16Le(size).value - 14))
self.pduType2 = UInt8() if pduType2 is None else UInt8(pduType2.value, constant = True) self.pduType2 = UInt8() if pduType2 is None else UInt8(pduType2, constant = True)
self.compressedType = UInt8() self.compressedType = UInt8()
self.compressedLength = UInt16Le() self.compressedLength = UInt16Le()
@@ -506,7 +477,7 @@ class DemandActivePDU(CompositeType):
@see: http://msdn.microsoft.com/en-us/library/cc240485.aspx @see: http://msdn.microsoft.com/en-us/library/cc240485.aspx
Main use for capabilities exchange server -> client Main use for capabilities exchange server -> client
""" """
def __init__(self, userId = UInt16Le()): def __init__(self, userId = 0):
CompositeType.__init__(self) CompositeType.__init__(self)
self.shareControlHeader = ShareControlHeader(lambda:sizeof(self), PDUType.PDUTYPE_DEMANDACTIVEPDU, userId) self.shareControlHeader = ShareControlHeader(lambda:sizeof(self), PDUType.PDUTYPE_DEMANDACTIVEPDU, userId)
self.shareId = UInt32Le() self.shareId = UInt32Le()
@@ -523,7 +494,7 @@ class ConfirmActivePDU(CompositeType):
@see: http://msdn.microsoft.com/en-us/library/cc240488.aspx @see: http://msdn.microsoft.com/en-us/library/cc240488.aspx
Main use for capabilities confirm client -> sever Main use for capabilities confirm client -> sever
""" """
def __init__(self, userId = UInt16Le()): def __init__(self, userId = 0):
CompositeType.__init__(self) CompositeType.__init__(self)
self.shareControlHeader = ShareControlHeader(lambda:sizeof(self), PDUType.PDUTYPE_CONFIRMACTIVEPDU, userId) self.shareControlHeader = ShareControlHeader(lambda:sizeof(self), PDUType.PDUTYPE_CONFIRMACTIVEPDU, userId)
self.shareId = UInt32Le() self.shareId = UInt32Le()
@@ -551,7 +522,7 @@ class PersistentListPDU(CompositeType):
Fill with some keys from previous session Fill with some keys from previous session
@see: http://msdn.microsoft.com/en-us/library/cc240495.aspx @see: http://msdn.microsoft.com/en-us/library/cc240495.aspx
""" """
def __init__(self, userId = UInt16Le(), shareId = UInt32Le()): def __init__(self, userId = 0, shareId = 0):
CompositeType.__init__(self) CompositeType.__init__(self)
self.shareDataHeader = ShareDataHeader(lambda:sizeof(self), PDUType2.PDUTYPE2_BITMAPCACHE_PERSISTENT_LIST, userId, shareId) self.shareDataHeader = ShareDataHeader(lambda:sizeof(self), PDUType2.PDUTYPE2_BITMAPCACHE_PERSISTENT_LIST, userId, shareId)
self.numEntriesCache0 = UInt16Le() self.numEntriesCache0 = UInt16Le()
@@ -573,22 +544,22 @@ class DataPDU(CompositeType):
""" """
Generic pdu packet use after connection sequence Generic pdu packet use after connection sequence
""" """
def __init__(self, pduType = None, pduData = None, userId = UInt16Le(), shareId = UInt32Le()): def __init__(self, pduType = None, pduData = None, userId = 0, shareId = 0):
CompositeType.__init__(self) CompositeType.__init__(self)
self.shareDataHeader = ShareDataHeader(lambda:sizeof(self), pduType, userId, shareId) self.shareDataHeader = ShareDataHeader(lambda:sizeof(self), pduType, userId, shareId)
def PDUDataFactory(): def PDUDataFactory():
if self.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_UPDATE: if self.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_UPDATE:
return UpdateDataPDU() return UpdateDataPDU()
elif self.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_SYNCHRONIZE: elif self.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_SYNCHRONIZE:
return SynchronizeDataPDU() return SynchronizeDataPDU()
elif self.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_CONTROL: elif self.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_CONTROL:
return ControlDataPDU() return ControlDataPDU()
elif self.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_SET_ERROR_INFO_PDU: elif self.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_SET_ERROR_INFO_PDU:
return ErrorInfoDataPDU() return ErrorInfoDataPDU()
elif self.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_FONTLIST: elif self.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_FONTLIST:
return FontListDataPDU() return FontListDataPDU()
elif self.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_FONTMAP: elif self.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_FONTMAP:
return FontMapDataPDU() return FontMapDataPDU()
else: else:
#read all value #read all value
@@ -614,7 +585,7 @@ class ControlDataPDU(CompositeType):
""" """
def __init__(self, action = None): def __init__(self, action = None):
CompositeType.__init__(self) CompositeType.__init__(self)
self.action = UInt16Le(action.value, constant = True) if not action is None else UInt16Le() self.action = UInt16Le(action, constant = True) if not action is None else UInt16Le()
self.grantId = UInt16Le() self.grantId = UInt16Le()
self.controlId = UInt32Le() self.controlId = UInt32Le()
@@ -665,7 +636,7 @@ class UpdateDataPDU(CompositeType):
self.updateType = updateType self.updateType = updateType
def UpdateDataFactory(): def UpdateDataFactory():
if self.updateType == UpdateType.UPDATETYPE_BITMAP: if self.updateType.value == UpdateType.UPDATETYPE_BITMAP:
return BitmapUpdateDataPDU() return BitmapUpdateDataPDU()
else: else:
String() String()
@@ -673,7 +644,7 @@ class UpdateDataPDU(CompositeType):
if updateData is None: if updateData is None:
updateData = UpdateDataFactory updateData = UpdateDataFactory
self.updateData = FactoryType(updateData, conditional = lambda:(self.updateType != UpdateType.UPDATETYPE_SYNCHRONIZE)) self.updateData = FactoryType(updateData, conditional = lambda:(self.updateType.value != UpdateType.UPDATETYPE_SYNCHRONIZE))
class BitmapUpdateDataPDU(CompositeType): class BitmapUpdateDataPDU(CompositeType):
""" """
@@ -684,6 +655,18 @@ class BitmapUpdateDataPDU(CompositeType):
CompositeType.__init__(self) CompositeType.__init__(self)
self.numberRectangles = UInt16Le() self.numberRectangles = UInt16Le()
self.rectangles = ArrayType(BitmapData, readLen = self.numberRectangles) self.rectangles = ArrayType(BitmapData, readLen = self.numberRectangles)
class ClientInputEventPDU(CompositeType):
"""
PDU use to send client inputs in slow path mode
@see: http://msdn.microsoft.com/en-us/library/cc746160.aspx
"""
def __init__(self, userId = 0, shareId = 0):
CompositeType.__init__(self)
self.shareDataHeader = ShareDataHeader(lambda:sizeof(self), PDUType2.PDUTYPE2_INPUT, userId, shareId)
self.numEvents = UInt16Le()
self.pad2Octets = UInt16Le()
class BitmapCompressedDataHeader(CompositeType): class BitmapCompressedDataHeader(CompositeType):
""" """
@@ -714,8 +697,8 @@ class BitmapData(CompositeType):
self.bitsPerPixel = UInt16Le() self.bitsPerPixel = UInt16Le()
self.flags = UInt16Le() self.flags = UInt16Le()
self.bitmapLength = UInt16Le() self.bitmapLength = UInt16Le()
self.bitmapComprHdr = BitmapCompressedDataHeader(conditional = lambda:(not (self.flags | BitmapFlag.NO_BITMAP_COMPRESSION_HDR))) self.bitmapComprHdr = BitmapCompressedDataHeader(conditional = lambda:(not (self.flags.value | BitmapFlag.NO_BITMAP_COMPRESSION_HDR)))
self.bitmapDataStream = String(readLen = UInt16Le(lambda:(self.bitmapLength.value if (self.flags | BitmapFlag.NO_BITMAP_COMPRESSION_HDR) else self.bitmapComprHdr.cbCompMainBodySize.value))) self.bitmapDataStream = String(readLen = UInt16Le(lambda:(self.bitmapLength.value if (self.flags.value | BitmapFlag.NO_BITMAP_COMPRESSION_HDR) else self.bitmapComprHdr.cbCompMainBodySize.value)))
class PDU(LayerAutomata): class PDU(LayerAutomata):
""" """
@@ -729,7 +712,7 @@ class PDU(LayerAutomata):
""" """
LayerAutomata.__init__(self, mode, None) LayerAutomata.__init__(self, mode, None)
#logon info send from client to server #logon info send from client to server
self._info = RDPInfo(extendedInfoConditional = lambda:self._transport.getGCCServerSettings().core.rdpVersion == gcc.Version.RDP_VERSION_5_PLUS) self._info = RDPInfo(extendedInfoConditional = lambda:self._transport.getGCCServerSettings().core.rdpVersion.value == gcc.Version.RDP_VERSION_5_PLUS)
#server capabilities #server capabilities
self._serverCapabilities = { self._serverCapabilities = {
caps.CapsType.CAPSTYPE_GENERAL : caps.Capability(caps.CapsType.CAPSTYPE_GENERAL, caps.GeneralCapability()), caps.CapsType.CAPSTYPE_GENERAL : caps.Capability(caps.CapsType.CAPSTYPE_GENERAL, caps.GeneralCapability()),
@@ -762,7 +745,7 @@ class PDU(LayerAutomata):
#caps.CapsType.CAPSTYPE_SHARE : caps.Capability(CapsType.CAPSTYPE_SHARE, caps.ShareCapability()) #caps.CapsType.CAPSTYPE_SHARE : caps.Capability(CapsType.CAPSTYPE_SHARE, caps.ShareCapability())
} }
#share id between client and server #share id between client and server
self._shareId = UInt32Le() self._shareId = 0
#rdp controller #rdp controller
self._controller = controller self._controller = controller
@@ -780,14 +763,14 @@ class PDU(LayerAutomata):
""" """
Send PDU close packet and call close method on transport method Send PDU close packet and call close method on transport method
""" """
self._transport.send(ShareDataHeader(PDUType2.PDUTYPE2_SHUTDOWN_REQUEST, UInt16Le(self._transport.getUserId()), self._shareId)) self._transport.send(ShareDataHeader(PDUType2.PDUTYPE2_SHUTDOWN_REQUEST, self._transport.getUserId(), self._shareId))
def sendInfoPkt(self): def sendInfoPkt(self):
""" """
Send a logon info packet Send a logon info packet
""" """
#always send extended info because rdpy only accept rdp version 5 and more #always send extended info because rdpy only accept RDP version 5 and more
self._transport.send((SecurityFlag.SEC_INFO_PKT, UInt16Le(), self._info)) self._transport.send((UInt16Le(SecurityFlag.SEC_INFO_PKT), UInt16Le(), self._info))
def recvLicenceInfo(self, data): def recvLicenceInfo(self, data):
""" """
@@ -798,7 +781,7 @@ class PDU(LayerAutomata):
securityFlagHi = UInt16Le() securityFlagHi = UInt16Le()
data.readType((securityFlag, securityFlagHi)) data.readType((securityFlag, securityFlagHi))
if securityFlag & SecurityFlag.SEC_LICENSE_PKT != SecurityFlag.SEC_LICENSE_PKT: if securityFlag.value & SecurityFlag.SEC_LICENSE_PKT != SecurityFlag.SEC_LICENSE_PKT:
raise InvalidExpectedDataException("Waiting license packet") raise InvalidExpectedDataException("Waiting license packet")
validClientPdu = lic.LicPacket() validClientPdu = lic.LicPacket()
@@ -821,7 +804,7 @@ class PDU(LayerAutomata):
#maybe an error message #maybe an error message
dataPDU = DataPDU() dataPDU = DataPDU()
data.readType(dataPDU) data.readType(dataPDU)
if dataPDU.shareDataHeader.pduType2 != PDUType2.PDUTYPE2_SET_ERROR_INFO_PDU: if dataPDU.shareDataHeader.pduType2.value != PDUType2.PDUTYPE2_SET_ERROR_INFO_PDU:
return dataPDU return dataPDU
message = "Unknown code %s"%hex(dataPDU.pduData._value.errorInfo.value) message = "Unknown code %s"%hex(dataPDU.pduData._value.errorInfo.value)
@@ -842,7 +825,7 @@ class PDU(LayerAutomata):
demandActivePDU = DemandActivePDU() demandActivePDU = DemandActivePDU()
data.readType(demandActivePDU) data.readType(demandActivePDU)
self._shareId = demandActivePDU.shareId self._shareId = demandActivePDU.shareId.value
for cap in demandActivePDU.capabilitySets._array: for cap in demandActivePDU.capabilitySets._array:
self._serverCapabilities[cap.capabilitySetType] = cap self._serverCapabilities[cap.capabilitySetType] = cap
@@ -855,7 +838,7 @@ class PDU(LayerAutomata):
@param data: Stream from transport layer @param data: Stream from transport layer
""" """
dataPDU = self.readDataPDU(data) dataPDU = self.readDataPDU(data)
if dataPDU.shareDataHeader.pduType2 != PDUType2.PDUTYPE2_SYNCHRONIZE: if dataPDU.shareDataHeader.pduType2.value != PDUType2.PDUTYPE2_SYNCHRONIZE:
raise InvalidExpectedDataException("Error in PDU layer automata : expected synchronizePDU") raise InvalidExpectedDataException("Error in PDU layer automata : expected synchronizePDU")
self.setNextState(self.recvServerControlCooperatePDU) self.setNextState(self.recvServerControlCooperatePDU)
@@ -865,7 +848,7 @@ class PDU(LayerAutomata):
@param data: Stream from transport layer @param data: Stream from transport layer
""" """
dataPDU = self.readDataPDU(data) dataPDU = self.readDataPDU(data)
if dataPDU.shareDataHeader.pduType2 != PDUType2.PDUTYPE2_CONTROL or dataPDU.pduData._value.action != Action.CTRLACTION_COOPERATE: if dataPDU.shareDataHeader.pduType2.value != PDUType2.PDUTYPE2_CONTROL or dataPDU.pduData._value.action.value != Action.CTRLACTION_COOPERATE:
raise InvalidExpectedDataException("Error in PDU layer automata : expected controlCooperatePDU") raise InvalidExpectedDataException("Error in PDU layer automata : expected controlCooperatePDU")
self.setNextState(self.recvServerControlGrantedPDU) self.setNextState(self.recvServerControlGrantedPDU)
@@ -875,7 +858,7 @@ class PDU(LayerAutomata):
@param data: Stream from transport layer @param data: Stream from transport layer
""" """
dataPDU = self.readDataPDU(data) dataPDU = self.readDataPDU(data)
if dataPDU.shareDataHeader.pduType2 != PDUType2.PDUTYPE2_CONTROL or dataPDU.pduData._value.action != Action.CTRLACTION_GRANTED_CONTROL: if dataPDU.shareDataHeader.pduType2.value != PDUType2.PDUTYPE2_CONTROL or dataPDU.pduData._value.action.value != Action.CTRLACTION_GRANTED_CONTROL:
raise InvalidExpectedDataException("Error in PDU layer automata : expected controlGrantedPDU") raise InvalidExpectedDataException("Error in PDU layer automata : expected controlGrantedPDU")
self.setNextState(self.recvServerFontMapPDU) self.setNextState(self.recvServerFontMapPDU)
@@ -885,7 +868,7 @@ class PDU(LayerAutomata):
@param data: Stream from transport layer @param data: Stream from transport layer
""" """
dataPDU = self.readDataPDU(data) dataPDU = self.readDataPDU(data)
if dataPDU.shareDataHeader.pduType2 != PDUType2.PDUTYPE2_FONTMAP: if dataPDU.shareDataHeader.pduType2.value != PDUType2.PDUTYPE2_FONTMAP:
raise InvalidExpectedDataException("Error in PDU layer automata : expected fontMapPDU") raise InvalidExpectedDataException("Error in PDU layer automata : expected fontMapPDU")
print "client is now connected" print "client is now connected"
if not self._presentation is None: if not self._presentation is None:
@@ -898,7 +881,7 @@ class PDU(LayerAutomata):
@param data: Stream from transport layer @param data: Stream from transport layer
""" """
dataPDU = self.readDataPDU(data) dataPDU = self.readDataPDU(data)
if dataPDU.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_UPDATE and dataPDU.pduData._value.updateType == UpdateType.UPDATETYPE_BITMAP: if dataPDU.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_UPDATE and dataPDU.pduData._value.updateType.value == UpdateType.UPDATETYPE_BITMAP:
self._controller.recvBitmapUpdateDataPDU(dataPDU.pduData._value.updateData._value) self._controller.recvBitmapUpdateDataPDU(dataPDU.pduData._value.updateData._value)
@@ -908,9 +891,9 @@ class PDU(LayerAutomata):
""" """
#init general capability #init general capability
generalCapability = self._clientCapabilities[caps.CapsType.CAPSTYPE_GENERAL].capability._value generalCapability = self._clientCapabilities[caps.CapsType.CAPSTYPE_GENERAL].capability._value
generalCapability.osMajorType = caps.MajorType.OSMAJORTYPE_WINDOWS generalCapability.osMajorType.value = caps.MajorType.OSMAJORTYPE_WINDOWS
generalCapability.osMinorType = caps.MinorType.OSMINORTYPE_WINDOWS_NT generalCapability.osMinorType.value = caps.MinorType.OSMINORTYPE_WINDOWS_NT
generalCapability.extraFlags = caps.GeneralExtraFlag.LONG_CREDENTIALS_SUPPORTED | caps.GeneralExtraFlag.NO_BITMAP_COMPRESSION_HDR generalCapability.extraFlags.value = caps.GeneralExtraFlag.LONG_CREDENTIALS_SUPPORTED | caps.GeneralExtraFlag.NO_BITMAP_COMPRESSION_HDR
#init bitmap capability #init bitmap capability
bitmapCapability = self._clientCapabilities[caps.CapsType.CAPSTYPE_BITMAP].capability._value bitmapCapability = self._clientCapabilities[caps.CapsType.CAPSTYPE_BITMAP].capability._value
@@ -920,11 +903,11 @@ class PDU(LayerAutomata):
#init order capability #init order capability
orderCapability = self._clientCapabilities[caps.CapsType.CAPSTYPE_ORDER].capability._value orderCapability = self._clientCapabilities[caps.CapsType.CAPSTYPE_ORDER].capability._value
orderCapability.orderFlags |= caps.OrderFlag.ZEROBOUNDSDELTASSUPPORT orderCapability.orderFlags.value |= caps.OrderFlag.ZEROBOUNDSDELTASSUPPORT
#init input capability #init input capability
inputCapability = self._clientCapabilities[caps.CapsType.CAPSTYPE_INPUT].capability._value inputCapability = self._clientCapabilities[caps.CapsType.CAPSTYPE_INPUT].capability._value
inputCapability.inputFlags = caps.InputFlags.INPUT_FLAG_SCANCODES | caps.InputFlags.INPUT_FLAG_MOUSEX | caps.InputFlags.INPUT_FLAG_UNICODE inputCapability.inputFlags.value = caps.InputFlags.INPUT_FLAG_SCANCODES | caps.InputFlags.INPUT_FLAG_MOUSEX | caps.InputFlags.INPUT_FLAG_UNICODE
inputCapability.keyboardLayout = self._transport.getGCCClientSettings().core.kbdLayout inputCapability.keyboardLayout = self._transport.getGCCClientSettings().core.kbdLayout
inputCapability.keyboardType = self._transport.getGCCClientSettings().core.keyboardType inputCapability.keyboardType = self._transport.getGCCClientSettings().core.keyboardType
inputCapability.keyboardSubType = self._transport.getGCCClientSettings().core.keyboardSubType inputCapability.keyboardSubType = self._transport.getGCCClientSettings().core.keyboardSubType
@@ -932,8 +915,8 @@ class PDU(LayerAutomata):
inputCapability.imeFileName = self._transport.getGCCClientSettings().core.imeFileName inputCapability.imeFileName = self._transport.getGCCClientSettings().core.imeFileName
#make active PDU packet #make active PDU packet
confirmActivePDU = ConfirmActivePDU(UInt16Le(self._transport.getUserId())) confirmActivePDU = ConfirmActivePDU(self._transport.getUserId())
confirmActivePDU.shareId = self._shareId confirmActivePDU.shareId.value = self._shareId
confirmActivePDU.capabilitySets._array = self._clientCapabilities.values() confirmActivePDU.capabilitySets._array = self._clientCapabilities.values()
self._transport.send(confirmActivePDU) self._transport.send(confirmActivePDU)
#send synchronize #send synchronize
@@ -943,24 +926,24 @@ class PDU(LayerAutomata):
""" """
send a synchronize PDU from client to server send a synchronize PDU from client to server
""" """
synchronizePDU = DataPDU(PDUType2.PDUTYPE2_SYNCHRONIZE, SynchronizeDataPDU(UInt16Le(self._transport.getChannelId())), UInt16Le(self._transport.getUserId()), self._shareId) synchronizePDU = DataPDU(PDUType2.PDUTYPE2_SYNCHRONIZE, SynchronizeDataPDU(UInt16Le(self._transport.getChannelId())), self._transport.getUserId(), self._shareId)
self._transport.send(synchronizePDU) self._transport.send(synchronizePDU)
#ask for cooperation #ask for cooperation
controlCooperatePDU = DataPDU(PDUType2.PDUTYPE2_CONTROL, ControlDataPDU(Action.CTRLACTION_COOPERATE), UInt16Le(self._transport.getUserId()), self._shareId) controlCooperatePDU = DataPDU(PDUType2.PDUTYPE2_CONTROL, ControlDataPDU(Action.CTRLACTION_COOPERATE), self._transport.getUserId(), self._shareId)
self._transport.send(controlCooperatePDU) self._transport.send(controlCooperatePDU)
#request control #request control
controlRequestPDU = DataPDU(PDUType2.PDUTYPE2_CONTROL, ControlDataPDU(Action.CTRLACTION_REQUEST_CONTROL), UInt16Le(self._transport.getUserId()), self._shareId) controlRequestPDU = DataPDU(PDUType2.PDUTYPE2_CONTROL, ControlDataPDU(Action.CTRLACTION_REQUEST_CONTROL), self._transport.getUserId(), self._shareId)
self._transport.send(controlRequestPDU) self._transport.send(controlRequestPDU)
#send persistent list pdu I don't know why this packet is rejected maybe beacause we made a 0 size bitmapcache capability #send persistent list pdu I don't know why this packet is rejected maybe beacause we made a 0 size bitmapcache capability
#persistentListPDU = PersistentListPDU(self._transport.getUserId(), self._shareId) #persistentListPDU = PersistentListPDU(self._transport.getUserId(), self._shareId)
#persistentListPDU.bitMask = PersistentKeyListFlag.PERSIST_FIRST_PDU | PersistentKeyListFlag.PERSIST_LAST_PDU #persistentListPDU.bitMask = UInt16Le(PersistentKeyListFlag.PERSIST_FIRST_PDU | PersistentKeyListFlag.PERSIST_LAST_PDU)
#self._transport.send(persistentListPDU) #self._transport.send(persistentListPDU)
#deprecated font list pdu #deprecated font list pdu
fontListPDU = DataPDU(PDUType2.PDUTYPE2_FONTLIST, FontListDataPDU(), UInt16Le(self._transport.getUserId()), self._shareId) fontListPDU = DataPDU(PDUType2.PDUTYPE2_FONTLIST, FontListDataPDU(), self._transport.getUserId(), self._shareId)
self._transport.send(fontListPDU) self._transport.send(fontListPDU)
self.setNextState(self.recvServerSynchronizePDU) self.setNextState(self.recvServerSynchronizePDU)

View File

@@ -42,7 +42,7 @@ class RDPController(object):
for observer in self._clientObserver: for observer in self._clientObserver:
#for each rectangle in update PDU #for each rectangle in update PDU
for rectangle in bitmapUpdateData.rectangles._array: for rectangle in bitmapUpdateData.rectangles._array:
observer.onBitmapUpdate(rectangle.destLeft.value, rectangle.destTop.value, rectangle.destRight.value, rectangle.destBottom.value, rectangle.width.value, rectangle.height.value, rectangle.bitsPerPixel.value, (rectangle.flags & pdu.BitmapFlag.BITMAP_COMPRESSION).value, rectangle.bitmapDataStream.value) observer.onBitmapUpdate(rectangle.destLeft.value, rectangle.destTop.value, rectangle.destRight.value, rectangle.destBottom.value, rectangle.width.value, rectangle.height.value, rectangle.bitsPerPixel.value, rectangle.flags.value & pdu.BitmapFlag.BITMAP_COMPRESSION, rectangle.bitmapDataStream.value)
class ClientFactory(protocol.Factory): class ClientFactory(protocol.Factory):
""" """
@@ -106,7 +106,7 @@ class ServerFactory(protocol.Factory):
class RDPClientObserver(object): class RDPClientObserver(object):
''' '''
class use to inform all rdp event handle by RDPY class use to inform all RDP event handle by RDPY
''' '''
def __init__(self, controller): def __init__(self, controller):
""" """

View File

@@ -29,11 +29,8 @@ Implement Remote FrameBuffer protocol use in VNC client and server
from twisted.internet import protocol from twisted.internet import protocol
from rdpy.network.layer import RawLayer, LayerMode from rdpy.network.layer import RawLayer, LayerMode
from rdpy.network.type import UInt8, UInt16Be, UInt32Be, SInt32Be, String, CompositeType from rdpy.network.type import UInt8, UInt16Be, UInt32Be, SInt32Be, String, CompositeType
from rdpy.network.const import ConstAttributes, TypeAttributes from rdpy.network.error import InvalidValue, CallPureVirtualFuntion, InvalidType
from rdpy.network.error import InvalidValue, CallPureVirtualFuntion
@ConstAttributes
@TypeAttributes(String)
class ProtocolVersion(object): class ProtocolVersion(object):
""" """
Different protocol version Different protocol version
@@ -43,8 +40,6 @@ class ProtocolVersion(object):
RFB003007 = "RFB 003.007\n" RFB003007 = "RFB 003.007\n"
RFB003008 = "RFB 003.008\n" RFB003008 = "RFB 003.008\n"
@ConstAttributes
@TypeAttributes(UInt8)
class SecurityType(object): class SecurityType(object):
""" """
Security type supported Security type supported
@@ -53,8 +48,6 @@ class SecurityType(object):
NONE = 1 NONE = 1
VNC = 2 VNC = 2
@ConstAttributes
@TypeAttributes(UInt32Be)
class Pointer(object): class Pointer(object):
""" """
Mouse event code (which button) Mouse event code (which button)
@@ -64,17 +57,13 @@ class Pointer(object):
BUTTON1 = 0x1 BUTTON1 = 0x1
BUTTON2 = 0x2 BUTTON2 = 0x2
BUTTON3 = 0x4 BUTTON3 = 0x4
@ConstAttributes
@TypeAttributes(SInt32Be)
class Encoding(object): class Encoding(object):
""" """
Encoding types of FrameBuffer update Encoding types of FrameBuffer update
""" """
RAW = 0 RAW = 0
@ConstAttributes
@TypeAttributes(UInt8)
class ClientToServerMessages(object): class ClientToServerMessages(object):
""" """
Client to server messages types Client to server messages types
@@ -179,18 +168,24 @@ class RFB(RawLayer):
""" """
Implement RFB protocol Implement RFB protocol
""" """
def __init__(self, mode, controller): def __init__(self, listener):
""" """
@param mode: LayerMode client or server @param mode: LayerMode client or server
@param controller: controller use to inform new orders @param controller: controller use to inform new orders
""" """
mode = None
if isinstance(listener, RFBClientListener):
mode = LayerMode.CLIENT
else:
raise InvalidType("RFB Layer expect RFBClientListener as listener")
RawLayer.__init__(self, mode) RawLayer.__init__(self, mode)
#useful for RFB protocol #useful for RFB protocol
self._callbackBody = None self._callbackBody = None
#protocol version negotiated #protocol version negotiated
self._version = ProtocolVersion.RFB003008 self._version = String(ProtocolVersion.RFB003008)
#number security launch by server #number security launch by server
self._securityLevel = SecurityType.INVALID self._securityLevel = UInt8(SecurityType.INVALID)
#shared FrameBuffer client init message #shared FrameBuffer client init message
self._sharedFlag = UInt8(False) self._sharedFlag = UInt8(False)
#server init message #server init message
@@ -205,7 +200,9 @@ class RFB(RawLayer):
#current rectangle header #current rectangle header
self._currentRect = Rectangle() self._currentRect = Rectangle()
#client or server adaptor #client or server adaptor
self._controller = controller self._listener = listener
#ready to send events
self._ready = False
def expectWithHeader(self, expectedHeaderLen, callbackBody): def expectWithHeader(self, expectedHeaderLen, callbackBody):
""" """
@@ -255,8 +252,8 @@ class RFB(RawLayer):
@param data: Stream may contain protocol version string (ProtocolVersion) @param data: Stream may contain protocol version string (ProtocolVersion)
""" """
data.readType(self._version) data.readType(self._version)
if not self._version in [ProtocolVersion.RFB003003, ProtocolVersion.RFB003007, ProtocolVersion.RFB003008]: if not self._version.value in [ProtocolVersion.RFB003003, ProtocolVersion.RFB003007, ProtocolVersion.RFB003008]:
self._version = ProtocolVersion.UNKNOWN self._version.value = ProtocolVersion.UNKNOWN
def recvProtocolVersion(self, data): def recvProtocolVersion(self, data):
""" """
@@ -266,15 +263,15 @@ class RFB(RawLayer):
@param data: Stream @param data: Stream
""" """
self.readProtocolVersion(data) self.readProtocolVersion(data)
if self._version == ProtocolVersion.UNKNOWN: if self._version.value == ProtocolVersion.UNKNOWN:
print "Unknown protocol version %s send 003.008"%data.getvalue() print "Unknown protocol version %s send 003.008"%data.getvalue()
#protocol version is unknown try best version we can handle #protocol version is unknown try best version we can handle
self._version = ProtocolVersion.RFB003008 self._version.value = ProtocolVersion.RFB003008
#send same version of #send same version of
self.send(self._version) self.send(self._version)
#next state read security #next state read security
if self._version == ProtocolVersion.RFB003003: if self._version.value == ProtocolVersion.RFB003003:
self.expect(4, self.recvSecurityServer) self.expect(4, self.recvSecurityServer)
else: else:
self.expectWithHeader(1, self.recvSecurityList) self.expectWithHeader(1, self.recvSecurityList)
@@ -300,7 +297,7 @@ class RFB(RawLayer):
securityList.append(securityElement) securityList.append(securityElement)
#select high security level #select high security level
for s in securityList: for s in securityList:
if s in [SecurityType.NONE, SecurityType.VNC] and s > self._securityLevel: if s.value in [SecurityType.NONE, SecurityType.VNC] and s > self._securityLevel:
self._securityLevel = s self._securityLevel = s
break break
#send back security level choosen #send back security level choosen
@@ -317,7 +314,7 @@ class RFB(RawLayer):
data.readType(result) data.readType(result)
if result == UInt32Be(1): if result == UInt32Be(1):
print "Authentification failed" print "Authentification failed"
if self._version == ProtocolVersion.RFB003008: if self._version.value == ProtocolVersion.RFB003008:
self.expectWithHeader(4, self.recvSecurityFailed) self.expectWithHeader(4, self.recvSecurityFailed)
else: else:
print "Authentification OK" print "Authentification OK"
@@ -352,6 +349,9 @@ class RFB(RawLayer):
self.sendSetEncoding() self.sendSetEncoding()
#request entire zone #request entire zone
self.sendFramebufferUpdateRequest(False, 0, 0, self._serverInit.width.value, self._serverInit.height.value) self.sendFramebufferUpdateRequest(False, 0, 0, self._serverInit.width.value, self._serverInit.height.value)
#now i'm ready to send event
self._ready = True;
self.expect(1, self.recvServerOrder) self.expect(1, self.recvServerOrder)
def recvServerOrder(self, data): def recvServerOrder(self, data):
@@ -382,7 +382,7 @@ class RFB(RawLayer):
@param data: Stream that contains well formed packet @param data: Stream that contains well formed packet
""" """
data.readType(self._currentRect) data.readType(self._currentRect)
if self._currentRect.encoding == Encoding.RAW: if self._currentRect.encoding.value == Encoding.RAW:
self.expect(self._currentRect.width.value * self._currentRect.height.value * (self._pixelFormat.BitsPerPixel.value / 8), self.recvRectBody) self.expect(self._currentRect.width.value * self._currentRect.height.value * (self._pixelFormat.BitsPerPixel.value / 8), self.recvRectBody)
def recvRectBody(self, data): def recvRectBody(self, data):
@@ -390,7 +390,7 @@ class RFB(RawLayer):
Read body of rectangle update Read body of rectangle update
@param data: Stream that contains well formed packet @param data: Stream that contains well formed packet
""" """
self._controller.recvRectangle(self._currentRect, self._pixelFormat, data.getvalue()) self._listener.recvRectangle(self._currentRect, self._pixelFormat, data.getvalue())
self._nbRect = self._nbRect - 1 self._nbRect = self._nbRect - 1
#if there is another rect to read #if there is another rect to read
@@ -414,43 +414,58 @@ class RFB(RawLayer):
Very important packet that inform the image struct supported by the client Very important packet that inform the image struct supported by the client
@param pixelFormat: PixelFormat struct @param pixelFormat: PixelFormat struct
""" """
self.send((ClientToServerMessages.PIXEL_FORMAT, UInt16Be(), UInt8(), pixelFormat)) self.send((UInt8(ClientToServerMessages.PIXEL_FORMAT), UInt16Be(), UInt8(), pixelFormat))
def sendSetEncoding(self): def sendSetEncoding(self):
""" """
Send set encoding packet Send set encoding packet
Actually only RAW bitmap encoding are used Actually only RAW bitmap encoding are used
""" """
self.send((ClientToServerMessages.ENCODING, UInt8(), UInt16Be(1), Encoding.RAW)) self.send((UInt8(ClientToServerMessages.ENCODING), UInt8(), UInt16Be(1), SInt32Be(Encoding.RAW)))
def sendFramebufferUpdateRequest(self, incremental, x, y, width, height): def sendFramebufferUpdateRequest(self, incremental, x, y, width, height):
""" """
Request server the specified zone Request server the specified zone
incremental means request only change before last update incremental means request only change before last update
""" """
self.send((ClientToServerMessages.FRAME_BUFFER_UPDATE_REQUEST, FrameBufferUpdateRequest(incremental, x, y, width, height))) self.send((UInt8(ClientToServerMessages.FRAME_BUFFER_UPDATE_REQUEST), FrameBufferUpdateRequest(incremental, x, y, width, height)))
def sendKeyEvent(self, keyEvent): def sendKeyEvent(self, keyEvent):
""" """
Write key event packet Write key event packet
@param keyEvent: KeyEvent struct to send @param keyEvent: KeyEvent struct to send
""" """
self.send((ClientToServerMessages.KEY_EVENT, keyEvent)) self.send((UInt8(ClientToServerMessages.KEY_EVENT), keyEvent))
def sendPointerEvent(self, pointerEvent): def sendPointerEvent(self, pointerEvent):
""" """
Write pointer event packet Write pointer event packet
@param pointerEvent: PointerEvent struct use @param pointerEvent: PointerEvent struct use
""" """
self.send((ClientToServerMessages.POINTER_EVENT, pointerEvent)) self.send((UInt8(ClientToServerMessages.POINTER_EVENT), pointerEvent))
def sendClientCutText(self, text): def sendClientCutText(self, text):
""" """
write client cut text event packet write client cut text event packet
""" """
self.send((ClientToServerMessages.CUT_TEXT, ClientCutText(text))) self.send((UInt8(ClientToServerMessages.CUT_TEXT), ClientCutText(text)))
class RFBController(object): class RFBClientListener(object):
"""
Interface use to expose event receive from RFB layer
"""
def recvRectangle(self, rectangle, pixelFormat, data):
"""
Receive rectangle order
Main update order type
@param rectangle: Rectangle type header of packet
@param pixelFormat: pixelFormat struct of current session
@param data: image data
"""
raise CallPureVirtualFuntion("%s:%s defined by interface %s"%(self.__class__, "recvRectangle", "RFBListener"))
class RFBController(RFBClientListener):
""" """
Class use to manage RFB order and dispatch throw observers Class use to manage RFB order and dispatch throw observers
""" """
@@ -460,7 +475,7 @@ class RFBController(object):
""" """
self._clientObservers = [] self._clientObservers = []
#rfb layer to send client orders #rfb layer to send client orders
self._rfbLayer = RFB(mode, self) self._rfbLayer = RFB(self)
def getRFBLayer(self): def getRFBLayer(self):
""" """
@@ -493,6 +508,9 @@ class RFBController(object):
@param isDown: boolean notify if key is pressed or not (True if key is pressed) @param isDown: boolean notify if key is pressed or not (True if key is pressed)
@param key: ASCII code of key @param key: ASCII code of key
""" """
if not self._rfbLayer._ready:
print "Try to send key event on non ready layer"
return
try: try:
event = KeyEvent() event = KeyEvent()
event.downFlag.value = isDown event.downFlag.value = isDown
@@ -509,6 +527,9 @@ class RFBController(object):
@param x: x coordinate of mouse pointer @param x: x coordinate of mouse pointer
@param y: y pointer of mouse pointer @param y: y pointer of mouse pointer
""" """
if not self._rfbLayer._ready:
print "Try to send pointer event on non ready layer"
return
try: try:
event = PointerEvent() event = PointerEvent()
event.mask.value = mask event.mask.value = mask