winbindd_async.c

来自「samba-3.0.22.tar.gz 编译smb服务器的源码」· C语言 代码 · 共 1,441 行 · 第 1/3 页

C
1,441
字号
		 cont, private_data);}enum winbindd_result winbindd_dual_name2gid(struct winbindd_domain *domain,					    struct winbindd_cli_state *state){	struct group *gr;	/* Ensure null termination */	state->request.data.groupname		[sizeof(state->request.data.groupname)-1] = '\0';	DEBUG(3, ("[%5lu]: name2gid %s\n", (unsigned long)state->pid, 		  state->request.data.groupname));	gr = getgrnam(state->request.data.groupname);	if (gr == NULL) {		return WINBINDD_ERROR;	}	state->response.data.gid = gr->gr_gid;	return WINBINDD_OK;}static void name2gid_recv(TALLOC_CTX *mem_ctx, BOOL success,			  struct winbindd_response *response,			  void *c, void *private_data){	void (*cont)(void *priv, BOOL succ, gid_t gid) = c;	if (!success) {		DEBUG(5, ("Could not trigger name2gid\n"));		cont(private_data, False, 0);		return;	}	if (response->result != WINBINDD_OK) {		DEBUG(5, ("name2gid returned an error\n"));		cont(private_data, False, 0);		return;	}	cont(private_data, True, response->data.gid);}static void lookupsid_recv(TALLOC_CTX *mem_ctx, BOOL success,			   struct winbindd_response *response,			   void *c, void *private_data){	void (*cont)(void *priv, BOOL succ, const char *dom_name,		     const char *name, enum SID_NAME_USE type) = c;	if (!success) {		DEBUG(5, ("Could not trigger lookupsid\n"));		cont(private_data, False, NULL, NULL, SID_NAME_UNKNOWN);		return;	}	if (response->result != WINBINDD_OK) {		DEBUG(5, ("lookupsid returned an error\n"));		cont(private_data, False, NULL, NULL, SID_NAME_UNKNOWN);		return;	}	cont(private_data, True, response->data.name.dom_name,	     response->data.name.name, response->data.name.type);}void winbindd_lookupsid_async(TALLOC_CTX *mem_ctx, const DOM_SID *sid,			      void (*cont)(void *private_data, BOOL success,					   const char *dom_name,					   const char *name,					   enum SID_NAME_USE type),			      void *private_data){	struct winbindd_domain *domain;	struct winbindd_request request;	domain = find_lookup_domain_from_sid(sid);	if (domain == NULL) {		DEBUG(5, ("Could not find domain for sid %s\n",			  sid_string_static(sid)));		cont(private_data, False, NULL, NULL, SID_NAME_UNKNOWN);		return;	}	ZERO_STRUCT(request);	request.cmd = WINBINDD_LOOKUPSID;	fstrcpy(request.data.sid, sid_string_static(sid));	do_async_domain(mem_ctx, domain, &request, lookupsid_recv,			cont, private_data);}enum winbindd_result winbindd_dual_lookupsid(struct winbindd_domain *domain,					     struct winbindd_cli_state *state){	enum SID_NAME_USE type;	DOM_SID sid;	fstring name;	fstring dom_name;	/* Ensure null termination */	state->request.data.sid[sizeof(state->request.data.sid)-1]='\0';	DEBUG(3, ("[%5lu]: lookupsid %s\n", (unsigned long)state->pid, 		  state->request.data.sid));	/* Lookup sid from PDC using lsa_lookup_sids() */	if (!string_to_sid(&sid, state->request.data.sid)) {		DEBUG(5, ("%s not a SID\n", state->request.data.sid));		return WINBINDD_ERROR;	}	/* Lookup the sid */	if (!winbindd_lookup_name_by_sid(state->mem_ctx, &sid, dom_name, name,					 &type)) {		return WINBINDD_ERROR;	}	fstrcpy(state->response.data.name.dom_name, dom_name);	fstrcpy(state->response.data.name.name, name);	state->response.data.name.type = type;	return WINBINDD_OK;}static void lookupname_recv(TALLOC_CTX *mem_ctx, BOOL success,			    struct winbindd_response *response,			    void *c, void *private_data){	void (*cont)(void *priv, BOOL succ, const DOM_SID *sid,		     enum SID_NAME_USE type) = c;	DOM_SID sid;	if (!success) {		DEBUG(5, ("Could not trigger lookup_name\n"));		cont(private_data, False, NULL, SID_NAME_UNKNOWN);		return;	}	if (response->result != WINBINDD_OK) {		DEBUG(5, ("lookup_name returned an error\n"));		cont(private_data, False, NULL, SID_NAME_UNKNOWN);		return;	}	if (!string_to_sid(&sid, response->data.sid.sid)) {		DEBUG(0, ("Could not convert string %s to sid\n",			  response->data.sid.sid));		cont(private_data, False, NULL, SID_NAME_UNKNOWN);		return;	}	cont(private_data, True, &sid, response->data.sid.type);}void winbindd_lookupname_async(TALLOC_CTX *mem_ctx, const char *dom_name,			       const char *name,			       void (*cont)(void *private_data, BOOL success,					    const DOM_SID *sid,					    enum SID_NAME_USE type),			       void *private_data){	struct winbindd_request request;	struct winbindd_domain *domain;	domain = find_lookup_domain_from_name(dom_name);	if (domain == NULL) {		DEBUG(5, ("Could not find domain for name %s\n", dom_name));		cont(private_data, False, NULL, SID_NAME_UNKNOWN);		return;	}	ZERO_STRUCT(request);	request.cmd = WINBINDD_LOOKUPNAME;	fstrcpy(request.data.name.dom_name, dom_name);	fstrcpy(request.data.name.name, name);	do_async_domain(mem_ctx, domain, &request, lookupname_recv,			cont, private_data);}enum winbindd_result winbindd_dual_lookupname(struct winbindd_domain *domain,					      struct winbindd_cli_state *state){	enum SID_NAME_USE type;	char *name_domain, *name_user;	DOM_SID sid;	char *p;	/* Ensure null termination */	state->request.data.sid[sizeof(state->request.data.name.dom_name)-1]='\0';	/* Ensure null termination */	state->request.data.sid[sizeof(state->request.data.name.name)-1]='\0';	/* cope with the name being a fully qualified name */	p = strstr(state->request.data.name.name, lp_winbind_separator());	if (p) {		*p = 0;		name_domain = state->request.data.name.name;		name_user = p+1;	} else {		name_domain = state->request.data.name.dom_name;		name_user = state->request.data.name.name;	}	DEBUG(3, ("[%5lu]: lookupname %s%s%s\n", (unsigned long)state->pid,		  name_domain, lp_winbind_separator(), name_user));	/* Lookup name from PDC using lsa_lookup_names() */	if (!winbindd_lookup_sid_by_name(state->mem_ctx, domain, name_domain,					 name_user, &sid, &type)) {		return WINBINDD_ERROR;	}	sid_to_string(state->response.data.sid.sid, &sid);	state->response.data.sid.type = type;	return WINBINDD_OK;}BOOL print_sidlist(TALLOC_CTX *mem_ctx, const DOM_SID *sids,		   size_t num_sids, char **result, ssize_t *len){	size_t i;	size_t buflen = 0;	*len = 0;	*result = NULL;	for (i=0; i<num_sids; i++) {		sprintf_append(mem_ctx, result, len, &buflen,			       "%s\n", sid_string_static(&sids[i]));	}	if ((num_sids != 0) && (*result == NULL)) {		return False;	}	return True;}BOOL parse_sidlist(TALLOC_CTX *mem_ctx, char *sidstr,		   DOM_SID **sids, size_t *num_sids){	char *p, *q;	p = sidstr;	if (p == NULL)		return False;	while (p[0] != '\0') {		DOM_SID sid;		q = strchr(p, '\n');		if (q == NULL) {			DEBUG(0, ("Got invalid sidstr: %s\n", p));			return False;		}		*q = '\0';		q += 1;		if (!string_to_sid(&sid, p)) {			DEBUG(0, ("Could not parse sid %s\n", p));			return False;		}		add_sid_to_array(mem_ctx, &sid, sids, num_sids);		p = q;	}	return True;}BOOL print_ridlist(TALLOC_CTX *mem_ctx, uint32 *rids, size_t num_rids,		   char **result, ssize_t *len){	size_t i;	size_t buflen = 0;	*len = 0;	*result = NULL;	for (i=0; i<num_rids; i++) {		sprintf_append(mem_ctx, result, len, &buflen,			       "%ld\n", rids[i]);	}	if ((num_rids != 0) && (*result == NULL)) {		return False;	}	return True;}BOOL parse_ridlist(TALLOC_CTX *mem_ctx, char *ridstr,		   uint32 **sids, size_t *num_rids){	char *p;	p = ridstr;	if (p == NULL)		return False;	while (p[0] != '\0') {		uint32 rid;		char *q;		rid = strtoul(p, &q, 10);		if (*q != '\n') {			DEBUG(0, ("Got invalid ridstr: %s\n", p));			return False;		}		p = q+1;		ADD_TO_ARRAY(mem_ctx, uint32, rid, sids, num_rids);	}	return True;}static void getsidaliases_recv(TALLOC_CTX *mem_ctx, BOOL success,			       struct winbindd_response *response,			       void *c, void *private_data){	void (*cont)(void *priv, BOOL succ,		     DOM_SID *aliases, size_t num_aliases) = c;	char *aliases_str;	DOM_SID *sids = NULL;	size_t num_sids = 0;	if (!success) {		DEBUG(5, ("Could not trigger getsidaliases\n"));		cont(private_data, success, NULL, 0);		return;	}	if (response->result != WINBINDD_OK) {		DEBUG(5, ("getsidaliases returned an error\n"));		cont(private_data, False, NULL, 0);		return;	}	aliases_str = response->extra_data;	if (aliases_str == NULL) {		DEBUG(10, ("getsidaliases return 0 SIDs\n"));		cont(private_data, True, NULL, 0);		return;	}	if (!parse_sidlist(mem_ctx, aliases_str, &sids, &num_sids)) {		DEBUG(0, ("Could not parse sids\n"));		cont(private_data, False, NULL, 0);		return;	}	SAFE_FREE(response->extra_data);	cont(private_data, True, sids, num_sids);}void winbindd_getsidaliases_async(struct winbindd_domain *domain,				  TALLOC_CTX *mem_ctx,				  const DOM_SID *sids, size_t num_sids,			 	  void (*cont)(void *private_data,				 	       BOOL success,					       const DOM_SID *aliases,					       size_t num_aliases),				  void *private_data){	struct winbindd_request request;	char *sidstr = NULL;	ssize_t len;	if (num_sids == 0) {		cont(private_data, True, NULL, 0);		return;	}	if (!print_sidlist(mem_ctx, sids, num_sids, &sidstr, &len)) {		cont(private_data, False, NULL, 0);		return;	}	ZERO_STRUCT(request);	request.cmd = WINBINDD_DUAL_GETSIDALIASES;	request.extra_len = len;	request.extra_data = sidstr;	do_async_domain(mem_ctx, domain, &request, getsidaliases_recv,			cont, private_data);}enum winbindd_result winbindd_dual_getsidaliases(struct winbindd_domain *domain,						 struct winbindd_cli_state *state){	DOM_SID *sids = NULL;	size_t num_sids = 0;	char *sidstr;	ssize_t len;	size_t i;	uint32 num_aliases;	uint32 *alias_rids;	NTSTATUS result;	DEBUG(3, ("[%5lu]: getsidaliases\n", (unsigned long)state->pid));	sidstr = state->request.extra_data;	if (sidstr == NULL)		sidstr = talloc_strdup(state->mem_ctx, "\n"); /* No SID */	DEBUG(10, ("Sidlist: %s\n", sidstr));	if (!parse_sidlist(state->mem_ctx, sidstr, &sids, &num_sids)) {		DEBUG(0, ("Could not parse SID list: %s\n", sidstr));		return WINBINDD_ERROR;	}	num_aliases = 0;	alias_rids = NULL;	result = domain->methods->lookup_useraliases(domain,						     state->mem_ctx,						     num_sids, sids,						     &num_aliases,						     &alias_rids);	if (!NT_STATUS_IS_OK(result)) {		DEBUG(3, ("Could not lookup_useraliases: %s\n",			  nt_errstr(result)));		return WINBINDD_ERROR;	}	num_sids = 0;	sids = NULL;	DEBUG(10, ("Got %d aliases\n", num_aliases));	for (i=0; i<num_aliases; i++) {		DOM_SID sid;		DEBUGADD(10, (" rid %d\n", alias_rids[i]));		sid_copy(&sid, &domain->sid);		sid_append_rid(&sid, alias_rids[i]);		add_sid_to_array(state->mem_ctx, &sid, &sids, &num_sids);	}	if (!print_sidlist(NULL, sids, num_sids,			   (char **)&state->response.extra_data, &len)) {		DEBUG(0, ("Could not print_sidlist\n"));		return WINBINDD_ERROR;	}	if (state->response.extra_data != NULL) {		DEBUG(10, ("aliases_list: %s\n",			   (char *)state->response.extra_data));		state->response.length += len+1;	}		return WINBINDD_OK;}struct gettoken_state {	TALLOC_CTX *mem_ctx;	DOM_SID user_sid;	struct winbindd_domain *alias_domain;	struct winbindd_domain *builtin_domain;	DOM_SID *sids;	size_t num_sids;	void (*cont)(void *private_data, BOOL success, DOM_SID *sids, size_t num_sids);	void *private_data;};static void gettoken_recvdomgroups(TALLOC_CTX *mem_ctx, BOOL success,				   struct winbindd_response *response,				   void *c, void *private_data);static void gettoken_recvaliases(void *private_data, BOOL success,				 const DOM_SID *aliases,				 size_t num_aliases);				 void winbindd_gettoken_async(TALLOC_CTX *mem_ctx, const DOM_SID *user_sid,			     void (*cont)(void *private_data, BOOL success,					  DOM_SID *sids, size_t num_sids),

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?