mirror of https://github.com/acanas/swad-core.git
Version 16.18
This commit is contained in:
parent
e0b2173811
commit
179107db58
2
Makefile
2
Makefile
|
@ -37,7 +37,7 @@ OBJS = swad_account.o swad_action.o swad_agenda.o swad_announcement.o \
|
||||||
swad_file.o swad_file_browser.o swad_follow.o swad_forum.o \
|
swad_file.o swad_file_browser.o swad_follow.o swad_forum.o \
|
||||||
swad_global.o swad_group.o \
|
swad_global.o swad_group.o \
|
||||||
swad_help.o swad_holiday.o \
|
swad_help.o swad_holiday.o \
|
||||||
swad_icon.o swad_ID.o swad_image.o swad_import.o swad_indicator.o \
|
swad_icon.o swad_ID.o swad_image.o swad_indicator.o \
|
||||||
swad_info.o swad_institution.o \
|
swad_info.o swad_institution.o \
|
||||||
swad_layout.o swad_link.o swad_logo.o \
|
swad_layout.o swad_link.o swad_logo.o \
|
||||||
swad_mail.o swad_main.o swad_mark.o swad_menu.o swad_message.o \
|
swad_mail.o swad_main.o swad_mark.o swad_menu.o swad_message.o \
|
||||||
|
|
35
sql/swad.sql
35
sql/swad.sql
|
@ -575,41 +575,6 @@ CREATE TABLE IF NOT EXISTS holidays (
|
||||||
INDEX(InsCod),
|
INDEX(InsCod),
|
||||||
INDEX(PlcCod));
|
INDEX(PlcCod));
|
||||||
--
|
--
|
||||||
-- Table imported_groups: stores the external groups in a course imported from an external service
|
|
||||||
--
|
|
||||||
CREATE TABLE IF NOT EXISTS imported_groups (
|
|
||||||
GrpCod INT NOT NULL AUTO_INCREMENT,
|
|
||||||
SessionId CHAR(43) NOT NULL,
|
|
||||||
ExternalCrsCod CHAR(7) NOT NULL,
|
|
||||||
DegName VARCHAR(127) NOT NULL,
|
|
||||||
CrsName VARCHAR(127) NOT NULL,
|
|
||||||
GrpName VARCHAR(255) NOT NULL,
|
|
||||||
GrpType VARCHAR(255) NOT NULL,
|
|
||||||
UNIQUE INDEX(GrpCod),
|
|
||||||
INDEX(SessionId));
|
|
||||||
--
|
|
||||||
-- Table imported_sessions: stores the session data from external service
|
|
||||||
--
|
|
||||||
CREATE TABLE IF NOT EXISTS imported_sessions (
|
|
||||||
SessionId CHAR(43) NOT NULL,
|
|
||||||
UsrCod INT NOT NULL,
|
|
||||||
ImportedUsrId CHAR(255) NOT NULL,
|
|
||||||
ImportedSessionId CHAR(255) NOT NULL,
|
|
||||||
ImportedRole TINYINT NOT NULL DEFAULT 0,
|
|
||||||
UNIQUE INDEX(SessionId));
|
|
||||||
--
|
|
||||||
-- Table imported_students: stores the data of students imported from external service
|
|
||||||
--
|
|
||||||
CREATE TABLE IF NOT EXISTS imported_students (
|
|
||||||
GrpCod INT NOT NULL AUTO_INCREMENT,
|
|
||||||
UsrID CHAR(16) NOT NULL,
|
|
||||||
Surname1 VARCHAR(32) NOT NULL,
|
|
||||||
Surname2 VARCHAR(32) NOT NULL,
|
|
||||||
FirstName VARCHAR(32) NOT NULL,
|
|
||||||
Sex ENUM('unknown','female','male') NOT NULL DEFAULT 'unknown',
|
|
||||||
E_mail VARCHAR(127) NOT NULL,
|
|
||||||
INDEX(GrpCod));
|
|
||||||
--
|
|
||||||
-- Table institutions: stores the institutions (for example, universities)
|
-- Table institutions: stores the institutions (for example, universities)
|
||||||
--
|
--
|
||||||
CREATE TABLE IF NOT EXISTS institutions (
|
CREATE TABLE IF NOT EXISTS institutions (
|
||||||
|
|
|
@ -918,8 +918,6 @@ Users:
|
||||||
760. ActRenGrp Request renaming of a group of students
|
760. ActRenGrp Request renaming of a group of students
|
||||||
761. ActChgMaxStdGrp Request change in the number máximo of students of a group
|
761. ActChgMaxStdGrp Request change in the number máximo of students of a group
|
||||||
|
|
||||||
762. ActGetExtLstStd Get external lists of students
|
|
||||||
|
|
||||||
763. ActLstGst List main data of administrators
|
763. ActLstGst List main data of administrators
|
||||||
|
|
||||||
764. ActPrnGstPho Show the class photo of guests ready to be printed
|
764. ActPrnGstPho Show the class photo of guests ready to be printed
|
||||||
|
@ -1329,7 +1327,6 @@ Profile:
|
||||||
|
|
||||||
1138. ActAutUsrInt Authentify user internally (directly from the platform)
|
1138. ActAutUsrInt Authentify user internally (directly from the platform)
|
||||||
NEW. ActAutUsrNew Authentify user internally (directly from the platform, only if user has not password)
|
NEW. ActAutUsrNew Authentify user internally (directly from the platform, only if user has not password)
|
||||||
1139. ActAutUsrExt Authentify user externally (remotely from an external site)
|
|
||||||
1140. ActAutUsrChgLan Change language to my language just after authentication
|
1140. ActAutUsrChgLan Change language to my language just after authentication
|
||||||
1141. ActAnnSee Mark announcement as seen
|
1141. ActAnnSee Mark announcement as seen
|
||||||
1142. ActChgMyRol Change type of logged user
|
1142. ActChgMyRol Change type of logged user
|
||||||
|
@ -2306,8 +2303,6 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
|
||||||
/* ActRenGrp */{ 121,-1,TabUsr,ActReqSelGrp ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Grp_RenameGroup ,NULL},
|
/* ActRenGrp */{ 121,-1,TabUsr,ActReqSelGrp ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Grp_RenameGroup ,NULL},
|
||||||
/* ActChgMaxStdGrp */{ 106,-1,TabUsr,ActReqSelGrp ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Grp_ChangeMaxStdsGrp ,NULL},
|
/* ActChgMaxStdGrp */{ 106,-1,TabUsr,ActReqSelGrp ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Grp_ChangeMaxStdsGrp ,NULL},
|
||||||
|
|
||||||
/* ActGetExtLstStd */{ 796,-1,TabUsr,ActLstStd ,0x110,0x110,0x110,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Imp_ListMyImpGrpsAndStdsNoForm ,NULL},
|
|
||||||
|
|
||||||
/* ActLstGst */{ 587,-1,TabUsr,ActLstOth ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_SeeGuests ,NULL},
|
/* ActLstGst */{ 587,-1,TabUsr,ActLstOth ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_SeeGuests ,NULL},
|
||||||
|
|
||||||
/* ActPrnGstPho */{1190,-1,TabUsr,ActLstStd ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,Usr_SeeGstClassPhotoPrn ,NULL},
|
/* ActPrnGstPho */{1190,-1,TabUsr,ActLstStd ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,Usr_SeeGstClassPhotoPrn ,NULL},
|
||||||
|
@ -2762,7 +2757,6 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
|
||||||
|
|
||||||
/* ActAutUsrInt */{ 6,-1,TabPrf,ActFrmRolSes ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_WelcomeUsr ,NULL},
|
/* ActAutUsrInt */{ 6,-1,TabPrf,ActFrmRolSes ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_WelcomeUsr ,NULL},
|
||||||
/* ActAutUsrNew */{1585,-1,TabPrf,ActFrmRolSes ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_WelcomeUsr ,NULL},
|
/* ActAutUsrNew */{1585,-1,TabPrf,ActFrmRolSes ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_WelcomeUsr ,NULL},
|
||||||
/* ActAutUsrExt */{ 794,-1,TabPrf,ActFrmRolSes ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_WelcomeUsr ,NULL},
|
|
||||||
/* ActAutUsrChgLan */{1077,-1,TabPrf,ActFrmRolSes ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_WelcomeUsr ,NULL},
|
/* ActAutUsrChgLan */{1077,-1,TabPrf,ActFrmRolSes ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_WelcomeUsr ,NULL},
|
||||||
/* ActAnnSee */{1234,-1,TabPrf,ActFrmRolSes ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ann_MarkAnnouncementAsSeen ,NULL},
|
/* ActAnnSee */{1234,-1,TabPrf,ActFrmRolSes ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ann_MarkAnnouncementAsSeen ,NULL},
|
||||||
/* ActChgMyRol */{ 589,-1,TabPrf,ActFrmRolSes ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Rol_ChangeMyRole ,Usr_ShowFormsLogoutAndRole ,NULL},
|
/* ActChgMyRol */{ 589,-1,TabPrf,ActFrmRolSes ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Rol_ChangeMyRole ,Usr_ShowFormsLogoutAndRole ,NULL},
|
||||||
|
@ -3647,9 +3641,9 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq
|
||||||
ActRcvURLTchGui, // #791
|
ActRcvURLTchGui, // #791
|
||||||
ActAdmAsgWrkUsr, // #792
|
ActAdmAsgWrkUsr, // #792
|
||||||
-1, // #793 (obsolete action)
|
-1, // #793 (obsolete action)
|
||||||
ActAutUsrExt, // #794
|
-1, // #794 (obsolete action)
|
||||||
-1, // #795 (obsolete action)
|
-1, // #795 (obsolete action)
|
||||||
ActGetExtLstStd, // #796
|
-1, // #796 (obsolete action)
|
||||||
-1, // #797 (obsolete action)
|
-1, // #797 (obsolete action)
|
||||||
-1, // #798 (obsolete action)
|
-1, // #798 (obsolete action)
|
||||||
-1, // #799 (obsolete action)
|
-1, // #799 (obsolete action)
|
||||||
|
|
403
swad_action.h
403
swad_action.h
|
@ -72,7 +72,7 @@ typedef enum
|
||||||
|
|
||||||
typedef int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
|
typedef int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
|
||||||
|
|
||||||
#define Act_NUM_ACTIONS (1+9+51+15+90+70+67+246+186+156+172+36+30+87)
|
#define Act_NUM_ACTIONS (1+9+51+15+90+70+67+246+186+155+172+36+30+86)
|
||||||
|
|
||||||
#define Act_MAX_ACTION_COD 1586
|
#define Act_MAX_ACTION_COD 1586
|
||||||
|
|
||||||
|
@ -951,154 +951,152 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica
|
||||||
#define ActRenGrp (ActChgNumRowFooGrp+ 26)
|
#define ActRenGrp (ActChgNumRowFooGrp+ 26)
|
||||||
#define ActChgMaxStdGrp (ActChgNumRowFooGrp+ 27)
|
#define ActChgMaxStdGrp (ActChgNumRowFooGrp+ 27)
|
||||||
|
|
||||||
#define ActGetExtLstStd (ActChgNumRowFooGrp+ 28)
|
#define ActLstGst (ActChgNumRowFooGrp+ 28)
|
||||||
|
|
||||||
#define ActLstGst (ActChgNumRowFooGrp+ 29)
|
#define ActPrnGstPho (ActChgNumRowFooGrp+ 29)
|
||||||
|
#define ActPrnStdPho (ActChgNumRowFooGrp+ 30)
|
||||||
|
#define ActPrnTchPho (ActChgNumRowFooGrp+ 31)
|
||||||
|
#define ActLstGstAll (ActChgNumRowFooGrp+ 32)
|
||||||
|
#define ActLstStdAll (ActChgNumRowFooGrp+ 33)
|
||||||
|
#define ActLstTchAll (ActChgNumRowFooGrp+ 34)
|
||||||
|
|
||||||
#define ActPrnGstPho (ActChgNumRowFooGrp+ 30)
|
#define ActSeeRecOneStd (ActChgNumRowFooGrp+ 35)
|
||||||
#define ActPrnStdPho (ActChgNumRowFooGrp+ 31)
|
#define ActSeeRecOneTch (ActChgNumRowFooGrp+ 36)
|
||||||
#define ActPrnTchPho (ActChgNumRowFooGrp+ 32)
|
#define ActSeeRecSevGst (ActChgNumRowFooGrp+ 37)
|
||||||
#define ActLstGstAll (ActChgNumRowFooGrp+ 33)
|
#define ActSeeRecSevStd (ActChgNumRowFooGrp+ 38)
|
||||||
#define ActLstStdAll (ActChgNumRowFooGrp+ 34)
|
#define ActSeeRecSevTch (ActChgNumRowFooGrp+ 39)
|
||||||
#define ActLstTchAll (ActChgNumRowFooGrp+ 35)
|
#define ActPrnRecSevGst (ActChgNumRowFooGrp+ 40)
|
||||||
|
#define ActPrnRecSevStd (ActChgNumRowFooGrp+ 41)
|
||||||
|
#define ActPrnRecSevTch (ActChgNumRowFooGrp+ 42)
|
||||||
|
#define ActRcvRecOthUsr (ActChgNumRowFooGrp+ 43)
|
||||||
|
#define ActEdiRecFie (ActChgNumRowFooGrp+ 44)
|
||||||
|
#define ActNewFie (ActChgNumRowFooGrp+ 45)
|
||||||
|
#define ActReqRemFie (ActChgNumRowFooGrp+ 46)
|
||||||
|
#define ActRemFie (ActChgNumRowFooGrp+ 47)
|
||||||
|
#define ActRenFie (ActChgNumRowFooGrp+ 48)
|
||||||
|
#define ActChgRowFie (ActChgNumRowFooGrp+ 49)
|
||||||
|
#define ActChgVisFie (ActChgNumRowFooGrp+ 50)
|
||||||
|
#define ActRcvRecCrs (ActChgNumRowFooGrp+ 51)
|
||||||
|
|
||||||
#define ActSeeRecOneStd (ActChgNumRowFooGrp+ 36)
|
#define ActReqEnrSevStd (ActChgNumRowFooGrp+ 52)
|
||||||
#define ActSeeRecOneTch (ActChgNumRowFooGrp+ 37)
|
#define ActReqEnrSevTch (ActChgNumRowFooGrp+ 53)
|
||||||
#define ActSeeRecSevGst (ActChgNumRowFooGrp+ 38)
|
|
||||||
#define ActSeeRecSevStd (ActChgNumRowFooGrp+ 39)
|
|
||||||
#define ActSeeRecSevTch (ActChgNumRowFooGrp+ 40)
|
|
||||||
#define ActPrnRecSevGst (ActChgNumRowFooGrp+ 41)
|
|
||||||
#define ActPrnRecSevStd (ActChgNumRowFooGrp+ 42)
|
|
||||||
#define ActPrnRecSevTch (ActChgNumRowFooGrp+ 43)
|
|
||||||
#define ActRcvRecOthUsr (ActChgNumRowFooGrp+ 44)
|
|
||||||
#define ActEdiRecFie (ActChgNumRowFooGrp+ 45)
|
|
||||||
#define ActNewFie (ActChgNumRowFooGrp+ 46)
|
|
||||||
#define ActReqRemFie (ActChgNumRowFooGrp+ 47)
|
|
||||||
#define ActRemFie (ActChgNumRowFooGrp+ 48)
|
|
||||||
#define ActRenFie (ActChgNumRowFooGrp+ 49)
|
|
||||||
#define ActChgRowFie (ActChgNumRowFooGrp+ 50)
|
|
||||||
#define ActChgVisFie (ActChgNumRowFooGrp+ 51)
|
|
||||||
#define ActRcvRecCrs (ActChgNumRowFooGrp+ 52)
|
|
||||||
|
|
||||||
#define ActReqEnrSevStd (ActChgNumRowFooGrp+ 53)
|
#define ActReqLstStdAtt (ActChgNumRowFooGrp+ 54)
|
||||||
#define ActReqEnrSevTch (ActChgNumRowFooGrp+ 54)
|
#define ActSeeLstMyAtt (ActChgNumRowFooGrp+ 55)
|
||||||
|
#define ActPrnLstMyAtt (ActChgNumRowFooGrp+ 56)
|
||||||
|
#define ActSeeLstStdAtt (ActChgNumRowFooGrp+ 57)
|
||||||
|
#define ActPrnLstStdAtt (ActChgNumRowFooGrp+ 58)
|
||||||
|
#define ActFrmNewAtt (ActChgNumRowFooGrp+ 59)
|
||||||
|
#define ActEdiOneAtt (ActChgNumRowFooGrp+ 60)
|
||||||
|
#define ActNewAtt (ActChgNumRowFooGrp+ 61)
|
||||||
|
#define ActChgAtt (ActChgNumRowFooGrp+ 62)
|
||||||
|
#define ActReqRemAtt (ActChgNumRowFooGrp+ 63)
|
||||||
|
#define ActRemAtt (ActChgNumRowFooGrp+ 64)
|
||||||
|
#define ActHidAtt (ActChgNumRowFooGrp+ 65)
|
||||||
|
#define ActShoAtt (ActChgNumRowFooGrp+ 66)
|
||||||
|
#define ActSeeOneAtt (ActChgNumRowFooGrp+ 67)
|
||||||
|
#define ActRecAttStd (ActChgNumRowFooGrp+ 68)
|
||||||
|
#define ActRecAttMe (ActChgNumRowFooGrp+ 69)
|
||||||
|
|
||||||
#define ActReqLstStdAtt (ActChgNumRowFooGrp+ 55)
|
#define ActSignUp (ActChgNumRowFooGrp+ 70)
|
||||||
#define ActSeeLstMyAtt (ActChgNumRowFooGrp+ 56)
|
#define ActUpdSignUpReq (ActChgNumRowFooGrp+ 71)
|
||||||
#define ActPrnLstMyAtt (ActChgNumRowFooGrp+ 57)
|
#define ActReqRejSignUp (ActChgNumRowFooGrp+ 72)
|
||||||
#define ActSeeLstStdAtt (ActChgNumRowFooGrp+ 58)
|
#define ActRejSignUp (ActChgNumRowFooGrp+ 73)
|
||||||
#define ActPrnLstStdAtt (ActChgNumRowFooGrp+ 59)
|
|
||||||
#define ActFrmNewAtt (ActChgNumRowFooGrp+ 60)
|
|
||||||
#define ActEdiOneAtt (ActChgNumRowFooGrp+ 61)
|
|
||||||
#define ActNewAtt (ActChgNumRowFooGrp+ 62)
|
|
||||||
#define ActChgAtt (ActChgNumRowFooGrp+ 63)
|
|
||||||
#define ActReqRemAtt (ActChgNumRowFooGrp+ 64)
|
|
||||||
#define ActRemAtt (ActChgNumRowFooGrp+ 65)
|
|
||||||
#define ActHidAtt (ActChgNumRowFooGrp+ 66)
|
|
||||||
#define ActShoAtt (ActChgNumRowFooGrp+ 67)
|
|
||||||
#define ActSeeOneAtt (ActChgNumRowFooGrp+ 68)
|
|
||||||
#define ActRecAttStd (ActChgNumRowFooGrp+ 69)
|
|
||||||
#define ActRecAttMe (ActChgNumRowFooGrp+ 70)
|
|
||||||
|
|
||||||
#define ActSignUp (ActChgNumRowFooGrp+ 71)
|
#define ActReqMdfOneOth (ActChgNumRowFooGrp+ 74)
|
||||||
#define ActUpdSignUpReq (ActChgNumRowFooGrp+ 72)
|
#define ActReqMdfOneStd (ActChgNumRowFooGrp+ 75)
|
||||||
#define ActReqRejSignUp (ActChgNumRowFooGrp+ 73)
|
#define ActReqMdfOneTch (ActChgNumRowFooGrp+ 76)
|
||||||
#define ActRejSignUp (ActChgNumRowFooGrp+ 74)
|
|
||||||
|
|
||||||
#define ActReqMdfOneOth (ActChgNumRowFooGrp+ 75)
|
#define ActReqMdfOth (ActChgNumRowFooGrp+ 77)
|
||||||
#define ActReqMdfOneStd (ActChgNumRowFooGrp+ 76)
|
#define ActReqMdfStd (ActChgNumRowFooGrp+ 78)
|
||||||
#define ActReqMdfOneTch (ActChgNumRowFooGrp+ 77)
|
#define ActReqMdfTch (ActChgNumRowFooGrp+ 79)
|
||||||
|
|
||||||
#define ActReqMdfOth (ActChgNumRowFooGrp+ 78)
|
#define ActReqOthPho (ActChgNumRowFooGrp+ 80)
|
||||||
#define ActReqMdfStd (ActChgNumRowFooGrp+ 79)
|
#define ActReqStdPho (ActChgNumRowFooGrp+ 81)
|
||||||
#define ActReqMdfTch (ActChgNumRowFooGrp+ 80)
|
#define ActReqTchPho (ActChgNumRowFooGrp+ 82)
|
||||||
|
#define ActDetOthPho (ActChgNumRowFooGrp+ 83)
|
||||||
|
#define ActDetStdPho (ActChgNumRowFooGrp+ 84)
|
||||||
|
#define ActDetTchPho (ActChgNumRowFooGrp+ 85)
|
||||||
|
#define ActUpdOthPho (ActChgNumRowFooGrp+ 86)
|
||||||
|
#define ActUpdStdPho (ActChgNumRowFooGrp+ 87)
|
||||||
|
#define ActUpdTchPho (ActChgNumRowFooGrp+ 88)
|
||||||
|
#define ActReqRemOthPho (ActChgNumRowFooGrp+ 89)
|
||||||
|
#define ActReqRemStdPho (ActChgNumRowFooGrp+ 90)
|
||||||
|
#define ActReqRemTchPho (ActChgNumRowFooGrp+ 91)
|
||||||
|
#define ActRemOthPho (ActChgNumRowFooGrp+ 92)
|
||||||
|
#define ActRemStdPho (ActChgNumRowFooGrp+ 93)
|
||||||
|
#define ActRemTchPho (ActChgNumRowFooGrp+ 94)
|
||||||
|
#define ActCreOth (ActChgNumRowFooGrp+ 95)
|
||||||
|
#define ActCreStd (ActChgNumRowFooGrp+ 96)
|
||||||
|
#define ActCreTch (ActChgNumRowFooGrp+ 97)
|
||||||
|
#define ActUpdOth (ActChgNumRowFooGrp+ 98)
|
||||||
|
#define ActUpdStd (ActChgNumRowFooGrp+ 99)
|
||||||
|
#define ActUpdTch (ActChgNumRowFooGrp+100)
|
||||||
|
|
||||||
#define ActReqOthPho (ActChgNumRowFooGrp+ 81)
|
#define ActReqAccEnrStd (ActChgNumRowFooGrp+101)
|
||||||
#define ActReqStdPho (ActChgNumRowFooGrp+ 82)
|
#define ActReqAccEnrTch (ActChgNumRowFooGrp+102)
|
||||||
#define ActReqTchPho (ActChgNumRowFooGrp+ 83)
|
#define ActAccEnrStd (ActChgNumRowFooGrp+103)
|
||||||
#define ActDetOthPho (ActChgNumRowFooGrp+ 84)
|
#define ActAccEnrTch (ActChgNumRowFooGrp+104)
|
||||||
#define ActDetStdPho (ActChgNumRowFooGrp+ 85)
|
#define ActRemMe_Std (ActChgNumRowFooGrp+105)
|
||||||
#define ActDetTchPho (ActChgNumRowFooGrp+ 86)
|
#define ActRemMe_Tch (ActChgNumRowFooGrp+106)
|
||||||
#define ActUpdOthPho (ActChgNumRowFooGrp+ 87)
|
|
||||||
#define ActUpdStdPho (ActChgNumRowFooGrp+ 88)
|
|
||||||
#define ActUpdTchPho (ActChgNumRowFooGrp+ 89)
|
|
||||||
#define ActReqRemOthPho (ActChgNumRowFooGrp+ 90)
|
|
||||||
#define ActReqRemStdPho (ActChgNumRowFooGrp+ 91)
|
|
||||||
#define ActReqRemTchPho (ActChgNumRowFooGrp+ 92)
|
|
||||||
#define ActRemOthPho (ActChgNumRowFooGrp+ 93)
|
|
||||||
#define ActRemStdPho (ActChgNumRowFooGrp+ 94)
|
|
||||||
#define ActRemTchPho (ActChgNumRowFooGrp+ 95)
|
|
||||||
#define ActCreOth (ActChgNumRowFooGrp+ 96)
|
|
||||||
#define ActCreStd (ActChgNumRowFooGrp+ 97)
|
|
||||||
#define ActCreTch (ActChgNumRowFooGrp+ 98)
|
|
||||||
#define ActUpdOth (ActChgNumRowFooGrp+ 99)
|
|
||||||
#define ActUpdStd (ActChgNumRowFooGrp+100)
|
|
||||||
#define ActUpdTch (ActChgNumRowFooGrp+101)
|
|
||||||
|
|
||||||
#define ActReqAccEnrStd (ActChgNumRowFooGrp+102)
|
#define ActNewAdmIns (ActChgNumRowFooGrp+107)
|
||||||
#define ActReqAccEnrTch (ActChgNumRowFooGrp+103)
|
#define ActRemAdmIns (ActChgNumRowFooGrp+108)
|
||||||
#define ActAccEnrStd (ActChgNumRowFooGrp+104)
|
#define ActNewAdmCtr (ActChgNumRowFooGrp+109)
|
||||||
#define ActAccEnrTch (ActChgNumRowFooGrp+105)
|
#define ActRemAdmCtr (ActChgNumRowFooGrp+110)
|
||||||
#define ActRemMe_Std (ActChgNumRowFooGrp+106)
|
#define ActNewAdmDeg (ActChgNumRowFooGrp+111)
|
||||||
#define ActRemMe_Tch (ActChgNumRowFooGrp+107)
|
#define ActRemAdmDeg (ActChgNumRowFooGrp+112)
|
||||||
|
|
||||||
#define ActNewAdmIns (ActChgNumRowFooGrp+108)
|
#define ActRcvFrmEnrSevStd (ActChgNumRowFooGrp+113)
|
||||||
#define ActRemAdmIns (ActChgNumRowFooGrp+109)
|
#define ActRcvFrmEnrSevTch (ActChgNumRowFooGrp+114)
|
||||||
#define ActNewAdmCtr (ActChgNumRowFooGrp+110)
|
|
||||||
#define ActRemAdmCtr (ActChgNumRowFooGrp+111)
|
|
||||||
#define ActNewAdmDeg (ActChgNumRowFooGrp+112)
|
|
||||||
#define ActRemAdmDeg (ActChgNumRowFooGrp+113)
|
|
||||||
|
|
||||||
#define ActRcvFrmEnrSevStd (ActChgNumRowFooGrp+114)
|
#define ActReqCnfID_Oth (ActChgNumRowFooGrp+115)
|
||||||
#define ActRcvFrmEnrSevTch (ActChgNumRowFooGrp+115)
|
#define ActReqCnfID_Std (ActChgNumRowFooGrp+116)
|
||||||
|
#define ActReqCnfID_Tch (ActChgNumRowFooGrp+117)
|
||||||
|
#define ActCnfID_Oth (ActChgNumRowFooGrp+118)
|
||||||
|
#define ActCnfID_Std (ActChgNumRowFooGrp+119)
|
||||||
|
#define ActCnfID_Tch (ActChgNumRowFooGrp+120)
|
||||||
|
|
||||||
#define ActReqCnfID_Oth (ActChgNumRowFooGrp+116)
|
#define ActFrmIDsOth (ActChgNumRowFooGrp+121)
|
||||||
#define ActReqCnfID_Std (ActChgNumRowFooGrp+117)
|
#define ActFrmIDsStd (ActChgNumRowFooGrp+122)
|
||||||
#define ActReqCnfID_Tch (ActChgNumRowFooGrp+118)
|
#define ActFrmIDsTch (ActChgNumRowFooGrp+123)
|
||||||
#define ActCnfID_Oth (ActChgNumRowFooGrp+119)
|
#define ActRemID_Oth (ActChgNumRowFooGrp+124)
|
||||||
#define ActCnfID_Std (ActChgNumRowFooGrp+120)
|
#define ActRemID_Std (ActChgNumRowFooGrp+125)
|
||||||
#define ActCnfID_Tch (ActChgNumRowFooGrp+121)
|
#define ActRemID_Tch (ActChgNumRowFooGrp+126)
|
||||||
|
#define ActNewID_Oth (ActChgNumRowFooGrp+127)
|
||||||
|
#define ActNewID_Std (ActChgNumRowFooGrp+128)
|
||||||
|
#define ActNewID_Tch (ActChgNumRowFooGrp+129)
|
||||||
|
#define ActFrmPwdOth (ActChgNumRowFooGrp+130)
|
||||||
|
#define ActFrmPwdStd (ActChgNumRowFooGrp+131)
|
||||||
|
#define ActFrmPwdTch (ActChgNumRowFooGrp+132)
|
||||||
|
#define ActChgPwdOth (ActChgNumRowFooGrp+133)
|
||||||
|
#define ActChgPwdStd (ActChgNumRowFooGrp+134)
|
||||||
|
#define ActChgPwdTch (ActChgNumRowFooGrp+135)
|
||||||
|
#define ActFrmMaiOth (ActChgNumRowFooGrp+136)
|
||||||
|
#define ActFrmMaiStd (ActChgNumRowFooGrp+137)
|
||||||
|
#define ActFrmMaiTch (ActChgNumRowFooGrp+138)
|
||||||
|
#define ActRemMaiOth (ActChgNumRowFooGrp+139)
|
||||||
|
#define ActRemMaiStd (ActChgNumRowFooGrp+140)
|
||||||
|
#define ActRemMaiTch (ActChgNumRowFooGrp+141)
|
||||||
|
#define ActNewMaiOth (ActChgNumRowFooGrp+142)
|
||||||
|
#define ActNewMaiStd (ActChgNumRowFooGrp+143)
|
||||||
|
#define ActNewMaiTch (ActChgNumRowFooGrp+144)
|
||||||
|
|
||||||
#define ActFrmIDsOth (ActChgNumRowFooGrp+122)
|
#define ActRemStdCrs (ActChgNumRowFooGrp+145)
|
||||||
#define ActFrmIDsStd (ActChgNumRowFooGrp+123)
|
#define ActRemTchCrs (ActChgNumRowFooGrp+146)
|
||||||
#define ActFrmIDsTch (ActChgNumRowFooGrp+124)
|
#define ActRemUsrGbl (ActChgNumRowFooGrp+147)
|
||||||
#define ActRemID_Oth (ActChgNumRowFooGrp+125)
|
|
||||||
#define ActRemID_Std (ActChgNumRowFooGrp+126)
|
|
||||||
#define ActRemID_Tch (ActChgNumRowFooGrp+127)
|
|
||||||
#define ActNewID_Oth (ActChgNumRowFooGrp+128)
|
|
||||||
#define ActNewID_Std (ActChgNumRowFooGrp+129)
|
|
||||||
#define ActNewID_Tch (ActChgNumRowFooGrp+130)
|
|
||||||
#define ActFrmPwdOth (ActChgNumRowFooGrp+131)
|
|
||||||
#define ActFrmPwdStd (ActChgNumRowFooGrp+132)
|
|
||||||
#define ActFrmPwdTch (ActChgNumRowFooGrp+133)
|
|
||||||
#define ActChgPwdOth (ActChgNumRowFooGrp+134)
|
|
||||||
#define ActChgPwdStd (ActChgNumRowFooGrp+135)
|
|
||||||
#define ActChgPwdTch (ActChgNumRowFooGrp+136)
|
|
||||||
#define ActFrmMaiOth (ActChgNumRowFooGrp+137)
|
|
||||||
#define ActFrmMaiStd (ActChgNumRowFooGrp+138)
|
|
||||||
#define ActFrmMaiTch (ActChgNumRowFooGrp+139)
|
|
||||||
#define ActRemMaiOth (ActChgNumRowFooGrp+140)
|
|
||||||
#define ActRemMaiStd (ActChgNumRowFooGrp+141)
|
|
||||||
#define ActRemMaiTch (ActChgNumRowFooGrp+142)
|
|
||||||
#define ActNewMaiOth (ActChgNumRowFooGrp+143)
|
|
||||||
#define ActNewMaiStd (ActChgNumRowFooGrp+144)
|
|
||||||
#define ActNewMaiTch (ActChgNumRowFooGrp+145)
|
|
||||||
|
|
||||||
#define ActRemStdCrs (ActChgNumRowFooGrp+146)
|
#define ActReqRemAllStdCrs (ActChgNumRowFooGrp+148)
|
||||||
#define ActRemTchCrs (ActChgNumRowFooGrp+147)
|
#define ActRemAllStdCrs (ActChgNumRowFooGrp+149)
|
||||||
#define ActRemUsrGbl (ActChgNumRowFooGrp+148)
|
|
||||||
|
|
||||||
#define ActReqRemAllStdCrs (ActChgNumRowFooGrp+149)
|
#define ActReqRemOldUsr (ActChgNumRowFooGrp+150)
|
||||||
#define ActRemAllStdCrs (ActChgNumRowFooGrp+150)
|
#define ActRemOldUsr (ActChgNumRowFooGrp+151)
|
||||||
|
|
||||||
#define ActReqRemOldUsr (ActChgNumRowFooGrp+151)
|
#define ActLstDupUsr (ActChgNumRowFooGrp+152)
|
||||||
#define ActRemOldUsr (ActChgNumRowFooGrp+152)
|
#define ActLstSimUsr (ActChgNumRowFooGrp+153)
|
||||||
|
#define ActRemDupUsr (ActChgNumRowFooGrp+154)
|
||||||
|
|
||||||
#define ActLstDupUsr (ActChgNumRowFooGrp+153)
|
#define ActLstClk (ActChgNumRowFooGrp+155)
|
||||||
#define ActLstSimUsr (ActChgNumRowFooGrp+154)
|
|
||||||
#define ActRemDupUsr (ActChgNumRowFooGrp+155)
|
|
||||||
|
|
||||||
#define ActLstClk (ActChgNumRowFooGrp+156)
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************************** Social tab *********************************/
|
/******************************** Social tab *********************************/
|
||||||
|
@ -1385,88 +1383,87 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica
|
||||||
#define ActLogOut (ActSeeMyUsgRep+13)
|
#define ActLogOut (ActSeeMyUsgRep+13)
|
||||||
#define ActAutUsrInt (ActSeeMyUsgRep+14)
|
#define ActAutUsrInt (ActSeeMyUsgRep+14)
|
||||||
#define ActAutUsrNew (ActSeeMyUsgRep+15)
|
#define ActAutUsrNew (ActSeeMyUsgRep+15)
|
||||||
#define ActAutUsrExt (ActSeeMyUsgRep+16)
|
#define ActAutUsrChgLan (ActSeeMyUsgRep+16)
|
||||||
#define ActAutUsrChgLan (ActSeeMyUsgRep+17)
|
#define ActAnnSee (ActSeeMyUsgRep+17)
|
||||||
#define ActAnnSee (ActSeeMyUsgRep+18)
|
#define ActChgMyRol (ActSeeMyUsgRep+18)
|
||||||
#define ActChgMyRol (ActSeeMyUsgRep+19)
|
#define ActChkUsrAcc (ActSeeMyUsgRep+19)
|
||||||
#define ActChkUsrAcc (ActSeeMyUsgRep+20)
|
#define ActCreUsrAcc (ActSeeMyUsgRep+20)
|
||||||
#define ActCreUsrAcc (ActSeeMyUsgRep+21)
|
#define ActRemID_Me (ActSeeMyUsgRep+21)
|
||||||
#define ActRemID_Me (ActSeeMyUsgRep+22)
|
#define ActNewIDMe (ActSeeMyUsgRep+22)
|
||||||
#define ActNewIDMe (ActSeeMyUsgRep+23)
|
#define ActRemOldNic (ActSeeMyUsgRep+23)
|
||||||
#define ActRemOldNic (ActSeeMyUsgRep+24)
|
#define ActChgNic (ActSeeMyUsgRep+24)
|
||||||
#define ActChgNic (ActSeeMyUsgRep+25)
|
#define ActRemMaiMe (ActSeeMyUsgRep+25)
|
||||||
#define ActRemMaiMe (ActSeeMyUsgRep+26)
|
#define ActNewMaiMe (ActSeeMyUsgRep+26)
|
||||||
#define ActNewMaiMe (ActSeeMyUsgRep+27)
|
#define ActCnfMai (ActSeeMyUsgRep+27)
|
||||||
#define ActCnfMai (ActSeeMyUsgRep+28)
|
#define ActFrmChgMyPwd (ActSeeMyUsgRep+28)
|
||||||
#define ActFrmChgMyPwd (ActSeeMyUsgRep+29)
|
#define ActChgPwd (ActSeeMyUsgRep+29)
|
||||||
#define ActChgPwd (ActSeeMyUsgRep+30)
|
#define ActReqRemMyAcc (ActSeeMyUsgRep+30)
|
||||||
#define ActReqRemMyAcc (ActSeeMyUsgRep+31)
|
#define ActRemMyAcc (ActSeeMyUsgRep+31)
|
||||||
#define ActRemMyAcc (ActSeeMyUsgRep+32)
|
|
||||||
|
|
||||||
#define ActChgMyData (ActSeeMyUsgRep+33)
|
#define ActChgMyData (ActSeeMyUsgRep+32)
|
||||||
|
|
||||||
#define ActReqMyPho (ActSeeMyUsgRep+34)
|
#define ActReqMyPho (ActSeeMyUsgRep+33)
|
||||||
#define ActDetMyPho (ActSeeMyUsgRep+35)
|
#define ActDetMyPho (ActSeeMyUsgRep+34)
|
||||||
#define ActUpdMyPho (ActSeeMyUsgRep+36)
|
#define ActUpdMyPho (ActSeeMyUsgRep+35)
|
||||||
#define ActReqRemMyPho (ActSeeMyUsgRep+37)
|
#define ActReqRemMyPho (ActSeeMyUsgRep+36)
|
||||||
#define ActRemMyPho (ActSeeMyUsgRep+38)
|
#define ActRemMyPho (ActSeeMyUsgRep+37)
|
||||||
|
|
||||||
#define ActEdiPri (ActSeeMyUsgRep+39)
|
#define ActEdiPri (ActSeeMyUsgRep+38)
|
||||||
#define ActChgPriPho (ActSeeMyUsgRep+40)
|
#define ActChgPriPho (ActSeeMyUsgRep+39)
|
||||||
#define ActChgPriPrf (ActSeeMyUsgRep+41)
|
#define ActChgPriPrf (ActSeeMyUsgRep+40)
|
||||||
|
|
||||||
#define ActReqEdiMyIns (ActSeeMyUsgRep+42)
|
#define ActReqEdiMyIns (ActSeeMyUsgRep+41)
|
||||||
#define ActChgCtyMyIns (ActSeeMyUsgRep+43)
|
#define ActChgCtyMyIns (ActSeeMyUsgRep+42)
|
||||||
#define ActChgMyIns (ActSeeMyUsgRep+44)
|
#define ActChgMyIns (ActSeeMyUsgRep+43)
|
||||||
#define ActChgMyCtr (ActSeeMyUsgRep+45)
|
#define ActChgMyCtr (ActSeeMyUsgRep+44)
|
||||||
#define ActChgMyDpt (ActSeeMyUsgRep+46)
|
#define ActChgMyDpt (ActSeeMyUsgRep+45)
|
||||||
#define ActChgMyOff (ActSeeMyUsgRep+47)
|
#define ActChgMyOff (ActSeeMyUsgRep+46)
|
||||||
#define ActChgMyOffPho (ActSeeMyUsgRep+48)
|
#define ActChgMyOffPho (ActSeeMyUsgRep+47)
|
||||||
|
|
||||||
#define ActReqEdiMyNet (ActSeeMyUsgRep+49)
|
#define ActReqEdiMyNet (ActSeeMyUsgRep+48)
|
||||||
#define ActChgMyNet (ActSeeMyUsgRep+50)
|
#define ActChgMyNet (ActSeeMyUsgRep+49)
|
||||||
|
|
||||||
#define ActChgThe (ActSeeMyUsgRep+51)
|
#define ActChgThe (ActSeeMyUsgRep+50)
|
||||||
#define ActReqChgLan (ActSeeMyUsgRep+52)
|
#define ActReqChgLan (ActSeeMyUsgRep+51)
|
||||||
#define ActChgLan (ActSeeMyUsgRep+53)
|
#define ActChgLan (ActSeeMyUsgRep+52)
|
||||||
#define ActChg1stDay (ActSeeMyUsgRep+54)
|
#define ActChg1stDay (ActSeeMyUsgRep+53)
|
||||||
#define ActChgCol (ActSeeMyUsgRep+55)
|
#define ActChgCol (ActSeeMyUsgRep+54)
|
||||||
#define ActHidLftCol (ActSeeMyUsgRep+56)
|
#define ActHidLftCol (ActSeeMyUsgRep+55)
|
||||||
#define ActHidRgtCol (ActSeeMyUsgRep+57)
|
#define ActHidRgtCol (ActSeeMyUsgRep+56)
|
||||||
#define ActShoLftCol (ActSeeMyUsgRep+58)
|
#define ActShoLftCol (ActSeeMyUsgRep+57)
|
||||||
#define ActShoRgtCol (ActSeeMyUsgRep+59)
|
#define ActShoRgtCol (ActSeeMyUsgRep+58)
|
||||||
#define ActChgIco (ActSeeMyUsgRep+60)
|
#define ActChgIco (ActSeeMyUsgRep+59)
|
||||||
#define ActChgMnu (ActSeeMyUsgRep+61)
|
#define ActChgMnu (ActSeeMyUsgRep+60)
|
||||||
#define ActChgNtfPrf (ActSeeMyUsgRep+62)
|
#define ActChgNtfPrf (ActSeeMyUsgRep+61)
|
||||||
|
|
||||||
#define ActPrnUsrQR (ActSeeMyUsgRep+63)
|
#define ActPrnUsrQR (ActSeeMyUsgRep+62)
|
||||||
|
|
||||||
#define ActPrnMyTT (ActSeeMyUsgRep+64)
|
#define ActPrnMyTT (ActSeeMyUsgRep+63)
|
||||||
#define ActEdiTut (ActSeeMyUsgRep+65)
|
#define ActEdiTut (ActSeeMyUsgRep+64)
|
||||||
#define ActChgTut (ActSeeMyUsgRep+66)
|
#define ActChgTut (ActSeeMyUsgRep+65)
|
||||||
#define ActChgMyTT1stDay (ActSeeMyUsgRep+67)
|
#define ActChgMyTT1stDay (ActSeeMyUsgRep+66)
|
||||||
|
|
||||||
#define ActReqRemFilBrf (ActSeeMyUsgRep+68)
|
#define ActReqRemFilBrf (ActSeeMyUsgRep+67)
|
||||||
#define ActRemFilBrf (ActSeeMyUsgRep+69)
|
#define ActRemFilBrf (ActSeeMyUsgRep+68)
|
||||||
#define ActRemFolBrf (ActSeeMyUsgRep+70)
|
#define ActRemFolBrf (ActSeeMyUsgRep+69)
|
||||||
#define ActCopBrf (ActSeeMyUsgRep+71)
|
#define ActCopBrf (ActSeeMyUsgRep+70)
|
||||||
#define ActPasBrf (ActSeeMyUsgRep+72)
|
#define ActPasBrf (ActSeeMyUsgRep+71)
|
||||||
#define ActRemTreBrf (ActSeeMyUsgRep+73)
|
#define ActRemTreBrf (ActSeeMyUsgRep+72)
|
||||||
#define ActFrmCreBrf (ActSeeMyUsgRep+74)
|
#define ActFrmCreBrf (ActSeeMyUsgRep+73)
|
||||||
#define ActCreFolBrf (ActSeeMyUsgRep+75)
|
#define ActCreFolBrf (ActSeeMyUsgRep+74)
|
||||||
#define ActCreLnkBrf (ActSeeMyUsgRep+76)
|
#define ActCreLnkBrf (ActSeeMyUsgRep+75)
|
||||||
#define ActRenFolBrf (ActSeeMyUsgRep+77)
|
#define ActRenFolBrf (ActSeeMyUsgRep+76)
|
||||||
#define ActRcvFilBrfDZ (ActSeeMyUsgRep+78)
|
#define ActRcvFilBrfDZ (ActSeeMyUsgRep+77)
|
||||||
#define ActRcvFilBrfCla (ActSeeMyUsgRep+79)
|
#define ActRcvFilBrfCla (ActSeeMyUsgRep+78)
|
||||||
#define ActExpBrf (ActSeeMyUsgRep+80)
|
#define ActExpBrf (ActSeeMyUsgRep+79)
|
||||||
#define ActConBrf (ActSeeMyUsgRep+81)
|
#define ActConBrf (ActSeeMyUsgRep+80)
|
||||||
#define ActZIPBrf (ActSeeMyUsgRep+82)
|
#define ActZIPBrf (ActSeeMyUsgRep+81)
|
||||||
#define ActReqDatBrf (ActSeeMyUsgRep+83)
|
#define ActReqDatBrf (ActSeeMyUsgRep+82)
|
||||||
#define ActChgDatBrf (ActSeeMyUsgRep+84)
|
#define ActChgDatBrf (ActSeeMyUsgRep+83)
|
||||||
#define ActDowBrf (ActSeeMyUsgRep+85)
|
#define ActDowBrf (ActSeeMyUsgRep+84)
|
||||||
|
|
||||||
#define ActReqRemOldBrf (ActSeeMyUsgRep+86)
|
#define ActReqRemOldBrf (ActSeeMyUsgRep+85)
|
||||||
#define ActRemOldBrf (ActSeeMyUsgRep+87)
|
#define ActRemOldBrf (ActSeeMyUsgRep+86)
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************************** Public types *******************************/
|
/******************************** Public types *******************************/
|
||||||
|
|
|
@ -148,14 +148,21 @@
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Log_PLATFORM_VERSION "SWAD 16.17.17 (2016-10-09)"
|
#define Log_PLATFORM_VERSION "SWAD 16.18 (2016-10-09)"
|
||||||
#define CSS_FILE "swad15.229.css"
|
#define CSS_FILE "swad15.229.css"
|
||||||
#define JS_FILE "swad15.238.1.js"
|
#define JS_FILE "swad15.238.1.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 16.17.17: Oct 09, 2016 Fixed bug in user's usage report. (? lines)
|
Version 16.18: Oct 09, 2016 Removed external authentication (previously used at University of Granada). (205092 lines)
|
||||||
|
4 changes necessary in database:
|
||||||
|
DROP TABLE IF EXISTS imported_groups;
|
||||||
|
DROP TABLE IF EXISTS imported_sessions;
|
||||||
|
DROP TABLE IF EXISTS imported_students;
|
||||||
|
UPDATE actions SET Obsolete='Y' WHERE ActCod IN ('794','796');
|
||||||
|
|
||||||
|
Version 16.17.17: Oct 09, 2016 Fixed bug in user's usage report. (206245 lines)
|
||||||
Version 16.17.16: Oct 09, 2016 Code refactoring in user's usage report. (206236 lines)
|
Version 16.17.16: Oct 09, 2016 Code refactoring in user's usage report. (206236 lines)
|
||||||
Version 16.17.15: Oct 09, 2016 Code refactoring in user's usage report. (206236 lines)
|
Version 16.17.15: Oct 09, 2016 Code refactoring in user's usage report. (206236 lines)
|
||||||
Version 16.17.14: Oct 09, 2016 Code refactoring in user's usage report. (206268 lines)
|
Version 16.17.14: Oct 09, 2016 Code refactoring in user's usage report. (206268 lines)
|
||||||
|
|
|
@ -28,8 +28,8 @@
|
||||||
/** Uncomment one of the following installations of SWAD or create your own **/
|
/** Uncomment one of the following installations of SWAD or create your own **/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
//#define LOCALHOST_UBUNTU // Comment this line if not applicable
|
#define LOCALHOST_UBUNTU // Comment this line if not applicable
|
||||||
#define OPENSWAD_ORG // Comment this line if not applicable
|
//#define OPENSWAD_ORG // Comment this line if not applicable
|
||||||
//#define SWAD_UGR_ES // Comment this line if not applicable
|
//#define SWAD_UGR_ES // Comment this line if not applicable
|
||||||
//#define SWADBERRY_UGR_ES // Comment this line if not applicable
|
//#define SWADBERRY_UGR_ES // Comment this line if not applicable
|
||||||
|
|
||||||
|
@ -83,14 +83,6 @@
|
||||||
|
|
||||||
#define Cfg_DEFAULT_COLUMNS Lay_SHOW_BOTH_COLUMNS
|
#define Cfg_DEFAULT_COLUMNS Lay_SHOW_BOTH_COLUMNS
|
||||||
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_CLIENT_COMMAND "" // Client of the web service called by this CGI
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_SERVICE_NAME ""
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_URL ""
|
|
||||||
#define Cfg_NAME_PARAM_IMPORTED_USR_ID ""
|
|
||||||
#define Cfg_NAME_PARAM_IMPORTED_SESSION_ID ""
|
|
||||||
#define Cfg_MAX_LENGTH_IMPORTED_USR_ID 255 // The same size as that of column ImportedUsrId in table imported_sessions
|
|
||||||
#define Cfg_MAX_LENGTH_IMPORTED_SESSION_ID 255 // The same size as that of column ImportedSessionId in table imported_sessions
|
|
||||||
|
|
||||||
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t)(30UL*60UL)) // After these seconds after first pending notification, all the pending notifications are sent by e-mail
|
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t)(30UL*60UL)) // After these seconds after first pending notification, all the pending notifications are sent by e-mail
|
||||||
|
|
||||||
#define Cfg_GOOGLE_ANALYTICS ""
|
#define Cfg_GOOGLE_ANALYTICS ""
|
||||||
|
@ -132,14 +124,6 @@
|
||||||
|
|
||||||
#define Cfg_DEFAULT_COLUMNS Lay_SHOW_BOTH_COLUMNS
|
#define Cfg_DEFAULT_COLUMNS Lay_SHOW_BOTH_COLUMNS
|
||||||
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_CLIENT_COMMAND "" // Client of the web service called by this CGI
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_SERVICE_NAME ""
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_URL ""
|
|
||||||
#define Cfg_NAME_PARAM_IMPORTED_USR_ID ""
|
|
||||||
#define Cfg_NAME_PARAM_IMPORTED_SESSION_ID ""
|
|
||||||
#define Cfg_MAX_LENGTH_IMPORTED_USR_ID 255 // The same size as that of column ImportedUsrId in table imported_sessions
|
|
||||||
#define Cfg_MAX_LENGTH_IMPORTED_SESSION_ID 255 // The same size as that of column ImportedSessionId in table imported_sessions
|
|
||||||
|
|
||||||
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t)(30UL*60UL)) // After these seconds after first pending notification, all the pending notifications are sent by e-mail
|
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t)(30UL*60UL)) // After these seconds after first pending notification, all the pending notifications are sent by e-mail
|
||||||
|
|
||||||
/* Google Analytics without cookies.
|
/* Google Analytics without cookies.
|
||||||
|
@ -198,22 +182,6 @@
|
||||||
|
|
||||||
#define Cfg_DEFAULT_COLUMNS Lay_SHOW_BOTH_COLUMNS
|
#define Cfg_DEFAULT_COLUMNS Lay_SHOW_BOTH_COLUMNS
|
||||||
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_CLIENT_COMMAND "" // Client of the web service called by this CGI
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_SERVICE_NAME ""
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_URL ""
|
|
||||||
#define Cfg_NAME_PARAM_IMPORTED_USR_ID ""
|
|
||||||
#define Cfg_NAME_PARAM_IMPORTED_SESSION_ID ""
|
|
||||||
#define Cfg_MAX_LENGTH_IMPORTED_USR_ID 255 // The same size as that of column ImportedUsrId in table imported_sessions
|
|
||||||
#define Cfg_MAX_LENGTH_IMPORTED_SESSION_ID 255 // The same size as that of column ImportedSessionId in table imported_sessions
|
|
||||||
/*
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_CLIENT_COMMAND "./prado" // Client of the web service called by this CGI
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_SERVICE_NAME "PRADO (Plataforma de Recursos de Apoyo a la Docencia)"
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_URL "https://oficinavirtual.ugr.es/"
|
|
||||||
#define Cfg_NAME_PARAM_IMPORTED_USR_ID "pradouser"
|
|
||||||
#define Cfg_NAME_PARAM_IMPORTED_SESSION_ID "pradosession"
|
|
||||||
#define Cfg_MAX_LENGTH_IMPORTED_USR_ID 255 // The same size as that of column ImportedUsrId in table imported_sessions
|
|
||||||
#define Cfg_MAX_LENGTH_IMPORTED_SESSION_ID 255 // The same size as that of column ImportedSessionId in table imported_sessions
|
|
||||||
*/
|
|
||||||
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t)(60UL*60UL)) // After these seconds after first pending notification, all the pending notifications are sent by e-mail
|
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t)(60UL*60UL)) // After these seconds after first pending notification, all the pending notifications are sent by e-mail
|
||||||
|
|
||||||
#define Cfg_GOOGLE_ANALYTICS "<script type=\"text/javascript\">" \
|
#define Cfg_GOOGLE_ANALYTICS "<script type=\"text/javascript\">" \
|
||||||
|
@ -269,14 +237,6 @@
|
||||||
|
|
||||||
#define Cfg_DEFAULT_COLUMNS Lay_SHOW_BOTH_COLUMNS
|
#define Cfg_DEFAULT_COLUMNS Lay_SHOW_BOTH_COLUMNS
|
||||||
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_CLIENT_COMMAND "" // Client of the web service called by this CGI
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_SERVICE_NAME ""
|
|
||||||
#define Cfg_EXTERNAL_LOGIN_URL ""
|
|
||||||
#define Cfg_NAME_PARAM_IMPORTED_USR_ID ""
|
|
||||||
#define Cfg_NAME_PARAM_IMPORTED_SESSION_ID ""
|
|
||||||
#define Cfg_MAX_LENGTH_IMPORTED_USR_ID 255 // The same size as that of column ImportedUsrId in table imported_sessions
|
|
||||||
#define Cfg_MAX_LENGTH_IMPORTED_SESSION_ID 255 // The same size as that of column ImportedSessionId in table imported_sessions
|
|
||||||
|
|
||||||
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t)(30UL*60UL)) // After these seconds after first pending notification, all the pending notifications are sent by e-mail
|
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t)(30UL*60UL)) // After these seconds after first pending notification, all the pending notifications are sent by e-mail
|
||||||
|
|
||||||
#define Cfg_GOOGLE_ANALYTICS ""
|
#define Cfg_GOOGLE_ANALYTICS ""
|
||||||
|
|
|
@ -258,8 +258,7 @@ void Con_GetAndShowLastClicks (void)
|
||||||
/* Use a special color for this row depending on the action */
|
/* Use a special color for this row depending on the action */
|
||||||
ClassRow = (Act_Actions[Act_FromActCodToAction[ActCod]].BrowserWindow == Act_DOWNLD_FILE) ? "DAT_SMALL_YELLOW LEFT_MIDDLE" :
|
ClassRow = (Act_Actions[Act_FromActCodToAction[ActCod]].BrowserWindow == Act_DOWNLD_FILE) ? "DAT_SMALL_YELLOW LEFT_MIDDLE" :
|
||||||
(ActCod == Act_Actions[ActAutUsrInt].ActCod ||
|
(ActCod == Act_Actions[ActAutUsrInt].ActCod ||
|
||||||
ActCod == Act_Actions[ActAutUsrNew].ActCod ||
|
ActCod == Act_Actions[ActAutUsrNew].ActCod) ? "DAT_SMALL_GREEN" :
|
||||||
ActCod == Act_Actions[ActAutUsrExt].ActCod) ? "DAT_SMALL_GREEN" :
|
|
||||||
(ActCod == Act_Actions[ActLogOut].ActCod ) ? "DAT_SMALL_RED" :
|
(ActCod == Act_Actions[ActLogOut].ActCod ) ? "DAT_SMALL_RED" :
|
||||||
(ActCod == Act_Actions[ActWebSvc].ActCod ) ? "DAT_SMALL_BLUE" :
|
(ActCod == Act_Actions[ActWebSvc].ActCod ) ? "DAT_SMALL_BLUE" :
|
||||||
"DAT_SMALL_GREY";
|
"DAT_SMALL_GREY";
|
||||||
|
|
|
@ -1249,81 +1249,6 @@ mysql> DESCRIBE holidays;
|
||||||
"INDEX(InsCod),"
|
"INDEX(InsCod),"
|
||||||
"INDEX(PlcCod))");
|
"INDEX(PlcCod))");
|
||||||
|
|
||||||
/***** Table imported_groups *****/
|
|
||||||
/*
|
|
||||||
mysql> DESCRIBE imported_groups;
|
|
||||||
+----------------+--------------+------+-----+---------+----------------+
|
|
||||||
| Field | Type | Null | Key | Default | Extra |
|
|
||||||
+----------------+--------------+------+-----+---------+----------------+
|
|
||||||
| GrpCod | int(11) | NO | PRI | NULL | auto_increment |
|
|
||||||
| SessionId | char(43) | NO | MUL | NULL | |
|
|
||||||
| ExternalCrsCod | char(7) | NO | | NULL | |
|
|
||||||
| DegName | varchar(127) | NO | | NULL | |
|
|
||||||
| CrsName | varchar(127) | NO | | NULL | |
|
|
||||||
| GrpName | varchar(255) | NO | | NULL | |
|
|
||||||
| GrpType | varchar(255) | NO | | NULL | |
|
|
||||||
+----------------+--------------+------+-----+---------+----------------+
|
|
||||||
7 rows in set (0.00 sec)
|
|
||||||
*/
|
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS imported_groups ("
|
|
||||||
"GrpCod INT NOT NULL AUTO_INCREMENT,"
|
|
||||||
"SessionId CHAR(43) NOT NULL,"
|
|
||||||
"ExternalCrsCod CHAR(7) NOT NULL,"
|
|
||||||
"DegName VARCHAR(127) NOT NULL,"
|
|
||||||
"CrsName VARCHAR(127) NOT NULL,"
|
|
||||||
"GrpName VARCHAR(255) NOT NULL,"
|
|
||||||
"GrpType VARCHAR(255) NOT NULL,"
|
|
||||||
"UNIQUE INDEX(GrpCod),"
|
|
||||||
"INDEX(SessionId))");
|
|
||||||
|
|
||||||
/***** Table imported_sessions *****/
|
|
||||||
/*
|
|
||||||
mysql> DESCRIBE imported_sessions;
|
|
||||||
+-------------------+------------+------+-----+---------+-------+
|
|
||||||
| Field | Type | Null | Key | Default | Extra |
|
|
||||||
+-------------------+------------+------+-----+---------+-------+
|
|
||||||
| SessionId | char(43) | NO | PRI | NULL | |
|
|
||||||
| UsrCod | int(11) | NO | | NULL | |
|
|
||||||
| ImportedUsrId | char(255) | NO | | NULL | |
|
|
||||||
| ImportedSessionId | char(255) | NO | | NULL | |
|
|
||||||
| ImportedRole | tinyint(4) | NO | | 0 | |
|
|
||||||
+-------------------+------------+------+-----+---------+-------+
|
|
||||||
5 rows in set (0.00 sec)
|
|
||||||
*/
|
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS imported_sessions ("
|
|
||||||
"SessionId CHAR(43) NOT NULL,"
|
|
||||||
"UsrCod INT NOT NULL,"
|
|
||||||
"ImportedUsrId CHAR(255) NOT NULL,"
|
|
||||||
"ImportedSessionId CHAR(255) NOT NULL,"
|
|
||||||
"ImportedRole TINYINT NOT NULL DEFAULT 0,"
|
|
||||||
"UNIQUE INDEX(SessionId))");
|
|
||||||
|
|
||||||
/***** Table imported_students *****/
|
|
||||||
/*
|
|
||||||
mysql> DESCRIBE imported_students;
|
|
||||||
+-----------+---------------------------------+------+-----+---------+----------------+
|
|
||||||
| Field | Type | Null | Key | Default | Extra |
|
|
||||||
+-----------+---------------------------------+------+-----+---------+----------------+
|
|
||||||
| GrpCod | int(11) | NO | MUL | NULL | auto_increment |
|
|
||||||
| UsrID | char(16) | NO | | NULL | |
|
|
||||||
| Surname1 | varchar(32) | NO | | NULL | |
|
|
||||||
| Surname2 | varchar(32) | NO | | NULL | |
|
|
||||||
| FirstName | varchar(32) | NO | | NULL | |
|
|
||||||
| Sex | enum('unknown','female','male') | NO | | unknown | |
|
|
||||||
| E_mail | varchar(127) | NO | | NULL | |
|
|
||||||
+-----------+---------------------------------+------+-----+---------+----------------+
|
|
||||||
7 rows in set (0.00 sec)
|
|
||||||
*/
|
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS imported_students ("
|
|
||||||
"GrpCod INT NOT NULL AUTO_INCREMENT,"
|
|
||||||
"UsrID CHAR(16) NOT NULL,"
|
|
||||||
"Surname1 VARCHAR(32) NOT NULL,"
|
|
||||||
"Surname2 VARCHAR(32) NOT NULL,"
|
|
||||||
"FirstName VARCHAR(32) NOT NULL,"
|
|
||||||
"Sex ENUM ('unknown','female','male') NOT NULL DEFAULT 'unknown',"
|
|
||||||
"E_mail VARCHAR(127) NOT NULL,"
|
|
||||||
"INDEX(GrpCod))");
|
|
||||||
|
|
||||||
/***** Table institutions *****/
|
/***** Table institutions *****/
|
||||||
/*
|
/*
|
||||||
mysql> DESCRIBE institutions;
|
mysql> DESCRIBE institutions;
|
||||||
|
|
|
@ -99,7 +99,6 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role);
|
||||||
|
|
||||||
static void Enr_RegisterUsr (struct UsrData *UsrDat,Rol_Role_t RegRemRole,
|
static void Enr_RegisterUsr (struct UsrData *UsrDat,Rol_Role_t RegRemRole,
|
||||||
struct ListCodGrps *LstGrps,unsigned *NumUsrsRegistered);
|
struct ListCodGrps *LstGrps,unsigned *NumUsrsRegistered);
|
||||||
static void Enr_MarkOfficialStdsAsRemovable (long ImpGrpCod,bool RemoveSpecifiedUsrs);
|
|
||||||
|
|
||||||
static void Enr_PutLinkToRemAllStdsThisCrs (void);
|
static void Enr_PutLinkToRemAllStdsThisCrs (void);
|
||||||
|
|
||||||
|
@ -581,9 +580,6 @@ static void Enr_ShowFormRegRemSeveralUsrs (Rol_Role_t Role)
|
||||||
extern const char *Txt_Admin_several_students;
|
extern const char *Txt_Admin_several_students;
|
||||||
extern const char *Txt_Admin_several_teachers;
|
extern const char *Txt_Admin_several_teachers;
|
||||||
extern const char *Txt_Step_1_Provide_a_list_of_users;
|
extern const char *Txt_Step_1_Provide_a_list_of_users;
|
||||||
extern const char *Txt_Option_a_Import_students_from_the_official_lists;
|
|
||||||
extern const char *Txt_Select_the_groups_of_students_you_want_to_register_in_remove_from_this_course;
|
|
||||||
extern const char *Txt_Option_b_Type_or_paste_a_list_of_users;
|
|
||||||
extern const char *Txt_Type_or_paste_a_list_of_IDs_nicks_or_emails_;
|
extern const char *Txt_Type_or_paste_a_list_of_IDs_nicks_or_emails_;
|
||||||
extern const char *Txt_Step_2_Select_the_desired_action;
|
extern const char *Txt_Step_2_Select_the_desired_action;
|
||||||
extern const char *Txt_Step_3_Optionally_select_groups;
|
extern const char *Txt_Step_3_Optionally_select_groups;
|
||||||
|
@ -591,7 +587,6 @@ static void Enr_ShowFormRegRemSeveralUsrs (Rol_Role_t Role)
|
||||||
extern const char *Txt_No_groups_have_been_created_in_the_course_X_Therefore_;
|
extern const char *Txt_No_groups_have_been_created_in_the_course_X_Therefore_;
|
||||||
extern const char *Txt_Step_4_Confirm_the_enrollment_removing;
|
extern const char *Txt_Step_4_Confirm_the_enrollment_removing;
|
||||||
extern const char *Txt_Confirm;
|
extern const char *Txt_Confirm;
|
||||||
bool ExternalUsrsServiceAvailable = (Cfg_EXTERNAL_LOGIN_CLIENT_COMMAND[0] != '\0');
|
|
||||||
|
|
||||||
/***** Put contextual links *****/
|
/***** Put contextual links *****/
|
||||||
if (Role == Rol_STUDENT && // Users to admin: students
|
if (Role == Rol_STUDENT && // Users to admin: students
|
||||||
|
@ -623,25 +618,6 @@ static void Enr_ShowFormRegRemSeveralUsrs (Rol_Role_t Role)
|
||||||
The_ClassTitle[Gbl.Prefs.Theme],
|
The_ClassTitle[Gbl.Prefs.Theme],
|
||||||
Txt_Step_1_Provide_a_list_of_users);
|
Txt_Step_1_Provide_a_list_of_users);
|
||||||
|
|
||||||
if (ExternalUsrsServiceAvailable)
|
|
||||||
{
|
|
||||||
/* Option a: get students from official lists */
|
|
||||||
fprintf (Gbl.F.Out,"<div class=\"%s LEFT_MIDDLE\">"
|
|
||||||
"%s"
|
|
||||||
"</div>",
|
|
||||||
The_ClassTitle[Gbl.Prefs.Theme],
|
|
||||||
Txt_Option_a_Import_students_from_the_official_lists);
|
|
||||||
Lay_ShowAlert (Lay_INFO,Txt_Select_the_groups_of_students_you_want_to_register_in_remove_from_this_course);
|
|
||||||
Imp_ListMyImpGrpsAndStdsForm ();
|
|
||||||
|
|
||||||
/* Option b: get students' IDs from pasted text */
|
|
||||||
fprintf (Gbl.F.Out,"<div class=\"%s LEFT_MIDDLE\">"
|
|
||||||
"%s"
|
|
||||||
"</div>",
|
|
||||||
The_ClassTitle[Gbl.Prefs.Theme],
|
|
||||||
Txt_Option_b_Type_or_paste_a_list_of_users);
|
|
||||||
}
|
|
||||||
|
|
||||||
Lay_ShowAlert (Lay_INFO,Txt_Type_or_paste_a_list_of_IDs_nicks_or_emails_);
|
Lay_ShowAlert (Lay_INFO,Txt_Type_or_paste_a_list_of_IDs_nicks_or_emails_);
|
||||||
Enr_PutAreaToEnterUsrsIDs ();
|
Enr_PutAreaToEnterUsrsIDs ();
|
||||||
|
|
||||||
|
@ -1223,12 +1199,8 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role)
|
||||||
extern const char *Txt_No_user_has_been_enrolled;
|
extern const char *Txt_No_user_has_been_enrolled;
|
||||||
extern const char *Txt_One_user_has_been_enrolled;
|
extern const char *Txt_One_user_has_been_enrolled;
|
||||||
extern const char *Txt_X_users_have_been_enrolled_including_possible_repetitions;
|
extern const char *Txt_X_users_have_been_enrolled_including_possible_repetitions;
|
||||||
char ListExternalGrpCods[Imp_MAX_BYTES_LIST_EXTERNAL_GRP_CODS+1];
|
|
||||||
char ExternalStr[1+10+1+Crs_LENGTH_INSTITUTIONAL_CRS_COD+1];
|
|
||||||
char ExternalCrsCod[Crs_LENGTH_INSTITUTIONAL_CRS_COD+1];
|
|
||||||
char UnsignedStr[10+1];
|
char UnsignedStr[10+1];
|
||||||
unsigned UnsignedNum;
|
unsigned UnsignedNum;
|
||||||
long LongNum;
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
bool RemoveUsrs;
|
bool RemoveUsrs;
|
||||||
|
@ -1241,7 +1213,6 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role)
|
||||||
unsigned NumUsrFound;
|
unsigned NumUsrFound;
|
||||||
const char *Ptr;
|
const char *Ptr;
|
||||||
unsigned NumCurrentUsr;
|
unsigned NumCurrentUsr;
|
||||||
long GrpCod;
|
|
||||||
unsigned NumUsrsRegistered = 0;
|
unsigned NumUsrsRegistered = 0;
|
||||||
unsigned NumUsrsRemoved = 0;
|
unsigned NumUsrsRemoved = 0;
|
||||||
unsigned NumUsrsEliminated = 0;
|
unsigned NumUsrsEliminated = 0;
|
||||||
|
@ -1333,9 +1304,6 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role)
|
||||||
|
|
||||||
if (!ErrorInForm)
|
if (!ErrorInForm)
|
||||||
{
|
{
|
||||||
/***** Get external groups of students *****/
|
|
||||||
Par_GetParMultiToText ("ImpGrpCod",ListExternalGrpCods,Imp_MAX_BYTES_LIST_EXTERNAL_GRP_CODS);
|
|
||||||
|
|
||||||
/***** Get groups to which register/remove users *****/
|
/***** Get groups to which register/remove users *****/
|
||||||
LstGrps.NumGrps = 0;
|
LstGrps.NumGrps = 0;
|
||||||
if (Gbl.CurrentCrs.Grps.NumGrps) // This course has groups?
|
if (Gbl.CurrentCrs.Grps.NumGrps) // This course has groups?
|
||||||
|
@ -1386,25 +1354,7 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role)
|
||||||
Gbl.Usrs.LstUsrs[Role].Lst[NumCurrentUsr].Remove = !WhatToDo.RemoveSpecifiedUsrs;
|
Gbl.Usrs.LstUsrs[Role].Lst[NumCurrentUsr].Remove = !WhatToDo.RemoveSpecifiedUsrs;
|
||||||
|
|
||||||
/***** Loop 1: go through form list setting if a student must be removed *****/
|
/***** Loop 1: go through form list setting if a student must be removed *****/
|
||||||
/* Step a: Get students from a list of official groups */
|
/* Get users from a list of users' IDs */
|
||||||
if (Role == Rol_STUDENT)
|
|
||||||
{
|
|
||||||
Ptr = ListExternalGrpCods;
|
|
||||||
while (*Ptr)
|
|
||||||
{
|
|
||||||
/* Find next external group code and course code in list */
|
|
||||||
Str_GetNextStringUntilSeparator (&Ptr,ExternalStr,1+10+1+Crs_LENGTH_INSTITUTIONAL_CRS_COD);
|
|
||||||
if (sscanf (ExternalStr,"%ld_%s",&LongNum,ExternalCrsCod) == 2)
|
|
||||||
{
|
|
||||||
GrpCod = LongNum;
|
|
||||||
|
|
||||||
/* Mark users belonging to this official group as removable */
|
|
||||||
Enr_MarkOfficialStdsAsRemovable (GrpCod,WhatToDo.RemoveSpecifiedUsrs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Step b: Get users from a list of users' IDs */
|
|
||||||
Ptr = ListUsrsIDs;
|
Ptr = ListUsrsIDs;
|
||||||
while (*Ptr)
|
while (*Ptr)
|
||||||
{
|
{
|
||||||
|
@ -1524,28 +1474,7 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role)
|
||||||
/***** Register users *****/
|
/***** Register users *****/
|
||||||
if (WhatToDo.RegisterUsrs) // TODO: !!!!! NO CAMBIAR EL ROL DE LOS USUARIOS QUE YA ESTÉN EN LA ASIGNATURA SI HAY MÁS DE UN USUARIO ENCONTRADO PARA EL MISMO DNI !!!!!!
|
if (WhatToDo.RegisterUsrs) // TODO: !!!!! NO CAMBIAR EL ROL DE LOS USUARIOS QUE YA ESTÉN EN LA ASIGNATURA SI HAY MÁS DE UN USUARIO ENCONTRADO PARA EL MISMO DNI !!!!!!
|
||||||
{
|
{
|
||||||
/***** Step a: Get users from a list of official groups *****/
|
/***** Get users from a list of users' IDs ******/
|
||||||
if (Role == Rol_STUDENT)
|
|
||||||
{
|
|
||||||
Ptr = ListExternalGrpCods;
|
|
||||||
while (*Ptr)
|
|
||||||
{
|
|
||||||
/* Find next official group code in list */
|
|
||||||
Str_GetNextStringUntilSeparator (&Ptr,ExternalStr,1+10+1+Crs_LENGTH_INSTITUTIONAL_CRS_COD);
|
|
||||||
if (sscanf (ExternalStr,"%ld_%s",&LongNum,ExternalCrsCod) == 2)
|
|
||||||
{
|
|
||||||
GrpCod = LongNum;
|
|
||||||
|
|
||||||
/* Import official group of users */
|
|
||||||
Imp_ImportStdsFromAnImpGrp (GrpCod,&LstGrps,&NumUsrsRegistered);
|
|
||||||
|
|
||||||
/* Update the institutional course code to the external course code */
|
|
||||||
Crs_UpdateInstitutionalCrsCod (&Gbl.CurrentCrs.Crs,ExternalCrsCod);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Step b: Get users from a list of users' IDs ******/
|
|
||||||
Ptr = ListUsrsIDs;
|
Ptr = ListUsrsIDs;
|
||||||
while (*Ptr)
|
while (*Ptr)
|
||||||
{
|
{
|
||||||
|
@ -1725,65 +1654,6 @@ static void Enr_RegisterUsr (struct UsrData *UsrDat,Rol_Role_t RegRemRole,
|
||||||
(*NumUsrsRegistered)++;
|
(*NumUsrsRegistered)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/****** Mark the students belonging to an official group as removable ********/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Enr_MarkOfficialStdsAsRemovable (long ImpGrpCod,bool RemoveSpecifiedUsrs)
|
|
||||||
{
|
|
||||||
char Query[1024];
|
|
||||||
MYSQL_RES *mysql_res;
|
|
||||||
MYSQL_ROW row;
|
|
||||||
unsigned NumStds;
|
|
||||||
unsigned NumStd;
|
|
||||||
unsigned NumUsr;
|
|
||||||
struct ListUsrCods ListUsrCods; // List with users' codes for a given user's ID
|
|
||||||
unsigned NumUsrFound;
|
|
||||||
|
|
||||||
/***** Get imported students belonging to this group from database *****/
|
|
||||||
sprintf (Query,"SELECT UsrID FROM imported_students WHERE GrpCod='%ld'",
|
|
||||||
ImpGrpCod);
|
|
||||||
NumStds = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get imported students");
|
|
||||||
|
|
||||||
/***** Mark the students from this official group as removable *****/
|
|
||||||
for (NumStd = 0;
|
|
||||||
NumStd < NumStds;
|
|
||||||
NumStd++) // For each student inside the official group...
|
|
||||||
{
|
|
||||||
/* Get user's ID of the student from official list */
|
|
||||||
row = mysql_fetch_row (mysql_res);
|
|
||||||
|
|
||||||
/***** Allocate space for the list *****/
|
|
||||||
ID_ReallocateListIDs (&Gbl.Usrs.Other.UsrDat,1);
|
|
||||||
|
|
||||||
strncpy (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID,row[0],ID_MAX_LENGTH_USR_ID);
|
|
||||||
Gbl.Usrs.Other.UsrDat.IDs.List[0].ID[ID_MAX_LENGTH_USR_ID] = '\0';
|
|
||||||
// Users' IDs are always stored internally in capitals and without leading zeros
|
|
||||||
Str_RemoveLeadingZeros (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID);
|
|
||||||
Str_ConvertToUpperText (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID);
|
|
||||||
|
|
||||||
/* Check if this official user's ID is in the list of students */
|
|
||||||
if (ID_CheckIfUsrIDIsValid (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID))
|
|
||||||
if (ID_GetListUsrCodsFromUsrID (&Gbl.Usrs.Other.UsrDat,NULL,&ListUsrCods,false)) // User(s) found
|
|
||||||
{
|
|
||||||
for (NumUsr = 0;
|
|
||||||
NumUsr < Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs;
|
|
||||||
NumUsr++)
|
|
||||||
for (NumUsrFound = 0;
|
|
||||||
NumUsrFound < ListUsrCods.NumUsrs;
|
|
||||||
NumUsrFound++)
|
|
||||||
if (Gbl.Usrs.LstUsrs[Rol_STUDENT].Lst[NumUsr].UsrCod == ListUsrCods.Lst[NumUsrFound]) // User found
|
|
||||||
Gbl.Usrs.LstUsrs[Rol_STUDENT].Lst[NumUsr].Remove = RemoveSpecifiedUsrs;
|
|
||||||
|
|
||||||
/* Free memory used for list of users' codes found for this ID */
|
|
||||||
Usr_FreeListUsrCods (&ListUsrCods);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**** Put a link (form) to remove all the students in the current course *****/
|
/**** Put a link (form) to remove all the students in the current course *****/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -423,11 +423,6 @@ void Gbl_InitializeGlobals (void)
|
||||||
Gbl.ColorRows[0] = "COLOR0"; // Darker
|
Gbl.ColorRows[0] = "COLOR0"; // Darker
|
||||||
Gbl.ColorRows[1] = "COLOR1"; // Lighter
|
Gbl.ColorRows[1] = "COLOR1"; // Lighter
|
||||||
|
|
||||||
/* Imported data from external site */
|
|
||||||
Gbl.Imported.ExternalUsrId[0] = '\0';
|
|
||||||
Gbl.Imported.ExternalSesId[0] = '\0';
|
|
||||||
Gbl.Imported.ExternalRole = Rol_UNKNOWN;
|
|
||||||
|
|
||||||
Gbl.WebService.Function = Svc_unknown;
|
Gbl.WebService.Function = Svc_unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,6 @@
|
||||||
#include "swad_forum.h"
|
#include "swad_forum.h"
|
||||||
#include "swad_holiday.h"
|
#include "swad_holiday.h"
|
||||||
#include "swad_image.h"
|
#include "swad_image.h"
|
||||||
#include "swad_import.h"
|
|
||||||
#include "swad_icon.h"
|
#include "swad_icon.h"
|
||||||
#include "swad_indicator.h"
|
#include "swad_indicator.h"
|
||||||
#include "swad_institution.h"
|
#include "swad_institution.h"
|
||||||
|
@ -144,12 +143,6 @@ struct Globals
|
||||||
char IP[Cns_MAX_LENGTH_IP+1];
|
char IP[Cns_MAX_LENGTH_IP+1];
|
||||||
char UniqueNameEncrypted[Cry_LENGTH_ENCRYPTED_STR_SHA256_BASE64+1]; // Used for session id, temporary directory names, etc.
|
char UniqueNameEncrypted[Cry_LENGTH_ENCRYPTED_STR_SHA256_BASE64+1]; // Used for session id, temporary directory names, etc.
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
char ExternalUsrId[Cfg_MAX_LENGTH_IMPORTED_USR_ID+1]; // External user ID
|
|
||||||
char ExternalSesId[Cfg_MAX_LENGTH_IMPORTED_SESSION_ID+1]; // External session ID
|
|
||||||
Rol_Role_t ExternalRole;
|
|
||||||
} Imported;
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
Txt_Language_t Language;
|
Txt_Language_t Language;
|
||||||
|
|
|
@ -126,7 +126,6 @@ void Hlp_ShowHelpWhatWouldYouLikeToDo (void)
|
||||||
{
|
{
|
||||||
if (Gbl.Action.Act != ActAutUsrInt &&
|
if (Gbl.Action.Act != ActAutUsrInt &&
|
||||||
Gbl.Action.Act != ActAutUsrNew &&
|
Gbl.Action.Act != ActAutUsrNew &&
|
||||||
Gbl.Action.Act != ActAutUsrExt &&
|
|
||||||
Gbl.Action.Act != ActAutUsrChgLan) // I am not just logged
|
Gbl.Action.Act != ActAutUsrChgLan) // I am not just logged
|
||||||
{
|
{
|
||||||
/* Request my removing from this course */
|
/* Request my removing from this course */
|
||||||
|
|
597
swad_import.c
597
swad_import.c
|
@ -1,597 +0,0 @@
|
||||||
// swad_import.c: import courses and students from another web application using web services
|
|
||||||
|
|
||||||
/*
|
|
||||||
SWAD (Shared Workspace At a Distance),
|
|
||||||
is a web platform developed at the University of Granada (Spain),
|
|
||||||
and used to support university teaching.
|
|
||||||
|
|
||||||
This file is part of SWAD core.
|
|
||||||
Copyright (C) 1999-2016 Antonio Cañas Vargas
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Affero General Public License as
|
|
||||||
published by the Free Software Foundation, either version 3 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Affero General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
/*****************************************************************************/
|
|
||||||
/********************************* Headers ***********************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
#include <linux/limits.h> // For PATH_MAX
|
|
||||||
#include <linux/stddef.h> // For NULL
|
|
||||||
#include <stdlib.h> // For exit, system, malloc, free, rand, etc.
|
|
||||||
#include <string.h> // For string functions
|
|
||||||
#include <sys/wait.h> // For the macro WEXITSTATUS
|
|
||||||
#include <unistd.h> // For unlink
|
|
||||||
|
|
||||||
#include "swad_account.h"
|
|
||||||
#include "swad_config.h"
|
|
||||||
#include "swad_database.h"
|
|
||||||
#include "swad_enrollment.h"
|
|
||||||
#include "swad_global.h"
|
|
||||||
#include "swad_ID.h"
|
|
||||||
#include "swad_import.h"
|
|
||||||
#include "swad_parameter.h"
|
|
||||||
#include "swad_user.h"
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************** External global variables from others modules ****************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
extern struct Globals Gbl;
|
|
||||||
extern const char *Usr_StringsSexDB[Usr_NUM_SEXS];
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/***************************** Private constants *****************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
#define Imp_OK 0
|
|
||||||
#define Imp_ERROR_BAD_SESSION 1
|
|
||||||
#define Imp_ERROR_NOT_ENOUGH_MEMORY 2
|
|
||||||
#define Imp_ERROR_SOAP 3
|
|
||||||
|
|
||||||
#define Imp_MAX_BYTES_USR_ID 16
|
|
||||||
#define Imp_MAX_BYTES_NAME 32
|
|
||||||
#define Imp_MAX_BYTES_EMAIL 127
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/******************************* Private types *******************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
struct ImportedStudent
|
|
||||||
{
|
|
||||||
char ExternalUsrID[Imp_MAX_BYTES_USR_ID+1];
|
|
||||||
char FirstName[Imp_MAX_BYTES_NAME+1];
|
|
||||||
char Surname1[Imp_MAX_BYTES_NAME+1];
|
|
||||||
char Surname2[Imp_MAX_BYTES_NAME+1];
|
|
||||||
char Email[Imp_MAX_BYTES_EMAIL+1];
|
|
||||||
Usr_Sex_t Sex;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/***************************** Private prototypes ****************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Imp_ListMyImpGrpsAndStds (bool ItsAFormToRegRemStds);
|
|
||||||
static void Imp_RemoveOldImpSessions (void);
|
|
||||||
static void Imp_RemoveOldImpStdsAndGrps (void);
|
|
||||||
static unsigned Imp_GetAndListImpGrpsAndStdsFromDB (bool ItsAFormToRegRemStds);
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************** Get parameters with imported user and session ****************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
void Imp_GetImpUsrAndSession (void)
|
|
||||||
{
|
|
||||||
Gbl.Imported.ExternalUsrId[0] = '\0';
|
|
||||||
if (Cfg_NAME_PARAM_IMPORTED_USR_ID[0])
|
|
||||||
Par_GetParToText (Cfg_NAME_PARAM_IMPORTED_USR_ID,Gbl.Imported.ExternalUsrId,Cfg_MAX_LENGTH_IMPORTED_USR_ID);
|
|
||||||
|
|
||||||
Gbl.Imported.ExternalSesId[0] = '\0';
|
|
||||||
if (Cfg_NAME_PARAM_IMPORTED_SESSION_ID[0])
|
|
||||||
Par_GetParToText (Cfg_NAME_PARAM_IMPORTED_SESSION_ID,Gbl.Imported.ExternalSesId,Cfg_MAX_LENGTH_IMPORTED_SESSION_ID);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/********** Import the students of an official group from database ***********/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
void Imp_ImportStdsFromAnImpGrp (long ImpGrpCod,struct ListCodGrps *LstGrps,unsigned *NumUsrsRegistered)
|
|
||||||
{
|
|
||||||
char Query[1024];
|
|
||||||
MYSQL_RES *mysql_res;
|
|
||||||
MYSQL_ROW row;
|
|
||||||
unsigned NumStds;
|
|
||||||
unsigned NumStd;
|
|
||||||
struct ImportedStudent ImpStd;
|
|
||||||
Usr_Sex_t Sex;
|
|
||||||
struct UsrData UsrDat;
|
|
||||||
struct ListUsrCods ListUsrCodsForThisID;
|
|
||||||
unsigned NumUsrFoundForThisID;
|
|
||||||
|
|
||||||
/***** Get official data of the imported students belonging to this group from database *****/
|
|
||||||
sprintf (Query,"SELECT UsrID,Surname1,Surname2,FirstName,Sex,E_mail"
|
|
||||||
" FROM imported_students WHERE GrpCod='%ld'"
|
|
||||||
" ORDER BY Surname1,Surname2,FirstName,UsrID",
|
|
||||||
ImpGrpCod);
|
|
||||||
NumStds = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get imported students");
|
|
||||||
|
|
||||||
if (NumStds)
|
|
||||||
{
|
|
||||||
/***** Initialize structure with user's data *****/
|
|
||||||
Usr_UsrDataConstructor (&UsrDat);
|
|
||||||
|
|
||||||
/***** Import the students from this official group *****/
|
|
||||||
for (NumStd = 0;
|
|
||||||
NumStd < NumStds;
|
|
||||||
NumStd++) // For each student inside the official group...
|
|
||||||
{
|
|
||||||
/* Get official data of the student */
|
|
||||||
row = mysql_fetch_row (mysql_res);
|
|
||||||
|
|
||||||
/* Get user's ID (row[0]) */
|
|
||||||
strncpy (ImpStd.ExternalUsrID,row[0],Imp_MAX_BYTES_USR_ID);
|
|
||||||
ImpStd.ExternalUsrID[Imp_MAX_BYTES_USR_ID] = '\0';
|
|
||||||
// Users' IDs are always stored internally in capitals and without leading zeros
|
|
||||||
Str_RemoveLeadingZeros (ImpStd.ExternalUsrID);
|
|
||||||
Str_ConvertToUpperText (ImpStd.ExternalUsrID);
|
|
||||||
|
|
||||||
if (ID_CheckIfUsrIDIsValid (ImpStd.ExternalUsrID)) // If it's not a valid user's ID, skip it
|
|
||||||
{
|
|
||||||
/* Get Surname1 (row[1]) */
|
|
||||||
strncpy (ImpStd.Surname1,row[1],Imp_MAX_BYTES_NAME);
|
|
||||||
ImpStd.Surname1[Imp_MAX_BYTES_NAME] = '\0';
|
|
||||||
|
|
||||||
/* Get Surname2 (row[2]) */
|
|
||||||
strncpy (ImpStd.Surname2,row[2],Imp_MAX_BYTES_NAME);
|
|
||||||
ImpStd.Surname2[Imp_MAX_BYTES_NAME] = '\0';
|
|
||||||
|
|
||||||
/* Get FirstName (row[3]) */
|
|
||||||
strncpy (ImpStd.FirstName,row[3],Imp_MAX_BYTES_NAME);
|
|
||||||
ImpStd.FirstName[Imp_MAX_BYTES_NAME] = '\0';
|
|
||||||
|
|
||||||
/* Get Sex (row[4]) */
|
|
||||||
ImpStd.Sex = Usr_SEX_UNKNOWN;
|
|
||||||
for (Sex = (Usr_Sex_t) 0;
|
|
||||||
Sex < Usr_NUM_SEXS;
|
|
||||||
Sex++)
|
|
||||||
if (!strcasecmp (row[4],Usr_StringsSexDB[Sex]))
|
|
||||||
{
|
|
||||||
ImpStd.Sex = Sex;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get e-mail (row[5]) */
|
|
||||||
strncpy (ImpStd.Email,row[5],Imp_MAX_BYTES_EMAIL);
|
|
||||||
ImpStd.Email[Imp_MAX_BYTES_EMAIL] = '\0';
|
|
||||||
|
|
||||||
/* Set ID of the student */
|
|
||||||
ID_ReallocateListIDs (&UsrDat,1);
|
|
||||||
strncpy (UsrDat.IDs.List[0].ID,ImpStd.ExternalUsrID,ID_MAX_LENGTH_USR_ID);
|
|
||||||
UsrDat.IDs.List[0].ID[ID_MAX_LENGTH_USR_ID] = '\0';
|
|
||||||
|
|
||||||
if (ID_GetListUsrCodsFromUsrID (&UsrDat,NULL,&ListUsrCodsForThisID,false))
|
|
||||||
{// User(s) found
|
|
||||||
for (NumUsrFoundForThisID = 0;
|
|
||||||
NumUsrFoundForThisID < ListUsrCodsForThisID.NumUsrs;
|
|
||||||
NumUsrFoundForThisID++)
|
|
||||||
{
|
|
||||||
/* Get user's data */
|
|
||||||
UsrDat.UsrCod = ListUsrCodsForThisID.Lst[NumUsrFoundForThisID];
|
|
||||||
Usr_GetUsrDataFromUsrCod (&UsrDat); // Get data of the first user in list
|
|
||||||
|
|
||||||
if (UsrDat.RoleInCurrentCrsDB <= Rol_STUDENT)
|
|
||||||
{
|
|
||||||
/* Update user's data if only one user with this ID */
|
|
||||||
if (ListUsrCodsForThisID.NumUsrs == 1) // Only one user with this ID
|
|
||||||
{
|
|
||||||
/* Fill empty data */
|
|
||||||
if (!UsrDat.Surname1[0])
|
|
||||||
strcpy (UsrDat.Surname1,ImpStd.Surname1);
|
|
||||||
if (!UsrDat.Surname2[0])
|
|
||||||
strcpy (UsrDat.Surname2,ImpStd.Surname2);
|
|
||||||
if (!UsrDat.FirstName[0])
|
|
||||||
strcpy (UsrDat.FirstName,ImpStd.FirstName);
|
|
||||||
if (UsrDat.Sex == Usr_SEX_UNKNOWN)
|
|
||||||
UsrDat.Sex = ImpStd.Sex;
|
|
||||||
|
|
||||||
/* Update user's data */
|
|
||||||
Enr_UpdateUsrData (&UsrDat);
|
|
||||||
|
|
||||||
/* Update e-mail */
|
|
||||||
if (!UsrDat.Email[0])
|
|
||||||
{
|
|
||||||
strcpy (UsrDat.Email,ImpStd.Email);
|
|
||||||
if (!Mai_UpdateEmailInDB (&UsrDat,UsrDat.Email)) // Email was already registered and confirmed by another user
|
|
||||||
UsrDat.Email[0] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (UsrDat.RoleInCurrentCrsDB == Rol_STUDENT) // He/she was already a student in current course
|
|
||||||
Enr_AcceptUsrInCrs (UsrDat.UsrCod);
|
|
||||||
else // He/she not belonged to the current course
|
|
||||||
/* Register user as student in the current course */
|
|
||||||
Enr_RegisterUsrInCurrentCrs (&UsrDat,Rol_STUDENT,
|
|
||||||
Cns_QUIET,Enr_SET_ACCEPTED_TO_TRUE);
|
|
||||||
|
|
||||||
/* Register user in the selected groups */
|
|
||||||
if (Gbl.CurrentCrs.Grps.NumGrps) // If there are groups in current course
|
|
||||||
Grp_RegisterUsrIntoGroups (&UsrDat,LstGrps); // Register student in the selected groups
|
|
||||||
|
|
||||||
/* Confirm user's ID */
|
|
||||||
ID_ConfirmUsrID (&UsrDat,ImpStd.ExternalUsrID);
|
|
||||||
|
|
||||||
(*NumUsrsRegistered)++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Free memory used for list of users' codes found for this ID */
|
|
||||||
Usr_FreeListUsrCods (&ListUsrCodsForThisID);
|
|
||||||
}
|
|
||||||
else // No users found with this ID
|
|
||||||
{// The user does not exist in the platform. Register him/her in the current course as student
|
|
||||||
Usr_ResetUsrDataExceptUsrCodAndIDs (&UsrDat);
|
|
||||||
strcpy (UsrDat.Surname1,ImpStd.Surname1);
|
|
||||||
strcpy (UsrDat.Surname2,ImpStd.Surname2);
|
|
||||||
strcpy (UsrDat.FirstName,ImpStd.FirstName);
|
|
||||||
UsrDat.Sex = ImpStd.Sex;
|
|
||||||
strcpy (UsrDat.Email,ImpStd.Email);
|
|
||||||
|
|
||||||
/* Create user */
|
|
||||||
UsrDat.IDs.List[0].Confirmed = true; // If he/she is a new user ==> his/her ID will be stored as confirmed in database
|
|
||||||
Acc_CreateNewUsr (&UsrDat);
|
|
||||||
|
|
||||||
/* Update e-mail */
|
|
||||||
if (!Mai_UpdateEmailInDB (&UsrDat,UsrDat.Email)) // Email was already registered and confirmed by another user
|
|
||||||
UsrDat.Email[0] = '\0';
|
|
||||||
|
|
||||||
/* Register user as student in the current course */
|
|
||||||
Enr_RegisterUsrInCurrentCrs (&UsrDat,Rol_STUDENT,
|
|
||||||
Cns_QUIET,Enr_SET_ACCEPTED_TO_TRUE);
|
|
||||||
|
|
||||||
/* Register user in the selected groups */
|
|
||||||
if (Gbl.CurrentCrs.Grps.NumGrps) // If there are groups in current course
|
|
||||||
Grp_RegisterUsrIntoGroups (&UsrDat,LstGrps); // Register student in the selected groups
|
|
||||||
|
|
||||||
(*NumUsrsRegistered)++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Free memory used for user's data *****/
|
|
||||||
Usr_UsrDataDestructor (&UsrDat);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/*************** Insert new imported session in the database *****************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
void Imp_InsertImpSessionInDB (void)
|
|
||||||
{
|
|
||||||
char Query[1024];
|
|
||||||
|
|
||||||
/***** Remove old imported sessions *****/
|
|
||||||
Imp_RemoveOldImpSessions ();
|
|
||||||
|
|
||||||
/***** Insert session in the database *****/
|
|
||||||
sprintf (Query,"INSERT INTO imported_sessions"
|
|
||||||
" (SessionId,UsrCod,ImportedUsrId,ImportedSessionId,ImportedRole)"
|
|
||||||
" VALUES ('%s','%ld','%s','%s','%u')",
|
|
||||||
Gbl.Session.Id,
|
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
||||||
Gbl.Imported.ExternalUsrId,
|
|
||||||
Gbl.Imported.ExternalSesId,
|
|
||||||
(unsigned) Gbl.Imported.ExternalRole);
|
|
||||||
DB_QueryINSERT (Query,"can not create imported session");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/******************** Get the data of a imported session *********************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
bool Imp_GetImpSessionData (void)
|
|
||||||
{
|
|
||||||
char Query[512];
|
|
||||||
MYSQL_RES *mysql_res;
|
|
||||||
MYSQL_ROW row;
|
|
||||||
unsigned long NumRows;
|
|
||||||
bool Result = false;
|
|
||||||
|
|
||||||
/***** Get data of the imported session from database *****/
|
|
||||||
sprintf (Query,"SELECT ImportedUsrId,ImportedSessionId,ImportedRole"
|
|
||||||
" FROM imported_sessions"
|
|
||||||
" WHERE SessionId='%s'",
|
|
||||||
Gbl.Session.Id);
|
|
||||||
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get imported session data");
|
|
||||||
|
|
||||||
/***** Check if the session existed in the database *****/
|
|
||||||
if (NumRows)
|
|
||||||
{
|
|
||||||
row = mysql_fetch_row (mysql_res);
|
|
||||||
|
|
||||||
/***** Get imported user identifier (row[0]) *****/
|
|
||||||
strcpy (Gbl.Imported.ExternalUsrId,row[0]);
|
|
||||||
|
|
||||||
/***** Get imported session identifier (row[1]) *****/
|
|
||||||
strcpy (Gbl.Imported.ExternalSesId,row[1]);
|
|
||||||
|
|
||||||
/***** Get imported user's (external) role (row[2]) *****/
|
|
||||||
if (sscanf (row[2],"%u",&Gbl.Imported.ExternalRole) != 1)
|
|
||||||
Gbl.Imported.ExternalRole = Rol_UNKNOWN;
|
|
||||||
|
|
||||||
Result = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
|
||||||
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************* Get lists of my imported groups and students ******************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
void Imp_ListMyImpGrpsAndStdsNoForm (void)
|
|
||||||
{
|
|
||||||
Imp_ListMyImpGrpsAndStds (false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************* Get lists of my imported groups and students ******************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
void Imp_ListMyImpGrpsAndStdsForm (void)
|
|
||||||
{
|
|
||||||
Imp_ListMyImpGrpsAndStds (true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************* Get lists of my imported groups and students ******************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Imp_ListMyImpGrpsAndStds (bool ItsAFormToRegRemStds)
|
|
||||||
{
|
|
||||||
extern const char *Txt_Could_not_get_the_official_list_of_your_groups_and_students_;
|
|
||||||
extern const char *Txt_To_get_the_official_list_of_your_groups_and_students_;
|
|
||||||
char PathRelParamsToCommandsPriv[PATH_MAX+1];
|
|
||||||
char FileNameParams[PATH_MAX+1];
|
|
||||||
FILE *FileParams;
|
|
||||||
char Command[2048];
|
|
||||||
int ReturnCode;
|
|
||||||
|
|
||||||
/***** Try to get lists from database *****/
|
|
||||||
if (!Imp_GetAndListImpGrpsAndStdsFromDB (ItsAFormToRegRemStds))
|
|
||||||
{
|
|
||||||
/***** Remove old imported students and groups *****/
|
|
||||||
Imp_RemoveOldImpStdsAndGrps ();
|
|
||||||
|
|
||||||
if (Gbl.Imported.ExternalUsrId[0] &&
|
|
||||||
Gbl.Imported.ExternalSesId[0] &&
|
|
||||||
Gbl.Imported.ExternalRole == Rol_TEACHER)
|
|
||||||
{
|
|
||||||
/***** Parameters to command used to import data are passed through a temporary file *****/
|
|
||||||
/* If the private directory does not exist, create it */
|
|
||||||
sprintf (PathRelParamsToCommandsPriv,"%s/%s",
|
|
||||||
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_PARAM);
|
|
||||||
Fil_CreateDirIfNotExists (PathRelParamsToCommandsPriv);
|
|
||||||
|
|
||||||
/* First of all, we remove the oldest temporary files.
|
|
||||||
Such temporary files have been created by me or by other users.
|
|
||||||
This is a bit sloppy, but they must be removed by someone.
|
|
||||||
Here "oldest" means more than x time from their creation */
|
|
||||||
Fil_RemoveOldTmpFiles (PathRelParamsToCommandsPriv,Cfg_TIME_TO_DELETE_PARAMS_TO_COMMANDS,false);
|
|
||||||
|
|
||||||
/****** Create a new temporary file *****/
|
|
||||||
sprintf (FileNameParams,"%s/%s",PathRelParamsToCommandsPriv,Gbl.UniqueNameEncrypted);
|
|
||||||
if ((FileParams = fopen (FileNameParams,"wb")) == NULL)
|
|
||||||
Lay_ShowErrorAndExit ("Can not open file to send parameters to command.");
|
|
||||||
fprintf (FileParams,"2\n%s\n%s\n%s\n",
|
|
||||||
Gbl.Session.Id,Gbl.Imported.ExternalUsrId,Gbl.Imported.ExternalSesId);
|
|
||||||
fclose (FileParams);
|
|
||||||
|
|
||||||
/***** Get new imported lists and store them in database *****/
|
|
||||||
sprintf (Command,"%s %s",Cfg_EXTERNAL_LOGIN_CLIENT_COMMAND,FileNameParams);
|
|
||||||
ReturnCode = system (Command);
|
|
||||||
// unlink (FileNameParams); // File with parameters is no longer necessary
|
|
||||||
if (ReturnCode == -1)
|
|
||||||
Lay_ShowErrorAndExit ("Error when running command to import lists of groups and students.");
|
|
||||||
|
|
||||||
/***** Write message depending on return code *****/
|
|
||||||
ReturnCode = WEXITSTATUS(ReturnCode);
|
|
||||||
switch (ReturnCode)
|
|
||||||
{
|
|
||||||
case 0: // Success
|
|
||||||
/***** Try again to get lists from database *****/
|
|
||||||
if (!Imp_GetAndListImpGrpsAndStdsFromDB (ItsAFormToRegRemStds))
|
|
||||||
{
|
|
||||||
sprintf (Gbl.Message,Txt_Could_not_get_the_official_list_of_your_groups_and_students_,
|
|
||||||
Cfg_PLATFORM_SHORT_NAME,
|
|
||||||
Cfg_EXTERNAL_LOGIN_URL,
|
|
||||||
Cfg_EXTERNAL_LOGIN_SERVICE_NAME);
|
|
||||||
Lay_ShowAlert (Lay_ERROR,Gbl.Message);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default: // Error
|
|
||||||
sprintf (Gbl.Message,"Error %d while importing lists of groups and students.",ReturnCode);
|
|
||||||
Lay_ShowAlert (Lay_ERROR,Gbl.Message);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // I am not entered from external program as teacher
|
|
||||||
{
|
|
||||||
sprintf (Gbl.Message,Txt_To_get_the_official_list_of_your_groups_and_students_,
|
|
||||||
Cfg_PLATFORM_SHORT_NAME,
|
|
||||||
Cfg_EXTERNAL_LOGIN_URL,
|
|
||||||
Cfg_EXTERNAL_LOGIN_SERVICE_NAME);
|
|
||||||
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/*********************** Remove old imported sessions ************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Imp_RemoveOldImpSessions (void)
|
|
||||||
{
|
|
||||||
char Query[1024];
|
|
||||||
|
|
||||||
/***** Remove old imported sessions *****/
|
|
||||||
sprintf (Query,"DELETE FROM imported_sessions"
|
|
||||||
" WHERE SessionId NOT IN (SELECT SessionId FROM sessions)");
|
|
||||||
DB_QueryDELETE (Query,"can not remove old imported sessions");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/***************** Remove old imported students and groups *******************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Imp_RemoveOldImpStdsAndGrps (void)
|
|
||||||
{
|
|
||||||
char Query[1024];
|
|
||||||
|
|
||||||
/***** Remove old imported students *****/
|
|
||||||
sprintf (Query,"DELETE FROM imported_students"
|
|
||||||
" USING imported_groups,imported_students"
|
|
||||||
" WHERE imported_groups.SessionId NOT IN"
|
|
||||||
" (SELECT SessionId FROM sessions)"
|
|
||||||
" AND imported_groups.GrpCod=imported_students.GrpCod");
|
|
||||||
DB_QueryDELETE (Query,"can not remove old imported students");
|
|
||||||
|
|
||||||
/***** Remove old imported groups *****/
|
|
||||||
sprintf (Query,"DELETE FROM imported_groups"
|
|
||||||
" WHERE SessionId NOT IN"
|
|
||||||
" (SELECT SessionId FROM sessions)");
|
|
||||||
DB_QueryDELETE (Query,"can not remove old imported groups");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/******** Get from database and list imported groups and students ************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static unsigned Imp_GetAndListImpGrpsAndStdsFromDB (bool ItsAFormToRegRemStds)
|
|
||||||
{
|
|
||||||
extern const char *Txt_Official_students;
|
|
||||||
extern const char *Txt_Group;
|
|
||||||
extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
|
||||||
char Query[1024];
|
|
||||||
MYSQL_RES *mysql_res_grp;
|
|
||||||
MYSQL_RES *mysql_res_std;
|
|
||||||
MYSQL_ROW row;
|
|
||||||
char ExternalCrsCod[Crs_LENGTH_INSTITUTIONAL_CRS_COD+1];
|
|
||||||
unsigned NumGrps;
|
|
||||||
unsigned NumGrp;
|
|
||||||
long GrpCod;
|
|
||||||
unsigned NumStds;
|
|
||||||
unsigned NumStd;
|
|
||||||
|
|
||||||
/***** Get data of imported groups from database *****/
|
|
||||||
sprintf (Query,"SELECT GrpCod,ExternalCrsCod,DegName,CrsName,GrpName,GrpType"
|
|
||||||
" FROM imported_groups"
|
|
||||||
" WHERE SessionId='%s'"
|
|
||||||
" ORDER BY DegName,CrsName,GrpName,GrpType",
|
|
||||||
Gbl.Session.Id);
|
|
||||||
NumGrps = (unsigned) DB_QuerySELECT (Query,&mysql_res_grp,"can not get imported groups");
|
|
||||||
|
|
||||||
if (NumGrps)
|
|
||||||
{
|
|
||||||
/***** Start table with groups *****/
|
|
||||||
Lay_StartRoundFrameTable (NULL,2,NULL);
|
|
||||||
fprintf (Gbl.F.Out,"<tr>"
|
|
||||||
"<th colspan=\"%u\" class=\"CENTER_TOP\">",
|
|
||||||
ItsAFormToRegRemStds ? 3 :
|
|
||||||
2);
|
|
||||||
Lay_WriteTitle (Txt_Official_students);
|
|
||||||
fprintf (Gbl.F.Out,"</th>"
|
|
||||||
"</tr>");
|
|
||||||
|
|
||||||
/***** Get groups and write them *****/
|
|
||||||
for (NumGrp = 0;
|
|
||||||
NumGrp < NumGrps;
|
|
||||||
NumGrp++) // For each course
|
|
||||||
{
|
|
||||||
row = mysql_fetch_row (mysql_res_grp);
|
|
||||||
|
|
||||||
GrpCod = Str_ConvertStrCodToLongCod (row[0]);
|
|
||||||
strncpy (ExternalCrsCod,row[1],Crs_LENGTH_INSTITUTIONAL_CRS_COD);
|
|
||||||
ExternalCrsCod[Crs_LENGTH_INSTITUTIONAL_CRS_COD] = '\0';
|
|
||||||
|
|
||||||
/***** Get data of the imported students belonging to this group from database *****/
|
|
||||||
sprintf (Query,"SELECT UsrID,Surname1,Surname2,FirstName"
|
|
||||||
" FROM imported_students"
|
|
||||||
" WHERE GrpCod='%ld' ORDER BY Surname1,Surname2,FirstName,UsrID",
|
|
||||||
GrpCod);
|
|
||||||
NumStds = (unsigned) DB_QuerySELECT (Query,&mysql_res_std,"can not get imported students");
|
|
||||||
|
|
||||||
fprintf (Gbl.F.Out,"<tr>");
|
|
||||||
if (ItsAFormToRegRemStds)
|
|
||||||
/* Put checkbox to select the group */
|
|
||||||
fprintf (Gbl.F.Out,"<td rowspan=\"2\" class=\"LEFT_TOP\">"
|
|
||||||
"<input type=\"checkbox\" name=\"ImpGrpCod\" value=\"%ld_%s\" />"
|
|
||||||
"</td>",
|
|
||||||
GrpCod,ExternalCrsCod);
|
|
||||||
|
|
||||||
/* Write degree, course and group */
|
|
||||||
fprintf (Gbl.F.Out,"<td colspan=\"2\" class=\"DAT LEFT_TOP\">"
|
|
||||||
"%s<br />%s %s<br />%s %s (%s)"
|
|
||||||
"</td>" \
|
|
||||||
"</tr>",
|
|
||||||
row[2],
|
|
||||||
ExternalCrsCod,row[3],
|
|
||||||
Txt_Group,row[4],row[5]);
|
|
||||||
|
|
||||||
/* Write students */
|
|
||||||
fprintf (Gbl.F.Out,"<tr>" \
|
|
||||||
"<td class=\"DAT LEFT_TOP\">"
|
|
||||||
"%u %s%s"
|
|
||||||
"</td>" \
|
|
||||||
"<td class=\"DAT LEFT_TOP\">",
|
|
||||||
NumStds,Txt_ROLES_PLURAL_abc[Rol_STUDENT][Usr_SEX_UNKNOWN],
|
|
||||||
NumStds ? ":" :
|
|
||||||
"");
|
|
||||||
if (NumStds)
|
|
||||||
{
|
|
||||||
fprintf (Gbl.F.Out,"<textarea cols=\"60\" rows=\"%u\" readonly>",
|
|
||||||
NumStds > 50 ? NumStds / 10 :
|
|
||||||
5);
|
|
||||||
for (NumStd = 0;
|
|
||||||
NumStd < NumStds;
|
|
||||||
NumStd++) // For each student inside the group
|
|
||||||
{
|
|
||||||
row = mysql_fetch_row (mysql_res_std);
|
|
||||||
fprintf (Gbl.F.Out,"%s %s",row[0],row[1]); // User's ID and Surname 1
|
|
||||||
if (row[2][0])
|
|
||||||
fprintf (Gbl.F.Out," %s",row[2]); // Surname 2
|
|
||||||
fprintf (Gbl.F.Out,", %s\n",row[3]); // First name
|
|
||||||
}
|
|
||||||
fprintf (Gbl.F.Out,"</textarea>");
|
|
||||||
}
|
|
||||||
fprintf (Gbl.F.Out,"</td>" \
|
|
||||||
"</tr>");
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
|
||||||
DB_FreeMySQLResult (&mysql_res_std);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** End of table with courses *****/
|
|
||||||
Lay_EndRoundFrameTable ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
|
||||||
DB_FreeMySQLResult (&mysql_res_grp);
|
|
||||||
|
|
||||||
return NumGrps;
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
// swad_import.h: import courses and students from another web application using web services
|
|
||||||
|
|
||||||
#ifndef _SWAD_IMP
|
|
||||||
#define _SWAD_IMP
|
|
||||||
/*
|
|
||||||
SWAD (Shared Workspace At a Distance in Spanish),
|
|
||||||
is a web platform developed at the University of Granada (Spain),
|
|
||||||
and used to support university teaching.
|
|
||||||
|
|
||||||
This file is part of SWAD core.
|
|
||||||
Copyright (C) 1999-2016 Antonio Cañas Vargas
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Affero General Public License as
|
|
||||||
published by the Free Software Foundation, either version 3 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Affero General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
/*****************************************************************************/
|
|
||||||
/********************************* Headers ***********************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
#include "swad_group.h"
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/***************************** Public constants ******************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
#define Imp_MAX_BYTES_LIST_EXTERNAL_GRP_CODS (10*1024)
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/******************************* Public types ********************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/***************************** Public prototypes *****************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
void Imp_GetImpUsrAndSession (void);
|
|
||||||
void Imp_ImportStdsFromAnImpGrp (long ImpGrpCod,struct ListCodGrps *LstGrps,unsigned *NumUsrsRegistered);
|
|
||||||
void Imp_ListMyImpGrpsAndStdsNoForm (void);
|
|
||||||
void Imp_ListMyImpGrpsAndStdsForm (void);
|
|
||||||
void Imp_InsertImpSessionInDB (void);
|
|
||||||
bool Imp_GetImpSessionData (void);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -220,8 +220,7 @@ void Lay_WriteStartOfPage (void)
|
||||||
|
|
||||||
/* Redirect to correct language */
|
/* Redirect to correct language */
|
||||||
if ((Gbl.Action.Act == ActAutUsrInt ||
|
if ((Gbl.Action.Act == ActAutUsrInt ||
|
||||||
Gbl.Action.Act == ActAutUsrNew ||
|
Gbl.Action.Act == ActAutUsrNew) && // Action is log in
|
||||||
Gbl.Action.Act == ActAutUsrExt) && // Action is log in
|
|
||||||
Gbl.Usrs.Me.Logged && // I am just logged
|
Gbl.Usrs.Me.Logged && // I am just logged
|
||||||
Gbl.Usrs.Me.UsrDat.Prefs.Language != Txt_Current_CGI_SWAD_Language) // My language != current language
|
Gbl.Usrs.Me.UsrDat.Prefs.Language != Txt_Current_CGI_SWAD_Language) // My language != current language
|
||||||
Lay_WriteRedirectionToMyLanguage ();
|
Lay_WriteRedirectionToMyLanguage ();
|
||||||
|
@ -323,7 +322,6 @@ void Lay_WriteStartOfPage (void)
|
||||||
/* Write new year greeting */
|
/* Write new year greeting */
|
||||||
if (Gbl.Action.Act == ActAutUsrInt ||
|
if (Gbl.Action.Act == ActAutUsrInt ||
|
||||||
Gbl.Action.Act == ActAutUsrNew ||
|
Gbl.Action.Act == ActAutUsrNew ||
|
||||||
Gbl.Action.Act == ActAutUsrExt ||
|
|
||||||
Gbl.Action.Act == ActAutUsrChgLan)
|
Gbl.Action.Act == ActAutUsrChgLan)
|
||||||
if (Gbl.Now.Date.Month == 1 &&
|
if (Gbl.Now.Date.Month == 1 &&
|
||||||
Gbl.Now.Date.Day == 1)
|
Gbl.Now.Date.Day == 1)
|
||||||
|
@ -987,8 +985,7 @@ static void Lay_ShowRightColumn (void)
|
||||||
/***** SWADroid advertisement *****/
|
/***** SWADroid advertisement *****/
|
||||||
if (!Gbl.Usrs.Me.Logged ||
|
if (!Gbl.Usrs.Me.Logged ||
|
||||||
Gbl.Action.Act == ActAutUsrInt ||
|
Gbl.Action.Act == ActAutUsrInt ||
|
||||||
Gbl.Action.Act == ActAutUsrNew ||
|
Gbl.Action.Act == ActAutUsrNew)
|
||||||
Gbl.Action.Act == ActAutUsrExt)
|
|
||||||
fprintf (Gbl.F.Out,"<div class=\"LEFT_RIGHT_CELL\">"
|
fprintf (Gbl.F.Out,"<div class=\"LEFT_RIGHT_CELL\">"
|
||||||
"<a href=\"https://play.google.com/store/apps/details?id=es.ugr.swad.swadroid\""
|
"<a href=\"https://play.google.com/store/apps/details?id=es.ugr.swad.swadroid\""
|
||||||
" target=\"_blank\" title=\"%s\">"
|
" target=\"_blank\" title=\"%s\">"
|
||||||
|
|
|
@ -668,18 +668,7 @@ void Par_GetMainParameters (void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if SWAD is called from an external site */
|
/***** Set default action *****/
|
||||||
Imp_GetImpUsrAndSession ();
|
|
||||||
if (Gbl.Imported.ExternalUsrId[0] &&
|
|
||||||
Gbl.Imported.ExternalSesId[0])
|
|
||||||
{
|
|
||||||
Gbl.Action.Act = ActAutUsrExt;
|
|
||||||
Tab_SetCurrentTab ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// SWAD is not called from external site
|
|
||||||
|
|
||||||
/***** Set dfault action *****/
|
|
||||||
Gbl.Action.Act = ActUnk;
|
Gbl.Action.Act = ActUnk;
|
||||||
|
|
||||||
/***** Get another user's nickname, if exists
|
/***** Get another user's nickname, if exists
|
||||||
|
@ -725,10 +714,7 @@ void Par_GetMainParameters (void)
|
||||||
{
|
{
|
||||||
/***** Get user's code, password, current degree and current course from stored session *****/
|
/***** Get user's code, password, current degree and current course from stored session *****/
|
||||||
if (Ses_GetSessionData ())
|
if (Ses_GetSessionData ())
|
||||||
{
|
|
||||||
Gbl.Session.IsOpen = true;
|
Gbl.Session.IsOpen = true;
|
||||||
Imp_GetImpSessionData ();
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Gbl.Session.HasBeenDisconnected = true;
|
Gbl.Session.HasBeenDisconnected = true;
|
||||||
|
@ -743,10 +729,7 @@ void Par_GetMainParameters (void)
|
||||||
{
|
{
|
||||||
/***** Get user's code, password, current degree and current course from stored session *****/
|
/***** Get user's code, password, current degree and current course from stored session *****/
|
||||||
if (Ses_GetSessionData ())
|
if (Ses_GetSessionData ())
|
||||||
{
|
|
||||||
Gbl.Session.IsOpen = true;
|
Gbl.Session.IsOpen = true;
|
||||||
Imp_GetImpSessionData ();
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Gbl.Session.HasBeenDisconnected = true;
|
Gbl.Session.HasBeenDisconnected = true;
|
||||||
|
|
144
swad_text.c
144
swad_text.c
|
@ -26983,27 +26983,6 @@ const char *Txt_Office =
|
||||||
"Gabinete";
|
"Gabinete";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *Txt_Official_students =
|
|
||||||
#if L==1
|
|
||||||
"Estudiants oficials";
|
|
||||||
#elif L==2
|
|
||||||
"Offizielle Teilnehmer";
|
|
||||||
#elif L==3
|
|
||||||
"Official students";
|
|
||||||
#elif L==4
|
|
||||||
"Estudiantes oficiales";
|
|
||||||
#elif L==5
|
|
||||||
"Étudiants officiels";
|
|
||||||
#elif L==6
|
|
||||||
"Estudiantes oficiales"; // Okoteve traducción
|
|
||||||
#elif L==7
|
|
||||||
"Studenti ufficiali";
|
|
||||||
#elif L==8
|
|
||||||
"Dziennik studentów";
|
|
||||||
#elif L==9
|
|
||||||
"Estudantes oficiais";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const char *Txt_One_message_has_been_deleted =
|
const char *Txt_One_message_has_been_deleted =
|
||||||
#if L==1
|
#if L==1
|
||||||
"Se ha eliminado un mensaje."; // Necessita traduccio
|
"Se ha eliminado un mensaje."; // Necessita traduccio
|
||||||
|
@ -27277,48 +27256,6 @@ const char *Txt_Opening_of_groups =
|
||||||
"Opening of groups"; // Necessita de tradução
|
"Opening of groups"; // Necessita de tradução
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *Txt_Option_a_Import_students_from_the_official_lists =
|
|
||||||
#if L==1
|
|
||||||
"Opción a): Obtenga estudiantes de las listas oficiales"; // Necessita traduccio
|
|
||||||
#elif L==2
|
|
||||||
"Option a): Import students from the official lists"; // Need Übersetzung
|
|
||||||
#elif L==3
|
|
||||||
"Option a): Import students from the official lists";
|
|
||||||
#elif L==4
|
|
||||||
"Opción a): Obtenga estudiantes de las listas oficiales";
|
|
||||||
#elif L==5
|
|
||||||
"Option a): Import students from the official lists"; // Besoin de traduction
|
|
||||||
#elif L==6
|
|
||||||
"Opción a): Obtenga estudiantes de las listas oficiales"; // Okoteve traducción
|
|
||||||
#elif L==7
|
|
||||||
"Opzione a): Importa studenti dalle liste ufficiali";
|
|
||||||
#elif L==8
|
|
||||||
"Opcja a): Studentów Import z oficjalnej listy";
|
|
||||||
#elif L==9
|
|
||||||
"Option a): Import students from the official lists"; // Necessita de tradução
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const char *Txt_Option_b_Type_or_paste_a_list_of_users =
|
|
||||||
#if L==1
|
|
||||||
"Opción b): Escriba o pegue una lista de usuarios"; // Necessita traduccio
|
|
||||||
#elif L==2
|
|
||||||
"Option b): Type or paste a list of users"; // Need Übersetzung
|
|
||||||
#elif L==3
|
|
||||||
"Option b): Type or paste a list of users";
|
|
||||||
#elif L==4
|
|
||||||
"Opción b): Escriba o pegue una lista de usuarios";
|
|
||||||
#elif L==5
|
|
||||||
"Option b): Type or paste a list of users"; // Besoin de traduction
|
|
||||||
#elif L==6
|
|
||||||
"Opción b): Escriba o pegue una lista de usuarios"; // Okoteve traducción
|
|
||||||
#elif L==7
|
|
||||||
"Opzione b): Scrivi o incolla una lista di utenti";
|
|
||||||
#elif L==8
|
|
||||||
"Opcja b): Wpisz lub wklej liste uzytkowników";
|
|
||||||
#elif L==9
|
|
||||||
"Option b): Type or paste a list of users"; // Necessita de tradução
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const char *Txt_Option_under_development =
|
const char *Txt_Option_under_development =
|
||||||
#if L==1
|
#if L==1
|
||||||
"Opció en desenvolupament.";
|
"Opció en desenvolupament.";
|
||||||
|
@ -35793,27 +35730,6 @@ const char *Txt_Select_the_groups_in_from_which_you_want_to_register_remove_user
|
||||||
" or removed from the course and from all groups."; // Necessita de tradução
|
" or removed from the course and from all groups."; // Necessita de tradução
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *Txt_Select_the_groups_of_students_you_want_to_register_in_remove_from_this_course =
|
|
||||||
#if L==1
|
|
||||||
"Seleccione los grupos de estudiantes que desee inscribir en / eliminar de esta asignatura."; // Necessita traduccio
|
|
||||||
#elif L==2
|
|
||||||
"Select the groups of students you want to register in / remove from this course."; // Need Übersetzung
|
|
||||||
#elif L==3
|
|
||||||
"Select the groups of students you want to register in / remove from this course.";
|
|
||||||
#elif L==4
|
|
||||||
"Seleccione los grupos de estudiantes que desee inscribir en / eliminar de esta asignatura.";
|
|
||||||
#elif L==5
|
|
||||||
"Select the groups of students you want to register in / remove from this course."; // Besoin de traduction
|
|
||||||
#elif L==6
|
|
||||||
"Seleccione los grupos de estudiantes que desee inscribir en / eliminar de esta asignatura."; // Okoteve traducción
|
|
||||||
#elif L==7
|
|
||||||
"Seleziona i gruppi di studenti che vuoi registrare in / rimuovere da questo corso.";
|
|
||||||
#elif L==8
|
|
||||||
"Select the groups of students you want to register in / remove from this course."; // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9
|
|
||||||
"Select the groups of students you want to register in / remove from this course."; // Necessita de tradução
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const char *Txt_Send =
|
const char *Txt_Send =
|
||||||
#if L==1
|
#if L==1
|
||||||
"Enviar";
|
"Enviar";
|
||||||
|
@ -46609,7 +46525,8 @@ const char *Txt_There_is_no_empty_account_associated_with_your_ID_X_ = // Warnin
|
||||||
#elif L==4
|
#elif L==4
|
||||||
"No existe ninguna cuenta vacía (aún no usada)"
|
"No existe ninguna cuenta vacía (aún no usada)"
|
||||||
" asociada a su ID <strong>%s</strong>."
|
" asociada a su ID <strong>%s</strong>."
|
||||||
" Si cree que puede haber sido inscrito/a con otro ID, compruébelo, por favor.";
|
" Si cree que puede haber sido inscrito/a con otro ID"
|
||||||
|
" (DNI con letra final o sin ella, NIE, cédula, etc.), compruébelo, por favor.";
|
||||||
#elif L==5
|
#elif L==5
|
||||||
"Il n'y a pas de compte vide (pas encore utilisé)"
|
"Il n'y a pas de compte vide (pas encore utilisé)"
|
||||||
" associé à votre ID <strong>%s</strong>."
|
" associé à votre ID <strong>%s</strong>."
|
||||||
|
@ -46751,63 +46668,6 @@ const char *Txt_There_is_no_user_with_email_X = // Warning: it is very important
|
||||||
" with e-mail <strong>%s</strong>."; // Necessita de tradução
|
" with e-mail <strong>%s</strong>."; // Necessita de tradução
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *Txt_There_is_no_user_in_X_with_ID_Y_If_you_already_have_an_account_on_Z_ = // Warning: it is very important to include three %s in the following sentences
|
|
||||||
#if L==1
|
|
||||||
"No existe ningún usuario en %s"
|
|
||||||
" con el ID (DNI/cédula…) <strong>%s</strong>."
|
|
||||||
" Si usted ya tiene cuenta en %s,"
|
|
||||||
" inicie sesión y añada este ID a su cuenta."
|
|
||||||
" Si no tiene cuenta, puede crear una nueva."; // Necessita traduccio
|
|
||||||
#elif L==2
|
|
||||||
"There is no user in %s"
|
|
||||||
" with ID <strong>%s</strong>."
|
|
||||||
" If you already have an account on %s,"
|
|
||||||
" login and add this ID to your account."
|
|
||||||
" If you have no account, you can create a new one."; // Übersetzung notwendig
|
|
||||||
#elif L==3
|
|
||||||
"There is no user in %s"
|
|
||||||
" with ID <strong>%s</strong>."
|
|
||||||
" If you already have an account on %s,"
|
|
||||||
" login and add this ID to your account."
|
|
||||||
" If you have no account, you can create a new one.";
|
|
||||||
#elif L==4
|
|
||||||
"No existe ningún usuario en %s"
|
|
||||||
" con el ID (DNI/cédula…) <strong>%s</strong>."
|
|
||||||
" Si usted ya tiene cuenta en %s,"
|
|
||||||
" inicie sesión y añada este ID a su cuenta."
|
|
||||||
" Si no tiene cuenta, puede crear una nueva.";
|
|
||||||
#elif L==5
|
|
||||||
"Il n'ya pas d'utilisateur dans %s"
|
|
||||||
" avec ID <strong>%s</strong>."
|
|
||||||
" Si vous avez déjà un compte sur %s,"
|
|
||||||
" vous connecter et ajouter cet ID à votre compte."
|
|
||||||
" Si vous n'avez pas de compte, vous pouvez en créer un nouveau.";
|
|
||||||
#elif L==6
|
|
||||||
"No existe ningún usuario en %s"
|
|
||||||
" con el ID (DNI/cédula…) <strong>%s</strong>."
|
|
||||||
" Si usted ya tiene cuenta en %s,"
|
|
||||||
" inicie sesión y añada este ID a su cuenta."
|
|
||||||
" Si no tiene cuenta, puede crear una nueva."; // Okoteve traducción
|
|
||||||
#elif L==7
|
|
||||||
"Non c'è nessun utente in %s"
|
|
||||||
" con ID <strong>%s</strong>."
|
|
||||||
" Se hai già un account su %s,"
|
|
||||||
" login e inserire questo ID al tuo account."
|
|
||||||
" Se non avete account, è possibile crearne uno nuovo.";
|
|
||||||
#elif L==8
|
|
||||||
"There is no user in %s"
|
|
||||||
" with ID <strong>%s</strong>."
|
|
||||||
" If you already have an account on %s,"
|
|
||||||
" login and add this ID to your account."
|
|
||||||
" If you have no account, you can create a new one."; // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9
|
|
||||||
"There is no user in %s"
|
|
||||||
" with ID <strong>%s</strong>."
|
|
||||||
" If you already have an account on %s,"
|
|
||||||
" login and add this ID to your account."
|
|
||||||
" If you have no account, you can create a new one."; // Necessita de tradução
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const char *Txt_There_is_no_user_with_ID_nick_or_e_mail_X = // Warning: it is very important to include %s in the following sentences
|
const char *Txt_There_is_no_user_with_ID_nick_or_e_mail_X = // Warning: it is very important to include %s in the following sentences
|
||||||
#if L==1
|
#if L==1
|
||||||
"No existe ningún usuario"
|
"No existe ningún usuario"
|
||||||
|
|
216
swad_user.c
216
swad_user.c
|
@ -120,11 +120,9 @@ static void Usr_RemoveTemporaryTableMyCourses (void);
|
||||||
static void Usr_GetParamOtherUsrIDNickOrEMail (void);
|
static void Usr_GetParamOtherUsrIDNickOrEMail (void);
|
||||||
|
|
||||||
static bool Usr_ChkUsrAndGetUsrDataFromDirectLogin (void);
|
static bool Usr_ChkUsrAndGetUsrDataFromDirectLogin (void);
|
||||||
static bool Usr_ChkUsrAndGetUsrDataFromExternalLogin (void);
|
|
||||||
static bool Usr_ChkUsrAndGetUsrDataFromSession (void);
|
static bool Usr_ChkUsrAndGetUsrDataFromSession (void);
|
||||||
static void Usr_ShowAlertUsrDoesNotExistsOrWrongPassword (void);
|
static void Usr_ShowAlertUsrDoesNotExistsOrWrongPassword (void);
|
||||||
static void Usr_ShowAlertThereAreMoreThanOneUsr (void);
|
static void Usr_ShowAlertThereAreMoreThanOneUsr (void);
|
||||||
static void Usr_ShowAlertNoUsrWithThisID (void);
|
|
||||||
|
|
||||||
static void Usr_SetUsrRoleAndPrefs (void);
|
static void Usr_SetUsrRoleAndPrefs (void);
|
||||||
|
|
||||||
|
@ -190,8 +188,6 @@ static void Usr_ShowGstsAllDataParams (void);
|
||||||
static void Usr_ShowStdsAllDataParams (void);
|
static void Usr_ShowStdsAllDataParams (void);
|
||||||
static void Usr_ShowTchsAllDataParams (void);
|
static void Usr_ShowTchsAllDataParams (void);
|
||||||
|
|
||||||
static void Usr_PutLinkToListOfficialStudents (void);
|
|
||||||
|
|
||||||
static void Usr_DrawClassPhoto (Usr_ClassPhotoType_t ClassPhotoType,
|
static void Usr_DrawClassPhoto (Usr_ClassPhotoType_t ClassPhotoType,
|
||||||
Rol_Role_t RoleInClassPhoto);
|
Rol_Role_t RoleInClassPhoto);
|
||||||
|
|
||||||
|
@ -2148,23 +2144,6 @@ void Usr_ChkUsrAndGetUsrData (void)
|
||||||
else
|
else
|
||||||
PutFormLogin = true;
|
PutFormLogin = true;
|
||||||
}
|
}
|
||||||
else if (Gbl.Action.Act == ActAutUsrExt) // Login from external web service
|
|
||||||
{
|
|
||||||
if (Usr_ChkUsrAndGetUsrDataFromExternalLogin ()) // User logged in
|
|
||||||
{
|
|
||||||
Gbl.Usrs.Me.Logged = true;
|
|
||||||
Usr_SetUsrRoleAndPrefs ();
|
|
||||||
|
|
||||||
Act_AdjustCurrentAction ();
|
|
||||||
Ses_CreateSession ();
|
|
||||||
|
|
||||||
Pre_SetPrefsFromIP (); // Set preferences from current IP
|
|
||||||
|
|
||||||
Imp_InsertImpSessionInDB ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
PutFormLogin = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2353,158 +2332,6 @@ static bool Usr_ChkUsrAndGetUsrDataFromDirectLogin (void)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************ Check user and get user's data when external login *************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
// Returns true if user logged in successfully
|
|
||||||
// Returns false if user not logged in
|
|
||||||
|
|
||||||
static bool Usr_ChkUsrAndGetUsrDataFromExternalLogin (void)
|
|
||||||
{
|
|
||||||
struct ListUsrCods ListUsrCods;
|
|
||||||
bool ItSeemsANewUsrIsEnteringFromExternalSite = false;
|
|
||||||
char PathRelParamsToCommandsPriv[PATH_MAX+1];
|
|
||||||
char FileNameParams[PATH_MAX+1];
|
|
||||||
FILE *FileParams;
|
|
||||||
char Command[2048];
|
|
||||||
int ReturnCode;
|
|
||||||
|
|
||||||
/* Login from external service using ID (not necessarily unique) is not secure.
|
|
||||||
Example: Assume a first user who uses an account with private files, messages, etc.
|
|
||||||
If he/she is the unique user with this ID confirmed
|
|
||||||
or if he/she is the unique user with this ID,
|
|
||||||
another second user with the same ID
|
|
||||||
would enter from external service into the first user's account.
|
|
||||||
The solution would be that external service should use e-mail, that is unique. */
|
|
||||||
|
|
||||||
/***** Copy user's identifier received from external site *****/
|
|
||||||
strncpy (Gbl.Usrs.Me.UsrIdLogin,Gbl.Imported.ExternalUsrId,Usr_MAX_BYTES_USR_LOGIN);
|
|
||||||
Gbl.Usrs.Me.UsrIdLogin[Usr_MAX_BYTES_USR_LOGIN] = '\0';
|
|
||||||
// Users' IDs are always stored internally in capitals and without leading zeros
|
|
||||||
Str_RemoveLeadingZeros (Gbl.Usrs.Me.UsrIdLogin);
|
|
||||||
|
|
||||||
/***** Check if user's ID is valid *****/
|
|
||||||
if (ID_CheckIfUsrIDIsValid (Gbl.Usrs.Me.UsrIdLogin))
|
|
||||||
{
|
|
||||||
/***** Allocate space for the list *****/
|
|
||||||
ID_ReallocateListIDs (&Gbl.Usrs.Me.UsrDat,1);
|
|
||||||
|
|
||||||
strncpy (Gbl.Usrs.Me.UsrDat.IDs.List[0].ID,Gbl.Usrs.Me.UsrIdLogin,ID_MAX_LENGTH_USR_ID);
|
|
||||||
Gbl.Usrs.Me.UsrDat.IDs.List[0].ID[ID_MAX_LENGTH_USR_ID] = '\0';
|
|
||||||
Str_ConvertToUpperText (Gbl.Usrs.Me.UsrDat.IDs.List[0].ID);
|
|
||||||
|
|
||||||
/* Check if user's ID exists in database, and get user's data */
|
|
||||||
if (ID_GetListUsrCodsFromUsrID (&Gbl.Usrs.Me.UsrDat,NULL,&ListUsrCods,true)) // Try first only confirmed IDs
|
|
||||||
{
|
|
||||||
if (ListUsrCods.NumUsrs == 1) // Only one user with this ID confirmed
|
|
||||||
{
|
|
||||||
/* Free memory used for list of users' codes found for this ID */
|
|
||||||
Usr_FreeListUsrCods (&ListUsrCods);
|
|
||||||
|
|
||||||
/* Get user's data */
|
|
||||||
Usr_GetAllUsrDataFromUsrCod (&Gbl.Usrs.Me.UsrDat);
|
|
||||||
}
|
|
||||||
else // ListUsrCods.NumUsrs > 1 ==> more than one user with this ID confirmed
|
|
||||||
{
|
|
||||||
/* Free memory used for list of users' codes found for this ID */
|
|
||||||
Usr_FreeListUsrCods (&ListUsrCods);
|
|
||||||
|
|
||||||
Usr_ShowAlertThereAreMoreThanOneUsr ();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ID_GetListUsrCodsFromUsrID (&Gbl.Usrs.Me.UsrDat,NULL,&ListUsrCods,false)) // If there are no users with this ID confirmed, try with all IDs, not only the confirmed ones
|
|
||||||
{
|
|
||||||
if (ListUsrCods.NumUsrs == 1) // Only one user with this ID
|
|
||||||
{
|
|
||||||
/* Free memory used for list of users' codes found for this ID */
|
|
||||||
Usr_FreeListUsrCods (&ListUsrCods);
|
|
||||||
|
|
||||||
/* Mark user's ID as confirmed */
|
|
||||||
ID_ConfirmUsrID (&Gbl.Usrs.Me.UsrDat,Gbl.Usrs.Me.UsrIdLogin);
|
|
||||||
|
|
||||||
/* Get user's data */
|
|
||||||
Usr_GetAllUsrDataFromUsrCod (&Gbl.Usrs.Me.UsrDat);
|
|
||||||
}
|
|
||||||
else // ListUsrCods.NumUsrs > 1
|
|
||||||
{
|
|
||||||
/* Free memory used for list of users' codes found for this ID */
|
|
||||||
Usr_FreeListUsrCods (&ListUsrCods);
|
|
||||||
|
|
||||||
Usr_ShowAlertThereAreMoreThanOneUsr ();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ItSeemsANewUsrIsEnteringFromExternalSite = true;
|
|
||||||
}
|
|
||||||
else // String is not a valid user's nickname, e-mail or ID
|
|
||||||
{
|
|
||||||
Usr_ShowAlertUsrDoesNotExistsOrWrongPassword ();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Validate session:
|
|
||||||
the call to SWAD is really coming from external site? *****/
|
|
||||||
if (Gbl.Imported.ExternalUsrId[0] &&
|
|
||||||
Gbl.Imported.ExternalSesId[0])
|
|
||||||
{
|
|
||||||
/***** Parameters to command used to import data are passed through a temporary file *****/
|
|
||||||
/* If the private directory does not exist, create it */
|
|
||||||
sprintf (PathRelParamsToCommandsPriv,"%s/%s",
|
|
||||||
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_PARAM);
|
|
||||||
Fil_CreateDirIfNotExists (PathRelParamsToCommandsPriv);
|
|
||||||
|
|
||||||
/* First of all, we remove the oldest temporary files.
|
|
||||||
Such temporary files have been created by me or by other users.
|
|
||||||
This is a bit sloppy, but they must be removed by someone.
|
|
||||||
Here "oldest" means more than x time from their creation */
|
|
||||||
Fil_RemoveOldTmpFiles (PathRelParamsToCommandsPriv,Cfg_TIME_TO_DELETE_PARAMS_TO_COMMANDS,false);
|
|
||||||
|
|
||||||
/* Create a new temporary file *****/
|
|
||||||
sprintf (FileNameParams,"%s/%s",PathRelParamsToCommandsPriv,Gbl.UniqueNameEncrypted);
|
|
||||||
if ((FileParams = fopen (FileNameParams,"wb")) == NULL)
|
|
||||||
Lay_ShowErrorAndExit ("Can not open file to send parameters to command.");
|
|
||||||
fprintf (FileParams,"1\n0\n%s\n%s\n",
|
|
||||||
Gbl.Imported.ExternalUsrId,Gbl.Imported.ExternalSesId);
|
|
||||||
fclose (FileParams);
|
|
||||||
|
|
||||||
/***** Validate imported session *****/
|
|
||||||
sprintf (Command,"%s %s",Cfg_EXTERNAL_LOGIN_CLIENT_COMMAND,FileNameParams);
|
|
||||||
ReturnCode = system (Command);
|
|
||||||
unlink (FileNameParams); // File with parameters is no longer necessary
|
|
||||||
if (ReturnCode == -1)
|
|
||||||
Lay_ShowErrorAndExit ("Error when running command to validate imported session.");
|
|
||||||
ReturnCode = WEXITSTATUS(ReturnCode);
|
|
||||||
switch (ReturnCode)
|
|
||||||
{
|
|
||||||
case Rol_STUDENT: // Student
|
|
||||||
case Rol_TEACHER: // Teacher
|
|
||||||
Gbl.Imported.ExternalRole = (Rol_Role_t) ReturnCode;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sprintf (Gbl.Message,"Error %d while validating session.",ReturnCode);
|
|
||||||
Lay_ShowErrorAndExit (Gbl.Message);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now we know than imported session (external login) is valid
|
|
||||||
if (ItSeemsANewUsrIsEnteringFromExternalSite)
|
|
||||||
{
|
|
||||||
/***** User does not exist in the platform *****/
|
|
||||||
Usr_ShowAlertNoUsrWithThisID ();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // External user's ID or session are not valid
|
|
||||||
{
|
|
||||||
Usr_ShowAlertUsrDoesNotExistsOrWrongPassword ();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true; // User is now logged
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******** Check user and get user's data when the session is open ************/
|
/******** Check user and get user's data when the session is open ************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -2561,23 +2388,6 @@ static void Usr_ShowAlertThereAreMoreThanOneUsr (void)
|
||||||
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
|
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/********** Show alert indicating that this ID does not exist ****************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Usr_ShowAlertNoUsrWithThisID (void)
|
|
||||||
{
|
|
||||||
extern const char *Txt_There_is_no_user_in_X_with_ID_Y_If_you_already_have_an_account_on_Z_;
|
|
||||||
|
|
||||||
Gbl.Action.Act = ActFrmLogIn;
|
|
||||||
Tab_SetCurrentTab ();
|
|
||||||
sprintf (Gbl.Message,Txt_There_is_no_user_in_X_with_ID_Y_If_you_already_have_an_account_on_Z_,
|
|
||||||
Cfg_PLATFORM_SHORT_NAME,
|
|
||||||
Gbl.Usrs.Me.UsrIdLogin,
|
|
||||||
Cfg_PLATFORM_SHORT_NAME);
|
|
||||||
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**** Check if users exists, if his password is correct, get his data... *****/
|
/**** Check if users exists, if his password is correct, get his data... *****/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -2614,8 +2424,7 @@ static void Usr_SetUsrRoleAndPrefs (void)
|
||||||
/***** Get my last data *****/
|
/***** Get my last data *****/
|
||||||
Usr_GetMyLastData ();
|
Usr_GetMyLastData ();
|
||||||
if (Gbl.Action.Act == ActAutUsrInt ||
|
if (Gbl.Action.Act == ActAutUsrInt ||
|
||||||
Gbl.Action.Act == ActAutUsrNew ||
|
Gbl.Action.Act == ActAutUsrNew) // If I just logged in...
|
||||||
Gbl.Action.Act == ActAutUsrExt) // If I just logged in...
|
|
||||||
{
|
{
|
||||||
/***** WhatToSearch is stored in session,
|
/***** WhatToSearch is stored in session,
|
||||||
but in login it is got from user's last data *****/
|
but in login it is got from user's last data *****/
|
||||||
|
@ -6887,9 +6696,6 @@ void Usr_SeeStudents (void)
|
||||||
/* Put link to go to admin several users */
|
/* Put link to go to admin several users */
|
||||||
Enr_PutLinkToAdminSeveralUsrs (Rol_STUDENT);
|
Enr_PutLinkToAdminSeveralUsrs (Rol_STUDENT);
|
||||||
|
|
||||||
/* Put link to list official students */
|
|
||||||
Usr_PutLinkToListOfficialStudents ();
|
|
||||||
|
|
||||||
/* Put link to edit record fields */
|
/* Put link to edit record fields */
|
||||||
Rec_PutLinkToEditRecordFields ();
|
Rec_PutLinkToEditRecordFields ();
|
||||||
|
|
||||||
|
@ -7257,26 +7063,6 @@ static void Usr_ShowTchsAllDataParams (void)
|
||||||
Usr_PutExtraParamsUsrList (ActLstTchAll);
|
Usr_PutExtraParamsUsrList (ActLstTchAll);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/******************* Put a link to list official students ********************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Usr_PutLinkToListOfficialStudents (void)
|
|
||||||
{
|
|
||||||
extern const char *Txt_Official_students;
|
|
||||||
bool ExternalUsrsServiceAvailable = (Cfg_EXTERNAL_LOGIN_CLIENT_COMMAND[0] != '\0');
|
|
||||||
|
|
||||||
if (ExternalUsrsServiceAvailable && // There is an external service for authentication and official lists
|
|
||||||
Gbl.Imported.ExternalUsrId[0] && // I was authenticated from external service...
|
|
||||||
Gbl.Imported.ExternalSesId[0] &&
|
|
||||||
Gbl.Imported.ExternalRole == Rol_TEACHER) // ...as a teacher
|
|
||||||
/***** Link to list official students *****/
|
|
||||||
Lay_PutContextualLink (ActGetExtLstStd,NULL,
|
|
||||||
"list64x64.gif",
|
|
||||||
Txt_Official_students,Txt_Official_students,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************* Draw class photo with guests ready to be printed **************/
|
/************* Draw class photo with guests ready to be printed **************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -69,7 +69,7 @@ cp -f /home/acanas/swad/swad/soap/swad.wsdl /var/www/html/ws/
|
||||||
The makefile must include -lgsoap, and compile soapC.c and soapServer.c files generated by soapcpp2 in step 2
|
The makefile must include -lgsoap, and compile soapC.c and soapServer.c files generated by soapcpp2 in step 2
|
||||||
Example of Makefile:
|
Example of Makefile:
|
||||||
---------------------
|
---------------------
|
||||||
OBJS = swad.o swad_action.o swad_assignment.o swad_file_browser.o swad_chat.o swad_connected.o swad_course.o swad_cryptography.o swad_centre.o swad_date.o swad_database.o swad_degree.o swad_department.o swad_exam.o swad_file.o swad_forum.o swad_group.o swad_holiday.o swad_import.o swad_institution.o swad_layout.o swad_link.o swad_changelog.o swad_message.o swad_notice.o swad_notification.o swad_pagination.o swad_parameter.o swad_place.o swad_plugin.o swad_preference.o swad_record.o swad_session.o swad_statistic.o swad_string.o swad_syllabus.o swad_theme.o swad_test.o swad_timetable.o swad_text.o swad_user.o swad_web_service.o sha2.o
|
OBJS = list of swad object files
|
||||||
SOAPOBJS = soap/soapC.o soap/soapServer.o
|
SOAPOBJS = soap/soapC.o soap/soapServer.o
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue