@@ -259,25 +259,26 @@ def rates
259
259
# bank.get_rate("USD", "CAD") #=> 1.24515
260
260
# bank.get_rate("CAD", "USD") #=> 0.803115
261
261
def import_rates ( format , s , opts = { } )
262
- raise Money ::Bank ::UnknownRateFormat unless RATE_FORMATS . include? ( format )
263
-
264
- if format == :ruby
265
- warn '[WARNING] Using :ruby format when importing rates is potentially unsafe and ' \
266
- 'might lead to remote code execution via Marshal.load deserializer. Consider using ' \
267
- 'safe alternatives such as :json and :yaml.'
262
+ raise Money ::bank ::UnknownRateFormat unless RATE_FORMATS . include? ( format )
263
+
264
+ store . transaction do
265
+ data = case format
266
+ when :json
267
+ JSON . parse ( s )
268
+ when :yaml
269
+ YAML . safe_load ( s , permitted_classes : [ BigDecimal , Date , Time ] , aliases : true )
270
+ else
271
+ raise Money ::bank ::UnknownRateFormat , "Unknown format: #{ format } "
268
272
end
269
-
270
- store . transaction do
271
- data = FORMAT_SERIALIZERS [ format ] . load ( s )
272
-
273
- data . each do |key , rate |
274
- from , to = key . split ( SERIALIZER_SEPARATOR )
275
- store . add_rate from , to , rate
276
- end
273
+
274
+ data . each do |key , rate |
275
+ from , to = key . split ( SERIALIZER_SEPARATOR )
276
+ store . add_rate from , to , rate
277
277
end
278
-
279
- self
280
278
end
279
+
280
+ self
281
+ end
281
282
end
282
283
end
283
284
end
0 commit comments