diff options
author | RaindropsSys <raindrops@equestria.dev> | 2024-03-29 22:05:35 +0100 |
---|---|---|
committer | RaindropsSys <raindrops@equestria.dev> | 2024-03-29 22:05:35 +0100 |
commit | 5860551daa0f60103ad24e93da29f401a653f144 (patch) | |
tree | 9ad97e04152a6edc11d5096c87880978df39086a /pages/sessions.inc | |
parent | a51979ad60074db84af78a06d30fcb888ccb0b03 (diff) | |
download | pluralconnect-5860551daa0f60103ad24e93da29f401a653f144.tar.gz pluralconnect-5860551daa0f60103ad24e93da29f401a653f144.tar.bz2 pluralconnect-5860551daa0f60103ad24e93da29f401a653f144.zip |
Updated 20 files, added 6 files, deleted 144 files and renamed .idea/ponycule.iml (automated)
Diffstat (limited to 'pages/sessions.inc')
-rw-r--r-- | pages/sessions.inc | 226 |
1 files changed, 0 insertions, 226 deletions
diff --git a/pages/sessions.inc b/pages/sessions.inc deleted file mode 100644 index 444e981..0000000 --- a/pages/sessions.inc +++ /dev/null @@ -1,226 +0,0 @@ -<?php - -require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; global $title; global $isLoggedIn; global $isLowerLoggedIn; global $lang; global $pages; -require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; global $_PROFILE; global $app; - -$verified = [ - dns_get_record("zephyrheights.equestria.dev", DNS_A)[0]["ip"], - dns_get_record("maretimebay.equestria.dev", DNS_A)[0]["ip"], - dns_get_record("bridlewood.equestria.dev", DNS_A)[0]["ip"], - dns_get_record("manehattan.equestria.dev", DNS_A)[0]["ip"], - dns_get_record("everfree.equestria.dev", DNS_A)[0]["ip"], -]; - -$verifiedNames = [ - "Raindrops System", - "Raindrops System", - "Equestria.dev bridlewood", - "Equestria.dev manehattan", - $app["other"]["name"] -]; - -?> - -<br> -<div class="container"> - <h1>Sessions</h1> - <script>window.devices = {};</script> - - <p>Here are all the currently open sessions for your account. Clicking on a session will delete it, meaning the device using this session will be logged out.</p> - - <?php $data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/tokens/" . str_replace("/", "", $_COOKIE['PEH2_SESSION_TOKEN'])), true); if (isset($data["profile"])): ?> - <div class="list-group"> - <?php - - $list = array_filter([...scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/tokens"), ...scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/lowertokens")], function ($token) { - if ($token === "." || $token === "..") return false; - - $session = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/sessions/" . $token), true); - - return isset($session["last"]) && isset($session["profile"]); - }); - usort($list, function ($token1, $token2) { - $session1 = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/sessions/" . $token1), true); - $session2 = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/sessions/" . $token2), true); - - if (isset($session1["last"]) && isset($session2["last"])) { - return $session2["last"] - $session1["last"]; - } else { - return INF; - } - }); - - $addressFetchIndex = 0; - - foreach ($list as $token): $session = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/sessions/" . $token), true); if (isset($session["profile"]) && isset($session["name"]) && ($session["profile"]["id"] ?? "") === ($_PROFILE["id"] ?? "")): uasort($session["addresses"], function ($a, $b) { - return $b - $a; - }); ?> - <a class="list-group-item list-group-item-action" onclick="logOut("<?= bin2hex(substr($token, 0, 50)) ?>");"> - <b><?= $session["name"] ?></b><?php if ($token === $_COOKIE["PEH2_SESSION_TOKEN"]): ?><span style="margin-left: 10px;" class="badge bg-primary">This device</span><?php endif; ?><script>window.devices["<?= bin2hex(substr($token, 0, 50)) ?>"]=JSON.parse(`<?= json_encode([ - "name" => trim($session["name"]), - "lastIP" => array_keys($session["addresses"])[count(array_keys($session["addresses"])) > 0 ? count(array_keys($session["addresses"])) - 1 : 0] ?? "-", - "lastSeen" => timeAgo($session["last"]), - "currentDevice" => $token === $_COOKIE["PEH2_SESSION_TOKEN"] - ]) ?>`);</script><br> - Logged in <?= timeAgo($session["created"]) ?>, last activity <?= timeAgo($session["last"]) ?> - <blockquote class="session-bq"> - <?php foreach ($session["addresses"] as $address => $last): ?> - <?= $address ?><?php if (in_array($address, $verified)): ?><span class="text-success" style="filter: invert(1) hue-rotate(180deg);"> (verified: <?= $verifiedNames[array_search($address, $verified)] ?? "-" ?>)</span><?php else: ?> <span class="text-muted" style="filter: invert(1) hue-rotate(180deg);" id="aft-<?= $addressFetchIndex ?>">(unverified: …)<script> - setTimeout(async () => { - let json = JSON.parse(await (await fetch("https://api.iplocation.net/?ip=<?= $address ?>")).text()); - - if ( - (json['country_code2'] !== "FR" && json['country_code2'] !== "GB") || - (json['isp'] === "Academie Orleans-Tours" && json['isp'] === "Free Mobile SAS" && json['isp'] === "Google One Services" && json['isp'] === "Vodafone Ltd" && json['isp'] === "Telefonica UK Limited") - ) { - document.getElementById("aft-<?= $addressFetchIndex ?>").classList.remove("text-muted"); - document.getElementById("aft-<?= $addressFetchIndex ?>").classList.add("text-danger"); - document.getElementById("aft-<?= $addressFetchIndex ?>").innerText = `(unsafe: ${json['isp']}, ${json['country_code2'] === "GB" ? "UK" : json['country_code2']})`; - } else { - document.getElementById("aft-<?= $addressFetchIndex ?>").innerText = `(unverified: ${json['isp']}, ${json['country_code2'] === "GB" ? "UK" : json['country_code2']})`; - } - }, 500 * <?= $addressFetchIndex ?>); - </script></span><?php $addressFetchIndex++; endif; ?> · <?= timeAgo($last) ?><br> - <?php endforeach; ?> - </blockquote> - </a> - <?php endif; endforeach; ?> - </div> - <?php else: ?> - <div class="alert alert-danger"> - <b>Error:</b> You cannot use the session manager because your current session is using the old authentication system. Please log out and log in again to continue. - </div> - <?php endif; ?> -</div> - -<div class="modal fade" id="confirm"> - <div class="modal-dialog"> - <div class="modal-content"> - - <div class="modal-header"> - <h4 class="modal-title">Log out this device?</h4> - <button type="button" class="btn-close" data-bs-toggle="modal"></button> - </div> - - <div class="modal-body"> - <p>You are about to log out the following device from your Ponycule account:</p> - <blockquote id="device-bq"> - <div> - <b>Name:</b> <span id="device-name">-</span><br> - <b>Last address:</b> <span id="device-address">-</span><br> - <b>Last activity:</b> <span id="device-activity">-</span> - </div> - </blockquote> - <p class="text-danger" id="device-current" style="display: none;">This is the device you are currently using, which means you will get logged out as soon as you click on confirm.</p> - <p id="device-normal"></p> - <span class="btn btn-success" id="modal-button" style="margin-right: 5px;" onclick="confirm();">Confirm</span><span class="btn btn-outline-secondary" data-bs-toggle="modal">Cancel</span> - </div> - </div> - </div> -</div> - -<script> - window.currentSession = null; - window.currentDevice = null; - window.modal = new bootstrap.Modal(document.getElementById("confirm")); - - async function confirm() { - await fetch("/api/disconnect?id=" + window.currentSession); - - if (currentDevice.currentDevice) { - location.href = "/-/logout"; - } else { - location.reload(); - } - } - - function logOut(id) { - window.currentSession = id; - window.currentDevice = devices[id]; - - if (currentDevice.currentDevice) { - document.getElementById("device-current").style.display = ""; - document.getElementById("device-normal").style.display = "none"; - } else { - document.getElementById("device-current").style.display = "none"; - document.getElementById("device-normal").style.display = ""; - } - - document.getElementById("device-name").innerText = currentDevice.name; - document.getElementById("device-address").innerText = currentDevice.lastIP; - document.getElementById("device-activity").innerText = currentDevice.lastSeen; - - modal.show(); - } -</script> - -<style> - <?php global $use2023UI; if (!$use2023UI): ?> - .modal-header { - border-bottom: 1px solid #353738; - } - - .modal-content { - border: 1px solid rgba(255, 255, 255, .2); - background-color: #111; - } - - .btn-close { - filter: invert(1); - } - - .list-group-item { - color: #fff; - background-color: #222; - border: 1px solid rgba(255, 255, 255, .125); - } - - .list-group-item.disabled { - color: #fff; - background-color: #222; - border-color: rgba(255, 255, 255, .125); - opacity: .75; - } - - .list-group-item:hover { - background-color: #252525; - color: #ddd; - } - - .list-group-item:active, .list-group-item:focus { - background-color: #272727; - color: #bbb; - } - - <?php else: ?> - - .list-group-item .text-muted { - color: var(--palette-9) !important; - } - - <?php endif; ?> - - .member-link, .list-group-item-action { - cursor: pointer !important; - } - - .alert-dismissible .btn-close { - filter: none !important; - } - - .session-bq { - margin-bottom: 5px; - margin-top: 10px; - margin-left: 5px; - padding-left: 10px; - border-left: 3px solid var(--palette-5, rgba(255, 255, 255, .25)); - } - - #device-bq { - margin-left: 5px; - padding-left: 10px; - border-left: 3px solid var(--palette-5, rgba(255, 255, 255, .25)); - } -</style> - -<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/footer.inc'; ?> |