mirror of
https://github.com/BobbyWibowo/lolisafe.git
synced 2025-02-22 13:19:05 +00:00
Moved permission-related functions to permissionController
Fix: non-root staffs are now able to delete files by any users (previously they could only list them).
This commit is contained in:
parent
c763d9b1ea
commit
fcf4c00de7
@ -1,40 +1,12 @@
|
|||||||
const bcrypt = require('bcrypt')
|
const bcrypt = require('bcrypt')
|
||||||
const config = require('./../config')
|
const config = require('./../config')
|
||||||
const db = require('knex')(config.database)
|
const db = require('knex')(config.database)
|
||||||
|
const perms = require('./permissionController')
|
||||||
const randomstring = require('randomstring')
|
const randomstring = require('randomstring')
|
||||||
const utils = require('./utilsController')
|
const utils = require('./utilsController')
|
||||||
|
|
||||||
const authController = {}
|
const authController = {}
|
||||||
|
|
||||||
authController.permissions = {
|
|
||||||
user: 0, // upload & delete own files, create & delete albums
|
|
||||||
moderator: 50, // delete other user's files
|
|
||||||
admin: 80, // manage users (disable accounts) & create moderators
|
|
||||||
superadmin: 100 // create admins
|
|
||||||
// groups will inherit permissions from groups which have lower value
|
|
||||||
}
|
|
||||||
|
|
||||||
authController.is = (user, group) => {
|
|
||||||
// root bypass
|
|
||||||
if (user.username === 'root') { return true }
|
|
||||||
const permission = user.permission || 0
|
|
||||||
return permission >= authController.permissions[group]
|
|
||||||
}
|
|
||||||
|
|
||||||
authController.higher = (user, target) => {
|
|
||||||
const userPermission = user.permission || 0
|
|
||||||
const targetPermission = target.permission || 0
|
|
||||||
return userPermission > targetPermission
|
|
||||||
}
|
|
||||||
|
|
||||||
authController.mapPermissions = user => {
|
|
||||||
const map = {}
|
|
||||||
Object.keys(authController.permissions).forEach(group => {
|
|
||||||
map[group] = authController.is(user, group)
|
|
||||||
})
|
|
||||||
return map
|
|
||||||
}
|
|
||||||
|
|
||||||
authController.verify = async (req, res, next) => {
|
authController.verify = async (req, res, next) => {
|
||||||
const username = req.body.username
|
const username = req.body.username
|
||||||
const password = req.body.password
|
const password = req.body.password
|
||||||
@ -92,7 +64,7 @@ authController.register = async (req, res, next) => {
|
|||||||
password: hash,
|
password: hash,
|
||||||
token,
|
token,
|
||||||
enabled: 1,
|
enabled: 1,
|
||||||
permission: authController.permissions.user
|
permission: perms.permissions.user
|
||||||
})
|
})
|
||||||
return res.json({ success: true, token })
|
return res.json({ success: true, token })
|
||||||
})
|
})
|
||||||
@ -191,7 +163,7 @@ authController.editUser = async (req, res, next) => {
|
|||||||
|
|
||||||
if (!target) {
|
if (!target) {
|
||||||
return res.json({ success: false, description: 'Could not get user with the specified ID.' })
|
return res.json({ success: false, description: 'Could not get user with the specified ID.' })
|
||||||
} else if (!authController.higher(user, target)) {
|
} else if (!perms.higher(user, target)) {
|
||||||
return res.json({ success: false, description: 'The user is in the same or higher group as you.' })
|
return res.json({ success: false, description: 'The user is in the same or higher group as you.' })
|
||||||
} else if (target.username === 'root') {
|
} else if (target.username === 'root') {
|
||||||
return res.json({ success: false, description: 'Root user may not be edited.' })
|
return res.json({ success: false, description: 'Root user may not be edited.' })
|
||||||
@ -202,7 +174,7 @@ authController.editUser = async (req, res, next) => {
|
|||||||
return res.json({ success: false, description: 'Username must have 4-32 characters.' })
|
return res.json({ success: false, description: 'Username must have 4-32 characters.' })
|
||||||
}
|
}
|
||||||
|
|
||||||
let permission = req.body.group ? authController.permissions[req.body.group] : target.permission
|
let permission = req.body.group ? perms.permissions[req.body.group] : target.permission
|
||||||
if (typeof permission !== 'number' || permission < 0) { permission = target.permission }
|
if (typeof permission !== 'number' || permission < 0) { permission = target.permission }
|
||||||
|
|
||||||
await db.table('users')
|
await db.table('users')
|
||||||
@ -236,7 +208,7 @@ authController.listUsers = async (req, res, next) => {
|
|||||||
const user = await utils.authorize(req, res)
|
const user = await utils.authorize(req, res)
|
||||||
if (!user) { return }
|
if (!user) { return }
|
||||||
|
|
||||||
const isadmin = authController.is(user, 'admin')
|
const isadmin = perms.is(user, 'admin')
|
||||||
if (!isadmin) { return res.status(403) }
|
if (!isadmin) { return res.status(403) }
|
||||||
|
|
||||||
let offset = req.params.page
|
let offset = req.params.page
|
||||||
|
32
controllers/permissionController.js
Normal file
32
controllers/permissionController.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
const permissionController = {}
|
||||||
|
|
||||||
|
permissionController.permissions = {
|
||||||
|
user: 0, // upload & delete own files, create & delete albums
|
||||||
|
moderator: 50, // delete other user's files
|
||||||
|
admin: 80, // manage users (disable accounts) & create moderators
|
||||||
|
superadmin: 100 // create admins
|
||||||
|
// groups will inherit permissions from groups which have lower value
|
||||||
|
}
|
||||||
|
|
||||||
|
permissionController.is = (user, group) => {
|
||||||
|
// root bypass
|
||||||
|
if (user.username === 'root') { return true }
|
||||||
|
const permission = user.permission || 0
|
||||||
|
return permission >= permissionController.permissions[group]
|
||||||
|
}
|
||||||
|
|
||||||
|
permissionController.higher = (user, target) => {
|
||||||
|
const userPermission = user.permission || 0
|
||||||
|
const targetPermission = target.permission || 0
|
||||||
|
return userPermission > targetPermission
|
||||||
|
}
|
||||||
|
|
||||||
|
permissionController.mapPermissions = user => {
|
||||||
|
const map = {}
|
||||||
|
Object.keys(permissionController.permissions).forEach(group => {
|
||||||
|
map[group] = permissionController.is(user, group)
|
||||||
|
})
|
||||||
|
return map
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = permissionController
|
@ -1,6 +1,6 @@
|
|||||||
const auth = require('./authController')
|
|
||||||
const config = require('./../config')
|
const config = require('./../config')
|
||||||
const db = require('knex')(config.database)
|
const db = require('knex')(config.database)
|
||||||
|
const perms = require('./permissionController')
|
||||||
const randomstring = require('randomstring')
|
const randomstring = require('randomstring')
|
||||||
const utils = require('./utilsController')
|
const utils = require('./utilsController')
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ tokenController.verify = async (req, res, next) => {
|
|||||||
return res.json({
|
return res.json({
|
||||||
success: true,
|
success: true,
|
||||||
username: user.username,
|
username: user.username,
|
||||||
permissions: auth.mapPermissions(user)
|
permissions: perms.mapPermissions(user)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
const auth = require('./authController')
|
|
||||||
const config = require('./../config')
|
const config = require('./../config')
|
||||||
const crypto = require('crypto')
|
const crypto = require('crypto')
|
||||||
const db = require('knex')(config.database)
|
const db = require('knex')(config.database)
|
||||||
@ -6,6 +5,7 @@ const fetch = require('node-fetch')
|
|||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const multer = require('multer')
|
const multer = require('multer')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
const perms = require('./permissionController')
|
||||||
const randomstring = require('randomstring')
|
const randomstring = require('randomstring')
|
||||||
const utils = require('./utilsController')
|
const utils = require('./utilsController')
|
||||||
|
|
||||||
@ -652,7 +652,7 @@ uploadsController.list = async (req, res) => {
|
|||||||
|
|
||||||
// Headers is string-only, this seem to be the safest and lightest
|
// Headers is string-only, this seem to be the safest and lightest
|
||||||
const all = req.headers.all === '1'
|
const all = req.headers.all === '1'
|
||||||
const ismoderator = auth.is(user, 'moderator')
|
const ismoderator = perms.is(user, 'moderator')
|
||||||
if (all && !ismoderator) { return res.json(403) }
|
if (all && !ismoderator) { return res.json(403) }
|
||||||
|
|
||||||
const files = await db.table('files')
|
const files = await db.table('files')
|
||||||
|
@ -5,6 +5,7 @@ const ffmpeg = require('fluent-ffmpeg')
|
|||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const gm = require('gm')
|
const gm = require('gm')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
const perms = require('./permissionController')
|
||||||
|
|
||||||
const utilsController = {}
|
const utilsController = {}
|
||||||
const uploadsDir = path.join(__dirname, '..', config.uploads.folder)
|
const uploadsDir = path.join(__dirname, '..', config.uploads.folder)
|
||||||
@ -167,10 +168,12 @@ utilsController.deleteFile = file => {
|
|||||||
utilsController.bulkDeleteFiles = async (field, values, user) => {
|
utilsController.bulkDeleteFiles = async (field, values, user) => {
|
||||||
if (!user || !['id', 'name'].includes(field)) { return }
|
if (!user || !['id', 'name'].includes(field)) { return }
|
||||||
|
|
||||||
|
console.log(require('util').inspect(perms))
|
||||||
|
const ismoderator = perms.is(user, 'moderator')
|
||||||
const files = await db.table('files')
|
const files = await db.table('files')
|
||||||
.whereIn(field, values)
|
.whereIn(field, values)
|
||||||
.where(function () {
|
.where(function () {
|
||||||
if (user.username !== 'root') {
|
if (!ismoderator) {
|
||||||
this.where('userid', user.id)
|
this.where('userid', user.id)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { permissions } = require('./../controllers/authController')
|
const perms = require('./../controllers/permissionController')
|
||||||
|
|
||||||
const init = function (db) {
|
const init = function (db) {
|
||||||
// Create the tables we need to store galleries and files
|
// Create the tables we need to store galleries and files
|
||||||
@ -59,7 +59,7 @@ const init = function (db) {
|
|||||||
password: hash,
|
password: hash,
|
||||||
token: require('randomstring').generate(64),
|
token: require('randomstring').generate(64),
|
||||||
timestamp: Math.floor(Date.now() / 1000),
|
timestamp: Math.floor(Date.now() / 1000),
|
||||||
permission: permissions.superadmin
|
permission: perms.permissions.superadmin
|
||||||
}).then(() => {})
|
}).then(() => {})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
const config = require('./../config')
|
const config = require('./../config')
|
||||||
const db = require('knex')(config.database)
|
const db = require('knex')(config.database)
|
||||||
const { permissions } = require('./../controllers/authController')
|
const perms = require('./../controllers/permissionController')
|
||||||
|
|
||||||
const map = {
|
const map = {
|
||||||
albums: {
|
albums: {
|
||||||
@ -36,11 +36,11 @@ migration.start = async () => {
|
|||||||
.where('username', 'root')
|
.where('username', 'root')
|
||||||
.first()
|
.first()
|
||||||
.update({
|
.update({
|
||||||
permission: permissions.superadmin
|
permission: perms.permissions.superadmin
|
||||||
})
|
})
|
||||||
.then(rows => {
|
.then(rows => {
|
||||||
if (!rows) { return console.log('Unable to update root\'s permission into superadmin.') }
|
if (!rows) { return console.log('Unable to update root\'s permission into superadmin.') }
|
||||||
console.log(`Updated root's permission to ${permissions.superadmin} (superadmin).`)
|
console.log(`Updated root's permission to ${perms.permissions.superadmin} (superadmin).`)
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log('Migration finished! Now start lolisafe normally')
|
console.log('Migration finished! Now start lolisafe normally')
|
||||||
|
Loading…
Reference in New Issue
Block a user