Commit 02aa8e9d authored by THEO GUILLON's avatar THEO GUILLON
Browse files

Merge branch '346-verification-fonctionnement-ldaps' into '1.2.0'

Resolve "Vérification fonctionnement LDAPS"

See merge request libriciel/pole-citoyens/web-DPO/web-DPO!352
parents 3411d4fa 57fd5f0c
......@@ -533,4 +533,12 @@ DELETE FROM valeurs WHERE champ_name IN (
'soustraitant'
);
ALTER TABLE connecteur_ldaps ADD COLUMN certificat_url VARCHAR(100);
CREATE UNIQUE INDEX connecteur_ldaps_certificat_url_idx ON connecteur_ldaps (certificat_url);
ALTER TABLE connecteur_ldaps ADD COLUMN certificat_name VARCHAR(100);
CREATE UNIQUE INDEX connecteur_ldaps_certificat_name_certificat_url_idx ON connecteur_ldaps (certificat_name, certificat_url);
ALTER TABLE connecteur_ldaps ALTER COLUMN host_fall_over DROP NOT NULL;
COMMIT;
......@@ -191,7 +191,7 @@
$sessionDurationMinutes = 4 * 60;
Configure::write('Session', [
'defaults' => 'php',
'cookie' => 'WebCIL',
'cookie' => 'web-DPO',
'timeout' => $sessionDurationMinutes,
'cookieTimeout' => $sessionDurationMinutes,
'checkAgent' => false,
......
......@@ -91,7 +91,7 @@ define('FORMAT_DATE_HEURE', '%e-%m-%Y à %H:%M');
define('REGEXP_ALPHA_FR', "/^[a-zA-Z\'-ÂÀâàÇçÉÊÈËéêèëÎÏîïÔÖôöÛÙûù ]*$/i");
//Validation champs email
define('REGEXP_EMAIL_FR', '/^[a-zA-Z1-9\-@._]*$/i');
define('REGEXP_EMAIL_FR', '/^[a-zA-Z0-9\-@._]*$/i');
Configure::write('logoAcceptedTypes', [
'image/png', // .png
......@@ -99,3 +99,7 @@ Configure::write('logoAcceptedTypes', [
'image/gif', // .gif
'image/svg+xml' //.svg
]);
//Dossier qui va contenir les certificats des organisations pour le LDAPS
define('CERTIFICATS', DS . "certificats");
define('CHEMIN_CERTIFICATS', CHEMIN_FICHIER . CERTIFICATS . DS);
......@@ -260,6 +260,11 @@ class CronShell extends Shell {
]);
Configure::write('LdapManager.Ldap', $connecteurLdap['ConnecteurLdap']);
if (!empty($connecteurLdap['ConnecteurLdap']['certificat_url'])) {
Configure::write('LdapManager.Ldap.certificat', CHEMIN_CERTIFICATS . $connecteurLdap['ConnecteurLdap']['certificat_url']);
}
Configure::write('AuthManager.Authentification', $authentification['Authentification']);
}
......
......@@ -46,7 +46,8 @@ class ConnecteurLdapsController extends AppController {
* @created 20/03/2018
* @version V1.0.0
*/
public function add() {
public function add()
{
$this->set('title', __d('connecteur_ldap', 'connecteur_ldap.titreLdap'));
$this->set('options', $this->ConnecteurLdap->enums());
......@@ -59,10 +60,23 @@ class ConnecteurLdapsController extends AppController {
]);
}
$this->request->data['ConnecteurLdap']['organisation_id'] = $this->Session->read('Organisation.id');
$this->ConnecteurLdap->create($this->request->data);
$success = true;
$this->Service->begin();
if (false !== $this->ConnecteurLdap->save(null, ['atomic' => true])) {
$data = $this->request->data;
$data['ConnecteurLdap']['organisation_id'] = $this->Session->read('Organisation.id');
$this->ConnecteurLdap->create($data);
$success = $success && false !== $this->ConnecteurLdap->save(null, ['atomic' => false]);
if ($success == true) {
if (!empty($data['ConnecteurLdap']['certificat']['type']) && !empty($data['ConnecteurLdap']['id'])) {
$success = $this->ConnecteurLdap->saveFile($data['ConnecteurLdap']['certificat'], $data['ConnecteurLdap']['id']);
}
}
if ($success == true) {
$this->ConnecteurLdap->commit();
$this->Session->setFlash(__d('connecteur_ldap', 'connecteur_ldap.flashsuccessConnecteurEnregistrer'), 'flashsuccess');
$this->redirect([
......@@ -70,6 +84,7 @@ class ConnecteurLdapsController extends AppController {
'action' => 'index'
]);
} else {
$this->ConnecteurLdap->rollback();
$this->Session->setFlash(__d('connecteur_ldap', 'connecteur_ldap.flasherrorErreurEnregistrementConnecteur'), 'flasherror');
}
} else {
......@@ -81,5 +96,31 @@ class ConnecteurLdapsController extends AppController {
$this->request->data = $this->ConnecteurLdap->find('first', $query);
}
}
public function deleteFile($id, $urlFile) {
$this->autoRender = false;
$this->ConnecteurLdap->begin();
$cheminFile = CHEMIN_CERTIFICATS . $urlFile;
$this->ConnecteurLdap->id = $id;
$record = [
'certificat_url' => null,
'certificat_name' => null
];
$success = $this->ConnecteurLdap->save($record, ['atomic' => false]) !== false
&& unlink($cheminFile) === true;
if ($success == true) {
$this->ConnecteurLdap->commit();
$this->Session->setFlash(__d('norme', 'norme.flashsuccessFichierSupprimer'), 'flashsuccess');
} else {
$this->ConnecteurLdap->rollback();
$this->Session->setFlash(__d('norme', 'norme.flasherrorFichierSupprimer'), 'flasherror');
}
$this->redirect($this->Referers->get());
}
}
......@@ -840,6 +840,8 @@ class UsersController extends AppController {
'ConnecteurLdap.tls',
'ConnecteurLdap.version',
'ConnecteurLdap.account_suffix',
'ConnecteurLdap.certificat_url',
'ConnecteurLdap.certificat_name',
'ConnecteurLdap.username',
'ConnecteurLdap.note',
'ConnecteurLdap.nom',
......@@ -870,17 +872,17 @@ class UsersController extends AppController {
if (!empty($infoUser)) {
foreach ($infoUser as $connecteurLdap) {
$host = $connecteurLdap['ConnecteurLdap']['host'];
$port = $connecteurLdap['ConnecteurLdap']['port'];
$ping = @fsockopen($host, $port, $errno, $errstr, 30);
@fclose($ping);
$host_fall_over = $connecteurLdap['ConnecteurLdap']['host_fall_over'];
$port_fall_over = $connecteurLdap['ConnecteurLdap']['port'];
$ping_fall_over = @fsockopen($host_fall_over, $port_fall_over, $errno_fall_over, $errstr_fall_over, 30);
@fclose($ping_fall_over);
if ($ping || $ping_fall_over) {
// $host = $connecteurLdap['ConnecteurLdap']['host'];
// $port = $connecteurLdap['ConnecteurLdap']['port'];
// $ping = @fsockopen($host, $port, $errno, $errstr, 30);
// @fclose($ping);
//
// $host_fall_over = $connecteurLdap['ConnecteurLdap']['host_fall_over'];
// $port_fall_over = $connecteurLdap['ConnecteurLdap']['port'];
// $ping_fall_over = @fsockopen($host_fall_over, $port_fall_over, $errno_fall_over, $errstr_fall_over, 30);
// @fclose($ping_fall_over);
// if ($ping || $ping_fall_over) {
if ($autorisationLogin === false) {
$connecteurLdap['ConnecteurLdap']['fields']['User'] = [
'username' => $connecteurLdap['ConnecteurLdap']['username'],
......@@ -903,11 +905,16 @@ class UsersController extends AppController {
unset ($connecteurLdap['ConnecteurLdap']['active']);
Configure::write('LdapManager.Ldap', $connecteurLdap['ConnecteurLdap']);
if (!empty($connecteurLdap['ConnecteurLdap']['certificat_url'])) {
Configure::write('LdapManager.Ldap.certificat', CHEMIN_CERTIFICATS . $connecteurLdap['ConnecteurLdap']['certificat_url']);
}
Configure::write('AuthManager.Authentification', $connecteurLdap['Authentification']);
$autorisationLogin = $this->Auth->login();
}
}
// }
}
}
}
......@@ -1138,7 +1145,7 @@ class UsersController extends AppController {
public function ajax_password() {
// @fixme: vérifier que l'on soit en ajax
$this->autoRender = false;
$password = Hash::get($this->request->data, 'password');
$password = $this->request->data['password'];
$json = [
'entropie' => PasswordStrengthMeterAnssi::entropy($password),
'force' => PasswordStrengthMeterAnssi::strength($password),
......
......@@ -241,8 +241,8 @@ function url_to_array($url) {
/**
* On verifie si le dossier file existe. Si c'est pas le cas on le cree
*
* @param type $user_id
* @return type
* @param int $user_id
* @return boolean
*
* @created 19/10/2018
* @version V1.0.1
......@@ -263,7 +263,8 @@ function create_arborescence_files($user_id = null)
CHEMIN_FICHIER . CONNECTEURS,
CHEMIN_PIECE_JOINT_ARTICLE,
CHEMIN_PIECE_JOINT_ARTICLE_TMP,
CHEMIN_LOGOS
CHEMIN_LOGOS,
CHEMIN_CERTIFICATS
];
if ($user_id !== null) {
......@@ -278,9 +279,10 @@ function create_arborescence_files($user_id = null)
$success = true;
foreach ($paths as $path) {
if (file_exists($path) === false) {
$success = mkdir($path, 0777, true) && $success;
if (file_exists($path) === false && $success == true) {
$success = $success && false !== mkdir($path, 0777, true);
}
}
return $success;
}
......@@ -101,6 +101,12 @@ msgstr "Suffixe du compte"
msgid "connecteur_ldap.placeholderChampAccountSuffix"
msgstr "@mairie-xxx.xxx"
msgid "connecteur_ldap.champCertificat"
msgstr "Certificat .crt"
msgid "connecteur_ldap.titleBtFileCertificat"
msgstr "Choisir un fichier .crt"
msgid "connecteur_ldap.titreTableauConcordances"
msgstr "Tableau des concordances :"
......
......@@ -41,5 +41,56 @@ class ConnecteurLdap extends AppModel {
'foreignKey' => 'organisation_id'
]
];
/**
* @param $data
* @param $id
* @return bool
* @throws Exception
*
* @access public
*
* @author Théo GUILLON <theo.guillon@libriciel.coop>
* @created 16/07/2020
* @version V2.0.0
*/
public function saveFile($file, $id)
{
$success = true;
if (in_array($file['type'], ['application/x-x509-ca-cert', 'application/pkix-cert'])) {
if (!empty($file['name'])) {
$extension = '.crt';
// On verifie si le dossier file existe. Si c'est pas le cas on le cree
$success = create_arborescence_files();
if ($success == true && !empty($file['tmp_name'])) {
$url = time();
$certificat_url = $url . $extension;
$success = $success && move_uploaded_file($file['tmp_name'], CHEMIN_CERTIFICATS . $certificat_url);
if ($success === true) {
$this->id = $id;
$record = [
'certificat_url' => $certificat_url,
'certificat_name' => $file['name']
];
$success = $success && $this->save($record, ['atomic' => false]) !== false;
}
} else {
$success = false;
}
} else {
$success = false;
}
return ($success);
} else {
$success = false;
}
return ($success);
}
}
......@@ -27,6 +27,7 @@
<?php
echo $this->WebcilForm->create('ConnecteurLdap',[
'autocomplete' => 'off',
'type' => 'file',
'inputDefaults' => ['div' => false],
'class' => 'form-horizontal',
'novalidate' => 'novalidate'
......@@ -77,7 +78,6 @@
],
'host_fall_over' => [
'id' => 'host_fall_over',
'required' => true
],
'port' => [
'id' => 'port',
......@@ -101,7 +101,10 @@
'tls' => [
'id' => 'tls',
'class' => 'form-control usersDeroulant',
'options' => [false => 'Non', true => 'Oui'],
'options' => [
false => 'Non',
true => 'Oui'
],
'empty' => false,
'required' => true,
'placeholder' => false
......@@ -117,8 +120,60 @@
],
'account_suffix' => [
'id' => 'account_suffix'
]
],
// 'certificat' => [
// 'id' => 'certificat',
// 'div' => 'input-group inputsForm',
// 'type' => 'file',
// 'class' => 'filestyle',
// 'data-buttonText' => __d('connecteur_ldap', 'connecteur_ldap.titleBtFileCertificat'),
// 'data-buttonBefore' => 'false',
// ]
]);
if (empty($this->request->data['ConnecteurLdap']['certificat_name'])) {
echo $this->WebcilForm->input('certificat', [
'id' => 'certificat',
'div' => 'input-group inputsForm',
'type' => 'file',
'class' => 'filestyle',
'data-buttonText' => __d('connecteur_ldap', 'connecteur_ldap.titleBtFileCertificat'),
'data-buttonBefore' => 'false',
]);
} else {
?>
<table class="table" id="render">
<tbody>
<tr>
<td class="col-md-1">
<i class="fa fa-file-text-o fa-lg"></i>
</td>
<td class="col-md-9 tdleft">
<?php
echo $this->request->data['ConnecteurLdap']['certificat_name'];
?>
</td>
<td class="col-md-2">
<?php
echo $this->Html->link('<span class="fa fa-trash fa-lg"><!----></span>', [
'controller' => 'connecteurLdaps',
'action' => 'deleteFile',
$this->request->data['ConnecteurLdap']['id'],
$this->request->data['ConnecteurLdap']['certificat_url'],
], [
'class' => 'btn btn-default-danger btn-sm my-tooltip',
'title' => __d('norme','norme.btnSupprimerFichierNorme'),
'escapeTitle' => false
]);
?>
</td>
</tr>
</tbody>
</table>
<?php
}
?>
<h2>
......@@ -181,7 +236,9 @@
<script type="text/javascript">
$(document).ready(function () {
$("span.icon-span-filestyle").removeClass('icon-span-filestyle');
$("#ldap-block").hide();
<?php
......
......@@ -656,8 +656,7 @@
<?php
echo $this->Flash->render();
echo $this->Flash->render('auth');
if ($this->params['action'] != 'login') {
?>
<div class="row head">
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment