/**************************************************************************** * This file is part of the project AqHome. * AqHome (c) by 2025 Martin Preuss, all rights reserved. * * The license for this file can be found in the file COPYING which you * should have received along with this file. ****************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "./musers.h" #include "aqhome-cgi/service/module.h" #include #include #include /* ------------------------------------------------------------------------------------------------ * defs and enums * ------------------------------------------------------------------------------------------------ */ #define GBAS GWEN_Buffer_AppendString #define GBAA GWEN_Buffer_AppendArgs /* ------------------------------------------------------------------------------------------------ * forward declarations * ------------------------------------------------------------------------------------------------ */ static void _createPermDefList(AQH_MODULE *m); 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 void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); static void _writeEditUserForm(const AQH_USER *user, const char *sAlias, GWEN_BUFFER *dbuf); static void _addLabelAndInputToFormTableH(const char *title, const char *name, const char *value, const char *xxtra, GWEN_BUFFER *dbuf); static void _addUserStateLabelAndSelectionToFormTableH(const char *sTitle, const char *sName, int st, GWEN_BUFFER *dbuf); static void _setLocationHeaderForMod(AQCGI_REQUEST *rq, const char *page, const char *sModName); /* ------------------------------------------------------------------------------------------------ * vars * ------------------------------------------------------------------------------------------------ */ static AQH_MODSERVICE_HANDLER_ENTRY _requestTable[]={ {"index.html", AQCGI_REQUEST_METHOD_GET, AQH_MODADMUSERS_PERMS_USERSREAD, _handleRqIndex}, {NULL, 0, 0, NULL} }; /* ------------------------------------------------------------------------------------------------ * code * ------------------------------------------------------------------------------------------------ */ void AQH_ModAdmUsers_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder) { AQH_ModService_Extend(m, sv, baseFolder); AQH_ModService_SetHandleRequestFn(m, _handleRequest); AQH_ModService_SetLoadSubModuleFn(m, _loadSubModule); } int AQH_ModAdmUsers_Create(AQH_SERVICE *sv) { AQH_MODULE *m; int rv; m=AQH_Module_new(); AQH_Module_SetName(m, "users"); AQH_Module_SetDescr(m, "user administration module"); AQH_Module_SetGuestPerms(m, 0); _createPermDefList(m); _createRoleList(m); rv=AQH_Service_AddModule(sv, m); if (rv<0) { DBG_INFO(NULL, "here (%d)", rv); } AQH_Module_free(m); return rv; } void _createPermDefList(AQH_MODULE *m) { AQH_PERMDEF_LIST *permDefList; permDefList=AQH_PermDef_List_new(); AQH_ModService_AddPermDef(permDefList, "UserRead", 0x001, "Read users"); AQH_ModService_AddPermDef(permDefList, "UserWrite", 0x002, "Modify users"); AQH_ModService_AddPermDef(permDefList, "UserAdd", 0x004, "Add users"); AQH_ModService_AddPermDef(permDefList, "UserDel", 0x008, "Remove users"); AQH_Module_SetPermDefList(m, permDefList); } void _createRoleList(AQH_MODULE *m) { AQH_ROLE_LIST *roleList; int id=0; roleList=AQH_Role_List_new(); AQH_ModService_AddRole(roleList, id++, "admin", AQH_MODADMUSERS_PERMS_USERSREAD | AQH_MODADMUSERS_PERMS_USERSWRITE | AQH_MODADMUSERS_PERMS_USERSADD | AQH_MODADMUSERS_PERMS_USERSDEL, "Administrator Role"); AQH_Module_SetRoleList(m, roleList); } AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName) { /* no sub-modules */ return NULL; } int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem) { AQH_ModService_HandleRequestWithTable(m, rq, session, sLastPathElem, _requestTable); return AQCGI_SendResponse(rq); } void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) { AQH_SERVICE *sv; GWEN_STRINGLIST *slUsers; uint32_t perms; perms=AQH_ModService_GetUserPerms(m); sv=AQH_ModService_GetService(m); slUsers=AQH_Service_ListUsers(sv); if (slUsers) { GWEN_STRINGLISTENTRY *se; GBAS(dbuf, "

