
    b{                        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 dlmZ d dlmZ d Z G d de          ZdS )    N)	b64decode)dsdb)common)misc)drsuapi)
ndr_unpackndr_pack)drsblobs)dsdb_Dn)security)get_wellknown_sdsget_diff_sds)system_sessionadmin_session)CommandError)get_fsmo_roleownerc                     g }| D ]]}	 |                     |                    d                     ,# t          $ r% |                     t          |                     Y Zw xY wd                    |          S )zStringify a value list, using utf-8 if possible (which some tests
    want), or the python bytes representation otherwise (with leading
    'b' and escapes like b' ').
    zutf-8,)appenddecodeUnicodeDecodeErrorreprjoin)valsresultvalues      1/usr/lib/python3/dist-packages/samba/dbchecker.pydump_attr_valuesr   &   s    
 F ' '	'MM%,,w//0000! 	' 	' 	'MM$u++&&&&&	'88Fs   (1,A A c                      e Zd ZdZ	 	 	 	 	 dMdZdej        ddfdZd Zd Z	dNdZ
d	 Zd
 ZdOdZd Zd Zd Zd Zd Zd Zd Zd ZdPdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z 	 dOd 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/ Z0d0 Z1d1 Z2d2 Z3d3 Z4d4 Z5d5 Z6d6 Z7d7 Z8d8 Z9d9 Z:d: Z;d; Z<d< Z=d= Z>d> Z?d? Z@d@ ZAdA ZBdB ZCdC ZDdD ZEdE ZFdF ZGdG ZHdH ZIdQdIZJdJ ZKdK ZLdL ZMdS )Rdbcheckzcheck a SAM database for errorsNFc           
      .   || _         d | _        |p|| _        || _        || _        || _        || _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        t5                      | _        d| _        d| _        d| _        d| _        d| _         d| _!        d| _"        d| _#        d| _$        d| _%        d| _&        d| _'        d| _(        d| _)        d| _*        d| _+        d| _,        || _-        |	| _.        |
| _/        d| _0        d| _1        || _2        tg          j4        |d|5                                z             | _6        tg          j4        |d|7                                z            | _8        |9                                | _:        tg          j4        |d|5                                z             | _;        tg          j4        ||<                                          | _=        i | _>        t          | j                   | _@        d| _A        d| _B        d| _C        d| _D        d| _E        t                      | _G        i | _H        i | _I        	 d|J                    |K                                t          jM                  z  }|N                    |tf          jO        dg          }t          t          jR        |d         d         d                   }t          |          | jI        d	<   n7# tf          jT        $ r%}|jU        \  }}|tf          jV        k    r Y d }~nd }~ww xY wt                      | _X        t          d |Z                                          | _[        | j         N                    | j=        tf          jO        d
dg          }d
|d         v r|d         d
         | _\        n%d|d         v r|d         d         | _\        nd | _\        | j         N                    dtf          jO        dg          }g | _]        g | _^        g | __        	 |d         d         | _`        n# t          $ r Y nt          $ r Y nw xY w| j`        D ]}	 | j         J                    tg          j4        | j         |c                    d                    t          jd                  }| j]        e                    |           n# t          $ rH | j^        e                    tg          j4        | j         |c                    d                               Y w xY wd| j         K                                z  }d| j         f                                z  }| j         N                    tf          jg        ddg| j         h                                d|z            }t          |          dk    r:| j_        e                    tg          j4        | j         |          |d         f           | j         N                    tf          jg        ddg| j         h                                d|z            }t          |          dk    r:| j_        e                    tg          j4        | j         |          |d         f           tg          j4        | j         d| j         5                                z             }t          | j         |d          }tg          j4        | j         | j         <                                          |k    rd| _k        nd| _k        | j         N                    tg          j4        | j         | j         l                                          tf          jO        dg          }tg          j4        | j         |d         d         d         c                    d                    | _m        | j         N                    | jm        tf          jO        dg          }d|d         v rEtg          j4        | j         |d         d         d         c                    d                    | _n        nd | _n        d| j         7                                o                                z  }|N                    |tf          jO        ddg          }d|d         v r't          |d         d         d                   | _q        nd| _q        g | _r        g | _s        	 | j         N                    tf          jO        dd d!g"          }d |d         v r|d         d          | _r        d!|d         v r|d         d!         | _s        d S d S # tf          jT        $ r&}|jU        \  }}|tf          jV        k    r Y d }~d S d }~ww xY w)#NFr   zCN=Infrastructure,zCN=Partitions,%szCN=RID Manager$,CN=System,zCN=DnsAdmins,%s	objectSidbasescopeattrs	DnsAdminszmsDS-hasMasterNCshasMasterNCs namingContextsutf8zDC=DomainDnsZones,%szDC=ForestDnsZones,%smsDS-NC-Replica-LocationsmsDS-NC-RO-Replica-Locationsz$(&(objectClass=crossRef)(ncName=%s)))r%   r&   r$   
expression   ridTserverReferencerIDSetReferencesz1CN=Directory Service,CN=Windows NT,CN=Services,%sz(objectClass=nTDSService)tombstoneLifetime)r$   r%   r.   r&      z@SAMBA_DSDBcompatibleFeaturesrequiredFeatures)r%   r$   r&   )tsamdbdict_oid_namesamdb_schemaverbosefixyesquietremove_all_unknown_attributesremove_all_empty_attributesfix_all_normalisationfix_all_duplicatesfix_all_DN_GUIDsfix_all_binary_dn#remove_implausible_deleted_DN_links!remove_plausible_deleted_DN_links$fix_all_string_dn_component_mismatch"fix_all_GUID_dn_component_mismatch!fix_all_SID_dn_component_mismatch fix_all_SID_dn_component_missing(fix_all_old_dn_string_component_mismatchfix_all_metadatafix_time_metadatafix_undead_linked_attributesfix_all_missing_backlinksfix_all_orphaned_backlinksfix_all_missing_forward_linksdictduplicate_link_cacherecover_all_forward_linksfix_rmd_flagsfix_ntsecuritydescriptor$fix_ntsecuritydescriptor_owner_groupseize_fsmo_rolemove_to_lost_and_foundfix_instancetype"fix_replmetadata_zero_invocationid fix_replmetadata_duplicate_attidfix_replmetadata_wrong_attidfix_replmetadata_unsorted_attidfix_deleted_deleted_objectsfix_dnfix_base64_userparametersfix_utf8_userparametersfix_doubled_userparametersfix_sid_rid_set_conflictquick_membership_checksreset_well_known_aclscheck_expired_tombstonesexpired_tombstonesreset_all_well_known_aclsin_transactionldbDn	domain_dninfrastructure_dnget_config_basedn	naming_dnget_schema_basedn	schema_dnrid_dnget_dsServiceNamentds_dsaclass_schemaIDGUIDr   wellknown_sdsfix_all_missing_objectclassfix_missing_deleted_objectsfix_replica_locationsfix_missing_rid_set_masterfix_changes_after_deletion_bugsetdn_setlink_id_cachename_mapget_wellknown_dnget_default_basednr   DS_GUID_USERS_CONTAINERsearch
SCOPE_BASEr   r   dom_sidstrLdbErrorargsERR_NO_SUCH_OBJECTr   system_session_infor   get_domain_sidadmin_session_info	write_ncsdeleted_objects_containersncs_lacking_deleted_containersdns_partitionsncsKeyError
IndexErrorr   !DS_GUID_DELETED_OBJECTS_CONTAINERr   get_root_basednSCOPE_ONELEVELget_partitions_dnlenr   is_rid_masterget_serverNameserver_ref_dn
rid_set_dnget_linearizedintr3   r5   r6   )selfr7   r9   r:   r;   r<   r=   ri   rd   re   rf   base_dnresdnsadmins_side5enumestrncdndomaindns_zoneforestdns_zonedomainforestfsmo_dn
rid_masterntds_service_dne6s                              r   __init__zdbcheck.__init__7   s	   
 
!)2U
-2*+0(%*""' %!&38016.49127/16.05-8=5 %!&,1)).&*/'-2*$(FF!).&"(-%491$&+# %27/05-,1)/4,+0().&',$*/'(-%'>$%:"(@%"#).&,!$/CeooFWFW/W!X!X'9E<S<S<U<U'UVV0022fU$@5??CTCT$TUUue&=&=&?&?@@"$.tz::+0(+0(%*"*/'.3+ee	'%*@*@050H0H0J0J040L+N +N NG ,,G3>&1]  4 4C&x'7Q9LQ9OPPM),]););DM+&&| 	 	 	7LT4s--- .----	
 $2#3#3 "/e6J6J6L6L"M"MjT]#.QdftPuvv#a&(( V$78DNN Q''!$Q!7!%jRs~FVEWXX*,'.0+ 	1v./DHH 	 	 	D 	 	 	D	 ( 	b 	bBbZ00
BIIfDUDU1V1V151WY Y/66r:::: b b b3::36$*biiX^N_N_;`;`aaaaab 0$*2O2O2Q2QQ/$*2L2L2N2NN"");*EGe)f(,
(D(D(F(F.TWe.e # g g v;;!&&tz>(J(JFSTI'VWWW"");*EGe)f(,
(D(D(F(F.TWe.e # g g v;;!&&tz>(J(JFSTI'VWWW&%ADJDXDXDZDZ%Z[['
GUCC
6$*dj::<<==KK!%D!&D jSVDJ
8Q8Q8S8S%T%T&)n=N<O   Q Q !VDJA7H0I!0L0S0STZ0[0[\\ jT%7&)n=O<P   R RQ''!fTZQ8J1KA1N1U1UV\1]1]^^DOO"DOM*6688GGIIJll!$&A"5!6  8 8 #a&((%(Q0C)DQ)G%H%HD""%(D""$ "	*###.)6+?+=+? $ @ @C $s1v--*-a&1E*F'!SV++(+A/A(B%%% ,+| 	 	 	7LT4s--- .-----	s^   $BM   M4M//M4 Q4 4
R 	RRA*TAUU8A#e f.ffc                    | j                             ||dg|          }|                     dt          |          z             d}||                                 z  }t                      | _        |D ]M}| j                            t          |j
                             ||                     |j
        |          z  }N|||                                 z  }| j        dk    r|                     d| j        z             |dk    r| j        s|                     d           |                     d	t          |          |fz             |S )
z>perform a database check, returning the number of errors foundr   r$   r%   r&   controlszChecking %u objectsr   )requested_attrsNzNOTICE: found %d expired tombstones, 'samba' will remove them daily, 'samba-tool domain tombstones expunge' would do that immediately.z$Please use --fix to fix these errorszChecked %u objects (%u errors))r7   r   reportr    check_deleted_objects_containersr|   attribute_or_class_idsr}   addr   r   check_objectcheck_rootdserg   r;   )r   DNr%   r   r&   r   error_countobjects           r   check_databasezdbcheck.check_database   sX    jRuTFXVV)CHH4555t<<>>>&)ee# 	O 	OFKOOC	NN+++4,,VY,NNNKK:4--///K"Q&&KK 5 /	1 2 2 2 !DHKK>???4C+7NNOOO    c           
      d   d}| j         D ]$}|| j        k    r|dz  }|                     d|z             |                     d|z  d          sFt	          j        | j        d          }|                    |           d}	 | j                            |t          j	        g g d	          }t          |          dk    rq|d         j                            d
          }t	          j        | j        dt          t          j        |                    z            }|                    |           nV# t          j        $ rD}|j        \  }}	|t          j        k    rn|                     d|	z             Y d}~ dS Y d}~nd}~ww xY w|f	 | j                            ||g d           nF# t          j        $ r4}
|
j        \  }}	|                     d|d|d|	           Y d}
~
 dS d}
