import fs from 'fs' import logger from '../../../utils/logger' import utils from '../../../utils/utils' import { Request, SubmoduleData, User } from '../../../types/basicTypes' const usersFileName = '.users.json' function setup(data: SubmoduleData): void { const { app, /* userDB, url, */ publicdirs /* moduleSpecificData */ } = data const publicDir = publicdirs[0] const userFilesDir = publicDir + 'userFiles' if (!utils.FileExists(userFilesDir)) { utils.CreatePath(userFilesDir, true) } app.get('/listUserDir', (req: Request, res) => { logger.LogReq(req) if (!utils.FileExists(userFilesDir)) { utils.CreatePath(userFilesDir, true) } const subdir: any = req.query.subdir if (subdir) { const safeSubdir = subdir.replace(/\.+/g, '').replace(/\/+/g, '') const dir = userFilesDir + '/' + safeSubdir const usersFile = dir + '/' + usersFileName if (!utils.FileExists(dir)) { res.json({ success: false, msg: `Directory ${subdir} does not exists`, }) return } if (!utils.FileExists(usersFile)) { utils.WriteFile('{}', usersFile) } const users = utils.ReadJSON(usersFile) if (!utils.FileExists(dir)) { res.json({ success: false, msg: `Path '${safeSubdir}' does not exists`, }) return } res.json({ success: true, files: utils.ReadDir(dir).reduce((acc, file) => { const stat = fs.lstatSync(dir + '/' + file) if (stat.isDirectory()) { return acc } acc.push({ name: file, path: dir.replace(publicDir, '') + '/' + file, size: stat.size, date: stat.mtime.getTime(), user: users[file] || -1, }) return acc }, []), }) } else { res.json({ success: true, dirs: utils.ReadDir(userFilesDir).reduce((acc, file) => { const stat = fs.lstatSync(userFilesDir + '/' + file) if (!stat.isDirectory()) { return acc } acc.push({ name: file, date: stat.mtime.getTime(), size: utils.ReadDir(userFilesDir + '/' + file).length, }) return acc }, []), }) } }) app.post('/deleteUserFile', (req: Request, res) => { const dir: any = req.body.dir const fname: any = req.body.fname if (!dir || !fname) { res.json({ success: false, msg: `'dir' or 'fname' is undefined!`, }) return } const safeDir = dir.replace(/\.+/g, '').replace(/\/+/g, '') const safeFname = fname.replace(/\.+/g, '.').replace(/\/+/g, '') const filePath = userFilesDir + '/' + safeDir + '/' + safeFname if (!utils.FileExists(filePath)) { res.json({ success: false, msg: `path does not exists!`, }) return } utils.deleteFile(filePath) const usersFile = userFilesDir + '/' + safeDir + '/' + usersFileName const users = utils.ReadJSON(usersFile) delete users[safeFname] utils.WriteFile(JSON.stringify(users), usersFile) res.json({ success: true, }) }) app.post('/newUserDir', (req: Request, res) => { logger.LogReq(req) const name: any = req.body.name if (!name) { res.json({ success: false, msg: `name is undefined!`, }) return } const safeName = name.replace(/\.+/g, '').replace(/\/+/g, '') if (utils.FileExists(userFilesDir + '/' + safeName)) { res.json({ success: false, msg: `Dir ${name} already exists`, }) return } utils.CreatePath(userFilesDir + '/' + safeName, true) res.json({ success: true, }) }) app.post('/uploadUserFile', (req: Request, res) => { logger.LogReq(req) const user: User = req.session.user const dir = req.body.dir if (!dir) { res.json({ success: false, msg: `dir '${dir}' is undefined!`, }) return } const safeDir = dir.replace(/\.+/g, '.').replace(/\/+/g, '/') if (!utils.FileExists(userFilesDir + '/' + safeDir)) { res.json({ success: false, msg: `dir '${dir}' does not exists!`, }) return } utils .uploadFile(req, userFilesDir + '/' + safeDir) .then((body) => { logger.Log( `Successfull upload ${body.filePath}`, logger.GetColor('blue') ) const usersFile = userFilesDir + '/' + safeDir + '/' + usersFileName const users = utils.ReadJSON(usersFile) users[body.fileName] = user.id utils.WriteFile(JSON.stringify(users), usersFile) res.json({ success: true, }) }) .catch(() => { res.end('something bad happened :s') }) }) } export default { setup: setup, }