%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Services/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Services/WordsService.php |
<?php /* * @copyright 2023 Passwords App * * @author Marius David Wieschollek * @license AGPL-3.0 * * This file is part of the Passwords App * created by Marius David Wieschollek. */ namespace OCA\Passwords\Services; use OCA\Passwords\Exception\ApiException; use OCA\Passwords\Provider\Words\WordsProviderInterface; use OCP\AppFramework\Http; use Throwable; /** * Class WordsService * * @package OCA\Passwords\Services */ class WordsService { /** * WordsService constructor. * * @param LoggingService $logger * @param WordsProviderInterface $wordsProvider * @param PasswordSecurityCheckService $securityHelper */ public function __construct( protected LoggingService $logger, protected WordsProviderInterface $wordsProvider, protected PasswordSecurityCheckService $securityHelper ) { } /** * @param int $strength * @param bool $addNumbers * @param bool $addSpecialCharacters * * @param int $attempts * * @return array * @throws ApiException */ public function getPassword( int $strength = 1, bool $addNumbers = false, bool $addSpecialCharacters = false, int $attempts = 0 ) { $strength = $this->validateStrength($strength); try { $result = $this->wordsProvider->getWords($strength, $addNumbers, $addSpecialCharacters); if($result !== null) { if($this->isSecure($result['password'], $addNumbers, $addSpecialCharacters, $strength + 1)) { return [$result['password'], $result['words'], $strength]; } else { $this->logger->warning('Words service delivered low quality result'); } } else { $this->logger->warning('Words service delivered no result'); } } catch(Throwable $e) { $this->logger->logException($e); } if($attempts < 6) { return $this->getPassword($strength, $addNumbers, $addSpecialCharacters, $attempts + 1); } $this->logger->error("Words service failed {$attempts} times. Returning error to client."); throw new ApiException('Internal Words API Error', Http::STATUS_BAD_GATEWAY); } /** * @param string $password * @param bool $addNumbers * @param bool $addSpecialCharacters * @param int $charCount * * @return bool */ protected function isSecure(string $password, bool $addNumbers, bool $addSpecialCharacters, int $charCount): bool { if(strlen($password) < 12) return false; if($addNumbers) { if(!preg_match_all('/[0-9]/', $password, $numbers) || count($numbers[0]) < $charCount) { return false; } } if($addSpecialCharacters) { if(!preg_match_all('/\W/u', $password, $specials) || count($specials[0]) < $charCount) { return false; } } return $this->securityHelper->isPasswordSecure($password); } /** * @param int $strength * * @return int */ protected function validateStrength(int $strength): int { if($strength < 0) { return 1; } else if($strength > 4) { return 4; } return $strength; } }