Welcome to mirror list, hosted at ThFree Co, Russian Federation.

U2FProvider.php « Provider « lib - github.com/nextcloud/twofactor_u2f.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c9e8b9bb38d4f597a9369d2be010af236289ab74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php

declare(strict_types=1);

/**
 * Nextcloud - U2F 2FA
 *
 * This file is licensed under the Affero General Public License version 3 or
 * later. See the COPYING file.
 *
 * @author Christoph Wurst <christoph@winzerhof-wurst.at>
 * @copyright Christoph Wurst 2018
 */

namespace OCA\TwoFactorU2F\Provider;

use OCA\TwoFactorU2F\Service\U2FManager;
use OCA\TwoFactorU2F\Settings\Personal;
use OCP\AppFramework\IAppContainer;
use OCP\Authentication\TwoFactorAuth\IActivatableAtLogin;
use OCP\Authentication\TwoFactorAuth\IDeactivatableByAdmin;
use OCP\Authentication\TwoFactorAuth\ILoginSetupProvider;
use OCP\Authentication\TwoFactorAuth\IPersonalProviderSettings;
use OCP\Authentication\TwoFactorAuth\IProvidesIcons;
use OCP\Authentication\TwoFactorAuth\IProvidesPersonalSettings;
use OCP\IL10N;
use OCP\IUser;
use OCP\Template;

class U2FProvider implements IActivatableAtLogin, IProvidesIcons, IProvidesPersonalSettings, IDeactivatableByAdmin {

	/** @var IL10N */
	private $l10n;

	/** @var U2FManager */
	private $manager;

	/** @var IAppContainer */
	private $container;

	public function __construct(IL10N $l10n,
								U2FManager $manager,
								IAppContainer $container) {
		$this->l10n = $l10n;
		$this->manager = $manager;
		$this->container = $container;
	}

	/**
	 * Get unique identifier of this 2FA provider
	 */
	public function getId(): string {
		return 'u2f';
	}

	/**
	 * Get the display name for selecting the 2FA provider
	 */
	public function getDisplayName(): string {
		return $this->l10n->t('U2F device');
	}

	/**
	 * Get the description for selecting the 2FA provider
	 */
	public function getDescription(): string {
		return $this->l10n->t('Authenticate with an U2F device');
	}

	/**
	 * Get the template for rending the 2FA provider view
	 */
	public function getTemplate(IUser $user): Template {
		$reqs = $this->manager->startAuthenticate($user);

		$tmpl = new Template('twofactor_u2f', 'challenge');
		$tmpl->assign('reqs', $reqs);
		return $tmpl;
	}

	/**
	 * Verify the given challenge
	 */
	public function verifyChallenge(IUser $user, string $challenge): bool {
		return $this->manager->finishAuthenticate($user, $challenge);
	}

	/**
	 * Decides whether 2FA is enabled for the given user
	 */
	public function isTwoFactorAuthEnabledForUser(IUser $user): bool {
		return count($this->manager->getDevices($user)) > 0;
	}

	public function getPersonalSettings(IUser $user): IPersonalProviderSettings {
		return new Personal($this->manager->getDevices($user));
	}

	public function getLightIcon(): String {
		return image_path('twofactor_u2f', 'app.svg');
	}

	public function getDarkIcon(): String {
		return image_path('twofactor_u2f', 'app-dark.svg');;
	}

	/**
	 * Disable this provider for the given user.
	 *
	 * @param IUser $user the user to deactivate this provider for
	 */
	public function disableFor(IUser $user) {
		$this->manager->removeAllDevices($user);
	}

	/**
	 * @param IUser $user
	 *
	 * @return ILoginSetupProvider
	 */
	public function getLoginSetup(IUser $user): ILoginSetupProvider {
		return $this->container->query(U2FLoginProvider::class);
	}

}