jschan - Anonymous imageboard software. Classic look, modern features and feel. Works without JavaScript and supports Tor, I2P, Lokinet, etc.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

51 lines
1.4 KiB

'use strict';
const { Permissions, Metadata } = require(__dirname+'/permissions.js')
, BigBitfield = require('big-bitfield');
class Permission extends BigBitfield {
constructor(data) {
super(data);
}
// List of permission bits
static allPermissions = Object.values(Permissions)
.filter(v => typeof v === 'number');
// Convert to a map of bit to metadata and state, for use in templates
toJSON() {
return Object.entries(Metadata)
.reduce((acc, entry) => {
acc[entry[0]] = {
state: this.get(entry[0]),
...entry[1],
};
return acc;
}, {});
}
// Update permission based on body and another users permission
handleBody(body, editorPermission, boardOnly=false) {
const handlingBits = boardOnly ? Permissions._MANAGE_BOARD_BITS : Object.keys(Metadata);
for (let bit of handlingBits) {
// If perm has no "parent" bit, or current user has the parent permission, set each bit based on the form input
const allowedParent = Metadata[bit].parent == null
|| editorPermission.get(Metadata[bit].parent);
if (allowedParent && !Metadata[bit].block) {
this.set(parseInt(bit), (body[`permission_bit_${bit}`] != null));
}
}
}
applyInheritance() {
if (this.get(Permissions.ROOT)){ //root gets all perms
this.setAll(Permission.allPermissions);
} else if (this.get(Permissions.MANAGE_BOARD_OWNER)) { //BOs and "global staff"
this.setAll(Permissions._MANAGE_BOARD_BITS);
}
}
}
module.exports = Permission;