Commit f883fa86 authored by robin banquo's avatar robin banquo

transfert vers framasoft

parents
# Enable rewrite engine and route requests to framework
RewriteEngine On
# Some servers require you to specify the `RewriteBase` directive
# In such cases, it should be the path (relative to the document root)
# containing this .htaccess file
#
RewriteBase /
RewriteRule ^(tmp)\/|\.ini$ - [R=404]
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L,QSA]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
# F3-easyShowcaseSiteCMS
\ No newline at end of file
[globals]
DEBUG=3
UI=app/views/
AUTOLOAD=app/controllers/;app/fixtures/
[
{
"name": "Standard",
"title": {
"name": "Roboto",
"cdn": "https://fonts.googleapis.com/css?family=Roboto",
"css1": "Roboto",
"css2": "sans-serif"
},
"main": {
"name": "Roboto",
"cdn": "https://fonts.googleapis.com/css?family=Roboto",
"css1": "Roboto",
"css2": "sans-serif"
}
},
{
"name": "Elegance",
"title": {
"name": "Open Sans",
"cdn": "https://fonts.googleapis.com/css?family=Open+Sans",
"css1": "Open Sans",
"css2": "sans-serif"
},
"main": {
"name": "Raleway",
"cdn": "https://fonts.googleapis.com/css?family=Raleway",
"css": "Raleway",
"css2": "sans-serif"
}
},
{
"name": "handy",
"title": {
"name": "Walter Turncoat",
"cdn": "https://fonts.googleapis.com/css?family=Walter+Turncoat",
"css1": "Walter Turncoat",
"css2": "cursive"
},
"main": {
"name": "Delius Swash Caps",
"cdn": "https://fonts.googleapis.com/css?family=Delius+Swash+Caps",
"css1": "Delius Swash Caps",
"css2": "cursive"
}
},
{
"name": "Pro",
"title": {
"name": "Maven Pro",
"cdn": "https://fonts.googleapis.com/css?family=Maven+Pro",
"css1": "Maven Pro",
"css2": "sans-serif"
},
"main": {
"name": "Maven Pro",
"cdn": "https://fonts.googleapis.com/css?family=Maven+Pro",
"css1": "Maven Pro",
"css2": "sans-serif"
}
},
{
"name": "Nerd",
"title": {
"name": "Maven Pro",
"cdn": "https://fonts.googleapis.com/css?family=Cabin+Sketch",
"css1": "Cabin Sketch",
"css2": "cursive"
},
"main": {
"name": "Maven Pro",
"cdn": "https://fonts.googleapis.com/css?family=Fira+Mono",
"css1": "Fira Mono",
"css2": "monospace"
}
},
{
"name": "Soft",
"title": {
"name": "Poiret One",
"cdn": "https://fonts.googleapis.com/css?family=Poiret+One",
"css1": "Poiret One",
"css2": "cursive"
},
"main": {
"name": "Roboto",
"cdn": "https://fonts.googleapis.com/css?family=Roboto",
"css1": "Roboto",
"css2": "sans-serif"
}
},
{
"name": "Tea Times",
"title": {
"name": "Spectral SC",
"cdn": "https://fonts.googleapis.com/css?family=Spectral+SC",
"css1": "Spectral SC",
"css2": "serif"
},
"main": {
"name": "Crimson Text",
"cdn": "https://fonts.googleapis.com/css?family=Crimson+Text",
"css1": "Crimson Text",
"css2": "serif"
}
},
{
"name": "Bungee",
"title": {
"name": "Bungee Inline",
"cdn": "https://fonts.googleapis.com/css?family=Bungee+Inline",
"css1": "Bungee Inline",
"css2": "cursive"
},
"main": {
"name": "Offside",
"cdn": "https://fonts.googleapis.com/css?family=Offside",
"css1": "Offside",
"css2": "cursive"
}
}
]
[routes]
;SHOW ROUTES
;Accès au site en tant que visiteur
GET @main: /=ShowcaseController->showVisitor
;acces au site en mode éditeur
GET @admin: /admin=ShowcaseController->ShowAdmin
; AUTH ROUTES
;page du formulaire de login
GET @login: /login=AdminController->login
;page du formulaire de login
GET @logout: /logout=AdminController->logout
;Requeque d'authentification
POST /authenticate=AdminController->authenticate
; AUTH ROUTES
;page du formulaire de login
GET @error: /error=AdminController->error
;EDIT ROUTES
;Requete d'ajout de section
POST /admin/edit/add_section=EditController->addSection
;requete de suppression de section
GET /admin/edit/delete_section=EditController->deleteSection
;requete de déplacement d'une section vers le haut de la page
GET /admin/edit/move_up=EditController->MoveUpSection
;requete de déplacement d'une section vers le bas de la page
GET /admin/edit/move_down=EditController->MoveDownSection
;requete d'ajout d'une section au menu
POST /admin/edit/add_to_menu=EditController->addToMenu
;requete de désupression d'une section au menu
GET /admin/edit/remove_from_menu=EditController->RemoveFromMenu
;methode un peu brutale qui viens mettre a jour la structure par
;rapport a tout les changement de l'utilisateur sur les modules
POST /admin/edit/save-modifs=EditController->SaveUglyForm
;METHODES AJAX
;methode Ajax pour recevoir un media, le stocker puis renvoyer son path
POST /admin/edit/add-media-to-librairie=EditController->addMediaTolibrary
;methode Ajax pour supprimer un media,
GET /admin/edit/delete-media=EditController->deleteMedia
;methode Ajax pour editer le label d'un média,
POST /admin/edit/edit-media-info=EditController->editMediaInfo
;methode Ajax pour editer le theme du site,
POST /admin/edit/edit-theme=EditController->editTheme
;methode Ajax pour editer les polices du site,
POST /admin/edit/edit-font=EditController->editFont
POST /admin/edit/edit-params=EditController->editParams
\ No newline at end of file
{
"Classic": {
"name": "Classic",
"menu_background": "#FFFFFF",
"main_background": "#FFFFFF",
"main_color": "#444444",
"contrasted_color": "#FFFFFF",
"second_background": "#009688",
"second_color": "#795548"
},
"Darkly": {
"name": "Darkly",
"menu_background": "#131313",
"main_background": "#232323",
"main_color": "#d9c4ae",
"contrasted_color": "#ff9300",
"second_background": "#131313",
"second_color": "#ff900d"
},
"Matrix": {
"name": "Matrix",
"menu_background": "#1b1918",
"main_background": "#2a2a2a",
"main_color": "#189001",
"contrasted_color": "#ffd000",
"second_background": "#2a251f",
"second_color": "#43c816"
},
"Soft": {
"name": "Soft",
"menu_background": "#96adc7",
"main_background": "#f6f6f6",
"main_color": "#6e6e6e",
"contrasted_color": "#f6f6f6",
"second_background": "#96a9c7",
"second_color": "#596783"
},
"Pinky": {
"name": "Pinky",
"menu_background": "#F9F0F2",
"main_background": "#F9F0F2",
"main_color": "#1C2228",
"contrasted_color": "#FF4081",
"second_background": "#1C2228",
"second_color": "#FF4081"
},
"Frama": {
"name": "Frama",
"menu_background": "#eeeeee",
"main_background": "#FFFFFF",
"main_color": "#616161",
"contrasted_color": "#EB7239",
"second_background": "#C48A1B",
"second_color": "#6A5687"
},
"Deep Blue": {
"name": "Deep Blue",
"menu_background": "#000515",
"main_background": "#07143c",
"main_color": "#ed9e3f",
"contrasted_color": "#dadfe8",
"second_background": "#000515",
"second_color": "#3c529f"
},
"Green Wash": {
"name": "Green Wash",
"menu_background": "#dabe27",
"main_background": "#b3e27a",
"main_color": "#062e00",
"contrasted_color": "#b3e27a",
"second_background": "#51c71c",
"second_color": "#977700"
},
"Grav": {
"name": "Grav",
"menu_background": "#3b3b3b",
"main_background": "#FFFFFF",
"main_color": "#2A3A42",
"contrasted_color": "#FFFFFF",
"second_background": "#96C7A2",
"second_color": "#458B77"
},
"Electric": {
"name": "Electric",
"menu_background": "#141414",
"main_background": "#1d1d1d",
"main_color": "#5753a8",
"contrasted_color": "#ffffff",
"second_background": "#111111",
"second_color": "#0300ff"
},
"Aphrodite": {
"name": "Aphrodite",
"menu_background": "#410000",
"main_background": "#1f1717",
"main_color": "#edd17c",
"contrasted_color": "#f6bf86",
"second_background": "#1f1717",
"second_color": "#ffa203"
},
"Tasty": {
"name": "Tasty",
"menu_background": "#a46213",
"main_background": "#f3eadc",
"main_color": "#4f3114",
"contrasted_color": "#242424",
"second_background": "#8a5728",
"second_color": "#ff8a00"
}
}
<?php
/***************************
* Class AdminController
* Classe gérant l'authentification de l'utilisateur et l'affichage de la page de login
*/
class AdminController extends Controller {
// affichage de la page login
function login() {
//si l'utilisateur est connecté comme admin
if ($this->isAdmin()) {
//on le renvoi direct sur la page admin
$this->f3->reroute('/admin');
} else {
//sinon on rends le template de login
$siteOptions = $this->getSiteOptions();
$this->f3->set('siteOptionsJson',json_encode($siteOptions));
$this->f3->set('siteOptions',$siteOptions);
$template=new Template;
echo $template->render('login.htm');
}
}
// methode de deconnexion
function logout() {
if ($this->isAdmin()) {
//on vire l'user de la session
$this->f3->set('SESSION.user',"");
}
$this->f3->reroute('/');
}
// affichage de la page login
function error() {
//sinon on rends le template de login
$template=new Template;
echo $template->render('error.htm');
}
//méthode d'autentification
function authenticate() {
//on recupere le login/mot de passe passé en variables post
$username=$this->f3->get('POST.username');
$password=$this->f3->get('POST.password');
//si le nom d'utilisateur coreespond a celui rentré en variable globale grace au fichier config( voir le constructeur de controller)
if ($username===$this->f3->get('user_id') AND
//et si le passord est correct
password_verify($password,$this->f3->get('password'))) {
//on entre le nom d'utilisateur en session
$this->f3->set('SESSION.user',$this->f3->get('user_id'));
//et on reroute vers la page d'admin
$this->f3->reroute('/admin');
} else {
//sinon, on transmet un message d'erreur et on renvoie vers la page de login
$this->f3->set('SESSION.loginPageMessage',
"Nom d'utilisateur ou mot de passe invalide");
$this->f3->reroute('/login');
}
}
}
\ No newline at end of file
<?php
//! controler de base, dont héritent tout les autres
class Controller {
protected $db;//reference a la base de donnée
protected $f3;//objet de base du fate free framework
public $siteName = "framasite";//nom du site
// TODO : c'est cette variable qu'il faudra rendre dynamique pour switcher d'un site a l'autre
//! HTTP route pre-processor
//! HTTP route post-processor
function afterroute() {
}
//! Instantiate class
function __construct() {
//on recuper la base du framework
$this->f3 = Base::instance();
//on viens récuperer les info a partir du info.json
$siteConfig=json_decode(file_get_contents('sites/'.$this->siteName.'/config.json'),TRUE);
//on recuper le fichier config spécifique au site regardé
foreach ($siteConfig as $key=>$value){
$this->f3->set($key, $value);
}
if($this->isAdmin()){
//si l'user est admin, on commence par passer cette variable a true,
// elle sera utilisée un peu partout par la suite
$this->f3->set('isAdmin', true);
}
// on finit par connecter a la base de donnée du site de manière dynamique
$this->db = new \DB\Jig ( $_SERVER["DOCUMENT_ROOT"].'/sites/'.$this->siteName.'/data/' , $format = \DB\Jig::FORMAT_JSON );
}
/**********
* Methode permettant de verifier si l'utilisateur courant est admin du site
* @return bool
*/
function isAdmin(){
return $this->f3->get('SESSION.user') === $this->f3->get('user_id') ;
}
/**************************
* Methode de récuperation de la structure du site de l'utilisateur a partir de sa bdd en flat file
* @return array
*/
function getSiteStructure(){
//on recuper l'entrée dans la base
$siteStructure = $this->db->read('siteStructure.json');
//on commence par vérifier si il y a bien quelquechose en base
if(empty($siteStructure)){//si c'est vide on fait l'opération d'initialisation
$this->initStructure();
//on renvoie la valeur
return $this->db->read('siteStructure.json');
}else{
//sinon, on renvoie direct la valeur
return $siteStructure;
}
}
//opération d'initialisation lorsque la structure du site est vide
function initStructure(){
//on vient utiliser la methode siteMap de l'objet fixtures qui renvoie une page type
$fixtures = new Fixtures();
$siteStructure = $fixtures->siteMap();
//et on l'enregistre dans notre bdd
$this->db->write('siteStructure.json',$siteStructure);
}
/**************************
* Methode de récuperation des options du site de l'utilisateur a partir de sa bdd en flat file
* @return array
*/
function getSiteOptions(){
//on recuper l'entrée dans la base
$siteOptions = $this->db->read('siteOptions.json');
//on commence par vérifier si il y a bien quelquechose en base
if(empty($siteOptions)){//si c'est vide on fait l'opération d'initialisation
$this->initOptions();
//on renvoie la valeur
return $this->db->read('siteOptions.json');
}else{
//sinon, on renvoie direct la valeur
return $siteOptions;
}
}
//opération d'initialisation lorsque la structure du site est vide
function initOptions(){
//on vient utiliser la methode siteMap de l'objet fixtures qui renvoie une page type
$fixtures = new Fixtures();
$siteOptions = $fixtures->siteOptions();
//et on l'enregistre dans notre bdd
$this->db->write('siteOptions.json',$siteOptions);
}
/****************
* methode permettant de recuperer la liste des modules possibles
*/
function getModuleList(){
//on ititialise un tableau de résultat
$modulesList=array();
//on viens récuperer la liste des modules dispo directement dans le dossier
// (comme ca pas besoin d'avoir a les déclarer, plus simple pour d'eventuels modders)
$modulesFolderItems=scandir(__DIR__.'/../views/modules/');
//on initialise un array de resultat
$modules=array();
//pourr tout ce qui a été récuperé
foreach ($modulesFolderItems as $item) {
//on ne selectionne que les dossier qui commence pas par "."
if ($item[0]!=='.') {
//et on les rentre dans notre liste de modules
array_push($modules,$item);
}
}
//pour chaques modules,
foreach ($modules as $module) {
//on viens récuperer les info a partir du info.json
$moduleInfo=
json_decode(file_get_contents(__DIR__.'/../views/modules/'.$module.
'/info.json'),TRUE);
//et on les rentre dans notre tableau résultat
array_push($modulesList,$moduleInfo);
}
//puis on passe le tableau résultat en variable globale
$this->f3->set('modulesList',$modulesList);
return $modules;
}
//methode servant dans le middleware
function checkAdminOrReroute(){
if (!$this->isAdmin()) {
//on rajoute un petit message d'erreur qui sera affiché sur la page de login
$this->f3->set('SESSION.loginPageMessage',
"vous devez vous authentifier pour accéder au options d'administration");
//puis on renvoie vers la page de login
$template=new Template;
echo $template->render('login.htm');
}
}
function getSafeGET($name){
return htmlentities($this->f3->get('GET')[$name]);
}
function getSafePOST($name){
return htmlentities($this->f3->get('POST')[$name]);
}
//methode permettant de transmettre au script js de gestion de
// la bibliotheque d'image le contenu de la table file au format json
function getMediasList() {
$mediasList=$this->db->read('siteMedias.json');
$this->f3->set('mediasList',json_encode($mediasList));
return $mediasList;
}
function getThemesList(){
$themesList = json_decode(file_get_contents(__DIR__.'/../config/themes.json'),TRUE);
$this->f3->set('themesList',json_encode($themesList));
return $themesList;
}
function getFontsList(){
$fontsList = json_decode(file_get_contents(__DIR__.'/../config/fonts.json'),TRUE);
$this->f3->set('fontsList',json_encode($fontsList));
return $fontsList;
}
}
\ No newline at end of file
This diff is collapsed.
<?php
//! Front-end processor
class ShowCaseController extends Controller {
function beforeroute() {
if($this->isAdmin()){
$CSRFToken =bin2hex(random_bytes(16));
$CSRFTokenCreatetedAt= time();
$this->f3->set('SESSION.CSRFToken', $CSRFToken);
$this->f3->set('SESSION.CSRFTokenCreatedAt', $CSRFTokenCreatetedAt);
$this->f3->set('CSRFToken', $CSRFToken);
}
}
//affichage du contenu de la page pour les visiteurs
function showVisitor() {
//on commence par générer la page
$this->generatePage();
//puis on renvoie le template général
$template=new Template;
echo $template->render('template.htm');
}
//affichage de la page d'administration du site
function showAdmin() {
//on verifie que l'utilisateur est bien un admin
if ($this->isAdmin()) {
//on passe le isAdminPage a true, un petit drapeau bien pratique pour les manip du template
$this->f3->set('isAdminPage',TRUE);
//on génere la page
$this->generatePage();
//on genere les données nécessaires à l'administration du site
$this->generateAdminOnlyData();
//puis on renvoie le template de base
$template=new Template;
echo $template->render('template.htm');
} else {//si il est pas admin, on renvoie vers la page de login avec un message d'erreur
$this->f3->set('SESSION.loginPageMessage',
"vous devez vous authentifier pour accéder au options d'administration");
$this->f3->reroute('/login');
}
}
//methode de génération de la page
function generatePage() {
//on vient récuperer la structure du site telle qu'elle
// 'est initialisé dans le constructeur du controller
$siteStructure=$this->getSiteStructure();
//on la passe dans les variables globales
$this->f3->set('siteStructure',$siteStructure);
//on vient récuperer la structure du site telle qu'elle
// 'est initialisé dans le constructeur du controller
$siteOptions=$this->getSiteOptions();
//on la passe dans les variables globales en version json et en version normale
$this->f3->set('siteOptionsJson',json_encode($siteOptions));
$this->f3->set('siteOptions',$siteOptions);
//et on lance la methode d'import des differents fichier js des modules
$this->importJs();
}
//methode d'import des differents fichier js des modules
//l'idée est de ne pas importer plusieur fois le meme fichier js
function importJs() {
//on recuper la structure su site
$siteStructure=$this->f3->get('siteStructure');
//on initialise un tableau de resultats
$jsArray=array();
//pour chacunes des section du site
foreach ($siteStructure as $section) {
//si le module n'est pas encore dans le tableau résultat
if (!in_array($section['module'],$jsArray)) {
//on l'y insere
array_push($jsArray,$section['module']);
}
}
//puis on passe notre liste de nom de modules en variable globale