Skip to content
Snippets Groups Projects
Select Git revision
  • f33d9b8a534dbb9df622ae6644fadb8febe77ad3
  • pre-2.1b default protected
  • pre-2.1
  • pre-2.0
  • testTag
  • pre2.1b
6 results

functions.php

Blame
  • functions.php 17.40 KiB
    <?php
    // Cette fonctions permettra de récupérer des variables propres au panel
    function VBcmsGetSetting($setting){
        global $bdd;
        
        $response = $bdd->prepare("SELECT value FROM `vbcms-settings` WHERE name = ?");
        $response->execute([$setting]);
        return $response->fetchColumn();
    }
    
    function loadModule($type, $moduleAlias, $moduleParams){
    	global $bdd;
    
    	// On va enregistrer l'évènement
    	$response = $bdd->prepare("INSERT INTO `vbcms-events` (id,date,module,content,url,ip) VALUES (?,?,?,?,?,?)");
    	$response->execute([null, date("Y-m-d H:i:s"), $moduleAlias, "loadModule($type, $moduleAlias, ".json_encode($moduleParams).")", $GLOBALS['http']."://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]", $GLOBALS['ip']]);
    
    	if ($type=="client") {
            if($moduleAlias != "none"){
                // Dans un premier temps on va regarder si un module gère l'index
                $isExistAModuleHandleClientRoot = $bdd->query("SELECT * FROM `vbcms-activatedExtensions` WHERE clientAccess='' AND type='module'")->fetch(PDO::FETCH_ASSOC);
    
                if(!empty($isExistAModuleHandleClientRoot)){
                    // Un modèle gère l'index
                    // On va donc l'appeler pour savoir s'il gère cette url
    
                    $rootModuleParameters = $moduleParams; // Je duplique la liste des paramètres pour ce module
                    array_unshift($rootModuleParameters,$moduleAlias); // Et je lui ajoute en premier ce que cette fonction considère comme un alias
                    // J'ai fais ça car vu que ce module gère la racine de l'url, elle n'a pas d'alias. Donc le premier paramètre n'est pas un alias.
    
                    $calledmodule = new module($isExistAModuleHandleClientRoot["name"]);
                    $calledmodule->call($rootModuleParameters, $type); // Ressort simplement 404 s'il ne gère pas cette page
                    $modulePageContent = ob_get_clean(); // Je récupère la sortie pour ensuite la comparer
    
                    if($modulePageContent == "404"){
                        // Ce module ne gère donc pas l'url
    
                        // On va donc vérifier s'il existe un module qui gère cet alias
                        $response = $bdd->prepare("SELECT * FROM `vbcms-activatedExtensions` WHERE clientAccess=? AND type='module'");
                        $response->execute([$moduleAlias]);
                        $response = $response->fetch(PDO::FETCH_ASSOC);
                        
                        if(!empty($response)){
                            // Il existe, on va donc l'appeler
                            $calledmodule = new module($response["name"]);
                            $calledmodule->call($moduleParams, $type);
                            $modulePageContent = ob_get_clean(); // Pour récupérer la sortie
                            if($modulePageContent == "404"){
                                // On va afficher sa page 404 si l'extension renvoie 404
                                array_unshift($moduleParams, "404"); // On ajoute 404 en premier afin que l'ext affiche la page 404
                                $calledmodule->call($moduleParams, $type);
                            } else {
                                echo $modulePageContent;
                            }
                        } else {
                            // Aucune extension ne gère ce lien, on va donc appeler la page 404 de l'extension gérant cet alias
                            array_unshift($moduleParams, "404"); // On ajoute 404 en premier afin que l'ext affiche la page 404
                            $calledmodule->call($moduleParams, $type);
                        }
                    } else {
                        echo $modulePageContent;
                    }
                } else {
                    // Aucune extension ne gère l'index
                    // On va donc vérifier s'il existe un module qui gère cet alias
                    $response = $bdd->prepare("SELECT * FROM `vbcms-activatedExtensions` WHERE clientAccess=? AND type='module'");
                    $response->execute([$moduleAlias]);
                    $response = $response->fetch(PDO::FETCH_ASSOC);
                    
                    if(!empty($response)){
                        // Il existe, on va donc l'appeler
                        $calledmodule = new module($response["name"]);
                        $modulePageContent = $calledmodule->call($moduleParams, $type);
                        if($modulePageContent == "404"){
                            // On va afficher sa page 404 si l'extension renvoie 404
                            array_unshift($moduleParams, "404"); // On ajoute 404 en premier afin que l'ext affiche la page 404
                            $calledmodule->call($moduleParams, $type);
                        } else {
                            echo $modulePageContent;
                        }
                    } else {
                        // Aucune extension ne gère cet alias
                        if(empty($moduleAlias)) include $GLOBALS['vbcmsRootPath'].'/vbcms-core/defaultPages/index.php';
                        else show404($type);
                    }
                }
            } else show404($type);
            
    	} elseif($type=="admin") {
            if($moduleAlias != "none"){
                // On cherche le module correspondant à l'alias adminAccess dans la liste des modules activés
                $response = $bdd->prepare("SELECT * FROM `vbcms-activatedExtensions` WHERE adminAccess=? AND type='module'");
                $response->execute([$moduleAlias]);
                $response = $response->fetch(PDO::FETCH_ASSOC);
    
                if (!empty($response)) {
                    //include $GLOBALS['vbcmsRootPath'].'/vbcms-content/modules'.$response["path"]."/pageHandler.php"; // Le module appelé va se charger du reste
                    $calledmodule = new module($response["name"]);
                    $calledmodule->call($moduleParams, $type);
                } else {
                    show404($type);
                }
            } else show404($type);
    	}
    }
    
    
    
    // Cette fonction permet la traduction des textures en fcontion de la langue utilisée par l'utilisateur
    function translate($index){
        global $bdd;
        // Peut probable, mais il se peut que la langue n'ai pas été définie plus tôt
        if(!isset($_SESSION["language"])){
            $geoPlugin_array = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip=' . $_SERVER['REMOTE_ADDR']) );
            $_SESSION["language"] = $geoPlugin_array['geoplugin_countryCode'];
        }
    
        $language = $_SESSION["language"];
        switch ($language) {
            case "FR":
                include $GLOBALS['vbcmsRootPath'].'/vbcms-content/translations/FR.php';
                break;
            case "EN":
                include $GLOBALS['vbcmsRootPath'].'/vbcms-content/translations/EN.php';
                break;
            default:
                include $GLOBALS['vbcmsRootPath'].'/vbcms-content/translations/FR.php';
                break;
        }
    
        // En gros, s'il existe une traduction, on la récupère
        if(isset($translation[$index])) $response = $translation[$index];
        else {
            // Sinon on suppose que c'est une traduction d'un module
            // Et donc on va la chercher
            $response = $bdd->query("SELECT * FROM `vbcms-activatedExtensions`");
            $activatedExtensions = $response->fetchAll(PDO::FETCH_ASSOC);
            foreach ($activatedExtensions as $activatedExtension){
                $ext = new module($activatedExtension["name"]);
                $extTrsl = $ext->getTranslationFile($language);
                if(!empty($extTrsl)) include $extTrsl;
                if(isset($translation[$index])) return $translation[$index];
            }
        }
        
        // S'il n'y a vraiment rien....
        if(!isset($translation[$index])) $response = $translation["unknownTranslation"];
        return $response;
    }
    
    function show404($type){
    	if ($type=="client") {
    		// Affiche la page 404 du site client
            // A savoir que les pages 404 des modules sont gérées par ces derniers
    		include $GLOBALS['vbcmsRootPath'].'/vbcms-core/defaultPages/404.php';
            
    	} elseif($type=="admin") {
            // A REFAIRE
            
    		global $bdd;
    		// Affiche la page 404 du panel admin
            include $GLOBALS['vbcmsRootPath']."/vbcms-admin/404.php";
            
    	}
    }
    
    function checkVBcmsUpdates(){
        global $bdd;
        $vbcmsVer = VBcmsGetSetting('vbcmsVersion');
        $currentUpdateCanal = VBcmsGetSetting('updateCanal');
    
        if($currentUpdateCanal == "dev"){
            $updateUrl = "https://api.github.com/repos/SofianeLasri/VBcms-2.0/commits";
        }else{
            $updateUrl = "https://api.github.com/repos/SofianeLasri/VBcms-2.0/releases"; 
        }
    
        $options  = array('http' => array('user_agent' => 'VBcms Updater'));
        $context  = stream_context_create($options);
    
        $updateInfos = file_get_contents($updateUrl, true, $context);
        if(isJson($updateInfos)){
            // On le fait ici et pas avant car on souhaite recommencer si l'on ne reçoit pas du JSON 
            $response = $bdd->prepare("UPDATE `vbcms-settings` SET `value` = ? WHERE `vbcms-settings`.`name` = 'lastUpdateCheck'");
            $response->execute([date("Y-m-d H:i:s")]);
    
            $updateInfosData = json_decode($updateInfos, true);
            unset($updateInfos);
    
            if(!empty($updateInfosData)){
                $VBcmsDateFormat = 'Y-m-d H:i:s';
                $VBcmsActualUpdateCreationDate = new DateTime(VBcmsGetSetting('updateCreationDate'));
    
                if($currentUpdateCanal == "dev"){
                    $remoteUpdateDate = new DateTime($updateInfosData[0]['commit']['author']['date']);
                    $updateInfos['name'] = "Commit ".substr($updateInfosData[0]['sha'], 0, 7);
                    $updateInfos['description'] = $updateInfosData[0]['commit']['message'];
                    $updateInfos['date'] = $remoteUpdateDate->format("Y-m-d H:i:s");
                    $updateInfos['zip'] = "https://api.github.com/repos/SofianeLasri/VBcms-2.0/zipball";
                    $updateInfos['type'] = "dev";
                }else{
                    $remoteUpdateDate = new DateTime($updateInfosData[0]['published_at']);
                    $updateInfos['name'] = $updateInfosData[0]['name'];
                    $updateInfos['description'] = $updateInfosData[0]['body'];
                    $updateInfos['date'] = $remoteUpdateDate->format("Y-m-d H:i:s");
                    $updateInfos['zip'] = $updateInfosData[0]['zipball_url'];
                    if($updateInfosData[0]['prerelease']) $updateInfos['type'] = "nightly";
                    else $updateInfos['type'] = "stable";
                    
                }
                
                if($remoteUpdateDate > $VBcmsActualUpdateCreationDate){
    
                    $response = $bdd->query("UPDATE `vbcms-settings` SET `value` = 0 WHERE `vbcms-settings`.`name` = 'upToDate'");
            
                    $response = $bdd->query("SELECT COUNT(*) FROM `vbcms-notifications` WHERE origin = '[\"vbcms-updater\", \"notifyUpdate\"]'")->fetchColumn();
                    if ($response!=1) {
                        $response = $bdd->prepare("INSERT INTO `vbcms-notifications` (`id`, `origin`, `link`, `content`, `dismissible`, `date`, `userId`) VALUES (NULL, '[\"vbcms-updater\", \"notifyUpdate\"]', '/vbcms-admin/updater\"', ?, '0', ?, 0)");
                        $response->execute([translate("isNotUpToDate"), date("Y-m-d H:i:s")]);
                    }
                    return $updateInfos;
                } else {
                    $response = $bdd->query("UPDATE `vbcms-settings` SET `value` = 1 WHERE `vbcms-settings`.`name` = 'upToDate'");
                    $bdd->query("DELETE FROM `vbcms-notifications` WHERE origin = '[\"vbcms-updater\", \"notifyUpdate\"]'");
                    return false;
                }
            } else {
                $response = $bdd->query("UPDATE `vbcms-settings` SET `value` = 1 WHERE `vbcms-settings`.`name` = 'upToDate'");
                $bdd->query("DELETE FROM `vbcms-notifications` WHERE origin = '[\"vbcms-updater\", \"notifyUpdate\"]'");
                return false;
            }
        } else {
            return false;
        }
    }
    
    // Petites fonctions utiles
    function isJson($string) {
    	json_decode($string);
    	return (json_last_error() == JSON_ERROR_NONE);
    }
    
    function getRandomString($length) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        return $randomString;
    }
    
    function tableExist($tableName){
        global $bdd;
        try{
            $response = $bdd->query("SELECT 1 FROM $tableName LIMIT 1"); // Aîe les injections SQL, ça va qu'ici c'est interne
        } catch(Exception $e){
            return false;
        }
        return $response !== FALSE; // Retourne l'objet si != faux
    }
    
    // Fonctions pour la barre de naviguation admin
    function adminNavbarAddCategory($moduleName, $title){
        global $bdd;
        $position = 1+($bdd->query("SELECT position FROM `vbcms-adminNavbar` ORDER BY position DESC LIMIT 1")->fetchColumn());
        $response = $bdd->prepare("INSERT INTO `vbcms-adminNavbar` (id, parentId, position, parentPosition, value1, value2, value3) VALUES (?,?,?,?,?,?,?)");
        $response->execute([null, 0, $position, 0, $moduleName, $title, ""]);
    }
    function adminNavbarAddItem($moduleName, $icon, $name, $link){
        global $bdd;
        $response = $bdd->prepare("SELECT * FROM `vbcms-adminNavbar` WHERE value1 = ? AND parentPosition = 0"); // Je récupère l'id du dossier parent
        $response->execute([$moduleName]);
        $parentInfos = $response->fetch(PDO::FETCH_ASSOC);
    
        $response = $bdd->prepare("SELECT parentPosition FROM `vbcms-adminNavbar` WHERE parentId = ? ORDER BY parentPosition DESC LIMIT 1"); // Je récupère l'id du dossier parent
        $response->execute([$moduleName]);
        $parentPosition = 1+ $response->fetchColumn();
    
    
        $response = $bdd->prepare("INSERT INTO `vbcms-adminNavbar` (id, parentId, position, parentPosition, value1, value2, value3) VALUES (?,?,?,?,?,?,?)");
        $response->execute([null, $parentInfos["id"], $parentInfos["position"], $parentPosition, $icon, $name, $link]);
    }
    
    // Permet de vérifier qu'un utilisateur a bien les permissions pour visualiser ou effectuer une tâche
    function verifyUserPermission($userId, $extensionName, $permission){
        global $bdd;    
        // On va récupérer les infos de l'utilisateur
        $userInfos = $bdd->prepare("SELECT * FROM `vbcms-users` WHERE id=?");
        $userInfos->execute([$userId]);
        $userInfos = $userInfos->fetch(PDO::FETCH_ASSOC);
    
        // On va vérifier s'il a des perms à part
        $usersPerms = $bdd->prepare("SELECT * FROM `vbcms-usersPerms` WHERE userId=? AND extensionName=? AND permission=?");
        $usersPerms->execute([$userId, $extensionName, $permission]);
        $hasPerm = $usersPerms->fetch(PDO::FETCH_ASSOC);
        
        if(empty($hasPerm)){
            // Il n'a pas de perms à part
            // On va maintenant vérifier avec le groupe
            return verifyGroupPermission($userInfos['groupId'], $extensionName, $permission);
        }else{
            $perms = json_decode($perms, true);
            if($perms[$action]) return true;
            else return false;
        }
    }
    
    function verifyGroupPermission($groupId, $extensionName, $permission){
        global $bdd; 
        // On va récupérer les infos du groupe
        $groupInfos = $bdd->prepare("SELECT * FROM `vbcms-userGroups` WHERE groupId=?");
        $groupInfos->execute([$groupId]);
        $groupInfos = $groupInfos->fetch(PDO::FETCH_ASSOC);
    
        // Et maintenant les perms
        if(!empty($groupInfos)){
            if($groupInfos['groupName'] == "superadmins") return true; // Les superadmins ont tous les droits, pas besoin de spécifier leur perms
    
            $groupsPerms = $bdd->prepare("SELECT * FROM `vbcms-groupsPerms` WHERE groupId=? AND extensionName=? AND permission=?");
            $groupsPerms->execute([$groupInfos['groupId'], $extensionName, $permission]);
            $hasPerm = $groupsPerms->fetch(PDO::FETCH_ASSOC);
            if(!empty($hasPerm)) return true;
            else return false; // N'a pas la perm
        } else return false; // Le groupe n'existe pas, donc pas de perm
    }
    
    function getVBcmsPermissions(){
        include $GLOBALS['vbcmsRootPath'].'/vbcms-core/permissions.php';
        return $permissions;
    }
    
    // https://gist.github.com/gserrano/4c9648ec9eb293b9377b
    function recursive_copy_if_different($src,$dst) {
        $dir = opendir($src);
        @mkdir($dst);
        while(( $file = readdir($dir)) ) {
            if (( $file != '.' ) && ( $file != '..' )) {
                if ( is_dir($src . '/' . $file) ) {
                    recursive_copy_if_different($src .'/'. $file, $dst .'/'. $file);
                } else {
                    if(file_exists($dst .'/'. $file)){
                        if(hash_file('md5', $dst .'/'. $file)!=hash_file('md5', $src .'/'. $file)){
                            copy($src .'/'. $file,$dst .'/'. $file);
                        }
                    }else {
                        copy($src .'/'. $file,$dst .'/'. $file);
                    }
                }
            }
        }
        closedir($dir);
    }
    
    /////////////////////////////////
    // FONCTIONS DES MODULES DE BASES
    /////////////////////////////////
    
    function openFilemanager($mode, $parameters = array()){
        // Mode pour client ou admin, mais c'est pas encore prévu pour les clients
        // Parameters est une liste
        global $bdd;
        $filemanagerAssoc = $bdd->query("SELECT extensionName FROM `vbcms-baseModulesAssoc`")->fetchColumn();
        if(empty($filemanagerAssoc)){
            return VBcmsGetSetting("websiteUrl").'/vbcms-core/defaultPages/ext404.php';
        }else{
            $filemanagerExt = $bdd->prepare("SELECT * FROM `vbcms-activatedExtensions` WHERE name = ?");
            $filemanagerExt->execute([$filemanagerAssoc]);
            $filemanagerExt=$filemanagerExt->fetch(PDO::FETCH_ASSOC);
    
            $callParams[1] = "openFilemanager";
            $callParams[2] = json_encode($parameters);
    
            $filemanagerModule = new module($filemanagerExt["name"]);
            $filemanagerModule->call($callParams, 'admin');
    
        }
    }