advancedmqttbridge/server.mjs
2021-08-02 17:04:26 +02:00

147 lines
3.9 KiB
JavaScript

// Libraries
import express from 'express'
import bcrypt from 'bcrypt'
import session from 'express-session'
import path from 'path'
import { dirname } from 'path';
import { fileURLToPath } from 'url';
import crypto from "crypto";
import config from './config/config.js'
import SqliteManager from "./own_modules/sqliteManager.mjs"
import MqttManager from "./own_modules/mqttManager.mjs"
// Setup express
const app = express()
app.use(express.json())
var randomSecret = crypto.randomBytes(20).toString('hex');
app.use(session({
secret: randomSecret,
resave: true,
saveUninitialized: true
}));
// Setup path
const __dirname = dirname(fileURLToPath(import.meta.url));
// Setup database manager
var databaseManager = new SqliteManager();
await databaseManager.init();
// Setup mqtt manager
var mqttManager = new MqttManager();
mqttManager.init();
// Update mqtt handlers from sqlite
initMqttHandlers();
// Register route
app.post('/register', async (req, res) => {
var password = req.body.password
var email = req.body.email
if(password && email){
const hashedPassword = await bcrypt.hash(req.body.password, 10);
let inserted = await databaseManager.addUser(email, hashedPassword)
if(inserted){
req.session.loggedin = true
req.session.email = email
res.sendStatus(201)
}else{
res.sendStatus(400)
}
}else{
res.sendStatus(400)
}
})
// Default GET route, redirects to login when not logged in or to the homepage when logged in
app.get('/', function(req, res) {
if(req.session.loggedin){
res.redirect("/home")
}else{
res.redirect("/login")
}
});
// Login GET route
app.get('/login', function(request, response) {
response.sendFile(path.join(__dirname + '/public/html/login.html'));
});
// Login POST route
app.post('/login', async (req,res) => {
const user = await databaseManager.getUser(req.body.email);
if(user == null){
return res.sendStatus(400)
}
try{
if(await bcrypt.compare(req.body.password, user.password)){
req.session.loggedin = true
req.session.email = user.email
res.sendStatus(200);
}else{
res.sendStatus(401)
}
}catch{
res.status(500).send()
}
})
// Home GET route
app.get('/home', function(request, response) {
if (request.session.loggedin) {
response.sendFile(path.join(__dirname + '/public/html/home.html'));
} else {
response.redirect('/login');
}
});
app.get('/mqttbridge', (req, res)=>{
var auth = req.query.auth;
var topic = req.query.topic;
var message = req.query.message;
if(auth == undefined || topic == undefined || message == undefined){
res.sendStatus(400);
}else if(auth != config.auth){
res.sendStatus(401);
}else{
mqttManager.publishMessage(topic, message)
res.sendStatus(200);
}
})
app.get('/handlers', async (req, res)=>{
var answer = await databaseManager.getHandlers();
res.json(answer);
})
app.post('/handlers/remove', async (req,res) =>{
let topic = req.body.topic;
let message = req.body.message;
let requestUrl = req.body.requestUrl;
await databaseManager.removeHandler(topic, message, requestUrl)
res.sendStatus(200)
mqttManager.removeMessageHandler({topic: topic, message: message, requestUrl: requestUrl})
})
app.post('/handlers/add', async (req,res) => {
let topic = req.body.topic;
let message = req.body.message;
let requestUrl = req.body.requestUrl;
await databaseManager.addHandler(topic, message, requestUrl)
res.sendStatus(200)
mqttManager.addMessageHandler({topic: topic, message: message, requestUrl: requestUrl})
})
async function initMqttHandlers(){
console.log("[MAIN] Initializing mqtt handlers from database.")
let handlers = await databaseManager.getHandlers();
handlers.forEach(handler => {
mqttManager.addMessageHandler(handler)
});
}
app.listen(3000)