password.c

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

C
634
字号
	}		/* fill in the current_user_info struct */	set_current_user_info( &vuser->user );	return vuser->vuid;}/**************************************************************************** Add a name to the session users list.****************************************************************************/void add_session_user(const char *user){	fstring suser;	struct passwd *passwd;	if (!(passwd = Get_Pwnam(user)))		return;	fstrcpy(suser,passwd->pw_name);	if(!*suser)		return;	if( session_userlist && in_list(suser,session_userlist,False) )		return;	if( !session_userlist || (strlen(suser) + strlen(session_userlist) + 2 >= len_session_userlist) ) {		char *newlist;		if (len_session_userlist > 128 * PSTRING_LEN) {			DEBUG(3,("add_session_user: session userlist already too large.\n"));			return;		}		newlist = (char *)SMB_REALLOC( session_userlist, len_session_userlist + PSTRING_LEN );		if( newlist == NULL ) {			DEBUG(1,("Unable to resize session_userlist\n"));			return;		}		if (!session_userlist) {			*newlist = '\0';		}		session_userlist = newlist;		len_session_userlist += PSTRING_LEN;	}	safe_strcat(session_userlist," ",len_session_userlist-1);	safe_strcat(session_userlist,suser,len_session_userlist-1);}/**************************************************************************** Check if a username is valid.****************************************************************************/BOOL user_ok(const char *user,int snum, gid_t *groups, size_t n_groups){	char **valid, **invalid;	BOOL ret;	valid = invalid = NULL;	ret = True;	if (lp_invalid_users(snum)) {		str_list_copy(&invalid, lp_invalid_users(snum));		if (invalid &&		    str_list_substitute(invalid, "%S", lp_servicename(snum))) {			if ( invalid &&			     str_list_sub_basic(invalid,						current_user_info.smb_name) ) {				ret = !user_in_list(user,						    (const char **)invalid,						    groups, n_groups);			}		}	}	if (invalid)		str_list_free (&invalid);	if (ret && lp_valid_users(snum)) {		str_list_copy(&valid, lp_valid_users(snum));		if ( valid &&		     str_list_substitute(valid, "%S", lp_servicename(snum)) ) {			if ( valid &&			     str_list_sub_basic(valid,						current_user_info.smb_name) ) {				ret = user_in_list(user, (const char **)valid,						   groups, n_groups);			}		}	}	if (valid)		str_list_free (&valid);	if (ret && lp_onlyuser(snum)) {		char **user_list = str_list_make (lp_username(snum), NULL);		if (user_list &&		    str_list_substitute(user_list, "%S",					lp_servicename(snum))) {			ret = user_in_list(user, (const char **)user_list,					   groups, n_groups);		}		if (user_list) str_list_free (&user_list);	}	return(ret);}/**************************************************************************** Validate a group username entry. Return the username or NULL.****************************************************************************/static char *validate_group(char *group, DATA_BLOB password,int snum){#ifdef HAVE_NETGROUP	{		char *host, *user, *domain;		setnetgrent(group);		while (getnetgrent(&host, &user, &domain)) {			if (user) {				if (user_ok(user, snum, NULL, 0) && 				    password_ok(user,password)) {					endnetgrent();					return(user);				}			}		}		endnetgrent();	}#endif  #ifdef HAVE_GETGRENT	{		struct group *gptr;		setgrent();		while ((gptr = (struct group *)getgrent())) {			if (strequal(gptr->gr_name,group))				break;		}		/*		 * As user_ok can recurse doing a getgrent(), we must		 * copy the member list into a pstring on the stack before		 * use. Bug pointed out by leon@eatworms.swmed.edu.		 */		if (gptr) {			pstring member_list;			char *member;			size_t copied_len = 0;			int i;			*member_list = '\0';			member = member_list;			for(i = 0; gptr->gr_mem && gptr->gr_mem[i]; i++) {				size_t member_len = strlen(gptr->gr_mem[i]) + 1;				if( copied_len + member_len < sizeof(pstring)) { 					DEBUG(10,("validate_group: = gr_mem = %s\n", gptr->gr_mem[i]));					safe_strcpy(member, gptr->gr_mem[i], sizeof(pstring) - copied_len - 1);					copied_len += member_len;					member += copied_len;				} else {					*member = '\0';				}			}			endgrent();			member = member_list;			while (*member) {				static fstring name;				fstrcpy(name,member);				if (user_ok(name,snum, NULL, 0) &&				    password_ok(name,password)) {					endgrent();					return(&name[0]);				}				DEBUG(10,("validate_group = member = %s\n", member));				member += strlen(member) + 1;			}		} else {			endgrent();			return NULL;		}	}#endif	return(NULL);}/**************************************************************************** Check for authority to login to a service with a given username/password. Note this is *NOT* used when logging on using sessionsetup_and_X.****************************************************************************/BOOL authorise_login(int snum, fstring user, DATA_BLOB password, 		     BOOL *guest){	BOOL ok = False;	#ifdef DEBUG_PASSWORD	DEBUG(100,("authorise_login: checking authorisation on "		   "user=%s pass=%s\n", user,password.data));#endif	*guest = False;  	/* there are several possibilities:		1) login as the given user with given password		2) login as a previously registered username with the given 		   password		3) login as a session list username with the given password		4) login as a previously validated user/password pair		5) login as the "user =" user with given password		6) login as the "user =" user with no password 		   (guest connection)		7) login as guest user with no password		if the service is guest_only then steps 1 to 5 are skipped	*/	/* now check the list of session users */	if (!ok) {		char *auser;		char *user_list = NULL;		if ( session_userlist )			user_list = SMB_STRDUP(session_userlist);		else			user_list = SMB_STRDUP("");		if (!user_list)			return(False);				for (auser=strtok(user_list,LIST_SEP); !ok && auser;		     auser = strtok(NULL,LIST_SEP)) {			fstring user2;			fstrcpy(user2,auser);			if (!user_ok(user2,snum, NULL, 0))				continue;						if (password_ok(user2,password)) {				ok = True;				fstrcpy(user,user2);				DEBUG(3,("authorise_login: ACCEPTED: session "					 "list username (%s) and given "					 "password ok\n", user));			}		}		SAFE_FREE(user_list);	}		/* check the user= fields and the given password */	if (!ok && lp_username(snum)) {		char *auser;		pstring user_list;		pstrcpy(user_list,lp_username(snum));				pstring_sub(user_list,"%S",lp_servicename(snum));				for (auser=strtok(user_list,LIST_SEP); auser && !ok;		     auser = strtok(NULL,LIST_SEP)) {			if (*auser == '@') {				auser = validate_group(auser+1,password,snum);				if (auser) {					ok = True;					fstrcpy(user,auser);					DEBUG(3,("authorise_login: ACCEPTED: "						 "group username and given "						 "password ok (%s)\n", user));				}			} else {				fstring user2;				fstrcpy(user2,auser);				if (user_ok(user2,snum, NULL, 0) &&				    password_ok(user2,password)) {					ok = True;					fstrcpy(user,user2);					DEBUG(3,("authorise_login: ACCEPTED: "						 "user list username and "						 "given password ok (%s)\n",						 user));				}			}		}	}	/* check for a normal guest connection */	if (!ok && GUEST_OK(snum)) {		fstring guestname;		fstrcpy(guestname,lp_guestaccount());		if (Get_Pwnam(guestname)) {			fstrcpy(user,guestname);			ok = True;			DEBUG(3,("authorise_login: ACCEPTED: guest account "				 "and guest ok (%s)\n",	user));		} else {			DEBUG(0,("authorise_login: Invalid guest account "				 "%s??\n",guestname));		}		*guest = True;	}	if (ok && !user_ok(user, snum, NULL, 0)) {		DEBUG(0,("authorise_login: rejected invalid user %s\n",user));		ok = False;	}	return(ok);}

⌨️ 快捷键说明

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