Add support for libradiusclient version 0.4.0 onwards, where they have
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 29 Mar 2005 14:19:21 +0000 (14:19 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 29 Mar 2005 14:19:21 +0000 (14:19 +0000)
changed the API.

doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
src/ACKNOWLEDGMENTS
src/src/EDITME
src/src/auths/call_radius.c
src/src/buildconfig.c

index 496ba5943b9a92ac6a46b8253bbda4271aed7c65..0e14c76c328ad7cdaa0c50bfd31ff5b0ac91884b 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.102 2005/03/29 11:01:32 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.103 2005/03/29 14:19:21 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -90,6 +90,12 @@ PH/15 Further to TK/02 and TK/03 above, tidied up the tables of what conditions
 
 PH/16 Installed updated OS/os.c-cygwin from the Cygwin maintainer.
 
+PH/17 The API for radiusclient changed at release 0.4.0. Unfortunately, the
+      header file does not have a version number, so I've had to invent a new
+      value for RADIUS_LIB_TYPE, namely "RADIUSCLIENTNEW" to request the new
+      API. The code is untested by me (my Linux distribution still has 0.3.2 of
+      radiusclient), but it was contributed by a Radius user.
+
 
 A note about Exim versions 4.44 and 4.50
 ----------------------------------------
index 053bdabab7db40bb3e2e14da756edaac67d23f50..51ac28c3798bb878dcf0162f692b178b61e30a6a 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.30 2005/03/22 16:52:06 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.31 2005/03/29 14:19:21 ph10 Exp $
 
 New Features in Exim
 --------------------
@@ -91,6 +91,12 @@ TF/01 $received_time is a new expansion variable containing the time and date
       as a number of seconds since the start of the Unix epoch when the
       current message was received.
 
+PH/03 There is a new value for RADIUS_LIB_TYPE that can be set in
+      Local/Makefile. It is RADIUSCLIENTNEW, and it requests that the new API,
+      in use from radiusclient 0.4.0 onwards, be used. It does not appear to be
+      possible to detect the different versions automatically.
+
+
 Version 4.50
 ------------
 
index 0982973d2e5383dfc30c2d1ee7bb9b1a18c8fde9..faaedb639ce65f789813ec94320a7720ac1edd80 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.16 2005/03/22 14:11:54 ph10 Exp $
+$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.17 2005/03/29 14:19:21 ph10 Exp $
 
 EXIM ACKNOWLEDGEMENTS
 
@@ -20,7 +20,7 @@ relatively small patches.
 Philip Hazel
 
 Lists created: 20 November 2002
-Last updated:  22 March 2005
+Last updated:  29 March 2005
 
 
 THE OLD LIST
@@ -83,6 +83,7 @@ Steve Campbell            eximstats extensions and continued maintenance
 Brian Candler             Use h_errno for gethostbyname()
                           Suggested patch for .ifdef etc
                           Several minor fixes and suggestions
+Pete Carah                Patch for change to radiusclient API
 Oliver Cook               Suggested patch for exigrep & rejected messages
                             Patch to add sender/host info to local_scan() rejects
                             Suggested patch to add queue time to "Completed"
index 72f797bb355ab23ae1fbe1d7a62eeac3c51a7aee..901fd4366b37ee715f704262fa8b4f03acba1ba7 100644 (file)
@@ -1,4 +1,4 @@
-# $Cambridge: exim/src/src/EDITME,v 1.9 2005/03/22 14:11:54 ph10 Exp $
+# $Cambridge: exim/src/src/EDITME,v 1.10 2005/03/29 14:19:21 ph10 Exp $
 
 ##################################################
 #          The Exim mail transport agent         #
@@ -722,17 +722,24 @@ ZCAT_COMMAND=/usr/bin/zcat
 
 # If you have set RADIUS_CONFIG_FILE, you should also set one of these to
 # indicate which RADIUS library is used:
-#
-# RADIUSCLIENT is the radiusclient library; you probably need to add
-#   -libradiusclient to EXTRALIBS
-#
-# RADLIB is the Radius library that comes with FreeBSD (the header file is
-#   called radlib.h); you probably need to add -lradius to EXTRALIBS
 
 # RADIUS_LIB_TYPE=RADIUSCLIENT
+# RADIUS_LIB_TYPE=RADIUSCLIENTNEW
 # RADIUS_LIB_TYPE=RADLIB
 
-# If you don't set one of these, Exim assumes the radiusclient library.
+# RADIUSCLIENT is the radiusclient library; you probably need to add
+#   -lradiusclient to EXTRALIBS.
+#
+# The API for the radiusclient library was changed at release 0.4.0.
+# Unfortunately, the header file does not define a version number that clients
+# can use to support both the old and new APIs. If you are using version 0.4.0
+# or later of the radiusclient library, you should use RADIUSCLIENTNEW.
+#
+# RADLIB is the Radius library that comes with FreeBSD (the header file is
+#   called radlib.h); you probably need to add -lradius to EXTRALIBS.
+#
+# If you do not set RADIUS_LIB_TYPE, Exim assumes the radiusclient library,
+# using the original API.
 
 
 #------------------------------------------------------------------------------
index 133de74ddcf5a9a1103c09c4c8b06be959205e71..a20237689dcace9c36ec9559b68eec08f8b5bff8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/auths/call_radius.c,v 1.2 2005/01/04 10:00:43 ph10 Exp $ */
+/* $Cambridge: exim/src/src/auths/call_radius.c,v 1.3 2005/03/29 14:19:21 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -29,12 +29,13 @@ static void dummy(int x) { dummy(x-1); }
 #else  /* RADIUS_CONFIG_FILE */
 
 
-/* Two different Radius libraries are supported. The default is radiusclient. */
+/* Two different Radius libraries are supported. The default is radiusclient,
+using its original API. At release 0.4.0 the API changed. */
 
 #ifdef RADIUS_LIB_RADLIB
   #include <radlib.h>
 #else
-  #ifndef RADIUS_LIB_RADIUSCLIENT
+  #if !defined(RADIUS_LIB_RADIUSCLIENT) && !defined(RADIUS_LIB_RADIUSCLIENTNEW)
   #define RADIUS_LIB_RADIUSCLIENT
   #endif
   #include <radiusclient.h>
@@ -67,12 +68,15 @@ int result;
 int sep = 0;
 
 #ifdef RADIUS_LIB_RADLIB
-struct rad_handle *h;
+  struct rad_handle *h;
 #else
-VALUE_PAIR *send = NULL;
-VALUE_PAIR *received;
-unsigned int service = PW_AUTHENTICATE_ONLY;
-char msg[4096];
+  #ifdef RADIUS_LIB_RADIUSCLIENTNEW
+    rc_handle *h;
+  #endif
+  VALUE_PAIR *send = NULL;
+  VALUE_PAIR *received;
+  unsigned int service = PW_AUTHENTICATE_ONLY;
+  char msg[4096];
 #endif
 
 
@@ -87,10 +91,11 @@ DEBUG(D_auth) debug_printf("Running RADIUS authentication for user \"%s\" "
 
 /* Authenticate using the radiusclient library */
 
-#ifdef RADIUS_LIB_RADIUSCLIENT
+#ifndef RADIUS_LIB_RADLIB
 
 rc_openlog("exim");
 
+#ifdef RADIUS_LIB_RADIUSCLIENT
 if (rc_read_config(RADIUS_CONFIG_FILE) != 0)
   *errptr = string_sprintf("RADIUS: can't open %s", RADIUS_CONFIG_FILE);
 
@@ -106,13 +111,37 @@ else if (rc_avpair_add(&send, PW_USER_PASSWORD, CS radius_args, 0) == NULL)
 else if (rc_avpair_add(&send, PW_SERVICE_TYPE, &service, 0) == NULL)
   *errptr = string_sprintf("RADIUS: add service type failed\n");
 
+#else  /* RADIUS_LIB_RADIUSCLIENT unset => RADIUS_LIB_RADIUSCLIENT2 */
+
+if ((h = rc_read_config(RADIUS_CONFIG_FILE)) != 0)
+  *errptr = string_sprintf("RADIUS: can't open %s", RADIUS_CONFIG_FILE);
+
+else if (rc_read_dictionary(h, rc_conf_str(h, "dictionary")) != 0)
+  *errptr = string_sprintf("RADIUS: can't read dictionary");
+
+else if (rc_avpair_add(h, &send, PW_USER_NAME, user, 0, 0) == NULL)
+  *errptr = string_sprintf("RADIUS: add user name failed\n");
+
+else if (rc_avpair_add(h, &send, PW_USER_PASSWORD, CS radius_args, 0, 0) == NULL)
+  *errptr = string_sprintf("RADIUS: add password failed\n");
+
+else if (rc_avpair_add(h, &send, PW_SERVICE_TYPE, &service, 0, 0) == NULL)
+  *errptr = string_sprintf("RADIUS: add service type failed\n");
+
+#endif  /* RADIUS_LIB_RADIUSCLIENT */
+
 if (*errptr != NULL)
   {
   DEBUG(D_auth) debug_printf("%s\n", *errptr);
   return ERROR;
   }
 
+#ifdef RADIUS_LIB_RADIUSCLIENT
 result = rc_auth(0, send, &received, msg);
+#else
+result = rc_auth(h, 0, send, &received, msg);
+#endif
+
 DEBUG(D_auth) debug_printf("RADIUS code returned %d\n", result);
 
 switch (result)
@@ -133,7 +162,7 @@ switch (result)
   return ERROR;
   }
 
-#else  /* RADIUS_LIB_RADIUSCLIENT not set => RADIUS_LIB_RADLIB is set */
+#else  /* RADIUS_LIB_RADLIB is set */
 
 /* Authenticate using the libradius library */
 
index 3f4ff308dd86775dbae387c265df795d3198c00a..46bf4738bc3d0b9415459b3680ae311efb739f7e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/buildconfig.c,v 1.6 2005/02/17 11:58:25 ph10 Exp $ */
+/* $Cambridge: exim/src/src/buildconfig.c,v 1.7 2005/03/29 14:19:21 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -677,6 +677,7 @@ while (fgets(buffer, sizeof(buffer), base) != NULL)
     else if (strcmp(name, "RADIUS_LIB_TYPE") == 0)
       {
       if (strcmp(value, "RADIUSCLIENT") == 0 ||
+          strcmp(value, "RADIUSCLIENTNEW") == 0 ||
           strcmp(value, "RADLIB") == 0)
         {
         fprintf(new, "#define RADIUS_LIB_%s\n", value);