summaryrefslogtreecommitdiffstats
path: root/database
diff options
context:
space:
mode:
Diffstat (limited to 'database')
-rw-r--r--database/eurephiadb.c1
-rw-r--r--database/eurephiadb_driver.h1
-rw-r--r--database/sqlite/administration.c62
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:
//