bug-gnu-radius
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-gnu-radius] Failure to relay Access-Challenge


From: Sergey Poznyakoff
Subject: Re: [Bug-gnu-radius] Failure to relay Access-Challenge
Date: Fri, 23 Aug 2002 13:52:11 +0300

Hi Gayatri

The thing was a bit more difficult to solve than I thought. Please
find enclosed a patch for version 0.96.4. Theoretically it should
work for 0.96.3 too, with a fuzz factor of about -6 lines.

In case you are unable to apply the patch, you will find the prepared
tarball at anonymous:

 ftp://mirddin.farlep.net/pub/radius/alpha/gnu-radius-0.96.4-20020823.tar.gz

md5sum of the tarball is:
d6849c7a3d98792cfa1554d67c74bbd5  gnu-radius-0.96.4-20020823.tar.gz

Note also that in order for this to work, you will have to mark State
attribute with a proxy-propagate flag (P) in your raddb/dictionary.

Regards,
Sergey

Index: raddb/dictionary
===================================================================
RCS file: /cvsroot/radius/radius/raddb/dictionary,v
retrieving revision 1.24.2.4
diff -p -u -w -b -r1.24.2.4 dictionary
--- raddb/dictionary    14 Aug 2002 14:32:19 -0000      1.24.2.4
+++ raddb/dictionary    23 Aug 2002 10:42:31 -0000
@@ -45,7 +45,7 @@ ATTRIBUTE     Callback-Number         19      string  - [
 ATTRIBUTE      Callback-Id             20      string  - [-R----]=     
 ATTRIBUTE      Framed-Route            22      string  - [-R----]=
 ATTRIBUTE      Framed-IPX-Network      23      ipaddr  - [-R----]=
-ATTRIBUTE      State                   24      string  - [LRLRLR]
+ATTRIBUTE      State                   24      string  - [LRLRLR]P
 ATTRIBUTE      Class                   25      string  - [LRLRLR]
 ATTRIBUTE      Vendor-Specific         26      string  - [LR-R-R]
 ATTRIBUTE      Session-Timeout         27      integer - [-R----]=P
Index: radiusd/auth.c
===================================================================
RCS file: /cvsroot/radius/radius/radiusd/auth.c,v
retrieving revision 1.47.2.8
diff -p -u -w -b -r1.47.2.8 auth.c
--- radiusd/auth.c      17 Aug 2002 09:10:22 -0000      1.47.2.8
+++ radiusd/auth.c      23 Aug 2002 10:42:35 -0000
@@ -517,7 +517,7 @@ enum auth_state {
        as_ipaddr, 
        as_exec_wait, 
        as_cleanup_cbkid, 
-       as_menu,
+       as_menu_challenge,
        as_ack, 
        as_exec_nowait, 
        as_stop, 
@@ -565,6 +565,7 @@ static void sfn_ipaddr(AUTH_MACH*);
 static void sfn_exec_wait(AUTH_MACH*);
 static void sfn_cleanup_cbkid(AUTH_MACH*);
 static void sfn_menu(AUTH_MACH*);
+static void sfn_menu_challenge(AUTH_MACH*);
 static void sfn_ack(AUTH_MACH*);
 static void sfn_exec_nowait(AUTH_MACH*);
 static void sfn_reject(AUTH_MACH*);
@@ -617,11 +618,11 @@ struct auth_state_s states[] = {
        as_exec_wait,    as_cleanup_cbkid,
                         DA_EXEC_PROGRAM_WAIT, L_reply, sfn_exec_wait,
        
-       as_cleanup_cbkid,as_menu,
+       as_cleanup_cbkid,as_menu_challenge,
                         DA_CALLBACK_ID,  L_reply, sfn_cleanup_cbkid,
        
-       as_menu,         as_ack,
-                        DA_MENU,         L_reply, sfn_menu,
+       as_menu_challenge,         as_ack,
+                        DA_MENU,         L_reply, sfn_menu_challenge,
        
        as_ack,          as_exec_nowait,
                         0,               L_null, sfn_ack,
@@ -752,23 +753,9 @@ rad_authenticate(radreq, activefd)
        enum auth_state oldstate;
        struct auth_state_s *sp;
        struct auth_mach m;
-#ifdef USE_LIVINGSTON_MENUS
-       VALUE_PAIR *pair_ptr;
-#endif
 
        log_open(L_AUTH);
        
-#ifdef USE_LIVINGSTON_MENUS
-       /*
-        * If the request is processing a menu, service it here.
-        */
-       if ((pair_ptr = avl_find(radreq->request, DA_STATE)) != NULL &&
-           strncmp(pair_ptr->strvalue, "MENU=", 5) == 0) {
-           process_menu(radreq, activefd);
-           return 0;
-       }
-#endif
-
        m.req = radreq;
        m.activefd = activefd;
        m.user_check = NULL;
@@ -845,26 +832,50 @@ sfn_init(m)
        RADIUS_REQ *radreq = m->req;
        VALUE_PAIR *pair_ptr;
        
+       switch (radreq->server_code) {
+       case RT_AUTHENTICATION_REJECT:
+               m->user_check = avp_create(DA_AUTH_TYPE, 0,
+                                          NULL, DV_AUTH_TYPE_REJECT);
+               break;
+
+       case RT_AUTHENTICATION_ACK:
+               m->user_check = avp_create(DA_AUTH_TYPE, 0,
+                                          NULL, DV_AUTH_TYPE_ACCEPT);
+               break;
+
+       case 0:
+               break;
+
+       default:
+               rad_send_reply(radreq->server_code,
+                              radreq,
+                              radreq->server_reply,
+                              NULL,
+                              m->activefd);
+               newstate(as_stop);
+               return;
+       }
+       
+#ifdef USE_LIVINGSTON_MENUS
        /*
-        *      Move the proxy_state A/V pairs somewhere else.
+        * If the request is processing a menu, service it here.
         */
-       avl_move_attr(&m->proxy_pairs, &radreq->request, DA_PROXY_STATE);
+       if (radreq->server_code == 0
+           && (pair_ptr = avl_find(m->req->request, DA_STATE)) != NULL
+           && strncmp(pair_ptr->strvalue, "MENU=", 5) == 0) {
+           process_menu(m->req, m->activefd);
+           newstate(as_stop);
+           return;
+       }
+#endif
 
        /*
-        * If this request got proxied to another server, we need
-        * to add an initial Auth-Type: Auth-Accept for success,
-        * Auth-Reject for fail. We also need to add the reply
-        * pairs from the server to the initial reply.
+        *      Move the proxy_state A/V pairs somewhere else.
         */
-       if (radreq->server_code == RT_AUTHENTICATION_REJECT ||
-           radreq->server_code == RT_AUTHENTICATION_ACK) {
-               m->user_check = avp_create(DA_AUTH_TYPE, 0, NULL, 0);
-               proxied = 1;
-       }
-       if (radreq->server_code == RT_AUTHENTICATION_REJECT)
-               m->user_check->lvalue = DV_AUTH_TYPE_REJECT;
-       if (radreq->server_code == RT_AUTHENTICATION_ACK)
-               m->user_check->lvalue = DV_AUTH_TYPE_ACCEPT;
+       avl_move_attr(&m->proxy_pairs, &radreq->request, DA_PROXY_STATE);
+
+       /* If this request was proxied to another server, we need
+          to add the reply pairs from the server to the initial reply. */
 
        if (radreq->server_reply) {
                m->user_reply = radreq->server_reply;
@@ -881,7 +892,7 @@ sfn_init(m)
         */
        if (user_find(m->namepair->strvalue, radreq,
                      &m->user_check, &m->user_reply) != 0
-           && !proxied) {
+           && !radreq->server_code) {
 
                if (is_log_mode(m, RLOG_AUTH)) 
                        auth_log(m, _("Invalid user"), NULL, NULL, NULL);
@@ -1245,7 +1256,7 @@ sfn_cleanup_cbkid(m)
 }
 
 void
-sfn_menu(m)
+sfn_menu_challenge(m)
        AUTH_MACH *m;
 {
 #ifdef USE_LIVINGSTON_MENUS
Index: radiusd/radius.c
===================================================================
RCS file: /cvsroot/radius/radius/radiusd/radius.c,v
retrieving revision 1.20.2.1
diff -p -u -w -b -r1.20.2.1 radius.c
--- radiusd/radius.c    2 Jul 2002 20:54:53 -0000       1.20.2.1
+++ radiusd/radius.c    23 Aug 2002 10:42:35 -0000
@@ -159,8 +159,8 @@ rad_send_reply(code, radreq, oreply, msg
                                reply->strlength = strlen(reply->strvalue);
 
                        len = reply->strlength;
-                       if (len >= AUTH_STRING_LEN) {
-                               len = AUTH_STRING_LEN - 1;
+                       if (len > AUTH_STRING_LEN) {
+                               len = AUTH_STRING_LEN;
                        }
                        if (total_length + len + 2 >= SEND_BUFFER_SIZE)
                                goto err;
@@ -415,7 +415,7 @@ radrecv(host, udp_port, buffer, length)
 
                if ((attr = attr_number_to_dict(attribute)) == NULL) {
                        debug(1, ("Received unknown attribute %d", attribute));
-               } else if ( attrlen >= AUTH_STRING_LEN ) {
+               } else if ( attrlen > AUTH_STRING_LEN ) {
                        debug(1, ("attribute %d too long, %d >= %d", attribute,
                                attrlen, AUTH_STRING_LEN));
                } else if ( attrlen > length ) {
Index: radiusd/radiusd.c
===================================================================
RCS file: /cvsroot/radius/radius/radiusd/radiusd.c,v
retrieving revision 1.55.2.5
diff -p -u -w -b -r1.55.2.5 radiusd.c
--- radiusd/radiusd.c   16 Aug 2002 12:31:27 -0000      1.55.2.5
+++ radiusd/radiusd.c   23 Aug 2002 10:42:39 -0000
@@ -964,6 +964,7 @@ radrespond(radreq, activefd)
        case RT_AUTHENTICATION_ACK:
        case RT_AUTHENTICATION_REJECT:
        case RT_ACCOUNTING_RESPONSE:
+       case RT_ACCESS_CHALLENGE:
                if (proxy_receive(radreq, activefd) < 0) {
                        radreq_free(radreq);
                        return 0;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]