~
ww xY w| j                            |t          j	        dgg d	          }t          |          dk    r|                     d|z              dS |d         d         }g }d}|D ]}t)          | j        |                    d          t,          j                  }|                     |          r2|                     d|z             |j                            d
          }|                    t          |                     |%dt          t          j        |                    z  }n+dt,          j        z  }|                    |d|           d}| j                            d|d|ddg           t	          j                    }t	          j        | j        t          |d         d                             |_        t	          j        |t          j        d          |d<   |                     |dgd |z  d!"          r|                     d#|z             | j                             |           &|S )$z`This function only fixes conflicts on the Deleted Objects
        containers, not the attributesr   r/   z=ERROR: NC %s lacks a reference to a Deleted Objects containerz-Fix missing Deleted Objects container for %s?rx   zCN=Deleted ObjectsN)show_deleted:1extended_dn:1:1show_recycled:1reveal_internals:0r   GUIDzCN=Deleted Objects\0ACNF:%sz<Couldn't check for conflicting Deleted Objects container: %s)r   relax:0r   z/Couldn't move old Deleted Objects placeholder:  to z: wellKnownObjects)r   extended_dn:0r   r   z(wellKnownObjects was not found for NC %sr+   z7wellKnownObjects had duplicate Deleted Objects value %sz
objectGUID: %szB:32:%s:r)   dn: z
objectClass: top
objectClass: container
description: Container for deleted objects
isDeleted: TRUE
isCriticalSystemObject: TRUE
showInAdvancedViewOnly: TRUE
systemFlags: -1946157056r   provision:0r   r   z"NC %s lacks Deleted Objects WKGUIDFvalidatezAdded %s well known guid link)!r   rq   r   confirm_allrj   rk   r7   add_baser   r   r   r   get_extended_componentr   r   r   r   r   r   renamer   r   r   DSDB_SYNTAX_BINARY_DNis_deleted_objects_dnr   r   add_ldifMessageMessageElementFLAG_MOD_REPLACE	do_modifyr   )r   r   r   r   conflict_dnr   guide2r   r   e1wkolistwkoproposed_objectguidodsdb_dnguid_suffix
wko_prefixdeltas                      r   r   z(dbcheck.check_deleted_objects_containers  s    5 \	7 \	7BT^##1KKKWZ\\]]]##$SWY$Z\yzz 
$899BKKOOOKj''Rs~R2[ 2[ 2[ ( \ \ s88q==q69;;FCCD"%&)G#diX\ooJ^J^)^#` #`K((,,,<   !wt3111KK ^ae efff111111 DDDD &J%%b+7g7g7ghhhh|   #%7LT4KKKacacacepepeprvrv wxxx111111 *##3>+=*>.W .W .W $ X XC 3xx1}}FKLLLqq a&+,CG"& ' '!$*ahhv.>.>@Z[[--g66 TKK Y\] ]^^^ +2**K*KF*S*S's1vv&&&&".03tyAT7U7U3V3VV&)OO
***bb9:::  J "$[[!2 +4])C   E E E KMMEvdj#c!fTl*;*;<<EH(+(:7;>;O;M)O )OE$%
 ~~ei[BRG',  . . B ;b@AAA+2226666s1   B.D11F 3E??F
F))G,8(G''G,c                 6    | j         st          |           dS dS )z#print a message unless quiet is setN)r=   print)r   msgs     r   r   zdbcheck.reports  s%    z 	#JJJJJ	 	r   c                 p    | j         sdS | j        r| j        S | j        rd}t          j        |||          S )zconfirm a changeFTforced	allow_all)r;   r=   r<   r   confirm)r   r   r   r   s       r   r   zdbcheck.confirmx  sH    x 	5: 	8O8 	F~c&IFFFFr   c                 $   | j         sdS t          | |          dk    rdS t          | |          dk    rd}n| j        }| j        r|S t	          j        ||d          }|dk    rt          | |d           dS |dk    rt          | |d           dS |S )z(confirm a change with support for "all" FNONEALLTr   )r;   getattrr<   r=   r   r   setattr)r   r   all_attrr   cs        r   r   zdbcheck.confirm_all  s    x 	54""f,,54""e++FFXF: 	MN3v>>>::D(E***4;;D(F+++5r   c                 @   | j         r|                     d|z             	 |dt          j        z  gz   }| j                            ||           nM# t          $ r@}| j        rt          |d|          |                     |d|           Y d}~dS d}~ww xY wdS )z&delete dn with optional verbose outputzdelete DN %slocal_oid:%s:0r    : NFT)	r:   r   r   DSDB_CONTROL_DBCHECKr7   delete	Exceptionri   r   )r   r   r   r   errs        r   	do_deletezdbcheck.do_delete  s    < 	-KK+,,,	#3d6O#O"PPHJb84444 	 	 	" ;"SS#9:::KKSSS##.///55555		
 ts   /A 
B5BBTc                    |dt           j        z  gz   }| j        rP|                     | j                            |t          j                             |                     d|z             	 | j                            |||           nM# t          $ r@}| j
        rt          |d|          |                     |d|           Y d}~dS d}~ww xY wdS )z-perform a modify with optional verbose outputr   zcontrols: %r)r   r   r   NFT)r   r   r:   r   r7   
write_ldifrj   CHANGETYPE_MODIFYmodifyr   ri   r   )r   mr   r   r   r   s         r   r   zdbcheck.do_modify  s    /$2KKLL< 	3KK
--a1FGGHHHKK1222	Ja(XFFFF 	 	 	" ;"SS#9:::KKSSS##.///55555		
 ts   ,B
 

C5CCc           
         | j         rE|                     dt          |          dt          |          dt          |                     	 ||z   }|dt          j        z  gz   }| j                            |||           nM# t          $ r@}| j        rt          |d|          |                     |d|           Y d}~dS d}~ww xY wd	S )
z-perform a rename with optional verbose outputr   z
changeType: modrdn
newrdn: z
deleteOldRdn: 1
newSuperior: r   r   r   NFT)
r:   r   r   r   r   r7   r   r   ri   r   )r   from_dnto_rdnto_baser   r   to_dnr   s           r   	do_renamezdbcheck.do_rename  s   < 	@KKK 'llllCKKKKW	? @ @ @
	W$E#3d6O#O"PPHJgux@@@@ 	 	 	" ;"SS#9:::KKSSS##.///55555		
 ts   5B 
C5C		Cc                     || j         v r| j         |         S | j                            |          }|r| j                            |          }nd }||f| j         |<   ||fS N)r~   r9   get_linkId_from_lDAPDisplayName!get_backlink_from_lDAPDisplayName)r   attrnamelinkIDrevnames       r    get_attr_linkID_and_reverse_namez(dbcheck.get_attr_linkID_and_reverse_name  su    t)))%h//"BB8LL 	'II(SSGGG(.'88$wr   c                    |                      d|d|           |                     d|d|dd          s|                      d|z             dS t          j                    }||_        t          j        d	t          j        |          ||<   |                     |d
dgd|z  d          r|                      d|z             dS dS )zfix empty attributeszERROR: Empty attribute  in zRemove empty attribute  from ?r?   zNot fixing empty attribute %sNr)   r   r   z#Failed to remove empty attribute %sFr   zRemoved empty attribute %s)r   r   rj   r   r   r   FLAG_MOD_DELETEr   )r   r   r  r  s       r   err_empty_attributezdbcheck.err_empty_attribute  s    22FGGGRTRTRT UWtuu 	KK7(BCCCFKMM(S-@(KK(>>!i):;?(JUZ  \ \ 	AKK4x?@@@@@	A 	Ar   c                    |                      d|d|           g }|D ]}| j                            | j        ||g          }t	          |          dk    r0|                      d|z             |                    |df           g|d         |k    r?|                      d|d|d         d	           |                    ||d         f           |                     d
|d|dd          s|                      d|z             dS t          j                    }||_	        t          dt	          |                    D ]_}||         \  }}	t          j        |t          j        |          |d|z  <   |	dk    r&t          j        |	t          j        |          |d|z  <   `|                     |ddgd|z  d          r|                      d|z             dS dS )z?fix attribute normalisation errors, without altering sort orderz)ERROR: Normalisation error for attribute r  r/   zUnable to normalise value '%s'r)   r   zvalue 'z' should be ''zFix normalisation for r  r  r@   zNot fixing attribute %sNzvalue_%uznormv_%ur   r    Failed to normalise attribute %sFr   Normalised attribute %s)r   r7   dsdb_normalise_attributesr9   r   r   r   rj   r   r   ranger   r  FLAG_MOD_ADDr   )
r   r   r  valuesmod_listval
normalisedr  invals
             r   err_normalise_mismatchzdbcheck.err_normalise_mismatch  s"   888UWUWXYYY 	6 	6C==!8cU4 4J:!##<sBCCCb	****Q-3&&333
1NOOOjm 4555xxxQSQSQS TVmnn 	KK1H<===FKMMq#h--(( 	A 	AA"1+KS$ # 238KX V VAj1nrzz$'$6tS=M7?%A %A*q.! >>!i):;<xG#(  * * 	> KK1H<=====	> 	>r   c                 T   | j                             | j        ||          }t          |          |k    rdS |                     d|d|d           |                     d|dt          |          d           |                     d|d	|d
d          s|                     d|z             dS t          j                    }||_        t          j	        |t          j
        |          ||<   |                     |ddgd|z  d          r|                     d|z             dS dS )z.fix attribute normalisation and/or sort errorsNz*ERROR: Normalisation error for attribute '' in 'r  z*Values/Order of values do/does not match: /!zFix normalisation for '' from ''?r@   Not fixing attribute '%s'r   r   r  Fr   r  )r7   r  r9   listr   r   rj   r   r   r   r   r   )r   r   r  r  r!  r  s         r   err_normalise_mismatch_replacez&dbcheck.err_normalise_mismatch_replace  sX   Z99$:KXW]^^

v%%FxxxY[Y[Y[\]]]&&&RVWaRbRbRbRbcddd888UWUWUW XZqrr 	KK3h>???FKMM(S5I8TT(>>!i):;<xG#(  * * 	> KK1H<=====	> 	>r   c                    |                      d|d|d           |                      dt          |          dt          |          d           |                     d|d|d	d
          s|                      d|z             dS t          j                    }||_        t          j        |t          j        |          ||<   |                     |ddgd|z  d          r|                      d|z             dS dS )zfix duplicate attribute valuesz'ERROR: Duplicate values for attribute 'r&  r  zValues contain a duplicate: [z]/[z]!zFix duplicates for 'r)  r*  rA   r+  Nr   r   z0Failed to remove duplicate value on attribute %sFr   z'Removed duplicate value on attribute %s)	r   r   r   rj   r   r   r   r   r   )r   r   r  
dup_valuesr  r  s         r   err_duplicate_valueszdbcheck.err_duplicate_values  s<   HHHVXVXVXYZZZ%j11113CF3K3K3K3KM 	N 	N 	NRTRTRT UWkll 	KK3h>???FKMM(1ExPP(>>!i):;LxW#(  * * 	N KKAHLMMMMM	N 	Nr   c                 2    |j         dt          j        z  k    S )z2see if a dsdb_Dn is the special Deleted Objects DNzB:32:%s:)prefixr   r   )r   r   s     r   r   zdbcheck.is_deleted_objects_dn(  s    ~d.T!TTTr   c                 >   |                      d|d| j                            |          d           |                     d|z  d          s|                      d|z             dS |                     |dgd	|z            r|                      d
|z             dS dS )z!handle object without objectclassz%ERROR: missing objectclass in object zw.  If you have another working DC, please run 'samba-tool drs replicate --full-sync --local <destinationDC> <sourceDC> r  zIIf you cannot re-sync from another DC, do you wish to delete object '%s'?rw   z1Not deleting object with missing objectclass '%s'Nr   Failed to remove DN %sRemoved DN %s)r   r7   get_nc_rootr   r   r   r   s     r   err_missing_objectclasszdbcheck.err_missing_objectclass,  s	     |~  |~  |~  @D  @J  @V  @V  WY  @Z  @Z  @Z  @Z  [  	\  	\  	\ knp p  sP  Q  Q 	KKKbPQQQF>>"yk2R79 9 	.KK",-----	. 	.r   c                    |sq|                      d|d|d|           |                      dt          |          z             |                     dd          s|                      d           dS np|                      d	|d|d|           |                      dt          |          z             |                     d
d          s|                      d           dS t          j                    }||_        t          j        |t          j        |          |d<   |                     |ddt          j
        z  gd|z            r|                      d|z             dS dS )z(handle a DN pointing to a deleted objectz ERROR: target DN is deleted for  in object  - z#Target GUID points at deleted DN %rzRemove DN link?rD   zNot removingNz"WARNING: target DN is deleted for zRemove stale DN link?rE   	old_valuer   r   z(Failed to remove deleted DN attribute %sz"Removed deleted DN on attribute %s)r   r   r   rj   r   r   r   r  r   r    DSDB_CONTROL_REPLMD_VANISH_LINKS)r   r   r  r   r   
correct_dnremove_plausibler  s           r   err_deleted_dnzdbcheck.err_deleted_dn6  s    	KKKRZRZRZ\^\^\^`c`cdeeeKK=JOPPP##$57\]] N+++ KKKT\T\T\^`^`^`bebefgggKK=JOPPP##$;=`aa N+++KMM+C1DhOO+>>!/.1VVXDxOQ Q 	I KK<xGHHHHH	I 	Ir   c           
         t          |                              d          dk    r5|                     d|d|d|           |                     d           dS |                     |          \  }}|dz  dk    rt          |                              d          dk    rw|                     |          \  }}|5|                     d
|d|d|           |                     d           dS | j                            |          }	 | j                            |j                  }	n9# t          j        $ r'}
|
j	        \  }}|t          j
        k    r d	}	Y d	}
