Version 22.52: Oct 28, 2022 Code refactoring in plugins.

This commit is contained in:
acanas 2022-10-28 00:43:48 +02:00
parent a63d68f746
commit 063d4d0490
13 changed files with 85 additions and 86 deletions

View File

@ -605,7 +605,7 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate
TODO: Attach pdf files in multimedia.
*/
#define Log_PLATFORM_VERSION "SWAD 22.51 (2022-10-27)"
#define Log_PLATFORM_VERSION "SWAD 22.52 (2022-10-28)"
#define CSS_FILE "swad22.49.4.css"
#define JS_FILE "swad22.49.js"
/*
@ -616,6 +616,7 @@ Que al subir un fichero por defecto est
Al subir cosas para los grupos, en documentos, resltar más los grupos porque no son conscientes...
Exportar listas en CSV.
Version 22.52: Oct 28, 2022 Code refactoring in plugins. (333589 lines)
Version 22.51: Oct 27, 2022 New module swad_process. (333586 lines)
Version 22.50.8: Oct 20, 2022 Code refactoring in files. (333498 lines)
Version 22.50.7: Oct 20, 2022 Code refactoring in files. (333496 lines)

View File

@ -36,6 +36,12 @@
#define Cns_MAX_CHARS_WWW (256 - 1) // 255: max. number of chars of a URL
#define Cns_MAX_BYTES_WWW Cns_MAX_CHARS_WWW // 255
#define Cns_MAX_CHARS_IP (3 + 1 + 3 + 1 + 3 + 1 + 3) // 15: max. number of chars of an IP address
// Example: 255.255.255.255
// 3+1+3+1+3+1+3
// 123456789012345
#define Cns_MAX_BYTES_IP Cns_MAX_CHARS_IP // 15
#define Cns_MAX_CHARS_DATE (16 - 1) // 15
#define Cns_MAX_BYTES_DATE ((Cns_MAX_CHARS_DATE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 255

View File

@ -135,7 +135,7 @@ void Cry_EncryptSHA512Base64 (const char *PlainText,
void Cry_CreateUniqueNameEncrypted (char *UniqueNameEncrypted)
{
static unsigned NumCall = 0; // When this function is called several times in the same execution of the program, each time a new name is created
char UniqueNamePlain[Par_MAX_BYTES_IP +
char UniqueNamePlain[Cns_MAX_BYTES_IP +
Cns_MAX_DECIMAL_DIGITS_LONG +
Cns_MAX_DECIMAL_DIGITS_LONG +
Cns_MAX_DECIMAL_DIGITS_UINT + 1];

View File

@ -1199,7 +1199,7 @@ mysql> DESCRIBE exa_log;
"QstInd INT NOT NULL DEFAULT -1,"
"CanAnswer ENUM('N','Y') NOT NULL DEFAULT 'N',"
"ClickTime DATETIME NOT NULL,"
"IP CHAR(15) NOT NULL," // Par_MAX_BYTES_IP
"IP CHAR(15) NOT NULL," // Cns_MAX_BYTES_IP
"UNIQUE INDEX(LogCod),"
"UNIQUE INDEX(PrnCod,LogCod),"
"INDEX(ClickTime))");
@ -1445,7 +1445,7 @@ mysql> DESCRIBE fir_banned;
3 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS fir_banned ("
"IP CHAR(15) NOT NULL," // Par_MAX_BYTES_IP
"IP CHAR(15) NOT NULL," // Cns_MAX_BYTES_IP
"BanTime DATETIME NOT NULL,"
"UnbanTime DATETIME NOT NULL,"
"INDEX(IP,UnbanTime),"
@ -1465,7 +1465,7 @@ mysql> DESCRIBE fir_log;
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS fir_log ("
"ClickTime DATETIME NOT NULL,"
"IP CHAR(15) NOT NULL," // Par_MAX_BYTES_IP
"IP CHAR(15) NOT NULL," // Cns_MAX_BYTES_IP
"INDEX(ClickTime),"
"INDEX(IP))");
@ -2072,7 +2072,7 @@ mysql> DESCRIBE log_recent;
"ClickTime DATETIME NOT NULL,"
"TimeToGenerate INT NOT NULL,"
"TimeToSend INT NOT NULL,"
"IP CHAR(15) NOT NULL," // Par_MAX_BYTES_IP
"IP CHAR(15) NOT NULL," // Cns_MAX_BYTES_IP
"UNIQUE INDEX(LogCod),"
"INDEX(ActCod),"
"INDEX(CtyCod),"
@ -2463,7 +2463,7 @@ mysql> DESCRIBE plg_plugins;
"Logo VARCHAR(31) NOT NULL," // Plg_MAX_BYTES_PLUGIN_LOGO
"AppKey VARCHAR(31) NOT NULL," // Plg_MAX_BYTES_PLUGIN_APP_KEY
"URL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
"IP CHAR(15) NOT NULL," // Par_MAX_BYTES_IP
"IP CHAR(15) NOT NULL," // Cns_MAX_BYTES_IP
"UNIQUE INDEX(PlgCod))");
/***** Table prg_clipboards *****/
@ -2880,7 +2880,7 @@ mysql> DESCRIBE set_ip_settings;
10 rows in set (0,01 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS set_ip_settings ("
"IP CHAR(15) NOT NULL," // Par_MAX_BYTES_IP
"IP CHAR(15) NOT NULL," // Cns_MAX_BYTES_IP
"UsrCod INT NOT NULL DEFAULT -1,"
"LastChange DATETIME NOT NULL,"
"FirstDayOfWeek TINYINT NOT NULL DEFAULT 0,"

View File

@ -235,7 +235,7 @@ void ExaLog_ShowExamLog (const struct ExaPrn_Print *Print)
int QstInd;
bool UsrCouldAnswer;
time_t ClickTimeUTC;
char IP[Par_MAX_BYTES_IP + 1];
char IP[Cns_MAX_BYTES_IP + 1];
char *Id;
size_t Length;
char Anonymized[14 + 1]; // ***…***

View File

@ -326,7 +326,6 @@ void Gbl_Cleanup (void)
Ctr_FreeListCenters ();
Cty_FreeListCountries ();
Lnk_FreeListLinks ();
Plg_FreeListPlugins ();
for (Role = (Rol_Role_t) 0;
Role <= (Rol_Role_t) (Rol_NUM_ROLES - 1);

View File

@ -122,11 +122,6 @@ struct Globals
char Str[Sch_MAX_BYTES_STRING_TO_FIND + 1];
bool LogSearch;
} Search;
struct
{
unsigned Num; // Number of plugins
struct Plg_Plugin *Lst; // List of plugins
} Plugins;
struct
{
bool IsWebService; // Must generate HTML output (IsWebService==false) or SOAP-XML output (IsWebService==true)?

View File

@ -83,7 +83,7 @@ static struct
size_t LengthWithoutCRLF;
size_t LengthWithCRLF;
} Boundary;
char IP[Par_MAX_BYTES_IP + 1];
char IP[Cns_MAX_BYTES_IP + 1];
} Par_Params =
{
.ContentReceivedByCGI = Act_CONT_NORM,

View File

@ -63,12 +63,6 @@ typedef enum
Par_PARAM_MULTIPLE,
} Par_ParamType_t; // Parameter is present only one time / multiple times
#define Par_MAX_CHARS_IP (3 + 1 + 3 + 1 + 3 + 1 + 3) // 15: max. number of chars of an IP address
// Example: 255.255.255.255
// 3+1+3+1+3+1+3
// 123456789012345
#define Par_MAX_BYTES_IP Par_MAX_CHARS_IP // 15
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/

View File

@ -58,10 +58,20 @@ TODO: Check if web service is called from an authorized IP.
extern struct Globals Gbl;
/*****************************************************************************/
/***************************** Private variables *****************************/
/******************************* Private types *******************************/
/*****************************************************************************/
static struct Plg_Plugin *Plg_EditingPlg = NULL; // Static variable to keep the plugin being edited
struct Plg_Plugins
{
unsigned Num; // Number of plugins
struct Plg_Plugin *Lst; // List of plugins
};
/*****************************************************************************/
/************************* Private global variables **************************/
/*****************************************************************************/
static struct Plg_Plugin *Plg_EditingPlg; // Plugin being edited
/*****************************************************************************/
/***************************** Private prototypes ****************************/
@ -69,9 +79,10 @@ static struct Plg_Plugin *Plg_EditingPlg = NULL; // Static variable to keep the
static void Plg_PutIconToEditPlugins (__attribute__((unused)) void *Args);
static void Plg_EditPluginsInternal (void);
static void Plg_ListPluginsForEdition (void);
static void Plg_FreeListPlugins (struct Plg_Plugins *Plugins);
static void Plg_ListPluginsForEdition (struct Plg_Plugins *Plugins);
static void Plg_PutParamPlgCod (void *PlgCod);
static void Plg_GetListPlugins (void);
static void Plg_GetListPlugins (struct Plg_Plugins *Plugins);
static void Plg_PutFormToCreatePlugin (void);
static void Plg_PutHeadPlugins (void);
@ -91,6 +102,7 @@ void Plg_ListPlugins (void)
struct Plg_Plugin *Plg;
char URL[Cns_MAX_BYTES_WWW + Cns_BYTES_SESSION_ID + 1];
char *Icon;
struct Plg_Plugins Plugins;
if (Gbl.Usrs.Me.Role.Logged != Rol_SYS_ADM)
{
@ -99,7 +111,7 @@ void Plg_ListPlugins (void)
}
/***** Get list of plugins *****/
Plg_GetListPlugins ();
Plg_GetListPlugins (&Plugins);
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_Plugins,
@ -116,10 +128,10 @@ void Plg_ListPlugins (void)
/***** Write all plugins *****/
for (NumPlg = 0;
NumPlg < Gbl.Plugins.Num;
NumPlg < Plugins.Num;
NumPlg++)
{
Plg = &(Gbl.Plugins.Lst[NumPlg]);
Plg = &Plugins.Lst[NumPlg];
snprintf (URL,sizeof (URL),"%s%s",Plg->URL,Gbl.Session.Id);
@ -132,7 +144,7 @@ void Plg_ListPlugins (void)
HTM_A_Begin ("href=\"%s\" title=\"%s\" target=\"_blank\""
" class=\"DAT_%s\"",
URL,Plg->Name,The_GetSuffix ());
if (asprintf (&Icon,"%s24x24.gif",Gbl.Plugins.Lst[NumPlg].Logo) < 0)
if (asprintf (&Icon,"%s24x24.gif",Plugins.Lst[NumPlg].Logo) < 0)
Err_NotEnoughMemoryExit ();
HTM_IMG (Cfg_URL_ICON_PLUGINS_PUBLIC,Icon,Plg->Name,
"class=\"ICO40x40\"");
@ -155,7 +167,7 @@ void Plg_ListPlugins (void)
Box_BoxTableEnd ();
/***** Free list of plugins *****/
Plg_FreeListPlugins ();
Plg_FreeListPlugins (&Plugins);
}
/*****************************************************************************/
@ -187,9 +199,10 @@ void Plg_EditPlugins (void)
static void Plg_EditPluginsInternal (void)
{
extern const char *Txt_Plugins;
struct Plg_Plugins Plugins;
/***** Get list of plugins *****/
Plg_GetListPlugins ();
Plg_GetListPlugins (&Plugins);
/***** Begin box *****/
Box_BoxBegin (NULL,Txt_Plugins,
@ -200,21 +213,21 @@ static void Plg_EditPluginsInternal (void)
Plg_PutFormToCreatePlugin ();
/***** List current plugins *****/
if (Gbl.Plugins.Num)
Plg_ListPluginsForEdition ();
if (Plugins.Num)
Plg_ListPluginsForEdition (&Plugins);
/***** End box *****/
Box_BoxEnd ();
/***** Free list of plugins *****/
Plg_FreeListPlugins ();
Plg_FreeListPlugins (&Plugins);
}
/*****************************************************************************/
/************************* Get list of current plugins ***********************/
/*****************************************************************************/
static void Plg_GetListPlugins (void)
static void Plg_GetListPlugins (struct Plg_Plugins *Plugins)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
@ -222,19 +235,19 @@ static void Plg_GetListPlugins (void)
struct Plg_Plugin *Plg;
/***** Get plugins from database *****/
if ((Gbl.Plugins.Num = Plg_DB_GetListPlugins (&mysql_res))) // Plugins found...
if ((Plugins->Num = Plg_DB_GetListPlugins (&mysql_res))) // Plugins found...
{
/***** Create list with plugins *****/
if ((Gbl.Plugins.Lst = calloc ((size_t) Gbl.Plugins.Num,
sizeof (*Gbl.Plugins.Lst))) == NULL)
if ((Plugins->Lst = calloc ((size_t) Plugins->Num,
sizeof (*Plugins->Lst))) == NULL)
Err_NotEnoughMemoryExit ();
/***** Get the plugins *****/
for (NumPlg = 0;
NumPlg < Gbl.Plugins.Num;
NumPlg < Plugins->Num;
NumPlg++)
{
Plg = &(Gbl.Plugins.Lst[NumPlg]);
Plg = &Plugins->Lst[NumPlg];
/* Get next plugin */
row = mysql_fetch_row (mysql_res);
@ -253,6 +266,8 @@ static void Plg_GetListPlugins (void)
Str_Copy (Plg->IP ,row[6],sizeof (Plg->IP ) - 1);
}
}
else
Plugins->Lst = NULL;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@ -310,22 +325,23 @@ bool Plg_GetDataOfPluginByCod (struct Plg_Plugin *Plg)
/*************************** Free list of plugins ****************************/
/*****************************************************************************/
void Plg_FreeListPlugins (void)
static void Plg_FreeListPlugins (struct Plg_Plugins *Plugins)
{
if (Gbl.Plugins.Lst)
{
/***** Free memory used by the list of plugins *****/
free (Gbl.Plugins.Lst);
Gbl.Plugins.Lst = NULL;
Gbl.Plugins.Num = 0;
}
if (Plugins->Num)
if (Plugins->Lst)
{
/***** Free memory used by the list of plugins *****/
free (Plugins->Lst);
Plugins->Lst = NULL;
Plugins->Num = 0;
}
}
/*****************************************************************************/
/****************************** List all plugins *****************************/
/*****************************************************************************/
static void Plg_ListPluginsForEdition (void)
static void Plg_ListPluginsForEdition (struct Plg_Plugins *Plugins)
{
unsigned NumPlg;
struct Plg_Plugin *Plg;
@ -339,10 +355,10 @@ static void Plg_ListPluginsForEdition (void)
/***** Write all plugins *****/
for (NumPlg = 0;
NumPlg < Gbl.Plugins.Num;
NumPlg < Plugins->Num;
NumPlg++)
{
Plg = &Gbl.Plugins.Lst[NumPlg];
Plg = &Plugins->Lst[NumPlg];
/* Row begin */
HTM_TR_Begin (NULL);
@ -361,9 +377,9 @@ static void Plg_ListPluginsForEdition (void)
/* Plugin logo */
// TODO: Change plugin icons to 32x32
HTM_TD_Begin ("class=\"CM\" style=\"width:45px;\"");
if (asprintf (&Icon,"%s24x24.gif",Gbl.Plugins.Lst[NumPlg].Logo) < 0)
if (asprintf (&Icon,"%s24x24.gif",Plugins->Lst[NumPlg].Logo) < 0)
Err_NotEnoughMemoryExit ();
HTM_IMG (Cfg_URL_ICON_PLUGINS_PUBLIC,Icon,Gbl.Plugins.Lst[NumPlg].Name,
HTM_IMG (Cfg_URL_ICON_PLUGINS_PUBLIC,Icon,Plugins->Lst[NumPlg].Name,
"class=\"ICO40x40\"");
free (Icon);
HTM_TD_End ();
@ -426,7 +442,7 @@ static void Plg_ListPluginsForEdition (void)
HTM_TD_Begin ("class=\"CM\"");
Frm_BeginForm (ActChgPlgIP);
Plg_PutParamPlgCod (&Plg->PlgCod);
HTM_INPUT_TEXT ("IP",Par_MAX_CHARS_IP,Plg->IP,HTM_SUBMIT_ON_CHANGE,
HTM_INPUT_TEXT ("IP",Cns_MAX_CHARS_IP,Plg->IP,HTM_SUBMIT_ON_CHANGE,
"size=\"10\" class=\"INPUT_%s\"",
The_GetSuffix ());
Frm_EndForm ();
@ -626,7 +642,8 @@ void Plg_ChangePlgLogo (void)
Ale_CreateAlertYouCanNotLeaveFieldEmpty ();
/***** Update logo *****/
Str_Copy (Plg_EditingPlg->Logo,NewLogo,sizeof (Plg_EditingPlg->Logo) - 1);
Str_Copy (Plg_EditingPlg->Logo,NewLogo,
sizeof (Plg_EditingPlg->Logo) - 1);
}
/*****************************************************************************/
@ -667,7 +684,8 @@ void Plg_ChangePlgAppKey (void)
Ale_CreateAlertYouCanNotLeaveFieldEmpty ();
/***** Update app key *****/
Str_Copy (Plg_EditingPlg->AppKey,NewAppKey,sizeof (Plg_EditingPlg->AppKey) - 1);
Str_Copy (Plg_EditingPlg->AppKey,NewAppKey,
sizeof (Plg_EditingPlg->AppKey) - 1);
}
/*****************************************************************************/
@ -708,7 +726,8 @@ void Plg_ChangePlgURL (void)
Ale_CreateAlertYouCanNotLeaveFieldEmpty ();
/***** Update URL *****/
Str_Copy (Plg_EditingPlg->URL,NewURL,sizeof (Plg_EditingPlg->URL) - 1);
Str_Copy (Plg_EditingPlg->URL,NewURL,
sizeof (Plg_EditingPlg->URL) - 1);
}
/*****************************************************************************/
@ -718,7 +737,7 @@ void Plg_ChangePlgURL (void)
void Plg_ChangePlgIP (void)
{
extern const char *Txt_The_new_IP_address_is_X;
char NewIP[Par_MAX_BYTES_IP + 1];
char NewIP[Cns_MAX_BYTES_IP + 1];
/***** Plugin constructor *****/
Plg_EditingPluginConstructor ();
@ -729,7 +748,7 @@ void Plg_ChangePlgIP (void)
Err_WrongPluginExit ();
/* Get the new IP for the plugin */
Par_GetParToText ("IP",NewIP,Par_MAX_BYTES_IP);
Par_GetParToText ("IP",NewIP,Cns_MAX_BYTES_IP);
/***** Get plugin data from the database *****/
Plg_GetDataOfPluginByCod (Plg_EditingPlg);
@ -851,7 +870,7 @@ static void Plg_PutFormToCreatePlugin (void)
/***** Plugin IP address *****/
HTM_TD_Begin ("class=\"CM\"");
HTM_INPUT_TEXT ("IP",Par_MAX_CHARS_IP,Plg_EditingPlg->IP,
HTM_INPUT_TEXT ("IP",Cns_MAX_CHARS_IP,Plg_EditingPlg->IP,
HTM_DONT_SUBMIT_ON_CHANGE,
"size=\"10\" class=\"INPUT_%s\""
" required=\"required\"",
@ -910,23 +929,13 @@ void Plg_ReceiveFormNewPlg (void)
Plg_EditingPluginConstructor ();
/***** Get parameters from form *****/
/* Get plugin name */
Par_GetParToText ("Name",Plg_EditingPlg->Name,Plg_MAX_BYTES_PLUGIN_NAME);
/* Get plugin description */
/* Get plugin name, description, logo, application key, URL, IP address */
Par_GetParToText ("Name" ,Plg_EditingPlg->Name ,Plg_MAX_BYTES_PLUGIN_NAME);
Par_GetParToText ("Description",Plg_EditingPlg->Description,Plg_MAX_BYTES_PLUGIN_DESCRIPTION);
/* Get plugin logo */
Par_GetParToText ("Logo",Plg_EditingPlg->Logo,Plg_MAX_BYTES_PLUGIN_LOGO);
/* Get plugin application key */
Par_GetParToText ("AppKey",Plg_EditingPlg->AppKey,Plg_MAX_BYTES_PLUGIN_APP_KEY);
/* Get plugin URL */
Par_GetParToText ("URL",Plg_EditingPlg->URL,Cns_MAX_BYTES_WWW);
/* Get plugin IP address */
Par_GetParToText ("IP",Plg_EditingPlg->IP,Par_MAX_BYTES_IP);
Par_GetParToText ("Logo" ,Plg_EditingPlg->Logo ,Plg_MAX_BYTES_PLUGIN_LOGO);
Par_GetParToText ("AppKey" ,Plg_EditingPlg->AppKey ,Plg_MAX_BYTES_PLUGIN_APP_KEY);
Par_GetParToText ("URL" ,Plg_EditingPlg->URL ,Cns_MAX_BYTES_WWW);
Par_GetParToText ("IP" ,Plg_EditingPlg->IP ,Cns_MAX_BYTES_IP);
if (Plg_EditingPlg->Name[0]) // If there's a plugin name
{
@ -963,12 +972,8 @@ void Plg_ReceiveFormNewPlg (void)
static void Plg_EditingPluginConstructor (void)
{
/***** Pointer must be NULL *****/
if (Plg_EditingPlg != NULL)
Err_WrongPluginExit ();
/***** Allocate memory for plugin *****/
if ((Plg_EditingPlg = malloc (sizeof (*Plg_EditingPlg))) == NULL)
if ((Plg_EditingPlg = malloc (sizeof (struct Plg_Plugin))) == NULL)
Err_NotEnoughMemoryExit ();
/***** Reset plugin *****/

View File

@ -57,7 +57,7 @@ struct Plg_Plugin
char Logo[Plg_MAX_BYTES_PLUGIN_LOGO + 1];
char AppKey[Plg_MAX_BYTES_PLUGIN_APP_KEY + 1];
char URL[Cns_MAX_BYTES_WWW + 1];
char IP[Par_MAX_BYTES_IP + 1];
char IP[Cns_MAX_BYTES_IP + 1];
};
/*****************************************************************************/
@ -67,7 +67,6 @@ struct Plg_Plugin
void Plg_ListPlugins (void);
void Plg_EditPlugins (void);
bool Plg_GetDataOfPluginByCod (struct Plg_Plugin *Plg);
void Plg_FreeListPlugins (void);
long Plg_GetParamPlgCod (void);
void Plg_RemovePlugin (void);
void Plg_RenamePlugin (void);

View File

@ -127,7 +127,7 @@ void Plg_DB_ChangeURL (long PlgCod,
/*****************************************************************************/
void Plg_DB_ChangeIP (long PlgCod,
const char NewIP[Par_MAX_BYTES_IP + 1])
const char NewIP[Cns_MAX_BYTES_IP + 1])
{
DB_QueryUPDATE ("can not update the IP address of a plugin",
"UPDATE plg_plugins"

View File

@ -47,7 +47,7 @@ void Plg_DB_ChangeAppKey (long PlgCod,
void Plg_DB_ChangeURL (long PlgCod,
const char NewURL[Cns_MAX_BYTES_WWW + 1]);
void Plg_DB_ChangeIP (long PlgCod,
const char NewIP[Par_MAX_BYTES_IP + 1]);
const char NewIP[Cns_MAX_BYTES_IP + 1]);
unsigned Plg_DB_GetListPlugins (MYSQL_RES **mysql_res);
unsigned Plg_DB_GetDataOfPluginByCod (MYSQL_RES **mysql_res,long PlgCod);