
    Idw                      v    d Z ddlZddlmZmZmZ ddlmZmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZ  G d d	e      Zy)
z5Utility methods for security descriptor manipulation.    N)MessageMessageElementDn)FLAG_MOD_REPLACE
SCOPE_BASE)ndr_pack
ndr_unpackndr_deepcopy)security)NT_STATUS_OBJECT_NAME_NOT_FOUNDc                   ^    e Zd ZdZd ZddZddZd Z	 	 ddZddZ	d	 Z
dd
ZddZddZy)SDUtilszCSome utilities for manipulation of security descriptors on objects.c                 v    || _         t        j                  | j                   j                               | _        y N)ldbr   dom_sidget_domain_sid
domain_sid)selfsamdbs     0/usr/lib/python3/dist-packages/samba/sd_utils.py__init__zSDUtils.__init__"   s(    "**488+B+B+DE    Nc                    t               }t        |t              r||_        nt        | j                  |      |_        t        |t
              st        |t        j                        sJ t        |t
              r+t        j                  j                  || j                        }nt        |t        j                        r|}t        t              t        d      |d<   | j                  j                  ||       y)zfModify security descriptor using either SDDL string
            or security.descriptor object
        nTSecurityDescriptorN)r   
isinstancer   dnr   strr   
descriptor	from_sddlr   r   r   r   modify)r   	object_dnsdcontrolsmtmp_descs         r   modify_sd_on_dnzSDUtils.modify_sd_on_dn&   s     Ii$ADdhh	*AD"c"jX5H5H&IJIb#**44RIHH//0H$28H3E3C3I%K
 ! 	8$r   c                     | j                   j                  |t        d dg|      }|d   d   d   }t        t        j
                  |      S )Nr   r$   r   )r   searchr   r	   r   r   )r   r"   r$   resdescs        r   read_sd_on_dnzSDUtils.read_sd_on_dn;   sO    hhooiT56  K1v,-a0(--t44r   c                 ~    | j                   j                  |      }t        t        j                  |d   d   d         S )Nr   	objectSid)r   r*   r	   r   r   )r   r"   r+   s      r   get_object_sidzSDUtils.get_object_sidA   s5    hhooi((**CF;,?,BCCr   c                     |g }|g } fd}||dt         j                  z  g} j                  ||      }|j                  t         j                  z  st        |j                        }|j                  D ]2  }	|	j                  t         j                  z  s!	 |j                  |	       4 ng|g } j                  j!                  |t"        d |g|      }t%        |d   |   d         }t         j&                  j)                  | j*                        }d}g }g }g }|D ]  }	t-        |	t$              r ||	      }	t-        |	t         j.                        sJ |	j                  t         j                  z  r|j1                  |	       f|	|j                  j                  vr|j1                  |	       |j                  |	       |dz  } |D ]  }	d}t-        |	t2              rd|	v r|	d   }|	d   }	t-        |	t$              r ||	      }	t-        |	t         j.                        sJ |	j                  t         j                  z  r|j1                  |	       |	|j                  j                  v r|j1                  |	       |j5                  |	|       |dz  } |dk(  r|||fS | j7                  |||       nl|j9                   j*                        }t;               }||_        t?        |jA                  d	      tB        |      ||<    j                  jE                  ||       |||fS # t        j                  $ r#}
