From a1d6f80c367fcefc038b0ca2ec442222eae3776b Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Tue, 16 Sep 2025 22:44:27 +0200 Subject: [PATCH] add AQH_ModService_HandleRequestWithTable(). Shorten code. --- apps/aqhome-cgi/modules/common/mmodules.c | 795 +++++++++------------- apps/aqhome-cgi/modules/common/mservice.c | 45 ++ apps/aqhome-cgi/modules/common/mservice.h | 14 + 3 files changed, 373 insertions(+), 481 deletions(-) diff --git a/apps/aqhome-cgi/modules/common/mmodules.c b/apps/aqhome-cgi/modules/common/mmodules.c index 777117c..a0b4630 100644 --- a/apps/aqhome-cgi/modules/common/mmodules.c +++ b/apps/aqhome-cgi/modules/common/mmodules.c @@ -25,10 +25,10 @@ * ------------------------------------------------------------------------------------------------ */ -/* ------------------------------------------------------------------------------------------------ - * global vars - * ------------------------------------------------------------------------------------------------ - */ +#define GBAS GWEN_Buffer_AppendString +#define GBAA GWEN_Buffer_AppendArgs + + /* ------------------------------------------------------------------------------------------------ * 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 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 int _handleRqEditModGet(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 void _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 _handleRqAddRole(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 int _handleRqAddRolePost(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 void _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 int _handleRqEditRoleGet(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 void _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 _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 _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 * ------------------------------------------------------------------------------------------------ @@ -150,135 +166,73 @@ 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) { - GWEN_BUFFER *dbuf; - - 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"); - + AQH_ModService_HandleRequestWithTable(m, rq, session, sLastPathElem, _requestTable); 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; 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); + slModules=AQH_Service_ListModules(sv); + if (slModules) { + GWEN_STRINGLISTENTRY *se; - sv=AQH_ModService_GetService(m); - slModules=AQH_Service_ListModules(sv); - if (slModules) { - GWEN_STRINGLISTENTRY *se; + GBAS(dbuf, "

Modules

\n"); + GBAS(dbuf, + "\n" + "" + "\n" + "\n" + "\n"); + se=GWEN_StringList_FirstEntry(slModules); + while(se) { + const char *sModName; - GWEN_Buffer_AppendString(dbuf, "

Modules

\n"); - GWEN_Buffer_AppendString(dbuf, - "
IdNameDescriptionActions
\n" - "" - "\n" - "\n" - "\n"); - se=GWEN_StringList_FirstEntry(slModules); - while(se) { - const char *sModName; + sModName=GWEN_StringListEntry_Data(se); + if (sModName && *sModName) { + AQH_MODULE *currentMod; - sModName=GWEN_StringListEntry_Data(se); - if (sModName && *sModName) { - AQH_MODULE *currentMod; + currentMod=AQH_Service_LoadModule(sv, sModName); + if (currentMod) { + const char *s; + const char *sName; - currentMod=AQH_Service_LoadModule(sv, sModName); - if (currentMod) { - const char *s; - const char *sName; + sName=AQH_Module_GetName(currentMod); + GBAS(dbuf, ""); + GBAA(dbuf, "", (unsigned long int) AQH_Module_GetId(currentMod)); + GBAA(dbuf, "", sName?sName:""); + s=AQH_Module_GetDescr(currentMod); + GBAA(dbuf, "", s?s:""); - sName=AQH_Module_GetName(currentMod); - GWEN_Buffer_AppendString(dbuf, ""); - GWEN_Buffer_AppendArgs(dbuf, "", (unsigned long int) AQH_Module_GetId(currentMod)); - GWEN_Buffer_AppendArgs(dbuf, "", sName?sName:""); - s=AQH_Module_GetDescr(currentMod); - GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); - - GWEN_Buffer_AppendString(dbuf, "\n"); - GWEN_Buffer_AppendArgs(dbuf, "\n"); - AQH_Module_free(currentMod); - } + GBAS(dbuf, "\n"); + GBAA(dbuf, "\n"); + AQH_Module_free(currentMod); } - se=GWEN_StringListEntry_Next(se); } - GWEN_Buffer_AppendString(dbuf, - "\n" - "
IdNameDescriptionActions
%lu%s%s
%lu%s%s"); - if (perms & AQH_MODADMMODULES_PERMS_MODULESWRITE) - GWEN_Buffer_AppendArgs(dbuf, - "", - sName?sName:""); - GWEN_Buffer_AppendArgs(dbuf, "
"); + if (perms & AQH_MODADMMODULES_PERMS_MODULESWRITE) + GBAA(dbuf, "", sName?sName:""); + GBAA(dbuf, "
\n"); - GWEN_StringList_free(slModules); + se=GWEN_StringListEntry_Next(se); } - GWEN_Buffer_AppendString(dbuf, "
Add Module"); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); + GBAS(dbuf, + "\n" + "\n"); + GWEN_StringList_free(slModules); } - else { - GWEN_Buffer_AppendString(dbuf, "