~
nd	}
~
ww xY w|	=|                     d|d|j        d|d|           |                     d           dS ||	k    r5|                     d|d|d|           |                     d           dS |                     d|d|d|           |                     |||||d           dS |                     d|d|d|           |                     |||||d           dS )zxhandle a missing target DN (if specified, GUID form can't be found,
        and otherwise DN string form can't be found)z\0ADELz8WARNING: no target object found for GUID component link z in deleted object r;  z`Not removing dangling one-way link on deleted object (tombstone garbage collection in progress?)r   r/   NzLWARNING: no target object found for GUID component for one-way forward link r:  z"Not removing dangling forward linkz<WARNING: no target object found for GUID component for link z in object to z outside our NCszhNot removing dangling one-way left-over link outside our NCs (we might be building a renamed/lab domain)zLWARNING: no target object found for GUID component for cross-partition link zPNot removing dangling one-way cross-partition link (we might be mid-replication)z@WARNING: no target object found for GUID component for DN value Tz:ERROR: no target object found for GUID component for link F)r   findr   r  r7   r6  r   rj   r   r   r   r@  )r   r   r  r   r   r  _reverse_link_namenc_roottarget_nc_rooter   r   s                r   err_missing_target_dn_or_GUIDz%dbcheck.err_missing_target_dn_or_GUIDM  s)   
 r77<<	""b(( KKK%-XXrrr338 9 9 9 KK F G G G 1 99(CC	QJ!OOW!2!29!=!=!C!C 77AA &F% , *2222ss< = = = @AAAqj,,R00G&!%!7!7
!C!C< & & & vt3111!%	& %  *27:::rrr33H I I I  J K K K q.((  *2222ss< = = =  < = = = q KKK%-XXrrr338 9 9 9 Hc '$8 8 81 	!)222ss4 	5 	5 	5 	B#wGGGqs   D/ /E%>E  E%c           
      2   |                      d|d|d|d|           ddg}	 | j                            t          |j                  t
          j        g |          }nq# t
          j        $ r_}|j        \  }	}
|                      d|j        d	|
d
           |	t
          j	        k    r | 
                    ||||           Y d}~dS d}~ww xY wt          |          dk    r7|                      d|j        z             | 
                    ||||           dS |d         j        |_        |                     dt          |          z  d          s|                      d|z             dS t          j                    }||_        t          j        |t
          j        |          |d<   t          j        t          |          t
          j        |          |d<   |                     |dgd|d|          r|                      d|d|           dS dS )z+handle a missing GUID extended DN componentERROR:  component for r:  r;  r   r   r   zunable to find object for DN z - ()Nr   zunable to find object for DN %sChange DN to %s?rB   Not fixing %sr<  	new_valueFailed to fix  on attribute Fixed )r   r7   r   r   r   rj   r   r   r   r   rI  r   r   r   r   r  r  r   )r   r   r  r   r   errstrr   r   e7r   r   r  s               r   err_missing_dn_GUID_componentz%dbcheck.err_missing_dn_GUID_component  sH   fffhhhXZXZXZ\_\_`aaa%'89		*##WZ*,x $ A ACC| 	 	 	7LT4KKKGJJJPTPTPTUVVVs---..r8S'JJJFFFFF	 s88q==KK9GJFGGG..r8S'JJJFVY
 2S\\ ACUVV 	KK&0111FKMM+C1DhOO++CLL#:JHUU+>>!/00@FQS S 	IKKKfffhhGHHHHH	I 	Is   :A" "C1ACCc           
         |                      d|d|d|d|           |                     dt          |          z  d          s|                      d|z             dS t          j                    }||_        t          j        |t          j        |          |d	<   t          j        t          |          t          j        |          |d
<   | 	                    |dgd|d|          r|                      d|d|           dS dS )z'handle an incorrect binary DN componentrK  z binary component for r:  r;  rN  rC   rO  Nr<  rP  r   rQ  rR  rS  )
r   r   r   rj   r   r   r   r  r  r   )r   r   r  r   r   rT  r  s          r   err_incorrect_binary_dnzdbcheck.err_incorrect_binary_dn  s'   VVVU]U]U]_a_a_acfcfghhh 2S\\ ACVWW 	KK&0111FKMM+C1DhOO++CLL#:JHUU+>>!/00@FQS S 	IKKKfffhhGHHHHH	I 	Ir   c                 *   |                      d|d|d|           ||_        |                     dt          |          z  d          s|                      d           dS t	          j                    }||_        t	          j        |t          j        |          |d<   t	          j        t          |          t          j        |          |d	<   | 	                    |d
dt          j        z  gd|z            r|                      d|z             dS dS )z<handle a DN string being incorrect due to a rename or deletez<NOTE: old (due to rename or delete) DN string component for r:  r;  rN  rJ   zNot fixing old string componentNr<  rP  r   local_oid:%s:1z+Failed to fix old DN string on attribute %sz#Fixed old DN string on attribute %s)r   r   r   r   rj   r   r   r  r  r   r   %DSDB_CONTROL_DBCHECK_FIX_LINK_DN_NAME)r   r   r  r   r   r>  r  s          r   err_dn_string_component_oldz#dbcheck.err_dn_string_component_old  s*   jrjrjrtvtvtvx{x{|}}}
 2S\\ A JL L 	KK9:::FKMM+C1DhOO++CLL#:JHUU+>>!/.1[[]G8TV V 	L KK=JKKKKK	L 	Lr   c           
      ,   |                      d|d|d|d|           ||_        |                     dt          |          z  d|z            s|                      d|z             dS t	          j                    }||_        t	          j        |t          j        |          |d	<   t	          j        t          |          t          j        |          |d
<   | 	                    |dgd|d|          r|                      d|d|           dS dS )z"handle a DN string being incorrectzERROR: incorrect DN rL  r:  r;  rN  z fix_all_%s_dn_component_mismatchz Not fixing %s component mismatchNr<  rP  r   zFailed to fix incorrect DN rR  zFixed incorrect DN )
r   r   r   r   rj   r   r   r  r  r   )r   r   r  r   r   r>  mismatch_typer  s           r    err_dn_component_target_mismatchz(dbcheck.err_dn_component_target_mismatch  sA   S`S`S`bjbjbjlnlnlnpspstuuu
 2S\\ A B] RT T 	KK:]JKKKFKMM+C1DhOO++CLL#:JHUU+>>!/00MZ]]\d\deg g 	]KKK===RZRZ[\\\\\	] 	]r   c                    |                      d|d|d|           t          |j                  dk    r|                      d           dS t          j        | j        |j                                                  }|                    d|           | 	                    d|                                z  d	          s|                      d
           dS |
                    d          }t          j        | j        d          }|                    d|           |                    d|           t          j                    }	||	_        t          j        |                                t          j        |          |	d<   ddt          j        z  g}
|                     |	|
d|z            r|                      d|z             dS dS )z*fix missing <SID=...> on linked attributesz$ERROR: missing DN SID component for r:  r;  r   z3Not fixing missing DN SID on DN+BINARY or DN+STRINGNSIDrN  rI   z#Not fixing missing DN SID componentr   r)   rP  r   rZ  z,Failed to ADD missing DN SID on attribute %sz$Fixed missing DN SID on attribute %s)r   r   r2  rj   rk   r7   r   extended_strset_extended_componentr   r   r   r   r  r   $DSDB_CONTROL_DBCHECK_FIX_LINK_DN_SIDr   )r   r   r  r   r   target_sid_blobr>  target_guid_blobguid_sid_dnr  r   s              r   #err_dn_component_missing_target_sidz+dbcheck.err_dn_component_missing_target_sid  s   RZRZRZ\^\^\^`c`cdeeew~!##KKMNNNFVDJ
(?(?(A(ABB
))%AAA 2Z5L5L5N5N N BD D 	KK=>>>F%<<VDDfTZ,,**63CDDD**5/BBBKMM+K,D,D,F,FHXZbcc+tHH
 >>!XHHUW W 	MKK>(KLLLLL	M 	Mr   c                    |                      d|d|j                   |                     d|z  d          s|                      d|z             dS t          j                    }|j        |_        t          j        g t          j        |          |d<   |                     |dd	gd
|z            r|                      d|z             dS dS )z!handle an unknown attribute errorzERROR: unknown attribute '' in zRemove unknown attribute %sr>   zNot removing %sNr<  r   r   z%Failed to remove unknown attribute %szRemoved unknown attribute %s)r   r   r   rj   r   r   r  r   )r   objr  r  s       r   err_unknown_attributezdbcheck.err_unknown_attribute  s    XXXsvvNOOO = HJijj 	KK)H4555FKMMv+B0CXNN+>>!i):;AHLN N 	EKK6(CDDDDD	E 	Er   c                    |                      d|d|d|j                   |                     d|z  d          s|                      d|z             dS t          j                    }|j        |_        t          j        |t          j        |          |d<   |                     |d	d
ddt          j	        z  gd|z            r|                      d|z             dS dS )z:handle a link that should not be there on a deleted objectzERROR: linked attribute 'z' to 'z' is present on deleted object zRemove linked attribute %srM   z Not removing linked attribute %sNr<  r   r   r   r   z Failed to delete forward link %szFixed undead forward link %s)
r   r   r   rj   r   r   r  r   r   r=  )r   rk  r  r   r  s        r   err_undead_linked_attributez#dbcheck.err_undead_linked_attribute"  s
   +388SSS#&&B 	C 	C 	C <x GIghh 	KK:XEFFFFKMMv+C1DhOO+>>!/1ACW.1VVX<xGI I 	E KK6(CDDDDD	E 	Er   c           
         |                      d|d|d|d|j                   |                     d|z  d          s|                      d|z             dS t          j                    }||_        t          j        |t          j        |          |d	<   |                     |d
dgd|z            r|                      d|z             dS dS )zhandle a missing backlink valuez#ERROR: missing backlink attribute 'rj  
 for link r  zFix missing backlink %srN   zNot fixing missing backlink %sNrP  r   r   z!Failed to fix missing backlink %szFixed missing backlink %s)r   r   r   rj   r   r   r  r   )r   rk  r  r   backlink_name	target_dnr  s          r   err_missing_backlinkzdbcheck.err_missing_backlink2  s   XeXeXegpgpgprzrzrz|  }C  }C  D  	E  	E  	E 9M IKfgg 	KK8=HIIIFKMM+C1A=QQ+>>!/;=MO O 	GKK3}EFFFFF	G 	Gr   c                 4   t          |j                            d                    }|                     d|||j        |j                                        fz             |                     d|z  d          s|                     d|z             dS t          j                    }|j        |_        t          j        t          |          t          j
        |          |d<   |                     |g dd	|z            r|                     d
|z             dS dS )z"handle a incorrect RMD_FLAGS value	RMD_FLAGSzHERROR: incorrect RMD_FLAGS value %u for attribute '%s' in %s for link %szFix incorrect RMD_FLAGS %urT   z!Not fixing incorrect RMD_FLAGS %uNr<  )r   r   show_deleted:0z$Failed to fix incorrect RMD_FLAGS %uzFixed incorrect RMD_FLAGS %u)r   r   r   r   rb  r   rj   r   r   r   r  r   )r   rk  r  revealed_dn	rmd_flagsr  s         r   err_incorrect_rmd_flagszdbcheck.err_incorrect_rmd_flags?  sG   ==kJJKK	^bkmuwzw}  @K  @N  @[  @[  @]  @]  b^  ^  	_  	_  	_ <y H/ZZ 	KK;iGHHHFKMMv+C,<,<c>QS[\\+>>!XXX@9LN N 	FKK6)DEEEEE	F 	Fr   c                    |du r>|                      |||          r'|                     dd|d|d|d|d	z              dS |                     d|d|d	|d
|           |                     d|z  d          s|                     d|z             dS t          j                    }||_        t          j        |t          j        |          |d<   |                     |ddgd|z            r|                     d|z             dS dS )z handle a orphaned backlink valueTz*WARNING: Keep orphaned backlink attribute r  r&  z' for link 'Nz$ERROR: orphaned backlink attribute 'rj  rp  r  zRemove orphaned backlink %srO   z!Not removing orphaned backlink %sr   r   r   z"Failed to fix orphaned backlink %szFixed orphaned backlink %s)	has_duplicate_linksr   r   rj   r   r   r   r  r   )	r   obj_dnbacklink_attrbacklink_valrr  forward_attrforward_syntaxcheck_duplicatesr  s	            r   err_orphaned_backlinkzdbcheck.err_orphaned_backlinkM  sz    t##(@(@LZh(i(i#KKDD)MM666<<<LL M M M FYfYfYfhnhnhnp|p|p|  H  H  I  	J  	J  	J = MOkll 	KK;mKLLLFKMM'c6I=YY'
>>!/;>NP P 	HKK4FGGGGG	H 	Hr   c                 $   |                      d|d|j        d           |                     d|z  d          s#|                      d|d|j        d           dS t          j                    }|j        |_        t          j        |t          j        |          |d	<   |                     |d
t          j	        z  gd|z            rH|                      d|z             t          |j                  d|}|| j        v sJ d| j        |<   dS dS )zhandle a duplicate links valuezERECHECK: 'Missing/Duplicate/Correct link' lines above for attribute 'r&  r  zDCommit fixes for (missing/duplicate) forward links in attribute '%s'rS   zENot fixing corrupted (missing/duplicate) forward links in attribute '' of 'Nr   rZ  z/Failed to fix duplicate links in attribute '%s'z'Fixed duplicate links in attribute '%s'r   F)r   r   r   rj   r   r   r   r   r   (DSDB_CONTROL_DBCHECK_FIX_DUPLICATE_LINKSr   rR   )r   rk  r  forward_valsr  duplicate_cache_keys         r   err_recover_forward_linksz!dbcheck.err_recover_forward_linksa  sW    	jvjvjvx{x~x~x~  	A  	A  	A fiu u  xS  T  T 	KKK$cfff. / / /FKMMv'c6JLYY'
>>!.1^^_KlZ\ \ 	CKKA\RSSS-0[[[[,,"G&$*CCCCC=BD%&9:::	C 	Cr   c                    |                      d|j        z             | j                            dt          j        dg          }t          |          dk    sJ t          |d         d         d                   }|                     d|j        d|d	          s"|                      d
|j        d|           dS t	          j	                    }|j        |_        t	          j
        |t          j        d          |d<   |                     |g d|j        d|          r"|                      d|j        d|           dS dS )zhandle a missing fSMORoleOwnerz*ERROR: fSMORoleOwner not found for role %sr)   dsServiceName)r%   r&   r/   r   zSeize role z) onto current DC by adding fSMORoleOwner=rW   zNot Seizing role NfSMORoleOwnerr   zFailed to seize role zSeized role )r   r   r7   r   rj   r   r   r   r   r   r   r  r   )r   rk  r   serviceNamer  s        r   err_no_fsmoRoleOwnerzdbcheck.err_no_fsmoRoleOwnert  su   @CFKLLLj&)n_<M   O O3xx1}}}}#a&1!455^a^d^d^dfqfq r  uF  G  G 	KKK\_\b\b\bdodopqqqFKMMv'S5EWW'
>>!RRbebhbhbhjujuvx x 	mKKKWZW]W]W]_j_jklllll	m 	mr   c                    |                      d|j        z             |                     d|j        z  d          s|                      d|j        z             dS d}| j                                         	 | j                            |j                  }| j                            |t          j                  }t          j
        | j        t          |j                            }|                    t          |          dz
             |                     |j        ||dd	gd
