--- embedaddon/mpd/src/radius.c 2012/02/21 23:32:47 1.1.1.1 +++ embedaddon/mpd/src/radius.c 2013/07/22 08:44:29 1.1.1.2 @@ -1,7 +1,7 @@ /* * See ``COPYRIGHT.mpd'' * - * $Id: radius.c,v 1.1.1.1 2012/02/21 23:32:47 misho Exp $ + * $Id: radius.c,v 1.1.1.2 2013/07/22 08:44:29 misho Exp $ * */ @@ -49,6 +49,7 @@ /* Set menu options */ enum { + UNSET_SERVER, SET_SERVER, SET_ME, SET_MEV6, @@ -63,7 +64,12 @@ /* * GLOBAL VARIABLES */ - + const struct cmdtab RadiusUnSetCmds[] = { + { "server {name} [{auth port}] [{acct port}]", "Unset (remove) radius server" , + RadiusSetCommand, NULL, 2, (void *) UNSET_SERVER }, + { NULL }, + }; + const struct cmdtab RadiusSetCmds[] = { { "server {name} {secret} [{auth port}] [{acct port}]", "Set radius server parameters" , RadiusSetCommand, NULL, 2, (void *) SET_SERVER }, @@ -344,6 +350,7 @@ RadiusSetCommand(Context ctx, int ac, char *av[], void RadConf const conf = &ctx->lnk->lcp.auth.conf.radius; RadServe_Conf server; RadServe_Conf t_server; + RadServe_Conf next, prev; int val, count; struct u_addr t; int auth_port = 1812; @@ -354,6 +361,37 @@ RadiusSetCommand(Context ctx, int ac, char *av[], void switch ((intptr_t)arg) { + case UNSET_SERVER: + + if (ac > 3 || ac < 1) { + return(-1); + } + for ( prev = NULL, t_server = conf->server ; + t_server != NULL && (next = t_server->next, 1) ; + prev = t_server, t_server = next) { + + if (strcmp(t_server->hostname, av[0]) != 0) + continue; + if (ac > 1 && t_server->auth_port != atoi(av[1])) + continue; + if (ac > 2 && t_server->acct_port != atoi(av[2])) + continue; + + if (t_server == conf->server) { + conf->server = t_server->next; + } else { + prev->next = t_server->next; + t_server->next = NULL; + } + + Freee(t_server->hostname); + Freee(t_server->sharedsecret); + Freee(t_server); + t_server = prev; + } + + break; + case SET_SERVER: if (ac > 4 || ac < 2) { return(-1); @@ -1421,9 +1459,9 @@ RadiusGetParams(AuthData auth, int eap_proxy) case RAD_FRAMED_IP_ADDRESS: ip = rad_cvt_addr(data); - Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_IP_ADDRESS: %s ", + Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_IP_ADDRESS: %s", auth->info.lnkname, inet_ntoa(ip))); - + if (strcmp(inet_ntoa(ip), "255.255.255.255") == 0) { /* the peer can choose an address */ Log(LG_RADIUS2, ("[%s] the peer can choose an address", auth->info.lnkname)); @@ -1446,20 +1484,20 @@ RadiusGetParams(AuthData auth, int eap_proxy) /* copy it into the persistent data struct */ strlcpy(auth->params.authname, tmpval, sizeof(auth->params.authname)); free(tmpval); - Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_USER_NAME: %s ", + Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_USER_NAME: %s", auth->info.lnkname, auth->params.authname)); break; case RAD_FRAMED_IP_NETMASK: ip = rad_cvt_addr(data); auth->params.netmask = in_addrtowidth(&ip); - Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_IP_NETMASK: %s (/%d) ", + Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_IP_NETMASK: %s (/%d)", auth->info.lnkname, inet_ntoa(ip), auth->params.netmask)); break; case RAD_FRAMED_ROUTE: route = rad_cvt_string(data, len); - Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_ROUTE: %s ", + Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_ROUTE: %s", auth->info.lnkname, route)); if (!ParseRange(route, &range, ALLOW_IPV4)) { Log(LG_RADIUS, ("[%s] RADIUS: Get RAD_FRAMED_ROUTE: Bad route \"%s\"", @@ -1488,7 +1526,7 @@ RadiusGetParams(AuthData auth, int eap_proxy) case RAD_FRAMED_IPV6_ROUTE: route = rad_cvt_string(data, len); - Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_IPV6_ROUTE: %s ", + Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_IPV6_ROUTE: %s", auth->info.lnkname, route)); if (!ParseRange(route, &range, ALLOW_IPV6)) { Log(LG_RADIUS, ("[%s] RADIUS: Get RAD_FRAMED_IPV6_ROUTE: Bad route \"%s\"", auth->info.lnkname, route)); @@ -1516,28 +1554,28 @@ RadiusGetParams(AuthData auth, int eap_proxy) case RAD_SESSION_TIMEOUT: auth->params.session_timeout = rad_cvt_int(data); - Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_SESSION_TIMEOUT: %u ", + Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_SESSION_TIMEOUT: %u", auth->info.lnkname, auth->params.session_timeout)); break; case RAD_IDLE_TIMEOUT: auth->params.idle_timeout = rad_cvt_int(data); - Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_IDLE_TIMEOUT: %u ", + Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_IDLE_TIMEOUT: %u", auth->info.lnkname, auth->params.idle_timeout)); break; case RAD_ACCT_INTERIM_INTERVAL: auth->params.acct_update = rad_cvt_int(data); - Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_ACCT_INTERIM_INTERVAL: %u ", + Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_ACCT_INTERIM_INTERVAL: %u", auth->info.lnkname, auth->params.acct_update)); break; case RAD_FRAMED_MTU: i = rad_cvt_int(data); - Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_MTU: %u ", + Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_MTU: %u", auth->info.lnkname, i)); if (i < IFACE_MIN_MTU || i > IFACE_MAX_MTU) { - Log(LG_RADIUS, ("[%s] RADIUS: Get RAD_FRAMED_MTU: invalid MTU: %u ", + Log(LG_RADIUS, ("[%s] RADIUS: Get RAD_FRAMED_MTU: invalid MTU: %u", auth->info.lnkname, i)); auth->params.mtu = 0; break; @@ -1576,11 +1614,15 @@ RadiusGetParams(AuthData auth, int eap_proxy) break; case RAD_REPLY_MESSAGE: + Freee(auth->reply_message); + auth->reply_message = NULL; + if (len == 0) + break; tmpval = rad_cvt_string(data, len); - Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_REPLY_MESSAGE: %s ", - auth->info.lnkname, tmpval)); auth->reply_message = Mdup(MB_AUTH, tmpval, len + 1); free(tmpval); + Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_REPLY_MESSAGE: %s", + auth->info.lnkname, auth->reply_message)); break; case RAD_FRAMED_POOL: @@ -1588,13 +1630,13 @@ RadiusGetParams(AuthData auth, int eap_proxy) /* copy it into the persistent data struct */ strlcpy(auth->params.ippool, tmpval, sizeof(auth->params.ippool)); free(tmpval); - Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_POOL: %s ", + Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_FRAMED_POOL: %s", auth->info.lnkname, auth->params.ippool)); break; case RAD_VENDOR_SPECIFIC: if ((res = rad_get_vendor_attr(&vendor, &data, &len)) == -1) { - Log(LG_RADIUS, ("[%s] RADIUS: Get vendor attr failed: %s ", + Log(LG_RADIUS, ("[%s] RADIUS: Get vendor attr failed: %s", auth->info.lnkname, rad_strerror(auth->radius.handle))); return RAD_NACK; } @@ -1653,6 +1695,9 @@ RadiusGetParams(AuthData auth, int eap_proxy) case RAD_MICROSOFT_MS_CHAP_DOMAIN: Freee(auth->params.msdomain); + auth->params.msdomain = NULL; + if (len == 0) + break; tmpval = rad_cvt_string(data, len); auth->params.msdomain = Mdup(MB_AUTH, tmpval, len + 1); free(tmpval); @@ -1724,7 +1769,7 @@ RadiusGetParams(AuthData auth, int eap_proxy) case RAD_MICROSOFT_MS_MPPE_ENCRYPTION_TYPES: { - char buf[64]; + char buf[48]; auth->params.msoft.types = rad_cvt_int(data); Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_MICROSOFT_MS_MPPE_ENCRYPTION_TYPES: %d (%s)", auth->info.lnkname, auth->params.msoft.types, @@ -1757,7 +1802,7 @@ RadiusGetParams(AuthData auth, int eap_proxy) break; default: - Log(LG_RADIUS2, ("[%s] RADIUS: Dropping MICROSOFT vendor specific attribute: %d ", + Log(LG_RADIUS2, ("[%s] RADIUS: Dropping MICROSOFT vendor specific attribute: %d", auth->info.lnkname, res)); break; } @@ -1843,7 +1888,7 @@ RadiusGetParams(AuthData auth, int eap_proxy) Log(LG_RADIUS2, ("[%s] RADIUS: Get RAD_MPD_FILTER: %s", auth->info.lnkname, acl)); acl2 = strsep(&acl1, "#"); - i = atol(acl2); + i = atoi(acl2); if (i <= 0 || i > ACL_FILTERS) { Log(LG_RADIUS, ("[%s] RADIUS: Wrong filter number: %i", auth->info.lnkname, i)); @@ -1892,17 +1937,16 @@ RadiusGetParams(AuthData auth, int eap_proxy) } #if defined(USE_NG_BPF) || defined(USE_IPFW) if (acl1 == NULL) { - Log(LG_ERR, ("[%s] RADIUS: Incorrect acl!", - auth->info.lnkname)); + Log(LG_ERR, ("[%s] RADIUS: Incorrect acl!", auth->info.lnkname)); free(acl); break; } - + acl3 = acl1; strsep(&acl3, "="); acl2 = acl1; strsep(&acl2, "#"); - i = atol(acl1); + i = atoi(acl1); if (i <= 0) { Log(LG_ERR, ("[%s] RADIUS: Wrong acl number: %i", auth->info.lnkname, i)); @@ -1933,8 +1977,7 @@ RadiusGetParams(AuthData auth, int eap_proxy) } else if (((*acls)->number == acls1->number) && (res != RAD_MPD_TABLE) && (res != RAD_MPD_TABLE_STATIC)) { - Log(LG_ERR, ("[%s] RADIUS: Duplicate acl", - auth->info.lnkname)); + Log(LG_ERR, ("[%s] RADIUS: Duplicate acl", auth->info.lnkname)); Freee(acls1); free(acl); break; @@ -1948,14 +1991,14 @@ RadiusGetParams(AuthData auth, int eap_proxy) #endif /* USE_NG_BPF or USE_IPFW */ default: - Log(LG_RADIUS2, ("[%s] RADIUS: Dropping vendor %d attribute: %d ", + Log(LG_RADIUS2, ("[%s] RADIUS: Dropping vendor %d attribute: %d", auth->info.lnkname, vendor, res)); break; } break; default: - Log(LG_RADIUS2, ("[%s] RADIUS: Dropping attribute: %d ", + Log(LG_RADIUS2, ("[%s] RADIUS: Dropping attribute: %d", auth->info.lnkname, res)); break; }