- dbsync.in.sync_context = dbsync.out.sync_context;
-
- for (d=0; d < dbsync.out.delta_enum_array->num_deltas; d++) {
- delta_ctx = talloc_named(loop_ctx, 0, "DatabaseSync delta context");
- switch (dbsync.out.delta_enum_array->delta_enum[d].delta_type) {
- case NETR_DELTA_USER:
- if (!vampire_samdump_handle_user(delta_ctx,
+ do {
+ int d;
+ loop_ctx = talloc_named(mem_ctx, 0, "DatabaseSync loop context");
+ creds_client_authenticator(creds, &dbsync.in.credential);
+
+ dbsync_nt_status = dcerpc_netr_DatabaseSync(p, loop_ctx, &dbsync);
+ if (!NT_STATUS_IS_OK(dbsync_nt_status) &&
+ !NT_STATUS_EQUAL(dbsync_nt_status, STATUS_MORE_ENTRIES)) {
+ r->netlogon.error_string = talloc_asprintf(mem_ctx, "DatabaseSync failed - %s", nt_errstr(nt_status));
+ return nt_status;
+ }
+
+ if (!creds_client_check(creds, &dbsync.out.return_authenticator.cred)) {
+ r->netlogon.error_string = talloc_strdup(mem_ctx, "Credential chaining failed");
+ return NT_STATUS_ACCESS_DENIED;
+ }
+
+ dbsync.in.sync_context = dbsync.out.sync_context;
+
+ for (d=0; d < dbsync.out.delta_enum_array->num_deltas; d++) {
+ char *error_string = NULL;
+ delta_ctx = talloc_named(loop_ctx, 0, "DatabaseSync delta context");
+ nt_status = r->netlogon.delta_fn(delta_ctx,
+ r->netlogon.fn_ctx,