mirror of https://github.com/acanas/swad-core.git
Version 21.20.1: Sep 30, 2021 Code refactoring related to nicknames.
This commit is contained in:
parent
bed2db97f9
commit
265f284802
12
swad_API.c
12
swad_API.c
|
@ -231,7 +231,7 @@ static int API_GetCurrentDegCodFromCurrentCrsCod (void);
|
||||||
static bool API_GetSomeUsrDataFromUsrCod (struct UsrData *UsrDat,long CrsCod);
|
static bool API_GetSomeUsrDataFromUsrCod (struct UsrData *UsrDat,long CrsCod);
|
||||||
|
|
||||||
static int API_CheckParamsNewAccount (char *NewNickWithArr, // Input
|
static int API_CheckParamsNewAccount (char *NewNickWithArr, // Input
|
||||||
char NewNickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1], // Output
|
char NewNickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1], // Output
|
||||||
char *NewEmail, // Input-output
|
char *NewEmail, // Input-output
|
||||||
char *NewPlainPassword, // Input
|
char *NewPlainPassword, // Input
|
||||||
char *NewEncryptedPassword); // Output
|
char *NewEncryptedPassword); // Output
|
||||||
|
@ -679,7 +679,7 @@ int swad__createAccount (struct soap *soap,
|
||||||
char *userNickname,char *userEmail,char *userPassword,char *appKey, // input
|
char *userNickname,char *userEmail,char *userPassword,char *appKey, // input
|
||||||
struct swad__createAccountOutput *createAccountOut) // output
|
struct swad__createAccountOutput *createAccountOut) // output
|
||||||
{
|
{
|
||||||
char NewNickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1];
|
char NewNickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
char NewEncryptedPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1];
|
char NewEncryptedPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1];
|
||||||
int Result;
|
int Result;
|
||||||
int ReturnCode;
|
int ReturnCode;
|
||||||
|
@ -752,14 +752,14 @@ int swad__createAccount (struct soap *soap,
|
||||||
// Return false on error
|
// Return false on error
|
||||||
//char *userNickname,char *userEmail,char *userID,char *userPassword
|
//char *userNickname,char *userEmail,char *userID,char *userPassword
|
||||||
static int API_CheckParamsNewAccount (char *NewNickWithArr, // Input
|
static int API_CheckParamsNewAccount (char *NewNickWithArr, // Input
|
||||||
char NewNickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1], // Output
|
char NewNickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1], // Output
|
||||||
char *NewEmail, // Input-output
|
char *NewEmail, // Input-output
|
||||||
char *NewPlainPassword, // Input
|
char *NewPlainPassword, // Input
|
||||||
char *NewEncryptedPassword) // Output
|
char *NewEncryptedPassword) // Output
|
||||||
{
|
{
|
||||||
/***** Step 1/3: Check new nickname *****/
|
/***** Step 1/3: Check new nickname *****/
|
||||||
/* Make a copy without possible starting arrobas */
|
/* Make a copy without possible starting arrobas */
|
||||||
Str_Copy (NewNickWithoutArr,NewNickWithArr,Cns_MAX_BYTES_USR_LOGIN);
|
Str_Copy (NewNickWithoutArr,NewNickWithArr,Nck_MAX_BYTES_NICK_WITHOUT_ARROBA);
|
||||||
if (Nck_CheckIfNickWithArrIsValid (NewNickWithArr)) // If new nickname is valid
|
if (Nck_CheckIfNickWithArrIsValid (NewNickWithArr)) // If new nickname is valid
|
||||||
{
|
{
|
||||||
/***** Remove arrobas at the beginning *****/
|
/***** Remove arrobas at the beginning *****/
|
||||||
|
@ -3569,7 +3569,7 @@ int swad__sendMessage (struct soap *soap,
|
||||||
{
|
{
|
||||||
int ReturnCode;
|
int ReturnCode;
|
||||||
long ReplyUsrCod = -1L;
|
long ReplyUsrCod = -1L;
|
||||||
char Nickname[Cns_MAX_BYTES_USR_LOGIN + 1];
|
char Nickname[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
char *Query = NULL;
|
char *Query = NULL;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
|
@ -3658,7 +3658,7 @@ int swad__sendMessage (struct soap *soap,
|
||||||
while (*Ptr)
|
while (*Ptr)
|
||||||
{
|
{
|
||||||
/* Find next string in text until comma (leading and trailing spaces are removed) */
|
/* Find next string in text until comma (leading and trailing spaces are removed) */
|
||||||
Str_GetNextStringUntilComma (&Ptr,Nickname,Cns_MAX_BYTES_USR_LOGIN);
|
Str_GetNextStringUntilComma (&Ptr,Nickname,sizeof (Nickname) - 1);
|
||||||
|
|
||||||
/* Check if string is a valid nickname */
|
/* Check if string is a valid nickname */
|
||||||
if (Nck_CheckIfNickWithArrIsValid (Nickname)) // String is a nickname?
|
if (Nck_CheckIfNickWithArrIsValid (Nickname)) // String is a nickname?
|
||||||
|
|
|
@ -94,9 +94,9 @@ extern struct Globals Gbl;
|
||||||
|
|
||||||
static void Acc_ShowFormCheckIfIHaveAccount (const char *Title);
|
static void Acc_ShowFormCheckIfIHaveAccount (const char *Title);
|
||||||
static void Acc_WriteRowEmptyAccount (unsigned NumUsr,const char *ID,struct UsrData *UsrDat);
|
static void Acc_WriteRowEmptyAccount (unsigned NumUsr,const char *ID,struct UsrData *UsrDat);
|
||||||
static void Acc_ShowFormRequestNewAccountWithParams (const char NewNickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1],
|
static void Acc_ShowFormRequestNewAccountWithParams (const char NewNickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1],
|
||||||
const char *NewEmail);
|
const char *NewEmail);
|
||||||
static bool Acc_GetParamsNewAccount (char NewNickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1],
|
static bool Acc_GetParamsNewAccount (char NewNickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1],
|
||||||
char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1],
|
char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1],
|
||||||
char *NewEncryptedPassword);
|
char *NewEncryptedPassword);
|
||||||
static void Acc_CreateNewEncryptedUsrCod (struct UsrData *UsrDat);
|
static void Acc_CreateNewEncryptedUsrCod (struct UsrData *UsrDat);
|
||||||
|
@ -361,7 +361,7 @@ void Acc_ShowFormCreateMyAccount (void)
|
||||||
/************ Show form to create a new account using parameters *************/
|
/************ Show form to create a new account using parameters *************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Acc_ShowFormRequestNewAccountWithParams (const char NewNickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1],
|
static void Acc_ShowFormRequestNewAccountWithParams (const char NewNickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1],
|
||||||
const char *NewEmail)
|
const char *NewEmail)
|
||||||
{
|
{
|
||||||
extern const char *Hlp_PROFILE_SignUp;
|
extern const char *Hlp_PROFILE_SignUp;
|
||||||
|
@ -371,7 +371,7 @@ static void Acc_ShowFormRequestNewAccountWithParams (const char NewNickWithoutAr
|
||||||
extern const char *Txt_HELP_nickname;
|
extern const char *Txt_HELP_nickname;
|
||||||
extern const char *Txt_HELP_email;
|
extern const char *Txt_HELP_email;
|
||||||
extern const char *Txt_Email;
|
extern const char *Txt_Email;
|
||||||
char NewNickWithArr[Cns_MAX_BYTES_USR_LOGIN + 1];
|
char NewNickWithArr[1 + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
|
|
||||||
/***** Begin form to enter some data of the new user *****/
|
/***** Begin form to enter some data of the new user *****/
|
||||||
Frm_BeginForm (ActCreUsrAcc);
|
Frm_BeginForm (ActCreUsrAcc);
|
||||||
|
@ -596,7 +596,7 @@ static void Acc_PutParamsToRemoveMyAccount (void *EncryptedUsrCod)
|
||||||
|
|
||||||
bool Acc_CreateMyNewAccountAndLogIn (void)
|
bool Acc_CreateMyNewAccountAndLogIn (void)
|
||||||
{
|
{
|
||||||
char NewNickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1];
|
char NewNickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1];
|
char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1];
|
||||||
char NewEncryptedPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1];
|
char NewEncryptedPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1];
|
||||||
|
|
||||||
|
@ -644,7 +644,7 @@ bool Acc_CreateMyNewAccountAndLogIn (void)
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
// Return false on error
|
// Return false on error
|
||||||
|
|
||||||
static bool Acc_GetParamsNewAccount (char NewNickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1],
|
static bool Acc_GetParamsNewAccount (char NewNickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1],
|
||||||
char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1],
|
char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1],
|
||||||
char NewEncryptedPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1])
|
char NewEncryptedPassword[Pwd_BYTES_ENCRYPTED_PASSWORD + 1])
|
||||||
{
|
{
|
||||||
|
@ -652,15 +652,15 @@ static bool Acc_GetParamsNewAccount (char NewNickWithoutArr[Cns_MAX_BYTES_USR_LO
|
||||||
extern const char *Txt_The_nickname_entered_X_is_not_valid_;
|
extern const char *Txt_The_nickname_entered_X_is_not_valid_;
|
||||||
extern const char *Txt_The_email_address_X_had_been_registered_by_another_user;
|
extern const char *Txt_The_email_address_X_had_been_registered_by_another_user;
|
||||||
extern const char *Txt_The_email_address_entered_X_is_not_valid;
|
extern const char *Txt_The_email_address_entered_X_is_not_valid;
|
||||||
char NewNickWithArr[1 + Cns_MAX_BYTES_USR_LOGIN + 1];
|
char NewNickWithArr[1 + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
char NewPlainPassword[Pwd_MAX_BYTES_PLAIN_PASSWORD + 1];
|
char NewPlainPassword[Pwd_MAX_BYTES_PLAIN_PASSWORD + 1];
|
||||||
bool Error = false;
|
bool Error = false;
|
||||||
|
|
||||||
/***** Step 1/3: Get new nickname from form *****/
|
/***** Step 1/3: Get new nickname from form *****/
|
||||||
Par_GetParToText ("NewNick",NewNickWithArr,Cns_MAX_BYTES_USR_LOGIN);
|
Par_GetParToText ("NewNick",NewNickWithArr,sizeof (NewNickWithArr) - 1);
|
||||||
|
|
||||||
/* Remove arrobas at the beginning */
|
/* Remove arrobas at the beginning */
|
||||||
Str_Copy (NewNickWithoutArr,NewNickWithArr,Cns_MAX_BYTES_USR_LOGIN);
|
Str_Copy (NewNickWithoutArr,NewNickWithArr,sizeof (NewNickWithArr) - 1);
|
||||||
Str_RemoveLeadingArrobas (NewNickWithoutArr);
|
Str_RemoveLeadingArrobas (NewNickWithoutArr);
|
||||||
|
|
||||||
/* Create a new version of the nickname with arroba */
|
/* Create a new version of the nickname with arroba */
|
||||||
|
|
|
@ -80,7 +80,7 @@ unsigned Acc_DB_GetUsrsWithID (MYSQL_RES **mysql_res,
|
||||||
/****** Check if a nickname matches any of the nicknames of other users ******/
|
/****** Check if a nickname matches any of the nicknames of other users ******/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
bool Acc_DB_CheckIfNicknameAlreadyExists (const char NewNickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1])
|
bool Acc_DB_CheckIfNicknameAlreadyExists (const char NewNickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1])
|
||||||
{
|
{
|
||||||
return (DB_QueryCOUNT ("can not check if nickname already existed",
|
return (DB_QueryCOUNT ("can not check if nickname already existed",
|
||||||
"SELECT COUNT(*)"
|
"SELECT COUNT(*)"
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
unsigned Acc_DB_GetUsrsWithID (MYSQL_RES **mysql_res,
|
unsigned Acc_DB_GetUsrsWithID (MYSQL_RES **mysql_res,
|
||||||
const char ID[ID_MAX_BYTES_USR_ID + 1]);
|
const char ID[ID_MAX_BYTES_USR_ID + 1]);
|
||||||
|
|
||||||
bool Acc_DB_CheckIfNicknameAlreadyExists (const char NewNickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1]);
|
bool Acc_DB_CheckIfNicknameAlreadyExists (const char NewNickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1]);
|
||||||
bool Acc_DB_CheckIfEmailAlreadyExists (const char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]);
|
bool Acc_DB_CheckIfEmailAlreadyExists (const char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]);
|
||||||
|
|
||||||
long Acc_DB_CreateNewUsr (const struct UsrData *UsrDat);
|
long Acc_DB_CreateNewUsr (const struct UsrData *UsrDat);
|
||||||
|
|
|
@ -156,7 +156,7 @@ void Agd_PutFormLogInToShowUsrAgenda (void)
|
||||||
|
|
||||||
void Agd_PutParamAgd (void)
|
void Agd_PutParamAgd (void)
|
||||||
{
|
{
|
||||||
char Nickname[1 + Cns_MAX_BYTES_USR_LOGIN + 1];
|
char Nickname[1 + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
|
|
||||||
snprintf (Nickname,sizeof (Nickname),"@%s",Gbl.Usrs.Other.UsrDat.Nickname);
|
snprintf (Nickname,sizeof (Nickname),"@%s",Gbl.Usrs.Other.UsrDat.Nickname);
|
||||||
Par_PutHiddenParamString (NULL,"agd",Nickname);
|
Par_PutHiddenParamString (NULL,"agd",Nickname);
|
||||||
|
@ -710,7 +710,7 @@ static void Agd_PutIconToViewEditMyFullAgenda (void *EncryptedUsrCod)
|
||||||
|
|
||||||
static void Agd_PutIconToShowQR (void)
|
static void Agd_PutIconToShowQR (void)
|
||||||
{
|
{
|
||||||
char URL[Cns_MAX_BYTES_WWW + Cns_MAX_BYTES_USR_LOGIN + 1];
|
char URL[Cns_MAX_BYTES_WWW + 1];
|
||||||
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
||||||
|
|
||||||
snprintf (URL,sizeof (URL),"%s/%s?agd=@%s",
|
snprintf (URL,sizeof (URL),"%s/%s?agd=@%s",
|
||||||
|
|
|
@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
|
||||||
|
|
||||||
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
|
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
|
||||||
*/
|
*/
|
||||||
#define Log_PLATFORM_VERSION "SWAD 21.20 (2021-09-30)"
|
#define Log_PLATFORM_VERSION "SWAD 21.20.1 (2021-09-30)"
|
||||||
#define CSS_FILE "swad20.45.css"
|
#define CSS_FILE "swad20.45.css"
|
||||||
#define JS_FILE "swad20.69.1.js"
|
#define JS_FILE "swad20.69.1.js"
|
||||||
/*
|
/*
|
||||||
TODO: Rename CENTRE to CENTER in help wiki.
|
TODO: Rename CENTRE to CENTER in help wiki.
|
||||||
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
|
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
|
||||||
|
|
||||||
|
Version 21.20.1: Sep 30, 2021 Code refactoring related to nicknames. (317756 lines)
|
||||||
Version 21.20: Sep 30, 2021 New module swad_nickname_database for database queries related to nicknames. (317751 lines)
|
Version 21.20: Sep 30, 2021 New module swad_nickname_database for database queries related to nicknames. (317751 lines)
|
||||||
Version 21.19: Sep 29, 2021 New module swad_network_database for database queries related to webs/social networks. (317644 lines)
|
Version 21.19: Sep 29, 2021 New module swad_network_database for database queries related to webs/social networks. (317644 lines)
|
||||||
Version 21.18: Sep 29, 2021 New module swad_MFU_database for database queries related to most frequently used actions. (317529 lines)
|
Version 21.18: Sep 29, 2021 New module swad_MFU_database for database queries related to most frequently used actions. (317529 lines)
|
||||||
|
|
|
@ -1102,7 +1102,7 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role)
|
||||||
|
|
||||||
/* Find next string in text */
|
/* Find next string in text */
|
||||||
Str_GetNextStringUntilSeparator (&Ptr,UsrDat.UsrIDNickOrEmail,
|
Str_GetNextStringUntilSeparator (&Ptr,UsrDat.UsrIDNickOrEmail,
|
||||||
Cns_MAX_BYTES_USR_LOGIN);
|
sizeof (UsrDat.UsrIDNickOrEmail) - 1);
|
||||||
|
|
||||||
/* Reset default list of users' codes */
|
/* Reset default list of users' codes */
|
||||||
ListUsrCods.NumUsrs = 0;
|
ListUsrCods.NumUsrs = 0;
|
||||||
|
@ -1230,7 +1230,7 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role)
|
||||||
|
|
||||||
/* Find next string in text */
|
/* Find next string in text */
|
||||||
Str_GetNextStringUntilSeparator (&Ptr,UsrDat.UsrIDNickOrEmail,
|
Str_GetNextStringUntilSeparator (&Ptr,UsrDat.UsrIDNickOrEmail,
|
||||||
Cns_MAX_BYTES_USR_LOGIN);
|
sizeof (UsrDat.UsrIDNickOrEmail) - 1);
|
||||||
|
|
||||||
/* Reset default list of users' codes */
|
/* Reset default list of users' codes */
|
||||||
ListUsrCods.NumUsrs = 0;
|
ListUsrCods.NumUsrs = 0;
|
||||||
|
|
|
@ -674,7 +674,7 @@ static void Msg_WriteFormSubjectAndContentMsgToUsrs (struct Msg_Messages *Messag
|
||||||
|
|
||||||
static void Msg_PutHiddenParamAnotherRecipient (const struct UsrData *UsrDat)
|
static void Msg_PutHiddenParamAnotherRecipient (const struct UsrData *UsrDat)
|
||||||
{
|
{
|
||||||
char NickWithArr[1 + Cns_MAX_BYTES_USR_LOGIN + 1];
|
char NickWithArr[1 + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
|
|
||||||
snprintf (NickWithArr,sizeof (NickWithArr),"@%s",UsrDat->Nickname);
|
snprintf (NickWithArr,sizeof (NickWithArr),"@%s",UsrDat->Nickname);
|
||||||
Par_PutHiddenParamString (NULL,"OtherRecipients",NickWithArr);
|
Par_PutHiddenParamString (NULL,"OtherRecipients",NickWithArr);
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
#define Msg_MAX_CHARS_FILTER_CONTENT (128 - 1) // 127
|
#define Msg_MAX_CHARS_FILTER_CONTENT (128 - 1) // 127
|
||||||
#define Msg_MAX_BYTES_FILTER_CONTENT ((Msg_MAX_CHARS_FILTER_CONTENT + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
|
#define Msg_MAX_BYTES_FILTER_CONTENT ((Msg_MAX_CHARS_FILTER_CONTENT + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
|
||||||
|
|
||||||
|
#define Msg_MAX_BYTES_LIST_OTHER_RECIPIENTS ((Cns_MAX_BYTES_USR_LOGIN + 2) * Cfg_MAX_USRS_IN_LIST)
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************************** Public types *******************************/
|
/******************************** Public types *******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -75,7 +75,7 @@ static void Nck_UpdateUsrNick (struct UsrData *UsrDat);
|
||||||
|
|
||||||
bool Nck_CheckIfNickWithArrIsValid (const char *NickWithArr)
|
bool Nck_CheckIfNickWithArrIsValid (const char *NickWithArr)
|
||||||
{
|
{
|
||||||
char NickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1];
|
char NickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
unsigned Length;
|
unsigned Length;
|
||||||
const char *Ptr;
|
const char *Ptr;
|
||||||
|
|
||||||
|
@ -113,9 +113,10 @@ bool Nck_CheckIfNickWithArrIsValid (const char *NickWithArr)
|
||||||
// Nickname may have leading '@'
|
// Nickname may have leading '@'
|
||||||
// Returns true if nickname found in database
|
// Returns true if nickname found in database
|
||||||
|
|
||||||
long Nck_GetUsrCodFromNickname (const char Nickname[Cns_MAX_BYTES_USR_LOGIN + 1])
|
long Nck_GetUsrCodFromNickname (const char Nickname[1 + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1])
|
||||||
{
|
{
|
||||||
char NickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1];
|
char NickWithArr[1 + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
|
char NickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
|
|
||||||
/***** Trivial check 1: nickname should be not null *****/
|
/***** Trivial check 1: nickname should be not null *****/
|
||||||
if (!Nickname)
|
if (!Nickname)
|
||||||
|
@ -125,9 +126,12 @@ long Nck_GetUsrCodFromNickname (const char Nickname[Cns_MAX_BYTES_USR_LOGIN + 1]
|
||||||
if (!Nickname[0])
|
if (!Nickname[0])
|
||||||
return -1L;
|
return -1L;
|
||||||
|
|
||||||
/***** Make a copy without possible starting arrobas *****/
|
/***** Make a copy with possible leading arrobas *****/
|
||||||
Str_Copy (NickWithoutArr,Nickname,sizeof (NickWithoutArr) - 1);
|
Str_Copy (NickWithArr,Nickname,sizeof (NickWithArr) - 1);
|
||||||
Str_RemoveLeadingArrobas (NickWithoutArr);
|
|
||||||
|
/***** Remove leading arrobas *****/
|
||||||
|
Str_RemoveLeadingArrobas (NickWithArr);
|
||||||
|
Str_Copy (NickWithoutArr,NickWithArr,sizeof (NickWithoutArr) - 1);
|
||||||
|
|
||||||
/***** Get user's code from database *****/
|
/***** Get user's code from database *****/
|
||||||
return Nck_DB_GetUsrCodFromNickname (NickWithoutArr);
|
return Nck_DB_GetUsrCodFromNickname (NickWithoutArr);
|
||||||
|
@ -175,7 +179,7 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe,
|
||||||
unsigned NumNicks;
|
unsigned NumNicks;
|
||||||
unsigned NumNick;
|
unsigned NumNick;
|
||||||
Act_Action_t NextAction;
|
Act_Action_t NextAction;
|
||||||
char NickWithArr[1 + Cns_MAX_BYTES_USR_LOGIN + 1];
|
char NickWithArr[1 + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
const struct UsrData *UsrDat = (ItsMe ? &Gbl.Usrs.Me.UsrDat :
|
const struct UsrData *UsrDat = (ItsMe ? &Gbl.Usrs.Me.UsrDat :
|
||||||
&Gbl.Usrs.Other.UsrDat);
|
&Gbl.Usrs.Other.UsrDat);
|
||||||
|
|
||||||
|
|
|
@ -38,15 +38,13 @@
|
||||||
#define Nck_MAX_CHARS_NICK_WITHOUT_ARROBA 16
|
#define Nck_MAX_CHARS_NICK_WITHOUT_ARROBA 16
|
||||||
#define Nck_MAX_BYTES_NICK_WITHOUT_ARROBA Nck_MAX_CHARS_NICK_WITHOUT_ARROBA
|
#define Nck_MAX_BYTES_NICK_WITHOUT_ARROBA Nck_MAX_CHARS_NICK_WITHOUT_ARROBA
|
||||||
|
|
||||||
#define Nck_MAX_BYTES_LIST_NICKS ((Cns_MAX_BYTES_USR_LOGIN + 2) * Cfg_MAX_USRS_IN_LIST)
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************************** Public prototypes *****************************/
|
/***************************** Public prototypes *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
bool Nck_CheckIfNickWithArrIsValid (const char *NickWithArr);
|
bool Nck_CheckIfNickWithArrIsValid (const char *NickWithArr);
|
||||||
|
|
||||||
long Nck_GetUsrCodFromNickname (const char Nickname[Cns_MAX_BYTES_USR_LOGIN + 1]);
|
long Nck_GetUsrCodFromNickname (const char Nickname[1 + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1]);
|
||||||
|
|
||||||
void Nck_ShowFormChangeMyNickname (bool IMustFillNickname);
|
void Nck_ShowFormChangeMyNickname (bool IMustFillNickname);
|
||||||
void Nck_ShowFormChangeOtherUsrNickname (void);
|
void Nck_ShowFormChangeOtherUsrNickname (void);
|
||||||
|
|
|
@ -79,7 +79,7 @@ void Nck_DB_UpdateNick (long UsrCod,const char *NewNickname)
|
||||||
/************** Get user's code of a user from his/her nickname **************/
|
/************** Get user's code of a user from his/her nickname **************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
long Nck_DB_GetUsrCodFromNickname (const char NickWithoutArroba[Cns_MAX_BYTES_USR_LOGIN + 1])
|
long Nck_DB_GetUsrCodFromNickname (const char NickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1])
|
||||||
{
|
{
|
||||||
return DB_QuerySELECTCode ("can not get user's code",
|
return DB_QuerySELECTCode ("can not get user's code",
|
||||||
"SELECT usr_nicknames.UsrCod"
|
"SELECT usr_nicknames.UsrCod"
|
||||||
|
@ -87,7 +87,7 @@ long Nck_DB_GetUsrCodFromNickname (const char NickWithoutArroba[Cns_MAX_BYTES_US
|
||||||
"usr_data"
|
"usr_data"
|
||||||
" WHERE usr_nicknames.Nickname='%s'"
|
" WHERE usr_nicknames.Nickname='%s'"
|
||||||
" AND usr_nicknames.UsrCod=usr_data.UsrCod",
|
" AND usr_nicknames.UsrCod=usr_data.UsrCod",
|
||||||
NickWithoutArroba);
|
NickWithoutArr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -95,10 +95,10 @@ long Nck_DB_GetUsrCodFromNickname (const char NickWithoutArroba[Cns_MAX_BYTES_US
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Nck_DB_GetNicknameFromUsrCod (long UsrCod,
|
void Nck_DB_GetNicknameFromUsrCod (long UsrCod,
|
||||||
char NickWithoutArroba[Cns_MAX_BYTES_USR_LOGIN + 1])
|
char NickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1])
|
||||||
{
|
{
|
||||||
/***** Get current (last updated) user's nickname from database *****/
|
/***** Get current (last updated) user's nickname from database *****/
|
||||||
DB_QuerySELECTString (NickWithoutArroba,Cns_MAX_BYTES_USR_LOGIN,
|
DB_QuerySELECTString (NickWithoutArr,Nck_MAX_BYTES_NICK_WITHOUT_ARROBA,
|
||||||
"can not get nickname",
|
"can not get nickname",
|
||||||
"SELECT Nickname"
|
"SELECT Nickname"
|
||||||
" FROM usr_nicknames"
|
" FROM usr_nicknames"
|
||||||
|
@ -127,7 +127,7 @@ unsigned Nck_DB_GetUsrNicknames (MYSQL_RES **mysql_res,long UsrCod)
|
||||||
/************ Check if nickname matches any of a user's nicknames ************/
|
/************ Check if nickname matches any of a user's nicknames ************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
bool Nck_DB_CheckIfNickMatchesAnyUsrNick (long UsrCod,const char NickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1])
|
bool Nck_DB_CheckIfNickMatchesAnyUsrNick (long UsrCod,const char NickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1])
|
||||||
{
|
{
|
||||||
return (DB_QueryCOUNT ("can not check if nickname already existed",
|
return (DB_QueryCOUNT ("can not check if nickname already existed",
|
||||||
"SELECT COUNT(*)"
|
"SELECT COUNT(*)"
|
||||||
|
@ -142,7 +142,7 @@ bool Nck_DB_CheckIfNickMatchesAnyUsrNick (long UsrCod,const char NickWithoutArr[
|
||||||
/********* Check if nickname matches any of other user's nicknames ***********/
|
/********* Check if nickname matches any of other user's nicknames ***********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
bool Nck_DB_CheckIfNickMatchesAnyOtherUsrsNicks (long UsrCod,const char NickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1])
|
bool Nck_DB_CheckIfNickMatchesAnyOtherUsrsNicks (long UsrCod,const char NickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1])
|
||||||
{
|
{
|
||||||
return (DB_QueryCOUNT ("can not check if nickname already existed",
|
return (DB_QueryCOUNT ("can not check if nickname already existed",
|
||||||
"SELECT COUNT(*)"
|
"SELECT COUNT(*)"
|
||||||
|
|
|
@ -40,12 +40,12 @@
|
||||||
|
|
||||||
void Nck_DB_UpdateNick (long UsrCod,const char *NewNickname);
|
void Nck_DB_UpdateNick (long UsrCod,const char *NewNickname);
|
||||||
|
|
||||||
long Nck_DB_GetUsrCodFromNickname (const char NickWithoutArroba[Cns_MAX_BYTES_USR_LOGIN + 1]);
|
long Nck_DB_GetUsrCodFromNickname (const char NickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1]);
|
||||||
void Nck_DB_GetNicknameFromUsrCod (long UsrCod,
|
void Nck_DB_GetNicknameFromUsrCod (long UsrCod,
|
||||||
char Nickname[Cns_MAX_BYTES_USR_LOGIN + 1]);
|
char NickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1]);
|
||||||
unsigned Nck_DB_GetUsrNicknames (MYSQL_RES **mysql_res,long UsrCod);
|
unsigned Nck_DB_GetUsrNicknames (MYSQL_RES **mysql_res,long UsrCod);
|
||||||
bool Nck_DB_CheckIfNickMatchesAnyUsrNick (long UsrCod,const char NickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1]);
|
bool Nck_DB_CheckIfNickMatchesAnyUsrNick (long UsrCod,const char NickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1]);
|
||||||
bool Nck_DB_CheckIfNickMatchesAnyOtherUsrsNicks (long UsrCod,const char NickWithoutArr[Cns_MAX_BYTES_USR_LOGIN + 1]);
|
bool Nck_DB_CheckIfNickMatchesAnyOtherUsrsNicks (long UsrCod,const char NickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1]);
|
||||||
|
|
||||||
void Nck_DB_RemoveNickname (long UsrCod,const char *Nickname);
|
void Nck_DB_RemoveNickname (long UsrCod,const char *Nickname);
|
||||||
void Nck_DB_RemoveUsrNicknames (long UsrCod);
|
void Nck_DB_RemoveUsrNicknames (long UsrCod);
|
||||||
|
|
|
@ -662,7 +662,7 @@ void Par_GetMainParams (void)
|
||||||
extern const char *The_ThemeId[The_NUM_THEMES];
|
extern const char *The_ThemeId[The_NUM_THEMES];
|
||||||
extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS];
|
extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS];
|
||||||
long ActCod;
|
long ActCod;
|
||||||
char Nickname[Cns_MAX_BYTES_USR_LOGIN + 1];
|
char Nickname[1 + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
char URL[PATH_MAX + 1];
|
char URL[PATH_MAX + 1];
|
||||||
char LongStr[Cns_MAX_DECIMAL_DIGITS_LONG + 1];
|
char LongStr[Cns_MAX_DECIMAL_DIGITS_LONG + 1];
|
||||||
|
|
||||||
|
@ -690,7 +690,7 @@ void Par_GetMainParams (void)
|
||||||
/***** Get another user's nickname, if exists
|
/***** Get another user's nickname, if exists
|
||||||
(this nickname is used to go to another user's profile,
|
(this nickname is used to go to another user's profile,
|
||||||
not to get the logged user) *****/
|
not to get the logged user) *****/
|
||||||
if (Par_GetParToText ("usr",Nickname,Cns_MAX_BYTES_USR_LOGIN))
|
if (Par_GetParToText ("usr",Nickname,sizeof (Nickname) - 1))
|
||||||
{
|
{
|
||||||
if (Nickname[0])
|
if (Nickname[0])
|
||||||
{
|
{
|
||||||
|
@ -706,7 +706,7 @@ void Par_GetMainParams (void)
|
||||||
Gbl.Action.Act = Gbl.Action.Original = ActSeeOthPubPrf; // Set default action if no other is specified
|
Gbl.Action.Act = Gbl.Action.Original = ActSeeOthPubPrf; // Set default action if no other is specified
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (Par_GetParToText ("agd",Nickname,Cns_MAX_BYTES_USR_LOGIN))
|
else if (Par_GetParToText ("agd",Nickname,sizeof (Nickname) - 1))
|
||||||
{
|
{
|
||||||
if (Nickname[0])
|
if (Nickname[0])
|
||||||
{
|
{
|
||||||
|
|
|
@ -195,7 +195,7 @@ void Prf_RequestUserProfile (void)
|
||||||
extern const char *The_ClassFormInBox[The_NUM_THEMES];
|
extern const char *The_ClassFormInBox[The_NUM_THEMES];
|
||||||
extern const char *Txt_Nickname;
|
extern const char *Txt_Nickname;
|
||||||
extern const char *Txt_Continue;
|
extern const char *Txt_Continue;
|
||||||
char NickWithArr[1 + Cns_MAX_BYTES_USR_LOGIN + 1];
|
char NickWithArr[1 + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
|
|
||||||
if (Gbl.Usrs.Me.Logged)
|
if (Gbl.Usrs.Me.Logged)
|
||||||
{
|
{
|
||||||
|
@ -222,7 +222,7 @@ void Prf_RequestUserProfile (void)
|
||||||
|
|
||||||
snprintf (NickWithArr,sizeof (NickWithArr),"@%s",
|
snprintf (NickWithArr,sizeof (NickWithArr),"@%s",
|
||||||
Gbl.Usrs.Me.UsrDat.Nickname);
|
Gbl.Usrs.Me.UsrDat.Nickname);
|
||||||
HTM_INPUT_TEXT ("usr",Cns_MAX_BYTES_USR_LOGIN,NickWithArr,
|
HTM_INPUT_TEXT ("usr",sizeof (NickWithArr) - 1,NickWithArr,
|
||||||
HTM_DONT_SUBMIT_ON_CHANGE,
|
HTM_DONT_SUBMIT_ON_CHANGE,
|
||||||
"size=\"18\"");
|
"size=\"18\"");
|
||||||
HTM_LABEL_End ();
|
HTM_LABEL_End ();
|
||||||
|
|
|
@ -1885,16 +1885,16 @@ void Str_RemoveLeadingZeros (char *Str)
|
||||||
|
|
||||||
void Str_RemoveLeadingArrobas (char *Str)
|
void Str_RemoveLeadingArrobas (char *Str)
|
||||||
{
|
{
|
||||||
size_t NumLeadingArrobas;
|
size_t NumLeadingArr;
|
||||||
|
|
||||||
if (Str)
|
if (Str)
|
||||||
if (Str[0])
|
if (Str[0])
|
||||||
{
|
{
|
||||||
NumLeadingArrobas = strspn (Str,"@");
|
NumLeadingArr = strspn (Str,"@");
|
||||||
if (NumLeadingArrobas)
|
if (NumLeadingArr)
|
||||||
// Do not use strcpy / memcpy because the strings overlap
|
// Do not use strcpy / memcpy because the strings overlap
|
||||||
memmove (Str,&Str[NumLeadingArrobas],
|
memmove (Str,&Str[NumLeadingArr],
|
||||||
strlen (Str) - NumLeadingArrobas + 1);
|
strlen (Str) - NumLeadingArr + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
swad_user.c
13
swad_user.c
|
@ -62,6 +62,7 @@
|
||||||
#include "swad_ID.h"
|
#include "swad_ID.h"
|
||||||
#include "swad_language.h"
|
#include "swad_language.h"
|
||||||
#include "swad_mail_database.h"
|
#include "swad_mail_database.h"
|
||||||
|
#include "swad_message.h"
|
||||||
#include "swad_MFU.h"
|
#include "swad_MFU.h"
|
||||||
#include "swad_nickname.h"
|
#include "swad_nickname.h"
|
||||||
#include "swad_nickname_database.h"
|
#include "swad_nickname_database.h"
|
||||||
|
@ -2870,7 +2871,7 @@ void Usr_PutFormLogOut (void)
|
||||||
|
|
||||||
void Usr_GetParamUsrIdLogin (void)
|
void Usr_GetParamUsrIdLogin (void)
|
||||||
{
|
{
|
||||||
Par_GetParToText ("UsrId",Gbl.Usrs.Me.UsrIdLogin,Cns_MAX_BYTES_USR_LOGIN);
|
Par_GetParToText ("UsrId",Gbl.Usrs.Me.UsrIdLogin,sizeof (Gbl.Usrs.Me.UsrIdLogin) - 1);
|
||||||
// Users' IDs are always stored internally without leading zeros
|
// Users' IDs are always stored internally without leading zeros
|
||||||
Str_RemoveLeadingZeros (Gbl.Usrs.Me.UsrIdLogin);
|
Str_RemoveLeadingZeros (Gbl.Usrs.Me.UsrIdLogin);
|
||||||
}
|
}
|
||||||
|
@ -2884,7 +2885,7 @@ static void Usr_GetParamOtherUsrIDNickOrEMail (void)
|
||||||
/***** Get parameter with the plain user's ID, @nick or email of another user *****/
|
/***** Get parameter with the plain user's ID, @nick or email of another user *****/
|
||||||
Par_GetParToText ("OtherUsrIDNickOrEMail",
|
Par_GetParToText ("OtherUsrIDNickOrEMail",
|
||||||
Gbl.Usrs.Other.UsrDat.UsrIDNickOrEmail,
|
Gbl.Usrs.Other.UsrDat.UsrIDNickOrEmail,
|
||||||
Cns_MAX_BYTES_USR_LOGIN);
|
sizeof (Gbl.Usrs.Other.UsrDat.UsrIDNickOrEmail) - 1);
|
||||||
|
|
||||||
// If it's a user's ID (if does not contain '@')
|
// If it's a user's ID (if does not contain '@')
|
||||||
if (strchr (Gbl.Usrs.Other.UsrDat.UsrIDNickOrEmail,(int) '@') != NULL) // '@' not found
|
if (strchr (Gbl.Usrs.Other.UsrDat.UsrIDNickOrEmail,(int) '@') != NULL) // '@' not found
|
||||||
|
@ -6003,7 +6004,7 @@ bool Usr_GetListMsgRecipientsWrittenExplicitelyBySender (bool WriteErrorMsgs)
|
||||||
|
|
||||||
/***** Get recipients written explicetely *****/
|
/***** Get recipients written explicetely *****/
|
||||||
Par_GetParToText ("OtherRecipients",Gbl.Usrs.ListOtherRecipients,
|
Par_GetParToText ("OtherRecipients",Gbl.Usrs.ListOtherRecipients,
|
||||||
Nck_MAX_BYTES_LIST_NICKS);
|
Msg_MAX_BYTES_LIST_OTHER_RECIPIENTS);
|
||||||
|
|
||||||
/***** Add encrypted users' IDs to the list with all selected users *****/
|
/***** Add encrypted users' IDs to the list with all selected users *****/
|
||||||
if (Gbl.Usrs.ListOtherRecipients[0])
|
if (Gbl.Usrs.ListOtherRecipients[0])
|
||||||
|
@ -6016,7 +6017,7 @@ bool Usr_GetListMsgRecipientsWrittenExplicitelyBySender (bool WriteErrorMsgs)
|
||||||
while (*Ptr)
|
while (*Ptr)
|
||||||
{
|
{
|
||||||
/* Find next string in text until comma or semicolon (leading and trailing spaces are removed) */
|
/* Find next string in text until comma or semicolon (leading and trailing spaces are removed) */
|
||||||
Str_GetNextStringUntilComma (&Ptr,UsrIDNickOrEmail,Cns_MAX_BYTES_USR_LOGIN);
|
Str_GetNextStringUntilComma (&Ptr,UsrIDNickOrEmail,sizeof (UsrIDNickOrEmail) - 1);
|
||||||
|
|
||||||
/* Check if string is plain user's ID or nickname and get encrypted user's ID */
|
/* Check if string is plain user's ID or nickname and get encrypted user's ID */
|
||||||
if (UsrIDNickOrEmail[0])
|
if (UsrIDNickOrEmail[0])
|
||||||
|
@ -6356,7 +6357,7 @@ static void Usr_AllocateListOtherRecipients (void)
|
||||||
{
|
{
|
||||||
if (!Gbl.Usrs.ListOtherRecipients)
|
if (!Gbl.Usrs.ListOtherRecipients)
|
||||||
{
|
{
|
||||||
if ((Gbl.Usrs.ListOtherRecipients = malloc (Nck_MAX_BYTES_LIST_NICKS + 1)) == NULL)
|
if ((Gbl.Usrs.ListOtherRecipients = malloc (Msg_MAX_BYTES_LIST_OTHER_RECIPIENTS + 1)) == NULL)
|
||||||
Err_NotEnoughMemoryExit ();
|
Err_NotEnoughMemoryExit ();
|
||||||
Gbl.Usrs.ListOtherRecipients[0] = '\0';
|
Gbl.Usrs.ListOtherRecipients[0] = '\0';
|
||||||
}
|
}
|
||||||
|
@ -10170,7 +10171,7 @@ void Usr_DB_RemoveUsrFromBanned (long UsrCod)
|
||||||
|
|
||||||
void Usr_PrintUsrQRCode (void)
|
void Usr_PrintUsrQRCode (void)
|
||||||
{
|
{
|
||||||
char NewNickWithArr[1 + Cns_MAX_BYTES_USR_LOGIN + 1];
|
char NewNickWithArr[1 + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
|
|
||||||
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
|
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
|
||||||
{
|
{
|
||||||
|
|
|
@ -172,7 +172,7 @@ struct UsrData
|
||||||
struct ListIDs *List;
|
struct ListIDs *List;
|
||||||
unsigned Num;
|
unsigned Num;
|
||||||
} IDs;
|
} IDs;
|
||||||
char Nickname [Cns_MAX_BYTES_USR_LOGIN + 1];
|
char Nickname [Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1];
|
||||||
char Password [Pwd_BYTES_ENCRYPTED_PASSWORD + 1];
|
char Password [Pwd_BYTES_ENCRYPTED_PASSWORD + 1];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue