在FreeRADIUS C模块中以编程方式将VSA(卖方特定属性)添加到Access-Accept答复中

问题描述 投票:3回答:1

我有一个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");
    }
}
module freeradius radius
1个回答
2
投票

所以首先,您正在将整数值写入字符串属性,这是错误的。服务器之所以不能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)
  • ctx-这是vps所属的数据包或请求。如果要向请求添加属性,则属性应为request->packet,回复应为request->reply,控制权应为request
  • vps-如果指定,这将是新VP插入到的列表。如果为NULL,则fr_pair_make会返回该对并将其插入列表。
  • 属性-字符串形式的属性名称。
  • value-属性值作为字符串。对于非字符串类型,fr_pair_make将尝试执行转换。因此,例如,为整数类型传递“ 12345”,将导致整数值12345被写入属性中的int字段。
  • op-您通常需要T_OP_SET,这意味着覆盖相同属性的现有实例。如果要了解不同的运算符及其作用,请参阅T_OP_*FR_TOKEN值和使用它们的代码。
© www.soinside.com 2019 - 2024. All rights reserved.