2021-05-10 21:10:06 +02:00
|
|
|
|
// swad_account_database.c: user's account operations with database
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
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.
|
2024-02-07 00:40:28 +01:00
|
|
|
|
Copyright (C) 1999-2024 Antonio Ca<EFBFBD>as Vargas
|
2021-05-10 21:10:06 +02:00
|
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
|
it under the terms of the GNU Affero General 3 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_account.h"
|
|
|
|
|
#include "swad_account_database.h"
|
|
|
|
|
#include "swad_calendar.h"
|
2021-05-18 14:40:18 +02:00
|
|
|
|
#include "swad_database.h"
|
2021-05-10 21:10:06 +02:00
|
|
|
|
#include "swad_global.h"
|
2021-12-02 08:39:18 +01:00
|
|
|
|
#include "swad_photo.h"
|
2021-05-10 21:10:06 +02:00
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/************** External global variables from others modules ****************/
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
extern struct Globals Gbl;
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/*************** Check if there are users with this user's ID ****************/
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
// Returns the number of users got
|
|
|
|
|
|
|
|
|
|
unsigned Acc_DB_GetUsrsWithID (MYSQL_RES **mysql_res,
|
|
|
|
|
const char ID[ID_MAX_BYTES_USR_ID + 1])
|
|
|
|
|
{
|
|
|
|
|
return (unsigned)
|
|
|
|
|
DB_QuerySELECT (mysql_res,"can not get user's codes",
|
|
|
|
|
"SELECT usr_ids.UsrCod" // row[0]
|
|
|
|
|
" FROM usr_ids,"
|
|
|
|
|
"usr_data"
|
|
|
|
|
" WHERE usr_ids.UsrID='%s'"
|
|
|
|
|
" AND usr_ids.UsrCod=usr_data.UsrCod"
|
|
|
|
|
" AND usr_data.Password=''",
|
|
|
|
|
ID);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/****** Check if a nickname matches any of the nicknames of other users ******/
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2021-09-30 20:11:00 +02:00
|
|
|
|
bool Acc_DB_CheckIfNicknameAlreadyExists (const char NewNickWithoutArr[Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 1])
|
2021-05-10 21:10:06 +02:00
|
|
|
|
{
|
2021-11-05 23:41:26 +01:00
|
|
|
|
return
|
|
|
|
|
DB_QueryEXISTS ("can not check if nickname already existed",
|
|
|
|
|
"SELECT EXISTS"
|
|
|
|
|
"(SELECT *"
|
|
|
|
|
" FROM usr_nicknames"
|
|
|
|
|
" WHERE Nickname='%s'"
|
|
|
|
|
" AND UsrCod<>%ld)",
|
|
|
|
|
NewNickWithoutArr,
|
|
|
|
|
Gbl.Usrs.Me.UsrDat.UsrCod); // A nickname of another user is the same that this nickname
|
2021-05-10 21:10:06 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/******** Check if an email matches any of the emails of other users *********/
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
bool Acc_DB_CheckIfEmailAlreadyExists (const char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1])
|
|
|
|
|
{
|
2021-11-05 23:41:26 +01:00
|
|
|
|
return
|
|
|
|
|
DB_QueryEXISTS ("can not check if email already existed",
|
|
|
|
|
"SELECT EXISTS"
|
|
|
|
|
"(SELECT *"
|
|
|
|
|
" FROM usr_emails"
|
|
|
|
|
" WHERE E_mail='%s'"
|
|
|
|
|
" AND Confirmed='Y')",
|
|
|
|
|
NewEmail); // An email of another user is the same that my email
|
2021-05-10 21:10:06 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/****************************** Create new user ******************************/
|
|
|
|
|
/*****************************************************************************/
|
2021-06-10 13:50:23 +02:00
|
|
|
|
// Return new user's code
|
2021-05-10 21:10:06 +02:00
|
|
|
|
|
2022-09-24 18:30:26 +02:00
|
|
|
|
long Acc_DB_CreateNewUsr (const struct Usr_Data *UsrDat)
|
2021-05-10 21:10:06 +02:00
|
|
|
|
{
|
|
|
|
|
extern const char *The_ThemeId[The_NUM_THEMES];
|
|
|
|
|
extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS];
|
|
|
|
|
extern const char *Pri_VisibilityDB[Pri_NUM_OPTIONS_PRIVACY];
|
|
|
|
|
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
|
|
|
|
extern const char *Usr_StringsSexDB[Usr_NUM_SEXS];
|
|
|
|
|
char BirthdayStrDB[Usr_BIRTHDAY_STR_DB_LENGTH + 1];
|
|
|
|
|
|
|
|
|
|
/***** Create new user *****/
|
2021-05-10 22:23:10 +02:00
|
|
|
|
Usr_CreateBirthdayStrDB (UsrDat,BirthdayStrDB); // It can include start and ending apostrophes
|
2021-06-10 13:50:23 +02:00
|
|
|
|
return
|
2021-05-10 21:10:06 +02:00
|
|
|
|
DB_QueryINSERTandReturnCode ("can not create user",
|
|
|
|
|
"INSERT INTO usr_data"
|
|
|
|
|
" (EncryptedUsrCod,Password,"
|
|
|
|
|
"Surname1,Surname2,FirstName,Sex,"
|
|
|
|
|
"Theme,IconSet,Language,FirstDayOfWeek,DateFormat,"
|
|
|
|
|
"PhotoVisibility,BaPrfVisibility,ExPrfVisibility,"
|
|
|
|
|
"CtyCod,"
|
|
|
|
|
"LocalPhone,FamilyPhone,"
|
|
|
|
|
"Birthday,Comments,"
|
2021-12-02 08:39:18 +01:00
|
|
|
|
"Menu,SideCols,PhotoShape,"
|
2021-12-01 01:43:13 +01:00
|
|
|
|
"NotifNtfEvents,EmailNtfEvents)"
|
2021-05-10 21:10:06 +02:00
|
|
|
|
" VALUES"
|
|
|
|
|
" ('%s','%s',"
|
|
|
|
|
"'%s','%s','%s','%s',"
|
|
|
|
|
"'%s','%s','%s',%u,%u,"
|
|
|
|
|
"'%s','%s','%s',"
|
|
|
|
|
"%ld,"
|
|
|
|
|
"'%s','%s',"
|
|
|
|
|
"%s,'%s',"
|
2021-12-01 01:43:13 +01:00
|
|
|
|
"%u,%u,%u,"
|
|
|
|
|
"-1,0)",
|
2021-05-10 21:10:06 +02:00
|
|
|
|
UsrDat->EnUsrCod,
|
|
|
|
|
UsrDat->Password,
|
|
|
|
|
UsrDat->Surname1,
|
|
|
|
|
UsrDat->Surname2,
|
|
|
|
|
UsrDat->FrstName,
|
|
|
|
|
Usr_StringsSexDB[UsrDat->Sex],
|
|
|
|
|
The_ThemeId[UsrDat->Prefs.Theme],
|
|
|
|
|
Ico_IconSetId[UsrDat->Prefs.IconSet],
|
|
|
|
|
Lan_STR_LANG_ID[UsrDat->Prefs.Language],
|
|
|
|
|
Cal_FIRST_DAY_OF_WEEK_DEFAULT,
|
|
|
|
|
(unsigned) Dat_FORMAT_DEFAULT,
|
|
|
|
|
Pri_VisibilityDB[UsrDat->PhotoVisibility],
|
|
|
|
|
Pri_VisibilityDB[UsrDat->BaPrfVisibility],
|
|
|
|
|
Pri_VisibilityDB[UsrDat->ExPrfVisibility],
|
|
|
|
|
UsrDat->CtyCod,
|
|
|
|
|
UsrDat->Phone[0],
|
|
|
|
|
UsrDat->Phone[1],
|
|
|
|
|
BirthdayStrDB,
|
|
|
|
|
UsrDat->Comments ? UsrDat->Comments :
|
|
|
|
|
"",
|
|
|
|
|
(unsigned) Mnu_MENU_DEFAULT,
|
2021-12-01 01:43:13 +01:00
|
|
|
|
(unsigned) Cfg_DEFAULT_COLUMNS,
|
2021-12-31 14:51:44 +01:00
|
|
|
|
(unsigned) PhoSha_SHAPE_DEFAULT);
|
2021-05-10 21:10:06 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
2021-06-10 13:50:23 +02:00
|
|
|
|
/***************************** Update user's data ****************************/
|
2021-05-10 21:10:06 +02:00
|
|
|
|
/*****************************************************************************/
|
2021-06-10 13:50:23 +02:00
|
|
|
|
// UsrDat->UsrCod must be > 0
|
2021-05-10 21:10:06 +02:00
|
|
|
|
|
2022-09-24 18:30:26 +02:00
|
|
|
|
void Acc_DB_UpdateUsrData (const struct Usr_Data *UsrDat)
|
2021-05-10 21:10:06 +02:00
|
|
|
|
{
|
2021-06-10 13:50:23 +02:00
|
|
|
|
extern const char *Usr_StringsSexDB[Usr_NUM_SEXS];
|
|
|
|
|
char BirthdayStrDB[Usr_BIRTHDAY_STR_DB_LENGTH + 1];
|
|
|
|
|
|
|
|
|
|
/***** Update user's common data *****/
|
|
|
|
|
Usr_CreateBirthdayStrDB (UsrDat,BirthdayStrDB); // It can include start and ending apostrophes
|
|
|
|
|
DB_QueryUPDATE ("can not update user's data",
|
|
|
|
|
"UPDATE usr_data"
|
|
|
|
|
" SET Password='%s',"
|
|
|
|
|
"Surname1='%s',"
|
|
|
|
|
"Surname2='%s',"
|
|
|
|
|
"FirstName='%s',"
|
|
|
|
|
"Sex='%s',"
|
|
|
|
|
"CtyCod=%ld,"
|
|
|
|
|
"LocalPhone='%s',"
|
|
|
|
|
"FamilyPhone='%s',"
|
|
|
|
|
"Birthday=%s,"
|
|
|
|
|
"Comments='%s'"
|
|
|
|
|
" WHERE UsrCod=%ld",
|
|
|
|
|
UsrDat->Password,
|
|
|
|
|
UsrDat->Surname1,
|
|
|
|
|
UsrDat->Surname2,
|
|
|
|
|
UsrDat->FrstName,
|
|
|
|
|
Usr_StringsSexDB[UsrDat->Sex],
|
|
|
|
|
UsrDat->CtyCod,
|
|
|
|
|
UsrDat->Phone[0],
|
|
|
|
|
UsrDat->Phone[1],
|
|
|
|
|
BirthdayStrDB,
|
|
|
|
|
UsrDat->Comments ? UsrDat->Comments :
|
|
|
|
|
"",
|
|
|
|
|
UsrDat->UsrCod);
|
2021-05-10 21:10:06 +02:00
|
|
|
|
}
|
2021-06-11 10:46:53 +02:00
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/**************** Update institution, center and department ******************/
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
void Acc_DB_UpdateMyInstitutionCenterDepartment (void)
|
|
|
|
|
{
|
|
|
|
|
DB_QueryUPDATE ("can not update institution, center and department",
|
|
|
|
|
"UPDATE usr_data"
|
|
|
|
|
" SET InsCtyCod=%ld,"
|
|
|
|
|
"InsCod=%ld,"
|
|
|
|
|
"CtrCod=%ld,"
|
|
|
|
|
"DptCod=%ld"
|
|
|
|
|
" WHERE UsrCod=%ld",
|
|
|
|
|
Gbl.Usrs.Me.UsrDat.InsCtyCod,
|
|
|
|
|
Gbl.Usrs.Me.UsrDat.InsCod,
|
|
|
|
|
Gbl.Usrs.Me.UsrDat.Tch.CtrCod,
|
|
|
|
|
Gbl.Usrs.Me.UsrDat.Tch.DptCod,
|
|
|
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
|
|
|
}
|