aboutsummaryrefslogtreecommitdiff
path: root/auth
diff options
context:
space:
mode:
Diffstat (limited to 'auth')
-rw-r--r--auth/index.js40
-rw-r--r--auth/public/change.html2
-rw-r--r--auth/public/index.html1
-rw-r--r--auth/public/script.js22
4 files changed, 46 insertions, 19 deletions
diff --git a/auth/index.js b/auth/index.js
index cc1f5b3..e8d23d0 100644
--- a/auth/index.js
+++ b/auth/index.js
@@ -6,7 +6,7 @@ const app = express.Router();
function checkUser(req, res, next) {
if (req.session.loggedIn) next();
- else res.redirect("/auth");
+ else res.redirect(`/auth?ref=${encodeURI(req.originalUrl)}`);
}
function checkAdmin(req, res, next) {
@@ -35,22 +35,26 @@ app.post("/api/login", async (req, res) => {
if (req.session.loggedIn) return res.redirect("/");
const { username, password } = req.body;
- if (!(username && password)) return res.redirect("/auth");
- const user = (
+ if (!(username && password)) return res.json({ success: false, message: "Username oder Passwort fehlen!" });
+ const users = (
await db.query("SELECT id, password, is_admin, class_id FROM users WHERE username = ?", [username])
- )[0];
+ );
+ if (users.length === 0)
+ return res.json({ success: false, message: "Username oder Passwort falsch!" })
+ const user = users[0];
if (!user || !user.password) return res.redirect("/auth");
const loggedIn = await bcrypt.compare(password, user.password);
if (loggedIn) {
console.log("LOGIN: " + user.id);
req.session.loggedIn = true;
req.session.isAdmin = user.is_admin;
- // Hardcoding ftw lol
- req.session.isSuperAdmin = username == "bornerma" || username == "krönnela" ? user.is_admin : false;
+ // Hardcoding ftw lol - yay
+ req.session.isSuperAdmin = username === "bornerma" || username === "krönnela" ? user.is_admin : false;
req.session.uid = user.id;
req.session.cid = user.class_id;
+ return res.json({success: true});
}
- res.redirect("/auth");
+ return res.json({ success: false, message: "Username oder Passwort falsch!" })
});
app.use("/api/logout", checkUser, (req, res) => {
@@ -62,18 +66,21 @@ app.use("/api/logout", checkUser, (req, res) => {
app.post("/api/password", checkUser, async (req, res) => {
const { oldPassword, newPassword, newPasswordRep } = req.body;
if (!oldPassword || !newPassword || !newPasswordRep || newPassword !== newPasswordRep || newPassword.length < 8)
- return res.send("error");
+ return res.json({ success: false, message: "Passwörter müssen übereinstimmen!" });
const user = (await db.query("SELECT id, password FROM users WHERE id = ?", [req.session.uid]))[0];
- if (!user || !user.password) return res.send("error");
- if (!(await bcrypt.compare(oldPassword, user.password))) return res.send("error");
+ if (!user || !user.password) return res.json({ success: false });
+ if (!(await bcrypt.compare(oldPassword, user.password))) return res.json({
+ success: false,
+ message: "Altes Passwort falsch!"
+ });
try {
console.log("PASSWORD CHANGE: " + user.id);
const newHash = await bcrypt.hash(newPassword, 12);
await db.query("UPDATE users SET password = ? WHERE id = ?", [newHash, req.session.uid]);
- res.redirect("/");
+ res.json({success: true});
} catch (e) {
console.error(e);
- res.send("error");
+ return res.json({ success: false, message: "An error occurred!" });
}
});
@@ -94,10 +101,9 @@ app.get("/api/list", checkUser, async (req, res) => {
}
} catch (e) {
console.error(e);
- return res.send("error");
+ return res.json({ success: false });
}
-
- res.json(users);
+ return res.json(users);
});
app.get("/api/status", (req, res) => {
@@ -114,10 +120,10 @@ app.get("/api/self", checkUser, async (req, res) => {
"SELECT id, username, name, middlename, surname, class_id, type_id, is_admin FROM users WHERE id = ?",
[req.session.uid],
);
- res.json(user[0]);
+ res.json(user.length > 0 ? user[0] : {});
} catch (e) {
console.error(e);
- return res.send("error");
+ return res.json({ success: false });
}
});
diff --git a/auth/public/change.html b/auth/public/change.html
index f703649..5652af4 100644
--- a/auth/public/change.html
+++ b/auth/public/change.html
@@ -41,7 +41,7 @@
minlength="8"
required
/>
- <button type="submit" class="pure-button pure-button-primary">Anmelden</button>
+ <button type="submit" class="pure-button pure-button-primary">Passwort ändern</button>
</fieldset>
</form>
diff --git a/auth/public/index.html b/auth/public/index.html
index 8273238..e0980d1 100644
--- a/auth/public/index.html
+++ b/auth/public/index.html
@@ -32,5 +32,6 @@
<button type="submit" class="pure-button pure-button-primary">Anmelden</button>
</fieldset>
</form>
+ <script src="script.js"></script>
</body>
</html>
diff --git a/auth/public/script.js b/auth/public/script.js
index b50bf9b..fd1fb3a 100644
--- a/auth/public/script.js
+++ b/auth/public/script.js
@@ -2,5 +2,25 @@ loggedIn();
async function loggedIn() {
const resp = await fetch("api/status");
- if (!(await resp.json())["loggedIn"]) location.redirect("/");
+ const res = await resp.json();
+ if (res.loggedIn && !window.location.pathname.endsWith("change.html")) window.location.replace("/");
+ else if (!res.loggedIn && window.location.pathname.endsWith("change.html")) window.location.replace("/");
}
+
+const form = document.querySelector("form");
+form.addEventListener("submit", async e => {
+ e.preventDefault();
+ const method = e.target.method;
+ const url = e.target.action;
+ const rawBody = {};
+ for (const input of form.querySelectorAll("input"))
+ rawBody[input.name] = input.value;
+ const body = JSON.stringify(rawBody);
+ const resp = await fetch(url, { method, body, headers: { "Content-Type": "application/json" } });
+ const res = await resp.json();
+ if (!res.success) alert(res.message);
+ else {
+ const ref = new URL(location.href).searchParams.get("ref");
+ window.location.replace(ref);
+ }
+}); \ No newline at end of file