Commit 38e542bf authored by Christian BUFFIN's avatar Christian BUFFIN

Corrections et améliorations des accès et des transactions.

parent 800b411d
......@@ -176,7 +176,7 @@ class CronShell extends Shell {
$cron['Cron']['last_execution_end_time'] = date('Y-m-d H:i:s');
$cron['Cron']['last_execution_report'] = $rappExecution;
if ($this->Cron->save($cron)) {
if ($this->Cron->save($cron, ['atomic' => true])) {
return $output;
} else {
return Cron::EXECUTION_STATUS_FAILED . "\n" . $output;
......
......@@ -31,6 +31,18 @@ class AdminsController extends AppController {
'User'
];
/**
* Vérification de l'accès aux actions en fonction du profil de l'utilisateur connecté.
*/
public function beforeFilter() {
parent::beforeFilter();
// Seul le rôle Superutilisateur peut accéder à ce contrôleur.
if ($this->Droits->isSu() !== true) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
}
/**
* Fonction index pour l'affichage de tous les "super-admin" de l'application.
*
......@@ -42,10 +54,6 @@ class AdminsController extends AppController {
* @version V1.1.0
*/
public function index() {
if (true !== $this->Droits->isSu()) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('admin', 'admin.titreSuperAdministrateur'));
$query = [
......@@ -83,10 +91,6 @@ class AdminsController extends AppController {
* @version V1.0.0
*/
public function edit($id = null) {
if (true !== ($this->Droits->isSu())) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('admin', 'admin.titreAjouterSuperAdmin'));
if ($this->request->is('post') || $this->request->is('put')) {
......@@ -182,26 +186,32 @@ class AdminsController extends AppController {
* @version V1.0.0
*/
public function delete($idAdmin, $idUser) {
if ($this->Admin->exists($idAdmin)) {
$success = true;
$this->Admin->begin();
// La même logique que dans la vue et que dans UsersController
if ($idUser == 1 || $idUser == $this->Session->read('Auth.User.id')) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$success = $success && false !== $this->Admin->delete($idAdmin);
if ($success == true) {
$success = $success && false !== $this->User->delete($idUser);
}
if ($this->Admin->exists($idAdmin) === false) {
throw new NotFoundException();
}
if ($success == true) {
$this->Admin->commit();
$this->Session->setFlash(__d('admin', 'admin.flashsuccessPrivilegeRetire'), 'flashsuccess');
} else {
$this->EtatFiche->rollback();
$this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
}
$success = true;
$this->Admin->begin();
$success = $success && false !== $this->Admin->delete($idAdmin);
if ($success == true) {
$success = $success && false !== $this->User->delete($idUser);
}
if ($success == true) {
$this->Admin->commit();
$this->Session->setFlash(__d('admin', 'admin.flashsuccessPrivilegeRetire'), 'flashsuccess');
} else {
$this->Session->setFlash(__d('admin', 'admin.flasherrorUserInexistant'), 'flasherror');
$this->EtatFiche->rollback();
$this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
}
$this->redirect([
'controller' => 'admins',
'action' => 'index'
......@@ -213,10 +223,6 @@ class AdminsController extends AppController {
*/
public function changeViewLogin()
{
if (true !== ($this->Droits->isSu())) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', "Personnalisation de la page de connexion");
$configLoginExistante = '';
......
......@@ -337,7 +337,7 @@ class ArticlesController extends AppController {
'article_id' => $articleId,
'organisation_id' => $organisationId
]);
$success = $success && false !== $this->ArticleOrganisation->save();
$success = $success && false !== $this->ArticleOrganisation->save(null, ['atomic' => false]);
}
}
}
......
......@@ -27,7 +27,23 @@ class AuthentificationsController extends AppController {
public $uses = [
'Authentification'
];
/**
* Vérification de l'accès aux actions en fonction du profil de l'utilisateur connecté.
* Les vérifications de l'accès aux enregistrements se font dans les méthodes d'actions.
*/
public function beforeFilter() {
parent::beforeFilter();
$action = Inflector::underscore($this->request->params['action']);
if ($action === 'add') {
$this->Droits->assertAuthorized([ListeDroit::GESTION_MAINTENACE]);
} else {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
}
/**
* Permets l'ajout et la modification du connecteur LDAP
*
......@@ -37,10 +53,6 @@ class AuthentificationsController extends AppController {
* @version V1.0.0
*/
public function add() {
if (true !== $this->Droits->authorized(ListeDroit::GESTION_MAINTENACE)) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('authentification', 'authentification.titreAuthentification'));
$this->set('options', $this->Authentification->enums());
......@@ -63,10 +75,10 @@ class AuthentificationsController extends AppController {
$this->request->data['Authentification']['organisation_id'] = $this->Session->read('Organisation.id');
$this->Authentification->create($this->request->data);
$success = $success && false !== $this->Authentification->save();
$success = $success && false !== $this->Authentification->save(null, ['atomic' => false]);
if (!empty($file)) {
$saveFile = $this->Authentification->saveFile($file, $this->request->data['Authentification']['id']);
$success = $success && $this->Authentification->saveFile($file, $this->request->data['Authentification']['id']);
}
if ($success === true) {
......
......@@ -32,12 +32,20 @@ class ChecksController extends AppController {
'className' => 'LibricielChecks.LibricielChecks'
]
];
public function index() {
if (true !== $this->Droits->authorized($this->Droits->isSu())) {
/**
* Vérification de l'accès aux actions en fonction du profil de l'utilisateur connecté.
*/
public function beforeFilter() {
parent::beforeFilter();
// Seul le rôle Superutilisateur peut accéder à ce contrôleur.
if ($this->Droits->isSu() !== true) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
}
public function index() {
$this->set('title', __d('checks', 'checks.titreIndex'));
$results = WebdpoChecks::results();
......
......@@ -212,7 +212,7 @@ class DroitsComponent extends Component {
$infoFiche = $Fiche->find('first', [
'conditions' => ['id' => $id]
]);
$infoEtat = $EtatFiche->find('count', [
'conditions' => [
'fiche_id' => $id,
......@@ -238,12 +238,15 @@ class DroitsComponent extends Component {
return true;
}
}
if ($infoFiche['Fiche']['organisation_id'] == $this->Session->read('Organisation.id') && $infoFiche['Fiche']['user_id'] == $this->Session->read('Auth.User.id') && $infoEtat < 1) {
$organisation_id = Hash::get($infoFiche, 'Fiche.organisation_id');
$user_id = Hash::get($infoFiche, 'Fiche.user_id');
if ($organisation_id == $this->Session->read('Organisation.id') && $user_id == $this->Session->read('Auth.User.id') && $infoEtat < 1) {
return true;
}
if ($infoFiche['Fiche']['organisation_id'] == $this->Session->read('Organisation.id') && ($this->Session->read('Auth.User.id') == $this->Session->read('Organisation.dpo') || $this->isSu())) {
if ($organisation_id == $this->Session->read('Organisation.id') && ($this->Session->read('Auth.User.id') == $this->Session->read('Organisation.dpo') || $this->isSu())) {
return true;
}
......
......@@ -27,7 +27,17 @@ class ConnecteurLdapsController extends AppController {
public $uses = [
'ConnecteurLdap'
];
/**
* Vérification de l'accès aux actions en fonction du profil de l'utilisateur connecté.
* Les vérifications de l'accès aux enregistrements se font dans les méthodes d'actions.
*/
public function beforeFilter() {
parent::beforeFilter();
$this->Droits->assertAuthorized([ListeDroit::GESTION_MAINTENACE]);
}
/**
* Permets l'ajout et la modification du connecteur LDAP
*
......@@ -37,10 +47,6 @@ class ConnecteurLdapsController extends AppController {
* @version V1.0.0
*/
public function add() {
if (true !== $this->Droits->authorized(ListeDroit::GESTION_MAINTENACE)) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('connecteur_ldap', 'connecteur_ldap.titreLdap'));
$this->set('options', $this->ConnecteurLdap->enums());
......@@ -52,17 +58,11 @@ class ConnecteurLdapsController extends AppController {
'action' => 'index'
]);
}
$success = true;
$this->ConnecteurLdap->begin();
$this->request->data['ConnecteurLdap']['organisation_id'] = $this->Session->read('Organisation.id');
$this->ConnecteurLdap->create($this->request->data);
$success = $success && false !== $this->ConnecteurLdap->save();
if ($success === true) {
$this->ConnecteurLdap->commit();
if (false !== $this->ConnecteurLdap->save(null, ['atomic' => true])) {
$this->Session->setFlash(__d('connecteur_ldap', 'connecteur_ldap.flashsuccessConnecteurEnregistrer'), 'flashsuccess');
$this->redirect([
......@@ -70,7 +70,6 @@ class ConnecteurLdapsController extends AppController {
'action' => 'index'
]);
} else {
$this->ConnecteurLdap->rollback();
$this->Session->setFlash(__d('connecteur_ldap', 'connecteur_ldap.flasherrorErreurEnregistrementConnecteur'), 'flasherror');
}
} else {
......
......@@ -37,6 +37,15 @@ class ConnecteursController extends AppController {
],
];
/**
* Vérification de l'accès aux actions en fonction du profil de l'utilisateur connecté.
* Les vérifications de l'accès aux enregistrements se font dans les méthodes d'actions.
*/
public function beforeFilter() {
parent::beforeFilter();
$this->Droits->assertAuthorized([ListeDroit::GESTION_MAINTENACE]);
}
/**
* Permet l'affichage de la liste des connecteurs
......@@ -49,10 +58,6 @@ class ConnecteursController extends AppController {
* @version V1.0.0
*/
public function index() {
if (true !== $this->Droits->authorized(ListeDroit::GESTION_MAINTENACE)) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('connecteur', 'connecteur.titreGestionConnecteurs'));
$this->set('connecteurs', $this->connecteurs);
......
......@@ -29,7 +29,17 @@ class CronsController extends AppController {
public $uses = [
'Cron'
];
/**
* Vérification de l'accès aux actions en fonction du profil de l'utilisateur connecté.
* Les vérifications de l'accès aux enregistrements se font dans les méthodes d'actions.
*/
public function beforeFilter() {
parent::beforeFilter();
$this->Droits->assertAuthorized([ListeDroit::GESTION_MAINTENACE]);
}
/**
* Vue détaillée des crons (tâches planifiées)
*
......@@ -38,10 +48,6 @@ class CronsController extends AppController {
* @return type
*/
public function index() {
if (true !== $this->Droits->authorized(ListeDroit::GESTION_MAINTENACE)) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->set('title', __d('cron', 'cron.titreListeTachesAutomatiques'));
$tachesAutos = $this->Cron->find('all', [
......@@ -64,9 +70,7 @@ class CronsController extends AppController {
* @version V1.0.0
*/
public function toggle($id, $state = null) {
if (true !== $this->Droits->authorized(ListeDroit::GESTION_MAINTENACE)) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->Droits->assertRecordAuthorized('Cron', $id);
$success = true;
$this->Cron->begin();
......@@ -96,9 +100,7 @@ class CronsController extends AppController {
* @throws ForbiddenException
*/
public function deverrouiller($id) {
if (true !== $this->Droits->authorized(ListeDroit::GESTION_MAINTENACE)) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->Droits->assertRecordAuthorized('Cron', $id);
$success = true;
$this->Cron->begin();
......@@ -130,9 +132,7 @@ class CronsController extends AppController {
* @return type
*/
public function planifier($id) {
if (true !== $this->Droits->authorized(ListeDroit::GESTION_MAINTENACE)) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}
$this->Droits->assertRecordAuthorized('Cron', $id);
$tacheAuto = $this->Cron->find('first', [
'conditions' => [
......@@ -197,7 +197,9 @@ class CronsController extends AppController {
/**
* Fonction d'exécution du cron $id
*/
function executer($id) {
public function executer($id) {
$this->Droits->assertRecordAuthorized('Cron', $id);
$cron = $this->Cron->find('first', [
'conditions' => [
'id' => $id
......
......@@ -765,43 +765,43 @@ class EtatFichesController extends AppController
'controller' => 'pannel',
'action' => 'index'
]);
} else {
$success = true;
$this->EtatFiche->begin();
}
$this->requestAction([
'controller' => 'pannel',
'action' => 'supprimerLaNotif',
$id
]);
$success = true;
$this->EtatFiche->begin();
$success = $success && $this->EtatFiche->updateAll([
'actif' => false
], [
'fiche_id' => $id
]
) !== false;
$this->requestAction([
'controller' => 'pannel',
'action' => 'supprimerLaNotif',
$id
]);
$success = $success && $this->EtatFiche->updateAll([
'actif' => false
], [
'fiche_id' => $id
]
) !== false;
if ($success == true) {
$this->EtatFiche->create([
'EtatFiche' => [
'fiche_id' => $id,
'etat_id' => 8,
'previous_user_id' => $this->Auth->user('id'),
'user_id' => $this->Auth->user('id')
]
]);
$success = $success && false !== $this->EtatFiche->save(null, ['atomic' => false]);
if ($success == true) {
$this->EtatFiche->create([
'EtatFiche' => [
'fiche_id' => $id,
'etat_id' => 8,
'previous_user_id' => $this->Auth->user('id'),
'user_id' => $this->Auth->user('id')
$this->Historique->create([
'Historique' => [
'content' => $this->Auth->user('prenom') . ' ' . $this->Auth->user('nom') . ' replace le traitement en rédaction',
'fiche_id' => $id
]
]);
$success = $success && false !== $this->EtatFiche->save(null, ['atomic' => false]);
if ($success == true) {
$this->Historique->create([
'Historique' => [
'content' => $this->Auth->user('prenom') . ' ' . $this->Auth->user('nom') . ' replace le traitement en rédaction',
'fiche_id' => $id
]
]);
$success = $success && false !== $this->Historique->save(null, ['atomic' => false]);
}
$success = $success && false !== $this->Historique->save(null, ['atomic' => false]);
}
}
......@@ -989,11 +989,12 @@ class EtatFichesController extends AppController
if ($success === true) {
$this->Fiche->id = $id;
$success = $success && $this->Fiche->save([
$record = [
'id' => $id,
'numero' => $numero,
'norme_id' => $norme
]) !== false;
];
$success = $success && $this->Fiche->save($record, ['atomic' => false]) !== false;
}
if ($success === true) {
......@@ -1057,10 +1058,11 @@ class EtatFichesController extends AppController
if ($success === true && $saveNumeroRegistre === true) {
$this->Organisation->id = $organisation_id;
$success = $success && $this->Organisation->save([
$record = [
'id' => $organisation_id,
'numeroregistre' => $numeroregistre
]) !== false;
];
$success = $success && $this->Organisation->save($record, ['atomic' => false]) !== false;
}
}
}
......@@ -1172,7 +1174,7 @@ class EtatFichesController extends AppController
'valeur' => $entite[$val],
'champ_name'=> $prefixChampName.$val
]);
$success = $success && false !== $this->Valeur->save();
$success = $success && false !== $this->Valeur->save(null, ['atomic' => false]);
}
}
}
......@@ -1217,7 +1219,7 @@ class EtatFichesController extends AppController
'valeur' => $userDPO[$val],
'champ_name'=> $prefixChampName.$champ_name
]);
$success = $success && false !== $this->Valeur->save();
$success = $success && false !== $this->Valeur->save(null, ['atomic' => false]);
}
}
}
......@@ -1244,13 +1246,13 @@ class EtatFichesController extends AppController
//On met EtatFiche.actif a false en fonction de l'id
$success = $success && $this->EtatFiche->updateAllIfFound(
[
'actif' => false
],
[
'id' => $this->request->data['EtatFiche']['etatFiche'],
]
) !== false;
[
'actif' => false
],
[
'id' => $this->request->data['EtatFiche']['etatFiche'],
]
) !== false;
if ($success === true) {
$messageHistorique = __d('historique', 'historique.envoieTraitementInitialiserAuRedacteur');
......@@ -1389,18 +1391,20 @@ class EtatFichesController extends AppController
}
$this->Valeur->id = $valeurFiche['Valeur']['id'];
$success = $success && $this->Valeur->save([
$record = [
'id' => $valeurFiche['Valeur']['id'],
'valeur' => $valeurChamp
]) !== false;
];
$success = $success && $this->Valeur->save($record, ['atomic' => false]) !== false;
}
}
$this->Fiche->id = $fiche_id;
$success = $success && $this->Fiche->save([
$record = [
'id' => $fiche_id,
'user_id' => $user['User']['id']
]) !== false;
];
$success = $success && $this->Fiche->save($record, ['atomic' => false]) !== false;
return ($success);
}
......
......@@ -66,6 +66,32 @@ class FichesController extends AppController
'WebdpoSoustraitance'
];
/**
* Vérification de l'accès aux actions en fonction du profil de l'utilisateur connecté.
* Les vérifications de l'accès aux enregistrements se font dans les méthodes d'actions.
*/
public function beforeFilter() {
parent::beforeFilter();
$action = Inflector::underscore($this->request->params['action']);
// Pour les autres que index et les download, aucune idée sur la façon de restreindre les droits
//$anyone = ['index', 'delete_file', 'delete_recording_file', 'download', 'download_file_extrait', 'download_file_traitement'];
if (in_array($action, ['add', 'archive']) === true) {
$this->Droits->assertAuthorized([ListeDroit::REDIGER_TRAITEMENT]);
$this->Droits->assertNotSu();
} elseif ($action === 'delete') {
$this->Droits->assertAuthorized([ListeDroit::REDIGER_TRAITEMENT]);
$this->Droits->assertNotSu();
} elseif ($action === 'dupliquer_traitement_in_organisations') {
$this->Droits->assertDpo();
} elseif ($action === 'edit') {
$this->Droits->assertNotSu();
} /*elseif (in_array($action, $anyone) === false) {
throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
}*/
}
/**
* La page d'accueil des fiches est celle du pannel général
*
......@@ -181,7 +207,7 @@ class FichesController extends AppController
if ($success == true) {
$this->Fiche->commit();