You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.6 KiB
98 lines
2.6 KiB
const express = require('express');
|
|
const mustacheExpress = require('mustache-express');
|
|
const portfinder = require('portfinder');
|
|
const session = require('express-session');
|
|
const jwt = require('jsonwebtoken');
|
|
const config = require('./config');
|
|
|
|
const setupExpress = (port) => {
|
|
const app = express();
|
|
|
|
app.engine('mustache', mustacheExpress());
|
|
app.set('view engine', 'mustache');
|
|
app.set('views', __dirname + '/views');
|
|
|
|
app.set('trust proxy', 1);
|
|
app.use(session({
|
|
secret: 'somesecret',
|
|
resave: false,
|
|
saveUninitialized: true,
|
|
cookie: { secure: false }
|
|
}));
|
|
|
|
app.use(express.static('public'));
|
|
app.use(express.urlencoded({ extended: false }));
|
|
|
|
setupRoutes(app);
|
|
|
|
app.listen(port, () => console.log(`Tiny Drive starter project is now available at: http://localhost:${port}/`));
|
|
};
|
|
|
|
const setupRoutes = (app) => {
|
|
app.get('/', (req, res) => {
|
|
res.render('index');
|
|
});
|
|
|
|
app.get('/editor', (req, res) => {
|
|
if (req.session.user) {
|
|
res.render('editor', { apiKey: config.apiKey, user: req.session.user });
|
|
} else {
|
|
res.redirect('/');
|
|
}
|
|
});
|
|
|
|
app.get('/logout', (req, res) => {
|
|
req.session.destroy();
|
|
res.redirect('/');
|
|
});
|
|
|
|
app.post('/jwt', (req, res) => {
|
|
const user = req.session.user;
|
|
if (user) {
|
|
const payload = {
|
|
sub: user.login, // Unique user id string
|
|
name: user.name, // Full name of user
|
|
exp: Math.floor(Date.now() / 1000) + (60 * 10) // 10 minutes expiration
|
|
};
|
|
|
|
// Scopes the path to a specific user directory
|
|
if (config.scopeUser) {
|
|
payload['https://claims.tiny.cloud/drive/root'] = `/${user.login}`;
|
|
}
|
|
|
|
try {
|
|
const privateKey = fs.readFileSync(config.privateKeyFile);
|
|
const token = jwt.sign(payload, privateKey, { algorithm: 'RS256'});
|
|
res.json({ token });
|
|
} catch (e) {
|
|
res.status(500);
|
|
res.send('Failed generate jwt token.');
|
|
}
|
|
} else {
|
|
res.status(401);
|
|
res.send('Could not produce a jwt token since the user is not logged in.');
|
|
}
|
|
});
|
|
|
|
app.post('/', (req, res) => {
|
|
const user = config.users.find(({ login, password }) => login === req.body.login && password === req.body.password);
|
|
if (user) {
|
|
req.session.user = user;
|
|
res.redirect('/editor');
|
|
} else {
|
|
res.render('index', { error: 'Incorrect username or password.' })
|
|
}
|
|
});
|
|
};
|
|
|
|
portfinder.getPort({
|
|
port: 3000,
|
|
stopPort: 4000
|
|
}, (err, port) => {
|
|
if (err) {
|
|
console.error('Error:', err.message);
|
|
process.exit(-1);
|
|
} else {
|
|
setupExpress(port);
|
|
}
|
|
});
|