Version 22.50.7: Oct 20, 2022 Code refactoring in files.

This commit is contained in:
acanas 2022-10-21 12:11:50 +02:00
parent 611668070c
commit 96ecc72a50
23 changed files with 162 additions and 156 deletions

View File

@ -292,9 +292,11 @@ static int API_GetTstQuestionTags (struct soap *soap,
static void API_GetListGrpsInMatchFromDB (struct soap *soap, static void API_GetListGrpsInMatchFromDB (struct soap *soap,
long MchCod,char **ListGroups); long MchCod,char **ListGroups);
static void API_ListDir (unsigned Level,const char *Path,const char *PathInTree); static void API_ListDir (FILE *XML,unsigned Level,const char *Path,const char *PathInTree);
static bool API_WriteRowFileBrowser (unsigned Level,Brw_FileType_t FileType,const char *FileName); static bool API_WriteRowFileBrowser (FILE *XML,unsigned Level,
static void API_IndentXMLLine (unsigned Level); Brw_FileType_t FileType,
const char *FileName);
static void API_IndentXMLLine (FILE *XML,unsigned Level);
static void API_GetDataOfLocation (struct soap *soap, static void API_GetDataOfLocation (struct soap *soap,
struct swad__location *location, struct swad__location *location,
@ -4598,6 +4600,7 @@ int swad__getDirectoryTree (struct soap *soap,
extern const char *Brw_RootFolderInternalNames[Brw_NUM_TYPES_FILE_BROWSER]; extern const char *Brw_RootFolderInternalNames[Brw_NUM_TYPES_FILE_BROWSER];
int ReturnCode; int ReturnCode;
char XMLFileName[PATH_MAX + 1]; char XMLFileName[PATH_MAX + 1];
FILE *XML;
unsigned long FileSize; unsigned long FileSize;
unsigned long NumBytesRead; unsigned long NumBytesRead;
@ -4708,30 +4711,32 @@ int swad__getDirectoryTree (struct soap *soap,
Cfg_PATH_OUT_PRIVATE,Cry_GetUniqueNameEncrypted ()); Cfg_PATH_OUT_PRIVATE,Cry_GetUniqueNameEncrypted ());
/* Open file for writing and reading */ /* Open file for writing and reading */
if ((Gbl.F.XML = fopen (XMLFileName,"w+t")) == NULL) if ((XML = fopen (XMLFileName,"w+t")) == NULL)
return soap_receiver_fault (soap, return soap_receiver_fault (soap,
"Can not get tree", "Can not get tree",
"Can not create temporary XML file"); "Can not create temporary XML file");
/* Get directory tree into XML file */ /* Get directory tree into XML file */
XML_WriteStartFile (Gbl.F.XML,"tree",false); XML_WriteStartFile (XML,"tree",false);
if (!Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_IS_FOLDER, if (!Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_IS_FOLDER,
Gbl.FileBrowser.FilFolLnk.Full)) // If root folder is visible Gbl.FileBrowser.FilFolLnk.Full)) // If root folder is visible
API_ListDir (1,Gbl.FileBrowser.Priv.PathRootFolder,Brw_RootFolderInternalNames[Gbl.FileBrowser.Type]); API_ListDir (XML,1,
XML_WriteEndFile (Gbl.F.XML,"tree"); Gbl.FileBrowser.Priv.PathRootFolder,
Brw_RootFolderInternalNames[Gbl.FileBrowser.Type]);
XML_WriteEndFile (XML,"tree");
/* Compute file size */ /* Compute file size */
// fseek (Gbl.F.XML,0L,SEEK_END); // fseek (XML,0L,SEEK_END);
FileSize = (unsigned long) ftell (Gbl.F.XML); FileSize = (unsigned long) ftell (XML);
fseek (Gbl.F.XML,0L,SEEK_SET); fseek (XML,0L,SEEK_SET);
/* Copy XML content from file to memory */ /* Copy XML content from file to memory */
getDirectoryTreeOut->tree = soap_malloc (soap,FileSize + 1); getDirectoryTreeOut->tree = soap_malloc (soap,FileSize + 1);
NumBytesRead = fread (getDirectoryTreeOut->tree,1,FileSize,Gbl.F.XML); NumBytesRead = fread (getDirectoryTreeOut->tree,1,FileSize,XML);
getDirectoryTreeOut->tree[NumBytesRead] = '\0'; getDirectoryTreeOut->tree[NumBytesRead] = '\0';
/* Close and remove XML file */ /* Close and remove XML file */
Fil_CloseXMLFile (); fclose (XML);
unlink (XMLFileName); unlink (XMLFileName);
return SOAP_OK; return SOAP_OK;
@ -4741,7 +4746,8 @@ int swad__getDirectoryTree (struct soap *soap,
/************************ List a directory recursively ***********************/ /************************ List a directory recursively ***********************/
/*****************************************************************************/ /*****************************************************************************/
static void API_ListDir (unsigned Level,const char *Path,const char *PathInTree) static void API_ListDir (FILE *XML,unsigned Level,
const char *Path,const char *PathInTree)
{ {
extern const char *Txt_NEW_LINE; extern const char *Txt_NEW_LINE;
struct dirent **FileList; struct dirent **FileList;
@ -4780,18 +4786,21 @@ static void API_ListDir (unsigned Level,const char *Path,const char *PathInTree)
if (S_ISDIR (FileStatus.st_mode)) // It's a directory if (S_ISDIR (FileStatus.st_mode)) // It's a directory
{ {
/***** Write a row for the subdirectory *****/ /***** Write a row for the subdirectory *****/
if (API_WriteRowFileBrowser (Level,Brw_IS_FOLDER,FileList[NumFile]->d_name)) if (API_WriteRowFileBrowser (XML,Level,
Brw_IS_FOLDER,
FileList[NumFile]->d_name))
{ {
/* List subtree starting at this this directory */ /* List subtree starting at this this directory */
API_ListDir (Level + 1,PathFileRel,PathFileInExplTree); API_ListDir (XML,Level + 1,
PathFileRel,PathFileInExplTree);
/* Indent and end dir */ /* Indent and end dir */
API_IndentXMLLine (Level); API_IndentXMLLine (XML,Level);
fprintf (Gbl.F.XML,"</dir>%s",Txt_NEW_LINE); fprintf (XML,"</dir>%s",Txt_NEW_LINE);
} }
} }
else if (S_ISREG (FileStatus.st_mode)) // It's a regular file else if (S_ISREG (FileStatus.st_mode)) // It's a regular file
API_WriteRowFileBrowser (Level, API_WriteRowFileBrowser (XML,Level,
Str_FileIs (FileList[NumFile]->d_name,"url") ? Brw_IS_LINK : Str_FileIs (FileList[NumFile]->d_name,"url") ? Brw_IS_LINK :
Brw_IS_FILE, Brw_IS_FILE,
FileList[NumFile]->d_name); FileList[NumFile]->d_name);
@ -4811,7 +4820,9 @@ static void API_ListDir (unsigned Level,const char *Path,const char *PathInTree)
// If it is not the first row, it is shown or not depending on whether it is hidden or not // If it is not the first row, it is shown or not depending on whether it is hidden or not
// If the row is visible, return true. If it is hidden, return false // If the row is visible, return true. If it is hidden, return false
static bool API_WriteRowFileBrowser (unsigned Level,Brw_FileType_t FileType,const char *FileName) static bool API_WriteRowFileBrowser (FILE *XML,unsigned Level,
Brw_FileType_t FileType,
const char *FileName)
{ {
extern const char *Txt_NEW_LINE; extern const char *Txt_NEW_LINE;
extern const char *Txt_LICENSES[Brw_NUM_LICENSES]; extern const char *Txt_LICENSES[Brw_NUM_LICENSES];
@ -4827,11 +4838,11 @@ static bool API_WriteRowFileBrowser (unsigned Level,Brw_FileType_t FileType,cons
/***** XML row *****/ /***** XML row *****/
/* Indent */ /* Indent */
API_IndentXMLLine (Level); API_IndentXMLLine (XML,Level);
/* Write file or folder data */ /* Write file or folder data */
if (FileType == Brw_IS_FOLDER) if (FileType == Brw_IS_FOLDER)
fprintf (Gbl.F.XML,"<dir name=\"%s\">%s", fprintf (XML,"<dir name=\"%s\">%s",
FileName,Txt_NEW_LINE); FileName,Txt_NEW_LINE);
else // File or link else // File or link
{ {
@ -4850,14 +4861,14 @@ static bool API_WriteRowFileBrowser (unsigned Level,Brw_FileType_t FileType,cons
Usr_DONT_GET_ROLE_IN_CURRENT_CRS); Usr_DONT_GET_ROLE_IN_CURRENT_CRS);
Pho_BuildLinkToPhoto (&Gbl.Usrs.Me.UsrDat,PhotoURL); Pho_BuildLinkToPhoto (&Gbl.Usrs.Me.UsrDat,PhotoURL);
fprintf (Gbl.F.XML,"<file name=\"%s\">" fprintf (XML,"<file name=\"%s\">"
"<code>%ld</code>" "<code>%ld</code>"
"<size>%lu</size>" "<size>%lu</size>"
"<time>%lu</time>" "<time>%lu</time>"
"<license>%s</license>" "<license>%s</license>"
"<publisher>%s</publisher>" "<publisher>%s</publisher>"
"<photo>%s</photo>" "<photo>%s</photo>"
"</file>%s", "</file>%s",
FileName, FileName,
FileMetadata.FilCod, FileMetadata.FilCod,
(unsigned long) FileMetadata.Size, (unsigned long) FileMetadata.Size,
@ -4875,12 +4886,12 @@ static bool API_WriteRowFileBrowser (unsigned Level,Brw_FileType_t FileType,cons
/******************************* Indent XML line *****************************/ /******************************* Indent XML line *****************************/
/*****************************************************************************/ /*****************************************************************************/
static void API_IndentXMLLine (unsigned Level) static void API_IndentXMLLine (FILE *XML,unsigned Level)
{ {
for ( ; for ( ;
Level; Level;
Level--) Level--)
fprintf (Gbl.F.XML,"\t"); fprintf (XML,"\t");
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -6664,7 +6664,7 @@ static bool Brw_PasteTreeIntoFolder (unsigned LevelOrg,
{ {
/* Check extension of the file */ /* Check extension of the file */
if (Str_FileIsHTML (FileNameOrg)) if (Str_FileIsHTML (FileNameOrg))
Mrk_CheckFileOfMarks (PathOrg,&Marks); // Gbl.Alert.Txt contains feedback text Mrk_CheckFileOfMarks (PathOrg,&Marks);
else else
{ {
Ale_ShowAlert (Ale_WARNING,Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_you_can_not_paste_a_file_here_of_a_type_other_than_HTML, Ale_ShowAlert (Ale_WARNING,Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_you_can_not_paste_a_file_here_of_a_type_other_than_HTML,
@ -7362,7 +7362,7 @@ static bool Brw_RcvFileInFileBrw (Brw_UploadType_t UploadType)
/***** Check if creating a new file is allowed *****/ /***** Check if creating a new file is allowed *****/
if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level)) if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level))
{ {
/***** First, we save in disk the file from stdin (really from Gbl.F.Tmp) *****/ /***** First, we save in disk the file received *****/
Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG,
SrcFileName,MIMEType); SrcFileName,MIMEType);
@ -7374,7 +7374,7 @@ static bool Brw_RcvFileInFileBrw (Brw_UploadType_t UploadType)
if (Gbl.FileBrowser.NewFilFolLnkName[0]) if (Gbl.FileBrowser.NewFilFolLnkName[0])
{ {
/***** Check if uploading this kind of file is allowed *****/ /***** Check if uploading this kind of file is allowed *****/
if (Brw_CheckIfUploadIsAllowed (MIMEType)) // Gbl.Alert.Txt contains feedback text if (Brw_CheckIfUploadIsAllowed (MIMEType))
{ {
if (Str_ConvertFilFolLnkNameToValid (Gbl.FileBrowser.NewFilFolLnkName)) if (Str_ConvertFilFolLnkNameToValid (Gbl.FileBrowser.NewFilFolLnkName))
{ {
@ -7398,12 +7398,12 @@ static bool Brw_RcvFileInFileBrw (Brw_UploadType_t UploadType)
{ {
/* End receiving the file */ /* End receiving the file */
snprintf (PathTmp,sizeof (PathTmp),"%s.tmp",Path); snprintf (PathTmp,sizeof (PathTmp),"%s.tmp",Path);
FileIsValid = Fil_EndReceptionOfFile (PathTmp,Param); // Gbl.Alert.Txt contains feedback text FileIsValid = Fil_EndReceptionOfFile (PathTmp,Param);
/* Check if the content of the file of marks is valid */ /* Check if the content of the file of marks is valid */
if (FileIsValid) if (FileIsValid)
if (AdminMarks) if (AdminMarks)
if (!Mrk_CheckFileOfMarks (PathTmp,&Marks)) // Gbl.Alert.Txt contains feedback text if (!Mrk_CheckFileOfMarks (PathTmp,&Marks))
FileIsValid = false; FileIsValid = false;
if (FileIsValid) if (FileIsValid)
@ -7575,7 +7575,7 @@ void Brw_RecLinkFileBrowser (void)
FileName); FileName);
/* Convert the last name in URL to a valid filename */ /* Convert the last name in URL to a valid filename */
if (Str_ConvertFilFolLnkNameToValid (FileName)) // Gbl.Alert.Txt contains feedback text if (Str_ConvertFilFolLnkNameToValid (FileName))
{ {
/* The name of the file with the link will be the FileName.url */ /* The name of the file with the link will be the FileName.url */
snprintf (Path,sizeof (Path),"%s/%s", snprintf (Path,sizeof (Path),"%s/%s",

View File

@ -920,7 +920,7 @@ void CtrCfg_ReceivePhoto (void)
/* End the reception of image in a temporary file */ /* End the reception of image in a temporary file */
snprintf (PathFileImgTmp,sizeof (PathFileImgTmp),"%s/%s.%s", snprintf (PathFileImgTmp,sizeof (PathFileImgTmp),"%s/%s.%s",
Cfg_PATH_MEDIA_TMP_PRIVATE,Gbl.UniqueNameEncrypted,PtrExtension); Cfg_PATH_MEDIA_TMP_PRIVATE,Cry_GetUniqueNameEncrypted (),PtrExtension);
if (!Fil_EndReceptionOfFile (PathFileImgTmp,Param)) if (!Fil_EndReceptionOfFile (PathFileImgTmp,Param))
{ {
Ale_ShowAlert (Ale_WARNING,"Error copying file."); Ale_ShowAlert (Ale_WARNING,"Error copying file.");

View File

@ -605,7 +605,7 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate
TODO: Attach pdf files in multimedia. TODO: Attach pdf files in multimedia.
*/ */
#define Log_PLATFORM_VERSION "SWAD 22.50.6 (2022-10-21)" #define Log_PLATFORM_VERSION "SWAD 22.50.7 (2022-10-21)"
#define CSS_FILE "swad22.49.4.css" #define CSS_FILE "swad22.49.4.css"
#define JS_FILE "swad22.49.js" #define JS_FILE "swad22.49.js"
/* /*
@ -616,6 +616,7 @@ Que al subir un fichero por defecto est
Al subir cosas para los grupos, en documentos, resltar más los grupos porque no son conscientes... Al subir cosas para los grupos, en documentos, resltar más los grupos porque no son conscientes...
Exportar listas en CSV. Exportar listas en CSV.
Version 22.50.7: Oct 20, 2022 Code refactoring in files. (333496 lines)
Version 22.50.6: Oct 20, 2022 Code refactoring in syllabus. (333492 lines) Version 22.50.6: Oct 20, 2022 Code refactoring in syllabus. (333492 lines)
Version 22.50.5: Oct 20, 2022 Code refactoring in configuration. (333447 lines) Version 22.50.5: Oct 20, 2022 Code refactoring in configuration. (333447 lines)
Version 22.50.4: Oct 20, 2022 Code refactoring in email sending. (333438 lines) Version 22.50.4: Oct 20, 2022 Code refactoring in email sending. (333438 lines)

View File

@ -130,7 +130,7 @@ void Cry_EncryptSHA512Base64 (const char *PlainText,
/*** Create a unique name encrypted, different each time function is called **/ /*** Create a unique name encrypted, different each time function is called **/
/*****************************************************************************/ /*****************************************************************************/
void Cry_CreateUniqueNameEncrypted (char UniqueNameEncrypted[Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1]) void Cry_CreateUniqueNameEncrypted (char *UniqueNameEncrypted)
{ {
static unsigned NumCall = 0; // When this function is called several times in the same execution of the program, each time a new name is created static unsigned NumCall = 0; // When this function is called several times in the same execution of the program, each time a new name is created
char UniqueNamePlain[Cns_MAX_BYTES_IP + char UniqueNamePlain[Cns_MAX_BYTES_IP +
@ -147,7 +147,7 @@ void Cry_CreateUniqueNameEncrypted (char UniqueNameEncrypted[Cry_BYTES_ENCRYPTED
Cry_EncryptSHA256Base64 (UniqueNamePlain,UniqueNameEncrypted); // Make difficult to guess a unique name Cry_EncryptSHA256Base64 (UniqueNamePlain,UniqueNameEncrypted); // Make difficult to guess a unique name
} }
const char *Cry_GetUniqueNameEncrypted (void) char *Cry_GetUniqueNameEncrypted (void)
{ {
return Cry_UniqueNameEncrypted; return Cry_UniqueNameEncrypted;
} }

View File

@ -47,7 +47,7 @@ void Cry_EncryptSHA256Base64 (const char *PlainText,
void Cry_EncryptSHA512Base64 (const char *PlainText, void Cry_EncryptSHA512Base64 (const char *PlainText,
char EncryptedText[Cry_LENGTH_ENCRYPTED_STR_SHA512_BASE64 + 1]); char EncryptedText[Cry_LENGTH_ENCRYPTED_STR_SHA512_BASE64 + 1]);
void Cry_CreateUniqueNameEncrypted (char UniqueNameEncrypted[Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1]); void Cry_CreateUniqueNameEncrypted (char *UniqueNameEncrypted);
const char *Cry_GetUniqueNameEncrypted (void); char *Cry_GetUniqueNameEncrypted (void);
#endif #endif

View File

@ -63,6 +63,21 @@ static struct
char FileName[PATH_MAX + 1]; char FileName[PATH_MAX + 1];
} Fil_HTMLOutput; } Fil_HTMLOutput;
/*****************************************************************************/
/************************* Private global variables **************************/
/*****************************************************************************/
static FILE *Fil_QueryFile = NULL; // Temporary file to save stdin
/*****************************************************************************/
/***************************** Get query file ********************************/
/*****************************************************************************/
FILE *Fil_GetQueryFile (void)
{
return Fil_QueryFile;
}
/*****************************************************************************/ /*****************************************************************************/
/******** Create HTML output file for the web page sent by this CGI **********/ /******** Create HTML output file for the web page sent by this CGI **********/
/*****************************************************************************/ /*****************************************************************************/
@ -74,7 +89,7 @@ void Fil_CreateFileForHTMLOutput (void)
/***** Create a unique name for the file *****/ /***** Create a unique name for the file *****/
snprintf (Fil_HTMLOutput.FileName,sizeof (Fil_HTMLOutput.FileName), snprintf (Fil_HTMLOutput.FileName,sizeof (Fil_HTMLOutput.FileName),
"%s/%s.html",Cfg_PATH_OUT_PRIVATE,Gbl.UniqueNameEncrypted); "%s/%s.html",Cfg_PATH_OUT_PRIVATE,Cry_GetUniqueNameEncrypted ());
/***** Open file for writing and reading *****/ /***** Open file for writing and reading *****/
if ((Gbl.F.Out = fopen (Fil_HTMLOutput.FileName,"w+t")) == NULL) if ((Gbl.F.Out = fopen (Fil_HTMLOutput.FileName,"w+t")) == NULL)
@ -101,7 +116,6 @@ void Fil_CloseAndRemoveFileForHTMLOutput (void)
/*****************************************************************************/ /*****************************************************************************/
/********** Open temporary file and write on it reading from stdin ***********/ /********** Open temporary file and write on it reading from stdin ***********/
/*****************************************************************************/ /*****************************************************************************/
// On error, Gbl.Alert.Txt will contain feedback
bool Fil_ReadStdinIntoTmpFile (void) bool Fil_ReadStdinIntoTmpFile (void)
{ {
@ -111,7 +125,7 @@ bool Fil_ReadStdinIntoTmpFile (void)
bool FileIsTooBig = false; bool FileIsTooBig = false;
bool TimeExceeded = false; bool TimeExceeded = false;
if ((Gbl.F.Tmp = tmpfile ()) == NULL) if ((Fil_QueryFile = tmpfile ()) == NULL)
{ {
Fil_EndOfReadingStdin (); Fil_EndOfReadingStdin ();
Err_ShowErrorAndExit ("Can not create temporary file."); Err_ShowErrorAndExit ("Can not create temporary file.");
@ -124,7 +138,7 @@ bool Fil_ReadStdinIntoTmpFile (void)
if (!(TmpFileSize % (64ULL * 1024ULL))) // Check timeout from time to time if (!(TmpFileSize % (64ULL * 1024ULL))) // Check timeout from time to time
if (time (NULL) - Dat_GetStartExecutionTimeUTC () >= Cfg_TIME_TO_ABORT_FILE_UPLOAD) if (time (NULL) - Dat_GetStartExecutionTimeUTC () >= Cfg_TIME_TO_ABORT_FILE_UPLOAD)
TimeExceeded = true; TimeExceeded = true;
fputc (fgetc (stdin),Gbl.F.Tmp); fputc (fgetc (stdin),Fil_QueryFile);
} }
else else
FileIsTooBig = true; FileIsTooBig = true;
@ -152,7 +166,7 @@ bool Fil_ReadStdinIntoTmpFile (void)
return false; return false;
} }
rewind (Gbl.F.Tmp); rewind (Fil_QueryFile);
return true; return true;
} }
@ -213,6 +227,7 @@ struct Param *Fil_StartReceptionOfFile (const char *ParamFile,
char *FileName,char *MIMEType) char *FileName,char *MIMEType)
{ {
struct Param *Param; struct Param *Param;
FILE *QueryFile = Fil_GetQueryFile ();
/***** Set default values *****/ /***** Set default values *****/
FileName[0] = 0; FileName[0] = 0;
@ -232,8 +247,8 @@ struct Param *Fil_StartReceptionOfFile (const char *ParamFile,
Err_ShowErrorAndExit ("Error while getting filename."); Err_ShowErrorAndExit ("Error while getting filename.");
/* Copy filename */ /* Copy filename */
fseek (Gbl.F.Tmp,Param->FileName.Start,SEEK_SET); fseek (QueryFile,Param->FileName.Start,SEEK_SET);
if (fread (FileName,sizeof (char),Param->FileName.Length,Gbl.F.Tmp) != if (fread (FileName,sizeof (char),Param->FileName.Length,QueryFile) !=
Param->FileName.Length) Param->FileName.Length)
Err_ShowErrorAndExit ("Error while getting filename."); Err_ShowErrorAndExit ("Error while getting filename.");
FileName[Param->FileName.Length] = '\0'; FileName[Param->FileName.Length] = '\0';
@ -246,8 +261,8 @@ struct Param *Fil_StartReceptionOfFile (const char *ParamFile,
Err_ShowErrorAndExit ("Error while getting content type."); Err_ShowErrorAndExit ("Error while getting content type.");
/* Copy MIME type */ /* Copy MIME type */
fseek (Gbl.F.Tmp,Param->ContentType.Start,SEEK_SET); fseek (QueryFile,Param->ContentType.Start,SEEK_SET);
if (fread (MIMEType,sizeof (char),Param->ContentType.Length,Gbl.F.Tmp) != if (fread (MIMEType,sizeof (char),Param->ContentType.Length,QueryFile) !=
Param->ContentType.Length) Param->ContentType.Length)
Err_ShowErrorAndExit ("Error while getting content type."); Err_ShowErrorAndExit ("Error while getting content type.");
MIMEType[Param->ContentType.Length] = '\0'; MIMEType[Param->ContentType.Length] = '\0';
@ -265,6 +280,7 @@ bool Fil_EndReceptionOfFile (char *FileNameDataTmp,struct Param *Param)
unsigned char Bytes[NUM_BYTES_PER_CHUNK]; unsigned char Bytes[NUM_BYTES_PER_CHUNK];
size_t RemainingBytesToCopy; size_t RemainingBytesToCopy;
size_t BytesToCopy; size_t BytesToCopy;
FILE *QueryFile = Fil_GetQueryFile ();
/***** Open destination file *****/ /***** Open destination file *****/
if ((FileDataTmp = fopen (FileNameDataTmp,"wb")) == NULL) if ((FileDataTmp = fopen (FileNameDataTmp,"wb")) == NULL)
@ -274,16 +290,16 @@ bool Fil_EndReceptionOfFile (char *FileNameDataTmp,struct Param *Param)
/* Go to start of source */ /* Go to start of source */
if (Param->Value.Start == 0) if (Param->Value.Start == 0)
Err_ShowErrorAndExit ("Error while copying file."); Err_ShowErrorAndExit ("Error while copying file.");
fseek (Gbl.F.Tmp,Param->Value.Start,SEEK_SET); fseek (QueryFile,Param->Value.Start,SEEK_SET);
/* Copy part of Gbl.F.Tmp to FileDataTmp */ /* Copy part of query file to FileDataTmp */
for (RemainingBytesToCopy = Param->Value.Length; for (RemainingBytesToCopy = Param->Value.Length;
RemainingBytesToCopy != 0; RemainingBytesToCopy != 0;
RemainingBytesToCopy -= BytesToCopy) RemainingBytesToCopy -= BytesToCopy)
{ {
BytesToCopy = (RemainingBytesToCopy >= NUM_BYTES_PER_CHUNK) ? NUM_BYTES_PER_CHUNK : BytesToCopy = (RemainingBytesToCopy >= NUM_BYTES_PER_CHUNK) ? NUM_BYTES_PER_CHUNK :
RemainingBytesToCopy; RemainingBytesToCopy;
if (fread (Bytes,1,BytesToCopy,Gbl.F.Tmp) != BytesToCopy) if (fread (Bytes,1,BytesToCopy,QueryFile) != BytesToCopy)
{ {
fclose (FileDataTmp); fclose (FileDataTmp);
return false; return false;
@ -558,19 +574,6 @@ void Fil_FastCopyOfOpenFiles (FILE *FileSrc,FILE *FileTgt)
fwrite (Bytes,sizeof (Bytes[0]),NumBytesRead,FileTgt); fwrite (Bytes,sizeof (Bytes[0]),NumBytesRead,FileTgt);
} }
/*****************************************************************************/
/**************************** Close XML file *********************************/
/*****************************************************************************/
void Fil_CloseXMLFile (void)
{
if (Gbl.F.XML)
{
fclose (Gbl.F.XML);
Gbl.F.XML = NULL; // To indicate that it is not open
}
}
/*****************************************************************************/ /*****************************************************************************/
/***************************** Close report file *****************************/ /***************************** Close report file *****************************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -48,8 +48,6 @@
struct Fil_Files struct Fil_Files
{ {
FILE *Out; // File with the HTML output of this CGI FILE *Out; // File with the HTML output of this CGI
FILE *Tmp; // Temporary file to save stdin
FILE *XML; // XML file for syllabus, for directory tree
FILE *Rep; // Temporary file to save report FILE *Rep; // Temporary file to save report
}; };
@ -59,6 +57,7 @@ struct Fil_Files
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
FILE *Fil_GetQueryFile (void);
void Fil_CreateFileForHTMLOutput (void); void Fil_CreateFileForHTMLOutput (void);
void Fil_CloseAndRemoveFileForHTMLOutput (void); void Fil_CloseAndRemoveFileForHTMLOutput (void);
bool Fil_ReadStdinIntoTmpFile (void); bool Fil_ReadStdinIntoTmpFile (void);
@ -85,7 +84,6 @@ void Fil_RemoveOldTmpFiles (const char *Path,time_t TimeToRemove,
void Fil_FastCopyOfFiles (const char *PathSrc,const char *PathTgt); void Fil_FastCopyOfFiles (const char *PathSrc,const char *PathTgt);
void Fil_FastCopyOfOpenFiles (FILE *FileSrc,FILE *FileTgt); void Fil_FastCopyOfOpenFiles (FILE *FileSrc,FILE *FileTgt);
void Fil_CloseXMLFile (void);
void Fil_CloseReportFile (void); void Fil_CloseReportFile (void);
void Fil_WriteFileSizeBrief (double SizeInBytes, void Fil_WriteFileSizeBrief (double SizeInBytes,

View File

@ -255,10 +255,10 @@ void Frm_SetUniqueId (char UniqueId[Frm_MAX_BYTES_ID + 1])
/***** Create Id. The id must be unique, /***** Create Id. The id must be unique,
the page content may be updated via AJAX. the page content may be updated via AJAX.
So, Id uses: So, Id uses:
- a name for this execution (Gbl.UniqueNameEncrypted) - a name for this execution
- a number for each element in this execution (CountForThisExecution) *****/ - a number for each element in this execution *****/
snprintf (UniqueId,Frm_MAX_BYTES_ID + 1,"id_%s_%u", snprintf (UniqueId,Frm_MAX_BYTES_ID + 1,"id_%s_%u",
Gbl.UniqueNameEncrypted, Cry_GetUniqueNameEncrypted (),
++CountForThisExecution); ++CountForThisExecution);
} }

View File

@ -88,15 +88,13 @@ void Gbl_InitializeGlobals (void)
Gbl.PID = getpid (); Gbl.PID = getpid ();
Sta_GetRemoteAddr (); Sta_GetRemoteAddr ();
Cry_CreateUniqueNameEncrypted (Gbl.UniqueNameEncrypted); Cry_CreateUniqueNameEncrypted (Cry_GetUniqueNameEncrypted ());
srand ((unsigned int) Dat_GetStartExecutionTimeUTC ()); // Initialize seed for rand() srand ((unsigned int) Dat_GetStartExecutionTimeUTC ()); // Initialize seed for rand()
Gbl.WebService.IsWebService = false; Gbl.WebService.IsWebService = false;
Gbl.F.Out = stdout; Gbl.F.Out = stdout;
Gbl.F.Tmp = NULL;
Gbl.F.XML = NULL;
Gbl.F.Rep = NULL; // Report Gbl.F.Rep = NULL; // Report
Gbl.Prefs.Language = Txt_Current_CGI_SWAD_Language; Gbl.Prefs.Language = Txt_Current_CGI_SWAD_Language;
@ -338,9 +336,6 @@ void Gbl_Cleanup (void)
Usr_FreeListOtherRecipients (); Usr_FreeListOtherRecipients ();
Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected);
Syl_FreeListItemsSyllabus (); Syl_FreeListItemsSyllabus ();
if (Gbl.F.Tmp)
fclose (Gbl.F.Tmp);
Fil_CloseXMLFile ();
Fil_CloseReportFile (); Fil_CloseReportFile ();
Par_FreeParams (); Par_FreeParams ();
Ale_ResetAllAlerts (); Ale_ResetAllAlerts ();

View File

@ -1528,6 +1528,7 @@ static bool Inf_CheckAndShowRichTxt (void)
char TxtMD[Cns_MAX_BYTES_LONG_TEXT + 1]; char TxtMD[Cns_MAX_BYTES_LONG_TEXT + 1];
char PathFileMD[PATH_MAX + 1]; char PathFileMD[PATH_MAX + 1];
char PathFileHTML[PATH_MAX + 1]; char PathFileHTML[PATH_MAX + 1];
const char *UniqueNameEncrypted;
FILE *FileMD; // Temporary Markdown file FILE *FileMD; // Temporary Markdown file
FILE *FileHTML; // Temporary HTML file FILE *FileHTML; // Temporary HTML file
char MathJaxURL[PATH_MAX + 1]; char MathJaxURL[PATH_MAX + 1];
@ -1573,10 +1574,11 @@ static bool Inf_CheckAndShowRichTxt (void)
/***** Store text into a temporary .md file in HTML output directory *****/ /***** Store text into a temporary .md file in HTML output directory *****/
// TODO: change to another directory? // TODO: change to another directory?
/* Create a unique name for the .md file */ /* Create a unique name for the .md file */
UniqueNameEncrypted = Cry_GetUniqueNameEncrypted ();
snprintf (PathFileMD,sizeof (PathFileMD),"%s/%s.md", snprintf (PathFileMD,sizeof (PathFileMD),"%s/%s.md",
Cfg_PATH_OUT_PRIVATE,Gbl.UniqueNameEncrypted); Cfg_PATH_OUT_PRIVATE,UniqueNameEncrypted);
snprintf (PathFileHTML,sizeof (PathFileHTML),"%s/%s.md.html", // Do not use only .html because that is the output temporary file snprintf (PathFileHTML,sizeof (PathFileHTML),"%s/%s.md.html", // Do not use only .html because that is the output temporary file
Cfg_PATH_OUT_PRIVATE,Gbl.UniqueNameEncrypted); Cfg_PATH_OUT_PRIVATE,UniqueNameEncrypted);
/* Open Markdown file for writing */ /* Open Markdown file for writing */
if ((FileMD = fopen (PathFileMD,"wb")) == NULL) if ((FileMD = fopen (PathFileMD,"wb")) == NULL)
@ -1931,7 +1933,7 @@ void Inf_ReceivePagInfo (void)
/***** Set info type *****/ /***** Set info type *****/
Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus);
/***** First of all, store in disk the file from stdin (really from Gbl.F.Tmp) *****/ /***** First of all, store in disk the file received *****/
Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG,
SourceFileName,MIMEType); SourceFileName,MIMEType);

View File

@ -357,7 +357,7 @@ void Lgo_ReceiveLogo (HieLvl_Level_t Scope)
(unsigned) Cod); (unsigned) Cod);
Fil_CreateDirIfNotExists (Path); Fil_CreateDirIfNotExists (Path);
/***** Copy in disk the file received from stdin (really from Gbl.F.Tmp) *****/ /***** Copy in disk the file received *****/
Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG,
FileNameLogoSrc,MIMEType); FileNameLogoSrc,MIMEType);

View File

@ -1431,6 +1431,7 @@ bool Mai_SendMailMsgToConfirmEmail (void)
extern const char *Txt_There_was_a_problem_sending_an_email_automatically; extern const char *Txt_There_was_a_problem_sending_an_email_automatically;
char FileNameMail[PATH_MAX + 1]; char FileNameMail[PATH_MAX + 1];
FILE *FileMail; FILE *FileMail;
const char *UniqueNameEncrypted = Cry_GetUniqueNameEncrypted ();
int ReturnCode; int ReturnCode;
/***** Create temporary file for mail content *****/ /***** Create temporary file for mail content *****/
@ -1441,13 +1442,13 @@ bool Mai_SendMailMsgToConfirmEmail (void)
Mai_WriteWelcomeNoteEMail (FileMail,&Gbl.Usrs.Me.UsrDat); Mai_WriteWelcomeNoteEMail (FileMail,&Gbl.Usrs.Me.UsrDat);
/* Store encrypted key in database */ /* Store encrypted key in database */
Mai_InsertMailKey (Gbl.Usrs.Me.UsrDat.Email,Gbl.UniqueNameEncrypted); Mai_InsertMailKey (Gbl.Usrs.Me.UsrDat.Email,UniqueNameEncrypted);
/* Message body */ /* Message body */
fprintf (FileMail, fprintf (FileMail,
Txt_If_you_just_requested_from_X_the_confirmation_of_your_email_Y_NO_HTML, Txt_If_you_just_requested_from_X_the_confirmation_of_your_email_Y_NO_HTML,
Cfg_URL_SWAD_CGI,Gbl.Usrs.Me.UsrDat.Email, Cfg_URL_SWAD_CGI,Gbl.Usrs.Me.UsrDat.Email,
Cfg_URL_SWAD_CGI,Act_GetActCod (ActCnfMai),Gbl.UniqueNameEncrypted, Cfg_URL_SWAD_CGI,Act_GetActCod (ActCnfMai),UniqueNameEncrypted,
Cfg_URL_SWAD_CGI); Cfg_URL_SWAD_CGI);
/* Footer note */ /* Footer note */
@ -1576,7 +1577,7 @@ void Mai_ConfirmEmail (void)
void Mai_CreateFileNameMail (char FileNameMail[PATH_MAX + 1],FILE **FileMail) void Mai_CreateFileNameMail (char FileNameMail[PATH_MAX + 1],FILE **FileMail)
{ {
snprintf (FileNameMail,PATH_MAX + 1,"%s/%s_mail.txt", snprintf (FileNameMail,PATH_MAX + 1,"%s/%s_mail.txt",
Cfg_PATH_OUT_PRIVATE,Gbl.UniqueNameEncrypted); Cfg_PATH_OUT_PRIVATE,Cry_GetUniqueNameEncrypted ());
if ((*FileMail = fopen (FileNameMail,"wb")) == NULL) if ((*FileMail = fopen (FileNameMail,"wb")) == NULL)
Err_ShowErrorAndExit ("Can not open file to send email."); Err_ShowErrorAndExit ("Can not open file to send email.");
} }

View File

@ -223,7 +223,6 @@ static void Mrk_ChangeNumRowsHeaderOrFooter (Brw_HeadOrFoot_t HeaderOrFooter)
/*****************************************************************************/ /*****************************************************************************/
// Returns true if the format of the HTML file of marks is correct // Returns true if the format of the HTML file of marks is correct
// Returns true if the format of the HTML file of marks is wrong // Returns true if the format of the HTML file of marks is wrong
// Gbl.Alert.Txt will contain feedback text
bool Mrk_CheckFileOfMarks (const char *Path,struct Mrk_Properties *Marks) bool Mrk_CheckFileOfMarks (const char *Path,struct Mrk_Properties *Marks)
{ {
@ -590,7 +589,7 @@ void Mrk_ShowMyMarks (void)
/* Create a new temporary file *****/ /* Create a new temporary file *****/
snprintf (FileNameUsrMarks,sizeof (FileNameUsrMarks),"%s/%s.html", snprintf (FileNameUsrMarks,sizeof (FileNameUsrMarks),"%s/%s.html",
Cfg_PATH_MARK_PRIVATE,Gbl.UniqueNameEncrypted); Cfg_PATH_MARK_PRIVATE,Cry_GetUniqueNameEncrypted ());
if ((FileUsrMarks = fopen (FileNameUsrMarks,"wb")) == NULL) if ((FileUsrMarks = fopen (FileNameUsrMarks,"wb")) == NULL)
Err_ShowErrorAndExit ("Can not open file for my marks."); Err_ShowErrorAndExit ("Can not open file for my marks.");
@ -720,7 +719,7 @@ void Mrk_GetNotifMyMarks (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
/* Create a new temporary file *****/ /* Create a new temporary file *****/
snprintf (FileNameUsrMarks,sizeof (FileNameUsrMarks),"%s/%s.html", snprintf (FileNameUsrMarks,sizeof (FileNameUsrMarks),"%s/%s.html",
Cfg_PATH_MARK_PRIVATE,Gbl.UniqueNameEncrypted); Cfg_PATH_MARK_PRIVATE,Cry_GetUniqueNameEncrypted ());
if ((FileUsrMarks = fopen (FileNameUsrMarks,"wb"))) if ((FileUsrMarks = fopen (FileNameUsrMarks,"wb")))
{ {
/***** Get user's marks *****/ /***** Get user's marks *****/

View File

@ -102,8 +102,8 @@ static void Par_GetBoundary (void);
static void Par_CreateListOfParamsFromQueryString (void); static void Par_CreateListOfParamsFromQueryString (void);
static void Par_CreateListOfParamsFromTmpFile (void); static void Par_CreateListOfParamsFromTmpFile (void);
static int Par_ReadTmpFileUntilQuote (void); static int Par_ReadTmpFileUntilQuote (FILE *QueryFile);
static int Par_ReadTmpFileUntilReturn (void); static int Par_ReadTmpFileUntilReturn (FILE *QueryFile);
static bool Par_CheckIsParamCanBeUsedInGETMethod (const char *ParamName); static bool Par_CheckIsParamCanBeUsedInGETMethod (const char *ParamName);
@ -350,7 +350,6 @@ static void Par_CreateListOfParamsFromQueryString (void)
/*****************************************************************************/ /*****************************************************************************/
/*************** Create list of parameters from temporary file ***************/ /*************** Create list of parameters from temporary file ***************/
/*****************************************************************************/ /*****************************************************************************/
// TODO: Rename Gbl.F.Tmp to Gbl.F.In (InFile, QueryFile)?
#define Par_LENGTH_OF_STR_BEFORE_PARAM 38 // Length of "Content-Disposition: form-data; name=\"" #define Par_LENGTH_OF_STR_BEFORE_PARAM 38 // Length of "Content-Disposition: form-data; name=\""
#define Par_LENGTH_OF_STR_FILENAME 12 // Length of "; filename=\"" #define Par_LENGTH_OF_STR_FILENAME 12 // Length of "; filename=\""
@ -367,10 +366,11 @@ static void Par_CreateListOfParamsFromTmpFile (void)
struct Param *NewParam; struct Param *NewParam;
int Ch; int Ch;
char StrAux[Par_MAX_BYTES_STR_AUX + 1]; char StrAux[Par_MAX_BYTES_STR_AUX + 1];
FILE *QueryFile = Fil_GetQueryFile ();
/***** Go over the file /***** Go over the file
getting start positions and lengths of parameters *****/ getting start positions and lengths of parameters *****/
if (Str_ReadFileUntilBoundaryStr (Gbl.F.Tmp,NULL, if (Str_ReadFileUntilBoundaryStr (QueryFile,NULL,
Par_Params.Boundary.StrWithoutCRLF, Par_Params.Boundary.StrWithoutCRLF,
Par_Params.Boundary.LengthWithoutCRLF, Par_Params.Boundary.LengthWithoutCRLF,
Fil_MAX_FILE_SIZE) == 1) // Delimiter string found Fil_MAX_FILE_SIZE) == 1) // Delimiter string found
@ -380,10 +380,10 @@ static void Par_CreateListOfParamsFromTmpFile (void)
) )
{ {
/***** Skip \r\n after delimiter string *****/ /***** Skip \r\n after delimiter string *****/
if (fgetc (Gbl.F.Tmp) != 0x0D) break; // '\r' if (fgetc (QueryFile) != 0x0D) break; // '\r'
if (fgetc (Gbl.F.Tmp) != 0x0A) break; // '\n' if (fgetc (QueryFile) != 0x0A) break; // '\n'
Str_GetNextStrFromFileConvertingToLower (Gbl.F.Tmp,StrAux, Str_GetNextStrFromFileConvertingToLower (QueryFile,StrAux,
Par_LENGTH_OF_STR_BEFORE_PARAM); Par_LENGTH_OF_STR_BEFORE_PARAM);
if (!strcasecmp (StrAux,StringBeforeParam)) // Start of a parameter if (!strcasecmp (StrAux,StringBeforeParam)) // Start of a parameter
{ {
@ -401,49 +401,49 @@ static void Par_CreateListOfParamsFromTmpFile (void)
Param = NewParam; Param = NewParam;
/***** Get parameter name *****/ /***** Get parameter name *****/
CurPos = (unsigned long) ftell (Gbl.F.Tmp); // At start of parameter name CurPos = (unsigned long) ftell (QueryFile); // At start of parameter name
Param->Name.Start = CurPos; Param->Name.Start = CurPos;
Ch = Par_ReadTmpFileUntilQuote (); Ch = Par_ReadTmpFileUntilQuote (QueryFile);
CurPos = (unsigned long) ftell (Gbl.F.Tmp); // Just after quote CurPos = (unsigned long) ftell (QueryFile); // Just after quote
Param->Name.Length = CurPos - 1 - Param->Name.Start; Param->Name.Length = CurPos - 1 - Param->Name.Start;
/* Check if last character read after parameter name is a quote */ /* Check if last character read after parameter name is a quote */
if (Ch != (int) '\"') break; // '\"' if (Ch != (int) '\"') break; // '\"'
/* Get next char after parameter name */ /* Get next char after parameter name */
Ch = fgetc (Gbl.F.Tmp); Ch = fgetc (QueryFile);
/***** Check if filename is present *****/ /***** Check if filename is present *****/
if (Ch == (int) StringFilename[0]) if (Ch == (int) StringFilename[0])
{ {
Str_GetNextStrFromFileConvertingToLower (Gbl.F.Tmp,StrAux, Str_GetNextStrFromFileConvertingToLower (QueryFile,StrAux,
Par_LENGTH_OF_STR_FILENAME-1); Par_LENGTH_OF_STR_FILENAME-1);
if (!strcasecmp (StrAux,StringFilename + 1)) // Start of filename if (!strcasecmp (StrAux,StringFilename + 1)) // Start of filename
{ {
/* Get filename */ /* Get filename */
CurPos = (unsigned long) ftell (Gbl.F.Tmp); // At start of filename CurPos = (unsigned long) ftell (QueryFile); // At start of filename
Param->FileName.Start = CurPos; Param->FileName.Start = CurPos;
Ch = Par_ReadTmpFileUntilQuote (); Ch = Par_ReadTmpFileUntilQuote (QueryFile);
CurPos = (unsigned long) ftell (Gbl.F.Tmp); // Just after quote CurPos = (unsigned long) ftell (QueryFile); // Just after quote
Param->FileName.Length = CurPos - 1 - Param->FileName.Start; Param->FileName.Length = CurPos - 1 - Param->FileName.Start;
/* Check if last character read after filename is a quote */ /* Check if last character read after filename is a quote */
if (Ch != (int) '\"') break; // '\"' if (Ch != (int) '\"') break; // '\"'
/* Skip \r\n */ /* Skip \r\n */
if (fgetc (Gbl.F.Tmp) != 0x0D) break; // '\r' if (fgetc (QueryFile) != 0x0D) break; // '\r'
if (fgetc (Gbl.F.Tmp) != 0x0A) break; // '\n' if (fgetc (QueryFile) != 0x0A) break; // '\n'
/* Check if Content-Type is present */ /* Check if Content-Type is present */
Str_GetNextStrFromFileConvertingToLower (Gbl.F.Tmp,StrAux, Str_GetNextStrFromFileConvertingToLower (QueryFile,StrAux,
Par_LENGTH_OF_STR_CONTENT_TYPE); Par_LENGTH_OF_STR_CONTENT_TYPE);
if (!strcasecmp (StrAux,StringContentType)) // Start of Content-Type if (!strcasecmp (StrAux,StringContentType)) // Start of Content-Type
{ {
/* Get content type */ /* Get content type */
CurPos = (unsigned long) ftell (Gbl.F.Tmp); // At start of content type CurPos = (unsigned long) ftell (QueryFile); // At start of content type
Param->ContentType.Start = CurPos; Param->ContentType.Start = CurPos;
Ch = Par_ReadTmpFileUntilReturn (); Ch = Par_ReadTmpFileUntilReturn (QueryFile);
CurPos = (unsigned long) ftell (Gbl.F.Tmp); // Just after return CurPos = (unsigned long) ftell (QueryFile); // Just after return
Param->ContentType.Length = CurPos - 1 - Param->ContentType.Start; Param->ContentType.Length = CurPos - 1 - Param->ContentType.Start;
} }
} }
@ -454,20 +454,20 @@ static void Par_CreateListOfParamsFromTmpFile (void)
if (Ch != 0x0D) break; // '\r' if (Ch != 0x0D) break; // '\r'
/* Skip \n\r\n */ /* Skip \n\r\n */
if (fgetc (Gbl.F.Tmp) != 0x0A) break; // '\n' if (fgetc (QueryFile) != 0x0A) break; // '\n'
if (fgetc (Gbl.F.Tmp) != 0x0D) break; // '\r' if (fgetc (QueryFile) != 0x0D) break; // '\r'
if (fgetc (Gbl.F.Tmp) != 0x0A) break; // '\n' if (fgetc (QueryFile) != 0x0A) break; // '\n'
/***** Get parameter value or file content *****/ /***** Get parameter value or file content *****/
CurPos = (unsigned long) ftell (Gbl.F.Tmp); // At start of value or file content CurPos = (unsigned long) ftell (QueryFile); // At start of value or file content
if (Str_ReadFileUntilBoundaryStr (Gbl.F.Tmp,NULL, if (Str_ReadFileUntilBoundaryStr (QueryFile,NULL,
Par_Params.Boundary.StrWithCRLF, Par_Params.Boundary.StrWithCRLF,
Par_Params.Boundary.LengthWithCRLF, Par_Params.Boundary.LengthWithCRLF,
Fil_MAX_FILE_SIZE) != 1) break; // Boundary string not found Fil_MAX_FILE_SIZE) != 1) break; // Boundary string not found
// Delimiter string found // Delimiter string found
Param->Value.Start = CurPos; Param->Value.Start = CurPos;
CurPos = (unsigned long) ftell (Gbl.F.Tmp); // Just after delimiter string CurPos = (unsigned long) ftell (QueryFile); // Just after delimiter string
Param->Value.Length = CurPos - Par_Params.Boundary.LengthWithCRLF - Param->Value.Length = CurPos - Par_Params.Boundary.LengthWithCRLF -
Param->Value.Start; Param->Value.Start;
} }
@ -479,13 +479,13 @@ static void Par_CreateListOfParamsFromTmpFile (void)
/*****************************************************************************/ /*****************************************************************************/
// Return last char read // Return last char read
static int Par_ReadTmpFileUntilQuote (void) static int Par_ReadTmpFileUntilQuote (FILE *QueryFile)
{ {
int Ch; int Ch;
/***** Read until quote if found *****/ /***** Read until quote if found *****/
do do
Ch = fgetc (Gbl.F.Tmp); Ch = fgetc (QueryFile);
while (Ch != EOF && Ch != (int) '\"'); while (Ch != EOF && Ch != (int) '\"');
return Ch; return Ch;
@ -496,13 +496,13 @@ static int Par_ReadTmpFileUntilQuote (void)
/*****************************************************************************/ /*****************************************************************************/
// Return last char read // Return last char read
static int Par_ReadTmpFileUntilReturn (void) static int Par_ReadTmpFileUntilReturn (FILE *QueryFile)
{ {
int Ch; int Ch;
/***** Read until \r if found *****/ /***** Read until \r if found *****/
do do
Ch = fgetc (Gbl.F.Tmp); Ch = fgetc (QueryFile);
while (Ch != EOF && Ch != 0x0D); // '\r' while (Ch != EOF && Ch != 0x0D); // '\r'
return Ch; return Ch;
@ -543,6 +543,7 @@ unsigned Par_GetParameter (Par_ParamType_t ParamType,const char *ParamName,
struct Param **ParamPtr) // NULL if not used struct Param **ParamPtr) // NULL if not used
{ {
extern const char *Par_SEPARATOR_PARAM_MULTIPLE; extern const char *Par_SEPARATOR_PARAM_MULTIPLE;
FILE *QueryFile = Fil_GetQueryFile ();
size_t BytesAlreadyCopied = 0; size_t BytesAlreadyCopied = 0;
unsigned i; unsigned i;
struct Param *Param; struct Param *Param;
@ -588,11 +589,11 @@ unsigned Par_GetParameter (Par_ParamType_t ParamType,const char *ParamName,
Param->Name.Length); Param->Name.Length);
break; break;
case Act_CONT_DATA: case Act_CONT_DATA:
fseek (Gbl.F.Tmp,Param->Name.Start,SEEK_SET); fseek (QueryFile,Param->Name.Start,SEEK_SET);
for (i = 0, ParamFound = true; for (i = 0, ParamFound = true;
i < Param->Name.Length && ParamFound; i < Param->Name.Length && ParamFound;
i++) i++)
if (ParamName[i] != (char) fgetc (Gbl.F.Tmp)) if (ParamName[i] != (char) fgetc (QueryFile))
ParamFound = false; ParamFound = false;
break; break;
} }
@ -654,8 +655,8 @@ unsigned Par_GetParameter (Par_ParamType_t ParamType,const char *ParamName,
if (Param->FileName.Start == 0 && // Copy into destination only if it's not a file if (Param->FileName.Start == 0 && // Copy into destination only if it's not a file
PtrDst) PtrDst)
{ {
fseek (Gbl.F.Tmp,Param->Value.Start,SEEK_SET); fseek (QueryFile,Param->Value.Start,SEEK_SET);
if (fread (PtrDst,sizeof (char),Param->Value.Length,Gbl.F.Tmp) != if (fread (PtrDst,sizeof (char),Param->Value.Length,QueryFile) !=
Param->Value.Length) Param->Value.Length)
Err_ShowErrorAndExit ("Error while getting value of parameter."); Err_ShowErrorAndExit ("Error while getting value of parameter.");
} }

View File

@ -572,6 +572,7 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct Usr_Data *Us
char FileNamePhotoTmp[PATH_MAX + 1]; // Full name (including path and .jpg) of the destination temporary file char FileNamePhotoTmp[PATH_MAX + 1]; // Full name (including path and .jpg) of the destination temporary file
char FileNamePhotoMap[PATH_MAX + 1]; // Full name (including path) of the temporary file with the original image with faces char FileNamePhotoMap[PATH_MAX + 1]; // Full name (including path) of the temporary file with the original image with faces
char FileNameTxtMap[PATH_MAX + 1]; // Full name (including path) of the temporary file with the text neccesary to make the image map char FileNameTxtMap[PATH_MAX + 1]; // Full name (including path) of the temporary file with the text neccesary to make the image map
const char *UniqueNameEncrypted = Cry_GetUniqueNameEncrypted ();
char PathRelPhoto[PATH_MAX + 1]; char PathRelPhoto[PATH_MAX + 1];
FILE *FileTxtMap = NULL; // Temporary file with the text neccesary to make the image map. Initialized to avoid warning FILE *FileTxtMap = NULL; // Temporary file with the text neccesary to make the image map. Initialized to avoid warning
char MIMEType[Brw_MAX_BYTES_MIME_TYPE + 1]; char MIMEType[Brw_MAX_BYTES_MIME_TYPE + 1];
@ -620,7 +621,7 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct Usr_Data *Us
/* Create temporary directory for photos */ /* Create temporary directory for photos */
Fil_CreateDirIfNotExists (Cfg_PATH_PHOTO_TMP_PUBLIC); Fil_CreateDirIfNotExists (Cfg_PATH_PHOTO_TMP_PUBLIC);
/***** First of all, copy in disk the file received from stdin (really from Gbl.F.Tmp) *****/ /***** First of all, copy in disk the file received *****/
Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG,
FileNamePhotoSrc,MIMEType); FileNamePhotoSrc,MIMEType);
@ -640,7 +641,7 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct Usr_Data *Us
/* End the reception of photo in a temporary file */ /* End the reception of photo in a temporary file */
snprintf (FileNamePhotoTmp,sizeof (FileNamePhotoTmp),"%s/%s.jpg", snprintf (FileNamePhotoTmp,sizeof (FileNamePhotoTmp),"%s/%s.jpg",
Cfg_PATH_PHOTO_TMP_PUBLIC,Gbl.UniqueNameEncrypted); Cfg_PATH_PHOTO_TMP_PUBLIC,UniqueNameEncrypted);
if (!Fil_EndReceptionOfFile (FileNamePhotoTmp,Param)) if (!Fil_EndReceptionOfFile (FileNamePhotoTmp,Param))
{ {
Ale_ShowAlert (Ale_ERROR,"Error copying file."); Ale_ShowAlert (Ale_ERROR,"Error copying file.");
@ -669,7 +670,7 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct Usr_Data *Us
case 0: // Faces detected case 0: // Faces detected
/***** Open text file with text for image map *****/ /***** Open text file with text for image map *****/
snprintf (FileNameTxtMap,sizeof (FileNameTxtMap),"%s/%s_map.txt", snprintf (FileNameTxtMap,sizeof (FileNameTxtMap),"%s/%s_map.txt",
Cfg_PATH_PHOTO_TMP_PUBLIC,Gbl.UniqueNameEncrypted); Cfg_PATH_PHOTO_TMP_PUBLIC,UniqueNameEncrypted);
if ((FileTxtMap = fopen (FileNameTxtMap,"rb")) == NULL) if ((FileTxtMap = fopen (FileNameTxtMap,"rb")) == NULL)
Err_ShowErrorAndExit ("Can not read text file with coordinates of detected faces."); Err_ShowErrorAndExit ("Can not read text file with coordinates of detected faces.");
@ -765,9 +766,9 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct Usr_Data *Us
/***** Show map photo *****/ /***** Show map photo *****/
snprintf (FileNamePhotoMap,sizeof (FileNamePhotoMap),"%s/%s_map.jpg", snprintf (FileNamePhotoMap,sizeof (FileNamePhotoMap),"%s/%s_map.jpg",
Cfg_PATH_PHOTO_TMP_PUBLIC,Gbl.UniqueNameEncrypted); Cfg_PATH_PHOTO_TMP_PUBLIC,UniqueNameEncrypted);
HTM_DIV_Begin ("class=\"TIT CM\""); HTM_DIV_Begin ("class=\"TIT CM\"");
if (asprintf (&Icon,"%s_map.jpg",Gbl.UniqueNameEncrypted) < 0) if (asprintf (&Icon,"%s_map.jpg",UniqueNameEncrypted) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
HTM_IMG (Cfg_URL_PHOTO_TMP_PUBLIC,Icon,Txt_Faces_detected,"usemap=\"#faces_map\""); HTM_IMG (Cfg_URL_PHOTO_TMP_PUBLIC,Icon,Txt_Faces_detected,"usemap=\"#faces_map\"");
free (Icon); free (Icon);
@ -1350,9 +1351,10 @@ bool Pho_RemovePhoto (struct Usr_Data *UsrDat)
void Pho_UpdatePhotoName (struct Usr_Data *UsrDat) void Pho_UpdatePhotoName (struct Usr_Data *UsrDat)
{ {
char PathPublPhoto[PATH_MAX + 1]; char PathPublPhoto[PATH_MAX + 1];
const char *UniqueNameEncrypted = Cry_GetUniqueNameEncrypted ();
/***** Update photo name in database *****/ /***** Update photo name in database *****/
Pho_DB_UpdatePhotoName (UsrDat->UsrCod,Gbl.UniqueNameEncrypted); Pho_DB_UpdatePhotoName (UsrDat->UsrCod,UniqueNameEncrypted);
/***** Remove the old symbolic link to photo *****/ /***** Remove the old symbolic link to photo *****/
snprintf (PathPublPhoto,sizeof (PathPublPhoto),"%s/%s.jpg", snprintf (PathPublPhoto,sizeof (PathPublPhoto),"%s/%s.jpg",
@ -1360,7 +1362,7 @@ void Pho_UpdatePhotoName (struct Usr_Data *UsrDat)
unlink (PathPublPhoto); // Remove public link unlink (PathPublPhoto); // Remove public link
/***** Update photo name in user's data *****/ /***** Update photo name in user's data *****/
Str_Copy (UsrDat->Photo,Gbl.UniqueNameEncrypted,sizeof (UsrDat->Photo) - 1); Str_Copy (UsrDat->Photo,UniqueNameEncrypted,sizeof (UsrDat->Photo) - 1);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -382,7 +382,7 @@ void QstImp_ImpQstsFromXML (void)
/***** Creates directory if not exists *****/ /***** Creates directory if not exists *****/
Fil_CreateDirIfNotExists (Cfg_PATH_TEST_PRIVATE); Fil_CreateDirIfNotExists (Cfg_PATH_TEST_PRIVATE);
/***** First of all, copy in disk the file received from stdin (really from Gbl.F.Tmp) *****/ /***** First of all, copy in disk the file received *****/
Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, Param = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG,
FileNameXMLSrc,MIMEType); FileNameXMLSrc,MIMEType);
@ -401,7 +401,7 @@ void QstImp_ImpQstsFromXML (void)
{ {
/* End the reception of XML in a temporary file */ /* End the reception of XML in a temporary file */
snprintf (FileNameXMLTmp,sizeof (FileNameXMLTmp),"%s/%s.xml", snprintf (FileNameXMLTmp,sizeof (FileNameXMLTmp),"%s/%s.xml",
Cfg_PATH_TEST_PRIVATE,Gbl.UniqueNameEncrypted); Cfg_PATH_TEST_PRIVATE,Cry_GetUniqueNameEncrypted ());
if (Fil_EndReceptionOfFile (FileNameXMLTmp,Param)) if (Fil_EndReceptionOfFile (FileNameXMLTmp,Param))
/***** Get questions from XML file and store them in database *****/ /***** Get questions from XML file and store them in database *****/
QstImp_ReadQuestionsFromXMLFileAndStoreInDB (FileNameXMLTmp); QstImp_ReadQuestionsFromXMLFileAndStoreInDB (FileNameXMLTmp);

View File

@ -173,7 +173,7 @@ static void Rep_CreateMyUsageReport (struct Rep_Report *Report)
/***** Store report entry into database *****/ /***** Store report entry into database *****/
Rep_DB_CreateNewReport (Gbl.Usrs.Me.UsrDat.UsrCod,Report, Rep_DB_CreateNewReport (Gbl.Usrs.Me.UsrDat.UsrCod,Report,
Gbl.UniqueNameEncrypted); Cry_GetUniqueNameEncrypted ());
/***** Begin file *****/ /***** Begin file *****/
Lay_BeginHTMLFile (Gbl.F.Rep,Report->FilenameReport); Lay_BeginHTMLFile (Gbl.F.Rep,Report->FilenameReport);
@ -344,6 +344,7 @@ static void Rep_CreateNewReportFile (struct Rep_Report *Report)
char PathUniqueDirL[PATH_MAX + 1]; char PathUniqueDirL[PATH_MAX + 1];
char PathUniqueDirR[PATH_MAX + 1 + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1]; char PathUniqueDirR[PATH_MAX + 1 + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1];
char PathFileReport[PATH_MAX + 1 + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1 + NAME_MAX + 1]; char PathFileReport[PATH_MAX + 1 + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1 + NAME_MAX + 1];
const char *UniqueNameEncrypted = Cry_GetUniqueNameEncrypted ();
char Permalink[128 + char Permalink[128 +
Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 +
NAME_MAX]; NAME_MAX];
@ -355,14 +356,14 @@ static void Rep_CreateNewReportFile (struct Rep_Report *Report)
/* 1. Create a directory using the leftmost 2 chars of a unique name */ /* 1. Create a directory using the leftmost 2 chars of a unique name */
snprintf (PathUniqueDirL,sizeof (PathUniqueDirL),"%s/%c%c", snprintf (PathUniqueDirL,sizeof (PathUniqueDirL),"%s/%c%c",
Cfg_PATH_REP_PUBLIC, Cfg_PATH_REP_PUBLIC,
Gbl.UniqueNameEncrypted[0], UniqueNameEncrypted[0],
Gbl.UniqueNameEncrypted[1]); UniqueNameEncrypted[1]);
Fil_CreateDirIfNotExists (PathUniqueDirL); Fil_CreateDirIfNotExists (PathUniqueDirL);
/* 2. Create a directory using the rightmost 41 chars of a unique name */ /* 2. Create a directory using the rightmost 41 chars of a unique name */
snprintf (PathUniqueDirR,sizeof (PathUniqueDirR),"%s/%s", snprintf (PathUniqueDirR,sizeof (PathUniqueDirR),"%s/%s",
PathUniqueDirL, PathUniqueDirL,
&Gbl.UniqueNameEncrypted[2]); &UniqueNameEncrypted[2]);
if (mkdir (PathUniqueDirR,(mode_t) 0xFFF)) if (mkdir (PathUniqueDirR,(mode_t) 0xFFF))
Err_ShowErrorAndExit ("Can not create directory for report."); Err_ShowErrorAndExit ("Can not create directory for report.");
@ -378,9 +379,9 @@ static void Rep_CreateNewReportFile (struct Rep_Report *Report)
/***** Permalink *****/ /***** Permalink *****/
snprintf (Permalink,sizeof (Permalink),"%s/%c%c/%s/%s", snprintf (Permalink,sizeof (Permalink),"%s/%c%c/%s/%s",
Cfg_URL_REP_PUBLIC, Cfg_URL_REP_PUBLIC,
Gbl.UniqueNameEncrypted[0], UniqueNameEncrypted[0],
Gbl.UniqueNameEncrypted[1], UniqueNameEncrypted[1],
&Gbl.UniqueNameEncrypted[2], &UniqueNameEncrypted[2],
Report->FilenameReport); Report->FilenameReport);
Str_Copy (Report->Permalink,Permalink,sizeof (Report->Permalink) - 1); Str_Copy (Report->Permalink,Permalink,sizeof (Report->Permalink) - 1);
} }

View File

@ -75,7 +75,7 @@ void Ses_GetNumSessions (void)
void Ses_CreateSession (void) void Ses_CreateSession (void)
{ {
/***** Create a unique name for the session *****/ /***** Create a unique name for the session *****/
Str_Copy (Gbl.Session.Id,Gbl.UniqueNameEncrypted,sizeof (Gbl.Session.Id) - 1); Str_Copy (Gbl.Session.Id,Cry_GetUniqueNameEncrypted (),sizeof (Gbl.Session.Id) - 1);
/***** Check that session is not open *****/ /***** Check that session is not open *****/
if (Ses_DB_CheckIfSessionExists (Gbl.Session.Id)) if (Ses_DB_CheckIfSessionExists (Gbl.Session.Id))

View File

@ -670,7 +670,7 @@ static void TmlCom_WriteButtons (const struct Tml_Timeline *Timeline,
/***** Foot column 1: fav zone *****/ /***** Foot column 1: fav zone *****/
HTM_DIV_Begin ("id=\"fav_com_%s_%u\" class=\"Tml_FAV_COM Tml_FAV_WIDTH\"", HTM_DIV_Begin ("id=\"fav_com_%s_%u\" class=\"Tml_FAV_COM Tml_FAV_WIDTH\"",
Gbl.UniqueNameEncrypted,NumDiv); Cry_GetUniqueNameEncrypted (),NumDiv);
TmlUsr_PutIconFavSha (TmlUsr_FAV_UNF_COMM, TmlUsr_PutIconFavSha (TmlUsr_FAV_UNF_COMM,
Com->PubCod,Com->UsrCod,Com->NumFavs, Com->PubCod,Com->UsrCod,Com->NumFavs,
TmlUsr_SHOW_FEW_USRS); TmlUsr_SHOW_FEW_USRS);

View File

@ -818,6 +818,7 @@ static void TmlNot_WriteFavShaRem (const struct Tml_Timeline *Timeline,
const struct Usr_Data *UsrDat) // Author const struct Usr_Data *UsrDat) // Author
{ {
static unsigned NumDiv = 0; // Used to create unique div id for fav and shared static unsigned NumDiv = 0; // Used to create unique div id for fav and shared
const char *UniqueNameEncrypted = Cry_GetUniqueNameEncrypted ();
NumDiv++; NumDiv++;
@ -827,7 +828,7 @@ static void TmlNot_WriteFavShaRem (const struct Tml_Timeline *Timeline,
/***** Foot column 1: fav zone *****/ /***** Foot column 1: fav zone *****/
HTM_DIV_Begin ("id=\"fav_not_%s_%u\"" HTM_DIV_Begin ("id=\"fav_not_%s_%u\""
" class=\"Tml_FAV_NOT Tml_FAV_NOT_WIDTH\"", " class=\"Tml_FAV_NOT Tml_FAV_NOT_WIDTH\"",
Gbl.UniqueNameEncrypted,NumDiv); UniqueNameEncrypted,NumDiv);
TmlUsr_PutIconFavSha (TmlUsr_FAV_UNF_NOTE, TmlUsr_PutIconFavSha (TmlUsr_FAV_UNF_NOTE,
Not->NotCod,Not->UsrCod,Not->NumFavs, Not->NotCod,Not->UsrCod,Not->NumFavs,
TmlUsr_SHOW_FEW_USRS); TmlUsr_SHOW_FEW_USRS);
@ -836,7 +837,7 @@ static void TmlNot_WriteFavShaRem (const struct Tml_Timeline *Timeline,
/***** Foot column 2: share zone *****/ /***** Foot column 2: share zone *****/
HTM_DIV_Begin ("id=\"sha_not_%s_%u\"" HTM_DIV_Begin ("id=\"sha_not_%s_%u\""
" class=\"Tml_SHA_NOT Tml_SHA_NOT_WIDTH\"", " class=\"Tml_SHA_NOT Tml_SHA_NOT_WIDTH\"",
Gbl.UniqueNameEncrypted,NumDiv); UniqueNameEncrypted,NumDiv);
TmlUsr_PutIconFavSha (TmlUsr_SHA_UNS_NOTE, TmlUsr_PutIconFavSha (TmlUsr_SHA_UNS_NOTE,
Not->NotCod,Not->UsrCod,Not->NumShared, Not->NotCod,Not->UsrCod,Not->NumShared,
TmlUsr_SHOW_FEW_USRS); TmlUsr_SHOW_FEW_USRS);

View File

@ -2947,15 +2947,6 @@ void Usr_CopyBasicUsrDataFromList (struct Usr_Data *UsrDat,
static void Usr_AllocateUsrsList (Rol_Role_t Role) static void Usr_AllocateUsrsList (Rol_Role_t Role)
{ {
/*
if (Gbl.Usrs.Me.Roles.LoggedRole == Rol_SYS_ADM)
{
snprintf (Gbl.Alert.Txt,sizeof (Gbl.Alert.Txt),
"Memory used by list = %lu",
(long) sizeof (struct UsrInList) * NumUsrs);
Lay_ShowAlert (Lay_INFO,Gbl.Alert.Txt);
}
*/
if (Gbl.Usrs.LstUsrs[Role].NumUsrs) if (Gbl.Usrs.LstUsrs[Role].NumUsrs)
if ((Gbl.Usrs.LstUsrs[Role].Lst = calloc (Gbl.Usrs.LstUsrs[Role].NumUsrs, if ((Gbl.Usrs.LstUsrs[Role].Lst = calloc (Gbl.Usrs.LstUsrs[Role].NumUsrs,
sizeof (*Gbl.Usrs.LstUsrs[Role].Lst))) == NULL) sizeof (*Gbl.Usrs.LstUsrs[Role].Lst))) == NULL)

View File

@ -225,7 +225,7 @@ static void ZIP_CreateTmpDirForCompression (void)
Fil_CreateDirIfNotExists (Cfg_PATH_ZIP_PRIVATE); Fil_CreateDirIfNotExists (Cfg_PATH_ZIP_PRIVATE);
/***** Create a new temporary directory *****/ /***** Create a new temporary directory *****/
Str_Copy (Gbl.FileBrowser.ZIP.TmpDir,Gbl.UniqueNameEncrypted, Str_Copy (Gbl.FileBrowser.ZIP.TmpDir,Cry_GetUniqueNameEncrypted (),
sizeof (Gbl.FileBrowser.ZIP.TmpDir) - 1); sizeof (Gbl.FileBrowser.ZIP.TmpDir) - 1);
snprintf (PathDirTmp,sizeof (PathDirTmp),"%s/%s", snprintf (PathDirTmp,sizeof (PathDirTmp),"%s/%s",
Cfg_PATH_ZIP_PRIVATE,Gbl.FileBrowser.ZIP.TmpDir); Cfg_PATH_ZIP_PRIVATE,Gbl.FileBrowser.ZIP.TmpDir);