131 lines
3.4 KiB
JavaScript
131 lines
3.4 KiB
JavaScript
|
|
import mysql from "mysql2/promise";
|
|
|
|
import {
|
|
getConfig
|
|
} from "./config.mjs";
|
|
|
|
const configData = await getConfig();
|
|
|
|
var connection = null;
|
|
await connect();
|
|
|
|
export async function connect(params) {
|
|
if (connection != null) {
|
|
connection.destroy();
|
|
}
|
|
|
|
// Create the connection to database
|
|
connection = await mysql.createConnection({
|
|
host: configData.database.host,
|
|
port: configData.database.port,
|
|
database: configData.database.database,
|
|
user: configData.database.username,
|
|
password: configData.database.password
|
|
});
|
|
|
|
await connection.connect();
|
|
|
|
connection.on('connection', async () => {
|
|
console.log("database connection successful!");
|
|
});
|
|
|
|
connection.on('error', async (mysqlError) => {
|
|
if (mysqlError.code == "PROTOCOL_CONNECTION_LOST") {
|
|
console.log("database connection lost. reconnecting...");
|
|
await connect();
|
|
}
|
|
});
|
|
}
|
|
|
|
export async function login(username, password) {
|
|
try {
|
|
const [rows] = await connection.execute('SELECT id, uidnumber, name, otpsecret FROM `users` WHERE `name` = ? AND `passsha256` = ? AND `disabled` = 0', [username, password]);
|
|
|
|
if (rows.length == 0) {
|
|
throw new Error(`user ${username} not found.`);
|
|
}
|
|
if (rows.length > 1) {
|
|
throw new Error("more than 1 user found.");
|
|
}
|
|
|
|
console.log(`user ${rows[0].name} logged in.`);
|
|
return rows[0];
|
|
} catch (error) {
|
|
console.log(`login failed: ${error.message}`);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export async function getUser(userid) {
|
|
try {
|
|
const [rows] = await connection.execute('SELECT uidnumber, name, givenname, sn, mail, custattr FROM `users` WHERE `id` = ?', [userid]);
|
|
|
|
if (rows.length == 0) {
|
|
throw new Error("no user found.");
|
|
}
|
|
|
|
return rows[0];
|
|
} catch (error) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export async function getUserMFA(userid) {
|
|
try {
|
|
const [rows] = await connection.execute('SELECT otpsecret, yubikey FROM `users` WHERE `id` = ?', [userid]);
|
|
|
|
if (rows.length == 0) {
|
|
throw new Error("no user found.");
|
|
}
|
|
|
|
return rows[0];
|
|
} catch (error) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export async function setOTPSecret(userid, otpsecret) {
|
|
try {
|
|
await connection.execute('UPDATE `users` SET `otpsecret` = ? WHERE `id` = ?', [otpsecret, userid]);
|
|
return true;
|
|
} catch (error) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
export async function getUsers() {
|
|
let [mysqlUsers] = await connection.execute('SELECT id, name, uidnumber, mail, disabled FROM `users`', []);
|
|
return mysqlUsers;
|
|
}
|
|
|
|
export async function getGroups() {
|
|
let [mysqlGroups] = await connection.execute('SELECT * FROM `ldapgroups`', []);
|
|
return mysqlGroups;
|
|
}
|
|
|
|
export async function getUserGroups(userid) {
|
|
try {
|
|
let [mysqlUsers] = await connection.execute('SELECT primarygroup, othergroups FROM `users` WHERE `id` = ?', [userid]);
|
|
let [mysqlGroups] = await connection.execute('SELECT * FROM `ldapgroups`', []);
|
|
|
|
mysqlGroups = mysqlGroups.map((mysqlGroup) => {
|
|
return {
|
|
id: mysqlGroup.id,
|
|
name: mysqlGroup.name
|
|
}
|
|
});
|
|
|
|
let result = [];
|
|
|
|
if (mysqlUsers[0].primarygroup != '') {
|
|
|
|
}
|
|
|
|
return true;
|
|
} catch (error) {
|
|
return false;
|
|
}
|
|
}
|