Skip to content
This repository was archived by the owner on Sep 19, 2022. It is now read-only.

Commit 07c0ade

Browse files
Merge pull request #171 from vyskocilpavel/dev_fix_script_improvements
fix: resolving comments from PR #165
2 parents 0a7d127 + 89fe972 commit 07c0ade

File tree

2 files changed

+32
-47
lines changed

2 files changed

+32
-47
lines changed

lib/ChallengeManager.php

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use SimpleSAML\Configuration;
66
use SimpleSAML\Logger;
77
use SimpleSAML\Module\perun\databaseCommand\ChallengesDbCmd;
8+
use SimpleSAML\Error\Exception;
89
use Jose\Component\KeyManagement\JWKFactory;
910
use Jose\Component\Core\AlgorithmManager;
1011
use Jose\Component\Signature\JWSBuilder;
@@ -30,6 +31,7 @@ class ChallengeManager
3031

3132
private $challengeDbCmd;
3233

34+
private $sigAlg;
3335
private $hashAlg;
3436
private $challengeLength;
3537

@@ -42,45 +44,36 @@ public function __construct()
4244
$this->challengeDbCmd = new ChallengesDbCmd();
4345
$config = Configuration::getConfig(self::CONFIG_FILE_NAME);
4446
$this->hashAlg = $config->getString(self::HASH_ALG, 'sha512');
45-
$this->sighAlg = $config->getString(self::SIG_ALG, 'sha512');
47+
$this->sigAlg = $config->getString(self::SIG_ALG, 'sha512');
4648
$this->challengeLength = $config->getInteger(self::CHALLENGE_LENGTH, 32);
4749
$this->pubKey = $config->getString(self::PUB_KEY);
4850
$this->privKey = $config->getString(self::PRIV_KEY);
4951
}
5052

5153
public function generateChallenge($id, $scriptName): string
5254
{
53-
try {
54-
$challenge = hash($this->hashAlg, random_bytes($this->challengeLength));
55-
} catch (Exception $ex) {
56-
http_response_code(500);
57-
throw new Exception('ChallengeManager.generateChallenge: Error while generating a challenge');
58-
}
55+
$challenge = hash($this->hashAlg, random_bytes($this->challengeLength));
5956

6057
if (empty($id) ||
6158
empty($scriptName) ||
6259
!$this->challengeDbCmd->insertChallenge($challenge, $id, $scriptName)) {
63-
Logger::error(self::LOG_PREFIX . 'Error while creating a challenge');
64-
http_response_code(500);
65-
throw new Exception('ChallengeManager.generateChallenge: Error while generating a challenge');
60+
throw new Exception('ChallengeManager.generateChallenge: Error while storing a challenge to DB.');
6661
}
6762
return $challenge;
6863
}
6964

70-
public function generateToken($id, $scriptName, $data)
65+
public function generateToken($id, $scriptName, $data): string
7166
{
72-
73-
$challenge = $this->generateChallenge($id, $scriptName);
74-
75-
if (empty($challenge)) {
76-
Logger::error('Retrieving the challenge was not successful.');
77-
return;
67+
try {
68+
$challenge = $this->generateChallenge($id, $scriptName);
69+
} catch (\Exception $ex) {
70+
throw new Exception('ChallengeManager.generateToken: Error while generating a challenge');
7871
}
7972

8073
$jwk = JWKFactory::createFromKeyFile($this->privKey);
8174
$algorithmManager = new AlgorithmManager(
8275
[
83-
self::getAlgorithm('Signature\\Algorithm', $this->sighAlg)
76+
self::getAlgorithm('Signature\\Algorithm', $this->sigAlg)
8477
]
8578
);
8679
$jwsBuilder = new JWSBuilder($algorithmManager);
@@ -90,13 +83,14 @@ public function generateToken($id, $scriptName, $data)
9083
'exp' => time() + 300,
9184
'challenge' => $challenge,
9285
'id' => $id,
86+
'scriptName' => $scriptName,
9387
'data' => $data
9488
]);
9589

9690
$jws = $jwsBuilder
9791
->create()
9892
->withPayload($payload)
99-
->addSignature($jwk, ['alg' => $this->sighAlg])
93+
->addSignature($jwk, ['alg' => $this->sigAlg])
10094
->build();
10195

