diff --git a/apps/aqhome-cgi/modules/common/musers.c b/apps/aqhome-cgi/modules/common/musers.c index 6cfbd4a..0837bc5 100644 --- a/apps/aqhome-cgi/modules/common/musers.c +++ b/apps/aqhome-cgi/modules/common/musers.c @@ -42,8 +42,20 @@ 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 _handleRqEditUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); +static void _handleRqEditUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); +static void _handleRqAddUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); +static void _handleRqAddUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf); + +static int _getHighestUserId(const AQH_USER_LIST *userList); +static void _writeEditUserForm(AQH_MODULE *m, + const AQH_USER *u, + const char *sAlias, + const char *sUrl, + const char *sSubmitText, + GWEN_BUFFER *dbuf); +static void _writeModulePerms(const AQH_MODULE *destMod, const AQH_MODULE_PERMS *modPerms, 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); @@ -58,6 +70,10 @@ static void _setLocationHeaderForMod(AQCGI_REQUEST *rq, const char *page, const static AQH_MODSERVICE_HANDLER_ENTRY _requestTable[]={ {"index.html", AQCGI_REQUEST_METHOD_GET, AQH_MODADMUSERS_PERMS_USERSREAD, _handleRqIndex}, + {"edituser.html", AQCGI_REQUEST_METHOD_GET, AQH_MODADMUSERS_PERMS_USERSWRITE, _handleRqEditUserGet}, + {"edituser.html", AQCGI_REQUEST_METHOD_POST, AQH_MODADMUSERS_PERMS_USERSWRITE, _handleRqEditUserPost}, + {"adduser.html", AQCGI_REQUEST_METHOD_GET, AQH_MODADMUSERS_PERMS_USERSWRITE, _handleRqAddUserGet}, + {"adduser.html", AQCGI_REQUEST_METHOD_POST, AQH_MODADMUSERS_PERMS_USERSWRITE, _handleRqAddUserPost}, {NULL, 0, 0, NULL} }; @@ -151,68 +167,63 @@ int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) { - AQH_SERVICE *sv; - GWEN_STRINGLIST *slUsers; + AQH_USER_LIST *userList; uint32_t perms; perms=AQH_ModService_GetUserPerms(m); - sv=AQH_ModService_GetService(m); - slUsers=AQH_Service_ListUsers(sv); - if (slUsers) { - GWEN_STRINGLISTENTRY *se; + userList=AQH_ModService_LoadRawUsers(m); - GBAS(dbuf, "

Users

\n"); - GBAS(dbuf, - "\n" - "" - "\n" - "\n" - "\n"); - se=GWEN_StringList_FirstEntry(slUsers); - while(se) { + GBAS(dbuf, "

Users

\n"); + GBAS(dbuf, + "
IdAliasNameStatusEmailNotesActions
\n" + "" + "\n" + "\n" + "\n"); + if (userList) { + const AQH_USER *u; + + AQH_User_List_SortByAlias(userList, 1); + u=AQH_User_List_First(userList); + while(u) { const char *sUserAlias; - sUserAlias=GWEN_StringListEntry_Data(se); + sUserAlias=AQH_User_GetAlias(u); if (sUserAlias && *sUserAlias) { - AQH_USER *currentUser; + uint32_t id; + const char *s; + const char *sAlias; - currentUser=AQH_Service_LoadUser(sv, sUserAlias); - if (currentUser) { - uint32_t id; - const char *s; - const char *sAlias; + id=AQH_User_GetId(u); + sAlias=AQH_User_GetAlias(u); + GBAS(dbuf, ""); + GBAA(dbuf, "", (unsigned long int) id); + GBAA(dbuf, "", sAlias?sAlias:""); + s=AQH_User_GetName(u); + GBAA(dbuf, "", s?s:""); + s=AQH_UserState_toString(AQH_User_GetState(u)); + GBAA(dbuf, "", s?s:""); + s=AQH_User_GetEmail(u); + GBAA(dbuf, "", s?s:""); + s=AQH_User_GetNotes(u); + GBAA(dbuf, "", s?s:""); - 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); + GBAS(dbuf, "\n"); + GBAA(dbuf, "\n"); } - se=GWEN_StringListEntry_Next(se); + u=AQH_User_List_Next(u); } GBAS(dbuf, "\n" "
IdAliasNameStatusEmailNotesActions
%lu%s%s%s%s%s
%lu%s%s%s%s%s"); - if (perms & AQH_MODADMUSERS_PERMS_USERSWRITE) { - GBAS(dbuf, ""); - } - GBAA(dbuf, "
"); + if (perms & AQH_MODADMUSERS_PERMS_USERSWRITE) { + DBG_ERROR(NULL, "User=%s", sAlias?sAlias:""); + GBAS(dbuf, ""); } + GBAA(dbuf, "
\n"); - GWEN_StringList_free(slUsers); + AQH_User_List_free(userList); } if (perms & AQH_MODADMUSERS_PERMS_USERSADD) GBAS(dbuf, "
Add User"); @@ -232,7 +243,7 @@ void _handleRqEditUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session 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); + _writeEditUserForm(m, user, sAlias, "edituser.html", "Save", dbuf); AQH_User_free(user); } else { @@ -244,24 +255,242 @@ void _handleRqEditUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session -void _writeEditUserForm(const AQH_USER *user, const char *sAlias, GWEN_BUFFER *dbuf) +void _handleRqEditUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, 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); + AQH_SERVICE *sv; + GWEN_DB_NODE *dbPost; + const char *sAlias; + AQH_USER *u; + + sv=AQH_ModService_GetService(m); + dbPost=AQCGI_Request_GetDbPostBody(rq); + sAlias=dbPost?GWEN_DB_GetCharValue(dbPost, "alias", 0, NULL):NULL; + u=(sAlias && *sAlias)?AQH_Service_LoadUser(sv, sAlias):NULL; + if (u) { + const char *s; + int state; + int rv; + + s=GWEN_DB_GetCharValue(dbPost, "name", 0, NULL); + AQH_User_SetName(u, s); + s=GWEN_DB_GetCharValue(dbPost, "email", 0, NULL); + AQH_User_SetEmail(u, s); + s=GWEN_DB_GetCharValue(dbPost, "notes", 0, NULL); + AQH_User_SetNotes(u, s); + s=GWEN_DB_GetCharValue(dbPost, "status", 0, NULL); + state=(s && *s)?AQH_UserState_fromString(s):AQH_UserState_Unknown; + if (state!=AQH_UserState_Unknown) + AQH_User_SetState(u, state); + + rv=AQH_Service_SaveUser(sv, u); + if (rv<0) { + GBAS(dbuf, "

Error

Error saving user

"); + DBG_ERROR(NULL, "Could not save user \"%s\"", sAlias); + AQH_User_free(u); + return; + } + DBG_ERROR(NULL, "User \"%s\" saved", sAlias); + AQH_User_free(u); + AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html"); + AQCGI_Request_SetResponseCode(rq, 303); + AQCGI_Request_SetResponseText(rq, "See other"); + } + else { + DBG_ERROR(NULL, "Could not load user \"%s\"", sAlias?sAlias:""); + GBAS(dbuf, "

Error loading user.

\n"); + } +} + + + +void _handleRqAddUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) +{ + DBG_ERROR(NULL, "AddUser"); + _writeEditUserForm(m, NULL, NULL, "adduser.html", "Add", dbuf); +} + + + +void _handleRqAddUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf) +{ + AQH_SERVICE *sv; + GWEN_DB_NODE *dbPost; + const char *sAlias; + + sv=AQH_ModService_GetService(m); + dbPost=AQCGI_Request_GetDbPostBody(rq); + sAlias=dbPost?GWEN_DB_GetCharValue(dbPost, "alias", 0, NULL):NULL; + // TODO: check alias validity + if (sAlias) { + AQH_USER *u; + const char *s; + int state; + int rv; + uint32_t userId; + AQH_USER_LIST *userList; + + u=AQH_User_new(); + userList=AQH_ModService_LoadRawUsers(m); + userId=_getHighestUserId(userList)+1; + AQH_User_SetId(u, userId); + AQH_User_SetAlias(u, sAlias); + s=GWEN_DB_GetCharValue(dbPost, "name", 0, NULL); + AQH_User_SetName(u, s); + s=GWEN_DB_GetCharValue(dbPost, "email", 0, NULL); + AQH_User_SetEmail(u, s); + s=GWEN_DB_GetCharValue(dbPost, "notes", 0, NULL); + AQH_User_SetNotes(u, s); + s=GWEN_DB_GetCharValue(dbPost, "status", 0, NULL); + state=(s && *s)?AQH_UserState_fromString(s):AQH_UserState_Unknown; + if (state!=AQH_UserState_Unknown) + AQH_User_SetState(u, state); + + rv=AQH_Service_AddUser(sv, u); + if (rv<0) { + GBAS(dbuf, "

Error

Error saving user

"); + DBG_ERROR(NULL, "Could not save user \"%s\" (%d)", sAlias, rv); + AQH_User_free(u); + AQH_User_List_free(userList); + return; + } + DBG_ERROR(NULL, "User \"%s\" saved", sAlias); + AQH_User_free(u); + AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html"); + AQCGI_Request_SetResponseCode(rq, 303); + AQCGI_Request_SetResponseText(rq, "See other"); + AQH_User_List_free(userList); + } + else { + DBG_ERROR(NULL, "Missing alias"); + GBAS(dbuf, "

