]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
Moved generic RADIUS protocol support to a dedicated libradius
authorMartin Willi <martin@revosec.ch>
Mon, 27 Feb 2012 14:18:58 +0000 (15:18 +0100)
committerMartin Willi <martin@revosec.ch>
Mon, 5 Mar 2012 17:08:04 +0000 (18:08 +0100)
21 files changed:
Doxyfile.in
configure.in
src/Makefile.am
src/checksum/Makefile.am
src/libcharon/Makefile.am
src/libcharon/plugins/eap_radius/Makefile.am
src/libcharon/plugins/eap_radius/eap_radius.c
src/libcharon/plugins/eap_radius/eap_radius_accounting.c
src/libcharon/plugins/eap_radius/eap_radius_dae.c
src/libcharon/plugins/eap_radius/eap_radius_forward.h
src/libcharon/plugins/eap_radius/eap_radius_plugin.c
src/libcharon/plugins/eap_radius/eap_radius_plugin.h
src/libradius/Makefile.am [new file with mode: 0644]
src/libradius/radius_client.c [moved from src/libcharon/plugins/eap_radius/radius_client.c with 81% similarity]
src/libradius/radius_client.h [moved from src/libcharon/plugins/eap_radius/radius_client.h with 90% similarity]
src/libradius/radius_message.c [moved from src/libcharon/plugins/eap_radius/radius_message.c with 99% similarity]
src/libradius/radius_message.h [moved from src/libcharon/plugins/eap_radius/radius_message.h with 98% similarity]
src/libradius/radius_server.c [moved from src/libcharon/plugins/eap_radius/radius_server.c with 100% similarity]
src/libradius/radius_server.h [moved from src/libcharon/plugins/eap_radius/radius_server.h with 99% similarity]
src/libradius/radius_socket.c [moved from src/libcharon/plugins/eap_radius/radius_socket.c with 100% similarity]
src/libradius/radius_socket.h [moved from src/libcharon/plugins/eap_radius/radius_socket.h with 98% similarity]

index 524d639e04d937a7fe9360a82985047f5a02b245..7fb5161907c563eaa714c455cde4fee32fb01874 100644 (file)
@@ -532,6 +532,7 @@ INPUT                  = @SRC_DIR@/src/libstrongswan \
                          @SRC_DIR@/src/libcharon \
                          @SRC_DIR@/src/libsimaka \
                          @SRC_DIR@/src/libtls \
+                         @SRC_DIR@/src/libradius \
                          @SRC_DIR@/src/libtnccs \
                          @SRC_DIR@/src/libtncif \
                          @SRC_DIR@/src/libfast \
index 2b13a949fbdce7a186e7bc855dc697d3f127bcc5..a463c482640d7579630a9b14a0c3d3defc0afdbd 100644 (file)
@@ -252,6 +252,10 @@ if test x$eap_tls = xtrue -o x$eap_ttls = xtrue -o x$eap_peap = xtrue; then
        tls=true;
 fi
 
+if test x$eap_radius = xtrue; then
+       radius=true;
+fi
+
 if test x$tnc_imc = xtrue -o x$tnc_imv = xtrue -o x$tnccs_11 = xtrue -o x$tnccs_11 = xtrue -o x$tnccs_dynamic = xtrue -o x$eap_tnc = xtrue; then
        tnc_tnccs=true;
 fi
@@ -1052,6 +1056,7 @@ AM_CONDITIONAL(USE_LIBCAP, test x$capabilities = xlibcap)
 AM_CONDITIONAL(USE_VSTR, test x$vstr = xtrue)
 AM_CONDITIONAL(USE_SIMAKA, test x$simaka = xtrue)
 AM_CONDITIONAL(USE_TLS, test x$tls = xtrue)
+AM_CONDITIONAL(USE_RADIUS, test x$radius = xtrue)
 AM_CONDITIONAL(USE_IMCV, test x$imcv = xtrue)
 AM_CONDITIONAL(USE_PTS, test x$pts = xtrue)
 AM_CONDITIONAL(MONOLITHIC, test x$monolithic = xtrue)
