Skip to content

Commit

Permalink
v24.4.4
Browse files Browse the repository at this point in the history
  • Loading branch information
xech committed May 3, 2024
1 parent bc0c989 commit cad197a
Show file tree
Hide file tree
Showing 196 changed files with 4,351 additions and 3,713 deletions.
80 changes: 42 additions & 38 deletions app/Common/Ctrl.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ public static function userConnectionSpaceSelection()
$connectViaForm =Req::isParam(["connectLogin","connectPassword"]);
$connectViaToken =(!empty($_COOKIE["userAuthToken"]));
$connectViaCookieOld=(!empty($_COOKIE["AGORAP_LOG"]) && !empty($_COOKIE["AGORAP_PASS"]));

//// CONNEXION D'UN USER
if(self::$curUser->isUser()==false && Req::isParam("disconnect")==false && ($connectViaForm==true || $connectViaToken==true || $connectViaCookieOld==true))
{
Expand All @@ -124,7 +125,8 @@ public static function userConnectionSpaceSelection()
elseif($connectViaToken==true){
$cookieToken=explode("@@@",$_COOKIE["userAuthToken"]);
$tmpUser=Db::getLine("SELECT T1.*, T2.userAuthToken FROM ap_user T1, ap_userAuthToken T2 WHERE T1._id=T2._idUser AND T1._id=".Db::format($cookieToken[0])." AND T2.userAuthToken=".Db::format($cookieToken[1]));
if(!empty($tmpUser)) {$userAuthentified=true;}
if(!empty($tmpUser)) {$userAuthentified=true;}
else {self::userAuthToken("delete");}
}
//// CONNEXION AUTO VIA L'ANCIENNE METHODE (obsolete depuis v23.4 mais retro-compatible : cookies supprimés dès que $userAuthentified=true)
elseif($connectViaCookieOld==true){
Expand Down Expand Up @@ -154,8 +156,8 @@ public static function userConnectionSpaceSelection()
}
//// USER NON-AUTHENTIFIÉ
else{
//// Notif d'erreur de credentials || notif de token obsolete
self::notify($connectViaForm==true?"NOTIF_identification":"NOTIF_identificationToken");
//// Notif d'erreur de credentials
if($connectViaForm==true) {self::notify("NOTIF_identification");}
self::redir("index.php?disconnect=1");
}
}
Expand Down Expand Up @@ -211,24 +213,30 @@ public static function userConnectionSpaceSelection()
}

