⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 username.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************** Check if a user is in a winbind group.****************************************************************************/  static BOOL user_in_winbind_group_list(const char *user, const char *gname,				       BOOL *winbind_answered){	int i; 	gid_t gid, gid_low, gid_high; 	BOOL ret = False;	static gid_t *groups = NULL;	static int num_groups = 0;	static fstring last_user = "";  	*winbind_answered = False; 	if ((gid = nametogid(gname)) == (gid_t)-1) { 		DEBUG(0,("user_in_winbind_group_list: nametogid for group %s "			 "failed.\n", gname )); 		goto err; 	}	if (!lp_idmap_gid(&gid_low, &gid_high)) {		DEBUG(4, ("winbind gid range not configured, therefore %s "			  "cannot be a winbind group\n", gname)); 		goto err;	}	if (gid < gid_low || gid > gid_high) {		DEBUG(4, ("group %s is not a winbind group\n", gname)); 		goto err;	} 	/* try to user the last user we looked up */	/* otherwise fall back to lookups */		if ( !strequal( last_user, user ) || !groups ) 	{		/* clear any cached information */		 	 	SAFE_FREE(groups);		fstrcpy( last_user, "" );	 	/* 		 * Get the gid's that this user belongs to. 		 */ 	 	if ((num_groups = winbind_getgroups(user, &groups)) == -1) 			return False;					if ( num_groups == -1 )			return False; 	 	if ( num_groups == 0 ) { 			*winbind_answered = True; 			return False; 		} 				/* save the last username */				fstrcpy( last_user, user );			}	else 		DEBUG(10,("user_in_winbind_group_list: using cached user "			  "groups for [%s]\n", user));  	if ( DEBUGLEVEL >= 10 ) {		DEBUG(10,("user_in_winbind_group_list: using groups -- "));	 	for ( i=0; i<num_groups; i++ )			DEBUGADD(10,("%lu ", (unsigned long)groups[i]));		DEBUGADD(10,("\n"));		} 	/*	 * Now we have the gid list for this user - convert the gname to a	 * gid_t via either winbind or the local UNIX lookup and do the	 * comparison.	 */  	for (i = 0; i < num_groups; i++) { 		if (gid == groups[i]) { 			ret = True; 			break; 		} 	}  	*winbind_answered = True; 	SAFE_FREE(groups); 	return ret;    err:  	*winbind_answered = False; 	SAFE_FREE(groups); 	return False;}	       /**************************************************************************** Check if a user is in a UNIX group.****************************************************************************/BOOL user_in_unix_group_list(const char *user,const char *gname){	struct passwd *pass = Get_Pwnam(user);	struct sys_userlist *user_list;	struct sys_userlist *member;	DEBUG(10,("user_in_unix_group_list: checking user %s in group %s\n",		  user, gname)); 	/* 	 * We need to check the users primary group as this 	 * group is implicit and often not listed in the group database. 	 */  	if (pass) { 		if (strequal(gname,gidtoname(pass->pw_gid))) { 			DEBUG(10,("user_in_unix_group_list: group %s is "				  "primary group.\n", gname )); 			return True; 		} 	} 	user_list = get_users_in_group(gname); 	if (user_list == NULL) { 		DEBUG(10,("user_in_unix_group_list: no such group %s\n",			  gname )); 		return False; 	}	for (member = user_list; member; member = member->next) { 		DEBUG(10,("user_in_unix_group_list: checking user %s against "			  "member %s\n", user, member->unix_name ));  		if (strequal(member->unix_name,user)) {			free_userlist(user_list);  			return(True);  		}	}	free_userlist(user_list);	return False;}	      /**************************************************************************** Check if a user is in a group list. Ask winbind first, then use UNIX.****************************************************************************/BOOL user_in_group_list(const char *user, const char *gname, gid_t *groups,			size_t n_groups){	BOOL winbind_answered = False;	BOOL ret;	gid_t gid;	unsigned i;	gid = nametogid(gname);	if (gid == (gid_t)-1) 		return False;	if (groups && n_groups > 0) {		for (i=0; i < n_groups; i++) {			if (groups[i] == gid) {				return True;			}		}		return False;	}	/* fallback if we don't yet have the group list */	ret = user_in_winbind_group_list(user, gname, &winbind_answered);	if (!winbind_answered)		ret = user_in_unix_group_list(user, gname);	if (ret)		DEBUG(10,("user_in_group_list: user |%s| is in group |%s|\n",			  user, gname));	return ret;}/**************************************************************************** Check if a user is in a user list - can check combinations of UNIX and netgroup lists.****************************************************************************/BOOL user_in_list(const char *user,const char **list, gid_t *groups,		  size_t n_groups){	if (!list || !*list)		return False;	DEBUG(10,("user_in_list: checking user %s in list\n", user));	while (*list) {		DEBUG(10,("user_in_list: checking user |%s| against |%s|\n",			  user, *list));		/*		 * Check raw username.		 */		if (strequal(user, *list))			return(True);		/*		 * Now check to see if any combination		 * of UNIX and netgroups has been specified.		 */		if(**list == '@') {			/*			 * Old behaviour. Check netgroup list			 * followed by UNIX list.			 */			if(user_in_netgroup_list(user, *list +1))				return True;			if(user_in_group_list(user, *list +1, groups,					      n_groups))				return True;		} else if (**list == '+') {			if((*(*list +1)) == '&') {				/*				 * Search UNIX list followed by netgroup.				 */				if(user_in_group_list(user, *list +2, groups,						      n_groups))					return True;				if(user_in_netgroup_list(user, *list +2))					return True;			} else {				/*				 * Just search UNIX list.				 */				if(user_in_group_list(user, *list +1, groups,						      n_groups))					return True;			}		} else if (**list == '&') {			if(*(*list +1) == '+') {				/*				 * Search netgroup list followed by UNIX list.				 */				if(user_in_netgroup_list(user, *list +2))					return True;				if(user_in_group_list(user, *list +2, groups,						      n_groups))					return True;			} else {				/*				 * Just search netgroup list.				 */				if(user_in_netgroup_list(user, *list +1))					return True;			}		} else if (!name_is_local(*list)) {			/*			 * If user name did not match and token is not a unix			 * group and the token has a winbind separator in the			 * name then see if it is a Windows group.			 */			DOM_SID g_sid;			enum SID_NAME_USE name_type;			BOOL winbind_answered = False;			BOOL ret;			fstring groupname, domain;						/* Parse a string of the form DOMAIN/user into a			 * domain and a user */			char *p = strchr(*list,*lp_winbind_separator());						DEBUG(10,("user_in_list: checking if user |%s| is in "				  "winbind group |%s|\n", user, *list));			if (p) {				fstrcpy(groupname, p+1);				fstrcpy(domain, *list);				domain[PTR_DIFF(p, *list)] = 0;				/* Check to see if name is a Windows group;				   Win2k native mode DCs will return domain				   local groups; while NT4 or mixed mode 2k				   DCs will not */							if ( winbind_lookup_name(domain, groupname,							 &g_sid, &name_type) 				     && ( name_type==SID_NAME_DOM_GRP || 					  (strequal(lp_workgroup(), domain) &&					   name_type==SID_NAME_ALIAS) ) )				{										/* Check if user name is in the					 * Windows group */					ret = user_in_winbind_group_list(						user, *list,						&winbind_answered);										if (winbind_answered && ret == True) {						DEBUG(10,("user_in_list: user "							  "|%s| is in winbind "							  "group |%s|\n",							  user, *list));						return ret;					}				}			}		}    		list++;	}	return(False);}/* The functions below have been taken from password.c and slightly modified *//**************************************************************************** Apply a function to upper/lower case combinations of a string and return true if one of them returns true. Try all combinations with N uppercase letters. offset is the first char to try and change (start with 0) it assumes the string starts lowercased****************************************************************************/static struct passwd *uname_string_combinations2(char *s,int offset,struct passwd *(*fn)(const char *),int N){	ssize_t len = (ssize_t)strlen(s);	int i;	struct passwd *ret;	if (N <= 0 || offset >= len)		return(fn(s));	for (i=offset;i<(len-(N-1));i++) {		char c = s[i];		if (!islower_ascii((int)c))			continue;		s[i] = toupper_ascii(c);		ret = uname_string_combinations2(s,i+1,fn,N-1);		if(ret)			return(ret);		s[i] = c;	}	return(NULL);}/**************************************************************************** Apply a function to upper/lower case combinations of a string and return true if one of them returns true. Try all combinations with up to N uppercase letters. offset is the first char to try and change (start with 0) it assumes the string starts lowercased****************************************************************************/static struct passwd * uname_string_combinations(char *s,struct passwd * (*fn)(const char *),int N){	int n;	struct passwd *ret;	for (n=1;n<=N;n++) {		ret = uname_string_combinations2(s,0,fn,n);		if(ret)			return(ret);	}  	return(NULL);}

⌨️ 快捷键说明

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