ó
    cÛ–iÕÁ  ã                   ó¾  • S SK r S SKrS SKrS SKrS SKrS SKr\ R                  R                  S S5        S SKJ	r	  S SK
Jr  S SKJr  S SKrS SKJr  S SKJrJr  S SKJs  Jr  S SK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"  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+  S SK,J-r-  S SK.r.S SKJ/r/  S SK0J1r1  S SK2J3r3  S SK4r4S SK5J6r6J7r7J8r8J9r9J:r:  S SK2J;r;J<r<J=r=  S SKJ>r>  S SK?rS S	KJr  S SK@J@r@   S SKAJBrB  \B" SS5      rC " S S5      rE " S S 5      rF " S! S"\G5      rH " S# S$\H5      rI " S% S&\H5      rJ " S' S(\H5      rK " S) S*\G5      rL " S+ S,\L5      rM " S- S.\L5      rN S/ rO S0 rP " S1 S25      rQS3 rRS4 rSS5 rTS6 rUS7 rVS8 rWS9 rXS: rYS; rZS< r[S= r\SKS> jr]S? r^SLS@ jr_SA r`SB raSC rbSD rc SMSE jrdSNSF jreSNSG jrfSH rgSI rhSNSJ jrig! \D a     " S S5      rC NÛf = f)Oé    Nz
bin/python)ÚWERRORError)ÚConfigParser)ÚStringIO)Ú	get_bytes)ÚABCMetaÚabstractmethod)ÚNet)Únbt)Úlibsmb_samba_internal)ÚUUID)ÚNamedTemporaryFile)Úpreg)Ú
ndr_unpack)ÚSMB_SIGNING_REQUIRED©Úlog)Úblake2b)Ú
get_string)ÚSamDB)Úsystem_session)ÚUF_WORKSTATION_TRUST_ACCOUNTÚUF_SERVER_TRUST_ACCOUNTÚGPLINK_OPT_ENFORCEÚGPLINK_OPT_DISABLEÚGPO_BLOCK_INHERITANCE)Ú AUTH_SESSION_INFO_DEFAULT_GROUPSÚAUTH_SESSION_INFO_AUTHENTICATEDÚ#AUTH_SESSION_INFO_SIMPLE_PRIVILEGES)Úsecurity)Údatetime)ÚEnumÚGPOSTATEzAPPLY ENFORCE UNAPPLYc                   ó    • \ rS rSrSrSrSrSrg)r"   é<   é   é   é   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚAPPLYÚENFORCEÚUNAPPLYÚ__static_attributes__r(   ó    Ú2/usr/lib/python3/dist-packages/samba/gp/gpclass.pyr"   r"   <   s   † ØˆØˆØ‹r1   c                   ó^   • \ 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S rS rS rSrg)Úgp_logéB   aZ  Log settings overwritten by gpo apply
    The gp_log is an xml file that stores a history of gpo changes (and the
    original setting value).

    The log is organized like so:

<gp>
    <user name="KDC-1$">
        <applylog>
            <guid count="0" value="{31B2F340-016D-11D2-945F-00C04FB984F9}" />
        </applylog>
        <guid value="{31B2F340-016D-11D2-945F-00C04FB984F9}">
            <gp_ext name="System Access">
                <attribute name="minPwdAge">-864000000000</attribute>
                <attribute name="maxPwdAge">-36288000000000</attribute>
                <attribute name="minPwdLength">7</attribute>
                <attribute name="pwdProperties">1</attribute>
            </gp_ext>
            <gp_ext name="Kerberos Policy">
                <attribute name="ticket_lifetime">1d</attribute>
                <attribute name="renew_lifetime" />
                <attribute name="clockskew">300</attribute>
            </gp_ext>
        </guid>
    </user>
</gp>

    Each guid value contains a list of extensions, which contain a list of
    attributes. The guid value represents a GPO. The attributes are the values
    of those settings prior to the application of the GPO.
    The list of guids is enclosed within a user name, which represents the user
    the settings were applied to. This user may be the samaccountname of the
    local computer, which implies that these are machine policies.
    The applylog keeps track of the order in which the GPOs were applied, so
    that they can be rolled back in reverse, returning the machine to the state
    prior to policy application.
    Nc                 óp  • [         R                  U l        X l        Xl        U(       a  [
        R                  " U5      U l        O[
        R                  " S5      U l        Xl	        U R                  R                  SU-  5      nUc0  [
        R                  " U R                  S5      nXR                  S'   gg)a6  Initialize the gp_log
param user          - the username (or machine name) that policies are
                      being applied to
param gpostore      - the GPOStorage obj which references the tdb which
                      contains gp_logs
param db_log        - (optional) a string to initialize the gp_log
Úgpúuser[@name="%s"]NÚuserÚname)r"   r-   Ú_stateÚgpostoreÚusernameÚetreeÚ
fromstringÚgpdbÚElementr9   ÚfindÚ
SubElementÚattrib)Úselfr9   r<   Údb_logÚuser_objs        r2   Ú__init__Úgp_log.__init__h   sˆ   € ô —n‘nˆŒØ ŒØŒÞÜ×(Ò(¨Ó0ˆD�IäŸš dÓ+ˆDŒIØŒ	Ø—9‘9—>‘>Ð"4°tÑ";Ó<ˆØÑÜ×'Ò'¨¯	©	°6Ó:ˆHØ&*�O‰O˜FÒ#ð r1   c                 ó  • U[         R                  :X  ah  U R                  R                  SU R                  -  5      nUR                  S5      nUb  [        U5      S:X  a  [         R                  U l        gXl        gXl        g)aç  Policy application state
param value         - APPLY, ENFORCE, or UNAPPLY

The behavior of the gp_log depends on whether we are applying policy,
enforcing policy, or unapplying policy. During an apply, old settings
are recorded in the log. During an enforce, settings are being applied
but the gp_log does not change. During an unapply, additions to the log
should be ignored (since function calls to apply settings are actually
reverting policy), but removals from the log are allowed.
r8   ÚapplylogNr   )r"   r.   r@   rB   r9   Úlenr-   r;   )rE   ÚvaluerG   Ú	apply_logs       r2   ÚstateÚgp_log.state}   sb   € ð ”H×$Ñ$Ó$Ø—y‘y—~‘~Ð&8¸4¿9¹9Ñ&DÓEˆHØ Ÿ™ jÓ1ˆIØÑ ¤C¨	£N°aÓ$7Ü&Ÿn™n�•à#•à�Kr1   c                 ó   • U R                   $ )zCheck the GPOSTATE
        )r;   ©rE   s    r2   Ú	get_stateÚgp_log.get_state“   s   € ð �{‰{Ðr1   c                 ó"  • Xl         U R                  R                  SU R                  -  5      nUR                  SU-  5      nUc%  [        R
                  " US5      nXR                  S'   U R                  [        R                  :X  a‡  UR                  S5      nUc  [        R
                  " US5      nUR                  SU-  5      nUcD  [        R
                  " US5      nS[        U5      S-
  -  UR                  S	'   XR                  S'   ggg)
zLog to a different GPO guid
param guid          - guid value of the GPO from which we're applying
                      policy
r8   úguid[@value="%s"]NÚguidrM   rK   z%dr%   Úcount)rW   r@   rB   r9   r>   rC   rD   r;   r"   r-   rL   )rE   rW   rG   ÚobjrN   ÚprevÚitems          r2   Úset_guidÚgp_log.set_guid˜   sï   € ð
 Œ	Ø—9‘9—>‘>Ð"4°t·y±yÑ"@ÓAˆØ�m‰mÐ/°$Ñ6Ó7ˆØ‰;Ü×"Ò" 8¨VÓ4ˆCØ"&�J‰J�wÑØ�;‰;œ(Ÿ.™.Ó(Ø Ÿ™ jÓ1ˆIØÑ Ü!×,Ò,¨X°zÓB�	Ø—>‘>Ð"5¸Ñ"<Ó=ˆDØ‰|Ü×'Ò'¨	°6Ó:�Ø'+¬s°9«~ÀÑ/AÑ'B�—‘˜GÑ$Ø'+—‘˜GÒ$ð ð )r1   c                 ó  • U R                   [        R                  :X  d  U R                   [        R                  :X  a  gU R                  R                  SU R                  -  5      nUR                  SU R                  -  5      nUc   S5       eUR                  SU-  5      nUc%  [        R                  " US5      nXR                  S'   UR                  SU-  5      nUc,  [        R                  " US	5      nX'R                  S'   X7l        gg)
zóStore an attribute in the gp_log
param gp_ext_name   - Name of the extension applying policy
param attribute     - The attribute being modified
param old_val       - The value of the attribute prior to policy
                      application
Nr8   rV   úgpo guid was not setúgp_ext[@name="%s"]Úgp_extr:   úattribute[@name="%s"]Ú	attribute)r;   r"   r/   r.   r@   rB   r9   rW   r>   rC   rD   Útext)rE   Úgp_ext_namerc   Úold_valrG   Úguid_objÚextÚattrs           r2   ÚstoreÚgp_log.store­   sè   € ð �;‰;œ(×*Ñ*Ó*¨d¯k©k¼X×=MÑ=MÓ.MØØ—9‘9—>‘>Ð"4°t·y±yÑ"@ÓAˆØ—=‘=Ð!4°t·y±yÑ!@ÓAˆØÑ#Ð;Ð%;Ó;Ð#Ø�m‰mÐ0°;Ñ>Ó?ˆØ‰;Ü×"Ò" 8¨XÓ6ˆCØ!,�J‰J�vÑØ�x‰xÐ/°)Ñ;Ó<ˆØ‰<Ü×#Ò# C¨Ó5ˆDØ"+�K‰K˜ÑØ�Ið r1   c                 ó  • U R                   R                  SU R                  -  5      nUR                  SU R                  -  5      nUc   S5       eUR                  SU-  5      nUb#  UR                  SU-  5      nUb  UR                  $ g)a  Retrieve a stored attribute from the gp_log
param gp_ext_name   - Name of the extension which applied policy
param attribute     - The attribute being retrieved
return              - The value of the attribute prior to policy
                      application