No permissions to read module list.

"); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); - } - return 0; + if (perms & AQH_MODADMMODULES_PERMS_MODULESADD) + GBAS(dbuf, "
Add Module"); } -int _handleRqEditMod(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, "

No permissions to edit modules.

"); - 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) +void _handleRqEditModGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) { AQH_SERVICE *sv; 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; if (currentMod) { _writeEditModForm(currentMod, sModName, dbuf); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); AQH_Module_free(currentMod); } else { @@ -300,123 +252,11 @@ int _handleRqEditModGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQCGI_Request_SetResponseCode(rq, 303); AQCGI_Request_SetResponseText(rq, "See other"); } - return 0; } -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 */ - GWEN_Buffer_AppendString(dbuf, "

Module Info

\n"); - GWEN_Buffer_AppendArgs(dbuf, - "
\n" - "\n" - "" - "" - "" - "\n" - "" - "" - "" - "\n", - sName?sName:"", sDescr?sDescr:""); - - if (permDefList) { - GWEN_Buffer_AppendArgs(dbuf, - "" - "\n" - "" ""); - } - - GWEN_Buffer_AppendString(dbuf, "
"); - _writePermissionsToForm(permDefList, AQH_Module_GetGuestPerms(currentMod), dbuf); - GWEN_Buffer_AppendArgs(dbuf, "
\n"); - - GWEN_Buffer_AppendArgs(dbuf, "\n", sModName?sModName:""); - GWEN_Buffer_AppendString(dbuf, "\n
\n\n"); - - /* write role list */ - GWEN_Buffer_AppendString(dbuf, "

User Roles

\n"); - if (roleList) - _writeRoleListToForm(roleList, sModName, permDefList, dbuf); - else - GWEN_Buffer_AppendString(dbuf, "

none

