
    b0[                        d dl Z d dlZd dlZd dlZd dlZd dlZe j                            d d           d dlm	Z	 d dl
mZ d dlmZ d dlZd dlmZ d dlmZmZ d dlmc mZ d dl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" 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+ d dl,m-Z- d dl.m/Z/ 	 d dl0m1Z1  e1dd          Z2n# e3$ r  G d d          Z2Y nw xY w G d d          Z4 G d d          Z5 G d de6          Z7 G d de7          Z8 G d d e7          Z9 G d! d"e7          Z:	 d# Z;	 d$ Z<d% Z=d& Z>d' Z?d( Z@d) ZAd9d+ZBd, ZCd:d.ZDd/ ZEd0 ZFd1 ZGd2 ZH	 d;d4ZId<d5ZJd<d6ZKd7 ZLd8 ZMdS )=    Nz
bin/python)NTSTATUSError)ConfigParser)StringIO)	get_bytes)ABCMetaabstractmethod)Net)nbt)libsmb_samba_internal)LoadParm)UUID)NamedTemporaryFile)preg)misc)ndr_pack
ndr_unpack)SMB_SIGNING_REQUIRED)log)EnumGPOSTATEzAPPLY ENFORCE UNAPPLYc                       e Zd ZdZdZdZdS )r            N)__name__
__module____qualname__APPLYENFORCEUNAPPLY     2/usr/lib/python3/dist-packages/samba/gp/gpclass.pyr   r   1   s        r"   c                   J    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd ZdS )gp_loga[   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                 F   t           j        | _        || _        || _        |rt          j        |          | _        nt          j        d          | _        || _	        | j        
                    d|z            }|&t          j        | j        d          }||j        d<   dS dS )ag   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Elementr)   find
SubElementattrib)selfr)   r,   db_loguser_objs        r#   __init__zgp_log.__init__]   s     n  	,(00DIId++DI	9>>"4t";<<'	6::H&*HOF### r"   c                    |t           j        k    rh| j                            d| j        z            }|                    d          }|t          |          dk    rt           j        | _        dS || _        dS || _        dS )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.
        r(   applylogNr   )r   r   r0   r2   r)   lenr   r+   )r5   valuer7   	apply_logs       r#   statezgp_log.stater   sw     H$$$y~~&849&DEEH j11I C	NNa$7$7&n#DKKKr"   c                     || _         | j                            d| j        z            }|                    d|z            }|t	          j        |d          }||j        d<   | j        t          j	        k    r|                    d          }|t	          j        |d          }|                    d|z            }|@t	          j        |d          }dt          |          dz
  z  |j        d	<   ||j        d<   dS dS dS )
z Log to a different GPO guid
        param guid          - guid value of the GPO from which we're applying
                              policy
        r(   guid[@value="%s"]Nguidr<   r:   z%dr   count)rA   r0   r2   r)   r.   r3   r4   r+   r   r   r;   )r5   rA   r7   objr=   previtems          r#   set_guidzgp_log.set_guid   s   
 	9>>"4ty"@AAmm/$677;"8V44C"&CJw;(.(( j11I !,XzBB	>>"5"<==D|'	6::'+s9~~/A'BG$'+G$$$ )(
 |r"   c                    | j         t          j        k    s| j         t          j        k    rdS | j                            d| j        z            }|                    d| j        z            }|
J d            |                    d|z            }|t          j	        |d          }||j
        d<   |                    d|z            }|(t          j	        |d	          }||j
        d<   ||_        dS dS )
a   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
        Nr(   r@   gpo guid was not setgp_ext[@name="%s"]gp_extr*   attribute[@name="%s"]	attribute)r+   r   r    r   r0   r2   r)   rA   r.   r3   r4   text)r5   gp_ext_namerL   old_valr7   guid_objextattrs           r#   storezgp_log.store   s     ;(***dkX=M.M.M49>>"4ty"@AA==!4ty!@AA##%;###mm0;>??;"8X66C!,CJvxx/);<<<#C55D"+DKDIII <r"   c                    | j                             d| j        z            }|                    d| j        z            }|
