@@ -9,13 +9,144 @@ module openflow {
99 public _modifiedbyid : string ;
1010 public _modifiedby : string ;
1111 public _modified : Date ;
12- public _acl : ace [ ] ;
12+ public _acl : Ace [ ] ;
13+
14+ /**
15+ * Enumerate ACL for specefic ID
16+ * @param {string } _id Id to search for
17+ * @param {boolean=false } deny look for deny or allow permission
18+ * @returns Ace Ace if found, else null
19+ */
20+ getRight ( _id : string , deny : boolean = false ) : Ace {
21+ var result : Ace = null ;
22+ if ( ! this . _acl ) { this . _acl = [ ] ; }
23+ this . _acl . forEach ( ( a , index ) => {
24+ if ( a . _id === _id && a . deny === deny ) {
25+ this . _acl [ index ] = Ace . assign ( a ) ;
26+ result = this . _acl [ index ] ;
27+ }
28+ } ) ;
29+ if ( result ) {
30+ result = Ace . assign ( result ) ;
31+ }
32+ return result ;
33+ }
34+ /**
35+ * Set right for specefic id, if exists
36+ * @param {Ace } x
37+ * @returns void
38+ */
39+ setRight ( x : Ace ) : void {
40+ if ( ! this . _acl ) { this . _acl = [ ] ; }
41+ this . _acl . forEach ( ( a , index ) => {
42+ if ( a . _id === x . _id && a . deny === x . deny ) {
43+ this . _acl [ index ] = x ;
44+ }
45+ } ) ;
46+ }
47+ /**
48+ * Add/update right for user/role
49+ * @param {string } _id user/role id
50+ * @param {string } name Displayname for user/role
51+ * @param {number[] } rights Right to set
52+ * @param {boolean=false } deny Deny the right
53+ * @returns void
54+ */
55+ addRight ( _id : string , name : string , rights : number [ ] , deny : boolean = false ) : void {
56+ var right : Ace = this . getRight ( _id , deny ) ;
57+ if ( ! right ) { right = new Ace ( ) ; this . _acl . push ( right ) ; }
58+ right . deny = deny ; right . _id = _id ; right . name = name ;
59+ rights . forEach ( bit => {
60+ right . setBit ( bit ) ;
61+ } ) ;
62+ this . setRight ( right ) ;
63+ }
64+ /**
65+ * Remove a right from user/role
66+ * @param {string } _id user/role id
67+ * @param {number[]=null } rights Right to revoke
68+ * @param {boolean=false } deny Deny right
69+ * @returns void
70+ */
71+ removeRight ( _id : string , rights : number [ ] = null , deny : boolean = false ) : void {
72+ if ( ! this . _acl ) { this . _acl = [ ] ; }
73+ var right : Ace = this . getRight ( _id , deny ) ;
74+ if ( ! right ) { return ; }
75+ rights . forEach ( bit => {
76+ right . unsetBit ( bit ) ;
77+ } ) ;
78+ this . setRight ( right ) ;
79+ }
1380 }
14- export class ace {
81+ export class Ace {
1582 public deny : boolean ;
1683 public _id : string ;
1784 public name : string ;
1885 public rights : string = "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=" ;
86+ static assign ( o : any ) : Ace {
87+ return Object . assign ( new Base ( ) , o ) ;
88+ }
89+ _base64ToArrayBuffer ( string_base64 ) : ArrayBuffer {
90+ var binary_string = window . atob ( string_base64 ) ;
91+ var len = binary_string . length ;
92+ var bytes = new Uint8Array ( len ) ;
93+ for ( var i = 0 ; i < len ; i ++ ) {
94+ //var ascii = string_base64.charCodeAt(i);
95+ var ascii = binary_string . charCodeAt ( i ) ;
96+ bytes [ i ] = ascii ;
97+ }
98+ return bytes . buffer ;
99+ }
100+ _arrayBufferToBase64 ( array_buffer ) : string {
101+ var binary = '' ;
102+ var bytes = new Uint8Array ( array_buffer ) ;
103+ var len = bytes . byteLength ;
104+ for ( var i = 0 ; i < len ; i ++ ) {
105+ binary += String . fromCharCode ( bytes [ i ] )
106+ }
107+ return window . btoa ( binary ) ;
108+ }
109+ isBitSet ( bit : number ) : boolean {
110+ bit -- ;
111+ var buf = this . _base64ToArrayBuffer ( this . rights ) ;
112+ var view = new Uint8Array ( buf ) ;
113+ var octet = Math . floor ( bit / 8 ) ;
114+ var currentValue = view [ octet ] ;
115+ var _bit = ( bit % 8 ) ;
116+ var mask = Math . pow ( 2 , _bit ) ;
117+ return ( currentValue & mask ) != 0 ;
118+ }
119+ setBit ( bit : number ) {
120+ bit -- ;
121+ var buf = this . _base64ToArrayBuffer ( this . rights ) ;
122+ var view = new Uint8Array ( buf ) ;
123+ var octet = Math . floor ( bit / 8 ) ;
124+ var currentValue = view [ octet ] ;
125+ var _bit = ( bit % 8 ) ;
126+ var mask = Math . pow ( 2 , _bit ) ;
127+ var newValue = currentValue | mask ;
128+ view [ octet ] = newValue ;
129+ return this . _arrayBufferToBase64 ( view ) ;
130+ }
131+ unsetBit ( bit : number ) {
132+ bit -- ;
133+ var buf = this . _base64ToArrayBuffer ( this . rights ) ;
134+ var view = new Uint8Array ( buf ) ;
135+ var octet = Math . floor ( bit / 8 ) ;
136+ var currentValue = view [ octet ] ;
137+ var _bit = ( bit % 8 ) ;
138+ var mask = Math . pow ( 2 , _bit ) ;
139+ var newValue = currentValue &= ~ mask ;
140+ view [ octet ] = newValue ;
141+ return this . _arrayBufferToBase64 ( view ) ;
142+ }
143+ toogleBit ( bit : number ) {
144+ if ( this . isBitSet ( bit ) ) {
145+ this . unsetBit ( bit ) ;
146+ } else {
147+ this . setBit ( bit ) ;
148+ }
149+ }
19150 }
20151
21152 export class Provider extends Base {
0 commit comments