a
    ū)&i²\  ć                   @   s^   d dl mZ d dlZd dlZd dlmZmZ ej ej 	ej 
e”d””ZG dd deZdS )é    )Śprint_functionN)ŚBlackboxTestCaseŚBlackboxProcessErrorz#../../../../../source4/librpc/testsc                   @   s   e Zd Z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d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d$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFS )GŚNdrDumpTestszBlackbox tests for ndrdump.c                 C   s   t j t|”S )N)ŚosŚpathŚjoinŚdata_path_dir)ŚselfŚname© r   ś>/usr/lib/python3/dist-packages/samba/tests/blackbox/ndrdump.pyŚ	data_path!   s    zNdrDumpTests.data_pathc                 C   s   |   d|  d” ” d S )Nz"ndrdump samr samr_CreateUser in %sśsamr-CreateUser-in.dat©Z	check_runr   ©r
   r   r   r   Śtest_ndrdump_with_in$   s    ’z!NdrDumpTests.test_ndrdump_with_inc                 C   s   |   d|  d” ” d S )Nz#ndrdump samr samr_CreateUser out %sśsamr-CreateUser-out.datr   r   r   r   r   Śtest_ndrdump_with_out(   s    ’z"NdrDumpTests.test_ndrdump_with_outc                 C   s"   |   d|  d”|  d”f ” d S )Nz5ndrdump --context-file %s samr samr_CreateUser out %sr   r   r   r   r   r   r   Śtest_ndrdump_context_file,   s    ’’’z&NdrDumpTests.test_ndrdump_context_filec                 C   s   |   d|  d” ” d S )Nz-ndrdump --validate samr samr_CreateUser in %sr   r   r   r   r   r   Śtest_ndrdump_with_validate2   s    ’z'NdrDumpTests.test_ndrdump_with_validatec                 C   s   |   d|  d” ” d S )Nz4ndrdump dns decode_dns_name_packet in --hex-input %sś"dns-decode_dns_name_packet-hex.datr   r   r   r   r   Ś%test_ndrdump_with_hex_decode_function6   s
    ’’z2NdrDumpTests.test_ndrdump_with_hex_decode_functionc              
   C   sp   t |  d” ” }z|  d|  d” ”}W n. tyX } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Nz"dns-decode_dns_name_packet-hex.txtz1ndrdump dns dns_name_packet struct --hex-input %sr   śutf-8©Śopenr   ŚreadŚcheck_outputr   ŚfailŚassertEqualŚencode©r
   ŚexpectedŚactualŚer   r   r   Ś!test_ndrdump_with_hex_struct_name;   s    ’’ z.NdrDumpTests.test_ndrdump_with_hex_struct_namec              
   C   s~   d}z|   d|  d” ”}W n. tyJ } z|  |” W Y d }~n
d }~0 0 |  |d t| | d”” |  | d”” d S )Nz±pull returned Success
    PAC_DATA: struct PAC_DATA
        num_buffers              : 0x00000005 (5)
        version                  : 0x00000000 (0)
        buffers: ARRAY(5)z"ndrdump krb5pac PAC_DATA struct %szkrb5pac-PAC_DATA.datr   ó   dump OK
)	r   r   r   r   r   Ślenr    Ś
assertTrueŚendswithr!   r   r   r   Ś$test_ndrdump_with_binary_struct_nameH   s    ’’ ’z1NdrDumpTests.test_ndrdump_with_binary_struct_namec              
   C   s   t |  d”}| ” }W d    n1 s,0    Y  |  d”}z|  d| ”}W n. ty } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Nzkrb5pac_upn_dns_info_ex.txtzkrb5pac_upn_dns_info_ex.b64.txtśMndrdump --debug-stdout -d0 krb5pac PAC_DATA struct --validate --base64-input r   r   ©r
   Śfr"   r   r#   r$   r   r   r   Śtest_ndrdump_upn_dns_info_ex]   s"    ’&’’’ z)NdrDumpTests.test_ndrdump_upn_dns_info_exc              
   C   s   t |  d”}| ” }W d    n1 s,0    Y  |  d”}z|  d| ”}W n. ty } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Nz)krb5pac_upn_dns_info_ex_not_supported.txtz-krb5pac_upn_dns_info_ex_not_supported.b64.txtr+   r   r   r,   r   r   r   Ś*test_ndrdump_upn_dns_info_ex_not_supportedm   s"    ’&’’’ z7NdrDumpTests.test_ndrdump_upn_dns_info_ex_not_supportedc              
   C   sb   d}z|   d|  d” ”}W n. tyJ } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Nzbpull returned Success
    GUID                     : 33323130-3534-3736-3839-616263646566
dump OK
zndrdump misc 0 struct %szmisc-GUID.datr   )r   r   r   r   r   r    r!   r   r   r   Ś&test_ndrdump_with_binary_struct_number   s    ’’ z3NdrDumpTests.test_ndrdump_with_binary_struct_numberc              
   C   sZ   d}z|   dd”}W n. tyB } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Nz/Public structure 'netr_SchannelType' not found
z/ndrdump misc netr_SchannelType --input=x structé   r   ©Ścheck_exit_coder   r   r   r    r!   r   r   r   Ś!test_ndrdump_with_enum_not_struct   s    ž z.NdrDumpTests.test_ndrdump_with_enum_not_structc              
   C   sZ   d}z|   dd”}W n. tyB } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Nś pull returned Buffer Size Error
z,ndrdump -d0 misc GUID struct --input=abcdefgé   r   r2   r!   r   r   r   Ś,test_ndrdump_input_cmdline_short_struct_name   s    ’ z9NdrDumpTests.test_ndrdump_input_cmdline_short_struct_namec              
   C   sZ   d}z|   dd”}W n. tyB } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Nztpull returned Buffer Size Error
6 bytes consumed
[0000] 61 62 63 64 65 66 67                               abcdefg 
z8ndrdump -d0 misc GUID struct --input=abcdefg --dump-datar6   r   r2   r!   r   r   r   Ś1test_ndrdump_input_cmdline_short_struct_name_dump«   s    ’ z>NdrDumpTests.test_ndrdump_input_cmdline_short_struct_name_dumpc              
   C   sZ   d}z|   dd”}W n. tyB } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Na  pull returned Buffer Size Error
6 bytes consumed
[0000] 61 62 63 64 65 66 67                               abcdefg 
WARNING! 1 unread bytes
[0000] 67                                                 g 
WARNING: pull of GUID was incomplete, therefore the parse below may SEGFAULT
    GUID                     : 64636261-6665-0000-0000-000000000000
dump of failed-to-parse GUID complete
zTndrdump -d0 misc GUID struct --input=abcdefg --dump-data --print-after-parse-failurer6   r   r2   r!   r   r   r   Ś7test_ndrdump_input_cmdline_short_struct_name_print_fail»   s    ’ zDNdrDumpTests.test_ndrdump_input_cmdline_short_struct_name_print_failc              
   C   sR   d}z|   d”}W n. ty@ } z|  |” W Y d }~n
d }~0 0 |  ||” d S )NsF  pull returned Success
WARNING! 53 unread bytes
[0000] 00 FF 00 00 FF 00 00 00   00 09 00 00 00 08 00 33   ........ .......3
[0010] 33 32 37 36 32 36 39 33   32 37 36 38 34 01 00 00   32762693 27684...
[0020] 80 32 0D FF 00 00 FF 00   00 00 00 08 00 00 00 1C   .2...... ........
[0030] F1 29 08 00 00                                     .)... 
    clusapi_QueryAllValues: struct clusapi_QueryAllValues
        out: struct clusapi_QueryAllValues
            pcbData                  : *
                pcbData                  : 0x01000000 (16777216)
            ppData                   : *
                ppData: ARRAY(1)
                    ppData                   : NULL
            rpc_status               : *
                rpc_status               : WERR_OK
            result                   : WERR_NOT_ENOUGH_MEMORY