J d            |                    d|z            }|!|                    d|z            }||j        S dS )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
        r(   r@   NrH   rI   rK   )r0   r2   r)   rA   rM   r5   rN   rL   r7   rP   rQ   rR   s          r#   retrievezgp_log.retrieve   s     9>>"4ty"@AA==!4ty!@AA##%;###mm0;>???883i?@@Dy tr"   c                 ,   g }| j                             d| j        z            }|m|                    d          }|V|                    d          }d |D             }|                    d           |                    d |D                        |S )	z Return a list of applied ext guids
        return              - List of guids for gpos that have applied settings
                              to the system.
        r(   Nr:   zguid[@count]c                 b    g | ],}|                     d           |                     d          f-S )rB   r<   )get).0gs     r#   
<listcomp>z,gp_log.get_applied_guids.<locals>.<listcomp>   sA     "6 "6 "6&' $%55>>155>>"B "6 "6 "6r"   T)reversec              3       K   | ]	\  }}|V  
d S Nr!   )rZ   rB   rA   s      r#   	<genexpr>z+gp_log.get_applied_guids.<locals>.<genexpr>   s&      DDkeTTDDDDDDr"   )r0   r2   r)   findallsortextend)r5   guidsr7   r=   	guid_objsguids_by_counts         r#   get_applied_guidszgp_log.get_applied_guids   s    
 9>>"4ty"@AA j11I$%--n==	"6 "6+4"6 "6 "6##D#111DD^DDDDDDr"   c                 p   g }| j                             d| j        z            }|D ]}|                    d|z            }|                    d          }i }|D ]C}i }	|                    d          }
|
D ]}|j        |	|j        d         <   |	||j        d         <   D|                    ||f           |S )ai   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.
        r(   r@   rJ   rL   r*   )r0   r2   r)   ra   rM   r4   append)r5   rd   retr7   rA   guid_settingsextssettingsrQ   	attr_dictattrsrR   s               r#   get_applied_settingszgp_log.get_applied_settings   s     9>>"4ty"@AA 
	) 
	)D$MM*=*DEEM ((22DH 9 9	K00! ? ?D59YIdk&122/8F+,,JJh'((((
r"   c                    | j                             d| j        z            }|                    d| j        z            }|
J d            |                    d|z            }|Y|                    d|z            }|A|                    |           t          |          dk    r|                    |           dS dS dS dS )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
        r(   r@   NrH   rI   rK   r   )r0   r2   r)   rA   remover;   rU   s          r#   deletezgp_log.delete   s     9>>"4ty"@AA==!4ty!@AA##%;###mm0;>???883i?@@D

4   s88q==OOC((((( ? =r"   c                 v    | j                             | j        t          j        | j        d                     dS )z Write gp_log changes to disk zutf-8N)r,   rS   r-   r.   tostringr0   r5   s    r#   commitzgp_log.commit   s0    DM5>$)W+M+MNNNNNr"   r_   )r   r   r   __doc__r8   r>   rF   rS   rV   rg   rp   rs   rw   r!   r"   r#   r%   r%   7   s        $ $J+ + + +*     ,, , ,*     ,  "  "  ,) ) )"O O O O Or"   r%   c                   J    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )
GPOStoragec                     t           j                            |          rt          j        |          | _        d S t          j        |dt          j        t           j        t           j	        z            | _        d S )Nr   )
ospathisfiletdbopenr   TdbDEFAULTO_CREATO_RDWR)r5   log_files     r#   r8   zGPOStorage.__init__  sT    7>>(## 	Qx))DHHHwxCKbi9OPPDHHHr"   c                 8    | j                                          d S r_   )r   transaction_startrv   s    r#   startzGPOStorage.start  s    ""$$$$$r"   c                     	 t          | j                            t          |                              S # t          $ r Y d S w xY wr_   )intr   rY   r   	TypeErrorr5   keys     r#   get_intzGPOStorage.get_int  sK    	tx||IcNN33444 	 	 	44	s   36 
AAc                 P    | j                             t          |                    S r_   )r   rY   r   r   s     r#   rY   zGPOStorage.get  s    x||IcNN+++r"   c           	      n    t          || | j                            t          |                              S r_   )r%   r   rY   r   )r5   r)   s     r#   	get_gplogzGPOStorage.get_gplog  s(    dD$(,,y"?"?@@@r"   c                 p    | j                             t          |          t          |                     d S r_   )r   rS   r   )r5   r   vals      r#   rS   zGPOStorage.store  s*    y~~y~~66666r"   c                 8    | j                                          d S r_   )r   transaction_cancelrv   s    r#   cancelzGPOStorage.cancel      ##%%%%%r"   c                 T    | j                             t          |                     d S r_   )r   rs   r   r   s     r#   rs   zGPOStorage.delete  s"    	#'''''r"   c                 8    | j                                          d S r_   )r   transaction_commitrv   s    r#   rw   zGPOStorage.commit   r   r"   c                 8    | j                                          d S r_   )r   closerv   s    r#   __del__zGPOStorage.__del__#  s    r"   N)r   r   r   r8   r   r   rY   r   rS   r   rs   rw   r   r!   r"   r#   rz   rz     s        Q Q Q% % %  , , ,A A A7 7 7& & &( ( (& & &    r"   rz   c                   v    e Zd ZeZd Zed             Zed             Zd Z	ed             Z
ed             ZdS )rJ   c                 d    || _         || _        || _        |                    |          | _        d S r_   )lpcredsr-   r   gp_db)r5   r   r   r-   rS   s        r#   r8   zgp_ext.__init__*  s.    
 __X..


