
    gJ                        S SK r S SKrS SKrS SKJrJr  S SKJr  S SKJr  S SKJ	r	  S SKJ
r
  S SKJrJr  S SKJr  S S	KJr  S S
KJr  S SKJrJrJr  S SKJrJr  S SKJr  S SKJr  S SKJrJrJ r J!r!  S r" " S S\#5      r$g)    N)	b64decode	b64encode)dsdb)common)misc)drsuapi)
ndr_unpackndr_pack)drsblobs)dsdb_Dn)security)get_wellknown_sdsget_deletedobjects_descriptorget_diff_sds)system_sessionadmin_session)CommandError)get_fsmo_roleowner)c_REDc_DARK_YELLOWc_DARK_CYANc_DARK_GREENc                     / nU  H$  n UR                  UR                  S5      5        M&     SR	                  U5      $ ! [         a    UR                  [        U5      5         M`  f = f)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 
 88F " 	'MM$u+&	's    >$A&%A&c                      \ rS rSrSr0 r      SNS jrS rS\R                  SS4S jr
S rS rSOS	 jrS
 rS rSPS jrS rS rS rS rS rS rS rS rSQS jrS rS rS rS rS rS rS r S r!S r"S r# SPS  jr$S! r%S" r&S# r'S$ r(S% r)S& r*S' r+S( r,S) r-S* r.S+ r/S, r0S- r1S. r2S/ r3S0 r4S1 r5S2 r6S3 r7S4 r8S5 r9S6 r:S7 r;S8 r<S9 r=S: r>S; r?S< r@S= rAS> rBS? rCS@ rDSA rESB rFSC rGSD rHSE rISF rJSG rKSH rLSRSI jrMSJ rNSK rOSL rPSMrQg)Sdbcheck8   zcheck a SAM database for errorsNc           
         Xl         S U l        U=(       d    UU l        X0l        X@l        XPl        X`l        Xl        SU l        SU l	        SU l
        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        [7        5       U l        SU l        SU l        SU l        SU l         SU l!        SU l"        SU l#        SU l$        SU l%        SU l&        SU l'        SU l(        SU l)        SU l*        SU l+        SU l,        SU l-        Xl.        Xl/        Xl0        SU l1        SU l2        Xpl3        [h        Rj                  " USURm                  5       -   5      U l7        [h        Rj                  " USURq                  5       -  5      U l9        URu                  5       U l;        [h        Rj                  " USURm                  5       -   5      U l<        [h        Rj                  " XR{                  5       5      U l>        0 U l?        [        U R                   5      U lA        SU lB        SU lC        SU lD        SU lE        SU lF        [        5       U lH        0 U lI        0 U lJ         SU R                  UR                  5       [        R                  5      -  nUR                  U[h        R                  S/S9n[        [        R                  US   S   S   5      n[        U5      U R                  S	'   [        5       U lY        [        S UR                  5       5      U l\        U R                   R                  U R|                  [h        R                  S
S/S9nS
US   ;   a  US   S
   U l]        OSUS   ;   a  US   S   U l]        OS U l]        U R                   R                  S[h        R                  S/S9n/ U l^        / U l_        / U l`         US   S   U la        U R                   Hm  n U R                  [h        Rj                  " U R                   UR                  S5      5      [        R                  5      nU R                  R                  U5        Mo     SU R                   R                  5       -  nSU R                   R                  5       -  nU R                   R                  [h        R                  SS/U R                   R                  5       SU-  S9n[        U5      S:X  a?  U R                  R                  [h        Rj                  " U R                   U5      US   45        U R                   R                  [h        R                  SS/U R                   R                  5       SU-  S9n[        U5      S:X  a?  U R                  R                  [h        Rj                  " U R                   U5      US   45        [h        Rj                  " U R                   SU R                   Rm                  5       -   5      n[        U R                   US5      n[h        Rj                  " U R                   U R                   R{                  5       5      U:X  a  SU ll        OSU ll        U R                   R                  [h        Rj                  " U R                   U R                   R                  5       5      [h        R                  S/S9n[h        Rj                  " U R                   US   S   S   R                  S5      5      U ln        U R                   R                  U R                  [h        R                  S/S9nSUS   ;   a?  [h        Rj                  " U R                   US   S   S   R                  S5      5      U lo        OS U lo        SU R                   Rq                  5       R                  5       -  nUR                  U[h        R                  SS/S9nSUS   ;   a  [        US   S   S   5      U lr        OSU lr        / U ls        / U lt         U R                   R                  [h        R                  SS S!/S"9nS US   ;   a  US   S    U ls        S!US   ;   a  US   S!   U lt        g g ! [h        R                   a/  nUR                  u  nnU[h        R                  :w  a  e  S nAGNS nAff = f! [         a     GN[         a     GNf = f! [         aN    U R                  R                  [h        Rj                  " U R                   UR                  S5      5      5         GM.  f = f! [h        R                   a.  nUR                  u  nnU[h        R                  :w  a  e  S nAg S nAff = f)#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,   r5   r-      z@SAMBA_DSDBcompatibleFeaturesrequiredFeatures)r,   r+   r-   )usamdbdict_oid_namesamdb_schemaverbosefixyesquietcolour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_cached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intr:   r<   r=   )selfr>   r@   rA   rB   rC   rD   rq   rl   rm   rn   rE   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__dbcheck.__init__=   s    
!)2U
-2*+0(%*""' %!&38016.49127/16.05-8=5 %!&,1)).&*/'-2*$(F!).&"(-%491$&+# %27/05-,1)/4,+0().&',$*/'(-%'>$%:"(@%"#).&,!$/CeooFW/W!X'9E<S<S<U'UV002ffU$@5??CT$TUu&=&=&?@"$.tzz:+0(+0(%*"*/'.3+e	'$*F*F((*,,+. .G ,,G3>>&1]  4C&x'7'7Q9LQ9OPM),]);DMM+& $2#3 "/e6J6J6L"MjjT]]#..QdftPuv#a&( V$78DN Q'!$Q!7!%jjRs~~FVEWX*,'.0+ 	1v./DH ((Bb11#&&RYYvEV2W262X2XZ//66r:	  0$**2O2O2QQ/$**2L2L2NN""););*EGe)f(,

(D(D(F.TWe.e # g v;!&&tzz>(JFSTI'VW""););*EGe)f(,

(D(D(F.TWe.e # g v;!&&tzz>(JFSTI'VW&&%ADJJDXDXDZ%Z['

GUC
66$**djj::<=K!%D!&D jjSVVDJJ

8Q8Q8S%T&)nn=N<O   Q !VVDJJA7H0I!0L0S0STZ0[\ jjT%7%7&)nn=O<P   RQ'!ffTZZQ8J1KA1N1U1UV\1]^DO"DOM**668GGIJll!$&A"5!6  8 #a&(%(Q0C)DQ)G%HD"%(D""$ "	**###..)6+?+=+? $ @C $s1v-*-a&1E*F'!SV+(+A/A(B% ,G || 	77LT4s--- .	6  	 		  b33::366$**biiX^N_;`aab@ || 	77LT4s--- .	s^   Bb 8c A)c(,Ae c$cc
c%	c%$c%(Ae ?e f$f  fc                 .   U R                   R                  [        U5      5      nS nUb  UR                  U5      nUcW  U R                  R	                  X5      nUc  U$ Uc0  0 U R                   [        U5      '   U R                   [        U5         nXCU'   U$ N)hash_well_knowngetr   r>   get_wellknown_dn)r   nc_rootwkguidh_ncr   s        r#   r   dbcheck.get_wellknown_dn_cached   s    ##''G5&!B:,,W=Bz	|57$$S\2++CL9L	    c                    U R                   R                  XS/US9nU R                  S[        U5      -  5        SnSU l        X`R                  5       -  n[        5       U l        U HM  nU R                  R                  [        UR                  5      5        X`R                  UR                  US9-  nMO     Uc  X`R                  5       -  nU R                  S:  a  U R                  SU R                  -  5        U R                  S[        U5      X`R                  -   4-  5        U R                  S:w  a  U R                  SU R                   S	35        US:w  a&  U R                  (       d  U R                  S
U S35        U$ )z>perform a database check, returning the number of errors foundr   r+   r,   r-   controlszChecking %u objectsr   )requested_attrszNOTICE: found %d expired tombstones, 'samba' will remove them daily, 'samba-tool domain tombstones expunge' would do that immediately.zChecked %u objects (%u errors)z	WARNING: z/ of these errors cannot be automatically fixed.z-Please use 'samba-tool dbcheck --fix' to fix z errors)r>   r   reportr   unfixable_errors check_deleted_objects_containersr   attribute_or_class_idsr   addr   r   check_objectcheck_rootdsero   rB   )r   DNr,   r   r-   r   error_countobjects           r#   check_databasedbcheck.check_database  sz    jjRTFXV)CH45 !<<>>&)e#FKKOOC		N+,,VYY,NNK  :--//K""Q&KK 5 //	1 2 	4X{-B-BBCD 	E   A%KK)D$9$9#: ;I I J !DHHKKG&-w0 1 r   c           
      6	   SnU R                    GH  nX R                  :X  a  M  US-  nU R                  SU-  5        U R                  SU-  S5      (       d  MJ  [        R
                  " U R                  S5      nUR                  U5        Sn U R                  R                  U[        R                  / / SQS	9n[        U5      S:w  ap  US   R                  R                  S
5      n[        R
                  " U R                  S[        [        R                  " U5      5      -  5      nUR                  U5        Ub   U R                  R'                  X4/ SQ5        U R                  R                  U[        R                  S// SQS	9n[        U5      S:w  a  U R                  SU-  5          gUS   S   n/ nSnU H  n[)        U R                  UR+                  S5      [,        R.                  5      nU R1                  U5      (       a/  U R                  SU-  5        UR                  R                  S
5      nUR3                  [        U5      5        M     Ub#  S[        [        R                  " U5      5      -  nO-S[,        R4                  -  nUR3                  U< SU< 35        Sn[6        R8                  " U R                  R;                  5       5      n[=        UU R>                  S9n[A        U5      R+                  S5      nU R                  RC                  SU< SU< SU< 3SS/S 9  [        RD                  " 5       n[        R
                  " U R                  [        US   S!   5      5      Ul        [        RF                  " U[        RH                  S5      US'   U RK                  US/S"U-  S#S$9(       a  U R                  S%U-  5        U RL                  R3                  U5        GM     U$ ! [        R                    aG  nUR"                  u  pU[        R$                  :X  a   SnAGNU R                  SU	-  5         SnA  gSnAff = f! [        R                    a6  n
U
R"                  u  pU R                  SU< SU< SU	< 35         Sn
A
  gSn
A
ff = f)&zXThis function only fixes conflicts on the Deleted Objects
containers, not the attributesr   r6   z=ERROR: NC %s lacks a reference to a Deleted Objects containerz-Fix missing Deleted Objects container for %s?r   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 %sr2   z7wellKnownObjects had duplicate Deleted Objects value %sz
objectGUID: %szB:32:%s:r0   r   dn: z
objectClass: top
objectClass: container
description: Container for deleted objects
isDeleted: TRUE
isCriticalSystemObject: TRUE
showInAdvancedViewOnly: TRUE
nTSecurityDescriptor:: z
systemFlags: -1946157056r   provision:0r   r   z"NC %s lacks Deleted Objects WKGUIDFvalidatezAdded %s well known guid link)'r   ry   r   confirm_allrr   rs   r>   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   r   r   r   r   r   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
domain_sidsec_descsec_desc_b64deltas                         r#   r   (dbcheck.check_deleted_objects_containers.  s    55B^^#1KKKWZ\\]##$SWY$Z\yzz

$89BKKOKjj''Rs~~R2[ ( \ s8q=q699;;FCD"%&&)G#diiX\oJ^)^#`K((, &JJ%%b7gh **##3>>+=*>.W $ XC 3x1}FKL a&+,CG"&!$**ahhv.>@Z@Z[--g66KK Y\] ]^ +2***K*KF*S's1v&  #.03tyyAT7U3VV&)O)OO
*b9:  "))$***C*C*EFJ4Z>BmmMH$X.55f=L JJ "$\;!@ +4])C   	E KKMEvvdjj#c!fTl*;<EH(+(:(:7;>;O;O;M)OE$%
 ~~ei[BRG',  . ;b@A++2226G 6J ] << !ww3111KK ^ae ef || #%77LTKKaceprv wxs7   B+O0=Q0Q"Q,QQR"+RRc                 >   U R                   (       a  gU R                  (       a  UR                  S5      (       a  [        S5      USS -   nOUR                  S5      (       a  [	        S5      USS -   nOUR                  S5      (       a  [        S5      USS -   nOwUR                  S5      (       a  [        S5      US	S -   nOOUR                  S
5      (       a  [        S
5      USS -   nO'UR                  S5      (       a  [        S5      USS -   n[        U5        g)z#print a message unless quiet is setNERROR   WARNING   INFO   NOTICE   NOTESKIPPING   )rD   rE   
startswithr   r   r   r   print)r   msgs     r#   r   dbcheck.report  s    ::;;~~g&&Gns12w.	**#I.QR8''!&)CG3))!(+c!"g5''!&)CG3
++":.QR8c
r   c                     U R                   (       d  gU R                  (       a  U R                  $ U R                  (       a  Sn[        R                  " XUS9$ )zconfirm a changeFTforced	allow_all)rB   rD   rC   r   confirm)r   r  r  r  s       r#   r  dbcheck.confirm  s9    xx::88O88F~~cIFFr   c                 "   U R                   (       d  g[        X5      S:X  a  g[        X5      S:X  a  SnOU R                  nU R                  (       a  U$ [        R
                  " XSS9nUS:X  a  [        XS5        gUS:X  a  [        XS5        gU$ )z(confirm a change with support for "all" FNONEALLTr  )rB   getattrrC   rD   r   r  setattr)r   r  all_attrr  cs        r#   r   dbcheck.confirm_all  s    xx4"f,4"e+FXXF::MNN3>:DE*;DF+r   c                 T   U R                   (       a  U R                  SU-  5         US[        R                  -  /-   nU R                  R                  XS9  g! [         aE  nU R                  (       a  [        U< SU< 35      eU R                  U< SU< 35         SnAgSnAff = f)z&delete dn with optional verbose outputzdelete DN %slocal_oid:%s:0r    : NFT)	rA   r   r   DSDB_CONTROL_DBCHECKr>   delete	Exceptionrq   r   )r   r   r   r  errs        r#   	do_deletedbcheck.do_delete  s    <<KK+,	#3d6O6O#O"PPHJJb4   	"""S#9::KKS#./		s   0A 
B'";B""B'c                    US[         R                  -  /-   nU R                  (       aM  U R                  U R                  R                  U[        R                  5      5        U R                  SU-  5         U R                  R                  XUS9  g! [         aE  nU R                  (       a  [        U< SU< 35      eU R                  U< SU< 35         SnAgSnAff = f)z-perform a modify with optional verbose outputr  zcontrols: %r)r   r   r   NFT)r   r!  rA   r   r>   
write_ldifrr   CHANGETYPE_MODIFYmodifyr#  rq   r   )r   mr   r  r   r$  s         r#   r   dbcheck.do_modify  s    /$2K2KKLL<<KK

--a1F1FGHKK12	JJaXF   	"""S#9::KKS#./		s   7B 
C!;CC!c           
         U R                   (       a8  U R                  S[        U5      < S[        U5      < S[        U5      < 35         X#-   nUS[        R                  -  /-   nU R
                  R                  XUS9  g	! [         aE  nU R                  (       a  [        U< SU< 35      eU R                  U< SU< 35         SnAgSnAff = f)
z-perform a rename with optional verbose outputr   z
changeType: modrdn
newrdn: z
deleteOldRdn: 1
newSuperior: r  r   r   NFT)
rA   r   r   r   r!  r>   r   r#  rq   r   )r   from_dnto_rdnto_baser   r  to_dnr$  s           r#   	do_renamedbcheck.do_rename  s    <<KK 'lCKW	? @
	$E#3d6O6O#O"PPHJJgx@   	"""S#9::KKS#./		s   5B 
C;CCc                     XR                   ;   a  U R                   U   $ U R                  R                  U5      nU(       a  U R                  R                  U5      nOS nX#4U R                   U'   X#4$ r   )r   r@   get_linkId_from_lDAPDisplayName!get_backlink_from_lDAPDisplayName)r   attrnamelinkIDrevnames       r#    get_attr_linkID_and_reverse_name(dbcheck.get_attr_linkID_and_reverse_name  sn    )))%%h//""BB8L''II(SGG(.'88$r   c                    U R                  SU< SU< 35        U R                  SU< SU< S3S5      (       d  U R                  SU-  5        g[        R                  " 5       nXl        [        R
                  " S	[        R                  U5      X2'   U R                  US
S/SU-  SS9(       a  U R                  SU-  5        gg)zfix empty attributeszERROR: Empty attribute  in zRemove empty attribute  from ?rG   zNot fixing empty attribute %sNr0   r   r   z#Failed to remove empty attribute %sFr   zRemoved empty attribute %s)r   r   rr   r   r   r   FLAG_MOD_DELETEr   )r   r   r7  r+  s       r#   err_empty_attributedbcheck.err_empty_attribute	  s    2FGRT UWtuuKK7(BCKKM((S-@-@(K>>!i):;?(JUZ  \KK4x?@\r   c                    U R                  SU< SU< 35        / nU H  nU R                  R                  U R                  X%/5      n[	        U5      S:w  a)  U R                  SU-  5        UR                  US45        Mb  US   U:w  d  Mm  U R                  SU< SUS   < S	35        UR                  XVS   45        M     U R                  S
U< SU< S3S5      (       d  U R                  SU-  5        g[        R                  " 5       nXl	        [        S[	        U5      5       Hi  nXH   u  pY[        R                  " U[        R                  U5      USU-  '   U	S:w  d  M=  [        R                  " U	[        R                  U5      USU-  '   Mk     U R                  USS/SU-  SS9(       a  U R                  SU-  5        gg)z?fix attribute normalisation errors, without altering sort orderz)ERROR: Normalisation error for attribute r=  r6   zUnable to normalise value '%s'r0   r   zvalue 'z' should be ''zFix normalisation for r>  r?  rH   zNot fixing attribute %sNzvalue_%uznormv_%ur   r    Failed to normalise attribute %sFr   Normalised attribute %s)r   r>   dsdb_normalise_attributesr@   r   r   r   rr   r   r   ranger   r@  FLAG_MOD_ADDr   )
r   r   r7  valuesmod_listval
normalisedr+  invals
             r#   err_normalise_mismatchdbcheck.err_normalise_mismatch  s   8UWXYC==!!8U4J:!#<sBCb	*Q-3&3
1NOm 45  xQS TVmnnKK1H<=KKMq#h-(A"+KS # 2 238K8KX VAj1nrz$'$6$6tS=M=M7?%A*q.!	 ) >>!i):;<xG#(  * KK1H<=*r   c                 <   U R                   R                  U R                  X#5      n[        U5      U:X  a  gU R	                  SU< SU< S35        U R	                  SU< S[        U5      < S35        U R                  SU< S	U< S
3S5      (       d  U R	                  SU-  5        g[        R                  " 5       nXl        [        R                  " U[        R                  U5      XR'   U R                  USS/SU-  SS9(       a  U R	                  SU-  5        gg)z.fix attribute normalisation and/or sort errorsNz*ERROR: Normalisation error for attribute '' in 'rD  z*Values/Order of values do/does not match: /!zFix normalisation for '' from ''?rH   Not fixing attribute '%s'r   r   rE  Fr   rF  )r>   rG  r@   listr   r   rr   r   r   r   r   r   )r   r   r7  rJ  rM  r+  s         r#   err_normalise_mismatch_replace&dbcheck.err_normalise_mismatch_replace6  s    ZZ99$:K:KX^

v%xY[\]&RVWaRbcd8UW XZqrrKK3h>?KKM((S5I5I8T>>!i):;<xG#(  * KK1H<=*r   c                    U R                  SU< SU< S35        U R                  S[        U5      < S[        U5      < S35        U R                  SU< SU< S	3S
5      (       d  U R                  SU-  5        g[        R                  " 5       nXl        [        R                  " U[        R                  U5      XR'   U R                  USS/SU-  SS9(       a  U R                  SU-  5        gg)zfix duplicate attribute valuesz'ERROR: Duplicate values for attribute 'rS  rD  zValues contain a duplicate: [z]/[z]!zFix duplicates for 'rV  rW  rI   rX  Nr   r   z0Failed to remove duplicate value on attribute %sFr   z'Removed duplicate value on attribute %s)	r   r$   r   rr   r   r   r   r   r   )r   r   r7  
dup_valuesrJ  r+  s         r#   err_duplicate_valuesdbcheck.err_duplicate_valuesK  s    HVXYZ%j13CF3KM 	NRT UWkllKK3h>?KKM((1E1ExP>>!i):;LxW#(  * KKAHLM*r   c                 B    UR                   S[        R                  -  :H  $ )z2see if a dsdb_Dn is the special Deleted Objects DNzB:32:%s:)prefixr   r   )r   r   s     r#   r   dbcheck.is_deleted_objects_dn]  s    ~~d.T.T!TTTr   c                 *   U R                  SU< SU R                  R                  U5      < S35        U R                  SU-  S5      (       d  U R                  SU-  5        gU R	                  US/S	U-  5      (       a  U R                  S
U-  5        gg)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> rD  zIIf you cannot re-sync from another DC, do you wish to delete object '%s'?r   z1Not deleting object with missing objectclass '%s'Nr   Failed to remove DN %sRemoved DN %s)r   r>   get_nc_rootr   r%  r   r   s     r#   err_missing_objectclassdbcheck.err_missing_objectclassa  s      |~  @D  @J  @J  @V  @V  WY  @Z  [  	\ knp p  sP  Q  QKKKbPQ>>"yk2R79 9KK",-9r   c                    U(       dd  U R                  SU< SU< SU< 35        U R                  S[        U5      -  5        U R                  SS5      (       d  U R                  S5        gOcU R                  S	U< SU< SU< 35        U R                  S[        U5      -  5        U R                  S
S5      (       d  U R                  S5        g[        R                  " 5       nXl        [        R                  " U[        R                  U5      US'   U R                  USS[        R                  -  /SU-  5      (       a  U R                  SU-  5        gg)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?rL   zNot removingNz"WARNING: target DN is deleted for zRemove stale DN link?rM   	old_valuer   r  z(Failed to remove deleted DN attribute %sz"Removed deleted DN on attribute %s)r   r   r   rr   r   r   r   r@  r   r    DSDB_CONTROL_REPLMD_VANISH_LINKS)r   r   r7  rL  r   
correct_dnremove_plausibler+  s           r#   err_deleted_dndbcheck.err_deleted_dnk  s)   KKRZ\^`cdeKK=JOP##$57\]]N+ ^ KKT\^`befgKK=JOP##$;=`aaN+KKM++C1D1DhO+>>!/.1V1VVXDxOQ Q KK<xGHQr   c           
      ^   [        U5      R                  S5      S:w  a/  U R                  SU< SU< SU< 35        U R                  S5        gU R                  U5      u  pVUS-  S:X  GaK  [        U5      R                  S5      S:X  Ga,  U R                  U5      u  pWUb/  U R                  S
U< SU< SU< 35        U R                  S5        gU R                  R                  U5      n U R                  R                  UR                  5      n	U	c=  U R                  SU< SUR                  < SU< SU< 35        U R                  S5        gX:w  a/  U R                  SU< SU< SU< 35        U R                  S5        gU R                  SU< SU< SU< 35        U R                  XUXDS5        gU R                  SU< SU< SU< 35        U R                  XX4US5        g! [        R                   a0  n
U
R                  u  pU[        R                  :w  a  e S	n	 S	n
A
GNS	n
A
ff = f)zphandle 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 rl  z`Not removing dangling one-way link on deleted object (tombstone garbage collection in progress?)r   r6   NzLWARNING: no target object found for GUID component for one-way forward link rk  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:  r>   rf  r   rr   r   r   r   rq  )r   r   r7  rL  r   r8  _reverse_link_namer   target_nc_rooter   r   s                r#   err_missing_target_dn_or_GUID%dbcheck.err_missing_target_dn_or_GUID  s   
 r7<<	"b( KK%-r38 9 KK F G  99(C	QJ!OW!2!29!=!C 77A &F , *22s< = @Ajj,,R0G&!%!7!7

!C %  *27::r3H I  J K (  *22s< =  < =  KK%-r38 9 c '$8 	!)2s4 	5 	B#Ge << & vv3111!%	&s   +%G( (H,<%H''H,c           
      8   U R                  SU< SU< SU< SU< 35        SS/n U R                  R                  [        UR                  5      [
        R                  / US9n[        U5      S:X  a1  U R                  SUR                  -  5        U R                  XX45        gUS   R                  Ul        U R                  S[        U5      -  S5      (       d  U R                  SU-  5        g[
        R                  " 5       nXl        [
        R                  " U[
        R                  U5      US'   [
        R                  " [        U5      [
        R                   U5      US'   U R#                  US/SU< SU< 35      (       a  U R                  SU< SU< 35        gg! [
        R                   ac  nUR                  u  pU R                  SUR                  < S	U
< S
35        U	[
        R                  :w  a  e U R                  XX45         SnAgSnAff = f)z+handle a missing GUID extended DN componentERROR:  component for rk  rl  r   r   r   zunable to find object for DN z - ()Nr   zunable to find object for DN %sChange DN to %s?rJ   Not fixing %srm  	new_valueFailed to fix  on attribute Fixed )r   r>   r   r   r   rr   r   r   r   r   rz  r   r   r   r   r@  rI  r   )r   r   r7  rL  r   errstrr   r   e7r   r   r+  s               r#   err_missing_dn_GUID_component%dbcheck.err_missing_dn_GUID_component  s   fhXZ\_`a%'89		**##WZZ*,x $ AC s8q=KK9GJJFG..rSJVYY
 2S\ ACUVVKK&01KKM++C1D1DhO+++CL#:J:JHU+>>!/0@FQS SKKfhGHS+ || 	77LTKKGJJPTUVs---..rSJ	s   =F" "H6AHHc           
         U R                  SU< SU< SU< SU< 35        U R                  S[        U5      -  S5      (       d  U R                  SU-  5        g[        R                  " 5       nXl        [        R                  " U[        R                  U5      US	'   [        R                  " [        U5      [        R                  U5      US
'   U R                  US/SU< SU< 35      (       a  U R                  SU< SU< 35        gg)z'handle an incorrect binary DN componentr}  z binary component for rk  rl  r  rK   r  Nrm  r  r   r  r  r  )
r   r   r   rr   r   r   r   r@  rI  r   )r   r   r7  rL  r   r  r+  s          r#   err_incorrect_binary_dndbcheck.err_incorrect_binary_dn  s    VU]_acfgh 2S\ ACVWWKK&01KKM++C1D1DhO+++CL#:J:JHU+>>!/0@FQS SKKfhGHSr   c                 &   U R                  SU< SU< SU< 35        XTl        U R                  S[        U5      -  S5      (       d  U R                  S5        g[        R
                  " 5       nXl        [        R                  " U[        R                  U5      US'   [        R                  " [        U5      [        R                  U5      US	'   U R                  US
S[        R                  -  /SU-  5      (       a  U R                  SU-  5        gg)z<handle a DN string being incorrect due to a rename or deletez<NOTE: old (due to rename or delete) DN string component for rk  rl  r  rR   zNot fixing old string componentNrm  r  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   rr   r   r   r@  rI  r   r   %DSDB_CONTROL_DBCHECK_FIX_LINK_DN_NAME)r   r   r7  rL  r   ro  r+  s          r#   err_dn_string_component_old#dbcheck.err_dn_string_component_old  s    jrtvx{|}
 2S\ A JL LKK9:KKM++C1D1DhO+++CL#:J:JHU+>>!/.1[1[[]G8TV V KK=JKVr   c           
      *   U R                  SU< SU< SU< SU< 35        XTl        U R                  S[        U5      -  SU-  5      (       d  U R                  SU-  5        g[        R
                  " 5       nXl        [        R                  " U[        R                  U5      US	'   [        R                  " [        U5      [        R                  U5      US
'   U R                  US/SU< SU< 35      (       a  U R                  SU< SU< 35        gg)z"handle a DN string being incorrectzERROR: incorrect DN r~  rk  rl  r  z fix_all_%s_dn_component_mismatchz Not fixing %s component mismatchNrm  r  r   zFailed to fix incorrect DN r  zFixed incorrect DN )
r   r   r   r   rr   r   r   r@  rI  r   )r   r   r7  rL  r   ro  mismatch_typer+  s           r#    err_dn_component_target_mismatch(dbcheck.err_dn_component_target_mismatch  s    S`bjlnpstu
 2S\ A B] RT TKK:]JKKKM++C1D1DhO+++CL#:J:JHU+>>!/0MZ\deg gKK=RZ[\gr   c                 v   U R                  SU< SU< SU< 35        [        UR                  5      S:w  a  U R                  S5        g[        R                  " U R
                  UR                  R                  5       5      nUR                  SU5        U R                  SUR                  5       -  S	5      (       d  U R                  S
5        gUR                  S5      n[        R                  " U R
                  S5      nUR                  SU5        UR                  SU5        [        R                  " 5       n	Xl        [        R                  " UR                  5       [        R                  U5      U	S'   SS[        R                  -  /n
U R!                  XSU-  5      (       a  U R                  SU-  5        gg)z*fix missing <SID=...> on linked attributesz$ERROR: missing DN SID component for rk  rl  r   z3Not fixing missing DN SID on DN+BINARY or DN+STRINGNSIDr  rQ   z#Not fixing missing DN SID componentr   r0   r  r   r  z,Failed to ADD missing DN SID on attribute %sz$Fixed missing DN SID on attribute %s)r   r   ra  rr   rs   r>   r   extended_strset_extended_componentr   r   r   r   rI  r   $DSDB_CONTROL_DBCHECK_FIX_LINK_DN_SIDr   )r   r   r7  rL  r   target_sid_blobro  target_guid_blobguid_sid_dnr+  r   s              r#   #err_dn_component_missing_target_sid+dbcheck.err_dn_component_missing_target_sid*  sp   RZ\^`cdew~~!#KKMNVVDJJ

(?(?(AB
))%A 2Z5L5L5N N BD DKK=>%<<VDffTZZ,**63CD**5/BKKM++K,D,D,FHXHXZbc+tHHH
 >>!HHUW WKK>(KLWr   c                    U R                  SU< SUR                  < 35        U R                  SU-  S5      (       d  U R                  SU-  5        g[        R                  " 5       nUR                  Ul        [        R
                  " / [        R                  U5      US'   U R                  USS	/S
U-  5      (       a  U R                  SU-  5        gg)z!handle an unknown attribute errorzERROR: unknown attribute '' in zRemove unknown attribute %srF   zNot removing %sNrm  r   r   z%Failed to remove unknown attribute %szRemoved unknown attribute %s)r   r   r   rr   r   r   r@  r   )r   objr7  r+  s       r#   err_unknown_attributedbcheck.err_unknown_attributeJ  s    XsvvNO = HJijjKK)H45KKMvv++B0C0CXN+>>!i):;AHLN NKK6(CDNr   c                    U R                  SU< SU< SUR                  < 35        U R                  SU-  S5      (       d  U R                  SU-  5        g[        R                  " 5       nUR                  Ul        [        R
                  " U[        R                  U5      US'   U R                  US	S
SS[        R                  -  /SU-  5      (       a  U R                  SU-  5        gg)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 %srU   z Not removing linked attribute %sNrm  r   r   r   r  z Failed to delete forward link %szFixed undead forward link %s)
r   r   r   rr   r   r   r@  r   r   rn  )r   r  r7  rL  r+  s        r#   err_undead_linked_attribute#dbcheck.err_undead_linked_attributeW  s    +3S#&&B 	C <x GIghhKK:XEFKKMvv++C1D1DhO+>>!/1ACW.1V1VVX<xGI I KK6(CDIr   c           
         U R                  SU< SU< SU< SUR                  < 35        U R                  SU-  S5      (       d  U R                  SU-  5        g[        R                  " 5       nXVl        [        R
                  " U[        R                  U5      US	'   U R                  US
S/SU-  5      (       a  U R                  SU-  5        gg)zhandle a missing backlink valuez#ERROR: missing backlink attribute 'r  
 for link r=  zFix missing backlink %srV   zNot fixing missing backlink %sNr  r   r   z!Failed to fix missing backlink %szFixed missing backlink %s)r   r   r   rr   r   r   rI  r   )r   r  r7  rL  backlink_name	target_dnr+  s          r#   err_missing_backlinkdbcheck.err_missing_backlinkg  s    Xegprz|  }C  }C  D  	E 9M IKfggKK8=HIKKM++C1A1A=Q+>>!/;=MO OKK3}EFOr   c                 0   [        UR                  R                  S5      5      nU R                  SXBUR                  UR                  R	                  5       4-  5        U R                  SU-  S5      (       d  U R                  SU-  5        g[        R                  " 5       nUR                  Ul        [        R                  " [        U5      [        R                  U5      US'   U R                  U/ SQS	U-  5      (       a  U R                  S
U-  5        gg)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 %ur\   z!Not fixing incorrect RMD_FLAGS %uNrm  )r   r   show_deleted:0z$Failed to fix incorrect RMD_FLAGS %uzFixed incorrect RMD_FLAGS %u)r   r   r   r   r  r   rr   r   r   r   r@  r   )r   r  r7  revealed_dn	rmd_flagsr+  s         r#   err_incorrect_rmd_flagsdbcheck.err_incorrect_rmd_flagst  s   ==kJK	^bkwzw}w}  @K  @N  @N  @[  @[  @]  b^  ^  	_ <y H/ZZKK;iGHKKMvv++C,<c>Q>QS[\+>>!X@9LN NKK6)DENr   c                    USL a=  U R                  XEU5      (       a&  U R                  SSU< SU< SU< SU< S3	-   5        gU R                  SU< SU< S	U< S
U< 35        U R                  SU-  S5      (       d  U R                  SU-  5        g[        R                  " 5       nXl        [        R                  " U[        R                  U5      US'   U R                  USS/SU-  5      (       a  U R                  SU-  5        gg)z handle a orphaned backlink valueTz*WARNING: Keep orphaned backlink attribute rD  rS  z' for link 'Nz$ERROR: orphaned backlink attribute 'r  r  r=  zRemove orphaned backlink %srW   z!Not removing orphaned backlink %sr"   r   r   z"Failed to fix orphaned backlink %szFixed orphaned backlink %s)	has_duplicate_linksr   r   rr   r   r   r   r@  r   )	r   obj_dnbacklink_attrbacklink_valr  forward_attrforward_syntaxcheck_duplicatesr+  s	            r#   err_orphaned_backlinkdbcheck.err_orphaned_backlink  s    t#(@(@Zh(i(iKKD)6<LL M Yfhnp|  H  I  	J = MOkllKK;mKLKKM''c6I6I=Y'
>>!/;>NP PKK4FGPr   c                 d   U R                  SU< SUR                  < S35        U R                  SU-  S5      (       d%  U R                  SU< SUR                  < S35        g[        R                  " 5       nUR                  Ul        [        R
                  " U[        R                  U5      US	'   U R                  US
[        R                  -  /SU-  5      (       aQ  U R                  SU-  5        [        UR                  5      < SU< 3nXPR                  ;   d   eSU R                  U'   gg)zhandle a duplicate links valuezERECHECK: 'Missing/Duplicate/Correct link' lines above for attribute 'rS  rD  zDCommit fixes for (missing/duplicate) forward links in attribute '%s'r[   zENot fixing corrupted (missing/duplicate) forward links in attribute '' of 'Nr"   r  z/Failed to fix duplicate links in attribute '%s'z'Fixed duplicate links in attribute '%s'r   F)r   r   r   rr   r   r   r   r   r   (DSDB_CONTROL_DBCHECK_FIX_DUPLICATE_LINKSr   rZ   )r   r  r  forward_valsr+  duplicate_cache_keys         r#   err_recover_forward_links!dbcheck.err_recover_forward_links  s    	jvx{x~x~  	A fiu u  xS  T  TKK$cff. /KKMvv''c6J6JLY'
>>!.1^1^^_KlZ\ \KKA\RS-0[,"G&*C*CCCC=BD%%&9:\r   c                    U R                  SUR                  -  5        U R                  R                  S[        R
                  S/S9n[        U5      S:X  d   e[        US   S   S   5      nU R                  SUR                  < SU< 3S	5      (       d$  U R                  S
UR                  < SU< 35        g[        R                  " 5       nUR                  Ul        [        R                  " U[        R                  S5      US'   U R                  U/ SUR                  < SU< 35      (       a$  U R                  SUR                  < SU< 35        gg)zhandle a missing fSMORoleOwnerz*ERROR: fSMORoleOwner not found for role %sr0   dsServiceName)r,   r-   r6   r   zSeize role z) onto current DC by adding fSMORoleOwner=r_   zNot Seizing role NfSMORoleOwnerr"   zFailed to seize role zSeized role )r   r   r>   r   rr   r   r   r   r   r   r   rI  r   )r   r  r   serviceNamer+  s        r#   err_no_fsmoRoleOwnerdbcheck.err_no_fsmoRoleOwner  s(   @CFFKLjj&)nn_<M   O3x1}}#a&1!45^a^d^dfq r  uF  G  GKK\_\b\bdopqKKMvv''S5E5EW'
>>!Rbebhbhjuvx xKKWZW]W]_jklxr   c                    U R                  SUR                  -  5        U R                  SUR                  -  S5      (       d  U R                  SUR                  -  5        gSnU R                  R	                  5          U R                  R                  UR                  5      nU R                  U[        R                  5      n[        R                  " U R                  [        UR                  5      5      nUR                  [        U5      S-
  5        U R                  UR                  XTSS	/S
UR                  < SXT-   < 35      (       a  U R                  SUR                  < SXT-   < 35        [        R                  " 5       nUR                  Ul        [        R                   " [        UR                  R#                  5       5      [        R$                  S5      US'   U R'                  U/ SXT-   -  5      (       a  U R                  SXT-   -  5        SnU(       a  U R                  R+                  5         gU R                  R)                  5         g!   U R                  R)                  5         e = f)zhandle a missing parentz%ERROR: parent object not found for %sz!Move object %s into LostAndFound?r`   z&Not moving object %s into LostAndFoundNFr6   r  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   r>   transaction_startrf  r   r   DS_GUID_LOSTANDFOUND_CONTAINERrr   rs   r   remove_base_componentsr   r2  r   r   parentr   r   transaction_canceltransaction_commit)r   r  keep_transactionr   lost_and_foundnew_dnr+  s          r#   err_missing_parentdbcheck.err_missing_parent  s   ;svvFG Csvv NPhiiKK@CFFKL 

$$&	jj,,SVV4G!99'4CfCfgNVVDJJCFF4F))#f+/:~~cfff?OQZ>[VYV\V\^d^uvx x366SYSjklKKMvv'*'9'9#cffmmo:NPSPdPdfw'x#$>>!R"^bhby"z| |KK RV\Vm no'+$
 JJ))+JJ))+	JJ))+s   ?FI I2c           
         [         R                  " U R                  [        U5      5      nUR	                  [        U5      S-
  5        UR                  5       nSn	XE:w  a  X< SU< S3-  n	U	SU-  -  n	U R                  SUR                  < SU	< SU< S	35        U R                  S
UR                  < SU< S3S5      (       d$  U R                  SUR                  < SU< 35        gU R                  UR                  XxUSUR                  < SU< 35      (       a$  U R                  SUR                  < SU< 35        gg)zhandle a wrong dnr6   r0   = zname=%rzERROR: wrong dn[z] z new_dn[]zRename r   r?  rg   zNot renaming Nr  z into zRenamed )rr   rs   r>   r   r  r   r  r   r   r   r2  )
r   r  r  rdn_attrrdn_valname_valr   new_rdn
new_parent
attributess
             r#   err_wrong_dndbcheck.err_wrong_dn  s     &&S[1&&s7|a'78]]_

h88Ji8,,
366:vVWcfff ExPPKK3666BC>>#&&'xBE&&&QS SKK?@Sr   c                 J   U R                  SUS   UR                  U4-  5        U R                  SUS   X!R                  4-  S5      (       d$  U R                  SUS   X!R                  4-  5        g[        R                  " 5       nUR                  Ul        [        R
                  " [        U5      [        R                  S5      US'   U R                  US[        R                  -  /S	UR                  U4-  5      (       a!  U R                  S
UR                  U4-  5        gg)zhandle a wrong instanceTypez0ERROR: wrong instanceType %s on %s, should be %dinstanceTypez(Change instanceType from %s to %d on %s?ra   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   rr   r   r   r   r   r   r   &DSDB_CONTROL_DBCHECK_MODIFY_RO_REPLICA)r   r  calculated_instancetyper+  s       r#   err_wrong_instancetypedbcheck.err_wrong_instancetype  sF   F#nJ]_b_e_eg~I  	A JcR`Nacz  }C  }C  ND  !D  FX  Y  YKKG3~K^`wyy  KA  A  BKKMvv'',C(DcFZFZ\jk'
>>!.1\1\\]cgjgmgm  pG  gH  HI IKKQUXU[U[]tTuuvIr   c                     U R                  SUR                  < SU R                  R                  UR                  5      < S35        g )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> rD  r   r   r>   rf  )r   r  r7  r"   s       r#   err_short_userParameters dbcheck.err_short_userParameters   si      gj  gm  gm  os  oy  oy  oE  oE  FI  FL  FL  oM  N  	Or   c                    U R                  SU< SUR                  < S35        U R                  SUR                  -  S5      (       d  U R                  SUR                  -  5        g[        R                  " 5       nUR                  Ul        [        R
                  " [        X   S   5      [        R                  S	5      US
'   U R                  U/ SUR                  -  5      (       a  U R                  SUR                  -  5        gg)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?rh   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   rr   r   r   r   r   r   r   r  r7  r"   r+  s        r#   err_base64_userParameters!dbcheck.err_base64_userParameters  s    hmorououvw TX[X^X^ _a|}}KKPTWTZTZ[\KKMvv''	#-2B(CSEYEY[kl'
>>!Rkorououvx xKKaehekeklmxr   c                 2   U R                  SUR                  -  5        U R                  SUR                  -  S5      (       d  U R                  SUR                  -  5        g[        R                  " 5       nUR                  Ul        [        R
                  " X   S   R                  S5      R                  S5      [        R                  S	5      US
'   U R                  U/ SUR                  -  5      (       a  U R                  SUR                  -  5        gg)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?ri   z4Not changing userParameters from UTF8 encoding on %sNr   r2   	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   rr   r   r   r   encoder   r   r  s        r#   err_utf8_userParametersdbcheck.err_utf8_userParameters  s     8;>66C 	D RVYV\V\ ]_xyyKKNRURXRXYZKKMvv''a(8(?(?(G(N(N{([(+(<(<>NP'
>>!Rmqtqwqwxz zKKcgjgmgmnozr   c                 2   U R                  SUR                  -  5        U R                  SUR                  -  S5      (       d  U R                  SUR                  -  5        g[        R                  " 5       nUR                  Ul        [        R
                  " X   S   R                  S5      R                  S5      [        R                  S	5      US
'   U R                  U/ SUR                  -  5      (       a  U R                  SUR                  -  5        gg)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?rj   z>Not changing userParameters from doubled UTF-16 encoding on %sNr   r  r2   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_userParameters"dbcheck.err_doubled_userParameters"  s   gknkqkqrs \`c`f`f g  jF  G  GKKX\_\b\bcdKKMvv ''a(8(?(?(L(S(STZ([(+(<(<>NP'
 >>!Rfjmjpjpqs sKK\`c`f`fghsr   c                     U R                  SUR                  < SU R                  R                  UR                  5      < S35        g)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> rD  Nr  )r   r  r7  s      r#   err_odd_userParametersdbcheck.err_odd_userParameters<  si      tw  tz  tz  |@  |F  |F  |R  |R  SV  SY  SY  |Z  [  	\r   c                 F   U R                   R                  U[        R                  U// SQS9nU R                  R                  U5      nUS   U    HM  n[        U R                   UR                  S5      U5      nUR                  R                  S5      nX8:X  d  MK  Us  $    g)z#return a revealed link in an object)r  r   r   r   r   r2   r   N)
r>   r   rr   r   r@   #get_syntax_oid_from_lDAPDisplayNamer   r   r   r   )	r   r   r7  r   r   
syntax_oidrL  r   guid2s	            r#   find_revealed_linkdbcheck.find_revealed_link@  s    jjRs~~hZ)b   d&&JJ8T
q6(#Cdjj#**V*<jIGJJ55f=E}	 $
 r   c                    Sn[        5       n[        5       nUS-  (       a  XgU4$ Uc  XgU4$ [        UR                  5      < SU< 3n	XR                  ;  a  SU R                  U	'   X    GH  n
[	        U R
                  U
R                  S5      U5      nUR                  R                  S5      nUc  MJ  [        [        R                  " U5      5      nXR                  -   nX;  a  XU'   M  US-  nX;  a"  [        5       X~'   SX~   S'   [        5       X~   S	'   [        X   R                  R                  S
5      5      n[        UR                  R                  S
5      5      nUU:  a"  X   X~   S'   X~   S	   R                  U5        GM   UU:  a&  XU   S'   X~   S	   R                  X   5        XU'   GML  [        X   R                  R                  S5      5      n[        UR                  R                  S5      5      nUU:  a"  X   X~   S'   X~   S	   R                  U5        GM  XU   S'   X~   S	   R                  X   5        XU'   GM     US:w  a  SU R                  U	'   XgU4$ )1check a linked values for duplicate forward linksr   r6   Nr   Fr2   r   keepr"  RMD_VERSIONRMD_LOCAL_USNT)rY   r   r   rZ   r   r>   r   r   r   r   ra  rY  r   r   )r   r  r  r  forward_linkIDr  r   duplicate_dictunique_dictr  rL  r   r   guidstrkeystrv1v2u1u2s                      r#   check_duplicate_linksdbcheck.check_duplicate_linksL  st   f A== ==),SVVlC&?&??=BD%%&9:$Cdjj#**V*<nMG ::44V<D|$))D/*G~~-F(&-F#1K+)-&15&v.376&x0 [(++BB=QRBWZZ66}EFBBw1<1D&v.&x077@Bw18v&v.&x0778KL&-F#[(++BB?STBWZZ66GHBRx1<1D&v.&x077@-46"6*"8,33K4GH")O %R !=AD%%&9:[99r   c                    Sn[        U5      < SU< 3nXPR                  ;   a  U R                  U   $ U R                  U5      u  pgU/nSS/n	 U R                  R	                  [        U5      [
        R                  XS9n
U
S   nU R                  XX6U5      u  pOnXPR                  ;   a  U R                  U   $ g! [
        R                   a-  nUR                  u  pU[
        R                  :w  a  e  SnAgSnAff = f)r
  r   r   r   r   r   NF)r   rZ   r:  r>   r   rr   r   r   r   r   r  )r   r   r  r  r   r  r  r  r-   r   r   e8r   r   r  r  r  s                    r#   r  dbcheck.has_duplicate_links  s   ),R,?";";;,,-@AA(,(M(Ml([%%';<	**##R*/ $ DC !f&&s.Zgh 	1[ ";";;,,-@AA || 	77LTs---	s   2B: :C;#C66C;c                 8   / nSnUc  Xg4$ U[         R                  :w  a  U R                  SU-  5        Xg4$ SU R                  ;   a  U R                  S5        Xg4$  US   S   n[	        [        [        R                  U5      5      n	SU< SU	< S	3n
U R                  R                  U
[         R                  S// S
QS9nU GH)  n[        U R                  UR                  R                  5       U5      nUR                  R!                  S5      n[	        [        R                  " U5      5      nUU;   a  Mu  [        ["        R$                  US   S   5      nUR&                  R(                   H;  nUR*                  nUR,                  nUR.                  [0        R2                  :X  d  M;    O   [        R                  " S5      nSnWnUnSnUnUnWnSnUR                  R5                  S[	        U5      5        UR                  R5                  S[	        U5      5        UR                  R5                  S[	        U5      5        UR                  R5                  S[7        U5      5        UR                  R5                  S[	        U5      5        UR                  R5                  S[	        U5      5        UR                  R5                  S[	        U5      5        US-  nUR9                  U5        GM,     Xg4$ ! [         R                   a  nUR                  u  pe SnAff = f)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)r5   r,   r-   r   r   replPropertyMetadataz$ffffffff-4700-4700-4700-000000b13228r6   RMD_ADDTIMERMD_CHANGETIMEr  RMD_INVOCIDRMD_ORIGINATING_USNr  r  )rr   	SYNTAX_DNr   r<   r   r	   r   r   r>   r   SCOPE_SUBTREEr   r   r   r   r  r   r   replPropertyMetaDataBlobctrarray	local_usnoriginating_change_timeattidr   DRSUAPI_ATTID_objectClassr  r
   r   ) r   r  r  r  r  forward_unique_dictmissing_forward_linksr   obj_guidobj_guid_strfilterr   e9r   r   rr  r   r  replr   r+  toriginating_invocidoriginating_usnrmd_addtimermd_changetimer  rmd_invocidrmd_originating_usnrmd_local_usnrmd_versions                                    r#   )find_missing_forward_links_from_backlinks1dbcheck.find_missing_forward_links_from_backlinks  s    !# )77S]]*KKO&' ()77D333KK 6 7)77	<(+Hz$))X>?L)6EF**##v*-*;*;L>.F $ GC A

ADD,=,=,?PI<<66v>D$))D/*G--( h??!"89!<>DXX^^KK	--77g???	 $ #')),R"SOKNI-K"1%MKLL//s;?OPLL//0@#nBUVLL//S^LLL//x?TULL//0EsK^G_`LL//]ASTLL//s;?OP1K!((3} @ &33I || 	77LT	s   A#K1 1LLLc                    SnUS   S   nU R                  U5      u  pgUb  U R                  R                  U5      nOSnUS;   n	U	(       a  U R                  (       a  0 n
OU R	                  XUXg5      u  pJn[        U
5      S:w  Ga  U R                  UX#UW5      u  pXM-  nUR                  5        Vs/ s H  oPM     nnUS:w  a%  U R                  SU< SUR                  < S35        O$U R                  SU< SUR                  < S35        U Hy  nU R                  S	U-  5        U R                  S
U-  S5      (       dB  U R                  UR                  UUR                  R                  5       UR                  X#SS9  Ms  UU/-  nM{     U
R                  5        H?  nU
U   nUS    H  nU R                  SU-  5        M     U R                  SUS   -  5        MA     [        U5       Vs/ s H  n[        U5      PM     nnU R!                  XU5        ["        R$                  " USU5      X'   X    G	HT  n['        U R(                  UR+                  S5      U5      nUR                  R-                  S5      nUc&  US-  nU R/                  UR                  UUUS5        Mn  [        [0        R2                  " U5      5      nSS/n[        U5      R5                  5       S:X  a.  UR                  U R6                  :X  a  SnUR9                  S5        OSnUb  UR9                  U5         U R(                  R;                  SU-  ["        R<                  U/ SQS9nU(       aw  S[G        US   S   S   5      -  Ul$        S[G        US   S   S   5      -  Ul%        [        U5      [        U5      :w  a'  US-  nU RM                  UR                  UUUS 5        GM  SU;   =(       a"    [        US   S   5      RO                  5       S!:H  nSUS   ;   =(       a%    [        US   S   S   5      RO                  5       S!:H  n U(       a;  UR                  U RP                  ;  a!  U(       a  U RS                  XU5        US-  nGMD  U (       Ga7  U RU                  U5      (       Gd   U(       Ga  US-  nUR                  R-                  S"5      n!U!(       a  SUS   ;   a  [W        [X        RZ                  US   S#   S   5      n"Sn#U"R\                  R^                   HB  n$U$R`                  [b        Rd                  :X  d  M#  U$Rf                  n%U%[G        U!5      :  d  M@  Sn#  O   U#(       a0  U Ri                  UR                  UUUUS   R                  S5        GMS  U Ri                  UR                  UUUUS   R                  S5        GM  UR                  R-                  S$5      n&Sn'U&b  [G        U&5      n'U'S-  (       dg  Ubd  [        US   R                  5      [        UR                  5      :w  a5  US-  nU Rk                  UR                  UUUUS   R                  S%5        GM  US   R                  R-                  S5      UR                  R-                  S5      :w  a5  US-  nU Rk                  UR                  UUUUS   R                  S5        GM  US   R                  R-                  S&5      n(UR                  R-                  S&5      n)U)c*  U(b'  US-  nU Rm                  UR                  UUUU(5        GM  U)U(:w  a5  US-  nU Rk                  UR                  UUUUS   R                  S&5        GM0  Uc  US:X  a  [        US   R                  5      [        UR                  5      :w  aS  URH                  UR                  Ro                  5       -   n*U Rq                  UR                  UU*UUS   R                  5        GM  U	(       a  U R                  (       a  GM  Sn+UUS   ;   a  US   U    H  n,['        U R(                  U,R+                  S5      5      n-U-R                  R-                  S5      n.U-R                  R-                  S$5      n/Sn0U/b  [G        U/5      n0U0S-  (       a  Mz  U.U:X  d  M  U+S-  n+M     U+S:w  a  U[r        Rt                  :X  d  U[r        Rt                  :X  ak  US-  (       da  Sn1X    HN  n2['        U R(                  U2R+                  S5      5      R                  R-                  S5      n3U3U:X  d  MI  U1S-  n1MP     U+U1:X  a  GM  Sn4X    H  n,['        U R(                  U,R+                  S5      5      n-U-R                  R-                  S5      n.U-R                  R-                  S$5      n/Sn0U/b  [G        U/5      n0U0S-  (       a  Mz  U.U:X  d  M  U4S-  n4M     U+U4:X  a  GM  U4U+-
  n5US-  (       a{  U+S:X  a2  US-  nU R                  UR                  UUUR                  UU5        GM  U R                  S'UU4[        UR                  5      UU+[        UR                  5      4-  5        GM4  U (       a   eU R                  S(UU4[        UR                  5      UU+[        UR                  5      4-  5        U5S:w  d  GM  US-  nU5S:  ar  U+S:  d  U5S:  a*  U R                  S)[        UR                  5      -  5        GM  U Rw                  XUR                  R                  5       UUR                  5        U5S-  n5OIU R                  US   R                  UUR                  R                  5       UR                  X#5        U5S-  n5U5S:w  a  M  G	MW     U$ s  snf s  snf ! ["        R>                   aP  nUR@                  u  nnU["        RB                  :w  a  e X@RE                  UR                  UUU5      -  n SnAG	M  SnAff = f)*z$check a DN attribute for correctnessr   r  N)membermemberOfz@ERROR: Missing and duplicate forward link values for attribute 'rS  rD  z4ERROR: Duplicate forward link values for attribute 'zMissing   link '%s'z8Schedule re-adding missing forward link for attribute %srX   F)r  r"  zDuplicate link '%s'zCorrect   link '%s'r  r2   r   r6   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!  r  stringr  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:  r@   r  rl   r  r   r@  rJ  r   r   r   r  r  keyssortedr   r  rr   r   r   r>   r   r   r  r   r   lowerr|   r   r   r   r   r   r   rz  r   ra  binaryr  upperr   r  r   r	   r   r(  r)  r*  r-  r   DRSUAPI_ATTID_isDeletedr+  rq  r  r  r   r  r   r   r  )6r   r  r7  r  r   r1  r8  rw  reverse_syntax_oidis_member_linkr  r  r0  missing_error_countr   forward_linksr+  r  dddr    rL  r   r   r  r-   fixing_msDS_HasInstantiatedNCsr   e3r   r   
is_deletedtarget_is_deletedr+  r6  
found_datar   deleted_usnrmd_blobr  
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_counts6                                                         r#   check_dndbcheck.check_dn  sG   |$Q'$($I$I($S!(!%!2!2!V!VWh!i!%!%;;d::N **3*+1F 5K ~!# >>s?G?P?JL 7!
 .K*5*<*<*>?*>BR*>M?"a'$cff. / aiknkqkqrs*1Q78''(bem(m(GI I..qtt5F/2vv/B/B/Dcff/7@E / G !$ + )--/"6*H+BKK 5 :; &1AfI=>	 0 '-]&;<&;CG&;D<**3$?..tQACM=Cdjj#**V*<jIG ::44V<D|q 223668S'3AC$))D/*G "89EH##%)BBSWS`S`I`15.^,16. ,./jj''[7-B#...3 ?A ( B  .!,s3q6.3I!3L/M!M!'#c!f^.DQ.G*H!Hw<3s8+1$K003Q{| %+ZC4DQ4G0H0N0N0PTZ0ZJ +s1v 5 g#c!f[>QRS>T:U:[:[:]ag:gcffD,K,KKPV
 00Dq "4+E+Eg+N+NSY q #JJ==oN	-Q7)(*K*K*-a&1G*H*K M%*
!%A ww'*I*II./kk#.#i.#@ 26J$) "0 & //03Wc!fiiO$##CFFHc7CFIIuU
 zz88EHI#M	 q=%6%Bs1vyy>S_41$K99#&&(CQX:=a&))XO1vyy//77::;\;\]c;ddq 55cffhW69!fiiIQ99%@Jzz88?HJ$:q 8839@*N:%q 55cffhW69!fiiH !(Q;3s1vyy>S_#D
 %^^gjj.G.G.IIF44SVVXv5<c!fiiI$">"> K CF*Q 12A"4::qxx/?@D!WW;;FCF!WW;;KHF"#K)&)&k"Q )#q( 3 a!;!;;?QUYUoUo?o!A:()!$A%,TZZ&9I%J%M%M%d%dek%lF%~ - 2 "/
 '-7$N]tzz188F+;<77?77D%"%f+K?T>"a'N # n,'+5Jz !#1$K..svvx/2GJJ/@/AC f$nc#&&k-{C

OjM M N (((KKc .#cff+);GJJgI I J /q >"Q*q. %CEH_%U V--c.1ff.A.A.C.?.5jj: !OJ..s1vyy:K/2vv/B/B/Dcff/7E !OJ# //u !Z Y @4 =D << 
!wwt3111 AA#&&BJBEBI K K 
s%   1n,n&/no<,Ao77o<c                 f    UR                   R                   H  nUR                  U:X  d  M  Us  $    g r   )r)  r*  r-  )r   r6  r-  r   s       r#   find_repl_attiddbcheck.find_repl_attid>  s*    Aww%   r   c                 x    [        [        R                  U5      nU R                  X25      nUb  UR                  $ g)zRead metadata properties and return the originating time for
a given attributeId.

:return: the originating time or 0 if not found
r   )r	   r   r(  rn  r,  )r   rL  r-  r6  r   s        r#   get_originating_timedbcheck.get_originating_timeE  s:     (;;SA  -=,,,r   c                 $   [        5       n[        5       n/ nUR                  U R                  5      n[        [        R
                  U5      nUR                  R                   H  nU R                  R                  UR                  5      n	UR                  U	R                  5       5        UR                  UR                  5        U R                  R                  U	US9n
XR                  :w  d  M  UR                  UR                  5        M     X5U4$ )z\Read metadata properties and list attributes in it.
raises KeyError if the attid is unknown.is_schema_nc)r   is_child_ofry   r	   r   r(  r)  r*  r@   get_lDAPDisplayName_by_attidr-  r   rL  r   get_attid_from_lDAPDisplayName)r   r   rL  set_attwrong_attids
list_attidin_schema_ncr6  r   attcorrect_attids              r#   process_metadatadbcheck.process_metadataR  s     %u
~~dnn5(;;SAA##@@ICKK		$agg& --LLSZf M hM'  )   \22r   c                    [        [        [        R                  US   S   5      5      n[        R
                  " U R                  SU-  5      nU R                  R                  U[        R                  U/SS/S9nUS   n[        R                  " 5       nXGl
        [        R                  " Xb   [        R                  U5      Xr'   U R                  U/ SQSU-  5      (       a  U R                  S	U-  5        g
g
)zre-write replPropertyMetaData elements for a single attribute for a
object. This is used to fix missing replPropertyMetaData elementsr  r   rG  r   r   r   )r   r   r   'Failed to fix metadata for attribute %szFixed metadata for attribute %sN)r   r	   r   r   rr   rs   r>   r   r   r   r   r   r   r   r   )r   r  attrguid_strr   r   r  nmsgs           r#   fix_metadatadbcheck.fix_metadatah  s     z$))S->q-ABCVVDJJh 67jjRs~~dV*>*;*=   > !f{{}''	33G3GN
>>$ MCdJL LKK9D@ALr   c                    UR                   [        R                  -  (       a  g SnUR                  [        R                  :X  a  SnObUR                  [        R
                  :X  a  SnOAUR                  [        R                  :X  a  SnO UR                  [        R                  :X  a  SnU(       d  g UR                  R                   [        R                  -  (       d  g [        UR                  R                  5      $ )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_type(dbcheck.ace_get_effective_inherited_typex  s    99x99988xBBBEXXCCCEXXBBBEXXBBBEzz("P"PP3::,,--r   c                    XR                   ;   a  U R                   U   $ SU-  nU R                  R                  U R                  US/S9n[	        [        [        R                  US   S   S   5      5      nX@R                   U'   U$ )Nz0(&(ldapDisplayName=%s)(objectClass=classSchema))schemaIDGUID)r+   r5   r-   r   )r}   r>   r   ry   r   r	   r   r   )r   clsfltr   r7  s        r#   lookup_class_schemaIDGUID!dbcheck.lookup_class_schemaIDGUID  s    )))**3//@3FjjT^^+.'5&6   8 
499c!f^&<Q&?@A'($r   c                 x   SnX#   n[        [        R                  US   5      nSU;   =(       a"    [        US   S   5      R	                  5       S:H  nU(       a  US 4$ [        R                  " 5       nUR
                  Ul        UR                  Ul        UR                  Ul        UR                  Ul        SnS n	/ n
UR                  b  UR                  R                  n
[        S[        U
5      5       H`  nX   nUR                  [        R                  -  (       d  UR                  U5        M<  U R!                  U5      nUc  MR  U	b	  X:w  a  SnM^  Un	Mb     / n
UR"                  b  UR"                  R                  n
[        S[        U
5      5       H`  nX   nUR                  [        R                  -  (       d  UR%                  U5        M<  U R!                  U5      nUc  MR  U	b	  X:w  a  SnM^  Un	Mb     U(       a  Xu4$ U	c  US 4$ S n US   S   nUcs  U R(                  R+                  U[,        R.                  SS/S	/S
9nUS   nSU;   =(       a"    [        US   S   5      R	                  5       S:H  nU(       a  US 4$ US   S   nU R1                  U5      nX:w  a  Xu4$ US 4$ ! [&         a
  n S nANS nAff = f)NnTSecurityDescriptorr   rE  rH  FTobjectClassrt  r   r   )r	   r   
descriptorr   rN  	owner_sid	group_sidr  revisionsaclacesrH  r   r  SEC_ACE_FLAG_INHERITED_ACEsacl_addr  dacldacl_addr   r>   r   rr   r   r  )r   r   r  sd_attrsd_valsdrX  sd_cleanbrokenlast_inherited_typer  rN  r  r7  r  ry  r   r   s                     r#   
process_sddbcheck.process_sd  s   (++VAY7 C'VCK0@0C,D,J,J,LPV,V
:&&(\\\\KK"7777<<Dq#d)$A'C99xBBB!!#&55c:Ay".+ "F"#+ %. 7777<<Dq#d)$A'C99xBBB!!#&55c:Ay".+ "F"#+ %. >!&:	m$R(C ;**##3>>+6*F.?-@ $ BC AA$)Vc!K.2C.D.J.J.LPV.VJDz!M"2&C**3/#>! Dz+  		s   
J% %
J94J9c                    Sn[        U5      n[        R                  [        R                  -  nU R	                  SU< SU< S3S5      (       d  U R                  SU< SU< S35        g[        R                  " 5       nXl        [        R                  " U[        R                  U5      Xt'   U R                  US	U-  /S
U-  5      (       a  U R                  SU< SU< S35        gg)z/re-write the SD due to incorrect inherited ACEsr  Fix r  r?  r]   Not fixing 
Nsd_flags:1:%dFailed to fix attribute %sFixed attribute 'r  '
)r
   r   SECINFO_DACLSECINFO_SACLr   r   rr   r   r   r   r   r   )r   r   r  	sd_brokenr  r  sd_flagsr  s           r#   err_wrong_sddbcheck.err_wrong_sd  s    ("((8+@+@@7B ?A[\\KK7B?@{{}**633G3GQ>>$8!; <6@B BKKGRHIBr   c                 V   Sn[        U5      n[        R                  [        R                  -  nUR                  b  U[        R
                  -  nUR                  b  U[        R                  -  nU R                  SU< SU< SU< 3S5      (       d  U R                  SU< SU< S35        g[        R                  " 5       nXl        [        R                  " U[        R                  U5      Xt'   U R                  US	U-  /S
U-  5      (       a  U R                  SU< SU< S35        gg)zare-write the SD due to not matching the default (optional mode for fixing an incorrect provision)r  NzReset r  z back to provision default?
rp   zNot resetting r  r  zFailed to reset attribute %sr  r  r  )r
   r   r  r  r  SECINFO_OWNERr  SECINFO_GROUPr   r   rr   r   r   r   r   r   )r   r   r  diffr  r  r  r+  s           r#   err_wrong_default_sddbcheck.err_wrong_default_sd  s    ("((8+@+@@<<#...H<<#...HSZ\^`d e  hC  D  DKKgrBCKKM''0D0DgN
>>!o8987BD DKKGRHIDr   c                 b   Sn[        U5      n[        R                  [        R                  -  nU R	                  SU< SU< S3S5      (       d  U R                  SU< SU< S35        g[        R                  " 5       nXl        [        R                  " U[        R                  U5      Xc'   U R                  R                  U R                  5        U R                  US	U-  /S
U-  5      (       a  U R                  SU< SU< S35        U R                  R                  U R                  5        g)z/re-write the SD due to a missing owner or groupr  zFix missing owner or group in r  r?  r^   z"Not fixing missing owner or group r  Nr  r  r  r  r  )r
   r   r  r  r   r   rr   r   r   r   r   r>   set_session_infor   r   r   )r   r   r  r  r  r  r  s          r#   err_missing_sd_ownerdbcheck.err_missing_sd_owner*  s    ("))H,B,BBWVX Y  \B  C  CKK'SUVW{{}**633G3GQ 	

##D$;$;<>>$8!; <CgMO OKKGRHI

##D$<$<=r   c                    U R                   (       a  gXR                  ;   a  g[        [        R                  U5      nU R                  U[        R                  5      n[        R                  " UR                  5      n[        R                  " 5       nU R                  S-  nXe-
  nX::  a  gXW-   n	US-  n
U
S::  aB  U R                  SU-  5        U R                  S[        R                  " U	5      US-  4-  5        O>U R                  SU-  5        U R                  S[        R                  " U	5      U
4-  5        U R                  S	UR                  UR                   UR"                  UR$                  UR&                  [        R                  " [        R                  " UR                  5      5      4-  5        U =R(                  S
-  sl        g)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 %sr6   T)rn   r   r	   r   r(  rn  r   rO  sambanttime2unixr,  timer:   r   ctimer-  versionoriginating_invocation_idr9  r+  ro   )r   r   repl_valr6  rE  delete_timecurrent_timetombstone_deltar   expunge_time
delta_dayss              r#   is_expired_tombstonedbcheck.is_expired_tombstoneI  s   (( 000 (;;XF((w/N/NO	''	(I(IJyy{00LA*#"4l+
?KK ?ACD E KK '  ::l3Uw5GHI J
 KKEJKKK *  ::l3Z@A B
 	^OO%%77--''JJu001R1RSTbV V 	W 	1$r   c                 @   [        [        R                  U5      nU R                  U[        R
                  5      n[        R                  " UR                  5      nU R                  S-  n/ nUR                  R                   H  nUR                  [        R
                  :X  a  M#  UR                  UR                  ::  a  M?  UR                  UR                  ::  a  M[  [        R                  " UR                  5      nX-
  n	X::  a  M  UR                  U5        M     Xc4$ )Nr  )r	   r   r(  rn  r   rO  r  r  r,  r:   r)  r*  r-  r+  r   )
r   r  r6  rE  r  r  foundr   change_timer   s
             r#   find_changes_after_deletion#dbcheck.find_changes_after_deletion  s    (;;XF((w/N/NO	''	(I(IJ00LAAww'999{{i111((I,M,MM++A,E,EFK-E' LLO)  , r   c                    ^  T R                  U5      u  p4[        U5      S:X  a  gU 4S jnT R                  SU-  5        U" U5        U H  nU" U5        M     g)Nr   Fc                   >  TR                   R                  U R                  5      nTR	                  SXR                  U R
                  U R                  U R                  U R                  [        R                  " [        R                  " U R                  5      5      4-  5        g ! [         a    SU R                  -  n Nf = f)N<unknown:0x%x08x>zA%s: attid=0x%08x version=%d invocation=%s usn=%s (local=%s) at %s)r@   rw  r-  r   r   r  r  r9  r+  r  r  r  r  r,  )r   attnamer   s     r#   report_attid8dbcheck.has_changes_after_deletion.<locals>.report_attid  s    8++HHQ KK[!))33))

5#4#4Q5N5N#OP_R R S  8-78s   %B' 'CCz,ERROR: object %s, has changes after deletionT)r  r   r   )r   r   r  r  rE  r  r   s   `      r#   has_changes_after_deletion"dbcheck.has_changes_after_deletion  s\    ;;HEu:?	S 	BRGHYAO  r   c                 |   U R                  U5      u  p4UR                  U R                  5      nUR                  5       nU R                  R                  UUS9n/ nU H  n	U	R                  U:X  a  M  U	R                  [        R                  :X  a  M5  U	R                  [        R                  :X  a  MU   U R                  R                  U	R                  5      n
UR                  U
5        M     [        U5      S:  a5  U R                  SSR                  U5      -  5        U R                  S5        g U R!                  SU< SU R"                  < S	3S
5      (       d  U R                  S5        g U R%                  US/SU-  5      (       a  U R                  SU-  5        g g ! [         a    SU	R                  -  n
 Nf = f)Nrt  r  r   zUnexpeted attributes: %sr   z%Not fixing changes after deletion bugzDelete broken tombstone object z	 deleted z
 days ago?r   r   rd  re  )r  rv  ry   get_rdn_namer@   rx  r-  r   DRSUAPI_ATTID_nameDRSUAPI_ATTID_lastKnownParentrw  r   r   r   r   r   r   r:   r%  )r   r   r  r  rE  r|  r  	rdn_attid
unexpectedr   r  s              r#   err_changes_after_deletion"dbcheck.err_changes_after_deletion  s   ;;HE~~dnn5??$%%DDXBN E P	 
Aww)#ww'444ww'???8++HHQ g&  z?QKK2SXXj5IIJKK?@ "D$:$:!<=]_ _KK?@>>"yk2R79 9KK",-9  8-78s   3%FF;:F;c                    [        [        R                  U5      nUR                  nSnUR                   H  nUR
                  [        R                  " S5      :w  a  M)  SnU R                  SXR                  UR                  [        R                  " [        R                  " UR                  5      5      U R                   R#                  5       4-  5        M     U$ )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,  r>   get_invocation_id)r   r   repl_meta_datar6  r)  r  r   s          r#   "has_replmetadata_zero_invocationid*dbcheck.has_replmetadata_zero_invocationid  s    (;;(*hhA**dii8^.__EKK h ww		::e&7&78Q8Q&RS::779;; <  r   c           	      V   [        [        R                  U5      nUR                  n[        R
                  " [        [        R                  " 5       5      5      nSnUR                   H  nUR                  [        R                  " S5      :w  a  M)  SnU R                  R                  [        R                  5      n	UR                   S-   Ul        Xhl        [        R                  " U R                  R%                  5       5      Ul	        Xl        Xl        M     U(       Ga
  [+        U5      n
[        R,                  " 5       nXl        U R1                  SU< SU< SU R                  R%                  5       < S3S	5      (       d  U R3                  S
U< SU< S35        g [        R,                  " 5       nXl        [        R4                  " U
[        R6                  U5      X'   U R9                  US[:        R<                  -  S/SU-  5      (       a  U R3                  SU< SU< S35        g g g )NFr  Tr6   r  r  zK by setting originating_invocation_id on some elements to our invocationID r?  rb   z-Not fixing zero originating_invocation_id in r  r  #local_oid:1.3.6.1.4.1.7165.4.3.14:0r  r  r  r  )r	   r   r(  r)  r  unix2nttimer   r  r*  r  r   r   r>   sequence_numberrr   SEQ_NEXTr  r,  r  r9  r+  r
   r   r   r   r   r   r   r   r   r  )r   r   r  r  r6  r)  nowr  r   seqreplBlobr  r  s                r#   "err_replmetadata_zero_invocationid*dbcheck.err_replmetadata_zero_invocationid  s   (;;(*hhDIIK 01A**dii8^.__E**,,S\\:C		AAI(+%*.))DJJ4P4P4R*SA' #K  ~H++-CF##'+R1M1M1O%QRvx xY]_abc;;=DG++Hc6J6JDQDJ~~d%58c8c%c%J%L:TAC C bIJC r   c                 $   [        [        R                  U5      nUR                  nUR                   H)  n U R
                  R                  UR                  5      nM+     g ! [         a$    U R                  SUR                  X!4-  5           g f = f)NzIERROR: attributeID 0X%0X is not known in our schema, not fixing %s on %s
)
r	   r   r(  r)  r*  r@   rw  r-  r   r   )r   r   r  r  r6  r)  r   r}  s           r#   err_replmetadata_unknown_attid&dbcheck.err_replmetadata_unknown_attid  s    (;;(*hhA''DDQWWM   hlmlslsuyk~~s   %A!!*BBc           
         [        [        R                  U5      nSn[        5       n[        5       n0 n	UR	                  U R
                  5      n
UR                  n[        UR                  S S  S S9Ul        [        UR                  5       GH  n[        SXR                  4-  5        U R                  R                  UR                  5      nUR                  5       U;   Ga  U R                  SU< SU< SU< S35        U R!                  S	X!UR                  XU   R                  4-  S
5      (       d#  U R                  SUR                  XU4-  5          g SnUR#                  UR                  5        UR$                  X   R$                  :  a_  UR&                  X   l        UR(                  X   l        UR*                  X   l        UR,                  X   l        UR$                  X   l        GMg  XU'   UR#                  UR                  5       5        GM     UR                   Vs/ s H  oR                  U;  d  M  UPM     nn[/        U5      S:  a  U H  nUR                  U;   d  M  U R                  R                  UR                  5      nU R                  R1                  XS9nU R                  SU< SU< S35        U R!                  SX!UR                  XU   R                  4-  S5      (       d#  U R                  SUR                  XX!4-  5          g SnXl        M     U(       a  [        US S  S S9US S & U(       dU  U R                  SU< SU< S35        U R!                  SU< SU< S3S5      (       d  U R                  SU< SU< S35        g [/        U5      Ul        Xl        [5        U5      n[6        R8                  " 5       nUUl        [6        R<                  " U[6        R>                  U5      UU'   U RA                  US[B        RD                  -  SS/SU-  5      (       a  U R                  SU< SU< S35        g g s  snf ) NFc                     U R                   $ r   r-  r   s    r#   <lambda>:dbcheck.err_replmetadata_incorrect_attid.<locals>.<lambda>2  s    qwwr   )keyz
%s: 0x%08xz(ERROR: duplicate attributeID values for r=  r  r  zLFix %s on %s by removing the duplicate value 0x%08x for %s (keeping 0x%08x)?rc   z5Not fixing duplicate value 0x%08x for %s in %s on %s
Tr   rt  z'ERROR: incorrect attributeID values in zEFix %s on %s by replacing incorrect value 0x%08x for %s (new 0x%08x)?rd   zANot fixing incorrect value 0x%08x with 0x%08x for %s in %s on %s
c                     U R                   $ r   r  r  s    r#   r  r  i  s    r   z&ERROR: unsorted attributeID values in r  z by sorting the attribute list?re   r  r  r  z#local_oid:1.3.6.1.4.1.7165.4.3.25:0r  r  r  r  )#r	   r   r(  r   rv  ry   r)  rK  r*  reversedr  r-  r@   rw  rL  r   r   r   r+  r  r,  r  r9  r   rx  countr
   rr   r   r   r   r   r   r   r  )r   r   r  r  rz  r6  rB   ry  remove_attidhash_attr|  r)  r   r}  new_listr~  r  r  s                     r#    err_replmetadata_incorrect_attid(dbcheck.err_replmetadata_incorrect_attid#  s   (;;(*%u~~dnn5hh 399Q<->?	 #))$A,"gg./##@@ICyy{g%Z]_ceghi''(v+/QWWcC=CVCV*W)X(JL L KK X#$77Cr":!; <  ) ;;!8!88
 -.IIHM)<=<U<UHM9>?>Y>YHM;454E4EHM1./kkHM+ SMKK		$? %D  #yyHy!GG<,GAyH!77l*++HHQC$($5$5$T$TUX$T$tMKKW[]_ `a++,s/3#PS}GZGZ.[-\]{} }$h'(wwD&M%N OC+G  $Xa[6GH KKdTVWX##'+R%12SU UtR@A M		D>{{}''#2F2FMT
>>$!1D4_4_!_!F!F!H 7=? ? KKD"EF	?I Is   )Q Qc                    SnSU;  a   U R                  SUR                  -  5        SnSU;  d#  [        US   S   5      R                  5       S:X  a   U R                  SUR                  -  5        SnS	U;  a   U R                  S
UR                  -  5        SnSU;  d#  [        US   S   5      R                  5       S:X  a   U R                  SUR                  -  5        SnSU;   a   U R                  SUR                  -  5        SnSU;   aC  [        US   S   5      R                  5       S:X  a   U R                  SUR                  -  5        SnSU;  d<  [	        US   5      S:w  d*  [        US   S   5      S:w  d  [        US   S   5      S:w  a   U R                  SUR                  -  5        SnSU;  d  [        US   S   5      S:w  a   U R                  SUR                  -  5        SnU$ )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 %srE  z8ERROR: isDeleted not set on Deleted Objects container %sr  r  topr6   	containerzBERROR: objectClass incorrectly set on Deleted Objects container %ssystemFlags-1946157056zBERROR: systemFlags incorrectly set on Deleted Objects container %s)r   r   r   rN  r   )r   r  faultys      r#   is_deleted_deleted_objects"dbcheck.is_deleted_deleted_objects  s   #KKX[^[a[aabF#3.#c:R6STU6V2W2]2]2_cj2jKKcfiflfllmF3&KK[^a^d^ddeF#3.#c:R6STU6V2W2]2]2_cj2jKKcfiflfllmF3KKSVYV\V\\]F##c+&6q&9":"@"@"Bg"MKKRUXU[U[[\F#C,>(?1(D(+C,>q,A(Be(K(+C,>q,A(Bk(QKK\_b_e_eefF#s3}+=a+@'A]'RKK\_b_e_eefFr   c                    [         R                  " 5       nUR                  =Ul        nSU;  a)  [         R                  " S[         R                  S5      US'   SU;  a)  [         R                  " S[         R                  S5      US'   SU;  a6  [         R                  " SU R
                  -  [         R                  S5      US'   SU;  a)  [         R                  " S[         R                  S5      US'   SU;   a)  [         R                  " S[         R                  S5      US'   [         R                  " S[         R                  S	5      US	'   [         R                  " S
[         R                  S5      US'   [         R                  " SS/[         R                  S5      US'   U R                  SU-  S5      (       d  U R                  SU-  5        g U R                  US/SU-  5      (       a  U R                  SU-  5        g g )Nr  zContainer for deleted objectsr  rH  r  zCN=Container,%sr  r  rE  r  r  r  r  r  zAFix Deleted Objects container %s by restoring default attributes?rf   .Not fixing missing/incorrect attributes on %s
r   z+Failed to fix Deleted Objects container  %sz%Fixed Deleted Objects container '%s'
)
rr   r   r   r   r   ry   r@  r   r   r   )r   r  r  r   s       r#   err_deleted_deleted_objects#dbcheck.err_deleted_deleted_objects  s   {{}vv"#"%"4"45TVYVjVjly"zD#3.-0-?-?H\H\^v-wD)*3&%(%7%78IDNN8Z\_\p\p  sC  &DD!"#3.-0-?-?H\H\^v-wD)*3!$!3!3FC<O<OQ]!^D..vs7K7K[Y[!00@T@TVcd]!00%1EsG[G[]jk] c#%!'(EG GKKIRPQ>>$G"LN NKK@BGHNr   c                 h   [         R                  " 5       nX$l        U R                  R	                  5       nU R                  R                  5       (       a%  U R                  SU< SUR                  < S35        g U R                  SUR                  -  S5      (       d  U R                  SUR                  -  5        g [         R                  " U[         R                  U5      XC'   U R                  U/ SU< SUR                  < 35      (       a$  U R                  S	U< SUR                  < 35        g g )
Nr  r  z for the RODCz-Add yourself to the replica locations for %s?r   r   zFailed to add  for r  )rr   r   r   r>   r{   am_rodcr   r   r   rI  r   )r   r  	cross_refr  r  targets         r#   err_replica_locationsdbcheck.err_replica_locations  s    {{}--/::KK4HI O#&66!+,CE EKKISVVTU''0@0@$G
>>$svv$NOOKKT366:; Pr   c                     XR                   R                  :X  a  gXR                  :X  a  gXR                  :X  a  gXR                  :X  a  gXR
                  :X  a  gg)NTF)r>   rt   ru   rw   ry   rz   rg  s     r#   is_fsmo_roledbcheck.is_fsmo_role  sN    %%%'''r   c                 B   SnU R                   R                  U5      nX:X  a`  U[        R                  -  n U R                   R	                  UR                  5       [        R                  / S/S9  U[        R                  -  nU R                  bF  [        U5      U R                   Vs/ s H  n[        U5      PM     sn;   a  U[        R                  -  nU$ ! [        R                   a-  nUR                  u  pVU[        R                  :w  a  e  S nANS nAff = fs  snf )Nr   r   r   )r>   rf  r   INSTANCE_TYPE_IS_NC_HEADr   r  rr   r   INSTANCE_TYPE_NC_ABOVEr   r   r   r   r   INSTANCE_TYPE_WRITE)r   r   instancetyper   e4r   r   xs           r#   calculate_instancetypedbcheck.calculate_instancetype  s    **((,=D999L<

!!ryy{#..PR^o]p!q  ; ;;>>%#g,4>>:Z>a3q6>:Z*ZD444L << !ww3111 2 ;[s   9C (DD,#DDc           	          U R                    Hc  u  p#X:X  d  M  [        R                  " U R                  R	                  5       5      n[        [        R                  U" UU R                  S95      s  $    [        e)Nr   )	r~   r   r   r>   r   r	   r  r   r   )r   r   sd_dndescriptor_fnr   s        r#   get_wellknown_sddbcheck.get_wellknown_sd  sg    &*&8&8"U{%--djj.G.G.IJ
!("5"5"/
9=#HI I '9 r   c                   ^^	 Uc  S/mO[        U5      m[        S T 5       5      m	UU	4S jnST	;   d(  ST	;   d"  UR                  5       R                  5       T	;   a"  TR	                  S5        T	R                  S5        ST	;   a"  UR                  5       SS4 H  nU" U5        M     S	nST	;   a  S
nO2T H,  nU R                  U5      u  pgUS:X  a  M  US-  (       a  M*  S
n  O   U(       a  U" S5        U" S5        TT	4$ )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).
*c              3   @   #    U  H  oR                  5       v   M     g 7fr   )rL  ).0r3  s     r#   	<genexpr>/dbcheck.find_checkable_attrs.<locals>.<genexpr>	  s     0%Qwwyy%s   c                    > U R                  5       T;  a1  TR                  U 5        TR                  U R                  5       5        g g r   )rL  r   r   )ar-   lc_attrss    r#   add_attr.dbcheck.find_checkable_attrs.<locals>.add_attr	  s3    wwy(QQWWY' )r   r   distinguishednamenamerE  r  FTr   r6   rF  r  )rY  r   r  rL  r   r   r:  )
r   r   r   rD  rB  need_replPropertyMetaDatar8  rv  r-   rC  s
           @@r#   find_checkable_attrsdbcheck.find_checkable_attrs  s    "EE)E0%00	(
 H8+OO##%1LL LL Xoo'!#% %
 %*!(?(,% AA!D	Q;A:,0)  %+,hr   c           
      (+   U R                   (       a  U R                  SU-  5        U R                  X5      u  p4 SnU[        R                  -  nU[        R
                  -  nU[        R                  -  nU[        R                  -  nU R                  R                  U[        R                  SSSSU-  S/US9n[!        U5      S:w  a  U R                  SU-  5        gUS   n
Sn[#        5       n[#        5       nSnU R                  R%                  U
R&                  5      n U R)                  U[*        R,                  R.                  5      nS
nS
nS
nSnSnS
nU
 Hq  nUR3                  5       S:X  a  [5        U
U   S   5      S:w  a  SnUR3                  5       S:X  a  [7        U
U   S   5      nUR3                  5       S:X  d  Mi  U
U   S   nMs     U(       aP  U(       aI  U R9                  UU5      (       a  US-  nU R;                  UU5        U$ U R=                  UU5      (       a  U$ U
 GHb  nUS:X  d  US:X  a  M  UR3                  5       S:X  a  SnUR3                  5       S:X  ao  [!        U
U   5      S:w  aL  U =R>                  S-  sl        U R                  S[!        U
U   5      U[5        U
R&                  5      4-  5        O[5        U
U   S   5      nUR3                  5       [5        U
R&                  RA                  5       5      R3                  5       :X  aq  Un[!        U
U   5      S:w  aL  U =R>                  S-  sl        U R                  S[!        U
U   5      U[5        U
R&                  5      4-  5        O[5        U
U   S   5      nUR3                  5       S:X  a  U RC                  XU   S   5      (       a  US-  nU RE                  UUU
U   S   5         U RG                  XU   S   5      u  nnn[!        U5      [!        U5      :  d  [!        U5      S:  d  [K        U5      U:w  a   US-  nU RM                  UUU
U   S   U5        OAUS   S:w  a8  U =R>                  S-  sl        U R                  SU< S[5        U5      < S35        GMc  UR3                  5       S:X  Ga   U RO                  X5      u  nnUb  U RQ                  UUU5        US-  nGM  URR                  b  URT                  c  U RW                  UU5        US-  nGM  UU:X  d  U RX                  (       a   U R[                  U5      n[]        [        R^                  U
U   S   5      nSnU RX                  (       d  Sn[a        UU[        Rb                  " U R                  Re                  5       5      US9nUS:w  a  U Rg                  UUU5        US-  nGM  GM  UR3                  5       S:X  a  U R                  Ri                  U Rj                  UU
U   5      n [K        U 5      [K        U
U   5      :w  d  U S   U
U   S   :w  d  U S   U
U   S   :w  a$  U Rm                  UU[o        U
U   5      5        US-  nGM6  UR3                  5       S:X  Ga!  U
U   S   n!U!S :X  a  US-  nU Rq                  U
UU
U   5        GMw  U!S
S! S":X  a  GM  U!S
S# S$:X  a  US-  nU Rs                  U
UU
U   5        GM  U!S   S:w  aB  U!S%   S:w  a9  U!S&   S:w  a0  U!S'   S:w  a'  U!S(   S:w  a  US-  nU Ru                  U
UU
U   5        GM  [!        U!5      S)-  S:w  a  US-  nU Rw                  U
U5        GM!  U!S   S:X  aB  U!S)   S:X  a9  U!S%   S:X  a0  U!S*   S:w  a'  U!S&   S:X  a  US-  nU Ry                  U
UU
U   5        GMl  UR3                  5       S+:X  d  UR3                  5       S,:X  a{  U
U   S   U Rz                  ;   aD  U =R>                  S-  sl        U R                  S-U< S.U
R&                  < S/U
U   S   < S035        O!U Rz                  R}                  U
U   S   5        U
U    H"  n"U"S1:X  d  M  U R                  UU5        US-  nM$      U Rj                  R                  U5      n#U R                  U5      u  n%n&U Rj                  R                  U5      n'U'[,        R                  -  (       d>  U'[,        R                  -  (       d&  U%(       d  UR}                  UR3                  5       5        U#[,        R                  [,        R                  [,        R                  [        R                  4;   a  XR                  U
UU#5      -  nO[#        5       n(U
U    Hq  n"U(R}                  U"5        U R                  Ri                  U Rj                  UU"/5      n [!        U 5      S:w  d  U S   U":w  d  MV  U R                  UUU
U   5        US-  n  O   [!        U
U   5      [!        U(5      :w  a'  U R                  UUU
U   [o        U(5      5        US-  n  OnUR3                  5       S2:X  d  GM  U R                  U5      n)[!        U
S3   5      S:w  d  [7        U
S3   S   5      U):w  d  GMK  US-  nU R                  U
U)5        GMe     U(       d"  S4U;   d  SU;   a  US-  nU R                  U5        S4U;   d  SU;   a  Uc<  U =R>                  S-  sl        U R                  S5[5        U
R&                  5      -  5        UcZ  U =R>                  S-  sl        U R                  S6U
R&                  RA                  5       < S[5        U
R&                  5      < S735        UGbX  S
n*SS8/n+U(       a;  U[*        R,                  R                  -  (       d  Un*U+S9[,        R                  -  /-  n+U*c  U
R&                  R                  5       n* [        R                  " U R                  S:U*-  5      n,U,R                  SU
R&                  RA                  5       U5        U
R&                  U:X  a  U
R&                  n,U,U
R&                  :w  a  US-  nU R                  U
U,UUUU+5        O[U
R&                  R                  5       U:w  a=  U =R>                  S-  sl        U R                  S;U< S<U< S=U
R&                  < S735        Sn.U(       Gab  U
R&                  U:X  a  S@n/SAn0U R                  UU/5      n1U1U0:w  a  U R                  SB[5        U5      -  SC5      (       af  [        R                  " 5       n2UU2l        [        R                  " SD[        R                  SE5      U2SE'   US-  nU R                  R                  U2SF/SG9  OU R                  SH[5        U5      -  5        UR                  U5       H{  n3U.(       a  U R                  SIU-  5        Sn.US-  nU R                  SJU3-  5        U R                  SKU3-  SL5      (       d  U R                  SMU3-  5        Mi  U R                  U
U35        M}     U R                  U5      (       a(  SNU
;  a"  S4U;   d  SOU;   a  U R                  U
5        US-  n XR                  R                  5       :w  a`  [5        UR                  5       5      U R                  ;  a9  U R                  R                  UR                  5       [        R                  SS/SP9nXR                  ;   a2  S4U;   a,  U R                  U
5      (       a  U R                  U
5        US-  nU R                   H  u  n5n$UU5:X  d  M  SSU
;   d  M  STn6U R                  R                  5       (       a  SUn6U6U$;  a$  U R                  U
U$R&                  U65        US-  nMc  Sn7U$U6    H.  n8[5        U85      U R                  R                  5       :X  d  M,  Sn7M0     U7(       a  M  U R                  U
U$R&                  U65        US-  nM     XR                  :X  a  S4U;   d  SVU;   a  SWU
;  a  US-  nU R                  (       ag  U R                  SXSY5      (       aO  U R                  R                  5          U R                  R                  5         U R                  R                  5         O3U R                  R                  5       (       d  U R                  SZU-  5        XR                  :X  Ga  S[S\/n9U R                  R                  U R                  [        R                  U9S]9nU9 Hi  n:U:US   ;  a  M  [7        US   U:   S   5      n;U;S^-	  n<S_U;-  n=U;S:w  d  M4  U=U<:  d  M<  U R                  S`U=U<U=U<4-  5        U =R>                  S-  sl        Mk     S[US   ;  a)  U R                  SaU-  5        U =R>                  S-  sl         U R                  R                  5       u  n>n<U R                  Re                  5       n?U>U<::  a  SbU?U>4-  n@ U R                  R                  ScU@-  [        R                  / S]9nUb  U R                  SdW@< SeUS   R&                  < SfU< 35        US-  nU R                  SgU@< ShU< Si3Sj5      (       a_  U R                  R                  5           U R                  R                  5       nAUAU>:  a  WAS-   n>OM(  U R                  R                  5         O U$ U>S-  n>U>U<::  a  M  U$ U$ ! [        R                   aW  nUR                  u  pU[        R                  :X  a/  U R                  (       a  U R                  S	U-  5         S
nAg S
nAge S
nAff = f! [0         a    S
n GNf = f! [0         a     US-  nU RI                  UUU
U   5         GMn  f = f! [0         a     GM  f = f! [         a#  n$U R                  U
U5        US-  n S
n$A$GM  S
n$A$ff = f! [         a5  n-U =R>                  S-  sl        U R                  S>U* S?35         S
n-A-GNZS
n-A-ff = f! [        R                   a  n4U4R                  u  pU[        R                  :X  aX  U(       a5  U R                  SQU
R&                  -  5        U R                  SR5         S
n4A4GNU R                  U
5        US-  n S
n4A4GNe S
n4A4ff = f!   U R                  R                  5         e = f! [        R                   a0  n-U-R                  u  pU[        R                  :w  a  e S
n S
n-A-GNS
n-A-ff = f!   U R                  R                  5         e = f! [        R                   aB  nBUBR                  u  pU R                  SkU	-  5        U =R>                  S-  sl         S
nBABU$ S
nBABff = f)lzcheck one objectChecking object %sr   r   r   r   r  r   )r+   r,   r   r-   z)ERROR: Object %s disappeared during checkNr6   z,ERROR: Object %s failed to load during checkF	isdeletedr  Tsystemflagsreplpropertymetadatar   distinguishedNameobjectclassrG  z1ERROR: Not fixing num_values(%d) for '%s' on '%s'z4ERROR: Not fixing incorrect initial attributeID in 'z' on 'z', it should be objectClassntsecuritydescriptor)ignoreAdditionalACEsr0   rt  userparameters       s                      s   IAAgACAAIAAgACAAIAAg   r  r  	   r  r  attributeid	governsidzError: r  r  z. already exists as an attributeId or governsIdr   r1  r  r<  z(ERROR: Not fixing missing 'name' on '%s'zERROR: Not fixing missing 'rD  r   r  z
RDN=RDN,%szERROR: Not fixing r  z on 'z#ERROR: could not handle parent DN 'z': skipping RDN checksi0  l   )x1cB& z-Fix isDeleted originating_change_time on '%s'rT   rH  rE  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'rS   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?)repsFromr3   r4   ridsetreferencesr9   z,Allocate the missing RID set for RID master?r   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?rk   zCouldn't get available RIDs: %s)vrA   r   rI  r   r  r  r  r  r>   r   rr   r   r   r   r   rq   r   r   rf  r   r   r  r   r   r   rL  r   r   r  r  r  r   r  r  r  r  r   rK  r  r  r  r  r  r  rm   r9  r	   r  r   r   r   r  rG  r@   rZ  rY  r  r  r  r  r  r   r   rA  r  r#  r  r:  $get_systemFlags_from_lDAPDisplayNameDS_FLAG_ATTR_NOT_REPLICATEDDS_FLAG_ATTR_IS_CONSTRUCTEDr   DSDB_SYNTAX_OR_NAMEDSDB_SYNTAX_STRING_DNr&  rk  rP  r^  r4  r  rh  #SYSTEM_FLAG_DISALLOW_MOVE_ON_DELETEr  r  rs   set_componentr  get_rdn_value
ValueErrorrq  r   r   r   r   r*  
differencer  r+  r  r   r   r  r   r  r!  r   r%  r(  r{   r   r   r  create_own_rid_setr  r  r   free_rid_boundsallocate_rid)Cr   r   r   search_attrsrC  r  r   e10r   r   r  r   set_attrs_from_mdset_attrs_seengot_objectclassnc_dndeleted_objects_dnobject_rdn_attrobject_rdn_valr  rE  r  repl_meta_data_valr7  list_attid_from_mdrz  r  r  well_known_sd
current_sdrS  r  rM  
userparamsrL  r  r  r8  rw  flagrJ  r  	parent_dnr   expected_dnry  show_dnisDeletedAttIdexpectedTimeDooriginatingr  r}  e11dns_partlocationr  loc
pool_attrs	pool_attrpoolhighlownext_free_ridr   sidallocated_ridr$  sC                                                                      r#   r   dbcheck.check_object)	  s   <<KK,r12 "&!:!:2!O	H...H...H---H---H**##3>>(9(9(8(7((B(<.& +7 $ 8C" s8q=KKFKL!fE

&&svv.	&!%!=!=e>Cjj>j>j"l 	!H~~;.s8}Q'(G3 $I~~=0!#h-"23~~#99%(]1%5"  +..r3EFFq //4FG""((-?@@""H48/B#B~~=0"&~~6)s8}%*))Q.)KK S!$S]!3Xs366{ K!L M  #3x=#34H~~3svv':':'<#=#C#C#EE"*s8}%*))Q.)KK S!$S]!3Xs366{ K!L M &)Xq)9%:N~~#99::28}Q?OPP1$K;;B#h-XYJZ[//M!4DE J&(:L ()C0B,CC,'!+/04FF1$K99"hHVWHXZfg
 *!,1--2-%-s2w%8 9 ~~#99"&//"":Y(%%b"i81$K<<'2<<+?--b"51$K++t/I/I!(,(=(=b(A ",H,?,?,/M!,<">J ,1(55/3,'z(0(8(89R9R9T(U=QSD rz11"mTJ#q( ~~=0!ZZAA$BSBSU]_bck_lm
 *%H)>> ms8}Q'77 nHb(9977Hd3x=FYZ1$K~~#33 ]1-
%1$K11#xXO_7_(??1$K223#h-P !mq( mq( mq( mq( mq(  1$K00hHN_q(A-1$K//X> mq( mq( mq( mq( mq(  1$K33C3x=Q~~=0HNN4D4Sx=#t'B'BB))Q.)KK#+SVVS]15E!G H //33CM!4DE 8}#:,,R:1$K	 %!..RRS[\
 )-(M(Mh(W%F%$$II(SD4;;;t???""8>>#34d88$:R:R"88#--I I }}S(JGG x=CJJsO!%!E!EdFWFWYadgch!iJ:!+z!}/C33B#h-P#q( ) s8}%V4--b(CM4PV<X1$K~~>1*.*E*Eb*I's>*+q0CN8KA8N4OSj4j1$K//5LMk n C8O}7P1K((,8Ov1%%*%F#cff+VW&%%*%H[H[H]_bcfcici_jklI)95H#ejj&T&TT 2I-0Z0ZZ[[ FFMMO	N!ffTZZ1KL ))!SVV-@-@-BHM66//"%&&K#&&(1$K%%c;*Hh@VV))+~=))Q.)KK_ESEHVV!M N vv++!' "5"778JN[.0''(WZ]^`Za(acvww"{{}"$,/,>,>vsG[G[]h,i[)#q(

))$-)I $Z]`ac]d$de%001BCKK 34#Gq UX[[\''(WZ](]_qrrKK VY\ \]!!#s+ D R  c)sh/U]B]))#.q 	ZZ//11c"))+6Fdkk6Yjj''RYY[2CEU1V ( X 000SH_..s33005q #22OXsX~*"36::%%''=H3&..sCFFHE1$Kx=C3x4::#?#?#AA $ ) u..sCFFHE1$K'  3* ###h"4"@%S0  1$K))++ -:,HJ J !JJ88:& $

 = = ? !JJ99;!ZZ//11 %9;=%> ?6  -/JKJ**##*4 $ 6C (	CF*3q6),Q/0rz 4'19KK C!$dC 6!7 8))Q.) ( ##a&0>CD%%*%7+&*jj&@&@&B#t "ZZ668
#t+!Z$??C#"jj//Z#5E69nn68 0 : 7:CFIIr%K L#q(++ 03B-8 -G	H H
 !JJ88:&&*48JJ4K4K4MM'4'E8E8I(-	 '+ !JJ99;!  &*Y $t+\ {_ || 	88LTs---&&KK Kb PQ	*  	& "&	&B   1$K77Hc(mTH $ ! !P  **39q B  3%%*%A) M2 2 3 33v || 	88LTs---KK ISVV TUKK !N O O ++C01$K	|& $

 = = ? %R << #'(vv3#9#99!"	#<& $

 = = ? %_ << + XX
=DE%%*%%h o+sD  B AK+ !*AM AM,AN"AN+	$AO &A=AP A$AR4 F5AT; G:,AS J&AT J:AT K+AMK?AAMMAMMAMMAM)M(AM)M,%ANNANN
AN(N'AN(N+
AON5AOOAOO
APO%*APPAPPAR1P1AAR,RAR,R+AR,R,AR1R4ASSATS(%ATTATTAT8T;AVU7AVVAVc                 
   [         R                  " U R                  S5      nU R                  (       a  U R	                  SU-  5        U R                  R                  U[         R                  S9n[        U5      S:w  a  U R	                  SU-  5        gUS   nSnSU;  a  U R	                  S5        US-   $ [        US   S   5      R                  S	5      (       Gd'  U R	                  S
5        US-  nU R                  S5      (       d  U$ U R                  R                  [         R                  " U R                  US   S   R                  S5      5      [         R                  S/S9n[        [        [        R                  US   S   S   5      5      n[         R                  " 5       nXl        [         R"                  " SU-  [         R$                  S5      US'   U R'                  U/ SSS9(       a  U R	                  S5        U$ )z!check the @ROOTDSE special objectz@ROOTDSErL  )r+   r,   r6   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?r2   r  r*   rG  z+Failed to change dsServiceName to GUID formFr   z"Changed dsServiceName to GUID form)rr   rs   r>   rA   r   r   r   r   r   r  r  r   r	   r   r   r   r   r   r   r   )r   r   r   r  r   r  r+  s          r#   r   dbcheck.check_rootdseU  s   VVDJJ
+<<KK,r12jjRs~~>s8q=KK<rAB!f #%KKBC?"3'*+66x@@KKKL1K<< DEE""**##

C<PQR<S<Z<Z[a<b)c*-.. $ PC:diiQ1Ea1HIJHAD!$!3!3K(4J474H4H/"[Ao~~a%R]b~c@Ar   c                 @   [         R                  " 5       n[         R                  " U R                  S5      Ul        [         R
                  " S[         R                  S5      US'   [         R
                  " S[         R                  S5      US'   U R                  U/ SSS9$ )	zre-index the whole databasez@ATTRIBUTESr  force_reindexr   r"  zre-indexed databaseFr   )	rr   r   rs   r>   r   r   rI  r@  r   r   r+  s     r#   reindex_databasedbcheck.reindex_databasey  sw    KKMvvdjj-0((1A1A?S%((1D1DoV(~~a%:U~KKr   c                     [         R                  " 5       n[         R                  " U R                  S5      Ul        [         R
                  " S[         R                  S5      US'   U R                  U/ SSS9$ )zOreset @MODULES to that needed for current sam.ldb (to read a very old database)z@MODULES
samba_dsdbz@LISTzreset @MODULES on databaseFr   )rr   r   rs   r>   r   r   r   r   r  s     r#   reset_modulesdbcheck.reset_modules  sY    KKMvvdjj*-''c6J6JGT'
~~a%AE~RRr   )Qr   r   rn   r}   rE   r<   r   r?   r   r   rZ   ro   rB   rJ   rO   rP   rQ   rK   rI   rS   rV   rX   r   rH   rR   rW   rN   rh   r   rf   rg   rj   ra   r   r   r]   r^   r   rc   re   rd   rb   r\   rk   rT   rU   ri   rq   ru   r   r   r`   r   rw   r   r   r|   rl   rD   r[   rG   rF   rL   rM   r=   rp   rm   rz   r   r>   r@   ry   r_   r   r   r:   r   rA   r~   r   rC   )
NFFFFFFFFF)FF)T)Fr   )R__name__
__module____qualname____firstlineno____doc__r   r   r   rr   r'  r   r   r   r  r   r%  r   r2  r:  rA  rP  rZ  r^  r   rh  rq  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r@  rk  rn  rq  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r!  r(  r+  r4  r9  rI  r   r   r  r  __static_attributes__ r   r#   r&   r&   8   s   )ODI8=).',*/yv !%C,=,=!%NiV(G*&	A>>>*N$U.I.SjI@I L$]"M@EE GF  04H(C&m"!,FA*wOnp i4\
?:BBd4LhT	3,B .,gRJ"J*>>4l  D2".H(#KJ
]G~<I8<$$/bhXHLSr   r&   )%rr   r  r  base64r   r   r   r   samba.dcerpcr   r   	samba.ndrr	   r
   r   samba.samdbr   r   samba.descriptorr   r   r   
samba.authr   r   samba.netcmdr   samba.netcmd.fsmor   samba.colourr   r   r   r   r$   r   r&   r  r   r#   <module>r     s[   (    '      * !  ! 
 5 % 0 H HP-Sf P-Sr   