summaryrefslogtreecommitdiffstats
path: root/database/sqlite
diff options
context:
space:
mode:
authorDavid Sommerseth <dazo@users.sourceforge.net>2008-11-30 11:20:31 +0100
committerDavid Sommerseth <dazo@users.sourceforge.net>2008-11-30 11:20:31 +0100
commit28f27f827c67128073d1691edcdb43bb4f3f1c03 (patch)
tree1d2199d1f3df324709324d1efd23f27de84db65d /database/sqlite
parentc3059736cbbc58a8ee4a15bd139d652dd9e06772 (diff)
downloadeurephia-28f27f827c67128073d1691edcdb43bb4f3f1c03.tar.gz
eurephia-28f27f827c67128073d1691edcdb43bb4f3f1c03.tar.xz
eurephia-28f27f827c67128073d1691edcdb43bb4f3f1c03.zip
Completed the change of authentication model in database driver
Follow up of commit 103acd7c2e1467401f0795930be9140dc5ed47ff. Seems to work fine via both plugin mode and eurephiadm, regarding core dumping too.
Diffstat (limited to 'database/sqlite')
-rw-r--r--database/sqlite/CMakeLists.txt2
-rw-r--r--database/sqlite/edb-sqlite.c132
2 files changed, 49 insertions, 85 deletions
diff --git a/database/sqlite/CMakeLists.txt b/database/sqlite/CMakeLists.txt
index e0f333a..71f62a3 100644
--- a/database/sqlite/CMakeLists.txt
+++ b/database/sqlite/CMakeLists.txt
@@ -36,7 +36,7 @@ IF(SQLITE3BIN)
ENDIF(SQLITE3BIN)
-TARGET_LINK_LIBRARIES(edb-sqlite sqlite3 crypto)
+TARGET_LINK_LIBRARIES(edb-sqlite sqlite3)
ADD_DEFINITIONS(-DDRIVER_MODE)
SET_TARGET_PROPERTIES(edb-sqlite PROPERTIES OUTPUT_NAME edb-sqlite PREFIX "")
SET_SOURCE_FILES_PROPERTIES(${common_files_SRC} PROPERTIES GENERATED true)
diff --git a/database/sqlite/edb-sqlite.c b/database/sqlite/edb-sqlite.c
index c7729e5..58e69cd 100644
--- a/database/sqlite/edb-sqlite.c
+++ b/database/sqlite/edb-sqlite.c
@@ -35,7 +35,6 @@
#include <eurephiadb_session_common.h>
#include <eurephiadb_session_struct.h>
#include <passwd.h>
-#include <sha512.h>
#include "sqlite.h"
#ifdef MEMWATCH
@@ -657,7 +656,7 @@ char *eDBget_sessionkey_macaddr(eurephiaCTX *ctx, const char *macaddr) {
// Function returns true(1) if session key is unique
-int _local_eDBcheck_sessionkey_uniqueness(eurephiaCTX *ctx, const char *seskey) {
+int eDBcheck_sessionkey_uniqueness(eurephiaCTX *ctx, const char *seskey) {
dbresult *res;
int uniq = 0;
@@ -698,10 +697,6 @@ int _local_eDBcheck_sessionkey_uniqueness(eurephiaCTX *ctx, const char *seskey)
return uniq;
}
-inline int eDBcheck_sessionkey_uniqueness(eurephiaCTX *ctx, const char *seskey) {
- return _local_eDBcheck_sessionkey_uniqueness(ctx, seskey);
-}
-
// register a link between a short-term session seed and a long-term session key
@@ -937,20 +932,23 @@ eurephiaVALUES *eDBget_blacklisted_ip(eurephiaCTX *ctx) {
*/
// Authenticate admin user against user database
-eurephiaSESSION *eDBadminAuth(eurephiaCTX *ctx, const char interface, const char *uname, const char *pwd) {
- eurephiaSESSION *new_sess = NULL;
+int eDBadminAuth(eurephiaCTX *ctx, const char *uname, const char *pwd) {
dbresult *res = NULL;
- char *crpwd = NULL, *randdata = NULL;
+ char *crpwd = NULL;
char *activated = NULL, *deactivated = NULL, *blid = NULL;
- int uid = -1, admacc = 0, pwok = 0, loop = 0, uniqchk = 0;
- SHA512Context sha;
- uint8_t sha_res[SHA512_HASH_SIZE];
+ int uid = -1, admacc = 0, pwok = 0;
assert(ctx != NULL);
+ if( (ctx->context_type != ECTX_ADMIN_CONSOLE)
+ && (ctx->context_type != ECTX_ADMIN_WEB) ) {
+ eurephia_log(ctx, LOG_ERROR, 0, "Wrong eurephia context type (0x%04x)", ctx->context_type);
+ return 0;
+ }
+
if( (strlen_nullsafe(uname) < 4) || (strlen_nullsafe(pwd) < 4) ) {
eurephia_log(ctx, LOG_WARNING, 0, "User name and/or password is either null or less than 4 bytes");
- return NULL;
+ return 0;
}
//
@@ -970,7 +968,7 @@ eurephiaSESSION *eDBadminAuth(eurephiaCTX *ctx, const char interface, const char
if( !res ) {
eurephia_log(ctx, LOG_FATAL, 0, "Could not authenticate user against the database");
- return NULL;
+ return 0;
}
if( sqlite_get_numtuples(res) == 1 ) {
@@ -985,119 +983,85 @@ eurephiaSESSION *eDBadminAuth(eurephiaCTX *ctx, const char interface, const char
eurephia_log(ctx, LOG_WARNING, 0,
"Your user account is BLACKLISTED. You have no access.");
sqlite_free_results(res);
- return NULL;
+ return 0;
}
if( activated == NULL ) {
eurephia_log(ctx, LOG_WARNING, 0, "Your user account is not yet activated.");
sqlite_free_results(res);
- return NULL;
+ return 0;
}
if( deactivated != NULL ) {
eurephia_log(ctx, LOG_WARNING, 0, "Your user account is deactivated.");
sqlite_free_results(res);
- return NULL;
+ return 0;
}
if( admacc != 1 ) {
eurephia_log(ctx, LOG_WARNING, 0, "Your user account is lacking privileges");
sqlite_free_results(res);
- return NULL;
+ return 0;
}
if( pwok != 1 ) {
eurephia_log(ctx, LOG_WARNING, 0, "Authentication failed,");
sqlite_free_results(res);
- return NULL;
+ return 0;
}
} else {
eurephia_log(ctx, LOG_WARNING, 0, "Authentication failed. Too many records found.");
sqlite_free_results(res);
- return NULL;
+ return 0;
}
sqlite_free_results(res);
+ // If we reach this place, authentication was successful. Return users uid
+ return uid;
+}
- //
- // If we reach this place, authentication was successful ... create session
- //
-
- // Get a unique session key
- randdata = (char *) malloc(514);
- assert(randdata != NULL);
-
- new_sess = (eurephiaSESSION *) malloc(sizeof(eurephiaSESSION) + 2);
- assert(new_sess != NULL);
- memset(new_sess, 0, sizeof(eurephiaSESSION) + 2);
-
- do {
- char *ptr = NULL;
- int i = 0;
-
- memset(randdata, 0, 514);
- if( !eDBsessionGetRandString(ctx, randdata, 512) ) {
- eurephia_log(ctx, LOG_FATAL, 0, "Could not generate enough random data for session");
- free_nullsafe(randdata);
- free_nullsafe(new_sess);
- return NULL;
- }
-
- memset(&sha, 0, sizeof(SHA512Context));
- memset(&sha_res, 0, sizeof(sha_res));
+int eDBadminValidateSession(eurephiaCTX *ctx, char *sesskey) {
- free_nullsafe(new_sess->sessionkey);
- new_sess->sessionkey = (char *) malloc((SHA512_HASH_SIZE*2) + 3);
- assert(new_sess->sessionkey != NULL);
- memset(new_sess->sessionkey, 0, (SHA512_HASH_SIZE*2) + 3);
+ assert( (ctx != NULL) && (sesskey != NULL) );
- SHA512Init(&sha);
- SHA512Update(&sha, randdata, 512);
- SHA512Final(&sha, sha_res);
+ if( (ctx->context_type != ECTX_ADMIN_CONSOLE)
+ && (ctx->context_type != ECTX_ADMIN_WEB) ) {
+ eurephia_log(ctx, LOG_ERROR, 0, "Wrong eurephia context type (0x%04x)", ctx->context_type);
+ return 0;
+ }
+ return 0;
+}
- ptr = new_sess->sessionkey;
- for( i = 0; i < SHA512_HASH_SIZE; i++ ) {
- sprintf(ptr, "%02x", sha_res[i]);
- ptr++;
- }
- memset(&sha, 0, sizeof(SHA512Context));
- memset(&sha_res, 0, sizeof(sha_res));
- free_nullsafe(randdata);
+int eDBadminRegisterLogin(eurephiaCTX *ctx, eurephiaSESSION *session) {
+ dbresult *res = NULL;
+ char interface;
+ int uid;
- loop++;
- fprintf(stderr, "---> %s\n", new_sess->sessionkey);
- uniqchk = _local_eDBcheck_sessionkey_uniqueness(ctx, new_sess->sessionkey);
- } while( (uniqchk == 0) && (loop < 11) );
- free_nullsafe(randdata);
+ assert((ctx != NULL) && (session != NULL));
- if( uniqchk == 0 ) {
- eurephia_log(ctx, LOG_FATAL, 0,
- "Did not manage to create a unique session key after %i attemtps. Aborting.",
- loop-1);
- free_nullsafe(new_sess->sessionkey);
- free_nullsafe(new_sess);
- return NULL;
+ switch( ctx->context_type ) {
+ case ECTX_ADMIN_CONSOLE:
+ interface = 'C'; break;
+ case ECTX_ADMIN_WEB:
+ interface = 'W'; break;
+ default:
+ eurephia_log(ctx, LOG_ERROR, 0, "Wrong eurephia context type (0x%04x)", ctx->context_type);
+ return 0;
}
// Register login into eurephia_adminlog ... uid, login, interface, sessionkey
+ uid = atoi_nullsafe(eGet_value(session->sessvals, "uid"));
res = sqlite_query(ctx,
"INSERT INTO eurephia_adminlog "
" (uid, interface, status, login, last_action, sessionkey) "
"VALUES ('%i','%c',1,CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '%q')",
- uid, interface, new_sess->sessionkey);
+ uid, interface, session->sessionkey);
if( !res ) {
eurephia_log(ctx, LOG_FATAL, 0, "Could not manage to register the session in the database");
- free_nullsafe(new_sess->sessionkey);
- free_nullsafe(new_sess);
- return NULL;
+ return 0;
}
-
- // 3. Return new session
- return new_sess;
-}
-
-eurephiaSESSION *eDBadminLoadSession(eurephiaCTX *ctx, char *sesskey) {
- return NULL;
+ sqlite_free_results(res);
+ return 1;
}
eurephiaUSERLIST *eDBgetUserList(eurephiaCTX *ctx, const int sortkey) {