在 FreeRADIUS C 模块中以编程方式将 VSA(供应商特定属性)添加到 Access-Accept 回复
Add a VSA (Vendor Specific Attribute) to Access-Accept reply programmatically in FreeRADIUS C module
我有一个 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 header:
/** 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)
- ctx - 这是 vps 所属的数据包或请求。如果您向请求添加属性,它应该是
request->packet
,回复应该是 request->reply
,控制应该是 request
.
- vps - 如果指定,这将是将新 VP 插入的列表。如果这是 NULL
fr_pair_make
将只是 return 对并让你将它插入到列表中。
- attribute - 作为字符串的属性名称。
- value - 作为字符串的属性值。对于 non-string 类型,
fr_pair_make
将尝试执行转换。因此,例如,为整数类型传递“12345”,将导致整数值 12345 写入属性中的 int
字段。
- op - 您通常需要我们
T_OP_SET
,这意味着覆盖相同属性的现有实例。如果您想了解不同的运算符及其作用,请参阅 FR_TOKEN
的 T_OP_*
值和使用它们的代码。
我有一个 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 header:
/** 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)
- ctx - 这是 vps 所属的数据包或请求。如果您向请求添加属性,它应该是
request->packet
,回复应该是request->reply
,控制应该是request
. - vps - 如果指定,这将是将新 VP 插入的列表。如果这是 NULL
fr_pair_make
将只是 return 对并让你将它插入到列表中。 - attribute - 作为字符串的属性名称。
- value - 作为字符串的属性值。对于 non-string 类型,
fr_pair_make
将尝试执行转换。因此,例如,为整数类型传递“12345”,将导致整数值 12345 写入属性中的int
字段。 - op - 您通常需要我们
T_OP_SET
,这意味着覆盖相同属性的现有实例。如果您想了解不同的运算符及其作用,请参阅FR_TOKEN
的T_OP_*
值和使用它们的代码。