Skip to content

Commit ec1798f

Browse files
authored
Admin controller tests (simplesamlphp#1329)
Start testing admin-module
1 parent 542751a commit ec1798f

7 files changed

Lines changed: 941 additions & 29 deletions

File tree

modules/admin/lib/Controller/Config.php

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ class Config
2929
/** @var \SimpleSAML\Configuration */
3030
protected $config;
3131

32+
/**
33+
* @var \SimpleSAML\Utils\Auth|string
34+
* @psalm-var \SimpleSAML\Utils\Auth|class-string
35+
*/
36+
protected $authUtils = Utils\Auth::class;
37+
3238
/** @var Menu */
3339
protected $menu;
3440

@@ -50,16 +56,27 @@ public function __construct(Configuration $config, Session $session)
5056
}
5157

5258

59+
/**
60+
* Inject the \SimpleSAML\Utils\Auth dependency.
61+
*
62+
* @param \SimpleSAML\Utils\Auth $authUtils
63+
*/
64+
public function setAuthUtils(Utils\Auth $authUtils): void
65+
{
66+
$this->authUtils = $authUtils;
67+
}
68+
69+
5370
/**
5471
* Display basic diagnostic information on hostname, port and protocol.
5572
*
56-
* @param Request $request The current request.
73+
* @param \Symfony\Component\HttpFoundation\Request $request The current request.
5774
*
5875
* @return \SimpleSAML\XHTML\Template
5976
*/
6077
public function diagnostics(Request $request): Template
6178
{
62-
Utils\Auth::requireAdmin();
79+
$this->authUtils::requireAdmin();
6380

6481
$t = new Template($this->config, 'admin:diagnostics.twig');
6582
$t->data = [
@@ -88,11 +105,13 @@ public function diagnostics(Request $request): Template
88105
/**
89106
* Display the main admin page.
90107
*
108+
* @param \Symfony\Component\HttpFoundation\Request $request The current request.
109+
*
91110
* @return \SimpleSAML\XHTML\Template
92111
*/
93-
public function main(): Template
112+
public function main(/** @scrutinizer ignore-unused */ Request $request): Template
94113
{
95-
Utils\Auth::requireAdmin();
114+
$this->authUtils::requireAdmin();
96115

97116
$t = new Template($this->config, 'admin:config.twig');
98117
$t->data = [
@@ -125,11 +144,13 @@ public function main(): Template
125144
/**
126145
* Display the output of phpinfo().
127146
*
128-
* @return RunnableResponse
147+
* @param \Symfony\Component\HttpFoundation\Request $request The current request.
148+
*
149+
* @return \SimpleSAML\HTTP\RunnableResponse
129150
*/
130-
public function phpinfo(): RunnableResponse
151+
public function phpinfo(/** @scrutinizer ignore-unused */ Request $request): RunnableResponse
131152
{
132-
Utils\Auth::requireAdmin();
153+
$this->authUtils::requireAdmin();
133154

134155
return new RunnableResponse('phpinfo');
135156
}
@@ -397,7 +418,6 @@ protected function getWarnings(): array
397418
curl_close($ch);
398419
}
399420

400-
401421
if ($latest && version_compare($this->config->getVersion(), ltrim($latest['tag_name'], 'v'), 'lt')) {
402422
$warnings[] = [
403423
Translate::noop(

modules/admin/lib/Controller/Federation.php

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,19 @@ class Federation
3838
/** @var \SimpleSAML\Configuration */
3939
protected $config;
4040

41-
/** @var MetaDataStorageHandler */
41+
/**
42+
* @var \SimpleSAML\Auth\Source|string
43+
* @psalm-var \SimpleSAML\Auth\Source|class-string
44+
*/
45+
protected $authSource = Auth\Source::class;
46+
47+
/**
48+
* @var \SimpleSAML\Utils\Auth|string
49+
* @psalm-var \SimpleSAML\Utils\Auth|class-string
50+
*/
51+
protected $authUtils = Utils\Auth::class;
52+
53+
/** @var \SimpleSAML\Metadata\MetaDataStorageHandler */
4254
protected $mdHandler;
4355

4456
/** @var Menu */
@@ -58,16 +70,50 @@ public function __construct(Configuration $config)
5870
}
5971

6072

73+
/**
74+
* Inject the \SimpleSAML\Auth\Source dependency.
75+
*
76+
* @param \SimpleSAML\Auth\Source $authSource
77+
*/
78+
public function setAuthSource(Auth\Source $authSource): void
79+
{
80+
$this->authSource = $authSource;
81+
}
82+
83+
84+
/**
85+
* Inject the \SimpleSAML\Utils\Auth dependency.
86+
*
87+
* @param \SimpleSAML\Utils\Auth $authUtils
88+
*/
89+
public function setAuthUtils(Utils\Auth $authUtils): void
90+
{
91+
$this->authUtils = $authUtils;
92+
}
93+
94+
95+
/**
96+
* Inject the \SimpleSAML\Metadata\MetadataStorageHandler dependency.
97+
*
98+
* @param \SimpleSAML\Metadata\MetaDataStorageHandler $mdHandler
99+
*/
100+
public function setMetadataStorageHandler(MetadataStorageHandler $mdHandler): void
101+
{
102+
$this->mdHandler = $mdHandler;
103+
}
104+
105+
61106
/**
62107
* Display the federation page.
63108
*
109+
* @param \Symfony\Component\HttpFoundation\Request $request
64110
* @return \SimpleSAML\XHTML\Template
65111
* @throws \SimpleSAML\Error\Exception
66112
* @throws \SimpleSAML\Error\Exception
67113
*/
68-
public function main(): Template
114+
public function main(/** @scrutinizer ignore-unused */ Request $request): Template
69115
{
70-
Utils\Auth::requireAdmin();
116+
$this->authUtils::requireAdmin();
71117

72118
// initialize basic metadata array
73119
$hostedSPs = $this->getHostedSP();
@@ -289,7 +335,7 @@ private function getHostedSP(): array
289335
$entities = [];
290336

291337
/** @var \SimpleSAML\Module\saml\Auth\Source\SP $source */
292-
foreach (Auth\Source::getSourcesOfType('saml:SP') as $source) {
338+
foreach ($this->authSource::getSourcesOfType('saml:SP') as $source) {
293339
$metadata = $source->getHostedMetadata();
294340
if (isset($metadata['keys'])) {
295341
$certificates = $metadata['keys'];
@@ -345,13 +391,13 @@ private function getHostedSP(): array
345391
/**
346392
* Metadata converter
347393
*
348-
* @param Request $request The current request.
394+
* @param \Symfony\Component\HttpFoundation\Request $request The current request.
349395
*
350396
* @return \SimpleSAML\XHTML\Template
351397
*/
352398
public function metadataConverter(Request $request): Template
353399
{
354-
Utils\Auth::requireAdmin();
400+
$this->authUtils::requireAdmin();
355401
if ($xmlfile = $request->files->get('xmlfile')) {
356402
$xmldata = trim(file_get_contents($xmlfile->getPathname()));
357403
} elseif ($xmldata = $request->request->get('xmldata')) {
@@ -422,24 +468,24 @@ public function metadataConverter(Request $request): Template
422468
/**
423469
* Download a certificate for a given entity.
424470
*
425-
* @param Request $request The current request.
471+
* @param \Symfony\Component\HttpFoundation\Request $request The current request.
426472
*
427-
* @return Response PEM-encoded certificate.
473+
* @return \Symfony\Component\HttpFoundation\Response PEM-encoded certificate.
428474
*/
429475
public function downloadCert(Request $request): Response
430476
{
431-
Utils\Auth::requireAdmin();
477+
$this->authUtils::requireAdmin();
432478

433479
$set = $request->get('set');
434-
$prefix = $request->get('prefix');
480+
$prefix = $request->get('prefix', '');
435481

436482
if ($set === 'saml20-sp-hosted') {
437483
$sourceID = $request->get('source');
438484
/**
439485
* The second argument ensures non-nullable return-value
440486
* @var \SimpleSAML\Module\saml\Auth\Source\SP $source
441487
*/
442-
$source = \SimpleSAML\Auth\Source::getById($sourceID, Module\saml\Auth\Source\SP::class);
488+
$source = $this->authSource::getById($sourceID, Module\saml\Auth\Source\SP::class);
443489
$mdconfig = $source->getMetadata();
444490
} else {
445491
$entityID = $request->get('entity');
@@ -465,13 +511,13 @@ public function downloadCert(Request $request): Response
465511
/**
466512
* Show remote entity metadata
467513
*
468-
* @param Request $request The current request.
514+
* @param \Symfony\Component\HttpFoundation\Request $request The current request.
469515
*
470-
* @return Response
516+
* @return \SimpleSAML\XHTML\Template
471517
*/
472-
public function showRemoteEntity(Request $request): Response
518+
public function showRemoteEntity(Request $request): Template
473519
{
474-
Utils\Auth::requireAdmin();
520+
$this->authUtils::requireAdmin();
475521

476522
$entityId = $request->get('entityid');
477523
$set = $request->get('set');

modules/admin/lib/Controller/Test.php

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,24 @@ class Test
3030
/** @var \SimpleSAML\Configuration */
3131
protected $config;
3232

33+
/**
34+
* @var \SimpleSAML\Utils\Auth|string
35+
* @psalm-var \SimpleSAML\Utils\Auth|class-string
36+
*/
37+
protected $authUtils = Utils\Auth::class;
38+
39+
/**
40+
* @var \SimpleSAML\Auth\Simple|string
41+
* @psalm-var \SimpleSAML\Auth\Simple|class-string
42+
*/
43+
protected $authSimple = Auth\Simple::class;
44+
45+
/**
46+
* @var \SimpleSAML\Auth\State|string
47+
* @psalm-var \SimpleSAML\Auth\State|class-string
48+
*/
49+
protected $authState = Auth\State::class;
50+
3351
/** @var Menu */
3452
protected $menu;
3553

@@ -51,29 +69,63 @@ public function __construct(Configuration $config, Session $session)
5169
}
5270

5371

72+
/**
73+
* Inject the \SimpleSAML\Utils\Auth dependency.
74+
*
75+
* @param \SimpleSAML\Utils\Auth $authUtils
76+
*/
77+
public function setAuthUtils(Utils\Auth $authUtils): void
78+
{
79+
$this->authUtils = $authUtils;
80+
}
81+
82+
83+
/**
84+
* Inject the \SimpleSAML\Auth\Simple dependency.
85+
*
86+
* @param \SimpleSAML\Auth\Simple $authSimple
87+
*/
88+
public function setAuthSimple(Auth\Simple $authSimple): void
89+
{
90+
$this->authSimple = $authSimple;
91+
}
92+
93+
94+
/**
95+
* Inject the \SimpleSAML\Auth\State dependency.
96+
*
97+
* @param \SimpleSAML\Auth\State $authState
98+
*/
99+
public function setAuthState(Auth\State $authState): void
100+
{
101+
$this->authState = $authState;
102+
}
103+
104+
54105
/**
55106
* Display the list of available authsources.
56107
*
57108
* @param \Symfony\Component\HttpFoundation\Request $request
58109
* @param string|null $as
59-
* @return \SimpleSAML\XHTML\Template
110+
* @return \SimpleSAML\XHTML\Template|\SimpleSAML\HTTP\RunnableResponse
60111
*/
61112
public function main(Request $request, string $as = null)
62113
{
63-
Utils\Auth::requireAdmin();
114+
$this->authUtils::requireAdmin();
64115
if (is_null($as)) {
65116
$t = new Template($this->config, 'admin:authsource_list.twig');
66117
$t->data = [
67118
'sources' => Auth\Source::getSources(),
68119
];
69120
} else {
70-
$authsource = new Auth\Simple($as);
121+
$simple = $this->authSimple;
122+
$authsource = new $simple($as);
71123
if (!is_null($request->query->get('logout'))) {
72-
$authsource->logout($this->config->getBasePath() . 'logout.php');
124+
return new RunnableResponse([$authsource, 'logout'], [$this->config->getBasePath() . 'logout.php']);
73125
} elseif (!is_null($request->query->get(Auth\State::EXCEPTION_PARAM))) {
74126
// This is just a simple example of an error
75127
/** @var array $state */
76-
$state = Auth\State::loadExceptionState();
128+
$state = $this->authState::loadExceptionState();
77129
Assert::keyExists($state, Auth\State::EXCEPTION_DATA);
78130
throw $state[Auth\State::EXCEPTION_DATA];
79131
}
@@ -84,7 +136,7 @@ public function main(Request $request, string $as = null)
84136
'ErrorURL' => $url,
85137
'ReturnTo' => $url,
86138
];
87-
$authsource->login($params);
139+
return new RunnableResponse([$authsource, 'login'], [$params]);
88140
}
89141

90142
$attributes = $authsource->getAttributes();

phpunit.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<filter>
1818
<whitelist processUncoveredFilesFromWhitelist="true">
1919
<directory suffix=".php">./lib/</directory>
20+
<directory suffix=".php">./modules/admin/lib/</directory>
2021
<directory suffix=".php">./modules/core/lib/</directory>
2122
<directory suffix=".php">./modules/saml/lib/</directory>
2223
<exclude>

0 commit comments

Comments
 (0)