diff --git a/app/app.js b/app/app.js index 93ab05c..4d07510 100644 --- a/app/app.js +++ b/app/app.js @@ -179,7 +179,8 @@ const start = async function () { }; const hocuspocusServer = HocuspocusServer.configure({ - port: 8081, + address: Config.crdt_backend_host, + port: Config.crdt_backend_port, debounce: 3000, onStoreDocument(data) { storeDocument(data); diff --git a/app/controller/data/data.controller.js b/app/controller/data/data.controller.js index be050ff..01221a6 100644 --- a/app/controller/data/data.controller.js +++ b/app/controller/data/data.controller.js @@ -8,7 +8,7 @@ const data = function (req, res) { title: 'MicroDraw::Data', loginMethods : req.appConfig.loginMethods || [], params: JSON.stringify(req.query), - user : req.user + loggedUser: JSON.stringify(req.user || null) }); }; diff --git a/app/controller/project/project.controller.js b/app/controller/project/project.controller.js index 0cc5db9..0387f55 100644 --- a/app/controller/project/project.controller.js +++ b/app/controller/project/project.controller.js @@ -32,6 +32,13 @@ const project = async function (req, res) { return; } + if (embedProject) { + const refererURL = new URL(req.headers.referer); + const disallowedDomains = req.user.authorizedHostsForEmbedding.split('\n') || []; + if (disallowedDomains.include(refererURL.host)) { + return res.status(403).send('Not authorized to embed this project'); + } + } const context = { projectShortname: json.shortname, projectInfo: JSON.stringify(json), diff --git a/app/controller/user/index.js b/app/controller/user/index.js index 24b26a4..a4cfa09 100644 --- a/app/controller/user/index.js +++ b/app/controller/user/index.js @@ -8,6 +8,8 @@ router.get('/json/:userName', controller.validator, controller.api_user); router.get('/json/:userName/files', controller.validator, controller.api_userFiles); router.get('/json/:userName/atlas', controller.validator, controller.api_userAtlas); router.get('/json/:userName/projects', controller.validator, controller.api_userProjects); +router.post('/delete', controller.deleteProfile); +router.post('/savePreferences', controller.savePreferences); router.get('/:userName', controller.validator, controller.user); module.exports = router; diff --git a/app/controller/user/user.controller.js b/app/controller/user/user.controller.js index cdeb0db..8ad79f0 100644 --- a/app/controller/user/user.controller.js +++ b/app/controller/user/user.controller.js @@ -8,18 +8,21 @@ const { AccessControlService } = require('neuroweblab'); const validator = function (req, res, next) { // UserName can be an ip address (for anonymous users) + const username = req.params.userName; - /* - req.checkParams('userName', 'incorrect user name').isAlphanumeric(); - var errors = req.validationErrors(); - console.log(errors); - if (errors) { - res.send(errors).status(403).end(); - } else { - return next(); - } - */ - next(); + req.appConfig.db.queryUser({username}) + .then((result) => { + if (!result) { + res.status(404); + } + if (result.disabled) { + res.status(404); + + return res.render('disabledUser'); + } + next(); + + }); }; const user = function (req, res) { @@ -187,6 +190,37 @@ const api_userProjects = function (req, res) { }); }; +const deleteProfile = async function(req, res) { + const loggedUser = req.user; + if (!loggedUser) { + res.status(401); + } + try { + const userInfo = await req.appConfig.db.queryUser({username: loggedUser.username}); + await req.appConfig.db.updateUser({ ...userInfo, disabled: true }); + res.redirect('/logout'); + } catch(err) { + console.log(err); + res.status(500); + } +}; + +const savePreferences = async function(req, res) { + const loggedUser = req.user; + if (!loggedUser) { + res.status(401); + } + try { + const userInfo = await req.appConfig.db.queryUser({username: loggedUser.username}); + await req.appConfig.db.updateUser({ ...userInfo, authorizedHostsForEmbedding: req.body.authorizedHosts }); + res.redirect(`/user/${req.user.username}`); + } catch(err) { + console.log(err); + res.status(500); + } + +}; + module.exports = { validator, api_user, @@ -194,5 +228,7 @@ module.exports = { api_userFiles, api_userAtlas, api_userProjects, + deleteProfile, + savePreferences, user }; diff --git a/app/views/data.mustache b/app/views/data.mustache index 988e34f..985232b 100755 --- a/app/views/data.mustache +++ b/app/views/data.mustache @@ -3,57 +3,20 @@ {{> partials/header }} - + + + + - - - -
+
- + - diff --git a/app/views/disabledUser.mustache b/app/views/disabledUser.mustache new file mode 100644 index 0000000..0b36982 --- /dev/null +++ b/app/views/disabledUser.mustache @@ -0,0 +1,28 @@ + + + + + {{> partials/header }} + + + + + + + + +This user has removed his account. Back to the homepage + + + + + diff --git a/app/views/scripts/components/Data.vue b/app/views/scripts/components/Data.vue new file mode 100644 index 0000000..a538af7 --- /dev/null +++ b/app/views/scripts/components/Data.vue @@ -0,0 +1,96 @@ + + + + \ No newline at end of file diff --git a/app/views/scripts/components/UserPage.vue b/app/views/scripts/components/UserPage.vue index 3fc3734..e29a6fd 100644 --- a/app/views/scripts/components/UserPage.vue +++ b/app/views/scripts/components/UserPage.vue @@ -28,25 +28,25 @@ {{project.files.list.length}} {{project.collaborators.list.length}} - {{project.owner}} + {{project.owner}} {{new Date(project.created).toLocaleDateString()}} - -
+ +

Embed

Limit embedding of my contents to the following hosts (1 item by line):

- +

Account

-
+

Are you sure you want to delete your account?

@@ -63,7 +63,7 @@