o
    àý°j2Œ ã                   @   sF  d dl mZ d dl mZ d dlZd dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZmZ d dlmZ d dlmZmZmZ d dlmZ d d	lmZ G d
d„ dƒZdZdZdZdZdZG dd„ deƒZ G dd„ de ƒZ!G dd„ de ƒZ"G dd„ de ƒZ#G dd„ de$ƒZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-d Z.d!Z/d Z0dZ1d"Z2dZ3d Z4dZ5dZ6dZ7d"Z8d!Z9de9 Z:dZ;d Z<dZ=d#Z>d$Z?d%Z@d&ZAd'ZBd(ZCd)ZDd*ZEd+ZFd,ZGd-ZHd.ZId/ZJd*ZKe>e?e@fZLd0d1„ ZMd2ZNdZOdZPd3ZQd4ZRd5ZSd6ZTd7ZUd8ZVd9ZWd:ZXd;ZYd<ZZd=Z[d>Z\d?Z]d@Z^dAZ_dBZ`dCZadDZbdEZcdFZddZedGZfd9ZgdHZhdZidZjdZkdZldIZmdZndZod"ZpdJZqdGZrdKZsdLZtdMZudNZvdOZwdPZxdQZydRZzdSZ{dTZ|dUZ}dVZ~dWZdXZ€dYZ�dZZ‚d[Zƒd\Z„d]Z…d^Z†d_Z‡d`ZˆdaZ‰dbZŠdcZ‹ddZŒdeZ�dfZŽdgZ�dhZ�diZ‘d6Z’djZ“d>Z”dkZ•dlZ–dmZ—dnZ˜doZ™dpZšdqZ›drZœdsZ�G dtdu„ dueƒZžG dvdw„ dweƒZŸG dxdy„ dyeƒZ G dzd{„ d{eƒZ¡G d|d}„ d}eƒZ¢G d~d„ deƒZ£G d€d�„ d�eƒZ¤G d‚dƒ„ dƒeƒZ¥G d„d…„ d…eƒZ¦G d†d‡„ d‡eƒZ§G dˆd‰„ d‰eƒZ¨G dŠd‹„ d‹eƒZ©G dŒd�„ d�eƒZªG dŽd�„ d�eƒZ«G d�d‘„ d‘eƒZ¬G d’d“„ d“eƒZ­G d”d•„ d•eƒZ®G d–d—„ d—eƒZ¯G d˜d™„ d™ƒZ°dS )šé    )Údivision)Úprint_functionN)Úmd5)ÚDecimalÚ
getcontext)Úuuid4)ÚntlmÚuuidÚLOG)Ú	Structure)ÚMSSQL_VERSIONc                   @   s   e Zd Zdd„ ZdS )Ú
DummyPrintc                 C   s6   |dkr
t |ƒ d S |dkrt ƒ  d S t |dd� d S )NÚ
úú )Úend)Úprint)ÚselfÚmessage© r   ú/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/tds.pyÚ
logMessage>   s
   
zDummyPrint.logMessageN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   =   s    r   iš  é   é   é   é   c                   @   ó   e Zd ZdZdS )ÚSQLR))ÚOpCodeÚBN)r   r   r   Ú	commonHdrr   r   r   r   r    O   ó    r    c                   @   ó   e Zd ZdZddd„ZdS )ÚSQLR_UCAST_INST©ÚInstanceú:Nc                 C   ó$   t  | |¡ |d urt| d< d S d S ©Nr!   )r    Ú__init__ÚSQLR_CLNT_UCAST_INST©r   Údatar   r   r   r,   V   ó   ÿzSQLR_UCAST_INST.__init__©N©r   r   r   Ú	structurer,   r   r   r   r   r&   S   s    r&   c                   @   r%   )ÚSQLR_UCAST_DAC))ÚProtocolzB=1r'   Nc                 C   r*   r+   )r    r,   ÚSQLR_CLNT_UCAST_DACr.   r   r   r   r,   b   r0   zSQLR_UCAST_DAC.__init__r1   r2   r   r   r   r   r4   \   s    r4   c                   @   r   )ÚSQLR_Response))ÚSizeú<H)Ú_Dataú_-Datazself["Size"]©ÚDatar)   N©r   r   r   r3   r   r   r   r   r7   h   r$   r7   c                   @   s   e Zd ZdS )ÚSQLErrorExceptionN)r   r   r   r   r   r   r   r?   p   s    r?   é   é   é   é   é   é   é   é   ép   éq   iq  ir	 is
 is it  i   i  qi 	ri 
si si  tc                 C   s   | t vS r1   )ÚTDS_LEGACY_LOGIN7_VERSIONS)Útds_versionr   r   r   Ú login7_uses_72_plus_token_layout¯   s   rL   é€   éˆ   éÓ   é�   é¥   éý   éþ   éÿ   éã   éª   é®   é«   é­   éÒ   éx   é©   éy   é¬   éÑ   éí   é¤   é
   ó   é   é	   é   é   é0   é2   é4   é8   é:   é;   é<   é=   é>   éz   é   é$   é&   é7   é?   éh   éj   él   ém   én   éo   é(   é)   é*   é+   é/   é'   é-   é%   é§   é¯   éç   éï   éñ   éð   é#   é"   éc   éb   c                   @   r   )Ú	TDSPacket)©ÚTypeú<B)ÚStatusz<B=1)ÚLengthz>H=8+len(Data))ÚSPIDz>H=0)ÚPacketIDú<B=0)ÚWindowr—   r<   Nr>   r   r   r   r   r�     r$   r�   c                   @   s   e Zd ZdZdd„ ZdS )ÚTDS_PRELOGIN))ÚVersionTokenz>B=0)ÚVersionOffsetú>H)ÚVersionLengthz>H=len(self["Version"]))ÚEncryptionTokenz>B=0x1)ÚEncryptionOffsetrœ   )ÚEncryptionLengthz>H=1)ÚInstanceTokenz>B=2)ÚInstanceOffsetrœ   )ÚInstanceLengthz>H=len(self["Instance"]))ÚThreadIDTokenz>B=3)ÚThreadIDOffsetrœ   )ÚThreadIDLengthz>H=4)ÚEndTokenz>B=0xff)Ú_Versionz	_-Versionzself["VersionLength"])ÚVersionr)   )Ú
Encryptionr"   )Ú	_Instancez
_-Instancezself["InstanceLength"]-1r'   )ÚThreadIDr)   c                 C   sR   d| d< | d t | d ƒ | d< | d d | d< | d t | d ƒ | d< t | ¡S )	Né   r›   r©   rŸ   r@   r¢   r(   r¥   )Úlenr   ÚgetData©r   r   r   r   r¯   3  s
   
zTDS_PRELOGIN.getDataN)r   r   r   r3   r¯   r   r   r   r   r™     s    r™   c                   @   sB   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )Ú	TDS_LOGIN)3)r”   ú<L=0)Ú
TDSVersionz>L=0x71)Ú
PacketSizez<L=32764)ÚClientProgVerz>L=7)Ú	ClientPIDr²   )ÚConnectionIDr²   )ÚOptionFlags1z<B=0xe0)ÚOptionFlags2r’   )Ú	TypeFlagsr—   )ÚOptionFlags3r—   )ÚClientTimeZoner²   )Ú
ClientLCIDr²   )ÚHostNameOffsetr9   )ÚHostNameLengthz<H=len(self["HostName"])//2)ÚUserNameOffsetú<H=0)ÚUserNameLengthz<H=len(self["UserName"])//2)ÚPasswordOffsetrÁ   )ÚPasswordLengthz<H=len(self["Password"])//2)ÚAppNameOffsetr9   )ÚAppNameLengthz<H=len(self["AppName"])//2)ÚServerNameOffsetr9   )ÚServerNameLengthz<H=len(self["ServerName"])//2)ÚExtensionOffsetrÁ   )ÚExtensionLengthrÁ   )ÚCltIntNameOffsetr9   )ÚCltIntNameLengthz<H=len(self["CltIntName"])//2)ÚLanguageOffsetrÁ   )ÚLanguageLengthz<H=len(self["Language"])//2)ÚDatabaseOffsetrÁ   )ÚDatabaseLengthz<H=len(self["Database"])//2)ÚClientIDz6s=b"")Ú
SSPIOffsetr9   )Ú
SSPILengthz!<H=min(len(self["SSPI"]), 0xFFFF))ÚAtchDBFileOffsetr9   )ÚAtchDBFileLengthz<H=len(self["AtchDBFile"])//2)ÚChangePasswordOffsetrÁ   )ÚChangePasswordLengthz!<H=len(self["ChangePassword"])//2)ÚSSPILongLengthr²   )ÚHostNamer)   )ÚUserNamer)   )ÚPasswordr)   )ÚAppNamer)   ©Ú
ServerNamer)   )ÚExtensionOffsetDatar)   )Ú
CltIntNamer)   )ÚLanguager)   )ÚDatabaser)   )ÚSSPIr)   )Ú
AtchDBFiler)   )ÚChangePasswordr)   )ÚFeatureExtDatar)   Nc                 C   s”   t  | |¡ |d u rHd| d< d| d< d| d< d| d< d| d< d| d< d| d	< d
| d< d
| d< d| d< d| d< d| d< d| d< d| d< d| d< d S d S )Nó    rÙ   Ú rÚ   rÛ   rÜ   rÞ   rà   rã   r   r¹   r»   rá   râ   rä   rå   rß   ræ   )r   r,   r.   r   r   r   r,   r  s$   ñzTDS_LOGIN.__init__c                 C   s   | j  dt¡}|tkS )Nr³   )ÚfieldsÚgetÚTDS_LOGIN7_VERSION_71ÚTDS_LOGIN7_VERSION_74©r   rK   r   r   r   Ú_uses_74_plus_layout…  s   zTDS_LOGIN._uses_74_plus_layoutc                 C   s   t  d|t|ƒ¡| S )Nz<BL)ÚstructÚpackr®   )r   Ú
feature_idÚpayloadr   r   r   Ú_pack_feature_ext‹  s   zTDS_LOGIN._pack_feature_extc                 C   s   dS )Nrç   r   r°   r   r   r   Ú_build_feature_extŽ  s   zTDS_LOGIN._build_feature_extc                 C   s¨  t  | |¡ | d dkr|| d d … d | d d … | d< | d dkr6|| d d … d | d d … | d< | d	 dkrN|| d
 d … d | d	 d … | d< | d dkrf|| d d … d | d d … | d< | d dkr~|| d d … d | d d … | d< | d dkr–|| d d … d | d d … | d< | d dkr®|| d d … d | d d … | d< | d dkrÆ|| d d … d | d d … | d< | d dkrâ| d pÓ| d }|| d d … d |… | d< | d dkrú|| d  d … d | d d … | d!< | d" dk�r|| d# d … d | d" d … | d$< | d% d&k�rN| d' d& t|ƒk�rP|| d' | d' d& … | d(< t d)| d( ¡d }|t|ƒk �rR||d … | d*< d S d S d S d S )+Nr¿   r   r¾   r   rÙ   rÂ   rÀ   rÚ   rÄ   rÃ   rÛ   rÆ   rÅ   rÜ   rÈ   rÇ   rÞ   rÌ   rË   rà   rÎ   rÍ   rá   rÐ   rÏ   râ   rÓ   rØ   rÒ   rã   rÕ   rÔ   rä   r×   rÖ   rå   rÊ   r   rÉ   rß   ú<Lræ   )r   Ú
fromStringr®   rï   Úunpack)r   r/   Ússpi_lenÚfeature_ext_offsetr   r   r   rö   ‘  sf   ÿÿÿ$ÿÿÿÿÿÿ$ÿúzTDS_LOGIN.fromStringc                 C   sB  |   ¡ }|r
|  ¡ nd}t|ƒ}d}|| d< |t| d ƒ7 }| d dkr)|| d< nd| d< |t| d ƒ7 }| d	 dkr@|| d
< nd| d
< |t| d	 ƒ7 }|| d< | d t| d ƒ }|| d< |t| d ƒ7 }|r–| j dd¡dB | d< || d< |r{|nd| d< |rƒdnd| d< |r•| d  dO  < |d7 }nd| d< d| d< d| d< d| d< | j dd¡d@ | d< || d< |t| d ƒ7 }|| d< |t| d ƒ7 }|| d< |t| d ƒ7 }|| d< |t| d ƒ7 }|| d < |t| d! ƒ7 }|| d"< |t| d# ƒ7 }|�rt d$|¡| d< nd| d< t| d ƒd%k�rt| d ƒnd| d&< t 	| ¡S )'Nrç   é^   r¾   rÙ   rÚ   rè   rÀ   r   rÛ   rÃ   rÅ   rÜ   rÇ   rÞ   r»   rG   ræ   rÉ   r   rÊ   rD   rß   iïÿÿÿrË   rà   rÍ   rá   rÏ   râ   rÒ   rã   rÔ   rä   rÖ   rå   rõ   éÿÿ  rØ   )
rî   rô   Úboolr®   ré   rê   rï   rð   r   r¯   )r   Úuses_74_plus_layoutÚfeature_ext_dataÚhas_feature_extÚindexr   r   r   r¯   Ï  sb   

€&
zTDS_LOGIN.getDatar1   )
r   r   r   r3   r,   rî   ró   rô   rö   r¯   r   r   r   r   r±   ;  s    
6>r±   c                   @   r   )ÚTDS_LOGIN_ACK)©Ú	TokenTyper’   ©r”   r9   )Ú	Interfacer’   )r³   z>L)ÚProgNameLenr’   )Ú_ProgNameLenz
_-ProgNamezself["ProgNameLen"]*2)ÚProgNamer)   )ÚMajorVerr’   )ÚMinorVerr’   )Ú
BuildNumHir’   )ÚBuildNumLowr’   Nr>   r   r   r   r   r    r$   r  c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )ÚTDS_FEATUREEXTACKr   Nc                 C   s\   t  | ¡ t| d< g | d< i | d< d | d< d | d< d | d< d | d< |d ur,|  |¡ d S d S )Nr  ÚFeaturesÚFeatureAckDataÚFedAuthÚFedAuthNonceÚFedAuthSignatureÚUTF8Support)r   r,   ÚTDS_FEATUREEXTACK_TOKENrö   r.   r   r   r   r,   )  s   
ÿzTDS_FEATUREEXTACK.__init__c           	      C   sÎ  t |ƒdk r
tdƒ‚t d|d d… ¡d }|tkr td| ƒ‚d}g }i }d | d< d | d< d | d< d | d	< 	 |t |ƒkrAtdƒ‚t d|||d … ¡d }|d7 }|tkrXns|d t |ƒkrdtdƒ‚t d|||d … ¡d }|d7 }|| t |ƒkr‚tdƒ‚|||| … }||7 }| ||f¡ |||< |tkrº|| d< |dkr­|d d… | d< |dkr¹|dd… | d< n|tkrÊ|dkrÊ|d dk| d	< q7|| d< || d< || d< |d |… | _	|d |… | _
| S )Nr@   zTruncated FEATUREEXTACK tokenr’   r   z%Invalid FEATUREEXTACK token type 0x%xr  r  r  r  Tz Unterminated FEATUREEXTACK tokenr   zTruncated FEATUREEXTACK lengthrõ   zTruncated FEATUREEXTACK payloadé    é@   r  r  r  )r®   Ú	Exceptionrï   r÷   r  ÚTDS_FEATURE_EXT_TERMINATORÚappendÚTDS_FEATURE_EXT_FEDAUTHÚTDS_FEATURE_EXT_UTF8_SUPPORTr/   ÚrawData)	r   r/   Ú
token_typeÚoffsetÚfeaturesÚfeature_ack_datarñ   Úfeature_lenÚfeature_datar   r   r   rö   6  sZ   €à"zTDS_FEATUREEXTACK.fromStringr1   )r   r   r   r3   r,   rö   r   r   r   r   r  &  s    
r  c                   @   r   )ÚTDS_RETURNSTATUS)r  )ÚValuerõ   Nr>   r   r   r   r   r#  r  r$   r#  c                   @   r   )ÚTDS_INFO_ERROR)r  )r”   zH<H=12+len(self["MsgText"])+len(self["ServerName"])+len(self["ProcName"])©ÚNumberrõ   ©ÚStater’   ©ÚClassr’   ©Ú
MsgTextLenr9   ©Ú_MsgTextLenz	_-MsgTextzself["MsgTextLen"]*2©ÚMsgTextr)   ©ÚServerNameLenr’   ©Ú_ServerNameLenz_-ServerNamezself["ServerNameLen"]*2rÝ   ©ÚProcNameLenr’   ©Ú_ProcNameLenz
_-ProcNamezself["ProcNameLen"]*2©ÚProcNamer)   )Ú
LineNumberr9   Nr>   r   r   r   r   r%  y  r$   r%  c                   @   r   )ÚTDS_INFO_ERROR72)r  )r”   zH<H=14+len(self["MsgText"])+len(self["ServerName"])+len(self["ProcName"])r&  r(  r*  r,  r.  r0  r2  r4  rÝ   r6  r8  r:  )r<  rõ   Nr>   r   r   r   r   r=  �  r$   r=  c                   @   r   )ÚTDS_ENVCHANGE)r  )r”   z<H=4+len(Data)r�   )r:   r;   zself["Length"]-1r<   Nr>   r   r   r   r   r>  ¡  r$   r>  c                   @   r   )ÚTDS_DONEINPROC©r  ©r“   r9   ©ÚCurCmdr9   )ÚDoneRowCountrõ   Nr>   r   r   r   r   r?  «  r$   r?  c                   @   r   )ÚTDS_DONEINPROC72©r  rA  rB  )rD  ú<QNr>   r   r   r   r   rE  ´  r$   rE  c                   @   r   )Ú	TDS_ORDER)r  r  )r:   r;   zself["Length"]r<   Nr>   r   r   r   r   rH  ½  r$   rH  c                   @   r   )ÚTDS_ENVCHANGE_VARCHAR))ÚNewValueLenz<B=len(NewValue))Ú	_NewValuez
_-NewValuezself["NewValueLen"]*2)ÚNewValuer)   )ÚOldValueLenz<B=len(OldValue))Ú	_OldValuez
_-OldValuezself["OldValueLen"]*2)ÚOldValuer)   Nr>   r   r   r   r   rI  Æ  r$   rI  c                   @   r   )ÚTDS_ROW)r  r<   Nr>   r   r   r   r   rP  Ñ  r$   rP  c                   @   r   )ÚTDS_DONEr@  Nr>   r   r   r   r   rQ  Ø  r$   rQ  c                   @   r   )Ú
TDS_DONE72rF  Nr>   r   r   r   r   rR  á  r$   rR  c                   @   r   )ÚTDS_COLMETADATA)r  )ÚCountr9   r<   Nr>   r   r   r   r   rS  ê  r$   rS  c                   @   s.   e Zd ZdZdZd
dd„Zdd„ Zdd	„ ZdS )ÚTDS_SSVARIANTaP  
    SQL Server Variant Type Structure.

    As defined in [MS-TDS] 2.2.5.5.4 sql_variant Values:

    The SSVARIANTTYPE is a special data type that acts as a place holder for other data types.
    When a SSVARIANTTYPE is filled with a data value, it takes on properties of the base data
    type that represents the data value.

    Structure Definition:
        VARIANT_BASETYPE    = BYTE      ; data type definition
        VARIANT_PROPBYTES   = BYTE      ; see below
        VARIANT_PROPERTIES  = *BYTE     ; see below
        VARIANT_DATAVAL     = 1*BYTE    ; actual data value

        SSVARIANT_INSTANCE  = VARIANT_BASETYPE
                              VARIANT_PROPBYTES
                              VARIANT_PROPERTIES
                              VARIANT_DATAVAL

    VARIANT_PROPBYTES and VARIANT_PROPERTIES by VARIANT_BASETYPE:

    | VARIANT_BASETYPE                     | VARIANT_PROPBYTES | VARIANT_PROPERTIES                    |
    |--------------------------------------|-------------------|---------------------------------------|
    | GUIDTYPE, BITTYPE,                   | 0                 | <not specified>                       |
    | INT1TYPE, INT2TYPE,                  |                   |                                       |
    | INT4TYPE, INT8TYPE,                  |                   |                                       |
    | DATETIMETYPE, DATETIM4TYPE,          |                   |                                       |
    | FLT4TYPE, FLT8TYPE,                  |                   |                                       |
    | MONEYTYPE, MONEY4TYPE,               |                   |                                       |
    | DATENTYPE                            |                   |                                       |
    |--------------------------------------|-------------------|---------------------------------------|
    | TIMENTYPE,                           | 1                 | 1 byte specifying scale               |
    | DATETIME2NTYPE,                      |                   |                                       |
    | DATETIMEOFFSETNTYPE                  |                   |                                       |
    |--------------------------------------|-------------------|---------------------------------------|
    | BIGVARBINARYTYPE,                    | 2                 | 2 bytes specifying max length         |
    | BIGBINARYTYPE                        |                   |                                       |
    |--------------------------------------|-------------------|---------------------------------------|
    | NUMERICNTYPE,                        | 2                 | 1 byte for precision followed by      |
    | DECIMALNTYPE                         |                   | 1 byte for scale                      |
    |--------------------------------------|-------------------|---------------------------------------|
    | BIGVARCHARTYPE, BIGCHARTYPE,         | 7                 | 5-byte COLLATION, followed by a       |
    | NVARCHARTYPE, NCHARTYPE              |                   | 2-byte max length                     |
    |--------------------------------------|-------------------|---------------------------------------|

    Note: Data types cannot be NULL when inside a sql_variant. If the value is NULL,
    the sql_variant itself has to be NULL (TotalLength = 0).
    ))ÚTotalLengthr²   r<   Nc                 C   s(   t  | |¡ d | _d | _d | _d | _d S r1   )r   r,   ÚbaseTypeÚ	propBytesÚ
propertiesÚvaluer.   r   r   r   r,   *  s
   
zTDS_SSVARIANT.__init__c                 C   sº   | d dkrdS | d }t  d|dd… ¡d | _|dd… }t  d|dd… ¡d | _|dd… }|d| j… | _|| jd… }| d d | j }|d|… }|  | j|| j¡| _| jS )	z¼
        Parse the sql_variant data and extract the base type, properties, and value.

        Returns:
            Parsed value in its appropriate Python type, or 'NULL' if empty
        rV  r   ÚNULLr=   r’   Nr@   r   )rï   r÷   rW  rX  rY  Ú_parseValuerZ  )r   r/   Ú
dataLengthÚ	valueDatar   r   r   Úparse1  s   zTDS_SSVARIANT.parsec              
   C   s~  �z|t krt d|dd… ¡d W S |tkr$t d|dd… ¡d W S |tkr5t d|dd… ¡d W S |tkrFt d	|dd
… ¡d W S |tkrWt d|dd… ¡d W S |tkrht d|dd… ¡d W S |tkryt d|dd
… ¡d W S |t	t
fv r…| d¡W S |ttttfv r¤z| d¡W W S  ty£   | d¡ Y W S w |ttttfv rµt |¡ d¡W S |tkrÎt d|dd… ¡d }t|ƒtdƒ W S |tkrít d|dd
… ¡\}}|d> | }t|ƒtdƒ W S |tkr÷t |¡W S |tk�rCt d|dd… ¡d }t d|dd
… ¡d }t ddd¡}	tj  |	 !¡ | ¡}t"|d dƒ\}
}t"|dƒ\}}t |j#|j$|j%|
||¡W S |t&k�r†t d|dd… ¡d }t d|dd… ¡d }t ddd¡}	tj  |	 !¡ | ¡}t"|dƒ\}
}t |j#|j$|j%|
|d¡W S |t'k�rªt(|ƒdk �r•W dS t d|dd… d ¡d }tj  |¡W S |t)k�r.t(|ƒdk�rº|d nd}t(|ƒ}|dk�rÔt d|dd… d ¡d }n-|dk�ræt d|dd… ¡d }n|dk�rút d|dd… d  ¡d }nd!|› d"�W S d#| }|| }t*|d ƒ}
t*|d d ƒ}t*|d ƒ}t*|d d$ ƒ}t +|
|||¡W S |t,k�rÝt(|ƒdk�r>|d nd}|dk�rGdn|dk�rNdnd}t(|ƒ|d k �r\W dS |dk�rpt d|dd… d ¡d }n |dk�r‚t d|dd… ¡d }nt d|dd… d  ¡d }||d… }t d|dd… d ¡d }d#| }|| }t*|d ƒ}
t*|d d ƒ}t*|d ƒ}t*|d d$ ƒ}tj  |¡}t |j#|j$|j%|
|||¡W S |t-k�r­t(|ƒdk�rí|d nd}|dk�rödn|dk�rýdnd}t(|ƒ|d k �rW dS |dk�rt d|dd… d ¡d }n |dk�r1t d|dd… ¡d }nt d|dd… d  ¡d }||d… }t d|dd… d ¡d }|dd… }t d|dd… ¡d }d#| }|| }t*|d ƒ}
t*|d d ƒ}t*|d ƒ}t*|d d$ ƒ}tj  |¡}t |j#|j$|j%|
|||¡}t .tj/|d%�¡}|j0|d&�W S |t1t2fv �rt(|ƒdk�r¿|d nd}t(|ƒdk�rÌ|d nd}t(|ƒdk�rØW dS |d dk�rádnd'}|dd… }t*j3|d(d)d*�}|t4ƒ _5t|ƒ}|�r|td#ƒ|  }|dk �r| }|W S d+t |¡ d¡› �W S  t6�y> } zd,t7|ƒ› d-t |¡ d¡› d"�W  Y d}~S d}~ww ).aŒ  
        Parse the value based on the base type following MS-TDS 2.2.5.5.4.

        Args:
            baseType: The SQL Server base type identifier (VARIANT_BASETYPE)
            data: The raw data bytes containing the value (VARIANT_DATAVAL)
            properties: Type-specific property bytes (VARIANT_PROPERTIES)

        Returns:
            Parsed value in appropriate Python type
        r’   Nr@   r   ú<hr   ú<lr   ú<qrG   ú<fú<dúutf-16leúutf-8úlatin-1Úasciié'  ú<lLr  rõ   él  é,  é  rn   r9   r   r[  ó    rB   rd   rG  s      z<unsupported time bytes: ú>rb   i@B )Úminutes)ÚtzinfoéÿÿÿÿÚlittleF©Ú	byteorderÚsignedÚ0xz<parse_error: z, hex: )8ÚTDS_INT1TYPErï   r÷   ÚTDS_INT2TYPEÚTDS_INT4TYPEÚTDS_INT8TYPEÚTDS_BITTYPEÚTDS_FLT4TYPEÚTDS_FLT8TYPEÚTDS_NVARCHARTYPEÚTDS_NCHARTYPEÚdecodeÚTDS_VARCHARTYPEÚTDS_CHARTYPEÚTDS_BIGVARCHRTYPEÚTDS_BIGCHARTYPEÚUnicodeDecodeErrorÚTDS_VARBINARYTYPEÚTDS_BINARYTYPEÚTDS_BIGVARBINTYPEÚTDS_BIGBINARYTYPEÚbinasciiÚb2a_hexÚTDS_MONEY4TYPEr   ÚTDS_MONEYTYPEÚTDS_GUIDTYPEr	   Úbin_to_stringÚTDS_DATETIMETYPEÚdatetimeÚdateÚfromordinalÚ	toordinalÚdivmodÚyearÚmonthÚdayÚTDS_DATETIM4TYPEÚTDS_DATENTYPEr®   ÚTDS_TIMENTYPEÚintÚtimeÚTDS_DATETIME2NTYPEÚTDS_DATETIMEOFFSETNTYPEÚtimezoneÚ	timedeltaÚreplaceÚTDS_NUMERICNTYPEÚTDS_DECIMALNTYPEÚ
from_bytesr   Úprecr  Ústr)r   rW  r/   rY  rZ  ÚhighÚlowÚ	dateValueÚ	timeValueÚbaseDateÚhoursÚmodrp  ÚsecondÚscaleÚ	timeBytesÚdivisorÚsecondsÚsecsÚ	microsecsÚdate_objÚoffsetMinutesÚdtÚtzÚ	precisionÚsignÚnumBytesÚnumberÚer   r   r   r\  Q  sT  üÿü
ú
	ÿ





 

ù

 

ù
.€þzTDS_SSVARIANT._parseValuer1   )r   r   r   Ú__doc__r3   r,   r_  r\  r   r   r   r   rU  ò  s    2
 rU  c                   @   sþ  e Zd Zddddeƒ fdedefdd„Zdmdd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdndd„Zdodd„Zd d!„ Zd"d#„ Zd$d%„ Zdpd'd(„Zd)d*„ Zd+d,„ Zdqd.d/„Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Zd>d?„ Ze d@dA„ ƒZ!dBdC„ Z"			-		-	-	-	D	-drdEdF„Z#			-		-dsdGdH„Z$dIdJ„ Z%dKdL„ Z&dMdN„ Z'e(j)e(j*fdOdP„Z+dndQdR„Z,dSdT„ Z-dtdUdV„Z.dndWdX„Z/dYdZ„ Z0d[d\„ Z1d]d^„ Z2dtd_d`„Z3dndadb„Z4e3Z5dcdd„ Z6dtdedf„Z7dudgdh„Z8e9didj„ ƒZ:e9dkdl„ ƒZ;d-S )vÚMSSQLi™  rè   Úworkstation_idÚapplication_namec                 C   s¬   d| _ || _|| _|| _d| _i | _g | _g | _d| _d| _	d| _
