add AQH_ModService_HandleRequestWithTable(). Shorten code.

This commit is contained in:
Martin Preuss
2025-09-16 22:44:27 +02:00
parent 3e00ac4dfb
commit a1d6f80c36
3 changed files with 373 additions and 481 deletions

View File

@@ -25,10 +25,10 @@
* ------------------------------------------------------------------------------------------------ * ------------------------------------------------------------------------------------------------
*/ */
/* ------------------------------------------------------------------------------------------------ #define GBAS GWEN_Buffer_AppendString
* global vars #define GBAA GWEN_Buffer_AppendArgs
* ------------------------------------------------------------------------------------------------
*/
/* ------------------------------------------------------------------------------------------------ /* ------------------------------------------------------------------------------------------------
* forward declarations * forward declarations
@@ -40,22 +40,19 @@ static void _createRoleList(AQH_MODULE *m);
static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName); static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName);
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem); static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
static int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); static void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static int _handleRqEditMod(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); static void _handleRqEditModGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static int _handleRqEditModGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); static void _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static int _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static int _handleRqAddRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); static void _handleRqAddRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static int _handleRqAddRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); static void _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static int _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static int _handleRqEditRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); static void _handleRqEditRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static int _handleRqEditRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); static void _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static int _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static int _getHighestUsedRoleId(const AQH_ROLE_LIST *roleList); static int _getHighestUsedRoleId(const AQH_ROLE_LIST *roleList);
static int _handleRqDeleteRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); static void _handleRqDeleteRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _writeEditModForm(const AQH_MODULE *currentMod, const char *sModName, GWEN_BUFFER *dbuf); static void _writeEditModForm(const AQH_MODULE *currentMod, const char *sModName, GWEN_BUFFER *dbuf);
static void _writeRoleListToForm(const AQH_ROLE_LIST *roleList, static void _writeRoleListToForm(const AQH_ROLE_LIST *roleList,
@@ -70,6 +67,25 @@ static uint32_t _readPermissionsFromForm(GWEN_DB_NODE *dbPost, const AQH_PERMDEF
/* ------------------------------------------------------------------------------------------------
* vars
* ------------------------------------------------------------------------------------------------
*/
AQH_MODSERVICE_HANDLER_ENTRY _requestTable[]={
{"index.html", AQCGI_REQUEST_METHOD_GET, AQH_MODADMMODULES_PERMS_MODULESREAD, _handleRqIndex},
{"editmodule.html", AQCGI_REQUEST_METHOD_GET, AQH_MODADMMODULES_PERMS_MODULESWRITE, _handleRqEditModGet},
{"editmodule.html", AQCGI_REQUEST_METHOD_POST, AQH_MODADMMODULES_PERMS_MODULESWRITE, _handleRqEditModPost},
{"addrole.html", AQCGI_REQUEST_METHOD_GET, AQH_MODADMMODULES_PERMS_MODULESWRITE, _handleRqAddRoleGet},
{"addrole.html", AQCGI_REQUEST_METHOD_POST, AQH_MODADMMODULES_PERMS_MODULESWRITE, _handleRqAddRolePost},
{"editrole.html", AQCGI_REQUEST_METHOD_GET, AQH_MODADMMODULES_PERMS_MODULESWRITE, _handleRqEditRoleGet},
{"editrole.html", AQCGI_REQUEST_METHOD_POST, AQH_MODADMMODULES_PERMS_MODULESWRITE, _handleRqEditRolePost},
{"delrole.html", AQCGI_REQUEST_METHOD_GET, AQH_MODADMMODULES_PERMS_MODULESWRITE, _handleRqDeleteRole},
{NULL, 0, 0, NULL}
};
/* ------------------------------------------------------------------------------------------------ /* ------------------------------------------------------------------------------------------------
* code * code
* ------------------------------------------------------------------------------------------------ * ------------------------------------------------------------------------------------------------
@@ -150,51 +166,26 @@ AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem) int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem)
{ {
GWEN_BUFFER *dbuf; AQH_ModService_HandleRequestWithTable(m, rq, session, sLastPathElem, _requestTable);
dbuf=GWEN_Buffer_new(0, 256, 0, 1);
AQH_ModService_AddHeader(m, "en", dbuf);
if (strcasecmp(sLastPathElem, "index.html")==0)
_handleRqIndex(m, rq, session, dbuf);
else if (strcasecmp(sLastPathElem, "editmodule.html")==0)
_handleRqEditMod(m, rq, session, dbuf);
else if (strcasecmp(sLastPathElem, "addrole.html")==0)
_handleRqAddRole(m, rq, session, dbuf);
else if (strcasecmp(sLastPathElem, "editrole.html")==0)
_handleRqEditRole(m, rq, session, dbuf);
else if (strcasecmp(sLastPathElem, "delrole.html")==0)
_handleRqDeleteRole(m, rq, session, dbuf);
else {
AQCGI_Request_SetResponseCode(rq, 404);
AQCGI_Request_SetResponseText(rq, "Not Found");
}
AQH_ModService_AddFooter(m, "en", dbuf);
AQCGI_Request_SetBufferResponseBody(rq, dbuf);
AQCGI_Request_AddResponseHeaderData(rq, "Content-type: text/html");
return AQCGI_SendResponse(rq); return AQCGI_SendResponse(rq);
} }
int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{ {
AQH_SERVICE *sv;
GWEN_STRINGLIST *slModules;
uint32_t perms; uint32_t perms;
perms=AQH_ModService_GetUserPerms(m); perms=AQH_ModService_GetUserPerms(m);
DBG_ERROR(NULL, "Perms=%08x", perms);
if (perms & AQH_MODADMMODULES_PERMS_MODULESREAD) {
AQH_SERVICE *sv;
GWEN_STRINGLIST *slModules;
sv=AQH_ModService_GetService(m); sv=AQH_ModService_GetService(m);
slModules=AQH_Service_ListModules(sv); slModules=AQH_Service_ListModules(sv);
if (slModules) { if (slModules) {
GWEN_STRINGLISTENTRY *se; GWEN_STRINGLISTENTRY *se;
GWEN_Buffer_AppendString(dbuf, "<h1>Modules</h1>\n"); GBAS(dbuf, "<h1>Modules</h1>\n");
GWEN_Buffer_AppendString(dbuf, GBAS(dbuf,
"<table class=\"datatable\">\n" "<table class=\"datatable\">\n"
"<thead>" "<thead>"
"<tr><th>Id</th><th>Name</th><th>Description</th><th>Actions</th></tr>\n" "<tr><th>Id</th><th>Name</th><th>Description</th><th>Actions</th></tr>\n"
@@ -214,71 +205,34 @@ int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_
const char *sName; const char *sName;
sName=AQH_Module_GetName(currentMod); sName=AQH_Module_GetName(currentMod);
GWEN_Buffer_AppendString(dbuf, "<tr>"); GBAS(dbuf, "<tr>");
GWEN_Buffer_AppendArgs(dbuf, "<td>%lu</td>", (unsigned long int) AQH_Module_GetId(currentMod)); GBAA(dbuf, "<td>%lu</td>", (unsigned long int) AQH_Module_GetId(currentMod));
GWEN_Buffer_AppendArgs(dbuf, "<td>%s</td>", sName?sName:""); GBAA(dbuf, "<td>%s</td>", sName?sName:"");
s=AQH_Module_GetDescr(currentMod); s=AQH_Module_GetDescr(currentMod);
GWEN_Buffer_AppendArgs(dbuf, "<td>%s</td>", s?s:""); GBAA(dbuf, "<td>%s</td>", s?s:"");
GWEN_Buffer_AppendString(dbuf, "<td>"); GBAS(dbuf, "<td>");
if (perms & AQH_MODADMMODULES_PERMS_MODULESWRITE) if (perms & AQH_MODADMMODULES_PERMS_MODULESWRITE)
GWEN_Buffer_AppendArgs(dbuf, GBAA(dbuf, "<a href=\"editmodule.html?name=%s\"><img src=\"/pics/edit.png\"></a>", sName?sName:"");
"<a href=\"editmodule.html?name=%s\"><img src=\"/pics/edit.png\"></a>", GBAA(dbuf, "</td>\n");
sName?sName:""); GBAA(dbuf, "</tr>\n");
GWEN_Buffer_AppendArgs(dbuf, "</td>\n");
GWEN_Buffer_AppendArgs(dbuf, "</tr>\n");
AQH_Module_free(currentMod); AQH_Module_free(currentMod);
} }
} }
se=GWEN_StringListEntry_Next(se); se=GWEN_StringListEntry_Next(se);
} }
GWEN_Buffer_AppendString(dbuf, GBAS(dbuf,
"</tbody>\n" "</tbody>\n"
"</table>\n"); "</table>\n");
GWEN_StringList_free(slModules); GWEN_StringList_free(slModules);
} }
GWEN_Buffer_AppendString(dbuf, "<hr><a href=\"addmodule.html\">Add Module</a>"); if (perms & AQH_MODADMMODULES_PERMS_MODULESADD)
AQCGI_Request_SetResponseCode(rq, 200); GBAS(dbuf, "<hr><a href=\"addmodule.html\">Add Module</a>");
AQCGI_Request_SetResponseText(rq, "Ok");
}
else {
GWEN_Buffer_AppendString(dbuf, "<p>No permissions to read module list.</p>");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
}
return 0;
} }
int _handleRqEditMod(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) void _handleRqEditModGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{
uint32_t perms;
perms=AQH_ModService_GetUserPerms(m);
DBG_ERROR(NULL, "Perms=%08x", perms);
if (perms & AQH_MODADMMODULES_PERMS_MODULESWRITE) {
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET)
return _handleRqEditModGet(m, rq, session, dbuf);
else if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_POST)
return _handleRqEditModPost(m, rq, session, dbuf);
else {
DBG_ERROR(NULL, "Invalid request method %d", AQCGI_Request_GetRequestMethod(rq));
AQCGI_Request_SetResponseCode(rq, 405);
AQCGI_Request_SetResponseText(rq, "Method Not Allowed");
}
}
else {
GWEN_Buffer_AppendString(dbuf, "<p>No permissions to edit modules.</p>");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
}
return 0;
}
int _handleRqEditModGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{ {
AQH_SERVICE *sv; AQH_SERVICE *sv;
GWEN_DB_NODE *dbQuery; GWEN_DB_NODE *dbQuery;
@@ -291,8 +245,6 @@ int _handleRqEditModGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL; currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
if (currentMod) { if (currentMod) {
_writeEditModForm(currentMod, sModName, dbuf); _writeEditModForm(currentMod, sModName, dbuf);
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
AQH_Module_free(currentMod); AQH_Module_free(currentMod);
} }
else { else {
@@ -300,123 +252,11 @@ int _handleRqEditModGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
AQCGI_Request_SetResponseCode(rq, 303); AQCGI_Request_SetResponseCode(rq, 303);
AQCGI_Request_SetResponseText(rq, "See other"); AQCGI_Request_SetResponseText(rq, "See other");
} }
return 0;
} }
void _writeEditModForm(const AQH_MODULE *currentMod, const char *sModName, GWEN_BUFFER *dbuf) void _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{
const char *sName;
const char *sDescr;
const AQH_PERMDEF_LIST *permDefList;
const AQH_ROLE_LIST *roleList;
permDefList=AQH_Module_GetPermDefList(currentMod);
roleList=AQH_Module_GetRoleList(currentMod);
sName=AQH_Module_GetName(currentMod);
sDescr=AQH_Module_GetDescr(currentMod);
/* write module info */
GWEN_Buffer_AppendString(dbuf, "<h2>Module Info</h2>\n");
GWEN_Buffer_AppendArgs(dbuf,
"<form action=\"editmodule.html\" method=\"post\">\n"
"<table class=\"formtable\">\n"
"<tr>"
"<td><label for=\"name\">Name:</label></td>"
"<td><input type=\"text\" name=\"name\" value=\"%s\"></td>"
"</tr>\n"
"<tr>"
"<td><label for=\"descr\">Description:</label></td>"
"<td><input type=\"text\" name=\"descr\" value=\"%s\"></td>"
"</tr>\n",
sName?sName:"", sDescr?sDescr:"");
if (permDefList) {
GWEN_Buffer_AppendArgs(dbuf,
"<tr>"
"<td><label>Guest Permissions:</label></td>\n"
"<td>");
_writePermissionsToForm(permDefList, AQH_Module_GetGuestPerms(currentMod), dbuf);
GWEN_Buffer_AppendArgs(dbuf, "</td>" "</tr>");
}
GWEN_Buffer_AppendString(dbuf, "</table>\n");
GWEN_Buffer_AppendArgs(dbuf, "<input type=\"hidden\" name=\"module\" value=\"%s\">\n", sModName?sModName:"");
GWEN_Buffer_AppendString(dbuf, "<input type=\"submit\" value=\"Save\">\n</form>\n\n");
/* write role list */
GWEN_Buffer_AppendString(dbuf, "<h2>User Roles</h2>\n");
if (roleList)
_writeRoleListToForm(roleList, sModName, permDefList, dbuf);
else
GWEN_Buffer_AppendString(dbuf, "<p>none</p>");
GWEN_Buffer_AppendArgs(dbuf,
"<a href=\"addrole.html?mod=%s\">"
"<img src=\"/pics/plus.png\">Add Role</a>\n",
sModName?sModName:"");
}
void _writeRoleListToForm(const AQH_ROLE_LIST *roleList,
const char *sModName,
const AQH_PERMDEF_LIST *permDefList,
GWEN_BUFFER *dbuf)
{
const AQH_ROLE *role;
GWEN_Buffer_AppendString(dbuf,
"<table class=\"datatable\">\n"
"<thead>"
"<tr><th>Id</th><th>Name</th><th>Permissions</th><th>Description</th><th>Actions</th></tr>\n"
"</thead>\n"
"<tbody>\n");
role=AQH_Role_List_First(roleList);
while(role) {
uint8_t id;
const char *s;
GWEN_Buffer_AppendString(dbuf, "<tr>");
/* id */
id=AQH_Role_GetId(role);
GWEN_Buffer_AppendArgs(dbuf, "<td>%d</td>", id);
/* name */
s=AQH_Role_GetName(role);
GWEN_Buffer_AppendArgs(dbuf, "<td>%s</td>", s?s:"");
/* permissions */
GWEN_Buffer_AppendString(dbuf, "<td>");
if (permDefList)
_writeEnabledPermissions(permDefList, AQH_Role_GetPerms(role), dbuf);
GWEN_Buffer_AppendString(dbuf, "</td>");
/* description */
s=AQH_Role_GetDescr(role);
GWEN_Buffer_AppendArgs(dbuf, "<td>%s</td>", s?s:"");
/* actions */
GWEN_Buffer_AppendArgs(dbuf, "<td>");
GWEN_Buffer_AppendArgs(dbuf,
"<a href=\"editrole.html?mod=%s&id=%d\">"
"<img src=\"/pics/edit.png\"></a>",
sModName?sModName:"", id);
GWEN_Buffer_AppendArgs(dbuf,
"<a href=\"delrole.html?mod=%s&id=%d\">"
"<img src=\"/pics/minus.png\"></a>",
sModName?sModName:"", id);
GWEN_Buffer_AppendArgs(dbuf, "</td>");
GWEN_Buffer_AppendString(dbuf, "</tr>\n");
role=AQH_Role_List_Next(role);
}
GWEN_Buffer_AppendString(dbuf,
"</tbody>\n"
"</table>\n");
}
int _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{ {
AQH_SERVICE *sv; AQH_SERVICE *sv;
GWEN_DB_NODE *dbPost; GWEN_DB_NODE *dbPost;
@@ -446,12 +286,10 @@ int _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
rv=AQH_Service_SaveModule(sv, currentMod); rv=AQH_Service_SaveModule(sv, currentMod);
if (rv<0) { if (rv<0) {
GWEN_Buffer_AppendString(dbuf, "<h2>Error</h2><p>Error saving module</p>"); GBAS(dbuf, "<h2>Error</h2><p>Error saving module</p>");
DBG_ERROR(NULL, "Could not save module \"%s\"", sModName); DBG_ERROR(NULL, "Could not save module \"%s\"", sModName);
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
AQH_Module_free(currentMod); AQH_Module_free(currentMod);
return 0; return;
} }
DBG_ERROR(NULL, "Module \"%s\" saved", sModName); DBG_ERROR(NULL, "Module \"%s\" saved", sModName);
AQH_Module_free(currentMod); AQH_Module_free(currentMod);
@@ -461,44 +299,13 @@ int _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
} }
else { else {
DBG_ERROR(NULL, "Could not load module \"%s\"", sModName?sModName:"<no name>"); DBG_ERROR(NULL, "Could not load module \"%s\"", sModName?sModName:"<no name>");
GWEN_Buffer_AppendString(dbuf, "<p>Error loading module.</p>\n"); GBAS(dbuf, "<p>Error loading module.</p>\n");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
}
return 0;
}
int _handleRqAddRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{
uint32_t perms;
perms=AQH_ModService_GetUserPerms(m);
DBG_ERROR(NULL, "Perms=%08x", perms);
if (perms & AQH_MODADMMODULES_PERMS_MODULESWRITE) {
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET)
return _handleRqAddRoleGet(m, rq, session, dbuf);
else if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_POST)
return _handleRqAddRolePost(m, rq, session, dbuf);
else {
DBG_ERROR(NULL, "Invalid request method %d", AQCGI_Request_GetRequestMethod(rq));
AQCGI_SendResponseWithStatus(rq, 405, "Method Not Allowed");
AQCGI_Request_SetResponseCode(rq, 405);
AQCGI_Request_SetResponseText(rq, "Method Not Allowed");
} }
} }
else {
GWEN_Buffer_AppendString(dbuf, "<p>No permissions to edit modules.</p>");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
}
return 0;
}
int _handleRqAddRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) void _handleRqAddRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{ {
AQH_SERVICE *sv; AQH_SERVICE *sv;
GWEN_DB_NODE *dbQuery; GWEN_DB_NODE *dbQuery;
@@ -516,59 +323,47 @@ int _handleRqAddRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
if (currentMod) { if (currentMod) {
if (permDefList) { if (permDefList) {
GWEN_Buffer_AppendArgs(dbuf, "<h2>Add Role for Module %s</h2>\n", sModName?sModName:""); GBAA(dbuf, "<h2>Add Role for Module %s</h2>\n", sModName?sModName:"");
GWEN_Buffer_AppendString(dbuf, GBAS(dbuf,
"<form action=\"addrole.html\" method=\"post\">\n" "<form action=\"addrole.html\" method=\"post\">\n"
"<table class=\"formtable\">\n" "<table class=\"formtable\">\n"
"<tr>" "<tr><td><label for=\"name\">Name:</label></td><td><input type=\"text\" name=\"name\"></td>"
"<td><label for=\"name\">Name:</label></td>" "<tr><td><label for=\"descr\">Description:</label></td><td><input type=\"text\" name=\"descr\"></td></tr>\n");
"<td><input type=\"text\" name=\"name\"></td>"
"<tr>"
"<td><label for=\"descr\">Description:</label></td>"
"<td><input type=\"text\" name=\"descr\"></td>"
"</tr>\n");
GWEN_Buffer_AppendString(dbuf, "<tr><td><label>Permissions:</label></td><td>"); GBAS(dbuf, "<tr><td><label>Permissions:</label></td><td>");
_writePermissionsToForm(permDefList, guestPerms, dbuf); _writePermissionsToForm(permDefList, guestPerms, dbuf);
GWEN_Buffer_AppendString(dbuf, "</td></tr>\n"); GBAS(dbuf, "</td></tr>\n");
#if 0 #if 0
GWEN_Buffer_AppendString(dbuf, "<tr><td><label>Explicitly add permissions:</label></td><td>"); GBAS(dbuf, "<tr><td><label>Explicitly add permissions:</label></td><td>");
_writePermissionsToForm(permDefList, 0, dbuf); _writePermissionsToForm(permDefList, 0, dbuf);
GWEN_Buffer_AppendString(dbuf, "</td></tr>\n"); GBAS(dbuf, "</td></tr>\n");
GWEN_Buffer_AppendString(dbuf, "<tr><td><label>Explicitly sub permissions:</label></td><td>"); GBAS(dbuf, "<tr><td><label>Explicitly sub permissions:</label></td><td>");
_writePermissionsToForm(permDefList, 0, dbuf); _writePermissionsToForm(permDefList, 0, dbuf);
GWEN_Buffer_AppendString(dbuf, "</td></tr>\n"); GBAS(dbuf, "</td></tr>\n");
#endif #endif
GWEN_Buffer_AppendString(dbuf, "</table>\n"); GBAS(dbuf, "</table>\n");
GWEN_Buffer_AppendArgs(dbuf, "<input type=\"hidden\" name=\"mod\" value=\"%s\">\n", sModName?sModName:""); GBAA(dbuf, "<input type=\"hidden\" name=\"mod\" value=\"%s\">\n", sModName?sModName:"");
GWEN_Buffer_AppendString(dbuf, "<input type=\"submit\" value=\"Add\">\n"); GBAS(dbuf, "<input type=\"submit\" value=\"Add\">\n");
GWEN_Buffer_AppendString(dbuf, "</form>\n\n"); GBAS(dbuf, "</form>\n\n");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
} }
else { else {
GWEN_Buffer_AppendString(dbuf, "<p>Please add permission definitions first.</p>\n"); GBAS(dbuf, "<p>Please add permission definitions first.</p>\n");
GWEN_Buffer_AppendArgs(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:""); GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
} }
AQH_Module_free(currentMod); AQH_Module_free(currentMod);
} }
else { else {
GWEN_Buffer_AppendString(dbuf, "<p>Error loading module.</p>\n"); GBAS(dbuf, "<p>Error loading module.</p>\n");
GWEN_Buffer_AppendString(dbuf, "<p><a href=\"index.html\"> back to module list</p>\n"); GBAS(dbuf, "<p><a href=\"index.html\"> back to module list</p>\n");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
} }
return 0;
} }
int _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) void _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{ {
AQH_SERVICE *sv; AQH_SERVICE *sv;
GWEN_DB_NODE *dbPost; GWEN_DB_NODE *dbPost;
@@ -603,11 +398,9 @@ int _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
/* validate */ /* validate */
if (!(sName && *sName)) { if (!(sName && *sName)) {
DBG_ERROR(NULL, "Missing value for \"name\""); DBG_ERROR(NULL, "Missing value for \"name\"");
GWEN_Buffer_AppendString(dbuf, "<p>Missing name.</p>\n"); GBAS(dbuf, "<p>Missing name.</p>\n");
GWEN_Buffer_AppendArgs(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:""); GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
AQCGI_Request_SetResponseCode(rq, 200); return;
AQCGI_Request_SetResponseText(rq, "Ok");
return 0;
} }
if (currentMod) { if (currentMod) {
@@ -629,12 +422,10 @@ int _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
/* save module */ /* save module */
rv=AQH_Service_SaveModule(sv, currentMod); rv=AQH_Service_SaveModule(sv, currentMod);
if (rv<0) { if (rv<0) {
GWEN_Buffer_AppendString(dbuf, "<p>Error saving module.</p>\n"); GBAS(dbuf, "<p>Error saving module.</p>\n");
GWEN_Buffer_AppendArgs(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:""); GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
AQH_Module_free(currentMod); AQH_Module_free(currentMod);
return 0; return;
} }
_setLocationHeaderForMod(rq, "editmodule.html", sModName); _setLocationHeaderForMod(rq, "editmodule.html", sModName);
AQCGI_Request_SetResponseCode(rq, 303); AQCGI_Request_SetResponseCode(rq, 303);
@@ -642,66 +433,14 @@ int _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
AQH_Module_free(currentMod); AQH_Module_free(currentMod);
} }
else { else {
GWEN_Buffer_AppendString(dbuf, "<p>Error loading module.</p>\n"); GBAS(dbuf, "<p>Error loading module.</p>\n");
GWEN_Buffer_AppendString(dbuf, "<p><a href=\"index.html\"> back to module list</p>\n"); GBAS(dbuf, "<p><a href=\"index.html\"> back to module list</p>\n");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
}
return 0;
}
int _getHighestUsedRoleId(const AQH_ROLE_LIST *roleList)
{
int id=0;
if (roleList) {
const AQH_ROLE *role;
role=AQH_Role_List_First(roleList);
while(role) {
int rid;
rid=AQH_Role_GetId(role);
id=(rid>id)?rid:id;
role=AQH_Role_List_Next(role);
} }
} }
return id;
}
int _handleRqEditRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) void _handleRqEditRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{
uint32_t perms;
perms=AQH_ModService_GetUserPerms(m);
DBG_ERROR(NULL, "Perms=%08x", perms);
if (perms & AQH_MODADMMODULES_PERMS_MODULESWRITE) {
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET)
return _handleRqEditRoleGet(m, rq, session, dbuf);
else if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_POST)
return _handleRqEditRolePost(m, rq, session, dbuf);
else {
DBG_ERROR(NULL, "Invalid request method %d", AQCGI_Request_GetRequestMethod(rq));
AQCGI_Request_SetResponseCode(rq, 405);
AQCGI_Request_SetResponseText(rq, "Method Not Allowed");
}
}
else {
GWEN_Buffer_AppendString(dbuf, "<p>No permissions to edit modules.</p>");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
}
return 0;
}
int _handleRqEditRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{ {
AQH_SERVICE *sv; AQH_SERVICE *sv;
GWEN_DB_NODE *dbQuery; GWEN_DB_NODE *dbQuery;
@@ -736,8 +475,8 @@ int _handleRqEditRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
#endif #endif
if (role) { if (role) {
GWEN_Buffer_AppendArgs(dbuf, "<h2>Edit Role for Module %s</h2>\n", sModName?sModName:""); GBAA(dbuf, "<h2>Edit Role for Module %s</h2>\n", sModName?sModName:"");
GWEN_Buffer_AppendArgs(dbuf, GBAA(dbuf,
"<form action=\"editrole.html\" method=\"post\">\n" "<form action=\"editrole.html\" method=\"post\">\n"
"<table class=\"formtable\">\n" "<table class=\"formtable\">\n"
"<tr>\n" "<tr>\n"
@@ -750,39 +489,36 @@ int _handleRqEditRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
"</tr>\n", "</tr>\n",
sName, sDescr?sDescr:""); sName, sDescr?sDescr:"");
GWEN_Buffer_AppendString(dbuf, "<tr><td><label>Permissions:</label></td><td>"); GBAS(dbuf, "<tr><td><label>Permissions:</label></td><td>");
_writePermissionsToForm(permDefList, perms, dbuf); _writePermissionsToForm(permDefList, perms, dbuf);
GWEN_Buffer_AppendString(dbuf, "</td></tr>\n"); GBAS(dbuf, "</td></tr>\n");
#if 0 #if 0
GWEN_Buffer_AppendString(dbuf, "<tr><td><label>Explicitly add permissions:</label></td><td>"); GBAS(dbuf, "<tr><td><label>Explicitly add permissions:</label></td><td>");
_writePermissionsToForm(permDefList, explAddPerms, dbuf); _writePermissionsToForm(permDefList, explAddPerms, dbuf);
GWEN_Buffer_AppendString(dbuf, "</td></tr>\n"); GBAS(dbuf, "</td></tr>\n");
GWEN_Buffer_AppendString(dbuf, "<tr><td><label>Explicitly sub permissions:</label></td><td>"); GBAS(dbuf, "<tr><td><label>Explicitly sub permissions:</label></td><td>");
_writePermissionsToForm(permDefList, explDelPerms, dbuf); _writePermissionsToForm(permDefList, explDelPerms, dbuf);
GWEN_Buffer_AppendString(dbuf, "</td></tr>\n"); GBAS(dbuf, "</td></tr>\n");
#endif #endif
GWEN_Buffer_AppendString(dbuf, "</table>\n"); GBAS(dbuf, "</table>\n");
GWEN_Buffer_AppendArgs(dbuf, "<input type=\"hidden\" name=\"mod\" value=\"%s\">\n", sModName?sModName:""); GBAA(dbuf, "<input type=\"hidden\" name=\"mod\" value=\"%s\">\n", sModName?sModName:"");
GWEN_Buffer_AppendArgs(dbuf, "<input type=\"hidden\" name=\"oldId\" value=\"%d\">\n", id); GBAA(dbuf, "<input type=\"hidden\" name=\"oldId\" value=\"%d\">\n", id);
GWEN_Buffer_AppendString(dbuf, "<input type=\"submit\" value=\"Save\">\n"); GBAS(dbuf, "<input type=\"submit\" value=\"Save\">\n");
GWEN_Buffer_AppendString(dbuf, "</form>\n\n"); GBAS(dbuf, "</form>\n\n");
} }
else { else {
GWEN_Buffer_AppendString(dbuf, "<p>Role not found.</p>\n"); GBAS(dbuf, "<p>Role not found.</p>\n");
GWEN_Buffer_AppendArgs(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:""); GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
} }
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
return 0;
} }
int _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) void _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{ {
AQH_SERVICE *sv; AQH_SERVICE *sv;
GWEN_DB_NODE *dbPost; GWEN_DB_NODE *dbPost;
@@ -818,19 +554,15 @@ int _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
/* validate */ /* validate */
if (!(sName && *sName)) { if (!(sName && *sName)) {
DBG_ERROR(NULL, "Missing value for \"name\""); DBG_ERROR(NULL, "Missing value for \"name\"");
GWEN_Buffer_AppendString(dbuf, "<p>Missing name.</p>\n"); GBAS(dbuf, "<p>Missing name.</p>\n");
GWEN_Buffer_AppendArgs(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:""); GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
AQCGI_Request_SetResponseCode(rq, 200); return;
AQCGI_Request_SetResponseText(rq, "Ok");
return 0;
} }
if (role==NULL) { if (role==NULL) {
DBG_ERROR(NULL, "Role %d not found", oldId); DBG_ERROR(NULL, "Role %d not found", oldId);
GWEN_Buffer_AppendString(dbuf, "<p>Role not found.</p>\n"); GBAS(dbuf, "<p>Role not found.</p>\n");
GWEN_Buffer_AppendArgs(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:""); GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
AQCGI_Request_SetResponseCode(rq, 200); return;
AQCGI_Request_SetResponseText(rq, "Ok");
return 0;
} }
if (currentMod) { if (currentMod) {
@@ -842,12 +574,10 @@ int _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
/* save module */ /* save module */
rv=AQH_Service_SaveModule(sv, currentMod); rv=AQH_Service_SaveModule(sv, currentMod);
if (rv<0) { if (rv<0) {
GWEN_Buffer_AppendString(dbuf, "<p>Error saving module.</p>\n"); GBAS(dbuf, "<p>Error saving module.</p>\n");
GWEN_Buffer_AppendArgs(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:""); GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
AQH_Module_free(currentMod); AQH_Module_free(currentMod);
return 0; return;
} }
_setLocationHeaderForMod(rq, "editmodule.html", sModName); _setLocationHeaderForMod(rq, "editmodule.html", sModName);
@@ -856,23 +586,15 @@ int _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
AQH_Module_free(currentMod); AQH_Module_free(currentMod);
} }
else { else {
GWEN_Buffer_AppendString(dbuf, "<p>Error loading module.</p>\n"); GBAS(dbuf, "<p>Error loading module.</p>\n");
GWEN_Buffer_AppendString(dbuf, "<p><a href=\"index.html\"> back to module list</p>\n"); GBAS(dbuf, "<p><a href=\"index.html\"> back to module list</p>\n");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
} }
return 0;
} }
int _handleRqDeleteRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) void _handleRqDeleteRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
{ {
uint32_t perms;
perms=AQH_ModService_GetUserPerms(m);
DBG_ERROR(NULL, "Perms=%08x", perms);
if (perms & AQH_MODADMMODULES_PERMS_MODULESWRITE) {
AQH_SERVICE *sv; AQH_SERVICE *sv;
GWEN_DB_NODE *dbQuery; GWEN_DB_NODE *dbQuery;
const char *sModName; const char *sModName;
@@ -898,12 +620,10 @@ int _handleRqDeleteRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
/* save module */ /* save module */
rv=AQH_Service_SaveModule(sv, currentMod); rv=AQH_Service_SaveModule(sv, currentMod);
if (rv<0) { if (rv<0) {
GWEN_Buffer_AppendString(dbuf, "<p>Error saving module.</p>\n"); GBAS(dbuf, "<p>Error saving module.</p>\n");
GWEN_Buffer_AppendArgs(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:""); GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
AQH_Module_free(currentMod); AQH_Module_free(currentMod);
return 0; return;
} }
_setLocationHeaderForMod(rq, "editmodule.html", sModName); _setLocationHeaderForMod(rq, "editmodule.html", sModName);
@@ -911,27 +631,16 @@ int _handleRqDeleteRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
AQCGI_Request_SetResponseText(rq, "See Other"); AQCGI_Request_SetResponseText(rq, "See Other");
} }
else { else {
GWEN_Buffer_AppendString(dbuf, "<p>Role not found.</p>\n"); GBAS(dbuf, "<p>Role not found.</p>\n");
GWEN_Buffer_AppendArgs(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:""); GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
} }
AQH_Module_free(currentMod); AQH_Module_free(currentMod);
} }
else { else {
GWEN_Buffer_AppendString(dbuf, "<p>Error loading module.</p>\n"); GBAS(dbuf, "<p>Error loading module.</p>\n");
GWEN_Buffer_AppendString(dbuf, "<p><a href=\"index.html\"> back to module list</p>\n"); GBAS(dbuf, "<p><a href=\"index.html\"> back to module list</p>\n");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
} }
} }
else {
GWEN_Buffer_AppendString(dbuf, "<p>No permissions to edit modules.</p>");
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
}
return 0;
}
@@ -940,17 +649,141 @@ void _setLocationHeaderForMod(AQCGI_REQUEST *rq, const char *page, const char *s
GWEN_BUFFER *tbuf; GWEN_BUFFER *tbuf;
tbuf=GWEN_Buffer_new(0, 256, 0, 1); tbuf=GWEN_Buffer_new(0, 256, 0, 1);
GWEN_Buffer_AppendArgs(tbuf, "Location: %s?name=%s", page?page:"", sModName?sModName:""); GBAA(tbuf, "Location: %s?name=%s", page?page:"", sModName?sModName:"");
AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(tbuf)); AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(tbuf));
GWEN_Buffer_free(tbuf); GWEN_Buffer_free(tbuf);
} }
int _getHighestUsedRoleId(const AQH_ROLE_LIST *roleList)
{
int id=0;
if (roleList) {
const AQH_ROLE *role;
role=AQH_Role_List_First(roleList);
while(role) {
int rid;
rid=AQH_Role_GetId(role);
id=(rid>id)?rid:id;
role=AQH_Role_List_Next(role);
}
}
return id;
}
void _writeEditModForm(const AQH_MODULE *currentMod, const char *sModName, GWEN_BUFFER *dbuf)
{
const char *sName;
const char *sDescr;
const AQH_PERMDEF_LIST *permDefList;
const AQH_ROLE_LIST *roleList;
permDefList=AQH_Module_GetPermDefList(currentMod);
roleList=AQH_Module_GetRoleList(currentMod);
sName=AQH_Module_GetName(currentMod);
sDescr=AQH_Module_GetDescr(currentMod);
/* write module info */
GBAS(dbuf, "<h2>Module Info</h2>\n");
GBAA(dbuf,
"<form action=\"editmodule.html\" method=\"post\">\n"
"<table class=\"formtable\">\n"
"<tr>"
"<td><label for=\"name\">Name:</label></td>"
"<td><input type=\"text\" name=\"name\" value=\"%s\"></td>"
"</tr>\n"
"<tr>"
"<td><label for=\"descr\">Description:</label></td>"
"<td><input type=\"text\" name=\"descr\" value=\"%s\"></td>"
"</tr>\n",
sName?sName:"", sDescr?sDescr:"");
if (permDefList) {
GBAA(dbuf,
"<tr>"
"<td><label>Guest Permissions:</label></td>\n"
"<td>");
_writePermissionsToForm(permDefList, AQH_Module_GetGuestPerms(currentMod), dbuf);
GBAA(dbuf, "</td>" "</tr>");
}
GBAS(dbuf, "</table>\n");
GBAA(dbuf, "<input type=\"hidden\" name=\"module\" value=\"%s\">\n", sModName?sModName:"");
GBAS(dbuf, "<input type=\"submit\" value=\"Save\">\n</form>\n\n");
/* write role list */
GBAS(dbuf, "<h2>User Roles</h2>\n");
if (roleList)
_writeRoleListToForm(roleList, sModName, permDefList, dbuf);
else
GBAS(dbuf, "<p>none</p>");
GBAA(dbuf,
"<a href=\"addrole.html?mod=%s\">"
"<img src=\"/pics/plus.png\">Add Role</a>\n",
sModName?sModName:"");
}
void _writeRoleListToForm(const AQH_ROLE_LIST *roleList,
const char *sModName,
const AQH_PERMDEF_LIST *permDefList,
GWEN_BUFFER *dbuf)
{
const AQH_ROLE *role;
GBAS(dbuf,
"<table class=\"datatable\">\n"
"<thead>"
"<tr><th>Id</th><th>Name</th><th>Permissions</th><th>Description</th><th>Actions</th></tr>\n"
"</thead>\n"
"<tbody>\n");
role=AQH_Role_List_First(roleList);
while(role) {
uint8_t id;
const char *s;
GBAS(dbuf, "<tr>");
/* id */
id=AQH_Role_GetId(role);
GBAA(dbuf, "<td>%d</td>", id);
/* name */
s=AQH_Role_GetName(role);
GBAA(dbuf, "<td>%s</td>", s?s:"");
/* permissions */
GBAS(dbuf, "<td>");
if (permDefList)
_writeEnabledPermissions(permDefList, AQH_Role_GetPerms(role), dbuf);
GBAS(dbuf, "</td>");
/* description */
s=AQH_Role_GetDescr(role);
GBAA(dbuf, "<td>%s</td>", s?s:"");
/* actions */
GBAA(dbuf, "<td>");
GBAA(dbuf,
"<a href=\"editrole.html?mod=%s&id=%d\">"
"<img src=\"/pics/edit.png\"></a>",
sModName?sModName:"", id);
GBAA(dbuf,
"<a href=\"delrole.html?mod=%s&id=%d\">"
"<img src=\"/pics/minus.png\"></a>",
sModName?sModName:"", id);
GBAA(dbuf, "</td>");
GBAS(dbuf, "</tr>\n");
role=AQH_Role_List_Next(role);
}
GBAS(dbuf,
"</tbody>\n"
"</table>\n");
}
@@ -970,10 +803,10 @@ void _writePermissionsToForm(const AQH_PERMDEF_LIST *permDefList, uint32_t perms
s=AQH_PermDef_GetId(permDef); s=AQH_PermDef_GetId(permDef);
mask=AQH_PermDef_GetMask(permDef); mask=AQH_PermDef_GetMask(permDef);
if (perms & mask) if (perms & mask)
GWEN_Buffer_AppendArgs(dbuf, "<input type=\"checkbox\" name=\"%s\" checked>", s?s:""); GBAA(dbuf, "<input type=\"checkbox\" name=\"%s\" checked>", s?s:"");
else else
GWEN_Buffer_AppendArgs(dbuf, "<input type=\"checkbox\" name=\"%s\">", s?s:""); GBAA(dbuf, "<input type=\"checkbox\" name=\"%s\">", s?s:"");
GWEN_Buffer_AppendArgs(dbuf, "<label for=\"%s\">%s</label>", s?s:"", s?s:""); GBAA(dbuf, "<label for=\"%s\">%s</label>", s?s:"", s?s:"");
permDef=AQH_PermDef_List_Next(permDef); permDef=AQH_PermDef_List_Next(permDef);
} }
@@ -995,7 +828,7 @@ void _writeEnabledPermissions(const AQH_PERMDEF_LIST *permDefList, uint32_t perm
s=AQH_PermDef_GetId(permDef); s=AQH_PermDef_GetId(permDef);
mask=AQH_PermDef_GetMask(permDef); mask=AQH_PermDef_GetMask(permDef);
if (perms & mask) if (perms & mask)
GWEN_Buffer_AppendArgs(dbuf, "%s ", s?s:""); GBAA(dbuf, "%s ", s?s:"");
permDef=AQH_PermDef_List_Next(permDef); permDef=AQH_PermDef_List_Next(permDef);
} }
} }

