/* eurephiadb.c -- Loads and initialises the database driver * * GPLv2 - Copyright (C) 2008 David Sommerseth * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; version 2 * of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include "eurephia_nullsafe.h" #include "eurephiadb_driver.h" #include "eurephia_log.h" #include "eurephia_getsym.h" #ifdef MEMWATCH #include #endif int eDBlink_close(eurephiaCTX *ctx) { if( ctx == NULL ) { return 1; } eurephia_log(ctx, LOG_INFO, 3, "Unloading eurephiaDB driver"); if( ctx->eurephia_driver != NULL ) { dlclose(ctx->eurephia_driver); ctx->eurephia_driver = NULL; } return 1; } int eDBlink_init(eurephiaCTX *ctx, const char *dbl, const int minver) { #ifdef MEMWATCH mwStatistics(3); #endif if( dbl == NULL ) { eurephia_log(ctx, LOG_FATAL, 0, "No eurephia eDBlink driver given. " "eurephia authentication will not be available"); return 0; } eurephia_log(ctx, LOG_INFO, 2, "Loading eurephiaDB driver: %s", dbl); ctx->eurephia_driver = dlopen(dbl, RTLD_NOW); if( ctx->eurephia_driver == NULL ) { eurephia_log(ctx, LOG_FATAL, 0, "Could not open the eurephia eDBlink driver (%s)", dbl); eurephia_log(ctx, LOG_FATAL, 1, "dlopen error: %s", dlerror()); return 0; } // Find mandatory functions containing driver information eDB_DriverVersion = eGetSym(ctx, ctx->eurephia_driver, "eDB_DriverVersion"); eDB_DriverAPIVersion = eGetSym(ctx, ctx->eurephia_driver, "eDB_DriverAPIVersion"); eurephia_log(ctx, LOG_INFO, 1, "Driver loaded: %s (API version %i)", eDB_DriverVersion(), eDB_DriverAPIVersion()); // Check that we are using at least a new enough driver if( eDB_DriverAPIVersion() < minver ) { eurephia_log(ctx, LOG_FATAL, 0, "The requested eurephiaDB driver is too old. This program needs " "API version %i, but this driver only supports API version %i.\n", minver, eDB_DriverAPIVersion()); return 0; } // Configure functions contained in the driver, defined by API version switch( (eDB_DriverAPIVersion() > minver ? minver : eDB_DriverAPIVersion()) ) { default: eurephia_log(ctx, LOG_WARNING, 0, "eurephiaDB driver API is newer than the running eurephia version. Consider " "to upgrade eurphia to take advantage of newer features in the eurephiaDB driver."); case 2: #ifdef ENABLE_EUREPHIADM eDBadminAuth = eGetSym(ctx, ctx->eurephia_driver, "eDBadminAuth"); eDBadminValidateSession = eGetSym(ctx, ctx->eurephia_driver, "eDBadminValidateSession"); eDBadminRegisterLogin = eGetSym(ctx, ctx->eurephia_driver, "eDBadminRegisterLogin"); eDBadminLogout = eGetSym(ctx, ctx->eurephia_driver, "eDBadminLogout"); eDBadminConfigSet = eGetSym(ctx, ctx->eurephia_driver, "eDBadminConfigSet"); eDBadminConfigDelete = eGetSym(ctx, ctx->eurephia_driver, "eDBadminConfigDelete"); eDBadminGetUserList = eGetSym(ctx, ctx->eurephia_driver, "eDBadminGetUserList"); eDBadminGetUserInfo = eGetSym(ctx, ctx->eurephia_driver, "eDBadminGetUserInfo"); eDBadminAddUser = eGetSym(ctx, ctx->eurephia_driver, "eDBadminAddUser"); eDBadminUpdateUser = eGetSym(ctx, ctx->eurephia_driver, "eDBadminUpdateUser"); eDBadminDeleteUser = eGetSym(ctx, ctx->eurephia_driver, "eDBadminDeleteUser"); eDBadminGetCertificateList = eGetSym(ctx, ctx->eurephia_driver, "eDBadminGetCertificateList"); eDBadminGetCertificateInfo = eGetSym(ctx, ctx->eurephia_driver, "eDBadminGetCertificateInfo"); eDBadminAddCertificate = eGetSym(ctx, ctx->eurephia_driver, "eDBadminAddCertificate"); eDBadminDeleteCertificate = eGetSym(ctx, ctx->eurephia_driver, "eDBadminDeleteCertificate"); eDBadminGetUserCertsList = eGetSym(ctx, ctx->eurephia_driver, "eDBadminGetUserCertsList"); eDBadminUpdateUserCertLink = eGetSym(ctx, ctx->eurephia_driver, "eDBadminUpdateUserCertLink"); eDBadminEditAdminAccess = eGetSym(ctx, ctx->eurephia_driver, "eDBadminEditAdminAccess"); eDBadminGetLastlog = eGetSym(ctx, ctx->eurephia_driver, "eDBadminGetLastlog"); eDBadminGetAttemptsLog = eGetSym(ctx, ctx->eurephia_driver, "eDBadminGetAttemptsLog"); #endif case 1: // Setup eDBlink functions eDBconnect = eGetSym(ctx, ctx->eurephia_driver, "eDBconnect"); eDBdisconnect = eGetSym(ctx, ctx->eurephia_driver, "eDBdisconnect"); eDBauth_TLS = eGetSym(ctx, ctx->eurephia_driver, "eDBauth_TLS"); eDBauth_user = eGetSym(ctx, ctx->eurephia_driver, "eDBauth_user"); eDBget_uid = eGetSym(ctx, ctx->eurephia_driver, "eDBget_uid"); eDBblacklist_check = eGetSym(ctx, ctx->eurephia_driver, "eDBblacklist_check"); eDBregister_attempt = eGetSym(ctx, ctx->eurephia_driver, "eDBregister_attempt"); eDBregister_login = eGetSym(ctx, ctx->eurephia_driver, "eDBregister_login"); eDBregister_vpnmacaddr = eGetSym(ctx, ctx->eurephia_driver, "eDBregister_vpnmacaddr"); eDBregister_logout = eGetSym(ctx, ctx->eurephia_driver, "eDBregister_logout"); eDBget_firewall_profile = eGetSym(ctx, ctx->eurephia_driver, "eDBget_firewall_profile"); eDBget_blacklisted_ip = eGetSym(ctx, ctx->eurephia_driver, "eDBget_blacklisted_ip"); eDBget_sessionkey_seed = eGetSym(ctx, ctx->eurephia_driver, "eDBget_sessionkey_seed"); eDBget_sessionkey_macaddr = eGetSym(ctx, ctx->eurephia_driver, "eDBget_sessionkey_macaddr"); eDBcheck_sessionkey_uniqueness = eGetSym(ctx, ctx->eurephia_driver, "eDBcheck_sessionkey_uniqueness"); eDBregister_sessionkey = eGetSym(ctx, ctx->eurephia_driver, "eDBregister_sessionkey"); eDBload_sessiondata = eGetSym(ctx, ctx->eurephia_driver, "eDBload_sessiondata"); eDBstore_session_value = eGetSym(ctx, ctx->eurephia_driver, "eDBstore_session_value"); eDBdestroy_session = eGetSym(ctx, ctx->eurephia_driver, "eDBdestroy_session"); break; } if( ctx->fatal_error > 0 ) { eurephia_log(ctx, LOG_FATAL, 0, "eurephia eDBlink is not correctly initialised. " "eurephia authentication will not be available"); eDBlink_close(ctx); return 0; } return 1; }