swad-core/swad_nickname.c

620 lines
22 KiB
C
Raw Normal View History

2014-12-01 23:55:08 +01:00
// swad_nickname.c: Users' nicknames
/*
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.
2019-01-07 21:52:19 +01:00
Copyright (C) 1999-2019 Antonio Ca<EFBFBD>as Vargas
2014-12-01 23:55:08 +01:00
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 <string.h> // For string functions
2014-12-12 22:39:55 +01:00
#include "swad_account.h"
2018-10-15 14:07:12 +02:00
#include "swad_box.h"
2014-12-01 23:55:08 +01:00
#include "swad_database.h"
2018-11-09 20:47:39 +01:00
#include "swad_form.h"
2014-12-01 23:55:08 +01:00
#include "swad_global.h"
#include "swad_parameter.h"
#include "swad_QR.h"
2018-10-15 14:07:12 +02:00
#include "swad_table.h"
2014-12-01 23:55:08 +01:00
#include "swad_user.h"
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/***************************** Private constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/******************************* Private types *******************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Private variables *****************************/
/*****************************************************************************/
2018-10-16 01:36:13 +02:00
const char *Nck_NICKNAME_SECTION_ID = "nickname_section";
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
2018-10-16 01:36:13 +02:00
static void Nck_ShowFormChangeUsrNickname (const struct UsrData *UsrDat,bool ItsMe,
bool IMustFillNickname);
2018-10-15 14:07:12 +02:00
2018-10-16 01:36:13 +02:00
static void Nck_RemoveNicknameFromDB (long UsrCod,const char *Nickname);
static void Nck_UpdateUsrNick (struct UsrData *UsrDat);
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/********* Check whether a nickname (with initial arroba) if valid ***********/
/*****************************************************************************/
bool Nck_CheckIfNickWithArrobaIsValid (const char *NicknameWithArroba)
{
2017-01-28 15:58:46 +01:00
char NicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
2014-12-01 23:55:08 +01:00
unsigned Length;
const char *Ptr;
/***** A nickname must start by '@' *****/
if (NicknameWithArroba[0] != '@') // It's not a nickname
return false;
/***** Make a copy of nickname *****/
2017-01-15 18:02:52 +01:00
Str_Copy (NicknameWithoutArroba,NicknameWithArroba,
2017-01-17 03:10:43 +01:00
Nck_MAX_BYTES_NICKNAME_FROM_FORM);
2014-12-01 23:55:08 +01:00
Str_RemoveLeadingArrobas (NicknameWithoutArroba);
Length = strlen (NicknameWithoutArroba);
/***** A nick (without arroba) must have a number of characters
2017-03-07 01:56:41 +01:00
Nck_MIN_BYTES_NICKNAME_WITHOUT_ARROBA <= Length <= Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA *****/
if (Length < Nck_MIN_BYTES_NICKNAME_WITHOUT_ARROBA ||
Length > Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA)
2014-12-01 23:55:08 +01:00
return false;
/***** A nick can have digits, letters and '_' *****/
for (Ptr = NicknameWithoutArroba;
*Ptr;
Ptr++)
if (!((*Ptr >= 'a' && *Ptr <= 'z') ||
(*Ptr >= 'A' && *Ptr <= 'Z') ||
(*Ptr >= '0' && *Ptr <= '9') ||
(*Ptr == '_')))
return false;
return true;
}
/*****************************************************************************/
/************* Get nickname of a user from his/her user's code ***************/
/*****************************************************************************/
2017-01-17 03:10:43 +01:00
bool Nck_GetNicknameFromUsrCod (long UsrCod,
2017-03-07 01:56:41 +01:00
char Nickname[Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 1])
2014-12-01 23:55:08 +01:00
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
bool Found;
/***** Get current (last updated) user's nickname from database *****/
2018-11-01 13:03:25 +01:00
if (DB_QuerySELECT (&mysql_res,"can not get nickname",
"SELECT Nickname FROM usr_nicknames"
" WHERE UsrCod=%ld ORDER BY CreatTime DESC LIMIT 1",
UsrCod))
2014-12-01 23:55:08 +01:00
{
/* Get nickname */
row = mysql_fetch_row (mysql_res);
2017-01-17 03:10:43 +01:00
Str_Copy (Nickname,row[0],
2017-03-07 01:56:41 +01:00
Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA);
2014-12-01 23:55:08 +01:00
Found = true;
}
else
{
2017-01-17 03:10:43 +01:00
Nickname[0] = '\0';
2014-12-01 23:55:08 +01:00
Found = false;
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return Found;
}
/*****************************************************************************/
/************** Get user's code of a user from his/her nickname **************/
/*****************************************************************************/
2015-03-05 01:55:46 +01:00
// Nickname may have leading '@'
2014-12-01 23:55:08 +01:00
// Returns true if nickname found in database
long Nck_GetUsrCodFromNickname (const char *Nickname)
{
2017-01-17 03:10:43 +01:00
char NicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
2014-12-01 23:55:08 +01:00
MYSQL_RES *mysql_res;
MYSQL_ROW row;
long UsrCod = -1L;
2015-10-07 19:55:13 +02:00
if (Nickname)
if (Nickname[0])
{
/***** Make a copy without possible starting arrobas *****/
2017-01-15 18:02:52 +01:00
Str_Copy (NicknameWithoutArroba,Nickname,
2017-01-17 03:10:43 +01:00
Nck_MAX_BYTES_NICKNAME_FROM_FORM);
2015-10-07 19:55:13 +02:00
Str_RemoveLeadingArrobas (NicknameWithoutArroba);
/***** Get user's code from database *****/
/* Check if user code from table usr_nicknames is also in table usr_data */
2018-11-01 13:03:25 +01:00
if (DB_QuerySELECT (&mysql_res,"can not get user's code",
"SELECT usr_nicknames.UsrCod"
" FROM usr_nicknames,usr_data"
" WHERE usr_nicknames.Nickname='%s'"
" AND usr_nicknames.UsrCod=usr_data.UsrCod",
NicknameWithoutArroba))
2015-10-07 19:55:13 +02:00
{
/* Get row */
row = mysql_fetch_row (mysql_res);
/* Get user's code */
UsrCod = Str_ConvertStrCodToLongCod (row[0]);
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
}
2014-12-01 23:55:08 +01:00
return UsrCod;
}
/*****************************************************************************/
/*********************** Show form to change my nickname *********************/
/*****************************************************************************/
2018-10-15 14:07:12 +02:00
void Nck_ShowFormChangeMyNickname (bool IMustFillNickname)
2014-12-01 23:55:08 +01:00
{
2018-10-16 01:36:13 +02:00
Nck_ShowFormChangeUsrNickname (&Gbl.Usrs.Me.UsrDat,
true, // ItsMe
IMustFillNickname);
2018-10-15 14:07:12 +02:00
}
/*****************************************************************************/
/*********************** Show form to change my nickname *********************/
/*****************************************************************************/
void Nck_ShowFormChangeOtherUsrNickname (void)
{
2018-10-16 01:36:13 +02:00
Nck_ShowFormChangeUsrNickname (&Gbl.Usrs.Other.UsrDat,
false, // ItsMe
false); // IMustFillNickname
2018-10-15 14:07:12 +02:00
}
/*****************************************************************************/
/*********************** Show form to change my nickname *********************/
/*****************************************************************************/
2018-10-16 01:36:13 +02:00
static void Nck_ShowFormChangeUsrNickname (const struct UsrData *UsrDat,bool ItsMe,
bool IMustFillNickname)
2018-10-15 14:07:12 +02:00
{
extern const char *Hlp_PROFILE_Account;
2019-02-22 21:47:50 +01:00
extern const char *The_ClassFormInBox[The_NUM_THEMES];
2018-10-15 14:07:12 +02:00
extern const char *Txt_Nickname;
extern const char *Txt_Before_going_to_any_other_option_you_must_fill_your_nickname;
2014-12-01 23:55:08 +01:00
extern const char *Txt_Current_nickname;
extern const char *Txt_Other_nicknames;
extern const char *Txt_Use_this_nickname;
extern const char *Txt_New_nickname;
extern const char *Txt_Change_nickname;
2019-02-18 18:27:45 +01:00
extern const char *Txt_Save_changes;
2014-12-01 23:55:08 +01:00
MYSQL_RES *mysql_res;
MYSQL_ROW row;
2018-10-15 14:07:12 +02:00
char StrRecordWidth[10 + 1];
2014-12-01 23:55:08 +01:00
unsigned NumNicks;
unsigned NumNick;
2018-10-16 01:36:13 +02:00
Act_Action_t NextAction;
2014-12-01 23:55:08 +01:00
2018-10-15 14:07:12 +02:00
/***** Start section *****/
Lay_StartSection (Nck_NICKNAME_SECTION_ID);
2014-12-01 23:55:08 +01:00
/***** Get my nicknames *****/
2018-11-01 13:03:25 +01:00
NumNicks =
(unsigned) DB_QuerySELECT (&mysql_res,"can not get nicknames of a user",
"SELECT Nickname FROM usr_nicknames"
" WHERE UsrCod=%ld"
" ORDER BY CreatTime DESC",
UsrDat->UsrCod);
2014-12-01 23:55:08 +01:00
2018-10-15 14:07:12 +02:00
/***** Start box *****/
2018-10-18 02:02:32 +02:00
snprintf (StrRecordWidth,sizeof (StrRecordWidth),
"%upx",
Rec_RECORD_WIDTH);
2018-10-15 14:07:12 +02:00
Box_StartBox (StrRecordWidth,Txt_Nickname,Acc_PutLinkToRemoveMyAccount,
Hlp_PROFILE_Account,Box_NOT_CLOSABLE);
2019-03-09 20:12:44 +01:00
/***** Show possible alerts *****/
Ale_ShowAlerts (Nck_NICKNAME_SECTION_ID);
2018-10-15 14:07:12 +02:00
/***** Help message *****/
if (IMustFillNickname)
2019-02-16 18:11:52 +01:00
Ale_ShowAlert (Ale_WARNING,Txt_Before_going_to_any_other_option_you_must_fill_your_nickname);
2018-10-15 14:07:12 +02:00
2019-10-20 22:00:28 +02:00
/***** Begin table *****/
2019-10-10 23:14:13 +02:00
Tbl_TABLE_BeginWidePadding (2);
2018-10-15 14:07:12 +02:00
2018-10-16 01:36:13 +02:00
/***** List nicknames *****/
2014-12-01 23:55:08 +01:00
for (NumNick = 1;
NumNick <= NumNicks;
NumNick++)
{
/* Get nickname */
row = mysql_fetch_row (mysql_res);
2019-10-10 23:14:13 +02:00
Tbl_TR_Begin (NULL);
2014-12-01 23:55:08 +01:00
if (NumNick == 1)
2019-10-04 14:42:59 +02:00
{
2014-12-01 23:55:08 +01:00
/* The first nickname is the current one */
2019-10-15 15:23:38 +02:00
Tbl_TD_Begin ("class=\"REC_C1_BOT RT\"");
2019-10-09 15:44:12 +02:00
fprintf (Gbl.F.Out,"<label for=\"Nick\" class=\"%s\">"
2014-12-23 22:47:09 +01:00
"%s:"
2019-10-07 17:36:41 +02:00
"</label>",
2019-02-22 21:47:50 +01:00
The_ClassFormInBox[Gbl.Prefs.Theme],
2018-10-15 14:07:12 +02:00
Txt_Current_nickname);
2019-10-10 23:14:13 +02:00
Tbl_TD_End ();
2019-10-07 17:36:41 +02:00
2019-10-15 15:23:38 +02:00
Tbl_TD_Begin ("class=\"REC_C2_BOT LT USR_ID\"");
2019-10-04 14:42:59 +02:00
}
2014-12-01 23:55:08 +01:00
else // NumNick >= 2
{
if (NumNick == 2)
2019-10-07 17:36:41 +02:00
{
2019-10-15 15:23:38 +02:00
Tbl_TD_Begin ("rowspan=\"%u\" class=\"REC_C1_BOT RT\"",
2019-10-10 23:14:13 +02:00
NumNicks - 1);
2019-10-09 15:44:12 +02:00
fprintf (Gbl.F.Out,"<label for=\"Nick\" class=\"%s\">"
2018-10-15 14:07:12 +02:00
"%s:"
2019-10-07 17:36:41 +02:00
"</label>",
2019-02-22 21:47:50 +01:00
The_ClassFormInBox[Gbl.Prefs.Theme],
2015-03-24 17:47:26 +01:00
Txt_Other_nicknames);
2019-10-10 23:14:13 +02:00
Tbl_TD_End ();
2019-10-07 17:36:41 +02:00
}
2019-10-15 15:23:38 +02:00
Tbl_TD_Begin ("class=\"REC_C2_BOT LT DAT\"");
2014-12-01 23:55:08 +01:00
/* Form to remove old nickname */
2018-10-16 01:36:13 +02:00
if (ItsMe)
2019-02-15 21:09:18 +01:00
Frm_StartFormAnchor (ActRemMyNck,Nck_NICKNAME_SECTION_ID);
2018-10-16 01:36:13 +02:00
else
{
switch (UsrDat->Roles.InCurrentCrs.Role)
{
case Rol_STD:
NextAction = ActRemOldNicStd;
break;
case Rol_NET:
case Rol_TCH:
NextAction = ActRemOldNicTch;
break;
default: // Guest, user or admin
NextAction = ActRemOldNicOth;
break;
}
2018-11-09 20:47:39 +01:00
Frm_StartFormAnchor (NextAction,Nck_NICKNAME_SECTION_ID);
2018-10-16 01:36:13 +02:00
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
}
2016-12-24 14:26:50 +01:00
fprintf (Gbl.F.Out,"<input type=\"hidden\" name=\"Nick\""
" value=\"%s\" />",
2014-12-01 23:55:08 +01:00
row[0]);
2017-06-11 19:13:28 +02:00
Ico_PutIconRemove ();
2018-11-09 20:47:39 +01:00
Frm_EndForm ();
2014-12-01 23:55:08 +01:00
}
/* Nickname */
2018-10-15 14:07:12 +02:00
fprintf (Gbl.F.Out,"@%s",row[0]);
2014-12-01 23:55:08 +01:00
/* Link to QR code */
2018-10-16 01:36:13 +02:00
if (NumNick == 1 && UsrDat->Nickname[0])
2018-10-18 08:56:00 +02:00
QR_PutLinkToPrintQRCode (ActPrnUsrQR,Usr_PutParamMyUsrCodEncrypted);
2015-09-18 02:15:35 +02:00
2014-12-01 23:55:08 +01:00
/* Form to change the nickname */
if (NumNick > 1)
{
2018-10-15 14:07:12 +02:00
fprintf (Gbl.F.Out,"<br />");
2018-10-16 01:36:13 +02:00
if (ItsMe)
2019-02-15 21:09:18 +01:00
Frm_StartFormAnchor (ActChgMyNck,Nck_NICKNAME_SECTION_ID);
2018-10-16 01:36:13 +02:00
else
{
switch (UsrDat->Roles.InCurrentCrs.Role)
{
case Rol_STD:
NextAction = ActChgNicStd;
break;
case Rol_NET:
case Rol_TCH:
NextAction = ActChgNicTch;
break;
default: // Guest, user or admin
NextAction = ActChgNicOth;
break;
}
2018-11-09 20:47:39 +01:00
Frm_StartFormAnchor (NextAction,Nck_NICKNAME_SECTION_ID);
2018-10-16 01:36:13 +02:00
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
}
2016-12-24 14:26:50 +01:00
fprintf (Gbl.F.Out,"<input type=\"hidden\" name=\"NewNick\""
" value=\"@%s\" />",
2015-03-24 17:47:26 +01:00
row[0]); // Nickname
2017-06-11 19:02:40 +02:00
Btn_PutConfirmButtonInline (Txt_Use_this_nickname);
2018-11-09 20:47:39 +01:00
Frm_EndForm ();
2014-12-01 23:55:08 +01:00
}
2019-10-10 23:14:13 +02:00
Tbl_TD_End ();
Tbl_TR_End ();
2014-12-01 23:55:08 +01:00
}
/***** Form to enter new nickname *****/
2019-10-10 23:14:13 +02:00
Tbl_TR_Begin (NULL);
2019-10-07 17:36:41 +02:00
2019-10-15 15:23:38 +02:00
Tbl_TD_Begin ("class=\"REC_C1_BOT RT\"");
2019-10-09 15:44:12 +02:00
fprintf (Gbl.F.Out,"<label for=\"NewNick\" class=\"%s\">"
2018-10-15 14:07:12 +02:00
"%s:"
2019-10-07 17:36:41 +02:00
"</label>",
2019-02-22 21:47:50 +01:00
The_ClassFormInBox[Gbl.Prefs.Theme],
2014-12-01 23:55:08 +01:00
NumNicks ? Txt_New_nickname : // A new nickname
Txt_Nickname); // The first nickname
2019-10-10 23:14:13 +02:00
Tbl_TD_End ();
2019-10-07 17:36:41 +02:00
2019-10-15 15:23:38 +02:00
Tbl_TD_Begin ("class=\"REC_C2_BOT LT DAT\"");
2018-10-16 01:36:13 +02:00
if (ItsMe)
2019-02-15 21:09:18 +01:00
Frm_StartFormAnchor (ActChgMyNck,Nck_NICKNAME_SECTION_ID);
2018-10-16 01:36:13 +02:00
else
{
switch (UsrDat->Roles.InCurrentCrs.Role)
{
case Rol_STD:
NextAction = ActChgNicStd;
break;
case Rol_NET:
case Rol_TCH:
NextAction = ActChgNicTch;
break;
default: // Guest, user or admin
NextAction = ActChgNicOth;
break;
}
2018-11-09 20:47:39 +01:00
Frm_StartFormAnchor (NextAction,Nck_NICKNAME_SECTION_ID);
2018-10-16 01:36:13 +02:00
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
}
2018-10-15 14:07:12 +02:00
fprintf (Gbl.F.Out,"<input type=\"text\" id=\"NewNick\" name=\"NewNick\""
2016-12-10 18:32:35 +01:00
" size=\"18\" maxlength=\"%u\" value=\"@%s\" />"
2018-10-15 14:07:12 +02:00
"<br />",
2017-03-07 01:56:41 +01:00
1 + Nck_MAX_CHARS_NICKNAME_WITHOUT_ARROBA,
2015-03-24 17:47:26 +01:00
Gbl.Usrs.Me.UsrDat.Nickname);
2017-06-11 19:02:40 +02:00
Btn_PutCreateButtonInline (NumNicks ? Txt_Change_nickname : // I already have a nickname
2019-02-18 18:27:45 +01:00
Txt_Save_changes); // I have no nickname yet);
2018-11-09 20:47:39 +01:00
Frm_EndForm ();
2019-10-10 23:14:13 +02:00
Tbl_TD_End ();
2019-10-07 17:36:41 +02:00
2019-10-10 23:14:13 +02:00
Tbl_TR_End ();
2018-10-15 14:07:12 +02:00
/***** End table and box *****/
Box_EndBoxTable ();
/***** End section *****/
Lay_EndSection ();
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
2018-10-16 01:36:13 +02:00
/***************************** Remove my nickname ****************************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2018-10-16 01:36:13 +02:00
void Nck_RemoveMyNick (void)
2014-12-01 23:55:08 +01:00
{
extern const char *Txt_Nickname_X_removed;
extern const char *Txt_You_can_not_delete_your_current_nickname;
2017-03-07 01:56:41 +01:00
char NicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 1];
2014-12-01 23:55:08 +01:00
2018-10-16 01:36:13 +02:00
/***** Get nickname from form *****/
Par_GetParToText ("Nick",NicknameWithoutArroba,
Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA);
2014-12-01 23:55:08 +01:00
if (strcasecmp (NicknameWithoutArroba,Gbl.Usrs.Me.UsrDat.Nickname)) // Only if not my current nickname
{
/***** Remove one of my old nicknames *****/
2018-10-16 01:36:13 +02:00
Nck_RemoveNicknameFromDB (Gbl.Usrs.Me.UsrDat.UsrCod,NicknameWithoutArroba);
2014-12-01 23:55:08 +01:00
/***** Show message *****/
2019-03-09 20:12:44 +01:00
Ale_CreateAlert (Ale_SUCCESS,Nck_NICKNAME_SECTION_ID,
Txt_Nickname_X_removed,
NicknameWithoutArroba);
2014-12-01 23:55:08 +01:00
}
else
2019-03-09 20:12:44 +01:00
Ale_CreateAlert (Ale_WARNING,Nck_NICKNAME_SECTION_ID,
Txt_You_can_not_delete_your_current_nickname);
2014-12-01 23:55:08 +01:00
/***** Show my account again *****/
2018-10-15 14:07:12 +02:00
Acc_ShowFormChgMyAccount ();
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
2018-10-16 01:36:13 +02:00
/********************* Remove another user's nickname ************************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2018-10-16 01:36:13 +02:00
void Nck_RemoveOtherUsrNick (void)
{
extern const char *Txt_Nickname_X_removed;
char NicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 1];
/***** Get user whose nick must be removed *****/
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
{
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
{
/***** Get nickname from form *****/
Par_GetParToText ("Nick",NicknameWithoutArroba,
Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA);
/***** Remove one of the old nicknames *****/
Nck_RemoveNicknameFromDB (Gbl.Usrs.Other.UsrDat.UsrCod,NicknameWithoutArroba);
/***** Show message *****/
2019-03-09 20:12:44 +01:00
Ale_CreateAlert (Ale_SUCCESS,Nck_NICKNAME_SECTION_ID,
Txt_Nickname_X_removed,
NicknameWithoutArroba);
2018-10-16 01:36:13 +02:00
/***** Show user's account again *****/
Acc_ShowFormChgOtherUsrAccount ();
}
else
2019-03-09 20:12:44 +01:00
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
2018-10-16 01:36:13 +02:00
}
else // User not found
2019-03-09 20:12:44 +01:00
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
2018-10-16 01:36:13 +02:00
}
/*****************************************************************************/
/********************** Remove a nickname from database **********************/
/*****************************************************************************/
static void Nck_RemoveNicknameFromDB (long UsrCod,const char *Nickname)
2014-12-01 23:55:08 +01:00
{
2018-10-16 01:36:13 +02:00
/***** Remove a nickname *****/
2018-11-02 16:39:35 +01:00
DB_QueryREPLACE ("can not remove a nickname",
"DELETE FROM usr_nicknames"
" WHERE UsrCod=%ld AND Nickname='%s'",
UsrCod,Nickname);
2018-10-16 01:36:13 +02:00
}
/*****************************************************************************/
/***************************** Update my nickname ****************************/
/*****************************************************************************/
void Nck_UpdateMyNick (void)
{
/***** Update my nickname *****/
Nck_UpdateUsrNick (&Gbl.Usrs.Me.UsrDat);
/***** Show my account again *****/
Acc_ShowFormChgMyAccount ();
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
2018-10-16 01:36:13 +02:00
/*********************** Update another user's nickname **********************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2018-10-16 01:36:13 +02:00
void Nck_UpdateOtherUsrNick (void)
{
/***** Get user whose nick must be changed *****/
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
{
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
{
/***** Update my nickname *****/
Nck_UpdateUsrNick (&Gbl.Usrs.Other.UsrDat);
/***** Show user's account again *****/
Acc_ShowFormChgOtherUsrAccount ();
}
else
2019-03-09 20:12:44 +01:00
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
2018-10-16 01:36:13 +02:00
}
else // User not found
2019-03-09 20:12:44 +01:00
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
2018-10-16 01:36:13 +02:00
}
/*****************************************************************************/
/*************************** Update user's nickname **************************/
/*****************************************************************************/
static void Nck_UpdateUsrNick (struct UsrData *UsrDat)
2014-12-01 23:55:08 +01:00
{
extern const char *Txt_The_nickname_X_matches_the_one_you_had_previously_registered;
extern const char *Txt_The_nickname_X_had_been_registered_by_another_user;
2018-10-16 01:36:13 +02:00
extern const char *Txt_The_nickname_X_has_been_registered_successfully;
2014-12-01 23:55:08 +01:00
extern const char *Txt_The_nickname_entered_X_is_not_valid_;
2017-01-28 15:58:46 +01:00
char NewNicknameWithArroba[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
char NewNicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
2014-12-01 23:55:08 +01:00
/***** Get new nickname from form *****/
2018-10-16 01:36:13 +02:00
Par_GetParToText ("NewNick",NewNicknameWithArroba,
Nck_MAX_BYTES_NICKNAME_FROM_FORM);
2014-12-01 23:55:08 +01:00
if (Nck_CheckIfNickWithArrobaIsValid (NewNicknameWithArroba)) // If new nickname is valid
{
/***** Remove arrobas at the beginning *****/
2017-01-15 18:02:52 +01:00
Str_Copy (NewNicknameWithoutArroba,NewNicknameWithArroba,
2017-01-17 03:10:43 +01:00
Nck_MAX_BYTES_NICKNAME_FROM_FORM);
2014-12-01 23:55:08 +01:00
Str_RemoveLeadingArrobas (NewNicknameWithoutArroba);
/***** Check if new nickname exists in database *****/
2018-10-16 01:36:13 +02:00
if (!strcmp (UsrDat->Nickname,NewNicknameWithoutArroba)) // User's nickname match exactly the new nickname
2019-03-09 20:12:44 +01:00
Ale_CreateAlert (Ale_WARNING,Nck_NICKNAME_SECTION_ID,
Txt_The_nickname_X_matches_the_one_you_had_previously_registered,
NewNicknameWithoutArroba);
2018-10-16 01:36:13 +02:00
else if (strcasecmp (UsrDat->Nickname,NewNicknameWithoutArroba)) // User's nickname does not match, not even case insensitive, the new nickname
2014-12-01 23:55:08 +01:00
{
/***** Check if the new nickname matches any of my old nicknames *****/
2018-11-03 20:52:00 +01:00
if (!DB_QueryCOUNT ("can not check if nickname already existed",
"SELECT COUNT(*) FROM usr_nicknames"
" WHERE UsrCod=%ld AND Nickname='%s'",
UsrDat->UsrCod,NewNicknameWithoutArroba)) // No matches
2014-12-01 23:55:08 +01:00
/***** Check if the new nickname matches any of the nicknames of other users *****/
2018-11-03 20:52:00 +01:00
if (DB_QueryCOUNT ("can not check if nickname already existed",
"SELECT COUNT(*) FROM usr_nicknames"
" WHERE Nickname='%s' AND UsrCod<>%ld",
NewNicknameWithoutArroba,UsrDat->UsrCod)) // A nickname of another user is the same that user's nickname
2019-03-09 20:12:44 +01:00
Ale_CreateAlert (Ale_WARNING,Nck_NICKNAME_SECTION_ID,
Txt_The_nickname_X_had_been_registered_by_another_user,
NewNicknameWithoutArroba);
2014-12-01 23:55:08 +01:00
}
2019-03-09 20:12:44 +01:00
if (Ale_GetNumAlerts () == 0) // No problems
2014-12-01 23:55:08 +01:00
{
2018-10-16 01:36:13 +02:00
// Now we know the new nickname is not already in database
// and is diffent to the current one
Nck_UpdateNickInDB (UsrDat->UsrCod,NewNicknameWithoutArroba);
Str_Copy (UsrDat->Nickname,NewNicknameWithoutArroba,
2017-03-07 01:56:41 +01:00
Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA);
2014-12-01 23:55:08 +01:00
2019-03-09 20:12:44 +01:00
Ale_CreateAlert (Ale_SUCCESS,Nck_NICKNAME_SECTION_ID,
Txt_The_nickname_X_has_been_registered_successfully,
NewNicknameWithoutArroba);
2014-12-01 23:55:08 +01:00
}
}
else // New nickname is not valid
2019-03-09 20:12:44 +01:00
Ale_CreateAlert (Ale_WARNING,Nck_NICKNAME_SECTION_ID,
Txt_The_nickname_entered_X_is_not_valid_,
NewNicknameWithArroba,
Nck_MIN_CHARS_NICKNAME_WITHOUT_ARROBA,
Nck_MAX_CHARS_NICKNAME_WITHOUT_ARROBA);
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
2018-10-16 01:36:13 +02:00
/******************* Update user's nickname in database **********************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2018-10-16 01:36:13 +02:00
void Nck_UpdateNickInDB (long UsrCod,const char *NewNickname)
2014-12-01 23:55:08 +01:00
{
2018-10-16 01:36:13 +02:00
/***** Update user's nickname in database *****/
2018-11-02 16:39:35 +01:00
DB_QueryREPLACE ("can not update nickname",
"REPLACE INTO usr_nicknames"
" (UsrCod,Nickname,CreatTime)"
" VALUES"
" (%ld,'%s',NOW())",
UsrCod,NewNickname);
2014-12-01 23:55:08 +01:00
}