Opensips系列之使用自己的账号系统过滤非法请求

 

配置修改

修改opensips.cfg,判断sip的from header的user在不在指定sip_register_table里面

    else if (is_method("REGISTER")) 
    {
        #  auth_db模块中配置的数据库中的用户表
        $var(auth_code) = fs_authorize("$fU", "sip_register_table");
        if ( $var(auth_code) <= 0)
        {
            xlog("Authentication failed for $fU@$fd from $si cause $var(auth_code)");
            exit;
        }
                
        xlog( "User $fU Registered/Unregisterd Successfully From IP:$si");
    }

代码修改

修改authdb_mod.c,增加fs_authorize函数:判断sip的from header的user在不在指定_table里面。

如果不在,返回USER_UNKOWN。

static cmd_export_t cmds[] = {
    {"www_authorize", (cmd_function)www_authorize,   2, auth_fixup, 0, REQUEST_ROUTE},
    {"fs_authorize", (cmd_function)fs_authorize, 2, auth_fixup, 0, REQUEST_ROUTE},
    {"proxy_authorize", (cmd_function)proxy_authorize, 2, auth_fixup, 0, REQUEST_ROUTE},
    {0, 0, 0, 0, 0, 0}
};
int fs_authorize(struct sip_msg *_m, char *_fU, char *_table)
{
	int res;
	str table;
	db_res_t *result = NULL;
	struct username _username;

	if (fixup_get_svalue(_m, (gparam_t *)_fU, &_username.user) != 0) {
		LM_ERR("cannot get the username\n");
		return -1;
	}

	if (!_table) {
		LM_ERR("invalid table parameter\n");
		return -1;
	}

	table.s = _table;
	table.len = strlen(_table);

	res = get_userinfo(&_username, &table, &result);
	if (res < 0) {
		/* Error while accessing the database */
		if (sigb.reply(_m, 500, &auth_500_err, NULL) == -1) {
			LM_ERR("failed to send 500 reply\n");
		}
		return ERROR;
	}
	if (res > 0) {
		/* Username not found in the database */
		auth_dbf.free_result(auth_db_handle, result);
		return USER_UNKNOWN;
	}

	auth_dbf.free_result(auth_db_handle, result);
	return AUTHORIZED;
}
/**
 * select pass_column from _table where user_column = _username;
*/
static inline int get_userinfo(struct username *_username, const str *_table, db_res_t **res)
{
    db_key_t keys[1];
    db_val_t vals[1];
	db_key_t col = &pass_column;

	if (auth_dbf.use_table(auth_db_handle, _table) < 0) {
		LM_ERR("failed to use_table\n");
		return -1;
	}

    keys[0] = &user_column;

	VAL_TYPE(vals) = DB_STR;
	VAL_NULL(vals) = 0;

	VAL_STR(vals).s = _username->user.s;
	VAL_STR(vals).len = _username->user.len;

	if (auth_dbf.query(auth_db_handle, keys, 0, vals, &col, 1, 1, 0, res) < 0) {
		LM_ERR("failed to query database\n");
		return -1;
	}

	if (RES_ROW_N(*res) == 0) {
		LM_ERR("no result for user %.*s@%.*s,key_col:%s,value_col:%s\n", 
			   _username->user.len, ZSW(_username->user.s),
			   _table->len, ZSW(_table->s), user_column.s, pass_column.s);
		return 1;
	}

	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值