dcesrv_lsa.c
来自「samba最新软件」· C语言 代码 · 共 2,518 行 · 第 1/5 页
C
2,518 行
crypt_secret.data = r->in.new_val->data; crypt_secret.length = r->in.new_val->size; status = sess_decrypt_blob(mem_ctx, &crypt_secret, &session_key, &secret); if (!NT_STATUS_IS_OK(status)) { return status; } val.data = secret.data; val.length = secret.length; /* set value */ if (samdb_msg_add_value(secret_state->sam_ldb, mem_ctx, msg, "currentValue", &val) != 0) { return NT_STATUS_NO_MEMORY; } /* set new value mtime */ if (samdb_msg_add_uint64(secret_state->sam_ldb, mem_ctx, msg, "lastSetTime", nt_now) != 0) { return NT_STATUS_NO_MEMORY; } /* If the old value is not set, then migrate the * current value to the old value */ if (!r->in.old_val) { const struct ldb_val *new_val; NTTIME last_set_time; struct ldb_message **res; const char *attrs[] = { "currentValue", "lastSetTime", NULL }; /* search for the secret record */ ret = gendb_search_dn(secret_state->sam_ldb,mem_ctx, secret_state->secret_dn, &res, attrs); if (ret == 0) { return NT_STATUS_OBJECT_NAME_NOT_FOUND; } if (ret != 1) { DEBUG(0,("Found %d records matching dn=%s\n", ret, ldb_dn_get_linearized(secret_state->secret_dn))); return NT_STATUS_INTERNAL_DB_CORRUPTION; } new_val = ldb_msg_find_ldb_val(res[0], "currentValue"); last_set_time = ldb_msg_find_attr_as_uint64(res[0], "lastSetTime", 0); if (new_val) { /* set value */ if (samdb_msg_add_value(secret_state->sam_ldb, mem_ctx, msg, "priorValue", new_val) != 0) { return NT_STATUS_NO_MEMORY; } } /* set new value mtime */ if (ldb_msg_find_ldb_val(res[0], "lastSetTime")) { if (samdb_msg_add_uint64(secret_state->sam_ldb, mem_ctx, msg, "priorSetTime", last_set_time) != 0) { return NT_STATUS_NO_MEMORY; } } } } /* modify the samdb record */ ret = samdb_replace(secret_state->sam_ldb, mem_ctx, msg); if (ret != 0) { /* we really need samdb.c to return NTSTATUS */ return NT_STATUS_UNSUCCESSFUL; } return NT_STATUS_OK;}/* lsa_QuerySecret */static NTSTATUS dcesrv_lsa_QuerySecret(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_QuerySecret *r){ struct dcesrv_handle *h; struct lsa_secret_state *secret_state; struct ldb_message *msg; DATA_BLOB session_key; DATA_BLOB crypt_secret, secret; int ret; struct ldb_message **res; const char *attrs[] = { "currentValue", "priorValue", "lastSetTime", "priorSetTime", NULL }; NTSTATUS nt_status; DCESRV_PULL_HANDLE(h, r->in.sec_handle, LSA_HANDLE_SECRET); /* Ensure user is permitted to read this... */ switch (security_session_user_level(dce_call->conn->auth_state.session_info)) { case SECURITY_SYSTEM: case SECURITY_ADMINISTRATOR: break; default: /* Users and annonymous are not allowed to read secrets */ return NT_STATUS_ACCESS_DENIED; } secret_state = h->data; /* pull all the user attributes */ ret = gendb_search_dn(secret_state->sam_ldb, mem_ctx, secret_state->secret_dn, &res, attrs); if (ret != 1) { return NT_STATUS_INTERNAL_DB_CORRUPTION; } msg = res[0]; nt_status = dcesrv_fetch_session_key(dce_call->conn, &session_key); if (!NT_STATUS_IS_OK(nt_status)) { return nt_status; } 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; } prior_val = ldb_msg_find_ldb_val(res[0], "priorValue"); if (prior_val && prior_val->length) { secret.data = prior_val->data; secret.length = prior_val->length; /* Encrypt */ crypt_secret = sess_encrypt_blob(mem_ctx, &secret, &session_key); if (!crypt_secret.length) { return NT_STATUS_NO_MEMORY; } 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; } } if (r->in.old_mtime) { r->out.old_mtime = talloc(mem_ctx, NTTIME); if (!r->out.old_mtime) { return NT_STATUS_NO_MEMORY; } *r->out.old_mtime = ldb_msg_find_attr_as_uint64(res[0], "priorSetTime", 0); } 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; } new_val = ldb_msg_find_ldb_val(res[0], "currentValue"); if (new_val && new_val->length) { secret.data = new_val->data; secret.length = new_val->length; /* Encrypt */ crypt_secret = sess_encrypt_blob(mem_ctx, &secret, &session_key); if (!crypt_secret.length) { return NT_STATUS_NO_MEMORY; } 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; } } if (r->in.new_mtime) { r->out.new_mtime = talloc(mem_ctx, NTTIME); if (!r->out.new_mtime) { return NT_STATUS_NO_MEMORY; } *r->out.new_mtime = ldb_msg_find_attr_as_uint64(res[0], "lastSetTime", 0); } return NT_STATUS_OK;}/* lsa_LookupPrivValue*/static NTSTATUS dcesrv_lsa_LookupPrivValue(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_LookupPrivValue *r){ struct dcesrv_handle *h; struct lsa_policy_state *state; int id; DCESRV_PULL_HANDLE(h, r->in.handle, LSA_HANDLE_POLICY); state = h->data; id = sec_privilege_id(r->in.name->string); if (id == -1) { return NT_STATUS_NO_SUCH_PRIVILEGE; } r->out.luid->low = id; r->out.luid->high = 0; return NT_STATUS_OK; }/* lsa_LookupPrivName */static NTSTATUS dcesrv_lsa_LookupPrivName(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_LookupPrivName *r){ struct dcesrv_handle *h; struct lsa_policy_state *state; const char *privname; DCESRV_PULL_HANDLE(h, r->in.handle, LSA_HANDLE_POLICY); state = h->data; if (r->in.luid->high != 0) { return NT_STATUS_NO_SUCH_PRIVILEGE; } privname = sec_privilege_name(r->in.luid->low); if (privname == NULL) { return NT_STATUS_NO_SUCH_PRIVILEGE; } r->out.name = talloc(mem_ctx, struct lsa_StringLarge); if (r->out.name == NULL) { return NT_STATUS_NO_MEMORY; } r->out.name->string = privname; return NT_STATUS_OK; }/* lsa_LookupPrivDisplayName*/static NTSTATUS dcesrv_lsa_LookupPrivDisplayName(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_LookupPrivDisplayName *r){ struct dcesrv_handle *h; struct lsa_policy_state *state; int id; DCESRV_PULL_HANDLE(h, r->in.handle, LSA_HANDLE_POLICY); state = h->data; id = sec_privilege_id(r->in.name->string); if (id == -1) { return NT_STATUS_NO_SUCH_PRIVILEGE; } r->out.disp_name = talloc(mem_ctx, struct lsa_StringLarge); if (r->out.disp_name == NULL) { return NT_STATUS_NO_MEMORY; } r->out.disp_name->string = sec_privilege_display_name(id, r->in.language_id); if (r->out.disp_name->string == NULL) { return NT_STATUS_INTERNAL_ERROR; } return NT_STATUS_OK;}/* lsa_DeleteObject*/static NTSTATUS dcesrv_lsa_DeleteObject(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_DeleteObject *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* lsa_EnumAccountsWithUserRight*/static NTSTATUS dcesrv_lsa_EnumAccountsWithUserRight(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_EnumAccountsWithUserRight *r){ struct dcesrv_handle *h; struct lsa_policy_state *state; int ret, i; struct ldb_message **res; const char * const attrs[] = { "objectSid", NULL}; const char *privname; DCESRV_PULL_HANDLE(h, r->in.handle, LSA_HANDLE_POLICY); state = h->data; if (r->in.name == NULL) { return NT_STATUS_NO_SUCH_PRIVILEGE; } privname = r->in.name->string; if (sec_privilege_id(privname) == -1) { return NT_STATUS_NO_SUCH_PRIVILEGE; } ret = gendb_search(state->sam_ldb, mem_ctx, NULL, &res, attrs, "privilege=%s", privname); if (ret == -1) { return NT_STATUS_INTERNAL_DB_CORRUPTION; } if (ret == 0) { return NT_STATUS_NO_MORE_ENTRIES; } r->out.sids->sids = talloc_array(r->out.sids, struct lsa_SidPtr, ret); if (r->out.sids->sids == NULL) { return NT_STATUS_NO_MEMORY; } for (i=0;i<ret;i++) { r->out.sids->sids[i].sid = samdb_result_dom_sid(r->out.sids->sids, res[i], "objectSid"); NT_STATUS_HAVE_NO_MEMORY(r->out.sids->sids[i].sid); } r->out.sids->num_sids = ret; return NT_STATUS_OK;}/* lsa_AddAccountRights*/static NTSTATUS dcesrv_lsa_AddAccountRights(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_AddAccountRights *r){ struct dcesrv_handle *h; struct lsa_policy_state *state; DCESRV_PULL_HANDLE(h, r->in.handle, LSA_HANDLE_POLICY); state = h->data; return dcesrv_lsa_AddRemoveAccountRights(dce_call, mem_ctx, state, LDB_FLAG_MOD_ADD, r->in.sid, r->in.rights);}/* lsa_RemoveAccountRights*/static NTSTATUS dcesrv_lsa_RemoveAccountRights(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_RemoveAccountRights *r){ struct dcesrv_handle *h; struct lsa_policy_state *state; DCESRV_PULL_HANDLE(h, r->in.handle, LSA_HANDLE_POLICY); state = h->data; return dcesrv_lsa_AddRemoveAccountRights(dce_call, mem_ctx, state, LDB_FLAG_MOD_DELETE, r->in.sid, r->in.rights);}/* lsa_StorePrivateData*/static NTSTATUS dcesrv_lsa_StorePrivateData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_StorePrivateData *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* lsa_RetrievePrivateData*/static NTSTATUS dcesrv_lsa_RetrievePrivateData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_RetrievePrivateData *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* lsa_GetUserName*/static NTSTATUS dcesrv_lsa_GetUserName(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_GetUserName *r){ NTSTATUS status = NT_STATUS_OK; const char *account_name; const char *authority_name; struct lsa_String *_account_name; struct lsa_StringPointer *_authority_name = NULL; /* this is what w2k3 does */ r->out.account_name = r->in.account_name; r->out.authority_name = r->in.authority_name; if (r->in.account_name && r->in.account_name->string) { return NT_STATUS_INVALID_PARAMETER; } if (r->in.authority_name && r->in.authority_name->string && r->in.authority_name->string->string) { return NT_STATUS_INVALID_PARAMETER; } account_name = talloc_reference(mem_ctx, dce_call->conn->auth_state.session_info->server_info->account_name); authority_name = talloc_reference(mem_ctx, dce_call->conn->auth_state.session_info->server_info->domain_name); _account_name = talloc(mem_ctx, struct lsa_String); NT_STATUS_HAVE_NO_MEMORY(_account_name); _account_name->string = account_name; if (r->in.authority_name) { _authority_name = talloc(mem_ctx, struct lsa_StringPointer); NT_STATUS_HAVE_NO_MEMORY(_authority_name); _authority_name->string = talloc(mem_ctx, struct lsa_String); NT_STATUS_HAVE_NO_MEMORY(_authority_name->string); _authority_name->string->string = authority_name; } r->out.account_name = _account_name; r->out.authority_name = _authority_name; return status;}/* lsa_SetInfoPolicy2*/static NTSTATUS dcesrv_lsa_SetInfoPolicy2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_SetInfoPolicy2 *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* lsa_QueryDomainInformationPolicy*/static NTSTATUS dcesrv_lsa_QueryDomainInformationPolicy(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_QueryDomainInformationPolicy *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* lsa_SetDomInfoPolicy*/static NTSTATUS dcesrv_lsa_SetDomainInformationPolicy(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct lsa_SetDomainInformationPolicy *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/*
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?