]> git.sur5r.net Git - openldap/blobdiff - contrib/slapd-modules/passwd/radius.c
Merge remote-tracking branch 'origin/mdb.master'
[openldap] / contrib / slapd-modules / passwd / radius.c
index f4bbb284bb9c925a94a6576157f9c75699ebbf78..d8179fef20a69f51cf1bb86737e15c8bf34239d4 100644 (file)
@@ -1,6 +1,7 @@
 /* $OpenLDAP$ */
-/*
- * Copyright 1998-2007 The OpenLDAP Foundation.
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2012 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * <http://www.OpenLDAP.org/license.html>.
  */
 
+#include "portable.h"
+
 #include <stdio.h>
 
 #include <lber.h>
 #include <lber_pvt.h>  /* BER_BVC definition */
 #include "lutil.h"
+#include <ldap_pvt_thread.h>
 #include <ac/string.h>
 #include <ac/unistd.h>
 
@@ -25,6 +29,7 @@
 static LUTIL_PASSWD_CHK_FUNC chk_radius;
 static const struct berval scheme = BER_BVC("{RADIUS}");
 static char *config_filename;
+static ldap_pvt_thread_mutex_t libradius_mutex;
 
 static int
 chk_radius(
@@ -58,8 +63,11 @@ chk_radius(
                return LUTIL_PASSWD_ERR;        /* passwd must behave like a string */
        }
 
+       ldap_pvt_thread_mutex_lock( &libradius_mutex );
+
        h = rad_auth_open();
        if ( h == NULL ) {
+               ldap_pvt_thread_mutex_unlock( &libradius_mutex );
                return LUTIL_PASSWD_ERR;
        }
 
@@ -79,16 +87,37 @@ chk_radius(
                goto done;
        }
 
-       if ( rad_send_request( h ) == RAD_ACCESS_ACCEPT ) {
+       switch ( rad_send_request( h ) ) {
+       case RAD_ACCESS_ACCEPT:
                rc = LUTIL_PASSWD_OK;
+               break;
+
+       case RAD_ACCESS_REJECT:
+               rc = LUTIL_PASSWD_ERR;
+               break;
+
+       case RAD_ACCESS_CHALLENGE:
+               rc = LUTIL_PASSWD_ERR;
+               break;
+
+       case -1:
+               /* no valid response is received */
+               break;
        }
 
 done:;
        rad_close( h );
 
+       ldap_pvt_thread_mutex_unlock( &libradius_mutex );
        return rc;
 }
 
+int
+term_module()
+{
+       return ldap_pvt_thread_mutex_destroy( &libradius_mutex );
+}
+
 int
 init_module( int argc, char *argv[] )
 {
@@ -109,5 +138,7 @@ init_module( int argc, char *argv[] )
                }
        }
 
+       ldap_pvt_thread_mutex_init( &libradius_mutex );
+
        return lutil_passwd_add( (struct berval *)&scheme, chk_radius, NULL );
 }