From c868c9bc09821966baa69e1aa0ba31192559202a Mon Sep 17 00:00:00 2001
From: Enstrayed <48845980+Enstrayed@users.noreply.github.com>
Date: Sun, 20 Apr 2025 20:15:02 -0700
Subject: [PATCH] groundwork for writing new tokens to db
---
liberals/misc.js | 34 +++++++++++++++++++++++++++++++++-
routes/auth.js | 27 ++++++++++++++++++---------
2 files changed, 51 insertions(+), 10 deletions(-)
diff --git a/liberals/misc.js b/liberals/misc.js
index b12a8f6..5fafd90 100644
--- a/liberals/misc.js
+++ b/liberals/misc.js
@@ -20,4 +20,36 @@ function randomStringBase62(length) {
return returnstring
}
-export { randomStringBase16, randomStringBase62 }
\ No newline at end of file
+function getHumanReadableUserAgent(useragent) {
+ let formattedua = useragent.replace(/[\/()]/g," ").split(" ")
+ let os = ""
+ let browser = ""
+
+ if (formattedua.includes("Windows")) {
+ os += "Windows"
+ } else if (formattedua.includes("Macintosh")) {
+ os += "macOS"
+ } else if (formattedua.includes("iPhone")) {
+ os += "iOS"
+ } else if (formattedua.includes("Android")) {
+ os += "Android"
+ } else if (formattedua.includes("Linux")) {
+ os += "Linux"
+ } else {
+ os += "Other"
+ }
+
+ if (formattedua.includes("Firefox")) {
+ browser += "Firefox"
+ } else if (formattedua.includes("Chrome")) {
+ browser += "Chrome"
+ } else if (formattedua.includes("Safari")) {
+ browser += "Safari"
+ } else {
+ browser += "Other"
+ }
+
+ return `${os} ${browser}`
+}
+
+export { randomStringBase16, randomStringBase62, getHumanReadableUserAgent }
\ No newline at end of file
diff --git a/routes/auth.js b/routes/auth.js
index b78b00e..cec9dc7 100644
--- a/routes/auth.js
+++ b/routes/auth.js
@@ -1,6 +1,7 @@
import { app, db, globalConfig } from "../index.js" // Get globals from index
import { checkTokenNew } from "../liberals/auth.js"
import { logRequest } from "../liberals/logging.js"
+import { randomStringBase62, getHumanReadableUserAgent } from "../liberals/misc.js"
app.get("/api/auth/whoami", (rreq,rres) => {
rres.send("Non functional endpoint")
@@ -18,30 +19,38 @@ app.get("/api/auth/callback", (rreq,rres) => {
}).then(fetchRes1 => {
fetchRes1.json().then(fetchRes1 => { // Convert response to JSON then continue
if (fetchRes1.error) { // Fetch to token endpoint succeded but resulted in error, usually because the provided code is invalid
- logRequest(rres,rreq,500,`Callback-Token-${fetchRes1.error}`)
- rres.status(500).send(`An error occured during login, a token was not created.
500 Callback-Token-${fetchRes1.error}`)
+ localError500(`Callback-Token-${fetchRes1.error}`)
} else { // Assumed success
fetch(globalConfig.oidc.userinfoUrl, { // Call userinfo endpoint at IdP using token provided during previous step
headers: { "Authorization": `Bearer ${fetchRes1.access_token}`}
}).then(fetchRes2 => {
if (fetchRes2.ok === false) { // Fetch to userinfo endpoint succeded but resulted in error (usually 401)
- logRequest(rres,rreq,500,`Callback-Userinfo-${fetchRes2.status}`)
- rres.status(500).send(`An error occured during login, a token was not created.
500 Callback-Userinfo-${fetchRes2.status}`)
+ localError500(`Callback-Userinfo-${fetchRes2.status}`)
} else {
fetchRes2.json().then(fetchRes2 => {
- rres.send(fetchRes2)
+ let newToken = randomStringBase62(64)
+ let newExpiration = Date.now() + 86400
+ let newComment = `Login token for ${getHumanReadableUserAgent(rreq.get("User-Agent"))} on ${rreq.get("cf-connecting-ip") ?? rreq.ip}`
+ db`select * from users where oidc_username = ${fetchRes2.username};`.then(dbRes1 => {
+ db`insert into sessions (token,owner,scopes,expires,comment) values (${newToken},${dbRes1[0]?.id},${fetchRes2.enstrayedapi_scopes},${newExpiration},${newComment})`.then(dbRes2 => {
+ rres.send(dbRes2)
+ })
+ })
})
}
}).catch(fetchErr2 => { // Fetch to userinfo endpoint failed for some other reason
- logRequest(rres,rreq,500,`Callback-Fetch2-${fetchErr2}`)
- rres.status(500).send(`An error occured during login, a token was not created.
500 Callback-Fetch2-${fetchErr2}`)
+ localError500(`Callback-Fetch2-${fetchErr2}`)
})
}
})
}).catch(fetchErr1 => { // Fetch to token endpoint failed for some other reason
- logRequest(rres,rreq,500,`Callback-Fetch1-${fetchErr1}`)
- rres.status(500).send(`An error occured during login, a token was not created.
500 Callback-Fetch1-${fetchErr1}`)
+ localError500(`Callback-Fetch-${fetchErr1}`)
})
+
+ function localError500(code) {
+ logRequest(rres,rreq,500,code)
+ rres.status(500).send(`An error occured during login, a token was not created.
500 ${code}`)
+ }
})
app.post("/api/auth/token", (rreq,rres) => {