aqhome-cgi: more work
This commit is contained in:
@@ -2,13 +2,22 @@
|
|||||||
|
|
||||||
Modules:
|
Modules:
|
||||||
- login
|
- login
|
||||||
|
- signup
|
||||||
|
- main
|
||||||
- devices
|
- devices
|
||||||
- list
|
- list
|
||||||
- show?id="nodes/12345678"
|
- show?name="nodes/12345678"
|
||||||
- add
|
- add
|
||||||
- edit
|
- edit
|
||||||
- delete
|
- delete
|
||||||
- values
|
- values
|
||||||
- rooms
|
- rooms
|
||||||
|
|
||||||
|
- users
|
||||||
|
- list
|
||||||
|
- show?alias="admin"
|
||||||
|
- add
|
||||||
|
- edit
|
||||||
|
- delete
|
||||||
|
|
||||||
- dashboards
|
- dashboards
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
#include <aqcgi/cgi.h>
|
#include <aqcgi/cgi.h>
|
||||||
#include <aqcgi/request.h>
|
#include <aqcgi/request.h>
|
||||||
|
|
||||||
|
#include <gwenhywfar/gwenhywfar.h>
|
||||||
|
#include <gwenhywfar/nogui.h>
|
||||||
#include <gwenhywfar/logger.h>
|
#include <gwenhywfar/logger.h>
|
||||||
#include <gwenhywfar/text.h>
|
#include <gwenhywfar/text.h>
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
@@ -32,18 +34,33 @@ static void logStart(void);
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
GWEN_GUI *gui;
|
||||||
AQCGI_REQUEST *rq;
|
AQCGI_REQUEST *rq;
|
||||||
|
|
||||||
|
GWEN_Init();
|
||||||
|
gui=GWEN_NoGui_new();
|
||||||
|
GWEN_Gui_SetGui(gui);
|
||||||
|
|
||||||
logStart();
|
logStart();
|
||||||
GWEN_Logger_Open(GWEN_LOGDOMAIN, "gwenhywfar", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
GWEN_Logger_Open(GWEN_LOGDOMAIN, "gwenhywfar", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
||||||
GWEN_Logger_Open(AQH_LOGDOMAIN, "aqhome", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
GWEN_Logger_Open(AQH_LOGDOMAIN, "aqhome", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
||||||
GWEN_Logger_Open(AQCGI_LOGDOMAIN, "aqcgi", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
GWEN_Logger_Open(AQCGI_LOGDOMAIN, "aqcgi", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
||||||
GWEN_Logger_SetLevel(AQCGI_LOGDOMAIN, GWEN_LoggerLevel_Debug);
|
|
||||||
GWEN_Logger_Open(NULL, "aqhome-cgi", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
GWEN_Logger_Open(NULL, "aqhome-cgi", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
||||||
|
|
||||||
|
GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Debug);
|
||||||
|
GWEN_Logger_SetLevel(AQCGI_LOGDOMAIN, GWEN_LoggerLevel_Debug);
|
||||||
|
GWEN_Logger_SetLevel(NULL, GWEN_LoggerLevel_Debug);
|
||||||
|
|
||||||
DBG_ERROR(NULL, "Init CGI");
|
DBG_ERROR(NULL, "Init CGI");
|
||||||
AQCGI_Init();
|
AQCGI_Init();
|
||||||
|
|
||||||
|
GWEN_Logger_Close(GWEN_LOGDOMAIN);
|
||||||
|
GWEN_Logger_Open(GWEN_LOGDOMAIN, "gwenhywfar", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
||||||
|
|
||||||
|
GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Debug);
|
||||||
|
GWEN_Logger_SetLevel(AQCGI_LOGDOMAIN, GWEN_LoggerLevel_Debug);
|
||||||
|
GWEN_Logger_SetLevel(NULL, GWEN_LoggerLevel_Debug);
|
||||||
|
|
||||||
rq=AQCGI_ReadRequest();
|
rq=AQCGI_ReadRequest();
|
||||||
if (rq) {
|
if (rq) {
|
||||||
const char *sPathStaticFiles;
|
const char *sPathStaticFiles;
|
||||||
@@ -67,9 +84,6 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
AQCGI_Fini();
|
AQCGI_Fini();
|
||||||
|
|
||||||
fprintf(stdout, "Content-type: text/plain\n\n");
|
|
||||||
fprintf(stdout, "Request handled\n");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "aqhome-cgi/service/module.h"
|
#include "aqhome-cgi/service/module.h"
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
|
#include <gwenhywfar/timestamp.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -37,6 +38,8 @@
|
|||||||
static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName);
|
static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName);
|
||||||
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem);
|
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem);
|
||||||
static int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq);
|
static int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq);
|
||||||
|
static int _handleRqLoginPost(AQH_MODULE *m, AQCGI_REQUEST *rq);
|
||||||
|
static AQH_USER *_getAndCheckUser(AQH_MODULE *m, AQCGI_REQUEST *rq);
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------------------------------
|
||||||
@@ -69,8 +72,16 @@ int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem)
|
|||||||
if (strcasecmp(sLastPathElem, "login")==0)
|
if (strcasecmp(sLastPathElem, "login")==0)
|
||||||
return _handleRqLogin(m, rq);
|
return _handleRqLogin(m, rq);
|
||||||
else if (strcasecmp(sLastPathElem, "signup")==0) {
|
else if (strcasecmp(sLastPathElem, "signup")==0) {
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 501, "Not Implemented");
|
||||||
|
return GWEN_ERROR_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
else if (strcasecmp(sLastPathElem, "confirm")==0) {
|
else if (strcasecmp(sLastPathElem, "confirm")==0) {
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 501, "Not Implemented");
|
||||||
|
return GWEN_ERROR_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 404, "Not Found");
|
||||||
|
return GWEN_ERROR_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,25 +89,152 @@ int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem)
|
|||||||
|
|
||||||
int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq)
|
int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq)
|
||||||
{
|
{
|
||||||
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET) {
|
int rv;
|
||||||
int rv;
|
|
||||||
|
|
||||||
rv=AQH_ModService_RespondWithFile(m, rq, "login.html");
|
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET)
|
||||||
if (rv<0) {
|
rv=AQH_ModService_RespondWithFile(m, rq, "en", "login.html");
|
||||||
DBG_INFO(NULL, "here (%d)", rv);
|
else if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_POST)
|
||||||
return rv;
|
rv=_handleRqLoginPost(m, rq);
|
||||||
}
|
else {
|
||||||
return 0;
|
DBG_ERROR(NULL, "Invalid request method %d", AQCGI_Request_GetRequestMethod(rq));
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 405, "Method No Allowed");
|
||||||
|
return GWEN_ERROR_INVALID;
|
||||||
}
|
}
|
||||||
else if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_POST) {
|
if (rv<0) {
|
||||||
GWEN_DB_NODE *dbPost;
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
|
||||||
if (dbPost) {
|
|
||||||
|
|
||||||
|
|
||||||
|
int _handleRqLoginPost(AQH_MODULE *m, AQCGI_REQUEST *rq)
|
||||||
|
{
|
||||||
|
AQH_SERVICE *sv;
|
||||||
|
AQH_USER *user;
|
||||||
|
AQH_SESSION *session;
|
||||||
|
GWEN_BUFFER *dbuf;
|
||||||
|
GWEN_TIMESTAMP *ts;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
DBG_ERROR(NULL, "Handling request");
|
||||||
|
sv=AQH_ModService_GetService(m);
|
||||||
|
user=_getAndCheckUser(m, rq);
|
||||||
|
if (user==NULL) {
|
||||||
|
DBG_INFO(NULL, "here");
|
||||||
|
return GWEN_ERROR_GENERIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
ts=GWEN_Timestamp_NowInLocalTime();
|
||||||
|
AQH_User_SetTimestampLastLogin(user, ts);
|
||||||
|
DBG_ERROR(NULL, "Saving user");
|
||||||
|
rv=AQH_Service_SaveUser(sv, user);
|
||||||
|
if (rv<0) {
|
||||||
|
DBG_ERROR(NULL, "Error saving user \"%s\"", AQH_User_GetAlias(user));
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 500, "Internal Error");
|
||||||
|
AQH_User_free(user);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* generate session */
|
||||||
|
DBG_ERROR(NULL, "Generating session");
|
||||||
|
dbuf=GWEN_Buffer_new(0, 64, 0, 1);
|
||||||
|
AQCGI_GenerateSessionId(dbuf);
|
||||||
|
session=AQH_Session_new();
|
||||||
|
AQH_Session_SetTimestampCreation(session, ts);
|
||||||
|
AQH_Session_SetTimestampLastAccess(session, ts);
|
||||||
|
AQH_Session_SetUid(session, GWEN_Buffer_GetStart(dbuf));
|
||||||
|
GWEN_Buffer_free(dbuf);
|
||||||
|
AQH_Session_SetUserAlias(session, AQH_User_GetAlias(user));
|
||||||
|
rv=AQH_Service_AddSession(sv, session);
|
||||||
|
if (rv<0) {
|
||||||
|
DBG_ERROR(NULL, "Error adding session for user \"%s\"", AQH_User_GetAlias(user));
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 500, "Internal Error");
|
||||||
|
AQH_Session_free(session);
|
||||||
|
AQH_User_free(user);
|
||||||
|
return GWEN_ERROR_INTERNAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add Set-Cookie header */
|
||||||
|
dbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
|
GWEN_Buffer_AppendArgs(dbuf, "Set-Cookie: session=%s; max-age=3600", AQH_Session_GetUid(session));
|
||||||
|
AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(dbuf));
|
||||||
|
|
||||||
|
/* finish */
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 200, "Ok");
|
||||||
|
AQH_Session_free(session);
|
||||||
|
AQH_User_free(user);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AQH_USER *_getAndCheckUser(AQH_MODULE *m, AQCGI_REQUEST *rq)
|
||||||
|
{
|
||||||
|
GWEN_DB_NODE *dbPost;
|
||||||
|
|
||||||
|
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
||||||
|
if (dbPost) {
|
||||||
|
AQH_SERVICE *sv;
|
||||||
|
const char *sUserName;
|
||||||
|
const char *sPasswd;
|
||||||
|
AQH_USER *user;
|
||||||
|
const char *hashedPaswd;
|
||||||
|
GWEN_BUFFER *buf;
|
||||||
|
|
||||||
|
sv=AQH_ModService_GetService(m);
|
||||||
|
sUserName=GWEN_DB_GetCharValue(dbPost, "userid", 0, NULL);
|
||||||
|
sPasswd=GWEN_DB_GetCharValue(dbPost, "password", 0, NULL);
|
||||||
|
if (!(sUserName && *sUserName && sPasswd && *sPasswd)) {
|
||||||
|
DBG_ERROR(NULL, "Either user name or password missing");
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 400, "Bad Request");
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBG_ERROR(NULL, "Loading user \"%s\" (%p)", sUserName, sv);
|
||||||
|
user=AQH_Service_LoadUser(sv, sUserName);
|
||||||
|
if (user==NULL) {
|
||||||
|
DBG_ERROR(NULL, "User \"%s\" not found", sUserName);
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 403, "Forbidden");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
DBG_ERROR(NULL, "Loaded user \"%s\"", sUserName);
|
||||||
|
|
||||||
|
if (AQH_User_GetState(user)!=AQH_UserState_Active) {
|
||||||
|
DBG_ERROR(NULL, "User \"%s\" not active", sUserName);
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 403, "Forbidden");
|
||||||
|
AQH_User_free(user);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hashedPaswd=AQH_User_GetHashedPassword(user);
|
||||||
|
if (!(hashedPaswd && *hashedPaswd)) {
|
||||||
|
DBG_ERROR(NULL, "User \"%s\" has no hashed password", sUserName);
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 403, "Forbidden");
|
||||||
|
AQH_User_free(user);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
buf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
|
AQCGI_HashMd256ToBuffer(sPasswd, buf);
|
||||||
|
DBG_ERROR(NULL, "Hashed password: [%s]", GWEN_Buffer_GetStart(buf));
|
||||||
|
if (strcasecmp(GWEN_Buffer_GetStart(buf), hashedPaswd)!=0) {
|
||||||
|
DBG_ERROR(NULL, "Bad password for user \"%s\"", sUserName);
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 403, "Forbidden");
|
||||||
|
GWEN_Buffer_free(buf);
|
||||||
|
AQH_User_free(user);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
GWEN_Buffer_free(buf);
|
||||||
|
|
||||||
|
DBG_ERROR(NULL, "User \"%s\" accepted", sUserName);
|
||||||
|
return user;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
DBG_ERROR(NULL, "No POST data");
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 400, "Bad Request");
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,4 +244,3 @@ int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ void AQH_ModService_SetLoadSubModuleFn(AQH_MODULE *m, AQH_MODSERVICE_LOADSUBMODU
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModService_AddHeader(AQH_MODULE *m, GWEN_BUFFER *dbuf)
|
int AQH_ModService_AddHeader(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (m && dbuf) {
|
if (m && dbuf) {
|
||||||
AQH_MODULE *mParent;
|
AQH_MODULE *mParent;
|
||||||
@@ -147,13 +147,13 @@ int AQH_ModService_AddHeader(AQH_MODULE *m, GWEN_BUFFER *dbuf)
|
|||||||
if (mParent) {
|
if (mParent) {
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv=AQH_ModService_AddHeader(mParent, dbuf);
|
rv=AQH_ModService_AddHeader(mParent, lang, dbuf);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_INFO(NULL, "here (%d)", rv);
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return AQH_ModService_ReadStaticFile(m, AQH_MOD_SERVICE_HEADERFILE, dbuf);
|
return AQH_ModService_ReadStaticFile(m, lang, AQH_MOD_SERVICE_HEADERFILE, dbuf);
|
||||||
}
|
}
|
||||||
DBG_ERROR(NULL, "Argument missing");
|
DBG_ERROR(NULL, "Argument missing");
|
||||||
return GWEN_ERROR_INVALID;
|
return GWEN_ERROR_INVALID;
|
||||||
@@ -161,13 +161,13 @@ int AQH_ModService_AddHeader(AQH_MODULE *m, GWEN_BUFFER *dbuf)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModService_AddFooter(AQH_MODULE *m, GWEN_BUFFER *dbuf)
|
int AQH_ModService_AddFooter(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (m && dbuf) {
|
if (m && dbuf) {
|
||||||
AQH_MODULE *mParent;
|
AQH_MODULE *mParent;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv=AQH_ModService_ReadStaticFile(m, AQH_MOD_SERVICE_FOOTERFILE, dbuf);
|
rv=AQH_ModService_ReadStaticFile(m, lang, AQH_MOD_SERVICE_FOOTERFILE, dbuf);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_INFO(NULL, "here (%d)", rv);
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
return rv;
|
return rv;
|
||||||
@@ -177,38 +177,41 @@ int AQH_ModService_AddFooter(AQH_MODULE *m, GWEN_BUFFER *dbuf)
|
|||||||
if (mParent) {
|
if (mParent) {
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv=AQH_ModService_AddFooter(mParent, dbuf);
|
rv=AQH_ModService_AddFooter(mParent, lang, dbuf);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_INFO(NULL, "here (%d)", rv);
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DBG_ERROR(NULL, "Argument missing");
|
||||||
|
return GWEN_ERROR_INVALID;
|
||||||
}
|
}
|
||||||
DBG_ERROR(NULL, "Argument missing");
|
|
||||||
return GWEN_ERROR_INVALID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sFilename)
|
int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *lang, const char *sFilename)
|
||||||
{
|
{
|
||||||
GWEN_BUFFER *buf;
|
GWEN_BUFFER *buf;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
buf=GWEN_Buffer_new(0, 256, 0, 1);
|
buf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
rv=AQH_ModService_AddHeader(m, buf);
|
rv=AQH_ModService_AddHeader(m, lang, buf);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
AQCGI_SendResponseWithStatus(rq, 500, "Internal error");
|
AQCGI_SendResponseWithStatus(rq, 500, "Internal error");
|
||||||
GWEN_Buffer_free(buf);
|
GWEN_Buffer_free(buf);
|
||||||
return GWEN_ERROR_INTERNAL;
|
return GWEN_ERROR_INTERNAL;
|
||||||
}
|
}
|
||||||
rv=AQH_ModService_ReadStaticFile(m, sFilename, buf);
|
rv=AQH_ModService_ReadStaticFile(m, lang, sFilename, buf);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
AQCGI_SendResponseWithStatus(rq, 500, "Internal error");
|
AQCGI_SendResponseWithStatus(rq, 500, "Internal error");
|
||||||
GWEN_Buffer_free(buf);
|
GWEN_Buffer_free(buf);
|
||||||
return GWEN_ERROR_INTERNAL;
|
return GWEN_ERROR_INTERNAL;
|
||||||
}
|
}
|
||||||
rv=AQH_ModService_AddFooter(m, buf);
|
rv=AQH_ModService_AddFooter(m, lang, buf);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
AQCGI_SendResponseWithStatus(rq, 500, "Internal error");
|
AQCGI_SendResponseWithStatus(rq, 500, "Internal error");
|
||||||
GWEN_Buffer_free(buf);
|
GWEN_Buffer_free(buf);
|
||||||
@@ -216,6 +219,8 @@ int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char
|
|||||||
}
|
}
|
||||||
AQCGI_Request_SetBufferResponseBody(rq, buf);
|
AQCGI_Request_SetBufferResponseBody(rq, buf);
|
||||||
AQCGI_Request_AddResponseHeaderData(rq, "Content-type: text/html");
|
AQCGI_Request_AddResponseHeaderData(rq, "Content-type: text/html");
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 200, "Ok");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,7 +254,7 @@ AQH_MODULE *AQH_ModService_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *filename, GWEN_BUFFER *dbuf)
|
int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *filename, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (m && filename && dbuf) {
|
if (m && filename && dbuf) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
@@ -262,6 +267,8 @@ int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *filename, GWEN_BUFF
|
|||||||
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
GWEN_Buffer_AppendString(fbuf, xm->baseFolder);
|
GWEN_Buffer_AppendString(fbuf, xm->baseFolder);
|
||||||
GWEN_Buffer_AppendString(fbuf, GWEN_DIR_SEPARATOR_S);
|
GWEN_Buffer_AppendString(fbuf, GWEN_DIR_SEPARATOR_S);
|
||||||
|
GWEN_Buffer_AppendString(fbuf, (lang && *lang)?lang:"en");
|
||||||
|
GWEN_Buffer_AppendString(fbuf, GWEN_DIR_SEPARATOR_S);
|
||||||
GWEN_Buffer_AppendString(fbuf, filename);
|
GWEN_Buffer_AppendString(fbuf, filename);
|
||||||
DBG_ERROR(NULL, "Reading file \"%s\"", GWEN_Buffer_GetStart(fbuf));
|
DBG_ERROR(NULL, "Reading file \"%s\"", GWEN_Buffer_GetStart(fbuf));
|
||||||
rv=GWEN_SyncIo_Helper_ReadFile(GWEN_Buffer_GetStart(fbuf), dbuf);
|
rv=GWEN_SyncIo_Helper_ReadFile(GWEN_Buffer_GetStart(fbuf), dbuf);
|
||||||
|
|||||||
@@ -28,14 +28,14 @@ AQH_SERVICE *AQH_ModService_GetService(const AQH_MODULE *m);
|
|||||||
const char *AQH_ModService_GetBaseFolder(const AQH_MODULE *m);
|
const char *AQH_ModService_GetBaseFolder(const AQH_MODULE *m);
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModService_AddHeader(AQH_MODULE *m, GWEN_BUFFER *dbuf);
|
int AQH_ModService_AddHeader(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
|
||||||
int AQH_ModService_AddFooter(AQH_MODULE *m, GWEN_BUFFER *dbuf);
|
int AQH_ModService_AddFooter(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
AQH_MODULE *AQH_ModService_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName);
|
AQH_MODULE *AQH_ModService_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName);
|
||||||
int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem);
|
int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem);
|
||||||
|
|
||||||
int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sFilename);
|
int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *lang, const char *sFilename);
|
||||||
int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *filename, GWEN_BUFFER *dbuf);
|
int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *filename, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_SetHandleRequestFn(AQH_MODULE *m, AQH_MODSERVICE_HANDLEREQUEST_FN fn);
|
void AQH_ModService_SetHandleRequestFn(AQH_MODULE *m, AQH_MODSERVICE_HANDLEREQUEST_FN fn);
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
<h3>Enter your login credentials</h3>
|
<h3>Enter your login credentials</h3>
|
||||||
|
|
||||||
<form action="login" method="post">
|
<form action="login" method="post">
|
||||||
<label for="first">Username:</label>
|
<label for="userid">Username:</label>
|
||||||
<input type="text" id="first" name="first" placeholder="Enter your Username" required>
|
<input type="text" id="userid" name="userid" placeholder="Enter your Username" required>
|
||||||
<label for="password">Password:</label>
|
<label for="password">Password:</label>
|
||||||
<input type="password" id="password" name="password" placeholder="Enter your Password" required>
|
<input type="password" id="password" name="password" placeholder="Enter your Password" required>
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,10 @@
|
|||||||
<descr>Waiting for approval by admin</descr>
|
<descr>Waiting for approval by admin</descr>
|
||||||
</item>
|
</item>
|
||||||
|
|
||||||
|
<item name="active">
|
||||||
|
<descr>User active</descr>
|
||||||
|
</item>
|
||||||
|
|
||||||
</enum>
|
</enum>
|
||||||
|
|
||||||
</enums>
|
</enums>
|
||||||
|
|||||||
@@ -70,6 +70,8 @@ static int _addGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *s
|
|||||||
static int _deleteGroup(AQH_SERVICE *sv, const char *groupName, const char *subGroupName);
|
static int _deleteGroup(AQH_SERVICE *sv, const char *groupName, const char *subGroupName);
|
||||||
static GWEN_STRINGLIST *_listGroup(AQH_SERVICE *sv, const char *groupName);
|
static GWEN_STRINGLIST *_listGroup(AQH_SERVICE *sv, const char *groupName);
|
||||||
|
|
||||||
|
//static void _logGroup(const char *groupName, const char *subGroupName, GWEN_DB_NODE *db);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------------------------------
|
||||||
@@ -169,6 +171,9 @@ int _saveUser(AQH_SERVICE *sv, AQH_USER *user)
|
|||||||
GWEN_DB_Group_free(db);
|
GWEN_DB_Group_free(db);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//_logGroup(AQH_SERVICE_FILE_GROUP_USERS, s, db);
|
||||||
|
|
||||||
rv=_saveGroupLocked(sv, AQH_SERVICE_FILE_GROUP_USERS, s, db);
|
rv=_saveGroupLocked(sv, AQH_SERVICE_FILE_GROUP_USERS, s, db);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "here (%d)", rv);
|
DBG_ERROR(NULL, "here (%d)", rv);
|
||||||
@@ -414,6 +419,7 @@ GWEN_STRINGLIST *_listSessions(AQH_SERVICE *sv)
|
|||||||
|
|
||||||
GWEN_DB_NODE *_loadGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGroupName)
|
GWEN_DB_NODE *_loadGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGroupName)
|
||||||
{
|
{
|
||||||
|
DBG_ERROR(NULL, "Lock and load group %s/%s", groupName, subGroupName);
|
||||||
if (sv && groupName && subGroupName) {
|
if (sv && groupName && subGroupName) {
|
||||||
AQH_SERVICE_FILE *xs;
|
AQH_SERVICE_FILE *xs;
|
||||||
|
|
||||||
@@ -422,17 +428,20 @@ GWEN_DB_NODE *_loadGroupLocked(AQH_SERVICE *sv, const char *groupName, const cha
|
|||||||
GWEN_DB_NODE *db=NULL;
|
GWEN_DB_NODE *db=NULL;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
DBG_ERROR(NULL, "Locking group %s/%s", groupName, subGroupName);
|
||||||
rv=GWEN_ConfigMgr_LockGroup(xs->configMgr, groupName, subGroupName);
|
rv=GWEN_ConfigMgr_LockGroup(xs->configMgr, groupName, subGroupName);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error locking group \"%s/%s\": %d", groupName, subGroupName, rv);
|
DBG_ERROR(NULL, "Error locking group \"%s/%s\": %d", groupName, subGroupName, rv);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
DBG_ERROR(NULL, "Loading group %s/%s", groupName, subGroupName);
|
||||||
rv=GWEN_ConfigMgr_GetGroup(xs->configMgr, groupName, subGroupName, &db);
|
rv=GWEN_ConfigMgr_GetGroup(xs->configMgr, groupName, subGroupName, &db);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error reading group \"%s/%s\": %d", groupName, subGroupName, rv);
|
DBG_ERROR(NULL, "Error reading group \"%s/%s\": %d", groupName, subGroupName, rv);
|
||||||
GWEN_ConfigMgr_UnlockGroup(xs->configMgr, groupName, subGroupName);
|
GWEN_ConfigMgr_UnlockGroup(xs->configMgr, groupName, subGroupName);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
DBG_ERROR(NULL, "Unlocking group %s/%s", groupName, subGroupName);
|
||||||
rv=GWEN_ConfigMgr_UnlockGroup(xs->configMgr, groupName, subGroupName);
|
rv=GWEN_ConfigMgr_UnlockGroup(xs->configMgr, groupName, subGroupName);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error unlocking group \"%s/%s\": %d", groupName, subGroupName, rv);
|
DBG_ERROR(NULL, "Error unlocking group \"%s/%s\": %d", groupName, subGroupName, rv);
|
||||||
@@ -442,6 +451,9 @@ GWEN_DB_NODE *_loadGroupLocked(AQH_SERVICE *sv, const char *groupName, const cha
|
|||||||
return db;
|
return db;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
DBG_ERROR(NULL, "Missing argument");
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -454,25 +466,26 @@ int _saveGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGrou
|
|||||||
|
|
||||||
xs=GWEN_INHERIT_GETDATA(AQH_SERVICE, AQH_SERVICE_FILE, sv);
|
xs=GWEN_INHERIT_GETDATA(AQH_SERVICE, AQH_SERVICE_FILE, sv);
|
||||||
if (xs) {
|
if (xs) {
|
||||||
GWEN_DB_NODE *db=NULL;
|
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
DBG_ERROR(NULL, "Locking group %s/%s", groupName, subGroupName);
|
||||||
rv=GWEN_ConfigMgr_LockGroup(xs->configMgr, groupName, subGroupName);
|
rv=GWEN_ConfigMgr_LockGroup(xs->configMgr, groupName, subGroupName);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error locking group \"%s/%s\": %d", groupName, subGroupName, rv);
|
DBG_ERROR(NULL, "Error locking group \"%s/%s\": %d", groupName, subGroupName, rv);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBG_ERROR(NULL, "Writing group %s/%s", groupName, subGroupName);
|
||||||
rv=GWEN_ConfigMgr_SetGroup(xs->configMgr, groupName, subGroupName, db);
|
rv=GWEN_ConfigMgr_SetGroup(xs->configMgr, groupName, subGroupName, db);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error writing group \"%s/%s\": %d", groupName, subGroupName, rv);
|
DBG_ERROR(NULL, "Error writing group \"%s/%s\": %d", groupName, subGroupName, rv);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBG_ERROR(NULL, "Unlocking group %s/%s", groupName, subGroupName);
|
||||||
rv=GWEN_ConfigMgr_UnlockGroup(xs->configMgr, groupName, subGroupName);
|
rv=GWEN_ConfigMgr_UnlockGroup(xs->configMgr, groupName, subGroupName);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error unlocking group \"%s/%s\": %d", groupName, subGroupName, rv);
|
DBG_ERROR(NULL, "Error unlocking group \"%s/%s\": %d", groupName, subGroupName, rv);
|
||||||
GWEN_DB_Group_free(db);
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -491,7 +504,6 @@ int _addGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGroup
|
|||||||
|
|
||||||
xs=GWEN_INHERIT_GETDATA(AQH_SERVICE, AQH_SERVICE_FILE, sv);
|
xs=GWEN_INHERIT_GETDATA(AQH_SERVICE, AQH_SERVICE_FILE, sv);
|
||||||
if (xs) {
|
if (xs) {
|
||||||
GWEN_DB_NODE *db=NULL;
|
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv=GWEN_ConfigMgr_HasGroup(xs->configMgr, groupName, subGroupName);
|
rv=GWEN_ConfigMgr_HasGroup(xs->configMgr, groupName, subGroupName);
|
||||||
@@ -515,7 +527,6 @@ int _addGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGroup
|
|||||||
rv=GWEN_ConfigMgr_UnlockGroup(xs->configMgr, groupName, subGroupName);
|
rv=GWEN_ConfigMgr_UnlockGroup(xs->configMgr, groupName, subGroupName);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error unlocking group \"%s/%s\": %d", groupName, subGroupName, rv);
|
DBG_ERROR(NULL, "Error unlocking group \"%s/%s\": %d", groupName, subGroupName, rv);
|
||||||
GWEN_DB_Group_free(db);
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -577,3 +588,24 @@ GWEN_STRINGLIST *_listGroup(AQH_SERVICE *sv, const char *groupName)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
void _logGroup(const char *groupName, const char *subGroupName, GWEN_DB_NODE *db)
|
||||||
|
{
|
||||||
|
if (db) {
|
||||||
|
GWEN_BUFFER *dbuf;
|
||||||
|
|
||||||
|
dbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
|
GWEN_DB_WriteToBuffer(db, dbuf, GWEN_DB_FLAGS_DEFAULT);
|
||||||
|
DBG_ERROR(NULL, "Group %s/%s:\n%s", groupName?groupName:"<empty>", subGroupName?subGroupName:"<empty>",
|
||||||
|
GWEN_Buffer_GetStart(dbuf));
|
||||||
|
GWEN_Buffer_free(dbuf);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DBG_ERROR(NULL, "Group %s/%s empty", groupName?groupName:"<empty>", subGroupName?subGroupName:"<empty>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user