dump OK
z¦ndrdump clusapi clusapi_QueryAllValues out --base64-input --input=AAAAAQEAAAAAAAAAAAAAAAgAAAAA/wAA/wAAAAAJAAAACAAzMzI3NjI2OTMyNzY4NAEAAIAyDf8AAP8AAAAACAAAABzxKQgAAA==©r   r   r   r   r!   r   r   r   Ś*test_ndrdump_fuzzed_clusapi_QueryAllValuesŃ   s    ’ z7NdrDumpTests.test_ndrdump_fuzzed_clusapi_QueryAllValuesc              
   C   s^   d}z|   dd”}W n. tyB } z|  |” W Y d }~n
d }~0 0 |  | d”|d ” d S )Nz)pull returned Character Conversion Error
zindrdump IOXIDResolver ResolveOxid out --base64-input --input=c87PMf7CBAUAAAAADgQMBASjfPqKw0KPld6DY87PMfQ=r6   Śutf8ś$©r3   r   r   ZassertRegexŚdecoder!   r   r   r   Ś-test_ndrdump_fuzzed_IOXIDResolver_ResolveOxidī   s    ü z:NdrDumpTests.test_ndrdump_fuzzed_IOXIDResolver_ResolveOxidc              
   C   s^   d}z|   dd”}W n. tyB } z|  |” W Y d }~n
d }~0 0 |  | d”|d ” d S )Nr5   z~ndrdump IOXIDResolver ResolveOxid2 out --base64-input --input=AAAAAQ0K9Q0AAAAAAAAAA6ampqampqampqampqampqampqampqamNAAAAAAtNDQ=r6   r<   r=   r>   r!   r   r   r   Ś.test_ndrdump_fuzzed_IOXIDResolver_ResolveOxid2ū   s    ü z;NdrDumpTests.test_ndrdump_fuzzed_IOXIDResolver_ResolveOxid2c              
   C   sR   d}z|   d”}W n. ty@ } z|  |” W Y d }~n
d }~0 0 |  ||” d S )Ns  pull returned Success
WARNING! 46 unread bytes
[0000] 0D 36 0A 0A 0A 0A 0A 00   00 00 00 00 00 00 03 00   .6...... ........
[0010] 00 00 01 00 00 33 39 36   31 36 31 37 37 36 38 34   .....396 16177684
[0020] 32 34 FC 85 AC 49 0B 61   87 0A 0A 0A F5 00         24...I.a ......
    ServerAlive: struct ServerAlive
        out: struct ServerAlive
            result                   : DOS code 0x01000000
dump OK
zndrdump IOXIDResolver ServerAlive out --base64-input --input=AAAAAQ02CgoKCgoAAAAAAAAAAwAAAAEAADM5NjE2MTc3Njg0MjT8haxJC2GHCgoK9QA=r:   r!   r   r   r   Ś.test_ndrdump_fuzzed_IOXIDResolver_ServerAlive2  s    
’ z;NdrDumpTests.test_ndrdump_fuzzed_IOXIDResolver_ServerAlive2c              
   C   s^   d}z|   dd”}W n. tyB } z|  |” W Y d }~n
d }~0 0 |  | d”|d ” d S )Nr5   zndrdump IRemoteActivation RemoteActivation out --base64-input --input=AAAAAQAAAAAAAABKAAD/AAAAAP4AAAAAAAAASgAAAAAAAAABIiIjIiIiIiIiIiIiIiMiAAAAAAD/AAAAAAAAr6   r<   r=   r>   r!   r   r   r   Ś6test_ndrdump_fuzzed_IRemoteActivation_RemoteActivation  s    ü zCNdrDumpTests.test_ndrdump_fuzzed_IRemoteActivation_RemoteActivationc              
   C   sp   t |  d” ” }z|  d|  d” ”}W n. tyX } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Nz'fuzzed_ntlmssp-AUTHENTICATE_MESSAGE.txtzHndrdump ntlmssp AUTHENTICATE_MESSAGE struct --base64-input %s --validatez+fuzzed_ntlmssp-AUTHENTICATE_MESSAGE.b64.txtr   r   r!   r   r   r   Ś1test_ndrdump_fuzzed_ntlmsssp_AUTHENTICATE_MESSAGE)  s    ’’ z>NdrDumpTests.test_ndrdump_fuzzed_ntlmsssp_AUTHENTICATE_MESSAGEc              
   C   s^   d}d}z|   |d”}W n. tyF } z|  |” W Y d }~n
