Commit 004590f5 authored by Antony Le Courtes's avatar Antony Le Courtes Committed by Bertrand Gauthier
Browse files

Refactoring de HostLocalizationUnicaen pour éviter d'avoir les adresses des...

Refactoring de HostLocalizationUnicaen pour éviter d'avoir les adresses des proxies et reverse proxies en dur dans le code. Passage en fichier de config pour que chacun puisse configurer dans son application.
parent 0ba4e23d
...@@ -6,8 +6,8 @@ use UnicaenApp\Controller\CacheControllerFactory; ...@@ -6,8 +6,8 @@ use UnicaenApp\Controller\CacheControllerFactory;
use UnicaenApp\Controller\InstadiaControllerFactory; use UnicaenApp\Controller\InstadiaControllerFactory;
use UnicaenApp\Form\View\Helper\FormControlGroup; use UnicaenApp\Form\View\Helper\FormControlGroup;
use UnicaenApp\Form\View\Helper\FormControlGroupFactory; use UnicaenApp\Form\View\Helper\FormControlGroupFactory;
use UnicaenApp\HostLocalization\HostLocalizationUnicaen; use UnicaenApp\HostLocalization\HostLocalization;
use UnicaenApp\HostLocalization\HostLocalizationUnicaenFactory; use UnicaenApp\HostLocalization\HostLocalizationFactory;
use UnicaenApp\Message\View\Helper\MessageHelper; use UnicaenApp\Message\View\Helper\MessageHelper;
use UnicaenApp\Message\View\Helper\MessageHelperFactory; use UnicaenApp\Message\View\Helper\MessageHelperFactory;
use UnicaenApp\Service\InstadiaServiceFactory; use UnicaenApp\Service\InstadiaServiceFactory;
...@@ -276,7 +276,7 @@ return [ ...@@ -276,7 +276,7 @@ return [
'view_manager' => [ 'view_manager' => [
'display_not_found_reason' => true, 'display_not_found_reason' => true,
'display_exceptions' => true, 'display_exceptions' => true,
] ],
], ],
'service_manager' => [ 'service_manager' => [
'factories' => [ 'factories' => [
...@@ -326,7 +326,7 @@ return [ ...@@ -326,7 +326,7 @@ return [
MailerService::class => MailerServiceFactory::class, MailerService::class => MailerServiceFactory::class,
RunSQLService::class => RunSQLServiceFactory::class, RunSQLService::class => RunSQLServiceFactory::class,
'instadia' => InstadiaServiceFactory::class, 'instadia' => InstadiaServiceFactory::class,
HostLocalizationUnicaen::class => HostLocalizationUnicaenFactory::class, HostLocalization::class => HostLocalizationFactory::class,
], ],
'shared' => [ 'shared' => [
'MouchardListenerErrorHandler' => false, 'MouchardListenerErrorHandler' => false,
...@@ -349,8 +349,8 @@ return [ ...@@ -349,8 +349,8 @@ return [
], ],
'aliases' => [ 'aliases' => [
'MailerService' => MailerService::class, 'MailerService' => MailerService::class,
'HostLocalization' => HostLocalizationUnicaen::class, 'HostLocalization' => HostLocalization::class,
] ],
], ],
'form_elements' => [ 'form_elements' => [
'invokables' => [ 'invokables' => [
...@@ -458,7 +458,7 @@ return [ ...@@ -458,7 +458,7 @@ return [
'UnicaenApp\Controller\Cache' => CacheControllerFactory::class, 'UnicaenApp\Controller\Cache' => CacheControllerFactory::class,
'UnicaenApp\Controller\Instadia' => InstadiaControllerFactory::class, 'UnicaenApp\Controller\Instadia' => InstadiaControllerFactory::class,
ConsoleController::class => ConsoleControllerFactory::class, ConsoleController::class => ConsoleControllerFactory::class,
] ],
], ],
'doctrine' => [ 'doctrine' => [
...@@ -510,7 +510,7 @@ return [ ...@@ -510,7 +510,7 @@ return [
'strategies' => [ 'strategies' => [
'ViewJsonStrategy', // register JSON renderer strategy 'ViewJsonStrategy', // register JSON renderer strategy
'ViewCsvStrategy', // register CSV renderer strategy 'ViewCsvStrategy', // register CSV renderer strategy
// 'ViewXmlStrategy', // register XML renderer strategy // 'ViewXmlStrategy', // register XML renderer strategy
// 'ViewFeedStrategy', // register Feed renderer strategy // 'ViewFeedStrategy', // register Feed renderer strategy
], ],
], ],
......
...@@ -7,6 +7,24 @@ ...@@ -7,6 +7,24 @@
*/ */
return [ return [
'unicaen-app' => [ 'unicaen-app' => [
/**
* Paramétrage pour utilisation pour autorisation ou non à la connexion à
* une app de l'exterieur de l'établissement
*/
hostlocalization' => [
'activated' => false,
'proxies' => [
//xxx.xx.xx.xxx
],
'reverse-proxies' => [
//xxx.xx.xx.xxx
],
'masque-ip' => '',
],
/** /**
* Connexion à l'annuaire LDAP (NB: compte admin requis) * Connexion à l'annuaire LDAP (NB: compte admin requis)
*/ */
...@@ -59,5 +77,7 @@ return [ ...@@ -59,5 +77,7 @@ return [
// ['195.220.135.97', '194.199.107.33'], // Via proxy // ['195.220.135.97', '194.199.107.33'], // Via proxy
], ],
], ],
], ],
]; ];
\ No newline at end of file
...@@ -6,8 +6,7 @@ LDAP ...@@ -6,8 +6,7 @@ LDAP
### Group ### Group
Service d\'accès aux groupes de l\'annuaire LDAP. Avec le gestionnaire Service d\'accès aux groupes de l\'annuaire LDAP. Avec le gestionnaire de service, ce service est accessible ainsi :
de service, ce service est accessible ainsi :
``` {.php} ``` {.php}
$service = $sm->get('ldap_group_service'); /* @var $service \UnicaenApp\Service\Ldap\Group */ $service = $sm->get('ldap_group_service'); /* @var $service \UnicaenApp\Service\Ldap\Group */
...@@ -15,8 +14,7 @@ $service = $sm->get('ldap_group_service'); /* @var $service \UnicaenApp\Service\ ...@@ -15,8 +14,7 @@ $service = $sm->get('ldap_group_service'); /* @var $service \UnicaenApp\Service\
### People ### People
Service d\'accès aux individus de l\'annuaire LDAP. Avec le gestionnaire Service d\'accès aux individus de l\'annuaire LDAP. Avec le gestionnaire de service, ce service est accessible ainsi :
de service, ce service est accessible ainsi :
``` {.php} ``` {.php}
$service = $sm->get('ldap_people_service'); /* @var $service \UnicaenApp\Service\Ldap\People */ $service = $sm->get('ldap_people_service'); /* @var $service \UnicaenApp\Service\Ldap\People */
...@@ -24,8 +22,7 @@ $service = $sm->get('ldap_people_service'); /* @var $service \UnicaenApp\Service ...@@ -24,8 +22,7 @@ $service = $sm->get('ldap_people_service'); /* @var $service \UnicaenApp\Service
### Structure ### Structure
Service d\'accès aux structures de l\'annuaire LDAP. Avec le Service d\'accès aux structures de l\'annuaire LDAP. Avec le gestionnaire de service, ce service est accessible ainsi :
gestionnaire de service, ce service est accessible ainsi :
``` {.php} ``` {.php}
$service = $sm->get('ldap_structure_service'); /* @var $service \UnicaenApp\Service\Ldap\Structure */ $service = $sm->get('ldap_structure_service'); /* @var $service \UnicaenApp\Service\Ldap\Structure */
...@@ -35,16 +32,17 @@ $service = $sm->get('ldap_structure_service'); /* @var $service \UnicaenApp\Serv ...@@ -35,16 +32,17 @@ $service = $sm->get('ldap_structure_service'); /* @var $service \UnicaenApp\Serv
Le service HostLocalization a pour but de déterminer si le poste client est situé dans le réseau de l'Etablissement ou non. Le service HostLocalization a pour but de déterminer si le poste client est situé dans le réseau de l'Etablissement ou non.
En standard, seul un mécanisme de détection pour l'Université de Caen est disponible. En standard, seul un mécanisme de détection pour l'Université de Caen est disponible. Pour Caen, l'idée est la suivante : la
Pour Caen, l'idée est la suivante : la méthode inEtablissement du service renverra true si la machine de l'utilisateur est dans les cas suivants : méthode inEtablissement du service renverra true si la machine de l'utilisateur est dans les cas suivants :
* En direct et en interne sans passer par le proxy (pas de redirection) * En direct et en interne sans passer par le proxy (pas de redirection)
* En interne, que l'on sort puis on re-rentre en passant par le reverse proxy * En interne, que l'on sort puis on re-rentre en passant par le reverse proxy
* En interne, que l'on passe par le proxy en interne * En interne, que l'on passe par le proxy en interne Sinon false.
Sinon false.
Il est cependant possible d'ajouter votre propre mécanisme de localisation. Il est cependant possible d'ajouter votre propre mécanisme de localisation.
Attention : en mode développement, sur votre machine et avec l'appli en localhost, vous ne serez pas considéré comme sur le réseau de l'établissement. Attention : en mode développement, sur votre machine et avec l'appli en localhost, vous ne serez pas considéré comme sur le
réseau de l'établissement.
#### Récupération et utilisation du service #### Récupération et utilisation du service
...@@ -63,14 +61,15 @@ if ($hl->inEtablissement()){ ...@@ -63,14 +61,15 @@ if ($hl->inEtablissement()){
} }
``` ```
Un Trait [HostLocalizationAwareTrait](../src/UnicaenApp/HostLocalization/HostLocalizationAwareTrait.php) est dispo avec un getter et un setter pour pouvoir injecter proprement la dépendance dans votre code. Un Trait [HostLocalizationAwareTrait](../src/UnicaenApp/HostLocalization/HostLocalizationAwareTrait.php) est dispo avec un
getter et un setter pour pouvoir injecter proprement la dépendance dans votre code.
### Créer votre propre système de localization ### Créer votre propre système de localization
Pour utiliser votre propre système de HostLocalization, il vous faut : Pour utiliser votre propre système de HostLocalization, il vous faut :
Créer une classe implémentant [HostLocalizationInterface](../src/UnicaenApp/HostLocalization/HostLocalizationInterface.php). Créer une classe implémentant [HostLocalizationInterface](../src/UnicaenApp/HostLocalization/HostLocalizationInterface.php).
La rendre dispo comme service dans votre config du ServiceManager. La rendre dispo comme service dans votre config du ServiceManager. Modifier l'alias de service 'HostLocalization' pour le
Modifier l'alias de service 'HostLocalization' pour le faire pointer sur votre propre classe. faire pointer sur votre propre classe.
Vous pourrez au besoin vous inspirer de [HostLocalizationUnicaen](../src/UnicaenApp/HostLocalization/HostLocalizationUnicaen.php). Vous pourrez au besoin vous inspirer de [HostLocalization](../src/UnicaenApp/HostLocalization/HostLocalization.php).
\ No newline at end of file \ No newline at end of file
...@@ -2,43 +2,58 @@ ...@@ -2,43 +2,58 @@
namespace UnicaenApp\HostLocalization; namespace UnicaenApp\HostLocalization;
class HostLocalizationUnicaen implements HostLocalizationInterface
class HostLocalization implements HostLocalizationInterface
{ {
protected $activated;
protected $proxies;
protected $reverseProxies;
protected $masqueIp;
/** /**
* Renvoie true si le'utilisateur utilise une machine connectée au réseau de l'établissement * Renvoie true si le'utilisateur utilise une machine connectée au réseau de l'établissement
* ou bien si la machine est hors réseau * ou bien si la machine est hors réseau
* *
* @return bool * @return bool
*/ */
public function inEtablissement(): bool
public function __construct($activated, $masqueIp, $proxies, $reverseProxies)
{ {
$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; $this->activated = $activated;
$forwarded = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : ''; $this->proxies = $proxies;
$this->reverseProxies = $reverseProxies;
$this->masqueIp = $masqueIp;
}
$ipInterne = '10.';
$proxies = [
'10.14.128.39',
'10.14.128.100',
'10.14.128.100',
'10.14.128.101',
'10.14.128.137',
];
$reverseProxies = [ /**
'193.55.120.23', * Retourne selon les règles définies en config si on est dans l'établissement ou à l'extérieur.
'193.55.120.24', *
'193.55.120.25', * @return bool
]; */
public function inEtablissement(): bool
{
if (!$this->activated || empty($this->masqueIp)) {
return true;
}
$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
$forwarded = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : '';
// Si on est en direct et en interne sans passer par le proxy (pas de redirection) // Si on est en direct et en interne sans passer par le proxy (pas de redirection)
if (0 === strpos($ip,$ipInterne) && $forwarded === '') return true; if (0 === strpos($ip, $this->masqueIp) && $forwarded === '') return true;
// Si on est en interne, que l'on sort puis on re-rentre en passant par le reverse proxy // Si on est en interne, que l'on sort puis on re-rentre en passant par le reverse proxy
if (in_array($ip,$reverseProxies) && 0 === strpos($forwarded,$ipInterne)) return true; if (in_array($ip, $this->reverseProxies) && 0 === strpos($forwarded, $this->masqueIp)) return true;
// Si on est en interne, que l'on passe par le proxy en interne // Si on est en interne, que l'on passe par le proxy en interne
if (in_array($ip,$proxies) && 0 === strpos($forwarded,$ipInterne)) return true; if (in_array($ip, $this->proxies) && 0 === strpos($forwarded, $this->masqueIp)) return true;
// Sinon, on vient de l'extérieur // Sinon, on vient de l'extérieur
return false; return false;
......
...@@ -4,11 +4,18 @@ namespace UnicaenApp\HostLocalization; ...@@ -4,11 +4,18 @@ namespace UnicaenApp\HostLocalization;
use Interop\Container\ContainerInterface; use Interop\Container\ContainerInterface;
class HostLocalizationUnicaenFactory class HostLocalizationFactory
{ {
public function __invoke(ContainerInterface $container, $requestedName, array $options = null) public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{ {
$service = new HostLocalizationUnicaen(); $config = $container->get('config');
$activated = $config['hostlocalization']['activated'];
$proxies = $config['hostlocalization']['proxies'];
$reverseProxies = $config['hostlocalization']['reverse-proxies'];
$masqueIp = $config['hostlocalization']['masque-ip'];
$service = new HostLocalization($activated, $masqueIp, $proxies, $reverseProxies);
return $service; return $service;
} }
......
Supports Markdown
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