|j        d||z             r|                      d|j        d||z              t          j                    }|j        |_        t          j        t          |j                                                  t          j        d          |d<   |                     |g d||z   z            r|                      d||z   z             d}n#  | j                                          xY w|r| j                                         dS | j                                         dS )zhandle a missing parentz%ERROR: parent object not found for %sz!Move object %s into LostAndFound?rX   z&Not moving object %s into LostAndFoundNFr/   rv  r   Failed to rename object z into lostAndFound at zRenamed object lastKnownParentz:Failed to set lastKnownParent on lostAndFound object at %sz0Set lastKnownParent on lostAndFound object at %sT)r   r   r   r7   transaction_startr6  r   r   DS_GUID_LOSTANDFOUND_CONTAINERrj   rk   r   remove_base_componentsr   r  r   r   parentr   r   transaction_canceltransaction_commit)r   rk  keep_transactionrF  lost_and_foundnew_dnr  s          r   err_missing_parentzdbcheck.err_missing_parent  sG   ;svFGGG Csv NPhii 	KK@CFKLLLF 
$$&&&	j,,SV44G!Z88$BeffNVDJCF44F))#f++/:::~~cffn?OQZ>[>[VYV\V\V\^dgu^u^uvx x ,3666SY\jSjSjklllKMMv'*'9#cfmmoo:N:NPSPdfw'x'x#$>>!R"^bhkyby"z| | ,KK RV\_mVm nooo'+$	J))+++ 	,J))+++++J))+++++s   7FG> >Hc           
      b   t          j        | j        t          |                    }|                    t          |          dz
             |                                }d}	||k    r|	|d|dz  }	|	d|z  z  }	|                     d|j        d|	d|d	           | 	                    d
|j        d|dd          s"|                     d|j        d|           dS | 
                    |j        |||d|j        d|          r"|                     d|j        d|           dS dS )zhandle a wrong dnr/   r)   = zname=%rzERROR: wrong dn[z] z new_dn[]zRename r   r  r_   zNot renaming Nr  z into zRenamed )rj   rk   r7   r   r  r   r  r   r   r   r  )
r   rk  r  rdn_attrrdn_valname_valr   new_rdn
new_parent
attributess
             r   err_wrong_dnzdbcheck.err_wrong_dn  s`    &S[[11&&s7||a'7888]]__

hhhh88Ji8,,
3666:::vvvVWWWcffffff ExPP 	KKK366666BCCCF>>#&':xxBE&&&&&QS S 	AKKK?@@@@@	A 	Ar   c                 .   |                      d|d         |j        |fz             |                     d|d         ||j        fz  d          s(|                      d|d         ||j        fz             dS t          j                    }|j        |_        t          j        t          |          t          j        d          |d<   |                     |dt          j
        z  gd	|j        |fz            r!|                      d
|j        |fz             dS dS )zhandle a wrong instanceTypez0ERROR: wrong instanceType %s on %s, should be %dinstanceTypez(Change instanceType from %s to %d on %s?rY   z-Not changing instanceType from %s to %d on %sNr   r   zGFailed to correct missing instanceType on %s by setting instanceType=%dz7Corrected instancetype on %s by setting instanceType=%d)r   r   r   rj   r   r   r   r   r   r   &DSDB_CONTROL_DBCHECK_MODIFY_RO_REPLICA)r   rk  calculated_instancetyper  s       r   err_wrong_instancetypezdbcheck.err_wrong_instancetype  sk   F#nJ]_b_eg~I  	A  	A  	A JcR`Nacz|  }C  ND  !D  FX  Y  Y 	KKG3~K^`wy|y  KA  A  B  B  BFKMMv',C(D(DcFZ\jkk'
>>!.1\\]cgjgm  pG  gH  HI I 	wKKQUXU[]tTuuvvvvv	w 	wr   c                     |                      d|j        d| j                            |j                  d           d S )N0ERROR: incorrect userParameters value on object z.  If you have another working DC that does not give this warning, please run 'samba-tool drs replicate --full-sync --local <destinationDC> <sourceDC> r  r   r   r7   r6  )r   rk  r  r   s       r   err_short_userParametersz dbcheck.err_short_userParameters  s      gj  gm  gm  gm  os  oy  oE  oE  FI  FL  oM  oM  oM  oM  N  	O  	O  	O  	O  	Or   c                    |                      d|d|j        d           |                     d|j        z  d          s|                      d|j        z             dS t          j                    }|j        |_        t          j        t          ||         d                   t          j        d	          |d
<   |                     |g d|j        z            r|                      d|j        z             dS dS )z6handle a userParameters that is wrongly base64 encodedz(ERROR: wrongly formatted userParameters  on z, should not be base64-encodedz2Convert userParameters from base64 encoding on %s?r`   z6Not changing userParameters from base64 encoding on %sNr   userParametersr   zOFailed to correct base64-encoded userParameters on %s by converting from base64zGCorrected base64-encoded userParameters on %s by converting from base64)	r   r   r   rj   r   r   r   r   r   r   rk  r  r   r  s        r   err_base64_userParametersz!dbcheck.err_base64_userParameters  s   hmhmhmorouououvwww TX[X^ _a|}} 	KKPTWTZ[\\\FKMMv'	#h-2B(C(CSEY[kll'
>>!Rkorouvx x 	nKKaeheklmmmmm	n 	nr   c                    |                      d|j        z             |                     d|j        z  d          s|                      d|j        z             dS t          j                    }|j        |_        t          j        ||         d                             d                              d          t          j        d	          |d
<   | 	                    |g d|j        z            r|                      d|j        z             dS dS )z5handle a userParameters that is wrongly utf-8 encodedzPERROR: wrongly formatted userParameters on %s, should not be pseudo-UTF8 encodedz0Convert userParameters from UTF8 encoding on %s?ra   z4Not changing userParameters from UTF8 encoding on %sNr   r+   	utf-16-ler  r   zQFailed to correct psudo-UTF8 encoded userParameters on %s by converting from UTF8zICorrected psudo-UTF8 encoded userParameters on %s by converting from UTF8
r   r   r   rj   r   r   r   encoder   r   r  s        r   err_utf8_userParameterszdbcheck.err_utf8_userParameters  s"    8;>6C 	D 	D 	D RVYV\ ]_xyy 	KKNRURXYZZZFKMMv'Ha(8(?(?(G(G(N(N{([([(+(<>NP P'
>>!Rmqtqwxz z 	pKKcgjgmnooooo	p 	pr   c                    |                      d|j        z             |                     d|j        z  d          s|                      d|j        z             dS t          j                    }|j        |_        t          j        ||         d                             d                              d          t          j        d	          |d
<   | 	                    |g d|j        z            r|                      d|j        z             dS dS )z:handle a userParameters that has been utf-16 encoded twicezQERROR: wrongly formatted userParameters on %s, should not be double UTF16 encodedz:Convert userParameters from doubled UTF-16 encoding on %s?rb   z>Not changing userParameters from doubled UTF-16 encoding on %sNr   r  r+   r  r   zJFailed to correct doubled-UTF16 encoded userParameters on %s by convertingzBCorrected doubled-UTF16 encoded userParameters on %s by convertingr  r  s        r   err_doubled_userParametersz"dbcheck.err_doubled_userParameters  s$   gknkqrsss \`c`f g  jF  G  G 	KKX\_\bcdddFKMMv 'Ha(8(?(?(L(L(S(STZ([([(+(<>NP P'
 >>!Rfjmjpqs s 	iKK\`c`fghhhhh	i 	ir   c                     |                      d|j        d| j                            |j                  d           dS )z?Fix a truncated userParameters due to a pre 4.1 replication bugr  z (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> r  Nr  )r   rk  r  s      r   err_odd_userParameterszdbcheck.err_odd_userParameters  s      tw  tz  tz  tz  |@  |F  |R  |R  SV  SY  |Z  |Z  |Z  |Z  [  	\  	\  	\  	\  	\r   c                 L   | j                             |t          j        |gg d          }| j                            |          }|d         |         D ]O}t          | j         |                    d          |          }|j        	                    d          }||k    r|c S PdS )z#return a revealed link in an object)rv  r   r   r   r   r+   r   N)
r7   r   rj   r   r9   #get_syntax_oid_from_lDAPDisplayNamer   r   r   r   )	r   r   r  r   r   
syntax_oidr   r   guid2s	            r   find_revealed_linkzdbcheck.find_revealed_link  s    jRs~hZ)b)b)b   d d&JJ8TT
q6(# 	 	Cdj#**V*<*<jIIGJ55f==Eu}} tr   c                    d}t                      }t                      }|dz  r|||fS ||||fS t          |j                  d|}	|	| j        vr
d| j        |	<   ||         D ]L}
t	          | j        |
                    d          |          }|j                            d          }|It          t          j	        |                    }||j
        z   }||vr|||<   ~|dz  }||vr3t                      ||<   d||         d<   t                      ||         d	<   t          ||         j                            d
                    }t          |j                            d
                    }||k    r4||         ||         d<   ||         d	                             |           H||k     r9|||         d<   ||         d	                             ||                    |||<   t          ||         j                            d                    }t          |j                            d                    }||k    r4||         ||         d<   ||         d	                             |           |||         d<   ||         d	                             ||                    |||<   N|dk    r
d| j        |	<   |||fS )1check a linked values for duplicate forward linksr   r/   Nr   Fr+   r   keepr   RMD_VERSIONRMD_LOCAL_USNT)rQ   r   r   rR   r   r7   r   r   r   r   r2  r,  r   r   )r   rk  r  r  forward_linkIDr}  r   duplicate_dictunique_dictr  r   r   r   guidstrkeystrv1v2u1u2s                      r   check_duplicate_linkszdbcheck.check_duplicate_links  s   ff A 	>== ==),SVllCd&???=BD%&9:|$ '	* '	*Cdj#**V*<*<nMMG :44V<<D|$)D//**Gw~-F[((&-F#1K^++)-v&15v&v.3766v&x0 [(+BB=QQRRBWZ66}EEFFBBww1<V1Dv&v.v&x077@@@Bww18v&v.v&x077F8KLLL&-F#[(+BB?SSTTBWZ66GGHHBRxx1<V1Dv&v.v&x077@@@-4N6"6*6"8,33K4GHHH")K!=AD%&9:^[99r   c                    d}t          |          d|}|| j        v r| j        |         S |                     |          \  }}|g}ddg}		 | j                            t          |          t
          j        ||	          }
n8# t
          j        $ r&}|j        \  }}|t
          j	        k    r Y d}~dS d}~ww xY w|
d         }| 
                    |||||          \  }}}|| j        v r| j        |         S dS )r  r   r   r   r   r   NF)r   rR   r  r7   r   rj   r   r   r   r   r  )r   r   r  r  r   r  r  r}  r&   r   r   e8r   r   rk  r  r  s                    r   r{  zdbcheck.has_duplicate_linksX  s9   ),R,,?$";;;,-@AA(,(M(Ml([([%%';<	*##R*/( $ D DCC| 	 	 	7LT4s---55555	 !f&&sL..Zghh 	1^[ $";;;,-@AAus   5B B8B33B8c                    g }d}|||fS |t           j        k    r|                     d|z             ||fS d| j        v r|                     d           ||fS 	 |d         d         }t	          t          t          j        |                    }	d|d|	d	}
| j        	                    |
t           j
        dgg d
          }n"# t           j        $ r}|j        \  }} d}~ww xY w|D ] }t          | j        |j                                        |          }|j                            d          }t	          t          j        |                    }||v rpt          t"          j        |d         d                   }|j        j        D ]'}|j        }|j        }|j        t0          j        k    r n(t          j        d          }d}|}|}d}|}|}|}d}|j                            dt	          |                     |j                            dt	          |                     |j                            dt	          |                     |j                            dt7          |                     |j                            dt	          |                     |j                            dt	          |                     |j                            dt	          |                     |dz  }|                    |           "||fS )zMFind all backlinks linking to obj_guid_str not already in forward_unique_dictr   Nz5Not checking for missing forward links for syntax: %ssortedLinkszQNot checking for missing forward links because the db has the sortedLinks feature
objectGUID(z=<GUID=z>))r   search_options:1:2zpaged_results:1:1000)r.   r%   r&   r   r   replPropertyMetadataz$ffffffff-4700-4700-4700-000000b13228r/   RMD_ADDTIMERMD_CHANGETIMEru  RMD_INVOCIDRMD_ORIGINATING_USNr  r  )rj   	SYNTAX_DNr   r5   r   r   r   r   r7   r   SCOPE_SUBTREEr   r   r   r   rb  r   r
   replPropertyMetaDataBlobctrarray	local_usnoriginating_change_timeattidr   DRSUAPI_ATTID_objectClassrc  r	   r   ) r   rk  r  r  r}  forward_unique_dictmissing_forward_linksr   obj_guidobj_guid_strfilterr   e9r   r   rrr  r   r  replr   r  toriginating_invocidoriginating_usnrmd_addtimermd_changetimerx  rmd_invocidrmd_originating_usnrmd_local_usnrmd_versions                                    r   )find_missing_forward_links_from_backlinksz1dbcheck.find_missing_forward_links_from_backlinksy  sR    !# );77S]**KKO&' ( ( ();77D333KK 6 7 7 7);77	<(+Hz$)X>>??LL)6EF*##v*-*;L>.F .F .F $ G GCC
 | 	 	 	7LT4	  >	4 >	4A
AD,=,=,?,?PPI<66v>>D$)D//**G---( h?!"89!<> >DX^  K	-7g???E @ #'),R"S"SOKNI-K"1%MKL//s;?O?OPPPL//0@#nBUBUVVVL//S^^LLLL//x?T?TUUUL//0EsK^G_G_```L//]ASASTTTL//s;?O?OPPP1K!((3333%{33s   A)C C#CC#c                    d}|d         d         }|                      |          \  }}|| j                            |          }nd}|dv }	|	r
| j        ri }
n|                     |||||          \  }}
}t          |
          dk    r|                     |||||          \  }}||z  }d |                                D             }|dk    r"|                     d|d|j	        d           n!|                     d	|d|j	        d           |D ]w}|                     d
|z             | 
                    d|z  d          s>|                     |j	        ||j	                                        |j	        ||d           q||gz  }x|
                                D ]K}|
|         }|d         D ]}|                     d|z             |                     d|d         z             Ld t          |          D             }|                     |||           t!          j        |d|          ||<   ||         D 	]H}t%          | j        |                    d          |          }|j	                            d          }|$|dz  }|                     |j	        |||d           lt/          t1          j        |                    }ddg}t/          |                                          dk    r(|j	        | j        k    rd}|                    d           nd}||                    |           	 | j                            d|z  t           j        |g d          }nX# t           j        $ rF}|j         \  }}|t           j!        k    r || "                    |j	        |||          z  }Y d}~vd}~ww xY w|rd tG          |d         d         d                   z  |_$        d!tG          |d         d         d                   z  |_%        t/          |          t/          |          k    r%|dz  }| &                    |j	        |||d"           d|v o0t/          |d         d                   '                                d#k    }d|d         v o6t/          |d         d         d                   '                                d#k    }|r.|j	        | j(        vr |r| )                    |||           |dz  }|r| *                    |          s|r|dz  }|j	                            d$          } | rd|d         v rtW          tX          j-        |d         d%         d                   }!d}"|!j.        j/        D ]5}#|#j0        tb          j2        k    r|#j3        }$|$tG          |           k    rd}" n6|"r,| 4                    |j	        ||||d         j	        d           | 4                    |j	        ||||d         j	        d           |j	                            d&          }%d}&|%tG          |%          }&|&dz  sc|at/          |d         j	                  t/          |j	                  k    r1|dz  }| 5                    |j	        ||||d         j	        d'           a|d         j	                            d          |j	                            d          k    r1|dz  }| 5                    |j	        ||||d         j	        d           |d         j	                            d(          }'|j	                            d(          }(|('|'%|dz  }| 6                    |j	        ||||'           1|(|'k    r1|dz  }| 5                    |j	        ||||d         j	        d(           h||dk    rzt/          |d         j	                  t/          |j	                  k    rJ|j$        |j	        7                                z   })| 8                    |j	        ||)||d         j	                   |	r	| j        rd}*||d         v r|d         |         D ]}+t%          | j        |+                    d                    },|,j	                            d          }-|,j	                            d&          }.d}/|.tG          |.          }/|/dz  rw|-|k    r|*dz  }*|*dk    r|tr          j:        k    s|tr          j:        k    re|dz  s`d}0||         D ]M}1t%          | j        |1                    d                    j	                            d          }2|2|k    r|0dz  }0N|*|0k    rd}3||         D ]}+t%          | j        |+                    d                    },|,j	                            d          }-|,j	                            d&          }.d}/|.tG          |.          }/|/dz  rw|-|k    r|3dz  }3|*|3k    r|3|*z
  }4|dz  ru|*dk    r+|dz  }|                     |j	        |||j	        ||           |                     d)||3t/          |j	                  ||*t/          |j	                  fz             3|rJ |                     d*||3t/          |j	                  ||*t/          |j	                  fz             |4dk    r|dz  }|4dk    rr|*dk    s|4dk    r+|                     d+t/          |j	                  z             n| ;                    |||j	                                        ||j	                   |4dz  }4nF|                     |d         j	        ||j	                                        |j	        ||           |4dz  }4|4dk    ɐ	J|S ),z$check a DN attribute for correctnessr   r  N)membermemberOfc                     g | ]}|S  r  .0r   s     r   
<listcomp>z$dbcheck.check_dn.<locals>.<listcomp>  s    ???BR???r   z@ERROR: Missing and duplicate forward link values for attribute 'r&  r  z4ERROR: Duplicate forward link values for attribute 'zMissing   link '%s'z7Schedule readding missing forward link for attribute %srP   F)r  r   zDuplicate link '%s'zCorrect   link '%s'r  c                 ,    g | ]}t          |          S r  r   r  s     r   r  z$dbcheck.check_dn.<locals>.<listcomp>  s    <<<CGG<<<r   r+   r   r/   zmissing GUID	isDeletedreplPropertyMetaDatazmsds-hasinstantiatedncsTr  	<GUID=%s>)r   r   r   r   z	B:8:%08X:z%08Xz(incorrect instanceType part of Binary DNTRUEr  r  ru  stringra  zHWARNING: Link (back) mismatch for '%s' (%d) on '%s' to '%s' (%d) on '%s'zIERROR: Link (forward) mismatch for '%s' (%d) on '%s' to '%s' (%d) on '%s'z5ERROR: Can't fix missing multi-valued backlinks on %s)<r  r9   r  rd   r  r   r  r  r   r   r   r  rb  keyssortedr  rj   r   r   r7   r   r   rV  r   r   r   lowerrt   r   r   r   r   r   r   rI  r   r2  binaryrX  upperr   rn  r   r   r
   r  r  r  r  r   DRSUAPI_ATTID_isDeletedr  r@  r_  rh  r   r\  r   r   rs  )5r   rk  r  r  r   r  r  rE  reverse_syntax_oidis_member_linkr  r  r  missing_error_countforward_linksr  r  dddr   r   r   r   r  r&   fixing_msDS_HasInstantiatedNCsr   e3r   r   
is_deletedtarget_is_deletedr  r  
found_datar   deleted_usnrmd_blobrx  
target_sidlink_sidbad_dnmatch_countvv_dnv_guidv_blobv_rmd_flagsforward_countww_guidexpected_count
diff_counts5                                                        r   check_dnzdbcheck.check_dn  sv   |$Q'$($I$I($S$S!!(!%!2!V!VWh!i!i!%!%;; 	Fd: 	FNN **3*+13DF F 5K ~!## >>s?G?P?JL L 7!#6
 ..K??+*<*<*>*>???M"a''$HHcfff. / / / / aiaiaiknkqkqkqrsss* 	% 	%1Q7888''(adl(l(GI I ..qt5F/2v/B/B/D/Dcf/7@E / G G G !$(--// ? ?"6*H+ < <BKK 5 :;;;;1AfI=>>>>
 =<f]&;&;<<<D**3$???.tQAACMx= k	$ k	$Cdj#**V*<*<jIIG :44V<<D|q 22368S'3AC C C$)D//**G "89EH##%%)BBBSWS`I`I`15.^,,,,16. ,.///j''[7-B#..3 ?A ?A ?A ( B B < 
 
 
!wt3111 tAA#&BJBEBI K  K K 
 . !,s3q6.3I!3L/M/M!M!'#c!f^.DQ.G*H*H!Hw<<3s88++1$K003Q{||| %+ZC4DQ4G0H0H0N0N0P0PTZ0ZJ +s1v 5 g#c!f[>QRS>T:U:U:[:[:]:]ag:g !cfD,KKKPVK
 00hDDDq " 4+E+Eg+N+N SY  q #J==oNN	 %-Q77)(*K*-a&1G*H*K M  M%*
!% * *A w'*III./k#.#i..#@#@ 26J$)E% % //03Wc!fiO O O$##CFHc7CFIuUUU
 z88EEHI#MM	 q= %6%Bs1vy>>S__441$K99#&(CQX:=a&)XO O O1vy//777:;\;\]c;d;dddq 55cfhW69!fiI I IQ99%@@Jz88??HJ$:q 8839@*N N N:%%q 55cfhW69!fiH H H !(Q;;3s1vy>>S__#D#D
 %^gj.G.G.I.IIF44SVXv5<c!fiI I I $">  K CF**Q 12 
) 
)A"4:qxx/?/?@@D!W;;FCCF!W;;KHHF"#K)&)&kk"Q ! ))#q(a!;;;?QUYUo?o?o!A: 	%()!$X 3 3A%,TZ&9I9I%J%J%M%d%dek%l%lF%~~ - 2&-77$N] 
( 
(tz188F+;+;<<77??77DD%"%f++K? T>>"a'Nn,,'+5Jz  !##1$K..svx/2GJ/@/AC C C f$nc#&kk-{C
OOjM M N N N ((((KKc .#cf++);GJgI I J J J //q >>"Q*q.. %CEH__%U V V V--c8.1f.A.A.C.C.?.5j: : : !OJJ..s1vy:K/2v/B/B/D/Dcf/7E E E !OJ# //& s   4-M""N71;N22N7c                 B    |j         j        D ]}|j        |k    r|c S d S r
  )r  r  r  )r   r  r  r   s       r   find_repl_attidzdbcheck.find_repl_attid	  s7     	 	Aw%   tr   c                 x    t          t          j        |          }|                     ||          }||j        S dS )zRead metadata properties and return the originating time for
           a given attributeId.

           :return: the originating time or 0 if not found
        Nr   )r   r
   r  r*  r  )r   r   r  r  r   s        r   get_originating_timezdbcheck.get_originating_time  s>     (;SAA  u--=,,qr   c                    t                      }t                      }g }|                    | j                  }t          t          j        |          }|j        j        D ]}| j        	                    |j
                  }	|                    |	                                           |                    |j
                   | j                            |	|          }
|
|j
        k    r|                    |j
                   |||fS )zgRead metadata properties and list attributes in it.
           raises KeyError if the attid is unknown.is_schema_nc)r|   is_child_ofrq   r   r
   r  r  r  r9   get_lDAPDisplayName_by_attidr  r   r	  r   get_attid_from_lDAPDisplayName)r   r   r   set_attwrong_attids
list_attidin_schema_ncr  r   attcorrect_attids              r   process_metadatazdbcheck.process_metadata  s     %%uu
~~dn55(;SAA 	* 	*A#@@IICKK		$$$ag&&& -LLSZf M h hM''  )))\22r   c                    t          t          t          j        |d         d                             }t	          j        | j        d|z            }| j                            |t          j        |gddg          }|d         }t	          j	                    }||_
        t	          j        ||         t          j        |          ||<   |                     |g dd|z            r|                     d	|z             d
S d
S )zre-write replPropertyMetaData elements for a single attribute for a
        object. This is used to fix missing replPropertyMetaData elementsr  r   r  r  r   r   )r   r   r   'Failed to fix metadata for attribute %szFixed metadata for attribute %sN)r   r   r   r   rj   rk   r7   r   r   r   r   r   r   r   r   )r   rk  attrguid_strr   r   r   nmsgs           r   fix_metadatazdbcheck.fix_metadata3  s    z$)S->q-ABBCCVDJh 677jRs~dV*>*;*=   > > !f{}}'D	33GNNT
>>$ M M MCdJL L 	BKK9D@AAAAA	B 	Br   c                 `   |j         t          j        z  rd S d}|j        t          j        k    rd}nG|j        t          j        k    rd}n/|j        t          j        k    rd}n|j        t          j        k    rd}|sd S |j        j         t          j	        z  sd S t          |j        j                  S )NFT)flagsr   SEC_ACE_FLAG_INHERIT_ONLYtype"SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECT!SEC_ACE_TYPE_ACCESS_DENIED_OBJECT SEC_ACE_TYPE_SYSTEM_AUDIT_OBJECT SEC_ACE_TYPE_SYSTEM_ALARM_OBJECTr   %SEC_ACE_INHERITED_OBJECT_TYPE_PRESENTr   inherited_type)r   acechecks      r    ace_get_effective_inherited_typez(dbcheck.ace_get_effective_inherited_typeC  s    9x99 	48xBBBEEXCCCEEXBBBEEXBBBE 	4z("PP 	43:,---r   c                    || j         v r| j         |         S d|z  }| j                            | j        |dg          }t	          t          t          j        |d         d         d                             }|| j         |<   |S )Nz0(&(ldapDisplayName=%s)(objectClass=classSchema))schemaIDGUID)r$   r.   r&   r   )ru   r7   r   rq   r   r   r   r   )r   clsfltr   r  s        r   lookup_class_schemaIDGUIDz!dbcheck.lookup_class_schemaIDGUIDY  s    $)))*3//@3FjT^+.'5&6   8 8 
49c!f^&<Q&?@@AA'($r   c                 6   d}||         }t          t          j        |d                   }d|v o0t          |d         d                                                   dk    }|r|d fS t          j                    }|j        |_        |j        |_        |j        |_        |j        |_        d}d }	g }
|j	        |j	        j
        }
t          dt          |
                    D ]Y}|
|         }|j        t          j        z  s|                    |           4|                     |          }|L|		||	k    rd}W|}	Zg }
|j        |j        j
        }
t          dt          |
                    D ]Y}|
|         }|j        t          j        z  s|                    |           4|                     |          }|L|		||	k    rd}W|}	Z|r||fS |	|d fS d }	 |d         d         }n# t&          $ r
}Y d }~nd }~ww xY w||| j                            |t,          j        ddgd	g
          }|d         }d|v o0t          |d         d                                                   dk    }|r|d fS |d         d         }|                     |          }||	k    r||fS |d fS )NnTSecurityDescriptorr   r  r  FTobjectClassrB  r   r   )r   r   
descriptorr   r  	owner_sid	group_sidrC  revisionsaclacesr  r   rA  SEC_ACE_FLAG_INHERITED_ACEsacl_addrL  dacldacl_addr   r7   r   rj   r   rQ  )r   r   rk  sd_attrsd_valsdr  sd_cleanbrokenlast_inherited_typerZ  r"  rJ  r  rO  rH  r   r   s                     r   
process_sdzdbcheck.process_sdf  s,   (W+VAY77 C'VCK0@0C,D,D,J,J,L,LPV,V
 	:&((\\K"77<Dq#d))$$ 	$ 	$Aq'C9xBB !!#&&&55c::Ay".+++ "F"#77<Dq#d))$$ 	$ 	$Aq'C9xBB !!#&&&55c::Ay".+++ "F"# 	"b>!&:	m$R(CC 	 	 	DDDD	 ;*##3>+6*F.?-@ $ B BC AA$)Vc!K.2C.D.D.J.J.L.LPV.VJ "Dz!M"2&C**3//###b>! Dzs   G# #
G72G7c                    d}t          |          }t          j        t          j        z  }|                     d|d|dd          s|                     d|d|d           dS t          j                    }||_        t          j	        |t          j
        |          ||<   |                     |d	|z  gd
|z            r|                     d|d|d           dS dS )z/re-write the SD due to incorrect inherited ACEsrS  Fix r  r  rU   Not fixing 
Nsd_flags:1:%dFailed to fix attribute %sFixed attribute 'r  '
)r	   r   SECINFO_DACLSECINFO_SACLr   r   rj   r   r   r   r   r   )r   r   ra  	sd_brokenr_  r`  sd_flagsr>  s           r   err_wrong_sdzdbcheck.err_wrong_sd  s    ("(8+@@777BBB ?A[\\ 	KKK777BBB?@@@F{}}*633GQQW>>$8!; <6@B B 	JKKKGGGRRRHIIIII	J 	Jr   c                    d}t          |          }t          j        t          j        z  }|j        |t          j        z  }|j        |t          j        z  }|                     d|d|d|d          s| 	                    d|d|d           dS t          j                    }||_        t          j        |t          j        |          ||<   |                     |d	|z  gd
|z            r| 	                    d|d|d           dS dS )zare-write the SD due to not matching the default (optional mode for fixing an incorrect provision)rS  NzReset r  z back to provision default?
rh   zNot resetting ri  rj  zFailed to reset attribute %srl  r  rm  )r	   r   rn  ro  rV  SECINFO_OWNERrW  SECINFO_GROUPr   r   rj   r   r   r   r   r   )r   r   ra  diffr_  r`  rq  r  s           r   err_wrong_default_sdzdbcheck.err_wrong_default_sd  s>   ("(8+@@<#..H<#..HSZSZSZ\^\^\^`d`d e  hC  D  D 	KKKgggrrrBCCCFKMM'0DgNN'
>>!o8987BD D 	JKKKGGGRRRHIIIII	J 	Jr   c                 :   d}t          |          }t          j        t          j        z  }|                     d|d|dd          s|                     d|d|d           dS t          j                    }||_        t          j	        |t          j
        |          ||<   | j                            | j                   |                     |d	|z  gd
|z            r|                     d|d|d           | j                            | j                   dS )z/re-write the SD due to a missing owner or grouprS  zFix missing owner or group in r  r  rV   z"Not fixing missing owner or group ri  Nrj  r;  rl  r  rm  )r	   r   rt  ru  r   r   rj   r   r   r   r   r7   set_session_infor   r   r   )r   r   ra  r_  r`  rq  r>  s          r   err_missing_sd_ownerzdbcheck.err_missing_sd_owner  s6   (")H,BBWWWVXVXVX Y  \B  C  C 	KKK'''SUSUSUVWWWF{}}*633GQQW 	
##D$;<<<>>$8!; <CgMO O 	JKKKGGGRRRHIII
##D$<=====r   c                 @   | j         rdS || j        v rdS t          t          j        |          }|                     |t          j                  }t          j	        |j
                  }t          j                    }| j        dz  }||z
  }||k    rdS ||z   }	|dz  }
