bug fix and code refactoring
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user