@@ -1130,6 +1135,7 @@ AC_OUTPUT(
        src/libfreeswan/Makefile
        src/libsimaka/Makefile
        src/libtls/Makefile
+       src/libradius/Makefile
        src/libtncif/Makefile
        src/libtnccs/Makefile
        src/libpts/Makefile
index 041bd480febc1fe2392f2ce97a53ccf96a6d6a12..1440de20fa7e003d2c9a48ec5dca8a8113084d2b 100644 (file)
@@ -16,6 +16,10 @@ if USE_TLS
   SUBDIRS += libtls
 endif
 
+if USE_RADIUS
+  SUBDIRS += libradius
+endif
+
 if USE_LIBTNCIF
   SUBDIRS += libtncif
 endif
index a55891a2982b32b3e873858cdd711e33073e5ce6..58292a45a2b93129ab16418b8f7ac5aec76ebb8d 100644 (file)
@@ -45,6 +45,11 @@ if USE_TLS
   libs += $(DESTDIR)$(ipseclibdir)/libtls.so
 endif
 
+if USE_RADIUS
+  deps += $(top_builddir)/src/libradius/libradius.la
+  libs += $(DESTDIR)$(ipseclibdir)/libradius.so
+endif
+
 if USE_LIBTNCCS
   deps += $(top_builddir)/src/libtnccs/libtnccs.la
   libs += $(DESTDIR)$(ipseclibdir)/libtnccs.so
index b50ea2507766e2bfd70b305a8ac3e5c6b69b2bdc..fba51c662c63c70b9eb4c69eebad996ea61aa421 100644 (file)
@@ -326,6 +326,13 @@ if MONOLITHIC
 endif
 endif
 
+if USE_RADIUS
+if MONOLITHIC
+  # otherwise this library is linked to eap_radius
+  libcharon_la_LIBADD += $(top_builddir)/src/libradius/libradius.la
+endif
+endif
+
 if USE_TNC_IFMAP
   SUBDIRS += plugins/tnc_ifmap
 if MONOLITHIC
index 96bfa6fcbb9e4662664c2595ad3a9ad1432a50a0..181497ab517692db330a616a2563247601cc2e05 100644 (file)
@@ -1,12 +1,13 @@
 
 INCLUDES = -I$(top_srcdir)/src/libstrongswan -I$(top_srcdir)/src/libhydra \
-       -I$(top_srcdir)/src/libcharon
+       -I$(top_srcdir)/src/libcharon -I$(top_srcdir)/src/libradius
 
 AM_CFLAGS = -rdynamic
 
 if MONOLITHIC
 noinst_LTLIBRARIES = libstrongswan-eap-radius.la
 else
+libstrongswan_eap_radius_la_LIBADD = $(top_builddir)/src/libradius/libradius.la
 plugin_LTLIBRARIES = libstrongswan-eap-radius.la
 endif
 
@@ -15,10 +16,6 @@ libstrongswan_eap_radius_la_SOURCES = \
        eap_radius.h eap_radius.c \
        eap_radius_accounting.h eap_radius_accounting.c \
        eap_radius_dae.h eap_radius_dae.c \
-       eap_radius_forward.h eap_radius_forward.c \
-       radius_server.h radius_server.c \
-       radius_socket.h radius_socket.c \
-       radius_client.h radius_client.c \
-       radius_message.h radius_message.c
+       eap_radius_forward.h eap_radius_forward.c
 
 libstrongswan_eap_radius_la_LDFLAGS = -module -avoid-version
index f2b47e3f0d44254e23ba1bd493bf09c5706898f3..051d46ecf1acb85c154622c54a0d47dcbecb2361 100644 (file)
  */
 
 #include "eap_radius.h"
+#include "eap_radius_plugin.h"
 #include "eap_radius_forward.h"
 
-#include "radius_message.h"
-#include "radius_client.h"
+#include <radius_message.h>
+#include <radius_client.h>
 
 #include <daemon.h>
 
@@ -462,7 +463,7 @@ eap_radius_t *eap_radius_create(identification_t *server, identification_t *peer
                                                                "charon.plugins.eap-radius.filter_id", FALSE),
 
        );
