
P'Wc           @   s   d  d l  Z  d  d l 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 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 m Z d e f d     YZ d S(   iN(   t	   b64decode(   t   dsdb(   t   common(   t   misc(   t   drsuapi(   t
   ndr_unpackt   ndr_pack(   t   drsblobs(   t   dsdb_Dn(   t   security(   t   get_wellknown_sdst   get_diff_sds(   t   system_sessiont   admin_sessiont   dbcheckc           B   s3  e  Z d  Z e e e e e e e d  Z e e j g  d g d  Z d   Z	 e e d  Z
 d   Z d   Z e d  Z d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z  d   Z! d   Z" d   Z# d   Z$ d   Z% d    Z& d!   Z' d"   Z( d#   Z) d$   Z* d%   Z+ d&   Z, d'   Z- d(   Z. d)   Z/ d*   Z0 d+   Z1 d,   Z2 d-   Z3 d.   Z4 d/   Z5 d0   Z6 d1   Z7 d2   Z8 d3   Z9 d4   Z: d g d5  Z; d6   Z< d7   Z= d8   Z> RS(9   s   check a SAM database for errorsc	      	   C   s  | |  _  d  |  _ | p | |  _ | |  _ | |  _ | |  _ | |  _ t |  _	 t |  _
 t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t |  _  | |  _! t |  _" | |  _# t$ j% | d | j&    |  _' t$ j% | d | j(    |  _) | j*   |  _+ t$ j% | d | j&    |  _, t$ j% | | j-    |  _. i  |  _/ t0 |  j   |  _1 t |  _2 t3   |  _4 i  |  _5 yc | j6 d d | j&   d t$ j7 d d g  }	 t8 t9 j: |	 d	 d d	  }
 t; |
  |  j5 d
 <Wn1 t$ j< k
 r\ } } | t$ j= k r  qn Xt>   |  _? t@ d  | jA    |  _B |  j  j6 d |  j. d t$ j7 d d d g  }	 d |	 d	 k r|	 d	 d |  _C n- d |	 d	 k r(|	 d	 d |  _C n	 d  |  _C |  j  j6 d d d t$ j7 d d g  }	 y{ |	 d	 d } g  |  _D x] | D]U } y; |  j  jE t$ j% |  j  |  tF jG  } |  jD jH |  WqytI k
 rqyXqyWWn! tI k
 rn tJ k
 rn Xd  S(   Ns   CN=Infrastructure,s   CN=Partitions,%ss   CN=RID Manager$,CN=System,t   bases   CN=DnsAdmins,CN=Users,%st   scopet   attrst	   objectSidi    t	   DnsAdminss   msDS-hasMasterNCst   hasMasterNCst    t   namingContexts(K   t   samdbt   Nonet   dict_oid_namet   samdb_schemat   verboset   fixt   yest   quiett   Falset   remove_all_unknown_attributest   remove_all_empty_attributest   fix_all_normalisationt   fix_all_DN_GUIDst   fix_all_binary_dnt   remove_all_deleted_DN_linkst   fix_all_target_mismatcht   fix_all_metadatat   fix_time_metadatat   fix_all_missing_backlinkst   fix_all_orphaned_backlinkst   fix_rmd_flagst   fix_ntsecuritydescriptort$   fix_ntsecuritydescriptor_owner_groupt   seize_fsmo_rolet   move_to_lost_and_foundt   fix_instancetypet"   fix_replmetadata_zero_invocationidt   fix_replmetadata_unsorted_attidt   fix_deleted_deleted_objectst   fix_dnt   fix_base64_userparameterst   fix_utf8_userparameterst   fix_doubled_userparameterst   reset_well_known_aclst   reset_all_well_known_aclst   in_transactiont   ldbt   Dnt	   domain_dnt   infrastructure_dnt   get_config_basednt	   naming_dnt   get_schema_basednt	   schema_dnt   rid_dnt   get_dsServiceNamet   ntds_dsat   class_schemaIDGUIDR
   t   wellknown_sdst   fix_all_missing_objectclasst   sett   dn_sett   name_mapt   searcht
   SCOPE_BASER   R	   t   dom_sidt   strt   LdbErrort   ERR_NO_SUCH_OBJECTR   t   system_session_infoR   t   get_domain_sidt   admin_session_infot	   write_ncst   deleted_objects_containerst   get_wellknown_dnR   t!   DS_GUID_DELETED_OBJECTS_CONTAINERt   appendt   KeyErrort
   IndexError(   t   selfR   R   R   R   R   R   R:   R8   t   rest   dnsadmins_sidt   enumt   estrt   ncst   nct   dn(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   __init__'   s    																																				"-	'	t   *c      	   C   s   |  j  j d | d | d d g d |  } |  j d t |   d } xC | D]; } |  j j t | j   | |  j | j d | 7} qN W| d
 k r | |  j
   7} n  | d k r |  j r |  j d  n  |  j d	 t |  | f  | S(   s>   perform a database check, returning the number of errors foundR   R   R   Rc   t   controlss   Checking %u objectsi    s$   Please use --fix to fix these errorss   Checked %u objects (%u errors)N(   R   RL   t   reportt   lenRJ   t   addRO   Rc   t   check_objectR   t   check_rootdseR   (   R\   t   DNR   Rf   R   R]   t   error_countt   object(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   check_database   s    * c         C   s   |  j  s | GHn  d S(   s#   print a message unless quiet is setN(   R   (   R\   t   msg(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyRg      s    	c         C   sH   |  j  s t S|  j r |  j S|  j r/ t } n  t j | d | d | S(   s   confirm a changet   forcedt	   allow_all(   R   R   R   R   t   TrueR   t   confirm(   R\   Rp   Rr   Rq   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyRt      s    				c         C   s   |  j  s t S|  j r |  j St |  |  d k r6 t St |  |  d k rT t } n	 |  j } t j | d | d t } | d k r t |  | d  t S| d k r t |  | d  t S| S(   s(   confirm a change with support for "all" t   NONEt   ALLRq   Rr   (	   R   R   R   R   t   getattrRs   R   Rt   t   setattr(   R\   Rp   t   all_attrRq   t   c(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   confirm_all   s"    				c         C   s}   |  j  r |  j d |  n  y. | d t j g } |  j j | d | Wn+ t k
 rx } |  j d | | f  t SXt S(   s&   delete dn with optional verbose outputs   delete DN %ss   local_oid:%s:0Rf   s   %s : %s(	   R   Rg   R   t   DSDB_CONTROL_DBCHECKR   t   deletet	   ExceptionR   Rs   (   R\   Rc   Rf   Rp   t   err(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt	   do_delete   s    	c         C   s   |  j  r+ |  j |  j j | t j   n  y4 | d t j g } |  j j | d | d | Wn+ t	 k
 r } |  j d | | f  t
 SXt S(   s-   perform a modify with optional verbose outputs   local_oid:%s:0Rf   t   validates   %s : %s(   R   Rg   R   t
   write_ldifR;   t   CHANGETYPE_MODIFYR   R|   t   modifyR~   R   Rs   (   R\   t   mRf   Rp   R   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt	   do_modify   s    	" c         C   s   |  j  r8 |  j d t |  t |  t |  f  n  y; | | } | d t j g } |  j j | | d | Wn+ t k
 r } |  j d | | f  t SXt	 S(   s-   perform a modify with optional verbose outputsD   dn: %s
changeType: modrdn
newrdn: %s
deleteOldRdn: 1
newSuperior: %ss   local_oid:%s:0Rf   s   %s : %s(
   R   Rg   RO   R   R|   R   t   renameR~   R   Rs   (   R\   t   from_dnt   to_rdnt   to_baseRf   Rp   t   to_dnR   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt	   do_rename   s    	)
c         C   s   |  j  d | | f  |  j d | | f d  sH |  j  d |  d St j   } | | _ t j d t j |  | | <|  j | d d g d	 | d
 t r |  j  d |  n  d S(   s   fix empty attributess   ERROR: Empty attribute %s in %ss"   Remove empty attribute %s from %s?R!   s   Not fixing empty attribute %sNR   s   relax:0s   show_recycled:1s#   Failed to remove empty attribute %sR   s   Removed empty attribute %s(	   Rg   R{   R;   t   MessageRc   t   MessageElementt   FLAG_MOD_DELETER   R   (   R\   Rc   t   attrnameR   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_empty_attribute   s    	c   
      C   s  |  j  d | | f  g  } x | D] } |  j j |  j | | g  } t |  d k r |  j  d |  | j | d f  q$ | d | k r$ |  j  d | | d f  | j | | d f  q$ q$ W|  j d | | f d  s |  j  d	 |  d
 St j   } | | _	 x| t
 d t |   D]e } | | \ } }	 t j | t j |  | d | <|	 d k r&t j |	 t j |  | d | <q&q&W|  j | d d g d | d t r|  j  d |  n  d
 S(   s"   fix attribute normalisation errorss1   ERROR: Normalisation error for attribute %s in %si   s   Unable to normalise value '%s'R   i    s   value '%s' should be '%s's!   Fix normalisation for %s from %s?R"   s   Not fixing attribute %sNs   value_%us   normv_%us   relax:0s   show_recycled:1s    Failed to normalise attribute %sR   s   Normalised attribute %s(   Rg   R   t   dsdb_normalise_attributesR   Rh   RY   R{   R;   R   Rc   t   rangeR   R   t   FLAG_MOD_ADDR   R   (
   R\   Rc   R   t   valuest   mod_listt   valt
   normalisedR   t   it   nval(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_normalise_mismatch   s4    		 
	c         C   s  |  j  j |  j | |  } |  j d | | f  |  j d | t |  f  t |  | k re d S|  j d | | f d  s |  j d |  d St j   } | | _ t j	 | t j
 |  | | <|  j | d d g d	 | d
 t r |  j d |  n  d S(   s"   fix attribute normalisation errorss5   ERROR: Normalisation error for attribute '%s' in '%s's0   Values/Order of values do/does not match: %s/%s!Ns%   Fix normalisation for '%s' from '%s'?R"   s   Not fixing attribute '%s's   relax:0s   show_recycled:1s    Failed to normalise attribute %sR   s   Normalised attribute %s(   R   R   R   Rg   t   listR{   R;   R   Rc   R   t   FLAG_MOD_REPLACER   R   (   R\   Rc   R   R   R   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_normalise_mismatch_replace  s    	
	c         C   s   | j  d t j k S(   s2   see if a dsdb_Dn is the special Deleted Objects DNs   B:32:%s:(   t   prefixR   RX   (   R\   t   dsdb_dn(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   is_deleted_objects_dn%  s    c         C   s   |  j  d | |  j j |  f  |  j d | d  sN |  j  d |  d S|  j | d g d |  r~ |  j  d |  n  d S(	   s!   handle object without objectclasss   ERROR: missing objectclass in object %s.  If you have another working DC, please run 'samba-tool drs replicate --full-sync --local <destinationDC> <sourceDC> %s'sI   If you cannot re-sync from another DC, do you wish to delete object '%s'?RH   s1   Not deleting object with missing objectclass '%s'Ns   relax:0s   Failed to remove DN %ss   Removed DN %s(   Rg   R   t   get_nc_rootR{   R   (   R\   Rc   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_missing_objectclass)  s    #c         C   s   |  j  d | | | f  |  j  d |  |  j d d  sN |  j  d  d St j   } | | _ t j | t j |  | d <|  j | d d	 t j	 g d
 |  r |  j  d |  n  d S(   s(   handle a DN pointing to a deleted objects4   ERROR: target DN is deleted for %s in object %s - %ss#   Target GUID points at deleted DN %ss   Remove DN link?R%   s   Not removingNt	   old_values   show_recycled:1s   local_oid:%s:0s(   Failed to remove deleted DN attribute %ss"   Removed deleted DN on attribute %s(
   Rg   R{   R;   R   Rc   R   R   R   R   R|   (   R\   Rc   R   R   R   t
   correct_dnR   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_deleted_dn3  s    	c         C   sk   |  j  j |  } | d @d k rN t |  j d  d k rN |  j d  d S|  j | | | | |  d S(   sE   handle a missing target DN (both GUID and DN string form are missing)i   i    s   \0ADELis"   Not removing dangling forward linkN(   R   t   get_linkId_from_lDAPDisplayNameRO   t   findRg   R   (   R\   Rc   R   R   R   t   linkID(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_missing_dn_GUIDA  s
    +c      	   C   s  |  j  d | | | | f  d d g } y7 |  j j d t | j  d t j d g  d |  } WnM t j k
 r \ } }	 |  j  d | j |	 f  |  j | | | |  d	 SXt	 |  d
 k r |  j  d | j  |  j | | | |  d	 S| d
 j | _ |  j
 d t |  d  s1|  j  d |  d	 St j   }
 | |
 _ t j | t j |  |
 d <t j t |  t j |  |
 d <|  j |
 d g d | | f  r|  j  d | | f  n  d	 S(   s+   handle a missing GUID extended DN components,   ERROR: %s component for %s in object %s - %ss   extended_dn:1:1s   show_recycled:1R   R   R   Rf   s&   unable to find object for DN %s - (%s)Ni    s   unable to find object for DN %ss   Change DN to %s?R#   s   Not fixing %sR   t	   new_values    Failed to fix %s on attribute %ss   Fixed %s on attribute %s(   Rg   R   RL   RO   Rc   R;   RM   RP   R   Rh   R{   R   R   R   R   R   (   R\   Rc   R   R   R   t   errstrRf   R]   R_   R`   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_incorrect_dn_GUIDJ  s0    $	"c         C   s   |  j  d | | | | f  d d g } |  j d t |  d  sZ |  j  d |  d St j   } | | _ t j | t j |  | d <t j t |  t j |  | d	 <|  j	 | d g d
 | | f  r |  j  d | | f  n  d S(   s'   handle an incorrect binary DN components3   ERROR: %s binary component for %s in object %s - %ss   extended_dn:1:1s   show_recycled:1s   Change DN to %s?R$   s   Not fixing %sNR   R   s    Failed to fix %s on attribute %ss   Fixed %s on attribute %s(
   Rg   R{   RO   R;   R   Rc   R   R   R   R   (   R\   Rc   R   R   R   R   Rf   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_incorrect_binary_dng  s    	"c         C   s   |  j  d | | | f  | | _ |  j d t |  d  sT |  j  d |  d St j   } | | _ t j | t j |  | d <t j t |  t j |  | d <|  j	 | d g d	 |  r |  j  d
 |  n  d S(   s"   handle a DN string being incorrects=   ERROR: incorrect DN string component for %s in object %s - %ss   Change DN to %s?R&   s   Not fixing %sNR   R   s   show_recycled:1s1   Failed to fix incorrect DN string on attribute %ss)   Fixed incorrect DN string on attribute %s(
   Rg   Rc   R{   RO   R;   R   R   R   R   R   (   R\   Rc   R   R   R   R   R   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_dn_target_mismatchx  s    		"c         C   s   |  j  d | | j f  |  j d | d  sE |  j  d |  d St j   } | j | _ t j g  t j |  | d <|  j | d d g d	 |  r |  j  d
 |  n  d S(   s!   handle an unknown attribute errors#   ERROR: unknown attribute '%s' in %ss   Remove unknown attribute %sR    s   Not removing %sNR   s   relax:0s   show_recycled:1s%   Failed to remove unknown attribute %ss   Removed unknown attribute %s(   Rg   Rc   R{   R;   R   R   R   R   (   R\   t   objR   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_unknown_attribute  s    c         C   s   |  j  d | | | | j f  |  j d | d  sK |  j  d |  d St j   } | j | _ t j | t j |  | d <t j | t j |  | d <|  j | d g d	 |  r |  j  d
 |  n  d S(   s   handle a missing backlink values>   ERROR: missing backlink attribute '%s' in %s for link %s in %ss   Fix missing backlink %sR)   s   Not fixing missing backlink %sNR   R   s   show_recycled:1s!   Failed to fix missing backlink %ss   Fixed missing backlink %s(	   Rg   Rc   R{   R;   R   R   R   R   R   (   R\   R   R   R   t   backlink_namet	   target_dnR   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_missing_backlink  s     c         C   s   t  | j j d   } |  j d | | | j | j j   f  |  j d | d  sl |  j d |  d St j   } | j | _ t j t	 |  t j
 |  | d <|  j | d d	 d
 g d |  r |  j d |  n  d S(   s"   handle a incorrect RMD_FLAGS valuet	   RMD_FLAGSsH   ERROR: incorrect RMD_FLAGS value %u for attribute '%s' in %s for link %ss   Fix incorrect RMD_FLAGS %uR+   s!   Not fixing incorrect RMD_FLAGS %uNR   s   show_recycled:1s   reveal_internals:0s   show_deleted:0s$   Failed to fix incorrect RMD_FLAGS %us   Fixed incorrect RMD_FLAGS %u(   t   intRc   t   get_extended_componentRg   t   extended_strR{   R;   R   R   RO   R   R   (   R\   R   R   t   revealed_dnt	   rmd_flagsR   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_incorrect_rmd_flags  s    )"c         C   s   |  j  d | | j | | f  |  j d | d  sK |  j  d |  d St j   } | j | _ t j | t j |  | d <|  j | d d g d	 |  r |  j  d
 |  n  d S(   s    handle a orphaned backlink values?   ERROR: orphaned backlink attribute '%s' in %s for link %s in %ss   Remove orphaned backlink %sR*   s!   Not removing orphaned backlink %sNt   values   show_recycled:1s   relax:0s"   Failed to fix orphaned backlink %ss   Fixed orphaned backlink %s(   Rg   Rc   R{   R;   R   R   R   R   (   R\   R   R   R   t	   link_nameR   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_orphaned_backlink  s     c         C   s  |  j  d | j  |  j j d d t j d d g } t |  d k sP t  | d d d } |  j d | j | f d	  s |  j  d
 | j | f  d St j	   } | j | _ t j
 | t j d  | d <|  j | g  d | j | f  r|  j  d | j | f  n  d S(   s   handle a missing fSMORoleOwners*   ERROR: fSMORoleOwner not found for role %sR   R   R   t   dsServiceNamei   i    s8   Sieze role %s onto current DC by adding fSMORoleOwner=%sR.   s>   Not Siezing role %s onto current DC by adding fSMORoleOwner=%sNt   fSMORoleOwnerR   sB   Failed to sieze role %s onto current DC by adding fSMORoleOwner=%ss9   Siezed role %s onto current DC by adding fSMORoleOwner=%s(   Rg   Rc   R   RL   R;   RM   Rh   t   AssertionErrorR{   R   R   R   R   (   R\   R   R]   t   serviceNameR   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_no_fsmoRoleOwner  s    c      	   C   s  |  j  d | j  |  j d | j d  sE |  j  d | j  d St } |  j j   y:|  j j | j  } |  j j | t j	  } t
 j |  j t | j   } | j t |  d  |  j | j | | d d g d	 | j | | f  r|  j  d
 | j | | f  t
 j   } | j | _ t
 j t | j j    t
 j d  | d <|  j | g  d | |  r|  j  d | |  t } qn  Wn |  j j     n X| r|  j j   n |  j j   d S(   s   handle a missing parents%   ERROR: parent object not found for %ss!   Move object %s into LostAndFound?R/   s&   Not moving object %s into LostAndFoundNi   s   show_deleted:0s   relax:0s2   Failed to rename object %s into lostAndFound at %ss)   Renamed object %s into lostAndFound at %st   lastKnownParents:   Failed to set lastKnownParent on lostAndFound object at %ss0   Set lastKnownParent on lostAndFound object at %s(   Rg   Rc   R{   Rs   R   t   transaction_startR   RW   R   t   DS_GUID_LOSTANDFOUND_CONTAINERR;   R<   RO   t   remove_base_componentsRh   R   R   R   t   parentR   R   t   transaction_cancelt   transaction_commit(   R\   R   t   keep_transactiont   nc_roott   lost_and_foundt   new_dnR   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_missing_parent  s6    +c   	      C   s!  t  j |  j t |   } | j t |  d  | j   } d } | | k rg | d | | f 7} n  | d | 7} |  j d | j | | f  |  j	 d | j | f d  s |  j d | j | f  d	 S|  j
 | j | | d
 d g d | j | f  r|  j d | j | f  n  d	 S(   s   handle a wrong dni   R   s   %s=%r s   name=%rs!   ERROR: wrong dn[%s] %s new_dn[%s]s   Rename %s to %s?R4   s   Not renaming %s to %sNs   show_recycled:1s   relax:0s"   Failed to rename object %s into %ss   Renamed %s into %s(   R;   R<   R   RO   R   Rh   R   Rg   Rc   R{   R   (	   R\   R   R   t   rdn_attrt   rdn_valt   name_valt   new_rdnt
   new_parentt
   attributes(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_wrong_dn  s    c         C   s   |  j  d | d | j | f  |  j d | d | | j f d  sl |  j  d | d | | j f  d St j   } | j | _ t j t |  t j d  | d <|  j | d t	 j
 g d	 | j | f  r |  j  d
 | j | f  n  d S(   s   handle a wrong instanceTypes0   ERROR: wrong instanceType %s on %s, should be %dt   instanceTypes(   Change instanceType from %s to %d on %s?R0   s-   Not changing instanceType from %s to %d on %sNR   s   local_oid:%s:0sG   Failed to correct missing instanceType on %s by setting instanceType=%ds7   Corrected instancetype on %s by setting instanceType=%d(   Rg   Rc   R{   R;   R   R   RO   R   R   R   t&   DSDB_CONTROL_DBCHECK_MODIFY_RO_REPLICA(   R\   R   t   calculated_instancetypeR   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_wrong_instancetype  s    !&!"c         C   s-   |  j  d | j |  j j | j  f  d  S(   Ns   ERROR: incorrect userParameters value on object %s.  If you have another working DC that does not give this warning, please run 'samba-tool drs replicate --full-sync --local <destinationDC> <sourceDC> %s'(   Rg   Rc   R   R   (   R\   R   R   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_short_userParameters  s    c         C   s   |  j  d | | j f  |  j d | j d  sK |  j  d | j  d St j   } | j | _ t j t | | d  t j d  | d <|  j | g  d	 | j  r |  j  d
 | j  n  d S(   s   handle a wrong userParameterssN   ERROR: wrongly formatted userParameters %s on %s, should not be base64-encodeds2   Convert userParameters from base64 encoding on %s?R5   s6   Not changing userParameters from base64 encoding on %sNi    t   userParametersR   sO   Failed to correct base64-encoded userParameters on %s by converting from base64sG   Corrected base64-encoded userParameters on %s by converting from base64(	   Rg   Rc   R{   R;   R   R   R    R   R   (   R\   R   R   R   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_base64_userParameters  s    *c         C   s   |  j  d | j  |  j d | j d  sE |  j  d | j  d St j   } | j | _ t j | | d j d  j d  t j d	  | d
 <|  j	 | g  d | j  r |  j  d | j  n  d S(   s   handle a wrong userParameterssO   ERROR: wrongly formatted userParameters on %s, should not be psudo-UTF8 encodeds0   Convert userParameters from UTF8 encoding on %s?R6   s4   Not changing userParameters from UTF8 encoding on %sNi    t   utf8s	   utf-16-leR   R   sQ   Failed to correct psudo-UTF8 encoded userParameters on %s by converting from UTF8sI   Corrected psudo-UTF8 encoded userParameters on %s by converting from UTF8(
   Rg   Rc   R{   R;   R   R   t   decodet   encodeR   R   (   R\   R   R   R   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_utf8_userParameters'  s    #c         C   s   |  j  d | j  |  j d | j d  sE |  j  d | j  d St j   } | j | _ t j | | d j d  j d  j d  t j d  | d	 <|  j	 | g  d
 | j  r |  j  d | j  n  d S(   s   handle a wrong userParameterssQ   ERROR: wrongly formatted userParameters on %s, should not be double UTF16 encodeds:   Convert userParameters from doubled UTF-16 encoding on %s?R7   s>   Not changing userParameters from doubled UTF-16 encoding on %sNi    s	   utf-16-leR   R   sJ   Failed to correct doubled-UTF16 encoded userParameters on %s by convertingsB   Corrected doubled-UTF16 encoded userParameters on %s by converting(
   Rg   Rc   R{   R;   R   R   R   R   R   R   (   R\   R   R   R   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_doubled_userParameters6  s    ,c         C   s-   |  j  d | j |  j j | j  f  d  S(   Ns   ERROR: incorrect userParameters value on object %s (odd length).  If you have another working DC that does not give this warning, please run 'samba-tool drs replicate --full-sync --local <destinationDC> <sourceDC> %s'(   Rg   Rc   R   R   (   R\   R   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_odd_userParametersE  s    c   	      C   s   |  j  j d | d t j d | g d d d d g  } |  j j |  } xM | d | D]= } t |  j  | |  } | j j d	  } | | k rW | SqW Wd
 S(   s#   return a revealed link in an objectR   R   R   Rf   s   show_deleted:0s   extended_dn:0s   reveal_internals:0i    t   GUIDN(
   R   RL   R;   RM   R   t#   get_syntax_oid_from_lDAPDisplayNameR   Rc   R   R   (	   R\   Rc   R   t   guidR]   t
   syntax_oidR   R   t   guid2(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   find_revealed_linkI  s    $c         C   sh  d } x[| | D]O} t  |  j | |  } | j j d  } | d k rv | d 7} |  j | j | | | d  q n  t t j |   } d g }	 t |  j	   d k r | j |  j
 k r t }
 |	 j d  n t }
 |  j j |  } |  j j |  } | d k	 r|	 j |  n  y8 |  j j d d	 | d
 t j d |	 d d d g  } WnE t j k
 r\ } } | d 7} |  j | j | | | d  q n X|
 rd t | d d d  | _ d t | d d d  | _ t |  | k r| d 7} |  j | j | | | d  q qn  d | k oB| d d j   d k } d | d k op| d d d j   d k } | r| r|  j |  r| d 7} |  j | j | | | | d j  q n  | d j j   | j j   k r| d 7} |  j | j | | | | d j d  q n  | r| r| d k	 r|  j | j | |  } | j j d  } | d k	 rt |  d @d k r|  j | | |  q qn  | d k	 r d } | | d k rx; | d | D]( } | | j j   k r| d 7} qqWn  | d k r`| d 7} | d @r;|  j  | | | | | j  q |  j! | | | | | j  q q`q q W| S(   s$   check a DN attribute for correctnessi    R   i   s   missing GUIDt	   isDeleteds   msds-hasinstantiatedncsR   R   s	   <GUID=%s>R   R   Rf   s   extended_dn:1:1s   show_recycled:1s   incorrect GUIDs	   B:8:%08X:s   %08Xs(   incorrect instanceType part of Binary DNt   TRUEs   incorrect string version of DNR   N("   R   R   Rc   R   R   R   RO   R   R   t   lowerRE   Rs   RY   R   R   R   t!   get_backlink_from_lDAPDisplayNameRL   R;   RM   RP   R   R   t   binaryR   t   upperR   R   R   R   R   R   R   R   (   R\   R   R   R   Rm   R   R   R   t   guidstrR   t   fixing_msDS_HasInstantiatedNCsR   t   reverse_link_nameR]   R_   R`   t
   is_deletedt   target_is_deletedR   R   t   match_countt   v(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   check_dnU  s~    
	*

	&.
#"
"	

c         C   sR   t  t j t |   } | j } x* | j j D] } | j | k r. | j Sq. Wd S(   s   Read metadata properties and return the originating time for
           a given attributeId.

           :return: the originating time or 0 if not found
        i    (   R   R   t   replPropertyMetaDataBlobRO   t   ctrt   arrayt   attidt   originating_change_time(   R\   R   R   t   replR   t   o(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   get_originating_time  s    	c         C   s   t    } g  } t t j t |   } | j } xL | j j D]> } |  j j | j	  } | j
 | j    | j | j	  q= W| | f S(   sg   Read metadata properties and list attributes in it.
           raises KeyError if the attid is unknown.(   RI   R   R   R   RO   R   R   R   t   get_lDAPDisplayName_by_attidR   Ri   R   RY   (   R\   R   t   set_attt
   list_attidR   R   R   t   att(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   process_metadata  s    		c      
   C   s   |  j  j d | d t j d | g d d d g  } | d } t j   } | | _ t j | | t j |  | | <|  j | d d	 d g d
 |  r |  j	 d |  n  d S(   s   re-write replPropertyMetaData elements for a single attribute for a
        object. This is used to fix missing replPropertyMetaData elementsR   R   R   Rf   s   search_options:1:2s   show_recycled:1i    s   relax:0s   provision:0s'   Failed to fix metadata for attribute %ss   Fixed metadata for attribute %sN(
   R   RL   R;   RM   R   Rc   R   R   R   Rg   (   R\   Rc   t   attrR]   Rp   t   nmsg(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   fix_metadata  s    $
	 c         C   s   | j  t j @r d  St } | j t j k r5 t } nQ | j t j k rP t } n6 | j t j	 k rk t } n | j t j
 k r t } n  | s d  S| j j  t j @s d  St | j j  S(   N(   t   flagsR	   t   SEC_ACE_FLAG_INHERIT_ONLYR   R   t   typet"   SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECTRs   t!   SEC_ACE_TYPE_ACCESS_DENIED_OBJECTt    SEC_ACE_TYPE_SYSTEM_AUDIT_OBJECTt    SEC_ACE_TYPE_SYSTEM_ALARM_OBJECTRn   t%   SEC_ACE_INHERITED_OBJECT_TYPE_PRESENTRO   t   inherited_type(   R\   t   acet   check(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt    ace_get_effective_inherited_type  s     				c         C   s   | |  j  k r |  j  | Sd | } |  j j d |  j d | d d g  } t t t j | d d d   } | |  j  | <| S(   Ns0   (&(ldapDisplayName=%s)(objectClass=classSchema))R   t
   expressionR   t   schemaIDGUIDi    (   RF   R   RL   RB   RO   R   R   R   (   R\   t   clst   fltR]   t   t(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   lookup_class_schemaIDGUID  s    
$c      
   C   s7  d } | | } t  t j t |   } d | k oK | d d j   d k } | r^ | d  f St j   } | j | _ | j | _ | j | _ | j	 | _	 t
 } d  }	 g  }
 | j d  k	 r | j j }
 n  x t d t |
   D] } |
 | } | j t j @s| j |  q n  |  j |  } | d  k r4q n  |	 d  k	 r[| |	 k r t } q q n  | }	 q Wg  }
 | j d  k	 r| j j }
 n  x t d t |
   D] } |
 | } | j t j @s| j |  qn  |  j |  } | d  k rqn  |	 d  k	 r| |	 k rt } qqn  | }	 qW| r4| | f S|	 d  k rJ| d  f Sd  } y | d d } Wn t k
 rw} n X| d  k r|  j j d | d t j d	 d d g d
 d g  } | d } d | k o| d d j   d k } | r| d  f S| d d } n  |  j |  } | |	 k r-| | f S| d  f S(   Nt   nTSecurityDescriptorR   i    R   t   objectClassiR   R   R   Rf   s   show_recycled:1(   R   R	   t
   descriptorRO   R   R   t	   owner_sidt	   group_sidR
  t   revisionR   t   saclt   acesR   Rh   R  t   SEC_ACE_FLAG_INHERITED_ACEt   sacl_addR  Rs   t   daclt   dacl_addRZ   R   RL   R;   RM   R  (   R\   Rc   R   t   sd_attrt   sd_valt   sdR   t   sd_cleant   brokent   last_inherited_typeR!  R   R  R  R  t   eR]   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt
   process_sd  s    
&

	

	



&

c         C   s   d } t  |  } t j t j B} |  j d | | f d  sY |  j d | | f  d St j   } | | _ t j	 | t j
 |  | | <|  j | d | g d |  r |  j d | | f  n  d S(	   s/   re-write the SD due to incorrect inherited ACEsR  s   Fix %s on %s?R,   s   Not fixing %s on %s
Ns   sd_flags:1:%ds   Failed to fix attribute %ss   Fixed attribute '%s' of '%s'
(   R   R	   t   SECINFO_DACLt   SECINFO_SACLR{   Rg   R;   R   Rc   R   R   R   (   R\   Rc   R(  t	   sd_brokenR&  R'  t   sd_flagsR  (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_wrong_sdk  s    	c   
      C   s  d } t  |  } t  |  } t j t j B} | j d k	 rM | t j O} n  | j d k	 rl | t j O} n  |  j	 d | | | f d  s |  j
 d | | f  d St j   }	 | |	 _ t j | t j |  |	 | <|  j |	 d | g d |  r|  j
 d | | f  n  d S(	   sa   re-write the SD due to not matching the default (optional mode for fixing an incorrect provision)R  s,   Reset %s on %s back to provision default?
%sR9   s   Not resetting %s on %s
Ns   sd_flags:1:%ds   Failed to reset attribute %ss   Fixed attribute '%s' of '%s'
(   R   R	   R.  R/  R  R   t   SECINFO_OWNERR  t   SECINFO_GROUPR{   Rg   R;   R   Rc   R   R   R   (
   R\   Rc   R(  t   sd_oldt   diffR&  R'  t
   sd_old_valR1  R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_wrong_default_sd|  s"    	c         C   s   d } t  |  } t j t j B} |  j d | | f d  sY |  j d | | f  d St j   } | | _ t j	 | t j
 |  | | <|  j j |  j  |  j | d | g d |  r |  j d | | f  n  |  j j |  j  d S(	   s/   re-write the SD due to a missing owner or groupR  s'   Fix missing owner or group in %s on %s?R-   s+   Not fixing missing owner or group %s on %s
Ns   sd_flags:1:%ds'   Failed to fix metadata for attribute %ss   Fixed attribute '%s' of '%s'
(   R   R	   R3  R4  R{   Rg   R;   R   Rc   R   R   R   t   set_session_infoRT   R   RR   (   R\   Rc   R(  R&  R'  R1  R  (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_missing_sd_owner  s    	c      	   C   s   t  t j t |   } | j } t } xy | j D]n } | j t j	 d  k rU q1 n  t
 } |  j d | | j | j t j t j | j   |  j j   f  q1 W| S(   Ns$   00000000-0000-0000-0000-000000000000s  ERROR: on replPropertyMetaData of %s, the instanceType on attribute 0x%08x,
                           version %d changed at %s is 00000000-0000-0000-0000-000000000000,
                           but should be non-zero.  Proposed fix is to set to our invocationID (%s).(   R   R   R   RO   R   R   R   t   originating_invocation_idR   R   Rs   Rg   R   t   versiont   timet   ctimet   sambat   nttime2unixR   R   t   get_invocation_id(   R\   Rc   t   repl_meta_dataR   R   t   foundR   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt"   has_replmetadata_zero_invocationid  s    		c         C   s  t  t j t |   } | j } t j t t j     } t	 } x | j
 D] } | j t j d  k rp qL n  t } |  j j t j  }	 | j d | _ | | _ t j |  j j    | _ |	 | _ |	 | _ qL W| rt |  }
 t j   } | | _ |  j d | | |  j j   f d  s?|  j d | | f  d  St j   } | | _ t j |
 t j |  | | <|  j | d t  j! d g d |  r|  j d	 | | f  qn  d  S(
   Ns$   00000000-0000-0000-0000-000000000000i   sZ   Fix %s on %s by setting originating_invocation_id on some elements to our invocationID %s?R1   s   Not fixing %s on %s
s   local_oid:%s:0s#   local_oid:1.3.6.1.4.1.7165.4.3.14:0s   Failed to fix attribute %ss   Fixed attribute '%s' of '%s'
("   R   R   R   RO   R   R?  t   unix2nttimeR   R=  R   R   R;  R   R   Rs   R   t   sequence_numberR;   t   SEQ_NEXTR<  R   RA  t   originating_usnt	   local_usnR   R   Rc   R{   Rg   R   R   R   R   R   (   R\   Rc   R  RB  R   R   t   nowRC  R   t   seqt   replBlobRp   R  (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt"   err_replmetadata_zero_invocationid  s<    							c         C   s   t  t j t |   } | j } x\ | j D]Q } y |  j j | j  } Wq+ t	 k
 r{ |  j
 d | j | | f  d  SXq+ Wd  S(   NsI   ERROR: attributeID 0X%0X is not known in our schema, not fixing %s on %s
(   R   R   R   RO   R   R   R   R   R   RZ   Rg   (   R\   Rc   R  RB  R   R   R   R  (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_replmetadata_unknown_attid  s    		c   	      C   s  t  t j t |   } | j } t } |  j d | | f  |  j d | | f d  su |  j d | | f  d  St | j	 d  d d   | j	 d *t
 |  } t j   } | | _ t j | t j |  | | <|  j | d t j d	 d
 g d |  r|  j d | | f  n  d  S(   Ns/   ERROR: unsorted attributeID values in %s on %s
s+   Fix %s on %s by sorting the attribute list?R2   s   Not fixing %s on %s
it   keyc         S   s   |  j  S(   N(   R   (   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   <lambda>  s    s   local_oid:%s:0s#   local_oid:1.3.6.1.4.1.7165.4.3.14:0s#   local_oid:1.3.6.1.4.1.7165.4.3.25:0s   Failed to fix attribute %ss   Fixed attribute '%s' of '%s'
(   R   R   R   RO   R   R   Rg   R{   t   sortedR   R   R;   R   Rc   R   R   R   R   R   (	   R\   Rc   R  RB  R   R   RC  RL  R  (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_replmetadata_unsorted_attid  s&    			#	c         C   s   t  } d | k r/ |  j d | j  t } n  d | k rX |  j d | j  t } n  d | k r |  j d | j  t } n  d | k r |  j d | j  t } n  d	 | k r |  j d
 | j  t } n  | S(   Nt   descriptions>   ERROR: description not present on Deleted Objects container %st   showInAdvancedViewOnlysI   ERROR: showInAdvancedViewOnly not present on Deleted Objects container %st   objectCategorysA   ERROR: objectCategory not present on Deleted Objects container %st   isCriticalSystemObjectsI   ERROR: isCriticalSystemObject not present on Deleted Objects container %st
   isRecycleds9   ERROR: isRecycled present on Deleted Objects container %s(   R   Rg   Rc   Rs   (   R\   R   t   faulty(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   is_deleted_deleted_objects  s"    					c         C   sY  t  j   } | j | _ } d | k rG t  j d t  j d  | d <n  d | k rr t  j d t  j d  | d <n  d | k r t  j d |  j t  j d  | d <n  d | k r t  j d t  j d  | d <n  d | k r t  j d t  j d  | d <n  |  j d	 | d
  s%|  j d |  d  S|  j	 | d g d |  rU|  j d |  n  d  S(   NRS  s   Container for deleted objectsRT  R   RU  s   CN=Container,%sRV  RW  sA   Fix Deleted Objects container %s by restoring default attributes?R3   s.   Not fixing missing/incorrect attributes on %s
s   relax:0s+   Failed to fix Deleted Objects container  %ss%   Fixed Deleted Objects container '%s'
(
   R;   R   Rc   R   R   RB   R   R{   Rg   R   (   R\   R   R  Rc   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   err_deleted_deleted_objects)  s&    &	c         C   sf   | |  j  j k r t S| |  j k r) t S| |  j k r< t S| |  j k rO t S| |  j k rb t St S(   N(   R   R=   Rs   R>   R@   RB   RC   R   (   R\   Rc   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   is_fsmo_roleB  s    c      	   C   s   d } |  j  j |  } | | k r | t j O} y5 |  j  j d | j   d t j d g  d d g  Wn1 t j k
 r \ } } | t j	 k r   q q X| t j
 O} n  |  j d  k	 r t |  |  j k r | t j O} n  | S(   Ni    R   R   R   Rf   s   show_recycled:1(   R   R   R   t   INSTANCE_TYPE_IS_NC_HEADRL   R   R;   RM   RP   RQ   t   INSTANCE_TYPE_NC_ABOVERU   R   RO   t   INSTANCE_TYPE_WRITE(   R\   Rc   t   instancetypeR   R_   R`   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   calculate_instancetypeP  s    5
$c         C   sg   xZ |  j  D]O \ } } | | k r
 t j |  j j    } t t j | | d |  j  Sq
 Wt  d  S(   NRK   (	   RG   R	   RN   R   RS   R   R  RK   RZ   (   R\   Rc   t   sd_dnt   descriptor_fnt
   domain_sid(    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   get_wellknown_sdb  s    		c   +      C   s  |  j  r |  j d |  n  d t t j |  k rE | j d  n  d t t j |  k rm | j d  n  t | j    j   t t j |  k r | j d  n  d t t j |  k r | j | j    | j d  | j d  n  d | k r| j d  n  yx d	 } | t j O} | t j	 O} | t j
 O} | t j O} |  j j d
 | d t j d d d d d | g d |  } WnP t j k
 r\ } } | t j k r|  j r|  j d |  d Sd	 S  n Xt |  d k r|  j d |  d S| d	 } d	 } t   }	 t   }
 t } t } |  j j | j  } y |  j j | t j j  } Wn, t k
 r} t j |  j d |  } n XdB } dB } dB } t } d	 } xm	| D]e	} | d k rqn  t |  j   d k rt } n  t |  j   d k ret | |  d k rT| d 7} |  j d t | |  | t | j  f  qe| | d	 } n  t |  j   t | j j    j   k r| } t | |  d k r| d 7} |  j d t | |  | t | j  f  q| | d	 } n  t |  j   d k r1| | d	 d k r1t } q1n  t |  j   d k r`t  | | d	  } n  t |  j   d k r|  j! | | |  r| d 7} |  j" | | | |  n  y |  j# | |  \ }	 } Wn5 t k
 r| d 7} |  j$ | | | |  qn Xt% | d   | d  k rE| d 7} |  j& | | | |  n |  j' j( | j    } | d | k r| d 7} |  j d | t |  | j   f  n  | d	 d	 k r| d 7} |  j d | t |  f  n  t } qn  t |  j   d k r5|  j) | |  \ } } | dB k	 rE|  j* | | |  | d 7} qn  | j+ dB k sc| j, dB k r|  j- | |  | d 7} qn  |  j. ry |  j/ |  } Wn t k
 rqn Xt0 t j1 t | | d	   } t2 | | t j3 |  j j4     } | d  k r/|  j5 | | | |  | d 7} qq/qqn  t |  j   d k r|  j j6 |  j' | | |  } | | | k r|  j7 | | t8 | |   | d 7} qqn  t |  j   d! k r 
t | | d	  d k r| | d	 d	 d" k r| d 7} |  j9 | | | |  qq 
| | d	 d#  d$ k r;qq 
| | d	 d%  d& k rz| d 7} |  j: | | | |  qq 
| | d	 d d' k r	| | d	 d( d' k r	| | d	 d) d' k r	| | d	 d* d' k r	| | d	 d+ d' k r	| d 7} |  j; | | | |  qq 
t | | d	  d, d	 k r^	| d 7} |  j< | | | |  qq 
| | d	 d d' k r 
| | d	 d, d' k r 
| | d	 d( d' k r 
| | d	 d- d' k r 
| | d	 d) d' k r 
| d 7} |  j= | | | |  qq 
n  x> | | D]2 } | d  k r
|  j> | |  | d 7} q
q
q
Wy |  j' j? |  } Wn0 t@ k
 r
}  |  jA | |  | d 7} qn X|  j' jB |  }! |! t jC @r
|! t jD @r
|  j' jE |  r
|
 jF t |  j    n  | t jG t jH t jI t jJ g k r'| |  jK | | |  7} n  xw | | D]k } |  j j6 |  j' | | g  } t |  d k sx| d	 | k r2|  jL | | | |  | d 7} Pq2q2Wt |  j   d. k r|  jM |  }" t | d/  d k s| d/ d	 t |"  k r| d 7} |  jN | |"  qqqW| rad | k sGd t t j |  k ra| d 7} |  jO |  n  d | k sd t t j |  k r| dB k r| d 7} |  j d0 t | j   n  | dB k r| d 7} |  j d1 | j j   t | j  f  qn  | dB k	 rdB }# | r1| t j jP @s1| }# q1n  |# dB k rO| j jQ   }# n  t j |  j d2 |#  }$ |$ jR d	 | j j   |  | j | k r| j }$ n  |$ | j k r| d 7} |  jS | |$ | | |  q| j jT   | k r| d 7} |  j d3 | | t | j  f  qn  t }% | r| j | k rd4 }& d5 }' |  jU | d |&  }( |( |' k r|  jV d6 t |  d7  rt jW   }) | |) _ t jX d8 t jY d  |) d <| d 7} |  j jZ |) d d9 g q|  j d: t |   qn  x |
 j[ |	  D]~ }* |% r+|  j d; |  t }% n  | d 7} |  j d< |*  |  jV d= |* d>  ss|  j d? |*  qn  |  j\ | |*  qWn  |  j] |  rd@ | k rd | k sdA t t j |  k r|  j^ |  | d 7} qn  yg | |  j j_   k rLt | jQ    |  j` k rL|  j j d
 | jQ   d t j d d d g  } n  WnH t j k
 r\ } } | t j k r|  ja |  | d 7} q  n X| |  jb k rd | k r|  jc |  r|  jd |  | d 7} qn  | S(C   s   check one objects   Checking object %sRc   t   namet   distinguishednameR   t   systemFlagsRe   t   replPropertyMetaDatai    R   R   Rf   s   extended_dn:1:1s   show_recycled:1s   show_deleted:1s   sd_flags:1:%dR   s)   ERROR: Object %s disappeared during checki   s,   ERROR: Object %s failed to load during checks   CN=Deleted Objects,%st   objectclasss1   ERROR: Not fixing num_values(%d) for '%s' on '%s't	   isdeletedt   FALSEt   systemflagst   replpropertymetadataisY   ERROR: Not fixing incorrect final attributeID in '%s' on '%s', it should match the RDN %ssX   ERROR: Not fixing incorrect inital attributeID in '%s' on '%s', it should be objectClasst   ntsecuritydescriptorR   t   userparameterss    i   s                   i   t   IAAgACAAIAAgACAAIAAgt    i   i   i   i	   i   i   R_  R   s(   ERROR: Not fixing missing 'name' on '%s's&   ERROR: Not fixing missing '%s' on '%s's
   RDN=RDN,%ss   ERROR: Not fixing %s=%r on '%s'i0  l   )x1cB& s-   Fix isDeleted originating_change_time on '%s'R(   R   s   provision:0s4   Not fixing isDeleted originating_change_time on '%s's   On object %ss7   ERROR: Attribute %s not present in replication metadatas-   Fix missing replPropertyMetaData element '%s'R'   s4   Not fixing missing replPropertyMetaData element '%s'R   t   fsmoroleownerN(e   R   Rg   t   mapRO   R   RY   t   get_rdn_nameR	   R3  R4  R.  R/  R   RL   R;   RM   RP   RQ   R:   Rh   RI   R   R   Rc   RW   R?  R   RX   RZ   R<   R   Rs   R   RD  RM  R  RN  RQ  RR  R   t   get_attid_from_lDAPDisplayNameR-  R2  R  R  R:  R8   Rd  R   R  R   RN   RS   R8  R   R   R   R   R   R   R   R   R   R   R~   R   t$   get_systemFlags_from_lDAPDisplayNamet   DS_FLAG_ATTR_NOT_REPLICATEDt   DS_FLAG_ATTR_IS_CONSTRUCTEDR   Ri   t   DSDB_SYNTAX_BINARY_DNt   DSDB_SYNTAX_OR_NAMEt   DSDB_SYNTAX_STRING_DNt	   SYNTAX_DNR   R   R`  R   R   t#   SYSTEM_FLAG_DISALLOW_MOVE_ON_DELETER   t   set_componentR   t   get_rdn_valueR   R{   R   R   R   R   t
   differenceR  R[  R   t   get_root_basednRJ   R   RV   RY  RZ  (+   R\   Rc   R   R1  R]   R_   R`   R   Rm   t   set_attrs_from_mdt   set_attrs_seent   got_repl_property_meta_datat   got_objectclasst   nc_dnt   deleted_objects_dnR,  t   object_rdn_attrt   object_rdn_valR   R   Rg  R   t   list_attid_from_mdt	   rdn_attidR(  R0  t   well_known_sdt
   current_sdR6  R   R   R   Rp   t   flagR   t	   parent_dnt   expected_dnt   show_dnt   isDeletedAttIdt   expectedTimeDot   originatingR  R  (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyRj   l  s   	*	
			
	'-
	'



	 
	

		$
	2

x

x
	


"
0
+
$

/

)	
	
00!c         C   s  t  j |  j d  } |  j r2 |  j d |  n  |  j j d | d t  j  } t |  d k rw |  j d |  d S| d } d } d | k r |  j d	  | d S| d d j d
  s|  j d  | d 7} |  j	 d  s | S|  j j d t  j |  j | d d  d t  j d d g  } t
 t t j | d d d   } t  j   } | | _ t  j d | t  j d  | d <|  j | g  d d t r|  j d  qn  | S(   s!   check the @ROOTDSE special objects   @ROOTDSEs   Checking object %sR   R   i   s"   Object %s disappeared during checki    R   s(   ERROR: dsServiceName missing in @ROOTDSEs   <GUID=s1   ERROR: dsServiceName not in GUID form in @ROOTDSEs"   Change dsServiceName to GUID form?R   t
   objectGUIDs	   <GUID=%s>s+   Failed to change dsServiceName to GUID formR   s"   Changed dsServiceName to GUID form(   R;   R<   R   R   Rg   RL   RM   Rh   t
   startswithRt   RO   R   R   R   R   Rc   R   R   R   R   (   R\   Rc   R]   R   Rm   t   guid_strR   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyRk     s6    	

)$	c         C   su   t  j   } t  j |  j d  | _ t  j d t  j d  | d <t  j d t  j d  | d <|  j | g  d d t	 S(   s   re-index the whole databases   @ATTRIBUTESRu   t   force_reindexRi   R}   s   re-indexed databaseR   (
   R;   R   R<   R   Rc   R   R   R   R   R   (   R\   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   reindex_database  s
    c         C   sY   t  j   } t  j |  j d  | _ t  j d t  j d  | d <|  j | g  d d t S(   sO   reset @MODULES to that needed for current sam.ldb (to read a very old database)s   @MODULESt
   samba_dsdbs   @LISTs   reset @MODULES on databaseR   (	   R;   R   R<   R   Rc   R   R   R   R   (   R\   R   (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   reset_modules  s    (?   t   __name__t
   __module__t   __doc__R   R   Rd   R;   t   SCOPE_SUBTREERo   Rg   Rt   R{   R   Rs   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R  R  R  R  R-  R2  R8  R:  RD  RM  RN  RR  RY  RZ  R[  R`  Rd  Rj   Rk   R  R  (    (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyR   $   sv   		Y									
												#									[						i			 		&							
 F	$	
(   R;   R?  R=  t   base64R    R   R   t   samba.dcerpcR   R   t	   samba.ndrR   R   R   t   samba.commonR   R	   t   samba.descriptorR
   R   t
   samba.authR   R   Rn   R   (    (    (    s3   /usr/lib/python2.7/dist-packages/samba/dbchecker.pyt   <module>   s   