d }~0 0 |  | d”|” d S )Nz5ndr_pull_string: ndr_pull_error\(Buffer Size Error\):zJndrdump drsblobs package_PackagesBlob struct --input='aw==' --base64-inputr6   r<   r>   ©r
   r"   Zcommandr#   r$   r   r   r   Ś test_ndrdump_fuzzed_PackagesBlob5  s    ’ z-NdrDumpTests.test_ndrdump_fuzzed_PackagesBlobc              
   C   sp   t |  d” ” }z|  d|  d” ”}W n. tyX } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Nzfuzzed_drsuapi_DsAddEntry_1.txtzBndrdump drsuapi drsuapi_DsAddEntry in --base64-input --validate %sz#fuzzed_drsuapi_DsAddEntry_1.b64.txtr   r   r!   r   r   r   Ś(test_ndrdump_fuzzed_drsuapi_DsAddEntry_1B  s    ’’ z5NdrDumpTests.test_ndrdump_fuzzed_drsuapi_DsAddEntry_1c              
   C   sj   d}z&|   d|  d” ” |  d| ” W n: tyd } z"|t|vrP|  |” W Y d }~n
d }~0 0 d S )NzMaximum Recursion Exceededz(ndrdump drsuapi 17 out --base64-input %sz/fuzzed_drsuapi_DsaAddressListItem_V1-in.b64.txtz'Input should have been rejected with %s)r   r   r   r   Śstr)r
   r"   r$   r   r   r   Ś1test_ndrdump_fuzzed_drsuapi_DsaAddressListItem_V1N  s    ’’’z>NdrDumpTests.test_ndrdump_fuzzed_drsuapi_DsaAddressListItem_V1c              
   C   sp   t |  d” ” }z|  d|  d” ”}W n. tyX } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Nz%fuzzed_drsuapi_DsReplicaAttribute.txtzNndrdump drsuapi drsuapi_DsReplicaAttribute struct --base64-input --validate %sz)fuzzed_drsuapi_DsReplicaAttribute.b64.txtr   r   r!   r   r   r   Ś.test_ndrdump_fuzzed_drsuapi_DsReplicaAttributeZ  s    ’’ z;NdrDumpTests.test_ndrdump_fuzzed_drsuapi_DsReplicaAttributec              
   C   sÜ   t |  d” ” }z|  d|  d” ”}W n. tyX } z|  |” W Y d }~n
d }~0 0 |  || d”” t |  d” ” }z|  d|  d” ”}W n. tyÄ } z|  |” W Y d }~n
d }~0 0 |  || d”” d S )Nz1../../../source3/selftest/ktest-krb5_ccache-2.txtzGndrdump krb5ccache CCACHE struct --configfile /dev/null -d1 --validate z-../../../source3/selftest/ktest-krb5_ccache-2r   z1../../../source3/selftest/ktest-krb5_ccache-3.txtz-../../../source3/selftest/ktest-krb5_ccache-3r   r!   r   r   r   Śtest_ndrdump_Krb5ccachef  s(    ž’ ž’ z$NdrDumpTests.test_ndrdump_Krb5ccachec              
   C   sr   d}d}z|   d”}W n. tyD } z|  |” W Y d }~n