/*******************************************************************************************
* CREE/SUPPRIME LE TOKEN DE CONNEXION AUTOMATIQUE
* @param string $action "create" or "delete"
* @param int $_idUser with "create" $action
* SUPPRIME/CREE LE TOKEN DE CONNEXION AUTOMATIQUE
* $action : "delete" || "create" avec $_idUser
*******************************************************************************************/
public static function userAuthToken($action, $_idUser=null)
{
//// S'il existe déjà un cookie "userAuthToken" : supprime le token en bdd correspondant au cookie
//// S'il existe déjà un cookie : supprime le token correspondant en bdd
if(!empty($_COOKIE["userAuthToken"])){
$cookieToken=explode("@@@",$_COOKIE["userAuthToken"]);
Db::query("DELETE FROM ap_userAuthToken WHERE userAuthToken=".Db::format($cookieToken[1]));
setcookie("userAuthToken", "", -1);
$cookieToken=explode("@@@",$_COOKIE["userAuthToken"]); //Récupère le token du cookie
Db::query("DELETE FROM ap_userAuthToken WHERE userAuthToken=".Db::format($cookieToken[1])); //Supprime le token correspondant dans la bdd
setcookie("userAuthToken", "", time()-TIME_COOKIES); //Supprime le cookie
unset($_COOKIE["userAuthToken"]); //Idem
}
//// (Re)Créé un nouveau token au format Bcrypt : enregistre le token en bdd et dans un cookie
if($action=="create"){
$userAuthToken=password_hash(uniqid(),PASSWORD_DEFAULT);
Db::query("DELETE FROM ap_userAuthToken WHERE _idUser=".$_idUser);
Db::query("INSERT INTO ap_userAuthToken SET _idUser=".$_idUser.", userAuthToken=".Db::format($userAuthToken).", dateCrea=NOW()");
setcookie("userAuthToken", $_idUser."@@@".$userAuthToken, TIME_COOKIES);
//// Créé un nouveau token au format : enregistre le token en bdd et dans un cookie
if($action=="create" && !empty($_idUser))
{
require_once('app/misc/Browser.php'); //Charge la classe "Browser()"
$browserObj=new Browser(); //Récup les infos du browser
$browserId=(is_object($browserObj)) ? $browserObj->getBrowser()."-".$browserObj->getPlatform() : null; //Identifie le browser et l'OS
$userAuthToken=password_hash(uniqid(),PASSWORD_DEFAULT); //Créé un nouveau Token avec l'algo Bcrypt
$cookieToken=$_idUser."@@@".$userAuthToken; //Créé le token du cookie
setcookie("userAuthToken", $cookieToken, TIME_COOKIES); //Enregistre le cookie
$_COOKIE["userAuthToken"]=$cookieToken; //Charge le cookie
Db::query("DELETE FROM ap_userAuthToken WHERE _idUser=".$_idUser." AND browserId=".Db::format($browserId)); //Supprime en bdd les anciens tokens
Db::query("INSERT INTO ap_userAuthToken SET _idUser=".$_idUser.", browserId=".Db::format($browserId).", userAuthToken=".Db::format($userAuthToken).", dateCrea=NOW()"); //Enregistre le token en bdd !
}
//// Supprime les cookies de l'ancienne méthode && Supprime les tokens de plus d'un an
if(!empty($_COOKIE["AGORAP_PASS"])) {setcookie("AGORAP_LOG","",-1); setcookie("AGORAP_PASS","",-1);}
Expand Down Expand Up @@ -280,7 +288,7 @@ public static function getVue($filePath, $datas=array())
/*******************************************************************************************
* AFFICHE UNE PAGE COMPLETE (ENSEMBLE DE VUES)
*******************************************************************************************/
protected static function displayPage($fileMainVue, $vDatasMainVue=array())
public static function displayPage($fileMainVue, $vDatasMainVue=array())
{
//// PAGE PRINCIPALE : AFFICHE LE HEADER, WALLPAPER, ETC.
if(static::$isMainPage==true)
Expand Down Expand Up @@ -375,26 +383,20 @@ public static function addLog($action, $curObj=null, $comment=null)
/*******************************************************************************************
* RECUPÈRE UN OBJET (vérifie s'il est déjà en cache)
*******************************************************************************************/
public static function getObj($objTypeOrMdl, $objIdOrValues=null, $updateCache=false)
public static function getObj($objectType, $objIdOrValues=null, $updateCache=false)
{
//Récupère le modèle de l'objet (exple si on passe en paramètre uniquement le "type" de l'objet : "fileFolder" => "MdlFileFolder")
$MdlClass=(preg_match("/^Mdl/i",$objTypeOrMdl)) ? $objTypeOrMdl : "Mdl".ucfirst($objTypeOrMdl);
//Retourne un nouvel objet OU un objet existant (déjà en cache?)
if(empty($objIdOrValues)) {return new $MdlClass();}
else
{
//Id de l'objet && clé de l'objet en cache
$objId=(!empty($objIdOrValues["_id"])) ? $objIdOrValues["_id"] : (int)$objIdOrValues;
$cacheKey=$MdlClass::objectType."-".$objId;
//Ajoute/Update l'objet en cache?
if(isset(self::$cacheObjects[$cacheKey])==false || $updateCache==true) {self::$cacheObjects[$cacheKey]=new $MdlClass($objIdOrValues);}
//Retourne l'objet en cache
return self::$cacheObjects[$cacheKey];
$MdlClass="Mdl".ucfirst($objectType); //Récupère le modèle de l'objet (ex: "fileFolder" => "MdlFileFolder")
if(empty($objIdOrValues)) {return new $MdlClass();} //Retourne un nouvel objet OU un objet existant (déjà en cache?)
else{
$objId=(!empty($objIdOrValues["_id"])) ? $objIdOrValues["_id"] : (int)$objIdOrValues; //Id de l'objet
$cacheKey=$MdlClass::objectType."-".$objId; //Clé de l'objet mis en cache
if(isset(self::$cacheObjects[$cacheKey])==false || $updateCache==true) {self::$cacheObjects[$cacheKey]=new $MdlClass($objIdOrValues);} //Ajoute ou Update l'objet en cache
return self::$cacheObjects[$cacheKey]; //Retourne l'objet en cache
}
}

/*******************************************************************************************
* RECUPÈRE L'OBJET PASSÉ EN GET/POST OU EN ARGUMENT (ex: "typeId=fileFolder-55")
* RECUPÈRE L'OBJET PASSÉ EN GET/POST || EN ARGUMENT VIA $typeId (ex: "file-55")
******************************************************************************************/
public static function getObjTarget($typeId=null)
{
Expand All @@ -409,7 +411,7 @@ public static function getObjTarget($typeId=null)
}

/*******************************************************************************************
* RECUPÈRE LES OBJETS ENVOYÉS VIA GET/POST (ex: objectsTypeId[file]=2-4-6)
* RECUPÈRE LES OBJETS ENVOYÉS VIA GET/POST (ex: objectsTypeId[file]=33-44-55)
*******************************************************************************************/
public static function getObjectsTypeId($objTypeFilter=null)
{
Expand All @@ -430,12 +432,14 @@ public static function getObjectsTypeId($objTypeFilter=null)
/*******************************************************************************************
* REDIRIGE VERS L'ADRESSE DEMANDÉE : REDIRECTION SIMPLE OU SUR LA PAGE PRINCIPALE (IFRAME)
*******************************************************************************************/
public static function redir($urlRedir)
public static function redir($redirUrl, $urlNotify=true)
{
$redirUrl=$urlRedir.self::urlNotify(); //Ajoute si besoin les notifs
if(static::$isMainPage==true) {header("Location: ".$redirUrl);} //Redirection simple
else {echo "<script> parent.location.href=\"".$redirUrl."\"; </script>";} //Redirection de la page principale depuis une Iframe (ex: après édit/suppr d'un objet)
exit; //Fin de script
if(!empty($redirUrl)){
if($urlNotify==true) {$redirUrl.=self::urlNotify();} //Ajoute les notifs
if(static::$isMainPage==true) {header("Location: ".$redirUrl);} //Redirection simple
else {echo "<script> parent.location.href=\"".$redirUrl."\"; </script>";} //Redirection de la page principale depuis une Iframe (ex: après édit/suppr d'un objet)
exit; //Fin de script
}
}

/*******************************************************************************************
Expand Down
8 changes: 4 additions & 4 deletions app/Common/CtrlMisc.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public static function actionMessengerUpdate()
//Init les variables de session
$_SESSION["livecounterUsers"]=$_SESSION["messengerMessages"]=$_SESSION["messengerDisplayTimes"]=$_SESSION["messengerCheckedUsers"]=[];
$_SESSION["livecounterMainHtml"]=$_SESSION["livecounterFormHtml"]=$_SESSION["messengerMessagesHtml"]="";
//Supprime les livecounters des users déconnectés (> 7 jours) && Supprime les vieux messages du messenger (> 30 jours -cf. trad("MESSENGER_nobody")- et les propositions de visio > 1 heure)
//Supprime les livecounters des users déconnectés (> 7 jours) && Supprime les vieux messages du messenger (messages > 30 jours + "launchVisio" > 1 heure)
Db::query("DELETE FROM ap_userLivecouter WHERE `date` < ".intval(time()-604800));
Db::query("DELETE FROM ap_userMessengerMessage WHERE `date` < ".intval(time()-2592000));
Db::query("DELETE FROM ap_userMessengerMessage WHERE message LIKE '%launchVisio%' AND `date` < ".intval(time()-3600));
Expand Down Expand Up @@ -62,7 +62,7 @@ public static function actionMessengerUpdate()
foreach($_SESSION["livecounterUsers"] as $tmpUser)
{
//Image/Label des users du livecounter principal
$userImg=(Req::isMobile()==false && $tmpUser->hasImg()) ? $tmpUser->getImg(false,true) : null;//Verif qu'on soit pas en mode mobile et si l'image existe
$userImg=(Req::isMobile()==false && $tmpUser->hasImg()) ? $tmpUser->personImg(false,true) : null;//Verif qu'on soit pas en mode mobile et si l'image existe
$userTitle=$tmpUser->getLabel()." &nbsp;".$userImg;
$userFirstName=$tmpUser->getLabel("firstName");
//Affichage de l'user dans le livecounter principal et le formulaire du messenger
Expand All @@ -88,7 +88,7 @@ public static function actionMessengerUpdate()
$destList=Txt::txt2tab($message["_idUsers"]);
$autorObj=self::getObj("user",$message["_idUser"]);
if(Req::isMobile()) {$dateAutor=$autorObj->getLabel("firstName")."<br>".date("H:i",$message["date"]);} //sur mobile : "Will<br>11:00 "
elseif($autorObj->hasImg()) {$dateAutor=date("H:i",$message["date"]).$autorObj->getImg(false,true);} //Mode normal avec icone de l'user : "11:00 <img>"
elseif($autorObj->hasImg()) {$dateAutor=date("H:i",$message["date"]).$autorObj->personImg(false,true);} //Mode normal avec icone de l'user : "11:00 <img>"
else {$dateAutor=date("H:i",$message["date"])." - ".$autorObj->getLabel("firstName");} //Mode normal avec label de l'user : "11:00 - Will"
if(count($destList)>2) {$dateAutor.="<img src='app/img/user/iconSmall.png' class='iconUsersMultiple'>";} //Ajoute si besoin l'icone de discussion à plusieurs
//Title de l'auteur et des destinataires
Expand Down Expand Up @@ -299,7 +299,7 @@ public static function actionPersonsMap()
$tmpAdress=trim($tmpPerson->adress.", ".$tmpPerson->postalCode." ".str_ireplace("cedex","",$tmpPerson->city)." ".$tmpPerson->country, ", ");
$tmpLabel=$tmpPerson->getLabel()." <br> ".$tmpAdress;
if(!empty($tmpPerson->companyOrganization) || !empty($tmpPerson->function)) {$tmpLabel.="<br>".trim($tmpPerson->function." - ".$tmpPerson->companyOrganization, " - ");}
$tmpImg=($tmpPerson->hasImg()) ? $tmpPerson->getImgPath() : "app/img/mapBig.png";
$tmpImg=($tmpPerson->hasImg()) ? $tmpPerson->personImgPath() : "app/img/mapBig.png";
$adressList[]=["adress"=>$tmpAdress, "personLabel"=>$tmpLabel, "personImg"=>$tmpImg];
}
}
Expand Down
55 changes: 10 additions & 45 deletions app/Common/CtrlObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,34 +75,7 @@ public static function actionFolderMove()
static::lightboxClose();
}
//Affiche le menu de déplacement de dossier
self::folderTreeMenu("move");
}

/*******************************************************************************************
* VUE : MENU D'ARBORESCENCE DE DOSSIERS ($context: "nav" / "move")
*******************************************************************************************/
public static function folderTreeMenu($context="nav")
{
//Affiche l'arborescence (si ya pas que le dossier racine)
if(count(Ctrl::$curRootFolder->folderTree())>1){
$vDatas["context"]=$context;
$vueFolderTree=Req::commonPath."VueObjFolderTree.php";
if($context=="nav") {return Ctrl::getVue($vueFolderTree,$vDatas);}//"nav" : renvoie le menu de navigation de l'arborescence de dossiers
else {static::displayPage($vueFolderTree,$vDatas);}//"move" : affiche uniquement le menu de selection d'un dossier pour y déplacer un element
}
}

/*******************************************************************************************
* VUE : MENU DU CHEMIN DU DOSSIER COURANT
*******************************************************************************************/
public static function folderPathMenu($addElemLabel=null, $addElemUrl=null)
{
//Affiche le chemin d'un dossier ET/OU L'option d'ajout d'élement
if(Ctrl::$curContainer->isRootFolder()==false || !empty($addElemLabel)){
$vDatas["addElemLabel"]=$addElemLabel;
$vDatas["addElemUrl"]=$addElemUrl;
return Ctrl::getVue(Req::commonPath."VueObjFolderPath.php", $vDatas);
}
MdlFolder::menuTree("move");
}

/*******************************************************************************************
Expand All @@ -119,7 +92,7 @@ public static function vueFolders()
if(empty($vDatas["foldersList"])) {self::$vueFolders="";}
else{
$vDatas["objContainerClass"]=$curFolder::moduleName=="contact" ? "objPerson" : null;
self::$vueFolders=Ctrl::getVue(Req::commonPath."VueObjFolders.php",$vDatas);
self::$vueFolders=Ctrl::getVue(Req::commonPath."VueFolders.php",$vDatas);
}
}
return self::$vueFolders;
Expand Down Expand Up @@ -150,7 +123,7 @@ public static function actionEditFolder()
else
{
$vDatas["curObj"]=$curObj;
static::displayPage(Req::commonPath."VueObjEditFolder.php",$vDatas);
static::displayPage(Req::commonPath."VueFolderEdit.php",$vDatas);
}
}

Expand All @@ -168,14 +141,15 @@ public static function actionEditCategories()
$curObj->editControl();
$_idSpaces=(in_array("allSpaces",Req::param("spaceList"))) ? null : Txt::tab2txt(Req::param("spaceList"));
$curObj->createUpdate("title=".Db::param("title").", description=".Db::param("description").", color=".Db::param("color").", _idSpaces=".Db::format($_idSpaces));
static::lightboxClose();
Ctrl::notify("modifRecorded","success");
header("Location: ?ctrl=".Req::$curCtrl."&action=".Req::$curAction."&objectType=".$MdlObject::objectType);//Toujours recharger la page (mais sans "redir()")
}
//// Liste des objets à afficher (+ nouvel objet) && Liste des espaces de l'user courant && Préfixe des traduction
$vDatas["objectList"]=array_merge($MdlObject::getList(true), [new $MdlObject()]);
$vDatas["categoriesList"]=$MdlObject::getList("edit");
$vDatas["spaceList"]=Ctrl::$curUser->getSpaces();
$vDatas["tradModulePrefix"]=strtoupper($MdlObject::moduleName);
//// Affiche la vue
static::displayPage(Req::commonPath."VueObjEditCategories.php",$vDatas);
static::displayPage(Req::commonPath."VueCategoryEdit.php",$vDatas);
}

/*******************************************************************************************
Expand Down Expand Up @@ -246,20 +220,11 @@ public static function actionAccessRightParentFolder()
}

/*******************************************************************************************
* VUE : AFFICHE LES OPTIONS DE BASE POUR L'ENVOI D'EMAIL (cf. "Tool::sendMail()")
* ACTION : ARBO D'UN DOSSIER A RETOURNER
*******************************************************************************************/
public static function sendMailBasicOptions()
public static function actionFolderTreeBack()
{
return Ctrl::getVue(Req::commonPath."VueSendMailOptions.php");
}

/*******************************************************************************************************************************************
* VUE : AFFICHE LES FICHIERS JOINTS DE L'OBJET (cf. "editDescription()")
*******************************************************************************************************************************************/
public static function attachedFile($curObj=null)
{
$vDatas["curObj"]=$curObj;
return self::getVue(Req::commonPath."VueObjAttachedFile.php",$vDatas);
if(Req::isHost()) {Host::actionFolderTreeBack();}
}

/*******************************************************************************************
Expand Down
4 changes: 2 additions & 2 deletions app/Common/Db.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ private static function objPDO()
if(self::$_objPDO===null){
//Connection PDO
try{
//Utilise l'encodage "utf8mb4" pour les emojis sur mobile ("utf8" pour les versions inférieures à PHP 7 : cf. hosting Free.fr)
//Utilise l'encodage "utf8mb4" pour les emojis sur mobile ("utf8" pour les versions inférieures à PHP 7)
$dbCharset=(version_compare(PHP_VERSION,7,">=")) ? "utf8mb4" : "utf8";
//Aucune DB n'est spécifiée : dbInstall! / Sinon on établit une connexion
if(!defined("db_name") || !db_name) {throw new Exception("dbInstall_dbNameUndefined");}
Expand Down Expand Up @@ -125,7 +125,7 @@ public static function format($text, $options="")
//Formate une date provenant d'un datepicker + timepicker?
if(stristr($options,"datetime")) {$text=Txt::formatDate($text,"inputDatetime","dbDatetime");}
elseif(stristr($options,"date")) {$text=Txt::formatDate($text,"inputDate","dbDate");}
//Renvoie le résultat filtré par pdo (trim, addslashes, délimite par des quotes, etc)
//Retourne le résultat filtré par pdo (trim, addslashes, délimite par des quotes, etc)
return (stristr($options,"noquotes")) ? $text : self::objPDO()->quote($text);
}
}
Expand Down
Loading

0 comments on commit cad197a

Please sign in to comment.