Passed
Push — master ( d29ebb...aee5c9 )
by Tim
01:40
created

Ldap   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 157
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 157
rs 10
c 0
b 0
f 0
wmc 14
1
<?php
2
3
namespace SimpleSAML\Module\monitor\TestSuite\AuthSource;
4
5
use \SimpleSAML_Configuration as ApplicationConfiguration;
6
use \SimpleSAML\Module\monitor\State as State;
7
use \SimpleSAML\Module\monitor\TestConfiguration as TestConfiguration;
8
use \SimpleSAML\Module\monitor\TestCase as TestCase;
9
use \SimpleSAML\Module\monitor\TestData as TestData;
10
use \SimpleSAML\Module\monitor\TestResult as TestResult;
11
12
final class Ldap extends \SimpleSAML\Module\monitor\TestSuiteFactory
13
{
14
    /**
15
     * @var ApplicationConfiguration
16
     */
17
    private $authSourceData;
18
19
    /**
20
     * @var array|null
21
     */
22
    private $authSourceSpecifics;
23
24
    /**
25
     * @var string[]
26
     */
27
    private $hosts;
28
29
    /**
30
     * @param integer|null;
31
     */
32
    private $certExpirationWarning = null;
33
34
    /**
35
     * @param TestConfiguration $configuration
36
     * @param TestData $testData
37
     */
38
    public function __construct($configuration, $testData)
39
    {
40
        $moduleConfig = $configuration->getModuleConfig();
41
        $authSourceData = $testData->getInputItem('authSourceData');
42
        $authSourceSpecifics = $testData->getInputItem('authSourceSpecifics');
43
44
        assert(is_array($authSourceData));
45
        assert(is_array($authSourceSpecifics) || is_null($authSourceSpecifics));
46
47
        $this->hosts = explode(' ', $authSourceData->getString('hostname'));
48
        $this->authSourceData = $authSourceData;
49
        $this->authSourceSpecifics = $authSourceSpecifics;
50
        $this->certExpirationWarning = $moduleConfig->getValue('certExpirationWarning', 28);
51
        $this->setCategory('LDAP authentication source');
52
53
        parent::__construct($configuration);
54
    }
55
56
    /**
57
     * @return void
58
     */
59
    public function invokeTest()
60
    {
61
        // Test LDAP configuration
62
        $confTest = new TestCase\AuthSource\Ldap\Configuration(
63
            new TestData(['authSourceData' => $this->authSourceData])
64
        );
65
        $confTestResult = $confTest->getTestResult();
66
        $this->addTestResult($confTestResult);
67
68
        if ($confTestResult->getState() === State::OK) {
69
            $connection = $confTestResult->getOutput('connection');
70
71
            // Test connection for each configured LDAP-server
72
            $failure = count($this->hosts);
73
            foreach ($this->hosts as $hostname) {
74
                $preparedTestData = $this->prepareConnection($hostname, $this->authSourceData, $this->authSourceSpecifics);
75
                $connTest = new TestCase\Network\ConnectUri(
76
                    new TestData($preparedTestData)
77
                );
78
                $connTestResult = $connTest->getTestResult();
79
                $this->addTestResult($connTestResult);
80
81
                if ($connTestResult->getState() === State::OK) {
82
                    $certData = $connTestResult->getOutput('certData');
83
84
                    // Test certificate when available
85
                    if ($certData !== null) {
86
                        $certTest = new TestCase\Cert(
87
                            new TestData([
88
                                'certData' => $certData,
89
                                'category' => 'LDAP Server Certificate',
90
                                'certExpirationWarning' => $this->certExpirationWarning,
91
                            ])
92
                        );
93
                        $certTestResult = $certTest->getTestResult();
94
                        $this->addTestResult($certTestResult);
95
                    }
96
                    $failure--;
97
                }
98
            }
99
100
            if ($failure !== 0) {
101
                // Test bind
102
                $testData = new TestData([
103
                    'authSourceData' => $this->authSourceData,
104
                    'connection' => $connection
105
                ]);
106
                $bindTest = new TestCase\AuthSource\Ldap\Bind(
107
                    $testData
108
                );
109
                $bindTestResult = $bindTest->getTestResult();
110
                $this->addTestResult($bindTestResult);
111
112
                if ($bindTestResult->getState() === State::OK) {
113
                    // Test search
114
                    $testData = new TestData([
115
                        'authSourceData' => $this->authSourceData,
116
                        'connection' => $connection
117
                    ]);
118
119
                    $searchTest = new TestCase\AuthSource\Ldap\Search(
120
                        $testData
121
                    );
122
                    $searchTestResult = $searchTest->getTestResult();
123
                    $this->addTestResult($searchTestResult);
124
                }
125
            }
126
            unset($connection);
127
        }
128
129
        $state = $this->calculateState();
130
131
        $testResult = new TestResult('LDAP Authentication');
132
        $testResult->setState($state);
133
        $this->setTestResult($testResult);
134
    }
135
136
    /**
137
     * @param string $connectString
138
     * @param ApplicationConfiguration $authSourceData
139
     * @param array|null $authSourceSpecifics
140
     *
141
     * @return array
142
     */
143
    private function prepareConnection($connectString, $authSourceData, $authSourceSpecifics)
144
    {
145
        $hostname = parse_url($connectString, PHP_URL_HOST);
146
147
        if (preg_match('/^(ldaps:\/\/(.*))$/', $connectString, $matches)) {
148
            // The default context
149
            $sslContext = ['capture_peer_cert' => true, 'verify_peer' => true];
150
151
            // The non-default context, if configured ...
152
            if (!is_null($authSourceSpecifics) && array_key_exists('ssl', $authSourceSpecifics)) {
153
                $sslContext = array_replace($sslContext, $authSourceSpecifics['ssl']);
154
            }
155
156
            $port = parse_url($connectString, PHP_URL_PORT);
157
            $port = $port ?: $authSourceData['port'];
158
159
            $uri = 'ssl://' .  $hostname . ':' . $port;
160
            $context = stream_context_create(['ssl' => $sslContext]);
161
        } else {
162
            $port = $authSourceData['port'];
163
            $uri = 'tcp://' . $hostname . ':' . $port;
164
            $context = stream_context_create();
165
        }
166
167
        $timeout = isSet($authSourceData['timeout']) $authSourceData['timeout'] : null;
0 ignored issues
show
Bug introduced by
A parse error occurred: Syntax error, unexpected T_VARIABLE on line 167 at column 53
Loading history...
168
        return ['uri' => $uri, 'context' => $context, 'timeout' => $timeout];
169
    }
170
}
171