
    _$e>                      ~    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dS )
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                   b    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g fdZdS )SDUtilszCSome utilities for manipulation of security descriptors on objects.c                 t    || _         t          j        | j                                                   | _        d S 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-    "*48+B+B+D+DEE    Nc                 "   t                      }t          |t                    r||_        nt          | j        |          |_        t          |t
                    st          |t          j                  sJ t          |t
                    r&t          j                            || j	                  }nt          |t          j                  r|}t          t          |          t          d          |d<   | j                            ||           dS )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     IIi$$ 	+ADDdh	**AD"c""JjX5H&I&IJJJb# 	*44RIIHHH/00 	H$28H3E3E3C3I%K %K
 ! 	8$$$$$r   c                     | 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;   sS    hooiT56  K K1v,-a0(-t444r   c                     | 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   s6    hooi(((*CF;,?,BCCCr   c                     |g }|g } fd}||dt           j        z  g}                     ||          }|j        t           j        z  s}t          |j                  }|j        D ]a}	|	j        t           j	        z  rK	 |
                    |	           -# t          j        $ r"}
|
j        d         t          k    r|
Y d }
~
Yd }
~
ww xY wbno|g } j                            |t"          d |g|          }t%          |d         |         d                   }t           j                            | j                  }d}g }g }g }|D ]}	t-          |	t$                    r ||	          }	t-          |	t           j                  sJ |	j        t           j	        z  r|                    |	           h|	|j        j        vr|                    |	           |
                    |	           |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|                    |	           |	|j        j        v r|                    |	           |                    |	|           |dz  }|dk    r|||fS |                     |||           nw|                     j                  }t;                      }||_        t?          |                     d	          tB          |          ||<    j        "                    ||           |||fS )
Nc                     t           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   sO    (224(?DOT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B##B#::B7X== ! )11	$> 	! 	!Cy8#FF !!OOC0000$2 ! ! !"x{.MMM&)	 !DDDD!! (//"j$#,+ " B BC3q6),Q/00H$..xIIB 	 	C#s## )#mC((c8<00111y8>> !((---"',&&""3'''OOC   1KK 	 	CG#t$$ !C<<!%jG%j#s## )#mC((c8<00111y8>> !((---bgl""""3'''KKW%%%1KK!->>>  R( ;;;;zz$/22H		AAD)(//'*B*B*:*35 5AiL HOOAO111K):::s    BC%CCc                     t           j                            d|z   | j                  }g }d}|j        j        D ]}|                    ||d           |dz  } |                     |||          \  }}	}
|	|
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{DOLL;# 	 	COOGC88999qLGG**9x4< + > >"R2vr   c                 >    |                      ||dg          \  }}dS )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   s2     $$Y/?.@ % B B!!!r   c                     t           j                            d|z   | j                  }g }|j        j        D ]}|                    |           |                     |||          \  }}}	||	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   s     $..td{DOLL;# 	! 	!COOC    **9x4< + > >"R2vr   c                     t           j                            d|z   | j                  }g }|j        j        D ]}|                    |           |                     |||          \  }}}	||	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   s     $..td{DOLL;# 	! 	!COOC    **9x4< + > >1R2vr   c                 j    |                      ||dgz             }|                    | j                  S )z:Return object nTSecutiryDescriptor in SDDL format
        rb   )r-   rK   r   )r   r"   r$   r,   s       r   get_sd_as_sddlzSDUtils.get_sd_as_sddl   s6     !!)X9I8J-JKK||DO,,,r   r   )NNNN)__name__
__module____qualname____doc__r   r'   r-   r0   rY   r`   rc   re   ri   rk    r   r   r   r      s        MMF F F% % % %*5 5 5 5D D D ?C59a; a; a; a;F   B B B	 	 	 		 	 	 	 24 - - - - - -r   r   )ro   rE   r   r   r   r   r   r   	samba.ndrr   r	   r
   samba.dcerpcr   samba.ntstatusr   objectr   rp   r   r   <module>ru      s   & < ;  + + + + + + + + + + , , , , , , , , 8 8 8 8 8 8 8 8 8 8 ! ! ! ! ! !     
v- v- v- v- v-f v- v- v- v- v-r   