rjr 0.16.3 → 0.16.4

Sign up to get free protection for your applications and to get access to all the features.
data/lib/rjr/common.rb CHANGED
@@ -5,6 +5,7 @@
5
5
  # Copyright (C) 2011-2013 Mohammed Morsi <mo@morsi.org>
6
6
  # Licensed under the Apache License, Version 2.0
7
7
  require 'logger'
8
+ require 'json'
8
9
 
9
10
  # Return a random uuid
10
11
  def gen_uuid
@@ -164,3 +165,63 @@ class Object
164
165
  end
165
166
  end
166
167
  end
168
+
169
+ # Two stage json parsing required, for more details
170
+ # see json issue https://github.com/flori/json/issues/179
171
+
172
+ # FIXME this will only work for json >= 1.7.6 where
173
+ # create_additions is defined
174
+
175
+ class Class
176
+ class << self
177
+ attr_accessor :whitelist_json_classes
178
+ attr_accessor :permitted_json_classes
179
+ end
180
+
181
+ def permit_json_create
182
+ Class.whitelist_json_classes = true
183
+ Class.permitted_json_classes ||= []
184
+ unless Class.permitted_json_classes.include?(self.name)
185
+ Class.permitted_json_classes << self.name
186
+ end
187
+ end
188
+ end
189
+
190
+ module RJR
191
+ def self.validate_json_class(jc)
192
+ Class.whitelist_json_classes ||= false
193
+
194
+ Class.whitelist_json_classes ?
195
+ # only permit classes user explicitly authorizes
196
+ !Class.permitted_json_classes.include?(jc) :
197
+
198
+ # allow any class
199
+ jc.to_s.split(/::/).inject(Object) do |p,c|
200
+ case
201
+ when c.empty? then p
202
+ when p.constants.collect { |c| c.to_s }.include?(c)
203
+ then p.const_get(c)
204
+ else
205
+ nil
206
+ end
207
+ end.nil?
208
+ end
209
+
210
+ def self.validate_json_hash(jh)
211
+ jh.each { |k,v|
212
+ if k == ::JSON.create_id &&
213
+ validate_json_class(v)
214
+ raise ArgumentError, "can't create json class #{v}"
215
+ elsif v.is_a?(Hash)
216
+ validate_json_hash(v)
217
+ end
218
+ }
219
+ end
220
+
221
+ def self.parse_json(js)
222
+ jp = ::JSON.parse js, :create_additions => false
223
+ return jp unless jp.is_a?(Hash)
224
+ validate_json_hash(jp)
225
+ ::JSON.parse js, :create_additions => true
226
+ end
227
+ end
data/lib/rjr/message.rb CHANGED
@@ -5,10 +5,6 @@
5
5
  # Copyright (C) 2012-2013 Mohammed Morsi <mo@morsi.org>
6
6
  # Licensed under the Apache License, Version 2.0
7
7
 
8
- # FIXME https://github.com/flori/json/issues/179
9
- # if pull request doesn't get accepted implement
10
- # one of the workarounds in rjr
11
-
12
8
  require 'json'
13
9
  require 'rjr/common'
14
10
 
@@ -48,7 +44,7 @@ class RequestMessage
48
44
  if args.has_key?(:message)
49
45
  begin
50
46
  @json_message = args[:message]
51
- request = JSON.parse(@json_message)
47
+ request = RJR.parse_json(@json_message)
52
48
  @jr_method = request['method']
53
49
  @jr_args = request['params']
54
50
  @msg_id = request['id']
@@ -79,7 +75,7 @@ class RequestMessage
79
75
  def self.is_request_message?(message)
80
76
  begin
81
77
  # FIXME log error
82
- parsed = JSON.parse(message)
78
+ parsed = RJR.parse_json(message)
83
79
  parsed.has_key?('method') && parsed.has_key?('id')
84
80
  rescue Exception => e
85
81
  false
@@ -129,7 +125,7 @@ class ResponseMessage
129
125
  def initialize(args = {})
130
126
  if args.has_key?(:message)
131
127
  @json_message = args[:message]
132
- response = JSON.parse(@json_message)
128
+ response = RJR.parse_json(@json_message)
133
129
  @msg_id = response['id']
134
130
  @result = Result.new
135
131
  @result.success = response.has_key?('result')
@@ -168,7 +164,7 @@ class ResponseMessage
168
164
  # @return [true,false] indicating if message is response message
169
165
  def self.is_response_message?(message)
170
166
  begin
171
- json = JSON.parse(message)
167
+ json = RJR.parse_json(message)
172
168
  json.has_key?('result') || json.has_key?('error')
173
169
  rescue Exception => e
174
170
  # FIXME log error
@@ -232,7 +228,7 @@ class NotificationMessage
232
228
  if args.has_key?(:message)
233
229
  begin
234
230
  @json_message = args[:message]
235
- notification = JSON.parse(@json_message)
231
+ notification = RJR.parse_json(@json_message)
236
232
  @jr_method = notification['method']
237
233
  @jr_args = notification['params']
238
234
  @headers = args.has_key?(:headers) ? {}.merge!(args[:headers]) : {}
@@ -262,7 +258,7 @@ class NotificationMessage
262
258
  def self.is_notification_message?(message)
263
259
  begin
264
260
  # FIXME log error
265
- parsed = JSON.parse(message)
261
+ parsed = RJR.parse_json(message)
266
262
  parsed.has_key?('method') && !parsed.has_key?('id')
267
263
  rescue Exception => e
268
264
  false
@@ -80,7 +80,7 @@ module RJR
80
80
 
81
81
  it "should be convertable from json" do
82
82
  j = '{"json_class":"RJR::Request","data":{"request":{"rjr_method":"foobar","rjr_method_args":["a","b"],"rjr_headers":{"foo":"bar"},"rjr_node_type":"local","rjr_node_id":"loc1"},"result":{"result":42,"error_code":null,"error_msg":null,"error_class":null}}}'
83
- r = JSON.parse(j)
83
+ r = JSON.parse(j, :create_additions => true)
84
84
 
85
85
  r.class.should == RJR::Request
86
86
  r.rjr_method.should == 'foobar'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rjr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.3
4
+ version: 0.16.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -48,17 +48,17 @@ dependencies:
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
51
- - - <=
51
+ - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
- version: 1.7.5
53
+ version: 1.7.6
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  none: false
58
58
  requirements:
59
- - - <=
59
+ - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.7.5
61
+ version: 1.7.6
62
62
  description: Ruby Json Rpc library
63
63
  email: mo@morsi.org
64
64
  executables: