diff options
author | David Sommerseth <dazo@users.sourceforge.net> | 2009-03-24 00:17:44 +0100 |
---|---|---|
committer | David Sommerseth <dazo@users.sourceforge.net> | 2009-03-24 00:17:44 +0100 |
commit | 1af8103c21b94fa5a46b1618596c168124b8dd63 (patch) | |
tree | 9640e51b95351d132cb6d54e8fe7d205d08cc97b /database | |
parent | 73c82bd2440825d48b98f464de81e08805fce960 (diff) | |
download | eurephia-1af8103c21b94fa5a46b1618596c168124b8dd63.tar.gz eurephia-1af8103c21b94fa5a46b1618596c168124b8dd63.tar.xz eurephia-1af8103c21b94fa5a46b1618596c168124b8dd63.zip |
Extended the database driver with eDBadminGetAdminAccess(...)
This function will return an XML document with data extracted
from the eurephia_adminaccess table. Search criterias are
defined by the search XML doc given as input.
Diffstat (limited to 'database')
-rw-r--r-- | database/eurephiadb.c | 1 | ||||
-rw-r--r-- | database/eurephiadb_driver.h | 1 | ||||
-rw-r--r-- | database/sqlite/administration.c | 62 |
3 files changed, 64 insertions, 0 deletions
diff --git a/database/eurephiadb.c b/database/eurephiadb.c index 6dc0b87..3331362 100644 --- a/database/eurephiadb.c +++ b/database/eurephiadb.c @@ -115,6 +115,7 @@ int eDBlink_init(eurephiaCTX *ctx, const char *dbl, const int minver) eDBadminGetUserCertsList = eGetSym(ctx, ctx->eurephia_driver, "eDBadminGetUserCertsList"); eDBadminUpdateUserCertLink = eGetSym(ctx, ctx->eurephia_driver, "eDBadminUpdateUserCertLink"); + eDBadminGetAdminAccess = eGetSym(ctx, ctx->eurephia_driver, "eDBadminGetAdminAccess"); eDBadminEditAdminAccess = eGetSym(ctx, ctx->eurephia_driver, "eDBadminEditAdminAccess"); eDBadminGetLastlog = eGetSym(ctx, ctx->eurephia_driver, "eDBadminGetLastlog"); diff --git a/database/eurephiadb_driver.h b/database/eurephiadb_driver.h index a71d827..f6acdf2 100644 --- a/database/eurephiadb_driver.h +++ b/database/eurephiadb_driver.h @@ -119,6 +119,7 @@ int (*eDBadminDeleteCertificate) (eurephiaCTX *ctx, xmlDoc *certinfo); xmlDoc *(*eDBadminGetUserCertsList) (eurephiaCTX *ctx, const char *sortkeys); int (*eDBadminUpdateUserCertLink) (eurephiaCTX *ctx, xmlDoc *usrcrt_xml); +xmlDoc *(*eDBadminGetAdminAccess) (eurephiaCTX *ctx, xmlDoc *srch_xml); int (*eDBadminEditAdminAccess) (eurephiaCTX *ctx, xmlDoc *grant_xml); xmlDoc *(*eDBadminGetLastlog) (eurephiaCTX *ctx, xmlDoc *usersrch, xmlDoc *certsrch, const char *sortkeys); diff --git a/database/sqlite/administration.c b/database/sqlite/administration.c index 0e66db4..2d6e9d3 100644 --- a/database/sqlite/administration.c +++ b/database/sqlite/administration.c @@ -1210,6 +1210,68 @@ int eDBadminUpdateUserCertLink(eurephiaCTX *ctx, xmlDoc *usrcrt_xml) { return rc; } + +// The search XML document format is: +// <eurephia format="1"> +// <admin_access> +// <fieldMapping table="eurephia_adminaccess"> +// <{search field}>{search value}</{search field}> +// </fieldMapping> +// </admin_access> +// </eurehpia> +// +// It can be several search field tags to limit the search even more. +// +xmlDoc *eDBadminGetAdminAccess(eurephiaCTX *ctx, xmlDoc *srch) { + dbresult *res = NULL; + eDBfieldMap *fmap = NULL; + int last_uid = -1, i = 0; + + xmlDoc *doc = NULL; + xmlNode *root_n = NULL, *fieldmap_n = NULL, *rec_n = NULL, *acl_n = NULL, *tmp_n; + + DEBUG(ctx, 20, "Function call: eDBadminGetAdminAccess(ctx, {xmlDoc})"); + assert( (ctx != NULL) && (srch != NULL) ); + + tmp_n = eurephiaXML_getRoot(ctx, srch, "admin_access", 1); + fieldmap_n = xmlFindNode(tmp_n, "fieldMapping"); + fmap = eDBxmlMapping(ctx, tbl_sqlite_eurephiaadmacc, "eac", fieldmap_n); + + // Query the database, find the user defined in the user map + res = sqlite_query_mapped(ctx, SQL_SELECT, + "SELECT eac.uid, username, interface, access" + " FROM eurephia_adminaccess eac" + " LEFT JOIN openvpn_users USING(uid)", + NULL, fmap, "access"); + if( res == NULL ) { + eurephia_log(ctx, LOG_ERROR, 0, "Error querying the database for a access levels"); + return 0; + } + eDBfreeMapping(fmap); + + eurephiaXML_CreateDoc(ctx, 1, "admin_access_list", &doc, &root_n); + + for( i = 0; i < sqlite_get_numtuples(res); i++ ) { + if( last_uid != atoi_nullsafe(sqlite_get_value(res, i, 0)) ) { + // Create a new block element when we get a new uid + rec_n = xmlNewChild(root_n, NULL, (xmlChar *) "user_access", NULL); + last_uid = atoi_nullsafe(sqlite_get_value(res, i, 0)); + + tmp_n = sqlite_xml_value(rec_n, XML_NODE, "username", res, i, 1); + sqlite_xml_value(tmp_n, XML_ATTR, "uid", res, i, 0); + + acl_n = xmlNewChild(rec_n, NULL, (xmlChar *) "access_levels", NULL); + } + + tmp_n = sqlite_xml_value(acl_n, XML_NODE, "access", res, i, 3); + sqlite_xml_value(tmp_n, XML_ATTR, "interface", res, i, 2); + } + + sqlite_free_results(res); + return doc; +} + + // This functions updates (INSERT/DELETE) records in the eurephia_adminaccess table // based on information from the following XML document: // |