r8   rV   Nr_   r`   rb   )r@   rB   r9   rW   rd   ©rE   re   rc   rG   rg   rh   ri   s          r2   ÚretrieveÚgp_log.retrieveÃ   sŠ   € ð —9‘9—>‘>Ð"4°t·y±yÑ"@ÓAˆØ—=‘=Ð!4°t·y±yÑ!@ÓAˆØÑ#Ð;Ð%;Ó;Ð#Ø�m‰mÐ0°;Ñ>Ó?ˆØ‰?Ø—8‘8Ð3°iÑ?Ó@ˆDØÑØ—y‘yÐ Ør1   c                 óT  • U R                   R                  SU R                  -  5      nUR                  SU R                  -  5      nUc   S5       eUR                  SU-  5      nUb;  UR	                  S5      nU Vs0 s H  ofR
                  S   UR                  _M     sn$ 0 $ s  snf )zæRetrieve all stored attributes for this user, GPO guid, and CSE
param gp_ext_name   - Name of the extension which applied policy
return              - The values of the attributes prior to policy
                      application
r8   rV   r_   r`   rc   r:   )r@   rB   r9   rW   ÚfindallrD   rd   )rE   re   rG   rg   rh   Úattrsri   s          r2   Úretrieve_allÚgp_log.retrieve_allÔ   s¡   € ð —9‘9—>‘>Ð"4°t·y±yÑ"@ÓAˆØ—=‘=Ð!4°t·y±yÑ!@ÓAˆØÑ#Ð;Ð%;Ó;Ð#Ø�m‰mÐ0°;Ñ>Ó?ˆØ‰?Ø—K‘K Ó,ˆEÙ?DÓEºu°t—K‘K Ñ'¨¯©Ò2¹uÑEÐEØˆ	ùò Fs   Á=#B%c                 óf  • / nU R                   R                  SU R                  -  5      nUb~  UR                  S5      nUbj  UR                  S5      nU Vs/ s H%  nUR	                  S5      UR	                  S5      4PM'     nnUR                  SS9  UR                  S U 5       5        U$ s  snf )	z�Return a list of applied ext guids
return              - List of guids for gpos that have applied settings
                      to the system.
r8   rK   zguid[@count]rX   rM   T)Úreversec              3   ó*   #   • U  H	  u  pUv •  M     g 7f©Nr(   )Ú.0rX   rW   s      r2   Ú	<genexpr>Ú+gp_log.get_applied_guids.<locals>.<genexpr>ñ   s   é € ÐD²^¡k e�T²^ùs   ‚)r@   rB   r9   rq   ÚgetÚsortÚextend)rE   ÚguidsrG   rN   Ú	guid_objsÚgÚguids_by_counts          r2   Úget_applied_guidsÚgp_log.get_applied_guidsã   s±   € ð
 ˆØ—9‘9—>‘>Ð"4°t·y±yÑ"@ÓAˆØÑØ Ÿ™ jÓ1ˆIØÑ$Ø%×-Ñ-¨nÓ=�	á+4ó"6Ú+4 að $%§5¡5¨£>°1·5±5¸³>Ó"BÙ+4ð ð "6à×#Ñ#¨DÐ#Ñ1Ø—‘ÑD±^ÓDÔDØˆùò	"6s   Á,B.c                 ó€  • / nU R                   R                  SU R                  -  5      nU H�  nUR                  SU-  5      nUR                  S5      n0 nU HK  n0 n	UR                  S5      n
U
 H  nUR                  X›R
                  S   '   M      X—UR
                  S   '   MM     UR                  XG45        M�     U$ )a@  Return a list of applied ext guids
return              - List of tuples containing the guid of a gpo, then
                      a dictionary of policies and their values prior
                      policy application. These are sorted so that the
                      most recently applied settings are removed first.