d| _d | _d | _d| _d | _d | _d| _t| _|| _d| _|pMdtƒ jd d	…  ¡ › �| _|pRd
| _d S )Niû  r   rè   z  rT   Frç   zDESKTOP-rG   z.Microsoft SQL Server Management Studio - Query)Ú
packetSizeÚserverÚ
remoteNameÚportÚsocketÚrepliesÚcolMetaÚrowsÚ	currentDBÚCOL_SEPARATORÚMAX_COL_LENÚ	lastErrorÚ	tlsSocketÚ
tls_uniqueÚtds8Úin_bioÚout_bioÚ_recv_bufferrë   Úlogin_tds_versionÚ_MSSQL__rowsPrinterÚmssql_versionr   ÚhexÚupperÚ_workstation_idÚ_application_name)r   ÚaddressrÇ  rÆ  rÂ  rÃ  ÚrowsPrinterr   r   r   r,   \  s0   
 ÿzMSSQL.__init__rd   c                 C   s  t ƒ }t|d< t | jtdtj¡d \}}}}}t |||¡}| | ¡ d| jtf¡ t	 	| 
¡ gg g |¡\}	}
}
|	s=g S | dd¡\}}
| ¡  t|ƒ}|d  d¡}| ¡  g }t|ƒD ]-\}}| d¡}i }t|ƒD ]\}}|d@ dkr…||d   d¡|| d¡< qm| |¡ q^|S )	Nr!   r   i   r=   s   ;;ó   ;r@   rf  )r    ÚSQLR_CLNT_UCAST_EXrÈ  ÚgetaddrinforÅ  Ú	SQLR_PORTÚ
SOCK_DGRAMÚsendtor¯   ÚselectÚfilenoÚrecvfromÚcloser7   ÚsplitÚpopÚ	enumerater�  r  )r   ÚtimeoutÚpacketÚafÚsocktypeÚprotoÚ	canonnameÚsaÚsÚreadyÚ_r/   ÚrespÚentriesÚiÚentryré   ÚretÚjÚfieldr   r   r   ÚgetInstancesƒ  s6   ÿþ
€zMSSQL.getInstancesc                 C   sn   t ƒ }d|d< t|d< t dt dd¡¡|d< d|d	< |  t| ¡ d¡ |  	¡ }t |d
 ƒ}t
