summaryrefslogtreecommitdiff
path: root/http/public/do/verify_otp.php
blob: 7f868585c2e97bb6984dc15e59d5d61422b3c875 (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
<?php

use JoeacNet\Http\Db;

require_once __DIR__ . "/../../php/db.php";

$db = Db\connectDb();

$payload = json_decode(file_get_contents("php://input"), true);
$guess = getGuessFromPayloadAndValidate($payload);
$leniencySecs = getLeniencySecsFromPayloadAndValidate($payload);
$userId = getUserIdFromPayloadAndValidate($payload);

if (
  !Db\isOtpCorrect(
    db: $db,
    userId: $userId,
    guess: $guess,
    leniencySecs: $leniencySecs,
  )
) {
  http_response_code(400);
  echo "OTP is not valid";
  exit();
}
Db\deleteAllOtpsForUser($db, $userId);
$token = bin2hex(random_bytes(256));
Db\insertSendEmailToken(db: $db, userId: $userId, token: $token);
http_response_code(200);
echo $token;
exit();

/// functions ///

function getGuessFromPayloadAndValidate(array $payload): string
{
  $guess = (string) $payload["guess"];
  if (strlen($guess) != 6) {
    http_response_code(400);
    echo "guess must be six characters long";
    exit();
  }
  return $guess;
}

function getLeniencySecsFromPayloadAndValidate(array $payload): int
{
  if ((bool) $payload["lenient"] ?? false) {
    return 60;
  }
  return 0;
}

function getUserIdFromPayloadAndValidate(array $payload): string
{
  $userId = (string) $payload["userId"];
  if (is_null($userId) || $userId == "") {
    http_response_code(400);
    echo "userId must not be empty";
    exit();
  }
  return $userId;
}