r8   rV   ra   rc   r:   )r@   rB   r9   rq   rd   rD   Úappend)rE   r   ÚretrG   rW   Úguid_settingsÚextsÚsettingsrh   Ú	attr_dictrr   ri   s               r2   Úget_applied_settingsÚgp_log.get_applied_settingsô   s½   € ð ˆØ—9‘9—>‘>Ð"4°t·y±yÑ"@ÓAˆÛˆDØ$ŸM™MÐ*=ÀÑ*DÓEˆMØ ×(Ñ(¨Ó2ˆDØˆHÛ�Ø�	ØŸ™ KÓ0�Û!�DØ59·Y±Y�IŸk™k¨&Ñ1Ó2ñ "à/8˜Ÿ™ FÑ+Ó,ñ ð �J‰J˜Ð'Ö(ñ ð ˆ
r1   c                 óh  • U R                   R                  SU R                  -  5      nUR                  SU R                  -  5      nUc   S5       eUR                  SU-  5      nUbK  UR                  SU-  5      nUb3  UR	                  U5        [        U5      S:X  a  UR	                  U5        gggg)z¯Remove an attribute from the gp_log
param gp_ext_name   - name of extension from which to remove the
                      attribute
param attribute     - attribute to remove
r8   rV   Nr_   r`   rb   r   )r@   rB   r9   rW   ÚremoverL   rm   s          r2   ÚdeleteÚgp_log.delete
  s¯   € ð —9‘9—>‘>Ð"4°t·y±yÑ"@ÓAˆØ—=‘=Ð!4°t·y±yÑ!@ÓAˆØÑ#Ð;Ð%;Ó;Ð#Ø�m‰mÐ0°;Ñ>Ó?ˆØ‰?Ø—8‘8Ð3°iÑ?Ó@ˆDØÑØ—
‘
˜4Ô Ü�s“8˜q“=Ø—O‘O CÕ(ð !ð  ð r1   c                 óŽ   • U R                   R                  U R                  [        R                  " U R
                  S5      5        g)zWrite gp_log changes to disk úutf-8N)r<   rj   r=   r>   Útostringr@   rR   s    r2   ÚcommitÚgp_log.commit  s)   € à�‰×Ñ˜DŸM™M¬5¯>ª>¸$¿)¹)ÀWÓ+MÕNr1   )r;   r@   r<   rW   r9   r=   rx   )r)   r*   r+   r,   Ú__doc__rH   rO   rS   r\   rj   rn   rs   rƒ   rŒ   r�   r•   r0   r(   r1   r2   r4   r4   B   s@   † ñ$ôJ+ò* ò,ò
,ò* ò,ò"òò"ò,)õ"Or1   r4   c                   óP   • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rSrg)Ú
GPOStoragei   c                 ó  • [         R                  R                  U5      (       a  [        R                  " U5      U l        g [        R                  " US[        R                  [         R                  [         R                  -  5      U l        g )Nr   )
ÚosÚpathÚisfileÚtdbÚopenr   ÚTdbÚDEFAULTÚO_CREATÚO_RDWR)rE   Úlog_files     r2   rH   ÚGPOStorage.__init__!  sL   € Ü�7‰7�>‰>˜(×#Ñ#Ü—x’x Ó)ˆD�Hä—w’w˜x¨¬C¯K©K¼¿¹ÄbÇiÁiÑ9OÓPˆD�Hr1   c                 ó8   • U R                   R                  5         g rx   )r   Útransaction_startrR   s    r2   ÚstartÚGPOStorage.start'  s   € Ø�‰×"Ñ"Õ$r1   c                 ó~   •  [        U R                  R                  [        U5      5      5      $ ! [         a     g f = frx   )Úintr   r|   r   Ú	TypeError©rE   Úkeys     r2   Úget_intÚGPOStorage.get_int*  s5   € ð	Ü�t—x‘x—|‘|¤I¨c£NÓ3Ó4Ð4øÜó 	Ùð	ús   ‚,/ ¯
<»<c                 óJ   • U R                   R                  [        U5      5      $ rx   )r   r|   r   r­   s     r2   r|   ÚGPOStorage.get0  s   € Ø�x‰x�|‰|œI c›NÓ+Ð+r1   c           	      ó^   • [        XU R                  R                  [        U5      5      5      $ rx   )r4   r   r|   r   )rE   r9   s     r2   Ú	get_gplogÚGPOStorage.get_gplog3  s    € Ü�d $§(¡(§,¡,¬y¸«Ó"?Ó@Ð@r1   c                 ó`   • U R                   R                  [        U5      [        U5      5        g rx   )r   rj   r   )rE   r®   Úvals      r2   rj   ÚGPOStorage.store6  s   € Ø�‰�‰”y “~¤y°£~Õ6r1   c                 ó8   • U R                   R                  5         g rx   )r   Útransaction_cancelrR   s    r2   ÚcancelÚGPOStorage.cancel9  ó   € Ø�‰×#Ñ#Õ%r1   c                 óL   • U R                   R                  [        U5      5        g rx   )r   r�   r   r­   s     r2   r�   ÚGPOStorage.delete<  s   € Ø�‰�‰œ	 #›Õ'r1   c                 ó8   • U R                   R                  5         g rx   )r   Útransaction_commitrR   s    r2   r•   ÚGPOStorage.commit?  r½   r1   c                 ó8   • U R                   R                  5         g rx   )r   ÚcloserR   s    r2   Ú__del__ÚGPOStorage.__del__B  s   € Ø�‰�‰Õr1   r   N)r)   r*   r+   r,   rH   r¨   r¯   r|   r´   rj   r»   r�   r•   rÅ   r0   r(   r1   r2   r™   r™      s6   † òQò%òò,òAò7ò&ò(ò&õr1   r™   c                   ód   • \ rS rSr\rS r\S 5       r\S 5       r	S r
\S 5       r\S 5       rSrg	)
ra   iF  c                 óT   • Xl         X l        X0l        UR                  U5      U l        g rx   )ÚlpÚcredsr=   r´   Úgp_db)rE   rÉ   rÊ   r=   rj   s        r2   rH   Úgp_ext.__init__I  s!   € ØŒØŒ
Ø ŒØ—_‘_ XÓ.ˆ�
r1   c                 ó   • g rx   r(   )rE   Údeleted_gpo_listÚchanged_gpo_lists      r2   Úprocess_group_policyÚgp_ext.process_group_policyO  ó   € àr1   c                 ó   • g rx   r(   )rE   Úpolicys     r2   ÚreadÚgp_ext.readS  rÒ   r1   c                 ó  • U R                   R                  S5      n[        R                  R	                  U[        U5      R                  5       5      n[        R                  R                  U5      (       a  U R                  U5      $ g )NÚ	gpo_cache)	rÉ   Ú
cache_pathr›   rœ   ÚjoinÚcheck_safe_pathÚupperÚexistsrÕ   )rE   ÚafileÚ
local_pathÚ	data_files       r2   ÚparseÚgp_ext.parseW  s]   € Ø—W‘W×'Ñ'¨Ó4ˆ
Ü—G‘G—L‘L ¬_¸UÓ-C×-IÑ-IÓ-KÓLˆ	Ü�7‰7�>‰>˜)×$Ñ$Ø—9‘9˜YÓ'Ð'Ør1   c                 ó   • g rx   r(   rR   s    r2   Ú__str__Úgp_ext.__str__^  rÒ   r1   c                 ó   • 0 $ rx   r(   )rE   Úgpos     r2   ÚrsopÚgp_ext.rsopb  s   € àˆ	r1   )rÊ   rË   rÉ   r=   N)r)   r*   r+   r,   r   Ú__metaclass__rH   r   rÐ   rÕ   rá   rä   rè   r0   r(   r1   r2   ra   ra   F  sa   † Ø€Mò/ð ñó ðð ñó ðòð ñó ðð ñó ór1   ra   c                   ó   • \ rS rSrS rSrg)Ú
gp_inf_extig  c                 ó`  • [        US5       nUR                  5       nS S S 5        [        S S9n[        Ul         UR                  [        WR                  5       5      5        U$ ! , (       d  f       NM= f! [         a-    UR                  [        WR                  S5      5      5         U$ f = f)NÚrb©Úinterpolationúutf-16)	rŸ   rÕ   r   ÚstrÚoptionxformÚ	read_filer   ÚdecodeÚUnicodeDecodeError)rE   rà   ÚfrÔ   Úinf_confs        r2   rÕ   Úgp_inf_ext.readh  s’   € Ü�)˜TÔ" aØ—V‘V“XˆF÷ #ä¨dÑ3ˆÜ"ˆÔð	BØ×Ñœx¨¯©«Ó8Ô9ð ˆ÷ #Õ"ûô "ó 	BØ×Ñœx¨¯©°hÓ(?Ó@ÕAØˆð	Bús   �A%»(A6 Á%
A3Á63B-Â,B-r(   N©r)   r*   r+   r,   rÕ   r0   r(   r1   r2   rì   rì   g  s   † õ	r1   rì   c                   ó   • \ rS rSrS rSrg)Ú
gp_pol_extit  c                 ó¢   • [        US5       nUR                  5       nS S S 5        [        [        R                  W5      $ ! , (       d  f       N(= f)Nrî   )rŸ   rÕ   r   r   Úfile©rE   rà   r÷   Úraws       r2   rÕ   Úgp_pol_ext.readu  s8   € Ü�)˜TÔ" aØ—&‘&“(ˆC÷ #äœ$Ÿ)™) SÓ)Ð)÷ #Õ"ús   �A Á 
Ar(   Nrú   r(   r1   r2   rü   rü   t  s   † õ*r1   rü   c                   ó   • \ rS rSrS rSrg)Ú
gp_xml_exti{  c                 ó"  • [        US5       nUR                  5       nS S S 5         [        R                  " WR	                  5       5      $ ! , (       d  f       N3= f! [
         a(    [        R                  " WR	                  S5      5      s $ f = f)Nrî   rñ   )rŸ   rÕ   r>   r?   rõ   rö   rÿ   s       r2   rÕ   Úgp_xml_ext.read|  sm   € Ü�)˜TÔ" aØ—&‘&“(ˆC÷ #ð	:Ü×#Ò# C§J¡J£LÓ1Ð1÷ #Õ"ûô "ó 	:Ü×#Ò# C§J¡J¨xÓ$8Ó9Ò9ð	:ús   �A§#A Á
AÁ/BÂBr(   Nrú   r(   r1   r2   r  r  {  s   † õ:r1   r  c                   óp   • \ rS rSrSr\rS rS rS r	S r
S rS rS	 r\S
 5       r\S 5       rSS jrSrg)Ú
gp_applieri…  zÇGroup Policy Applier/Unapplier/Modifier
The applier defines functions for monitoring policy application,
removal, and modification. It must be a multi-derived class paired
with a subclass of gp_ext.
c                 ó¸   • U R                   R                  U5        U R                   R                  [        U 5      X#5        U R                   R	                  5         g)a$  Add an attribute and value to the Group Policy cache
guid        - The GPO guid which applies this policy
attribute   - The attribute name of the policy being applied
value       - The value of the policy being applied

Normally called by the subclass apply() function after applying policy.
N)rË   r\   rj   rò   r•   ©rE   rW   rc   rM   s       r2   Úcache_add_attributeÚgp_applier.cache_add_attribute�  s>   € ð 	�
‰
×Ñ˜DÔ!Ø�
‰
×Ñœ˜T› IÔ5Ø�
‰
×ÑÕr1   c                 ó¸   • U R                   R                  U5        U R                   R                  [        U 5      U5        U R                   R	                  5         g)zòRemove an attribute from the Group Policy cache
guid        - The GPO guid which applies this policy
attribute   - The attribute name of the policy being unapplied

Normally called by the subclass unapply() function when removing old
policy.
N)rË   r\   r�   rò   r•   ©rE   rW   rc   s      r2   Úcache_remove_attributeÚ!gp_applier.cache_remove_attribute™  s>   € ð 	�
‰
×Ñ˜DÔ!Ø�
‰
×Ñœ#˜d›) YÔ/Ø�
‰
×ÑÕr1   c                 ó‚   • U R                   R                  U5        U R                   R                  [        U 5      U5      $ )z£Retrieve the value stored in the cache for the given attribute
guid        - The GPO guid which applies this policy
attribute   - The attribute name of the policy
)rË   r\   rn   rò   r  s      r2   Úcache_get_attribute_valueÚ$gp_applier.cache_get_attribute_value¥  s1   € ð
 	�
‰
×Ñ˜DÔ!Ø�z‰z×"Ñ"¤3 t£9¨iÓ8Ð8r1   c                 ó€   • U R                   R                  U5        U R                   R                  [        U 5      5      $ )zxRetrieve all attribute/values currently stored for this gpo+policy
guid        - The GPO guid which applies this policy
)rË   r\   rs   rò   )rE   rW   s     r2   Úcache_get_all_attribute_valuesÚ)gp_applier.cache_get_all_attribute_values­  s/   € ð 	�
‰
×Ñ˜DÔ!Ø�z‰z×&Ñ&¤s¨4£yÓ1Ð1r1   c                 ó6   • U R                   R                  5       $ )zCReturn the current apply state
return      - APPLY|ENFORCE|UNAPPLY
)rË   rS   rR   s    r2   Úcache_get_apply_stateÚ gp_applier.cache_get_apply_state´  s   € ð �z‰z×#Ñ#Ó%Ð%r1   c                 ó°   • SR                  / UQ Vs/ s H  n[        U5      PM     sn5      n[        [        U5      U-   5      R                  5       $ s  snf )aâ  Generate an attribute name from arbitrary data
name            - A name to ensure uniqueness
args            - Any arbitrary set of args, str or bytes
return          - A blake2b digest of the data, the attribute

The importance here is the digest of the data makes the attribute
reproducible and uniquely identifies it. Hashing the name with
the data ensures we don't falsely identify a match which is the same
text in a different file. Using this attribute generator is optional.
r1   ©rÚ   r   r   Ú	hexdigest)rE   r:   ÚargsÚargÚdatas        r2   Úgenerate_attributeÚgp_applier.generate_attributeº  sK   € ð �x‰x°7°T±7Ó;²7¨Cœ 3ž±7Ñ;Ó<ˆÜ”y “ tÑ+Ó,×6Ñ6Ó8Ð8ùò <s   ’Ac                 ó˜   • SR                  / UQ Vs/ s H  n[        U5      PM     sn5      n[        U5      R                  5       $ s  snf )z·Generate a unique value which identifies value changes
args            - Any arbitrary set of args, str or bytes
return          - A blake2b digest of the data, the value represented
r1   r  )rE   r  r  r  s       r2   Úgenerate_value_hashÚgp_applier.generate_value_hashÈ  sA   € ð
 �x‰x°7°T±7Ó;²7¨Cœ 3ž±7Ñ;Ó<ˆÜ�t‹}×&Ñ&Ó(Ð(ùò <s   ’Ac                 ó   • g)zËGroup Policy Unapply
guid            - The GPO guid which applies this policy
attribute       - The attribute name of the policy being unapplied
value           - The value of the policy being unapplied
Nr(   r	  s       r2   ÚunapplyÚgp_applier.unapplyÐ  s   € ð 	r1   c                 ó   • g)aQ  Group Policy Apply
guid            - The GPO guid which applies this policy
attribute       - The attribute name of the policy being applied
applier_func    - An applier function which takes variable args
args            - The variable arguments to pass to applier_func

The applier_func function MUST return the value of the policy being
applied. It's important that implementations of `apply` check for and
first unapply any changed policy. See for example calls to
`cache_get_all_attribute_values()` which searches for all policies
applied by this GPO for this Client Side Extension (CSE).
Nr(   )rE   rW   rc   Úapplier_funcr  s        r2   ÚapplyÚgp_applier.applyÙ  s   € ð 	r1   Nc                 óf  • Uc  / nUc  / n[        U5      [        :w  a*  U R                  X5      nUb  U R                  " XU40 UD6  ggU R	                  U5      nUR                  5        HE  u  pu[        U5      S:”  a  Xs;   d  [        U5      S:”  d  M*  Xr;  d  M1  U R                  " XU40 UD6  MG     g)a4  Cleanup old removed attributes
keep    - A list of attributes to keep
remove  - A single attribute to remove, or a list of attributes to
          remove
kwargs  - Additional keyword args required by the subclass unapply
          function

This is only necessary for CSEs which provide multiple attributes.
Nr   )ÚtypeÚlistr  r%  r  ÚitemsrL   )rE   rW   Úkeepr�   ÚkwargsrM   Úold_valsrc   s           r2   ÚcleanÚgp_applier.cleané  s«   € ð ‰<ØˆDØ‰>ØˆFä�‹<œ4ÓØ×2Ñ2°4Ó@ˆEØÑ Ø—’˜T¨5Ñ;°FÓ;ð !ð ×:Ñ:¸4Ó@ˆHØ$,§N¡NÖ$4Ñ �	Ü˜“K !“O¨	Ó(;Ü˜“I •M iÕ&;Ø—L’L °%ÑB¸6ÔBò %5r1   r(   )NN)r)   r*   r+   r,   r—   r   rê   r
  r  r  r  r  r  r"  r   r%  r)  r2  r0   r(   r1   r2   r  r  …  s_   † ñð
 €Mò
ò
ò9ò2ò&ò9ò)ð ñó ðð ñó ð÷Cr1   r  c                   ó$   • \ rS rSrSrS rS rSrg)Úgp_misc_applieri  z:Group Policy Miscellaneous Applier/Unapplier/Modifier
    c                 óì   • [         R                  " S5      nUR                  5        H+  u  p4[         R                  " X#5      n[	        U5      Ul        M-     [	        [         R                  " US5      5      $ )Nr  r“   )r>   rA   r.  rC   r   rd   r”   )rE   r0  r  ÚkÚvr  s         r2   Úgenerate_valueÚgp_misc_applier.generate_value
  sU   € Ü�}Š}˜VÓ$ˆØ—L‘L–N‰DˆAÜ×"Ò" 4Ó+ˆCÜ! !“}ˆCŽHñ #ô œ%Ÿ.š.¨¨wÓ7Ó8Ð8r1   c                 ó  • 0 n [         R                  " U5      nUR	                  5       n[        U5        U H  nUR                  X%R                  '   M     U$ ! [         R                   a    SU0s $ [         a    0 s $ f = f)Nrf   )r>   r?   Ú
ParseErrorr¬   ÚiterÚnextrd   Útag)rE   rM   Úvalsr  Úitrr[   s         r2   Úparse_valueÚgp_misc_applier.parse_value  s}   € Øˆð	Ü×#Ò# EÓ*ˆDð �i‰i‹kˆÜˆSŒ	ÛˆDØ!ŸY™YˆD—‘‹Nñ àˆøô ×Ñó 	&à˜uÐ%Ò%Üó 	ØŠIð	ús   „A ÁB Á2B Á?B r(   N)r)   r*   r+   r,   r—   r9  rB  r0   r(   r1   r2   r5  r5    s   † ñò9õr1   r5  c                   ó<   • \ rS rSrSrS rS rSS jrSS.S jrS	r	g
)Úgp_file_applieri!  z}Group Policy File Applier/Unapplier/Modifier
Subclass of abstract class gp_applier for monitoring policy applied
via a file.
c                 óL   • U/nUR                  U5        UR                  U5      $ rx   )r~   rÚ   )rE   Ú
value_hashÚfilesÚsepr  s        r2   Ú__generate_valueÚ gp_file_applier.__generate_value'  s#   € Øˆ|ˆØ�‰�EÔØ�x‰x˜‹~Ðr1   c                 ó„   • Uc  S/ 4$ UR                  U5      nSUS   ;   a  SU4$ US   [        U5      S:”  a  USS 4$ / 4$ )zIParse a value
return          - A unique HASH, followed by the file list
NÚ/r   r%   )ÚsplitrL   )rE   rM   rI  r  s       r2   Ú__parse_valueÚgp_file_applier.__parse_value,  s^   € ð ‰=Ø˜�8ˆOØ�{‰{˜3ÓˆØ�$�q‘'‹>ð ˜�:Ðà˜‘7¬¨D«	°A«˜D  ˜HÐ=Ð=¸2Ð=Ð=r1   Ú:c                 óü   • [        U5      [        :w  a  U R                  X45      u  pSU H?  n[        R                  R                  U5      (       d  M)  [        R                  " U5        MA     U R                  X5        g rx   )r,  r-  Ú_gp_file_applier__parse_valuer›   rœ   rÝ   Úunlinkr  )rE   rW   rc   rH  rI  Ú_rþ   s          r2   r%  Úgp_file_applier.unapply:  sX   € ä�‹;œ$ÓØ×)Ñ)¨%Ó5‰HˆAÛˆDÜ�w‰w�~‰~˜d×#Ó#Ü—	’	˜$–ñ ð 	×#Ñ# DÕ4r1   )rI  c                óš  • U R                  X5      nU R                  Xu5      u  p‰Xƒ:w  d`  U R                  5       [        R                  :X  d>  [        U	 V
s/ s H"  n
[        R                  R                  U
5      PM$     sn
5      (       d  U R                  XU	5        OgU" U6 nU R                  X;U5      nU R                  XU5        gs  sn
f )a   
applier_func MUST return a list of files created by the applier.

This applier is for policies which only apply to a single file (with
a couple small exceptions). This applier will remove any policy applied
by this GPO which doesn't match the new policy.
N)r  rS  r  r"   r.   Úallr›   rœ   rÝ   r%  Ú _gp_file_applier__generate_valuer
  )rE   rW   rc   rG  r(  rI  r  rf   Úold_val_hashÚold_val_filesr÷   rH  Ú	new_values                r2   r)  Úgp_file_applier.applyC  s²   € ð ×0Ñ0°ÓAˆà&*×&8Ñ&8¸Ó&FÑ#ˆØÓ&Ø×*Ñ*Ó,´×0@Ñ0@Ó@Ü±MÓB²M¨qœŸ™Ÿ™¨Ö*±MÑB×CÑCØ�L‰L˜¨-Õ8ð ñ ˜dÐ#ˆØ×)Ñ)¨*¸SÓAˆ	Ø× Ñ  °)Õ<ùò Cs   Á)Cr(   N)rQ  )
r)   r*   r+   r,   r—   rY  rS  r%  r)  r0   r(   r1   r2   rE  rE  !  s'   † ñò
ò
>ô5ð KN÷ =ð =r1   rE  c                 ó¨   • [        XS9nUR                  UR                  S5      [        R                  [        R
                  -  S9nUR                  $ )N)rÊ   rÉ   Úrealm)ÚdomainÚflags)r	   Úfinddcr|   r
   ÚNBT_SERVER_LDAPÚNBT_SERVER_DSÚpdc_dns_name)rÊ   rÉ   ÚnetÚ	cldap_rets       r2   Úget_dc_hostnamerh  `  sJ   € Ü
�EÑ
!€CØ—
‘
 "§&¡&¨£/¼#×:MÑ:MÜ:=×:KÑ:Kñ;L�
ð N€Ià×!Ñ!Ð!r1   c                 óh  • [         R                  " 5       n/ SQnUR                  S5      (       a  UR                  S5      n[        R
                  [        R                  -  [        R                  -  n U R                  U[        R                  SUSU-  /S9nUR                  S:w  a%  [        R                  " [        R                   S5      eXl        S	UR$                  S
   R'                  5       ;   a#  [)        UR$                  S
   S	   S
   5      Ul        SUR$                  S
   R'                  5       ;   a#  [)        UR$                  S
   S   S
   5      Ul        SUR$                  S
   R'                  5       ;   a(  UR$                  S
   S   S
   R/                  5       Ul        SUR$                  S
   R'                  5       ;   a(  UR$                  S
   S   S
   R/                  5       Ul        SUR$                  S
   R'                  5       ;   a(  UR$                  S
   S   S
   R/                  5       Ul        SUR$                  S
   R'                  5       ;   a#  [7        UR$                  S
   S   S
   5      Ul        SUR$                  S
   R'                  5       ;   a#  [7        UR$                  S
   S   S
   5      Ul        SUR$                  S
   R'                  5       ;   a-  UR=                  [?        UR$                  S
   S   S
   5      5        U$ ! [         a    [        R                  " S5        e f = f)N)ÚcnÚdisplayNamera  ÚgPCFileSysPathÚgPCFunctionalityVersionÚgPCMachineExtensionNamesÚgPCUserExtensionNamesÚgPCWQLFilterr:   ÚnTSecurityDescriptorÚversionNumberzLDAP://ú(objectclass=*)zsd_flags:1:%d)Úcontrolsz4Failed to fetch gpo object with nTSecurityDescriptorr%   zget_gpo: search failedrr  r   ra  rl  rk  r:   rn  ro  rq  ) rç   ÚGROUP_POLICY_OBJECTÚ
startswithÚlstripr   ÚSECINFO_OWNERÚSECINFO_GROUPÚSECINFO_DACLÚsearchÚldbÚ
SCOPE_BASEÚ	Exceptionr   ÚerrorrX   ÚLdbErrorÚERR_NO_SUCH_OBJECTÚds_pathÚmsgsÚkeysr«   ÚversionÚoptionsrõ   Úfile_sys_pathÚdisplay_namer:   rò   Úmachine_extensionsÚuser_extensionsÚset_sec_descÚbytes)ÚsamdbÚgpo_dnr�   rr   Úsd_flagsÚress         r2   Úget_gpor‘  j  sµ  € Ü×ÒÓ!€Aò€Eð ×Ñ˜×#Ñ#Ø—‘˜yÓ)ˆä×&Ñ&Ü×&Ñ&ñ'ä×%Ñ%ñ&€HðØ�l‰l˜6¤3§>¡>Ð3DÀeØ%4°xÑ%?Ð$@ð ð Bˆð
 ‡y�y�Aƒ~Ü�lŠlœ3×1Ñ1Ø3ó5ð 	5ð „IØ˜#Ÿ(™( 1™+×*Ñ*Ó,Ó,Ü˜Ÿ™ ™ OÑ4°QÑ7Ó8ˆŒ	Ø�#—(‘(˜1‘+×"Ñ"Ó$Ó$Ü˜Ÿ™ ™ GÑ,¨QÑ/Ó0ˆŒ	Ø˜3Ÿ8™8 A™;×+Ñ+Ó-Ó-ØŸ(™( 1™+Ð&6Ñ7¸Ñ:×AÑAÓCˆŒØ˜Ÿ™ ™×(Ñ(Ó*Ó*ØŸ™ !™ ]Ñ3°AÑ6×=Ñ=Ó?ˆŒØ�—‘˜!‘×!Ñ!Ó#Ó#Ø—‘˜!‘˜VÑ$ QÑ'×.Ñ.Ó0ˆŒØ! S§X¡X¨a¡[×%5Ñ%5Ó%7Ó7Ü" 3§8¡8¨A¡;Ð/IÑ#JÈ1Ñ#MÓNˆÔØ #§(¡(¨1¡+×"2Ñ"2Ó"4Ó4Ü §¡¨¡Ð,CÑ DÀQÑ GÓHˆÔØ §¡¨!¡×!1Ñ!1Ó!3Ó3Ø	�‰”u˜SŸX™X a™[Ð)?Ñ@ÀÑCÓDÔEØ€Høô1 ó Ü�	Š	ÐHÔIØðús   Á4%L Ì"L1c                   ó&   • \ rS rSrS rS rS rSrg)ÚGP_LINKiœ  c                 ób   • / U l         / U l        U R                  U5        [        U5      U l        g rx   )Ú
link_namesÚ	link_optsÚgpo_parse_gplinkr«   Úgp_opts)rE   ÚgPLinkÚ	gPOptionss      r2   rH   ÚGP_LINK.__init__�  s)   € ØˆŒØˆŒØ×Ñ˜fÔ%Ü˜9“~ˆ�r1   c                 óô  • UR                  5       R                  S5       HÕ  nU(       a  SU;  a  M  [        R                  " S5        UR	                  S5      nUR                  S5      u  p4[        R                  " SR                  U5      5        [        R                  " SR                  U5      5        U R                  R                  U5        U R                  R                  [        U5      5        M×     g )NÚ]Ú;z!gpo_parse_gplink: processing linkÚ[zgpo_parse_gplink: link: {}zgpo_parse_gplink: opt: {})
rõ   rN  r   Údebugrw  Úformatr•  r†   r–  r«   )rE   r™  ÚpÚ	link_nameÚlink_opts        r2   r—  ÚGP_LINK.gpo_parse_gplink£  s­   € ð —‘“×&Ñ& sÖ+ˆAÞ˜ 1›ÙÜ�IŠIÐ9Ô:Ø—‘˜“ˆAØ"#§'¡'¨#£,ÑˆIÜ�IŠIÐ2×9Ñ9¸)ÓDÔEÜ�IŠIÐ1×8Ñ8¸ÓBÔCØ�O‰O×"Ñ" 9Ô-Ø�N‰N×!Ñ!¤# h£-Ö0ò ,r1   c                 óš   • [        U R                  5      [        U R                  5      :w  a  [        S5      e[        U R                  5      $ )NzLink names and opts mismatch)rL   r•  r–  ÚRuntimeErrorrR   s    r2   Ú	num_linksÚGP_LINK.num_links±  s7   € Üˆt�‰Ó¤3 t§~¡~Ó#6Ó6ÜÐ=Ó>Ð>Ü�4—?‘?Ó#Ð#r1   )r˜  r•  r–  N)r)   r*   r+   r,   rH   r—  r¨  r0   r(   r1   r2   r“  r“  œ  s   † ò&ò1õ$r1   r“  c                 óÀ  • SS/nU R                  U R                  5       [        R                  SR	                  U5      U5      nUR
                  S:w  a4  [        R                  " [        R                  SR	                  U5      5      e[        UR                  S   S   S   5      nUR                  S   S   n[        R                  " SR	                  XQ5      5        XE4$ )NÚdnÚuserAccountControlz(sAMAccountName={})r%   z"Failed to find samAccountName '{}'r   z!Found dn {} for samaccountname {})r{  Úget_default_basednr|  ÚSCOPE_SUBTREEr¡  rX   r€  r�  r«   rƒ  r   Úinfo)r�  Úsamaccountnamerr   r�  Úuacr«  s         r2   Úfind_samaccountr²  ¶  sÁ   € ØÐ'Ð(€EØ
�,‰,�u×/Ñ/Ó1´3×3DÑ3DØ,×3Ñ3°NÓCÀUóL€Cà
‡y�y�Aƒ~Ü�lŠlœ3×1Ñ1Ø0×7Ñ7¸ÓGó
ð 	
ô ˆc�h‰h�q‰kÐ.Ñ/°Ñ2Ó
3€CØ	�‰�!‰�TÑ	€BÜ‡H‚HÐ0×7Ñ7¸ÓKÔLØˆ7€Nr1   c                 ó  • U R                  U[        R                  SSS/5      nUR                  S:w  a%  [        R                  " [        R
                  S5      eSUR                  S   ;  a4  [        R                  " [        R                  SR                  U5      5      eUR                  S   S   S   nSnSUR                  S   ;   a  UR                  S   S   S   nO[        R                  " S5        [        X45      $ )	Nrs  r™  rš  r%   zget_gpo_link: no resultr   z2get_gpo_link: no 'gPLink' attribute found for '{}'z,get_gpo_link: no 'gPOptions' attribute found)r{  r|  r}  rX   r€  r�  rƒ  ÚERR_NO_SUCH_ATTRIBUTEr¡  r   r   r“  )r�  Úlink_dnr�  r™  rš  s        r2   Úget_gpo_linkr¶  Ã  sÚ   € Ø
�,‰,�w¤§¡Ø(¨8°[Ð*AóC€Cà
‡y�y�Aƒ~Ü�lŠlœ3×1Ñ1Ð3LÓMÐMØ�s—x‘x ‘{Ó"Ü�lŠlœ3×4Ñ4Ø@×GÑGÈÓPó
ð 	
ð �X‰X�a‰[˜Ñ" 1Ñ%€FØ€IØ�c—h‘h˜q‘kÓ!Ø—H‘H˜Q‘K Ñ,¨QÑ/‰	ä�	Š	Ð@ÔAÜ�6Ó%Ð%r1   c                 óþ  • [        UR                  5       S-
  SS5       GH‡  nUR                  U   [        -  S:g  n	UR                  U   [        -  (       a  [
        R                  " S5        MP  U(       a5  U	(       d  [
        R                  " S5        Mv  [
        R                  " S5         [        XR                  U   5      n
 [        [        R                  U
R                  5       5      n[        R                  R                  X·[        R                  [        R                   -  [        R"                  -  5        [)        U5      U
l        XZl        U	(       a  UR/                  SU
5        OUR/                  SU
5        [
        R                  " SX„R                  U   4-  5        GMŠ     g ! [$         a/  n[
        R                  " SU
R&                  -  5         S nAGMÁ  S nAff = f! [0        R2                   a€  nUR4                  u  pÞ[
        R                  " S	UR                  U   -  5        U[0        R6                  :X  a-  [
        R                  " S
UR                  U   -  5         S nAGMR   S nA  g S nAff = f)Nr%   éÿÿÿÿr   zskipping disabled GPOzNskipping nonenforced GPO link because GPOPTIONS_BLOCK_INHERITANCE has been setzNadding enforced GPO link although the GPOPTIONS_BLOCK_INHERITANCE has been setz/skipping GPO "%s" as object has no access to itz7add_gplink_to_gpo_list: added GPLINK #%d %s to GPO listzfailed to get gpo: %szskipping empty gpo: %s)Úranger¨  r–  r   r   r   r   r‘  r•  r   r   Ú
descriptorÚget_sec_desc_bufÚsambaÚaccess_checkÚSEC_STD_READ_CONTROLÚSEC_ADS_LISTÚSEC_ADS_READ_PROPr~  rˆ  rò   ÚlinkÚ	link_typeÚinsertr|  r€  r  r�  )r�  Úgpo_listÚforced_gpo_listrµ  Úgp_linkrÂ  Úonly_add_forced_gposÚtokenÚiÚ	is_forcedÚnew_gpoÚsec_descÚeÚenumÚestrs                  r2   Úadd_gplink_to_gpo_listrÐ  Ô  s  € ä�7×$Ñ$Ó& qÑ(¨"¨b×1ˆØ×&Ñ& qÑ)Ô,>Ñ>À1ÑDˆ	Ø×Ñ˜QÑÔ"4×4Ü�IŠIÐ-Ô.ÙæÞÜ—	’	ð )ô *ñ ä—	’	ð )ô *ð	BÜ˜e×%7Ñ%7¸Ñ%:Ó;ˆGð
Ü%¤h×&9Ñ&9Ø&-×&>Ñ&>Ó&@óB�ä—‘×+Ñ+¨HÜ,4×,IÑ,IÜ,4×,AÑ,Añ-Bä,4×,FÑ,Fñ-GôHô ˜w›<ˆGŒLØ )ÔæØ×&Ñ& q¨'Õ2à—‘  7Ô+ä�IŠIð $Ø'(×*<Ñ*<¸QÑ*?Ð&@ñA÷ Bò_ 2øôD ó Ü—	’	ð 0Ø29×2FÑ2FñGô Hæûðûô �|‰|ó 	ØŸ6™6‰LˆTÜ�IŠIÐ-°×0BÑ0BÀ1Ñ0EÑEÔFØ”s×-Ñ-Ó-Ü—	’	Ð2°W×5GÑ5GÈÑ5JÑJÔKÞÝûð	ús2   Â,G(ÃA8F,Æ,
G%Æ6#G Ç G%Ç(I<Ç<A.I7É7I<c                 ó  • U R                   n[        5       R                  nUR                  UR                   5        Xl         U =R                  UR                  -  sl        U =R
                  UR
                  -  sl        U $ rx   )Úsidsr   Úsecurity_tokenr~   Úrights_maskÚprivilege_mask)Útoken_1rÒ  Úsystem_tokens      r2   Úmerge_with_system_tokenrØ    sc   € Ø�<‰<€DÜ!Ó#×2Ñ2€LØ‡K�K�×!Ñ!Ô"Ø„LØ×Ò˜<×3Ñ3Ñ3ÕØ×Ò˜l×9Ñ9Ñ9Õà€Nr1   c                 ó’  • SU R                  5       < SU< S3nU R                  S[        R                  US/S9nUR                  S:w  a  [        S5      e[        [        R                  [        UR                  S	   S   S	   5      5      nUR                  [        R                  -  (       d  [        S
5      e[        R                  Ul        UR                  nSn	UR                  (       a%  [        UR                  5      S:”  a  UR                  n	U R!                  5       n
U
R#                  S5        U
R#                  SU	-  5        U
$ )Nz(&(DnsDomain=z.)(User=z)(NtVer=\14\00\00\20))Ú ÚNetlogon)ÚbaseÚscopeÚ
expressionrr   r%   zsite_dn_for_machine: No resultr   z@site_dn_for_machine: Invalid NtVer in netlogon_samlogon_responsezDefault-First-Site-NamezCN=SiteszCN=%s)Údomain_dns_namer{  r|  r}  rX   r§  r   r
   Únetlogon_samlogon_responserŒ  rƒ  ÚntverÚNETLOGON_NT_VERSION_5EXr  Úclient_siterL   Úget_config_basednÚ	add_child)r�  Údc_hostnamerÉ   rÊ   ÚhostnameÚexprr�  Úsamlogon_responseÚsamlogon_response_exrã  Úsite_dns              r2   Úsite_dn_for_machinerì    s,  � ð 	×ÑÖÛð€Dð �,‰,ØÜ�n‰nØØˆlð	 ð €Cð
 ‡y�y�Aƒ~ÜÐ;Ó<Ð<ä"¤3×#AÑ#AÜ#(¨¯©°!©°ZÑ)@ÀÑ)CÓ#DóFÐà×#Ñ#¤c×&AÑ&A×AÜð :ó ;ð 	;ô "×9Ñ9ÐÔØ,×1Ñ1Ðà+€KØ×(×(ÜÐ(×4Ñ4Ó5¸Ó9Ø*×6Ñ6ˆà×%Ñ%Ó'€GØ×Ñ�jÔ!Ø×Ñ�g Ñ-Ô.à€Nr1   c           
      óÄ  • / n/ nSU -   n[        U[        5       XS9n[        XsR                  S5      S   5      u  p‰Sn
[        [
        -  nUR                  S5      (       a	  U[        -  n[        R                  R                  XrU	US9nSnU[        -  (       d  U[        -  (       a  Sn[        UR                  5      nOUR                  nU	R                  5       n [!        U5      [!        UR#                  5       R                  5       5      :X  a  O„UR%                  S	5      S
:X  a]   [&        R(                  " SU-  5        [+        X5      n[-        XtUUU[.        R0                  X®5        UR2                  [4        -  (       a  Sn
UR                  5       nM¹  U	R                  5       n [!        U5      [!        UR#                  5       R                  5       5      :X  a  O„UR%                  S	5      S:X  a]   [&        R(                  " SU-  5        [+        X5      n[-        XtUUU[.        R<                  X®5        UR2                  [4        -  (       a  Sn
UR                  5       nM¹  U(       aR   [?        XpX!U5      n [&        R(                  " SU-  5        [+        UU5      n[-        XtUUU[.        R@                  X®5        URC                  S	[.        RD                  " SS[.        RF                  5      5        XE-   $ ! [6        R8                   a0  nUR:                  u  nn[&        R(                  " U5         SnAGN®SnAff = f! [6        R8                   a0  nUR:                  u  nn[&        R(                  " U5         SnAGN+SnAff = f! [6        R8                   a0  nUR:                  u  nn[&        R(                  " U5         SnAGNSnAff = f! [6        R8                   a     GN&f = f)a  Get the full list of GROUP_POLICY_OBJECTs for a given username.
Push GPOs to gpo_list so that the traversal order of the list matches
the order of application:
(L)ocal (S)ite (D)omain (O)rganizational(U)nit
For different domains and OUs: parent-to-child.
Within same level of domains and OUs: Link order.
Since GPOs are pushed to the front of gpo_list, GPOs have to be
pushed in the opposite order of application (OUs first, local last,
child-to-parent).
Forced GPOs are appended in the end since they override all others.
zldap://)ÚurlÚsession_infoÚcredentialsrÉ   Ú\r¸  FÚldap)Úlp_ctxr«  Úsession_info_flagsTr   ÚOUz%get_gpo_list: query OU: [%s] for GPOsNÚDCz%get_gpo_list: query DC: [%s] for GPOsz'get_gpo_list: query SITE: [%s] for GPOsúLocal Policy)$r   r   r²  rN  r   r   rv  r   r¼  ÚauthÚuser_sessionr   r   rØ  rÓ  Úparentrò   r­  Úget_component_namer   r   r¶  rÐ  rç   Ú
GP_LINK_OUr˜  r   r|  r€  r  ÚGP_LINK_DOMAINrì  ÚGP_LINK_SITErÃ  ru  ÚGP_LINK_LOCAL)ræ  rÊ   rÉ   r=   rÄ  rÅ  rî  r�  r±  r«  Úadd_only_forced_gposrô  ÚsessionÚgpo_list_machinerÈ  Ú	parent_dnrÆ  rÍ  rÎ  rÏ  rë  s                        r2   Úget_gpo_listr  ?  su  € ð €HØ€OØ
�kÑ
!€CÜ�cÜ-Ó/Ø#ñ,€Eô ˜e§^¡^°DÓ%9¸"Ñ%=Ó>�G€CØ Ðô ;Ü9ñ:Ðà
‡~�~�f×ÑØÔAÑAÐÜ�j‰j×%Ñ% e¸2Ø9Kð &ð M€GàÐØ
Ô)×)¨SÔ3J×-JØÐÜ'¨×(>Ñ(>Ó?‰à×&Ñ&ˆð —	‘	“€IØ
Üˆy‹>œS ×!9Ñ!9Ó!;×!BÑ!BÓ!DÓEÓEØð ×'Ñ'¨Ó*¨dÓ2ð0Ü—	’	ÐAÀIÑMÔNÜ& uÓ8�ô
 ' u¸Ø'0°'Ü'*§~¡~Ø';ôDð —?‘?Ô%:×:Ø+/Ð(à×$Ñ$Ó&ˆ	ñ- ð2 —	‘	“€IØ
Üˆy‹>œS ×!9Ñ!9Ó!;×!BÑ!BÓ!DÓEÓEØð ×'Ñ'¨Ó*¨dÓ2ð0Ü—	’	ÐAÀIÑMÔNÜ& uÓ8�ô
 ' u¸Ø'0°'Ü'*×'9Ñ'9Ø';ôDð —?‘?Ô%:×:Ø+/Ð(à×$Ñ$Ó&ˆ	ñ- ö2 ð	Ü)¨%¸bÈÓRˆGð
DÜ—	’	ÐCÀgÑMÔNÜ& u¨gÓ6�ô
 ' u¸Ø'.°Ü'*×'7Ñ'7Ø';ôDð ‡O�O�A”s×.Ò.¨~Ø/=Ü/2×/@Ñ/@óBô Cð Ñ#Ð#øôM —<‘<ó  Ø Ÿv™v‘��tÜ—	’	˜$—’ûð ûô4 —<‘<ó  Ø Ÿv™v‘��tÜ—	’	˜$—’ûð ûô. —<‘<ó  Ø Ÿv™v‘��tÜ—	’	˜$—’ûð ûô �|‰|ó 	ò ð		úsl   Ä'$K2 Ç1$L9 É'O É5%N  ÊO Ë2L6Ì%L1Ì1L6Ì9M=Í%M8Í8M=Î OÎ%N?Î9O Î?OÏO ÏOÏOc           
      ó<  • UR                  5       n[        R                  R                  X5      n [        R                  " USS9  U R                  U5       GH
  nUS   [        R                  -  (       a.  [        X[        R                  R                  X&S   5      5        MM  US   R                  5       n[        SUS9n[        R                  R                  X&S   5      R                  SS5      n	UR                  U R                  U	5      5        UR!                  5         [        R"                  " UR$                  [        R                  R                  XG5      5        GM     g ! [
         a*  nUR                  [        R                  :w  a  e  S nAGNPS nAff = f)	Nií  )ÚmoderD   r:   F)r�   ÚdirrM  rñ  )rÜ   r›   rœ   rÚ   ÚmakedirsÚOSErrorÚerrnoÚEEXISTr-  ÚlibsmbÚFILE_ATTRIBUTE_DIRECTORYÚcache_gpo_dirr   ÚreplaceÚwriteÚloadfilerÄ   Úrenamer:   )
ÚconnÚcacheÚsub_dirÚloc_sub_dirÚ	local_dirrÍ  ÚfdataÚ
local_namer÷   Úfnames
             r2   r  r  ·  s  € Ø—-‘-“/€KÜ—‘—‘˜UÓ0€IðÜ
�Š�I EÒ*ð —‘˜7×#ˆØ�‰?œV×<Ñ<×<Ü˜$¤r§w¡w§|¡|°GÀ6¹]Ó'KÖLà˜v™×,Ñ,Ó.ˆJÜ"¨%°YÑ?ˆAÜ—G‘G—L‘L °©-Ó8×@Ñ@ÀÀdÓKˆEØ�G‰G�D—M‘M %Ó(Ô)Ø�G‰GŒIÜ�IŠI�a—f‘fœbŸg™gŸl™l¨9ÓA×Bò $øô ó Ø�7‰7”e—l‘lÓ"Øõ #ûðús   ±E' Å'
FÅ1FÆFc                 ó*  • [         R                  " SU 5      nSU R                  5       ;   a;  [         R                  " SU R                  5       5      nXR                  S5      S-   S  nSU;  a  [        R
                  R                  " U6 $ [        U 5      e)Nz/|\\Úsysvolr%   z..)ÚrerN  ÚlowerÚindexr›   rœ   rÚ   r	  )rœ   ÚdirsÚldirss      r2   rÛ   rÛ   Ë  st   € Ü�8Š8�H˜dÓ#€DØ�4—:‘:“<ÓÜ—’˜ 4§:¡:£<Ó0ˆØ—K‘K Ó)¨AÑ-Ð.Ð/ˆØ�4ÓÜ�w‰w�|Š|˜TÐ"Ð"Ü
�$‹-Ðr1   c                 ó4  • UR                  5       nUR                  [        5        [        R                  " U SXS9nUR                  U5        UR                  S5      nU H5  nUR                  (       d  M  [        XV[        UR                  5      5        M7     g )Nr  )rÉ   rÊ   rØ   )	Úget_smb_signingÚset_smb_signingr   r  ÚConnrÙ   r‡  r  rÛ   )ræ  rÉ   rÊ   ÚgposÚsaved_signing_stater  rÙ   Úgpo_objs           r2   Úcheck_refresh_gpo_listr)  Õ  sz   € à×/Ñ/Ó1ÐØ	×ÑÔ.Ô/Ü�;Š;�{ H°ÑA€Dà	×ÑÐ-Ô.Ø—‘˜{Ó+€JÛˆØ×$×$ÙÜ�d¬¸×8MÑ8MÓ(NÖOò r1   c                 óÔ   • U R                  5       n[        U Vs/ s H  o3R                  PM     sn5      nU Vs/ s H  oUU;  d  M
  UPM     nnU R                  U5      $ s  snf s  snf rx   )rƒ   Úsetr:   rŒ   )rË   r&  Úapplied_gposr¢  Úcurrent_guidsrW   Údeleted_gposs          r2   Úget_deleted_gpos_listr/  ã  s]   € Ø×*Ñ*Ó,€LÜ©Ó.ª AŸœ©Ñ.Ó/€MÙ%1ÓO¢\˜TÀÑ5N—D¡\€LÐOØ×%Ñ% lÓ3Ð3ùò /ùÚOs   šA º	A%ÁA%c                 ó¤   • U R                  [        R                  R                  SU5      5      n[	        [
        R                  " U5      S   5      $ )NrØ   r%   )rÙ   r›   rœ   rÚ   r«   rç   Úgpo_get_sysvol_gpt_version)rÉ   rœ   Úgpt_paths      r2   Úgpo_versionr3  é  s<   € ð �}‰}œRŸW™WŸ\™\¨+°tÓ<Ó=€HÜŒs×-Ò-¨hÓ7¸Ñ:Ó;Ð;r1   c                 óv  • UR                  U5      n[        X5      n[        X�X5      n	[        Xy5      n
 [	        X€X5        U(       a"  U	nUR                  [        R                  5        O·/ nU	 H�  nUR                  (       d  M  UR                  n[        UR                  5      R                  5       n[        X5      nXòR                  U5      :w  d  Mf  [
        R                   " SU-  5        UR#                  U5        M’     UR                  [        R$                  5        UR'                  5         U H=  n U" XXB5      nUS:X  a  UR)                  X«5        M&  [+        UUR(                  X«5        M?     U	 He  nUR                  (       d  M  UR                  n[        UR                  5      R                  5       n[        X5      nUR=                  USU-  5        Mg     UR?                  5         g !   [
        R                  " SU-  5         g = f! [,         až  n[
        R                  " S[/        U5      -  5        [0        R2                  " 5       u    nn[4        R6                  " U5      S   u  nn  n[
        R                  " SUU[9        U5      R:                  [/        U5      4-  5         S nAGM€  S nAff = f)Nz0Failed downloading gpt cache from '%s' using SMBzGPO %s has changedÚComputerzFailed to apply extension  %sr¸  z%s:%d: %s: %sz%i) r´   rh  r  r/  r)  r   r  rO   r"   r.   r‡  r:   rÛ   rÜ   r3  r¯   r¯  r†   r-   r¨   rÐ   Údrop_privilegesr~  rò   ÚsysÚexc_infoÚ	tracebackÚ
extract_tbr,  r)   rj   r•   )rÉ   rÊ   rj   Úgp_extensionsr=   ÚtargetÚforcerË   ræ  r&  Údel_gposÚchanged_gposr(  rW   rœ   r…  rh   rÍ  rU  ÚtbÚfilenameÚline_numbers                         r2   Úapply_gprC  ð  s@  € Ø�O‰O˜HÓ%€EÜ! %Ó,€KÜ˜¨BÓ9€DÜ$ UÓ1€HðÜ˜{°Ô<ö ØˆØ�‰”H×$Ñ$Õ%àˆÛˆGØ×(×(ÙØ—<‘<ˆDÜ" 7×#8Ñ#8Ó9×?Ñ?ÓAˆDÜ! "Ó+ˆGØŸ-™-¨Ó-Õ-Ü—’Ð-°Ñ4Ô5Ø×#Ñ# GÖ,ñ ð 	�‰”H—N‘NÔ#à	‡K�K„MÛˆð	Ù�b Ó1ˆCØ˜Ó#Ø×(Ñ(¨Ö@ä ¨#×*BÑ*BØ (ö8ñ ó ˆØ×$×$ÙØ�|‰|ˆÜ˜w×4Ñ4Ó5×;Ñ;Ó=ˆÜ˜bÓ'ˆØ�‰�D˜$ ™.Ö)ñ ð 
‡L�L…NøðYÜ�	Š	ÐFØñ ô 	!áûô6 ó 	Ü�IŠIÐ5¼¸C»Ñ@ÔAÜ—|’|“~‰HˆAˆq�"Ü*3×*>Ò*>¸rÓ*BÀ2Ñ*FÑ'ˆH�k 1 aÜ�IŠI�o¨°;Ü)-¨a«×)9Ñ)9¼3¸q»6ð)Cñ Cô Dæûð	ús*   µG0 Ä7 HÅHÇ0HÈ
J8ÈBJ3Ê3J8c                 ó"  • UR                  U5      nUR                  [        R                  5        UR	                  UR                  5       5      nUR                  5         U H>  n U" XXB5      nUS:X  a  UR                  U/ 5        M'  [        XHR                  U/ 5        M@     UR                  5         g ! [         aO  n	[        R                  " S[        U5      -  5        [        R                  " S[        U	5      -   5         S n	A	M§  S n	A	ff = f)Nr5  zFailed to unapply extension  %szMessage was: )r´   rO   r"   r/   rŒ   rƒ   r¨   rÐ   r6  r~  r   r  rò   r•   )
rÉ   rÊ   rj   r;  r=   r<  rË   r>  rh   rÍ  s
             r2   Ú
unapply_gprE  &  s×   € Ø�O‰O˜HÓ%€EØ	‡K�K”× Ñ Ô!à×)Ñ)¨%×*AÑ*AÓ*CÓD€HØ	‡K�K„MÛˆð
	Ù�b Ó1ˆCØ˜Ó#Ø×(Ñ(¨°2Ö6ä ×*BÑ*BØ (¨"ö.ñ ð 
‡L�L…Nøô	 ó 	Ü�IŠIÐ7¼#¸c»(ÑBÔCÜ�IŠI�o¬¨A«Ñ.Ô/Ýûð	ús   Á&!B5Â	B5Â5
DÂ?AD	Ä	Dc                 ó  • [        U 5      [        :X  aR  U R                  5        VVs/ s H!  u  p#SU-  SU< S[        X1S-   5      < 3-   PM#     nnnSSR	                  U5      -   $ [        U 5      [
        :X  a;  U  Vs/ s H  nSU-  S[        X1S-   5      -  -   PM     nnSSR	                  U5      -   $ [        U [        R                  5      (       a  SUS-   -  [        U 5      -   $ SUS-   -  [        U 5      -   $ s  snnf s  snf )NÚ z[ z ] = r&   Ú
z[ %s ])r,  Údictr.  Ú__rsop_valsrÚ   r-  Ú
isinstanceÚnumbersÚNumberrò   r   )r@  Úlevelr7  r8  r‡   s        r2   rJ  rJ  ;  sõ   € ÜˆDƒz”TÓà ŸJ™JœLô*Ú(‘D�Að �5Šy«A¬{¸1ÀA¹gÕ/FÐGÔGÙ(ð 	ñ *à�d—i‘i “nÑ$Ð$Ü	ˆd‹”tÓ	ÙGKÓLÂtÀ!ˆs�5‰y˜8¤k°!¸1±WÓ&=Ñ=Ô=ÁtˆÐLØ�d—i‘i “nÑ$Ð$ä�dœGŸN™N×+Ñ+Ø˜˜a™‘=¤3 t£9Ñ,Ð,à˜˜a™‘=¤:¨dÓ#3Ñ3Ð3ùó*ùò Ms   §(C;Á=!Dc                 ó(  • [        X5      n[        XaX5      n[        X`X5        [        S5        [        SU-  5        [        R
                  " SS9S   nU GH¸  n	U	R                  R                  5       S:X  a  M$  [        SU	R                  -  5        [        SU-  5        U GHV  n
U
" XXB5      n
[        R                  " S	[        [        U
5      5      5      n[        U5      S:”  a  US
   R                  S5      S
   nOU
R                  R                  S5      S
   n[        SU-  5        [        SS[        US-  5      -  -   5        U
R!                  U	5      R#                  5        Hp  u  pÞ[        SU-  5        [        SS[        US-  5      -  -   5        [        [%        U5      R'                  S5      5        [        SS[        US-  5      -  -   5        Mr     [        SS[        US-  5      -  -   5        GMY     [        SSU-  -  5        GM»     g )NzResultant Set of Policyz
%s Policy
)éx   é2   )Úfallbackr   r÷  zGPO: %sÚ=z'([\w\.]+)'r¸  Ú.z	  CSE: %sz  Ú-r&   z    Policy Type: %sz    rH  z%s
)rh  r  r)  ÚprintÚshutilÚget_terminal_sizerˆ  Ústripr  rq   rò   r,  rL   rN  r*   r«   rè   r.  rJ  rw  )rÉ   rÊ   rj   r;  r=   r<  ræ  r&  Ú
term_widthr(  rh   Ú
cse_name_mÚcse_nameÚsectionrŠ   s                  r2   rè   rè   I  sÏ  € Ü! %Ó,€KÜ˜¨BÓ9€DÜ˜;¨EÔ8ä	Ð
#Ô$Ü	ˆ-˜&Ñ
 Ô!Ü×)Ò)°9Ñ=¸aÑ@€JÜˆØ×Ñ×%Ñ%Ó'¨>Ó9ÙÜˆi˜'×.Ñ.Ñ.Ô/Üˆc�*‰nÔÜ ˆCÙ�b Ó1ˆCÜŸš N´C¼¸S»	³NÓCˆJÜ�:‹ Ó"Ø% b™>×/Ñ/°Ó4°RÑ8‘àŸ>™>×/Ñ/°Ó4°RÑ8�Ü�+ Ñ(Ô)Ü�$˜#œc *¨Q¡,Ó/Ñ/Ñ0Ô1Ø%(§X¡X¨gÓ%6×%<Ñ%<Ö%>Ñ!�ÜÐ+¨gÑ5Ô6Ü�f ¤C¨
°1©Ó$5Ñ 5Ñ6Ô7Ü”k (Ó+×2Ñ2°4Ó8Ô9Ü�f ¤C¨
°1©Ó$5Ñ 5Ñ6Ö7ñ	 &?ô
 �$˜#œc *¨Q¡,Ó/Ñ/Ñ0×1ñ !ô 	ˆf˜˜J™Ñ'×(ò) r1   c                 óÔ   • SSK Jn  UR                  5       nU b  UR                  U 5        OUR	                  5         UR                  S5      n[        S S9nUR                  U5        X$4$ )Nr   )Úparamú
gpext.confrï   )Úsamba.samba3r_  Úget_contextÚloadÚload_defaultÚ
state_pathr   rÕ   )Úsmb_confÚs3paramrÉ   Úext_confÚparsers        r2   Úparse_gpext_confrj  h  s[   € Ý-Ø	×	Ñ	Ó	€BØÑØ
�‰�Õà
�‰ÔØ�}‰}˜\Ó*€HÜ¨Ñ-€FØ
‡K�K�ÔØˆ:Ðr1   c                 ó  • U R                  S5      n[        SS[        R                  R	                  U5      S9 nUR                  U5        [        R                  " UR                  U5        S S S 5        g ! , (       d  f       g = f)Nr`  zw+F)r  r�   r  )re  r   r›   rœ   Údirnamer  r  r:   )rÉ   ri  rh  r÷   s       r2   Úatomic_write_confrm  u  sV   € Ø�}‰}˜\Ó*€HÜ	 ¨e¼¿¹¿¹ÈÓ9RÒ	SÐWXØ�‰�QŒÜ
�	Š	�!—&‘&˜(Ô#÷ 
T×	SÖ	Sús   º3A6Á6
Bc                 ó~   • U S   S:w  d  U S   S:w  d  [        U 5      S:w  a  g [        U SS9  g	! [         a     gf = f)
Nr   Ú{r¸  Ú}é&   Fé   )r…  T)rL   r   Ú
ValueError)rW   s    r2   Ú
check_guidrt  |  sL   € àˆA�w�#ƒ~˜˜b™ S›¬C°«I¸«OØðÜˆT˜1Òð øô ó Ùðús   ¤
/ ¯
<»<c                 ó¤  • [         R                  R                  U5      (       d  g[        U 5      (       d  g[	        U5      u  pgXR                  5       ;  a  UR                  U 5        UR                  U SU5        UR                  U SU5        UR                  U SU(       a  SOS5        UR                  U SU(       a  SOS5        [        Xg5        g)	NFÚDllNameÚProcessGroupPolicyÚNoMachinePolicyÚ0Ú1ÚNoUserPolicyT)	r›   rœ   rÝ   rt  rj  ÚsectionsÚadd_sectionr+  rm  )rW   r:   rœ   rf  Úmachiner9   rÉ   ri  s           r2   Úregister_gp_extensionr  ‡  s¤   € ô �7‰7�>‰>˜$×ÑØÜ�d×ÑØä! (Ó+�J€BØ—?‘?Ó$Ó$Ø×Ñ˜4Ô Ø
‡J�Jˆt�Y Ô%Ø
‡J�JˆtÐ)¨4Ô0Ø
‡J�JˆtÐ&®w©¸CÔ@Ø
‡J�Jˆt�^®D¡S°cÔ:ä�bÔ!àr1   c                 óJ  • [        U 5      u  p0 nUR                  5        H  n0 X4'   UR                  US5      X4   S'   UR                  US5      X4   S'   [        UR                  US5      5      (       + X4   S'   [        UR                  US5      5      (       + X4   S'   M�     U$ )Nrv  rw  rx  ÚMachinePolicyr{  Ú
UserPolicy)rj  r|  r|   r«   )rf  rU  ri  ÚresultsrW   s        r2   Úlist_gp_extensionsr„  œ  s©   € Ü  Ó*�I€AØ€GØ—‘Ö!ˆØˆ‰Ø#)§:¡:¨d°IÓ#>ˆ‰�iÑ à�J‰J�tÐ1Ó2ð 	‰Ð*Ñ+ô �F—J‘J˜tÐ%6Ó7Ó8Ô8ð 	‰�oÑ&ä*-¨f¯j©j¸¸~Ó.NÓ*OÔ&Oˆ‰�lÓ#ñ "ð €Nr1   c                 óž   • [        U 5      (       d  g[        U5      u  p#XR                  5       ;   a  UR                  U 5        [	        X#5        g)NFT)rt  rj  r|  Úremove_sectionrm  )rW   rf  rÉ   ri  s       r2   Úunregister_gp_extensionr‡  ª  sB   € Ü�d×ÑØä! (Ó+�J€BØ�‰Ó Ó Ø×Ñ˜dÔ#ä�bÔ!àr1   c                 ó\   • [         R                  " U5        [         R                  " U5        g)z 
Set current process privileges
N)r›   ÚsetegidÚseteuid)r=   ÚuidÚgids      r2   Úset_privilegesr�  ·  s   € ô
 ‡J‚Jˆs„OÜ‡J‚Jˆs…Or1   c                 ó\  • [         R                  " 5       nUS:X  d  [        S5      e[        R                  " U 5      R
                  n[        R                  " U 5      R                  n[        XU5        SnSn U" U6 n[        SUS5        U(       a  UeU$ ! [         a  nUn SnAN)SnAff = f)z?
Run supplied function with privileges for specified username.
r   z)Not enough permissions to drop privilegesNÚroot)r›   Úgetuidr~  ÚpwdÚgetpwnamÚpw_uidÚpw_gidr�  )	r=   Úfuncr  Úcurrent_uidÚuser_uidÚuser_gidÚoutÚexcrÍ  s	            r2   r6  r6  À  s£   € ô —)’)“+€Kà˜!ÓÜÐCÓDÐDä�|Š|˜HÓ%×,Ñ,€HÜ�|Š|˜HÓ%×,Ñ,€Hô �8 xÔ0ð €CØ
€CðÙ�Dˆkˆô
 �6˜;¨Ô*æ
Øˆ	à€Jøô ó Ø�ûðús   Á8B Â
B+ÂB&Â&B+c                 ó  • [         R                  " 5       n[         R                  " 5       nUR                  [        R
                  R                  S5      5      n0 S[        R
                  R                  S5      _SS _SS _SS _SS _SS _S	S _S
S _SUR                  S5      _SS _SS _SUR                  S5      _S[        U5      _S[        R
                  R                  S5      _SUR                  S5      _SS _SS _0 S[        R
                  R                  U[        U5      R                  5       5      _SS _SS _SS _SS _SS _SS _SUR                  S 5      _S!UR                  S"5      _S#UR                  S5      _S$S _S%U_S&S _S'S _S(S _S)S _S*S _ES S S S S S S S S S S+S,[        [         R                  " U5      5      S S S-.EnUR                  5        H3  u  p‰S.U-  n
X ;   d  M  U	c  [        S/U-  5      eU R!                  X©5      n M5     U $ )0NrØ   Ú
AppDataDirz	~/.configÚBinaryComputerSidÚBinaryUserSidÚCommonAppdataDirÚCommonDesktopDirÚCommonFavoritesDirÚCommonProgramsDirÚCommonStartUpDirÚComputerNameznetbios nameÚCurrentProccessIdÚCurrentThreadIdÚDateTimez%Y-%m-%d %H:%M:%S UTCÚ
DateTimeExÚ
DesktopDirz	~/DesktopÚ
DomainNamer_  ÚFavoritesDirÚGphPathÚGptPathÚGroupPolicyVersionÚLastDriveMappedÚ	LastErrorÚLastErrorTextÚLdapComputerSidÚLdapUserSidÚ	LocalTimez%H:%M:%SÚLocalTimeExz%H:%M:%S.%fÚLogonDomainÚLogonServerÚ	LogonUserÚLogonUserSidÚ
MacAddressÚNetPlacesDirÚ	OsVersionÚProgramFilesDirrM  z/tmp)ÚProgramsDirÚRecentDocumentsDirÚ
ResultCodeÚ
ResultTextÚReversedComputerSidÚReversedUserSidÚ	SendToDirÚStartMenuDirÚ
StartUpDirÚ	SystemDirÚSystemDriveÚTempDirÚ	TimeStampÚ	TraceFileÚ
WindowsDirz%%%s%%z"Expansion variable %s is undefined)r    ÚutcnowÚnowrÙ   r›   rœ   rÚ   Ú
expanduserr|   Ústrftimerò   rÛ   rÜ   Ú	timestampr.  Ú	NameErrorr  )rd   r2  rÉ   r=   Úutc_dtÚdtrÙ   Ú	variablesÚexp_varr·   Úexp_var_fmts              r2   Úexpand_pref_variablesrØ  à  sá  € Ü�_Š_Ó€FÜ	�Š‹€BØ—‘œrŸw™wŸ|™|¨KÓ8Ó9€Jð2�,¤§¡× 2Ñ 2°;Ó ?ð 2Ø% tð2à! 4ð2ð % dð2ð % dð	2ð
 '¨ð2ð & tð2ð % dð2ð ! "§&¡&¨Ó"8ð2ð & tð2ð $ Tð2ð ˜fŸo™oÐ.EÓFð2ð ¤ F£ð2ð ¤§¡× 2Ñ 2°;Ó ?ð2ð  §¡ w£ð2ð ! $ð2ð  ˜Tñ!2ð" œRŸW™WŸ\™\¨*Ü*9¸(Ó*C×*IÑ*IÓ*KóMð#2ð& '¨ð'2ð( $ Tð)2ð* ˜tð+2ð, " 4ð-2ð. $ Tð/2ð0   ð12ð2 ˜rŸ{™{¨:Ó6ð32ð4   §¡¨]Ó!;ð52ð6   §¡¨£ð72ð8   ð92ð: ˜xð;2ð< ! $ð=2ð>  ð?2ð@ ! $ðA2ðB ˜tðC2ðD $ TñE2ðF "&Ø(,Ø $Ø $Ø)-Ø%)Ø#Ø"&Ø $Ø#Ø!$Ø#Ü"¤8×#5Ò#5°bÓ#9Ó:Ø#Ø $òc2€Iðf "Ÿ™Ö)‰ˆØ Ñ(ˆØÕØ‰{ÜÐ DÀwÑ NÓOÐOØ—<‘< Ó1ŠDñ *ð €Kr1   )F)rr  )NTTrx   )jr7  r›   rW  r
  rž   r‘  rœ   rÃ  r¼  r   Úconfigparserr   Úior   r9  Úsamba.commonr   Úabcr   r   Úxml.etree.ElementTreer>   ÚElementTreer  Ú	samba.netr	   Úsamba.dcerpcr
   ra  r   r  Ú	samba.gporç   Úuuidr   Útempfiler   r   Ú	samba.ndrr   Úsamba.credentialsr   Úsamba.gp.util.loggingr   Úhashlibr   rL  r   Úsamba.samdbr   Ú
samba.authr   r|  Ú
samba.dsdbr   r   r   r   r   r   r   r   r   Úsamba.securityr    rÎ  r!   r"   ÚImportErrorr4   r™   Úobjectra   rì   rü   r  r  r5  rE  rh  r‘  r“  r²  r¶  rÐ  rØ  rì  r  r  rÛ   r)  r/  r3  rC  rE  rJ  rè   rj  rm  rt  r  r„  r‡  r�  r6  rØ  r(   r1   r2   Ú<module>rî     sÞ  ðó$ ß Û Û 
Û 
Ø ‡�‡���<Ô  Ý Ý %Ý Û Ý "ß 'ß %Ð %Û 	Ý Ý Ý 8Ý Ý Ý 'Ý Ý  Ý 2Ý %Ý Û Ý #Ý Ý %Û 
÷ Lõ  Lß }Ñ }Ý !Û Ý Ý ðÝÙ�JÐ 7Ó8€H÷[Oñ [O÷|#ñ #ôLˆVô ôB
�ô 
ô*�ô *ô:�ô :ô~C�ô ~CôB�jô ô69=�jô 9=ðx ,ò"ð 2ò0÷d$ñ $ò4ò&ò"2Bòhò(òXu$òpCò(òPò4ò<ô3òlô*4ò)ò>
ò$òð =Aôô*ô
òòõ@@øðK% ó ÷ó ðús   Ã1G	 Ç	GÇG