diff options
Diffstat (limited to 'database/sqlite/edb-sqlite.c')
-rw-r--r-- | database/sqlite/edb-sqlite.c | 67 |
1 files changed, 63 insertions, 4 deletions
diff --git a/database/sqlite/edb-sqlite.c b/database/sqlite/edb-sqlite.c index d9d4af6..4c15a5a 100644 --- a/database/sqlite/edb-sqlite.c +++ b/database/sqlite/edb-sqlite.c @@ -1,7 +1,7 @@ /* edb-sqlite.c -- Main driver for eurephia authentication plugin for OpenVPN * This is the SQLite database driver * - * GPLv2 only - Copyright (C) 2008 - 2011 + * GPLv2 only - Copyright (C) 2008 - 2012 * David Sommerseth <dazo@users.sourceforge.net> * * This program is free software; you can redistribute it and/or @@ -37,9 +37,9 @@ #include <unistd.h> #include <assert.h> -#define DRIVERVERSION "1.2" /**< Defines the software version of this driver */ +#define DRIVERVERSION "1.3" /**< Defines the software version of this driver */ #ifndef DRIVERAPIVERSION -# define DRIVERAPIVERSION 2 /**< Sets the API version level of this driver */ +# define DRIVERAPIVERSION 3 /**< Sets the API version level of this driver */ #endif #include <sqlite3.h> @@ -86,7 +86,7 @@ static const eDBattempt_types_t eDBattempt_types[] = { * @copydoc eDB_DriverVersion() */ const char *eDB_DriverVersion(void) { - return "edb-sqlite (v"DRIVERVERSION") David Sommerseth 2008-2011 (C) GPLv2"; + return "edb-sqlite (v"DRIVERVERSION") David Sommerseth 2008-2012 (C) GPLv2"; } @@ -674,6 +674,65 @@ int eDBregister_vpnmacaddr(eurephiaCTX *ctx, eurephiaSESSION *session, const cha /** + * @copydoc eDBregister_vpnclientaddr() + */ +int eDBregister_vpnclientaddr(eurephiaCTX *ctx, eurephiaSESSION *session, const char *macaddr, + const char *vpnip4addr, const char *vpnip6addr) +{ + dbresult *res = NULL; + int ret = 0; + + DEBUG(ctx, 20, "Function call: eDBregister_vpnclientaddr(ctx, '%s', '%s', '%s', '%s')", + session->sessionkey, macaddr, vpnip4addr, vpnip6addr); + + if( (macaddr == NULL) && (strlen_nullsafe(macaddr) > 18) ) { + eurephia_log(ctx, LOG_FATAL, 0, "Invalid MAC address"); + return 0; + } + + // Register client addresses into history table + res = sqlite_query(ctx, + "INSERT INTO openvpn_vpnaddr_history (sessionkey, macaddr, ip4addr, ip6addr) " + "VALUES ('%q','%q','%q','%q')", + session->sessionkey, + (ctx->tuntype == tuntype_TAP ? macaddr : ""), + (vpnip4addr ? vpnip4addr : ""), (vpnip6addr ? vpnip6addr : "")); + if( sqlite_query_status(res) != dbSUCCESS ) { + eurephia_log(ctx, LOG_FATAL, 0, "Failed to log new VPN client addresses for session"); + sqlite_log_error(ctx, res); + ret = 0; + goto exit; + } + sqlite_free_results(res); + + // Update lastlog to reflect last used MAC address for the session + res = sqlite_query(ctx, + "UPDATE openvpn_lastlog SET sessionstatus = 2, macaddr = '%q', vpnipaddr = '%q', vpnipv6addr = '%q' " + " WHERE sessionkey = '%q' AND sessionstatus = 1", + (macaddr ? macaddr : ""), (vpnip4addr ? vpnip4addr : ""), (vpnip6addr ? vpnip6addr : ""), + session->sessionkey); + if( sqlite_query_status(res) == dbSUCCESS ) { + // TAP mode: Save the MAC address in the session values register - needed for the destroy session + if( (ctx->tuntype == tuntype_TAP) && eDBset_session_value(ctx, session, "macaddr", macaddr) == 0 ) { + eurephia_log(ctx, LOG_FATAL, 0, "Could not save MAC address into session variables"); + ret = 0; + } else { + ret = 1; + } + } else { + eurephia_log(ctx, LOG_FATAL, 0, "Could not update lastlog with new VPN client addresses for session"); + sqlite_log_error(ctx, res); + ret = 0; + } + + exit: + sqlite_free_results(res); + return ret; +} + + + +/** * @copydoc eDBregister_logout() */ int eDBregister_logout(eurephiaCTX *ctx, eurephiaSESSION *skey, |