mirror of https://github.com/acanas/swad-core.git
Version 15.168.2
This commit is contained in:
parent
ddc4ad2197
commit
d94944b09c
|
@ -138,14 +138,15 @@
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Log_PLATFORM_VERSION "SWAD 15.168.1 (2016-03-30)"
|
#define Log_PLATFORM_VERSION "SWAD 15.168.2 (2016-03-30)"
|
||||||
#define CSS_FILE "swad15.165.5.css"
|
#define CSS_FILE "swad15.165.5.css"
|
||||||
#define JS_FILE "swad15.131.3.js"
|
#define JS_FILE "swad15.131.3.js"
|
||||||
|
|
||||||
// Number of lines (includes comments but not blank lines) has been got with the following command:
|
// Number of lines (includes comments but not blank lines) has been got with the following command:
|
||||||
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1
|
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1
|
||||||
/*
|
/*
|
||||||
Version 15.168.1: Mar 30, 2016 Fixed bug in list o parameters. (197097 lines)
|
Version 15.168.2: Mar 30, 2016 Code refactoring in list of parameters. (197128 lines)
|
||||||
|
Version 15.168.1: Mar 30, 2016 Fixed bug in list of parameters. (197097 lines)
|
||||||
Version 15.168: Mar 30, 2016 When content is normal, all parameters are retrieved in a list. (197085 lines)
|
Version 15.168: Mar 30, 2016 When content is normal, all parameters are retrieved in a list. (197085 lines)
|
||||||
Version 15.167: Mar 30, 2016 Query string is allocated to the exact needed size to optimize memory. (196998 lines)
|
Version 15.167: Mar 30, 2016 Query string is allocated to the exact needed size to optimize memory. (196998 lines)
|
||||||
Version 15.166.1: Mar 30, 2016 Fixed bug while reading a parameter. (196959 lines)
|
Version 15.166.1: Mar 30, 2016 Fixed bug while reading a parameter. (196959 lines)
|
||||||
|
|
580
swad_parameter.c
580
swad_parameter.c
|
@ -59,7 +59,9 @@ extern struct Globals Gbl;
|
||||||
/***************************** Private prototypes ****************************/
|
/***************************** Private prototypes ****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Par_GetParameters (void);
|
static void Par_CreateListOfParams (void);
|
||||||
|
static void Par_CreateListOfParamsFromQueryString (void);
|
||||||
|
static void Par_CreateListOfParamsFromTmpFile (void);
|
||||||
|
|
||||||
static void Par_ShowErrorReadingParam (const char *ParamName,const char *ExpectedChar,int Ch);
|
static void Par_ShowErrorReadingParam (const char *ParamName,const char *ExpectedChar,int Ch);
|
||||||
|
|
||||||
|
@ -148,10 +150,127 @@ bool Par_GetQueryString (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Gbl.ContentReceivedByCGI == Act_CONTENT_NORM)
|
if (Gbl.ContentReceivedByCGI == Act_CONTENT_NORM)
|
||||||
Par_GetParameters ();
|
Par_CreateListOfParams ();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************ Create list of parameters **************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Par_CreateListOfParams (void)
|
||||||
|
{
|
||||||
|
switch (Gbl.ContentReceivedByCGI)
|
||||||
|
{
|
||||||
|
case Act_CONTENT_NORM:
|
||||||
|
Par_CreateListOfParamsFromQueryString ();
|
||||||
|
break;
|
||||||
|
case Act_CONTENT_DATA:
|
||||||
|
Par_CreateListOfParamsFromTmpFile ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**************** Create list of parameters from query string ****************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
/*
|
||||||
|
+-------------+ +-------------+ +-------------+
|
||||||
|
List -> | Name.Start | --> | Name.Start | --> | Name.Start |
|
||||||
|
+-------------+ / +-------------+ / +-------------+
|
||||||
|
| Name.Length | / | Name.Length | / | Name.Length |
|
||||||
|
+-------------+ / +-------------+ / +-------------+
|
||||||
|
| Value.Start | / | Value.Start | / | Value.Start |
|
||||||
|
+-------------+ / +-------------+ / +-------------+
|
||||||
|
| Value.Lengh | / | Value.Lengh | / | Value.Lengh |
|
||||||
|
+-------------+ / +-------------+ / +-------------+
|
||||||
|
| Next ----- | Next ----- | NULL |
|
||||||
|
+-------------+ +-------------+ +-------------+
|
||||||
|
*/
|
||||||
|
static void Par_CreateListOfParamsFromQueryString (void)
|
||||||
|
{
|
||||||
|
unsigned long CurPos; // Current position in query string
|
||||||
|
struct Param *Param;
|
||||||
|
struct Param *NewParam;
|
||||||
|
|
||||||
|
/***** Check if query string is empty *****/
|
||||||
|
if (Gbl.Params.QueryString == NULL)
|
||||||
|
{
|
||||||
|
Gbl.Params.List = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!Gbl.Params.QueryString[0])
|
||||||
|
{
|
||||||
|
Gbl.Params.List = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Go over the query string
|
||||||
|
getting start positions and lengths of parameters *****/
|
||||||
|
for (CurPos = 0;
|
||||||
|
CurPos < Gbl.Params.ContentLength;
|
||||||
|
)
|
||||||
|
{
|
||||||
|
/* Allocate space for a new parameter */
|
||||||
|
if ((NewParam = (struct Param *) malloc (sizeof (struct Param))) == NULL)
|
||||||
|
Lay_ShowErrorAndExit ("Error allocating memory for parameter");
|
||||||
|
|
||||||
|
/* Link the previous element in list with the current element */
|
||||||
|
if (CurPos == 0)
|
||||||
|
Gbl.Params.List = NewParam;
|
||||||
|
else
|
||||||
|
Param->Next = NewParam;
|
||||||
|
|
||||||
|
/* Make the current element to be the just created */
|
||||||
|
Param = NewParam;
|
||||||
|
Param->Next = NULL;
|
||||||
|
|
||||||
|
/* Get parameter name */
|
||||||
|
Param->Name.Start = CurPos;
|
||||||
|
Param->Name.Length = strcspn (&Gbl.Params.QueryString[CurPos],"=");
|
||||||
|
CurPos += Param->Name.Length;
|
||||||
|
|
||||||
|
/* Get parameter value */
|
||||||
|
if (CurPos < Gbl.Params.ContentLength)
|
||||||
|
{
|
||||||
|
if (Gbl.Params.QueryString[CurPos] == '=')
|
||||||
|
{
|
||||||
|
CurPos++; // Skip '='
|
||||||
|
Param->Value.Start = CurPos;
|
||||||
|
if (CurPos < Gbl.Params.ContentLength)
|
||||||
|
{
|
||||||
|
Param->Value.Length = strcspn (&Gbl.Params.QueryString[CurPos],"&");
|
||||||
|
CurPos += Param->Value.Length;
|
||||||
|
if (CurPos < Gbl.Params.ContentLength)
|
||||||
|
if (Gbl.Params.QueryString[CurPos] == '&')
|
||||||
|
CurPos++; // Skip '&'
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Param->Value.Length = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Param->Value.Start = CurPos;
|
||||||
|
Param->Value.Length = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Param->Value.Start = CurPos;
|
||||||
|
Param->Value.Length = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/*************** Create list of parameters from temporary file ***************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
// TODO: Rename Gbl.F.Tmp to Gbl.F.In (InFile, QueryFile)?
|
||||||
|
|
||||||
|
static void Par_CreateListOfParamsFromTmpFile (void)
|
||||||
|
{
|
||||||
|
// TODO: Implement
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************** Free memory allocated for query string ********************/
|
/***************** Free memory allocated for query string ********************/
|
||||||
|
@ -176,6 +295,190 @@ void Par_FreeParams (void)
|
||||||
free ((void *) Gbl.Params.QueryString);
|
free ((void *) Gbl.Params.QueryString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************* Get the value of a parameter **********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
// Return the number of parameters found
|
||||||
|
|
||||||
|
#define Par_LENGTH_OF_STR_BEFORE_PARAM 38 // Length of "CONTENT-DISPOSITION: FORM-DATA; NAME=\""
|
||||||
|
#define Par_MAX_BYTES_STR_AUX 1024
|
||||||
|
|
||||||
|
unsigned Par_GetParameter (tParamType ParamType,const char *ParamName,
|
||||||
|
char *ParamValue,size_t MaxBytes)
|
||||||
|
{
|
||||||
|
static const char *StringBeforeParam = "Content-Disposition: form-data; name=\"";
|
||||||
|
size_t BytesToCopy;
|
||||||
|
size_t BytesAlreadyCopied = 0;
|
||||||
|
int Ch;
|
||||||
|
unsigned i;
|
||||||
|
struct Param *Param;
|
||||||
|
char *PtrDst;
|
||||||
|
const char *PtrSrc = NULL;
|
||||||
|
int Result;
|
||||||
|
unsigned NumTimes = 0;
|
||||||
|
bool ParamFound = false;
|
||||||
|
bool ContinueSearching = true;
|
||||||
|
unsigned ParamNameLength;
|
||||||
|
char StrAux[Par_MAX_BYTES_STR_AUX+1];
|
||||||
|
|
||||||
|
ParamValue[0] = '\0'; // By default, the value of the parameter will be an empty string
|
||||||
|
ParamNameLength = strlen (ParamName);
|
||||||
|
|
||||||
|
switch (Gbl.ContentReceivedByCGI)
|
||||||
|
{
|
||||||
|
case Act_CONTENT_NORM:
|
||||||
|
if (Gbl.Params.GetMethod) // Only some selected parameters can be passed by GET method
|
||||||
|
{
|
||||||
|
if (strcmp (ParamName,"cty") && // To enter directly to a country
|
||||||
|
strcmp (ParamName,"ins") && // To enter directly to an institution
|
||||||
|
strcmp (ParamName,"ctr") && // To enter directly to a centre
|
||||||
|
strcmp (ParamName,"deg") && // To enter directly to a degree
|
||||||
|
strcmp (ParamName,"crs") && // To enter directly to a course
|
||||||
|
strcmp (ParamName,"CrsCod") && // To enter directly to a course (allowed for compatibility with old links, to be removed in 2016)
|
||||||
|
strcmp (ParamName,"usr") && // To enter directly to a user
|
||||||
|
strcmp (ParamName,"act") && // To execute directly an action (allowed only for fully public actions)
|
||||||
|
strcmp (ParamName,"ses") && // To use an open session when redirecting from one language to another
|
||||||
|
strcmp (ParamName,"key")) // To verify an email address
|
||||||
|
return 0; // Return no-parameters-found when method is GET and parameter name is not one of these
|
||||||
|
}
|
||||||
|
|
||||||
|
PtrDst = ParamValue;
|
||||||
|
Param = Gbl.Params.List;
|
||||||
|
for (NumTimes = 0;
|
||||||
|
NumTimes < 1 || ParamType == Par_PARAM_MULTIPLE;
|
||||||
|
NumTimes++)
|
||||||
|
{
|
||||||
|
for (ParamFound = false;
|
||||||
|
Param != NULL && !ParamFound;
|
||||||
|
Param = Param->Next)
|
||||||
|
if (ParamNameLength == Param->Name.Length)
|
||||||
|
if (!strncmp (ParamName,&Gbl.Params.QueryString[Param->Name.Start],
|
||||||
|
Param->Name.Length))
|
||||||
|
{
|
||||||
|
ParamFound = true;
|
||||||
|
if ((BytesToCopy = Param->Value.Length))
|
||||||
|
PtrSrc = &Gbl.Params.QueryString[Param->Value.Start];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ParamFound)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (NumTimes)
|
||||||
|
{
|
||||||
|
if (BytesAlreadyCopied + 1 > MaxBytes)
|
||||||
|
{
|
||||||
|
sprintf (Gbl.Message,"Multiple parameter <strong>%s</strong> too large,"
|
||||||
|
" it exceed the maximum allowed size (%lu bytes).",
|
||||||
|
ParamName,(unsigned long) MaxBytes);
|
||||||
|
Lay_ShowErrorAndExit (Gbl.Message);
|
||||||
|
}
|
||||||
|
*PtrDst++ = Par_SEPARATOR_PARAM_MULTIPLE; // Separator in the destination string
|
||||||
|
BytesAlreadyCopied++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BytesAlreadyCopied + BytesToCopy > MaxBytes)
|
||||||
|
{
|
||||||
|
sprintf (Gbl.Message,"Parameter <strong>%s</strong> too large,"
|
||||||
|
" it exceed the maximum allowed size (%lu bytes).",
|
||||||
|
ParamName,(unsigned long) MaxBytes);
|
||||||
|
Lay_ShowErrorAndExit (Gbl.Message);
|
||||||
|
}
|
||||||
|
if (BytesToCopy)
|
||||||
|
{
|
||||||
|
strncpy (PtrDst,PtrSrc,BytesToCopy);
|
||||||
|
BytesAlreadyCopied += BytesToCopy;
|
||||||
|
PtrDst += BytesToCopy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*PtrDst = '\0'; // strncpy() does not add the final NULL
|
||||||
|
break;
|
||||||
|
case Act_CONTENT_DATA:
|
||||||
|
rewind (Gbl.F.Tmp);
|
||||||
|
|
||||||
|
while (ContinueSearching)
|
||||||
|
{
|
||||||
|
Result = Str_ReceiveFileUntilDelimitStr (Gbl.F.Tmp,
|
||||||
|
(FILE *) NULL,(char *) NULL,
|
||||||
|
Gbl.DelimiterString,
|
||||||
|
Fil_MAX_FILE_SIZE);
|
||||||
|
switch (Result)
|
||||||
|
{
|
||||||
|
case -1: // Delimiter string not found
|
||||||
|
ContinueSearching = false;
|
||||||
|
break;
|
||||||
|
case 0: // Par_MAX_BYTES_STR_AUX exceeded
|
||||||
|
ContinueSearching = false;
|
||||||
|
break;
|
||||||
|
case 1: // Delimiter string found
|
||||||
|
/* Skip carriage returns, spaces, etc. */
|
||||||
|
do
|
||||||
|
Ch = fgetc (Gbl.F.Tmp);
|
||||||
|
while (isspace (Ch) && Ch != EOF);
|
||||||
|
|
||||||
|
if (Ch == (int) StringBeforeParam[0])
|
||||||
|
{
|
||||||
|
Str_GetNextStrFromFileConvertingToLower (Gbl.F.Tmp,StrAux,Par_LENGTH_OF_STR_BEFORE_PARAM-1);
|
||||||
|
if (!strcasecmp (StrAux,StringBeforeParam+1)) // Start of a parameter
|
||||||
|
{
|
||||||
|
/* Check if parameter is the parameter that we are looking for */
|
||||||
|
Str_GetNextStrFromFileConvertingToLower (Gbl.F.Tmp,StrAux,ParamNameLength);
|
||||||
|
if (!strcasecmp (StrAux,ParamName)) // Parameter found
|
||||||
|
{
|
||||||
|
/* Skip quote after parameter name */
|
||||||
|
Ch = fgetc (Gbl.F.Tmp);
|
||||||
|
if (Ch != (int) '\"')
|
||||||
|
Par_ShowErrorReadingParam (ParamName,""",Ch);
|
||||||
|
|
||||||
|
/* Skip two CR-LF (0x0D 0x0A) */
|
||||||
|
for (i = 0;
|
||||||
|
i < 2;
|
||||||
|
i++)
|
||||||
|
{
|
||||||
|
Ch = fgetc (Gbl.F.Tmp);
|
||||||
|
if (Ch != 0x0D) // '\r'
|
||||||
|
Par_ShowErrorReadingParam (ParamName,"0x0D",Ch);
|
||||||
|
Ch = fgetc (Gbl.F.Tmp);
|
||||||
|
if (Ch != 0x0A) // '\n'
|
||||||
|
Par_ShowErrorReadingParam (ParamName,"0x0A",Ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the parameter */
|
||||||
|
Result = Str_ReceiveFileUntilDelimitStr (Gbl.F.Tmp,
|
||||||
|
(FILE *) NULL,ParamValue,
|
||||||
|
Gbl.DelimiterStringIncludingInitialRet,
|
||||||
|
(unsigned long long) MaxBytes);
|
||||||
|
|
||||||
|
/* Depending on the result... */
|
||||||
|
switch (Result)
|
||||||
|
{
|
||||||
|
case -1: // Delimiter string not found
|
||||||
|
sprintf (Gbl.Message,"Parameter <strong>%s</strong> has not been readed properly.",
|
||||||
|
ParamName);
|
||||||
|
Lay_ShowErrorAndExit (Gbl.Message);
|
||||||
|
break;
|
||||||
|
case 0: // Parameter's too long
|
||||||
|
sprintf (Gbl.Message,"Parameter <strong>%s</strong> exceed the maximum allowed size (%lu bytes).",
|
||||||
|
ParamName,(unsigned long) MaxBytes);
|
||||||
|
Lay_ShowErrorAndExit (Gbl.Message);
|
||||||
|
break;
|
||||||
|
case 1: // Delimiter string and parameter value found
|
||||||
|
ParamFound = true;
|
||||||
|
ContinueSearching = false;
|
||||||
|
NumTimes = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NumTimes;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****************** Get the parameters sent to this CGI **********************/
|
/****************** Get the parameters sent to this CGI **********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -466,279 +769,6 @@ unsigned Par_GetParAndChangeFormat (const char *ParamName,char *ParamValue,size_
|
||||||
return NumTimes;
|
return NumTimes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************************* Get the value of a parameter **********************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
// Return the number of parameters found
|
|
||||||
|
|
||||||
#define Par_LENGTH_OF_STR_BEFORE_PARAM 38 // Length of "CONTENT-DISPOSITION: FORM-DATA; NAME=\""
|
|
||||||
#define Par_MAX_BYTES_STR_AUX 1024
|
|
||||||
|
|
||||||
static void Par_GetParameters (void)
|
|
||||||
{
|
|
||||||
unsigned long i;
|
|
||||||
struct Param *Param;
|
|
||||||
struct Param *NewParam;
|
|
||||||
|
|
||||||
switch (Gbl.ContentReceivedByCGI)
|
|
||||||
{
|
|
||||||
case Act_CONTENT_NORM:
|
|
||||||
if (Gbl.Params.QueryString == NULL)
|
|
||||||
{
|
|
||||||
Gbl.Params.List = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!Gbl.Params.QueryString[0])
|
|
||||||
{
|
|
||||||
Gbl.Params.List = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0;
|
|
||||||
i < Gbl.Params.ContentLength;
|
|
||||||
)
|
|
||||||
{
|
|
||||||
/* Allocate space for parameter */
|
|
||||||
if ((NewParam = (struct Param *) malloc (sizeof (struct Param))) == NULL)
|
|
||||||
Lay_ShowErrorAndExit ("Error allocating memory for parameter");
|
|
||||||
|
|
||||||
/* Point last element in list to this */
|
|
||||||
if (i == 0)
|
|
||||||
Gbl.Params.List = NewParam;
|
|
||||||
else
|
|
||||||
Param->Next = NewParam;
|
|
||||||
|
|
||||||
/* Point current element to the new just created */
|
|
||||||
Param = NewParam;
|
|
||||||
Param->Next = NULL;
|
|
||||||
|
|
||||||
/* Get parameter name */
|
|
||||||
Param->Name.Start = i;
|
|
||||||
Param->Name.Length = strcspn (&Gbl.Params.QueryString[i],"=");
|
|
||||||
|
|
||||||
/* Get parameter value */
|
|
||||||
i += Param->Name.Length;
|
|
||||||
if (i < Gbl.Params.ContentLength)
|
|
||||||
{
|
|
||||||
if (Gbl.Params.QueryString[i] == '=')
|
|
||||||
{
|
|
||||||
i++; // Skip '='
|
|
||||||
Param->Value.Start = i;
|
|
||||||
if (i < Gbl.Params.ContentLength)
|
|
||||||
{
|
|
||||||
Param->Value.Length = strcspn (&Gbl.Params.QueryString[i],"&");
|
|
||||||
i += Param->Value.Length;
|
|
||||||
if (i < Gbl.Params.ContentLength)
|
|
||||||
if (Gbl.Params.QueryString[i] == '&')
|
|
||||||
i++; // Skip '&'
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Param->Value.Length = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Param->Value.Start = i;
|
|
||||||
Param->Value.Length = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Param->Value.Start = i;
|
|
||||||
Param->Value.Length = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Act_CONTENT_DATA:
|
|
||||||
// TODO: Implement
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************************* Get the value of a parameter **********************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
// Return the number of parameters found
|
|
||||||
|
|
||||||
#define Par_LENGTH_OF_STR_BEFORE_PARAM 38 // Length of "CONTENT-DISPOSITION: FORM-DATA; NAME=\""
|
|
||||||
#define Par_MAX_BYTES_STR_AUX 1024
|
|
||||||
|
|
||||||
unsigned Par_GetParameter (tParamType ParamType,const char *ParamName,
|
|
||||||
char *ParamValue,size_t MaxBytes)
|
|
||||||
{
|
|
||||||
static const char *StringBeforeParam = "Content-Disposition: form-data; name=\"";
|
|
||||||
size_t BytesToCopy;
|
|
||||||
size_t BytesAlreadyCopied = 0;
|
|
||||||
int Ch;
|
|
||||||
unsigned i;
|
|
||||||
struct Param *Param;
|
|
||||||
char *PtrDst;
|
|
||||||
const char *PtrSrc = NULL;
|
|
||||||
int Result;
|
|
||||||
unsigned NumTimes = 0;
|
|
||||||
bool ParamFound = false;
|
|
||||||
bool ContinueSearching = true;
|
|
||||||
unsigned ParamNameLength;
|
|
||||||
char StrAux[Par_MAX_BYTES_STR_AUX+1];
|
|
||||||
|
|
||||||
ParamValue[0] = '\0'; // By default, the value of the parameter will be an empty string
|
|
||||||
ParamNameLength = strlen (ParamName);
|
|
||||||
|
|
||||||
switch (Gbl.ContentReceivedByCGI)
|
|
||||||
{
|
|
||||||
case Act_CONTENT_NORM:
|
|
||||||
if (Gbl.Params.GetMethod) // Only some selected parameters can be passed by GET method
|
|
||||||
{
|
|
||||||
if (strcmp (ParamName,"cty") && // To enter directly to a country
|
|
||||||
strcmp (ParamName,"ins") && // To enter directly to an institution
|
|
||||||
strcmp (ParamName,"ctr") && // To enter directly to a centre
|
|
||||||
strcmp (ParamName,"deg") && // To enter directly to a degree
|
|
||||||
strcmp (ParamName,"crs") && // To enter directly to a course
|
|
||||||
strcmp (ParamName,"CrsCod") && // To enter directly to a course (allowed for compatibility with old links, to be removed in 2016)
|
|
||||||
strcmp (ParamName,"usr") && // To enter directly to a user
|
|
||||||
strcmp (ParamName,"act") && // To execute directly an action (allowed only for fully public actions)
|
|
||||||
strcmp (ParamName,"ses") && // To use an open session when redirecting from one language to another
|
|
||||||
strcmp (ParamName,"key")) // To verify an email address
|
|
||||||
return 0; // Return no-parameters-found when method is GET and parameter name is not one of these
|
|
||||||
}
|
|
||||||
|
|
||||||
PtrDst = ParamValue;
|
|
||||||
Param = Gbl.Params.List;
|
|
||||||
for (NumTimes = 0;
|
|
||||||
NumTimes < 1 || ParamType == Par_PARAM_MULTIPLE;
|
|
||||||
NumTimes++)
|
|
||||||
{
|
|
||||||
for (ParamFound = false;
|
|
||||||
Param != NULL && !ParamFound;
|
|
||||||
Param = Param->Next)
|
|
||||||
if (ParamNameLength == Param->Name.Length)
|
|
||||||
if (!strncmp (ParamName,&Gbl.Params.QueryString[Param->Name.Start],
|
|
||||||
Param->Name.Length))
|
|
||||||
{
|
|
||||||
ParamFound = true;
|
|
||||||
if ((BytesToCopy = Param->Value.Length))
|
|
||||||
PtrSrc = &Gbl.Params.QueryString[Param->Value.Start];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ParamFound)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (NumTimes)
|
|
||||||
{
|
|
||||||
if (BytesAlreadyCopied + 1 > MaxBytes)
|
|
||||||
{
|
|
||||||
sprintf (Gbl.Message,"Multiple parameter <strong>%s</strong> too large,"
|
|
||||||
" it exceed the maximum allowed size (%lu bytes).",
|
|
||||||
ParamName,(unsigned long) MaxBytes);
|
|
||||||
Lay_ShowErrorAndExit (Gbl.Message);
|
|
||||||
}
|
|
||||||
*PtrDst++ = Par_SEPARATOR_PARAM_MULTIPLE; // Separator in the destination string
|
|
||||||
BytesAlreadyCopied++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BytesAlreadyCopied + BytesToCopy > MaxBytes)
|
|
||||||
{
|
|
||||||
sprintf (Gbl.Message,"Parameter <strong>%s</strong> too large,"
|
|
||||||
" it exceed the maximum allowed size (%lu bytes).",
|
|
||||||
ParamName,(unsigned long) MaxBytes);
|
|
||||||
Lay_ShowErrorAndExit (Gbl.Message);
|
|
||||||
}
|
|
||||||
if (BytesToCopy)
|
|
||||||
{
|
|
||||||
strncpy (PtrDst,PtrSrc,BytesToCopy);
|
|
||||||
BytesAlreadyCopied += BytesToCopy;
|
|
||||||
PtrDst += BytesToCopy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*PtrDst = '\0'; // strncpy() does not add the final NULL
|
|
||||||
break;
|
|
||||||
case Act_CONTENT_DATA:
|
|
||||||
rewind (Gbl.F.Tmp);
|
|
||||||
|
|
||||||
while (ContinueSearching)
|
|
||||||
{
|
|
||||||
Result = Str_ReceiveFileUntilDelimitStr (Gbl.F.Tmp,
|
|
||||||
(FILE *) NULL,(char *) NULL,
|
|
||||||
Gbl.DelimiterString,
|
|
||||||
Fil_MAX_FILE_SIZE);
|
|
||||||
switch (Result)
|
|
||||||
{
|
|
||||||
case -1: // Delimiter string not found
|
|
||||||
ContinueSearching = false;
|
|
||||||
break;
|
|
||||||
case 0: // Par_MAX_BYTES_STR_AUX exceeded
|
|
||||||
ContinueSearching = false;
|
|
||||||
break;
|
|
||||||
case 1: // Delimiter string found
|
|
||||||
/* Skip carriage returns, spaces, etc. */
|
|
||||||
do
|
|
||||||
Ch = fgetc (Gbl.F.Tmp);
|
|
||||||
while (isspace (Ch) && Ch != EOF);
|
|
||||||
|
|
||||||
if (Ch == (int) StringBeforeParam[0])
|
|
||||||
{
|
|
||||||
Str_GetNextStrFromFileConvertingToLower (Gbl.F.Tmp,StrAux,Par_LENGTH_OF_STR_BEFORE_PARAM-1);
|
|
||||||
if (!strcasecmp (StrAux,StringBeforeParam+1)) // Start of a parameter
|
|
||||||
{
|
|
||||||
/* Check if parameter is the parameter that we are looking for */
|
|
||||||
Str_GetNextStrFromFileConvertingToLower (Gbl.F.Tmp,StrAux,ParamNameLength);
|
|
||||||
if (!strcasecmp (StrAux,ParamName)) // Parameter found
|
|
||||||
{
|
|
||||||
/* Skip quote after parameter name */
|
|
||||||
Ch = fgetc (Gbl.F.Tmp);
|
|
||||||
if (Ch != (int) '\"')
|
|
||||||
Par_ShowErrorReadingParam (ParamName,""",Ch);
|
|
||||||
|
|
||||||
/* Skip two CR-LF (0x0D 0x0A) */
|
|
||||||
for (i = 0;
|
|
||||||
i < 2;
|
|
||||||
i++)
|
|
||||||
{
|
|
||||||
Ch = fgetc (Gbl.F.Tmp);
|
|
||||||
if (Ch != 0x0D) // '\r'
|
|
||||||
Par_ShowErrorReadingParam (ParamName,"0x0D",Ch);
|
|
||||||
Ch = fgetc (Gbl.F.Tmp);
|
|
||||||
if (Ch != 0x0A) // '\n'
|
|
||||||
Par_ShowErrorReadingParam (ParamName,"0x0A",Ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the parameter */
|
|
||||||
Result = Str_ReceiveFileUntilDelimitStr (Gbl.F.Tmp,
|
|
||||||
(FILE *) NULL,ParamValue,
|
|
||||||
Gbl.DelimiterStringIncludingInitialRet,
|
|
||||||
(unsigned long long) MaxBytes);
|
|
||||||
|
|
||||||
/* Depending on the result... */
|
|
||||||
switch (Result)
|
|
||||||
{
|
|
||||||
case -1: // Delimiter string not found
|
|
||||||
sprintf (Gbl.Message,"Parameter <strong>%s</strong> has not been readed properly.",
|
|
||||||
ParamName);
|
|
||||||
Lay_ShowErrorAndExit (Gbl.Message);
|
|
||||||
break;
|
|
||||||
case 0: // Parameter's too long
|
|
||||||
sprintf (Gbl.Message,"Parameter <strong>%s</strong> exceed the maximum allowed size (%lu bytes).",
|
|
||||||
ParamName,(unsigned long) MaxBytes);
|
|
||||||
Lay_ShowErrorAndExit (Gbl.Message);
|
|
||||||
break;
|
|
||||||
case 1: // Delimiter string and parameter value found
|
|
||||||
ParamFound = true;
|
|
||||||
ContinueSearching = false;
|
|
||||||
NumTimes = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NumTimes;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********************** Write error reading parameter ************************/
|
/********************** Write error reading parameter ************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -60,6 +60,9 @@ typedef enum
|
||||||
|
|
||||||
bool Par_GetQueryString (void);
|
bool Par_GetQueryString (void);
|
||||||
void Par_FreeParams (void);
|
void Par_FreeParams (void);
|
||||||
|
unsigned Par_GetParameter (tParamType ParamType,const char *ParamName,
|
||||||
|
char *ParamValue,size_t MaxBytes);
|
||||||
|
|
||||||
void Par_GetMainParameters (void);
|
void Par_GetMainParameters (void);
|
||||||
|
|
||||||
unsigned Par_GetParToText (const char *ParamName,char *ParamValue,size_t MaxBytes);
|
unsigned Par_GetParToText (const char *ParamName,char *ParamValue,size_t MaxBytes);
|
||||||
|
@ -67,8 +70,6 @@ unsigned Par_GetParToHTML (const char *ParamName,char *ParamValue,size_t MaxByte
|
||||||
unsigned Par_GetParMultiToText (const char *ParamName,char *ParamValue,size_t MaxBytes);
|
unsigned Par_GetParMultiToText (const char *ParamName,char *ParamValue,size_t MaxBytes);
|
||||||
unsigned Par_GetParAndChangeFormat (const char *ParamName,char *ParamValue,size_t MaxBytes,
|
unsigned Par_GetParAndChangeFormat (const char *ParamName,char *ParamValue,size_t MaxBytes,
|
||||||
Str_ChangeTo_t ChangeTo,bool RemoveLeadingAndTrailingSpaces);
|
Str_ChangeTo_t ChangeTo,bool RemoveLeadingAndTrailingSpaces);
|
||||||
unsigned Par_GetParameter (tParamType ParamType,const char *ParamName,
|
|
||||||
char *ParamValue,size_t MaxBytes);
|
|
||||||
|
|
||||||
bool Par_GetNextStrUntilSeparParamMult (const char **StrSrc,char *StrDst,size_t LongMax);
|
bool Par_GetNextStrUntilSeparParamMult (const char **StrSrc,char *StrDst,size_t LongMax);
|
||||||
void Par_ReplaceSeparatorMultipleByComma (const char *StrSrc,char *StrDst);
|
void Par_ReplaceSeparatorMultipleByComma (const char *StrSrc,char *StrDst);
|
||||||
|
|
Loading…
Reference in New Issue