Commit 13ec6ee2 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Merge branch 'alc-refactoring-hostlocalization' into 'master'

parents 0ba4e23d 004590f5
Pipeline #9568 failed with stages
in 32 seconds
......@@ -6,8 +6,8 @@ use UnicaenApp\Controller\CacheControllerFactory;
use UnicaenApp\Controller\InstadiaControllerFactory;
use UnicaenApp\Form\View\Helper\FormControlGroup;
use UnicaenApp\Form\View\Helper\FormControlGroupFactory;
use UnicaenApp\HostLocalization\HostLocalizationUnicaen;
use UnicaenApp\HostLocalization\HostLocalizationUnicaenFactory;
use UnicaenApp\HostLocalization\HostLocalization;
use UnicaenApp\HostLocalization\HostLocalizationFactory;
use UnicaenApp\Message\View\Helper\MessageHelper;
use UnicaenApp\Message\View\Helper\MessageHelperFactory;
use UnicaenApp\Service\InstadiaServiceFactory;
......@@ -248,11 +248,11 @@ return [
],
],
],
'console' => [
'router' => [
'console' => [
'router' => [
'routes' => [
'run-sql-script' => [
'type' => Simple::class,
'type' => Simple::class,
'options' => [
'route' => 'run-sql-script --path= [--logfile=] [--connection=]',
'defaults' => [
......@@ -261,8 +261,8 @@ return [
],
],
],
'run-sql-query' => [
'type' => Simple::class,
'run-sql-query' => [
'type' => Simple::class,
'options' => [
'route' => 'run-sql-query --sql= [--logfile=] [--connection=]',
'defaults' => [
......@@ -276,7 +276,7 @@ return [
'view_manager' => [
'display_not_found_reason' => true,
'display_exceptions' => true,
]
],
],
'service_manager' => [
'factories' => [
......@@ -323,12 +323,12 @@ return [
'MouchardCompleterHttp' => 'UnicaenApp\Mouchard\MouchardCompleterHttpFactory',
'MouchardCompleterMvc' => 'UnicaenApp\Mouchard\MouchardCompleterMvcFactory',
MailerService::class => MailerServiceFactory::class,
RunSQLService::class => RunSQLServiceFactory::class,
'instadia' => InstadiaServiceFactory::class,
HostLocalizationUnicaen::class => HostLocalizationUnicaenFactory::class,
MailerService::class => MailerServiceFactory::class,
RunSQLService::class => RunSQLServiceFactory::class,
'instadia' => InstadiaServiceFactory::class,
HostLocalization::class => HostLocalizationFactory::class,
],
'shared' => [
'shared' => [
'MouchardListenerErrorHandler' => false,
'MouchardListenerException' => false,
'MouchardListenerMessenger' => false,
......@@ -347,10 +347,10 @@ return [
ServiceLocatorAwareInitializer::class,
'UnicaenApp\Service\EntityManagerAwareInitializer',
],
'aliases' => [
'MailerService' => MailerService::class,
'HostLocalization' => HostLocalizationUnicaen::class,
]
'aliases' => [
'MailerService' => MailerService::class,
'HostLocalization' => HostLocalization::class,
],
],
'form_elements' => [
'invokables' => [
......@@ -366,10 +366,10 @@ return [
],
],
'view_helpers' => [
'shared' => [
'shared' => [
'formControlGroup' => false,
],
'aliases' => [
'aliases' => [
'appInfos' => AppInfos::class,
'appLink' => AppLink::class,
'userProfileSelect' => UserProfileSelect::class,
......@@ -386,7 +386,7 @@ return [
'uploader' => UploaderHelper::class,
'Uploader' => UploaderHelper::class,
],
'factories' => [
'factories' => [
AppInfos::class => AppInfosFactory::class,
AppLink::class => AppLinkFactory::class,
UserProfileSelect::class => UserProfileSelectFactory::class,
......@@ -454,11 +454,11 @@ return [
'initializers' => [
'UnicaenApp\Service\EntityManagerAwareInitializer',
],
'factories' => [
'UnicaenApp\Controller\Cache' => CacheControllerFactory::class,
'factories' => [
'UnicaenApp\Controller\Cache' => CacheControllerFactory::class,
'UnicaenApp\Controller\Instadia' => InstadiaControllerFactory::class,
ConsoleController::class => ConsoleControllerFactory::class,
]
ConsoleController::class => ConsoleControllerFactory::class,
],
],
'doctrine' => [
......@@ -510,7 +510,7 @@ return [
'strategies' => [
'ViewJsonStrategy', // register JSON renderer strategy
'ViewCsvStrategy', // register CSV renderer strategy
// 'ViewXmlStrategy', // register XML renderer strategy
// 'ViewXmlStrategy', // register XML renderer strategy
// 'ViewFeedStrategy', // register Feed renderer strategy
],
],
......
......@@ -7,6 +7,24 @@
*/
return [
'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)
*/
......@@ -59,5 +77,7 @@ return [
// ['195.220.135.97', '194.199.107.33'], // Via proxy
],
],
],
];
\ No newline at end of file
......@@ -6,8 +6,7 @@ LDAP
### Group
Service d\'accès aux groupes de l\'annuaire LDAP. Avec le gestionnaire
de service, ce service est accessible ainsi :
Service d\'accès aux groupes de l\'annuaire LDAP. Avec le gestionnaire de service, ce service est accessible ainsi :
``` {.php}
$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\
### People
Service d\'accès aux individus de l\'annuaire LDAP. Avec le gestionnaire
de service, ce service est accessible ainsi :
Service d\'accès aux individus de l\'annuaire LDAP. Avec le gestionnaire de service, ce service est accessible ainsi :
``` {.php}
$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
### Structure
Service d\'accès aux structures de l\'annuaire LDAP. Avec le
gestionnaire de service, ce service est accessible ainsi :
Service d\'accès aux structures de l\'annuaire LDAP. Avec le gestionnaire de service, ce service est accessible ainsi :
``` {.php}
$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
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.
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 :
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
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 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
Sinon false.
* En interne, que l'on passe par le proxy en interne Sinon false.
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
......@@ -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
Pour utiliser votre propre système de HostLocalization, il vous faut :
Créer une classe implémentant [HostLocalizationInterface](../src/UnicaenApp/HostLocalization/HostLocalizationInterface.php).
La rendre dispo comme service dans votre config du ServiceManager.
Modifier l'alias de service 'HostLocalization' pour le faire pointer sur votre propre classe.
La rendre dispo comme service dans votre config du ServiceManager. Modifier l'alias de service 'HostLocalization' pour le
faire pointer sur votre propre classe.
Vous pourrez au besoin vous inspirer de [HostLocalizationUnicaen](../src/UnicaenApp/HostLocalization/HostLocalizationUnicaen.php).
\ No newline at end of file
Vous pourrez au besoin vous inspirer de [HostLocalization](../src/UnicaenApp/HostLocalization/HostLocalization.php).
\ No newline at end of file
......@@ -2,43 +2,58 @@
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
* ou bien si la machine est hors réseau
*
* @return bool
*/
public function inEtablissement(): bool
public function __construct($activated, $masqueIp, $proxies, $reverseProxies)
{
$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
$forwarded = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : '';
$this->activated = $activated;
$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',
'193.55.120.24',
'193.55.120.25',
];
/**
* Retourne selon les règles définies en config si on est dans l'établissement ou à l'extérieur.
*
* @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)
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
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
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
return false;
......
......@@ -4,11 +4,18 @@ namespace UnicaenApp\HostLocalization;
use Interop\Container\ContainerInterface;
class HostLocalizationUnicaenFactory
class HostLocalizationFactory
{
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;
}
......
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