
    Id:                         d dl Z d dlmZ 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mZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dl!m"Z"m#Z#m$Z$m%Z% dZ& G d de'      Z(y)    N)StringIO)
ndr_unpackndr_pack)preg)netcmd_finddc)create_directory_hiersmb_connection
get_gpo_dn)NTSTATUSError)Number)str_regtype)NT_STATUS_OBJECT_NAME_INVALIDNT_STATUS_OBJECT_NAME_NOT_FOUNDNT_STATUS_OBJECT_PATH_NOT_FOUNDNT_STATUS_INVALID_PARAMETER)GPTIniParser)
get_string)security)dsacl2fsacl)
REG_BINARYREG_MULTI_SZREG_SZGUIDz
[General]
Version=0
c                   r    e Zd ZddZd Zd Zd ZddZd Zd Z	d	 Z
d
 ZddZd Zd Zd Zd Zd Zd Zy)RegistryGroupPoliciesNc                    || _         || _        || _        || _        | j                  j	                  d      }dj                  |j                         d|dg      | _        dj                  | j                  dg      | _        t        | j                  | j                         | _
        |r|j                  d      r|dd  }n t        | j                  | j                        }t        |d| j                  | j                  	      | _        t        j                   t        j"                  z  t        j$                  z  }| j                  j'                  | j                  t(        j*                  d
g      d   }	|	d
   d   }
t-        t        j.                  |
      j1                         }t        j2                  | j                  j5                               }t7        ||      }t        j.                  j9                  ||      | _        y )Nrealm\Policiesz%szRegistry.polzldap://   sysvol)lpcredsnTSecurityDescriptorbasescopeattrsr   )gpor"   r#   samdbgetjoinlowerpol_dirpol_filer
   	policy_dn
startswithr   r	   connr   SECINFO_OWNERSECINFO_GROUPSECINFO_DACLsearchldb
SCOPE_BASEr   
descriptoras_sddldom_sidget_domain_sidr   	from_sddlfs_sd)selfr)   r"   r#   r*   hostr   dc_hostnameds_sd_flagsmsg	ds_sd_ndrds_sd
domain_sidsddls                 0/usr/lib/python3/dist-packages/samba/policies.py__init__zRegistryGroupPolicies.__init__3   s   

G$yy%++-S$!GH		4<<"@A#DJJ9DOOI.qr(K'<K";#+&*gg)-5	  ----.,,- jjT^^3>>'=&>   @@AC./2	8..	:BBD %%djj&?&?&AB
5*-((224D
    c                    	 t        t        j                  | j                  j	                  |            }|S # t
        $ rA}|j                  d   t        t        t        fv rt        j                         }n Y d }~|S d }~ww xY w)Nr   )
r   r   filer2   loadfiler   argsr   r   r   )r?   r/   pol_dataes       rH   __load_registry_polz)RegistryGroupPolicies.__load_registry_polU   sy    	!$))TYY-?-?-IJH   	vvay:<<> >  99;  	s   37 	B 6A<<Bc                     t        | j                  |       | j                  j                  ||       | j                  j                  || j                         y N)r   r2   savefileset_aclr>   )r?   file_dir	file_namedatas       rH   __save_filez!RegistryGroupPolicies.__save_filea   s<    dii2		9d+		)TZZ0rJ   c                 <    | j                  ||t        |             y rS   )!_RegistryGroupPolicies__save_filer   )r?   r.   r/   rO   s       rH   __save_registry_polz)RegistryGroupPolicies.__save_registry_polf   s    (HX,>?rJ   c                    t        |      t        k7  rt        d      |D ]^  }t        |      t        k7  rt        d      g d}|s|j	                  ddg       t        |D cg c]  }||v  c}      rUt        d       y c c}w )NzJSON not formatted correctly)keyname	valuenameclassrX   type)ra   listSyntaxErrordictextendall)r?   
json_inputremoveentrykeysks         rH   __validate_jsonz%RegistryGroupPolicies.__validate_jsoni   s    
t#<== 	BEE{d"!"@AA4DVV,-D1qU
12!"@AA	B 2s   "B
c                     t        |d   t              r|d   S t        d      D ]%  }t        |      |d   j	                         k(  s#|c S  t        d|d   z        )Nra      zUnknown type %s)
isinstancer   ranger   upper	TypeError)r?   ri   is      rH   __determine_data_typez+RegistryGroupPolicies.__determine_data_typeu   sb    eFmV,= 2Y q>U6]%8%8%::H )E&M9::rJ   c                 *   |t         k(  rt        |      t        k(  rt        |      S |t        k(  r7t        |      t        k(  r%dj                  |      dz   }|j                  d      S |t        k(  r#t        |      t        k(  r|j                  d      S |S )N z  z	utf-16-leutf-8)	r   ra   rb   bytesr   r,   encoder   str)r?   rtyperX   s      rH   
__set_dataz RegistryGroupPolicies.__set_data~   sz    J4:#5;l"tDzT'9==&3D;;{++f_ds!2;;w''rJ   c                    |j                   D ]M  }|j                  |d   k(  s|j                  |d   k(  s)| j                  |j                  |d         |_         y  t        j                         }|d   |_        |d   |_        | j                  |      |_        | j                  |j                  |d         |_        t        |j                         }|j                  |       ||_         t        |      |_        y )Nr^   r_   rX   )entriesr^   r_    _RegistryGroupPolicies__set_datara   rX   r   ri   +_RegistryGroupPolicies__determine_data_typerb   appendlennum_entries)r?   rO   ri   rP   r~   s        rH   __pol_replacez#RegistryGroupPolicies.__pol_replace   s    !! 	0AyyE),,{{eK00v?		0 

Ai(AI,AK//6AF__QVVU6];AF8++,GNN1&H#&w<H rJ   c                     g }|j                   D ]8  }|j                  |d   k(  r|j                  |d   k(  r(|j                  |       : ||_         t	        |      |_        y )Nr^   r_   )r~   r^   r_   r   r   r   )r?   rO   ri   r~   rP   s        rH   __pol_removez"RegistryGroupPolicies.__pol_remove   s`    !! 	"AIIy!11KK5#55q!	" #"7|rJ   c                    |s|sy | j                   dz  }	 | j                  j                  |      }t               }|j                  |       d}d}d}	|j                  j                  dd      r>t        |j                  j                  dd      j                  d            }|dz  }|dz	  }	|r|dz  }|r|	dz  }	|	dz  |z   }|j                  j!                  d      s|j                  j#                  d       |j                  j%                  ddt'        |             t)               5 }
|j                  j+                  |
       |
j-                  d       | j/                  | j                   d	z  ||
j1                         j                  d             d d d        t3        j4                         }| j6                  |_        t3        j:                  t'        |      t2        j<                  d
      |d<   | j>                  jA                  |       y # t        $ r3}|j                  d   t
        t        t        fv rt        }n Y d }~d }~ww xY w# 1 sw Y   xY w)NzGPT.INIr   GeneralVersionrw   i         versionNumber	new_value)!r.   r2   rM   r   rN   r   r   r   	GPT_EMPTYr   parseini_conf
has_optionintr+   ry   has_sectionadd_sectionsetrz   r   writeseekr[   readr7   Messager0   dnMessageElementFLAG_MOD_REPLACEr*   modify)r?   machine_changeduser_changedGPT_INIrX   rP   parserversionmachine_versionuser_versionout_datams               rH   increment_gpt_iniz'RegistryGroupPolicies.increment_gpt_ini   s   |,,*	99%%g.D T??%%i;&//--i.799?JG%
2O"b=Lq OAL2%8 **95OO''	2Iy#g,?Z 	>8OO!!(+MM!T\\B.%]]_33G<>	> KKM~~++CL#:N:N,;=+

!M  	vvay:<<> > ! 		6	> 	>s$   H (A*I	I(IIIc                     	 t        |      }|dvrt        d      d|z  S # t        j                  $ r'}|j                  d   t        k(  rt        d       d }~ww xY w)Nr   z&Extension name not formatted correctly)gPCMachineExtensionNamesgPCUserExtensionNameszExtension attribute incorrectz{%s})r   sambar   rN   r   rc   )r?   ext_nameext_attrext_name_guidrP   s        rH   !__validate_extension_registrationz7RegistryGroupPolicies.__validate_extension_registration   sn    	 NM
  5 5=>>%% "" 	vvay77!"JKK	s   ! A"AAc                    | j                  ||      }| j                  j                  | j                  t        j
                  |g      }t        |      dk(  s||d   vrd}nt        |d   |   d         }||vrd|j                  d      z   |z   dz   }ny t	        j                         }| j                  |_
        t	        j                  |t        j                  |      |d<   | j                  j                  |       y )Nr%   r   z[][]r   )7_RegistryGroupPolicies__validate_extension_registrationr*   r6   r0   r7   r8   r   r   stripr   r   r   r   r   r?   r   r   res	ext_namesr   s         rH   register_extension_namez-RegistryGroupPolicies.register_extension_name   s    99(HMjjT^^3>>'/j   2s8q=HCF2I"3q6(#3B#78I9$iood33h>DIKKM~~++Is7K7K,46+

!rJ   c                    | j                  ||      }| j                  j                  | j                  t        j
                  |g      }t        |      dk(  s||d   vry t        |d   |   d         }||v r|j                  |d      }ny t	        j                         }| j                  |_
        t	        j                  |t        j                  |      |d<   | j                  j                  |       y )Nr%   r   r   r   r   )r   r*   r6   r0   r7   r8   r   r   replacer   r   r   r   r   r   s         rH   unregister_extension_namez/RegistryGroupPolicies.unregister_extension_name   s    99(HMjjT^^3>>'/j   2s8q=HCF2"3q6(#3B#78Iy !))(B7IKKM~~++Is7K7K,46+

!rJ   c                 8   | j                  |d       | j                  | j                  dz        }| j                  | j                  dz        }d}d}|D ]R  }|d   j                         }|dk(  s|dk(  rd}| j	                  ||       |d	k(  s|dk(  s?d}| j	                  ||       T |r-| j                  | j                  dz  | j                  dz  |       |r-| j                  | j                  dz  | j                  dz  |       | j                  ||       y
)a  remove_s
        json_input: JSON list of entries to remove from GPO

        Example json_input:
        [
            {
                "keyname": "Software\Policies\Mozilla\Firefox\Homepage",
                "valuename": "StartPage",
                "class": "USER",
            },
            {
                "keyname": "Software\Policies\Mozilla\Firefox\Homepage",
                "valuename": "URL",
                "class": "USER",
            },
        ]
        T)rh   UserMachineFr`   machinebothuserN)%_RegistryGroupPolicies__validate_json)_RegistryGroupPolicies__load_registry_polr/   r-   "_RegistryGroupPolicies__pol_remove)_RegistryGroupPolicies__save_registry_polr.   r   r?   rg   user_pol_datamachine_pol_datar   r   ri   clss           rH   remove_szRegistryGroupPolicies.remove_s  s'   $ 	Z5001GH33DMMI4MN 	8E.&&(Ci3&="&!!"2E:f}v#!!-7	8 $$T\\F%:%)]]V%;%24 $$T\\I%=%)]]Y%>%57 	=rJ   c                 4   | j                  |       | j                  | j                  dz        }| j                  | j                  dz        }d}d}|D ]R  }|d   j                         }|dk(  s|dk(  rd}| j	                  ||       |dk(  s|dk(  s?d}| j	                  ||       T |r-| j                  | j                  dz  | j                  dz  |       |r-| j                  | j                  dz  | j                  dz  |       | j                  ||       y	)
ad  merge_s
        json_input: JSON list of entries to merge into GPO

        Example json_input:
        [
            {
                "keyname": "Software\Policies\Mozilla\Firefox\Homepage",
                "valuename": "StartPage",
                "class": "USER",
                "type": "REG_SZ",
                "data": "homepage"
            },
            {
                "keyname": "Software\Policies\Mozilla\Firefox\Homepage",
                "valuename": "URL",
                "class": "USER",
                "type": "REG_SZ",
                "data": "google.com"
            },
        ]
        r   r   Fr`   r   r   Tr   N)r   r   r/   r-   #_RegistryGroupPolicies__pol_replacer   r.   r   r   s           rH   merge_szRegistryGroupPolicies.merge_s-  s"   , 	Z(001GH33DMMI4MN 	9E.&&(Ci3&="&""#3U;f}v#""=%8	9 $$T\\F%:%)]]V%;%24 $$T\\I%=%)]]Y%>%57 	=rJ   c                    | j                  |       t        j                         }t        j                         }d}d}|D ]R  }|d   j                         }|dk(  s|dk(  rd}| j	                  ||       |dk(  s|dk(  s?d}| j	                  ||       T |r-| j                  | j                  dz  | j                  dz  |       |r-| j                  | j                  dz  | j                  dz  |       | j                  ||       y	)
