%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Helper/User/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Helper/User/UserTokenHelper.php |
<?php
/**
* This file is part of the Passwords App
* created by Marius David Wieschollek
* and licensed under the AGPL.
*/
namespace OCA\Passwords\Helper\User;
use OC\Authentication\TwoFactorAuth\Manager;
use OCA\Passwords\Services\DeferredActivationService;
use OCA\Passwords\Services\EnvironmentService;
use OCA\Passwords\Services\SessionService;
use OCP\Authentication\TwoFactorAuth\IProvider;
use OCP\ISession;
use OCP\IUser;
use ReflectionException;
use ReflectionObject;
use stdClass;
use Throwable;
/**
* Class UserTokenHelper
*
* @package OCA\Passwords\Helper\Token
*/
class UserTokenHelper {
/**
* @var IUser|null
*/
protected ?IUser $user;
/**
* @var ISession
*/
protected ISession $session;
/**
* @var SessionService
*/
protected SessionService $sessionService;
/**
* @var Manager
*/
protected Manager $twoFactorManager;
/**
* @var DeferredActivationService
*/
private DeferredActivationService $activationService;
/**
* @var null|IProvider[]
*/
protected ?array $providers = null;
/**
* List of 2fa providers that are known to work
*
* @var array
*/
protected array $enabledProviders = ['totp', 'twofactor_nextcloud_notification', 'admin', 'email'];
/**
* UserTokenHelper constructor.
*
* @param Manager $twoFactorManager
* @param DeferredActivationService $activationService
* @param EnvironmentService $environmentService
* @param SessionService $sessionService
* @param ISession $session
*/
public function __construct(Manager $twoFactorManager, DeferredActivationService $activationService, EnvironmentService $environmentService, SessionService $sessionService, ISession $session) {
$this->twoFactorManager = $twoFactorManager;
$this->sessionService = $sessionService;
$this->session = $session;
$this->user = $environmentService->getUser();
$this->activationService = $activationService;
}
/**
* @return bool
*/
public function hasToken(): bool {
return $this->activationService->check('two-factor-tokens') && !empty($this->getProviders());
}
/**
* @return IProvider[]
*/
public function getProviders(): array {
if($this->providers !== null) return $this->providers;
$this->providers = [];
try {
if($this->twoFactorManager->isTwoFactorAuthenticated($this->user)) {
$allProviders = $this->twoFactorManager->getProviderSet($this->user)->getPrimaryProviders();
foreach($allProviders as $provider) {
if(in_array($provider->getId(), $this->enabledProviders) || strpos($provider->getId(), 'gateway') !== false) {
$this->providers[ $provider->getId() ] = $provider;
}
}
if(!empty($this->providers)) {
$backupProvider = $this->twoFactorManager->getProvider($this->user, 'backup_codes');
if($backupProvider !== null) $this->providers[ $backupProvider->getId() ] = $backupProvider;
}
}
} catch(Throwable $e) {
}
return $this->providers;
}
/**
* @return array
*/
public function getProvidersAsArray(): array {
$providers = $this->getProviders();
$array = [];
foreach($providers as $provider) {
$id = $provider->getId();
$array[] = [
'type' => strpos($id, 'twofactor_nextcloud_notification') !== false ? 'request-token':'user-token',
'id' => $id,
'label' => $provider->getDisplayName(),
'description' => $provider->getDescription(),
'request' => strpos($id, 'gateway') !== false || strpos($id, 'twofactor_nextcloud_notification') !== false || $id === 'email'
];
}
return $array;
}
/**
* @param $id
*
* @return array
* @throws ReflectionException
*/
public function triggerProvider(string $id): array {
$providers = $this->getProviders();
if(isset($providers[ $id ])) {
$template = $providers[ $id ]->getTemplate($this->user);
$data = new stdClass();
if($id === 'email') {
$this->sessionService->addShadow('twofactor_email_secret');
} else if($id === 'twofactor_nextcloud_notification') {
$r = new ReflectionObject($template);
$r = $r->getParentClass()->getParentClass();
$p = $r->getProperty('vars');
$p->setAccessible(true);
$data->token = $p->getValue($template)['token'];
} else if(strpos($id, 'gateway') !== false) {
$pid = substr($id, 8);
$this->sessionService->addShadow("twofactor_gateway_{$pid}_secret");
}
return [true, $data];
}
return [false];
}
/**
* @param array $tokens
*
* @return bool
*/
public function verifyTokens(array $tokens): bool {
$providers = $this->getProviders();
if(empty($tokens) && !empty($providers)) return false;
foreach($tokens as $id => $token) {
if(!isset($providers[ $id ]) || !$providers[ $id ]->verifyChallenge($this->user, $token)) return false;
}
return true;
}
}