<?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; } }