我有一个FreeRADIUS C语言模块,该模块实现MOD_AUTHENTICATE和MOD_AUTHORIZE方法以实现自定义身份验证。我需要能够以编程方式将VSA添加到Access-Accept答复中。
我用radius_pair_create()和fr_pair_add()方法(请参见下面的代码片段)有点玩味,但是并没有对答复内容产生任何变化,可能是因为我指定了供应商中不存在的临时值专用字典。或者是因为我没有正确使用它们。
我的FreeRADIUS版本是3_0_19
任何信息,指针,尤其是语法示例,将受到高度赞赏。
void test_vsa(REQUEST *request)
{
VALUE_PAIR *vp = NULL;
vp = radius_pair_create(request->reply, NULL, 18, 0);
if (vp)
{
log("Created VALUE_PAIR");
vp->vp_integer = 96;
fr_pair_add(&request->reply->vps, vp);
}
else
{
log("Failed to create VALUE_PAIR");
}
}
所以首先,您正在将整数值写入字符串属性,这是错误的。服务器之所以不能SEGVing的唯一原因是因为VP的长度保留为零,因此RADIUS编码器不会费心地取消引用对内的char *
,因为该对本来包含对的值。
[fr_pair_make
是在此处使用的更简单的函数,因为它同时使用属性名称和值作为字符串,因此您不必担心C类型。
下面的代码段应该可以满足您的要求。
void test_avp(REQUEST *request)
{
VALUE_PAIR *vp = NULL;
vp = fr_pair_make(request->reply, &request->reply->vps, "Reply-Message", "Hello from FreeRADIUS", T_OP_SET);
if (vp)
{
log("Created VALUE_PAIR");
}
else
{
log("Failed to create VALUE_PAIR");
}
}
更多说明,让我们看一下doxygen标头:
/** Create a VALUE_PAIR from ASCII strings
*
* Converts an attribute string identifier (with an optional tag qualifier)
* and value string into a VALUE_PAIR.
*
* The string value is parsed according to the type of VALUE_PAIR being created.
*
* @param[in] ctx for talloc
* @param[in] vps list where the attribute will be added (optional)
* @param[in] attribute name.
* @param[in] value attribute value (may be NULL if value will be set later).
* @param[in] op to assign to new VALUE_PAIR.
* @return a new VALUE_PAIR.
*/
VALUE_PAIR *fr_pair_make(TALLOC_CTX *ctx, VALUE_PAIR **vps,
char const *attribute, char const *value, FR_TOKEN op)
request->packet
,回复应为request->reply
,控制权应为request
。fr_pair_make
会返回该对并将其插入列表。fr_pair_make
将尝试执行转换。因此,例如,为整数类型传递“ 12345”,将导致整数值12345被写入属性中的int
字段。T_OP_SET
,这意味着覆盖相同属性的现有实例。如果要了解不同的运算符及其作用,请参阅T_OP_*
的FR_TOKEN
值和使用它们的代码。