diff --git a/apps/aqhome-cgi/README b/apps/aqhome-cgi/README index 6dbd1b1..9a1da88 100644 --- a/apps/aqhome-cgi/README +++ b/apps/aqhome-cgi/README @@ -2,13 +2,22 @@ Modules: - login +- signup +- main - devices - list - - show?id="nodes/12345678" + - show?name="nodes/12345678" - add - edit - delete - values - rooms +- users + - list + - show?alias="admin" + - add + - edit + - delete + - dashboards diff --git a/apps/aqhome-cgi/main.c b/apps/aqhome-cgi/main.c index a868688..b02433b 100644 --- a/apps/aqhome-cgi/main.c +++ b/apps/aqhome-cgi/main.c @@ -7,6 +7,8 @@ #include #include +#include +#include #include #include #include @@ -32,18 +34,33 @@ static void logStart(void); int main(int argc, char **argv) { + GWEN_GUI *gui; AQCGI_REQUEST *rq; + GWEN_Init(); + gui=GWEN_NoGui_new(); + GWEN_Gui_SetGui(gui); + logStart(); 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(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_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"); 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(); if (rq) { const char *sPathStaticFiles; @@ -67,9 +84,6 @@ int main(int argc, char **argv) AQCGI_Fini(); - fprintf(stdout, "Content-type: text/plain\n\n"); - fprintf(stdout, "Request handled\n"); - return 0; } diff --git a/apps/aqhome-cgi/modules/mroot.c b/apps/aqhome-cgi/modules/mroot.c index 751f6b0..24e4375 100644 --- a/apps/aqhome-cgi/modules/mroot.c +++ b/apps/aqhome-cgi/modules/mroot.c @@ -16,6 +16,7 @@ #include "aqhome-cgi/service/module.h" #include +#include @@ -37,6 +38,8 @@ 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 _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) return _handleRqLogin(m, rq); else if (strcasecmp(sLastPathElem, "signup")==0) { + AQCGI_SendResponseWithStatus(rq, 501, "Not Implemented"); + return GWEN_ERROR_NOT_IMPLEMENTED; } 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) { - if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET) { - int rv; + int rv; - rv=AQH_ModService_RespondWithFile(m, rq, "login.html"); - if (rv<0) { - DBG_INFO(NULL, "here (%d)", rv); - return rv; - } - return 0; + if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET) + rv=AQH_ModService_RespondWithFile(m, rq, "en", "login.html"); + else if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_POST) + rv=_handleRqLoginPost(m, rq); + else { + 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) { - GWEN_DB_NODE *dbPost; + if (rv<0) { + 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 { + 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) - diff --git a/apps/aqhome-cgi/modules/mservice.c b/apps/aqhome-cgi/modules/mservice.c index a40bb17..7d1c9dd 100644 --- a/apps/aqhome-cgi/modules/mservice.c +++ b/apps/aqhome-cgi/modules/mservice.c @@ -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) { AQH_MODULE *mParent; @@ -147,13 +147,13 @@ int AQH_ModService_AddHeader(AQH_MODULE *m, GWEN_BUFFER *dbuf) if (mParent) { int rv; - rv=AQH_ModService_AddHeader(mParent, dbuf); + rv=AQH_ModService_AddHeader(mParent, lang, dbuf); if (rv<0) { DBG_INFO(NULL, "here (%d)", 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"); 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) { AQH_MODULE *mParent; 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) { DBG_INFO(NULL, "here (%d)", rv); return rv; @@ -177,38 +177,41 @@ int AQH_ModService_AddFooter(AQH_MODULE *m, GWEN_BUFFER *dbuf) if (mParent) { int rv; - rv=AQH_ModService_AddFooter(mParent, dbuf); + rv=AQH_ModService_AddFooter(mParent, lang, dbuf); if (rv<0) { DBG_INFO(NULL, "here (%d)", 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; int rv; buf=GWEN_Buffer_new(0, 256, 0, 1); - rv=AQH_ModService_AddHeader(m, buf); + rv=AQH_ModService_AddHeader(m, lang, buf); if (rv<0) { AQCGI_SendResponseWithStatus(rq, 500, "Internal error"); GWEN_Buffer_free(buf); return GWEN_ERROR_INTERNAL; } - rv=AQH_ModService_ReadStaticFile(m, sFilename, buf); + rv=AQH_ModService_ReadStaticFile(m, lang, sFilename, buf); if (rv<0) { AQCGI_SendResponseWithStatus(rq, 500, "Internal error"); GWEN_Buffer_free(buf); return GWEN_ERROR_INTERNAL; } - rv=AQH_ModService_AddFooter(m, buf); + rv=AQH_ModService_AddFooter(m, lang, buf); if (rv<0) { AQCGI_SendResponseWithStatus(rq, 500, "Internal error"); 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_AddResponseHeaderData(rq, "Content-type: text/html"); + AQCGI_SendResponseWithStatus(rq, 200, "Ok"); + 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) { 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); GWEN_Buffer_AppendString(fbuf, xm->baseFolder); 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); DBG_ERROR(NULL, "Reading file \"%s\"", GWEN_Buffer_GetStart(fbuf)); rv=GWEN_SyncIo_Helper_ReadFile(GWEN_Buffer_GetStart(fbuf), dbuf); diff --git a/apps/aqhome-cgi/modules/mservice.h b/apps/aqhome-cgi/modules/mservice.h index f263c71..6bc7024 100644 --- a/apps/aqhome-cgi/modules/mservice.h +++ b/apps/aqhome-cgi/modules/mservice.h @@ -28,14 +28,14 @@ AQH_SERVICE *AQH_ModService_GetService(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_AddFooter(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, const char *lang, GWEN_BUFFER *dbuf); 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_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sFilename); -int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *filename, GWEN_BUFFER *dbuf); +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 *lang, const char *filename, GWEN_BUFFER *dbuf); void AQH_ModService_SetHandleRequestFn(AQH_MODULE *m, AQH_MODSERVICE_HANDLEREQUEST_FN fn); diff --git a/apps/aqhome-cgi/modules/static/en/login.html b/apps/aqhome-cgi/modules/static/en/login.html index 6fbbe8a..1927e5b 100644 --- a/apps/aqhome-cgi/modules/static/en/login.html +++ b/apps/aqhome-cgi/modules/static/en/login.html @@ -4,8 +4,8 @@