d }~0 0 |  |d t| |” |  | |”” d S )NsF  pull returned Success
WARNING! 2 unread bytes
[0000] 00 00                                              .. 
    spoolss_EnumForms: struct spoolss_EnumForms
        out: struct spoolss_EnumForms
            count                    : *
                count                    : 0x00000100 (256)
            info                     : *
                info                     : *
                    info: ARRAY(256)
                        info                     : union spoolss_FormInfo(case 0)
                        info                     : union spoolss_FormInfo(case 0)
sz  info                     : union spoolss_FormInfo(case 0)
                        info                     : union spoolss_FormInfo(case 0)
                        info                     : union spoolss_FormInfo(case 0)
                        info                     : union spoolss_FormInfo(case 0)
                        info                     : union spoolss_FormInfo(case 0)
                        info                     : union spoolss_FormInfo(case 0)
            needed                   : *
                needed                   : 0x00000000 (0)
            result                   : DOS code 0xa9a9a900
dump OK
z\ndrdump spoolss spoolss_EnumForms out --base64-input --input AAAAAQAAAAAAAAAAAAEAAACpqakAAA=)r   r   r   r   r'   r(   r)   ©r
   Zexpected_headZexpected_tailr#   r$   r   r   r   Ś%test_ndrdump_fuzzed_spoolss_EnumForms  s    ’ ’z2NdrDumpTests.test_ndrdump_fuzzed_spoolss_EnumFormsc              
   C   s   t |  d” ”  d”}d}z|  d|  d” ”}W n. tyb } z|  |” W Y d }~n
d }~0 0 |  |d t| |” |  	| 
|”” d S )Nzxattr_NTACL.txtr<   r&   z:ndrdump xattr xattr_NTACL struct --hex-input %s --validatezxattr_NTACL.dat)r   r   r   r    r   r   r   r   r'   r(   r)   rL   r   r   r   Śtest_ndrdump_xattr_NTACL²  s    ’’ ’z%NdrDumpTests.test_ndrdump_xattr_NTACLc              
   C   sf   t |  d” ”  d”}z|  d”}W n. tyT } z|  |” W Y d }~n
d }~0 0 |  ||” d S )Nzdnsp-DnssrvRpcRecord.txtr<   zsndrdump dnsp dnsp_DnssrvRpcRecord struct --input BQAPAAXwAAC3AAAAAAADhAAAAAAAAAAAAAoBAAA= --base64-input --validate)r   r   r   r    r   r   r   r   r!   r   r   r   Ś!test_ndrdump_dnsp_DnssrvRpcRecordĆ  s    ’ z.NdrDumpTests.test_ndrdump_dnsp_DnssrvRpcRecordc              
   C   sR   d}z|   d”}W n. ty@ } z|  |” W Y d }~n
d }~0 0 |  ||” d S )Ns?  pull returned Success
WARNING! 13 unread bytes
[0000] F5 FF 00 3C 3C 25 FF 70   16 1F A0 12 84            ...<<%.p .....
    PAC_BUFFER: struct PAC_BUFFER
        type                     : UNKNOWN_ENUM_VALUE (1094251328)
        _ndr_size                : 0x048792c6 (75993798)
        info                     : NULL
        _pad                     : 0x06000000 (100663296)
push returned Success
pull returned Success
    PAC_BUFFER: struct PAC_BUFFER
        type                     : UNKNOWN_ENUM_VALUE (1094251328)
        _ndr_size                : 0x00000000 (0)
        info                     : NULL
        _pad                     : 0x00000000 (0)
WARNING! orig bytes:29 validated pushed bytes:16
WARNING! orig and validated differ at byte 0x04 (4)
WARNING! orig byte[0x04] = 0xC6 validated byte[0x04] = 0x00
dump OK
zlndrdump krb5pac PAC_BUFFER struct --validate --input QPM4QcaShwQAAAAAAAAABvX/ADw8Jf9wFh+gEoQ= --base64-inputr:   r!   r   r   r   Ś)test_ndrdump_fuzzed_NULL_union_PAC_BUFFERŃ  s    ’ z6NdrDumpTests.test_ndrdump_fuzzed_NULL_union_PAC_BUFFERc              
   C   s   t |  d” ”  d”}z|  dd”}W n. tyV } z|  |” W Y d }~n