|
j                  d   t        k7  r|
Y d }
~
d }
~
ww xY w)
Nc                     t         j                  j                  d| z   j                        }t	        |j
                  j                        dk(  sJ |j
                  j                  d   S )ND:   r   )r   r   r    r   lendaclaces)ace_sddlace_sdr   s     r   ace_from_sddlz2SDUtils.update_aces_in_dacl.<locals>.ace_from_sddlL   sU    ((224(?DOOTFv{{''(!+,+;;##A&&r   zsd_flags:1:%dr)   r   r4   idxaceascii)#r   SECINFO_DACLr-   typeSEC_DESC_DACL_PROTECTEDr
   r6   r7   flagsSEC_ACE_FLAG_INHERITED_ACEdacl_del_acesambaNTSTATUSErrorargsr   r   r*   r   r   r   r    r   r   r=   appenddictdacl_addr'   as_sddlr   r   r   encoder   r!   )r   r   del_acesadd_aces	sddl_attrr$   r:   r#   	dacl_copyr=   errr+   old_sddlnum_changesdel_ignoredadd_ignoredinherited_ignoredadd_idxnew_sddlr%   s   `                   r   update_aces_in_daclzSDUtils.update_aces_in_daclE   s?   HH	'
 )H,A,AAB##B#:B77X=== )1	$>> 	!Cyy8#F#FF!OOC0	! ((//"j$#,+ " BC3q6),Q/0H$$..xIB 	C#s##C(c8<<010yy8>>>!((-"'',,&""3'OOC 1K	   	CG#t$C<!%jG%j#s##C(c8<<010yy8>>>!((-bggll"""3'KKW%1K'	* !->>>  R( ;zz$//2H	AAD)(//'*B*:*35AiL HHOOAO1K):::M  %22 !"xx{.MM&)	 !!s   L$$M7MMc                    t         j                  j                  d|z   | j                        }g }d}|j                  j
                  D ]  }|j                  ||d       |dz  } | j                  |||      \  }}	}
|	|
fS )zCPrepend an ACE (or more) to an objects security descriptor
        r3   r   )r<   r=   r4   rN   r$   r   r   r    r   r6   r7   rH   rY   )r   r"   r7   r$   r9   rN   rW   r=   _aiiis              r   dacl_prepend_aceszSDUtils.dacl_prepend_aces   s     $$..td{DOOL;;## 	COOGC89qLG	 **9x4< + >"R2vr   c                 4    | j                  ||dg      \  }}y)z?Add an ACE (or more) to an objects security descriptor
        show_deleted:1r)   N)r`   )r   r"   r=   r]   s       r   dacl_add_acezSDUtils.dacl_add_ace   s(     $$Y/?.@ % B!r   c                     t         j                  j                  d|z   | j                        }g }|j                  j
                  D ]  }|j                  |        | j                  |||      \  }}}	||	fS )zBAppend an ACE (or more) to an objects security descriptor
        r3   r[   r\   )
r   r"   r7   r$   r9   rN   r=   r]   r^   r_   s
             r   dacl_append_aceszSDUtils.dacl_append_aces   sy     $$..td{DOOL;;## 	!COOC 	!**9x4< + >"R2vr   c                     t         j                  j                  d|z   | j                        }g }|j                  j
                  D ]  }|j                  |        | j                  |||      \  }}}	||	fS )zBDelete an ACE (or more) to an objects security descriptor
        r3   )rM   r$   r\   )
r   r"   r7   r$   del_sdrM   r=   dir]   r_   s
             r   dacl_delete_aceszSDUtils.dacl_delete_aces   sy     $$..td{DOOL;;## 	!COOC 	!**9x4< + >1R2vr   c                 l    |g }| j                  ||dgz         }|j                  | j                        S )z:Return object nTSecurityDescriptor in SDDL format
        rb   )r-   rK   r   )r   r"   r$   r,   s       r   get_sd_as_sddlzSDUtils.get_sd_as_sddl   s=     H!!)X9I8J-JK||DOO,,r   r   )NNNN)__name__
__module____qualname____doc__r   r'   r-   r0   rY   r`   rc   re   ri   rk    r   r   r   r      sE    MF%*5D ?C59a;FB		-r   r   )ro   rE   r   r   r   r   r   r   	samba.ndrr   r	   r
   samba.dcerpcr   samba.ntstatusr   objectr   rp   r   r   <module>ru      s2   & <  + + , 8 8 !
x-f x-r   