77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace BookStack\Auth\Access\Mfa;
 | 
						|
 | 
						|
use BookStack\Auth\User;
 | 
						|
use Carbon\Carbon;
 | 
						|
use Illuminate\Database\Eloquent\Model;
 | 
						|
 | 
						|
/**
 | 
						|
 * @property int    $id
 | 
						|
 * @property int    $user_id
 | 
						|
 * @property string $method
 | 
						|
 * @property string $value
 | 
						|
 * @property Carbon $created_at
 | 
						|
 * @property Carbon $updated_at
 | 
						|
 */
 | 
						|
class MfaValue extends Model
 | 
						|
{
 | 
						|
    protected static $unguarded = true;
 | 
						|
 | 
						|
    const METHOD_TOTP = 'totp';
 | 
						|
    const METHOD_BACKUP_CODES = 'backup_codes';
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get all the MFA methods available.
 | 
						|
     */
 | 
						|
    public static function allMethods(): array
 | 
						|
    {
 | 
						|
        return [self::METHOD_TOTP, self::METHOD_BACKUP_CODES];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Upsert a new MFA value for the given user and method
 | 
						|
     * using the provided value.
 | 
						|
     */
 | 
						|
    public static function upsertWithValue(User $user, string $method, string $value): void
 | 
						|
    {
 | 
						|
        /** @var MfaValue $mfaVal */
 | 
						|
        $mfaVal = static::query()->firstOrNew([
 | 
						|
            'user_id' => $user->id,
 | 
						|
            'method'  => $method,
 | 
						|
        ]);
 | 
						|
        $mfaVal->setValue($value);
 | 
						|
        $mfaVal->save();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Easily get the decrypted MFA value for the given user and method.
 | 
						|
     */
 | 
						|
    public static function getValueForUser(User $user, string $method): ?string
 | 
						|
    {
 | 
						|
        /** @var MfaValue $mfaVal */
 | 
						|
        $mfaVal = static::query()
 | 
						|
            ->where('user_id', '=', $user->id)
 | 
						|
            ->where('method', '=', $method)
 | 
						|
            ->first();
 | 
						|
 | 
						|
        return $mfaVal ? $mfaVal->getValue() : null;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Decrypt the value attribute upon access.
 | 
						|
     */
 | 
						|
    protected function getValue(): string
 | 
						|
    {
 | 
						|
        return decrypt($this->value);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Encrypt the value attribute upon access.
 | 
						|
     */
 | 
						|
    protected function setValue($value): void
 | 
						|
    {
 | 
						|
        $this->value = encrypt($value);
 | 
						|
    }
 | 
						|
}
 |