1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-03 13:47:25 +03:00

s4-smbtorture: add test for netr_DatabaseRedo.

Guenther
This commit is contained in:
Günther Deschner 2008-10-30 10:54:59 +01:00
parent 008ac81b31
commit db26f7b7c4

View File

@ -32,8 +32,10 @@
#include "../lib/crypto/crypto.h"
#include "libcli/auth/libcli_auth.h"
#include "librpc/gen_ndr/ndr_netlogon_c.h"
#include "librpc/gen_ndr/ndr_netlogon.h"
#include "librpc/gen_ndr/ndr_lsa_c.h"
#include "param/param.h"
#include "libcli/security/security.h"
#define TEST_MACHINE_NAME "torturetest"
@ -831,6 +833,538 @@ static bool test_DatabaseDeltas(struct torture_context *tctx,
return true;
}
static bool test_DatabaseRedo(struct torture_context *tctx,
struct dcerpc_pipe *p,
struct cli_credentials *machine_credentials)
{
NTSTATUS status;
struct netr_DatabaseRedo r;
struct creds_CredentialState *creds;
struct netr_Authenticator credential;
struct netr_Authenticator return_authenticator;
struct netr_DELTA_ENUM_ARRAY *delta_enum_array = NULL;
struct netr_ChangeLogEntry e;
struct dom_sid null_sid, *sid;
int i,d;
ZERO_STRUCT(null_sid);
sid = dom_sid_parse_talloc(tctx, "S-1-5-21-1111111111-2222222222-333333333-500");
{
struct {
uint32_t rid;
uint16_t flags;
uint8_t db_index;
uint8_t delta_type;
struct dom_sid sid;
const char *name;
NTSTATUS expected_error;
uint32_t expected_num_results;
uint8_t expected_delta_type_1;
uint8_t expected_delta_type_2;
const char *comment;
} changes[] = {
/* SAM_DATABASE_DOMAIN */
{
.rid = 0,
.flags = 0,
.db_index = SAM_DATABASE_DOMAIN,
.delta_type = NETR_DELTA_MODIFY_COUNT,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_SYNCHRONIZATION_REQUIRED,
.expected_num_results = 0,
.comment = "NETR_DELTA_MODIFY_COUNT"
},
{
.rid = 0,
.flags = 0,
.db_index = SAM_DATABASE_DOMAIN,
.delta_type = 0,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DOMAIN,
.comment = "NULL DELTA"
},
{
.rid = 0,
.flags = 0,
.db_index = SAM_DATABASE_DOMAIN,
.delta_type = NETR_DELTA_DOMAIN,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DOMAIN,
.comment = "NETR_DELTA_DOMAIN"
},
{
.rid = DOMAIN_RID_ADMINISTRATOR,
.flags = 0,
.db_index = SAM_DATABASE_DOMAIN,
.delta_type = NETR_DELTA_USER,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_USER,
.comment = "NETR_DELTA_USER by rid 500"
},
{
.rid = DOMAIN_RID_GUEST,
.flags = 0,
.db_index = SAM_DATABASE_DOMAIN,
.delta_type = NETR_DELTA_USER,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_USER,
.comment = "NETR_DELTA_USER by rid 501"
},
{
.rid = 0,
.flags = NETR_CHANGELOG_SID_INCLUDED,
.db_index = SAM_DATABASE_DOMAIN,
.delta_type = NETR_DELTA_USER,
.sid = *sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DELETE_USER,
.comment = "NETR_DELTA_USER by sid and flags"
},
{
.rid = 0,
.flags = NETR_CHANGELOG_SID_INCLUDED,
.db_index = SAM_DATABASE_DOMAIN,
.delta_type = NETR_DELTA_USER,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DELETE_USER,
.comment = "NETR_DELTA_USER by null_sid and flags"
},
{
.rid = 0,
.flags = NETR_CHANGELOG_NAME_INCLUDED,
.db_index = SAM_DATABASE_DOMAIN,
.delta_type = NETR_DELTA_USER,
.sid = null_sid,
.name = "administrator",
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DELETE_USER,
.comment = "NETR_DELTA_USER by name 'administrator'"
},
{
.rid = DOMAIN_RID_ADMINS,
.flags = 0,
.db_index = SAM_DATABASE_DOMAIN,
.delta_type = NETR_DELTA_GROUP,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 2,
.expected_delta_type_1 = NETR_DELTA_GROUP,
.expected_delta_type_2 = NETR_DELTA_GROUP_MEMBER,
.comment = "NETR_DELTA_GROUP by rid 512"
},
{
.rid = DOMAIN_RID_ADMINS,
.flags = 0,
.db_index = SAM_DATABASE_DOMAIN,
.delta_type = NETR_DELTA_GROUP_MEMBER,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 2,
.expected_delta_type_1 = NETR_DELTA_GROUP,
.expected_delta_type_2 = NETR_DELTA_GROUP_MEMBER,
.comment = "NETR_DELTA_GROUP_MEMBER by rid 512"
},
/* SAM_DATABASE_BUILTIN */
{
.rid = 0,
.flags = 0,
.db_index = SAM_DATABASE_BUILTIN,
.delta_type = NETR_DELTA_MODIFY_COUNT,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_SYNCHRONIZATION_REQUIRED,
.expected_num_results = 0,
.comment = "NETR_DELTA_MODIFY_COUNT"
},
{
.rid = 0,
.flags = 0,
.db_index = SAM_DATABASE_BUILTIN,
.delta_type = NETR_DELTA_DOMAIN,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DOMAIN,
.comment = "NETR_DELTA_DOMAIN"
},
{
.rid = DOMAIN_RID_ADMINISTRATOR,
.flags = 0,
.db_index = SAM_DATABASE_BUILTIN,
.delta_type = NETR_DELTA_USER,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DELETE_USER,
.comment = "NETR_DELTA_USER by rid 500"
},
{
.rid = 0,
.flags = 0,
.db_index = SAM_DATABASE_BUILTIN,
.delta_type = NETR_DELTA_USER,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DELETE_USER,
.comment = "NETR_DELTA_USER"
},
{
.rid = 544,
.flags = 0,
.db_index = SAM_DATABASE_BUILTIN,
.delta_type = NETR_DELTA_ALIAS,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 2,
.expected_delta_type_1 = NETR_DELTA_ALIAS,
.expected_delta_type_2 = NETR_DELTA_ALIAS_MEMBER,
.comment = "NETR_DELTA_ALIAS by rid 544"
},
{
.rid = 544,
.flags = 0,
.db_index = SAM_DATABASE_BUILTIN,
.delta_type = NETR_DELTA_ALIAS_MEMBER,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 2,
.expected_delta_type_1 = NETR_DELTA_ALIAS,
.expected_delta_type_2 = NETR_DELTA_ALIAS_MEMBER,
.comment = "NETR_DELTA_ALIAS_MEMBER by rid 544"
},
{
.rid = 544,
.flags = 0,
.db_index = SAM_DATABASE_BUILTIN,
.delta_type = 0,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DOMAIN,
.comment = "NULL DELTA by rid 544"
},
{
.rid = 544,
.flags = NETR_CHANGELOG_SID_INCLUDED,
.db_index = SAM_DATABASE_BUILTIN,
.delta_type = 0,
.sid = *dom_sid_parse_talloc(tctx, "S-1-5-32-544"),
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DOMAIN,
.comment = "NULL DELTA by rid 544 sid S-1-5-32-544 and flags"
},
{
.rid = 544,
.flags = NETR_CHANGELOG_SID_INCLUDED,
.db_index = SAM_DATABASE_BUILTIN,
.delta_type = NETR_DELTA_ALIAS,
.sid = *dom_sid_parse_talloc(tctx, "S-1-5-32-544"),
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 2,
.expected_delta_type_1 = NETR_DELTA_ALIAS,
.expected_delta_type_2 = NETR_DELTA_ALIAS_MEMBER,
.comment = "NETR_DELTA_ALIAS by rid 544 and sid S-1-5-32-544 and flags"
},
{
.rid = 0,
.flags = NETR_CHANGELOG_SID_INCLUDED,
.db_index = SAM_DATABASE_BUILTIN,
.delta_type = NETR_DELTA_ALIAS,
.sid = *dom_sid_parse_talloc(tctx, "S-1-5-32-544"),
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DELETE_ALIAS,
.comment = "NETR_DELTA_ALIAS by sid S-1-5-32-544 and flags"
},
/* SAM_DATABASE_PRIVS */
{
.rid = 0,
.flags = 0,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = 0,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_ACCESS_DENIED,
.expected_num_results = 0,
.comment = "NULL DELTA"
},
{
.rid = 0,
.flags = 0,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = NETR_DELTA_MODIFY_COUNT,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_SYNCHRONIZATION_REQUIRED,
.expected_num_results = 0,
.comment = "NETR_DELTA_MODIFY_COUNT"
},
{
.rid = 0,
.flags = 0,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = NETR_DELTA_POLICY,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_POLICY,
.comment = "NETR_DELTA_POLICY"
},
{
.rid = 0,
.flags = NETR_CHANGELOG_SID_INCLUDED,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = NETR_DELTA_POLICY,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_POLICY,
.comment = "NETR_DELTA_POLICY by null sid and flags"
},
{
.rid = 0,
.flags = NETR_CHANGELOG_SID_INCLUDED,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = NETR_DELTA_POLICY,
.sid = *dom_sid_parse_talloc(tctx, "S-1-5-32"),
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_POLICY,
.comment = "NETR_DELTA_POLICY by sid S-1-5-32 and flags"
},
{
.rid = DOMAIN_RID_ADMINISTRATOR,
.flags = 0,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = NETR_DELTA_ACCOUNT,
.sid = null_sid,
.name = NULL,
.expected_error = NT_STATUS_SYNCHRONIZATION_REQUIRED, /* strange */
.expected_num_results = 0,
.comment = "NETR_DELTA_ACCOUNT by rid 500"
},
{
.rid = 0,
.flags = NETR_CHANGELOG_SID_INCLUDED,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = NETR_DELTA_ACCOUNT,
.sid = *dom_sid_parse_talloc(tctx, "S-1-1-0"),
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_ACCOUNT,
.comment = "NETR_DELTA_ACCOUNT by sid S-1-1-0 and flags"
},
{
.rid = 0,
.flags = NETR_CHANGELOG_SID_INCLUDED |
NETR_CHANGELOG_IMMEDIATE_REPL_REQUIRED,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = NETR_DELTA_ACCOUNT,
.sid = *dom_sid_parse_talloc(tctx, "S-1-1-0"),
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_ACCOUNT,
.comment = "NETR_DELTA_ACCOUNT by sid S-1-1-0 and 2 flags"
},
{
.rid = 0,
.flags = NETR_CHANGELOG_SID_INCLUDED |
NETR_CHANGELOG_NAME_INCLUDED,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = NETR_DELTA_ACCOUNT,
.sid = *dom_sid_parse_talloc(tctx, "S-1-1-0"),
.name = NULL,
.expected_error = NT_STATUS_INVALID_PARAMETER,
.expected_num_results = 0,
.comment = "NETR_DELTA_ACCOUNT by sid S-1-1-0 and invalid flags"
},
{
.rid = DOMAIN_RID_ADMINISTRATOR,
.flags = NETR_CHANGELOG_SID_INCLUDED,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = NETR_DELTA_ACCOUNT,
.sid = *sid,
.name = NULL,
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DELETE_ACCOUNT,
.comment = "NETR_DELTA_ACCOUNT by rid 500, sid and flags"
},
{
.rid = 0,
.flags = NETR_CHANGELOG_NAME_INCLUDED,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = NETR_DELTA_SECRET,
.sid = null_sid,
.name = "IsurelydontexistIhope",
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_DELETE_SECRET,
.comment = "NETR_DELTA_SECRET by name 'IsurelydontexistIhope' and flags"
},
{
.rid = 0,
.flags = NETR_CHANGELOG_NAME_INCLUDED,
.db_index = SAM_DATABASE_PRIVS,
.delta_type = NETR_DELTA_SECRET,
.sid = null_sid,
.name = "G$BCKUPKEY_P",
.expected_error = NT_STATUS_OK,
.expected_num_results = 1,
.expected_delta_type_1 = NETR_DELTA_SECRET,
.comment = "NETR_DELTA_SECRET by name 'G$BCKUPKEY_P' and flags"
}
};
ZERO_STRUCT(return_authenticator);
r.in.logon_server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
r.in.computername = TEST_MACHINE_NAME;
r.in.return_authenticator = &return_authenticator;
r.out.return_authenticator = &return_authenticator;
r.out.delta_enum_array = &delta_enum_array;
for (d=0; d<3; d++) {
const char *database;
switch (d) {
case 0:
database = "SAM";
break;
case 1:
database = "BUILTIN";
break;
case 2:
database = "LSA";
break;
default:
break;
}
torture_comment(tctx, "Testing DatabaseRedo\n");
if (!test_SetupCredentials(p, tctx, machine_credentials, &creds)) {
return false;
}
for (i=0;i<ARRAY_SIZE(changes);i++) {
if (d != changes[i].db_index) {
continue;
}
creds_client_authenticator(creds, &credential);
r.in.credential = &credential;
e.serial_number1 = 0;
e.serial_number2 = 0;
e.object_rid = changes[i].rid;
e.flags = changes[i].flags;
e.db_index = changes[i].db_index;
e.delta_type = changes[i].delta_type;
switch (changes[i].flags & (NETR_CHANGELOG_NAME_INCLUDED | NETR_CHANGELOG_SID_INCLUDED)) {
case NETR_CHANGELOG_SID_INCLUDED:
e.object.object_sid = changes[i].sid;
break;
case NETR_CHANGELOG_NAME_INCLUDED:
e.object.object_name = changes[i].name;
break;
default:
break;
}
r.in.change_log_entry = e;
torture_comment(tctx, "Testing DatabaseRedo with database %s and %s\n",
database, changes[i].comment);
status = dcerpc_netr_DatabaseRedo(p, tctx, &r);
if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
return true;
}
torture_assert_ntstatus_equal(tctx, status, changes[i].expected_error, changes[i].comment);
if (delta_enum_array) {
torture_assert_int_equal(tctx,
delta_enum_array->num_deltas,
changes[i].expected_num_results,
changes[i].comment);
if (delta_enum_array->num_deltas > 0) {
torture_assert_int_equal(tctx,
delta_enum_array->delta_enum[0].delta_type,
changes[i].expected_delta_type_1,
changes[i].comment);
}
if (delta_enum_array->num_deltas > 1) {
torture_assert_int_equal(tctx,
delta_enum_array->delta_enum[1].delta_type,
changes[i].expected_delta_type_2,
changes[i].comment);
}
}
if (!creds_client_check(creds, &return_authenticator.cred)) {
torture_comment(tctx, "Credential chaining failed\n");
if (!test_SetupCredentials(p, tctx, machine_credentials, &creds)) {
return false;
}
}
}
}
}
return true;
}
/*
try a netlogon AccountDeltas
@ -1761,6 +2295,7 @@ struct torture_suite *torture_rpc_netlogon(TALLOC_CTX *mem_ctx)
torture_rpc_tcase_add_test_creds(tcase, "GetDomainInfo", test_GetDomainInfo);
torture_rpc_tcase_add_test_creds(tcase, "DatabaseSync", test_DatabaseSync);
torture_rpc_tcase_add_test_creds(tcase, "DatabaseDeltas", test_DatabaseDeltas);
torture_rpc_tcase_add_test_creds(tcase, "DatabaseRedo", test_DatabaseRedo);
torture_rpc_tcase_add_test_creds(tcase, "AccountDeltas", test_AccountDeltas);
torture_rpc_tcase_add_test_creds(tcase, "AccountSync", test_AccountSync);
torture_rpc_tcase_add_test(tcase, "GetDcName", test_GetDcName);