@@ -80,7 +80,7 @@ def create
8080 "createUser": "#{ @resource [ :username ] } ",
8181 "pwd": "#{ password_hash } ",
8282 "customData": {"createdBy": "Puppet Mongodb_user['#{ @resource [ :name ] } ']"},
83- "roles": #{ @resource [ :roles ] . to_json } ,
83+ "roles": #{ role_hashes ( @resource [ :roles ] , @resource [ :database ] ) . to_json } ,
8484 "digestPassword": false
8585 }
8686 EOS
@@ -152,14 +152,16 @@ def roles=(roles)
152152 if mongo_24?
153153 mongo_eval ( "db.system.users.update({user:'#{ @resource [ :username ] } '}, { $set: {roles: #{ @resource [ :roles ] . to_json } }})" )
154154 else
155- grant = roles - @property_hash [ :roles ]
155+ current_roles = role_strings ( roles , @resource [ :database ] )
156+ desired_roles = role_strings ( @property_hash [ :roles ] , @resource [ :database ] )
157+ grant = ( current_roles -desired_roles )
156158 unless grant . empty?
157- mongo_eval ( "db.getSiblingDB('#{ @resource [ :database ] } ').grantRolesToUser('#{ @resource [ :username ] } ', #{ grant . to_json } )" )
159+ mongo_eval ( "db.getSiblingDB('#{ @resource [ :database ] } ').grantRolesToUser('#{ @resource [ :username ] } ', #{ role_hashes ( grant , @resource [ :database ] ) . to_json } )" )
158160 end
159161
160- revoke = @property_hash [ :roles ] - roles
162+ revoke = ( desired_roles - current_roles )
161163 unless revoke . empty?
162- mongo_eval ( "db.getSiblingDB('#{ @resource [ :database ] } ').revokeRolesFromUser('#{ @resource [ :username ] } ', #{ revoke . to_json } )" )
164+ mongo_eval ( "db.getSiblingDB('#{ @resource [ :database ] } ').revokeRolesFromUser('#{ @resource [ :username ] } ', #{ role_hashes ( grant , @resource [ :database ] ) . to_json } )" )
163165 end
164166 end
165167 else
@@ -169,13 +171,48 @@ def roles=(roles)
169171
170172 private
171173
172- def self . from_roles ( roles , db )
174+ def self . role_strings ( roles , db )
173175 roles . map do |entry |
174- if entry [ 'db' ] == db
175- entry [ 'role' ]
176- else
177- "#{ entry [ 'role' ] } @#{ entry [ 'db' ] } "
176+ if entry . instance_of? Hash and entry . has_key? 'role'
177+ if entry [ 'db' ] == db
178+ entry [ 'role' ]
179+ else
180+ "#{ entry [ 'role' ] } @#{ entry [ 'db' ] } "
181+ end
182+ elsif entry . instance_of? String
183+ if entry . end_with? "@#{ db } "
184+ entry . gsub ( /^(.*)@.*$/ , '\1' )
185+ else
186+ entry
187+ end
178188 end
179189 end . sort
180190 end
191+
192+ def role_strings ( roles , db )
193+ self . class . role_strings ( roles , db )
194+ end
195+
196+ def role_hashes ( roles , db )
197+ roles . sort . map do |entry |
198+ if entry . instance_of? Hash and entry . has_key? 'role'
199+ if entry [ 'db' ] == db
200+ entry [ 'role' ]
201+ else
202+ entry
203+ end
204+ elsif entry . instance_of? String
205+ if entry . end_with? "@#{ db } "
206+ entry . gsub ( /^(.*)@.*$/ , '\1' )
207+ elsif entry . include? '@'
208+ {
209+ 'role' => entry . gsub ( /^(.*)@.*$/ , '\1' ) ,
210+ 'db' => entry . gsub ( /^.*@(.*)$/ , '\1' ) ,
211+ }
212+ else
213+ entry
214+ end
215+ end
216+ end
217+ end
181218end
0 commit comments