Enter your login credentials

- - + + diff --git a/apps/aqhome-cgi/service/user.t2d b/apps/aqhome-cgi/service/user.t2d index a9ff05a..946dad2 100644 --- a/apps/aqhome-cgi/service/user.t2d +++ b/apps/aqhome-cgi/service/user.t2d @@ -54,6 +54,10 @@ Waiting for approval by admin + + User active + + diff --git a/apps/aqhome-cgi/service_file.c b/apps/aqhome-cgi/service_file.c index b91ac87..371900e 100644 --- a/apps/aqhome-cgi/service_file.c +++ b/apps/aqhome-cgi/service_file.c @@ -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 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); return rv; } + + //_logGroup(AQH_SERVICE_FILE_GROUP_USERS, s, db); + rv=_saveGroupLocked(sv, AQH_SERVICE_FILE_GROUP_USERS, s, db); if (rv<0) { 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) { + DBG_ERROR(NULL, "Lock and load group %s/%s", groupName, subGroupName); if (sv && groupName && subGroupName) { 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; int rv; + DBG_ERROR(NULL, "Locking group %s/%s", groupName, subGroupName); rv=GWEN_ConfigMgr_LockGroup(xs->configMgr, groupName, subGroupName); if (rv<0) { DBG_ERROR(NULL, "Error locking group \"%s/%s\": %d", groupName, subGroupName, rv); return NULL; } + DBG_ERROR(NULL, "Loading group %s/%s", groupName, subGroupName); rv=GWEN_ConfigMgr_GetGroup(xs->configMgr, groupName, subGroupName, &db); if (rv<0) { DBG_ERROR(NULL, "Error reading group \"%s/%s\": %d", groupName, subGroupName, rv); GWEN_ConfigMgr_UnlockGroup(xs->configMgr, groupName, subGroupName); return NULL; } + DBG_ERROR(NULL, "Unlocking group %s/%s", groupName, subGroupName); rv=GWEN_ConfigMgr_UnlockGroup(xs->configMgr, groupName, subGroupName); if (rv<0) { 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; } } + else { + DBG_ERROR(NULL, "Missing argument"); + } 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); if (xs) { - GWEN_DB_NODE *db=NULL; int rv; + DBG_ERROR(NULL, "Locking group %s/%s", groupName, subGroupName); rv=GWEN_ConfigMgr_LockGroup(xs->configMgr, groupName, subGroupName); if (rv<0) { DBG_ERROR(NULL, "Error locking group \"%s/%s\": %d", groupName, subGroupName, rv); return rv; } + DBG_ERROR(NULL, "Writing group %s/%s", groupName, subGroupName); rv=GWEN_ConfigMgr_SetGroup(xs->configMgr, groupName, subGroupName, db); if (rv<0) { DBG_ERROR(NULL, "Error writing group \"%s/%s\": %d", groupName, subGroupName, rv); return rv; } + DBG_ERROR(NULL, "Unlocking group %s/%s", groupName, subGroupName); rv=GWEN_ConfigMgr_UnlockGroup(xs->configMgr, groupName, subGroupName); if (rv<0) { DBG_ERROR(NULL, "Error unlocking group \"%s/%s\": %d", groupName, subGroupName, rv); - GWEN_DB_Group_free(db); 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); if (xs) { - GWEN_DB_NODE *db=NULL; int rv; 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); if (rv<0) { DBG_ERROR(NULL, "Error unlocking group \"%s/%s\": %d", groupName, subGroupName, rv); - GWEN_DB_Group_free(db); 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:"", subGroupName?subGroupName:"", + GWEN_Buffer_GetStart(dbuf)); + GWEN_Buffer_free(dbuf); + } + else { + DBG_ERROR(NULL, "Group %s/%s empty", groupName?groupName:"", subGroupName?subGroupName:""); + } +} +#endif + + +