2025-11-03 23:09:22 +00:00
|
|
|
function loginError(message, code = null) {
|
|
|
|
|
let errorStr;
|
|
|
|
|
if (code) {
|
|
|
|
|
errorStr = `Status code ${code}: ${message}`;
|
|
|
|
|
} else {
|
|
|
|
|
errorStr = message;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
document.getElementById("error-text").textContent = errorStr;
|
|
|
|
|
|
|
|
|
|
document.getElementById("login-error").style.display = "block";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function generateToken(username, password) {
|
|
|
|
|
const credentials = btoa(`${username} ${password}`);
|
|
|
|
|
|
2026-06-21 22:56:43 +01:00
|
|
|
const body = `grant_type=password&username=${username}&password=${password}&client_id=website`
|
|
|
|
|
|
2025-11-03 23:09:22 +00:00
|
|
|
let response;
|
|
|
|
|
try {
|
|
|
|
|
response = await fetch("https://account.spfn.net/api/v2/oauth2/generate_token", {
|
2026-06-21 22:56:43 +01:00
|
|
|
method: "POST",
|
2025-11-03 23:09:22 +00:00
|
|
|
headers: {
|
2026-06-21 22:56:43 +01:00
|
|
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
|
|
|
},
|
|
|
|
|
body,
|
2025-11-03 23:09:22 +00:00
|
|
|
})
|
|
|
|
|
} catch (err) {
|
|
|
|
|
loginError(`Internal Server Error: ${err.message}`)
|
|
|
|
|
throw new Error(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!response.ok) {
|
|
|
|
|
if (response.status == 400) { // Invalid Login
|
|
|
|
|
loginError("Invalid SFID or Password");
|
|
|
|
|
} else {
|
|
|
|
|
loginError(await response.text(), response.status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
throw new Error("Network Response was not okay when Generating Token");
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const data = await response.json();
|
|
|
|
|
|
2026-06-21 22:56:43 +01:00
|
|
|
sessionStorage.setItem("authToken", data["access_token"]);
|
2025-11-03 23:09:22 +00:00
|
|
|
|
2026-06-21 22:56:43 +01:00
|
|
|
const expiry = Date.now() + (data["expires_in"] * 1000);
|
2025-11-03 23:09:22 +00:00
|
|
|
sessionStorage.setItem("authExpires", expiry)
|
2026-06-21 22:56:43 +01:00
|
|
|
return data["access_token"];
|
2025-11-03 23:09:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function getToken(username, password) {
|
|
|
|
|
let token = sessionStorage.getItem("authToken");
|
|
|
|
|
|
|
|
|
|
let expiryStr = sessionStorage.getItem("authExpires");
|
|
|
|
|
if (expiryStr) { // Expiry exists so token should exist
|
|
|
|
|
let expiry = new Date(expiryStr);
|
|
|
|
|
if (expiry < new Date()) { // Expired token
|
|
|
|
|
token = await generateToken(username, password);
|
|
|
|
|
} else if (!token) { // Expiry Saved but No Token (shouldn't be possible but it'll be caught if it happens)
|
|
|
|
|
token = await generateToken(username, password);
|
|
|
|
|
}
|
|
|
|
|
} else { // Token Never Saved in Session
|
|
|
|
|
token = await generateToken(username, password);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return token
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
document.getElementById("login").addEventListener("submit", async function(event) {
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
|
|
|
|
|
document.getElementById("login-error").style.display = "none";
|
|
|
|
|
|
|
|
|
|
const username = await document.getElementById("username").value;
|
|
|
|
|
const password = await document.getElementById("password").value;
|
|
|
|
|
|
|
|
|
|
let token = await getToken(username, password);
|
|
|
|
|
if (!token) return;
|
|
|
|
|
|
|
|
|
|
document.getElementById("password").value = "";
|
|
|
|
|
|
|
|
|
|
// Go Back to Origin Page
|
|
|
|
|
const params = new URLSearchParams(window.location.search);
|
|
|
|
|
const redirectURL = params.get("redirect")
|
|
|
|
|
|
|
|
|
|
window.location.href = redirectURL;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
window.onload = async function () { // Check if the token expired
|
|
|
|
|
let expiryStr = sessionStorage.getItem("authExpires");
|
|
|
|
|
if (expiryStr) {
|
|
|
|
|
let expiry = new Date(expiryStr);
|
|
|
|
|
|
|
|
|
|
if (expiry < new Date()) { // Expired - Tell the user it expired
|
|
|
|
|
loginError("Login Expired - Please Log In Again")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|