44/// @module
55//----------------------------------------------------------------------------------------------------------------------
66
7+ import _ from 'lodash' ;
8+ import Promise from 'bluebird' ;
79import TPGroup from './group' ;
8- import TPUser from './user' ;
10+
11+ //----------------------------------------------------------------------------------------------------------------------
12+
13+ var mapping = { permissions : 'permissions' , groups : 'groups' } ;
914
1015//----------------------------------------------------------------------------------------------------------------------
1116
1217class TPManager
1318{
1419 constructor ( )
1520 {
16- this . users = { } ;
1721 this . groups = { } ;
1822 } // end constructor
1923
24+ _userHasPerm ( user , perm , obj )
25+ {
26+ return ! ! _ . find ( user [ mapping . permissions ] , ( permission ) =>
27+ {
28+ if ( permission == '*/*' )
29+ {
30+ return true ;
31+ }
32+ else if ( permission . match ( / ^ .* \/ \* / ) )
33+ {
34+ return ! ! permission . match ( new RegExp ( `^${ obj } /` ) ) ;
35+ }
36+ else if ( permission . match ( / ^ \* \/ .* / ) )
37+ {
38+ return ! ! permission . match ( new RegExp ( `^.*/${ perm } $` ) ) ;
39+ }
40+ else
41+ {
42+ return ! ! permission . match ( new RegExp ( `^${ obj } /${ perm } $` ) ) ;
43+ } // end if
44+ } ) ;
45+ } // end _userHasPerm
46+
47+ //------------------------------------------------------------------------------------------------------------------
48+ // Public
49+ //------------------------------------------------------------------------------------------------------------------
50+
51+ setUserMapping ( newMapping )
52+ {
53+ mapping . groups = newMapping . groups || mapping . groups ;
54+ mapping . permissions = newMapping . permissions || mapping . permissions ;
55+ } // end setUserMapping
56+
2057 defineGroup ( groupDef )
2158 {
2259 if ( ! groupDef . name )
@@ -30,44 +67,42 @@ class TPManager
3067 return group ;
3168 } // end defineGroup
3269
33- defineUser ( userDef )
70+ loadGroups ( groupsOrFunc )
3471 {
35- if ( ! userDef . name )
72+ var loadPromise = Promise . resolve ( groupsOrFunc ) ;
73+ if ( _ . isFunction ( groupsOrFunc ) )
3674 {
37- throw new Error ( "Must specify a 'name' property." ) ;
75+ loadPromise = groupsOrFunc ( ) ;
3876 } // end if
3977
40- var user = new TPUser ( userDef , this ) ;
41- this . users [ userDef . name ] = user ;
42-
43- return user ;
44- } // end defineUser
78+ // Build the groups
79+ return loadPromise . each ( ( groupDef ) =>
80+ {
81+ this . defineGroup ( groupDef ) ;
82+ } ) ;
83+ } // end loadGroups
4584
46- hasPerm ( userName , perm , obj )
85+ hasPerm ( user , perm , obj )
4786 {
48- var user = this . users [ userName ] ;
49- if ( user )
87+ var found = this . _userHasPerm ( user , perm , obj ) ;
88+ if ( ! found )
5089 {
51- return user . hasPerm ( perm , obj ) ;
90+ var groups = _ . map ( user [ mapping . groups ] , ( name ) => this . groups [ name ] ) ;
91+ found = _ . some ( groups , ( group ) => group . hasPerm ( perm , obj ) ) ;
5292 } // end if
5393
54- return false ;
94+ return found ;
5595 } // end hasPerm
5696
57- hasGroup ( userName , groupName )
97+ hasGroup ( user , groupName )
5898 {
59- var user = this . users [ userName ] ;
60- if ( user )
61- {
62- return user . hasGroup ( groupName ) ;
63- } // end if
64-
65- return false ;
99+ // Returns false for groups that haven't been loaded yet
100+ return ( groupName in this . groups ) && _ . includes ( user [ mapping . groups ] , groupName ) ;
66101 } // end hasGroup
67102} // end TPManager
68103
69104//----------------------------------------------------------------------------------------------------------------------
70105
71- export default new TPManager ( ) ;
106+ module . exports = new TPManager ( ) ;
72107
73108//----------------------------------------------------------------------------------------------------------------------
0 commit comments