|d ƒ| _|S )Ns    U  r©   rª   rõ   r   rû   r¬   s   MSSQLServer r(   r=   )r™   ÚTDS_ENCRYPT_OFFrï   rð   ÚrandomÚrandintÚsendTDSÚTDS_PRE_LOGINr¯   ÚrecvTDSr   rØ  )r   ÚpreloginÚtdsÚresponser   r   r   ÚpreLogin«  s   zMSSQL.preLoginc                 C   s   t tdd„ t|ƒD ƒƒƒS )Nc                 S   s(   g | ]}|d @ d> |d@ d?  dA ‘qS )r   r   rŠ   rQ   r   )Ú.0Úxr   r   r   Ú
<listcomp>Á  s    ÿÿz)MSSQL.encryptPassword.<locals>.<listcomp>)ÚbytesÚ	bytearray)r   Úpasswordr   r   r   ÚencryptPassword¾  s   þÿÿzMSSQL.encryptPasswordc                 C   s.   d | _ d | _d| _d | _d | _d| _t| _d S )NFrç   )rÐ  rÑ  rÒ  rÓ  rÔ  rÕ  rë   rÖ  r°   r   r   r   Ú_reset_tls_stateÈ  s   
zMSSQL._reset_tls_statec                 C   s   | j d uo| jp| jd uS r1   )rÑ  rÒ  rÐ  r°   r   r   r   Ú_has_active_tls_channel_bindingÑ  s   
ÿz%MSSQL._has_active_tls_channel_bindingc                 C   s   | j rtS tS r1   )rÒ  rì   rë   r°   r   r   r   Ú_get_default_login7_tds_versionÖ  s   z%MSSQL._get_default_login7_tds_versionc                 C   ó
   || _ d S r1   )rÖ  rí   r   r   r   Ú_set_session_login7_tds_versionÛ  ó   
