[dovecot-cvs] dovecot/src/auth auth-module.c,NONE,1.1 auth-module.h,NONE,1.1 Makefile.am,1.11,1.12 passdb.c,1.3,1.4 userdb.c,1.3,1.4

cras at procontrol.fi cras at procontrol.fi
Tue Feb 11 20:01:41 EET 2003


Update of /home/cvs/dovecot/src/auth
In directory danu:/tmp/cvs-serv13838/src/auth

Modified Files:
	Makefile.am passdb.c userdb.c 
Added Files:
	auth-module.c auth-module.h 
Log Message:
Support for dynamic authentication modules.



--- NEW FILE: auth-module.c ---
/* Copyright (C) 2003 Timo Sirainen */

#include "lib.h"

#ifdef AUTH_MODULES

#include "auth-module.h"

#include <sys/stat.h>
#include <dlfcn.h>

struct auth_module {
	struct auth_module *next;

	int refcount;
	char *name;
	void *handle;
};

static struct auth_module *auth_modules = NULL;

static struct auth_module *auth_module_find(const char *name)
{
	struct auth_module *module;

	for (module = auth_modules; module != NULL; module = module->next) {
		if (strcmp(module->name, name) == 0)
			return module;
	}

	return NULL;
}

struct auth_module *auth_module_open(const char *name)
{
        struct auth_module *module;
	const char *path;
	struct stat st;
	void *handle;

	module = auth_module_find(name);
	if (module != NULL) {
		module->refcount++;
		return module;
	}

	path = t_strconcat(AUTH_MODULE_DIR"/", name, ".so", NULL);
	if (stat(path, &st) < 0) {
		if (errno != ENOENT)
			i_error("stat(%s) failed: %m", path);
		return NULL;
	}

	handle = dlopen(path, RTLD_GLOBAL | RTLD_NOW);
	if (handle == NULL)
		i_error("dlopen(%s) failed: %s", path, dlerror());

	module = i_new(struct auth_module, 1);
	module->refcount = 1;
	module->name = i_strdup(name);
	module->handle = handle;

	module->next = auth_modules;
	auth_modules = module;
	return module;
}

void auth_module_close(struct auth_module *module)
{
	struct auth_module **pos;

	if (--module->refcount > 0)
		return;

	for (pos = &auth_modules; *pos != NULL; pos = &(*pos)->next) {
		if (*pos == module) {
			*pos = module->next;
			break;
		}
	}

	if (dlclose(module->handle) != 0)
		i_error("dlclose() failed: %s", dlerror());
	i_free(module->name);
	i_free(module);
}

void *auth_module_sym(struct auth_module *module, const char *name)
{
	const char *error;
	void *ret;

	ret = dlsym(module->handle, name);

	error = dlerror();
	if (error != NULL)
		i_error("dlsym(%s) failed: %s", name, error);
	return ret;
}

#endif

--- NEW FILE: auth-module.h ---
#ifndef __AUTH_MODULE_H
#define __AUTH_MODULE_H

struct auth_module *auth_module_open(const char *name);
void auth_module_close(struct auth_module *module);

void *auth_module_sym(struct auth_module *module, const char *name);

#endif

Index: Makefile.am
===================================================================
RCS file: /home/cvs/dovecot/src/auth/Makefile.am,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- Makefile.am	11 Feb 2003 09:55:58 -0000	1.11
+++ Makefile.am	11 Feb 2003 18:01:39 -0000	1.12
@@ -5,6 +5,7 @@
 INCLUDES = \
 	-I$(top_srcdir)/src/lib \
 	-I$(top_srcdir)/src/lib-settings \
+	-DAUTH_MODULE_DIR=\""$(libdir)/dovecot/auth"\" \
 	$(VPOPMAIL_CFLAGS)
 
 dovecot_auth_LDADD = \
@@ -14,7 +15,12 @@
 	$(SASL_LIBS) \
 	$(VPOPMAIL_LIBS)
 
+if AUTH_MODULES
+dovecot_auth_LDFLAGS = -export-dynamic
+endif
+
 dovecot_auth_SOURCES = \
+	auth-module.c \
 	db-ldap.c \
 	db-passwd-file.c \
 	login-connection.c \
@@ -43,6 +49,7 @@
 	auth-login-interface.h \
 	auth-master-interface.h \
 	auth-mech-desc.h \
+	auth-module.h \
 	db-ldap.h \
 	db-passwd-file.h \
 	common.h \

Index: passdb.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/passdb.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- passdb.c	11 Feb 2003 09:55:58 -0000	1.3
+++ passdb.c	11 Feb 2003 18:01:39 -0000	1.4
@@ -2,10 +2,15 @@
 
 #include "common.h"
 #include "mech.h"
+#include "auth-module.h"
 #include "passdb.h"
 
 #include <stdlib.h>
 
+#ifdef AUTH_MODULES
+static struct auth_module *passdb_module = NULL;
+#endif
+
 struct passdb_module *passdb;
 
 const char *passdb_credentials_to_str(enum passdb_credentials credentials)
@@ -61,6 +66,13 @@
 	if (strcasecmp(name, "ldap") == 0)
 		passdb = &passdb_ldap;
 #endif
+#ifdef AUTH_MODULES
+	passdb_module = auth_module_open(name);
+	if (passdb_module != NULL) {
+		passdb = auth_module_sym(passdb_module,
+					 t_strconcat("passdb_", name, NULL));
+	}
+#endif
 
 	if (passdb == NULL)
 		i_fatal("Unknown passdb type '%s'", name);
@@ -82,4 +94,8 @@
 {
 	if (passdb != NULL && passdb->deinit != NULL)
 		passdb->deinit();
+#ifdef AUTH_MODULES
+	if (passdb_module != NULL)
+                auth_module_close(passdb_module);
+#endif
 }

Index: userdb.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/userdb.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- userdb.c	2 Feb 2003 00:08:28 -0000	1.3
+++ userdb.c	11 Feb 2003 18:01:39 -0000	1.4
@@ -1,10 +1,15 @@
 /* Copyright (C) 2002-2003 Timo Sirainen */
 
 #include "common.h"
+#include "auth-module.h"
 #include "userdb.h"
 
 #include <stdlib.h>
 
+#ifdef AUTH_MODULES
+static struct auth_module *userdb_module = NULL;
+#endif
+
 struct userdb_module *userdb;
 
 void userdb_init(void)
@@ -40,6 +45,13 @@
 	if (strcasecmp(name, "ldap") == 0)
 		userdb = &userdb_ldap;
 #endif
+#ifdef AUTH_MODULES
+	userdb_module = auth_module_open(name);
+	if (userdb_module != NULL) {
+		userdb = auth_module_sym(userdb_module,
+					 t_strconcat("userdb_", name, NULL));
+	}
+#endif
 
 	if (userdb == NULL)
 		i_fatal("Unknown userdb type '%s'", name);
@@ -53,4 +65,8 @@
 {
 	if (userdb != NULL && userdb->deinit != NULL)
 		userdb->deinit();
+#ifdef AUTH_MODULES
+	if (userdb_module != NULL)
+                auth_module_close(userdb_module);
+#endif
 }




More information about the dovecot-cvs mailing list