mirror of
				https://github.com/BookStackApp/BookStack.git
				synced 2025-11-03 02:13:16 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			63 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace BookStack\Access\Mfa;
 | 
						|
 | 
						|
use Illuminate\Support\Str;
 | 
						|
 | 
						|
class BackupCodeService
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Generate a new set of 16 backup codes.
 | 
						|
     */
 | 
						|
    public function generateNewSet(): array
 | 
						|
    {
 | 
						|
        $codes = [];
 | 
						|
        while (count($codes) < 16) {
 | 
						|
            $code = Str::random(5) . '-' . Str::random(5);
 | 
						|
            if (!in_array($code, $codes)) {
 | 
						|
                $codes[] = strtolower($code);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $codes;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Check if the given code matches one of the available options.
 | 
						|
     */
 | 
						|
    public function inputCodeExistsInSet(string $code, string $codeSet): bool
 | 
						|
    {
 | 
						|
        $cleanCode = $this->cleanInputCode($code);
 | 
						|
        $codes = json_decode($codeSet);
 | 
						|
 | 
						|
        return in_array($cleanCode, $codes);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Remove the given input code from the given available options.
 | 
						|
     * Will return a JSON string containing the codes.
 | 
						|
     */
 | 
						|
    public function removeInputCodeFromSet(string $code, string $codeSet): string
 | 
						|
    {
 | 
						|
        $cleanCode = $this->cleanInputCode($code);
 | 
						|
        $codes = json_decode($codeSet);
 | 
						|
        $pos = array_search($cleanCode, $codes, true);
 | 
						|
        array_splice($codes, $pos, 1);
 | 
						|
 | 
						|
        return json_encode($codes);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Count the number of codes in the given set.
 | 
						|
     */
 | 
						|
    public function countCodesInSet(string $codeSet): int
 | 
						|
    {
 | 
						|
        return count(json_decode($codeSet));
 | 
						|
    }
 | 
						|
 | 
						|
    protected function cleanInputCode(string $code): string
 | 
						|
    {
 | 
						|
        return strtolower(str_replace(' ', '-', trim($code)));
 | 
						|
    }
 | 
						|
}
 |