z%MSSQL._set_session_login7_tds_versionc                 C   s
   t | jƒS r1   )rL   rÖ  r°   r   r   r   Ú_uses_72_plus_token_layoutÞ  r  z MSSQL._uses_72_plus_token_layoutc                 C   s   |   ¡ rtnt}||ƒS r1   )r  r=  r%  )r   ÚtokensÚparserr   r   r   Ú_parse_info_error_tokená  s   zMSSQL._parse_info_error_tokenFc                 C   s0   |   ¡ r|rtnt}||ƒS |rtnt}||ƒS r1   )r  rE  rR  r?  rQ  )r   r  Úinprocr  r   r   r   Ú_parse_done_tokenå  s
   ÿzMSSQL._parse_done_tokené   c                 C   sn   |   ¡  t | j| jdtj¡d \}}}}}t |||¡}| |¡ z| |¡ W n ty1   ‚ w || _|S ©Nr   )	r  rÈ  rá  rÅ  rÇ  ÚSOCK_STREAMÚ
settimeoutÚconnectr  )r   rì  rî  rï  rð  rñ  rò  Úsockr   r   r   r  î  s   ÿþ
ýzMSSQL.connectc                 C   sF   z| j r| j  ¡ W d| _ |  ¡  S W d| _ |  ¡  d S d| _ |  ¡  w r  )rÈ  rè  r  r°   r   r   r   Ú
disconnect   s   

üÿ
zMSSQL.disconnectc                 C   r  r1   ©rÄ  )r   rÄ  r   r   r   ÚsetPacketSize  r  zMSSQL.setPacketSizec                 C   ó   | j S r1   r"  r°   r   r   r   ÚgetPacketSize  s   zMSSQL.getPacketSizer@   c                 C   s  t |ƒd | jkrn|| jd d … }tƒ }||d< t|d< ||d< |d | jd … |d< |  | ¡ ¡ t |ƒ| jd krh|d7 }||d< |d | jd … |d< |  | ¡ ¡ || jd d … }t |ƒ| jd ks<|}|d7 }tƒ }||d< t|d< ||d< ||d< |  | ¡ ¡ d S )NrG   r‘   r“   r–   r=   r@   )r®   rÄ  r�   ÚTDS_STATUS_NORMALÚsocketSendallr¯   ÚTDS_STATUS_EOM)r   Ú
packetTyper/   ÚpacketIDÚ	remainingr  r   r   r   r    s.   ûzMSSQL.sendTDSc                 C   s    | j d u r| j |¡S |  |¡S r1   )rÐ  rÈ  ÚsendallÚtls_sendr.   r   r   r   r'  .  s   

zMSSQL.socketSendallc              
   C   sŠ   | j  |¡ 	 z| j d¡}|sW d S | j |¡ W n) tjy%   Y d S  tjy/   Y d S  t	yC } z	t
 d|› �¡ ‚ d }~ww q)NTé   z([!] Connection reset when sending data: )rÐ  ÚwriterÔ  ÚreadrÈ  r,  ÚsslÚSSLWantReadErrorÚSSLWantWriteErrorÚConnectionResetErrorr
   Úerror)r   r/   Ú	encryptedr¿  r   r   r   r-  9  s"   €þôzMSSQL.tls_sendNc                 C   sr   |d u r| j }|  |¡}|d }|tkr7|  |¡}|d }|d  |d 7  < |d  |d d 7  < |tks|S )Nr“   r=   r”   rG   )rÄ  Ú_recv_tds_packetr(  )r   rÄ  rí  ÚstatusÚ	tmpPacketr   r   r   r  T  s   

üzMSSQL.recvTDSc                 C   s   |   |¡}|stdƒ‚|S ©NzServer closed connection)Ú
socketRecvÚConnectionError)r   rÄ  r/   r   r   r   Ú_recv_chunkb  s   
zMSSQL._recv_chunkc                 C   sR   t | jƒ|k r|  j|  |¡7  _t | jƒ|k s| jd |… }| j|d … | _|S r1   )r®   rÕ  r=  )r   ÚlengthrÄ  r/   r   r   r   Ú_recv_exacth  s   ÿzMSSQL._recv_exactc                 C   s4   |   d|¡}t|ƒ}|d d }|   ||¡|d< |S )NrG   r”   r=   )r?  r�   )r   rÄ  Úheaderrí  Ú	packetLenr   r   r   r7  p  s
   zMSSQL._recv_tds_packetc                 C   s0   | j d u r| j |¡}|stdƒ‚|S |  |¡S r:  )rÐ  rÈ  Úrecvr<  Útls_recv)r   Úbufsizer/   r   r   r   r;  x  s   

zMSSQL.socketRecvc                 C   sT   	 z| j  |¡}|r|W S W n
 tjy   Y nw | j |¡}|s#dS | j |¡ q)NTrç   )rÐ  r0  r1  r2  rÈ  rB  rÓ  r/  )r   rD  Ú	decryptedr6  r   r   r   rC  ƒ  s   ÿÿñzMSSQL.tls_recvc                 C   sr   d}d}d}d| j  }t|ƒjdddd�}|}||7 }||7 }||7 }||7 }t|ƒ ¡ }t d| ¡ › �¡ |S )	Nrç   s           s   tls-unique:r   rs  Frt  zComputed tls-unique CBT token: )rÑ  r®   Úto_bytesr   Údigestr
   ÚdebugrÙ  )r   Úchannel_binding_structÚinitiator_addressÚacceptor_addressÚapplication_data_rawÚlen_application_dataÚapplication_dataÚ	cbt_tokenr   r   r   Úgenerate_cbt_from_tls_unique˜  s   
ÿz"MSSQL.generate_cbt_from_tls_uniquec                 C   sÎ   t  d¡ t ¡ }| d¡ tjj|_tj|_	t 
¡ }t 
¡ }| ||¡}	 z| ¡  W n$ tjyP   | d¡}|  t|d¡ |  d¡}|d }| |¡ Y nw nq&d| _|| _|| _|| _| d¡| _d S )	Nz%Encryption required, switching to TLSúALL:@SECLEVEL=0Tr.  r   r=   éÿ?  ú
tls-unique)r
   Úinfor1  Ú
SSLContextÚset_ciphersÚ
TLSVersionÚMINIMUM_SUPPORTEDÚminimum_versionÚ	CERT_NONEÚverify_modeÚ	MemoryBIOÚwrap_bioÚdo_handshaker2  r0  r  r  r  r/  rÄ  rÐ  rÓ  rÔ  Úget_channel_bindingrÑ  )r   ÚcontextrÓ  rÔ  Útlsr/   Ú
tds_packetÚtls_datar   r   r   Úset_tls_context«  s2   




ôîzMSSQL.set_tls_contextc                 C   s¬   t  d¡ t ¡ }| d¡ tjj|_tjj|_	d|_
tj|_| dg¡ |j| j| jd�| _d| _d| _| j d¡| _| jrJt  d	| j ¡  ¡ nt  d
¡ t  d¡ dS )z9Wrap the TCP socket in TLS for TDS 8.0 strict encryption.z+(TDS8) Setting up TDS 8.0 strict encryptionrQ  Fztds/8.0)Úserver_hostnameTrR  rS  z(TDS8) tls-unique: %su<   (TDS8) No tls-unique available â€” EPA will fail if requiredz)(TDS8) TDS 8.0 TLS connection establishedN)r
   rH  r1  rU  rV  rW  rX  rY  ÚTLSv1_2Úmaximum_versionÚcheck_hostnamerZ  r[  Úset_alpn_protocolsÚwrap_socketrÈ  rÅ  rÒ  rÄ  r_  rÑ  rÙ  ÚwarningrT  )r   r`  r   r   r   Ú_setup_tds8ß  s    




zMSSQL._setup_tds8c                 C   s:   t | ttttfƒrdS t | tƒr| jtjtjtj	fv S dS )NTF)
Ú
isinstancer<  r4  ÚConnectionAbortedErrorÚBrokenPipeErrorÚOSErrorÚerrnoÚ
ECONNRESETÚECONNABORTEDÚEPIPE)Úexcr   r   r   Ú_should_retry_prelogin_as_tds8ø  s   
þ
z$MSSQL._should_retry_prelogin_as_tds8c                 C   sâ   z|   ¡ }W n@ tyF } z4|  |¡s‚ t dt|ƒj|f ¡ z|  ¡  W n	 ty/   Y nw |  ¡  |  	¡  |   ¡ W  Y d}~S d}~ww |d t
krbt d¡ |  ¡  |  ¡  |  	¡  |   ¡ S |d tttfv ro|  ¡  |S )zþPerform preLogin exchange and set up encryption.

        Handles all encryption modes including TDS 8.0 strict encryption
        where the server closes or resets the connection on a plain PRELOGIN.

        Returns the preLogin response dict.
        z2Plain TDS preLogin failed (%s: %s), trying TDS 8.0Nrª   z?Server requires TDS 8.0 (ENCRYPT_STRICT), reconnecting with TLS)r  r  rv  r
   rH  Útyper   r!  r  rl  ÚTDS_ENCRYPT_STRICTrT  ÚTDS_ENCRYPT_REQÚTDS_ENCRYPT_ONrþ  rd  )r   rö  r¿  r   r   r   Ú_negotiate_encryption  s:   
ÿÿÿ€ò
zMSSQL._negotiate_encryptionTc           <      C   s–  |d ur|  d¡\}}t |¡}t |¡}nd}d}|  ¡ }t ¡ | _d\| jd< | jd< | jd< tƒ }|  ¡ |d< |  	|d ¡ | j
 d¡|d	< | j d¡|d
< | j d¡|d< |d
 |d< t dd¡|d< | j|d< |d urw| d¡|d< ttB |d< ddlm}m} ddlm} ddlm}m}m}m} ddlm}m}m }m!} ddl"m#} ddl$m%}m&}m'} ddl(m)}m*}  ddl+m,}! ddl-m!}m.}"m/}# |
�r3| 0||d| j| j1f ¡\}}}}	|	d u �r3t2 3d| j1 ¡ |  4¡ }$d }%|$D ]%}&zt5|&d ƒ| j1k�r|&d }%W qô t6�y }' zW Y d }'~'qôd }'~'ww |%�r3| 0||d | j  d!¡d ||%f ¡\}}}}	|||j7j8j9d"�}(	 |d u �r¬|	d u �r«z||(||||||ƒ\})}*}+},W n` |�yª }' zF|' :¡ |j;j<j9k�r¥|dk�r¤|dk�r¤|dk�s~|d u �r¤|d u �r¤|	d u �r¤dd$l=m>}-m?}. t2 3d%¡ |-|ƒ}|.|ƒ}W Y d }'~'�q<‚ ‚ d }'~'ww n|d& })|d' }*|d( },|	d u �r6|d)| j  d!¡d || j1f |j7j@j9d"�}/z||/|||)|*|,ƒ\}0}*}+},W nS |�y4 }' zF|' :¡ |j;j<j9k�r)|dk�r(|dk�r(|dk�s|d u �r(|d u �r(|	d u �r(dd$l=m>}-m?}. t2 3d%¡ |-|ƒ}|.|ƒ}n‚ ‚ W Y d }'~'nd }'~'ww n|	d& }0|	d' }*|	d( },n�q=|ƒ }1|d* g|1d+< |jA|0|ƒ d,�d }0|ƒ }2|2 B|0d- ¡ |ƒ }3d.|3d/< t5|jCjj9ƒ|3d0< tDƒ }4| E|4¡|3d1< ||3d-|2jFƒ |ƒ }5d.|5d2< ||5d3< ||5d4|(jGƒ tHjH ItHjJjK¡}6|6jL|5d5< | F|6¡|5d6< |!|5d7< d8|5d7 d9< |ƒ }7d:|7d;< |#|"B |7d<< |  M¡ �rÖ|d u�rÐ||7d=< n|  N¡ |7d=< |7 O¡ |5d7 d>< d|5d?< |  |5¡}8|* P|,d@|8d ¡}9|!|3dA< |*jQ|3dA dB< |9|3dA d'< |  |3¡|1dC< |d  tRO  < |1 O¡ |dD< tS| O¡ ƒ|dE< | O¡ }:|  TtU|:¡ | jV�s5|dF tWk�r5d | _X|  Y¡ };|  Z|;dG ¡| _[t\| j[v �rId#S dHS )INr)   rè   ©rb   r   i|O  ÚProductMajorVersionÚProductMinorVersionÚProductBuildr³   re  rÙ   rÜ   rÞ   rà   r   é   r¶   r´   râ   r¹   )ÚSPNEGO_NegTokenInitÚ	TypesMech)ÚCCache)ÚAP_REQÚAuthenticatorÚTGS_REPÚseq_set)ÚgetKerberosTGTÚgetKerberosTGSÚKerberosErrorÚCheckSumField)Ú	constants)Ú	PrincipalÚKerberosTimeÚTicket)ÚdecoderÚencoder)ÚnoValue)r‹  ÚGSS_C_REPLAY_FLAGÚGSS_C_SEQUENCE_FLAGzMSSQLSvc/%s:%dz7Searching target's instances to look for port number %sÚtcpÚInstanceNamezMSSQLSvc/%s.%s:%sÚ.)rw  T)Úcompute_lmhashÚcompute_nthashz)Got KDC_ERR_ETYPE_NOSUPP, fallback to RC4ÚKDC_REPÚcipherÚ
sessionKeyzMSSQLSvc/%s.%s:%dzMS KRB5 - Microsoft Kerberos 5Ú	MechTypes)Úasn1SpecÚticketrd   Úpvnozmsg-typez
ap-optionszauthenticator-vnoÚcrealmÚcnameÚcusecÚctimeÚcksumi€  Ú	cksumtyperD   ÚLgthÚFlagsÚBndÚchecksumz
seq-numberrf   ÚauthenticatorÚetypeÚ	MechTokenrã   r”   rª   r=   F)]ré  r‹  Úa2b_hexr{  r   ÚVERSIONÚversionr±   r  r  rÂ  ÚencoderÃ  rÆ  rÿ  r   rÄ  ÚTDS_INIT_LANG_FATALÚTDS_ODBC_ONÚimpacket.spnegor�  r‚  Úimpacket.krb5.ccacherƒ  Úimpacket.krb5.asn1r„  r…  r†  r‡  Úimpacket.krb5.kerberosv5rˆ  r‰  rŠ  r‹  Úimpacket.krb5rŒ  Úimpacket.krb5.typesr�  rŽ  r�  Úpyasn1.codec.derr�  r‘  Úpyasn1.type.univr’  Úimpacket.krb5.gssapir“  r”  Ú	parseFilerÇ  r
   rH  rý  r�  r  ÚPrincipalNameTypeÚNT_PRINCIPALrZ  ÚgetErrorCodeÚ
ErrorCodesÚKDC_ERR_ETYPE_NOSUPPÚimpacket.ntlmr˜  r™  ÚNT_SRV_INSTr�  Ú	from_asn1ÚApplicationTagNumbersÚlistÚencodeFlagsÚto_asn1Úcomponents_to_asn1r’  Únowr¡  ÚutcÚmicrosecondr  rP  r¯   ÚencryptÚenctypeÚTDS_INTEGRATED_SECURITY_ONr®   r  Ú
TDS_LOGIN7rÒ  rþ  rÐ  r  Ú
parseReplyrÉ  ÚTDS_LOGINACK_TOKEN)<r   ÚdatabaseÚusernamer  ÚdomainÚhashesÚaesKeyÚkdcHostÚTGTÚTGSÚuseCacheÚcbt_fake_valueÚlmhashÚnthashrö  Úloginr�  r‚  rƒ  r„  r…  r†  r‡  rˆ  r‰  rŠ  r‹  rŒ  r�  rŽ  r�  r�  r‘  r’  r“  r”  Ú	instancesÚinstanceNamerø  r¿  ÚuserNameÚtgtr›  ÚoldSessionKeyrœ  r˜  r™  Ú
serverNameÚtgsÚblobrŸ  ÚapReqÚoptsr«  rË  ÚchkFieldÚencodedAuthenticatorÚencryptedEncodedAuthenticatorÚ
login_datar  r   r   r   ÚkerberosLogin+  sf  