"); - GWEN_Buffer_AppendArgs(dbuf, - "" - "Add Role\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, - "\n" - "" - "\n" - "\n" - "\n"); - role=AQH_Role_List_First(roleList); - while(role) { - uint8_t id; - const char *s; - - GWEN_Buffer_AppendString(dbuf, ""); - /* id */ - id=AQH_Role_GetId(role); - GWEN_Buffer_AppendArgs(dbuf, "", id); - /* name */ - s=AQH_Role_GetName(role); - GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); - /* permissions */ - GWEN_Buffer_AppendString(dbuf, ""); - /* description */ - s=AQH_Role_GetDescr(role); - GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); - /* actions */ - GWEN_Buffer_AppendArgs(dbuf, ""); - - GWEN_Buffer_AppendString(dbuf, "\n"); - role=AQH_Role_List_Next(role); - } - - GWEN_Buffer_AppendString(dbuf, - "\n" - "
IdNamePermissionsDescriptionActions
%d%s"); - if (permDefList) - _writeEnabledPermissions(permDefList, AQH_Role_GetPerms(role), dbuf); - GWEN_Buffer_AppendString(dbuf, "%s"); - GWEN_Buffer_AppendArgs(dbuf, - "" - "", - sModName?sModName:"", id); - GWEN_Buffer_AppendArgs(dbuf, - "" - "", - sModName?sModName:"", id); - GWEN_Buffer_AppendArgs(dbuf, "
\n"); -} - - - - -int _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) +void _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) { AQH_SERVICE *sv; 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); if (rv<0) { - GWEN_Buffer_AppendString(dbuf, "

Error

Error saving module

"); + GBAS(dbuf, "

Error

Error saving module

"); DBG_ERROR(NULL, "Could not save module \"%s\"", sModName); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); AQH_Module_free(currentMod); - return 0; + return; } DBG_ERROR(NULL, "Module \"%s\" saved", sModName); AQH_Module_free(currentMod); @@ -461,44 +299,13 @@ int _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, } else { DBG_ERROR(NULL, "Could not load module \"%s\"", sModName?sModName:""); - GWEN_Buffer_AppendString(dbuf, "

Error loading module.

\n"); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); + GBAS(dbuf, "

Error loading module.

\n"); } - 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, "

No permissions to edit modules.

"); - 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; GWEN_DB_NODE *dbQuery; @@ -516,59 +323,47 @@ int _handleRqAddRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, if (currentMod) { if (permDefList) { - GWEN_Buffer_AppendArgs(dbuf, "

Add Role for Module %s

\n", sModName?sModName:""); - GWEN_Buffer_AppendString(dbuf, - "
\n" - "\n" - "" - "" - "" - "" - "" - "" - "\n"); + GBAA(dbuf, "

Add Role for Module %s

\n", sModName?sModName:""); + GBAS(dbuf, + "\n" + "
\n" + "" + "\n"); - GWEN_Buffer_AppendString(dbuf, "\n"); + GBAS(dbuf, "\n"); #if 0 - GWEN_Buffer_AppendString(dbuf, "\n"); + GBAS(dbuf, "\n"); - GWEN_Buffer_AppendString(dbuf, "\n"); + GBAS(dbuf, "\n"); #endif - GWEN_Buffer_AppendString(dbuf, "
"); + GBAS(dbuf, "
"); _writePermissionsToForm(permDefList, guestPerms, dbuf); - GWEN_Buffer_AppendString(dbuf, "
"); + GBAS(dbuf, "
"); _writePermissionsToForm(permDefList, 0, dbuf); - GWEN_Buffer_AppendString(dbuf, "
"); + GBAS(dbuf, "
"); _writePermissionsToForm(permDefList, 0, dbuf); - GWEN_Buffer_AppendString(dbuf, "
\n"); - GWEN_Buffer_AppendArgs(dbuf, "\n", sModName?sModName:""); - GWEN_Buffer_AppendString(dbuf, "\n"); - GWEN_Buffer_AppendString(dbuf, "
\n\n"); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); + GBAS(dbuf, "\n"); + GBAA(dbuf, "\n", sModName?sModName:""); + GBAS(dbuf, "\n"); + GBAS(dbuf, "\n\n"); } else { - GWEN_Buffer_AppendString(dbuf, "

Please add permission definitions first.

\n"); - GWEN_Buffer_AppendArgs(dbuf, "

back to module

\n", sModName?sModName:""); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); + GBAS(dbuf, "

Please add permission definitions first.

\n"); + GBAA(dbuf, "

back to module

\n", sModName?sModName:""); } AQH_Module_free(currentMod); } else { - GWEN_Buffer_AppendString(dbuf, "

Error loading module.

\n"); - GWEN_Buffer_AppendString(dbuf, "

back to module list

\n"); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); + GBAS(dbuf, "

Error loading module.

\n"); + GBAS(dbuf, "

back to module list

\n"); } - 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; GWEN_DB_NODE *dbPost; @@ -603,11 +398,9 @@ int _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, /* validate */ if (!(sName && *sName)) { DBG_ERROR(NULL, "Missing value for \"name\""); - GWEN_Buffer_AppendString(dbuf, "

Missing name.

\n"); - GWEN_Buffer_AppendArgs(dbuf, "

back to module

\n", sModName?sModName:""); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); - return 0; + GBAS(dbuf, "

Missing name.

\n"); + GBAA(dbuf, "

back to module

\n", sModName?sModName:""); + return; } if (currentMod) { @@ -629,12 +422,10 @@ int _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, /* save module */ rv=AQH_Service_SaveModule(sv, currentMod); if (rv<0) { - GWEN_Buffer_AppendString(dbuf, "

Error saving module.

\n"); - GWEN_Buffer_AppendArgs(dbuf, "

back to module

\n", sModName?sModName:""); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); + GBAS(dbuf, "

Error saving module.

\n"); + GBAA(dbuf, "

back to module

\n", sModName?sModName:""); AQH_Module_free(currentMod); - return 0; + return; } _setLocationHeaderForMod(rq, "editmodule.html", sModName); AQCGI_Request_SetResponseCode(rq, 303); @@ -642,66 +433,14 @@ int _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_Module_free(currentMod); } else { - GWEN_Buffer_AppendString(dbuf, "

Error loading module.

\n"); - GWEN_Buffer_AppendString(dbuf, "

back to module list

\n"); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); + GBAS(dbuf, "

Error loading module.

\n"); + GBAS(dbuf, "

back to module list

\n"); } - - 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) -{ - 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, "

No permissions to edit modules.

"); - 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) +void _handleRqEditRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) { AQH_SERVICE *sv; GWEN_DB_NODE *dbQuery; @@ -736,53 +475,50 @@ int _handleRqEditRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, #endif if (role) { - GWEN_Buffer_AppendArgs(dbuf, "

Edit Role for Module %s

\n", sModName?sModName:""); - GWEN_Buffer_AppendArgs(dbuf, - "
\n" - "\n" - "\n" - "" - "" - "\n" - "" - "" - "" - "\n", - sName, sDescr?sDescr:""); + GBAA(dbuf, "

Edit Role for Module %s

\n", sModName?sModName:""); + GBAA(dbuf, + "\n" + "
\n" + "\n" + "" + "" + "\n" + "" + "" + "" + "\n", + sName, sDescr?sDescr:""); - GWEN_Buffer_AppendString(dbuf, "\n"); + GBAS(dbuf, "\n"); #if 0 - GWEN_Buffer_AppendString(dbuf, "\n"); + GBAS(dbuf, "\n"); - GWEN_Buffer_AppendString(dbuf, "\n"); + GBAS(dbuf, "\n"); #endif - GWEN_Buffer_AppendString(dbuf, "
"); + GBAS(dbuf, "
"); _writePermissionsToForm(permDefList, perms, dbuf); - GWEN_Buffer_AppendString(dbuf, "
"); + GBAS(dbuf, "
"); _writePermissionsToForm(permDefList, explAddPerms, dbuf); - GWEN_Buffer_AppendString(dbuf, "
"); + GBAS(dbuf, "
"); _writePermissionsToForm(permDefList, explDelPerms, dbuf); - GWEN_Buffer_AppendString(dbuf, "
\n"); + GBAS(dbuf, "\n"); - GWEN_Buffer_AppendArgs(dbuf, "\n", sModName?sModName:""); - GWEN_Buffer_AppendArgs(dbuf, "\n", id); - GWEN_Buffer_AppendString(dbuf, "\n"); - GWEN_Buffer_AppendString(dbuf, "
\n\n"); + GBAA(dbuf, "\n", sModName?sModName:""); + GBAA(dbuf, "\n", id); + GBAS(dbuf, "\n"); + GBAS(dbuf, "\n\n"); } else { - GWEN_Buffer_AppendString(dbuf, "

Role not found.

\n"); - GWEN_Buffer_AppendArgs(dbuf, "

back to module

\n", sModName?sModName:""); + GBAS(dbuf, "

Role not found.

\n"); + GBAA(dbuf, "

back to module

\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; GWEN_DB_NODE *dbPost; @@ -818,19 +554,15 @@ int _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session /* validate */ if (!(sName && *sName)) { DBG_ERROR(NULL, "Missing value for \"name\""); - GWEN_Buffer_AppendString(dbuf, "

Missing name.

\n"); - GWEN_Buffer_AppendArgs(dbuf, "

back to module

\n", sModName?sModName:""); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); - return 0; + GBAS(dbuf, "

Missing name.

\n"); + GBAA(dbuf, "

back to module

\n", sModName?sModName:""); + return; } if (role==NULL) { DBG_ERROR(NULL, "Role %d not found", oldId); - GWEN_Buffer_AppendString(dbuf, "

Role not found.

\n"); - GWEN_Buffer_AppendArgs(dbuf, "

back to module

\n", sModName?sModName:""); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); - return 0; + GBAS(dbuf, "

Role not found.

\n"); + GBAA(dbuf, "

back to module

\n", sModName?sModName:""); + return; } if (currentMod) { @@ -842,12 +574,10 @@ int _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session /* save module */ rv=AQH_Service_SaveModule(sv, currentMod); if (rv<0) { - GWEN_Buffer_AppendString(dbuf, "

Error saving module.

\n"); - GWEN_Buffer_AppendArgs(dbuf, "

back to module

\n", sModName?sModName:""); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); + GBAS(dbuf, "

Error saving module.

\n"); + GBAA(dbuf, "

back to module

\n", sModName?sModName:""); AQH_Module_free(currentMod); - return 0; + return; } _setLocationHeaderForMod(rq, "editmodule.html", sModName); @@ -856,81 +586,60 @@ int _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session AQH_Module_free(currentMod); } else { - GWEN_Buffer_AppendString(dbuf, "

Error loading module.

\n"); - GWEN_Buffer_AppendString(dbuf, "

back to module list

\n"); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); + GBAS(dbuf, "

Error loading module.

\n"); + GBAS(dbuf, "

back to module list

\n"); } - 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; + AQH_SERVICE *sv; + GWEN_DB_NODE *dbQuery; + const char *sModName; + int id; + AQH_MODULE *currentMod; + const AQH_ROLE_LIST *roleList; + AQH_ROLE *role; - perms=AQH_ModService_GetUserPerms(m); - DBG_ERROR(NULL, "Perms=%08x", perms); - if (perms & AQH_MODADMMODULES_PERMS_MODULESWRITE) { - AQH_SERVICE *sv; - GWEN_DB_NODE *dbQuery; - const char *sModName; - int id; - AQH_MODULE *currentMod; - const AQH_ROLE_LIST *roleList; - AQH_ROLE *role; + sv=AQH_ModService_GetService(m); + dbQuery=AQCGI_Request_GetDbQuery(rq); + sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "mod", 0, NULL):NULL; + id=dbQuery?GWEN_DB_GetIntValue(dbQuery, "id", 0, 0):0; + currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL; + if (currentMod) { + roleList=currentMod?AQH_Module_GetRoleList(currentMod):NULL; + role=roleList?AQH_Role_List_GetById(roleList, id):NULL; + if (role) { + int rv; - sv=AQH_ModService_GetService(m); - dbQuery=AQCGI_Request_GetDbQuery(rq); - sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "mod", 0, NULL):NULL; - id=dbQuery?GWEN_DB_GetIntValue(dbQuery, "id", 0, 0):0; - currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL; - if (currentMod) { - roleList=currentMod?AQH_Module_GetRoleList(currentMod):NULL; - role=roleList?AQH_Role_List_GetById(roleList, id):NULL; - if (role) { - int rv; + AQH_Role_List_Del(role); + AQH_Role_free(role); - AQH_Role_List_Del(role); - AQH_Role_free(role); - - /* save module */ - rv=AQH_Service_SaveModule(sv, currentMod); - if (rv<0) { - GWEN_Buffer_AppendString(dbuf, "

Error saving module.

\n"); - GWEN_Buffer_AppendArgs(dbuf, "

back to module

\n", sModName?sModName:""); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); - AQH_Module_free(currentMod); - return 0; - } - - _setLocationHeaderForMod(rq, "editmodule.html", sModName); - AQCGI_Request_SetResponseCode(rq, 303); - AQCGI_Request_SetResponseText(rq, "See Other"); + /* save module */ + rv=AQH_Service_SaveModule(sv, currentMod); + if (rv<0) { + GBAS(dbuf, "

Error saving module.

\n"); + GBAA(dbuf, "

back to module

\n", sModName?sModName:""); + AQH_Module_free(currentMod); + return; } - else { - GWEN_Buffer_AppendString(dbuf, "

Role not found.

\n"); - GWEN_Buffer_AppendArgs(dbuf, "

back to module

\n", sModName?sModName:""); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); - } - AQH_Module_free(currentMod); + + _setLocationHeaderForMod(rq, "editmodule.html", sModName); + AQCGI_Request_SetResponseCode(rq, 303); + AQCGI_Request_SetResponseText(rq, "See Other"); } else { - GWEN_Buffer_AppendString(dbuf, "

Error loading module.

\n"); - GWEN_Buffer_AppendString(dbuf, "

back to module list

\n"); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); + GBAS(dbuf, "

Role not found.

\n"); + GBAA(dbuf, "

back to module

\n", sModName?sModName:""); } + AQH_Module_free(currentMod); } else { - GWEN_Buffer_AppendString(dbuf, "

No permissions to edit modules.

"); - AQCGI_Request_SetResponseCode(rq, 200); - AQCGI_Request_SetResponseText(rq, "Ok"); + GBAS(dbuf, "

Error loading module.

\n"); + GBAS(dbuf, "

back to module list

\n"); } - return 0; } @@ -940,17 +649,141 @@ void _setLocationHeaderForMod(AQCGI_REQUEST *rq, const char *page, const char *s GWEN_BUFFER *tbuf; 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)); 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, "

Module Info

\n"); + GBAA(dbuf, + "
\n" + "\n" + "" + "" + "" + "\n" + "" + "" + "" + "\n", + sName?sName:"", sDescr?sDescr:""); + + if (permDefList) { + GBAA(dbuf, + "" + "\n" + "" ""); + } + + GBAS(dbuf, "
"); + _writePermissionsToForm(permDefList, AQH_Module_GetGuestPerms(currentMod), dbuf); + GBAA(dbuf, "
\n"); + + GBAA(dbuf, "\n", sModName?sModName:""); + GBAS(dbuf, "\n
\n\n"); + + /* write role list */ + GBAS(dbuf, "

User Roles

\n"); + if (roleList) + _writeRoleListToForm(roleList, sModName, permDefList, dbuf); + else + GBAS(dbuf, "

none

"); + GBAA(dbuf, + "
" + "Add Role\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, + "\n" + "" + "\n" + "\n" + "\n"); + role=AQH_Role_List_First(roleList); + while(role) { + uint8_t id; + const char *s; + + GBAS(dbuf, ""); + /* id */ + id=AQH_Role_GetId(role); + GBAA(dbuf, "", id); + /* name */ + s=AQH_Role_GetName(role); + GBAA(dbuf, "", s?s:""); + /* permissions */ + GBAS(dbuf, ""); + /* description */ + s=AQH_Role_GetDescr(role); + GBAA(dbuf, "", s?s:""); + /* actions */ + GBAA(dbuf, ""); + + GBAS(dbuf, "\n"); + role=AQH_Role_List_Next(role); + } + + GBAS(dbuf, + "\n" + "
IdNamePermissionsDescriptionActions
%d%s"); + if (permDefList) + _writeEnabledPermissions(permDefList, AQH_Role_GetPerms(role), dbuf); + GBAS(dbuf, "%s"); + GBAA(dbuf, + "" + "", + sModName?sModName:"", id); + GBAA(dbuf, + "" + "", + sModName?sModName:"", id); + GBAA(dbuf, "
\n"); +} @@ -970,10 +803,10 @@ void _writePermissionsToForm(const AQH_PERMDEF_LIST *permDefList, uint32_t perms s=AQH_PermDef_GetId(permDef); mask=AQH_PermDef_GetMask(permDef); if (perms & mask) - GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + GBAA(dbuf, "", s?s:""); else - GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); - GWEN_Buffer_AppendArgs(dbuf, "", s?s:"", s?s:""); + GBAA(dbuf, "", s?s:""); + GBAA(dbuf, "", s?s:"", s?s:""); 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); mask=AQH_PermDef_GetMask(permDef); if (perms & mask) - GWEN_Buffer_AppendArgs(dbuf, "%s ", s?s:""); + GBAA(dbuf, "%s ", s?s:""); permDef=AQH_PermDef_List_Next(permDef); } } diff --git a/apps/aqhome-cgi/modules/common/mservice.c b/apps/aqhome-cgi/modules/common/mservice.c index 0a84981..e29fb73 100644 --- a/apps/aqhome-cgi/modules/common/mservice.c +++ b/apps/aqhome-cgi/modules/common/mservice.c @@ -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, "

Error

No permissions for this request.

"); + 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"); +} + + + diff --git a/apps/aqhome-cgi/modules/common/mservice.h b/apps/aqhome-cgi/modules/common/mservice.h index c147210..627b70a 100644 --- a/apps/aqhome-cgi/modules/common/mservice.h +++ b/apps/aqhome-cgi/modules/common/mservice.h @@ -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 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); @@ -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); 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_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *filename, GWEN_BUFFER *dbuf);