<?php
/**
* @license MIT
*
* Modified using Strauss.
* @see https://github.com/BrianHenryIE/strauss
*/
declare(strict_types=1);
namespace iThemesSecurity\Strauss\ZxcvbnPhp;
use iThemesSecurity\Strauss\ZxcvbnPhp\Matchers\MatchInterface;
/**
* Feedback - gives some user guidance based on the strength
* of a password
*
* @see zxcvbn/src/feedback.coffee
*/
class Feedback
{
/**
* @param int $score
* @param MatchInterface[] $sequence
* @return array
*/
public function getFeedback(int $score, array $sequence): array
{
// starting feedback
if (count($sequence) === 0) {
return [
'warning' => '',
'suggestions' => [
"Use a few words, avoid common phrases",
"No need for symbols, digits, or uppercase letters",
],
];
}
// no feedback if score is good or great.
if ($score > 2) {
return [
'warning' => '',
'suggestions' => [],
];
}
// tie feedback to the longest match for longer sequences
$longestMatch = $sequence[0];
foreach (array_slice($sequence, 1) as $match) {
if (mb_strlen($match->token) > mb_strlen($longestMatch->token)) {
$longestMatch = $match;
}
}
$feedback = $longestMatch->getFeedback(count($sequence) === 1);
$extraFeedback = 'Add another word or two. Uncommon words are better.';
array_unshift($feedback['suggestions'], $extraFeedback);
return $feedback;
}
}