ü
ÿ
ÿÿ€€ÿÿý
ÿ

ÿÿ




€çû 
ÿýÿÿ





ü€ì§]




ÿzMSSQL.kerberosLoginc                 C   s–  |d ur|  d¡\}}	t |¡}t |	¡}	nd}d}	|  ¡ }
t ¡ | _d\| jd< | jd< | jd< tƒ }|  ¡ |d< |  	|d ¡ | j
 d¡|d	< | j d¡|d
< | j d¡|d< |d
 |d< t dd¡|d< | j|d< |d urw| d¡|d< ttB |d< |du rš|d  tO  < tjddd| jd�}| ¡ |d< n| d¡|d< |  | d¡¡|d< d|d< t| ¡ ƒ|d< | ¡ }|  t|¡ | jsÍ|
d tkrÍd | _|  ¡ }|du �r9|d dd … }d}|  ¡ rï|d urë|}n|  ¡ }tj |||||||	dd|| jd�\}}d|d < | ¡ }t !|¡ ¡ }| ¡ }t "||| | ¡}t# $d!| %¡ › �¡ ||d < |  t&| ¡ ¡ |  ¡ }|  '|d ¡| _(t)| j(v �rIdS d"S )#Nr)   rè   r|  r}  r~  r  r³   re  rÙ   rÜ   rÞ   rà   r   r€  r¶   r´   râ   r¹   T)Ú
use_ntlmv2r°  rã   rÚ   rÛ   r”   rª   r=   r   rç   ÚMSSQLSvc)Úservicerð  Úchannel_binding_valuer°  s                   ÚMICzComputed MIC is F)*ré  r‹  r®  r{  r   r¯  r°  r±   r  r  rÂ  r±  rÃ  rÆ  rÿ  r   rÄ  r²  r³  rÐ  ÚgetNTLMSSPType1r¯   r  r®   r  rÑ  rÒ  rþ  rÐ  r  r  rP  ÚgetNTLMSSPType3ÚNTLMAuthChallengeÚhmac_md5r
   rH  rÙ  ÚTDS_SSPIrÒ  rÉ  rÓ  )r   rÔ  rÕ  r  rÖ  r×  ÚuseWindowsAuthrÝ  rÞ  rß  rö  rà  Úauthrî  r  ÚserverChallengeró  Útype3ÚexportedSessionKeyÚntlm_negotiate_dataÚntlm_challenge_dataÚntlm_authenticate_dataÚnewmicr   r   r   rà  ;  s”   

ü


õ
þzMSSQL.loginc                 C   s  | j D ]û}|d tttfv r|d d |d< d}nŒ|d tfv r'd|d< d}n~|d ttfv r>t|d dd	… ƒ|d< d}ng|d tfv rLd
|d< d}nY|d t	t
fv r[d|d< d}nJ|d ttfv rjd|d< d}n;|d ttfv r{|d |d< d}n*|d ttfv rŽ|d d |d< d}n|d ttfv rŸ|d |d< d}nd|d< d}d|d< | jD ]}tt||d  ƒƒ|d krÈtt||d  ƒƒ|d< q¬|d |d k r×|d |d< t|d ƒ|d krêt|d ƒ|d< n|d | jkrö| j|d< ||d  |d< qd S )Nr‘   ÚTypeDatar   r”   z%%-%dsrs   z%%%dsr   r@   é   rf   é   rb   Ú	minLenghtÚNameÚFormat)rÊ  r  r€  ÚTDS_NTEXTTYPEr�  r¥  r¤  ÚordÚTDS_DATETIMNTYPErz  ÚTDS_INTNTYPEÚTDS_FLTNTYPEÚTDS_MONEYNTYPEÚTDS_BITNTYPEr…  rŠ  r‰  ÚTDS_TEXTTYPEr„  rË  r®   r¨  rÎ  )r   ÚcolÚfmtÚrowr   r   r   ÚprocessColMetaÂ  sV   

€
ÔzMSSQL.processColMetac                 C   s~   t | jƒdkr	d S | jD ]}| j |d |d  | j ¡ q| j d¡ | jD ]}| j d|d  | j ¡ q'| j d¡ d S )Nr   r  r  r   ú-r”   )r®   rÊ  r×  r   rÍ  )r   r  r   r   r   ÚprintColumnsHeaderñ  s   
ÿ
zMSSQL.printColumnsHeaderc                 C   sh   | j du rd S |  ¡  |  ¡  | jD ]}| jD ]}| j |d ||d   | j ¡ q| j d¡ qd S )NTr  r  r   )rÏ  r  r  rË  rÊ  r×  r   rÍ  )r   r  r  r   r   r   Ú	printRowsý  s   


ÿûzMSSQL.printRowsc              	   C   s°  t | j ¡ ƒD ]Î}t| j| ƒD ]Ä\}}|d tkr6td|d  d¡|d |d  d¡f ƒ| _|| jƒ q|d tkrR|d|d  d¡|d |d  d¡f ƒ q|d t	krf|d|d	 › d
| j
› �ƒ q|d tkrÔ|d ttttfv rÔt|d ƒ}|d dkrŠd d¡|d< n|d dkr—d d¡|d< |d tkr d}n!|d tkr©d}n|d tkr²d}n|d tkr»d}nd|d  }|d||d  d¡|d  d¡f ƒ qqd S )Nr  úERROR(%s): Line %d: %srÞ   re  r<  r1  zINFO(%s): Line %d: %szACK: Result: r  z - r‘   r=   rO  rè   ÚNonerL  ÚDATABASEÚLANGUAGEÚCHARSETÚ
PACKETSIZEz%dz+ENVCHANGE(%s): Old Value: %s, New Value: %s)rÇ  rÉ  Úkeysrë  ÚTDS_ERROR_TOKENr?   r�  rÏ  ÚTDS_INFO_TOKENrÓ  rØ  ÚTDS_ENVCHANGE_TOKENÚTDS_ENVCHANGE_DATABASEÚTDS_ENVCHANGE_LANGUAGEÚTDS_ENVCHANGE_CHARSETÚTDS_ENVCHANGE_PACKETSIZErI  r±  )r   Úerror_loggerÚinfo_loggerr  rø  ÚkeyÚrecordÚ_typer   r   r   ÚprintReplies	  sr   ýÿÿýÿÿ	ÿüýÿÿ€ÏÿzMSSQL.printRepliesc           #   	   C   sZ  t |ƒdkrdS |rg ni }t |d ƒ}|d }| jD �]„}|d }|tk|tkB r[t d|d t d¡… ¡d }|t d¡d … }|dkrW|d |…  d¡}	||d … }�n:d}	�n6|tkrŸt d|d d	… ¡d }|d	d … }|dkr›|d |… }
||d … }z|
 d
¡}	W �n t	yš   |
jddd�}	Y �n÷w d}	�nò|t
krÌt|dd… ƒ}|dd … }|dkrÈ|d |… }t |¡}	||d … }�nÉd}	�nÅ|tk|tkB �r6t|dd… ƒ}|dkrëd}	|dd … }�n¦|d| d d … }t d|d t d¡… ¡d }|t d¡d … }|dk�r2|tk�r!|d |…  d¡}	n	t |d |… ¡}	||d … }�n_d}	�n[|tk�r‹t|dd… ƒ}|dk�rRd}	|dd … }�n?|d| d d … }t d|d t d¡… ¡d }|t d¡d … }|dk�r‡|d |… }	||d … }�n
d}	�n|tk|tkB �rÆt d|d t d¡… ¡d }|t d¡d … }|dk�rÂt |d |… ¡}	||d … }�nÏd}	�nË|tk|tkB |tkB �r¦d}	|tk�rþt|dd… ƒdk�rèt}nt|dd… ƒdk�röt}nd}	|dd … }|tk�r<t d|d d… ¡d }|dd … }|dk �r"t ddd¡}nt ddd¡}t d|d d… ¡d }|dd … }n<|tk�rxt d|d t d¡… ¡d }|t d¡d … }t d|d t d¡… ¡d }|t d¡d … }t ddd¡}|	dk�r¤tj | ¡ | ¡}t|d dƒ\}}t|dƒ\}}t |j|j|j|||¡}	�në|t k�r¿t d|d d… ¡d }	|dd … }�nÒ|t!k�rØt d|d d… ¡d }	|dd … }�n¹|t"k�rùt d|d d… ¡d }
t#|
ƒt#dƒ }	|dd … }�n˜|t$k�r8t|d d… ƒ}|dk�rd}n|dk�rd}|dd … }|dk�r4t ||d |… ¡d }	||d … }�n]d}	�nY|t%k�r†t|d d… ƒ}|dk�rMd}n|dk�rTd}|dd … }|dk�r‚t |dk�rhdnd|d |… ¡d }
t#|
ƒt#dƒ }	||d … }�nd}	�n|t&k�r±t d|d t d¡… ¡d }|t d¡d … }|d |… }	||d … }�nà|t'k�rÊt d|d d… ¡d }	|dd … }�nÇ|t(k�rãt d|d d… ¡d }	|dd … }�n®|t)k�r
t d|d d… ¡\}}|d> | }t#|ƒt#dƒ }	|dd … }�n‡|t*k�r#t d|d d	… ¡d }	|d	d … }�nn|t+k�r]t|d d… ƒ}|dd … }|dk�rY|d |… }t d|d ¡d }tj |¡}	||d … }�n8d}	�n4|t,k|t-kB �rtt.|d ƒ}	|dd … }�n|t/t0fv �rÛ|d }|dd … }|dk�rŽd}	�n|d |… }
||d … }|d d }|d d	 }|
d dk�r¯dnd }t1j2|
dd … d!d"d#�}|t3ƒ _4t#|ƒ}|�rÐ|t#d$ƒ|  }|dk�r×|n| }	n¶|t5k�rt|d d… ƒ}|dd … }|dk�r|dk�rt|d |… ƒ}	n	|d |… }	nd}	||d … }n€|t6k�rat|d d… ƒ}|dk�r&d%}n|d	k�r.d&}n|dk�r6d}n
|dk�r>d}nd}|dd … }|dk�r^t ||d |… ¡d }	||d … }n3d}	n0|t7k�r‹t d|d d… ¡d } |d d|  … }!t8|!ƒ}"|" 9¡ }	|d|  d … }nt:d'| ƒ‚|�rš| ;|	¡ q|	||d( < q| j< ;|¡ |t |ƒ S ))Nr@   r   r=   r‘   r9   rû   re  r[  r   rg  rf  r£  )ÚerrorsrG   rõ   rè   r   ra  iÙ  rk  rl  rm  rn   rc  ri  rd  rb  rj  r  rn  r  rr  rs  Frt  rb   r’   r`  z$ParseROW: Unsupported data type: 0%xr  )=r®   rÊ  r  r€  rï   r÷   Úcalcsizer�  r„  r†  r�  r
  r	   r�  r	  ÚTDS_IMAGETYPEr‹  rŒ  r  r‰  rŠ  rš  r  r‘  r’  r“  r”  r•  r–  r—  r˜  r™  rz  r}  r�  r   r  r  r…  r{  r~  rŽ  ry  r›  r|  rx  rü   r¤  r¥  r�  r¦  r   r§  r  r  ÚTDS_SSVARIANTTYPErU  r_  r  r  rË  )#r   ÚtokenÚ	tuplemoder  ÚorigDataLenr/   r  r*  ÚcharLenrZ  ÚrawÚuuidLenÚuur«  r­  r¬  r®  r¯  rp  r°  Ú	valueSizer  r©  rª  ÚcombinedÚ	dateBytesÚvalueLenr»  r±  r¼  Úintegerr¾  ÚtotalLengthÚvariantDataÚvariantr   r   r   ÚparseRowE  sÎ  ÿ






ÿþÿ





ÿú€
	









ÿþ

















zMSSQL.parseRowc              	   C   sÎ  |d }|dkr
dS g | _ t|d ƒ}|d }t|ƒD �]Ä}i }|  ¡ r&dnd}t ||d t |¡… ¡d }|t |¡d … }t d|d t d¡… ¡d }	|t d¡d … }t d|d t d¡… ¡d }
|t d¡d … }|
tk|
tkB |
t	kB |
t
kB |
tkB |
tkB |
tkB |
tkB |
tkB |
tkB |
tkB |
tkB r£d}n¶|
tk|
tkB |
tkB |
tkB |
tkB |
tkB |
tkB |
tkB rÒt|dd	… ƒ}|d	d … }n‡|
tkråt|dd	… ƒ}|d	d … }nt|
tk|
tkB |
tkB |
t kB |
t!kB |
t"kB �rt d|d d
… ¡d }|d
d … }nH|
t#k|
t$kB |
t%kB �r+|d d… }|dd … }n.|
t&k|
t'kB |
t(kB |
t)kB |
t*kB �rSt d|d d… ¡d }|dd … }nt+d|
 ƒ‚|
t*k|
t"kB |
t!kB |
tkB |
t kB |
t'kB �rx|dd … }|
t&k|
t'kB |
t*kB �rŸt d|d d
… ¡d }|d
d … }||d
 d … }t d|d t d¡… ¡d }|t d¡d … }|d |d
 …  ,d¡}||d
 d … }||d< |
|d< ||d< |	|d< | j  -|¡ q|t|ƒ S )NrT  rû   r   r=   rõ   r9   r’   rè   r@   r   r   r   zUnsupported data type: 0x%xrd   re  r  r‘   r  r¨  ).rÊ  r®   Úranger  rï   r÷   r-  r|  rx  ry  r{  r‘  rš  r}  r~  rŽ  r�  r›  rz  r  rœ  rŸ  r   r  r  r�  r  r
  r  r‰  rŠ  r€  r  r„  r…  r¥  r¤  ÚTDS_DECIMALTYPEr.  r  ÚTDS_XMLTYPEr/  r	  r  r�  r  )r   r0  Úcountr2  r/   rø  ÚcolumnÚuserTypeFormatÚuserTypeÚflagsÚcolTypeÚtypeDataÚdataLenÚcolNameLengthÚcolNamer   r   r   ÚparseColMetaData†	  s   ÿþýüûúùø	÷
