· 6 years ago · Mar 17, 2020, 04:20 PM
1<?php
2
3/**
4 * @author Lomig POYET - EGERIE Software
5 * @copyright 2015, EGERIE RiskManager
6 * @version v2.0 10/07/2015
7 */
8
9namespace EgerieFramework\Bundle\RiskManager\Provider;
10
11use Doctrine\DBAL\Types\Type;
12use Doctrine\ORM\EntityManagerInterface;
13use Doctrine\ORM\Tools\Setup;
14use EgerieFramework\Controller\Authentication\AuthenticationController;
15use EgerieFramework\Controller\Download\DownloadController;
16use Silex\Application;
17use Pimple\Container;
18use Pimple\ServiceProviderInterface;
19use Silex\Api\ControllerProviderInterface;
20use Silex\Api\BootableProviderInterface;
21use Doctrine\ORM\Events;
22use Doctrine\ORM\Query;
23use EgerieFramework\Bundle\RiskManager\Api\Administration;
24use EgerieFramework\Bundle\RiskManager\Component\Security\Core\Voter\Ebios2010Voter;
25use EgerieFramework\Bundle\RiskManager\Component\Security\Core\Voter\EbiosRMVoter;
26use EgerieFramework\Bundle\RiskManager\Component\Security\Core\Voter\ISO27005Voter;
27use EgerieFramework\Bundle\RiskManager\Component\Security\Core\Voter\LicenceVoter;
28use EgerieFramework\Bundle\RiskManager\Component\Security\Core\Voter\OwnerVoter;
29use EgerieFramework\Bundle\RiskManager\Controller\Analysis\Context\GravityLevelController;
30use EgerieFramework\Bundle\RiskManager\Controller\Analysis\Context\LikelihoodController;
31use EgerieFramework\Bundle\RiskManager\Controller\Analysis\Context\RiskLevelController;
32use EgerieFramework\Bundle\RiskManager\Controller\Analysis\Context\SecurityCriterionController;
33use EgerieFramework\Bundle\RiskManager\Controller\Analysis\Dashboard\DashboardController;
34use EgerieFramework\Bundle\RiskManager\Controller\Notifications\AssociateModuleController;
35use EgerieFramework\Bundle\RiskManager\Controller\Notifications\CreateAccountController;
36use EgerieFramework\Bundle\RiskManager\Controller\Repository\Shared\SharedConsequenceController;
37use EgerieFramework\Bundle\RiskManager\Controller\Repository\Shared\SharedImpactController;
38use EgerieFramework\Bundle\RiskManager\Controller\Repository\Shared\SharedLikelihoodController;
39use EgerieFramework\Bundle\RiskManager\Controller\Repository\Shared\SharedSurveyController;
40use EgerieFramework\Bundle\RiskManager\Controller\Repository\SharedController;
41use EgerieFramework\Bundle\RiskManager\Controller\Translator\TranslatorController;
42use EgerieFramework\Bundle\RiskManager\ControllerProvider\Administration\AdministrationControllerProvider;
43use EgerieFramework\Bundle\RiskManager\ControllerProvider\Analysis\AnalysisControllerProvider;
44use EgerieFramework\Bundle\RiskManager\ControllerProvider\Analysis\Applicability\ApplicabilityControllerProvider;
45use EgerieFramework\Bundle\RiskManager\ControllerProvider\Analysis\Assessment\AssessmentControllerProvider;
46use EgerieFramework\Bundle\RiskManager\ControllerProvider\Analysis\Context\ContextControllerProvider;
47use EgerieFramework\Bundle\RiskManager\ControllerProvider\Analysis\Context\EbiosRMContextControllerProvider;
48use EgerieFramework\Bundle\RiskManager\ControllerProvider\Analysis\EbiosRMControllerProvider;
49use EgerieFramework\Bundle\RiskManager\ControllerProvider\Analysis\Report\ReportControllerProvider;
50use EgerieFramework\Bundle\RiskManager\ControllerProvider\Analysis\Rtp\RtpControllerProvider;
51use EgerieFramework\Bundle\RiskManager\ControllerProvider\Analysis\Settings\SettingControllerProvider;
52use EgerieFramework\Bundle\RiskManager\ControllerProvider\Analysis\System\SystemControllerProvider;
53use EgerieFramework\Bundle\RiskManager\ControllerProvider\Analysis\Treatment\TreatmentControllerProvider;
54use EgerieFramework\Bundle\RiskManager\ControllerProvider\Api\ApiControllerProvider;
55use EgerieFramework\Bundle\RiskManager\ControllerProvider\Home\HomeControllerProvider;
56use EgerieFramework\Bundle\RiskManager\ControllerProvider\Layout\LayoutControllerProvider;
57use EgerieFramework\Bundle\RiskManager\ControllerProvider\Manage\ManageControllerProvider;
58use EgerieFramework\Bundle\RiskManager\ControllerProvider\Repository\RepositoryControllerProvider;
59use EgerieFramework\Bundle\RiskManager\ControllerProvider\Settings\SettingsControllerProvider;
60use EgerieFramework\Bundle\RiskManager\ControllerProvider\Tracking\TrackingControllerProvider;
61use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Assessment\VulnerabilityDAO;
62use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Context\CommonContextDAO;
63use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Context\EstimatedRiskMatrixDAO;
64use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Context\GravityLevelDAO;
65use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Context\ImpactDAO;
66use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Context\LikelihoodLevelDAO;
67use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Context\MetricsDAO;
68use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Context\RiskLevelDAO;
69use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Context\SecurityCriteriaDAO;
70use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Estimation\FearedIncidentDAO;
71use EgerieFramework\Bundle\RiskManager\DAO\Analysis\ExtraDAO;
72use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Identification\ScenarioDAO;
73use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Iteration\IterationsDAO;
74use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Iteration\SaveIterationDAO;
75use EgerieFramework\Bundle\RiskManager\DAO\Analysis\Setting\SettingDAO;
76use EgerieFramework\Bundle\RiskManager\DAO\Analysis\StepperDAO;
77use EgerieFramework\Bundle\RiskManager\DAO\Analysis\System\SupportingAssetDAO;
78use EgerieFramework\Bundle\RiskManager\Domain\Analysis\Applicability\Applicabilities;
79use EgerieFramework\Bundle\RiskManager\Domain\Analysis\Assessment\Controls;
80use EgerieFramework\Bundle\RiskManager\Domain\Analysis\Assessment\FearedEvents;
81use EgerieFramework\Bundle\RiskManager\Domain\Analysis\Assessment\RiskScenarios;
82use EgerieFramework\Bundle\RiskManager\Domain\Analysis\Assessment\Vulnerabilities;
83use EgerieFramework\Bundle\RiskManager\Domain\Analysis\Context\CriticalityLevels;
84use EgerieFramework\Bundle\RiskManager\Domain\Analysis\Context\RiskLevels;
85use EgerieFramework\Bundle\RiskManager\Domain\Analysis\EbiosRM\Assessment\Strategy\RelevanceStrategy;
86use EgerieFramework\Bundle\RiskManager\Domain\Analysis\EbiosRM\Assessment\Strategy\RiskStrategy;
87use EgerieFramework\Bundle\RiskManager\Domain\Analysis\EbiosRM\Assessment\Strategy\ThreatStrategy;
88use EgerieFramework\Bundle\RiskManager\Domain\Analysis\Report\Reports;
89use EgerieFramework\Bundle\RiskManager\Domain\Analysis\System\Owners;
90use EgerieFramework\Bundle\RiskManager\Domain\Analysis\System\PrimaryAssets;
91use EgerieFramework\Bundle\RiskManager\Domain\Analysis\System\SupportingAssets;
92use EgerieFramework\Bundle\RiskManager\Domain\Repository\Shared;
93use EgerieFramework\Bundle\RiskManager\Domain\Settings\Modules;
94use EgerieFramework\Bundle\RiskManager\Domain\Users\SSO;
95use EgerieFramework\Bundle\RiskManager\Domain\Users\Users;
96use EgerieFramework\Bundle\RiskManager\FormType\FilterType;
97use EgerieFramework\Bundle\RiskManager\Normalizer\AnalysisNormalizer;
98use EgerieFramework\Bundle\RiskManager\Normalizer\ApplicabilityNormalizer;
99use EgerieFramework\Bundle\RiskManager\Normalizer\Assessment\ControlApplicationNormalizer;
100use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Assessment\AttackPathNormalizer;
101use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Assessment\FearedEventNormalizer;
102use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Assessment\OperationalScenarioElementaryActionNormalizer;
103use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Assessment\OperationalScenarioNormalizer;
104use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Assessment\RiskSourceNormalizer;
105use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Assessment\RiskSourceObjectiveNormalizer;
106use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Assessment\RiskSourcesObjectivesStakeholderNormalizer;
107use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Assessment\StakeholderNormalizer;
108use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Assessment\StrategicScenarioGraphLksNormalizer;
109use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Assessment\StrategicScenarioGraphNormalizer;
110use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Assessment\ThreatSourceNormalizer;
111use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\GraphLinksNormalizer;
112use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Settings\Category\CategoryNormalizer;
113use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Settings\Category\PropositionNormalizer;
114use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Settings\Category\QuestionNormalizer;
115use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\Settings\Category\SectionNormalizer;
116use EgerieFramework\Bundle\RiskManager\Normalizer\EbiosRM\System\ObjectiveNormalizer;
117use EgerieFramework\Bundle\RiskManager\Normalizer\ElementaryActionNormalizer;
118use EgerieFramework\Bundle\RiskManager\Normalizer\GenericItemNormalizer;
119use EgerieFramework\Bundle\RiskManager\Normalizer\MetricLevelNormalizer;
120use EgerieFramework\Bundle\RiskManager\Normalizer\OwnerNormalizer;
121use EgerieFramework\Bundle\RiskManager\Normalizer\ReportNormalizer;
122use EgerieFramework\Bundle\RiskManager\Normalizer\ScaleNormalizer;
123use EgerieFramework\Bundle\RiskManager\Normalizer\SecurityCriteriaNormalizer;
124use EgerieFramework\Bundle\RiskManager\Normalizer\Survey\AnswerCustomizationNormalizer;
125use EgerieFramework\Bundle\RiskManager\Normalizer\Survey\ChoiceCustomizationNormalizer;
126use EgerieFramework\Bundle\RiskManager\Normalizer\Survey\QuestionCustomizationNormalizer;
127use EgerieFramework\Bundle\RiskManager\Normalizer\Survey\SectionCustomizationNormalizer;
128use EgerieFramework\Bundle\RiskManager\ORM\Listeners\EbiosRM\ElementaryActionListener;
129use EgerieFramework\Bundle\RiskManager\ORM\Listeners\EbiosRM\FearedEventListener;
130use EgerieFramework\Bundle\RiskManager\ORM\Listeners\EbiosRM\OperationalScenarioListener;
131use EgerieFramework\Bundle\RiskManager\ORM\Listeners\EbiosRM\RelevanceAwareListener;
132use EgerieFramework\Bundle\RiskManager\ORM\Listeners\EbiosRM\RiskAwareListener;
133use EgerieFramework\Bundle\RiskManager\ORM\Listeners\EbiosRM\RiskSourcesObjectivesListener;
134use EgerieFramework\Bundle\RiskManager\ORM\Listeners\EbiosRM\ThreatAwareListener;
135use EgerieFramework\Bundle\RiskManager\ORM\Listeners\RiskScenarioListener;
136use EgerieFramework\Bundle\RiskManager\Service\AuthenticationSuccessHandler;
137use EgerieFramework\Bundle\RiskManager\Service\EbiosGraphService;
138use EgerieFramework\Bundle\RiskManager\Service\ErmxTransformerService;
139use EgerieFramework\Bundle\RiskManager\Service\RiskScenarioService;
140use EgerieFramework\Bundle\RiskManager\Service\StarsService;
141use EgerieFramework\Bundle\RiskManager\Service\TreeContainerService;
142use EgerieFramework\Component\JWT\Security\Guard\Authenticator\JwtAuthenticator;
143use EgerieFramework\Component\ORM\ContainerAwareEntityListenerResolver;
144use EgerieFramework\Component\Security\Core\Role\PermissionHierarchy;
145use EgerieFramework\Component\Security\Guard\Authenticator\FormAuthenticator;
146use EgerieFramework\Component\Security\Guard\Authenticator\OidcAuthenticator;
147use EgerieFramework\Component\Security\Guard\Authenticator\SamlAuthenticator;
148use EgerieFramework\Component\Serializer\Encoder\XmlEncoder;
149use EgerieFramework\Component\Serializer\Serializer;
150use EgerieFramework\Component\Validator\XMLImportValidator;
151use EgerieFramework\ControllerProvider\MessengerControllerProvider;
152use EgerieFramework\DAO\Authentication\AuthenticationDAO;
153use EgerieFramework\Domain\InMemoryScale;
154use EgerieFramework\Domain\SerializableUser;
155use EgerieFramework\ORM\Domain\EntityScale;
156use EgerieFramework\ORM\Listeners\RepositoryListener;
157use EgerieFramework\Provider\Traits\RepositoryProvider;
158use EgerieFramework\Service\ContainerService;
159use EgerieFramework\Service\OIDCService;
160use EgerieFramework\Traits\Role\RoleTrait;
161use EgerieFramework\Traits\User\UserTrait;
162use Gedmo\Tree\Entity\Repository\AbstractTreeRepository;
163use Doctrine\DBAL\DriverManager;
164use Doctrine\DBAL\Configuration;
165use Doctrine\Common\EventManager;
166use Doctrine\ORM\EntityManager;
167use Doctrine\ORM\Configuration as ORMConfiguration;
168use Doctrine\ORM\Mapping\DefaultEntityListenerResolver;
169use Doctrine\ORM\Mapping\DefaultNamingStrategy;
170use Doctrine\ORM\Mapping\DefaultQuoteStrategy;
171use Doctrine\ORM\Mapping\Driver\Driver;
172use Doctrine\ORM\Mapping\Driver\SimplifiedXmlDriver;
173use Doctrine\ORM\Mapping\Driver\SimplifiedYamlDriver;
174use Doctrine\ORM\Mapping\Driver\XmlDriver;
175use Doctrine\ORM\Mapping\Driver\YamlDriver;
176use Doctrine\ORM\Mapping\Driver\PHPDriver;
177use Doctrine\ORM\Repository\DefaultRepositoryFactory;
178use Saxulum\SaxulumWebProfiler\Logger\DbalLogger;
179use Silex\Translator;
180use Symfony\Component\HttpFoundation\Request;
181use Symfony\Component\HttpFoundation\RedirectResponse;
182use Symfony\Component\HttpFoundation\Response;
183use Symfony\Component\HttpKernel\Event\GetResponseEvent;
184use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
185use Symfony\Component\HttpKernel\HttpKernelInterface;
186use Symfony\Component\HttpKernel\KernelEvents;
187use Symfony\Component\HttpKernel\Event\KernelEvent;
188use Symfony\Component\Security\Core\Encoder\Pbkdf2PasswordEncoder;
189use EgerieFramework\Bundle\RiskManager\Component\Security\Core\Voter\ModuleVoter;
190use EgerieFramework\Bundle\RiskManager\Domain\Analysis;
191use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
192use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
193use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
194use Symfony\Component\Serializer\Normalizer\DataUriNormalizer;
195use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
196use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
197use Symfony\Component\Translation\Loader\YamlFileLoader;
198use EgerieFramework\Bundle\RiskManager\Domain\Module\Permissions;
199use EgerieFramework\Bundle\RiskManager\Controller\Home\HomeController;
200use EgerieFramework\Bundle\RiskManager\Controller\ImportController;
201use EgerieFramework\Bundle\RiskManager\Controller\Notifications\MessagesController;
202use EgerieFramework\Bundle\RiskManager\Domain\Analysis\Context\SecurityCriteria;
203use EgerieFramework\Bundle\RiskManager\Domain\Analysis\Synoptic\Steppers;
204use EgerieFramework\Bundles\FileManager\FileManagerController;
205use EgerieFramework\Bundles\Translator\TranslateController;
206use EgerieFramework\Controller\Administration\AdministrationController;
207use EgerieFramework\Controller\Modules\Logs\LogsController;
208use EgerieFramework\Controller\MonitorController;
209use EgerieFramework\Domain\Users\Organisations;
210
211/**
212 * Class RiskManagerServiceProvider
213 * @package EgerieFramework\Bundle\RiskManager\Provider
214 */
215class RiskManagerServiceProvider implements ServiceProviderInterface, ControllerProviderInterface, BootableProviderInterface
216{
217 use RoleTrait;
218 use RepositoryProvider;
219
220 protected $validatedTables = [
221 'criticality_levels',
222 'security_criteria_levels',
223 'security_criteria',
224 'common_scale',
225 'e_gravite',
226 'primary_assets',
227 'supporting_assets',
228 'vulnerabilities',
229 'responsable',
230 'owned_links',
231 'controls',
232 'threat_sources',
233 'applicability',
234 'controls__efficiency__status',
235 'report',
236 'report_type',
237 'report_format',
238 'report_page'
239 ];
240
241 protected $bundlePath;
242
243 /**
244 * RiskManagerServiceProvider constructor.
245 */
246 public function __construct()
247 {
248 $this->bundlePath = dirname(__DIR__);
249 }
250
251 /**
252 * @param $app
253 */
254 private function setEmOptions($app) {
255
256// dump($app);
257
258 /* @var $em EntityManager */
259 $em = $app['orm.em'];
260 /* @var $em EntityManager */
261
262 $pdo = $em->getConnection();
263 $dbOptions = $app->offsetExists('dbs.options') ? $app['dbs.options'] : ['default' => $app['db.options']];
264 $emOptions = $app->offsetExists('orm.ems.options') ? $app['orm.ems.options'] : ['default' => $app['orm.em.options']];
265
266 $modules = [];
267 $infoModules = [];
268 $moduleIds = [];
269
270 if (($res = $pdo->query("SHOW DATABASES LIKE 'users'")) && $res->fetchColumn()) {
271// if ($stmt = $pdo->query("SHOW DATABASES WHERE EXISTS(SELECT name_bdd_module FROM users.modules WHERE `Database` LIKE CONCAT('".ref."',name_bdd_module))")) {
272 if ($stmt = $pdo->query("SELECT * FROM users.modules order by id_module")) {
273 $i = 0;
274 while ($row = $stmt->fetch()) {
275 // Default values
276 $row += [
277 'parent_id' => null,
278 'iterated_at' => null,
279 'revision' => null
280 ];
281 $id = $row['id_module'];
282 $module = $row['name_bdd_module'];
283 $parentId = $row['parent_id'];
284 $nameReelModule = $row['name_reel_module'];
285 $iteratedAt = $row['iterated_at'];
286 $revision = (int) $row['revision'];
287 $moduleIds[$id] = $module;
288 $infoModules[$module]['id'] = $id;
289 $infoModules[$module]['name_bdd_module'] = $module;
290 $infoModules[$module]['name_reel_module'] = $nameReelModule;
291 $infoModules[$module]['parent_id'] = $parentId;
292 $infoModules[$module]['is_iteration'] = isset($parentId);
293 $infoModules[$module]['has_iteration'] = isset($parentId);
294 $infoModules[$module]['iteration_base_module'] = $module;
295 $infoModules[$module]['last_revision'] = $revision;
296 $infoModules[$module]['iterated_at'] = $iteratedAt;
297
298 if (array_key_exists($parentId, $moduleIds)) {
299 $parentNameBddModule = $moduleIds[$parentId];
300 $infoModules[$module]['iteration_base_module'] = $parentNameBddModule;
301 $infoModules[$parentNameBddModule]['has_iteration'] = true;
302 $infoModules[$parentNameBddModule]['last_revision'] =
303 max([$infoModules[$parentNameBddModule]['last_revision'], $revision]);
304 }
305
306 $modules[$id] = $module;// = substr($module, strlen(ref));
307 $options = $app['dbs.options'];
308 $options[$module] = array_merge($app['dbs.options']['default'], ['dbname' => ref . $module]);
309 $app['dbs.options'] = $options;
310
311 $app['dbs.config'][$module] = function () use ($app, $module) {
312 $config = \Doctrine\ORM\Tools\Setup::createConfiguration(true);
313 $config->setFilterSchemaAssetsExpression('/^(?:' . implode('|', $this->validatedTables) . ')$/');
314 return $config;
315 };
316
317 $app['dbs.event_manager'][$module] = function () use ($app, $module) {
318 return new EventManager();
319 };
320
321 $app['dbs'][$module] = function () use ($app, $module) {
322 $options = $app['dbs.options'][$module];
323 $config = $app['dbs.config'][$module];
324 $manager = $app['dbs.event_manager'][$module];
325
326 return DriverManager::getConnection($options, $config, $manager);
327 };
328
329 if (isset($app['profiler'])) {
330 $dataCollector = $app['profiler']->get('db');
331 $logger = new DbalLogger($app['monolog'], $app['stopwatch']);
332 $app['doctrine']->getConnection($module)->getConfiguration()->setSQLLogger($logger);
333 $dataCollector->addLogger($module, $logger);
334 }
335
336 $options = $app['orm.ems.options'];
337 $options[$module] = [
338 'connection' => $module,
339 'mappings' => [
340 [
341 'type' => 'php',
342 'namespace' => 'EgerieFramework\\Bundle\\RiskManager\\Domain\\',
343 'path' => $this->bundlePath . '/ORM/Mapping/'
344 ],
345 [
346 'type' => 'yml',
347 'namespace' => 'EgerieFramework\\Bundle\\RiskManager\\Domain\\',
348 'path' => $this->bundlePath . '/ORM/Mapping/'
349 ]
350 ],
351 'types' => [],
352 'extensions' => [
353 'scale',
354 'tree',
355 'sort'
356 ]
357 ];
358
359 $app['orm.ems.options'] = $options;
360
361 $app['module.container'][$module] = function ($data = null) use ($app, $module) {
362 $c = new \Pimple\Container();
363 $c['analysis'] = function () {
364 $analysis = new Analysis();
365 return $analysis;
366 };
367 $c['service.risk'] = function () use ($app, $module) {
368 return new RiskScenarioListener();
369 };
370 $c['riskLevelScale'] = function () use ($app, $module) {
371 $scale = new EntityScale($app['orm.ems'][$module]->getRepository(RiskLevels::class));
372 return $scale;
373 };
374 $c['sensitivityScale'] = function () use ($app, $module) {
375 $scale = new InMemoryScale();
376 $scale->setLevels($app['orm.ems'][$module]->getRepository(CriticalityLevels::class)->findAll([], ['level' => 'ASC']));
377 return $scale;
378 };
379 $c['service.scales'] = function () use ($app, $module) {
380 $types = ['dependence', 'penetration', 'maturity', 'trust', 'exposure', 'reliability', 'threat', 'motivation', 'ressource', 'activity', 'relevance', 'risk', 'severity', 'likelihood', 'success', 'difficulty'];
381 $data = $app['dao.metrics']()->findDataByScaleForDraw($types);
382
383 return $data;
384 };
385 $c['api'] = function () use ($app, $module) {
386 return new \EgerieFramework\Bundle\RiskManager\Api\Analysis;
387 };
388 return $c;
389 };
390 }
391 }
392 }
393
394 $app['modules'] = $modules;
395 $app['info.modules'] = $infoModules;
396
397 /* @var $em EntityManager */
398 $em = $app['orm.em'];
399 /* @var $em EntityManager */
400
401 $pdo = $em->getConnection();
402 if (($res = $pdo->query("SHOW DATABASES LIKE 'users'")) && $res->fetchColumn()) {
403// if ($stmt = $pdo->query("SHOW DATABASES WHERE EXISTS(SELECT name_bdd_module FROM users.modules WHERE `Database` LIKE CONCAT('".ref."',name_bdd_module))")) {
404 if ($stmt = $pdo->query("SELECT * FROM users.modules order by id_module")) {
405 $i = 0;
406 while ($row = $stmt->fetch()) {
407 // Default values
408 $row += [
409 'parent_id' => null,
410 'iterated_at' => null,
411 'revision' => null
412 ];
413 $id = $row['id_module'];
414 $module = $row['name_bdd_module'];
415 $parentId = $row['parent_id'];
416 $nameReelModule = $row['name_reel_module'];
417 $iteratedAt = $row['iterated_at'];
418 $revision = (int) $row['revision'];
419 $moduleIds[$id] = $module;
420 $infoModules[$module]['id'] = $id;
421 $infoModules[$module]['name_bdd_module'] = $module;
422 $infoModules[$module]['name_reel_module'] = $nameReelModule;
423 $infoModules[$module]['parent_id'] = $parentId;
424 $infoModules[$module]['is_iteration'] = isset($parentId);
425 $infoModules[$module]['has_iteration'] = isset($parentId);
426 $infoModules[$module]['iteration_base_module'] = $module;
427 $infoModules[$module]['last_revision'] = $revision;
428 $infoModules[$module]['iterated_at'] = $iteratedAt;
429
430 if (array_key_exists($parentId, $moduleIds)) {
431 $parentNameBddModule = $moduleIds[$parentId];
432 $infoModules[$module]['iteration_base_module'] = $parentNameBddModule;
433 $infoModules[$parentNameBddModule]['has_iteration'] = true;
434 $infoModules[$parentNameBddModule]['last_revision'] =
435 max([$infoModules[$parentNameBddModule]['last_revision'], $revision]);
436 }
437
438 $modules[$id] = $module;// = substr($module, strlen(ref));
439 $options = $app['dbs.options'];
440 $options[$module] = array_merge($app['dbs.options']['default'], ['dbname' => ref . $module]);
441 $app['dbs.options'] = $options;
442
443 $app['dbs.config'][$module] = function () use ($app, $module) {
444 $config = \Doctrine\ORM\Tools\Setup::createConfiguration(true);
445 $config->setFilterSchemaAssetsExpression('/^(?:' . implode('|', $this->validatedTables) . ')$/');
446 return $config;
447 };
448
449 $app['dbs.event_manager'][$module] = function () use ($app, $module) {
450 return new EventManager();
451 };
452
453 $app['dbs'][$module] = function () use ($app, $module) {
454 $options = $app['dbs.options'][$module];
455 $config = $app['dbs.config'][$module];
456 $manager = $app['dbs.event_manager'][$module];
457
458 return DriverManager::getConnection($options, $config, $manager);
459 };
460
461 if (isset($app['profiler'])) {
462 $dataCollector = $app['profiler']->get('db');
463 $logger = new DbalLogger($app['monolog'], $app['stopwatch']);
464 $app['doctrine']->getConnection($module)->getConfiguration()->setSQLLogger($logger);
465 $dataCollector->addLogger($module, $logger);
466 }
467
468 $options = $app['orm.ems.options'];
469 $options[$module] = [
470 'connection' => $module,
471 'mappings' => [
472 [
473 'type' => 'php',
474 'namespace' => 'EgerieFramework\\Bundle\\RiskManager\\Domain\\',
475 'path' => $this->bundlePath . '/ORM/Mapping/'
476 ],
477 [
478 'type' => 'yml',
479 'namespace' => 'EgerieFramework\\Bundle\\RiskManager\\Domain\\',
480 'path' => $this->bundlePath . '/ORM/Mapping/'
481 ]
482 ],
483 'types' => [],
484 'extensions' => [
485 'scale',
486 'tree',
487 'sort'
488 ]
489 ];
490
491 $app['orm.ems.options'] = $options;
492
493 $app['module.container'][$module] = function ($data = null) use ($app, $module) {
494 $c = new \Pimple\Container();
495 $c['analysis'] = function () {
496 $analysis = new Analysis();
497 return $analysis;
498 };
499 $c['service.risk'] = function () use ($app, $module) {
500 return new RiskScenarioListener();
501 };
502 $c['riskLevelScale'] = function () use ($app, $module) {
503 $scale = new EntityScale($app['orm.ems'][$module]->getRepository(RiskLevels::class));
504 return $scale;
505 };
506 $c['sensitivityScale'] = function () use ($app, $module) {
507 $scale = new InMemoryScale();
508 $scale->setLevels($app['orm.ems'][$module]->getRepository(CriticalityLevels::class)->findAll([], ['level' => 'ASC']));
509 return $scale;
510 };
511 $c['service.scales'] = function () use ($app, $module) {
512 $types = ['dependence', 'penetration', 'maturity', 'trust', 'exposure', 'reliability', 'threat', 'motivation', 'ressource', 'activity', 'relevance', 'risk', 'severity', 'likelihood', 'success', 'difficulty'];
513 $data = $app['dao.metrics']()->findDataByScaleForDraw($types);
514
515 return $data;
516 };
517 $c['api'] = function () use ($app, $module) {
518 return new \EgerieFramework\Bundle\RiskManager\Api\Analysis;
519 };
520 return $c;
521 };
522 }
523 }
524 }
525
526 }
527
528 /**
529 * @param Container $app
530 * @throws \Exception
531 */
532 public function register(Container $app)
533 {
534
535 $app->on(KernelEvents::REQUEST, function ($eventResponse, $request) use ($app) {
536
537// dump($app);
538// dump($request);
539
540 $this->setEmOptions($app);
541 }, 10);
542 $app->extend('orm.ems.config', function ($configs) use ($app) {
543// dump($app['orm.ems.options']);
544 foreach ($app['orm.ems.options'] as $name => $options) {
545 if ($configs->offsetExists($name)) {
546 continue;
547 }
548
549 $config = new ORMConfiguration();
550
551 $app['orm.cache.configurer']($name, $config, $options);
552
553 $config->setProxyDir($app['orm.proxies_dir']);
554 $config->setProxyNamespace($app['orm.proxies_namespace']);
555 $config->setAutoGenerateProxyClasses($app['orm.auto_generate_proxies']);
556
557 $config->setCustomStringFunctions($app['orm.custom.functions.string']);
558 $config->setCustomNumericFunctions($app['orm.custom.functions.numeric']);
559 $config->setCustomDatetimeFunctions($app['orm.custom.functions.datetime']);
560 $config->setCustomHydrationModes($app['orm.custom.hydration_modes']);
561
562 $config->setClassMetadataFactoryName($app['orm.class_metadata_factory_name']);
563 $config->setDefaultRepositoryClassName($app['orm.default_repository_class']);
564
565 $config->setEntityListenerResolver($app['orm.entity_listener_resolver']);
566 $config->setRepositoryFactory($app['orm.repository_factory']);
567
568 $config->setNamingStrategy($app['orm.strategy.naming']);
569 $config->setQuoteStrategy($app['orm.strategy.quote']);
570
571 $chain = $app['orm.mapping_driver_chain.locator']($name);
572 foreach ((array) $options['mappings'] as $entity) {
573 if (!is_array($entity)) {
574 throw new \InvalidArgumentException(
575 "The 'orm.em.options' option 'mappings' should be an array of arrays."
576 );
577 }
578
579 if (!empty($entity['resources_namespace'])) {
580 $entity['path'] = $app['psr0_resource_locator']->findFirstDirectory($entity['resources_namespace']);
581 }
582
583 if (isset($entity['alias'])) {
584 $config->addEntityNamespace($entity['alias'], $entity['namespace']);
585 }
586
587 switch ($entity['type']) {
588 case 'annotation':
589 $useSimpleAnnotationReader = isset($entity['use_simple_annotation_reader']) ? $entity['use_simple_annotation_reader'] : true;
590 $driver = $config->newDefaultAnnotationDriver((array) $entity['path'], $useSimpleAnnotationReader);
591 $chain->addDriver($driver, $entity['namespace']);
592 break;
593 case 'yml':
594 $driver = new YamlDriver($entity['path']);
595 $chain->addDriver($driver, $entity['namespace']);
596 break;
597 case 'simple_yml':
598 $driver = new SimplifiedYamlDriver(array($entity['path'] => $entity['namespace']));
599 $chain->addDriver($driver, $entity['namespace']);
600 break;
601 case 'xml':
602 $driver = new XmlDriver($entity['path']);
603 $chain->addDriver($driver, $entity['namespace']);
604 break;
605 case 'simple_xml':
606 $driver = new SimplifiedXmlDriver(array($entity['path'] => $entity['namespace']));
607 $chain->addDriver($driver, $entity['namespace']);
608 break;
609 case 'php':
610 $driver = new PHPDriver($entity['path']);
611 $chain->addDriver($driver, $entity['namespace']);
612 break;
613 default:
614 throw new \InvalidArgumentException(sprintf('"%s" is not a recognized driver', $entity['type']));
615 break;
616 }
617 }
618 $config->setMetadataDriverImpl($chain);
619
620 foreach ((array) $options['types'] as $typeName => $typeClass) {
621 if (Type::hasType($typeName)) {
622 Type::overrideType($typeName, $typeClass);
623 } else {
624 Type::addType($typeName, $typeClass);
625 }
626 }
627
628 $configs[$name] = $config;
629 }
630 return $configs;
631 });
632 $app->extend('orm.ems', function($ems) use($app) {
633 foreach ($app['orm.ems.options'] as $name => $options) {
634
635 if ($app['orm.ems.default'] === $name) {
636 // we use shortcuts here in case the default has been overridden
637 $config = $app['orm.em.config'];
638 } else {
639 $config = $app['orm.ems.config'][$name];
640 }
641
642 if (! isset($ems[$name])) {
643 $ems[$name] = function ($ems) use ($app, $options, $config, $name) {
644 $em = EntityManager::create(
645 $app['dbs'][$options['connection']],
646 $config,
647 $app['dbs.event_manager'][$options['connection']]
648 );
649 return $em;
650 };
651 }
652 if (isset($options['extensions']) && $app->offsetExists('orm.ems.load_extension')) {
653 foreach ($options['extensions'] as $extension) {
654 $app['orm.ems.load_extension']($extension, $ems, $name);
655 }
656 }
657 }
658
659 return $ems;
660 });
661
662 $app['egerie.bundles'] = function () {
663 return new Container();
664 };
665
666 //Lien avec la base users.modules
667 $app['dbs.options'] = array_merge($app['dbs.options'], [
668 'modules' => array_merge($app['dbs.options']['default'], ['dbname' => 'users']),
669 'import' => array_merge($app['dbs.options']['default'], ['dbname' => 'import']),
670 ]);
671
672
673 $app['orm.ems.options'] = array_merge($app['orm.ems.options'], [
674 'modules' => [
675 'connection' => 'modules',
676 'mappings' => [
677 [
678 'type' => 'yml',
679 'namespace' => 'EgerieFramework\\Bundle\\RiskManager\\Domain\\',
680 'path' => $this->bundlePath . '/ORM/Mapping/'
681 ]
682 ],
683 'types' => [],
684 'extensions' => [
685 'tree',
686 'sort'
687 ]
688 ]
689 ]);
690
691 $app['egerie.risk_manager.name'] = 'EgerieRM';
692 $app['egerie.risk_manager.views'] = $this->bundlePath . '/Resources/views';
693 $app['egerie.risk_manager.path'] = '/EgerieRM';
694 $app['egerie.risk_manager.orm_path'] = $this->bundlePath . '/ORM/Mapping/';
695
696 $this->repositoryProvider($app, 'RiskManager');
697
698 if (isset($app['security.firewalls'])) { // Change default_target_path for each role
699 $app['security.authentication.success_handler.riskmanager'] = function () use ($app) {
700 $handler = new AuthenticationSuccessHandler(
701 $app['security.http_utils'],
702 $app['security.firewalls']['riskmanager']['form'],
703 $app['security.token_storage']
704 );
705 $handler->setProviderKey('riskmanager');
706
707 return $handler;
708 };
709
710 $app['riskmanager.form_authenticator'] = function () use ($app) {
711 return new FormAuthenticator(
712 $app['security.encoder_factory'],
713 $app['url_generator'],
714 'EgerieRM'
715 );
716 };
717
718 $app['riskmanager.oidc_authenticator'] = function () use ($app) {
719 return new OidcAuthenticator(
720 $app['security.token_storage'],
721 $app['oidc.client_factory'],
722 $app['security.authentication.success_handler.riskmanager']
723 );
724 };
725
726 $app['riskmanager.jwt_authenticator1'] = function () use ($app) {
727 return new JwtAuthenticator(
728 $app['security.token_storage'],
729 JwtAuthenticator::AUTH_TYPE_GET_TOKEN
730 );
731 };
732
733 $app['riskmanager.jwt_authenticator2'] = function () use ($app) {
734 return new JwtAuthenticator($app['security.token_storage']);
735 };
736
737 $app['riskmanager.saml_authenticator'] = function () use ($app) {
738 return new SamlAuthenticator(
739 $app['security.token_storage'],
740 $app['saml.client_factory'],
741 $app['security.authentication.success_handler.riskmanager']
742 );
743 };
744
745 $authenticators = ['riskmanager.form_authenticator'];
746 if ($app['php.extensions']['cURL']) {
747 $authenticators[] = 'riskmanager.oidc_authenticator';
748 }
749 $authenticators[] = 'riskmanager.saml_authenticator';
750 $authenticators[] = 'riskmanager.jwt_authenticator1';
751 $apiAuthenticators = ['riskmanager.jwt_authenticator2'];
752
753 $app['security.firewalls'] = array_merge(
754 [
755 'rm_login' => [
756 'pattern' => '^' . $app['egerie.risk_manager.path'] . '/login$',
757 ],
758 'rm_forgotPassword' => [
759 'pattern' => '^' . $app['egerie.risk_manager.path'] . '/SendPassword',
760 ],
761 'rm_resetPassword' => [
762 'pattern' => '^' . $app['egerie.risk_manager.path'] . '/ResetPassword',
763 ],
764 'rm_licence' => [
765 'pattern' => '^' . $app['egerie.risk_manager.path'] . '/Administration/Licence/createOff$',
766 ],
767 'rm_forceDownload' => [
768 'pattern' => '^' . $app['egerie.risk_manager.path'] . '/downloadFileOff$',
769 ],
770 'rm_assets' => [
771 'pattern' => '^' . $app['egerie.risk_manager.path'] . '/assets/',
772 ],
773 'rm_api' => [
774 'pattern' => '^' . $app['egerie.risk_manager.path'] . '/api',
775 'guard' => [
776 'entry_point' => 'riskmanager.jwt_authenticator2',
777 'authenticators' => $apiAuthenticators
778 ],
779 'stateless' => true,
780 'users' => function () use ($app) {
781 return new AuthenticationDAO($app);
782 },
783 ],
784 'riskmanager' => [
785 'pattern' => '^' . $app['egerie.risk_manager.path'],
786 'context' => 'secured',
787 'guard' => [
788 'entry_point' => 'riskmanager.form_authenticator',
789 'authenticators' => $authenticators
790 ],
791 'form' => [
792 'login_path' => $app['egerie.risk_manager.path'] . '/login',
793 'check_path' => $app['egerie.risk_manager.path'] . '/login_check',
794 'default_target_path' => $app['egerie.risk_manager.path'] . '/',
795 'root_target_path' => $app['egerie.risk_manager.path'] . '/Administration/Modules',
796 'user_target_path' => $app['egerie.risk_manager.path'] . '/',
797 'direction_target_path' => $app['egerie.risk_manager.path'] . '/Manage/Cartography',
798 'dpo_target_path' => $app['egerie.risk_manager.path'] . '/',
799 ],
800 'users' => function () use ($app) {
801 return new AuthenticationDAO($app);
802 },
803 'logout' => [
804 'logout_path' => $app['egerie.risk_manager.path'] . '/logout',
805 'target_url' => $app['egerie.risk_manager.path'] . '/login'
806 ],
807 ],
808 ],
809 $app['security.firewalls']
810 );
811
812 /**
813 * TRR- Table users.global_roles
814 * Role 1(ROLE_Deny) : On bloque l'accès au logiciel à l'utilisateur.
815 * Role 2(ROLE_Admin): Ce rôle permet d'accéder uniquement à l'interface d'administration.
816 * Role 3(ROLE_User) : Ce rôle permet d'accéder aux modules disponibles pour la personne connectée.
817 * Role 4(ROLE_Root) : Ce rôle permet d'accéder à la partie administration et aux modules.
818 * Les modifications du role des users est effective dès qu'il se déconnecte et se reconnecte.
819 */
820 $app['security.access_rules'] = array_merge($app['security.access_rules'], [
821 array('^' . $app['egerie.risk_manager.path'] . '/Administration/ManageList/removeSession', array('ROLE_Root')),
822 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Modules', array('ROLE_SimpleUser')),
823 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Organisations', array('ROLE_Admin', 'ROLE_Root')),
824 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Tools', array('ROLE_SimpleUser')),
825 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Users', array('ROLE_Admin', 'ROLE_Root')),
826 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Authentication', array('ROLE_Root')),
827 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Licence', array('ROLE_Root')),
828 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Software', array('ROLE_Root')),
829 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Profil', array('ROLE_Admin', 'ROLE_User', 'ROLE_Root','ROLE_Direction')),
830 array('^' . $app['egerie.risk_manager.path'] . '/Software/Release', array('ROLE_Admin', 'ROLE_User', 'ROLE_Root','ROLE_Direction')),
831 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Logs', array('ROLE_Root')),
832 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Backup', array('ROLE_Root')),
833 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Terminology', array('ROLE_Root')),
834 array('^' . $app['egerie.risk_manager.path'] . '/Notifications/(Create|Configuration)', array('ROLE_Root', 'ROLE_Admin')),
835 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Monitoring', array('ROLE_Root')),
836 array('^' . $app['egerie.risk_manager.path'] . '/Administration/AccessTokens', array('ROLE_SimpleUser')),
837 array('^' . $app['egerie.risk_manager.path'] . '/Module/\d+/Question', array('ROLE_Admin')),
838 array('^' . $app['egerie.risk_manager.path'] . '/Module/\d+/Report', array('ROLE_Direction')),
839 array('^' . $app['egerie.risk_manager.path'] . '/Module/\d+/.*?/detail/\d+', array('ROLE_Direction')),
840 /**
841 * Fixes errors on reports when the user has ROLE_Direction
842 * @see https://jira.egerie-software.com/projects/ESS/queues/issue/ESS-563
843 */
844 array('^' . $app['egerie.risk_manager.path'] . '/Module/\d+/\w+.*\.json', array('ROLE_Direction')),
845 array('^' . $app['egerie.risk_manager.path'] . '/Module/\d+/Rtp', array('ROLE_Direction')),
846 array(
847 '^' . $app['egerie.risk_manager.path'] . '/Module/\d+/(?!System/\w+Asset|Metric/Consequence|Metric/Severity$|Assessment/Vulnerability|Assessment/FearedEvent)',
848 array('ROLE_SimpleUser')
849 ),
850 array('^' . $app['egerie.risk_manager.path'] . '/Module/\d+/(?!Metric/Severity$)', array('ROLE_User')),
851 array('^' . $app['egerie.risk_manager.path'] . '/Administration/Configurationuration/Terminology', array('ROLE_Root')),
852 array('^' . $app['egerie.risk_manager.path'] . '/api', array('ROLE_User')),
853 ]);
854
855 $app['security.role_hierarchy'] = array_merge(
856 $app['security.role_hierarchy'],
857 [
858 'ROLE_Root' => ['ROLE_Admin'],
859 'ROLE_ScopedUser' => ['ROLE_User', 'ROLE_SimpleUser'],
860 'ROLE_User' => ['ROLE_SimpleUser'],
861 'ROLE_SimpleUser' => ['ROLE_Direction']
862 ]
863 );
864
865 $app['security.permission_hierarchy'] = array_merge(
866 $app['security.permission_hierarchy'],
867 [
868 ### Supporting Assets
869 'CAN_EDIT_SUPPORTING_ASSETS' => [
870 'CAN_ADD_SUPPORTING_ASSETS',
871 'CAN_DELETE_SUPPORTING_ASSETS',
872 'CAN_APPLY_CONTROLS_ON_SUPPORTING_ASSETS',
873 'CAN_VIEW_MODULE'
874 ],
875 'CAN_DELETE_SUPPORTING_ASSETS' => ['CAN_VIEW_SUPPORTING_ASSETS'],
876 'CAN_ADD_SUPPORTING_ASSETS' => ['CAN_VIEW_SUPPORTING_ASSETS'],
877 'CAN_APPLY_CONTROLS_ON_SUPPORTING_ASSETS' => ['CAN_VIEW_SUPPORTING_ASSETS'],
878 'CAN_VIEW_MODULE' => ['CAN_VIEW_SUPPORTING_ASSETS'],
879 ### Survey
880 'CAN_EDIT_SURVEY' => ['CAN_ANSWER_SURVEY'],
881 'CAN_ANSWER_SURVEY' => ['CAN_VIEW_SURVEY'],
882 'CAN_VIEW_SURVEY' => ['CAN_VIEW_MODULE'],
883 ]
884 );
885 }
886
887 $app['d s'] = $app->extend('form.types', function (array $types) use ($app) {
888 $types['rm_filters'] = new FilterType($app['url_generator']);
889 return $types;
890 });
891
892 $app['security.voters'] = $app->extend('security.voters', function ($voters, $app) {
893 $voters[] = new ModuleVoter(
894 $app,
895 $app['request_matcher'],
896 new PermissionHierarchy($app['security.permission_hierarchy'])
897 );
898 $voters[] = new OwnerVoter();
899 $voters[] = new LicenceVoter($app['orm.ems']['licence']);
900 $voters[] = new EbiosRMVoter($app['orm.ems']['modules']);
901 $voters[] = new ISO27005Voter($app['orm.ems']['modules']);
902 $voters[] = new Ebios2010Voter($app['orm.ems']['modules']);
903
904 return $voters;
905 });
906
907 $app['service.riskScenario.className'] = RiskScenarios::class;
908 $app['service.riskScenario.relatedClasses'] = [
909 PrimaryAssets::class,
910 SupportingAssets::class,
911 Vulnerabilities::class
912 ];
913
914 $app['module.riskScenario'] = function (Application $app) {
915 return [];
916 };
917 $app['module.riskScenario'] = $app->extend('module.riskScenario', function (array $a) use ($app) {
918 $a[$app['module']] = new RiskScenarioService(
919 $app['service.riskScenario.className'],
920 $app['service.riskScenario.relatedClasses'],
921 [
922 'dao.EstimatedRiskMatrix' => $app['dao.EstimatedRiskMatrix'](),
923 'dao.LikelihoodLevel' => $app['dao.LikelihoodLevel']()
924 ],
925 $app['module.container'][$app['module']]['analysis']
926 );
927 return $a;
928 });
929
930 $app['module.container.init'] = $app->protect(function ($module) use ($app) {
931 $c = new Container();
932 $c['analysis'] = function () {
933 return new Analysis();
934 };
935 $c['service.risk'] = function ($c) use ($app, $module) {
936 return new RiskScenarioListener();
937 };
938 $c['riskLevelScale'] = function () use ($app, $module) {
939 return new EntityScale($app['orm.ems'][$module]->getRepository(RiskLevels::class));
940 };
941 return $c;
942 });
943
944 $app['module.container'] = function (Application $app) {
945 $a = new Container();
946 $a['repository_EgerieRM'] = $app['module.container.init']('repository_EgerieRM');
947 $a['repository'] = $app['module.container.init']('repository');
948 return $a;
949 };
950
951 if (class_exists('\\Twig_Environment')) {
952 $app['twig.loader.filesystem'] = $app->extend('twig.loader.filesystem', function ($loader) use ($app) {
953 $loader->addPath($app['egerie.risk_manager.views'], 'EgerieRM');
954 return $loader;
955 });
956 $app['twig.helpers'] = $app->extend('twig.helpers', function (array $helpers = [], Application $app) {
957 $helpers += [
958 'fearedEvent' => [
959 'threatSources' => [
960 'toJson' => function (FearedEvents $fe) {
961 return json_encode(array_map(function ($v) {
962 return $v->getId();
963 }, $fe->getThreatSources()->toArray()));
964 }
965 ]
966 ]
967 ];
968 return $helpers;
969 });
970 }
971
972 // This service define theme if $app['theme'] exists
973 $app['em.repository'] = $app->protect(function (EntityManager $em, $entityName) use ($app) {
974 $repository = $em->getRepository($entityName);
975 if (!empty($app['theme'])) {
976 $repository->setTheme($app['theme']);
977 }
978
979 return $repository;
980 });
981
982 $app['egerie.translator'] = function () {
983 return new TranslatorController();
984 };
985
986 /**
987 * SS0 Authentication service
988 */
989 $app['OIDC.riskmanager.service.handler'] = function () use ($app) {
990 return new OIDCService($app['orm.ems']['modules']->getRepository(SSO::class));
991 };
992
993 /**
994 * Analyse - Accueil
995 */
996 $app['egerie.risk_manager.dashboardController'] = function ($app) {
997 return new DashboardController($app);
998 };
999
1000 /**
1001 * Analyse - Contexte - Niveau de Risque
1002 */
1003 $app['egerie.risk_manager.riskLevelController'] = function ($app) {
1004 return new RiskLevelController($app);
1005 };
1006
1007 /**
1008 * Analyse - Contexte - Niveau de Vraisemblance
1009 */
1010 $app['egerie.risk_manager.likelihoodController'] = function ($app) {
1011 return new LikelihoodController($app);
1012 };
1013
1014 /**
1015 * Analyse - Contexte - Niveau de Gravité
1016 */
1017 $app['egerie.risk_manager.gravityLevelController'] = function ($app) {
1018 return new GravityLevelController($app);
1019 };
1020
1021 /**
1022 * Analyse - Contexte - Niveau de Risque
1023 */
1024 $app['dao.RiskLevel'] = $app->protect(function () use ($app) {
1025 return new RiskLevelDAO($app['orm.em']->getConnection()->getWrappedConnection());
1026 });
1027
1028 /**
1029 * Analyse - Contexte - Niveau de Vraisemblance
1030 */
1031 $app['dao.LikelihoodLevel'] = $app->protect(function () use ($app) {
1032 return new LikelihoodLevelDAO($app['orm.em']->getConnection()->getWrappedConnection(), $app);
1033 });
1034
1035 /**
1036 * Analyse - Contexte - Niveau de Gravité
1037 */
1038 $app['dao.GravityLevel'] = $app->protect(function () use ($app) {
1039 return new GravityLevelDAO($app['orm.em']->getConnection()->getWrappedConnection(), $app);
1040 });
1041 $app['egerie.risk_manager.gravityLevel'] = function ($app) {
1042 return new GravityLevelController($app);
1043 };
1044
1045 /**
1046 * Analyse - Contexte - Critere de Sécurité
1047 */
1048 $app['dao.SecurityCriteria'] = $app->protect(function () use ($app) {
1049 return new SecurityCriteriaDAO($app['orm.em']->getConnection()->getWrappedConnection());
1050 });
1051 $app['egerie.risk_manager.securityCriteria'] = function ($app) {
1052 return new SecurityCriterionController($app);
1053 };
1054
1055 /**
1056 * Analyse - Contexte - Matrice Estimation risque
1057 */
1058 $app['dao.EstimatedRiskMatrix'] = $app->protect(function () use ($app) {
1059 return new EstimatedRiskMatrixDAO($app['orm.em']->getConnection()->getWrappedConnection(), $app);
1060 });
1061
1062 /**
1063 * Analyse - Contexte - Commun à plusieurs metriques
1064 */
1065 $app['dao.CommonContext'] = $app->protect(function () use ($app) {
1066 return new CommonContextDAO($app);
1067 });
1068
1069 /**
1070 * Analyse - Identification - Scénarios
1071 */
1072 $app['dao.Scenario'] = $app->protect(function () use ($app) {
1073 return new ScenarioDAO($app);
1074 });
1075
1076 /**
1077 * Analyse - Estimation - Evenement Redouté
1078 */
1079 $app['dao.FearedIncident'] = $app->protect(function () use ($app) {
1080 return new FearedIncidentDAO($app);
1081 });
1082
1083 /**
1084 * @Analyse - Assessment
1085 */
1086 $app['dao.Vulnerability'] = $app->protect(function () use ($app) {
1087 return new VulnerabilityDAO($app);
1088 });
1089
1090 /**
1091 * @Analyse - Iteration
1092 */
1093 $app['dao.SaveIteration'] = $app->protect(function () use ($app) {
1094 return new SaveIterationDAO($app['orm.em']->getConnection()->getWrappedConnection());
1095 });
1096 $app['dao.Iterations'] = $app->protect(function () use ($app) {
1097 return new IterationsDAO($app['orm.em']->getConnection()->getWrappedConnection());
1098 });
1099
1100 /**
1101 * @Analyse - System - Supportting Asset
1102 */
1103 $app['dao.SupportingAsset'] = $app->protect(function () use ($app) {
1104 return new SupportingAssetDAO($app);
1105 });
1106
1107 /**
1108 * Service register - Pour gérer les impacts
1109 * @version v2.0 04/09/2015
1110 */
1111 $app['dao.impact'] = $app->protect(function () use ($app) {
1112 return new ImpactDAO($app);
1113 });
1114
1115 /**
1116 * @Analyse - Setting
1117 */
1118 $app['dao.Setting'] = $app->protect(function () use ($app) {
1119 return new SettingDAO($app);
1120 });
1121
1122 /**
1123 * @Context - Metrics
1124 */
1125 $app['dao.metrics'] = $app->protect(function () use ($app) {
1126 return new MetricsDAO($app);
1127 });
1128
1129 /**
1130 * @info Extra DAO handles all non implemented features data
1131 * @todo To delete when missing features will be implemented
1132 */
1133 $app['dao.Extra'] = $app->protect(function () use ($app) {
1134 return new ExtraDAO($app['orm.em']->getConnection()->getWrappedConnection());
1135 });
1136
1137 $app['dao.Stepper'] = $app->protect(function () use ($app) {
1138 return new StepperDAO($app['orm.em']->getConnection()->getWrappedConnection());
1139 });
1140
1141 $app['egerie.risk_manager.rating.stars'] = function ($app) {
1142 return new StarsService($app);
1143 };
1144
1145 $app->on(KernelEvents::REQUEST, function (GetResponseEvent $event) use ($app) {
1146 $request = $event->getRequest();
1147 $bundle = strtok($request->getRequestUri(), '/');
1148 if (ltrim($app['egerie.risk_manager.path'], '/') === $bundle) {
1149 $app['bundle'] = 'EgerieRM';
1150 }
1151 }, 1000);
1152
1153 $app['egerie.risk_manager.serializer.normalizers'] = function ($app) {
1154 $normalizer = new GenericItemNormalizer();
1155 return [
1156 new ApplicabilityNormalizer(),
1157 new ArrayDenormalizer(),
1158 new DataUriNormalizer(),
1159 new AnalysisNormalizer(),
1160 new SecurityCriteriaNormalizer(),
1161 new MetricLevelNormalizer(),
1162 new OwnerNormalizer(),
1163 new CategoryNormalizer(),
1164 new SectionNormalizer(),
1165 new QuestionNormalizer(),
1166 new PropositionNormalizer(),
1167 new RiskSourceObjectiveNormalizer(),
1168 new RiskSourceNormalizer(),
1169 new ElementaryActionNormalizer(),
1170 new ObjectiveNormalizer(),
1171 new StrategicScenarioGraphNormalizer(),
1172 new StrategicScenarioGraphLksNormalizer(),
1173 new StakeholderNormalizer(),
1174 new RiskSourcesObjectivesStakeholderNormalizer(),
1175 new OperationalScenarioNormalizer(),
1176 new ThreatSourceNormalizer(),
1177 new FearedEventNormalizer(),
1178 new AttackPathNormalizer(),
1179 new GraphLinksNormalizer(),
1180 new OperationalScenarioElementaryActionNormalizer(),
1181 new ControlApplicationNormalizer(),
1182 new ScaleNormalizer(),
1183 $normalizer,
1184 new ReportNormalizer(),
1185 new DateTimeNormalizer(),
1186 new SectionCustomizationNormalizer(),
1187 new QuestionCustomizationNormalizer(),
1188 new ChoiceCustomizationNormalizer(),
1189 new AnswerCustomizationNormalizer(),
1190 ];
1191 };
1192
1193 $app['egerie.risk_manager.serializer.encoders'] = function ($app) {
1194 $encoder = new XmlEncoder(
1195 'analysis',
1196 LIBXML_NSCLEAN | LIBXML_COMPACT | LIBXML_NONET | LIBXML_NOBLANKS
1197 );
1198 return [
1199 $encoder
1200 ];
1201 };
1202
1203 $app['egerie.risk_manager.serializer.schema'] = function ($app) {
1204 return null;
1205 };
1206
1207 $app['egerie.risk_manager.serializer.container'] = function ($app) {
1208 return new Container();
1209 };
1210
1211 $app['egerie.risk_manager.serializer'] = function () use ($app) {
1212 return new Serializer(
1213 $app['egerie.risk_manager.serializer.normalizers'],
1214 $app['egerie.risk_manager.serializer.encoders'],
1215 $app['egerie.risk_manager.serializer.container'],
1216 isset($app['module.em']) ? $app['module.em'] : null,
1217 $app['inflector']
1218 );
1219 };
1220
1221 $app['egerie.risk_manager.serializer.validator'] = $app->protect(function ($context) use ($app) {
1222 return new XMLImportValidator(
1223 $app['egerie.risk_manager.serializer'],
1224 Analysis::class,
1225 $app['egerie.risk_manager.serializer.schema'],
1226 $context
1227 );
1228 });
1229
1230 $app['ermx.transformer'] = $app->protect(function (\PDO $con) use ($app) {
1231 return new ErmxTransformerService(
1232 $con,
1233 $app['inflector'],
1234 $app
1235 );
1236 });
1237
1238 if (isset($app['orm.entity_listener_resolver'])) {
1239 $app['module.risk_listener'] = $app->protect(function ($className) use ($app) {
1240 if (! isset($app['module'])) {
1241 throw new \Exception('no module set');
1242 }
1243 if (! isset($app['module.container'][$app['module']])) {
1244 throw new \Exception('missing module container');
1245 }
1246 return $app['module.container'][$app['module']]['service.risk'];
1247 });
1248 $app['module.relevance_aware_listener'] = $app->protect(function ($className) use ($app) {
1249 if (! isset($app['module'])) {
1250 throw new \Exception('no module set');
1251 }
1252 if (! isset($app['module.container'][$app['module']])) {
1253 throw new \Exception('missing module container');
1254 }
1255
1256 return new $className(new RelevanceStrategy(
1257 [
1258 'activityScale' => $app['module.container'][$app['module']]['service.scales']['activity'],
1259 'motivationScale' => $app['module.container'][$app['module']]['service.scales']['motivation'],
1260 'resourcesScale' => $app['module.container'][$app['module']]['service.scales']['ressource'],
1261 'relevanceScale' => $app['module.container'][$app['module']]['service.scales']['relevance']
1262 ]
1263 ));
1264 });
1265 $app['module.risk_aware_listener'] = $app->protect(function ($className) use ($app) {
1266 if (! isset($app['module'])) {
1267 throw new \Exception('no module set');
1268 }
1269 if (! isset($app['module.container'][$app['module']])) {
1270 throw new \Exception('missing module container');
1271 }
1272
1273 return new $className(new RiskStrategy([
1274 'graphSvc' => $app['egerie.ebios.graph'],
1275 'severityScale' => $app['module.container'][$app['module']]['service.scales']['severity'],
1276 'likelihoodScale' => $app['module.container'][$app['module']]['service.scales']['likelihood'],
1277 'riskScale' => $app['module.container'][$app['module']]['service.scales']['risk']
1278 ]));
1279 });
1280 $app['module.threat_aware_listener'] = $app->protect(function ($className) use ($app) {
1281 if (! isset($app['module'])) {
1282 throw new \Exception('no module set');
1283 }
1284 if (! isset($app['module.container'][$app['module']])) {
1285 throw new \Exception('missing module container');
1286 }
1287
1288 return new $className(new ThreatStrategy([
1289 'threatScale' => $app['module.container'][$app['module']]['service.scales']['threat'],
1290 'exposureScale' => $app['module.container'][$app['module']]['service.scales']['exposure'],
1291 'reliabilityScale' => $app['module.container'][$app['module']]['service.scales']['reliability'],
1292 'dependenceScale' => $app['module.container'][$app['module']]['service.scales']['dependence'],
1293 'penetrationScale' => $app['module.container'][$app['module']]['service.scales']['penetration'],
1294 'maturityScale' => $app['module.container'][$app['module']]['service.scales']['maturity'],
1295 'trustScale' => $app['module.container'][$app['module']]['service.scales']['trust'],
1296 ]));
1297 });
1298 $app['module.risk_sources_objectives_listener'] = $app->protect(function ($className) use ($app) {
1299 if (! isset($app['module'])) {
1300 throw new \Exception('no module set');
1301 }
1302 if (! isset($app['module.container'][$app['module']])) {
1303 throw new \Exception('missing module container');
1304 }
1305
1306 return new $className(
1307 [
1308 'relevance' => new RelevanceStrategy(
1309 [
1310 'activityScale' => $app['module.container'][$app['module']]['service.scales']['activity'],
1311 'motivationScale' => $app['module.container'][$app['module']]['service.scales']['motivation'],
1312 'resourcesScale' => $app['module.container'][$app['module']]['service.scales']['ressource'],
1313 'relevanceScale' => $app['module.container'][$app['module']]['service.scales']['relevance']
1314 ]
1315 ),
1316 'risk' => new RiskStrategy(
1317 [
1318 'graphSvc' => $app['egerie.ebios.graph'],
1319 'severityScale' => $app['module.container'][$app['module']]['service.scales']['severity'],
1320 'likelihoodScale' => $app['module.container'][$app['module']]['service.scales']['likelihood'],
1321 'riskScale' => $app['module.container'][$app['module']]['service.scales']['risk']
1322 ]
1323 )
1324 ]
1325 );
1326 });
1327 $app['module.operational_scenario_listener'] = $app->protect(function ($className) use ($app) {
1328 if (! isset($app['module'])) {
1329 throw new \Exception('no module set');
1330 }
1331 if (! isset($app['module.container'][$app['module']])) {
1332 throw new \Exception('missing module container');
1333 }
1334
1335 return new $className(new RiskStrategy([
1336 'severityScale' => $app['module.container'][$app['module']]['service.scales']['severity'],
1337 'riskScale' => $app['module.container'][$app['module']]['service.scales']['risk'],
1338 'likelihoodScale' => $app['module.container'][$app['module']]['service.scales']['likelihood'],
1339 'graphSvc' => $app['egerie.ebios.graph']
1340 ]));
1341 });
1342 $app['module.elementary_action_listener'] = $app->protect(function ($className) use ($app) {
1343 if (! isset($app['module'])) {
1344 throw new \Exception('no module set');
1345 }
1346 if (! isset($app['module.container'][$app['module']])) {
1347 throw new \Exception('missing module container');
1348 }
1349
1350 return new $className([
1351 'daoUsers' => $app['dao.users'],
1352 'daoLogs' => $app['dao.Logs'],
1353 'daoObj' => $app['dao.modules'],
1354 'obj' => $app['module'],
1355 'elementaryAction' => $app['elementaryAction'],
1356 'strategy' => new Analysis\EbiosRM\Assessment\Strategy\ElementaryActionLikelihoodStrategy(
1357 $app['module.container'][$app['module']]['service.scales']['success'],
1358 $app['module.container'][$app['module']]['service.scales']['difficulty'],
1359 $app['module.container'][$app['module']]['service.scales']['likelihood']
1360 )
1361 ]);
1362 });
1363 $app['orm.entity_listener_r resolver'] = $app->extend('orm.entity_listener_resolver', function (
1364 ContainerAwareEntityListenerResolver $resolver
1365 ) use ($app) {
1366 $resolver->addMapping(RiskScenarioListener::class, 'module.risk_listener');
1367 $resolver->addMapping(OperationalScenarioListener::class, 'module.operational_scenario_listener');
1368 $resolver->addMapping(FearedEventListener::class, 'module.operational_scenario_listener');
1369 $resolver->addMapping(ThreatAwareListener::class, 'module.threat_aware_listener');
1370 $resolver->addMapping(RiskSourcesObjectivesListener::class, 'module.risk_sources_objectives_listener');
1371 $resolver->addMapping(ElementaryActionListener::class, 'module.elementary_action_listener');
1372 $resolver->addMapping(RiskAwareListener::class, 'module.risk_aware_listener');
1373 $resolver->addMapping(RelevanceAwareListener::class, 'module.relevance_aware_listener');
1374
1375 return $resolver;
1376 });
1377 }
1378
1379 $app['egerie.risk_manager.container'] = function () use ($app) {
1380 return new ContainerService(
1381 isset($app['module.em']) ? $app['module.em'] : $app['orm.ems']['repository_EgerieRM']
1382 );
1383 };
1384
1385 $app['egerie.risk_manager.tree.container'] = function () use ($app) {
1386 return new TreeContainerService(
1387 isset($app['module.em']) ? $app['module.em'] : $app['orm.ems']['repository_EgerieRM']
1388 );
1389 };
1390
1391 $app['service.rm.notifications'] = $app['service.notifications']('modules', [
1392 'supportedEntities' => [
1393 new CreateAccountController(null, $app),
1394 new AssociateModuleController(null, $app),
1395 ],
1396 'className' => 'EgerieFramework\Bundle\RiskManager\Service\NotificationsService',
1397 ]);
1398
1399 $app['egerie.riskmanager.api.internal'] = function ($app) {
1400 $c = new Container();
1401 $c['administration'] = function () use ($app) {
1402 return new Administration($app['orm.ems']['modules']);
1403 };
1404 return $c;
1405 };
1406 $app['egerie.riskmanager.api'] = $app['api.factory'];
1407 $app['egerie.riskmanager.api']['mount_point'] = $app['egerie.risk_manager.path'] . '/api';
1408 $app['egerie.riskmanager.api']['formats'] = [/*'xml', */'json'];
1409 $app['egerie.riskmanager.api']['formats.default'] = 'json';
1410
1411 $app['egerie.riskmanager.api']['serializer.object_normalizer'] = function () {
1412 $f = new ClassMetadataFactory(
1413 new \Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader(
1414 $this->bundlePath . '/Api/serializer.yml'
1415 )
1416 );
1417 return new ObjectNormalizer(
1418 $f,
1419 new CamelCaseToSnakeCaseNameConverter()
1420 );
1421 };
1422
1423 $app['egerie.riskmanager.api']['serializer.normalizers'] = array_merge(
1424 $app['egerie.risk_manager.serializer.normalizers'],
1425 [$app['egerie.riskmanager.api']['serializer.object_normalizer']]
1426 );
1427
1428 $app['egerie.ebios.graph'] = function ($app) {
1429 return new EbiosGraphService(
1430 $app,
1431 isset($app['module.em']) ? $app['module.em'] : null,
1432 $app['url_generator']
1433 );
1434 };
1435
1436 $app->before(function (Request $request) use ($app) {
1437 $app['visitRM'] = function ($app) use ($request) {
1438 $route = str_replace('/', '', $request->get('_route'));
1439 $canEdit = isset($app['module']) && $app['module'] !== 'repository' ? $app['security.authorization_checker']->isGranted(
1440 Permissions::CAN_EDIT_MODULE,
1441 $app['module']
1442 ) : true;
1443 if ($app['user'] instanceof SerializableUser && $canEdit) {
1444 return $app['dao.Logs']->findByUserAndPageAndBdd(
1445 $app['user']->getId(),
1446 $route,
1447 'logs'
1448 );
1449 } else {
1450 return true; // for variable visit is true and doesn't active enjoyhint
1451 }
1452 };
1453 });
1454 }
1455
1456 /**
1457 * @param Application $app
1458 * @return \Silex\ControllerCollection
1459 */
1460 public function connect(Application $app)
1461 {
1462 $controllers = $app['controllers_factory'];
1463
1464 /**
1465 * Routage ACL - Force downaload
1466 */
1467 $controllers->match(
1468 'download',
1469 DownloadController::class . '::indexAction'
1470 )
1471 ->method('GET|POST')
1472 ->bind('/download');
1473
1474 /**
1475 * Routage ACL - Authentification
1476 * @version v2.0 06/08/2015
1477 */
1478 $controllers->match(
1479 'login',
1480 AuthenticationController::class . '::AuthenticationAction'
1481 )->bind('EgerieRM/login');
1482
1483 $controllers->post(
1484 'SendPassword',
1485 AuthenticationController::class . '::SendPasswordAction'
1486 )->bind('EgerieRM/SendPassword');
1487
1488 $controllers->get(
1489 'ResetPassword',
1490 AuthenticationController::class . '::resetPasswordAction'
1491 )->bind('EgerieRM/ResetPassword');
1492
1493 /**
1494 * Routage ACL - Accueil
1495 * @version v2.0 06/08/2015
1496 */
1497 $homeController = (new HomeControllerProvider())->connect($app);
1498 $controllers->mount(
1499 '/Actuality',
1500 $homeController
1501 );
1502
1503 /**
1504 * Routage ACL - Cartographie
1505 * @version v2.0 14/08/2015
1506 */
1507 $controllers->get(
1508 'Cartographie/',
1509 HomeController::class . '::indexAction'
1510 )->bind('EgerieRM/mapping');
1511
1512 $controllers->get(
1513 '',
1514 function (Application $app) {
1515 return new RedirectResponse($app['url_generator']->generate('/Actuality'));
1516 }
1517 )->bind('EgerieRM/Home');
1518
1519 /**
1520 * Routage - Api key generator.
1521 * @version 2.2 18/08/2017
1522 */
1523 $apiManagement = (new ApiControllerProvider('EgerieRM'))->connect($app);
1524 $controllers->mount(
1525 '/Administration',
1526 $apiManagement
1527 );
1528
1529 /**
1530 * Controller Provider des routes du pilotage.
1531 **/
1532 $manage = (new ManageControllerProvider())->connect($app);
1533 $controllers->mount(
1534 '/Manage',
1535 $manage
1536 );
1537
1538 /**
1539 * Middleware pour créer la variable $app['module'] dans un repository si pas créé pas le middleware $beforeContext
1540 * @param Request $request
1541 * @param Application $app
1542 */
1543 $beforeManage = function (Request $request, Application $app) {
1544 $app['module'] = isset($app['module']) ? $app['module'] : 'repository';
1545 $app['orm.ems']['repository_EgerieRM']->getEventManager()->addEventListener(
1546 Events::loadClassMetadata,
1547 new RepositoryListener()
1548 );
1549 };
1550
1551 /**
1552 * Controller Provider des routes des référentiels partagés.
1553 **/
1554 $manage = (new RepositoryControllerProvider())->connect($app);
1555 $manage->before($beforeManage);
1556 $controllers->mount(
1557 '/Repository',
1558 $manage
1559 );
1560
1561 /**
1562 * Controller Provider pour administrer son compte.
1563 **/
1564 $settings = (new SettingsControllerProvider())->connect($app);
1565 $controllers->mount('/Settings', $settings);
1566
1567 /**
1568 * Controller Provider pour administrer son compte.
1569 **/
1570 $administration = (new AdministrationControllerProvider())->connect($app);
1571 $controllers->mount(
1572 '/Administration',
1573 $administration
1574 );
1575
1576 /**
1577 * To count notifications not seen.
1578 * @param $app
1579 * @return mixed
1580 */
1581 $app['notifications.count'] = function ($app) {
1582 $applicabilities = $app['orm.em']->getRepository(Applicabilities::class);
1583 return $applicabilities->createQueryBuilder(
1584 'a',
1585 'a.id'
1586 )->select()
1587 ->where('a.lvl=:lvl')
1588 ->add('orderBy', 'a.label ASC')
1589 ->setParameter('lvl', 0)
1590 ->getQuery()
1591 ->getResult();
1592 };
1593
1594 /**
1595 * @description Middleware pour remplacer certains traits du contexte
1596 */
1597 $app['analysis'] = null; // default value
1598
1599 $beforeContext = function (Request $request, Application $app) {
1600 // Event for common repository
1601 $app['orm.ems']['repository_' . $app['bundle']]->getEventManager()->addEventListener(
1602 Events::loadClassMetadata,
1603 new RepositoryListener()
1604 );
1605
1606 if (strpos($request->get('_route'), 'Repository') !== false) {
1607 /**
1608 * Listener et redirection pour les référentiels communs.
1609 */
1610 $app['repository'] = true;
1611
1612 $theme = $request->query->get('theme');
1613 $action = $request->query->get('action');
1614 $module = $request->query->get('module');
1615 $app['module'] = 'repository_' . $app['bundle'];
1616
1617 // Add theme query param in app, use with common repository
1618 !empty($theme) ? $app['theme'] = $theme : '';
1619
1620 if ($request->attributes->has('_permission')) {
1621 if (isset($app['theme']) && $app['theme'] != '') {
1622 $permission = implode(
1623 '_',
1624 array_merge(
1625 ['SCOPE'],
1626 array_slice(
1627 explode(
1628 '_',
1629 $request->attributes->get('_permission')
1630 ),
1631 0,
1632 2
1633 )
1634 )
1635 );
1636 $obj = $app['orm.ems']['modules']->getRepository(Shared::class)->find($app['theme']);
1637 } elseif (null !== $request->query->get('module')) {
1638 $permission = $request->attributes->get('_permission');
1639 $obj = $request->query->get('module');
1640 } else {
1641 $obj = null;
1642 }
1643 }
1644
1645 if (isset($permission) && $permission && !$app['security.authorization_checker']->isGranted($permission, $obj)) {
1646 return $app->abort(404, 'not found');
1647 }
1648 $request->attributes->set('_route_params', array_diff_key($request->attributes->get('_route_params'), ['_permission' => 1]));
1649
1650 // Redirect to indexAction
1651 if ((empty($theme) && (!isset($action)) || (empty($theme) && isset($action) && $action != 'import'))) {
1652 $response = call_user_func_array([new SharedController(),'indexAction'], [$app, $request]);
1653 return $response instanceof Response ? $response : new Response($response);
1654 }
1655
1656 // Redirect to importAction method
1657 if (!empty($action) && $action == 'import' && strpos($request->get('_route'), 'Likelihood') !== false) {
1658 $response = call_user_func_array([new SharedLikelihoodController(),'importAction'], [$app, $request, $theme, $module]);
1659 return $response instanceof Response ? $response : new Response($response);
1660 } elseif (!empty($action) && $action == 'import' && strpos($request->get('_route'), 'Consequence') !== false) {
1661 $response = call_user_func_array([new SharedConsequenceController(),'importAction'], [$app, $request, $theme, $module]);
1662 return $response instanceof Response ? $response : new Response($response);
1663 } elseif (!empty($action) && $action == 'import' && strpos($request->get('_route'), 'Impact') !== false) {
1664 $response = call_user_func_array([new SharedImpactController(),'importAction'], [$app, $request, $theme, $module]);
1665 return $response instanceof Response ? $response : new Response($response);
1666 } elseif ((!empty($action) && $action == 'import' && strpos($request->get('_route'), '/Survey/Question') !== false)) {
1667 $response = call_user_func_array([new SharedSurveyController(),'importAction'], [$app, $request, $theme, $module]);
1668 return $response instanceof Response ? $response : new Response($response);
1669 } elseif (!empty($action) && $action == 'import') {
1670 $response = call_user_func_array([new SharedController(),'importAction'], [$app, $request, $theme, $module]);
1671 return $response instanceof Response ? $response : new Response($response);
1672 }
1673
1674 // Redirect to deleteAction method
1675 if (!empty($action) && $action == 'delete' && strpos($request->get('_route'), 'Likelihood') !== false) {
1676 $response = call_user_func_array([new SharedLikelihoodController(),'deleteAction'], [$app, $request, $theme, $module]);
1677 return $response instanceof Response ? $response : new Response($response);
1678 } elseif (!empty($action) && $action == 'delete' && strpos($request->get('_route'), 'Consequence') !== false) {
1679 $response = call_user_func_array([new SharedConsequenceController(),'deleteAction'], [$app, $request, $theme, $module]);
1680 return $response instanceof Response ? $response : new Response($response);
1681 } elseif (!empty($action) && $action == 'delete' && strpos($request->get('_route'), 'Impact') !== false) {
1682 $response = call_user_func_array([new SharedImpactController(),'deleteAction'], [$app, $request, $theme, $module]);
1683 return $response instanceof Response ? $response : new Response($response);
1684 } elseif (!empty($action) && $action == 'delete') {
1685 $response = call_user_func_array([new SharedController(),'deleteAction'], [$app, $request, $theme, $module]);
1686 return $response instanceof Response ? $response : new Response($response);
1687 }
1688
1689 // Redirect to removeAction method
1690 if (!empty($action) && $action == 'remove') {
1691 $response = call_user_func_array([new SharedController(),'removeAction'], [$app, $request, $theme, $module]);
1692 return $response instanceof Response ? $response : new Response($response);
1693 }
1694 } else {
1695 $app['repository'] = false;
1696 $app['module'] = $request->get('module');
1697 $analysis = $app['orm.ems']['modules']->getRepository(Modules::class)->findByBdd($app['module']);
1698
1699 if ($request->attributes->has('_permission')) {
1700 $permission = $request->attributes->get('_permission');
1701 $obj = $app['module'];
1702 }
1703
1704 if (isset($permission) && $permission && !$app['security.authorization_checker']->isGranted($permission, $obj)) {
1705 return $app->abort(404, 'not found');
1706 }
1707 $request->attributes->set('_route_params', array_diff_key($request->attributes->get('_route_params'), ['_permission' => 1]));
1708
1709 if (!$analysis) {
1710 return $app->abort(404, 'not found');
1711 }
1712
1713 $stepper = $analysis->getStepper();
1714
1715 if ($stepper == null) {
1716 $repoStepper = $app['orm.ems']['modules']->getRepository(Steppers::class);
1717 /* @var $stepper Steppers */
1718 $stepper = $repoStepper->findOneById(2);
1719 $analysis->setStepper($stepper);
1720 } else {
1721 //language file according to the chosen method (ISO 27005, EBIOS 2010 or EBIOS RM)
1722 $lang = $app['user']->getLang();
1723 $stepperMethod = $stepper->getMethod();
1724
1725
1726
1727// $app->extend('translator', function (Translator $t) use ($lang, $stepperMethod) {
1728// $t->addLoader('yaml', new YamlFileLoader());
1729// if ($lang != 'en') {
1730// $t->addResource(
1731// 'yaml',
1732// APP_PATH . '../src/Resources/translations/messages.'.$lang.'.yml',
1733// $lang,
1734// $stepperMethod
1735// );
1736// }
1737// $t->addResource(
1738// 'yaml',
1739// APP_PATH . 'config/translations/terminology.'.$lang.'.yml.dist',
1740// $lang,
1741// $stepperMethod
1742// );
1743// $t->addResource(
1744// 'yaml',
1745// APP_PATH . 'config/translations/'.$stepperMethod.'_terminology.'.$lang.'.yml.dist',
1746// $lang,
1747// $stepperMethod
1748// );
1749//
1750// if (file_exists(APP_PATH . 'config/translations/terminology.'.$lang.'.yml')) {
1751// $t->addResource(
1752// 'yaml',
1753// APP_PATH . 'config/translations/terminology.'.$lang.'.yml',
1754// $lang,
1755// $stepperMethod
1756// );
1757// }
1758// return $t;
1759// });
1760 }
1761 $app['stepper'] = $stepper;
1762 $app['analysis'] = $analysis->getLabel();
1763 }
1764
1765
1766// dump($app);
1767// dump($app['orm.ems']);
1768
1769
1770 $app['orm.em'] = $app['module.em'] = $app['orm.ems'][$app['module']];
1771
1772
1773 if ($request->get('print', false) && !$request->get('report', false) && !$app['repository']) {
1774 $repo_report = $app['module.em']->getRepository(Reports::class);
1775 $userAuth = UserTrait::UserAuth($app);
1776 if (null !== $userAuth) {
1777 $userId = $userAuth->getId();
1778 $usersDomain = Users::class;
1779 $user = $app['module.em']->getRepository($usersDomain)->find($userId);
1780
1781 $image = $repo_report->createQueryBuilder('r')
1782 ->select('r.imgHeaderFooter')
1783 ->where('r.user = :user')
1784 ->setParameter('user', $user)
1785 ->getQuery()
1786 ->getOneOrNullResult(Query::HYDRATE_SINGLE_SCALAR)
1787 ;
1788 if ($image) {
1789 $app['twig']->addGlobal('reportHeaderImage', $app['module'] . '/report/' . $image);
1790 }
1791 }
1792 }
1793
1794 $pages = ['/ModuleDashboard' => 1, '/FearedEvent' => 1];
1795 if (! $app['repository'] && (
1796 $request->isXmlHttpRequest()
1797 || false !== stripos($request->attributes->get('_route'), 'Risk')
1798 || isset($pages[$request->attributes->get('_route')])
1799 || $request->query->getBoolean('detail')
1800 )) {
1801 $app['module.riskScenario'][$app['module']]->init($app['module.em']);
1802 }
1803
1804 // setting/question and survey access
1805 if ($request->get('_route') == '/Setting/Question' || $request->get('_route') == '/Survey/Section' || $request->get('_route') == '/Survey/editAnswers'
1806 || $request->get('_route') == '/Survey/reset' || preg_match('/Survey\/Question/', $request->get('_route'))) {
1807 $module = ($app['module'] == 'repository_EgerieRM' && is_numeric($request->get('module'))) ? $request->get('module') : $app['module'];
1808 if (!$app['security.authorization_checker']->isGranted('CAN_VIEW_SURVEY', $module)) {
1809 return $app->abort(404, 'not found');
1810 }
1811 }
1812
1813 // Accès au page du module suivant la méthode choisie
1814 $permissionMethod = $request->attributes->get('_permissionMethod');
1815 // otherwise report will return not found if it contains page not allowed with method (ISO27005, EBIOSRM, EBIOS2010) used
1816 $report = ($request->get('_route') == '/Report' || strpos($_SERVER['REQUEST_URI'], 'Report/Report') !== false) ? true : false;
1817
1818 if ($permissionMethod
1819 && !$app['security.authorization_checker']->isGranted($permissionMethod, $app['module'] === 'repository_EgerieRM' ? $request->query->get('module') : $app['module'])
1820 && !$report) {
1821 return $app->abort(404, 'not found');
1822 }
1823
1824 $context = $app['request_context'];
1825 $context->setParameter('module', $app['module']);
1826
1827 //On récupère la liste des normes et on les met dans $app['applicability']
1828 $em = $app['orm.em'];
1829
1830 /* @var $em EntityManager */
1831
1832 /**
1833 * @param $app
1834 * @return mixed
1835 */
1836 $app['applicability'] = function ($app) {
1837 $applicabilities = $app['orm.em']->getRepository(Applicabilities::class);
1838 return $applicabilities->createQueryBuilder('a', 'a.id')
1839 ->select()
1840 ->where('a.lvl=:lvl')
1841 ->add('orderBy', 'a.label ASC')
1842 ->setParameter('lvl', 0)
1843 ->getQuery()->getResult();
1844 };
1845
1846 /**
1847 * Get securityCriteria called in PrimaryAssets/formIndex
1848 * @version v2.0 07/07/2016
1849 * @param $app
1850 * @return mixed
1851 */
1852 $app['securityCriteria'] = function ($app) {
1853 return $app['orm.em']->getRepository(SecurityCriteria::class)->findAll();
1854 };
1855 };
1856
1857 $controllers->post(
1858 'load',
1859 MonitorController::class . '::loadAction'
1860 )->bind('/load');
1861
1862 $controllers->post(
1863 'check',
1864 MonitorController::class . '::checkAction'
1865 )->bind('/check');
1866
1867 $controllers->get(
1868 'Module/{module}/Accueil',
1869 'egerie.risk_manager.dashboardController:indexAction'
1870 )
1871 ->before($beforeContext)
1872 ->value(
1873 '_permission',
1874 Permissions::CAN_VIEW_DASHBOARD
1875 )->value(
1876 '_available_permissions',
1877 Permissions::CAN_VIEW_DASHBOARD
1878 )->bind('/ModuleDashboard');
1879
1880 $controllers->get(
1881 'ModuleDropdown',
1882 HomeController::class . '::moduleDropdownAction'
1883 )->bind('/ModuleDropdown');
1884
1885 /**
1886 * layout.
1887 */
1888 $layout = (new LayoutControllerProvider())->connect($app);
1889 $layout->before($beforeContext);
1890 $controllers->mount('/Module/{module}/Layout', $layout);
1891
1892
1893 // Gestion de la file d'attente et des jobs report
1894 $messenger = (new MessengerControllerProvider('EgerieRM'))->connect($app);
1895 $controllers->mount('/Messenger', $messenger);
1896
1897 $messengerModule = (new \EgerieFramework\Bundle\RiskManager\ControllerProvider\Messenger\MessengerControllerProvider('EgerieRM'))->connect($app);
1898 $messengerModule->before($beforeContext);
1899 $controllers->mount(
1900 '/Module/{module}/Messenger',
1901 $messengerModule
1902 );
1903
1904 /**
1905 * mount() préfixes toutes les routes avec le préfixe donné et les fusionne dans l'application.
1906 */
1907 $analysisControllers = (new AnalysisControllerProvider());
1908 $context = $analysisControllers->connect($app);
1909 $context->before($beforeContext);
1910 $controllers->mount(
1911 '/Module/{module}',
1912 $context
1913 );
1914
1915 /**
1916 * mount() préfixes toutes les routes avec le préfixe donné et les fusionne dans l'application.
1917 */
1918 $contextControllers = (new ContextControllerProvider());
1919 $context = $contextControllers->connect($app);
1920 $context->before($beforeContext);
1921 $controllers->mount('/Module/{module}/Metric', $context);
1922 $contextControllers->setIsRepository(true);
1923 $context = $contextControllers->connect($app);
1924 $context->before($beforeContext);
1925 $controllers->mount('/Repository/Metric', $context);
1926
1927 $ebiosrmcontextControllers = (new EbiosRMContextControllerProvider());
1928 $ebiosrmcontext = $ebiosrmcontextControllers->connect($app);
1929 $ebiosrmcontext->before($beforeContext);
1930 $controllers->mount('/Module/{module}/EbiosRM/Metric', $ebiosrmcontext);
1931 $ebiosrmcontextControllers->setIsRepository(true);
1932 $context = $ebiosrmcontextControllers->connect($app);
1933 $context->before($beforeContext);
1934 $controllers->mount('/Repository/EbiosRM/Metric', $context);
1935
1936 /**
1937 * Controller Provider des routes du système.
1938 **/
1939 $systemControllers = (new SystemControllerProvider());
1940 $system = $systemControllers->connect($app);
1941 $system->before($beforeContext);
1942 $controllers->mount('/Module/{module}/System', $system);
1943 $systemControllers->setIsRepository(true);
1944 $system = $systemControllers->connect($app);
1945 $system->before($beforeContext);
1946 $controllers->mount('/Repository/System', $system);
1947
1948 $app->get('{route}.pdf', function (Application $app, Request $request, $route) {
1949 $subrequest = $request->create(
1950 $request->getUriForPath(
1951 '/' . $request->get('route')
1952 ),
1953 'GET',
1954 [],
1955 $request->cookies->all(),
1956 [],
1957 $request->server->all()
1958 );
1959 $subrequest->setLocale($app['locale']);//keep translation
1960 if ($request->getSession()) {
1961 $subrequest->setSession($request->getSession());
1962 }
1963 $content = $app->handle($subrequest, HttpKernelInterface::SUB_REQUEST, false);
1964 return $content;
1965 })->assert('route', '.*/(?!export)[^/]*');//->before($beforeContext);
1966
1967 /**
1968 * Controller Provider des routes de l'apréciation du risque.
1969 **/
1970 $assessmentControllers = (new AssessmentControllerProvider());
1971 $assessment = $assessmentControllers->connect($app);
1972 $assessment->before($beforeContext);
1973 $controllers->mount(
1974 '/Module/{module}/Assessment',
1975 $assessment
1976 );
1977
1978 $assessmentControllers->setIsRepository(true);
1979 $assessment = $assessmentControllers->connect($app);
1980 $assessment->before($beforeContext);
1981 $controllers->mount(
1982 '/Repository/Assessment',
1983 $assessment
1984 );
1985
1986 /**
1987 * Controller Provider des routes des normes.
1988 **/
1989 $applicabilityControllers = (new ApplicabilityControllerProvider());
1990 $applicability = $applicabilityControllers->connect($app);
1991 $applicability->before($beforeContext);
1992 $controllers->mount(
1993 '/Module/{module}',
1994 $applicability
1995 );
1996
1997 $applicabilityControllers->setIsRepository(true);
1998 $applicability = $applicabilityControllers->connect($app);
1999 $applicability->before($beforeContext);
2000 $controllers->mount(
2001 '/Repository',
2002 $applicability
2003 );
2004
2005 /**
2006 * Controller Provider des routes du plan de traitement.
2007 **/
2008 $treatment = (new TreatmentControllerProvider())->connect($app);
2009 $treatment->before($beforeContext);
2010 $controllers->mount('/Module/{module}/Treatment', $treatment);
2011
2012 /**
2013 * Controller Provider des routes du pour la génération des rapports.
2014 **/
2015 $reportController = (new ReportControllerProvider());
2016 $report = $reportController->connect($app);
2017 $report->before($beforeContext);
2018 $controllers->mount(
2019 '/Module/{module}/Report',
2020 $report
2021 );
2022
2023 $reportController->setIsRepository(true);
2024 $report = $reportController->connect($app);
2025 $report->before($beforeContext);
2026 $controllers->mount(
2027 '/Repository/Report',
2028 $report
2029 );
2030
2031 /**
2032 * Controller Provider des routes pour le RTP.
2033 **/
2034 $rtpControllers = (new RtpControllerProvider());
2035 $rtp = $rtpControllers->connect($app);
2036 $rtp->before($beforeContext);
2037 $controllers->mount(
2038 '/Module/{module}/Rtp',
2039 $rtp
2040 );
2041
2042 $rtpControllers->setIsRepository(true);
2043 $rtp = $rtpControllers->connect($app);
2044 $rtp->before($beforeContext);
2045 $controllers->mount(
2046 '/Repository/Rtp',
2047 $rtp
2048 );
2049
2050 /**
2051 * Controller Provider des routes pour le paramétrage.
2052 **/
2053 $settingControllers = (new SettingControllerProvider());
2054 $setting = $settingControllers->connect($app);
2055 $setting->before($beforeContext);
2056 $controllers->mount(
2057 '/Module/{module}',
2058 $setting
2059 );
2060
2061 $settingControllers->setIsRepository(true);
2062 $setting = $settingControllers->connect($app);
2063 $setting->before($beforeContext);
2064 $controllers->mount(
2065 '/Repository',
2066 $setting
2067 );
2068
2069 $ebiosRMControllers = (new EbiosRMControllerProvider());
2070 $ebiosRM = $ebiosRMControllers->connect($app);
2071 $ebiosRM->before($beforeContext);
2072 $controllers->mount(
2073 '/Module/{module}/',
2074 $ebiosRM
2075 );
2076
2077 /**
2078 * Routage ACL - Forcer le téléchargement de fichier en mode online et offline
2079 */
2080 //Pour forcer le téléchargement de fichier sans être authentifié
2081 $controllers->post(
2082 'downloadFileOff',
2083 FileManagerController::class . '::getFile'
2084 );
2085
2086 //Pour forcer le téléchargement de fichier en étant authentifié
2087 $controllers->post(
2088 'downloadFileOn',
2089 FileManagerController::class . '::getFile'
2090 );
2091
2092 /**
2093 * Quand on change la langue de l'application
2094 */
2095 $controllers->post(
2096 'changeLang',
2097 TranslateController::class . '::translateChange'
2098 );
2099
2100 /**
2101 * Gestion des logs
2102 */
2103 $controllers->match(
2104 'logPanel',
2105 LogsController::class . '::getlogPanel'
2106 );
2107
2108 $controllers->match(
2109 'logMore',
2110 LogsController::class . '::getlogMore'
2111 )->bind('EgerieRM/logMore');
2112
2113 /**
2114 * Paramètres
2115 */
2116 $controllers->get(
2117 'Administration/Profil',
2118 AdministrationController::class . 'profilAction'
2119 )->bind('EgerieRM/profile');
2120
2121 /**
2122 * update notification
2123 */
2124 $controllers->post(
2125 'Administration/Profil/Notification',
2126 AdministrationController::class . 'updateNotification'
2127 )->bind('EgerieRM/Profil/Notification');
2128
2129 /**
2130 * upload photo profil
2131 */
2132 $controllers->post(
2133 'Administration/Profil/uploadPhotoUser',
2134 AdministrationController::class . 'uploadPhotoUser'
2135 );
2136
2137 /**
2138 * profil update
2139 */
2140 $controllers->post(
2141 'Administration/Profil/updateProfil',
2142 AdministrationController::class . 'updateProfil'
2143 )->bind('EgerieRM/Profil/updateProfil');
2144
2145 /**
2146 * Controller pour la création de notifications.
2147 **/
2148 $controllers->get(
2149 'Notifications/Create',
2150 MessagesController::class . '::indexAction'
2151 )
2152 ->method('GET|POST')
2153 ->bind('EgerieRM/Notifications/Create');
2154
2155 /**
2156 * Controller pour l'envoie de notifications.
2157 **/
2158 $controllers->get(
2159 'Notifications/Send',
2160 MessagesController::class . '::sendNotifications'
2161 )
2162 ->method('POST')
2163 ->bind('EgerieRM/Notifications/Send');
2164
2165 /**
2166 * Gestion des notifications
2167 */
2168 $controllers->match(
2169 'notificationsPanel',
2170 MessagesController::class . '::getNotifications'
2171 )->bind('EgerieRM/NotificationsPanel');
2172
2173 $controllers->post(
2174 'changeState',
2175 MessagesController::class . '::changeState'
2176 )->bind('EgerieRM/ChangeState');
2177
2178 $controllers->post(
2179 'removeNotification',
2180 MessagesController::class . '::remove'
2181 )->bind('EgerieRM/RemoveNotification');
2182
2183 $controllers->post(
2184 'readAll',
2185 MessagesController::class . '::readAll'
2186 )->bind('EgerieRM/ReadAll');
2187
2188 $controllers->post(
2189 'deleteAll',
2190 MessagesController::class . '::deleteAll'
2191 )->bind('EgerieRM/DeleteAll');
2192
2193 $controllers->get(
2194 'Import',
2195 ImportController::class . '::doImportAction'
2196 )->bind('EgerieRM/importERMX');
2197
2198 /**
2199 * Controller Provider pour la partie tracking.
2200 **/
2201 $tracking = (new TrackingControllerProvider())->connect($app);
2202 $controllers->mount('/Tracking', $tracking);
2203
2204 $app->error(function (AccessDeniedHttpException $e, $code) use ($app) {
2205 $request = $app['request'];
2206 if ($request->get('module')) {
2207 if ($request->get('_route') === '/ModuleDashboard') {
2208 return new RedirectResponse($app['url_generator']->generate('EgerieRM/Home'));
2209 } elseif ($request->get('_route') === '/Gravity' && $app['security.authorization_checker']->isGranted('ROLE_User')) {
2210 return new RedirectResponse($app['url_generator']->generate('/Consequence', ['module' => $request->get('module')]));
2211 } elseif ($request->get('_route') === '/Consequence' && $app['security.authorization_checker']->isGranted('ROLE_SimpleUserOnly')) {
2212 return new RedirectResponse($app['url_generator']->generate('/Gravity', ['module' => $request->get('module')]));
2213 } else {
2214 return new RedirectResponse($app['url_generator']->generate('/ModuleDashboard', ['module' => $request->get('module')]));
2215 }
2216 }
2217 }, -7);
2218
2219 /**
2220 * Translator, allow key translation in js files
2221 **/
2222 $controllers->get('assets/i18n/{lang}.js', function (Application $app, Request $request) {
2223 $app['locale'] = $request->attributes->get('lang');
2224 return new Response($app['twig']->render(
2225 'templates/translation.js.twig',
2226 [
2227 'translations' => $app['egerie.translator']->translator(
2228 [
2229 $app['translator'],
2230 'trans'
2231 ],
2232 [
2233 $app['translator'],
2234 'transChoice'
2235 ],
2236 $request->get('method', null)
2237 )
2238 ]
2239 ), 200, ['Content-Type' => 'text/javascript']);
2240 })->bind('RM_translations');
2241
2242 /**
2243 * @todo Should be moved to ControllerProvider
2244 * @info protected middlewares are intended to be API specific services and API routes
2245 */
2246 $apiModuleControllers = $app['egerie.riskmanager.api']['controllers_factory'];
2247 $app['egerie.riskmanager.api.controller.list'] = $app->protect(function (Request $request, Application $app) {
2248 $class = $request->get('_class');
2249 $repo = $app['orm.em']->getRepository($class);
2250 $class = lcfirst(substr($class, strrpos($class, '\\') + 1));
2251 $elmt = 'xml' === $request->getRequestFormat() ? $app['inflector']->singularize($class) : $class;
2252 if ($repo instanceof AbstractTreeRepository) {
2253 $elmts = $repo->getChildren($repo->getRootNodes()[0]);
2254 } else {
2255 $elmts = $repo->findAll();
2256 }
2257 if ($request->query->getBoolean('es_indexation') && $request->query->getBoolean('bulk')) {
2258 $return = [];
2259 $api = $app['egerie.riskmanager.api'];
2260 foreach ($elmts as $i => $v) {
2261 $return[] = $api['serializer']->encode(['index' => new \StdClass()], $request->getRequestFormat(), $api['serializer.context']($v));
2262 $return[] = $api['serializer']->serialize($v, $request->getRequestFormat(), ['xml_root_node_name' => $elmt] + $api['serializer.context']($v));
2263 }
2264 return new Response(implode(PHP_EOL, $return));
2265 }
2266 return [$elmt => $elmts];
2267 });
2268
2269 $app['egerie.riskmanager.api.controller.lists'] = $app->protect(function (Request $request, Application $app) {
2270 $class = $request->get('_class');
2271 $repo = $app['orm.em']->getRepository($class);
2272 $class = 'standards';
2273 $elmt = 'xml' === $request->getRequestFormat() ? $app['inflector']->singularize($class) : $class;
2274 $elmts = $repo->getChildren();
2275 return [$elmt => $elmts];
2276 });
2277
2278 $apiModuleControllers->get(
2279 'system/supportingAssets',
2280 $app['egerie.riskmanager.api.controller.list']
2281 )->value(
2282 '_class',
2283 SupportingAssets::class
2284 );
2285
2286 $apiModuleControllers->get(
2287 'system/primaryAssets',
2288 $app['egerie.riskmanager.api.controller.list']
2289 )->value('_class', PrimaryAssets::class);
2290
2291 $apiModuleControllers->get(
2292 'system/owners',
2293 $app['egerie.riskmanager.api.controller.list']
2294 )->value('_class', Owners::class);
2295
2296 $apiModuleControllers->get(
2297 'assessment/vulnerabilities',
2298 $app['egerie.riskmanager.api.controller.list']
2299 )->value('_class', Vulnerabilities::class);
2300
2301 $apiModuleControllers->get(
2302 'assessment/controls',
2303 $app['egerie.riskmanager.api.controller.list']
2304 )->value('_class', Controls::class);
2305
2306 $apiModuleControllers->get(
2307 'assessment/risks',
2308 $app['egerie.riskmanager.api.controller.list']
2309 )->value('_class', RiskScenarios::class);
2310
2311 $apiModuleControllers->get(
2312 'applicabilities',
2313 $app['egerie.riskmanager.api.controller.lists']
2314 )->value('_class', Applicabilities::class);
2315
2316 $apiModuleControllers->before(function (Request $request, Application $app) {
2317 $app['module'] = $request->get('module');
2318 $app['orm.em'] = $app['module.em'] = $app['orm.ems'][$app['module']];
2319
2320 $this->app = $app;
2321 $evm = $app['module.em']->getEventManager();
2322 $app['module.riskScenario'][$app['module']]->init($app['module.em']);
2323
2324 $context = $app['request_context'];
2325 $context->setParameter('module', $app['module']);
2326
2327 //On récupère la liste des normes et on les met dans $app['applicability']
2328 $em = $app['orm.em'];
2329
2330 $app['egerie.riskmanager.api']['serializer.context'] = $app->protect(function ($result) use ($request, $app) {
2331 $context = ['lang' => 'fr', 'real_ids' => true];
2332
2333 if ($request->query->getBoolean('es_indexation')) {
2334 $context['no_ref'] = true;
2335 $context['es_indexation'] = true;
2336 $context['instance'] = $request->getSchemeAndHttpHost();
2337 $module = $app['orm.ems']['modules']->getRepository(Modules::class)->findOneBy(['bdd' => $app['module']]);
2338 $context['module'] = [
2339 'id' => $app['module'],
2340 'label' => $module->getLabel(),
2341 'context' => []
2342 ];
2343 $context['organizations'] = $module->getOrganisations();
2344 $context['inflector'] = $app['inflector'];
2345 if ($request->query->getBoolean('bulk')) {
2346 $context['json_encode_options'] = 0;
2347 $context['bulk'] = true;
2348 }
2349 }
2350
2351 $class = $app['request']->get('_class');
2352 switch ($class) {
2353 case RiskScenarios::class:
2354 $em = $app['orm.ems'][$app['module']];
2355 $severityLevels = $em->getRepository(Analysis\Context\SeverityLevels::class)->findBy([], ['level' => 'ASC']);
2356 $secCriteria = $em->getRepository(SecurityCriteria::class)->findBy([], ['order' => 'ASC']);
2357 $riskLevels = array_reduce($app['dao.CommonContext']()->getContext('niveauderisque'), function ($carry, $item) {
2358 $carry[$item['niveau']] = $item;
2359 return $carry;
2360 }, []);
2361 $riskLevelChoices = array_map(function ($v) {
2362 return $v['id'];
2363 }, $riskLevels);
2364
2365 $scale = $em->getRepository(Analysis\Context\CommonScale::class)->findAll();
2366 $likelihoodLevels = $scale2 = $em->getRepository(Analysis\Context\LikelihoodLevels::class)->findAll();
2367
2368 // sort scenarios by active and inactive
2369 $scenarios = $em->getRepository(RiskScenarios::class)->findAll();
2370
2371 $maxSeverityStrategy = new Analysis\Assessment\Strategy\RiskScenarioMaxSeverityStrategy($scale, $scenarios);
2372
2373 $likelihoodStrategy = new Analysis\Assessment\Strategy\LikelihoodStrategy($likelihoodLevels, $app['dao.LikelihoodLevel'](), $scenarios);
2374 $estimatedRiskMatrixDAO = $app['dao.EstimatedRiskMatrix']();
2375
2376 if ($request->get('useFE', false)) {
2377 if ($request->get('fe', false)) {
2378 $fearedEvents = [$em->getRepository(FearedEvents::class)->findOneBy(['id' => $request->get('fe')])];
2379 } else {
2380 $fearedEvents = $em->getRepository(FearedEvents::class)->findAll();
2381 }
2382 $maxSeverityStrategy = new Analysis\Assessment\Strategy\Ebios2010\RiskScenarioMaxSeverityStrategy(
2383 $scale,
2384 $scenarios,
2385 $fearedEvents,
2386 $request->get('strategy', null)
2387 );
2388 $sigmaStrategy = new Analysis\Assessment\Strategy\RiskExposureStrategy(
2389 $estimatedRiskMatrixDAO,
2390 new Analysis\Assessment\Strategy\Ebios2010\RiskScenarioDetailedSeverityStrategy($scale, $scenarios, $fearedEvents),
2391 $likelihoodStrategy,
2392 $scenarios
2393 );
2394 } else {
2395 $sigmaStrategy = new Analysis\Assessment\Strategy\RiskExposureStrategy(
2396 $estimatedRiskMatrixDAO,
2397 new Analysis\Assessment\Strategy\RiskScenarioDetailedSeverityStrategy($scale, $scenarios),
2398 $likelihoodStrategy,
2399 $scenarios
2400 );
2401 }
2402 $riskLevelStrategy = new Analysis\Assessment\Strategy\RiskLevelStrategy(
2403 $riskLevels,
2404 $estimatedRiskMatrixDAO,
2405 $maxSeverityStrategy,
2406 $likelihoodStrategy,
2407 $scenarios
2408 );
2409
2410 $controlsRepo = $em->getRepository(Controls::class);
2411 $root = isset($controlsRepo->getRootNodes()[0]) ? $controlsRepo->getRootNodes()[0] : null;
2412 if ($root === null) {
2413 $controls = [];
2414 } else {
2415 $controls = $controlsRepo->findWithLinks($root, [], true)->andWhere('node.disabled = 0')->getQuery()->execute();
2416 }
2417 $globalControls = array_filter($controls, function ($v) {
2418 return $v->isGlobal();
2419 });
2420 $reductionStrategy = $currentReductionStrategy = new Analysis\Assessment\Strategy\RiskReductionStrategy(
2421 $scenarios,
2422 $controls,
2423 Analysis\Assessment\Strategy\RiskReductionStrategy::ACTIVE_CONTROLS
2424 );
2425 $reduction = $reductionStrategy->getValues();
2426 $context['compute_strategies'] = [
2427 'computedSeverity' => $maxSeverityStrategy,
2428 'computedLikelihood' => $likelihoodStrategy,
2429 'computedRiskLevel' => $riskLevelStrategy,
2430 'reduction' => $reductionStrategy,
2431 'controls' => $controls
2432 ];
2433 if (! empty($context['es_indexation'])) {
2434 $context['module']['context']['severityLevel'] = count($severityLevels) - 1;
2435 $context['module']['context']['likelihoodLevel'] = count($likelihoodLevels) - 1;
2436 $context['module']['context']['riskLevel'] = count($riskLevels) - 1;
2437 }
2438 // no break
2439 default:
2440 $context['xml_root_node_name'] = lcfirst(substr($class, strrpos($class, '\\') + 1));
2441 $context['namespace'] = 'http://www.egerie-software.com/riskmanager';
2442 $context['no_ref'] = true;
2443 break;
2444 }
2445 return $context;
2446 });
2447
2448 $app['egerie.riskmanager.api']['serializer.object_normalizer']->setCircularReferenceHandler(function ($o) use ($em) {
2449 /* @var $em EntityManagerInterface */
2450 if (! $em->contains($o)) {
2451 return null;
2452 }
2453 $ids = $em->getUnitOfWork()->getEntityIdentifier($o);
2454 return $ids;
2455 });
2456 });
2457
2458 $apiControllers = $app['egerie.riskmanager.api']['controllers'];
2459 $apiControllers->mount('/module/{module}', $apiModuleControllers);
2460 $apiControllers->get('organizations', $app['egerie.riskmanager.api.controller.list'])->value('_class', Organisations::class);
2461
2462 return $controllers;
2463 }
2464
2465 /**
2466 * @param Application $app
2467 * @throws \Doctrine\DBAL\DBALException
2468 */
2469 public function boot(Application $app)
2470 {
2471// dump('boot');
2472
2473 $app['egerie.bundles'] = $app->extend('egerie.bundles', function ($bundles) use ($app) {
2474 $bundles[$app['egerie.risk_manager.name']] = true;
2475 return $bundles;
2476 });
2477
2478 $app->mount($app['egerie.risk_manager.path'], $this->connect($app));
2479
2480// /* @var $em EntityManager */
2481// $em = $app['orm.em'];
2482// /* @var $em EntityManager */
2483//
2484// $pdo = $em->getConnection();
2485// $dbOptions = $app->offsetExists('dbs.options') ? $app['dbs.options'] : ['default' => $app['db.options']];
2486// $emOptions = $app->offsetExists('orm.ems.options') ? $app['orm.ems.options'] : ['default' => $app['orm.em.options']];
2487//
2488// $modules = [];
2489// $infoModules = [];
2490// $moduleIds = [];
2491//
2492//// if (($res = $pdo->query("SHOW DATABASES LIKE 'users'")) && $res->fetchColumn()) {
2493////// if ($stmt = $pdo->query("SHOW DATABASES WHERE EXISTS(SELECT name_bdd_module FROM users.modules WHERE `Database` LIKE CONCAT('".ref."',name_bdd_module))")) {
2494//// if ($stmt = $pdo->query("SELECT * FROM users.modules order by id_module")) {
2495//// $i = 0;
2496//// while ($row = $stmt->fetch()) {
2497//// // Default values
2498//// $row += [
2499//// 'parent_id' => null,
2500//// 'iterated_at' => null,
2501//// 'revision' => null
2502//// ];
2503//// $id = $row['id_module'];
2504//// $module = $row['name_bdd_module'];
2505//// $parentId = $row['parent_id'];
2506//// $nameReelModule = $row['name_reel_module'];
2507//// $iteratedAt = $row['iterated_at'];
2508//// $revision = (int) $row['revision'];
2509//// $moduleIds[$id] = $module;
2510//// $infoModules[$module]['id'] = $id;
2511//// $infoModules[$module]['name_bdd_module'] = $module;
2512//// $infoModules[$module]['name_reel_module'] = $nameReelModule;
2513//// $infoModules[$module]['parent_id'] = $parentId;
2514//// $infoModules[$module]['is_iteration'] = isset($parentId);
2515//// $infoModules[$module]['has_iteration'] = isset($parentId);
2516//// $infoModules[$module]['iteration_base_module'] = $module;
2517//// $infoModules[$module]['last_revision'] = $revision;
2518//// $infoModules[$module]['iterated_at'] = $iteratedAt;
2519////
2520//// if (array_key_exists($parentId, $moduleIds)) {
2521//// $parentNameBddModule = $moduleIds[$parentId];
2522//// $infoModules[$module]['iteration_base_module'] = $parentNameBddModule;
2523//// $infoModules[$parentNameBddModule]['has_iteration'] = true;
2524//// $infoModules[$parentNameBddModule]['last_revision'] =
2525//// max([$infoModules[$parentNameBddModule]['last_revision'], $revision]);
2526//// }
2527////
2528//// $modules[$id] = $module;// = substr($module, strlen(ref));
2529//// $options = $app['dbs.options'];
2530//// $options[$module] = array_merge($app['dbs.options']['default'], ['dbname' => ref . $module]);
2531//// $app['dbs.options'] = $options;
2532////
2533//// $app['dbs.config'][$module] = function () use ($app, $module) {
2534//// $config = \Doctrine\ORM\Tools\Setup::createConfiguration(true);
2535//// $config->setFilterSchemaAssetsExpression('/^(?:' . implode('|', $this->validatedTables) . ')$/');
2536//// return $config;
2537//// };
2538////
2539//// $app['dbs.event_manager'][$module] = function () use ($app, $module) {
2540//// return new EventManager();
2541//// };
2542////
2543//// $app['dbs'][$module] = function () use ($app, $module) {
2544//// $options = $app['dbs.options'][$module];
2545//// $config = $app['dbs.config'][$module];
2546//// $manager = $app['dbs.event_manager'][$module];
2547////
2548//// return DriverManager::getConnection($options, $config, $manager);
2549//// };
2550////
2551//// if (isset($app['profiler'])) {
2552//// $dataCollector = $app['profiler']->get('db');
2553//// $logger = new DbalLogger($app['monolog'], $app['stopwatch']);
2554//// $app['doctrine']->getConnection($module)->getConfiguration()->setSQLLogger($logger);
2555//// $dataCollector->addLogger($module, $logger);
2556//// }
2557////
2558//// $options = $app['orm.ems.options'];
2559//// $options[$module] = [
2560//// 'connection' => $module,
2561//// 'mappings' => [
2562//// [
2563//// 'type' => 'php',
2564//// 'namespace' => 'EgerieFramework\\Bundle\\RiskManager\\Domain\\',
2565//// 'path' => $this->bundlePath . '/ORM/Mapping/'
2566//// ],
2567//// [
2568//// 'type' => 'yml',
2569//// 'namespace' => 'EgerieFramework\\Bundle\\RiskManager\\Domain\\',
2570//// 'path' => $this->bundlePath . '/ORM/Mapping/'
2571//// ]
2572//// ],
2573//// 'types' => [],
2574//// 'extensions' => [
2575//// 'scale',
2576//// 'tree',
2577//// 'sort'
2578//// ]
2579//// ];
2580////
2581//// $app['orm.ems.options'] = $options;
2582////
2583//// $app['module.container'][$module] = function ($data = null) use ($app, $module) {
2584//// $c = new \Pimple\Container();
2585//// $c['analysis'] = function () {
2586//// $analysis = new Analysis();
2587//// return $analysis;
2588//// };
2589//// $c['service.risk'] = function () use ($app, $module) {
2590//// return new RiskScenarioListener();
2591//// };
2592//// $c['riskLevelScale'] = function () use ($app, $module) {
2593//// $scale = new EntityScale($app['orm.ems'][$module]->getRepository(RiskLevels::class));
2594//// return $scale;
2595//// };
2596//// $c['sensitivityScale'] = function () use ($app, $module) {
2597//// $scale = new InMemoryScale();
2598//// $scale->setLevels($app['orm.ems'][$module]->getRepository(CriticalityLevels::class)->findAll([], ['level' => 'ASC']));
2599//// return $scale;
2600//// };
2601//// $c['service.scales'] = function () use ($app, $module) {
2602//// $types = ['dependence', 'penetration', 'maturity', 'trust', 'exposure', 'reliability', 'threat', 'motivation', 'ressource', 'activity', 'relevance', 'risk', 'severity', 'likelihood', 'success', 'difficulty'];
2603//// $data = $app['dao.metrics']()->findDataByScaleForDraw($types);
2604////
2605//// return $data;
2606//// };
2607//// $c['api'] = function () use ($app, $module) {
2608//// return new \EgerieFramework\Bundle\RiskManager\Api\Analysis;
2609//// };
2610//// return $c;
2611//// };
2612//// }
2613//// }
2614//// }
2615//
2616// $app['modules'] = $modules;
2617// $app['info.modules'] = $infoModules;
2618
2619
2620// $app->extend('orm.ems.config', function ($configs) use ($app) {
2621// foreach ($app['orm.ems.options'] as $name => $options) {
2622// if ($configs->offsetExists($name)) {
2623// continue;
2624// }
2625//
2626// $config = new ORMConfiguration();
2627//
2628// $app['orm.cache.configurer']($name, $config, $options);
2629//
2630// $config->setProxyDir($app['orm.proxies_dir']);
2631// $config->setProxyNamespace($app['orm.proxies_namespace']);
2632// $config->setAutoGenerateProxyClasses($app['orm.auto_generate_proxies']);
2633//
2634// $config->setCustomStringFunctions($app['orm.custom.functions.string']);
2635// $config->setCustomNumericFunctions($app['orm.custom.functions.numeric']);
2636// $config->setCustomDatetimeFunctions($app['orm.custom.functions.datetime']);
2637// $config->setCustomHydrationModes($app['orm.custom.hydration_modes']);
2638//
2639// $config->setClassMetadataFactoryName($app['orm.class_metadata_factory_name']);
2640// $config->setDefaultRepositoryClassName($app['orm.default_repository_class']);
2641//
2642// $config->setEntityListenerResolver($app['orm.entity_listener_resolver']);
2643// $config->setRepositoryFactory($app['orm.repository_factory']);
2644//
2645// $config->setNamingStrategy($app['orm.strategy.naming']);
2646// $config->setQuoteStrategy($app['orm.strategy.quote']);
2647//
2648// $chain = $app['orm.mapping_driver_chain.locator']($name);
2649// foreach ((array) $options['mappings'] as $entity) {
2650// if (!is_array($entity)) {
2651// throw new \InvalidArgumentException(
2652// "The 'orm.em.options' option 'mappings' should be an array of arrays."
2653// );
2654// }
2655//
2656// if (!empty($entity['resources_namespace'])) {
2657// $entity['path'] = $app['psr0_resource_locator']->findFirstDirectory($entity['resources_namespace']);
2658// }
2659//
2660// if (isset($entity['alias'])) {
2661// $config->addEntityNamespace($entity['alias'], $entity['namespace']);
2662// }
2663//
2664// switch ($entity['type']) {
2665// case 'annotation':
2666// $useSimpleAnnotationReader = isset($entity['use_simple_annotation_reader']) ? $entity['use_simple_annotation_reader'] : true;
2667// $driver = $config->newDefaultAnnotationDriver((array) $entity['path'], $useSimpleAnnotationReader);
2668// $chain->addDriver($driver, $entity['namespace']);
2669// break;
2670// case 'yml':
2671// $driver = new YamlDriver($entity['path']);
2672// $chain->addDriver($driver, $entity['namespace']);
2673// break;
2674// case 'simple_yml':
2675// $driver = new SimplifiedYamlDriver(array($entity['path'] => $entity['namespace']));
2676// $chain->addDriver($driver, $entity['namespace']);
2677// break;
2678// case 'xml':
2679// $driver = new XmlDriver($entity['path']);
2680// $chain->addDriver($driver, $entity['namespace']);
2681// break;
2682// case 'simple_xml':
2683// $driver = new SimplifiedXmlDriver(array($entity['path'] => $entity['namespace']));
2684// $chain->addDriver($driver, $entity['namespace']);
2685// break;
2686// case 'php':
2687// $driver = new PHPDriver($entity['path']);
2688// $chain->addDriver($driver, $entity['namespace']);
2689// break;
2690// default:
2691// throw new \InvalidArgumentException(sprintf('"%s" is not a recognized driver', $entity['type']));
2692// break;
2693// }
2694// }
2695// $config->setMetadataDriverImpl($chain);
2696//
2697// foreach ((array) $options['types'] as $typeName => $typeClass) {
2698// if (Type::hasType($typeName)) {
2699// Type::overrideType($typeName, $typeClass);
2700// } else {
2701// Type::addType($typeName, $typeClass);
2702// }
2703// }
2704//
2705// $configs[$name] = $config;
2706// }
2707//
2708// return $configs;
2709// });
2710//
2711//
2712//// $app['orm.ems'] = function($ems) use($app) {
2713// $app->extend('orm.ems.config', function ($ems) use ($app) {
2714// foreach ($app['orm.ems.options'] as $name => $options) {
2715// if ($app['orm.ems.default'] === $name) {
2716// // we use shortcuts here in case the default has been overridden
2717// $config = $app['orm.em.config'];
2718// } else {
2719// $config = $app['orm.ems.config'][$name];
2720// }
2721//
2722// if (! isset($ems[$name])) {
2723// $ems[$name] = function ($ems) use ($app, $options, $config, $name) {
2724// $em = EntityManager::create(
2725// $app['dbs'][$options['connection']],
2726// $config,
2727// $app['dbs.event_manager'][$options['connection']]
2728// );
2729// return $em;
2730// };
2731// }
2732// if (isset($options['extensions']) && $app->offsetExists('orm.ems.load_extension')) {
2733// foreach ($options['extensions'] as $extension) {
2734// $app['orm.ems.load_extension']($extension, $ems, $name);
2735// }
2736// }
2737// }
2738//
2739// return $ems;
2740// });
2741 }
2742}