Fix jet cgi=yes CGI variable loading and related bugs
- __jet.cpp: the cgi keyword check compared against "true" but the
documented/intended value is "yes", so <jet cgi="yes" ...> never
actually turned CGI mode on; fixed. Also replaced the hardcoded
fake multipart boundary ("xxxx") with real extraction from the
Content-Type header's boundary= parameter.
- Global.h: default-initialize cgiData to NULL (a GET request with
cgi="yes" never allocates it, so it was previously left
dangling); Global.cpp now sets the cookie jar's delimiter to ";"
to match RFC 6265, since it defaulted to CGIFormattedData's
&-based form-data delimiter.
- Global.cpp: fix addSession()'s missing throw that let it silently
continue past a duplicate session id.
- Tag.cpp: fix the CGI-variable lookup branch, which failed to
compile (cgiData is a pointer; needed to dereference it before
indexing) and added a null check so a CGI request that never
populated cgiData (bad Content-Type, or the null-safety gap
above) throws a clear error instead of crashing; implemented the
previously-empty session-variable lookup branch; left the
unreachable duplicate environment-variable branch as-is with a
comment, since fixing its sigil is a user-facing template-syntax
decision, not a bug fix.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d0f2551e89
commit
2d9505cd33
4 files changed
+23
-7
No files matched your search
+2
-2
@@ -7,7 +7,7 @@
|
|||||||
namespace jet {
|
namespace jet {
|
||||||
|
|
||||||
Global::Global(char **envp) : envp(envp) {
|
Global::Global(char **envp) : envp(envp) {
|
||||||
|
cookies.setDelimiter(";");
|
||||||
}
|
}
|
||||||
|
|
||||||
Global::~Global() {
|
Global::~Global() {
|
||||||
@@ -25,7 +25,7 @@ namespace jet {
|
|||||||
|
|
||||||
void Global::addSession(coreutils::MString sessionId, __mysql *mysql) {
|
void Global::addSession(coreutils::MString sessionId, __mysql *mysql) {
|
||||||
if(sessionExists(sessionId))
|
if(sessionExists(sessionId))
|
||||||
coreutils::Exception("sessionid already exists.");
|
throw coreutils::Exception("sessionid already exists.");
|
||||||
sessions[sessionId] = mysql;
|
sessions[sessionId] = mysql;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace jet {
|
|||||||
char *errorCursor = NULL;
|
char *errorCursor = NULL;
|
||||||
|
|
||||||
coreutils::CGIFormattedData cookies;
|
coreutils::CGIFormattedData cookies;
|
||||||
coreutils::CGIFormData *cgiData;
|
coreutils::CGIFormData *cgiData = NULL;
|
||||||
std::map<coreutils::MString, coreutils::MString> variables;
|
std::map<coreutils::MString, coreutils::MString> variables;
|
||||||
std::map<coreutils::MString, __mysql *> sessions;
|
std::map<coreutils::MString, __mysql *> sessions;
|
||||||
std::map<coreutils::MString, coreutils::MString> headers;
|
std::map<coreutils::MString, coreutils::MString> headers;
|
||||||
|
|||||||
@@ -412,12 +412,24 @@ namespace jet {
|
|||||||
if(name.find(":") == -1) {
|
if(name.find(":") == -1) {
|
||||||
name << ":0";
|
name << ":0";
|
||||||
}
|
}
|
||||||
return processModifier(global.cgiData[name], modifier);
|
if(global.cgiData == NULL)
|
||||||
|
throw coreutils::Exception("cgi variable requested but no request body was available (not a POST, or an unrecognized Content-Type).");
|
||||||
|
coreutils::MString cgiValue = (*global.cgiData)[name];
|
||||||
|
return processModifier(cgiValue, modifier);
|
||||||
} else
|
} else
|
||||||
throw coreutils::Exception("cgi variable only allowed in cgi mode.");
|
throw coreutils::Exception("cgi variable only allowed in cgi mode.");
|
||||||
} else if(variable.ifNext("@")) {
|
} else if(variable.ifNext("@")) {
|
||||||
// TODO: should only allow session variables. Allow substitution.
|
renderVariableName(variable, name, modifier);
|
||||||
|
coreutils::MString sessionValue = global.getSession(global.sessionId)->getColumnValue(name);
|
||||||
|
return processModifier(sessionValue, modifier);
|
||||||
} else if(variable.ifNext("%")) {
|
} else if(variable.ifNext("%")) {
|
||||||
|
// NOTE: unreachable - '%' is already claimed by the keyword-lookup branch
|
||||||
|
// above (variable.ifNext("%") at the top of this chain), so this branch
|
||||||
|
// can never be entered. This looks like a copy-paste where the intended
|
||||||
|
// sigil character for environment-variable access was meant to be
|
||||||
|
// something else. Left as-is rather than guessing a new template-syntax
|
||||||
|
// character unilaterally - confirm the intended sigil before wiring this
|
||||||
|
// branch up to a reachable condition.
|
||||||
renderVariableName(variable, name, modifier);
|
renderVariableName(variable, name, modifier);
|
||||||
return getenv(name.c_str());
|
return getenv(name.c_str());
|
||||||
} else if(variable.ifNext("^")) {
|
} else if(variable.ifNext("^")) {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ namespace jet {
|
|||||||
|
|
||||||
__jet::__jet(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this) {
|
__jet::__jet(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this) {
|
||||||
char *cookies;
|
char *cookies;
|
||||||
if(keywordDefined("cgi") && (resolveKeyword("cgi") == "true")) {
|
if(keywordDefined("cgi") && (resolveKeyword("cgi") == "yes")) {
|
||||||
global.cgi = true;
|
global.cgi = true;
|
||||||
|
|
||||||
if(keywordDefined("sessiondir")) {
|
if(keywordDefined("sessiondir")) {
|
||||||
@@ -35,7 +35,11 @@ namespace jet {
|
|||||||
if(requestMethod == "POST") {
|
if(requestMethod == "POST") {
|
||||||
coreutils::ZString contentLength(getenv("CONTENT_LENGTH"));
|
coreutils::ZString contentLength(getenv("CONTENT_LENGTH"));
|
||||||
coreutils::ZString contentType(getenv("CONTENT_TYPE"));
|
coreutils::ZString contentType(getenv("CONTENT_TYPE"));
|
||||||
ZString boundary = "xxxx";
|
coreutils::ZString boundary;
|
||||||
|
int boundaryPos = contentType.find("boundary=");
|
||||||
|
if(boundaryPos != -1) {
|
||||||
|
boundary = contentType.substring(boundaryPos + 9);
|
||||||
|
}
|
||||||
|
|
||||||
global.cgiData = new coreutils::CGIFormData(0, contentType, contentLength.asInteger(), boundary);
|
global.cgiData = new coreutils::CGIFormData(0, contentType, contentLength.asInteger(), boundary);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user