-       this->client = radius_client_create();
+       this->client = eap_radius_create_client();
        if (!this->client)
        {
                free(this);
index 25013f62d00b30e031d9743dbf857690682e7abd..45be22704f61d179dd9092d7278f60934c6d8fca 100644 (file)
  */
 
 #include "eap_radius_accounting.h"
+#include "eap_radius_plugin.h"
 
 #include <time.h>
 
-#include "radius_message.h"
-#include "radius_client.h"
+#include <radius_message.h>
+#include <radius_client.h>
 #include <daemon.h>
 #include <utils/hashtable.h>
 #include <threading/mutex.h>
@@ -125,7 +126,7 @@ static bool send_message(private_eap_radius_accounting_t *this,
        radius_client_t *client;
        bool ack = FALSE;
 
-       client = radius_client_create();
+       client = eap_radius_create_client();
        if (client)
        {
                response = client->request(client, request);
index 3ea587309a41e72ac41d62d2a9804e1a73f97391..1cc19afaa1c6498f3a6bec8200dfd9f8a6e97c15 100644 (file)
@@ -15,7 +15,7 @@
 
 #include "eap_radius_dae.h"
 
-#include "radius_message.h"
+#include <radius_message.h>
 
 #include <sys/types.h>
 #include <sys/stat.h>
index e1a8c41702ceb84ec8778dea875637ca2c026f11..2c1dbf7a8ee791a88d4bf2909c211aa1b5eed9df 100644 (file)
 
 /**
  * @defgroup eap_radius_forward eap_radius_forward
- * @{ @ingroup
+ * @{ @ingroup eap_radius
  */
 
 #ifndef EAP_RADIUS_FORWARD_H_
 #define EAP_RADIUS_FORWARD_H_
 
-#include "radius_message.h"
+#include <radius_message.h>
 
 #include <bus/listeners/listener.h>
 
index e544aaf3ec19cf818def86051fe015f30a7a2e4c..0caecc1ad31e9b1b716b8d7dca68a3270b1eb8fa 100644 (file)
@@ -19,8 +19,9 @@
 #include "eap_radius_accounting.h"
 #include "eap_radius_dae.h"
 #include "eap_radius_forward.h"
-#include "radius_client.h"
-#include "radius_server.h"
+
+#include <radius_client.h>
+#include <radius_server.h>
 
 #include <daemon.h>
 #include <threading/rwlock.h>
@@ -261,15 +262,43 @@ plugin_t *eap_radius_plugin_create()
 /**
  * See header
  */
-enumerator_t *eap_radius_create_server_enumerator()
+radius_client_t *eap_radius_create_client()
 {
        if (instance)
        {
+               enumerator_t *enumerator;
+               radius_server_t *server, *selected = NULL;
+               int current, best = -1;
+
                instance->lock->read_lock(instance->lock);
-               return enumerator_create_cleaner(
-                                       instance->servers->create_enumerator(instance->servers),
-                                       (void*)instance->lock->unlock, instance->lock);
+               enumerator = instance->servers->create_enumerator(instance->servers);
+               while (enumerator->enumerate(enumerator, &server))
+               {
+                       current = server->get_preference(server);
+                       if (current > best ||
+                               /* for two with equal preference, 50-50 chance */
+                               (current == best && random() % 2 == 0))
+                       {
+                               DBG2(DBG_CFG, "RADIUS server '%s' is candidate: %d",
+                                        server->get_name(server), current);
+                               best = current;
+                               DESTROY_IF(selected);
+                               selected = server->get_ref(server);
+                       }
+                       else
+                       {
+                               DBG2(DBG_CFG, "RADIUS server '%s' skipped: %d",
+                                        server->get_name(server), current);
+                       }
+               }
+               enumerator->destroy(enumerator);
+               instance->lock->unlock(instance->lock);
+
+               if (selected)
+               {
+                       return radius_client_create(selected);
+               }
        }
-       return enumerator_create_empty();
+       return NULL;
 }
 
index cb724364a138493342c5874651cd94c0074617f8..1570bd5664b52a79630d20bf0bab0005e1dd9266 100644 (file)
@@ -25,7 +25,8 @@
 #define EAP_RADIUS_PLUGIN_H_
 
 #include <plugins/plugin.h>
-#include <utils/enumerator.h>
+
+#include <radius_client.h>
 
 typedef struct eap_radius_plugin_t eap_radius_plugin_t;
 
@@ -44,10 +45,10 @@ struct eap_radius_plugin_t {
 };
 
 /**
- * Create an enumerator over all loaded RADIUS servers.
+ * Get a RADIUS client instance to connect to servers.
  *
- * @return                     enumerator over radius_server_t
+ * @return                     RADIUS client
  */
-enumerator_t *eap_radius_create_server_enumerator();
+radius_client_t *eap_radius_create_client();
 
 #endif /** EAP_RADIUS_PLUGIN_H_ @}*/
diff --git a/src/libradius/Makefile.am b/src/libradius/Makefile.am
new file mode 100644 (file)
index 0000000..8723a78
--- /dev/null
@@ -0,0 +1,9 @@
+
+INCLUDES = -I$(top_srcdir)/src/libstrongswan
+
+ipseclib_LTLIBRARIES = libradius.la
+libradius_la_SOURCES = \
+       radius_message.h radius_message.c \
+       radius_socket.h radius_socket.c \
+       radius_client.h radius_client.c \
+       radius_server.h radius_server.c
similarity index 81%
rename from src/libcharon/plugins/eap_radius/radius_client.c
rename to src/libradius/radius_client.c
index 1a67096cb39b89f59f3d60919eeb1d551eca85fc..9c12be4ebee2ae0b04a860a30e1f56b2a3ffdda3 100644 (file)
@@ -14,8 +14,6 @@
  */
 
 #include "radius_client.h"
-
-#include "eap_radius_plugin.h"
 #include "radius_server.h"
 
 #include <unistd.h>
@@ -137,12 +135,9 @@ METHOD(radius_client_t, destroy, void,
 /**
  * See header
  */
-radius_client_t *radius_client_create()
+radius_client_t *radius_client_create(radius_server_t *server)
 {
        private_radius_client_t *this;
-       enumerator_t *enumerator;
-       radius_server_t *server;
-       int current, best = -1;
 
        INIT(this,
                .public = {
@@ -150,36 +145,8 @@ radius_client_t *radius_client_create()
                        .get_msk = _get_msk,
                        .destroy = _destroy,
                },
+               .server = server,
        );
 
-       enumerator = eap_radius_create_server_enumerator();
-       while (enumerator->enumerate(enumerator, &server))
-       {
-               current = server->get_preference(server);
-               if (current > best ||
-                       /* for two with equal preference, 50-50 chance */
-                       (current == best && random() % 2 == 0))
-               {
-                       DBG2(DBG_CFG, "RADIUS server '%s' is candidate: %d",
-                                server->get_name(server), current);
-                       best = current;
-                       DESTROY_IF(this->server);
-                       this->server = server->get_ref(server);
-               }
-               else
-               {
-                       DBG2(DBG_CFG, "RADIUS server '%s' skipped: %d",
-                                server->get_name(server), current);
-               }
-       }
-       enumerator->destroy(enumerator);
-
-       if (!this->server)
-       {
-               free(this);
-               return NULL;
-       }
-
        return &this->public;
 }
-
similarity index 90%
rename from src/libcharon/plugins/eap_radius/radius_client.h
rename to src/libradius/radius_client.h
index e4f3a72224a08d6e8fc366fecf74a220c228af5e..4ec344be023e9ecef686ce075323144022339277 100644 (file)
 
 /**
  * @defgroup radius_client radius_client
- * @{ @ingroup eap_radius
+ * @{ @ingroup libradius
  */
 
 #ifndef RADIUS_CLIENT_H_
 #define RADIUS_CLIENT_H_
 
 #include "radius_message.h"
+#include "radius_server.h"
 
 typedef struct radius_client_t radius_client_t;
 
@@ -59,8 +60,9 @@ struct radius_client_t {
 /**
  * Create a RADIUS client.
  *
+ * @param server       reference to a server configuration, gets owned
  * @return                     radius_client_t object
  */
-radius_client_t *radius_client_create();
+radius_client_t *radius_client_create(radius_server_t *server);
 
 #endif /** RADIUS_CLIENT_H_ @}*/
similarity index 99%
rename from src/libcharon/plugins/eap_radius/radius_message.c
rename to src/libradius/radius_message.c
index ad8875423f87ea3568a2f437a1d8edefb5229d8d..bd3a32f07d974b2e9576f60eda479e37afe5c60b 100644 (file)
@@ -488,4 +488,3 @@ radius_message_t *radius_message_parse(chunk_t data)
        }
        return &this->public;
 }
-
similarity index 98%
rename from src/libcharon/plugins/eap_radius/radius_message.h
rename to src/libradius/radius_message.h
index 3557145052ef58ec544da9fcdfcf0cf0498fd08d..41cfb51a31114f990cdd187e18da106cc59ec558 100644 (file)
  */
 
 /**
+ * @defgroup libradius libradius
+ *
+ * @addtogroup libradius
+ * RADIUS protocol support library.
+ *
  * @defgroup radius_message radius_message
- * @{ @ingroup eap_radius
+ * @{ @ingroup libradius
  */
 
 #ifndef RADIUS_MESSAGE_H_
similarity index 99%
rename from src/libcharon/plugins/eap_radius/radius_server.h
rename to src/libradius/radius_server.h
index 93b0e5d8df6ddfcf9e820634eb8462dd80efb0d3..2cc281cc1f0cfb039edea390e1ce95209343763a 100644 (file)
@@ -15,7 +15,7 @@
 
 /**
  * @defgroup radius_server radius_server
- * @{ @ingroup eap_radius
+ * @{ @ingroup libradius
  */
 
 #ifndef RADIUS_SERVER_H_
similarity index 98%
rename from src/libcharon/plugins/eap_radius/radius_socket.h
rename to src/libradius/radius_socket.h
index 0301ec6d08f57d7dea8b9769e7cc9762fc2b86f3..07d642c08fffc8837fb6d41679ba130e6ee8157c 100644 (file)
@@ -15,7 +15,7 @@
 
 /**
  * @defgroup radius_socket radius_socket
- * @{ @ingroup eap_radius
+ * @{ @ingroup libradius
  */
 
 #ifndef RADIUS_SOCKET_H_