aqhome-cgi: added some functions for redirection headers. allow vars in static files.

This commit is contained in:
Martin Preuss
2026-05-29 17:21:11 +02:00
parent 5bb50d4187
commit 03db148a3b
2 changed files with 119 additions and 6 deletions

View File

@@ -16,6 +16,7 @@
#include "aqhome-cgi/service/module.h"
#include <gwenhywfar/debug.h>
#include <gwenhywfar/text.h>
#include <string.h>
#include <ctype.h>
@@ -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, "<h1>Error</h1><p>No permissions for this request.</p>");
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, "<h1>Error</h1><p>No permissions for this request.</p>");
}
else {
/* need login */
AQH_ModService_RedirectWithReferer(rq, AQH_Service_GetLoginUrl(AQH_ModService_GetService(m)));
}
}

View File

@@ -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