Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 744d651

Browse filesBrowse files
committed
Fix usage of PasswordHasherAdapter in PasswordHasherFactory
Using migrate_from with a PasswordEncoderInterface resulted in: Argument 1 passed to Symfony\Component\PasswordHasher\Hasher\PasswordHasherFactory::createHasher() must be of the type array, object given, called in /var/www/html/vendor/symfony/password-hasher/Hasher/PasswordHasherFactory.php on line 157 Because getHasherConfigFromAlgorithm would access it before it is decorated with the adapter.
1 parent 8df7732 commit 744d651
Copy full SHA for 744d651

File tree

Expand file treeCollapse file tree

2 files changed

+38
-8
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+38
-8
lines changed

‎src/Symfony/Component/PasswordHasher/Hasher/PasswordHasherFactory.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/PasswordHasher/Hasher/PasswordHasherFactory.php
+15-8Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,7 @@ public function getPasswordHasher($user): PasswordHasherInterface
6161
throw new \RuntimeException(sprintf('No password hasher has been configured for account "%s".', \is_object($user) ? get_debug_type($user) : $user));
6262
}
6363

64-
if (!$this->passwordHashers[$hasherKey] instanceof PasswordHasherInterface) {
65-
$this->passwordHashers[$hasherKey] = $this->passwordHashers[$hasherKey] instanceof PasswordEncoderInterface
66-
? new PasswordHasherAdapter($this->passwordHashers[$hasherKey])
67-
: $this->createHasher($this->passwordHashers[$hasherKey])
68-
;
69-
}
70-
71-
return $this->passwordHashers[$hasherKey];
64+
return $this->createHasherUsingAdapter($hasherKey);
7265
}
7366

7467
/**
@@ -111,6 +104,18 @@ private function createHasher(array $config, bool $isExtra = false): PasswordHas
111104
return new MigratingPasswordHasher($hasher, ...$extrapasswordHashers);
112105
}
113106

107+
private function createHasherUsingAdapter($hasherKey)
108+
{
109+
if (!$this->passwordHashers[$hasherKey] instanceof PasswordHasherInterface) {
110+
$this->passwordHashers[$hasherKey] = $this->passwordHashers[$hasherKey] instanceof PasswordEncoderInterface
111+
? new PasswordHasherAdapter($this->passwordHashers[$hasherKey])
112+
: $this->createHasher($this->passwordHashers[$hasherKey])
113+
;
114+
}
115+
116+
return $this->passwordHashers[$hasherKey];
117+
}
118+
114119
private function getHasherConfigFromAlgorithm(array $config): array
115120
{
116121
if ('auto' === $config['algorithm']) {
@@ -143,6 +148,8 @@ private function getHasherConfigFromAlgorithm(array $config): array
143148

144149
foreach ($frompasswordHashers as $name) {
145150
if ($hasher = $this->passwordHashers[$name] ?? false) {
151+
$hasher = $this->createHasherUsingAdapter($name);
152+
146153
$hasher = $hasher instanceof PasswordHasherInterface ? $hasher : $this->createHasher($hasher, true);
147154
} else {
148155
$hasher = $this->createHasher(['algorithm' => $name], true);

‎src/Symfony/Component/PasswordHasher/Tests/Hasher/PasswordHasherFactoryTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/PasswordHasher/Tests/Hasher/PasswordHasherFactoryTest.php
+23Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,29 @@ public function testMigrateFrom()
163163
$this->assertStringStartsWith(\SODIUM_CRYPTO_PWHASH_STRPREFIX, $hasher->hash('foo', null));
164164
}
165165

166+
/**
167+
* @group legacy
168+
*/
169+
public function testMigrateFromLegacy()
170+
{
171+
if (!SodiumPasswordHasher::isSupported()) {
172+
$this->markTestSkipped('Sodium is not available');
173+
}
174+
175+
$factory = new PasswordHasherFactory([
176+
'plaintext_encoder' => $plaintext = new PlaintextPasswordEncoder(),
177+
SomeUser::class => ['algorithm' => 'sodium', 'migrate_from' => ['bcrypt', 'plaintext_encoder']],
178+
]);
179+
180+
$hasher = $factory->getPasswordHasher(SomeUser::class);
181+
$this->assertInstanceOf(MigratingPasswordHasher::class, $hasher);
182+
183+
$this->assertTrue($hasher->verify((new SodiumPasswordHasher())->hash('foo', null), 'foo', null));
184+
$this->assertTrue($hasher->verify((new NativePasswordHasher(null, null, null, \PASSWORD_BCRYPT))->hash('foo', null), 'foo', null));
185+
$this->assertTrue($hasher->verify($plaintext->encodePassword('foo', null), 'foo', null));
186+
$this->assertStringStartsWith(\SODIUM_CRYPTO_PWHASH_STRPREFIX, $hasher->hash('foo', null));
187+
}
188+
166189
public function testDefaultMigratingHashers()
167190
{
168191
$this->assertInstanceOf(

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.