@@ -80,7 +80,7 @@ def create
80
80
"createUser": "#{ @resource [ :username ] } ",
81
81
"pwd": "#{ password_hash } ",
82
82
"customData": {"createdBy": "Puppet Mongodb_user['#{ @resource [ :name ] } ']"},
83
- "roles": #{ @resource [ :roles ] . to_json } ,
83
+ "roles": #{ role_hashes ( @resource [ :roles ] , @resource [ :database ] ) . to_json } ,
84
84
"digestPassword": false
85
85
}
86
86
EOS
@@ -152,14 +152,16 @@ def roles=(roles)
152
152
if mongo_24?
153
153
mongo_eval ( "db.system.users.update({user:'#{ @resource [ :username ] } '}, { $set: {roles: #{ @resource [ :roles ] . to_json } }})" )
154
154
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 )
156
158
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 } )" )
158
160
end
159
161
160
- revoke = @property_hash [ :roles ] - roles
162
+ revoke = ( desired_roles - current_roles )
161
163
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 } )" )
163
165
end
164
166
end
165
167
else
@@ -169,13 +171,48 @@ def roles=(roles)
169
171
170
172
private
171
173
172
- def self . from_roles ( roles , db )
174
+ def self . role_strings ( roles , db )
173
175
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
178
188
end
179
189
end . sort
180
190
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
181
218
end
0 commit comments