|
dk    rH|                     d|z             |                     dt          j        |	          |dz  fz             nD|                     d|z             |                     dt          j        |	          |
fz             |                     d	|j        |j        |j        |j        |j        t          j        t          j	        |j
                            fz             | xj        d
z  c_        dS )NFQ    z`SKIPPING additional checks on object %s which very recently became an expired tombstone (normal)zbINFO: it is expected this will be expunged by the next daily task some time after %s, %d hours agoi  z+SKIPPING: object %s is an expired tombstonezTINFO: it was expected this object would have been expunged soon after%s, %d days agozHisDeleted: attid=0x%08x version=%d invocation=%s usn=%s (local=%s) at %sr/   T)rf   r   r   r
   r  r*  r   r  sambanttime2unixr  timer3   r   ctimer  versionoriginating_invocation_idr  r  rg   )r   r   repl_valr  r  delete_timecurrent_timetombstone_deltar   expunge_time
delta_dayss              r   is_expired_tombstonezdbcheck.is_expired_tombstone  s   ( 	 5000 5(;XFF((w/NOO	'	(IJJy{{0LA{*O##5"_4l+
??KK ?ACD E E E KK '  :l33Uw5GHI J J J J
 KKEJKKKKK *  :l33Z@A B B B
 	^O%7-'Ju01RSSTTbV V 	W 	W 	W 	1$tr   c                    t          t          j        |          }|                     |t          j                  }t          j        |j                  }| j	        dz  }g }|j
        j        D ]t}|j        t          j        k    r|j        |j        k    r)|j        |j        k    r:t          j        |j                  }||z
  }	|	|k    r_|                    |           u||fS )Nr|  )r   r
   r  r*  r   r  r~  r  r  r3   r  r  r  r  r   )
r   r  r  r  r  r  foundr   change_timer   s
             r   find_changes_after_deletionz#dbcheck.find_changes_after_deletionJ  s    (;XFF((w/NOO	'	(IJJ0LA 	 	Aw'999{i111(I,MMM+A,EFFK+-E'' LLOOOOir   c                                            |          \  }}t          |          dk    rdS  fd}                     d|z              ||           |D ]} ||           dS )Nr   Fc                 @   	 j                             | j                  }n# t          $ r d| j        z  }Y nw xY w                    d|| j        | j        | j        | j        | j        t          j
        t          j        | j                            fz             d S )N<unknown:0x%x08x>zA%s: attid=0x%08x version=%d invocation=%s usn=%s (local=%s) at %s)r9   r1  r  r   r   r  r  r  r  r  r  r~  r  r  )r   attnamer   s     r   report_attidz8dbcheck.has_changes_after_deletion.<locals>.report_attidq  s    8+HHQQ 8 8 8-78 KK[!)3)
5#4Q5N#O#OPP_R R S S S S Ss   # ::z,ERROR: object %s, has changes after deletionT)r  r   r   )r   r   r  r  r  r  r   s   `      r   has_changes_after_deletionz"dbcheck.has_changes_after_deletionl  s    ;;HEEyu::??5	S 	S 	S 	S 	S 	BRGHHHY 	 	ALOOOOtr   c                 n   |                      |          \  }}|                    | j                  }|                                }| j                            ||          }g }|D ]}	|	j        |k    r|	j        t          j        k    r$|	j        t          j	        k    r:	 | j        
                    |	j                  }
n# t          $ r d|	j        z  }
Y nw xY w|                    |
           t          |          dk    rB|                     dd                    |          z             |                     d           d S |                     d|d| j        d	d
          s|                     d           d S |                     |dgd|z            r|                     d|z             d S d S )Nr.  r  r   zUnexpeted attributes: %sr   z%Not fixing changes after deletion bugzDelete broken tombstone object z	 deleted z
 days ago?r{   r   r4  r5  )r  r0  rq   get_rdn_namer9   r2  r  r   DRSUAPI_ATTID_nameDRSUAPI_ATTID_lastKnownParentr1  r   r   r   r   r   r   r3   r   )r   r   r  r  r  r6  r  	rdn_attid
unexpectedr   r  s              r   err_changes_after_deletionz"dbcheck.err_changes_after_deletion  s   ;;HEEy~~dn55??$$%DDXBN E P P	 
 	' 	'Aw)##w'444w'???8+HHQQ 8 8 8-78g&&&&z??QKK2SXXj5I5IIJJJKK?@@@F "D$:$:$:!<=]_ _ 	KK?@@@F>>"yk2R79 9 	.KK",-----	. 	.s   "CCCc                 n   t          t          j        |          }|j        }d}|j        D ]}|j        t          j        d          k    r d}|                     d||j	        |j
        t          j        t          j        |j                            | j                                        fz             |S )NF$00000000-0000-0000-0000-000000000000Ta  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  r  r  r  r   r   r   r  r  r  r  r~  r  r  r7   get_invocation_id)r   r   repl_meta_datar  r  r  r   s          r   "has_replmetadata_zero_invocationidz*dbcheck.has_replmetadata_zero_invocationid  s    (;(* *h 	< 	<A*di8^._.___EKK h qw	:e&78Q&R&RSS:7799;; < < < < r   c           	         t          t          j        |          }|j        }t	          j        t          t          j                                        }d}|j        D ]}|j	        t          j        d          k    r d}| j                            t          j                  }	|j        dz   |_        ||_        t          j        | j                                                  |_	        |	|_        |	|_        |rt+          |          }
t          j                    }||_        |                     d|d|d| j                                        dd	          s|                     d
|d|d           d S t          j                    }||_        t          j        |
t          j        |          ||<   |                     |dt:          j        z  dgd|z            r |                     d|d|d           d S d S d S )NFr  Tr/   rg  r  zK by setting originating_invocation_id on some elements to our invocationID r  rZ   z-Not fixing zero originating_invocation_id in ri  r   #local_oid:1.3.6.1.4.1.7165.4.3.14:0rk  rl  r  rm  )r   r
   r  r  r~  unix2nttimer   r  r  r  r   r   r7   sequence_numberrj   SEQ_NEXTr  r  r  r  r  r	   r   r   r   r   r   r   r   r   r  )r   r   r<  r  r  r  nowr  r   seqreplBlobr   r>  s                r   "err_replmetadata_zero_invocationidz*dbcheck.err_replmetadata_zero_invocationid  s   (;(* *hDIKK 0 011 	 	A*di8^._.___E*,,S\::C	AAI(+A%*.)DJ4P4P4R4R*S*SA' #AAKK 	K~~H+--CCF###'+ttRRR1M1M1O1O1O1O%QRvx x Y]Y]Y]_a_a_abccc;==DDG+Hc6JDQQDJ~~d%58c%c%J%L:TAC C K bbbIJJJJJ!	K 	KK Kr   c                     t          t          j        |          }|j        }|j        D ]T}	 | j                            |j                  }## t          $ r% | 	                    d|j        ||fz             Y  d S w xY wd S )NzIERROR: attributeID 0X%0X is not known in our schema, not fixing %s on %s
)
r   r
   r  r  r  r9   r1  r  r   r   )r   r   r<  r  r  r  r   r7  s           r   err_replmetadata_unknown_attidz&dbcheck.err_replmetadata_unknown_attid  s    (;(* *h 	 	A'DDQWMM   hlmlsuy{}k~~		 	s   A*A;:A;c           
      J   t          t          j        |          }d}t                      }t                      i }|                    | j                  }	|j        }
t          |
j        d d          d           |
_        t          |
j                  D ]|}t          d||j        fz             | j                            |j                  }|                                |v r|                     d|d|d|d           |                     d	|||j        |||         j        fz  d
          s$|                     d|j        |||fz              d S d}                    |j                   |j        ||         j        k    rZ|j        ||         _        |j        ||         _        |j        ||         _        |j        ||         _        |j        ||         _        P|||<   |                    |                                           ~fd|
j        D             }t/          |          dk    r|D ]}|j        |v r| j                            |j                  }| j                            ||	          }|                     d|d|d           |                     d|||j        |||         j        fz  d          s%|                     d|j        ||||fz              d S d}||_        |rt          |d d          d           |d d <   |sW|                     d|d|d           |                     d|d|dd          s|                     d|d|d           d S t/          |          |
_        ||
_        t5          |          }t7          j                    }||_        t7          j        |t6          j        |          ||<   |                      |dtB          j"        z  ddgd|z            r|                     d|d|d            d S d S )!NFc                     | j         S r
  r  r   s    r   <lambda>z:dbcheck.err_replmetadata_incorrect_attid.<locals>.<lambda>  s    qw r   )keyz