View File

@@ -477,4 +477,49 @@ void AQH_ModService_AddRole(AQH_ROLE_LIST *roleList, int id, const char *name, u
void AQH_ModService_HandleRequestWithTable(AQH_MODULE *m,
AQCGI_REQUEST *rq,
AQH_SESSION *session,
const char *page,
const AQH_MODSERVICE_HANDLER_ENTRY *e)
{
uint32_t perms;
GWEN_BUFFER *dbuf;
int i;
perms=AQH_ModService_GetUserPerms(m);
DBG_ERROR(NULL, "Perms=%08x", perms);
dbuf=GWEN_Buffer_new(0, 256, 0, 1);
AQH_ModService_AddHeader(m, "en", dbuf);
for (i=0; ; i++) {
if (e[i].page==NULL) {
AQCGI_Request_SetResponseCode(rq, 404);
AQCGI_Request_SetResponseText(rq, "Not Found");
break;
}
if ((AQCGI_Request_GetRequestMethod(rq)==e[i].httpMethod) &&
(strcasecmp(page, e[i].page)==0)) {
/* preset result */
AQCGI_Request_SetResponseCode(rq, 200);
AQCGI_Request_SetResponseText(rq, "Ok");
if ((perms & e[i].perms)==e[i].perms)
(e[i].handlerFn)(m, rq, session, dbuf);
else {
GWEN_Buffer_AppendString(dbuf, "<h1>Error</h1><p>No permissions for this request.</p>");
AQCGI_Request_SetResponseCode(rq, 403);
AQCGI_Request_SetResponseText(rq, "Forbidden");
}
break;
}
}
AQH_ModService_AddFooter(m, "en", dbuf);
AQCGI_Request_SetBufferResponseBody(rq, dbuf);
AQCGI_Request_AddResponseHeaderData(rq, "Content-type: text/html");
}

View File

@@ -24,6 +24,15 @@ typedef void (*AQH_MODSERVICE_ADDHEADER_FN)(AQH_MODULE *m, const char *lang, GWE
typedef void (*AQH_MODSERVICE_ADDFOOTER_FN)(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf); typedef void (*AQH_MODSERVICE_ADDFOOTER_FN)(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
typedef struct AQH_MODSERVICE_HANDLER_ENTRY AQH_MODSERVICE_HANDLER_ENTRY;
struct AQH_MODSERVICE_HANDLER_ENTRY {
const char *page;
int httpMethod;
uint32_t perms;
void (*handlerFn)(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
};
void AQH_ModService_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder); void AQH_ModService_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder);
@@ -41,6 +50,11 @@ int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *
AQH_SESSION *AQH_ModService_ReadSession(AQH_MODULE *m, AQCGI_REQUEST *rq); AQH_SESSION *AQH_ModService_ReadSession(AQH_MODULE *m, AQCGI_REQUEST *rq);
void AQH_ModService_CalcSessionModPerms(AQH_MODULE *m, const AQH_SESSION *session); void AQH_ModService_CalcSessionModPerms(AQH_MODULE *m, const AQH_SESSION *session);
void AQH_ModService_HandleRequestWithTable(AQH_MODULE *m,
AQCGI_REQUEST *rq,
AQH_SESSION *session,
const char *page,
const AQH_MODSERVICE_HANDLER_ENTRY *e);
int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *lang, const char *sFilename, GWEN_BUFFER *dbuf); int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *lang, const char *sFilename, GWEN_BUFFER *dbuf);
int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *filename, GWEN_BUFFER *dbuf); int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *filename, GWEN_BUFFER *dbuf);