10.2 accès concurrents WIP

This commit is contained in:
Fred Tempez 2020-05-24 19:59:21 +02:00
parent c5f3c0ac4b
commit 77c930d737
3 changed files with 389 additions and 347 deletions

View File

@ -1,5 +1,14 @@
# Changelog
## version 10.2.000
- Nouveautés :
- Gestion des accès concurrents :
- deux utilisateurs ne peuvent accèder en modification à la même page du site ou de configuration
- la connexion d'un utilisateur sur un autre poste ou navigateur déconnecte la session précédente.
- Modifications :
- Thème, les sélecteurs de couleur affiche la valeur RGBa d'une couleur différente de celle de la sélection.
- Thème de l'administration, amélioration du rendu.
## version 10.1.000
- Nouveautés :
- Distinction entre le thème du site et celui de l'administration. Sauvegarde et restauration de l'un ou de l'autre.

View File

@ -36,7 +36,7 @@ class common {
const THUMBS_WIDTH = 640;
// Numéro de version
const ZWII_VERSION = '10.1.001.dev1';
const ZWII_VERSION = '10.2.00.dev3';
const ZWII_UPDATE_CHANNEL = "v10";
public static $actions = [];
@ -59,6 +59,13 @@ class common {
'theme',
'admin'
];
public static $accessList = [
'user',
'theme',
'config',
'edit',
'config'
];
private $data = [];
private $hierarchy = [
'all' => [],
@ -1585,10 +1592,11 @@ class core extends common {
header('Location:' . helper::baseUrl() . 'install');
exit();
}
// Force la déconnexion des membres bannis
// Force la déconnexion des membres bannis ou d'une seconde session
if (
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
AND $this->getUser('group') === self::GROUP_BANNED
AND ( $this->getUser('group') === self::GROUP_BANNED
OR $_SESSION['csrf'] !== $this->getData(['user',$this->getUser('id'),'accessCsrf']) )
) {
$user = new user;
$user->logout();
@ -1616,6 +1624,7 @@ class core extends common {
}
// Check l'accès à la page
$access = null;
$accessInfo['user'] = '';
if($this->getData(['page', $this->getUrl(0)]) !== null) {
if(
$this->getData(['page', $this->getUrl(0), 'group']) === self::GROUP_VISITOR
@ -1635,6 +1644,21 @@ class core extends common {
}
}
}
// Controle si la page demandée est en édition oua ccès à la gestion du site
foreach($this->getData(['user']) as $userId => $userIds){
$t = explode('/',$this->getData(['user', $userId, 'accessUrl']));
if ( $this->getData(['user', $userId,'accessUrl']) === $this->getUrl() &&
$userId !== $this->getuser('id') &&
array_intersect($t,self::$accessList) ) {
$access = false;
$accessInfo['user'] = $this->getData(['user', $userId, 'lastname']) . ' ' . $this->getData(['user', $userId, 'firstname']);
}
}
// Accès concurrent stocke la page visitée
if ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')) {
$this->setData(['user',$this->getuser('id'),'accessUrl',$this->getUrl()]);
$this->setData(['user',$this->getuser('id'),'acessTime',time()]);
}
// Breadcrumb
$title = $this->getData(['page', $this->getUrl(0), 'title']);
@ -1852,11 +1876,18 @@ class core extends common {
}
if($access === false) {
http_response_code(403);
if ($accessInfo['user']) {
$this->addOutput([
'title' => 'Accès verrouillé',
'content' => template::speech('La page demandée est ouverte par l\'utilisateur <strong>' . $accessInfo['user'] . '</strong>. Merci de patienter.')
]);
} else {
$this->addOutput([
'title' => 'Erreur 403',
'content' => template::speech('Vous n\'êtes pas autorisé à accéder à cette page...')
]);
}
}
elseif($this->output['content'] === '') {
http_response_code(404);
$this->addOutput([

View File

@ -340,6 +340,8 @@ class user extends common {
$expire = $this->getInput('userLoginLongTime') ? strtotime("+1 year") : 0;
setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false));
setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false));
// Accès multiples avec le m$eme compte
$this->setData(['user',$userId,'accessCsrf',$_SESSION['csrf']]);
// Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur
if(
$this->getData(['config', 'maintenance'])