24 changed files with 921 additions and 499 deletions
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
<% let expirationDate = null; %> |
||||
<p>Hello <%=user.name%>,</p> |
||||
<p>The following files have been assigned from <%=prevUser.name%> to you<%=prevUser.userId !== assignUser.userId ? ' by ' + assignUser.name : ''%>:</p> |
||||
<ul> |
||||
<% uploads.forEach((upload) => { %> |
||||
<% upload.files.forEach((file) => { %> |
||||
<li><%=file.name%> (<%=humanFileSize(file.size, true)%>)</li> |
||||
<% |
||||
}); |
||||
|
||||
if (upload.expirationDate !== null && (expirationDate === null || upload.expirationDate < expirationDate)) |
||||
expirationDate = upload.expirationDate; |
||||
%> |
||||
<% }) %> |
||||
</ul> |
||||
<% if (expirationDate !== null) { %> |
||||
These files will be automatically deleted after <%=expirationDate.toLocaleString('en-US')%> |
||||
<% } %> |
||||
<p>You can download these files by logging in to <a href="<%=adminUrl%>"><%=adminUrl%></a></p> |
||||
<p>Cheers,<br />Recv</p> |
@ -0,0 +1 @@
@@ -0,0 +1 @@
|
||||
📄 <%=fileCount%> file<%=fileCount != 1 ? 's have' : ' has'%> been assigned to you |
@ -1,36 +1,12 @@
@@ -1,36 +1,12 @@
|
||||
<% |
||||
function humanFileSize(bytes, si) |
||||
{ |
||||
var thresh = si ? 1000 : 1024; |
||||
if(Math.abs(bytes) < thresh) |
||||
{ |
||||
return bytes + ' B'; |
||||
} |
||||
|
||||
var units = si |
||||
? ['kB','MB','GB','TB','PB','EB','ZB','YB'] |
||||
: ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB']; |
||||
var u = -1; |
||||
|
||||
do |
||||
{ |
||||
bytes /= thresh; |
||||
++u; |
||||
} |
||||
while(Math.abs(bytes) >= thresh && u < units.length - 1); |
||||
|
||||
return bytes.toFixed(1) + ' ' + units[u]; |
||||
} |
||||
%> |
||||
<p>Hello <%= user.name %>,</p> |
||||
<p>The following files have just been uploaded:</p> |
||||
<p>Hello <%=user.name%>,</p> |
||||
<p>The following files have been uploaded:</p> |
||||
<ul> |
||||
<% upload.files.forEach((file) => { %> |
||||
<li><%= file.name %> (<%= humanFileSize(file.size, true) %>)</li> |
||||
<li><%=file.name%> (<%=humanFileSize(file.size, true)%>)</li> |
||||
<% }) %> |
||||
</ul> |
||||
<% if (upload.expirationDate !== null) { %> |
||||
These files will be automatically deleted after <%=upload.expirationDate.toLocaleString('en-US')%> |
||||
<% } %> |
||||
<p>You can download these files by logging in to <a href="<%= adminUrl %>"><%= adminUrl %></a></p> |
||||
<p>You can download these files by logging in to <a href="<%=adminUrl%>"><%=adminUrl%></a></p> |
||||
<p>Cheers,<br />Recv</p> |
@ -1 +1 @@
@@ -1 +1 @@
|
||||
📄 File upload notification |
||||
📄 <%=upload.files.count%> file<%=upload.files.count != 1 ? 's' : ''%> uploaded |
@ -1,387 +0,0 @@
@@ -1,387 +0,0 @@
|
||||
const express = require('express'); |
||||
const asyncHandler = require('express-async-handler'); |
||||
const jwt = require('jsonwebtoken'); |
||||
const path = require('path'); |
||||
const resolvePath = require('resolve-path'); |
||||
const AuthTokens = require('../authtokens'); |
||||
const ExpirationUnits = require('../expirationunits'); |
||||
const disk = require('diskusage'); |
||||
const fs = require('mz/fs'); |
||||
|
||||
|
||||
async function checkAuthorization(req, res, repository, onVerified) |
||||
{ |
||||
var token; |
||||
|
||||
if (req.headers.authorization) |
||||
{ |
||||
if (req.headers.authorization.split(' ')[0] !== 'Bearer') |
||||
{ |
||||
res.sendStatus(400); |
||||
return; |
||||
} |
||||
|
||||
token = req.headers.authorization.split(' ')[1]; |
||||
} |
||||
else if (req.cookies && req.cookies.adminToken) |
||||
{ |
||||
token = req.cookies.adminToken; |
||||
} |
||||
else |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
|
||||
jwt.verify(token, config.jwtSecret, async (err, decoded) => |
||||
{ |
||||
try |
||||
{ |
||||
if (err) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
if (decoded.userId) |
||||
{ |
||||
var user = await repository.users.get(decoded.userId); |
||||
if (user === null || !user.active) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
else |
||||
await onVerified(user); |
||||
} |
||||
else |
||||
res.sendStatus(400); |
||||
} |
||||
catch (e) |
||||
{ |
||||
console.log(e); |
||||
res.sendStatus(500); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
|
||||
|
||||
module.exports = (repository) => |
||||
{ |
||||
var router = express.Router(); |
||||
|
||||
|
||||
router.get('/whoami', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
res.send({ |
||||
userId: user.id, |
||||
username: user.username, |
||||
auth: user.auth |
||||
}); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
router.get('/diskspace', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
disk.check(config.fileUpload.path, (err, info) => |
||||
{ |
||||
if (err) |
||||
{ |
||||
res.sendStatus(500); |
||||
return; |
||||
} |
||||
|
||||
res.send(info); |
||||
}); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
/* |
||||
Codes |
||||
*/ |
||||
router.get('/codes', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
var codes = await repository.codes.list(user.hasAuth(AuthTokens.ViewAllCodes) ? null : user.id); |
||||
var usernames = await repository.users.getNames(); |
||||
|
||||
codes.forEach((item) => |
||||
{ |
||||
item.username = usernames[item.userId]; |
||||
}); |
||||
|
||||
res.send(codes); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
router.get('/codes/:id', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
var code = await repository.codes.get(req.params.id); |
||||
if (code === null || (code.userId !== user.id && !user.hasAuth(AuthTokens.ViewAllCodes))) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
var user = await repository.users.get(code.userId); |
||||
if (user !== null) |
||||
code.username = user.name; |
||||
|
||||
res.send(code); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
router.post('/codes', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
var postedCode = req.body; |
||||
|
||||
|
||||
if (config.code.maxExpiration !== null) |
||||
{ |
||||
let now = new Date(); |
||||
|
||||
if (ExpirationUnits.apply(postedCode.expiration) > ExpirationUnits.apply(config.code.maxExpiration)) |
||||
{ |
||||
res.sendStatus(400); |
||||
return; |
||||
} |
||||
} |
||||
|
||||
|
||||
if (postedCode.id) |
||||
{ |
||||
var code = await repository.codes.get(postedCode.id); |
||||
if (code === null || (code.userId !== user.id && !user.hasAuth(AuthTokens.ViewAllCodes))) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
await repository.codes.update({ |
||||
id: postedCode.id, |
||||
expiration: postedCode.expiration, |
||||
description: postedCode.description, |
||||
message: postedCode.message |
||||
}); |
||||
|
||||
res.sendStatus(200); |
||||
} |
||||
else |
||||
{ |
||||
var codeId = await repository.codes.insert({ |
||||
userId: user.id, |
||||
created: postedCode.created || new Date(), |
||||
expiration: postedCode.expiration, |
||||
description: postedCode.description, |
||||
message: postedCode.message |
||||
}); |
||||
} |
||||
|
||||
res.send(codeId); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
router.delete('/codes/:id', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
var code = await repository.codes.get(req.params.id); |
||||
if (code == null || (code.userId !== user.id && !user.hasAuth(AuthTokens.ViewAllCodes))) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
repository.codes.delete(code.id); |
||||
res.sendStatus(200); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
router.get('/expiration', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
res.send({ |
||||
max: config.code.maxExpiration, |
||||
default: config.code.defaultExpiration |
||||
}); |
||||
}); |
||||
})); |
||||
|
||||
/* |
||||
Uploads |
||||
*/ |
||||
router.get('/uploads', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
var files = await repository.uploads.list(user.hasAuth(AuthTokens.ViewAllUploads) ? null : user.id); |
||||
var usernames = await repository.users.getNames(); |
||||
var codedescriptions = await repository.codes.getDescriptions(); |
||||
|
||||
files.forEach((item) => |
||||
{ |
||||
item.username = item.userId !== null ? usernames[item.userId] : null; |
||||
item.codedescription = item.code !== null ? codedescriptions[item.code] : null; |
||||
}); |
||||
|
||||
res.send(files); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
router.delete('/uploads/:id', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
var upload = await repository.uploads.get(req.params.id); |
||||
if (upload == null || (upload.userId !== user.id && !user.hasAuth(AuthTokens.ViewAllUploads))) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
await repository.uploads.delete(upload.id); |
||||
res.sendStatus(200); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
router.get('/download/:fileid/:displayname', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
// TODO should we check if the user has access to the file?
|
||||
// for now not that important, if you know the file's UID and are logged in
|
||||
|
||||
var fullpath = resolvePath(config.fileUpload.path, req.params.fileid); |
||||
res.download(fullpath, req.params.displayname); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
/* |
||||
Users |
||||
*/ |
||||
router.get('/users', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
if (!user.hasAuth(AuthTokens.ManageUsers)) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
var users = await repository.users.list(); |
||||
res.send(users); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
router.get('/users/:id', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
if (req.params.id !== user.id && !user.hasAuth(AuthTokens.ManageUsers)) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
var user = await repository.users.get(req.params.id); |
||||
if (user === null) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
res.send(user); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
router.post('/users', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
var postedUser = req.body; |
||||
|
||||
if (postedUser.id) |
||||
{ |
||||
if (postedUser.id !== user.id && !user.hasAuth(AuthTokens.ManageUsers)) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
await repository.users.update({ |
||||
id: postedUser.id, |
||||
username: postedUser.username, |
||||
name: postedUser.name, |
||||
password: postedUser.password, |
||||
email: postedUser.email, |
||||
auth: postedUser.auth, |
||||
active: postedUser.active |
||||
}); |
||||
|
||||
res.sendStatus(200); |
||||
} |
||||
else |
||||
{ |
||||
if (!user.hasAuth(AuthTokens.ManageUsers)) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
var userId = await repository.users.insert({ |
||||
username: postedUser.username, |
||||
name: postedUser.name, |
||||
password: postedUser.password, |
||||
email: postedUser.email, |
||||
auth: postedUser.auth, |
||||
active: postedUser.active, |
||||
createdByUserId: postedUser.createdByUserId |
||||
}); |
||||
} |
||||
|
||||
res.send(userId); |
||||
}); |
||||
})); |
||||
|
||||
|
||||
router.delete('/users/:id', asyncHandler(async (req, res) => |
||||
{ |
||||
await checkAuthorization(req, res, repository, async (user) => |
||||
{ |
||||
if (!user.hasAuth(AuthTokens.ManageUsers)) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
repository.users.delete(req.params.id); |
||||
res.sendStatus(200); |
||||
}); |
||||
})); |
||||
|
||||
return router; |
||||
} |
@ -0,0 +1,171 @@
@@ -0,0 +1,171 @@
|
||||
const asyncHandler = require('express-async-handler'); |
||||
const AuthTokens = require('../../authtokens'); |
||||
const ExpirationUnits = require('../../expirationunits'); |
||||
const NotificationType = require('../../repository/notification').NotificationType; |
||||
const _ = require('lodash'); |
||||
|
||||
|
||||
module.exports = (repository, router) => |
||||
{ |
||||
router.get('/codes', asyncHandler(async (req, res) => |
||||
{ |
||||
var codes = await repository.codes.list(req.user.hasAuth(AuthTokens.ViewAllCodes) ? null : req.user.id); |
||||
var usernames = await repository.users.getNames(); |
||||
|
||||
codes.forEach((item) => |
||||
{ |
||||
item.username = usernames[item.userId]; |
||||
}); |
||||
|
||||
res.send(codes); |
||||
})); |
||||
|
||||
|
||||
router.get('/codes/:id', asyncHandler(async (req, res) => |
||||
{ |
||||
var code = await repository.codes.get(req.params.id); |
||||
if (code === null || (code.userId !== req.user.id && !req.user.hasAuth(AuthTokens.ViewAllCodes))) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
var user = await repository.users.get(code.userId); |
||||
if (user !== null) |
||||
code.username = user.name; |
||||
|
||||
res.send(code); |
||||
})); |
||||
|
||||
|
||||
router.post('/codes', asyncHandler(async (req, res) => |
||||
{ |
||||
var postedCode = req.body; |
||||
|
||||
|
||||
if (config.code.maxExpiration !== null) |
||||
{ |
||||
let now = new Date(); |
||||
|
||||
if (ExpirationUnits.apply(postedCode.expiration) > ExpirationUnits.apply(config.code.maxExpiration)) |
||||
{ |
||||
res.sendStatus(400); |
||||
return; |
||||
} |
||||
} |
||||
|
||||
|
||||
if (postedCode.id) |
||||
{ |
||||
var code = await repository.codes.get(postedCode.id); |
||||
if (code === null || (code.userId !== req.user.id && !req.user.hasAuth(AuthTokens.ViewAllCodes))) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
await repository.codes.update({ |
||||
id: postedCode.id, |
||||
expiration: postedCode.expiration, |
||||
description: postedCode.description, |
||||
message: postedCode.message |
||||
}); |
||||
|
||||
res.sendStatus(200); |
||||
} |
||||
else |
||||
{ |
||||
var codeId = await repository.codes.insert({ |
||||
userId: req.user.id, |
||||
created: postedCode.created || new Date(), |
||||
expiration: postedCode.expiration, |
||||
description: postedCode.description, |
||||
message: postedCode.message |
||||
}); |
||||
} |
||||
|
||||
res.send(codeId); |
||||
})); |
||||
|
||||
|
||||
router.delete('/codes/:id', asyncHandler(async (req, res) => |
||||
{ |
||||
var code = await repository.codes.get(req.params.id); |
||||
if (code == null || (code.userId !== req.user.id && !req.user.hasAuth(AuthTokens.ViewAllCodes))) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
repository.codes.delete(code.id); |
||||
res.sendStatus(200); |
||||
})); |
||||
|
||||
|
||||
router.get('/expiration', asyncHandler(async (req, res) => |
||||
{ |
||||
res.send({ |
||||
max: config.code.maxExpiration, |
||||
default: config.code.defaultExpiration |
||||
}); |
||||
})); |
||||
|
||||
|
||||
router.post('/assign/code', asyncHandler(async (req, res) => |
||||
{ |
||||
var postedCode = req.body; |
||||
|
||||
var code = await repository.codes.get(postedCode.id); |
||||
if (code === null || (code.userId !== req.user.id && !req.user.hasAuth(AuthTokens.ViewAllCodes))) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
if (code.userId !== postedCode.userId) |
||||
{ |
||||
var target = await repository.users.get(postedCode.userId); |
||||
if (target === null) |
||||
{ |
||||
res.sendStatus(400); |
||||
return; |
||||
} |
||||
|
||||
await repository.codes.move(postedCode.id, postedCode.userId); |
||||
await repository.uploads.move(postedCode.id, postedCode.userId); |
||||
|
||||
await repository.notifications.insert({ |
||||
userId: postedCode.userId, |
||||
codeId: postedCode.id, |
||||
type: NotificationType.CodeMoved, |
||||
metadata: { |
||||
prevUserId: code.userId, |
||||
assignUserId: req.user.id |
||||
} |
||||
}); |
||||
} |
||||
|
||||
res.sendStatus(200); |
||||
})); |
||||
|
||||
|
||||
router.get('/assign/users', asyncHandler(async (req, res) => |
||||
{ |
||||
var users = await repository.users.list(); |
||||
if (users === null) |
||||
{ |
||||
res.send([]); |
||||
return; |
||||
} |
||||
|
||||
let assignableUsers = _.map(_.filter(users, |
||||
(user) => { return user.active }), |
||||
(user) => { return { |
||||
id: user.id, |
||||
username: user.username, |
||||
name: user.name |
||||
}} ); |
||||
|
||||
res.send(assignableUsers); |
||||
})); |
||||
} |
@ -0,0 +1,88 @@
@@ -0,0 +1,88 @@
|
||||
const express = require('express'); |
||||
const jwt = require('jsonwebtoken'); |
||||
|
||||
|
||||
async function checkAuthorization(req, res, repository, onVerified) |
||||
{ |
||||
var token; |
||||
|
||||
if (req.headers.authorization) |
||||
{ |
||||
if (req.headers.authorization.split(' ')[0] !== 'Bearer') |
||||
{ |
||||
res.sendStatus(400); |
||||
return; |
||||
} |
||||
|
||||
token = req.headers.authorization.split(' ')[1]; |
||||
} |
||||
else if (req.cookies && req.cookies.adminToken) |
||||
{ |
||||
token = req.cookies.adminToken; |
||||
} |
||||
else |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
|
||||
jwt.verify(token, config.jwtSecret, async (err, decoded) => |
||||
{ |
||||
try |
||||
{ |
||||
if (err) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
if (decoded.userId) |
||||
{ |
||||
var user = await repository.users.get(decoded.userId); |
||||
if (user === null || !user.active) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
else |
||||
await onVerified(user); |
||||
} |
||||
else |
||||
res.sendStatus(400); |
||||
} |
||||
catch (e) |
||||
{ |
||||
console.log(e); |
||||
res.sendStatus(500); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
|
||||
module.exports = (repository) => |
||||
{ |
||||
var router = express.Router(); |
||||
router.use(async (req, res, next) => |
||||
{ |
||||
try |
||||
{ |
||||
await checkAuthorization(req, res, repository, (user) => |
||||
{ |
||||
req.user = user; |
||||
next(); |
||||
}); |
||||
} |
||||
catch (err) |
||||
{ |
||||
console.log(err); |
||||
} |
||||
}); |
||||
|
||||
require('./status')(repository, router); |
||||
require('./codes')(repository, router); |
||||
require('./uploads')(repository, router); |
||||
require('./users')(repository, router); |
||||
|
||||
return router; |
||||
} |
@ -0,0 +1,30 @@
@@ -0,0 +1,30 @@
|
||||
const asyncHandler = require('express-async-handler'); |
||||
const disk = require('diskusage'); |
||||
|
||||
|
||||
module.exports = (repository, router) => |
||||
{ |
||||
router.get('/whoami', (req, res) => |
||||
{ |
||||
res.send({ |
||||
userId: req.user.id, |
||||
username: req.user.username, |
||||
auth: req.user.auth |
||||
}); |
||||
}); |
||||
|
||||
|
||||
router.get('/diskspace', (req, res) => |
||||
{ |
||||
disk.check(config.fileUpload.path, (err, info) => |
||||
{ |
||||
if (err) |
||||
{ |
||||
res.sendStatus(500); |
||||
return; |
||||
} |
||||
|
||||
res.send(info); |
||||
}); |
||||
}); |
||||
} |
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
const asyncHandler = require('express-async-handler'); |
||||
const AuthTokens = require('../../authtokens'); |
||||
const resolvePath = require('resolve-path'); |
||||
|
||||
|
||||
module.exports = (repository, router) => |
||||
{ |
||||
router.get('/uploads', asyncHandler(async (req, res) => |
||||
{ |
||||
var files = await repository.uploads.list(req.user.hasAuth(AuthTokens.ViewAllUploads) ? null : req.user.id); |
||||
var usernames = await repository.users.getNames(); |
||||
var codedescriptions = await repository.codes.getDescriptions(); |
||||
|
||||
files.forEach((item) => |
||||
{ |
||||
item.username = item.userId !== null ? usernames[item.userId] : null; |
||||
item.codedescription = item.codeId !== null ? codedescriptions[item.codeId] : null; |
||||
}); |
||||
|
||||
res.send(files); |
||||
})); |
||||
|
||||
|
||||
router.delete('/uploads/:id', asyncHandler(async (req, res) => |
||||
{ |
||||
var upload = await repository.uploads.get(req.params.id); |
||||
if (upload == null || (upload.userId !== req.user.id && !req.user.hasAuth(AuthTokens.ViewAllUploads))) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
await repository.uploads.delete(upload.id); |
||||
res.sendStatus(200); |
||||
})); |
||||
|
||||
|
||||
router.delete('/codeuploads/:code', asyncHandler(async (req, res) => |
||||
{ |
||||
var uploads = await repository.uploads.listForCode(req.params.code); |
||||
if (uploads === null) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
if (!req.user.hasAuth(AuthTokens.ViewAllUploads)) |
||||
{ |
||||
for (let i = 0; i < uploads.length; i++) |
||||
{ |
||||
if (uploads[i].userId !== req.user.id) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
} |
||||
} |
||||
|
||||
for (let i = 0; i < uploads.length; i++) |
||||
await repository.uploads.delete(uploads[i].id); |
||||
|
||||
res.sendStatus(200); |
||||
})); |
||||
|
||||
|
||||
router.get('/download/:fileid/:displayname', asyncHandler(async (req, res) => |
||||
{ |
||||
// TODO should we check if the user has access to the file?
|
||||
// for now not that important, if you know the file's UID and are logged in
|
||||
|
||||
var fullpath = resolvePath(config.fileUpload.path, req.params.fileid); |
||||
res.download(fullpath, req.params.displayname); |
||||
})); |
||||
} |
@ -0,0 +1,97 @@
@@ -0,0 +1,97 @@
|
||||
const asyncHandler = require('express-async-handler'); |
||||
const AuthTokens = require('../../authtokens'); |
||||
|
||||
|
||||
module.exports = (repository, router) => |
||||
{ |
||||
router.get('/users', asyncHandler(async (req, res) => |
||||
{ |
||||
if (!req.user.hasAuth(AuthTokens.ManageUsers)) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
var users = await repository.users.list(); |
||||
res.send(users); |
||||
})); |
||||
|
||||
|
||||
router.get('/users/:id', asyncHandler(async (req, res) => |
||||
{ |
||||
if (req.params.id !== req.user.id && !req.user.hasAuth(AuthTokens.ManageUsers)) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
var user = await repository.users.get(req.params.id); |
||||
if (user === null) |
||||
{ |
||||
res.sendStatus(404); |
||||
return; |
||||
} |
||||
|
||||
res.send(user); |
||||
})); |
||||
|
||||
|
||||
router.post('/users', asyncHandler(async (req, res) => |
||||
{ |
||||
var postedUser = req.body; |
||||
|
||||
if (postedUser.id) |
||||
{ |
||||
if (postedUser.id !== req.user.id && !req.user.hasAuth(AuthTokens.ManageUsers)) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
await repository.users.update({ |
||||
id: postedUser.id, |
||||
username: postedUser.username, |
||||
name: postedUser.name, |
||||
password: postedUser.password, |
||||
email: postedUser.email, |
||||
auth: postedUser.auth, |
||||
active: postedUser.active |
||||
}); |
||||
|
||||
res.sendStatus(200); |
||||
} |
||||
else |
||||
{ |
||||
if (!req.user.hasAuth(AuthTokens.ManageUsers)) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
var userId = await repository.users.insert({ |
||||
username: postedUser.username, |
||||
name: postedUser.name, |
||||
password: postedUser.password, |
||||
email: postedUser.email, |
||||
auth: postedUser.auth, |
||||
active: postedUser.active, |
||||
createdByUserId: postedUser.createdByUserId |
||||
}); |
||||
} |
||||
|
||||
res.send(userId); |
||||
})); |
||||
|
||||
|
||||
router.delete('/users/:id', asyncHandler(async (req, res) => |
||||
{ |
||||
if (!req.user.hasAuth(AuthTokens.ManageUsers)) |
||||
{ |
||||
res.sendStatus(403); |
||||
return; |
||||
} |
||||
|
||||
repository.users.delete(req.params.id); |
||||
res.sendStatus(200); |
||||
})); |
||||
} |