
    g:                         S SK Jr  S SKrS SKJrJr  S SKJr  S SKJ	r	  S SK
JrJrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJrJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S SK J!r!J"r"J#r#J$r$  Sr% " S S\&5      r'g)    )StringION)
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S rSrSS jrS rS rS rSS jrS r	S	 r
S
 rS rSS jrS rS rS rS rS rS rSrg)RegistryGroupPolicies1   Nc                    Xl         X l        X0l        X@l        U R                  R	                  S5      nSR                  UR                  5       SUS/5      U l        SR                  U R                  S/5      U l        [        U R                  U R                   5      U l
        U(       a  UR                  S5      (       a  USS  nO [        U R                  U R                  5      n[        USU R                  U R                  S	9U l        [        R                   [        R"                  -  [        R$                  -  nU R                  R'                  U R                  [(        R*                  S
/S9S   n	U	S
   S   n
[-        [        R.                  U
5      R1                  5       n[        R2                  " U R                  R5                  5       5      n[7        X5      n[        R.                  R9                  X5      U l        g )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__RegistryGroupPolicies.__init__2   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                     [        [        R                  U R                  R	                  U5      5      nU$ ! [
         aC  nUR                  S   [        [        [        4;   a  [        R                  " 5       n S nAU$ e S nAff = f)Nr   )
r   r   filer3   loadfiler   argsr   r   r   )r@   r0   pol_dataes       rI   __load_registry_pol)RegistryGroupPolicies.__load_registry_polT   sv    	!$))TYY-?-?-IJH   	vvay:<<> >  99;  	s   37 
B7A?>A??Bc                     [        U R                  U5        U R                  R                  X#5        U R                  R                  X R                  5        g N)r   r3   savefileset_aclr?   )r@   file_dir	file_namedatas       rI   __save_file!RegistryGroupPolicies.__save_file`   s8    dii2		9+		)ZZ0rL   c                 :    U R                  X[        U5      5        g rV   )!_RegistryGroupPolicies__save_filer   )r@   r/   r0   rQ   s       rI   __save_registry_pol)RegistryGroupPolicies.__save_registry_pole   s    HX,>?rL   c                 0   [        U5      [        :w  a  [        S5      eU Hm  n[        U5      [        :w  a  [        S5      e/ SQnU(       d  UR	                  SS/5        [        U Vs/ s H  oUU;   PM	     sn5      (       a  Md  [        S5      e   g s  snf )NzJSON not formatted correctly)keyname	valuenameclassr[   type)rf   listSyntaxErrordictextendall)r@   
json_inputremoveentrykeysks         rI   __validate_json%RegistryGroupPolicies.__validate_jsonh   s    
t#<==EE{d"!"@AA4DVV,-D1DqU
D122!"@AA   2s   )B
c                     [        US   [        5      (       a  US   $ [        S5       H'  n[        U5      US   R	                  5       :X  d  M%  Us  $    [        SUS   -  5      e)Nrf      zUnknown type %s)
isinstancer   ranger   upper	TypeError)r@   rn   is      rI   __determine_data_type+RegistryGroupPolicies.__determine_data_typet   s`    eFmV,,= 2Yq>U6]%8%8%::H  )E&M9::rL   c                 6   U[         :X  a  [        U5      [        :X  a  [        U5      $ U[        :X  a8  [        U5      [        :X  a%  SR                  U5      S-   nUR                  S5      $ U[        :X  a$  [        U5      [        :X  a  UR                  S5      $ U$ )N z  z	utf-16-leutf-8)	r   rf   rg   bytesr   r-   encoder   str)r@   rtyper[   s      rI   
__set_data RegistryGroupPolicies.__set_data}   sz    J4:#5;l"tDzT'9==&3D;;{++f_ds!2;;w''rL   c                    UR                    HQ  nUR                  US   :X  d  M  UR                  US   :X  d  M-  U R                  UR                  US   5      Ul          g    [        R                  " 5       nUS   Ul        US   Ul        U R                  U5      Ul        U R                  UR                  US   5      Ul        [        UR                   5      nUR                  U5        XAl         [        U5      Ul        g )Nrc   rd   r[   )entriesrc   rd    _RegistryGroupPolicies__set_datarf   r[   r   rn   +_RegistryGroupPolicies__determine_data_typerg   appendlennum_entries)r@   rQ   rn   rR   r   s        rI   __pol_replace#RegistryGroupPolicies.__pol_replace   s    !!AyyE),,{{eK00v?	 " 

Ai(AI,AK//6AF__QVVU6];AF8++,GNN1&#&w<H rL   c                     / nUR                    H<  nUR                  US   :X  a  UR                  US   :X  a  M+  UR                  U5        M>     X1l         [	        U5      Ul        g )Nrc   rd   )r   rc   rd   r   r   r   )r@   rQ   rn   r   rR   s        rI   __pol_remove"RegistryGroupPolicies.__pol_remove   sY    !!AIIy!11KK5#55q! " #"7|rL   c                    U(       d  U(       d  g U R                   S-  n U R                  R                  U5      n[        5       nUR                  U5        SnSnSn	UR                  R                  SS5      (       a>  [        UR                  R                  SS5      R                  S5      5      nUS-  nUS-	  n	U(       a  US-  nU(       a  U	S-  n	U	S-  U-   nUR                  R!                  S5      (       d  UR                  R#                  S5        UR                  R%                  SS['        U5      5        [)        5        n
UR                  R+                  U
5        U
R-                  S5        U R/                  U R                   S	-  UU
R1                  5       R                  S5      5        S S S 5        [2        R4                  " 5       nU R6                  Ul        [2        R:                  " ['        U5      [2        R<                  S
5      US'   U R>                  RA                  U5        g ! [         a4  nUR                  S   [
        [        [        4;   a  [        n S nAGN)e S nAff = f! , (       d  f       N= f)NzGPT.INIr   GeneralVersionr~   i         versionNumber	new_value)!r/   r3   rO   r   rP   r   r   r   	GPT_EMPTYr   parseini_conf
has_optionintr,   r   has_sectionadd_sectionsetr   r   writeseekr_   readr8   Messager1   dnMessageElementFLAG_MOD_REPLACEr+   modify)r@   machine_changeduser_changedGPT_INIr[   rR   parserversionmachine_versionuser_versionout_datams               rI   increment_gpt_ini'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5OO''	2Iy#g,?Z8OO!!(+MM!T\\B.%]]_33G<>  KKM~~++CL#:N:N,;=+

!M  	vvay:<<> > !	6 Zs*   H, A*I-,
I*6(I%$I%%I*-
I;c                      [        U5      nUS;  a  [	        S5      eSU-  $ ! [         a(  nUR                  S   [        :X  a  [	        S5      ee S nAff = f)Nr   z&Extension name not formatted correctly)gPCMachineExtensionNamesgPCUserExtensionNameszExtension attribute incorrectz{%s})r   r   rP   r   rh   )r@   ext_nameext_attrext_name_guidrR   s        rI   !__validate_extension_registration7RegistryGroupPolicies.__validate_extension_registration   sh    	 NM
  5 5=>>%%  	vvay77!"JKK	s   # 
A#AAc                     U R                  X5      nU R                  R                  U R                  [        R
                  U/S9n[        U5      S:X  d  X#S   ;  a  SnO[        US   U   S   5      nX;  a  SUR                  S5      -   U-   S-   nOg [        R                  " 5       nU R                  Ul
        [        R                  " U[        R                  U5      US'   U R                  R                  U5        g )Nr&   r   z[][]r   )7_RegistryGroupPolicies__validate_extension_registrationr+   r7   r1   r8   r9   r   r   stripr   r   r   r   r   r@   r   r   res	ext_namesr   s         rI   register_extension_name-RegistryGroupPolicies.register_extension_name   s    99(MjjT^^3>>'/j   2s8q=HF2I"3q6(#3B#78I$iood33h>DIKKM~~++Is7K7K,46+

!rL   c                    U R                  X5      nU R                  R                  U R                  [        R
                  U/S9n[        U5      S:X  d  X#S   ;  a  g [        US   U   S   5      nX;   a  UR                  US5      nOg [        R                  " 5       nU R                  Ul
        [        R                  " U[        R                  U5      US'   U R                  R                  U5        g )Nr&   r   r   r   r   )r   r+   r7   r1   r8   r9   r   r   replacer   r   r   r   r   r   s         rI   unregister_extension_name/RegistryGroupPolicies.unregister_extension_name   s    99(MjjT^^3>>'/j   2s8q=HF2"3q6(#3B#78I !))(B7IKKM~~++Is7K7K,46+

!rL   c                 N   U R                  USS9  U R                  U R                  S-  5      nU R                  U R                  S-  5      nSnSnU HV  nUS   R                  5       nUS:X  d  US:X  a  SnU R	                  X65        US	:X  d  US:X  d  MC  SnU R	                  X&5        MX     U(       a-  U R                  U R                  S-  U R                  S-  U5        U(       a-  U R                  U R                  S-  U R                  S-  U5        U R                  XE5        g
)ab  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)rm   UserMachineFre   machinebothuserN)%_RegistryGroupPolicies__validate_json)_RegistryGroupPolicies__load_registry_polr0   r.   "_RegistryGroupPolicies__pol_remove)_RegistryGroupPolicies__save_registry_polr/   r   r@   rl   user_pol_datamachine_pol_datar   r   rn   clss           rI   remove_sRegistryGroupPolicies.remove_s  s   $ 	Z5001GH33DMMI4MNE.&&(Ci3&="&!!"2:f}v#!!-7   $$T\\F%:%)]]V%;%24 $$T\\I%=%)]]Y%>%57 	=rL   c                 P   U R                  U5        U R                  U R                  S-  5      nU R                  U R                  S-  5      nSnSnU HV  nUS   R                  5       nUS:X  d  US:X  a  SnU R	                  X65        US:X  d  US:X  d  MC  SnU R	                  X&5        MX     U(       a-  U R                  U R                  S-  U R                  S-  U5        U(       a-  U R                  U R                  S-  U R                  S-  U5        U R                  XE5        g	)
a  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   Fre   r   r   Tr   N)r   r   r0   r.   #_RegistryGroupPolicies__pol_replacer   r/   r   r   s           rI   merge_sRegistryGroupPolicies.merge_s,  s   , 	Z(001GH33DMMI4MNE.&&(Ci3&="&""#3;f}v#""=8   $$T\\F%:%)]]V%;%24 $$T\\I%=%)]]Y%>%57 	=rL   c                 ,   U R                  U5        [        R                  " 5       n[        R                  " 5       nSnSnU HV  nUS   R                  5       nUS:X  d  US:X  a  SnU R	                  X65        US:X  d  US:X  d  MC  SnU R	                  X&5        MX     U(       a-  U R                  U R                  S-  U R                  S-  U5        U(       a-  U R                  U R                  S-  U R                  S-  U5        U R                  XE5        g	)
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"
    },
]
Fre   r   r   Tr   r   r   N)	r   r   rN   r.   r   r   r/   r0   r   r   s           rI   	replace_sRegistryGroupPolicies.replace_sZ  s    ( 	Z(		99;E.&&(Ci3&="&""#3;f}v#""=8   $$T\\F%:%)]]V%;%24 $$T\\I%=%)]]Y%>%57 	=rL   )	r3   r$   r?   r*   r#   r/   r0   r1   r+   rV   )F)FF)__name__
__module____qualname____firstlineno__rJ   r   r_   r   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes__ rL   rI   r   r   1   sY     ED
1
@
B;	0",,\
&&&(>T,>\*>rL   r   )(ior   r8   	samba.ndrr   r   samba.dcerpcr   samba.netcmd.commonr   samba.netcmd.gpcommonr   r	   r
   sambar   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   rL   rI   <module>r      sa   $  
 *  - 
    &  / # ! $ D D 
S>F S>rL   