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

📄 valuepair.c

📁 使用最广泛的radius的linux的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
			 *	Attributes we skip during comparison.			 *	These are "server" check items.			 */			case PW_CRYPT_PASSWORD:			case PW_AUTH_TYPE:			case PW_AUTZ_TYPE:			case PW_ACCT_TYPE:			case PW_SESSION_TYPE:			case PW_STRIP_USER_NAME:				continue;				break;			/*			 *	IF the password attribute exists, THEN			 *	we can do comparisons against it.  If not,			 *	then the request did NOT contain a			 *	User-Password attribute, so we CANNOT do			 *	comparisons against it.			 *			 *	This hack makes CHAP-Password work..			 */			case PW_USER_PASSWORD:				if (check_item->operator == T_OP_CMP_EQ) {					DEBUG("WARNING: Found User-Password == \"...\".");					DEBUG("WARNING: Are you sure you don't mean Cleartext-Password?");					DEBUG("WARNING: See \"man rlm_pap\" for more information.");				}				if (pairfind(request, PW_USER_PASSWORD) == NULL) {					continue;				}				break;		}		/*		 *	See if this item is present in the request.		 */		other = otherattr(check_item->attribute);		auth_item = request;	try_again:		if (other >= 0) {			for (; auth_item != NULL; auth_item = auth_item->next) {				if (auth_item->attribute == other || other == 0)					break;			}		}		/*		 *	Not found, it's not a match.		 */		if (auth_item == NULL) {			/*			 *	Didn't find it.  If we were *trying*			 *	to not find it, then we succeeded.			 */			if (check_item->operator == T_OP_CMP_FALSE)				continue;			else				return -1;		}		/*		 *	Else we found it, but we were trying to not		 *	find it, so we failed.		 */		if (check_item->operator == T_OP_CMP_FALSE)			return -1;		/*		 *	We've got to xlat the string before doing		 *	the comparison.		 */		if (check_item->flags.do_xlat) {			int rcode;			char buffer[sizeof(check_item->vp_strvalue)];			check_item->flags.do_xlat = 0;			rcode = radius_xlat(buffer, sizeof(buffer),					    check_item->vp_strvalue,					    req, NULL);			/*			 *	Parse the string into a new value.			 */			pairparsevalue(check_item, buffer);		}		/*		 *	OK it is present now compare them.		 */		compare = radius_callback_compare(req, auth_item, check_item,						  check, reply);		switch (check_item->operator) {			case T_OP_EQ:			default:				radlog(L_INFO,  "Invalid operator for item %s: "						"reverting to '=='", check_item->name);				/*FALLTHRU*/		        case T_OP_CMP_TRUE:    /* compare always == 0 */		        case T_OP_CMP_FALSE:   /* compare always == 1 */			case T_OP_CMP_EQ:				if (compare != 0) result = -1;				break;			case T_OP_NE:				if (compare == 0) result = -1;				break;			case T_OP_LT:				if (compare >= 0) result = -1;				break;			case T_OP_GT:				if (compare <= 0) result = -1;				break;			case T_OP_LE:				if (compare > 0) result = -1;				break;			case T_OP_GE:				if (compare < 0) result = -1;				break;#ifdef HAVE_REGEX_H			case T_OP_REG_EQ:			case T_OP_REG_NE:				result = compare;				break;#endif		} /* switch over the operator of the check item */		/*		 *	This attribute didn't match, but maybe there's		 *	another of the same attribute, which DOES match.		 */		if ((result != 0) && (other >= 0)) {			auth_item = auth_item->next;			result = 0;			goto try_again;		}	} /* for every entry in the check item list */	return result;}/* *	Move pairs, replacing/over-writing them, and doing xlat. *//* *	Move attributes from one list to the other *	if not already present. */void pairxlatmove(REQUEST *req, VALUE_PAIR **to, VALUE_PAIR **from){	VALUE_PAIR **tailto, *i, *j, *next;	VALUE_PAIR *tailfrom = NULL;	VALUE_PAIR *found;	/*	 *	Point "tailto" to the end of the "to" list.	 */	tailto = to;	for(i = *to; i; i = i->next) {		tailto = &i->next;	}	/*	 *	Loop over the "from" list.	 */	for(i = *from; i; i = next) {		next = i->next;		/*		 *	Don't move 'fallthrough' over.		 */		if (i->attribute == PW_FALL_THROUGH) {			continue;		}		/*		 *	We've got to xlat the string before moving		 *	it over.		 */		if (i->flags.do_xlat) {			int rcode;			char buffer[sizeof(i->vp_strvalue)];			i->flags.do_xlat = 0;			rcode = radius_xlat(buffer, sizeof(buffer),					    i->vp_strvalue,					    req, NULL);			/*			 *	Parse the string into a new value.			 */			pairparsevalue(i, buffer);		}		found = pairfind(*to, i->attribute);		switch (i->operator) {			/*			 *  If a similar attribute is found,			 *  delete it.			 */		case T_OP_SUB:		/* -= */			if (found) {				if (!i->vp_strvalue[0] ||				    (strcmp((char *)found->vp_strvalue,					    (char *)i->vp_strvalue) == 0)){					pairdelete(to, found->attribute);					/*					 *	'tailto' may have been					 *	deleted...					 */					tailto = to;					for(j = *to; j; j = j->next) {						tailto = &j->next;					}				}			}			tailfrom = i;			continue;			break;			/*			 *  Add it, if it's not already there.			 */		case T_OP_EQ:		/* = */			if (found) {				tailfrom = i;				continue; /* with the loop */			}			break;			/*			 *  If a similar attribute is found,			 *  replace it with the new one.  Otherwise,			 *  add the new one to the list.			 */		case T_OP_SET:		/* := */			if (found) {				VALUE_PAIR *vp;				vp = found->next;				memcpy(found, i, sizeof(*found));				found->next = vp;				continue;			}			break;			/*			 *  FIXME: Add support for <=, >=, <, >			 *			 *  which will mean (for integers)			 *  'make the attribute the smaller, etc'			 */			/*			 *  Add the new element to the list, even			 *  if similar ones already exist.			 */		default:		case T_OP_ADD:		/* += */			break;		}		if (tailfrom)			tailfrom->next = next;		else			*from = next;		/*		 *	If ALL of the 'to' attributes have been deleted,		 *	then ensure that the 'tail' is updated to point		 *	to the head.		 */		if (!*to) {			tailto = to;		}		*tailto = i;		if (i) {			i->next = NULL;			tailto = &i->next;		}	} /* loop over the 'from' list */}/* *	Create a pair, and add it to a particular list of VPs * *	Note that this function ALWAYS returns.  If we're OOM, then *	it causes the server to exit! */VALUE_PAIR *radius_paircreate(REQUEST *request, VALUE_PAIR **vps,			      int attribute, int type){	VALUE_PAIR *vp;	request = request;	/* -Wunused */	vp = paircreate(attribute, type);	if (!vp) {		radlog(L_ERR, "No memory!");		rad_assert("No memory" == NULL);		_exit(1);	}	if (vps) pairadd(vps, vp);	return vp;}/* *	Create a pair, and add it to a particular list of VPs * *	Note that this function ALWAYS returns.  If we're OOM, then *	it causes the server to exit! */VALUE_PAIR *radius_pairmake(REQUEST *request, VALUE_PAIR **vps,			    const char *attribute, const char *value,			    int operator){	VALUE_PAIR *vp;	request = request;	/* -Wunused */	vp = pairmake(attribute, value, operator);	if (!vp) return NULL;	if (vps) pairadd(vps, vp);	return vp;}void debug_pair(VALUE_PAIR *vp){	if (!vp || !debug_flag || !fr_log_fp) return;	fputc('\t', fr_log_fp);	vp_print(fr_log_fp, vp);	fputc('\n', fr_log_fp);}void debug_pair_list(VALUE_PAIR *vp){	if (!vp || !debug_flag || !fr_log_fp) return;	while (vp) {		fputc('\t', fr_log_fp);		vp_print(fr_log_fp, vp);		fputc('\n', fr_log_fp);		vp = vp->next;	}}

⌨️ 快捷键说明

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