Skip to content

Instantly share code, notes, and snippets.

@rubeniskov
Last active April 10, 2016 17:54
Show Gist options
  • Save rubeniskov/e746d041dc5c7e6d83c390590043eef7 to your computer and use it in GitHub Desktop.
Save rubeniskov/e746d041dc5c7e6d83c390590043eef7 to your computer and use it in GitHub Desktop.
A simple unix permission symbol parser
// http://jsperf.com/symbolmask
var symbolMask = function(am, ar, aa, as){
var ir, ia, is, i, j, k,
s = /[\+\,\s]/,
m = 0, r = '',
l = 1, e = [];
for(i=0; i<am.length; i++)
if (s.test(am[i])) {
(l = am[i] !== '+') && (r = []);
} else if (l) {
r = am[i] === 'a' ? ar : r+am[i];
} else {
if(as[0]===am[i])
e[ar.length] |= 1;
else {
for(j=r.length;j--;){
if((ir = ar.indexOf(r[j])) === -1)
throw new Error('Incorret Role token [' + r[j] + ']');
if((ia = aa.indexOf(am[i])) === -1 && (is = as.indexOf(am[i])) === -1)
throw new Error('Incorret Flag token [' + am[i] + ']');
if(ia>-1)
e[ir] |= 1 << ia;
else
for(k=r.length;k--;){
e[ar.length] |= (is << (ar.indexOf(r[k])));
}
};
}
};
for(i=ar.length+1;i--;)
m |= (e[i]||0) << i * aa.length;
return m;
}
// Uage:
// symbolMask(symbolsPattern <string>, RolesMap <string>, AccessMap <string>, SpecialMap <string>);
// symbolMask('ug+rwxs,o+rwx,+t', 'ogu', 'xwr', 'ts') // 4095 === '7777';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment