Version 18.6.4

This commit is contained in:
Antonio Cañas Vargas 2018-10-17 14:12:09 +02:00
parent c95fe7dc36
commit ffcd8b0abe
4 changed files with 287 additions and 208 deletions

View File

@ -355,10 +355,11 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 18.6.3 (2018-10-17)"
#define Log_PLATFORM_VERSION "SWAD 18.6.4 (2018-10-17)"
#define CSS_FILE "swad18.4.css"
#define JS_FILE "swad17.17.1.js"
/*
Version 18.6.4: Oct 17, 2018 Some sprintf changed by snprintf. (236034 lines)
Version 18.6.3: Oct 17, 2018 Some sprintf changed by snprintf or asprintf. (235954 lines)
Version 18.6.2: Oct 17, 2018 Some sprintf changed by snprintf. (235808 lines)
Version 18.6.1: Oct 16, 2018 Some sprintf changed by snprintf. (235755 lines)

View File

@ -2919,7 +2919,9 @@ static void Enr_ShowEnrolmentRequestsGivenRoles (unsigned RolesSelected)
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_TOP\">");
Act_StartFormGoTo (ActSeeCrsInf);
Crs_PutParamCrsCod (Crs.CrsCod);
sprintf (Gbl.Title,Txt_Go_to_X,Crs.FullName);
snprintf (Gbl.Title,sizeof (Gbl.Title),
Txt_Go_to_X,
Crs.FullName);
Act_LinkFormSubmit (Gbl.Title,"DAT",NULL);
fprintf (Gbl.F.Out,"%s &gt; %s"
"</a>",

View File

@ -30,8 +30,9 @@
/********************************* Headers ***********************************/
/*****************************************************************************/
#define _GNU_SOURCE // For asprintf
#include <linux/stddef.h> // For NULL
#include <stdio.h> // For sscanf, etc.
#include <stdio.h> // For sscanf, asprintf, etc.
#include <stdlib.h> // For exit, system, malloc, calloc, free, etc.
#include <string.h> // For string functions
@ -1616,11 +1617,12 @@ void Exa_GetSummaryAndContentExamAnnouncement (char SummaryStr[Ntf_MAX_BYTES_SUM
/***** Summary *****/
/* Name of the course and date of exam */
Dat_ConvDateToDateStr (&Gbl.ExamAnns.ExaDat.ExamDate,StrExamDate);
sprintf (CrsNameAndDate,"%s, %s, %2u:%02u",
Gbl.ExamAnns.ExaDat.CrsFullName,
StrExamDate,
Gbl.ExamAnns.ExaDat.StartTime.Hour,
Gbl.ExamAnns.ExaDat.StartTime.Minute);
snprintf (CrsNameAndDate,sizeof (CrsNameAndDate),
"%s, %s, %2u:%02u",
Gbl.ExamAnns.ExaDat.CrsFullName,
StrExamDate,
Gbl.ExamAnns.ExaDat.StartTime.Hour,
Gbl.ExamAnns.ExaDat.StartTime.Minute);
Str_Copy (SummaryStr,CrsNameAndDate,
Ntf_MAX_BYTES_SUMMARY);
@ -1656,10 +1658,6 @@ static void Exa_GetNotifContentExamAnnouncement (char **ContentStr)
struct Instit Ins;
char StrExamDate[Cns_MAX_BYTES_DATE + 1];
if ((*ContentStr = (char *) malloc (Cns_MAX_BYTES_TEXT * 8)) == NULL)
Lay_ShowErrorAndExit ("Error allocating memory for notification content.");
(*ContentStr)[0] = '\0'; // Return nothing on error
/***** Get data of course *****/
Crs.CrsCod = Gbl.ExamAnns.ExaDat.CrsCod;
Crs_GetDataOfCourseByCod (&Crs);
@ -1672,41 +1670,43 @@ static void Exa_GetNotifContentExamAnnouncement (char **ContentStr)
Ins.InsCod = Deg_GetInsCodOfDegreeByCod (Deg.DegCod);
Ins_GetDataOfInstitutionByCod (&Ins,Ins_GET_BASIC_DATA);
/***** Convert struct date to a date string *****/
Dat_ConvDateToDateStr (&Gbl.ExamAnns.ExaDat.ExamDate,StrExamDate);
/***** Institution *****/
sprintf (*ContentStr,"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %2u:%02u %s<br />"
"%s: %2u:%02u %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s",
Txt_Institution,Ins.FullName,
Txt_Degree,Deg.FullName,
Txt_EXAM_ANNOUNCEMENT_Course,Gbl.ExamAnns.ExaDat.CrsFullName,
Txt_EXAM_ANNOUNCEMENT_Year_or_semester,Txt_YEAR_OF_DEGREE[Gbl.ExamAnns.ExaDat.Year],
Txt_EXAM_ANNOUNCEMENT_Session,Gbl.ExamAnns.ExaDat.Session,
Txt_EXAM_ANNOUNCEMENT_Exam_date,StrExamDate,
Txt_EXAM_ANNOUNCEMENT_Start_time,Gbl.ExamAnns.ExaDat.StartTime.Hour,
Gbl.ExamAnns.ExaDat.StartTime.Minute,
Txt_hours_ABBREVIATION,
Txt_EXAM_ANNOUNCEMENT_Approximate_duration,Gbl.ExamAnns.ExaDat.Duration.Hour,
Gbl.ExamAnns.ExaDat.Duration.Minute,
Txt_hours_ABBREVIATION,
Txt_EXAM_ANNOUNCEMENT_Place_of_exam,Gbl.ExamAnns.ExaDat.Place,
Txt_EXAM_ANNOUNCEMENT_Mode,Gbl.ExamAnns.ExaDat.Mode,
Txt_EXAM_ANNOUNCEMENT_Structure_of_the_exam,Gbl.ExamAnns.ExaDat.Structure,
Txt_EXAM_ANNOUNCEMENT_Documentation_required,Gbl.ExamAnns.ExaDat.DocRequired,
Txt_EXAM_ANNOUNCEMENT_Material_required,Gbl.ExamAnns.ExaDat.MatRequired,
Txt_EXAM_ANNOUNCEMENT_Material_allowed,Gbl.ExamAnns.ExaDat.MatAllowed,
Txt_EXAM_ANNOUNCEMENT_Other_information,Gbl.ExamAnns.ExaDat.OtherInfo);
/***** Fill content string *****/
if (asprintf (ContentStr,"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %2u:%02u %s<br />"
"%s: %2u:%02u %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s<br />"
"%s: %s",
Txt_Institution,Ins.FullName,
Txt_Degree,Deg.FullName,
Txt_EXAM_ANNOUNCEMENT_Course,Gbl.ExamAnns.ExaDat.CrsFullName,
Txt_EXAM_ANNOUNCEMENT_Year_or_semester,Txt_YEAR_OF_DEGREE[Gbl.ExamAnns.ExaDat.Year],
Txt_EXAM_ANNOUNCEMENT_Session,Gbl.ExamAnns.ExaDat.Session,
Txt_EXAM_ANNOUNCEMENT_Exam_date,StrExamDate,
Txt_EXAM_ANNOUNCEMENT_Start_time,Gbl.ExamAnns.ExaDat.StartTime.Hour,
Gbl.ExamAnns.ExaDat.StartTime.Minute,
Txt_hours_ABBREVIATION,
Txt_EXAM_ANNOUNCEMENT_Approximate_duration,Gbl.ExamAnns.ExaDat.Duration.Hour,
Gbl.ExamAnns.ExaDat.Duration.Minute,
Txt_hours_ABBREVIATION,
Txt_EXAM_ANNOUNCEMENT_Place_of_exam,Gbl.ExamAnns.ExaDat.Place,
Txt_EXAM_ANNOUNCEMENT_Mode,Gbl.ExamAnns.ExaDat.Mode,
Txt_EXAM_ANNOUNCEMENT_Structure_of_the_exam,Gbl.ExamAnns.ExaDat.Structure,
Txt_EXAM_ANNOUNCEMENT_Documentation_required,Gbl.ExamAnns.ExaDat.DocRequired,
Txt_EXAM_ANNOUNCEMENT_Material_required,Gbl.ExamAnns.ExaDat.MatRequired,
Txt_EXAM_ANNOUNCEMENT_Material_allowed,Gbl.ExamAnns.ExaDat.MatAllowed,
Txt_EXAM_ANNOUNCEMENT_Other_information,Gbl.ExamAnns.ExaDat.OtherInfo) < 0)
Lay_ShowErrorAndExit ("Not enough memory to store string.");
}

View File

@ -2717,7 +2717,7 @@ void Brw_InitializeFileBrowser (void)
static void Brw_SetPathFileBrowser (void)
{
char Path[PATH_MAX*2 + 128];
char Path[PATH_MAX * 2 + 128];
/***** Reset paths. An empty path means that
we don't have to create that directory *****/
@ -2731,64 +2731,76 @@ static void Brw_SetPathFileBrowser (void)
case Brw_ADMI_DOC_INS:
case Brw_ADMI_SHR_INS:
/* Create a directory for institutions */
sprintf (Path,"%s/%s",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_INS);
snprintf (Path,sizeof (Path),
"%s/%s",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_INS);
Fil_CreateDirIfNotExists (Path);
/* Create a directory for all institutions which codes end in
institution-code mod 100 */
sprintf (Path,"%s/%s/%02u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_INS,
(unsigned) (Gbl.CurrentIns.Ins.InsCod % 100));
snprintf (Path,sizeof (Path),
"%s/%s/%02u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_INS,
(unsigned) (Gbl.CurrentIns.Ins.InsCod % 100));
Fil_CreateDirIfNotExists (Path);
/* Create path to the current institution */
sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/%s/%02u/%u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_INS,
(unsigned) (Gbl.CurrentIns.Ins.InsCod % 100),
(unsigned) Gbl.CurrentIns.Ins.InsCod);
snprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder),
"%s/%s/%02u/%u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_INS,
(unsigned) (Gbl.CurrentIns.Ins.InsCod % 100),
(unsigned) Gbl.CurrentIns.Ins.InsCod);
break;
case Brw_SHOW_DOC_CTR:
case Brw_ADMI_DOC_CTR:
case Brw_ADMI_SHR_CTR:
/* Create a directory for centres */
sprintf (Path,"%s/%s",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CTR);
snprintf (Path,sizeof (Path),
"%s/%s",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CTR);
Fil_CreateDirIfNotExists (Path);
/* Create a directory for all centres which codes end in
centre-code mod 100 */
sprintf (Path,"%s/%s/%02u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100));
snprintf (Path,sizeof (Path),
"%s/%s/%02u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100));
Fil_CreateDirIfNotExists (Path);
/* Create path to the current centre */
sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/%s/%02u/%u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100),
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
snprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder),
"%s/%s/%02u/%u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100),
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
break;
case Brw_SHOW_DOC_DEG:
case Brw_ADMI_DOC_DEG:
case Brw_ADMI_SHR_DEG:
/* Create a directory for degrees */
sprintf (Path,"%s/%s",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_DEG);
snprintf (Path,sizeof (Path),
"%s/%s",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_DEG);
Fil_CreateDirIfNotExists (Path);
/* Create a directory for all degrees which codes end in
degree-code mod 100 */
sprintf (Path,"%s/%s/%02u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_DEG,
(unsigned) (Gbl.CurrentDeg.Deg.DegCod % 100));
snprintf (Path,sizeof (Path),
"%s/%s/%02u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_DEG,
(unsigned) (Gbl.CurrentDeg.Deg.DegCod % 100));
Fil_CreateDirIfNotExists (Path);
/* Create path to the current degree */
sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/%s/%02u/%u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_DEG,
(unsigned) (Gbl.CurrentDeg.Deg.DegCod % 100),
(unsigned) Gbl.CurrentDeg.Deg.DegCod);
snprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,
sizeof (Gbl.FileBrowser.Priv.PathAboveRootFolder),
"%s/%s/%02u/%u",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_DEG,
(unsigned) (Gbl.CurrentDeg.Deg.DegCod % 100),
(unsigned) Gbl.CurrentDeg.Deg.DegCod);
break;
case Brw_SHOW_DOC_CRS:
case Brw_ADMI_DOC_CRS:
@ -2808,14 +2820,16 @@ static void Brw_SetPathFileBrowser (void)
case Brw_SHOW_MRK_GRP:
case Brw_ADMI_MRK_GRP:
/* Create a directory for groups inside the current course */
sprintf (Path,"%s/%s",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_GRP);
snprintf (Path,sizeof (Path),
"%s/%s",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_GRP);
Fil_CreateDirIfNotExists (Path);
/* Create path to this group */
sprintf (Path,"%s/%s/%ld",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_GRP,
Gbl.CurrentCrs.Grps.GrpCod);
snprintf (Path,sizeof (Path),
"%s/%s/%ld",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_GRP,
Gbl.CurrentCrs.Grps.GrpCod);
Str_Copy (Gbl.FileBrowser.Priv.PathAboveRootFolder,
Path,
PATH_MAX);
@ -2823,22 +2837,25 @@ static void Brw_SetPathFileBrowser (void)
case Brw_ADMI_ASG_USR:
case Brw_ADMI_WRK_USR:
/* Create a directory for me inside the current course */
sprintf (Path,"%s/%s",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR);
snprintf (Path,sizeof (Path),
"%s/%s",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR);
Fil_CreateDirIfNotExists (Path);
/* Create a directory for all users whose codes end in
my-user-code mod 100 */
sprintf (Path,"%s/%s/%02u",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100));
snprintf (Path,sizeof (Path),
"%s/%s/%02u",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100));
Fil_CreateDirIfNotExists (Path);
/* Create path to me */
sprintf (Path,"%s/%s/%02u/%ld",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100),
Gbl.Usrs.Me.UsrDat.UsrCod);
snprintf (Path,sizeof (Path),
"%s/%s/%02u/%ld",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100),
Gbl.Usrs.Me.UsrDat.UsrCod);
Str_Copy (Gbl.FileBrowser.Priv.PathAboveRootFolder,
Path,
PATH_MAX);
@ -2848,22 +2865,25 @@ static void Brw_SetPathFileBrowser (void)
if (Gbl.Usrs.Other.UsrDat.UsrCod > 0)
{
/* Create a directory for this user inside the current course */
sprintf (Path,"%s/%s",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR);
snprintf (Path,sizeof (Path),
"%s/%s",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR);
Fil_CreateDirIfNotExists (Path);
/* Create a directory for all users whose codes end in
user-code mod 100 */
sprintf (Path,"%s/%s/%02u",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Other.UsrDat.UsrCod % 100));
snprintf (Path,sizeof (Path),
"%s/%s/%02u",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Other.UsrDat.UsrCod % 100));
Fil_CreateDirIfNotExists (Path);
/* Create path to user */
sprintf (Path,"%s/%s/%02u/%ld",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Other.UsrDat.UsrCod % 100),
Gbl.Usrs.Other.UsrDat.UsrCod);
snprintf (Path,sizeof (Path),
"%s/%s/%02u/%ld",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR,
(unsigned) (Gbl.Usrs.Other.UsrDat.UsrCod % 100),
Gbl.Usrs.Other.UsrDat.UsrCod);
Str_Copy (Gbl.FileBrowser.Priv.PathAboveRootFolder,
Path,
PATH_MAX);
@ -2872,22 +2892,25 @@ static void Brw_SetPathFileBrowser (void)
case Brw_ADMI_DOC_PRJ:
case Brw_ADMI_ASS_PRJ:
/* Create a directory for projects inside the current course */
sprintf (Path,"%s/%s",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_PRJ);
snprintf (Path,sizeof (Path),
"%s/%s",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_PRJ);
Fil_CreateDirIfNotExists (Path);
/* Create a directory for all projects which codes end in
project-code mod 100 */
sprintf (Path,"%s/%s/%02u",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_PRJ,
(unsigned) (Gbl.Prjs.PrjCod % 100));
snprintf (Path,sizeof (Path),
"%s/%s/%02u",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_PRJ,
(unsigned) (Gbl.Prjs.PrjCod % 100));
Fil_CreateDirIfNotExists (Path);
/* Create path to the current project */
sprintf (Path,"%s/%s/%02u/%ld",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_PRJ,
(unsigned) (Gbl.Prjs.PrjCod % 100),
Gbl.Prjs.PrjCod);
snprintf (Path,sizeof (Path),
"%s/%s/%02u/%ld",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_PRJ,
(unsigned) (Gbl.Prjs.PrjCod % 100),
Gbl.Prjs.PrjCod);
Str_Copy (Gbl.FileBrowser.Priv.PathAboveRootFolder,
Path,
PATH_MAX);
@ -2905,9 +2928,10 @@ static void Brw_SetPathFileBrowser (void)
if (Gbl.FileBrowser.Priv.PathAboveRootFolder[0])
{
Fil_CreateDirIfNotExists (Gbl.FileBrowser.Priv.PathAboveRootFolder);
sprintf (Path,"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder,
Brw_RootFolderInternalNames[Gbl.FileBrowser.Type]);
snprintf (Path,sizeof (Path),
"%s/%s",
Gbl.FileBrowser.Priv.PathAboveRootFolder,
Brw_RootFolderInternalNames[Gbl.FileBrowser.Type]);
Str_Copy (Gbl.FileBrowser.Priv.PathRootFolder,
Path,
PATH_MAX);
@ -2953,12 +2977,13 @@ bool Brw_CheckIfExistsFolderAssigmentForAnyUsr (const char *FolderName)
UsrCod = Str_ConvertStrCodToLongCod (row[0]);
/* Check if folder exists */
sprintf (PathFolder,"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
FolderName);
snprintf (PathFolder,sizeof (PathFolder),
"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
FolderName);
FolderExists = Fil_CheckIfPathExists (PathFolder);
}
@ -3007,8 +3032,9 @@ static void Brw_CreateFoldersAssignmentsIfNotExist (long ZoneUsrCod)
if (row[0]) // Not necessary, because folder name is checked in query to be not empty
{
/* Create folder if not exists */
sprintf (PathFolderAsg,"%s/%s",
Gbl.FileBrowser.Priv.PathRootFolder,row[0]);
snprintf (PathFolderAsg,sizeof (PathFolderAsg),
"%s/%s",
Gbl.FileBrowser.Priv.PathRootFolder,row[0]);
Fil_CreateDirIfNotExists (PathFolderAsg);
}
}
@ -3057,18 +3083,20 @@ bool Brw_UpdateFoldersAssigmentsIfExistForAllUsrs (const char *OldFolderName,con
UsrCod = Str_ConvertStrCodToLongCod (row[0]);
/* Rename folder if exists */
sprintf (PathOldFolder,"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
OldFolderName);
sprintf (PathNewFolder,"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
NewFolderName);
snprintf (PathOldFolder,sizeof (PathOldFolder),
"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
OldFolderName);
snprintf (PathNewFolder,sizeof (PathNewFolder),
"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
NewFolderName);
if (Fil_CheckIfPathExists (PathOldFolder) &&
Fil_CheckIfPathExists (PathNewFolder))
RenamingIsPossible = false;
@ -3087,20 +3115,22 @@ bool Brw_UpdateFoldersAssigmentsIfExistForAllUsrs (const char *OldFolderName,con
UsrCod = Str_ConvertStrCodToLongCod (row[0]);
/* Rename folder if exists */
sprintf (PathOldFolder,"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
OldFolderName);
snprintf (PathOldFolder,sizeof (PathOldFolder),
"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
OldFolderName);
if (Fil_CheckIfPathExists (PathOldFolder))
{
sprintf (PathNewFolder,"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
NewFolderName);
snprintf (PathNewFolder,sizeof (PathNewFolder),
"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
NewFolderName);
if (rename (PathOldFolder,PathNewFolder)) // Fail
{
Ale_ShowAlert (Ale_ERROR,Txt_Can_not_rename_a_folder_of_assignment);
@ -3113,10 +3143,16 @@ bool Brw_UpdateFoldersAssigmentsIfExistForAllUsrs (const char *OldFolderName,con
Brw_RemoveAffectedClipboards (Brw_ADMI_ASG_CRS,-1L,UsrCod);
/* Rename affected expanded folders */
sprintf (OldPath,"%s/%s",Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,OldFolderName);
sprintf (NewPath,"%s/%s",Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,NewFolderName);
Brw_RenameAffectedExpandedFolders (Brw_ADMI_ASG_USR,UsrCod,-1L,OldPath,NewPath);
Brw_RenameAffectedExpandedFolders (Brw_ADMI_ASG_CRS,-1L,UsrCod,OldPath,NewPath);
snprintf (OldPath,sizeof (OldPath),
"%s/%s",
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,OldFolderName);
snprintf (NewPath,sizeof (NewPath),
"%s/%s",
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,NewFolderName);
Brw_RenameAffectedExpandedFolders (Brw_ADMI_ASG_USR,UsrCod,-1L,
OldPath,NewPath);
Brw_RenameAffectedExpandedFolders (Brw_ADMI_ASG_CRS,-1L,UsrCod,
OldPath,NewPath);
NumUsrsSuccess++;
}
@ -3173,12 +3209,13 @@ void Brw_RemoveFoldersAssignmentsIfExistForAllUsrs (const char *FolderName)
UsrCod = Str_ConvertStrCodToLongCod (row[0]);
/* Remove tree if exists */
sprintf (PathFolder,"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
FolderName);
snprintf (PathFolder,sizeof (PathFolder),
"%s/usr/%02u/%ld/%s/%s",
Gbl.CurrentCrs.PathPriv,
(unsigned) (UsrCod % 100),
UsrCod, // User's code
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
FolderName);
Fil_RemoveTree (PathFolder);
}
@ -3992,7 +4029,9 @@ static void Brw_ShowFileBrowser (void)
/***** Start box *****/
Gbl.FileBrowser.Id++;
sprintf (FileBrowserSectionId,"file_browser_%u",Gbl.FileBrowser.Id);
snprintf (FileBrowserSectionId,sizeof (FileBrowserSectionId),
"file_browser_%u",
Gbl.FileBrowser.Id);
Lay_StartSection (FileBrowserSectionId);
Box_StartBox ("100%",Brw_TitleOfFileBrowser[Gbl.FileBrowser.Type],
Brw_PutIconsFileBrowser,
@ -4281,77 +4320,93 @@ static void Brw_WriteSubtitleOfFileBrowser (void)
switch (Gbl.FileBrowser.Type)
{
case Brw_SHOW_DOC_INS:
sprintf (Subtitle,"(%s)",
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_institution);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_institution);
break;
case Brw_ADMI_DOC_INS:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_administrators_of_the_institution);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_administrators_of_the_institution);
break;
case Brw_ADMI_SHR_INS:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_institution);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_institution);
break;
case Brw_SHOW_DOC_CTR:
sprintf (Subtitle,"(%s)",
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_centre);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_centre);
break;
case Brw_ADMI_DOC_CTR:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_administrators_of_the_centre);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_administrators_of_the_centre);
break;
case Brw_ADMI_SHR_CTR:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_centre);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_centre);
break;
case Brw_SHOW_DOC_DEG:
sprintf (Subtitle,"(%s)",
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_degree);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_degree);
break;
case Brw_ADMI_DOC_DEG:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_administrators_of_the_degree);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_administrators_of_the_degree);
break;
case Brw_ADMI_SHR_DEG:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_degree);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_degree);
break;
case Brw_SHOW_DOC_CRS:
sprintf (Subtitle,"(%s)",
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_course);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_only_for_reading_by_students_and_teachers_of_the_course);
break;
case Brw_SHOW_DOC_GRP:
sprintf (Subtitle,"(%s)",
Txt_accessible_only_for_reading_by_students_of_the_group_and_teachers_of_the_course);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_only_for_reading_by_students_of_the_group_and_teachers_of_the_course);
break;
case Brw_ADMI_DOC_CRS:
case Brw_ADMI_DOC_GRP:
case Brw_ADMI_TCH_CRS:
case Brw_ADMI_TCH_GRP:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_teachers_of_the_course);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_teachers_of_the_course);
break;
case Brw_ADMI_SHR_CRS:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_course);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_course);
break;
case Brw_ADMI_SHR_GRP:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_students_of_the_group_and_teachers_of_the_course);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_students_of_the_group_and_teachers_of_the_course);
break;
case Brw_SHOW_MRK_CRS:
case Brw_SHOW_MRK_GRP:
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_STD:
sprintf (Subtitle,"(%s)",
Txt_accessible_only_for_reading_by_you_and_the_teachers_of_the_course);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_only_for_reading_by_you_and_the_teachers_of_the_course);
break;
case Rol_NET:
case Rol_TCH:
case Rol_SYS_ADM:
sprintf (Subtitle,"(%s)",
Txt_the_marks_of_a_student_chosen_at_random_);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_the_marks_of_a_student_chosen_at_random_);
break;
default:
Subtitle[0] = '\0';
@ -4361,32 +4416,38 @@ static void Brw_WriteSubtitleOfFileBrowser (void)
break;
case Brw_ADMI_MRK_CRS:
case Brw_ADMI_MRK_GRP:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_teachers_of_the_course);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_teachers_of_the_course);
break;
case Brw_ADMI_ASG_USR:
case Brw_ADMI_WRK_USR:
sprintf (Subtitle,"%s<br />(%s)",
Gbl.Usrs.Me.UsrDat.FullName,
Txt_accessible_for_reading_and_writing_by_you_and_the_teachers_of_the_course);
snprintf (Subtitle,sizeof (Subtitle),
"%s<br />(%s)",
Gbl.Usrs.Me.UsrDat.FullName,
Txt_accessible_for_reading_and_writing_by_you_and_the_teachers_of_the_course);
break;
case Brw_ADMI_ASG_CRS:
case Brw_ADMI_WRK_CRS:
sprintf (Subtitle,"%s",
Gbl.Usrs.Other.UsrDat.FullName);
snprintf (Subtitle,sizeof (Subtitle),
"%s",
Gbl.Usrs.Other.UsrDat.FullName);
break;
case Brw_ADMI_DOC_PRJ:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_project_members);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_project_members);
break;
case Brw_ADMI_ASS_PRJ:
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_project_tutors_and_evaluators);
snprintf (Subtitle,sizeof (Subtitle),
"(%s)",
Txt_accessible_for_reading_and_writing_by_project_tutors_and_evaluators);
break;
case Brw_ADMI_BRF_USR:
sprintf (Subtitle,"%s<br />(%s)",
Gbl.Usrs.Me.UsrDat.FullName,
Txt_nobody_else_can_access_this_content);
snprintf (Subtitle,sizeof (Subtitle),
"%s<br />(%s)",
Gbl.Usrs.Me.UsrDat.FullName,
Txt_nobody_else_can_access_this_content);
break;
case Brw_UNKNOWN:
return;
@ -5391,8 +5452,9 @@ void Brw_CreateDirDownloadTmp (void)
/* Example: /var/www/html/swad/tmp/SSujCNWsy4ZOdmgMKYBe0sKPAJu6szaZOQlIlJs_QIY */
/***** If the public directory does not exist, create it *****/
sprintf (PathFileBrowserTmpPubl,"%s/%s",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_FILE_BROWSER_TMP);
snprintf (PathFileBrowserTmpPubl,sizeof (PathFileBrowserTmpPubl),
"%s/%s",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_FILE_BROWSER_TMP);
Fil_CreateDirIfNotExists (PathFileBrowserTmpPubl);
/***** First of all, we remove the oldest temporary directories.
@ -5405,11 +5467,15 @@ void Brw_CreateDirDownloadTmp (void)
/***** Create a new temporary directory.
Important: number of directories inside a directory is limited to 32K in Linux *****/
if (NumDir)
sprintf (Gbl.FileBrowser.TmpPubDir,"%s_%u",Gbl.UniqueNameEncrypted,NumDir);
snprintf (Gbl.FileBrowser.TmpPubDir,sizeof (Gbl.FileBrowser.TmpPubDir),
"%s_%u",
Gbl.UniqueNameEncrypted,NumDir);
else
Str_Copy (Gbl.FileBrowser.TmpPubDir,Gbl.UniqueNameEncrypted,
NAME_MAX);
sprintf (PathPubDirTmp,"%s/%s",PathFileBrowserTmpPubl,Gbl.FileBrowser.TmpPubDir);
snprintf (PathPubDirTmp,sizeof (PathPubDirTmp),
"%s/%s",
PathFileBrowserTmpPubl,Gbl.FileBrowser.TmpPubDir);
if (mkdir (PathPubDirTmp,(mode_t) 0xFFF))
Lay_ShowErrorAndExit ("Can not create a temporary folder for download.");
NumDir++;
@ -5610,7 +5676,9 @@ static void Brw_CalcSizeOfDirRecursive (unsigned Level,char *Path)
Gbl.FileBrowser.Size.NumLevls++;
/* Update counters depending on whether it's a directory or a regular file */
sprintf (PathFileRel,"%s/%s",Path,FileList[NumFile]->d_name);
snprintf (PathFileRel,sizeof (PathFileRel),
"%s/%s",
Path,FileList[NumFile]->d_name);
if (lstat (PathFileRel,&FileStatus)) // On success ==> 0 is returned
Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
else if (S_ISDIR (FileStatus.st_mode)) // It's a directory
@ -5667,13 +5735,19 @@ static void Brw_ListDir (unsigned Level,const char *ParentRowId,
strcmp (FileList[NumFile]->d_name,"..")) // Skip directories "." and ".."
{
/***** Construct the full path of the file or folder *****/
sprintf (PathFileRel ,"%s/%s",Path ,FileList[NumFile]->d_name);
sprintf (PathFileInExplTree,"%s/%s",PathInTree,FileList[NumFile]->d_name);
snprintf (PathFileRel,sizeof (PathFileRel),
"%s/%s",
Path ,FileList[NumFile]->d_name);
snprintf (PathFileInExplTree,sizeof (PathFileInExplTree),
"%s/%s",
PathInTree,FileList[NumFile]->d_name);
Brw_SetFullPathInTree (PathInTree,FileList[NumFile]->d_name);
/***** Add number of row to parent row id *****/
NumRow++;
sprintf (RowId,"%s_%u",ParentRowId,NumRow);
snprintf (RowId,sizeof (RowId),
"%s_%u",
ParentRowId,NumRow);
/***** Get file or folder status *****/
if (lstat (PathFileRel,&FileStatus)) // On success ==> 0 is returned
@ -5779,7 +5853,9 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
/***** Initializations *****/
Gbl.FileBrowser.Clipboard.IsThisFile = false;
sprintf (FileBrowserId,"file_browser_%u",Gbl.FileBrowser.Id);
snprintf (FileBrowserId,sizeof (FileBrowserId),
"file_browser_%u",
Gbl.FileBrowser.Id);
/***** Is this row hidden or visible? *****/
if (SeeDocsZone || AdminDocsZone ||