1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-20 22:50:26 +03:00

r4694: 'fix' the behaviour for setting only the old, but not the new secret.

(The behaviour is a little odd, but we wanted bug-for-bug, right? :-)

Andrew Bartlett
(This used to be commit 6a09a84320c9ab18568a66efb3839a8dcde834af)
This commit is contained in:
Andrew Bartlett 2005-01-11 22:16:14 +00:00 committed by Gerald (Jerry) Carter
parent 91f70398df
commit 4e052c1704
2 changed files with 52 additions and 6 deletions

View File

@ -76,6 +76,7 @@ struct lsa_secret_state {
uint32_t access_mask;
const char *secret_dn;
struct ldb_wrap *sam_ctx;
BOOL global;
};
/*
@ -1277,6 +1278,7 @@ static NTSTATUS lsa_CreateSecret(struct dcesrv_call_state *dce_call, TALLOC_CTX
const char *name2;
name = &r->in.name.string[2];
secret_state->sam_ctx = talloc_reference(secret_state, policy_state->sam_ctx);
secret_state->global = True;
if (strlen(name) < 1) {
return NT_STATUS_INVALID_PARAMETER;
@ -1305,6 +1307,8 @@ static NTSTATUS lsa_CreateSecret(struct dcesrv_call_state *dce_call, TALLOC_CTX
samdb_msg_add_string(secret_state->sam_ctx, mem_ctx, msg, "cn", name2);
} else {
secret_state->global = False;
name = r->in.name.string;
if (strlen(name) < 1) {
return NT_STATUS_INVALID_PARAMETER;
@ -1391,6 +1395,7 @@ static NTSTATUS lsa_OpenSecret(struct dcesrv_call_state *dce_call, TALLOC_CTX *m
if (strncmp("G$", r->in.name.string, 2) == 0) {
name = &r->in.name.string[2];
secret_state->sam_ctx = talloc_reference(secret_state, policy_state->sam_ctx);
secret_state->global = True;
if (strlen(name) < 1) {
return NT_STATUS_INVALID_PARAMETER;
@ -1411,12 +1416,14 @@ static NTSTATUS lsa_OpenSecret(struct dcesrv_call_state *dce_call, TALLOC_CTX *m
}
} else {
secret_state->sam_ctx = talloc_reference(secret_state, secrets_db_connect(mem_ctx));
secret_state->global = False;
name = r->in.name.string;
if (strlen(name) < 1) {
return NT_STATUS_INVALID_PARAMETER;
}
secret_state->sam_ctx = talloc_reference(secret_state, secrets_db_connect(mem_ctx));
/* search for the secret record */
ret = samdb_search(secret_state->sam_ctx,
mem_ctx, "cn=LSA Secrets", &msgs, attrs,
@ -1511,6 +1518,26 @@ static NTSTATUS lsa_SetSecret(struct dcesrv_call_state *dce_call, TALLOC_CTX *me
mem_ctx, msg, "priorSetTime", nt_now) != 0) {
return NT_STATUS_NO_MEMORY;
}
if (!r->in.new_val) {
/* This behaviour varies depending of if this is a local, or a global secret... */
if (secret_state->global) {
/* set old value mtime */
if (samdb_msg_add_uint64(secret_state->sam_ctx,
mem_ctx, msg, "lastSetTime", nt_now) != 0) {
return NT_STATUS_NO_MEMORY;
}
} else {
if (samdb_msg_add_delete(secret_state->sam_ctx,
mem_ctx, msg, "secret")) {
return NT_STATUS_NO_MEMORY;
}
if (samdb_msg_add_delete(secret_state->sam_ctx,
mem_ctx, msg, "lastSetTime")) {
return NT_STATUS_NO_MEMORY;
}
}
}
}
if (r->in.new_val) {
@ -1642,6 +1669,10 @@ static NTSTATUS lsa_QuerySecret(struct dcesrv_call_state *dce_call, TALLOC_CTX *
if (r->in.old_val) {
const struct ldb_val *prior_val;
r->out.old_val = talloc_zero(mem_ctx, struct lsa_DATA_BUF_PTR);
if (!r->out.old_val) {
return NT_STATUS_NO_MEMORY;
}
/* Decrypt */
prior_val = ldb_msg_find_ldb_val(res[0], "priorSecret");
@ -1653,8 +1684,10 @@ static NTSTATUS lsa_QuerySecret(struct dcesrv_call_state *dce_call, TALLOC_CTX *
if (!crypt_secret.length) {
return NT_STATUS_NO_MEMORY;
}
r->out.old_val = talloc(mem_ctx, struct lsa_DATA_BUF_PTR);
r->out.old_val->buf = talloc(mem_ctx, struct lsa_DATA_BUF);
if (!r->out.old_val->buf) {
return NT_STATUS_NO_MEMORY;
}
r->out.old_val->buf->size = crypt_secret.length;
r->out.old_val->buf->length = crypt_secret.length;
r->out.old_val->buf->data = crypt_secret.data;
@ -1671,6 +1704,11 @@ static NTSTATUS lsa_QuerySecret(struct dcesrv_call_state *dce_call, TALLOC_CTX *
if (r->in.new_val) {
const struct ldb_val *new_val;
r->out.new_val = talloc_zero(mem_ctx, struct lsa_DATA_BUF_PTR);
if (!r->out.new_val) {
return NT_STATUS_NO_MEMORY;
}
/* Decrypt */
new_val = ldb_msg_find_ldb_val(res[0], "secret");
@ -1682,8 +1720,10 @@ static NTSTATUS lsa_QuerySecret(struct dcesrv_call_state *dce_call, TALLOC_CTX *
if (!crypt_secret.length) {
return NT_STATUS_NO_MEMORY;
}
r->out.new_val = talloc(mem_ctx, struct lsa_DATA_BUF_PTR);
r->out.new_val->buf = talloc(mem_ctx, struct lsa_DATA_BUF);
if (!r->out.new_val->buf) {
return NT_STATUS_NO_MEMORY;
}
r->out.new_val->buf->length = crypt_secret.length;
r->out.new_val->buf->size = crypt_secret.length;
r->out.new_val->buf->data = crypt_secret.data;

View File

@ -935,10 +935,12 @@ static BOOL test_CreateSecret(struct dcerpc_pipe *p,
printf("QuerySecret failed - %s\n", nt_errstr(status));
ret = False;
} else {
if (r8.out.new_val->buf == NULL) {
if (!r8.out.new_val || !r8.out.old_val) {
printf("in/out pointers not returned, despite being set on in for QuerySecret\n");
ret = False;
} else if (r8.out.new_val->buf == NULL) {
if (i != LOCAL) {
printf("NEW secret buffer not returned after OLD set\n");
printf("NEW secret buffer not returned after GLOBAL OLD set\n");
ret = False;
}
} else if (r8.out.old_val->buf == NULL) {
@ -948,6 +950,10 @@ static BOOL test_CreateSecret(struct dcerpc_pipe *p,
printf("Both times not returned after OLD set\n");
ret = False;
} else {
if (i == LOCAL) {
printf("NEW secret buffer should not be returned after LOCAL OLD set\n");
ret = False;
}
blob1.data = r8.out.new_val->buf->data;
blob1.length = r8.out.new_val->buf->length;