SQLcounter patch - Addition of reply-attribute
Jonathan De Graeve
Jonathan.De.Graeve at imelda.be
Sat Oct 21 23:27:07 CEST 2006
I just made a patch against 1.1.3 for the SQLcounter module.
This patch allows to set the reply-name variable in the sqlcounter.conf
file per instance. In this way the default behaviour of Session-Timeout
can be overridden by your own reply-attribute. The system will set the
session-timeout attribute if you omit the reply-name var in your config
for backwards compatibility.
I'm planning the following additions:
The ability to override the reject behaviour with an accept but adding
attributes.
For example: if the user has reached his volume limit, accept the user
but add speed-limitation attributes.
<BEGIN OF PATCH>
--- rlm_sqlcounter.c.orig 2006-10-21 23:18:04.147404980 +0200
+++ rlm_sqlcounter.c 2006-10-21 23:01:30.190552948 +0200
@@ -65,17 +65,19 @@
* be used as the instance handle.
*/
typedef struct rlm_sqlcounter_t {
- char *counter_name; /* Daily-Session-Time */
- char *check_name; /* Max-Daily-Session */
- char *key_name; /* User-Name */
+ char *counter_name; /* Daily-Session-Time */
+ char *check_name; /* Max-Daily-Session */
+ char *key_name; /* User-Name */
+ char *reply_name; /* Authorized Reply, defaults to
Session-Timeout */
char *sqlmod_inst; /* instance of SQL module to use,
usually just 'sql' */
char *query; /* SQL query to retrieve current session
time */
- char *reset; /* daily, weekly, monthly, never or user
defined */
+ char *reset; /* daily, weekly, monthly, never or user
defined */
char *allowed_chars; /* safe characters list for SQL queries
*/
time_t reset_time;
time_t last_reset;
int key_attr; /* attribute number for key field */
int dict_attr; /* attribute number for the counter. */
+ int reply_attr; /* attribute number for the authorized
OK reply, defaults to Session-Timeout */
} rlm_sqlcounter_t;
/*
@@ -91,6 +93,7 @@
{ "counter-name", PW_TYPE_STRING_PTR,
offsetof(rlm_sqlcounter_t,counter_name), NULL, NULL },
{ "check-name", PW_TYPE_STRING_PTR,
offsetof(rlm_sqlcounter_t,check_name), NULL, NULL },
{ "key", PW_TYPE_STRING_PTR, offsetof(rlm_sqlcounter_t,key_name),
NULL, NULL },
+ { "reply-name", PW_TYPE_STRING_PTR,
offsetof(rlm_sqlcounter_t,reply_name), NULL, NULL },
{ "sqlmod-inst", PW_TYPE_STRING_PTR,
offsetof(rlm_sqlcounter_t,sqlmod_inst), NULL, NULL },
{ "query", PW_TYPE_STRING_PTR, offsetof(rlm_sqlcounter_t,query),
NULL, NULL },
{ "reset", PW_TYPE_STRING_PTR, offsetof(rlm_sqlcounter_t,reset),
NULL, NULL },
@@ -480,6 +483,27 @@
data->key_attr = dattr->attr;
/*
+ * Discover the attribute number of the reply.
+ * If not set, set it to Session-Timeout
+ * for backward compatibility
+ */
+ if (data->reply_name == NULL) {
+ DEBUG2("rlm_sqlcounter: 'reply' set to Session-Timeout
for counter name %s",data->counter_name);
+ data->reply_attr = PW_SESSION_TIMEOUT;
+ }
+ else {
+ dattr = dict_attrbyname(data->reply_name);
+ if (dattr == NULL) {
+ radlog(L_ERR, "rlm_sqlcounter: No such attribute
%s",
+ data->reply_name);
+ return -1;
+ }
+ data->reply_attr = dattr->attr;
+ DEBUG2("rlm_sqlcounter: Reply attribute %s is number %d",
+ data->reply_name, dattr->attr);
+ }
+
+ /*
* Check the "sqlmod-inst" option.
*/
if (data->sqlmod_inst == NULL) {
@@ -666,11 +690,12 @@
res += check_vp->lvalue;
}
- if ((reply_item = pairfind(request->reply->vps,
PW_SESSION_TIMEOUT)) != NULL) {
+ /* if ((reply_item = pairfind(request->reply->vps,
PW_SESSION_TIMEOUT)) != NULL) { */
+ if ((reply_item = pairfind(request->reply->vps,
data->reply_attr)) != NULL) {
if (reply_item->lvalue > res)
reply_item->lvalue = res;
} else {
- if ((reply_item = paircreate(PW_SESSION_TIMEOUT,
PW_TYPE_INTEGER)) == NULL) {
+ if ((reply_item = paircreate(data->reply_attr,
PW_TYPE_INTEGER)) == NULL) {
radlog(L_ERR|L_CONS, "no memory");
return RLM_MODULE_NOOP;
}
@@ -682,8 +707,8 @@
DEBUG2("rlm_sqlcounter: Authorized user %s,
check_item=%d, counter=%d",
key_vp->strvalue,check_vp->lvalue,counter);
- DEBUG2("rlm_sqlcounter: Sent Reply-Item for user %s,
Type=Session-Timeout, value=%d",
- key_vp->strvalue,reply_item->lvalue);
+ DEBUG2("rlm_sqlcounter: Sent Reply-Item for user %s,
Type=%d, value=%d",
+
key_vp->strvalue,data->reply_attr,reply_item->lvalue);
}
else{
char module_fmsg[MAX_STRING_LEN];
@@ -722,6 +778,7 @@
free(data->sqlmod_inst);
free(data->counter_name);
free(data->allowed_chars);
+ free(data->reply_name);
allowed_chars = NULL;
free(instance);
</END OF PATCH>
Enjoy this patch,
J.
--
Jonathan De Graeve
IMELDA vzw
Informatica Dienst
Network System Engineer
jonathan.de.graeve at imelda.be
+32(0)15/50.52.98
More information about the Freeradius-Users
mailing list