Cancelled
Branch master (244451)
by Tim
10:31
created

Modules::setRequiredApacheModules()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 8
nc 4
nop 0
dl 0
loc 14
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace SimpleSAML\Module\monitor\TestSuite;
4
5
use \SimpleSAML\Module\monitor\TestConfiguration as TestConfiguration;
6
use \SimpleSAML\Module\monitor\State as State;
7
use \SimpleSAML\Module\monitor\TestCase as TestCase;
8
use \SimpleSAML\Module\monitor\TestData as TestData;
9
use \SimpleSAML\Module\monitor\TestResult as TestResult;
10
11
class Modules extends \SimpleSAML\Module\monitor\TestSuiteFactory
12
{
13
    /**
14
     * @var array
15
     */
16
    private $requiredApacheModules = array();
17
18
    /**
19
     * @var array
20
     */
21
    // Important!!  Modules-names are handled case-sensitive!!
22
    private $storeApacheDependencies = array();
23
24
    /**
25
     * @var array
26
     */
27
    private $moduleApacheDependencies = array(
28
        'negotiateext' => 'mod_auth_kerb|mod_auth_gssapi'
29
    );
30
31
    /**
32
     * @var array
33
     */
34
    private $requiredPhpModules = array();
35
36
    /**
37
     * @var array
38
     */
39
    private $storePhpDependencies = array(
40
        'memcache' => 'memcached|memcache',
41
        'phpsession' => 'session',
42
        'redis' => 'redis',
43
        'redissentinel' => 'redis',
44
        'riak:Store' => 'riak',
45
        'sql' => 'PDO'
46
    );
47
48
    /**
49
     * @var array
50
     */
51
    private $modulePhpDependencies = array(
52
        'authfacebook' => array('curl', 'json'),
53
        'authYubiKey' => 'curl',
54
// TODO: consent only requires pdo when database backend is used.. Should probably add this to required-list when processing metadata
55
//        'consent' => 'PDO',
56
        'consentAdmin' => 'PDO',
57
        'ldap' => 'ldap',
58
        'memcacheMonitor' => 'memcached|memcache',
59
        'negotiate' => 'krb5',
60
        'radius' => 'radius',
61
        'riak' => 'riak',
62
        'sqlauth' => 'PDO'
63
    );
64
65
    /**
66
     * @param TestData|null $testData
67
     *
68
     * @return void
69
     */
70
    protected function initialize($testData = null)
71
    {
72
        $this->setRequiredApacheModules();
73
        $this->setRequiredPhpModules();
74
        $this->setRequiredSspModules();
75
        $this->setCategory('Modules');
76
    }
77
78
79
    /**
80
     * @return void
81
     */
82
    private function addRequiredApacheModule($module)
83
    {
84
        if (!in_array($module, $this->requiredApacheModules)) {
85
            $this->requiredApacheModules[] = $module;
86
        }
87
    }
88
89
90
    /**
91
     * @return void
92
     */
93
    private function setRequiredApacheModules()
94
    {
95
        // Apache Modules
96
        $this->addRequiredApacheModule('mod_php|mod_php5');
97
        if (\SimpleSAML\Utils\HTTP::isHTTPS()) {
98
            $this->addRequiredApacheModule('mod_ssl');
99
        }
100
101
        // Determine extra required modules
102
        $configuration = $this->getConfiguration();
103
        $globalConfig = $configuration->getGlobalConfig();
104
        $store = $globalConfig->getValue('store.type');
105
        if (array_key_exists($store, $this->storeApacheDependencies)) {
106
            $this->addRequiredApacheModule($this->storeApacheDependencies[$store]);
107
        }
108
    }
109
110
111
    /**
112
     * @return void
113
     */
114
    private function addRequiredPhpModule($module)
115
    {
116
        if (!in_array($module, $this->requiredPhpModules)) {
117
            $this->requiredPhpModules[] = $module;
118
        }
119
    }
120
121
122
    /**
123
     * @return void
124
     */
125
    private function setRequiredPhpModules()
126
    {
127
        // PHP modules required
128
        $composerFile = \SimpleSAML\Utils\System::resolvePath('composer.json');
129
        $composerData = file_get_contents($composerFile);
130
        $composer = json_decode($composerData, true);
131
        $composerRequired = $composer['require'];
132
133
        foreach ($composerRequired as $ext => $ver) {
134
            if (preg_match('/^ext-/', $ext)) {
135
                $this->addRequiredPhpModule(substr($ext, 4));
136
            }
137
        }
138
139
        // Determine extra required modules
140
        $configuration = $this->getConfiguration();
141
        $globalConfig = $configuration->getGlobalConfig();
142
        $store = $globalConfig->getValue('store.type');
143
        if (array_key_exists($store, $this->storePhpDependencies)) {
144
            $this->addRequiredPhpModule($this->storePhpDependencies[$store]);
145
        }
146
    }
147
148
    /**
149
     * @return void
150
     */
151
    private function setRequiredSspModules()
152
    {
153
        $modules = \SimpleSAML\Module::getModules();
154
        foreach ($modules as $module) {
155
            if (\SimpleSAML\Module::isModuleEnabled($module)) {
156
                if (array_key_exists($module, $this->moduleApacheDependencies)) {
157
                    $dependencies = \SimpleSAML\Utils\Arrays::Arrayize($this->moduleApacheDependencies[$module]);
158
                    foreach ($dependencies as $dependency) {
159
                        $this->addRequiredApacheModule($dependency);
160
                    }
161
                }
162
                if (array_key_exists($module, $this->modulePhpDependencies)) {
163
                    $dependencies = \SimpleSAML\Utils\Arrays::Arrayize($this->modulePhpDependencies[$module]);
164
                    foreach ($dependencies as $dependency) {
165
                        $this->addRequiredPhpModule($dependency);
166
                    }
167
                }
168
            }
169
        }
170
    }
171
172
    /**
173
     * @return array
174
     */
175
    public function getAvailableApacheModules()
176
    {
177
        $configuration = $this->getConfiguration();
178
        return $configuration->getAvailableApacheModules();
179
    }
180
181
    /**
182
     * @return array
183
     */
184
    public function getAvailablePhpModules()
185
    {
186
        $configuration = $this->getConfiguration();
187
        return $configuration->getAvailablePhpModules();
188
    }
189
190
    /**
191
     * @return array
192
     */
193
    private function getRequiredApacheModules()
194
    {
195
        return $this->requiredApacheModules;
196
    }
197
198
199
    /**
200
     * @return array
201
     */
202
    private function getRequiredPhpModules()
203
    {
204
        return $this->requiredPhpModules;
205
    }
206
207
208
    /**
209
     * @return void
210
     */
211
    public function invokeTest()
212
    {
213
        $configuration = $this->getConfiguration();
214
215
        // Test Apache modules
216
        $testData = new TestData([
217
            'available' => $configuration->getAvailableApacheModules(),
218
            'required' => $this->getRequiredApacheModules(),
219
            'dependencies' => $this->moduleApacheDependencies,
220
            'type' => 'Apache',
221
            'testClass' => '\SimpleSAML\Module\monitor\TestCase\Module\Apache',
222
        ]);
223
        $apacheTest = new Modules\ModuleSet($configuration, $testData);
224
        $apacheTestResult = $apacheTest->getTestResult();
225
        
226
         // Test Php modules
227
        $testData = new TestData([
228
            'available' => $configuration->getAvailablePhpModules(),
229
            'required' => $this->getRequiredPhpModules(),
230
            'dependencies' => $this->modulePhpDependencies,
231
            'type' => 'Php',
232
            'testClass' => '\SimpleSAML\Module\monitor\TestCase\Module\Php',
233
        ]);
234
        $phpTest = new Modules\ModuleSet($configuration, $testData);
235
        $phpTestResult = $phpTest->getTestResult();
236
237
        $this->addTestResult($apacheTestResult);
238
        $this->addTestResult($phpTestResult);
239
240
        $testResult = new TestResult('Modules', '');
241
        $testResult->setState($this->calculateState());
242
        
243
        $this->setTestResult($testResult);
244
    }
245
}
246