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: Gayatri Prabhu
Subject: Re: [Bug-gnu-radius] Failure to relay Access-Challenge
Date: Fri, 23 Aug 2002 07:38:35 -0700 (PDT)

Hi Sergey, 

I already have the dictionary file modified to
propagate the State attribute. I will install version
0.94.4 and apply the new patch. Hopefully, it should
work just fine, but if it doesn't, I will get back to
you.

Thanks for your time and assistance. I appreciate it.

Regards,
Gayatri
 
--- Sergey Poznyakoff <address@hidden> wrote:
> 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;
> 


__________________________________________________
Do You Yahoo!?
Yahoo! Finance - Get real-time stock quotes
http://finance.yahoo.com




reply via email to

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