<?php define('IDENTITIES_FILE', 'identities.json'); define('PRESENT_FILE', 'present.json'); $page_title = 'CZI Presence Detector'; $name_pattern = "^([ a-zA-Z'\-]){1,30}$"; $mac_pattern = "^([0-9A-Fa-f]{2}[:-s]){5}([0-9A-Fa-f]{2})$"; $present = json_decode(file_get_contents(PRESENT_FILE), true); $tz = 'Europe/Berlin'; $datetime = new DateTime("now", new DateTimeZone($tz)); $datetime->setTimestamp($present["timestamp"]); function hash_mac($mac) { $normalized_mac = str_replace('-', ':', strtolower($mac)); $hashed_mac = hash('sha256', $normalized_mac); return $hashed_mac; } function add_identity($name, $mac) { if ( preg_match('/' . $name_pattern . '/', $name) != 1 || preg_match('/' . $mac_pattern . '/', $mac) != 1 ) { http_response_code(400); die("Bad data"); } $hashed_mac = hash_mac($mac); $identities = json_decode(file_get_contents(IDENTITIES_FILE), true); $url = strtok($_SERVER['REQUEST_URI'], '?'); foreach ($identities as $identity) { if ($identity['name'] == $name) { header("Location: " . $url . "?dup_name", true, 303); exit(); } if ($identity['mac_hash'] == $hashed_mac) { header("Location: " . $url . "?dup_mac", true, 303); exit(); } } array_push($identities, array("name" => $name, "mac_hash" => $hashed_mac)); file_put_contents(IDENTITIES_FILE, json_encode($identities)); header("Location: " . $url . "?succ", true, 303); exit(); } function remove_identity($mac) { if (preg_match('/' . $mac_pattern . '/', $mac) != 1) { http_response_code(400); die("Bad data"); } $hashed_mac = hash_mac($mac); $identities = json_decode(file_get_contents(IDENTITIES_FILE), true); $new_identities = array(); foreach ($identities as $identity) { if ($identity['mac_hash'] != $hashed_mac) { array_push($new_identities, $identity); } file_put_contents(IDENTITIES_FILE, json_encode($new_identities)); header("Location: " . strtok($_SERVER['REQUEST_URI'], '?'), true, 303); exit(); } } if ($_SERVER['REQUEST_METHOD'] == "POST") { if ( isset($_POST['name']) && isset($_POST['mac']) ) { add_identity($_POST['name'], $_POST['mac']); } else if (isset($_POST['remove-mac'])) { remove_identity($_POST['remove-mac']); } } ?> <html> <head> <title><?php echo $page_title; ?></title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous"> <script src="bootstrap/js/bootstrap.bundle.min.js" integrity="sha384-HwwvtgBNo3bZJJLYd8oVXjrBZt8cqVSpeBNS5n7C8IVInixGAoxmnlMuBnhbgrkm" crossorigin="anonymous"></script> </head> <body> <nav class="navbar navbar-light bg-light justify-content-between" style="padding: 0"> <span class="navbar-brand mb-0 h1" style="padding-left: 1rem"><?php echo $page_title; ?></span> </nav> <div id="content" style="padding: 2rem;"> <h2>Jetzt gerade im CZI <small>(letztes Update von <?php echo $datetime->format('H:i:s d.m.Y'); ?>)</small></h2><br> <table class="table"> <thead> <tr> <th>Name</th> </tr> </thead> <?php foreach ($present["names"] as $name) { ?> <tr> <td><?php echo $name; ?></td> </tr> <?php } ?> </table> <br><br> <?php if ($_SERVER['QUERY_STRING'] == 'dup_name') { ?> <div class="alert alert-danger" role="alert"> Name already in use, please choose a different one. </div> <?php } else if ($_SERVER['QUERY_STRING'] == 'dup_mac') { ?> <div class="alert alert-danger" role="alert"> MAC already set up, please remove it first to change name. </div> <?php } else if ($_SERVER['QUERY_STRING'] == 'succ') { ?> <div class="alert alert-success" role="alert"> Identity successfully saved. </div> <?php }?> <div class="row justify-content-start"> <div class="col col-md-4"> <div class="card" style="max-width: 30rem;"> <div class="card-body"> <h5 class="card-title">Neues Gerät tracken</h5> <form method="POST"> <input class="form-control" type="text" name="name" pattern="<?php print($name_pattern); ?>" placeholder="Gebe hier deinen Namen ein" value="" /><br> <input class="form-control" type="text" name="mac" pattern="<?php print($mac_pattern); ?>" placeholder="Gebe hier die MAC-Adresse des zu trackenden Gerätes ein" value="" /><br> <button class="btn btn-primary" type="submit">Speichern</button> </form> </div> </div> </div> <div class="col col-md-4"> <div class="card" style="max-width: 30rem;"> <div class="card-body"> <h5 class="card-title">Gerät entfernen</h5> <form method="POST"> <input class="form-control" type="text" name="remove-mac" pattern="<?php print($mac_pattern); ?>" placeholder="Gebe hier die MAC-Adresse des zu löschenden Gerätes ein" value="" /><br> <button class="btn btn-primary" type="submit">Entfernen</button> </form> </div> </div> </div> </div> </div> </body> </html>