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 + -
显示快捷键?