From 03db148a3bea6cb8e138848326a5d46d0872f076 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Fri, 29 May 2026 17:21:11 +0200 Subject: [PATCH] aqhome-cgi: added some functions for redirection headers. allow vars in static files. --- apps/aqhome-cgi/modules/common/mservice.c | 115 ++++++++++++++++++++-- apps/aqhome-cgi/modules/common/mservice.h | 10 ++ 2 files changed, 119 insertions(+), 6 deletions(-) diff --git a/apps/aqhome-cgi/modules/common/mservice.c b/apps/aqhome-cgi/modules/common/mservice.c index f3923e0..47a3132 100644 --- a/apps/aqhome-cgi/modules/common/mservice.c +++ b/apps/aqhome-cgi/modules/common/mservice.c @@ -16,6 +16,7 @@ #include "aqhome-cgi/service/module.h" #include +#include #include #include @@ -35,7 +36,6 @@ #define AQH_MOD_SERVICE_HEADERFILE "header.html" #define AQH_MOD_SERVICE_FOOTERFILE "footer.html" - #define GBAS GWEN_Buffer_AppendString #define GBAA GWEN_Buffer_AppendArgs @@ -256,6 +256,34 @@ int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char +int AQH_ModService_RespondWithVarFile(AQH_MODULE *m, AQCGI_REQUEST *rq, + const char *lang, + const char *sFilename, + GWEN_DB_NODE *dbVars, + GWEN_BUFFER *dbuf) +{ + int rv; + GWEN_BUFFER *fbuf; + + fbuf=GWEN_Buffer_new(0, 256, 0, 1); + rv=AQH_ModService_ReadStaticFile(m, lang, sFilename, fbuf); + if (rv<0) { + AQCGI_Request_SetResponseCode(rq, 500); + AQCGI_Request_SetResponseText(rq, "Internal Error"); + GWEN_Buffer_free(fbuf); + return GWEN_ERROR_INTERNAL; + } + else { + GWEN_DB_ReplaceVars(dbVars, GWEN_Buffer_GetStart(fbuf), dbuf); + AQCGI_Request_SetResponseCode(rq, 200); + AQCGI_Request_SetResponseText(rq, "Ok"); + GWEN_Buffer_free(fbuf); + return 0; + } +} + + + int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem) { if (m) { @@ -517,11 +545,8 @@ void AQH_ModService_HandleRequestWithTable(AQH_MODULE *m, AQCGI_Request_SetResponseText(rq, "Ok"); if ((perms & e[i].perms)==e[i].perms) (e[i].handlerFn)(m, rq, session, dbuf); - else { - GWEN_Buffer_AppendString(dbuf, "

Error

No permissions for this request.

"); - AQCGI_Request_SetResponseCode(rq, 403); - AQCGI_Request_SetResponseText(rq, "Forbidden"); - } + else + AQH_ModService_DenyRequest(m, rq, session, dbuf); break; } } @@ -818,3 +843,81 @@ int AQH_ModService_RespondWithMimeFile(AQCGI_REQUEST *rq, const char *sFilename, +int AQH_ModService_AddRequestUrl(const AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf) +{ + GWEN_DB_NODE *dbRequest; + + dbRequest=AQCGI_Request_GetDbRequestHeader(rq); + if (dbRequest) { + const char *s; + + GWEN_Buffer_AppendArgs(dbuf, + "%s%s", + GWEN_DB_GetCharValue(dbRequest, "SCRIPT_NAME", 0, ""), + GWEN_DB_GetCharValue(dbRequest, "PATH_INFO", 0, "")); + s=GWEN_DB_GetCharValue(dbRequest, "QUERY_STRING", 0, NULL); + if (s && *s) + GWEN_Buffer_AppendArgs(dbuf, "?%s", s); + return 1; + } + return 0; +} + + + +void AQH_ModService_Redirect(AQCGI_REQUEST *rq, const char *destLocation) +{ + GWEN_BUFFER *dbuf; + + dbuf=GWEN_Buffer_new(0, 128, 0, 1); + AQCGI_Request_SetResponseCode(rq, 303); + AQCGI_Request_SetResponseText(rq, "See other"); + GWEN_Buffer_AppendArgs(dbuf, "Location: %s", destLocation); + AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(dbuf)); + GWEN_Buffer_free(dbuf); +} + + + +void AQH_ModService_RedirectWithReferer(AQCGI_REQUEST *rq, const char *destLocation) +{ + GWEN_BUFFER *dbuf; + GWEN_BUFFER *ubuf; + + dbuf=GWEN_Buffer_new(0, 128, 0, 1); + GWEN_Buffer_AppendArgs(dbuf, "Location: %s", destLocation); + + ubuf=GWEN_Buffer_new(0, 128, 0, 1); + if (AQH_ModService_AddRequestUrl(rq, ubuf)) { + DBG_ERROR(NULL, "Adding header: [%s]", GWEN_Buffer_GetStart(ubuf)); + GWEN_Buffer_AppendString(dbuf, "?src="); + GWEN_Text_EscapeToBuffer(GWEN_Buffer_GetStart(ubuf), dbuf); + } + GWEN_Buffer_free(ubuf); + + AQCGI_Request_SetResponseCode(rq, 303); + AQCGI_Request_SetResponseText(rq, "See other"); + AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(dbuf)); + GWEN_Buffer_free(dbuf); +} + + + +void AQH_ModService_DenyRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const AQH_SESSION *session, GWEN_BUFFER *dbuf) +{ + if (session && AQH_Session_GetUser(session)) { + /* no permissions */ + AQCGI_Request_SetResponseCode(rq, 403); + AQCGI_Request_SetResponseText(rq, "Forbidden"); + if (dbuf) + GWEN_Buffer_AppendString(dbuf, "

Error

No permissions for this request.

"); + } + else { + /* need login */ + AQH_ModService_RedirectWithReferer(rq, AQH_Service_GetLoginUrl(AQH_ModService_GetService(m))); + } +} + + + + diff --git a/apps/aqhome-cgi/modules/common/mservice.h b/apps/aqhome-cgi/modules/common/mservice.h index 32ce803..af8dea6 100644 --- a/apps/aqhome-cgi/modules/common/mservice.h +++ b/apps/aqhome-cgi/modules/common/mservice.h @@ -86,6 +86,16 @@ void AQH_ModService_UnescapeToBuffer(const char *src, GWEN_BUFFER *buf); int AQH_ModService_FileIsCurrent(const char *sPath, int seconds); int AQH_ModService_RespondWithMimeFile(AQCGI_REQUEST *rq, const char *sFilename, const char *sMimeType, GWEN_BUFFER *dbuf); +int AQH_ModService_RespondWithVarFile(AQH_MODULE *m, AQCGI_REQUEST *rq, + const char *lang, + const char *sFilename, + GWEN_DB_NODE *dbVars, + GWEN_BUFFER *dbuf); + +int AQH_ModService_AddRequestUrl(const AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf); +void AQH_ModService_Redirect(AQCGI_REQUEST *rq, const char *destLocation); +void AQH_ModService_RedirectWithReferer(AQCGI_REQUEST *rq, const char *destLocation); +void AQH_ModService_DenyRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const AQH_SESSION *session, GWEN_BUFFER *dbuf); #endif