öõÿÿþýüûúùÿ
ÿþýüûÿÿþÿÿþýüÿÿþýüûÿ	ÿþÿzMSSQL.parseColMetaDatac           	      C   s&  i }t |ƒdk�rt d|dd… ¡d }|tkr5|  |¡}td|d  d¡|d |d  d¡f ƒ| _nº|tkr>t	|ƒ}n±|t
krH|  |¡}n§|tkrQt|ƒ}nž|tkrZt|ƒ}n•|tkrŽt|ƒ}|d	 tu ryt|d
 ƒ}t|d  d¡ƒ| _nv|d	 tu r�t|d
 ƒ}|d  d¡| _na|tk|tkB rž| j|dd�}nQ|tkr§t|ƒ}nH|tkrÀt|ƒ}|  ||¡}|d
 d |… |d
< n/|tkrØt |ƒ}|  !|¡}|d
 d |… |d
< n|t"krâ|  |¡}n|rët# $d| ¡ |dfS ||v durút%ƒ ||< ||  &|¡ |t |ƒd … }t |ƒdks	|dfS )Nr   r"   r@   r  rÞ   re  r<  r1  r‘   r=   rL  T)r  zUnknown Token %xF)'r®   rï   r÷   r  r  r?   r�  rÏ  ÚTDS_RETURNSTATUS_TOKENr#  r   r  r  rÓ  r  r!  r>  r%  rI  r�  rÄ  r"  rÌ  ÚTDS_DONEINPROC_TOKENÚTDS_DONEPROC_TOKENr  ÚTDS_ORDER_TOKENrH  ÚTDS_ROW_TOKENrP  r?  ÚTDS_COLMETADATA_TOKENrS  rM  ÚTDS_DONE_TOKENr
   r5  rÇ  r  )	r   r  r1  Úlog_unknownrÉ  ÚtokenIDr0  r)  ÚtokenLenr   r   r   Ú_parse_reply_tokensý	  sj   
ýÿÿ


€


Ê:zMSSQL._parse_reply_tokensc                 C   s$   t |ƒdkrdS |  ||¡\}}|S )Nr   F)r®   rX  )r   r  r1  rÉ  rõ  r   r   r   rÒ  ;
  s   zMSSQL.parseReplyc                 C   sP   t  dt¡}|t  dt¡7 }|t  dt¡7 }|t  dt¡7 }|t  dt¡7 }|S )Nz<Ir9   rG  )rï   rð   ÚTDS_ALL_HEADERS_LENGTHÚ-TDS_ALL_HEADERS_TRANSACTION_DESCRIPTOR_LENGTHÚ&TDS_HEADER_TYPE_TRANSACTION_DESCRIPTORÚ"TDS_TRAN_DESCRIPTOR_NO_TRANSACTIONÚTDS_OUTSTANDING_REQUEST_COUNT)r   Úall_headersr   r   r   Ú_build_tds8_sql_batch_headersB
  s   z#MSSQL._build_tds8_sql_batch_headersc                 C   s   | j r	|  ¡ | S |S )zAPrepend TDS 8.0 ALL_HEADERS to an already-encoded SQL_BATCH body.)rÒ  r_  )r   Úsql_textr   r   r   Ú_wrap_sql_batch_dataK
  s   zMSSQL._wrap_sql_batch_datac                 C   s   |d   d¡}|  |¡S )z@Build SQL_BATCH packet data, prepending ALL_HEADERS for TDS 8.0.z
re  )r±  ra  )r   Úcmdr`  r   r   r   Ú_build_batch_dataQ
  s   
zMSSQL._build_batch_datac                 C   sL   g | _ g | _d| _|  t|  |¡¡ |r$|  ¡ }|  |d |¡| _| j S dS )NFr=   T)	rË  rÊ  rÏ  r  ÚTDS_SQL_BATCHrc  r  rÒ  rÉ  )r   rb  r1  Úwaitr  r   r   r   ÚbatchV
  s   zMSSQL.batchc                 C   s(   g | _ g | _d| _|  t|  |¡¡ d S )NF)rË  rÊ  rÏ  r  rd  rc  )r   rb  r1  r   r   r   ÚbatchStatementc
  s   zMSSQL.batchStatementc                 C   s,   || j krd| }|  |¡ |  ¡  d S d S )Nzuse %s)rÌ  rf  r+  )r   ÚdbÚchdbr   r   r   ÚchangeDBn
  s
   

ýzMSSQL.changeDBc                 K   sP   |pd}|   |¡ |  ¡  |  |||¡}|r|  ¡  | jr | j‚| jr&| j‚|S )NÚmaster)rj  r+  rf  rÏ  )r   rh  Ú	sql_queryr1  re  ÚkwArgsrú  r   r   r   ÚRunSQLQueryt
  s   
zMSSQL.RunSQLQueryc                 K   s    | j |||d� | jr| j‚dS )N)re  T)rn  rÏ  )r   rh  rl  re  rm  r   r   r   ÚRunSQLStatement�
  s   zMSSQL.RunSQLStatementc                 C   r$  r1   )rÛ  r°   r   r   r   rÂ  ˆ
  ó   zMSSQL.workstation_idc                 C   r$  r1   )rÜ  r°   r   r   r   rÃ  Œ
  rp  zMSSQL.application_name)rd   )F)r  )r@   r1   )	rè   rè   Nrè   NNNTN)rè   rè   NFN)FT)T)<r   r   r   r   r¨  r,   rý  r  r  r  r  r  r  r  r  r  r  r!  r#  r%  r  r'  r-  r  r=  r?  r7  r;  rC  rP  rd  rl  Ústaticmethodrv  r{  rï  rà  r  r  r  r
   r5  rT  r+  r?  rM  rX  rÒ  r_  ra  rc  rf  rg  rl  rj  rn  ro  ÚpropertyrÂ  rÃ  r   r   r   r   rÁ  [  s¤    ùû
ú
'(
	

	

4
*
ô  
ø /
<  C
w
>	

	


rÁ  )±Ú
__future__r   r   r1  Úhashlibr   rï   rÈ  rå  rÿ  r‹  rq  Úmathr’  Údecimalr   r   r	   r   Úimpacketr   r
   Úimpacket.structurer   Úimpacket.mssql.versionr   r   râ  ÚSQLR_CLNT_BCAST_EXrà  r-   r6   r    r&   r4   r7   r  r?   rd  ÚTDS_PRE_TDS_LOGINÚTDS_RPCÚTDS_TABULARÚTDS_ATTENTIONÚTDS_BULK_LOAD_DATAÚTDS_TRANSACTIONrÑ  rù  r  r&  r(  ÚTDS_STATUS_RESET_CONNECTIONÚTDS_STATUS_RESET_SKIPTRANSrþ  rz  ÚTDS_ENCRYPT_NOT_SUPry  rx  rZ  rY  r[  r\  r]  ÚTDS_LOGIN7_VERSION_70rë   ÚTDS_LOGIN7_VERSION_71REV1ÚTDS_LOGIN7_VERSION_72ÚTDS_LOGIN7_VERSION_73AÚTDS_LOGIN7_VERSION_73Brì   ÚTDS_LOGIN7_VERSION_80ÚTDS_VERSION_71ÚTDS_VERSION_72ÚTDS_VERSION_73AÚTDS_VERSION_73BÚTDS_VERSION_74ÚTDS_VERSION_80rJ   rL   rÐ  r²  r³  ÚTDS_ALTMETADATA_TOKENÚTDS_ALTROW_TOKENrS  ÚTDS_COLINFO_TOKENrT  rP  rO  r!  r  r  r   rÓ  ÚTDS_NBCROW_TOKENÚTDS_OFFSET_TOKENrQ  rN  ÚTDS_RETURNVALUE_TOKENrR  ÚTDS_SSPI_TOKENÚTDS_TABNAME_TOKENr  r  r  Ú$TDS_FEATURE_EXT_UTF8_SUPPORT_ENABLEDr"  r#  r$  r%  ÚTDS_ENVCHANGE_UNICODEÚTDS_ENVCHANGE_UNICODE_DSÚTDS_ENVCHANGE_COLLATIONÚTDS_ENVCHANGE_TRANS_STARTÚTDS_ENVCHANGE_TRANS_COMMITÚTDS_ENVCHANGE_ROLLBACKÚTDS_ENVCHANGE_DTCÚTDS_NULL_TYPErx  r|  ry  rz  rš  r}  rŽ  r‘  r~  r�  r{  r�  r  rA  ÚTDS_NUMERICTYPEr  r¥  r¤  r  r  r  r›  rœ  rŸ  r   rƒ  r‚  rˆ  r‡  r‰  r„  rŠ  r…  r  r€  rB  ÚTDS_UDTTYPEr  r.  r	  r/  r�   r™   r±   r  r  r#  r%  r=  r>  r?  rE  rH  rI  rP  rQ  rR  rS  rU  rÁ  r   r   r   r   Ú<module>   sZ   	ý \L
					  k