@@ -8,7 +8,7 @@ import { Crypt } from "./Crypt";
88import { Config } from "./Config" ;
99import { TokenUser } from "./TokenUser" ;
1010import { Ace } from "./Ace" ;
11- import { Role } from "./Role" ;
11+ import { Role , Rolemember } from "./Role" ;
1212import { UpdateOneMessage } from "./Messages/UpdateOneMessage" ;
1313import { UpdateManyMessage } from "./Messages/UpdateManyMessage" ;
1414import { InsertOrUpdateOneMessage } from "./Messages/InsertOrUpdateOneMessage" ;
@@ -81,21 +81,98 @@ export class DatabaseConnection {
8181 }
8282 return item ;
8383 }
84- async Cleanmembers < T extends Role > ( item : T ) : Promise < T > {
85- for ( var i = item . members . length - 1 ; i >= 0 ; i -- ) {
86- {
84+ async Cleanmembers < T extends Role > ( item : T , original : T ) : Promise < T > {
85+ var removed : Rolemember [ ] = [ ] ;
86+ if ( original != null && Config . update_acl_based_on_groups == true ) {
87+ for ( var i = original . members . length - 1 ; i >= 0 ; i -- ) {
8788 var ace = item . members [ i ] ;
8889 var exists = item . members . filter ( x => x . _id == ace . _id ) ;
89- if ( exists . length > 1 ) {
90- item . members . splice ( i , 1 ) ;
91- } else {
92- var arr = await this . db . collection ( "users" ) . find ( { _id : ace . _id } ) . project ( { name : 1 } ) . limit ( 1 ) . toArray ( ) ;
93- if ( arr . length == 0 ) {
90+ if ( exists . length == 0 ) {
91+ removed . push ( ace ) ;
92+ }
93+ }
94+ }
95+ var doadd : boolean = true ;
96+ var multi_tenant_skip : string [ ] = [ WellknownIds . users , WellknownIds . filestore_users ,
97+ WellknownIds . nodered_api_users , WellknownIds . nodered_users , WellknownIds . personal_nodered_users ,
98+ WellknownIds . robot_users , , WellknownIds . robots ] ;
99+ if ( item . _id == WellknownIds . users && Config . multi_tenant ) {
100+ doadd = false ;
101+ }
102+ if ( doadd ) {
103+ for ( var i = item . members . length - 1 ; i >= 0 ; i -- ) {
104+ {
105+ var ace = item . members [ i ] ;
106+ var exists = item . members . filter ( x => x . _id == ace . _id ) ;
107+ if ( exists . length > 1 ) {
94108 item . members . splice ( i , 1 ) ;
95- } else { ace . name = arr [ 0 ] . name ; }
109+ } else {
110+ var arr = await this . db . collection ( "users" ) . find ( { _id : ace . _id } ) . project ( { name : 1 , _acl : 1 , _type : 1 } ) . limit ( 1 ) . toArray ( ) ;
111+ if ( arr . length == 0 ) {
112+ item . members . splice ( i , 1 ) ;
113+ }
114+ else if ( Config . update_acl_based_on_groups == true ) {
115+ ace . name = arr [ 0 ] . name ;
116+ if ( Config . multi_tenant && multi_tenant_skip . indexOf ( item . _id ) > - 1 ) {
117+ // when multi tenant don't allow members of common user groups to see each other
118+ console . log ( "Running in multi tenant mode, skip adding permissions for " + item . name ) ;
119+ } else if ( arr [ 0 ] . _type == "user" ) {
120+ var u : User = User . assign ( arr [ 0 ] ) ;
121+ if ( u . getRight ( item . _id ) == null ) {
122+ console . log ( "Assigning " + item . name + " read permission to " + u . name ) ;
123+ u . addRight ( item . _id , item . name , [ Rights . read ] , false ) ;
124+ // await this.db.collection("users").save(u);
125+ } else if ( u . _id != item . _id ) {
126+ console . log ( item . name + " allready exists on " + u . name ) ;
127+ }
128+ } else if ( arr [ 0 ] . _type == "role" ) {
129+ var r : Role = Role . assign ( arr [ 0 ] ) ;
130+ if ( r . _id == WellknownIds . admins || r . _id == WellknownIds . users ) {
131+ }
132+ if ( r . getRight ( item . _id ) == null ) {
133+ console . log ( "Assigning " + item . name + " read permission to " + r . name ) ;
134+ r . addRight ( item . _id , item . name , [ Rights . read ] , false ) ;
135+ // await this.db.collection("users").save(r);
136+ } else if ( r . _id != item . _id ) {
137+ console . log ( item . name + " allready exists on " + r . name ) ;
138+ }
139+
140+ }
141+ }
142+ }
96143 }
97144 }
98145 }
146+
147+ for ( var i = removed . length - 1 ; i >= 0 ; i -- ) {
148+ var ace = removed [ i ] ;
149+ var arr = await this . db . collection ( "users" ) . find ( { _id : ace . _id } ) . project ( { name : 1 , _acl : 1 , _type : 1 } ) . limit ( 1 ) . toArray ( ) ;
150+ if ( arr . length == 1 && item . _id != WellknownIds . admins && item . _id != WellknownIds . root ) {
151+ if ( Config . multi_tenant && multi_tenant_skip . indexOf ( item . _id ) > - 1 ) {
152+ // when multi tenant don't allow members of common user groups to see each other
153+ console . log ( "Running in multi tenant mode, skip removing permissions for " + item . name ) ;
154+ } else if ( arr [ 0 ] . _type == "user" ) {
155+ var u : User = User . assign ( arr [ 0 ] ) ;
156+ if ( u . getRight ( item . _id ) != null ) {
157+ console . log ( "Removing " + item . name + " read permissions from " + u . name ) ;
158+ u . removeRight ( item . _id , [ Rights . read ] ) ;
159+ // await this.db.collection("users").save(u);
160+ } else {
161+ console . log ( "No need to remove " + item . name + " read permissions from " + u . name ) ;
162+ }
163+ } else if ( arr [ 0 ] . _type == "role" ) {
164+ var r : Role = Role . assign ( arr [ 0 ] ) ;
165+ if ( r . getRight ( item . _id ) != null ) {
166+ console . log ( "Removing " + item . name + " read permissions from " + r . name ) ;
167+ r . removeRight ( item . _id , [ Rights . read ] ) ;
168+ // await this.db.collection("users").save(r);
169+ } else {
170+ console . log ( "No need to remove " + item . name + " read permissions from " + u . name ) ;
171+ }
172+ }
173+
174+ }
175+ }
99176 return item ;
100177 }
101178
@@ -358,7 +435,7 @@ export class DatabaseConnection {
358435
359436 item = await this . CleanACL ( item ) ;
360437 if ( item . _type === "role" && collectionname === "users" ) {
361- item = await this . Cleanmembers ( item as any ) ;
438+ item = await this . Cleanmembers ( item as any , null ) ;
362439 }
363440
364441 // var options:CollectionInsertOneOptions = { writeConcern: { w: parseInt((w as any)), j: j } };
@@ -556,7 +633,7 @@ export class DatabaseConnection {
556633 ( q . item as any ) . metadata = await this . CleanACL ( ( q . item as any ) . metadata ) ;
557634 }
558635 if ( q . item . _type === "role" && q . collectionname === "users" ) {
559- q . item = await this . Cleanmembers ( q . item as any ) ;
636+ q . item = await this . Cleanmembers ( q . item as any , original ) ;
560637 }
561638
562639 if ( q . collectionname != "fs.files" ) {
@@ -867,6 +944,20 @@ export class DatabaseConnection {
867944 // this._logger.debug("[" + user.username + "] Skip isme in base query, not read (" + bits[0] + ")");
868945 // } else {
869946 // this._logger.debug("[" + user.username + "] Skip isme in base query, bits missing!");
947+ // }
948+ // if(bits.length==1 && (bits[0]+1) == Rights.read)
949+ // {
950+ // for (var i: number = 0; i < user.roles.length; i++) {
951+ // var role = user.roles[i];
952+ // if(role._id!=WellknownIds.admins && role._id!=WellknownIds.robots && role._id!=WellknownIds.nodered_users &&
953+ // role._id!=WellknownIds.nodered_admins && role._id!=WellknownIds.nodered_api_users && role._id!=WellknownIds.filestore_users &&
954+ // role._id!=WellknownIds.filestore_admins && role._id!=WellknownIds.robot_users && role._id!=WellknownIds.robot_admins
955+ // && role._id!=WellknownIds.personal_nodered_users)
956+ // {
957+
958+ // }
959+ // }
960+
870961 // }
871962 return { $or : finalor . concat ( ) } ;
872963 }
0 commit comments