Missing alias.

\n"); + } +} + + + +int _getHighestUserId(const AQH_USER_LIST *userList) +{ + int id=0; + + if (userList) { + const AQH_USER *user; + + user=AQH_User_List_First(userList); + while(user) { + int uid; + + uid=AQH_User_GetId(user); + id=(uid>id)?uid:id; + user=AQH_User_List_Next(user); + } + } + return id; +} + + + + + +void _writeEditUserForm(AQH_MODULE *m, + const AQH_USER *u, + const char *sAlias, + const char *sUrl, + const char *sSubmitText, + GWEN_BUFFER *dbuf) +{ + AQH_MODULE_LIST *moduleList; + uint32_t perms; + + perms=AQH_ModService_GetUserPerms(m); + + /* write user info */ + GBAS(dbuf, "

User Info

\n"); + GBAA(dbuf, + "\n" + "
\n", + sUrl?sUrl:""); + _addLabelAndInputToFormTableH("Alias", "alias", sAlias, "required", dbuf); + _addLabelAndInputToFormTableH("Name", "name", u?AQH_User_GetName(u):NULL, NULL, dbuf); + _addLabelAndInputToFormTableH("Email", "email", u?AQH_User_GetEmail(u):NULL, NULL, dbuf); + _addLabelAndInputToFormTableH("Notes", "notes", u?AQH_User_GetNotes(u):NULL, NULL, dbuf); + _addUserStateLabelAndSelectionToFormTableH("Status", "status", u?AQH_User_GetState(u):AQH_UserState_Unknown, dbuf); GBAS(dbuf, "
\n"); - GBAA(dbuf, "\n", sAlias); - GBAS(dbuf, "\n
\n\n"); + GBAA(dbuf, "\n", sAlias?sAlias:""); + GBAA(dbuf, "\n\n\n", sSubmitText?sSubmitText:"Save"); + + /* module permissions */ + GBAS(dbuf, "