%s: 0x%08xz(ERROR: duplicate attributeID values for r  r  ri  zLFix %s on %s by removing the duplicate value 0x%08x for %s (keeping 0x%08x)?r[   z5Not fixing duplicate value 0x%08x for %s in %s on %s
Tc                 &    g | ]}|j         v|S r  r  )r  r   remove_attids     r   r  z<dbcheck.err_replmetadata_incorrect_attid.<locals>.<listcomp>#  s%    HHH!AG<,G,GA,G,G,Gr   r   r.  z'ERROR: incorrect attributeID values in zEFix %s on %s by replacing incorrect value 0x%08x for %s (new 0x%08x)?r\   zANot fixing incorrect value 0x%08x with 0x%08x for %s in %s on %s
c                     | j         S r
  r  r  s    r   r  z:dbcheck.err_replmetadata_incorrect_attid.<locals>.<lambda>4  s     r   z&ERROR: unsorted attributeID values in rg  z by sorting the attribute list?r]   rh  r   r  z#local_oid:1.3.6.1.4.1.7165.4.3.25:0rk  rl  r  rm  )#r   r
   r  r|   r0  rq   r  r  r  reversedr   r  r9   r1  r	  r   r   r   r  r  r  r  r  r   r2  countr	   rj   r   r   r   r   r   r   r  )r   r   r<  r  r4  r  r;   r3  hash_attr6  r  r   r7  new_listr8  r  r>  r  s                    @r    err_replmetadata_incorrect_attidz(dbcheck.err_replmetadata_incorrect_attid  s   (;(* *%%uu~~dn55h 39QQQ<->->???	 #)$$ 	% 	%A,"ag.///#@@IICyy{{g%%Z]Z]Z]_c_c_cegegeghiii''(v+/QWc8C=CV*W)X(JL L  KK X#$7Cr":!; < < <FF  ))) ;#!888
 -.IHSM)<=<UHSM9>?>YHSM;454EHSM1./kHSM+ HSMKK		$$$$ IHHHsyHHH!! , ,7l**+HHQQC$($5$T$TUXgs$T$t$tMKKKW[W[W[]_]_]_ `aaa++,s/3R#xPS}GZ.[-\]{} } $h'(wsD"&M%N O O OC+AG I$Xaaa[6G6GHHH  	KKKdddTVTVTVWXXX###'+ttRRR%12SU U tttRRR@AAA MM		D>>{}}'#2FMMT
>>$!1D4_!_!F!F!H 7=? ? 	G KKKDDD"""EFFFFF		G 	Gr   c                 L   d}d|vr|                      d|j        z             d}d|vs1t          |d         d                                                   dk    r|                      d|j        z             d}d	|vr|                      d
|j        z             d}d|vs1t          |d         d                                                   dk    r|                      d|j        z             d}d|v r|                      d|j        z             d}d|v rPt          |d         d                                                   dk    r|                      d|j        z             d}d|vsWt	          |d                   dk    s>t          |d         d                   dk    st          |d         d                   dk    r|                      d|j        z             d}d|vst          |d         d                   dk    r|                      d|j        z             d}|S )NFdescriptionz>ERROR: description not present on Deleted Objects container %sTshowInAdvancedViewOnlyr   FALSEzIERROR: showInAdvancedViewOnly not present on Deleted Objects container %sobjectCategoryzAERROR: objectCategory not present on Deleted Objects container %sisCriticalSystemObjectzIERROR: isCriticalSystemObject not present on Deleted Objects container %s
isRecycledz9ERROR: isRecycled present on Deleted Objects container %sr  z8ERROR: isDeleted not set on Deleted Objects container %srT  r}  topr/   	containerzBERROR: objectClass incorrectly set on Deleted Objects container %ssystemFlags-1946157056zBERROR: systemFlags incorrectly set on Deleted Objects container %s)r   r   r   r  r   )r   rk  faultys      r   is_deleted_deleted_objectsz"dbcheck.is_deleted_deleted_objectsM  sW   ##KKX[^[aabbbF#3..#c:R6STU6V2W2W2]2]2_2_cj2j2jKKcfifllmmmF3&&KK[^a^ddeeeF#3..#c:R6STU6V2W2W2]2]2_2_cj2j2jKKcfifllmmmF3KKSVYV\\]]]F##c+&6q&9":":"@"@"B"Bg"M"MKKRUXU[[\\\F##C,>(?(?1(D(D(+C,>q,A(B(Be(K(K(+C,>q,A(B(Bk(Q(QKK\_b_eefffF##s3}+=a+@'A'A]'R'RKK\_b_eefffFr   c                    t          j                    }|j        x|_        }d|vr#t          j        dt           j        d          |d<   d|vr#t          j        dt           j        d          |d<   d|vr+t          j        d| j        z  t           j        d          |d<   d|vr#t          j        dt           j        d          |d<   d|v r#t          j        dt           j        d          |d<   t          j        dt           j        d	          |d	<   t          j        d
t           j        d          |d<   t          j        ddgt           j        d          |d<   |                     d|z  d          s|                     d|z             d S | 	                    |dgd|z            r|                     d|z             d S d S )Nr  zContainer for deleted objectsr  r  r  zCN=Container,%sr  r  r  r  r  r  r  rT  zAFix Deleted Objects container %s by restoring default attributes?r^   .Not fixing missing/incorrect attributes on %s
r   z+Failed to fix Deleted Objects container  %sz%Fixed Deleted Objects container '%s'
)
rj   r   r   r   r   rq   r  r   r   r   )r   rk  r>  r   s       r   err_deleted_deleted_objectsz#dbcheck.err_deleted_deleted_objectsk  s   {}}v"##"%"45TVYVjly"z"zD#3..-0-?H\^v-w-wD)*3&&%(%78IDN8Z\_\p  sC  &D  &DD!"#3..-0-?H\^v-w-wD)*3!$!3FC<OQ]!^!^D.vs7K[YY[!0@TVcdd]!0%1EsG[]jkk] c#%!'(EG G 	KKIRPQQQF>>$G"LN N 	IKK@BGHHHHH	I 	Ir   c                 ,   t          j                    }||_        | j                                        }| j                                        r#|                     d|d|j        d           d S |                     d|j        z  d          s|                     d|j        z             d S t          j        |t           j	        |          ||<   | 
                    |g d|d|j                  r"|                     d	|d|j                   d S d S )
Nrh  r  z for the RODCz-Add yourself to the replica locations for %s?ry   r  zFailed to add  for rS  )rj   r   r   r7   rs   am_rodcr   r   r   r  r   )r   rk  	cross_refr<  r>  targets         r   err_replica_locationszdbcheck.err_replica_locations  s!   {}}--//: 	KKK444HIIIF O#&6!+,CE E 	KKISVTUUUF'0@$GGT
>>$svv$NOO 	<KKKTTT366:;;;;;	< 	<r   c                     || j         j        k    rdS || j        k    rdS || j        k    rdS || j        k    rdS || j        k    rdS dS )NTF)r7   rl   rm   ro   rq   rr   r7  s     r   is_fsmo_rolezdbcheck.is_fsmo_role  se    %%%4'''4444ur   c                    d}| j                             |          }||k    r|t          j        z  }	 | j                             |                                t          j        g dg           |t          j        z  }n7# t          j	        $ r%}|j
        \  }}|t          j        k    r Y d }~nd }~ww xY w| j        /t          |          d | j        D             v r|t          j        z  }|S )Nr   r   r   c                 ,    g | ]}t          |          S r  r  r  xs     r   r  z2dbcheck.calculate_instancetype.<locals>.<listcomp>  s    :Z:Z:Za3q66:Z:Z:Zr   )r7   r6  r   INSTANCE_TYPE_IS_NC_HEADr   r  rj   r   INSTANCE_TYPE_NC_ABOVEr   r   r   r   r   INSTANCE_TYPE_WRITE)r   r   instancetyperF  e4r   r   s          r   calculate_instancetypezdbcheck.calculate_instancetype  s   *((,,==D99L<
!!ryy{{#.PR^o]p!qqq  ;; <   !wt3111 21111 >%#g,,:Z:Z4>:Z:Z:Z*Z*ZD44Ls   ;A> >B2B--B2c                     | j         D ]b\  }}||k    rWt          j        | j                                                  }t          t          j         ||| j                            c S ct          )N)r   )	rv   r   r   r7   r   r   rU  r   r   )r   r   sd_dndescriptor_fn
domain_sids        r   get_wellknown_sdzdbcheck.get_wellknown_sd  s    &*&8 	I 	I"UMU{{%-dj.G.G.I.IJJ
!("5"/-
9=#H #H #HI I I I I  r   c                   	 |dgnt          |          t          d D                       		fd}d	v s,d	v s(|                                                                	v r*                    d           	                    d           d	v r%|                                dd	fD ]} ||           d
}d	v rd}n,D ])}|                     |          \  }}|dk    r!|dz  r'd} |r |d            |d           	fS )zA helper function for check_object() that calculates the list of
        attributes that need to be checked, and returns that as a list
        in the original case, and a set normalised to lowercase (for
        easy existence checks).
        N*c              3   >   K   | ]}|                                 V  d S r
  )r	  r  s     r   	<genexpr>z/dbcheck.find_checkable_attrs.<locals>.<genexpr>  s*      00Qqwwyy000000r   c                     |                                  vr>                    |                                |                                             d S d S r
  )r	  r   r   )ar&   lc_attrss    r   add_attrz.dbcheck.find_checkable_attrs.<locals>.add_attr  sM    wwyy((QQWWYY''''' )(r   r   distinguishednamenamer  r  FTr   r/   r  r  )r,  r|   r  r	  r   r   r  )
r   r   r   r  r  need_replPropertyMetaDatar  rD  r&   r  s
           @@r   find_checkable_attrszdbcheck.find_checkable_attrs  s    "EEE))E00%00000	( 	( 	( 	( 	( 	(
 H8++OO##%%11LL   LL   Xoo''!#%   $)!(??(,%%   AA!DD	Q;;A: ,0)$ 	-H+,,,hr   c           
      *   | j         r|                     d|z             |                     ||          \  }}	 d}|t          j        z  }|t          j        z  }|t          j        z  }|t          j        z  }| j        	                    |t          j        dddd|z  dg|          }n]# t          j        $ rK}|j        \  }}	|t          j        k    r+| j        r|                     d	|z             Y d
}~dS Y d
}~dS  d
}~ww xY wt!          |          dk    r|                     d|z             dS |d         }
d}t#                      }t#                      }d}| j                            |
j                  }	 | j                            |t*          j        j                  }n# t0          $ r d
}Y nw xY wd
}d
}d
}d}d}d
}|
D ]}|                                dk    r!t5          |
|         d                   dk    rd}|                                dk    rt7          |
|         d                   }|                                dk    r|
|         d         }|rM|rK|                     ||          r|dz  }|                     ||           |S |                     ||          r|S |
D 	]}|dk    s|dk    r|                                dk    rd}|                                dk    rzt!          |
|                   dk    rF|dz  }|                     dt!          |
|                   |t5          |
j                  fz             nt5          |
|         d                   }|                                t5          |
j                                                                                  k    r||}t!          |
|                   dk    rF|dz  }|                     dt!          |
|                   |t5          |
j                  fz             nt5          |
|         d                   }|                                dk    rQ|                      ||
|         d                   r(|dz  }| !                    |||
|         d                    	 | "                    ||
|         d                   \  }}}n3# t0          $ r& |dz  }| #                    |||
|                    Y @w xY wt!          |          t!          |          k     s&t!          |          dk    stI          |          |k    r*|dz  }| %                    |||
|         d         |           n:|d         dk    r.|dz  }|                     d|dt5          |          d           |                                dk    r| &                    ||
          \  }}|| '                    |||           |dz  }B|j(        |j)        | *                    ||           |dz  }m| j+        r	 | ,                    |          }n# t0          $ r Y w xY wt[          t          j.        |
|         d                   }t_          ||t          j0        | j        1                                                    }|dk    r| 2                    |||           |dz  } "|                                dk    r| j        3                    | j4        ||
|                   }tI          |          tI          |
|                   k    s0|d         |
|         d         k    s|d         |
|         d         k    r/| 5                    ||tm          |
|                              |dz  }|                                dk    rm|
|         d         } | dk    r$|dz  }| 7                    |
||
|                    9| d
d          d!k    rI| d
d"         d#k    r$|dz  }| 8                    |
||
|                    {| d         dk    rT| d$         dk    rH| d%         dk    r<| d&         dk    r0| d'         dk    r$|dz  }| 9                    |
||
|                    t!          |           d(z  dk    r|dz  }| :                    |
|           | d         dk    rT| d(         dk    rH| d$         dk    r<| d)         dk    r0| d%         dk    r$|dz  }| ;                    |
||
|                    n|                                d*k    s|                                d+k    rq|
|         d         | j<        v r6|dz  }|                     d,|d-|
j        d.|
|         d         d/           n&| j<        =                    |
|         d                    |
|         D ]$}!|!d0k    r| >                    ||           |dz  }$%	 | j4        ?                    |          }"n3# t          $ r&}#| A                    |
|           |dz  }Y d
}#~#d
}#~#ww xY w| B                    |          \  }$}%| j4        C                    |          }&|&t,          jD        z  s8|&t,          jE        z  s)|$s'|=                    |                                           |"t,          jF        t,          jG        t,          jH        t          jI        fv r|| J                    |
||"          z  }nt#                      }'|
|         D ]|}!|'=                    |!           | j        3                    | j4        ||!g          }t!          |          dk    s|d         |!k    r$| K                    |||
|                    |dz  } n}t!          |
|                   t!          |'          k    r2| L                    |||
|         tm          |'                     |dz  } n|                                d1k    rh| M                    |          }(t!          |
d2                   dk    st7          |
d2         d                   |(k    r|dz  }| N                    |
|(           	|s"d3|v sd|v r|dz  }| O                    |           d3|v sd|v r}|/|dz  }|                     d4t5          |
j                  z             |J|dz  }|                     d5|
j                                        dt5          |
j                  d6           |'d
})dd7g}*|r)|t*          j        jP        z  s|})|*d8t,          jQ        z  gz  }*|)|
j        R                                })t          jS        | j        d9|)z            }+|+T                    d|
j                                        |           |
j        |k    r|
j        }+|+|
j        k    r |dz  }| U                    |
|+||||*           nS|
j        V                                |k    r6|dz  }|                     d:|d;|d<t5          |
j                  d6           d},|ro|
j        |k    rd=}-d>}.| W                    ||-          }/|/|.k    r| X                    d?t5          |          z  d@          r`t          jY                    }0||0_        t          jZ        dAt          j[        dB          |0dB<   |dz  }| j        \                    |0dCgD           n%|                     dEt5          |          z             |]                    |          D ]}1|,r|                     dF|z             d},|dz  }|                     dG|1z             | X                    dH|1z  dI          s|                     dJ|1z             m| ^                    |
|1           | _                    |          r&dK|
vr"d3|v sdL|v r| `                    |
           |dz  }	 || j        a                                k    rct5          |R                                          | jb        vr;| j        	                    |R                                t          j        ddgM          }n# t          j        $ ru}2|2j        \  }}	|t          j        k    rP|r3|                     dN|
j        z             |                     dO           n| c                    |
           |dz  }n Y d
}2~2nd
}2~2ww xY w|| jd        v r3d3|v r/| e                    |
          r| f                    |
           |dz  }| jg        D ]\  }3}#||3k    rdP|