d }~0 0 d}t |d|”}t |d|”}|  	||” d S )Nz$fuzzed_ntlmssp-CHALLENGE_MESSAGE.txtr<   zndrdump ntlmssp CHALLENGE_MESSAGE struct --validate --input 'AAAACwIAAAAAJwIAAAAAAAcAAAAAAAAAAIAbhG8uyk9dAL0mQE73MAAAAAAAAAAA' --base64-inputr1   s"   \.\./\.\./librpc/ndr/ndr\.c:[0-9]+ó    )
r   r   r   r    r3   r   r   ŚreŚsubr   )r
   r"   r#   r$   Zregexr   r   r   Ś9test_ndrdump_fuzzed_NULL_struct_ntlmssp_CHALLENGE_MESSAGEš  s    ż zFNdrDumpTests.test_ndrdump_fuzzed_NULL_struct_ntlmssp_CHALLENGE_MESSAGEc              
   C   sb   t |  d”d ” }z|  d”}W n. tyP } z|  |” W Y d }~n
d }~0 0 |  ||” d S )Nz!fuzzed_drsuapi_DsGetNCChanges.txtŚrba  ndrdump drsuapi 3 out --base64-input --input AQAAAAEAAAAGAKoAAAAGAKoGAAMAAQAAAAYAEwAAAAAAAAAA/wAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAABbAAAAAAAAAAAAAAkRAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPkAAAAAAAABAAD4BgATAAAAAAAAAAD/AAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAFsAAAAAAAAAAAAABgAQAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAMAAAABAAAACREAAAEAAAABAAAAAAAAAAYAEAABAAgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAA=)r   r   r   r   r   r   r   r!   r   r   r   Ś"test_fuzzed_drsuapi_DsGetNCChanges  s    ’ z/NdrDumpTests.test_fuzzed_drsuapi_DsGetNCChangesc              
   C   sb   d}d}z|   |d”}W n. tyF } z|  |” W Y d }~n
d }~0 0 |  | d”|d ” d S )Nzpull returned Buffer Size Errorzendrdump drsuapi 3 out --base64-input --input BwAAAAcAAAAGAAAAAwAgICAgICAJAAAAICAgIAkAAAAgIAAA//////8=r6   r<   r=   r>   rE   r   r   r   Ś#test_ndrdump_fuzzed_ndr_compression  s    ’ z0NdrDumpTests.test_ndrdump_fuzzed_ndr_compressionc              
   C   sV   d}d}z|   |”}W n. tyD } z|  |” W Y d }~n
d }~0 0 |  ||” d S )NsŚ  pull returned Success
    dnsp_DnsProperty_short: struct dnsp_DnsProperty_short
        wDataLength              : 0x00000000 (0)
        namelength               : 0x00000000 (0)
        flag                     : 0x00000000 (0)
        version                  : 0x00000001 (1)
        id                       : DSPROPERTY_ZONE_NS_SERVERS_DA (146)
        data                     : union dnsPropertyData(case 0)
        name                     : 0x00000000 (0)
dump OK
zbndrdump dnsp dnsp_DnsProperty_short struct --base64-input --input AAAAAAAAAAAAAAAAAQAAAJIAAAAAAAAAr:   rE   r   r   r   Śtest_ndrdump_short_dnsProperty  s    ’ z+NdrDumpTests.test_ndrdump_short_dnsPropertyN)&Ś__name__Ś
__module__Ś__qualname__Ś__doc__r   r   r   r   r   r   r%   r*   r.   r/   r0   r4   r7   r8   r9   r;   r@   rA   rB   rC   rD   rF   rG   rI   rJ   rK   rM   rN   rO   rP   rT   rV   rW   rX   r   r   r   r   r      sF   '%r   )Z
__future__r   r   rR   Zsamba.testsr   r   r   Śabspathr   ŚdirnameŚ__file__r	   r   r   r   r   r   Ś<module>   s
   