Module Roles

\n"); + GBAS(dbuf, + "\n" + "" + "\n" + "\n" + "\n"); + moduleList=AQH_ModService_LoadRawModules(m); + if (moduleList) { + const AQH_MODULE_PERMS_LIST *modPermsList; + const AQH_MODULE *currentMod; + + modPermsList=u?AQH_User_GetModulePermList(u):NULL; + currentMod=AQH_Module_List_First(moduleList); + while(currentMod) { + const char *sModName; + + sModName=AQH_Module_GetName(currentMod); + GBAA(dbuf, "\n"); + } + GBAS(dbuf, ""); + + currentMod=AQH_Module_List_Next(currentMod); + } /* while */ + AQH_Module_List_free(moduleList); + } + GBAS(dbuf, + "\n" + "
ModuleEnabled RolesActions
%s", sModName); + if (modPermsList) { + const AQH_MODULE_PERMS *modPerms; + + modPerms=AQH_ModulePerms_List_GetByModuleId(modPermsList, sModName); + if (modPerms) + _writeModulePerms(currentMod, modPerms, dbuf); + GBAS(dbuf, "
"); + if (perms & AQH_MODADMUSERS_PERMS_USERSWRITE) + GBAA(dbuf, "", + sAlias?sAlias:"", sModName); + GBAS(dbuf, "
\n"); +} + +void _writeModulePerms(const AQH_MODULE *destMod, const AQH_MODULE_PERMS *modPerms, GWEN_BUFFER *dbuf) +{ + const AQH_ROLE_LIST *roleList; + + roleList=destMod?AQH_Module_GetRoleList(destMod):NULL; + if (roleList) { + int roleArraySize; + int i; + + roleArraySize=AQH_ModulePerms_GetRoleArrayArraySize(); + for (i=0; i0)?", ":"", s?s:""); + } + } + } /* for */ + } }