a*  replace_s
        json_input: JSON list of entries to replace entries in GPO

        Example json_input:
        [
            {
                "keyname": "Software\Policies\Mozilla\Firefox\Homepage",
                "valuename": "StartPage",
                "class": "USER",
                "data": "homepage"
            },
            {
                "keyname": "Software\Policies\Mozilla\Firefox\Homepage",
                "valuename": "URL",
                "class": "USER",
                "data": "google.com"
            },
        ]
        Fr`   r   r   Tr   r   r   N)	r   r   rL   r-   r   r   r.   r/   r   r   s           rH   	replace_szRegistryGroupPolicies.replace_s[  s   ( 	Z(		99; 	9E.&&(Ci3&="&""#3U;f}v#""=%8	9 $$T\\F%:%)]]V%;%24 $$T\\I%=%)]]Y%>%57 	=rJ   rS   )F)FF)__name__
__module____qualname__rI   r   r[   r   r   r   r   r   r   r   r   r   r   r   r   r    rJ   rH   r   r   2   sY     ED
1
@
B;	0",,\
&&&(>T,>\*>rJ   r   ))jsonior   r7   	samba.ndrr   r   samba.dcerpcr   samba.netcmd.commonr   samba.netcmd.gpcommonr   r	   r
   r   r   numbersr   samba.registryr   samba.ntstatusr   r   r   r   samba.gp_parse.gp_inir   samba.commonr   r   samba.ntaclsr   samba.dcerpc.miscr   r   r   r   r   objectr   r   rJ   rH   <module>r      sd   $   
 *  - 
    &  / # ! $ D D 
S>F S>rJ   