All about user login
Not runnable at the moment
This commit is contained in:
parent
fbb8f5799e
commit
d79bbad575
49 changed files with 1554 additions and 686 deletions
15
routes/account-legacy-integration.js
Normal file
15
routes/account-legacy-integration.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
'use strict';
|
||||
|
||||
const _ = require('../lib/translate')._;
|
||||
const clientHelpers = require('../lib/client-helpers');
|
||||
|
||||
const router = require('../lib/router-async').create();
|
||||
|
||||
router.get('/logout', (req, res) => {
|
||||
req.logout();
|
||||
res.redirect('/');
|
||||
});
|
||||
|
||||
clientHelpers.registerRootRoute(router, _('Account'), 'account');
|
||||
|
||||
module.exports = router;
|
|
@ -1,59 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
const passport = require('../lib/passport');
|
||||
const router = require('../lib/router-async').create();
|
||||
const _ = require('../lib/translate')._;
|
||||
const users = require('../models/users');
|
||||
const interoperableErrors = require('../shared/interoperable-errors');
|
||||
|
||||
|
||||
router.all('/rest/*', (req, res, next) => {
|
||||
req.needsJSONResponse = true;
|
||||
|
||||
if (!req.user) {
|
||||
throw new interoperableErrors.NotLoggedInError();
|
||||
}
|
||||
|
||||
next();
|
||||
});
|
||||
|
||||
router.getAsync('/rest/account', async (req, res) => {
|
||||
const user = await users.getById(req.user.id);
|
||||
return res.json(user);
|
||||
});
|
||||
|
||||
router.postAsync('/rest/account', passport.csrfProtection, async (req, res) => {
|
||||
const data = req.body;
|
||||
data.id = req.user.id;
|
||||
|
||||
await users.updateWithConsistencyCheck(req.body, true);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.postAsync('/rest/account-validate', async (req, res) => {
|
||||
const data = req.body;
|
||||
data.id = req.user.id;
|
||||
|
||||
return res.json(await users.serverValidate(data, true));
|
||||
});
|
||||
|
||||
|
||||
router.all('/*', (req, res, next) => {
|
||||
if (!req.user) {
|
||||
req.flash('danger', _('Need to be logged in to access restricted content'));
|
||||
return res.redirect('/users/login?next=' + encodeURIComponent(req.originalUrl));
|
||||
}
|
||||
// res.setSelectedMenu('users'); FIXME
|
||||
next();
|
||||
});
|
||||
|
||||
router.getAsync('/*', passport.csrfProtection, async (req, res) => {
|
||||
res.render('react-root', {
|
||||
title: _('Account'),
|
||||
reactEntryPoint: 'account',
|
||||
reactCsrfToken: req.csrfToken()
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
module.exports = router;
|
|
@ -1,18 +1,18 @@
|
|||
'use strict';
|
||||
|
||||
let users = require('../lib/models/users-legacy');
|
||||
let users = require('../models/users');
|
||||
let lists = require('../lib/models/lists');
|
||||
let fields = require('../lib/models/fields');
|
||||
let blacklist = require('../lib/models/blacklist');
|
||||
let subscriptions = require('../lib/models/subscriptions');
|
||||
let confirmations = require('../lib/models/confirmations');
|
||||
let tools = require('../lib/tools');
|
||||
let express = require('express');
|
||||
let log = require('npmlog');
|
||||
let router = new express.Router();
|
||||
const router = require('../lib/router-async').create();
|
||||
let mailHelpers = require('../lib/subscription-mail-helpers');
|
||||
const interoperableErrors = require('../shared/interoperable-errors');
|
||||
|
||||
router.all('/*', (req, res, next) => {
|
||||
router.allAsync('/*', async (req, res, next) => {
|
||||
if (!req.query.access_token) {
|
||||
res.status(403);
|
||||
return res.json({
|
||||
|
@ -21,24 +21,24 @@ router.all('/*', (req, res, next) => {
|
|||
});
|
||||
}
|
||||
|
||||
users.findByAccessToken(req.query.access_token, (err, user) => {
|
||||
if (err) {
|
||||
try {
|
||||
await users.getByAccessToken(req.query.access_token);
|
||||
next();
|
||||
} catch (err) {
|
||||
if (err instanceof interoperableErrors.NotFoundError) {
|
||||
res.status(403);
|
||||
return res.json({
|
||||
error: 'Invalid or expired access_token',
|
||||
data: []
|
||||
});
|
||||
} else {
|
||||
res.status(500);
|
||||
return res.json({
|
||||
error: err.message || err,
|
||||
data: []
|
||||
});
|
||||
}
|
||||
if (!user) {
|
||||
res.status(403);
|
||||
return res.json({
|
||||
error: 'Invalid or expired access_token',
|
||||
data: []
|
||||
});
|
||||
}
|
||||
next();
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
router.post('/subscribe/:listId', (req, res) => {
|
||||
|
|
10
routes/namespaces-legacy-integration.js
Normal file
10
routes/namespaces-legacy-integration.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
'use strict';
|
||||
|
||||
const _ = require('../lib/translate')._;
|
||||
const clientHelpers = require('../lib/client-helpers');
|
||||
|
||||
const router = require('../lib/router-async').create();
|
||||
|
||||
clientHelpers.registerRootRoute(router, _('Namespaces'), 'namespaces');
|
||||
|
||||
module.exports = router;
|
|
@ -1,95 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
const passport = require('../lib/passport');
|
||||
const router = require('../lib/router-async').create();
|
||||
const _ = require('../lib/translate')._;
|
||||
const namespaces = require('../models/namespaces');
|
||||
const interoperableErrors = require('../shared/interoperable-errors');
|
||||
|
||||
router.all('/rest/*', (req, res, next) => {
|
||||
req.needsJSONResponse = true;
|
||||
|
||||
if (!req.user) {
|
||||
throw new interoperableErrors.NotLoggedInError();
|
||||
}
|
||||
|
||||
next();
|
||||
});
|
||||
|
||||
router.getAsync('/rest/namespaces/:nsId', async (req, res) => {
|
||||
const ns = await namespaces.getById(req.params.nsId);
|
||||
return res.json(ns);
|
||||
});
|
||||
|
||||
router.postAsync('/rest/namespaces', passport.csrfProtection, async (req, res) => {
|
||||
await namespaces.create(req.body);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.putAsync('/rest/namespaces/:nsId', passport.csrfProtection, async (req, res) => {
|
||||
const ns = req.body;
|
||||
ns.id = parseInt(req.params.nsId);
|
||||
|
||||
await namespaces.updateWithConsistencyCheck(ns);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.deleteAsync('/rest/namespaces/:nsId', passport.csrfProtection, async (req, res) => {
|
||||
await namespaces.remove(req.params.nsId);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.getAsync('/rest/namespaces-tree', async (req, res) => {
|
||||
const entries = {};
|
||||
let root; // Only the Root namespace is without a parent
|
||||
const rows = await namespaces.list();
|
||||
|
||||
for (let row of rows) {
|
||||
let entry;
|
||||
if (!entries[row.id]) {
|
||||
entry = {
|
||||
children: []
|
||||
};
|
||||
entries[row.id] = entry;
|
||||
} else {
|
||||
entry = entries[row.id];
|
||||
}
|
||||
|
||||
if (row.parent) {
|
||||
if (!entries[row.parent]) {
|
||||
entries[row.parent] = {
|
||||
children: []
|
||||
};
|
||||
}
|
||||
|
||||
entries[row.parent].children.push(entry);
|
||||
|
||||
} else {
|
||||
root = entry;
|
||||
}
|
||||
|
||||
entry.title = row.name;
|
||||
entry.key = row.id;
|
||||
}
|
||||
|
||||
return res.json(root);
|
||||
});
|
||||
|
||||
router.all('/*', (req, res, next) => {
|
||||
if (!req.user) {
|
||||
req.flash('danger', _('Need to be logged in to access restricted content'));
|
||||
return res.redirect('/users/login?next=' + encodeURIComponent(req.originalUrl));
|
||||
}
|
||||
// res.setSelectedMenu('namespaces'); FIXME
|
||||
next();
|
||||
});
|
||||
|
||||
router.getAsync('/*', passport.csrfProtection, async (req, res) => {
|
||||
res.render('react-root', {
|
||||
title: _('Namespaces'),
|
||||
reactEntryPoint: 'namespaces',
|
||||
reactCsrfToken: req.csrfToken()
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = router;
|
61
routes/rest/account.js
Normal file
61
routes/rest/account.js
Normal file
|
@ -0,0 +1,61 @@
|
|||
'use strict';
|
||||
|
||||
const passport = require('../../lib/passport');
|
||||
const _ = require('../../lib/translate')._;
|
||||
const users = require('../../models/users');
|
||||
|
||||
const router = require('../../lib/router-async').create();
|
||||
|
||||
|
||||
router.getAsync('/account', passport.loggedIn, async (req, res) => {
|
||||
const user = await users.getById(req.user.id);
|
||||
return res.json(user);
|
||||
});
|
||||
|
||||
router.postAsync('/account', passport.loggedIn, passport.csrfProtection, async (req, res) => {
|
||||
const data = req.body;
|
||||
data.id = req.user.id;
|
||||
|
||||
await users.updateWithConsistencyCheck(req.body, true);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.postAsync('/account-validate', passport.loggedIn, async (req, res) => {
|
||||
const data = req.body;
|
||||
data.id = req.user.id;
|
||||
|
||||
return res.json(await users.serverValidate(data, true));
|
||||
});
|
||||
|
||||
router.getAsync('/access-token', passport.loggedIn, async (req, res) => {
|
||||
const accessToken = await users.getAccessToken(req.user.id);
|
||||
return res.json(accessToken);
|
||||
|
||||
});
|
||||
|
||||
router.postAsync('/access-token-reset', passport.loggedIn, passport.csrfProtection, async (req, res) => {
|
||||
const accessToken = await users.resetAccessToken(req.user.id);
|
||||
return res.json(accessToken);
|
||||
});
|
||||
|
||||
|
||||
router.post('/login', passport.restLogin);
|
||||
router.post('/logout', passport.restLogout); // TODO - this endpoint is currently not in use. It will become relevant once we switch to SPA
|
||||
|
||||
router.postAsync('/password-reset-send', async (req, res) => {
|
||||
await users.sendPasswordReset(req.body.username);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.getAsync('/password-reset-validate', async (req, res) => {
|
||||
const isValid = await users.isPasswordResetTokenValid(req.body.username, req.body.resetToken);
|
||||
return res.json(isValid);
|
||||
})
|
||||
|
||||
router.getAsync('/password-reset', async (req, res) => {
|
||||
await users.resetPassword(req.body.username, req.body.resetToken, req.body.password);
|
||||
return res.json();
|
||||
})
|
||||
|
||||
|
||||
module.exports = router;
|
74
routes/rest/namespaces.js
Normal file
74
routes/rest/namespaces.js
Normal file
|
@ -0,0 +1,74 @@
|
|||
'use strict';
|
||||
|
||||
const passport = require('../../lib/passport');
|
||||
const _ = require('../../lib/translate')._;
|
||||
const namespaces = require('../../models/namespaces');
|
||||
const interoperableErrors = require('../../shared/interoperable-errors');
|
||||
|
||||
const router = require('../../lib/router-async').create();
|
||||
|
||||
|
||||
router.getAsync('/namespaces/:nsId', passport.loggedIn, async (req, res) => {
|
||||
const ns = await namespaces.getById(req.params.nsId);
|
||||
|
||||
ns.hash = namespaces.hash(ns);
|
||||
|
||||
return res.json(ns);
|
||||
});
|
||||
|
||||
router.postAsync('/namespaces', passport.loggedIn, passport.csrfProtection, async (req, res) => {
|
||||
await namespaces.create(req.body);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.putAsync('/namespaces/:nsId', passport.loggedIn, passport.csrfProtection, async (req, res) => {
|
||||
const ns = req.body;
|
||||
ns.id = parseInt(req.params.nsId);
|
||||
|
||||
await namespaces.updateWithConsistencyCheck(ns);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.deleteAsync('/namespaces/:nsId', passport.loggedIn, passport.csrfProtection, async (req, res) => {
|
||||
await namespaces.remove(req.params.nsId);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.getAsync('/namespaces-tree', passport.loggedIn, async (req, res) => {
|
||||
const entries = {};
|
||||
let root; // Only the Root namespace is without a parent
|
||||
const rows = await namespaces.list();
|
||||
|
||||
for (let row of rows) {
|
||||
let entry;
|
||||
if (!entries[row.id]) {
|
||||
entry = {
|
||||
children: []
|
||||
};
|
||||
entries[row.id] = entry;
|
||||
} else {
|
||||
entry = entries[row.id];
|
||||
}
|
||||
|
||||
if (row.parent) {
|
||||
if (!entries[row.parent]) {
|
||||
entries[row.parent] = {
|
||||
children: []
|
||||
};
|
||||
}
|
||||
|
||||
entries[row.parent].children.push(entry);
|
||||
|
||||
} else {
|
||||
root = entry;
|
||||
}
|
||||
|
||||
entry.title = row.name;
|
||||
entry.key = row.id;
|
||||
}
|
||||
|
||||
return res.json(root);
|
||||
});
|
||||
|
||||
|
||||
module.exports = router;
|
44
routes/rest/users.js
Normal file
44
routes/rest/users.js
Normal file
|
@ -0,0 +1,44 @@
|
|||
'use strict';
|
||||
|
||||
const passport = require('../../lib/passport');
|
||||
const _ = require('../../lib/translate')._;
|
||||
const users = require('../../models/users');
|
||||
const interoperableErrors = require('../../shared/interoperable-errors');
|
||||
|
||||
const router = require('../../lib/router-async').create();
|
||||
|
||||
|
||||
router.getAsync('/users/:userId', passport.loggedIn, async (req, res) => {
|
||||
const user = await users.getById(req.params.userId);
|
||||
user.hash = users.hash(user);
|
||||
return res.json(user);
|
||||
});
|
||||
|
||||
router.postAsync('/users', passport.loggedIn, passport.csrfProtection, async (req, res) => {
|
||||
await users.create(req.body);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.putAsync('/users/:userId', passport.loggedIn, passport.csrfProtection, async (req, res) => {
|
||||
const user = req.body;
|
||||
user.id = parseInt(req.params.userId);
|
||||
|
||||
await users.updateWithConsistencyCheck(user);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.deleteAsync('/users/:userId', passport.loggedIn, passport.csrfProtection, async (req, res) => {
|
||||
await users.remove(req.params.userId);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.postAsync('/users-validate', passport.loggedIn, async (req, res) => {
|
||||
return res.json(await users.serverValidate(req.body));
|
||||
});
|
||||
|
||||
router.postAsync('/users-table', passport.loggedIn, async (req, res) => {
|
||||
return res.json(await users.listDTAjax(req.body));
|
||||
});
|
||||
|
||||
|
||||
module.exports = router;
|
|
@ -3,7 +3,7 @@
|
|||
let passport = require('../lib/passport');
|
||||
let express = require('express');
|
||||
let router = new express.Router();
|
||||
let users = require('../lib/models/users-legacy');
|
||||
let users = require('../lib/models/users-legacy-REMOVE');
|
||||
let fields = require('../lib/models/fields');
|
||||
let settings = require('../lib/models/settings');
|
||||
let _ = require('../lib/translate')._;
|
||||
|
@ -115,33 +115,4 @@ router.post('/api/reset-token', passport.parseForm, passport.csrfProtection, (re
|
|||
});
|
||||
});
|
||||
|
||||
router.all('/account', (req, res, next) => {
|
||||
if (!req.user) {
|
||||
req.flash('danger', _('Need to be logged in to access restricted content'));
|
||||
return res.redirect('/users/login?next=' + encodeURIComponent(req.originalUrl));
|
||||
}
|
||||
next();
|
||||
});
|
||||
|
||||
router.get('/account', passport.csrfProtection, (req, res) => {
|
||||
let data = {
|
||||
csrfToken: req.csrfToken(),
|
||||
email: req.user.email
|
||||
};
|
||||
res.render('users/account', data);
|
||||
});
|
||||
|
||||
router.post('/account', passport.parseForm, passport.csrfProtection, (req, res) => {
|
||||
users.update(Number(req.user.id), req.body, (err, success) => {
|
||||
if (err) {
|
||||
req.flash('danger', err.message || err);
|
||||
} else if (success) {
|
||||
req.flash('success', _('Account information updated'));
|
||||
} else {
|
||||
req.flash('info', _('Account information not updated'));
|
||||
}
|
||||
return res.redirect('/users/account');
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = router;
|
10
routes/users-legacy-integration.js
Normal file
10
routes/users-legacy-integration.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
'use strict';
|
||||
|
||||
const _ = require('../lib/translate')._;
|
||||
const clientHelpers = require('../lib/client-helpers');
|
||||
|
||||
const router = require('../lib/router-async').create();
|
||||
|
||||
clientHelpers.registerRootRoute(router, _('Users'), 'users');
|
||||
|
||||
module.exports = router;
|
|
@ -1,70 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
const passport = require('../lib/passport');
|
||||
const router = require('../lib/router-async').create();
|
||||
const _ = require('../lib/translate')._;
|
||||
const users = require('../models/users');
|
||||
const interoperableErrors = require('../shared/interoperable-errors');
|
||||
|
||||
|
||||
router.all('/rest/*', (req, res, next) => {
|
||||
req.needsJSONResponse = true;
|
||||
|
||||
if (!req.user) {
|
||||
throw new interoperableErrors.NotLoggedInError();
|
||||
}
|
||||
|
||||
next();
|
||||
});
|
||||
|
||||
router.getAsync('/rest/users/:userId', async (req, res) => {
|
||||
const user = await users.getById(req.params.userId);
|
||||
return res.json(user);
|
||||
});
|
||||
|
||||
router.postAsync('/rest/users', passport.csrfProtection, async (req, res) => {
|
||||
await users.create(req.body);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.putAsync('/rest/users/:userId', passport.csrfProtection, async (req, res) => {
|
||||
const user = req.body;
|
||||
user.id = parseInt(req.params.userId);
|
||||
|
||||
await users.updateWithConsistencyCheck(user);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.deleteAsync('/rest/users/:userId', passport.csrfProtection, async (req, res) => {
|
||||
await users.remove(req.params.userId);
|
||||
return res.json();
|
||||
});
|
||||
|
||||
router.postAsync('/rest/users-validate', async (req, res) => {
|
||||
return res.json(await users.serverValidate(req.body));
|
||||
});
|
||||
|
||||
router.postAsync('/rest/users-table', async (req, res) => {
|
||||
return res.json(await users.listDTAjax(req.body));
|
||||
});
|
||||
|
||||
|
||||
router.all('/*', (req, res, next) => {
|
||||
if (!req.user) {
|
||||
req.flash('danger', _('Need to be logged in to access restricted content'));
|
||||
return res.redirect('/users/login?next=' + encodeURIComponent(req.originalUrl));
|
||||
}
|
||||
// res.setSelectedMenu('users'); FIXME
|
||||
next();
|
||||
});
|
||||
|
||||
router.getAsync('/*', passport.csrfProtection, async (req, res) => {
|
||||
res.render('react-root', {
|
||||
title: _('Users'),
|
||||
reactEntryPoint: 'users',
|
||||
reactCsrfToken: req.csrfToken()
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
module.exports = router;
|
Loading…
Add table
Add a link
Reference in a new issue