aqhome-cgi: added some functions for redirection headers. allow vars in static files.
This commit is contained in:
@@ -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/text.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@@ -35,7 +36,6 @@
|
|||||||
#define AQH_MOD_SERVICE_HEADERFILE "header.html"
|
#define AQH_MOD_SERVICE_HEADERFILE "header.html"
|
||||||
#define AQH_MOD_SERVICE_FOOTERFILE "footer.html"
|
#define AQH_MOD_SERVICE_FOOTERFILE "footer.html"
|
||||||
|
|
||||||
|
|
||||||
#define GBAS GWEN_Buffer_AppendString
|
#define GBAS GWEN_Buffer_AppendString
|
||||||
#define GBAA GWEN_Buffer_AppendArgs
|
#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)
|
int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem)
|
||||||
{
|
{
|
||||||
if (m) {
|
if (m) {
|
||||||
@@ -517,11 +545,8 @@ void AQH_ModService_HandleRequestWithTable(AQH_MODULE *m,
|
|||||||
AQCGI_Request_SetResponseText(rq, "Ok");
|
AQCGI_Request_SetResponseText(rq, "Ok");
|
||||||
if ((perms & e[i].perms)==e[i].perms)
|
if ((perms & e[i].perms)==e[i].perms)
|
||||||
(e[i].handlerFn)(m, rq, session, dbuf);
|
(e[i].handlerFn)(m, rq, session, dbuf);
|
||||||
else {
|
else
|
||||||
GWEN_Buffer_AppendString(dbuf, "<h1>Error</h1><p>No permissions for this request.</p>");
|
AQH_ModService_DenyRequest(m, rq, session, dbuf);
|
||||||
AQCGI_Request_SetResponseCode(rq, 403);
|
|
||||||
AQCGI_Request_SetResponseText(rq, "Forbidden");
|
|
||||||
}
|
|
||||||
break;
|
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)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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_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_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
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user