Annotation of embedaddon/coova-chilli/src/test-radius.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (c) 2006-2007 David Bird <david@coova.com>
                      3:  *
                      4:  */
                      5: #include "system.h"
                      6: #include "syserr.h"
                      7: #include "cmdline.h"
                      8: #include "dhcp.h"
                      9: #include "radius.h"
                     10: #include "radius_chillispot.h"
                     11: #include "radius_wispr.h"
                     12: #include "redir.h"
                     13: #include "chilli.h"
                     14: #include "options.h"
                     15: 
                     16: static int chilliauth_cb(struct radius_t *radius,
                     17:                         struct radius_packet_t *pack,
                     18:                         struct radius_packet_t *pack_req, void *cbp) {
                     19:   struct radius_attr_t *attr = NULL;
                     20:   /*char attrs[RADIUS_ATTR_VLEN+1];*/
                     21:   size_t offset = 0;
                     22:   
                     23:   if (!pack) { 
                     24:     sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Radius request timed out");
                     25:     return 0;
                     26:   }
                     27: 
                     28:   if ((pack->code != RADIUS_CODE_ACCESS_REJECT) && 
                     29:       (pack->code != RADIUS_CODE_ACCESS_CHALLENGE) &&
                     30:       (pack->code != RADIUS_CODE_ACCESS_ACCEPT)) {
                     31:     sys_err(LOG_ERR, __FILE__, __LINE__, 0, 
                     32:            "Unknown radius access reply code %d", pack->code);
                     33:     return 0;
                     34:   }
                     35: 
                     36:   /* ACCESS-ACCEPT */
                     37:   if (pack->code != RADIUS_CODE_ACCESS_ACCEPT) {
                     38:     sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Administrative-User Login Failed");
                     39:     return 0;
                     40:   }
                     41: 
                     42:   while (!radius_getnextattr(pack, &attr, 
                     43:                             RADIUS_ATTR_VENDOR_SPECIFIC,
                     44:                             RADIUS_VENDOR_CHILLISPOT,
                     45:                             RADIUS_ATTR_CHILLISPOT_CONFIG, 
                     46:                             0, &offset)) {
                     47:     char value[RADIUS_ATTR_VLEN+1] = "";
                     48:     strncpy(value, (const char *)attr->v.t, attr->l - 2);
                     49:     printf("%s\n", value);
                     50:   }
                     51: 
                     52:   return 0;
                     53:   
                     54: }
                     55: 
                     56: int static test_radius() {
                     57:   struct radius_t *radius;
                     58:   struct radius_packet_t radius_pack;
                     59:   struct timeval idleTime;
                     60:   int starttime;
                     61:   int maxfd = 0;
                     62:   fd_set fds;
                     63:   int status;
                     64: 
                     65:   if (!options.adminuser || !options.adminpasswd) return 1;
                     66: 
                     67:   if (radius_new(&radius, &options.radiuslisten, 0, 0, NULL, 0, NULL, NULL, NULL)) {
                     68:     sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Failed to create radius");
                     69:     return -1;
                     70:   }
                     71: 
                     72:   radius_set(radius, 0, (options.debug & DEBUG_RADIUS));
                     73: 
                     74:   radius_set_cb_auth_conf(radius, chilliauth_cb); 
                     75: 
                     76:   {int cnt=0; for (; cnt < RADIUS_QUEUESIZE * 2; cnt++) {
                     77: 
                     78:   if (radius_default_pack(radius, &radius_pack, RADIUS_CODE_ACCESS_REQUEST)) {
                     79:     sys_err(LOG_ERR, __FILE__, __LINE__, 0, "radius_default_pack() failed");
                     80:     return -1;
                     81:   }
                     82:   
                     83:   radius_addattr(radius, &radius_pack, RADIUS_ATTR_USER_NAME, 0, 0, 0,
                     84:                 (uint8_t *)options.adminuser, strlen(options.adminuser));
                     85: 
                     86:   radius_addattr(radius, &radius_pack, RADIUS_ATTR_USER_PASSWORD, 0, 0, 0,
                     87:                 (uint8_t *)options.adminpasswd, strlen(options.adminpasswd));
                     88: 
                     89:   radius_addnasip(radius, &radius_pack);
                     90: 
                     91:   radius_addattr(radius, &radius_pack, RADIUS_ATTR_SERVICE_TYPE, 0, 0,
                     92:                 RADIUS_SERVICE_TYPE_ADMIN_USER, NULL, 0); 
                     93:   
                     94:   if (options.radiusnasid)
                     95:     radius_addattr(radius, &radius_pack, RADIUS_ATTR_NAS_IDENTIFIER, 0, 0, 0,
                     96:                   (uint8_t *)options.radiusnasid, strlen(options.radiusnasid));
                     97:   
                     98:   if (options.nasmac)
                     99:     radius_addattr(radius, &radius_pack, RADIUS_ATTR_CALLED_STATION_ID, 0, 0, 0,
                    100:                   (uint8_t *)options.nasmac, strlen(options.nasmac)); 
                    101: 
                    102:   radius_addattr(radius, &radius_pack, RADIUS_ATTR_NAS_PORT_TYPE, 0, 0,
                    103:                 options.radiusnasporttype, NULL, 0);
                    104: 
                    105:   if (options.radiuslocationid)
                    106:     radius_addattr(radius, &radius_pack, RADIUS_ATTR_VENDOR_SPECIFIC,
                    107:                   RADIUS_VENDOR_WISPR, RADIUS_ATTR_WISPR_LOCATION_ID, 0,
                    108:                   (uint8_t *)options.radiuslocationid, strlen(options.radiuslocationid));
                    109: 
                    110:   if (options.radiuslocationname)
                    111:     radius_addattr(radius, &radius_pack, RADIUS_ATTR_VENDOR_SPECIFIC,
                    112:                   RADIUS_VENDOR_WISPR, RADIUS_ATTR_WISPR_LOCATION_NAME, 0,
                    113:                   (uint8_t *)options.radiuslocationname, 
                    114:                   strlen(options.radiuslocationname));
                    115:   
                    116:   radius_addattr(radius, &radius_pack, RADIUS_ATTR_MESSAGE_AUTHENTICATOR, 
                    117:                 0, 0, 0, NULL, RADIUS_MD5LEN);
                    118: 
                    119:   radius_req(radius, &radius_pack, NULL); 
                    120: 
                    121:   if (radius->fd <= 0) {
                    122:     sys_err(LOG_ERR, __FILE__, __LINE__, 0, "not a valid socket!");
                    123:     return -1;
                    124:   } 
                    125: 
                    126:   maxfd = radius->fd;
                    127: 
                    128:   starttime = time(NULL);
                    129:   while ((starttime + REDIR_RADIUS_MAX_TIME) > time(NULL)) {
                    130:     FD_ZERO(&fds);
                    131:     FD_SET(radius->fd, &fds);
                    132:     
                    133:     idleTime.tv_sec = 0;
                    134:     idleTime.tv_usec = REDIR_RADIUS_SELECT_TIME;
                    135:     radius_timeleft(radius, &idleTime);
                    136: 
                    137:     switch (status = select(maxfd + 1, &fds, NULL, NULL, &idleTime)) {
                    138:     case -1:
                    139:       sys_err(LOG_ERR, __FILE__, __LINE__, errno, "select() returned -1!");
                    140:       break;  
                    141:     case 0:
                    142:       radius_timeout(radius);
                    143:     default:
                    144:       break;
                    145:     }
                    146: 
                    147:     if (status > 0) {
                    148:       if (FD_ISSET(radius->fd, &fds)) {
                    149:        if (radius_decaps(radius) < 0) {
                    150:          sys_err(LOG_ERR, __FILE__, __LINE__, 0, "radius_ind() failed!");
                    151:        }
                    152:        break;
                    153:       }
                    154:     }
                    155:   }  
                    156: 
                    157:    }};
                    158: 
                    159:   radius_free(radius);
                    160:   return 0;
                    161: }
                    162: 
                    163: int main(int argc, char **argv)
                    164: {
                    165:   if (process_options(argc, argv, 1))
                    166:     exit(1);
                    167:   
                    168:   return test_radius();
                    169: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>