Setting Client-IP-Address in rlm_preprocess

John Morrissey jwm at horde.net
Wed Oct 21 22:06:14 CEST 2009


On Wed, Sep 02, 2009 at 07:37:04PM -0400, John Morrissey wrote:
> Client-IP-Address is dynamically set by xlat_packet(). AFAICT, there's no
> way to trigger this in rlm_perl, so Client-IP-Address is never available in
> rlm_perl handlers.
> 
> This leads to some interesting unlang to set Client-IP-Address in the
> request so rlm_perl can access it:
> 
> authorize {
>     update request {
>         Client-IP-Address := "%{Client-IP-Address}"
>     }
> }
> 
> rlm_preprocess sets NAS-IP-Address if it's not set. Alan, would you accept a
> patch to add similar behavior for Client-IP-Address?

I forked the github FreeRADIUS tree a while ago and made this change.
I sent a pull request for this commit, but haven't seen it pulled into
the canonical git tree, so maybe it's preferable to post it to -devel?

john


commit 0778ffe67b78c56014029f95dce22222e94a110a
Author: John Morrissey <jwm at horde.net>
Date:   Tue Sep 8 16:04:21 2009 +0000

    set client address in the request if it's not present, similar to
    the treatment of nas ip address

diff --git a/src/modules/rlm_preprocess/rlm_preprocess.c b/src/modules/rlm_preprocess/rlm_preprocess.c
index 5c25569..7fe91da 100644
--- a/src/modules/rlm_preprocess/rlm_preprocess.c
+++ b/src/modules/rlm_preprocess/rlm_preprocess.c
@@ -455,6 +455,40 @@ static int add_nas_attr(REQUEST *request)
 	return 0;
 }
 
+static int add_client_attr(REQUEST *request)
+{
+	VALUE_PAIR *client_addr;
+
+	switch (request->packet->src_ipaddr.af) {
+	case AF_INET:
+		client_addr = pairfind(request->packet->vps, PW_CLIENT_IP_ADDRESS);
+		if (!client_addr) {
+			client_addr = radius_paircreate(request, &request->packet->vps,
+						PW_CLIENT_IP_ADDRESS,
+						PW_TYPE_IPADDR);
+			client_addr->vp_ipaddr = request->packet->src_ipaddr.ipaddr.ip4addr.s_addr;
+		}
+		break;
+
+	case AF_INET6:
+		client_addr = pairfind(request->packet->vps, PW_CLIENT_IPV6_ADDRESS);
+		if (!client_addr) {
+			client_addr = radius_paircreate(request, &request->packet->vps,
+						PW_CLIENT_IPV6_ADDRESS,
+						PW_TYPE_IPV6ADDR);
+			memcpy(client_addr->vp_strvalue,
+			       &request->packet->src_ipaddr.ipaddr,
+			       sizeof(request->packet->src_ipaddr.ipaddr));
+		}
+		break;
+
+	default:
+		radlog(L_ERR, "Unknown address family for packet");
+		return -1;
+	}
+
+	return 0;
+}
 
 /*
  *	Initialize.
@@ -560,6 +594,10 @@ static int preprocess_authorize(void *instance, REQUEST *request)
 		return RLM_MODULE_FAIL;
 	}
 
+	if (add_client_attr(request) < 0) {
+		return RLM_MODULE_FAIL;
+	}
+
 	hints_setup(data->hints, request);
 
 	/*
@@ -626,6 +664,10 @@ static int preprocess_preaccounting(void *instance, REQUEST *request)
 		return RLM_MODULE_FAIL;
 	}
 
+	if (add_client_attr(request) < 0) {
+		return RLM_MODULE_FAIL;
+	}
+
 	hints_setup(data->hints, request);
 
 	if ((r = huntgroup_access(request,

-- 
John Morrissey          _o            /\         ----  __o
jwm at horde.net        _-< \_          /  \       ----  <  \,
www.horde.net/    __(_)/_(_)________/    \_______(_) /_(_)__



More information about the Freeradius-Devel mailing list