summaryrefslogtreecommitdiff
path: root/accel-pppd/radius/radius.c
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pppd/radius/radius.c')
-rw-r--r--accel-pppd/radius/radius.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/accel-pppd/radius/radius.c b/accel-pppd/radius/radius.c
index e3fe4b3f..6a5e553f 100644
--- a/accel-pppd/radius/radius.c
+++ b/accel-pppd/radius/radius.c
@@ -49,6 +49,7 @@ int conf_req_limit;
static const char *conf_default_realm;
static int conf_default_realm_len;
+static int conf_strip_realm;
const char *conf_attr_tunnel_type;
@@ -411,18 +412,27 @@ static int rad_pwdb_check(struct pwdb_t *pwdb, struct ap_session *ses, pwdb_call
struct radius_pd_t *rpd = find_pd(ses);
char username1[256];
- if (conf_default_realm && !strchr(username, '@')) {
- int len = strlen(username);
- if (len + conf_default_realm_len >= 256 - 2) {
- log_ppp_error("radius: username is too large to append realm\n");
- return PWDB_DENIED;
+ if (conf_strip_realm || conf_default_realm) {
+ int len = strchrnul(username, '@') - username;
+ if (conf_strip_realm && username[len]) {
+ if (len > sizeof(username1) - 1) {
+ log_ppp_error("radius: username is too large to strip realm\n");
+ return PWDB_DENIED;
+ }
+ username = memcpy(username1, username, len);
+ username1[len] = '\0';
+ }
+ if (conf_default_realm && username[len] == '\0') {
+ if (len + conf_default_realm_len > sizeof(username1) - 2) {
+ log_ppp_error("radius: username is too large to append realm\n");
+ return PWDB_DENIED;
+ }
+ if (username != username1)
+ username = memcpy(username1, username, len);
+ username1[len++] = '@';
+ memcpy(username1 + len, conf_default_realm, conf_default_realm_len);
+ username1[len + conf_default_realm_len] = '\0';
}
-
- memcpy(username1, username, len);
- username1[len] = '@';
- memcpy(username1 + len + 1, conf_default_realm, conf_default_realm_len);
- username1[len + 1 + conf_default_realm_len] = 0;
- username = username1;
}
rpd->auth_ctx = mempool_alloc(auth_ctx_pool);
@@ -989,6 +999,10 @@ static int load_config(void)
if (conf_default_realm)
conf_default_realm_len = strlen(conf_default_realm);
+ opt = conf_get_opt("radius", "strip-realm");
+ if (opt && atoi(opt) >= 0)
+ conf_strip_realm = atoi(opt) > 0;
+
return 0;
}