Users

\n"); GBAS(dbuf, "\n" "" "\n" "\n" "\n"); se=GWEN_StringList_FirstEntry(slUsers); while(se) { const char *sUserAlias; sUserAlias=GWEN_StringListEntry_Data(se); if (sUserAlias && *sUserAlias) { AQH_USER *currentUser; currentUser=AQH_Service_LoadUser(sv, sUserAlias); if (currentUser) { uint32_t id; const char *s; const char *sAlias; id=AQH_User_GetId(currentUser); sAlias=AQH_User_GetAlias(currentUser); GBAS(dbuf, ""); GBAA(dbuf, "", (unsigned long int) id); GBAA(dbuf, "", sAlias?sAlias:""); s=AQH_User_GetName(currentUser); GBAA(dbuf, "", s?s:""); s=AQH_UserState_toString(AQH_User_GetState(currentUser)); GBAA(dbuf, "", s?s:""); s=AQH_User_GetEmail(currentUser); GBAA(dbuf, "", s?s:""); s=AQH_User_GetNotes(currentUser); GBAA(dbuf, "", s?s:""); GBAS(dbuf, "\n"); GBAA(dbuf, "\n"); AQH_User_free(currentUser); } } se=GWEN_StringListEntry_Next(se); } GBAS(dbuf, "\n" "
IdAliasNameStatusEmailNotesActions
%lu%s%s%s%s%s"); if (perms & AQH_MODADMUSERS_PERMS_USERSWRITE) { GBAS(dbuf, ""); } GBAA(dbuf, "
\n"); GWEN_StringList_free(slUsers); } if (perms & AQH_MODADMUSERS_PERMS_USERSADD) GBAS(dbuf, "
Add User"); } void _handleRqEditUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) { AQH_SERVICE *sv; GWEN_DB_NODE *dbQuery; const char *sAlias; AQH_USER *user; sv=AQH_ModService_GetService(m); dbQuery=AQCGI_Request_GetDbQuery(rq); sAlias=dbQuery?GWEN_DB_GetCharValue(dbQuery, "alias", 0, NULL):NULL; user=(sAlias && *sAlias)?AQH_Service_LoadUser(sv, sAlias):NULL; if (user) { _writeEditUserForm(user, sAlias, dbuf); AQH_User_free(user); } else { AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html"); AQCGI_Request_SetResponseCode(rq, 303); AQCGI_Request_SetResponseText(rq, "See other"); } } void _writeEditUserForm(const AQH_USER *user, const char *sAlias, GWEN_BUFFER *dbuf) { /* write module info */ GBAS(dbuf, "

Module Info

\n"); GBAS(dbuf, "
\n" "\n"); _addLabelAndInputToFormTableH("Alias", "alias", AQH_User_GetAlias(user), "required", dbuf); _addLabelAndInputToFormTableH("Name", "name", AQH_User_GetName(user), NULL, dbuf); _addLabelAndInputToFormTableH("Email", "email", AQH_User_GetEmail(user), NULL, dbuf); _addLabelAndInputToFormTableH("Notes", "notes", AQH_User_GetNotes(user), NULL, dbuf); _addUserStateLabelAndSelectionToFormTableH("Status", "status", AQH_User_GetState(user), dbuf); GBAS(dbuf, "
\n"); GBAA(dbuf, "\n", sAlias); GBAS(dbuf, "\n
\n\n"); } void _addUserStateLabelAndSelectionToFormTableH(const char *sTitle, const char *sName, int st, GWEN_BUFFER *dbuf) { int i; GBAA(dbuf, "", sName?sName:"", sTitle?sTitle:""); GBAA(dbuf, ""); } void _addLabelAndInputToFormTableH(const char *sTitle, const char *sName, const char *sValue, const char *sExtra, GWEN_BUFFER *dbuf) { GBAS(dbuf, ""); GBAA(dbuf, "", sName?sName:"", sTitle?sTitle:""); GBAA(dbuf, ""); GBAS(dbuf, "\n"); }