10296
$serializer = new CompactSerializer();
@@ -109,7 +103,7 @@ public function decodeToken($token)
109103
{
110104
$algorithmManager = new AlgorithmManager(
111105
[
112-
self::getAlgorithm('Signature\\Algorithm', $this->sighAlg)
106+
self::getAlgorithm('Signature\\Algorithm', $this->sigAlg)
113107
]
114108
);
115109
$jwsVerifier = new JWSVerifier($algorithmManager);
@@ -119,7 +113,7 @@ public function decodeToken($token)
119113
$jws = $serializerManager->unserialize($token);
120114

121115
$headerCheckerManager = new HeaderCheckerManager(
122-
[new AlgorithmChecker([$this->sighAlg])],
116+
[new AlgorithmChecker([$this->sigAlg])],
123117
[new JWSTokenSupport()]
124118
);
125119

@@ -128,9 +122,7 @@ public function decodeToken($token)
128122
$isVerified = $jwsVerifier->verifyWithKey($jws, $jwk, 0);
129123

130124
if (!$isVerified) {
131-
Logger::error('Perun.updateUes: The token signature is invalid!');
132-
http_response_code(401);
133-
exit;
125+
throw new Exception('ChallengeManager.decodeToken: The token signature is invalid!');
134126
}
135127

136128
$claimCheckerManager = new ClaimCheckerManager(
@@ -146,10 +138,11 @@ public function decodeToken($token)
146138

147139
$challenge = $claims['challenge'];
148140
$id = $claims['id'];
141+
$scriptName = $claims['scriptName'];
149142

150143
$challengeManager = new ChallengeManager();
151144

152-
$challengeDb = $challengeManager->readChallengeFromDb($id);
145+
$challengeDb = $challengeManager->readChallengeFromDb($id, $scriptName);
153146

154147
$checkAccessSucceeded = self::checkAccess($challenge, $challengeDb);
155148
$challengeSuccessfullyDeleted = $challengeManager->deleteChallengeFromDb($id);
@@ -161,32 +154,23 @@ public function decodeToken($token)
161154
return $claims;
162155
}
163156

164-
private function readChallengeFromDb($id)
157+
private function readChallengeFromDb($id, $scriptName)
165158
{
166-
if (empty($id)) {
167-
http_response_code(400);
159+
if (empty($id) || empty($scriptName)) {
168160
return null;
169161
}
170162

171-
$result = $this->challengeDbCmd->readChallenge($id);
172-
173-
if ($result === null) {
174-
http_response_code(500);
175-
}
176-
177-
return $result;
163+
return $this->challengeDbCmd->readChallenge($id, $scriptName);
178164
}
179165

180166
private static function checkAccess($challenge, $challengeDb): bool
181167
{
182168
if (empty($challenge) || empty($challengeDb)) {
183-
http_response_code(400);
184169
return false;
185170
}
186171

187172
if (!hash_equals($challengeDb, $challenge)) {
188173
Logger::error(self::LOG_PREFIX . 'Hashes are not equal.');
189-
http_response_code(401);
190174
return false;
191175
}
192176

@@ -196,13 +180,11 @@ private static function checkAccess($challenge, $challengeDb): bool
196180
private function deleteChallengeFromDb($id): bool
197181
{
198182
if (empty($id)) {
199-
http_response_code(400);
200183
return false;
201184
}
202185

203186
if (!$this->challengeDbCmd->deleteChallenge($id)) {
204187
Logger::error(self::LOG_PREFIX . 'Error while deleting challenge from the database.');
205-
http_response_code(500);
206188
return false;
207189
}
208190

lib/databaseCommand/ChallengesDbCmd.php

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@
22

33
namespace SimpleSAML\Module\perun\databaseCommand;
44

5+
use SimpleSAML\Logger;
6+
57
/**
68
* @author Dominik Baranek <[email protected]>
79
*/
810
class ChallengesDbCmd extends DatabaseCommand
911
{
10-
const CHALLENGES_TABLE_NAME = 'scriptChallenges';
11-
const ID_COLUMN = 'id';
12-
const CHALLENGE_COLUMN = 'challenge';
13-
const SCRIPT_COLUMN = 'script';
14-
const DATE_COLUMN = 'date';
12+
private const CHALLENGES_TABLE_NAME = 'scriptChallenges';
13+
private const ID_COLUMN = 'id';
14+
private const CHALLENGE_COLUMN = 'challenge';
15+
private const SCRIPT_COLUMN = 'script';
16+
private const DATE_COLUMN = 'date';
1517

1618
public function __construct()
1719
{
@@ -33,13 +35,14 @@ public function insertChallenge($challenge, $id, $scriptName): bool
3335
return $this->write($query, $params);
3436
}
3537

36-
public function readChallenge($id)
38+
public function readChallenge($id, $scriptName)
3739
{
3840
$query = 'SELECT challenge FROM ' . self::CHALLENGES_TABLE_NAME . ' WHERE ' .
39-
self::ID_COLUMN . ' = :' . self::ID_COLUMN;
41+
self::ID_COLUMN . ' = :' . self::ID_COLUMN . ' AND ' . self::SCRIPT_COLUMN . ' = :' . self::SCRIPT_COLUMN ;
4042

4143
$params = [
42-
self::ID_COLUMN => $id
44+
self::ID_COLUMN => $id,
45+
self::SCRIPT_COLUMN => $scriptName
4346
];
4447

4548
return $this->read($query, $params)->fetchColumn();

0 commit comments

Comments
 (0)