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"):
|
||||
mask = 0xff
|
||||
for i in range(1, self._typeSize):
|
||||
for _ in range(1, self._typeSize):
|
||||
mask = mask << 8 | 0xff
|
||||
self._mask = mask
|
||||
return self._mask
|
||||
@@ -844,7 +844,7 @@ class ArrayType(Type):
|
||||
@param s: Stream
|
||||
'''
|
||||
self._array = []
|
||||
for i in range(0, self._readLen.value):
|
||||
for _ in range(0, self._readLen.value):
|
||||
element = self._typeFactory()
|
||||
s.readType(element)
|
||||
self._array.append(element)
|
||||
|
||||
@@ -23,27 +23,20 @@ ASN.1 standard
|
||||
"""
|
||||
|
||||
from rdpy.network.type import UInt8, UInt16Be, UInt32Be, String
|
||||
from rdpy.network.const import ConstAttributes, TypeAttributes
|
||||
from rdpy.network.error import InvalidExpectedDataException, InvalidSize
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
class BerPc(object):
|
||||
BER_PC_MASK = 0x20
|
||||
BER_PRIMITIVE = 0x00
|
||||
BER_CONSTRUCT = 0x20
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
class Class(object):
|
||||
BER_CLASS_MASK = 0xC0
|
||||
BER_CLASS_UNIV = 0x00
|
||||
BER_CLASS_APPL = 0x40
|
||||
BER_CLASS_CTXT = 0x80
|
||||
BER_CLASS_PRIV = 0xC0
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
|
||||
class Tag(object):
|
||||
BER_TAG_MASK = 0x1F
|
||||
BER_TAG_BOOLEAN = 0x01
|
||||
@@ -111,7 +104,7 @@ def readUniversalTag(s, tag, pc):
|
||||
"""
|
||||
byte = UInt8()
|
||||
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):
|
||||
"""
|
||||
@@ -120,7 +113,7 @@ def writeUniversalTag(tag, pc):
|
||||
@param pc: boolean
|
||||
@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):
|
||||
"""
|
||||
@@ -131,14 +124,14 @@ def readApplicationTag(s, tag):
|
||||
"""
|
||||
byte = UInt8()
|
||||
s.readType(byte)
|
||||
if tag > UInt8(30):
|
||||
if byte != ((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | Tag.BER_TAG_MASK):
|
||||
if tag.value > 30:
|
||||
if byte.value != ((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | Tag.BER_TAG_MASK):
|
||||
raise InvalidExpectedDataException()
|
||||
s.readType(byte)
|
||||
if byte != tag:
|
||||
if byte.value != tag.value:
|
||||
raise InvalidExpectedDataException("bad tag")
|
||||
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()
|
||||
|
||||
return readLength(s)
|
||||
@@ -146,13 +139,13 @@ def readApplicationTag(s, tag):
|
||||
def writeApplicationTag(tag, size):
|
||||
"""
|
||||
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
|
||||
"""
|
||||
if tag > UInt8(30):
|
||||
return (((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | Tag.BER_TAG_MASK), tag, writeLength(size))
|
||||
if tag > 30:
|
||||
return (UInt8((Class.BER_CLASS_APPL | BerPc.BER_CONSTRUCT) | Tag.BER_TAG_MASK), UInt8(tag), writeLength(size))
|
||||
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):
|
||||
"""
|
||||
@@ -215,7 +208,7 @@ def readInteger(s):
|
||||
def writeInteger(value):
|
||||
"""
|
||||
Write integer value
|
||||
@param param: int or python long
|
||||
@param param: INT or Python long
|
||||
@return: BER integer structure
|
||||
"""
|
||||
if value <= 0xff:
|
||||
@@ -229,18 +222,18 @@ def readOctetString(s):
|
||||
"""
|
||||
Read BER string structure
|
||||
@param s: stream
|
||||
@return: String
|
||||
@return: string python
|
||||
"""
|
||||
if not readUniversalTag(s, Tag.BER_TAG_OCTET_STRING, False):
|
||||
raise InvalidExpectedDataException("Unexpected BER tag")
|
||||
size = readLength(s)
|
||||
return String(s.read(size.value))
|
||||
return s.read(size.value)
|
||||
|
||||
def writeOctetstring(value):
|
||||
"""
|
||||
Write string in ber representation
|
||||
Write string in BER representation
|
||||
@param value: string
|
||||
@return: string ber structure
|
||||
@return: string BER structure
|
||||
"""
|
||||
return (writeUniversalTag(Tag.BER_TAG_OCTET_STRING, False), writeLength(len(value)), String(value))
|
||||
|
||||
|
||||
@@ -1,16 +1,34 @@
|
||||
'''
|
||||
@author: citronneur
|
||||
'''
|
||||
from rdpy.network.type import CompositeType, String, UInt8, UInt16Le, UInt32Le, sizeof, ArrayType, FactoryType
|
||||
from rdpy.network.const import ConstAttributes, TypeAttributes
|
||||
#
|
||||
# Copyright (c) 2014 Sylvain Peyrefitte
|
||||
#
|
||||
# This file is part of rdpy.
|
||||
#
|
||||
# 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):
|
||||
'''
|
||||
different type of capabilities
|
||||
"""
|
||||
Different type of capabilities
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240486.aspx
|
||||
'''
|
||||
"""
|
||||
CAPSTYPE_GENERAL = 0x0001
|
||||
CAPSTYPE_BITMAP = 0x0002
|
||||
CAPSTYPE_ORDER = 0x0003
|
||||
@@ -40,13 +58,11 @@ class CapsType(object):
|
||||
CAPSETTYPE_BITMAP_CODECS = 0x001D
|
||||
CAPSSETTYPE_FRAME_ACKNOWLEDGE = 0x001E
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class MajorType(object):
|
||||
'''
|
||||
use in general capability
|
||||
"""
|
||||
Use in general capability
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
|
||||
'''
|
||||
"""
|
||||
OSMAJORTYPE_UNSPECIFIED = 0x0000
|
||||
OSMAJORTYPE_WINDOWS = 0x0001
|
||||
OSMAJORTYPE_OS2 = 0x0002
|
||||
@@ -55,14 +71,12 @@ class MajorType(object):
|
||||
OSMAJORTYPE_IOS = 0x0005
|
||||
OSMAJORTYPE_OSX = 0x0006
|
||||
OSMAJORTYPE_ANDROID = 0x0007
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
|
||||
class MinorType(object):
|
||||
'''
|
||||
use in general capability
|
||||
"""
|
||||
Use in general capability
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
|
||||
'''
|
||||
"""
|
||||
OSMINORTYPE_UNSPECIFIED = 0x0000
|
||||
OSMINORTYPE_WINDOWS_31X = 0x0001
|
||||
OSMINORTYPE_WINDOWS_95 = 0x0002
|
||||
@@ -73,47 +87,39 @@ class MinorType(object):
|
||||
OSMINORTYPE_NATIVE_XSERVER = 0x0007
|
||||
OSMINORTYPE_PSEUDO_XSERVER = 0x0008
|
||||
OSMINORTYPE_WINDOWS_RT = 0x0009
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
|
||||
class GeneralExtraFlag(object):
|
||||
'''
|
||||
use in general capability
|
||||
"""
|
||||
Use in general capability
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
|
||||
'''
|
||||
"""
|
||||
FASTPATH_OUTPUT_SUPPORTED = 0x0001
|
||||
NO_BITMAP_COMPRESSION_HDR = 0x0400
|
||||
LONG_CREDENTIALS_SUPPORTED = 0x0004
|
||||
AUTORECONNECT_SUPPORTED = 0x0008
|
||||
ENC_SALTED_CHECKSUM = 0x0010
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
|
||||
class Boolean(object):
|
||||
FALSE = 0x00
|
||||
TRUE = 0x01
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
|
||||
class OrderFlag(object):
|
||||
'''
|
||||
use in order capability
|
||||
"""
|
||||
Use in order capability
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240556.aspx
|
||||
'''
|
||||
"""
|
||||
NEGOTIATEORDERSUPPORT = 0x0002
|
||||
ZEROBOUNDSDELTASSUPPORT = 0x0008
|
||||
COLORINDEXSUPPORT = 0x0020
|
||||
SOLIDPATTERNBRUSHONLY = 0x0040
|
||||
ORDERFLAGS_EXTRA_FLAGS = 0x0080
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
|
||||
class Order(object):
|
||||
'''
|
||||
drawing orders supported
|
||||
use in order capability
|
||||
"""
|
||||
Drawing orders supported
|
||||
Use in order capability
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240556.aspx
|
||||
'''
|
||||
"""
|
||||
TS_NEG_DSTBLT_INDEX = 0x00
|
||||
TS_NEG_PATBLT_INDEX = 0x01
|
||||
TS_NEG_SCRBLT_INDEX = 0x02
|
||||
@@ -135,25 +141,20 @@ class Order(object):
|
||||
TS_NEG_ELLIPSE_SC_INDEX = 0x19
|
||||
TS_NEG_ELLIPSE_CB_INDEX = 0x1A
|
||||
TS_NEG_INDEX_INDEX = 0x1B
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
|
||||
class OrderEx(object):
|
||||
'''
|
||||
extension orders
|
||||
use in order capability
|
||||
'''
|
||||
"""
|
||||
Extension orders
|
||||
Use in order capability
|
||||
"""
|
||||
ORDERFLAGS_EX_CACHE_BITMAP_REV3_SUPPORT = 0x0002
|
||||
ORDERFLAGS_EX_ALTSEC_FRAME_MARKER_SUPPORT = 0x0004
|
||||
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class InputFlags(object):
|
||||
'''
|
||||
"""
|
||||
Input flag use in input capability
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240563.aspx
|
||||
'''
|
||||
"""
|
||||
INPUT_FLAG_SCANCODES = 0x0001
|
||||
INPUT_FLAG_MOUSEX = 0x0004
|
||||
INPUT_FLAG_FASTPATH_INPUT = 0x0008
|
||||
@@ -163,65 +164,55 @@ class InputFlags(object):
|
||||
INPUT_FLAG_UNUSED2 = 0x0080
|
||||
TS_INPUT_FLAG_MOUSE_HWHEEL = 0x0100
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Le)
|
||||
class BrushSupport(object):
|
||||
'''
|
||||
"""
|
||||
Brush support of client
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240564.aspx
|
||||
'''
|
||||
"""
|
||||
BRUSH_DEFAULT = 0x00000000
|
||||
BRUSH_COLOR_8x8 = 0x00000001
|
||||
BRUSH_COLOR_FULL = 0x00000002
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class GlyphSupport(object):
|
||||
'''
|
||||
"""
|
||||
Use by glyph order
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240565.aspx
|
||||
'''
|
||||
"""
|
||||
GLYPH_SUPPORT_NONE = 0x0000
|
||||
GLYPH_SUPPORT_PARTIAL = 0x0001
|
||||
GLYPH_SUPPORT_FULL = 0x0002
|
||||
GLYPH_SUPPORT_ENCODE = 0x0003
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Le)
|
||||
|
||||
class OffscreenSupportLevel(object):
|
||||
'''
|
||||
"""
|
||||
Use to determine offscreen cache level supported
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240550.aspx
|
||||
'''
|
||||
"""
|
||||
FALSE = 0x00000000
|
||||
TRUE = 0x00000001
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Le)
|
||||
|
||||
class VirtualChannelCompressionFlag(object):
|
||||
'''
|
||||
"""
|
||||
Use to determine virtual channel compression
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240551.aspx
|
||||
'''
|
||||
"""
|
||||
VCCAPS_NO_COMPR = 0x00000000
|
||||
VCCAPS_COMPR_SC = 0x00000001
|
||||
VCCAPS_COMPR_CS_8K = 0x00000002
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
|
||||
class SoundFlag(object):
|
||||
'''
|
||||
"""
|
||||
Use in sound capability to inform it
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240552.aspx
|
||||
'''
|
||||
"""
|
||||
NONE = 0x0000
|
||||
SOUND_BEEPS_FLAG = 0x0001
|
||||
|
||||
class CacheEntry(CompositeType):
|
||||
'''
|
||||
"""
|
||||
Use in capability cache exchange
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240566.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self):
|
||||
CompositeType.__init__(self)
|
||||
self.cacheEntries = UInt16Le()
|
||||
@@ -229,50 +220,50 @@ class CacheEntry(CompositeType):
|
||||
|
||||
|
||||
class Capability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
A capability
|
||||
@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)
|
||||
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))
|
||||
|
||||
def CapabilityFactory():
|
||||
'''
|
||||
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))
|
||||
elif self.capabilitySetType == CapsType.CAPSTYPE_BITMAP:
|
||||
elif self.capabilitySetType.value == CapsType.CAPSTYPE_BITMAP:
|
||||
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))
|
||||
elif self.capabilitySetType == CapsType.CAPSTYPE_BITMAPCACHE:
|
||||
elif self.capabilitySetType.value == CapsType.CAPSTYPE_BITMAPCACHE:
|
||||
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))
|
||||
elif self.capabilitySetType == CapsType.CAPSTYPE_INPUT:
|
||||
elif self.capabilitySetType.value == CapsType.CAPSTYPE_INPUT:
|
||||
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))
|
||||
elif self.capabilitySetType == CapsType.CAPSTYPE_GLYPHCACHE:
|
||||
elif self.capabilitySetType.value == CapsType.CAPSTYPE_GLYPHCACHE:
|
||||
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))
|
||||
elif self.capabilitySetType == CapsType.CAPSTYPE_VIRTUALCHANNEL:
|
||||
elif self.capabilitySetType.value == CapsType.CAPSTYPE_VIRTUALCHANNEL:
|
||||
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))
|
||||
elif self.capabilitySetType == CapsType.CAPSTYPE_CONTROL:
|
||||
elif self.capabilitySetType.value == CapsType.CAPSTYPE_CONTROL:
|
||||
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))
|
||||
elif self.capabilitySetType == CapsType.CAPSTYPE_FONT:
|
||||
elif self.capabilitySetType.value == CapsType.CAPSTYPE_FONT:
|
||||
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))
|
||||
elif self.capabilitySetType == CapsType.CAPSTYPE_SHARE:
|
||||
elif self.capabilitySetType.value == CapsType.CAPSTYPE_SHARE:
|
||||
return ShareCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
|
||||
else:
|
||||
return String(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
|
||||
@@ -283,12 +274,12 @@ class Capability(CompositeType):
|
||||
self.capability = FactoryType(capability)
|
||||
|
||||
class GeneralCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
General capability (protocol version and compression mode)
|
||||
client -> server
|
||||
server -> client
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.osMajorType = UInt16Le()
|
||||
@@ -304,12 +295,12 @@ class GeneralCapability(CompositeType):
|
||||
self.suppressOutputSupport = UInt8()
|
||||
|
||||
class BitmapCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
Bitmap format Capability
|
||||
client -> server
|
||||
server -> client
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240554.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.preferredBitsPerPixel = UInt16Le()
|
||||
@@ -327,12 +318,12 @@ class BitmapCapability(CompositeType):
|
||||
self.pad2octetsB = UInt16Le()
|
||||
|
||||
class OrderCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
Order capability list all drawing order supported
|
||||
client -> server
|
||||
server -> client
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240556.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.terminalDescriptor = String("\x00" * 16, readLen = UInt8(16))
|
||||
@@ -342,8 +333,8 @@ class OrderCapability(CompositeType):
|
||||
self.pad2octetsA = UInt16Le(0)
|
||||
self.maximumOrderLevel = UInt16Le(1)
|
||||
self.numberFonts = UInt16Le()
|
||||
self.orderFlags = OrderFlag.NEGOTIATEORDERSUPPORT
|
||||
self.orderSupport = ArrayType(UInt8, init = [UInt8(0) for i in range (0, 32)], readLen = UInt8(32))
|
||||
self.orderFlags = UInt16Le(OrderFlag.NEGOTIATEORDERSUPPORT)
|
||||
self.orderSupport = ArrayType(UInt8, init = [UInt8(0) for _ in range (0, 32)], readLen = UInt8(32))
|
||||
self.textFlags = UInt16Le()
|
||||
self.orderSupportExFlags = UInt16Le()
|
||||
self.pad4octetsB = UInt32Le()
|
||||
@@ -354,11 +345,11 @@ class OrderCapability(CompositeType):
|
||||
self.pad2octetsE = UInt16Le()
|
||||
|
||||
class BitmapCacheCapability(CompositeType):
|
||||
'''
|
||||
Order use to cache bitmap very usefull
|
||||
"""
|
||||
Order use to cache bitmap very useful
|
||||
client -> server
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240559.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.pad1 = UInt32Le()
|
||||
@@ -375,13 +366,13 @@ class BitmapCacheCapability(CompositeType):
|
||||
self.cache2MaximumCellSize = UInt16Le()
|
||||
|
||||
class PointerCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
Use to indicate pointer handle of client
|
||||
Paint by server or per client
|
||||
client -> server
|
||||
server -> client
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240562.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.colorPointerFlag = UInt16Le()
|
||||
@@ -389,12 +380,12 @@ class PointerCapability(CompositeType):
|
||||
self.pointerCacheSize = UInt16Le()
|
||||
|
||||
class InputCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
Use to indicate input capabilities
|
||||
client -> server
|
||||
server -> client
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240563.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.inputFlags = UInt16Le()
|
||||
@@ -411,69 +402,69 @@ class InputCapability(CompositeType):
|
||||
self.imeFileName = String("\x00" * 64, readLen = UInt8(64))
|
||||
|
||||
class BrushCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
Use to indicate brush capability
|
||||
client -> server
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240564.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.brushSupportLevel = BrushSupport.BRUSH_DEFAULT
|
||||
self.brushSupportLevel = UInt32Le(BrushSupport.BRUSH_DEFAULT)
|
||||
|
||||
class GlyphCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
Use in font order
|
||||
client -> server
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240565.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.glyphCache = ArrayType(CacheEntry, init = [CacheEntry() for i in range(0,10)], readLen = UInt8(10))
|
||||
self.glyphCache = ArrayType(CacheEntry, init = [CacheEntry() for _ in range(0,10)], readLen = UInt8(10))
|
||||
self.fragCache = UInt32Le()
|
||||
#all fonts are sent with bitmap format (very expensive)
|
||||
self.glyphSupportLevel = GlyphSupport.GLYPH_SUPPORT_NONE
|
||||
self.glyphSupportLevel = UInt16Le(GlyphSupport.GLYPH_SUPPORT_NONE)
|
||||
self.pad2octets = UInt16Le()
|
||||
|
||||
class OffscreenBitmapCacheCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
use to cached bitmap in offscreen area
|
||||
client -> server
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240550.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.offscreenSupportLevel = OffscreenSupportLevel.FALSE
|
||||
self.offscreenSupportLevel = UInt32Le(OffscreenSupportLevel.FALSE)
|
||||
self.offscreenCacheSize = UInt16Le()
|
||||
self.offscreenCacheEntries = UInt16Le()
|
||||
|
||||
class VirtualChannelCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
use to determine virtual channel compression
|
||||
client -> server
|
||||
server -> client
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240551.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.flags = VirtualChannelCompressionFlag.VCCAPS_NO_COMPR
|
||||
self.flags = UInt32Le(VirtualChannelCompressionFlag.VCCAPS_NO_COMPR)
|
||||
self.VCChunkSize = UInt32Le(optional = True)
|
||||
|
||||
class SoundCapability(CompositeType):
|
||||
'''
|
||||
use to exchange sound capability
|
||||
"""
|
||||
Use to exchange sound capability
|
||||
client -> server
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240552.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.soundFlags = SoundFlag.NONE
|
||||
self.soundFlags = UInt16Le(SoundFlag.NONE)
|
||||
self.pad2octetsA = UInt16Le()
|
||||
|
||||
class ControlCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
client -> server but server ignore contents! Thanks krosoft for brandwidth
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240568.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.controlFlags = UInt16Le()
|
||||
@@ -482,10 +473,10 @@ class ControlCapability(CompositeType):
|
||||
self.detachInterest = UInt16Le(0x0002)
|
||||
|
||||
class WindowActivationCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
client -> server but server ignore contents! Thanks krosoft for brandwidth
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240569.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.helpKeyFlag = UInt16Le()
|
||||
@@ -494,35 +485,35 @@ class WindowActivationCapability(CompositeType):
|
||||
self.windowManagerKeyFlag = UInt16Le()
|
||||
|
||||
class FontCapability(CompositeType):
|
||||
'''
|
||||
use to indicate font support
|
||||
"""
|
||||
Use to indicate font support
|
||||
client -> server
|
||||
server -> client
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240571.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.fontSupportFlags = UInt16Le(0x0001)
|
||||
self.pad2octets = UInt16Le()
|
||||
|
||||
class ColorCacheCapability(CompositeType):
|
||||
'''
|
||||
"""
|
||||
client -> server
|
||||
server -> client
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc241564.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.colorTableCacheSize = UInt16Le(0x0006)
|
||||
self.pad2octets = UInt16Le()
|
||||
|
||||
class ShareCapability(CompositeType):
|
||||
'''
|
||||
use to advertise channel id of server
|
||||
"""
|
||||
Use to advertise channel id of server
|
||||
client -> server
|
||||
server -> client
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240570.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, readLen = None):
|
||||
CompositeType.__init__(self, readLen = readLen)
|
||||
self.nodeId = UInt16Le()
|
||||
|
||||
@@ -1,9 +1,27 @@
|
||||
'''
|
||||
@author sylvain
|
||||
@summary gcc language
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240508.aspx
|
||||
'''
|
||||
from rdpy.network.const import ConstAttributes, TypeAttributes
|
||||
#
|
||||
# Copyright (c) 2014 Sylvain Peyrefitte
|
||||
#
|
||||
# This file is part of rdpy.
|
||||
#
|
||||
# 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
|
||||
import per
|
||||
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_sc_key = "McDn";
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class ServerToClientMessage(object):
|
||||
'''
|
||||
"""
|
||||
Server to Client block
|
||||
gcc conference messages
|
||||
GCC conference messages
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240509.aspx
|
||||
'''
|
||||
"""
|
||||
SC_CORE = 0x0C01
|
||||
SC_SECURITY = 0x0C02
|
||||
SC_NET = 0x0C03
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class ClientToServerMessage(object):
|
||||
'''
|
||||
"""
|
||||
Client to Server block
|
||||
gcc conference messages
|
||||
GCC conference messages
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240509.aspx
|
||||
'''
|
||||
"""
|
||||
CS_CORE = 0xC001
|
||||
CS_SECURITY = 0xC002
|
||||
CS_NET = 0xC003
|
||||
CS_CLUSTER = 0xC004
|
||||
CS_MONITOR = 0xC005
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class ColorDepth(object):
|
||||
'''
|
||||
depth color
|
||||
"""
|
||||
Depth color
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
|
||||
'''
|
||||
"""
|
||||
RNS_UD_COLOR_8BPP = 0xCA01
|
||||
RNS_UD_COLOR_16BPP_555 = 0xCA02
|
||||
RNS_UD_COLOR_16BPP_565 = 0xCA03
|
||||
RNS_UD_COLOR_24BPP = 0xCA04
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class HighColor(object):
|
||||
'''
|
||||
high color of client
|
||||
"""
|
||||
High color of client
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
|
||||
'''
|
||||
"""
|
||||
HIGH_COLOR_4BPP = 0x0004
|
||||
HIGH_COLOR_8BPP = 0x0008
|
||||
HIGH_COLOR_15BPP = 0x000f
|
||||
HIGH_COLOR_16BPP = 0x0010
|
||||
HIGH_COLOR_24BPP = 0x0018
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class Support(object):
|
||||
'''
|
||||
support depth flag
|
||||
"""
|
||||
Supported depth flag
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
|
||||
'''
|
||||
"""
|
||||
RNS_UD_24BPP_SUPPORT = 0x0001
|
||||
RNS_UD_16BPP_SUPPORT = 0x0002
|
||||
RNS_UD_15BPP_SUPPORT = 0x0004
|
||||
RNS_UD_32BPP_SUPPORT = 0x0008
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
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
|
||||
'''
|
||||
"""
|
||||
RNS_UD_CS_SUPPORT_ERRINFO_PDU = 0x0001
|
||||
RNS_UD_CS_WANT_32BPP_SESSION = 0x0002
|
||||
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_HEARTBEAT_PDU = 0x0400
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
class ConnectionType(object):
|
||||
'''
|
||||
this information is correct if
|
||||
"""
|
||||
This information is correct if
|
||||
RNS_UD_CS_VALID_CONNECTION_TYPE flag is set on capabilityFlag
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
|
||||
'''
|
||||
"""
|
||||
CONNECTION_TYPE_MODEM = 0x01
|
||||
CONNECTION_TYPE_BROADBAND_LOW = 0x02
|
||||
CONNECTION_TYPE_SATELLITE = 0x03
|
||||
@@ -110,41 +114,33 @@ class ConnectionType(object):
|
||||
CONNECTION_TYPE_LAN = 0x06
|
||||
CONNECTION_TYPE_AUTODETECT = 0x07
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Le)
|
||||
class Version(object):
|
||||
'''
|
||||
supported version of RDP
|
||||
"""
|
||||
Supported version of RDP
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240510.aspx
|
||||
'''
|
||||
"""
|
||||
RDP_VERSION_4 = 0x00080001
|
||||
RDP_VERSION_5_PLUS = 0x00080004
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class Sequence(object):
|
||||
RNS_UD_SAS_DEL = 0xAA03
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Le)
|
||||
|
||||
class Encryption(object):
|
||||
'''
|
||||
encryption method supported
|
||||
@deprecated: because rdpy use ssl but need to send to server...
|
||||
"""
|
||||
Encryption methods supported
|
||||
@deprecated: because rdpy use SSL but need to send to server...
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240511.aspx
|
||||
'''
|
||||
"""
|
||||
ENCRYPTION_FLAG_40BIT = 0x00000001
|
||||
ENCRYPTION_FLAG_128BIT = 0x00000002
|
||||
ENCRYPTION_FLAG_56BIT = 0x00000008
|
||||
FIPS_ENCRYPTION_FLAG = 0x00000010
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Le)
|
||||
|
||||
class ChannelOptions(object):
|
||||
'''
|
||||
channel options
|
||||
"""
|
||||
Channel options
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240513.aspx
|
||||
'''
|
||||
"""
|
||||
CHANNEL_OPTION_INITIALIZED = 0x80000000
|
||||
CHANNEL_OPTION_ENCRYPT_RDP = 0x40000000
|
||||
CHANNEL_OPTION_ENCRYPT_SC = 0x20000000
|
||||
@@ -156,14 +152,12 @@ class ChannelOptions(object):
|
||||
CHANNEL_OPTION_COMPRESS = 0x00400000
|
||||
CHANNEL_OPTION_SHOW_PROTOCOL = 0x00200000
|
||||
REMOTE_CONTROL_PERSISTENT = 0x00100000
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Le)
|
||||
|
||||
class KeyboardType(object):
|
||||
'''
|
||||
"""
|
||||
Keyboard type
|
||||
IBM_101_102_KEYS is the most common keyboard type
|
||||
'''
|
||||
"""
|
||||
IBM_PC_XT_83_KEY = 0x00000001
|
||||
OLIVETTI = 0x00000002
|
||||
IBM_PC_AT_84_KEY = 0x00000003
|
||||
@@ -171,14 +165,12 @@ class KeyboardType(object):
|
||||
NOKIA_1050 = 0x00000005
|
||||
NOKIA_9140 = 0x00000006
|
||||
JAPANESE = 0x00000007
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Le)
|
||||
|
||||
class KeyboardLayout(object):
|
||||
'''
|
||||
"""
|
||||
Keyboard layout definition
|
||||
@see: http://technet.microsoft.com/en-us/library/cc766503%28WS.10%29.aspx
|
||||
'''
|
||||
"""
|
||||
ARABIC = 0x00000401
|
||||
BULGARIAN = 0x00000402
|
||||
CHINESE_US_KEYBOARD = 0x00000404
|
||||
@@ -201,64 +193,64 @@ class KeyboardLayout(object):
|
||||
|
||||
|
||||
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
|
||||
'''
|
||||
"""
|
||||
def __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.desktopHeight = UInt16Le(800)
|
||||
self.colorDepth = ColorDepth.RNS_UD_COLOR_8BPP
|
||||
self.sasSequence = Sequence.RNS_UD_SAS_DEL
|
||||
self.kbdLayout = KeyboardLayout.FRENCH
|
||||
self.colorDepth = UInt16Le(ColorDepth.RNS_UD_COLOR_8BPP)
|
||||
self.sasSequence = UInt16Le(Sequence.RNS_UD_SAS_DEL)
|
||||
self.kbdLayout = UInt32Le(KeyboardLayout.FRENCH)
|
||||
self.clientBuild = UInt32Le(3790)
|
||||
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.keyboardFnKeys = UInt32Le(12)
|
||||
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.serialNumber = UInt32Le(0)
|
||||
self.highColorDepth = HighColor.HIGH_COLOR_24BPP
|
||||
self.supportedColorDepths = Support.RNS_UD_24BPP_SUPPORT | Support.RNS_UD_16BPP_SUPPORT | Support.RNS_UD_15BPP_SUPPORT
|
||||
self.earlyCapabilityFlags = CapabilityFlags.RNS_UD_CS_SUPPORT_ERRINFO_PDU
|
||||
self.highColorDepth = UInt16Le(HighColor.HIGH_COLOR_24BPP)
|
||||
self.supportedColorDepths = UInt16Le(Support.RNS_UD_32BPP_SUPPORT | Support.RNS_UD_24BPP_SUPPORT | Support.RNS_UD_16BPP_SUPPORT)
|
||||
self.earlyCapabilityFlags = UInt16Le(CapabilityFlags.RNS_UD_CS_SUPPORT_ERRINFO_PDU)
|
||||
self.clientDigProductId = String("\x00"*64, readLen = UInt8(64))
|
||||
self.connectionType = UInt8()
|
||||
self.pad1octet = UInt8()
|
||||
self.serverSelectedProtocol = UInt32Le()
|
||||
|
||||
class ServerCoreSettings(CompositeType):
|
||||
'''
|
||||
server side core settings structure
|
||||
"""
|
||||
Server side core settings structure
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240517.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self):
|
||||
CompositeType.__init__(self)
|
||||
self.rdpVersion = Version.RDP_VERSION_5_PLUS
|
||||
self.rdpVersion = UInt32Le(Version.RDP_VERSION_5_PLUS)
|
||||
self.clientRequestedProtocol = UInt32Le()
|
||||
|
||||
class ClientSecuritySettings(CompositeType):
|
||||
'''
|
||||
client security setting
|
||||
"""
|
||||
Client security setting
|
||||
@deprecated: because we use ssl
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240511.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self):
|
||||
CompositeType.__init__(self)
|
||||
self.encryptionMethods = UInt32Le()
|
||||
self.extEncryptionMethods = UInt32Le()
|
||||
|
||||
class ServerSecuritySettings(CompositeType):
|
||||
'''
|
||||
server security settings
|
||||
may be ignore because rdpy don't use
|
||||
"""
|
||||
Server security settings
|
||||
May be ignored because rdpy don't use
|
||||
RDP security level
|
||||
@deprecated: because we use ssl
|
||||
@deprecated: because we use SSL
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240518.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self):
|
||||
CompositeType.__init__(self)
|
||||
self.encryptionMethod = UInt32Le()
|
||||
@@ -266,12 +258,11 @@ class ServerSecuritySettings(CompositeType):
|
||||
|
||||
|
||||
class ClientRequestedChannel(CompositeType):
|
||||
'''
|
||||
channels structure share between
|
||||
client and server
|
||||
"""
|
||||
Channels structure share between client and server
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240512.aspx
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240513.aspx
|
||||
'''
|
||||
"""
|
||||
def __init__(self, name = "", options = UInt32Le()):
|
||||
CompositeType.__init__(self)
|
||||
#name of channel
|
||||
@@ -280,9 +271,9 @@ class ClientRequestedChannel(CompositeType):
|
||||
self.options = options
|
||||
|
||||
class ClientSettings(object):
|
||||
'''
|
||||
class which group all client settings supported by RDPY
|
||||
'''
|
||||
"""
|
||||
Class which group all client settings supported by RDPY
|
||||
"""
|
||||
def __init__(self):
|
||||
self.core = ClientCoreSettings()
|
||||
#list of ClientRequestedChannel read network gcc packet
|
||||
@@ -290,9 +281,9 @@ class ClientSettings(object):
|
||||
self.security = ClientSecuritySettings()
|
||||
|
||||
class ServerSettings(object):
|
||||
'''
|
||||
server settings
|
||||
'''
|
||||
"""
|
||||
Server settings
|
||||
"""
|
||||
def __init__(self):
|
||||
#core settings of server
|
||||
self.core = ServerCoreSettings()
|
||||
@@ -302,11 +293,11 @@ class ServerSettings(object):
|
||||
self.channelsId = []
|
||||
|
||||
def writeConferenceCreateRequest(settings):
|
||||
'''
|
||||
write conference create request structure
|
||||
"""
|
||||
Write conference create request structure
|
||||
@param settings: ClientSettings
|
||||
@return: struct that represent
|
||||
'''
|
||||
@return: structure that represent
|
||||
"""
|
||||
userData = writeClientDataBlocks(settings)
|
||||
userDataStream = Stream()
|
||||
userDataStream.writeType(userData)
|
||||
@@ -318,12 +309,12 @@ def writeConferenceCreateRequest(settings):
|
||||
per.writeOctetStream(h221_cs_key, 4), per.writeOctetStream(userDataStream.getvalue()))
|
||||
|
||||
def readConferenceCreateResponse(s):
|
||||
'''
|
||||
read response from server
|
||||
"""
|
||||
Read response from server
|
||||
and return server settings read from this response
|
||||
@param s: Stream
|
||||
@return: ServerSettings
|
||||
'''
|
||||
"""
|
||||
per.readChoice(s)
|
||||
per.readObjectIdentifier(s, t124_02_98_oid)
|
||||
per.readLength(s)
|
||||
@@ -339,22 +330,22 @@ def readConferenceCreateResponse(s):
|
||||
|
||||
|
||||
def writeClientDataBlocks(settings):
|
||||
'''
|
||||
write all blocks for client
|
||||
and return gcc valid structure
|
||||
"""
|
||||
Write all blocks for client
|
||||
and return GCC valid structure
|
||||
@param settings: ClientSettings
|
||||
'''
|
||||
"""
|
||||
return (writeClientCoreData(settings.core),
|
||||
writeClientSecurityData(settings.security),
|
||||
writeClientNetworkData(settings.networkChannels))
|
||||
|
||||
def readServerDataBlocks(s):
|
||||
'''
|
||||
read gcc server data blocks
|
||||
and return result in Server Settings object
|
||||
"""
|
||||
Read GCC server data blocks
|
||||
And return result in Server Settings object
|
||||
@param s: Stream
|
||||
@return: ServerSettings
|
||||
'''
|
||||
"""
|
||||
settings = ServerSettings()
|
||||
length = per.readLength(s)
|
||||
while length > 0:
|
||||
@@ -363,61 +354,61 @@ def readServerDataBlocks(s):
|
||||
blockLength = UInt16Le()
|
||||
s.readType((blockType, blockLength))
|
||||
#read core block
|
||||
if blockType == ServerToClientMessage.SC_CORE:
|
||||
if blockType.value == ServerToClientMessage.SC_CORE:
|
||||
s.readType(settings.core)
|
||||
#read network block
|
||||
elif blockType == ServerToClientMessage.SC_NET:
|
||||
elif blockType.value == ServerToClientMessage.SC_NET:
|
||||
settings.channelsId = readServerSecurityData(s)
|
||||
#read security block
|
||||
#unused in rdpy because use SSL layer
|
||||
elif blockType == ServerToClientMessage.SC_SECURITY:
|
||||
elif blockType.value == ServerToClientMessage.SC_SECURITY:
|
||||
s.readType(settings.security)
|
||||
else:
|
||||
print "Unknow server block %s"%hex(type)
|
||||
print "Unknown server block %s"%hex(type)
|
||||
length -= blockLength.value
|
||||
s.seek(marker + blockLength.value)
|
||||
|
||||
return settings
|
||||
|
||||
def writeClientCoreData(core):
|
||||
'''
|
||||
write client settings in GCC language
|
||||
"""
|
||||
Write client settings in GCC language
|
||||
@param settings: ClientSettings structure
|
||||
@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):
|
||||
'''
|
||||
write security header block and security structure
|
||||
"""
|
||||
Write security header block and security structure
|
||||
@param security: ClientSecuritySettings
|
||||
@return: gcc client security data
|
||||
'''
|
||||
return (ClientToServerMessage.CS_SECURITY, UInt16Le(sizeof(security) + 4), security)
|
||||
@return: GCC client security data
|
||||
"""
|
||||
return (UInt16Le(ClientToServerMessage.CS_SECURITY), UInt16Le(sizeof(security) + 4), security)
|
||||
|
||||
def writeClientNetworkData(channels):
|
||||
'''
|
||||
write network packet whith channels infos
|
||||
"""
|
||||
Write network packet with channels infos
|
||||
@param channels: list of ClientRequestedChannel
|
||||
@return: gcc network packet
|
||||
'''
|
||||
@return: GCC network packet
|
||||
"""
|
||||
if len(channels) == 0:
|
||||
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):
|
||||
'''
|
||||
read server security and fill it in settings
|
||||
read all channels accepted by server by server
|
||||
"""
|
||||
Read server security and fill it in settings
|
||||
Read all channels accepted by server by server
|
||||
@param s: Stream
|
||||
@return: list of channel id selected by server
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240522.aspx
|
||||
'''
|
||||
"""
|
||||
channelsId = []
|
||||
channelId = UInt16Le()
|
||||
numberOfChannels = UInt16Le()
|
||||
s.readType((channelId, numberOfChannels))
|
||||
for i in range(0, numberOfChannels.value):
|
||||
for _ in range(0, numberOfChannels.value):
|
||||
channelId = UInt16Le()
|
||||
s.readType(channelId)
|
||||
channelsId.append(channelId)
|
||||
|
||||
@@ -165,7 +165,7 @@ class MCS(LayerAutomata):
|
||||
self.writeDomainParams(1, 1, 1, 0x420),
|
||||
self.writeDomainParams(0xffff, 0xfc17, 0xffff, 0xffff),
|
||||
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
|
||||
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.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
|
||||
|
||||
import gcc, lic, caps
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class SecurityFlag(object):
|
||||
"""
|
||||
Microsoft security flags
|
||||
@@ -39,8 +36,6 @@ class SecurityFlag(object):
|
||||
SEC_INFO_PKT = 0x0040
|
||||
SEC_LICENSE_PKT = 0x0080
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Le)
|
||||
class InfoFlag(object):
|
||||
"""
|
||||
Client capabilities informations
|
||||
@@ -65,8 +60,6 @@ class InfoFlag(object):
|
||||
INFO_VIDEO_DISABLE = 0x00400000
|
||||
INFO_CompressionTypeMask = 0x00001E00
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Le)
|
||||
class PerfFlag(object):
|
||||
"""
|
||||
Network performances flag
|
||||
@@ -80,17 +73,13 @@ class PerfFlag(object):
|
||||
PERF_ENABLE_FONT_SMOOTHING = 0x00000080
|
||||
PERF_ENABLE_DESKTOP_COMPOSITION = 0x00000100
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class AfInet(object):
|
||||
"""
|
||||
IPv4 or IPv6 adress style
|
||||
"""
|
||||
AF_INET = 0x00002
|
||||
AF_INET6 = 0x0017
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
|
||||
class PDUType(object):
|
||||
"""
|
||||
Data PDU type primary index
|
||||
@@ -101,9 +90,7 @@ class PDUType(object):
|
||||
PDUTYPE_DEACTIVATEALLPDU = 0x16
|
||||
PDUTYPE_DATAPDU = 0x17
|
||||
PDUTYPE_SERVER_REDIR_PKT = 0x1A
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
|
||||
class PDUType2(object):
|
||||
"""
|
||||
Data PDU type secondary index
|
||||
@@ -133,9 +120,7 @@ class PDUType2(object):
|
||||
PDUTYPE2_ARC_STATUS_PDU = 0x32
|
||||
PDUTYPE2_STATUS_INFO_PDU = 0x36
|
||||
PDUTYPE2_MONITOR_LAYOUT_PDU = 0x37
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
|
||||
class StreamId(object):
|
||||
"""
|
||||
Stream priority
|
||||
@@ -145,9 +130,7 @@ class StreamId(object):
|
||||
STREAM_LOW = 0x01
|
||||
STREAM_MED = 0x02
|
||||
STREAM_HI = 0x04
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
|
||||
class CompressionOrder(object):
|
||||
"""
|
||||
PDU compression order
|
||||
@@ -158,8 +141,6 @@ class CompressionOrder(object):
|
||||
PACKET_AT_FRONT = 0x40
|
||||
PACKET_FLUSHED = 0x80
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
class CompressionType(object):
|
||||
"""
|
||||
PDU compression type
|
||||
@@ -170,8 +151,6 @@ class CompressionType(object):
|
||||
PACKET_COMPR_TYPE_RDP6 = 0x2
|
||||
PACKET_COMPR_TYPE_RDP61 = 0x3
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class Action(object):
|
||||
"""
|
||||
Action flag use in Control PDU packet
|
||||
@@ -182,8 +161,6 @@ class Action(object):
|
||||
CTRLACTION_DETACH = 0x0003
|
||||
CTRLACTION_COOPERATE = 0x0004
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class PersistentKeyListFlag(object):
|
||||
"""
|
||||
Use to determine the number of persistent key packet
|
||||
@@ -192,8 +169,6 @@ class PersistentKeyListFlag(object):
|
||||
PERSIST_FIRST_PDU = 0x01
|
||||
PERSIST_LAST_PDU = 0x02
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
class BitmapFlag(object):
|
||||
"""
|
||||
Use in bitmap update PDU
|
||||
@@ -201,9 +176,7 @@ class BitmapFlag(object):
|
||||
"""
|
||||
BITMAP_COMPRESSION = 0x0001
|
||||
NO_BITMAP_COMPRESSION_HDR = 0x0400
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt16Le)
|
||||
|
||||
class UpdateType(object):
|
||||
"""
|
||||
Use in update PDU to determine which type of update
|
||||
@@ -213,9 +186,7 @@ class UpdateType(object):
|
||||
UPDATETYPE_BITMAP = 0x0001
|
||||
UPDATETYPE_PALETTE = 0x0002
|
||||
UPDATETYPE_SYNCHRONIZE = 0x0003
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Le)
|
||||
|
||||
class ErrorInfo(object):
|
||||
"""
|
||||
Error code use in Error info PDU
|
||||
@@ -438,7 +409,7 @@ class RDPInfo(CompositeType):
|
||||
#code page
|
||||
self.codePage = UInt32Le()
|
||||
#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.cbUserName = UInt16Le(lambda:sizeof(self.userName) - 2)
|
||||
self.cbPassword = UInt16Le(lambda:sizeof(self.password) - 2)
|
||||
@@ -461,13 +432,13 @@ class RDPExtendedInfo(CompositeType):
|
||||
"""
|
||||
def __init__(self, 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.clientAddress = UniString(readLen = self.cbClientAddress)
|
||||
self.cbClientDir = UInt16Le(lambda:sizeof(self.clientDir))
|
||||
self.clientDir = UniString(readLen = self.cbClientDir)
|
||||
#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):
|
||||
"""
|
||||
@@ -475,29 +446,29 @@ class ShareControlHeader(CompositeType):
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240576.aspx
|
||||
"""
|
||||
def __init__(self, totalLength, pduType, userId):
|
||||
'''
|
||||
constructor
|
||||
"""
|
||||
Set pduType as constant
|
||||
@param totalLength: total length of pdu packet
|
||||
'''
|
||||
"""
|
||||
CompositeType.__init__(self)
|
||||
#share control header
|
||||
self.totalLength = UInt16Le(totalLength)
|
||||
self.pduType = UInt16Le(pduType.value, constant = True)
|
||||
self.PDUSource = UInt16Le(userId.value + 1001)
|
||||
self.pduType = UInt16Le(pduType, constant = True)
|
||||
self.PDUSource = UInt16Le(userId + 1001)
|
||||
|
||||
class ShareDataHeader(CompositeType):
|
||||
"""
|
||||
PDU share data header
|
||||
@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)
|
||||
self.shareControlHeader = ShareControlHeader(size, PDUType.PDUTYPE_DATAPDU, userId)
|
||||
self.shareId = shareId
|
||||
self.shareId = UInt32Le(shareId)
|
||||
self.pad1 = UInt8()
|
||||
self.streamId = StreamId.STREAM_LOW
|
||||
self.streamId = UInt8(StreamId.STREAM_LOW)
|
||||
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.compressedLength = UInt16Le()
|
||||
|
||||
@@ -506,7 +477,7 @@ class DemandActivePDU(CompositeType):
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240485.aspx
|
||||
Main use for capabilities exchange server -> client
|
||||
"""
|
||||
def __init__(self, userId = UInt16Le()):
|
||||
def __init__(self, userId = 0):
|
||||
CompositeType.__init__(self)
|
||||
self.shareControlHeader = ShareControlHeader(lambda:sizeof(self), PDUType.PDUTYPE_DEMANDACTIVEPDU, userId)
|
||||
self.shareId = UInt32Le()
|
||||
@@ -523,7 +494,7 @@ class ConfirmActivePDU(CompositeType):
|
||||
@see: http://msdn.microsoft.com/en-us/library/cc240488.aspx
|
||||
Main use for capabilities confirm client -> sever
|
||||
"""
|
||||
def __init__(self, userId = UInt16Le()):
|
||||
def __init__(self, userId = 0):
|
||||
CompositeType.__init__(self)
|
||||
self.shareControlHeader = ShareControlHeader(lambda:sizeof(self), PDUType.PDUTYPE_CONFIRMACTIVEPDU, userId)
|
||||
self.shareId = UInt32Le()
|
||||
@@ -551,7 +522,7 @@ class PersistentListPDU(CompositeType):
|
||||
Fill with some keys from previous session
|
||||
@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)
|
||||
self.shareDataHeader = ShareDataHeader(lambda:sizeof(self), PDUType2.PDUTYPE2_BITMAPCACHE_PERSISTENT_LIST, userId, shareId)
|
||||
self.numEntriesCache0 = UInt16Le()
|
||||
@@ -573,22 +544,22 @@ class DataPDU(CompositeType):
|
||||
"""
|
||||
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)
|
||||
self.shareDataHeader = ShareDataHeader(lambda:sizeof(self), pduType, userId, shareId)
|
||||
|
||||
def PDUDataFactory():
|
||||
if self.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_UPDATE:
|
||||
if self.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_UPDATE:
|
||||
return UpdateDataPDU()
|
||||
elif self.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_SYNCHRONIZE:
|
||||
elif self.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_SYNCHRONIZE:
|
||||
return SynchronizeDataPDU()
|
||||
elif self.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_CONTROL:
|
||||
elif self.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_CONTROL:
|
||||
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()
|
||||
elif self.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_FONTLIST:
|
||||
elif self.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_FONTLIST:
|
||||
return FontListDataPDU()
|
||||
elif self.shareDataHeader.pduType2 == PDUType2.PDUTYPE2_FONTMAP:
|
||||
elif self.shareDataHeader.pduType2.value == PDUType2.PDUTYPE2_FONTMAP:
|
||||
return FontMapDataPDU()
|
||||
else:
|
||||
#read all value
|
||||
@@ -614,7 +585,7 @@ class ControlDataPDU(CompositeType):
|
||||
"""
|
||||
def __init__(self, action = None):
|
||||
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.controlId = UInt32Le()
|
||||
|
||||
@@ -665,7 +636,7 @@ class UpdateDataPDU(CompositeType):
|
||||
self.updateType = updateType
|
||||
|
||||
def UpdateDataFactory():
|
||||
if self.updateType == UpdateType.UPDATETYPE_BITMAP:
|
||||
if self.updateType.value == UpdateType.UPDATETYPE_BITMAP:
|
||||
return BitmapUpdateDataPDU()
|
||||
else:
|
||||
String()
|
||||
@@ -673,7 +644,7 @@ class UpdateDataPDU(CompositeType):
|
||||
if updateData is None:
|
||||
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):
|
||||
"""
|
||||
@@ -684,6 +655,18 @@ class BitmapUpdateDataPDU(CompositeType):
|
||||
CompositeType.__init__(self)
|
||||
self.numberRectangles = UInt16Le()
|
||||
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):
|
||||
"""
|
||||
@@ -714,8 +697,8 @@ class BitmapData(CompositeType):
|
||||
self.bitsPerPixel = UInt16Le()
|
||||
self.flags = UInt16Le()
|
||||
self.bitmapLength = UInt16Le()
|
||||
self.bitmapComprHdr = BitmapCompressedDataHeader(conditional = lambda:(not (self.flags | 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.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.value | BitmapFlag.NO_BITMAP_COMPRESSION_HDR) else self.bitmapComprHdr.cbCompMainBodySize.value)))
|
||||
|
||||
class PDU(LayerAutomata):
|
||||
"""
|
||||
@@ -729,7 +712,7 @@ class PDU(LayerAutomata):
|
||||
"""
|
||||
LayerAutomata.__init__(self, mode, None)
|
||||
#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
|
||||
self._serverCapabilities = {
|
||||
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())
|
||||
}
|
||||
#share id between client and server
|
||||
self._shareId = UInt32Le()
|
||||
self._shareId = 0
|
||||
|
||||
#rdp controller
|
||||
self._controller = controller
|
||||
@@ -780,14 +763,14 @@ class PDU(LayerAutomata):
|
||||
"""
|
||||
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):
|
||||
"""
|
||||
Send a logon info packet
|
||||
"""
|
||||
#always send extended info because rdpy only accept rdp version 5 and more
|
||||
self._transport.send((SecurityFlag.SEC_INFO_PKT, UInt16Le(), self._info))
|
||||
#always send extended info because rdpy only accept RDP version 5 and more
|
||||
self._transport.send((UInt16Le(SecurityFlag.SEC_INFO_PKT), UInt16Le(), self._info))
|
||||
|
||||
def recvLicenceInfo(self, data):
|
||||
"""
|
||||
@@ -798,7 +781,7 @@ class PDU(LayerAutomata):
|
||||
securityFlagHi = UInt16Le()
|
||||
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")
|
||||
|
||||
validClientPdu = lic.LicPacket()
|
||||
@@ -821,7 +804,7 @@ class PDU(LayerAutomata):
|
||||
#maybe an error message
|
||||
dataPDU = 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
|
||||
|
||||
message = "Unknown code %s"%hex(dataPDU.pduData._value.errorInfo.value)
|
||||
@@ -842,7 +825,7 @@ class PDU(LayerAutomata):
|
||||
demandActivePDU = DemandActivePDU()
|
||||
data.readType(demandActivePDU)
|
||||
|
||||
self._shareId = demandActivePDU.shareId
|
||||
self._shareId = demandActivePDU.shareId.value
|
||||
|
||||
for cap in demandActivePDU.capabilitySets._array:
|
||||
self._serverCapabilities[cap.capabilitySetType] = cap
|
||||
@@ -855,7 +838,7 @@ class PDU(LayerAutomata):
|
||||
@param data: Stream from transport layer
|
||||
"""
|
||||
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")
|
||||
self.setNextState(self.recvServerControlCooperatePDU)
|
||||
|
||||
@@ -865,7 +848,7 @@ class PDU(LayerAutomata):
|
||||
@param data: Stream from transport layer
|
||||
"""
|
||||
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")
|
||||
self.setNextState(self.recvServerControlGrantedPDU)
|
||||
|
||||
@@ -875,7 +858,7 @@ class PDU(LayerAutomata):
|
||||
@param data: Stream from transport layer
|
||||
"""
|
||||
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")
|
||||
self.setNextState(self.recvServerFontMapPDU)
|
||||
|
||||
@@ -885,7 +868,7 @@ class PDU(LayerAutomata):
|
||||
@param data: Stream from transport layer
|
||||
"""
|
||||
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")
|
||||
print "client is now connected"
|
||||
if not self._presentation is None:
|
||||
@@ -898,7 +881,7 @@ class PDU(LayerAutomata):
|
||||
@param data: Stream from transport layer
|
||||
"""
|
||||
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)
|
||||
|
||||
|
||||
@@ -908,9 +891,9 @@ class PDU(LayerAutomata):
|
||||
"""
|
||||
#init general capability
|
||||
generalCapability = self._clientCapabilities[caps.CapsType.CAPSTYPE_GENERAL].capability._value
|
||||
generalCapability.osMajorType = caps.MajorType.OSMAJORTYPE_WINDOWS
|
||||
generalCapability.osMinorType = caps.MinorType.OSMINORTYPE_WINDOWS_NT
|
||||
generalCapability.extraFlags = caps.GeneralExtraFlag.LONG_CREDENTIALS_SUPPORTED | caps.GeneralExtraFlag.NO_BITMAP_COMPRESSION_HDR
|
||||
generalCapability.osMajorType.value = caps.MajorType.OSMAJORTYPE_WINDOWS
|
||||
generalCapability.osMinorType.value = caps.MinorType.OSMINORTYPE_WINDOWS_NT
|
||||
generalCapability.extraFlags.value = caps.GeneralExtraFlag.LONG_CREDENTIALS_SUPPORTED | caps.GeneralExtraFlag.NO_BITMAP_COMPRESSION_HDR
|
||||
|
||||
#init bitmap capability
|
||||
bitmapCapability = self._clientCapabilities[caps.CapsType.CAPSTYPE_BITMAP].capability._value
|
||||
@@ -920,11 +903,11 @@ class PDU(LayerAutomata):
|
||||
|
||||
#init order capability
|
||||
orderCapability = self._clientCapabilities[caps.CapsType.CAPSTYPE_ORDER].capability._value
|
||||
orderCapability.orderFlags |= caps.OrderFlag.ZEROBOUNDSDELTASSUPPORT
|
||||
orderCapability.orderFlags.value |= caps.OrderFlag.ZEROBOUNDSDELTASSUPPORT
|
||||
|
||||
#init input capability
|
||||
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.keyboardType = self._transport.getGCCClientSettings().core.keyboardType
|
||||
inputCapability.keyboardSubType = self._transport.getGCCClientSettings().core.keyboardSubType
|
||||
@@ -932,8 +915,8 @@ class PDU(LayerAutomata):
|
||||
inputCapability.imeFileName = self._transport.getGCCClientSettings().core.imeFileName
|
||||
|
||||
#make active PDU packet
|
||||
confirmActivePDU = ConfirmActivePDU(UInt16Le(self._transport.getUserId()))
|
||||
confirmActivePDU.shareId = self._shareId
|
||||
confirmActivePDU = ConfirmActivePDU(self._transport.getUserId())
|
||||
confirmActivePDU.shareId.value = self._shareId
|
||||
confirmActivePDU.capabilitySets._array = self._clientCapabilities.values()
|
||||
self._transport.send(confirmActivePDU)
|
||||
#send synchronize
|
||||
@@ -943,24 +926,24 @@ class PDU(LayerAutomata):
|
||||
"""
|
||||
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)
|
||||
|
||||
#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)
|
||||
|
||||
#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)
|
||||
|
||||
#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.bitMask = PersistentKeyListFlag.PERSIST_FIRST_PDU | PersistentKeyListFlag.PERSIST_LAST_PDU
|
||||
#persistentListPDU.bitMask = UInt16Le(PersistentKeyListFlag.PERSIST_FIRST_PDU | PersistentKeyListFlag.PERSIST_LAST_PDU)
|
||||
#self._transport.send(persistentListPDU)
|
||||
|
||||
#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.setNextState(self.recvServerSynchronizePDU)
|
||||
|
||||
@@ -42,7 +42,7 @@ class RDPController(object):
|
||||
for observer in self._clientObserver:
|
||||
#for each rectangle in update PDU
|
||||
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):
|
||||
"""
|
||||
@@ -106,7 +106,7 @@ class ServerFactory(protocol.Factory):
|
||||
|
||||
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):
|
||||
"""
|
||||
|
||||
@@ -29,11 +29,8 @@ Implement Remote FrameBuffer protocol use in VNC client and server
|
||||
from twisted.internet import protocol
|
||||
from rdpy.network.layer import RawLayer, LayerMode
|
||||
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
|
||||
from rdpy.network.error import InvalidValue, CallPureVirtualFuntion, InvalidType
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(String)
|
||||
class ProtocolVersion(object):
|
||||
"""
|
||||
Different protocol version
|
||||
@@ -43,8 +40,6 @@ class ProtocolVersion(object):
|
||||
RFB003007 = "RFB 003.007\n"
|
||||
RFB003008 = "RFB 003.008\n"
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
class SecurityType(object):
|
||||
"""
|
||||
Security type supported
|
||||
@@ -53,8 +48,6 @@ class SecurityType(object):
|
||||
NONE = 1
|
||||
VNC = 2
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt32Be)
|
||||
class Pointer(object):
|
||||
"""
|
||||
Mouse event code (which button)
|
||||
@@ -64,17 +57,13 @@ class Pointer(object):
|
||||
BUTTON1 = 0x1
|
||||
BUTTON2 = 0x2
|
||||
BUTTON3 = 0x4
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(SInt32Be)
|
||||
|
||||
class Encoding(object):
|
||||
"""
|
||||
Encoding types of FrameBuffer update
|
||||
"""
|
||||
RAW = 0
|
||||
|
||||
@ConstAttributes
|
||||
@TypeAttributes(UInt8)
|
||||
class ClientToServerMessages(object):
|
||||
"""
|
||||
Client to server messages types
|
||||
@@ -179,18 +168,24 @@ class RFB(RawLayer):
|
||||
"""
|
||||
Implement RFB protocol
|
||||
"""
|
||||
def __init__(self, mode, controller):
|
||||
def __init__(self, listener):
|
||||
"""
|
||||
@param mode: LayerMode client or server
|
||||
@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)
|
||||
#useful for RFB protocol
|
||||
self._callbackBody = None
|
||||
#protocol version negotiated
|
||||
self._version = ProtocolVersion.RFB003008
|
||||
self._version = String(ProtocolVersion.RFB003008)
|
||||
#number security launch by server
|
||||
self._securityLevel = SecurityType.INVALID
|
||||
self._securityLevel = UInt8(SecurityType.INVALID)
|
||||
#shared FrameBuffer client init message
|
||||
self._sharedFlag = UInt8(False)
|
||||
#server init message
|
||||
@@ -205,7 +200,9 @@ class RFB(RawLayer):
|
||||
#current rectangle header
|
||||
self._currentRect = Rectangle()
|
||||
#client or server adaptor
|
||||
self._controller = controller
|
||||
self._listener = listener
|
||||
#ready to send events
|
||||
self._ready = False
|
||||
|
||||
def expectWithHeader(self, expectedHeaderLen, callbackBody):
|
||||
"""
|
||||
@@ -255,8 +252,8 @@ class RFB(RawLayer):
|
||||
@param data: Stream may contain protocol version string (ProtocolVersion)
|
||||
"""
|
||||
data.readType(self._version)
|
||||
if not self._version in [ProtocolVersion.RFB003003, ProtocolVersion.RFB003007, ProtocolVersion.RFB003008]:
|
||||
self._version = ProtocolVersion.UNKNOWN
|
||||
if not self._version.value in [ProtocolVersion.RFB003003, ProtocolVersion.RFB003007, ProtocolVersion.RFB003008]:
|
||||
self._version.value = ProtocolVersion.UNKNOWN
|
||||
|
||||
def recvProtocolVersion(self, data):
|
||||
"""
|
||||
@@ -266,15 +263,15 @@ class RFB(RawLayer):
|
||||
@param data: Stream
|
||||
"""
|
||||
self.readProtocolVersion(data)
|
||||
if self._version == ProtocolVersion.UNKNOWN:
|
||||
if self._version.value == ProtocolVersion.UNKNOWN:
|
||||
print "Unknown protocol version %s send 003.008"%data.getvalue()
|
||||
#protocol version is unknown try best version we can handle
|
||||
self._version = ProtocolVersion.RFB003008
|
||||
self._version.value = ProtocolVersion.RFB003008
|
||||
#send same version of
|
||||
self.send(self._version)
|
||||
|
||||
#next state read security
|
||||
if self._version == ProtocolVersion.RFB003003:
|
||||
if self._version.value == ProtocolVersion.RFB003003:
|
||||
self.expect(4, self.recvSecurityServer)
|
||||
else:
|
||||
self.expectWithHeader(1, self.recvSecurityList)
|
||||
@@ -300,7 +297,7 @@ class RFB(RawLayer):
|
||||
securityList.append(securityElement)
|
||||
#select high security level
|
||||
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
|
||||
break
|
||||
#send back security level choosen
|
||||
@@ -317,7 +314,7 @@ class RFB(RawLayer):
|
||||
data.readType(result)
|
||||
if result == UInt32Be(1):
|
||||
print "Authentification failed"
|
||||
if self._version == ProtocolVersion.RFB003008:
|
||||
if self._version.value == ProtocolVersion.RFB003008:
|
||||
self.expectWithHeader(4, self.recvSecurityFailed)
|
||||
else:
|
||||
print "Authentification OK"
|
||||
@@ -352,6 +349,9 @@ class RFB(RawLayer):
|
||||
self.sendSetEncoding()
|
||||
#request entire zone
|
||||
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)
|
||||
|
||||
def recvServerOrder(self, data):
|
||||
@@ -382,7 +382,7 @@ class RFB(RawLayer):
|
||||
@param data: Stream that contains well formed packet
|
||||
"""
|
||||
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)
|
||||
|
||||
def recvRectBody(self, data):
|
||||
@@ -390,7 +390,7 @@ class RFB(RawLayer):
|
||||
Read body of rectangle update
|
||||
@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
|
||||
#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
|
||||
@param pixelFormat: PixelFormat struct
|
||||
"""
|
||||
self.send((ClientToServerMessages.PIXEL_FORMAT, UInt16Be(), UInt8(), pixelFormat))
|
||||
self.send((UInt8(ClientToServerMessages.PIXEL_FORMAT), UInt16Be(), UInt8(), pixelFormat))
|
||||
|
||||
def sendSetEncoding(self):
|
||||
"""
|
||||
Send set encoding packet
|
||||
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):
|
||||
"""
|
||||
Request server the specified zone
|
||||
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):
|
||||
"""
|
||||
Write key event packet
|
||||
@param keyEvent: KeyEvent struct to send
|
||||
"""
|
||||
self.send((ClientToServerMessages.KEY_EVENT, keyEvent))
|
||||
self.send((UInt8(ClientToServerMessages.KEY_EVENT), keyEvent))
|
||||
|
||||
def sendPointerEvent(self, pointerEvent):
|
||||
"""
|
||||
Write pointer event packet
|
||||
@param pointerEvent: PointerEvent struct use
|
||||
"""
|
||||
self.send((ClientToServerMessages.POINTER_EVENT, pointerEvent))
|
||||
self.send((UInt8(ClientToServerMessages.POINTER_EVENT), pointerEvent))
|
||||
|
||||
def sendClientCutText(self, text):
|
||||
"""
|
||||
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
|
||||
"""
|
||||
@@ -460,7 +475,7 @@ class RFBController(object):
|
||||
"""
|
||||
self._clientObservers = []
|
||||
#rfb layer to send client orders
|
||||
self._rfbLayer = RFB(mode, self)
|
||||
self._rfbLayer = RFB(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 key: ASCII code of key
|
||||
"""
|
||||
if not self._rfbLayer._ready:
|
||||
print "Try to send key event on non ready layer"
|
||||
return
|
||||
try:
|
||||
event = KeyEvent()
|
||||
event.downFlag.value = isDown
|
||||
@@ -509,6 +527,9 @@ class RFBController(object):
|
||||
@param x: x coordinate 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:
|
||||
event = PointerEvent()
|
||||
event.mask.value = mask
|
||||
|
||||
Reference in New Issue
Block a user