aboutsummaryrefslogtreecommitdiff
path: root/Psso/Challenge/Totp.php
diff options
context:
space:
mode:
authorwinter Sparkles2026-08-08 23:01:51 +0100
committerwinter Sparkles2026-08-08 23:01:51 +0100
commitb422b6ded608807c7d3bb8b965b3797ca513610b (patch)
tree7925fa972efbfff2a9bf8648334d49e3fd6b5df1 /Psso/Challenge/Totp.php
parent880a274e1ecbed42c76d3dc4a81161b3ae372726 (diff)
implement a large chunk of the auth system itself :D
Diffstat (limited to 'Psso/Challenge/Totp.php')
-rw-r--r--Psso/Challenge/Totp.php27
1 files changed, 27 insertions, 0 deletions
diff --git a/Psso/Challenge/Totp.php b/Psso/Challenge/Totp.php
new file mode 100644
index 0000000..4fd47f4
--- /dev/null
+++ b/Psso/Challenge/Totp.php
@@ -0,0 +1,27 @@
+<?php
+namespace Psso\Challenge;
+use Psso\{Challenge, AuthProvider, ChallengeResult, Context, Input, AuthInterface};
+
+class Totp extends Challenge {
+ public static function create(Context $context): static {
+ self::requireKnownUser($context);
+ return new self($context);
+ }
+
+ public function getInputs(): array {
+ return [new Input('otp', Input::NUMERIC, 'challenge.input.otp')];
+ }
+
+ public function validate(
+ AuthProvider $provider, array $inputData
+ ): ChallengeResult {
+ self::requireInterface($provider, AuthInterface\Totp::class);
+ $success = $provider->validateTotp(
+ $this->context->user, $inputData['otp']
+ );
+ return new ChallengeResult(
+ self::class, $success, null,
+ $success ? null : 'challenge.message.wrong-otp'
+ );
+ }
+}