summaryrefslogtreecommitdiff
path: root/access-restriction.php
blob: 92049bc52cc3e0651adf801ebec6da4bd2891c43 (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
<?php

$keyFile = fopen("../key.ed25519", "r");
if ($keyFile === false)
  die();
$privKey = trim(fgets($keyFile));
$pubKey = trim(fgets($keyFile));
fclose($keyFile);

function client_identifier() {
  return $_SERVER['SERVER_ADDR'] . " " . $_SERVER['REMOTE_ADDR'] . " " . $_SERVER['REMOTE_PORT'];
}

function zugriff_erlaubt() {
  global $pubKey;
  if (!(preg_match("/^192\.168\.[01]\.3$/", $_SERVER["REMOTE_ADDR"]) == 1))
    return true;
  if (array_key_exists('key',$_GET)) {
    $pubKey = hex2bin($pubKey);
    return sodium_crypto_sign_open(hex2bin($_GET["key"]), $pubKey) == client_identifier();
  }
  return false;
}

function attach_key($delimiter = '&') {
  if (!array_key_exists('key', $_GET))
    return;
  print $delimiter . 'key=' . $_GET['key'];
}

if (!zugriff_erlaubt()) {
?>
<html>
<head>
  <script src="/encrypt_key.js"></script>
  <script>
    window.sodium = {
      onload: function (sodium) {
        var sodium = sodium;
      }
    };
    function update_key(form) {
      privateKey = "<?php echo $privKey; ?>";
      privateKey = encrypt_private_key(form.password.value, privateKey);
      privateKey = sodium.from_hex(privateKey);
      let msg = sodium.crypto_sign("<?php print client_identifier(); ?>", privateKey);
      form.key.value = sodium.to_hex(msg);
    }
  </script>
  <script src="/sodium.js" async></script>
</head>
<body>
<form action="" id="form" method="get">
Passwort: <input type="password" id="password" onchange="update_key(this.form);">
<input type="hidden" name="key" id="key">
<input type="submit" value="weiter"">
</form>
</body>
</html>
<?php
  die();
}