Skip to content

Instantly share code, notes, and snippets.

@io4
Created March 25, 2017 03:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save io4/dd6f44f3009efd2125f37a71ef6ee069 to your computer and use it in GitHub Desktop.
Save io4/dd6f44f3009efd2125f37a71ef6ee069 to your computer and use it in GitHub Desktop.
Linux-like permission thing
function parseNumericPerms (s) {
var operm = parseInt(s,8); // octal
function i (a) {
return Boolean(operm&(2**(a-1)));
}
return {
o: {r:i(3),w:i(2),x:i(1)},
g: {r:i(6),w:i(5),x:i(4)},
u: {r:i(9),w:i(8),x:i(7)}
}
}
function toStr (t) {
var u = t.u;
var g = t.g;
var o = t.o;
var arr = [
u.r,u.w,u.x,
g.r,g.w,g.x,
o.r,o.w,o.x
];
return arr.map((a,b)=>{return a?"rwx"[b%3]:"-"}).join("");
}
function perm(t,type,level){
return t[type][level];
}
var groups = {};
function addGroup(g,u) {
if(!groups[g]) groups[g]=[];
groups[g].push(u);
}
function remFromGroup(g,u){
var pos = groups[g].indexOf(u);
if(pos==-1) return;
groups.g.splice(pos,1);
}
function remGroup(g){
delete groups[g];
}
function newObject(perm,owner,gowner) {
var obj = {};
obj.p = parseNumericPerms(perm);
obj.o = owner;
obj.g = gowner;
obj.perms = function(u) {
var ug = !!~(groups[obj.g]||[]).indexOf(u);
var uu = obj.o == u;
let r = obj.p.o.r||(obj.p.g.r&&ug)||(obj.p.u.r&&uu);
let w = obj.p.o.w||(obj.p.g.w&&ug)||(obj.p.u.w&&uu);
let x = obj.p.o.x||(obj.p.g.x&&ug)||(obj.p.u.x&&uu);
return {r,w,x}
}
return obj;
}
/*
addGroup("asdf","test");
var o = newObject(721,"cows","asdf");
console.log(o.perms("hi")) // x
console.log(o.perms("test")) // wx
console.log(o.perms("cows")) // rwx
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment