Commit 0d7527f3 authored by Thomas Citharel's avatar Thomas Citharel

Merge branch 'update-project' into 'master'

Update project

Closes #108

See merge request !39
parents ad936c83 562b93bc
vendor
tmp
app/config/config.ini
sites/*
\ No newline at end of file
......@@ -4,127 +4,138 @@
* Class AdminController
* Classe gérant l'authentification de l'utilisateur et l'affichage de la page de login
*/
class AdminController extends Controller {
class AdminController extends Controller
{
public function beforeroute()
{
parent::beforeroute();
}
function beforeroute() {
parent::beforeroute();
}
// affichage de la page login
public function login()
{
$this->checkFirstConnexion();
//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);
// affichage de la page login
function login() {
$this->checkFirstConnexion();
//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);
echo (new Template())->render('login.htm');
}
}
echo (new Template())->render('login.htm');
}
}
// affichage de la page signIn
public function signIn()
{
//si l'utilisateur est connecté comme admin
if ($this->isAdmin()) {
//on le renvoi direct sur la page admin
$this->f3->reroute('/admin');
} elseif (count($this->f3->get('admins'))!==0) {
$this->f3->reroute('/login');
} else {
//sinon on rends le template de login
$siteOptions=$this->getSiteOptions();
$this->f3->set('siteOptionsJson', json_encode($siteOptions));
$this->f3->set('siteOptions', $siteOptions);
// affichage de la page signIn
function signIn() {
//si l'utilisateur est connecté comme admin
if ($this->isAdmin()) {
//on le renvoi direct sur la page admin
$this->f3->reroute('/admin');
} elseif (count($this->f3->get('admins'))!==0) {
$this->f3->reroute('/login');
} else {
//sinon on rends le template de login
$siteOptions=$this->getSiteOptions();
$this->f3->set('siteOptionsJson',json_encode($siteOptions));
$this->f3->set('siteOptions',$siteOptions);
echo (new Template())->render('signIn.htm');
}
}
echo (new Template())->render('signIn.htm');
}
}
public function postSignIn()
{
if (count($this->f3->get('admins'))!==0) {
$this->f3->reroute('/login');
}
$username=$this->f3->get('POST.username');
$password=$this->f3->get('POST.password');
$repeatPassword=$this->f3->get('POST.repeatPassword');
function postSignIn() {
if (count($this->f3->get('admins'))!==0) {
$this->f3->reroute('/login');
}
$username=$this->f3->get('POST.username');
$password=$this->f3->get('POST.password');
$repeatPassword=$this->f3->get('POST.repeatPassword');
if ($password!==$repeatPassword) {
$this->f3->set(
'SESSION.signInPageMessage',
"Les 2 mots de passe fournis ne sont pas identiques"
);
$this->f3->reroute('/signIn');
}
$siteConfig=json_decode(
file_get_contents($this->f3->get('SitesFolder').$this->siteName.
'/config.json'),
true
);
$newAdmin=[
"user_id"=>$username,
"password"=>password_hash($password, PASSWORD_DEFAULT)
];
array_push($siteConfig['admins'], $newAdmin);
if ($password!==$repeatPassword) {
$this->f3->set('SESSION.signInPageMessage',
"Les 2 mots de passe fournis ne sont pas identiques");
$this->f3->reroute('/signIn');
}
$siteConfig=json_decode(
file_get_contents($this->f3->get('SitesFolder').$this->siteName.
'/config.json'),
TRUE
);
$newAdmin=[
"user_id"=>$username,
"password"=>password_hash($password,PASSWORD_DEFAULT)
];
array_push($siteConfig['admins'],$newAdmin);
$contenu_json=json_encode($siteConfig);
$contenu_json=json_encode($siteConfig);
// Ouverture du fichier
$fichier=fopen($this->f3->get('SitesFolder').$this->siteName.
'/config.json', 'w+');
// Ecriture dans le fichier
fwrite($fichier, $contenu_json);
// Fermeture du fichier
fclose($fichier);
//on entre le nom d'utilisateur en session
$this->f3->set('SESSION.user', $username);
//et on reroute vers la page d'admin
$this->f3->reroute('/admin');
}
// Ouverture du fichier
$fichier=fopen($this->f3->get('SitesFolder').$this->siteName.
'/config.json','w+');
// Ecriture dans le fichier
fwrite($fichier,$contenu_json);
// Fermeture du fichier
fclose($fichier);
//on entre le nom d'utilisateur en session
$this->f3->set('SESSION.user',$username);
//et on reroute vers la page d'admin
$this->f3->reroute('/admin');
}
// methode de deconnexion
public function logout()
{
$this->checkFirstConnexion();
if ($this->isAdmin()) {
//on vire l'user de la session
$this->f3->set('SESSION.user', "");
}
$this->f3->reroute('/');
}
// methode de deconnexion
function logout() {
$this->checkFirstConnexion();
if ($this->isAdmin()) {
//on vire l'user de la session
$this->f3->set('SESSION.user',"");
}
$this->f3->reroute('/');
}
// affichage de la page login
public function error()
{
//sinon on rends le template de login
echo (new Template())->render('error.htm');
}
// affichage de la page login
function error() {
//sinon on rends le template de login
echo (new Template())->render('error.htm');
}
//méthode d'autentification
public function authenticate()
{
$this->checkFirstConnexion();
//on recupere le login/mot de passe passé en variables post
$username=$this->f3->get('POST.username');
$password=$this->f3->get('POST.password');
$adminNotFound=true;
//si le nom d'utilisateur coreespond a celui rentré en variable globale grace au fichier config( voir le constructeur de controller)
//méthode d'autentification
function authenticate() {
$this->checkFirstConnexion();
//on recupere le login/mot de passe passé en variables post
$username=$this->f3->get('POST.username');
$password=$this->f3->get('POST.password');
$adminNotFound=TRUE;
//si le nom d'utilisateur coreespond a celui rentré en variable globale grace au fichier config( voir le constructeur de controller)
foreach ($this->f3->get('admins') as $admin) {
if ($username===$admin['user_id'] AND
//et si le passord est correct
password_verify($password,$admin['password'])) {
//on entre le nom d'utilisateur en session
$this->f3->set('SESSION.user',$admin['user_id']);
//et on reroute vers la page d'admin
$this->f3->reroute('/admin');
$adminNotFound=FALSE;
}
}
if ($adminNotFound) {
//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');
}
}
foreach ($this->f3->get('admins') as $admin) {
if ($username===$admin['user_id'] and
//et si le passord est correct
password_verify($password, $admin['password'])) {
//on entre le nom d'utilisateur en session
$this->f3->set('SESSION.user', $admin['user_id']);
//et on reroute vers la page d'admin
$this->f3->reroute('/admin');
$adminNotFound=false;
}
}
if ($adminNotFound) {
//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');
}
}
}
......@@ -3,7 +3,6 @@
//! 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
......@@ -15,7 +14,7 @@ class Controller
//on viens récuperer les info a partir du info.json
$siteConfigPath = $this->f3->get('SitesFolder') . $this->siteName . '/config.json';
if (!file_exists($siteConfigPath)) {
$this->f3->error(404);
$this->f3->error(404, "Erreur 404: Site non trouvé");
}
$siteConfig = json_decode(
file_get_contents($siteConfigPath),
......@@ -31,22 +30,23 @@ class Controller
$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 ($this->f3->get('SitesFolder') . $this->siteName . '/data/',
$format = \DB\Jig::FORMAT_JSON);
$this->db = new \DB\Jig(
$this->f3->get('SitesFolder') . $this->siteName . '/data/',
$format = \DB\Jig::FORMAT_JSON
);
}
//! HTTP route post-processor
function afterroute()
public function afterroute()
{
}
//! Instantiate class
function __construct()
public function __construct()
{
//on recuper la base du framework
$this->f3 = Base::instance();
$this->siteName = $this->siteName = isset($_SERVER['X-FRAMA-SITE']) || strstr($_SERVER['SERVER_NAME'], ".frama.site") ? $_SERVER['SERVER_NAME'] : "framasite";
}
/**********
......@@ -54,7 +54,7 @@ class Controller
*
* @return bool
*/
function isAdmin()
public function isAdmin()
{
foreach ($this->f3->get('admins') as $admin) {
if ($this->f3->get('SESSION.user') === $admin['user_id']) {
......@@ -70,7 +70,7 @@ class Controller
*
* @return array
*/
function getSiteStructure()
public function getSiteStructure()
{
//on recuper l'entrée dans la base
$siteStructure = $this->db->read('siteStructure.json');
......@@ -87,7 +87,7 @@ class Controller
}
//opération d'initialisation lorsque la structure du site est vide
function initStructure()
public function initStructure()
{
//on vient utiliser la methode siteMap de l'objet fixtures qui renvoie une page type
$siteStructure = (new Fixtures())->siteMap();
......@@ -100,7 +100,7 @@ class Controller
*
* @return array
*/
function getSiteOptions()
public function getSiteOptions()
{
//on recuper l'entrée dans la base
$siteOptions = $this->db->read('siteOptions.json');
......@@ -117,7 +117,7 @@ class Controller
}
//opération d'initialisation lorsque la structure du site est vide
function initOptions()
public function initOptions()
{
//on vient utiliser la methode siteMap de l'objet fixtures qui renvoie une page type
$siteOptions = (new Fixtures())->siteOptions();
......@@ -128,7 +128,7 @@ class Controller
/****************
* methode permettant de recuperer la liste des modules possibles
*/
function getModuleList()
public function getModuleList()
{
//on ititialise un tableau de résultat
$modulesList = [];
......@@ -154,7 +154,6 @@ class Controller
);
//et on les rentre dans notre tableau résultat
$modulesList[] = $moduleInfo;
}
//puis on passe le tableau résultat en variable globale
$this->f3->set('modulesList', $modulesList);
......@@ -163,7 +162,7 @@ class Controller
}
//methode servant dans le middleware
function checkAdminOrReroute()
public function checkAdminOrReroute()
{
if (!$this->isAdmin()) {
//on rajoute un petit message d'erreur qui sera affiché sur la page de login
......@@ -176,18 +175,18 @@ class Controller
}
}
function getSafeGET($name)
public function getSafeGET($name)
{
return htmlentities($this->f3->get('GET')[$name]);
}
function getSafePOST($name)
public 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()
public function getMediasList()
{
$mediasList = $this->db->read('siteMedias.json');
$this->f3->set('mediasList', json_encode($mediasList));
......@@ -196,7 +195,7 @@ class Controller
return $mediasList;
}
function getThemesList()
public function getThemesList()
{
$themesList = json_decode(file_get_contents(__DIR__ . '/../config/themes.json'), true);
$this->f3->set('themesList', json_encode($themesList));
......@@ -204,7 +203,7 @@ class Controller
return $themesList;
}
function getFontsList()
public function getFontsList()
{
$fontsList = json_decode(file_get_contents(__DIR__ . '/../config/fonts.json'), true);
$this->f3->set('fontsList', json_encode($fontsList));
......@@ -212,7 +211,7 @@ class Controller
return $fontsList;
}
static function imgAlt($imgUrl)
public static function imgAlt($imgUrl)
{
if ($imgUrl) {
$mediaArray = Base::instance()->get('mediasArray');
......@@ -226,10 +225,10 @@ class Controller
return '';
}
function checkFirstConnexion(){
if(count($this->f3->get('admins')) === 0){
$this->f3->reroute('/signIn');
}
}
public function checkFirstConnexion()
{
if (count($this->f3->get('admins')) === 0) {
$this->f3->reroute('/signIn');
}
}
}
This diff is collapsed.
......@@ -3,7 +3,7 @@
//! Front-end processor
class ShowCaseController extends Controller
{
function beforeroute()
public function beforeroute()
{
parent::beforeroute();
if ($this->isAdmin()) {
......@@ -13,12 +13,12 @@ class ShowCaseController extends Controller
$this->f3->set('SESSION.CSRFTokenCreatedAt', $CSRFTokenCreatetedAt);
$this->f3->set('CSRFToken', $CSRFToken);
}
$this->checkFirstConnexion();
$this->checkFirstConnexion();
}
//affichage du contenu de la page pour les visiteurs
function showVisitor()
public function showVisitor()
{
//on commence par générer la page
$this->generatePage();
......@@ -32,11 +32,10 @@ class ShowCaseController extends Controller
} else {
echo $template->render('maintenance.htm');
}
}
//affichage de la page d'administration du site
function showAdmin()
public function showAdmin()
{
//on verifie que l'utilisateur est bien un admin
if ($this->isAdmin()) {
......@@ -53,14 +52,16 @@ class ShowCaseController extends Controller
$template->filter('imgAlt', 'Controller::imgAlt');
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->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()
public function generatePage()
{
//on vient récuperer la structure du site telle qu'elle
// 'est initialisé dans le constructeur du controller
......@@ -84,7 +85,7 @@ class ShowCaseController extends Controller
//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()
public function importJs()
{
//on recuper la structure su site
$siteStructure = $this->f3->get('siteStructure');
......@@ -103,7 +104,7 @@ class ShowCaseController extends Controller
}
//methode de generation des infos complémentaires nécessaires a la page admin
function generateAdminOnlyData()
public function generateAdminOnlyData()
{
$this->getModuleList();
......@@ -112,7 +113,7 @@ class ShowCaseController extends Controller
}
//
function contact()
public function contact()
{
$sectionId = $this->getSafePOST('sectionId');
$mail = $this->getSafePOST('email');
......@@ -123,7 +124,9 @@ class ShowCaseController extends Controller
if ($noRobot === '4' || $noRobot === 'quatre') {
$siteStructure = $this->getSiteStructure();
$section = array_pop(array_filter($siteStructure, function($elem) use ($sectionId) { return $elem["id"] === $sectionId; }));
$section = array_pop(array_filter($siteStructure, function ($elem) use ($sectionId) {
return $elem["id"] === $sectionId;
}));
$destinataire = htmlentities($section['fields']['email']['value']);
$subject = '=?UTF-8?B?' . base64_encode('Nouveau contact de '. $this->siteName . ' : ' .$objet).'?='; // Titre de l'email
$contenu = '<html><head><title>' . 'Nouveau contact de ' . $this->siteName . '</title></head><body>';
......
<?php
class Fixtures {
function siteMap() {
return [
[
'id'=>uniqid(),
'module'=>'paralax',
'fields'=>$this->getModuleInitValues('paralax'),
],
[
'id'=>uniqid(),
'module'=>'three_goals',
'fields'=>$this->getModuleInitValues('three_goals'),
],
[
'id'=>uniqid(),
'module'=>'products',
'fields'=>$this->getModuleInitValues('products'),
],
[
'id'=>uniqid(),
'module'=>'caroutext',
'fields'=>$this->getModuleInitValues('caroutext'),
],
[
'id'=>uniqid(),
'module'=>'video',
'fields'=>$this->getModuleInitValues('video'),
],
[
'id'=>uniqid(),
'module'=>'button',
'fields'=>$this->getModuleInitValues('button'),
],
[
'id'=>'footer',
'fields'=>[
'rightText'=>[
'type'=>'text',
'value'=>'<p class="second-color">Ce pied de page peut être rempli à votre façon, sur une ou plusieurs lignes.</p>',
],
'leftText'=>[
'type'=>'text',
'value'=>'<h5 class="second-color">NoemieCMS</h5><p class="second-color">Made with love by <b>Robin Banquo</b> <a href="https://www.patreon.com/robinbanquo">vos dons sont bienvenus !</a></p>',
],
],
],
class Fixtures
{
public function siteMap()
{
return [
[
'id'=>uniqid(),
'module'=>'paralax',
'fields'=>$this->getModuleInitValues('paralax'),
],
[
'id'=>uniqid(),
'module'=>'three_goals',
'fields'=>$this->getModuleInitValues('three_goals'),
],
[
'id'=>uniqid(),
'module'=>'products',
'fields'=>$this->getModuleInitValues('products'),
],
[
'id'=>uniqid(),
'module'=>'caroutext',
'fields'=>$this->getModuleInitValues('caroutext'),
],
[
'id'=>uniqid(),
'module'=>'video',
'fields'=>$this->getModuleInitValues('video'),
],
[
'id'=>uniqid(),
'module'=>'button',
'fields'=>$this->getModuleInitValues('button'),
],
[
'id'=>'footer',
'fields'=>[
'rightText'=>[
'type'=>'text',
'value'=>'<p class="second-color">Ce pied de page peut être rempli à votre façon, sur une ou plusieurs lignes.</p>',
],
'leftText'=>[
'type'=>'text',
'value'=>'<h5 class="second-color">NoemieCMS</h5><p class="second-color">Made with love by <b>Robin Banquo</b> <a href="https://www.patreon.com/robinbanquo">vos dons sont bienvenus !</a></p>',
],
],
],
];
}
];
}
function siteParams() {
$f3=Base::instance();
public function siteParams()
{
$f3=Base::instance();
return [
'title'=>$f3->get('siteLabel'),
'titleSize'=>'medium',
'favIcon'=>'',
'siteLogo'=>'',
'lang'=>$f3->get('siteLang')?$f3->get('siteLang'):'fr_FR',
'description'=>$f3->get('siteDescription'),
'keywords'=>$f3->get('siteKeywords'),
'isPublished'=>'true',
// 'framalink' => ''
];
}
return [
'title'=>$f3->get('siteLabel'),
'titleSize'=>'medium',
'favIcon'=>'',
'siteLogo'=>'',
'lang'=>$f3->get('siteLang')?$f3->get('siteLang'):'fr_FR',
'description'=>$f3->get('siteDescription'),
'keywords'=>$f3->get('siteKeywords'),
'isPublished'=>'true',
// 'framalink' => ''
];
}
function siteOptions() {
$themesList=json_decode(file_get_contents(__DIR__.'/../config/themes.json'),TRUE);
$fontsList=json_decode(file_get_contents(__DIR__.'/../config/fonts.json'),TRUE);
public function siteOptions()
{
$themesList=json_decode(file_get_contents(__DIR__.'/../config/themes.json'), true);
$fontsList=json_decode(file_get_contents(__DIR__.'/../config/fonts.json'), true);
return [
'font'=>$fontsList[12],
'theme'=>$themesList['Grav'],
'params'=>$this->siteParams(),
];
}
return [
'font'=>$fontsList[12],
'theme'=>$themesList['Grav'],
'params'=>$this->siteParams(),
];
}
function getModuleInitValues($module) {
$moduleInfo=json_decode(
file_get_contents(__DIR__.'/../views/modules/'.$module.'/info.json'),
TRUE
);
return $moduleInfo['fields'];
}
public function getModuleInitValues($module)
{
$moduleInfo=json_decode(
file_get_contents(__DIR__.'/../views/modules/'.$module.'/info.json'),
true
);
return $moduleInfo['fields'];
}
}
<!DOCTYPE html>
<html lang="fr">
<include href="./base/includes/head.htm" />
<body>
{* ajout des boutons supérieurs si l'utilisateur est connecté en tant qu'admin*}
<include if="{{ @isAdmin }}" href="./base/includes/adminButtons.htm" />