aqhome-cgi: add user editing and adding code.
This commit is contained in:
@@ -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, "<h1>Users</h1>\n");
|
||||
GBAS(dbuf,
|
||||
"<table class=\"datatable\">\n"
|
||||
"<thead>"
|
||||
"<tr><th>Id</th><th>Alias</th><th>Name</th><th>Status</th><th>Email</th><th>Notes</th><th>Actions</th></tr>\n"
|
||||
"</thead>\n"
|
||||
"<tbody>\n");
|
||||
se=GWEN_StringList_FirstEntry(slUsers);
|
||||
while(se) {
|
||||
GBAS(dbuf, "<h1>Users</h1>\n");
|
||||
GBAS(dbuf,
|
||||
"<table class=\"datatable\">\n"
|
||||
"<thead>"
|
||||
"<tr><th>Id</th><th>Alias</th><th>Name</th><th>Status</th><th>Email</th><th>Notes</th><th>Actions</th></tr>\n"
|
||||
"</thead>\n"
|
||||
"<tbody>\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, "<tr>");
|
||||
GBAA(dbuf, "<td>%lu</td>", (unsigned long int) id);
|
||||
GBAA(dbuf, "<td>%s</td>", sAlias?sAlias:"");
|
||||
s=AQH_User_GetName(u);
|
||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||
s=AQH_UserState_toString(AQH_User_GetState(u));
|
||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||
s=AQH_User_GetEmail(u);
|
||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||
s=AQH_User_GetNotes(u);
|
||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||
|
||||
id=AQH_User_GetId(currentUser);
|
||||
sAlias=AQH_User_GetAlias(currentUser);
|
||||
GBAS(dbuf, "<tr>");
|
||||
GBAA(dbuf, "<td>%lu</td>", (unsigned long int) id);
|
||||
GBAA(dbuf, "<td>%s</td>", sAlias?sAlias:"");
|
||||
s=AQH_User_GetName(currentUser);
|
||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||
s=AQH_UserState_toString(AQH_User_GetState(currentUser));
|
||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||
s=AQH_User_GetEmail(currentUser);
|
||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||
s=AQH_User_GetNotes(currentUser);
|
||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||
|
||||
GBAS(dbuf, "<td>");
|
||||
if (perms & AQH_MODADMUSERS_PERMS_USERSWRITE) {
|
||||
GBAS(dbuf, "<a href=\"edituser.html?alias=\"");
|
||||
GWEN_Text_EscapeToBufferTolerant(sAlias?sAlias:"", dbuf);
|
||||
GBAS(dbuf, "\"><img src=\"/pics/edit.png\"></a>");
|
||||
}
|
||||
GBAA(dbuf, "</td>\n");
|
||||
GBAA(dbuf, "</tr>\n");
|
||||
AQH_User_free(currentUser);
|
||||
GBAS(dbuf, "<td>");
|
||||
if (perms & AQH_MODADMUSERS_PERMS_USERSWRITE) {
|
||||
DBG_ERROR(NULL, "User=%s", sAlias?sAlias:"");
|
||||
GBAS(dbuf, "<a href=\"edituser.html?alias=");
|
||||
GWEN_Text_EscapeToBufferTolerant(sAlias?sAlias:"", dbuf);
|
||||
GBAS(dbuf, "\"><img src=\"/pics/edit.png\"></a>");
|
||||
}
|
||||
GBAA(dbuf, "</td>\n");
|
||||
GBAA(dbuf, "</tr>\n");
|
||||
}
|
||||
se=GWEN_StringListEntry_Next(se);
|
||||
u=AQH_User_List_Next(u);
|
||||
}
|
||||
GBAS(dbuf,
|
||||
"</tbody>\n"
|
||||
"</table>\n");
|
||||
GWEN_StringList_free(slUsers);
|
||||
AQH_User_List_free(userList);
|
||||
}
|
||||
if (perms & AQH_MODADMUSERS_PERMS_USERSADD)
|
||||
GBAS(dbuf, "<hr><a href=\"adduser.html\">Add User</a>");
|
||||
@@ -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, "<h2>Module Info</h2>\n");
|
||||
GBAS(dbuf,
|
||||
"<form action=\"edituser.html\" method=\"post\">\n"
|
||||
"<table class=\"formtable\">\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, "<h2>Error</h2><p>Error saving user</p>");
|
||||
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:"<no name>");
|
||||
GBAS(dbuf, "<p>Error loading user.</p>\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, "<h2>Error</h2><p>Error saving user</p>");
|
||||
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, "<p>Missing alias.</p>\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, "<h2>User Info</h2>\n");
|
||||
GBAA(dbuf,
|
||||
"<form action=\"%s\" method=\"post\">\n"
|
||||
"<table class=\"formtable\">\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, "</table>\n");
|
||||
GBAA(dbuf, "<input type=\"hidden\" name=\"alias\" value=\"%s\">\n", sAlias);
|
||||
GBAS(dbuf, "<input type=\"submit\" value=\"Save\">\n</form>\n\n");
|
||||
GBAA(dbuf, "<input type=\"hidden\" name=\"alias\" value=\"%s\">\n", sAlias?sAlias:"");
|
||||
GBAA(dbuf, "<input type=\"submit\" value=\"%s\">\n</form>\n\n", sSubmitText?sSubmitText:"Save");
|
||||
|
||||
/* module permissions */
|
||||
GBAS(dbuf, "<h2>Module Roles</h2>\n");
|
||||
GBAS(dbuf,
|
||||
"<table class=\"datatable\">\n"
|
||||
"<thead>"
|
||||
"<tr><th>Module</th><th>Enabled Roles</th><th>Actions</th></tr>\n"
|
||||
"</thead>\n"
|
||||
"<tbody>\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, "<tr><td>%s</td><td>", sModName);
|
||||
if (modPermsList) {
|
||||
const AQH_MODULE_PERMS *modPerms;
|
||||
|
||||
modPerms=AQH_ModulePerms_List_GetByModuleId(modPermsList, sModName);
|
||||
if (modPerms)
|
||||
_writeModulePerms(currentMod, modPerms, dbuf);
|
||||
GBAS(dbuf, "</td></tr>\n");
|
||||
}
|
||||
GBAS(dbuf, "<td>");
|
||||
if (perms & AQH_MODADMUSERS_PERMS_USERSWRITE)
|
||||
GBAA(dbuf, "<a href=\"editmodperms.html?alias=%s&module=%s\"><img src=\"/pics/edit.png\"></a>",
|
||||
sAlias?sAlias:"", sModName);
|
||||
GBAS(dbuf, "</td>");
|
||||
|
||||
currentMod=AQH_Module_List_Next(currentMod);
|
||||
} /* while */
|
||||
AQH_Module_List_free(moduleList);
|
||||
}
|
||||
GBAS(dbuf,
|
||||
"</tbody>\n"
|
||||
"</table>\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; i<roleArraySize; i++) {
|
||||
int roleId;
|
||||
|
||||
roleId=AQH_ModulePerms_GetRoleArrayAt(modPerms, i);
|
||||
if (roleId) {
|
||||
const AQH_ROLE *role;
|
||||
|
||||
role=AQH_Role_List_GetById(roleList, roleId);
|
||||
if (role) {
|
||||
const char *s;
|
||||
|
||||
s=AQH_Role_GetName(role);
|
||||
GBAA(dbuf, "%s%s", (i>0)?", ":"", s?s:"<unnamed>");
|
||||
}
|
||||
}
|
||||
} /* for */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user