a
    cl_'                     @   s`   d dl Z d dlmZmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZ G dd deZdS )	    N)Element
SubElement)preg)misc)ndr_pack
ndr_unpack)GPParserc                   @   sl   e Zd ZdZejdejdejdejdej	dej
dejdejd	iZd
d Zdd Zdd Zdd Zdd ZdS )GPPolParserNREG_NONEREG_SZ	REG_DWORDREG_DWORD_BIG_ENDIAN	REG_QWORDREG_EXPAND_SZREG_MULTI_SZ
REG_BINARYc                 C   s   | j |}|d u rdS |S )NZREG_UNKNOWN)reg_typeget)selfvalZret r   7/usr/lib/python3/dist-packages/samba/gp_parse/gp_pol.pymap_reg_type0   s    zGPPolParser.map_reg_typec                 C   s   t tj|| _d S )N)r   r   filepol_file)r   contentsr   r   r   parse6   s    zGPPolParser.parsec           	      C   sz  t  | _|jd | jj_t|jd | jj_t|jd | j_g }|	dD ]}t 
 }t|jd }||_|dj|_|dj}|d u rd}||_tj|krd	d
 |	dD }d|d d|_ntj|krntj|kstj|kr|dj}|d u rd}||_nLtj|ks:tj|ks:tj|krNt|dj|_nt|dj|_|| qN|| j_d S )N	signatureversionnum_entriesEntrytypeKey	ValueName c                 S   s   g | ]
}|j qS r   )text).0xr   r   r   
<listcomp>O       z(GPPolParser.load_xml.<locals>.<listcomp>Value z  zutf-16le)r   r   r   attribheaderr   intr   r   findallentryr!   findr%   keyname	valuenamer   r   joinencodedatar
   r   r   r   r   r   base64Z	b64decodeappendentries)	r   rootr9   er0   Z
entry_typeZ
value_namevaluesZ
string_valr   r   r   load_xml9   sF    




zGPPolParser.load_xmlc                 C   s  t |d}td}t| jj|jd< | jjj|jd< t| jjj|jd< | jj	D ]}t
|d}t|j|jd< | |j|jd< t
|d	}|j|_t
|d
}|j|_tj|jkr|jddd}|D ]}	t
|d}
|	|
_qqTtj|jks>tj|jks>tj|jks>tj|jks>tj|jks>tj|jkrVt
|d}
t|j|
_qTt
|d}
t|jd|
_qT| || W d    n1 s0    Y  d S )NwbZPolFiler   r   r   r    r!   Z	type_namer"   r#   zutf-16r+   r*   utf8)openr   strr   r   r,   r-   r   r   r9   r   r!   r   r2   r%   r3   r   r   r6   decoderstripsplitr
   r   r   r   r   r   r7   Z	b64encodeZwrite_pretty_xml)r   filenamefr:   r0   childkeyr3   Zmultimvaluer   r   r   	write_xmle   sD    











zGPPolParser.write_xmlc                 C   sB   t |d$}t| j}|| W d    n1 s40    Y  d S )Nr>   )r@   r   r   write)r   rE   rF   Zbinary_datar   r   r   write_binary   s    
zGPPolParser.write_binary)__name__
__module____qualname__r   r   r
   r   r   r   r   r   r   r   r   r   r   r=   rK   rM   r   r   r   r   r	   "   s   ,+r	   )r7   Zxml.etree.ElementTreer   r   Zsamba.dcerpcr   r   Z	samba.ndrr   r   Zsamba.gp_parser   r	   r   r   r   r   <module>   s   