v rdQ}4| j        h                                rdR}4|4|#vr"| i                    |
|#j        |4           |dz  }Rd}5|#|4         D ].}6t5          |6          | j        j                                k    rd}5/|5s!| i                    |
|#j        |4           |dz  }|| jk        k    rd3|v sdS|v rdT|
vr|dz  }| jl        r| X                    dUdV          rl| j        m                                 	 | j        n                                 n#  | j        o                                  xY w| j        p                                 n1| j        h                                s|                     dW|z             || jq        k    rdXdYg}7| j        	                    | jq        t          j        |7Z          }|7D ]e}8|8|d         vrt7          |d         |8         d                   }9|9d[z	  }:d\|9z  };|9dk    r'|;|:k    r!|                     d]|;|:|;|:fz             |dz  }fdX|d         vr|                     d^|z             |dz  }	 | j        r                                \  }<}:| j        1                                }=|<|:k    rAd_|=|<fz  }>	 | j        	                    d`|>z  t          j        g Z          }n9# t          j        $ r'}?|?j        \  }}	|t          j        k    r d
}Y d
}?~?nd
}?~?ww xY w||                     da|>db|d         j        dc|           |dz  }| X                    dd|>de|dfdg          r{| j        m                                 	 	 | j        s                                }@|@|<k    r|@dz   }<n&n#  | j        o                                  xY w| j        p                                 nn|<dz  }<|<|:k    AnC# t          j        $ r1}A|Aj        \  }}	|                     dh|	z             |dz  }Y d
}A~And
}A~Aww xY w|S )izcheck one objectChecking object %sr   r   r   r   rj  r   )r$   r%   r   r&   z)ERROR: Object %s disappeared during checkNr/   z,ERROR: Object %s failed to load during checkF	isdeletedr  Tsystemflagsreplpropertymetadatar   distinguishedNameobjectclassr  z1ERROR: Not fixing num_values(%d) for '%s' on '%s'z4ERROR: Not fixing incorrect initial attributeID in 'z' on 'z', it should be objectClassntsecuritydescriptorr)   rB  userparameters       s                      s   IAAgACAAIAAgACAAIAAg         	   r}     attributeid	governsidzError: r  r  z. already exists as an attributeId or governsIdr   r  r  r  z(ERROR: Not fixing missing 'name' on '%s'zERROR: Not fixing missing 'r  r   rZ  z
RDN=RDN,%szERROR: Not fixing r  z on 'i0  l   )x1cB& z-Fix isDeleted originating_change_time on '%s'rL   r  r  r   r   z4Not fixing isDeleted originating_change_time on '%s'zOn object %sz7ERROR: Attribute %s not present in replication metadataz-Fix missing replPropertyMetaData element '%s'rK   z4Not fixing missing replPropertyMetaData element '%s'r  fsmoroleowner)r$   r%   r   z'WARNING: parent object not found for %szFNot moving to LostAndFound (tombstone garbage collection in progress?)repsFromr,   r-   ridsetreferencesr2   z,Allocate the missing RID set for RID master?rz   z^No RID Set found for this server: %s, and we are not the RID Master (so can not self-allocate)rIDAllocationPoolrIDPreviousAllocationPoolr#       l    z!Invalid RID pool %d-%d, %d >= %d!z No rIDAllocationPool found in %sz%s-%dz<SID=%s>zSID r  z' conflicts with our current RID set in zFix conflict between SID z and RID pool in z by allocating a new RID?rc   zCouldn't get available RIDs: %s)tr:   r   r  r   rt  ru  rn  ro  r7   r   rj   r   r   r   r   ri   r   r|   r6  r   r   r~  r   r   r   r	  r   r   r  r  r  r  r  r  r9  r  r  r  re  rr  rV  rW  rz  re   r  r   rU  r   r   r   rw  r  r9   r-  r,  r  r  r  r  r  r   r   r  r  r   rl  r  $get_systemFlags_from_lDAPDisplayNameDS_FLAG_ATTR_NOT_REPLICATEDDS_FLAG_ATTR_IS_CONSTRUCTEDr   DSDB_SYNTAX_OR_NAMEDSDB_SYNTAX_STRING_DNr  r(  r$  r0  r  r  r8  #SYSTEM_FLAG_DISALLOW_MOVE_ON_DELETEr[  r  rk   set_componentr  get_rdn_valuer,  r   r   r   r   r  
differencer?  r  r  r   r}   r  r   r  r  r   r  r  rs   r   r   r  create_own_rid_setr  r  r   free_rid_boundsallocate_rid)Br   r   r   search_attrsr  rq  r   e10r   r   rk  r   set_attrs_from_mdset_attrs_seengot_objectclassnc_dndeleted_objects_dnobject_rdn_attrobject_rdn_valr  r  r  repl_meta_data_valr  list_attid_from_mdr4  ra  rp  well_known_sd
current_sdrv  r!  
userparamsr   r  r   r  rE  flagr  r  	parent_dnr   expected_dnshow_dnisDeletedAttIdexpectedTimeDooriginatingr>  r7  e11dns_partlocationr  loc
pool_attrs	pool_attrpoolhighlownext_free_ridr  sidrH  allocated_ridr   sB                                                                     r   r   zdbcheck.check_object  s   < 	3KK,r1222 "&!:!:2!O!Oh	H..H..H--H--H*##3>(9(9(8(7((B(<.& +7 $ 8 8CC | 	 	 	8LT4s---& KK Kb PQQQ11111qqqqq	 s88q==KKFKLLL1!fEE
&&sv..	&!%!<!<U=BZ=i"k "k 	& 	& 	& "&	&
 	! 		6 		6H~~;..s8}Q'((G33 $I~~=00!#h-"233~~#999%(]1%5" 	#+ 	#..r3EFF #q //4FGGG""((-?@@ #"" O	N O	NH48/B#B#B~~=00"&~~6))s8}%%**1$KKK S!$S]!3!3Xs36{{ K!L M M M M  #3x=#344H~~3sv':':'<'<#=#=#C#C#E#EEE"*s8}%%**1$KKK S!$S]!3!3Xs36{{ K!L M M M M &)Xq)9%:%:N~~#999::2s8}Q?OPP \1$K;;B#h-XYJZ[[[//CM!4DEE J&(:LL   1$K77Hc(mTTTH
 ())C0B,C,CCC,''!++/004FFF1$K99"hHVWHXZfgggg
 *!,11#q(%-XXs2wwww%8 9 9 9 ~~#999"&//"c":":Y(%%b"i8881$K<'2<+?--b"5551$K- !!(,(=(=b(A(A# ! ! ! ! ",H,?,/M!,<"> ">J (z8CSTXT^TmTmToToCpCpqqDrzz11"mTJJJ#q( ~~=00!ZAA$BSU]_bck_lmm
 *%%H)>)>>> ms8}Q'777 nHb(99977Hd3x=FYFYZZZ1$K~~#333 ]1-
%%1$K11#xXOOO_77_(???1$K223#h-PPP !mq(( mq(( mq(( mq(( mq((  1$K00hHNNN__q(A--1$K//X>>> mq(( mq(( mq(( mq(( mq((  1$K33C3x=QQQ~~=00HNN4D4D4S4Sx=#t'BBB1$KKKK#+88SVVVS]15E5E5E!G H H H H /33CM!4DEEE 8}  #::,,R:::1$K !.RRS[\\

   **3999q 
 )-(M(Mh(W(W%F%$II(SSD4;; 5t??55 ""8>>#3#3444d8$:R"8#-I I I t}}S(JGGG x=  CJJsOOO!%!E!EdFWYadgch!i!iJ:!++z!}/C/C33B#h-PPP#q( 0D
 s8}%%V44--b(CM4PV<<XXX1$KE~~>11*.*E*Eb*I*I's>*++q00CN8KA8N4O4OSj4j4j1$K//5LMMM 	-C8OO}7P7P1K((,,,8OOv11q F#cf++VWWW&q H[H[H]H]H]H]_bcfci_j_j_j_jklllI)95H \#ej&TT 3 2I-0ZZ[[ FMMOO	&\Y-GHHK%%a)<)<)>)>IIIv+++!fcf$$q !!#{O&(< < < <%%''>99q R`R`R`befiflbmbmbmbmnooo 	,v+++!' "5"778JN[[.00''(WZ]^`ZaZa(acvww f"{}}"$,/,>vsG[]h,i,i[)#q(
))$-)IIII $Z]`ac]d]d$deee%001BCC 	, 	, $KK 3444#Gq UX[[\\\''(WZ](]_qrr KK VY\ \]]]!!#s++++R   	!c))sh/U]B]B]))#...q 	TZ//1111c"))++6F6Fdk6Y6Yj''RYY[[2CEU1V ( X X| 	 	 	8LT4s--- %KK ISV TUUUKK !N O O O O ++C0001$KK	 000SH__..s33 !00555q #2 	% 	%OXsX~~*"3"36:%%'' >=H3&&..sCFHEEE1$Kx= % %C3xx4:#?#?#A#AAA $ %..sCFHEEE1$K###h"4"@"@%S00  1$K) ?++ -:,HJ J < !J88:::& $
 = = ? ? ? ?& $
 = = ? ? ? % J99;;;!Z//11 ? %9;=%> ? ? ?6   -/JKJ*##*4 $ 6 6C ( % %	CF**3q6),Q/00rz 4'199KK C!$dC 6!7 8 8 81$K"#a&00>CDDDq 7+&*j&@&@&B&B#t "Z6688
#t++!Z$??C#"j//Z#5E69n68 0 : : < # # #'(vt3#999!"	#
 7:ssCFIIIrr%K L L L#q(+++ 03ssBBB-8 -G	H H "
 !J88:::&!.48J4K4K4M4MM'4'E'E8E8I(-	!. ).& $
 = = ? ? ? % J99;;;;!%*Y $t++ < ! ! ! X
d=DEEEq !n s   A.B) )D89C>=C>>D;*F& &F54F5&R==,S-,S-!X77
YY)h
h4h//h4+B AA, A,AC0A;A+AC+C+AC0H8AI IAI.NAT O*AO7 O7AP-PAP(P(AP-R'AR? R?ASTAUT'AUUAUc                 :   t          j        | j        d          }| j        r|                     d|z             | j                            |t           j                  }t          |          dk    r|                     d|z             dS |d         }d}d|vr|                     d           |dz   S t          |d         d                   	                    d	          s7|                     d
           |dz  }| 
                    d          s|S | j                            t          j        | j        |d         d                             d                    t           j        dg          }t          t          t          j        |d         d         d                             }t          j                    }||_        t          j        d|z  t           j        d          |d<   |                     |g dd          r|                     d           |S )z!check the @ROOTDSE special objectz@ROOTDSEr  )r$   r%   r/   z"Object %s disappeared during checkr   r  z(ERROR: dsServiceName missing in @ROOTDSEz<GUID=z1ERROR: dsServiceName not in GUID form in @ROOTDSEz"Change dsServiceName to GUID form?r+   r  r#   r  z+Failed to change dsServiceName to GUID formFr   z"Changed dsServiceName to GUID form)rj   rk   r7   r:   r   r   r   r   r   
startswithr   r   r   r   r   r   r   r   r   r   )r   r   r   rk  r   r=  r  s          r   r   zdbcheck.check_rootdse  s   VDJ
++< 	3KK,r1222jRs~>>s88q==KK<rABBB1!f #%%KKBCCC?"3'*++66x@@ 	BKKKLLL1K<< DEE #""*##
C<PQR<S<Z<Z[a<b<b)c)c*-. $ P PC:diQ1Ea1HIIJJHAAD!$!3K(4J474H/"[ "[Ao~~a%R]b~cc B@AAAr   c                 $   t          j                    }t          j        | j        d          |_        t          j        dt           j        d          |d<   t          j        dt           j        d          |d<   |                     |g dd          S )	zre-index the whole databasez@ATTRIBUTESr   force_reindexr   r   zre-indexed databaseFr   )	rj   r   rk   r7   r   r   r  r  r   r   r  s     r   reindex_databasezdbcheck.reindex_database5  ss    KMMvdj-00(1A?SS%(1DoVV(~~a%:U~KKKr   c                     t          j                    }t          j        | j        d          |_        t          j        dt           j        d          |d<   |                     |g dd          S )zOreset @MODULES to that needed for current sam.ldb (to read a very old database)z@MODULES
samba_dsdbz@LISTzreset @MODULES on databaseFr   )rj   r   rk   r7   r   r   r   r   r7  s     r   reset_moduleszdbcheck.reset_modules?  sX    KMMvdj*--'c6JGTT'
~~a%AE~RRRr   )	NFFFFFFFF)FF)T)Fr
  )N__name__
__module____qualname____doc__r   rj   r  r   r   r   r   r   r   r   r  r  r  r$  r-  r0  r   r8  r@  rI  rV  rX  r\  r_  rh  rl  rn  rs  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r{  r  r(  r*  r,  r9  r?  rL  rQ  re  rr  rw  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r8  r;  r  r   r   r    r    4   s*       ))DI8=).',*/	w w w wr !%C,=!   >b b bH  
G G G G  *       &	 	 	A A A> > >>> > >*N N N$U U U. . .I I I I.S S SjI I I@I I I L L L$] ] ]"M M M@E E EE E E G G GF F F  04H H H H(C C C&m m m"!, !, !,FA A A*w w wO O On n np p p i i i4\ \ \
 
 
?: ?: ?:B  Bd4 d4 d4Lh h hT	    3 3 3,B B B . . .,  g g gRJ J J"J J J*> > >>4 4 4l        D  2". ". ".H  (#K #K #KJ
 
 
]G ]G ]G~  <I I I8< < <$    $  / / /bY Y Y Yz  HL L LS S S S Sr   r    )rj   r~  r  base64r   r   r   samba.dcerpcr   r   	samba.ndrr   r	   r
   samba.samdbr   r   samba.descriptorr   r   
samba.authr   r   samba.netcmdr   samba.netcmd.fsmor   r   r   r    r  r   r   <module>rH     su  ( 


                                       * * * * * * * * ! ! ! ! ! !       ! ! ! ! ! ! < < < < < < < < 4 4 4 4 4 4 4 4 % % % % % % 0 0 0 0 0 0  P,S P,S P,S P,S P,Sf P,S P,S P,S P,S P,Sr   