r"   c                     d S r_   r!   )r5   deleted_gpo_listchanged_gpo_lists      r#   process_group_policyzgp_ext.process_group_policy0      r"   c                     d S r_   r!   )r5   policys     r#   readzgp_ext.read4  r   r"   c                     | j                             d          }t          j                            |t          |                                                    }t          j                            |          r|                     |          S d S )N	gpo_cache)	r   
cache_pathr|   r}   joincheck_safe_pathupperexistsr   )r5   afile
local_path	data_files       r#   parsezgp_ext.parse8  sm    W''44
GLL_U-C-C-I-I-K-KLL	7>>)$$ 	(99Y'''tr"   c                     d S r_   r!   rv   s    r#   __str__zgp_ext.__str__?  r   r"   c                     i S r_   r!   )r5   gpos     r#   rsopzgp_ext.rsopC  s    	r"   N)r   r   r   r   __metaclass__r8   r   r   r   r   r   r   r!   r"   r#   rJ   rJ   '  s        M/ / /   ^   ^     ^   ^  r"   rJ   c                       e Zd Zd ZdS )
gp_inf_extc                 x   t          |d                                          }t          d           }t          |_        	 |                    t          |                                                     nE# t          $ r8 |                    t          |                    d                               Y nw xY w|S )Nrbinterpolationutf-16)	r   r   r   stroptionxformreadfpr   decodeUnicodeDecodeError)r5   r   r   inf_confs       r#   r   zgp_inf_ext.readI  s    i&&++--d333"	?OOHV]]__556666! 	? 	? 	?OOHV]]8%<%<==>>>>>	?s    4A5 5?B76B7Nr   r   r   r   r!   r"   r#   r   r   H  s#            r"   r   c                       e Zd Zd ZdS )
gp_pol_extc                 z    t          |d                                          }t          t          j        |          S )Nr   )r   r   r   r   filer5   r   raws      r#   r   zgp_pol_ext.readU  s/    9d##((**$)S)))r"   Nr   r!   r"   r#   r   r   T  s#        * * * * *r"   r   c                       e Zd Zd ZdS )
gp_xml_extc                    t          |d                                          }	 t          j        |                                          S # t
          $ r* t          j        |                    d                    cY S w xY w)Nr   r   )r   r   r.   r/   r   r   r   s      r#   r   zgp_xml_ext.read[  sy    9d##((**	:#CJJLL111! 	: 	: 	:#CJJx$8$899999	:s   %A
 
1A>=A>Nr   r!   r"   r#   r   r   Z  s#        : : : : :r"   r   c                     t          | |          }|                    |                    d          t          j        t          j        z            }|j        S )N)r   r   realm)domainflags)r	   finddcrY   r
   NBT_SERVER_LDAPNBT_SERVER_DSpdc_dns_name)r   r   net	cldap_rets       r#   get_dc_hostnamer   f  sQ    
Eb
!
!
!C

"&&//#:M:=:K;L
 N NI!!r"   c                     g }t          j        | ||          }|                                r.|                    |                    d          d                   }|S )N\)r   
ADS_STRUCTconnectget_gpo_listsplit)dc_hostnamer   r   r-   gposadss         r#   r   r   p  sS    D
.b%
0
0C
{{}} :t 4 4R 899Kr"   c           
      t   |                                 }t          j                            ||          }	 t          j        |d           n-# t
          $ r }|j        t          j        k    r Y d }~nd }~ww xY w|                     |          D ]'}|d         t          j
        z  r6t          | |t          j                            ||d                              N|d                                          }t          d|          }t          j                            ||d                                       dd          }	|                    |                     |	                     |                                 t          j        |j        t          j                            ||                     )d S )	Ni  )moder4   r*   F)rs   dir/r   )r   r|   r}   r   makedirsOSErrorerrnoEEXISTlistlibsmbFILE_ATTRIBUTE_DIRECTORYcache_gpo_dirr   replacewriteloadfiler   renamer*   )
conncachesub_dirloc_sub_dir	local_direfdata
local_nameffnames
             r#   r   r   y  s   --//KUK00I
IE*****   7el"" #"""" 7## 	C 	C?V<< 	C$rw||GU6]'K'KLLLLv,,..J"%Y???AGLL%-88@@dKKEGGDMM%(()))GGIIIIafbgll9jAABBBB	C 	Cs   A 
A7A22A7c                 2   t          j        d|           }d|                                 v rGt          j        d|                                           }||                    d          dz   d          }d|vrt	          j        j        | S t          |           )Nz/|\\sysvolr   z..)rer   lowerindexr|   r}   r   r   )r}   dirsldirss      r#   r   r     s    8Hd##D4::<<4::<<00EKK))A-../4w|T""
$--r"   c                 F   |                                 }|                    t                     t          j        | d||          }|                    |           |                    d          }|D ]-}|j        s
t          ||t          |j                             .d S )Nr  )r   r   r   )	get_smb_signingset_smb_signingr   r   Connr   file_sys_pathr   r   )r   r   r   r   saved_signing_stater   r   r   s           r#   check_refresh_gpo_listr    s    //11	.///;{H5AAAD	-...{++J L L  	dJ8I(J(JKKKKL Lr"   c                     |                                  }t          d |D                       fd|D             }|                     |          S )Nc                     g | ]	}|j         
S r!   )r*   )rZ   ps     r#   r\   z)get_deleted_gpos_list.<locals>.<listcomp>  s    ...A...r"   c                     g | ]}|v|	S r!   r!   )rZ   rA   current_guidss     r#   r\   z)get_deleted_gpos_list.<locals>.<listcomp>  s#    OOOTT5N5ND5N5N5Nr"   )rg   setrp   )r   r   applied_gposdeleted_gposr  s       @r#   get_deleted_gpos_listr    s]    **,,L.....//MOOOO\OOOL%%l333r"   c                     |                      t          j                            d|                    }t	          t          j        |          d                   S )Nr   r   )r   r|   r}   r   r   r   gpo_get_sysvol_gpt_version)r   r}   gpt_paths      r#   gpo_versionr    sC     }}RW\\+t<<==Hs-h77:;;;r"   Fc           
         |                     |          }t          ||           }t          ||| |          }	t          ||	          }
	 t	          || ||	           n#  t          j        d|z             Y d S xY w|r"|	}|                    t          j	                   ng }|	D ]}|j
        s
|j        }t          |j
                                                  }t          | |          }||                    |          k    r,t          j        d|z             |                    |           |                    t          j                   |                                 |D ]}	  || |||          }|dk    r|                    |
|           n)t+          |                                |j        |
|           X# t.          $ r}t          j        dt1          |          z             t          j        dt3          |          j        dt1          |                     t          j        t9          j                               Y d }~d }~ww xY w|	D ]`}|j
        s
|j        }t          |j
                                                  }t          | |          }|                    |d|z             a|                                 d S )Nz0Failed downloading gpt cache from '%s' using SMBzGPO %s has changedComputerzFailed to apply extension  %sMessage was: z: z%i) r   r   r   r  r  r   errorr>   r   r   r  r*   r   r   r  r   infori   r   r   r   drop_privilegesget_principal	Exceptionr   typer   debug	traceback
format_excrS   rw   )r   r   rS   gp_extensionsr-   targetforcer   r   r   del_gposchanged_gposgpo_objrA   r}   versionrQ   r   s                     r#   apply_gpr0    s   OOH%%E!%,,KUB99D$UD11H{Bt<<<<	F  	! 	! 	! $H$%%%% 	- 	-G( <D"7#899??AAD!"d++G%-------4555##G,,,HN###	KKMMM  	#b%511C##((<@@@@ 3 3 5 5s7O (,8 8 8 	 	 	I5C@AAAIItAww/?/?/?QHIIIIi*,,---HHHH		
  * *$ 	|w455;;==b$''D$.))))	LLNNNNNs&   	A A8(AF==
IBIIc                 Z   |                     |          }|                    t          j                   |                    |                                          }|                                 |D ]}	  || |||          }|dk    r|                    |g            nt          ||j        |g            F# t          $ rR}	t          j        dt          |          z             t          j        dt          |	          z              Y d }	~	d }	~	ww xY w|                                 d S )Nr  zFailed to unapply extension  %sr  )r   r>   r   r    rp   rg   r   r   r"  r$  r   r   r   rw   )
r   r   rS   r)  r-   r*  r   r,  rQ   r   s
             r#   
unapply_gpr2    s4   OOH%%E	KK !!!))%*A*A*C*CDDH	KKMMM  
	#b%511C##((26666#*B (". . . 	 	 	I7#c((BCCCIoA.///HHHH	 
LLNNNNNs   5AB88
DADD   c                 $   t          |           t          k    r8fd|                                 D             }dd                    |          z   S t          |           t          k    r&fd| D             }dd                    |          z   S | S )Nc                 T    g | ]$\  }}d z  d|dt          |dz             z   %S ) z[ z ] = r   __rsop_vals)rZ   kvlevels      r#   r\   z__rsop_vals.<locals>.<listcomp>  sR     * * *Aq 5yyAAA{1eAg/F/F/FGG * * *r"   
c           	      H    g | ]}d z  dt          |dz             z  z   S )r6  z[ %s ]r   r7  )rZ   r:  r;  s     r#   r\   z__rsop_vals.<locals>.<listcomp>  s5    LLL!s5y8k!U1W&=&===LLLr"   )r%  dictitemsr   r   )valsr;  rj   s    ` r#   r8  r8    s    DzzT* * * * JJLL* * *diinn$$	dt		LLLLtLLLdiinn$$r"   c                    t          ||           }t          ||| |          }t          || ||           t          d           t          d|z             t	          j        d          d         }|D ]}	|	j                                        dk    r!t          d|	j        z             t          d|z             |D ]}
 |
| |||          }
t          j	        d	t          t          |
                              }t          |          dk    r"|d
                             d          d
         }n |
j                            d          d
         }t          d|z             t          ddt          |dz            z  z              |
                    |	                                          D ]\  }}t          d|z             t          ddt          |dz            z  z              t          t%          |                              d                     t          ddt          |dz            z  z              t          ddt          |dz            z  z              t          dd|z  z             d S )NzResultant Set of Policyz
%s Policy
)x   2   )fallbackr   zLocal PolicyzGPO: %s=z'([\w\.]+)'r   .z	  CSE: %sz  -r   z    Policy Type: %sz    r<  z%s
)r   r   r  printshutilget_terminal_sizedisplay_namestripr  ra   r   r%  r;   r   r   r   r   r?  r8  lstrip)r   r   rS   r)  r-   r*  r   r   
term_widthr   rQ   
cse_name_mcse_namesectionrm   s                  r#   r   r     s   !%,,KUB99D;E4888	
#$$$	-&
 !!!)9===a@J ) )!!##~55i#**+++c*n  	2 	2C#b%511CM3tCyy>>BBJ:""%b>//44R8>//44R8+()))$#c*Q,///0111%(XXc]]%8%8%:%: 8 8!+g5666fC
1$5$5 56777k(++22488999fC
1$5$5 567777$#c*Q,///01111fJ'(((()) )r"   c                     t                      }| |                    |            n|                                 |                    d          }t	          d           }|                    |           ||fS )N
gpext.confr   )r   loadload_default
state_pathr   r   )smb_confr   ext_confparsers       r#   parse_gpext_confrZ  %  ss    	B

}}\**H---F
KKv:r"   c                    |                      d          }t          ddt          j                            |                    5 }|                    |           t          j        |j        |           d d d            d S # 1 swxY w Y   d S )NrS  zw+F)r   rs   r   )rV  r   r|   r}   dirnamer   r   r*   )r   rY  rX  r   s       r#   atomic_write_confr]  1  s    }}\**H	e9R9R	S	S	S $WXQ
	!&(###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   0BB	Bc                     | d         dk    s| d         dk    st          |           dk    rdS 	 t          | d           n# t          $ r Y dS w xY wd	S )
Nr   {r   }&   Fr3  )r/  T)r;   r   
ValueError)rA   s    r#   
check_guidrc  8  sp    Aw#~~bSCIIOOuT1   uu4s   A 
AATc                    t           j                            |          sdS t          |           sdS t	          |          \  }}| |                                vr|                    |            |                    | d|           |                    | d|           |                    | d|rdnd           |                    | d|rdnd           t          ||           dS )	NFDllNameProcessGroupPolicyNoMachinePolicy01NoUserPolicyT)	r|   r}   r   rc  rZ  sectionsadd_sectionr  r]  )rA   r*   r}   rW  machiner)   r   rY  s           r#   register_gp_extensionrn  C  s     7>>$ ud u!(++JB6??$$$$4   
JJtY%%%
JJt)4000
JJt&w(?C@@@
JJt^D%9SSc:::b&!!!4r"   c                    t          |           \  }}i }|                                D ]}i ||<   |                    |d          ||         d<   |                    |d          ||         d<   t          |                    |d                     ||         d<   t          |                    |d                     ||         d<   |S )Nre  rf  rg  MachinePolicyrj  
UserPolicy)rZ  rk  rY   r   )rW  _rY  resultsrA   s        r#   list_gp_extensionsrt  X  s     **IAvG!! P P#)::dI#>#>i JJt122 	*+ FJJt%677888 	o&*-fjj~.N.N*O*O&Ol##Nr"   c                     t          |           sdS t          |          \  }}| |                                v r|                    |            t	          ||           dS )NFT)rc  rZ  rk  remove_sectionr]  )rA   rW  r   rY  s       r#   unregister_gp_extensionrw  f  sf    d u!(++JBv    d###b&!!!4r"   c                 V    t          j        |           t          j        |           dS )z(
    Set current process privileges
    N)r|   setegidseteuid)r-   uidgids      r#   set_privilegesr}  s  s"    
 JsOOOJsOOOOOr"   c                 N   t          j                    }|dk    st          d          t          j        |           j        }t          j        |           j        }t          | ||           d}d}	  || }n# t          $ r}|}Y d}~nd}~ww xY wt          d|d           |r||S )zG
    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-   funcargscurrent_uiduser_uiduser_gidoutexcr   s	            r#   r"  r"  |  s     )++K!CDDD|H%%,H|H%%,H 8Xx000 C
CdDk    6;***
 	Js   1A7 7
BBB)F)r3  )NTTr_   )Nsysr|   rI  r   r   r  r}   insertsambar   configparserr   ior   r'  samba.commonr   abcr   r   xml.etree.ElementTreer.   ElementTreer  	samba.netr	   samba.dcerpcr
   samba.samba3r   r   	samba.gpor   samba.paramr   uuidr   tempfiler   r   r   	samba.ndrr   r   samba.credentialsr   samba.gp.util.loggingr   enumr   r   ImportErrorr%   rz   objectrJ   r   r   r   r   r   r   r   r  r  r  r0  r2  r8  r   rZ  r]  rc  rn  rt  rw  r}  r"  r!   r"   r#   <module>r     s  $ 


          



 



 <             % % % % % %           " " " " " " ' ' ' ' ' ' ' ' % % % % % % % % % 				             8 8 8 8 8 8                         ' ' ' ' ' '             * * * * * * * * 2 2 2 2 2 2 % % % % % %tJ 788HH            GO GO GO GO GO GO GO GOT# # # # # # # #L    V   B	 	 	 	 	 	 	 	* * * * * * * *: : : : : : : : ," " " 2  C C C(  L L L4 4 4< < <1 1 1 1h  *	 	 	 	) ) )>	 	 	$ $ $   =A   *   
 
 
 
      s   0C CC