Completed
Push — master ( 46d11e...5de925 )
by Vojtěch
02:38
created

RemoteAccessManagerExtension::beforeCompile()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.2
c 0
b 0
f 0
cc 4
eloc 7
nc 4
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace SixtyEightPublishers\Application\RemoteAccessManager\DI;
6
7
use Nette\DI\CompilerExtension;
8
use SixtyEightPublishers\Application\RemoteAccessManager\Handler\IAccessHandler;
9
use SixtyEightPublishers\Application\RemoteAccessManager\RemoteAccessManager;
10
use SixtyEightPublishers\Application\Environment\ConfigurationException;
11
use SixtyEightPublishers\Application\RemoteAccessManager\Handler\DefaultAccessHandler;
12
13
class RemoteAccessManagerExtension extends CompilerExtension
14
{
15
	/**
16
	 * @var array
17
	 */
18
	private $defaults = [
19
		'disable' => FALSE,
20
		'allowAll' => RemoteAccessManager::ALLOWED_ALL,
21
		'secretKey' => RemoteAccessManager::COOKIE_SECRET,
22
		'whitelist' => NULL,
23
		'blacklist' => NULL,
24
	];
25
26
	/**
27
	 * {@inheritdoc}
28
	 */
29
	public function loadConfiguration()
30
	{
31
		$builder = $this->getContainerBuilder();
32
		$config = $this->getConfig($this->defaults);
33
34
		if (!is_bool($config['allowAll'])) {
35
			throw new ConfigurationException("Config key 'allowAll' must be a bool value.");
36
		}
37
38
		if ($config['disable'] === TRUE) {
39
			return;
40
		}
41
42
		$builder->addDefinition($this->prefix('handler'))
43
			->setClass(DefaultAccessHandler::class);
44
45
		$builder->addDefinition($this->prefix('remoteAccess'))
46
			->setClass(RemoteAccessManager::class, [
47
				'whitelist' => $config['whitelist'],
48
				'blacklist' => $config['blacklist'],
49
				'key' => $config['secretKey'],
50
				'mode' => $config['allowAll'],
51
				'consoleMode' => $builder->parameters['consoleMode'],
52
			])
53
			->addTag('run', TRUE)
54
			->addSetup('process');
55
	}
56
57
	/**
58
	 * {@inheritdoc}
59
	 */
60
	public function beforeCompile()
61
	{
62
		$builder = $this->getContainerBuilder();
63
		$handlers = $builder->findByType(IAccessHandler::class);
64
65
		if (count($handlers) > 1) {
66
			foreach ($handlers as $name => $definition) {
67
				if ($definition->getClass() === DefaultAccessHandler::class) {
68
					$builder->removeDefinition($name);
69
				}
70
			}
71
		}
72
	}
73
}
74