em-instagram 0.1.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ M2QyOTk3MTc1NjA0ODQ2MjljYzU2OWJhOTc2MjI5NGRkNTM1ZTkyMQ==
5
+ data.tar.gz: !binary |-
6
+ YmY5NDU1ODc3MzBlNGU5ZTA0ZWQ3MDA5YTUzMzllN2U5NDA0YTVlMA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MmYyMDY3MzFhNGRhY2NjYTYxNDFhNWNlMzdhYTAzNzM0MmYzM2E1MDI5Mzdl
10
+ ZjljYjYxM2E4NjcxZjkxMjM1Y2MxOWU4ZGE5Y2RhMDk2YzgyYTU0NDVmZDNi
11
+ MTAxMmU0NzJjYmMwYjA2MjY4NTQ1MDIxZGMxYzZhZjZlOTQ0OGU=
12
+ data.tar.gz: !binary |-
13
+ OWY3ODVlNThmZWJjMTNkZmJkN2I3ZDM4MmU5MmNmMjIxNWYxMjNmYjYwZDFi
14
+ NzQ1NjkyNWRhZTVhNzBjZWVmZjFlNGFmODA1NmJhOTgwNzNlNWFhMzBjMGI5
15
+ MjBhMzNmMTQyNjJhNTYxYmM3YmMyOGFlZjM3NDE5NmVkODRhN2Y=
@@ -10,11 +10,15 @@ module EventMachine
10
10
 
11
11
  protected
12
12
  def process_instagram_response(response)
13
- case response.response_header.status
14
- when 200
15
- succeed JSON.parse(response.response)['data']
16
- else
17
- fail JSON.parse(response.response)['meta']['error_message']
13
+ begin
14
+ case response.response_header.status
15
+ when 200
16
+ succeed JSON.parse(response.response)['data']
17
+ else
18
+ fail JSON.parse(response.response)['meta']['error_message']
19
+ end
20
+ rescue JSON::ParserError
21
+ fail "Invalid JSON returned: #{response.response}"
18
22
  end
19
23
  end
20
24
  end
@@ -22,9 +22,19 @@ module EventMachine
22
22
  response.status = 200
23
23
  response.content = params['hub.challenge']
24
24
  when 'POST'
25
- @updates.push(*JSON.load(@http_post_content))
26
- response.status = 202
27
- response.content = 'Accepted'
25
+ if valid_instagram_response?
26
+ begin
27
+ @updates.push(*JSON.load(@http_post_content))
28
+ response.status = 202
29
+ response.content = 'Accepted'
30
+ rescue JSON::ParserError
31
+ response.status = 400
32
+ response.content = "Invalid JSON"
33
+ end
34
+ else
35
+ response.status = 401
36
+ response.content = "Invalid Request"
37
+ end
28
38
  else
29
39
  response.status = 405
30
40
  response.content = 'Method Not Allowed'
@@ -34,7 +44,22 @@ module EventMachine
34
44
  end
35
45
 
36
46
  def process_update
37
- @updates.pop { |data| subscriber.receive_notification data; EventMachine::next_tick { process_update } }
47
+ @updates.pop { |data| self.subscriber.receive_notification data; EventMachine::next_tick { process_update } }
48
+ end
49
+
50
+ def valid_instagram_response?
51
+ return false if @http_headers.to_s.size == 0
52
+ sig_arr = @http_headers.split("\x00").select do |header|
53
+ header.include?("X-Hub-Signature".downcase)
54
+ end
55
+ sig = if sig_arr.size > 0
56
+ sig_arr.first.split(":").last.strip
57
+ else
58
+ nil
59
+ end
60
+ digest = OpenSSL::Digest::Digest.new('sha1')
61
+ verify_signature = OpenSSL::HMAC.hexdigest(digest, self.subscriber.client_secret, @http_post_content)
62
+ sig && sig == verify_signature
38
63
  end
39
64
 
40
65
  end
@@ -1,5 +1,5 @@
1
1
  module EventMachine
2
2
  class Instagram
3
- VERSION = '0.1.1'
3
+ VERSION = '0.1.3'
4
4
  end
5
5
  end
@@ -0,0 +1,38 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ describe EventMachine::Instagram::Request do
4
+
5
+ before :each do
6
+
7
+ end
8
+
9
+ it "should call the succeed callback passing the data as an argument with a valid request" do
10
+ body = "{\"data\":{\"mykey\":\"myvalue\"}}"
11
+ conn = double("connection")
12
+ conn.stub(:errback)
13
+ conn.stub(:callback)
14
+ response_header = double('rheader')
15
+ response_header.stub(:status => 200)
16
+ response = double('response')
17
+ response.stub(:response_header => response_header)
18
+ response.stub(:response => body)
19
+ req = EventMachine::Instagram::Request.new(conn)
20
+ req.should_receive(:succeed).with({"mykey" => "myvalue"})
21
+ req.send(:process_instagram_response, response)
22
+ end
23
+
24
+ it "should call the fail callback if it receives invalid JSON" do
25
+ body = "<html><body>There was an error</body></html>"
26
+ conn = double("connection")
27
+ conn.stub(:errback)
28
+ conn.stub(:callback)
29
+ response_header = double('rheader')
30
+ response_header.stub(:status => 500)
31
+ response = double('response')
32
+ response.stub(:response_header => response_header)
33
+ response.stub(:response => body)
34
+ req = EventMachine::Instagram::Request.new(conn)
35
+ req.should_receive(:fail).with("Invalid JSON returned")
36
+ req.send(:process_instagram_response, response)
37
+ end
38
+ end
@@ -49,6 +49,7 @@ describe EventMachine::Instagram::Server do
49
49
  @response.should_receive(:status=).with(202)
50
50
  @response.should_receive(:content=).with("Accepted")
51
51
  server = EventMachine::ServerStub.new
52
+ server.stub(:valid_instagram_response? => true)
52
53
  server.http_request_method = "POST"
53
54
  server.http_post_content = json.to_json
54
55
  server.updates = []
metadata CHANGED
@@ -1,20 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-instagram
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
5
- prerelease:
4
+ version: 0.1.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Joe Pym
9
8
  autorequire:
10
9
  bindir: bin
11
- cert_chain: []
10
+ cert_chain:
11
+ - !binary |-
12
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNakNDQWhxZ0F3SUJB
13
+ Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREEvTVJBd0RnWURWUVFEREFkcWIy
14
+ VXUKY0hsdE1SWXdGQVlLQ1pJbWlaUHlMR1FCR1JZR2JXOXpZV2xqTVJNd0VR
15
+ WUtDWkltaVpQeUxHUUJHUllEWTI5dApNQjRYRFRFek1ETXdOVEU0TVRrME5G
16
+ b1hEVEUwTURNd05URTRNVGswTkZvd1B6RVFNQTRHQTFVRUF3d0hhbTlsCkxu
17
+ QjViVEVXTUJRR0NnbVNKb21UOGl4a0FSa1dCbTF2YzJGcFl6RVRNQkVHQ2dt
18
+ U0pvbVQ4aXhrQVJrV0EyTnYKYlRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFB
19
+ RGdnRVBBRENDQVFvQ2dnRUJBUGFYbEVtd2JGY0czRnRLSGZOUApXdHpoZ2lJ
20
+ U0d0S1JnNkFubVdHNkFKcXNSZkNDaDBBUjhlUDRWMURBMFRWM29DRGJoamtp
21
+ Tjg0QXp0SUMzd1Q2ClpUMGdNWkwra2NwZUdVejFCT21rSmFjcC8zUE9jQUlr
22
+ VGp1dEFjTXg0N1B0WW5FSkpvd3FUYkJiYTZJYStLZEwKclVEZCtRQ2IzdS9i
23
+ MGZ4N3o5MmR2ZkZuRFdKY2lMdXlvY0dTT3pUMDBaNWRDSlV6WmNRZzA2eWFH
24
+ QlVCWlRlUAo4OTRoWXNTT2pwajJOdlpPNnBoVGlxaVZ0cm1hM0VPVVZuVDdL
25
+ cW5pZWt4QVV5Tk1BeUdhNzBRV243VURkRTNuCnpqb2xvV3NxTmI4bU85NTVj
26
+ cFdMbWFicTlEOS9XODhkYzNzUVZHK1FlcWNVTHpTTnNBSEt4MDhIZ1ZkdG03
27
+ a00KNkw4Q0F3RUFBYU01TURjd0NRWURWUjBUQkFJd0FEQWRCZ05WSFE0RUZn
28
+ UVVKbnZNNFdNcThPT3p5Q2hoSTYwTwpDdWtxQWtNd0N3WURWUjBQQkFRREFn
29
+ U3dNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFNalNNVk1uSVV2VVRFClJF
30
+ RFRYUjAyaGh3ancrb1Zzcks5Tk1YVkJZZDV5VzZ6d1RVa2l2KzI2aHllbk1S
31
+ dDdVQW85ZGF1WXlEQ2ZSVWcKTDkyK2J0NXZoYzkwRzVPeWREUUFPSCtFWnBH
32
+ Mkdlc1Fzcy9ya0ZvbTdlY3N6WWV3ZlZXSVhpeVRURWhTeXFyZQp3MGZBN1FZ
33
+ UmVVSHBlMEpiS1dmRW9CcG5QazRyL2tidHZobXZESklYdnM1TmZ6eVJyU25u
34
+ S29jRHI1T29RK2lPCldoa2ZabTFyOTgyWTRLWmg4eVI5aVp4QURQSjBVMDJn
35
+ cWkwT1ZqMjAvRCsvcjJxRkNqV2cwVjAzdTdGNDg2UkwKbkVBa3lXL3NaTjRX
36
+ Q29RbmpoeDF3MmYrd2FnVURBTzY4L0E1U0kxaUdyZVlRb3VvN1lRS0xNWC9p
37
+ WlFKYng2QwpzTERtRXdUcgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
12
38
  date: 2013-04-03 00:00:00.000000000 Z
13
39
  dependencies:
14
40
  - !ruby/object:Gem::Dependency
15
41
  name: eventmachine
16
42
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
43
  requirements:
19
44
  - - ! '>='
20
45
  - !ruby/object:Gem::Version
@@ -22,7 +47,6 @@ dependencies:
22
47
  type: :runtime
23
48
  prerelease: false
24
49
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
50
  requirements:
27
51
  - - ! '>='
28
52
  - !ruby/object:Gem::Version
@@ -30,7 +54,6 @@ dependencies:
30
54
  - !ruby/object:Gem::Dependency
31
55
  name: eventmachine_httpserver
32
56
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
57
  requirements:
35
58
  - - ! '>='
36
59
  - !ruby/object:Gem::Version
@@ -38,7 +61,6 @@ dependencies:
38
61
  type: :runtime
39
62
  prerelease: false
40
63
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
64
  requirements:
43
65
  - - ! '>='
44
66
  - !ruby/object:Gem::Version
@@ -46,7 +68,6 @@ dependencies:
46
68
  - !ruby/object:Gem::Dependency
47
69
  name: em-http-request
48
70
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
71
  requirements:
51
72
  - - ! '>='
52
73
  - !ruby/object:Gem::Version
@@ -54,7 +75,6 @@ dependencies:
54
75
  type: :runtime
55
76
  prerelease: false
56
77
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
78
  requirements:
59
79
  - - ! '>='
60
80
  - !ruby/object:Gem::Version
@@ -62,7 +82,6 @@ dependencies:
62
82
  - !ruby/object:Gem::Dependency
63
83
  name: rspec
64
84
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
85
  requirements:
67
86
  - - ~>
68
87
  - !ruby/object:Gem::Version
@@ -70,7 +89,6 @@ dependencies:
70
89
  type: :development
71
90
  prerelease: false
72
91
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
92
  requirements:
75
93
  - - ~>
76
94
  - !ruby/object:Gem::Version
@@ -97,36 +115,37 @@ files:
97
115
  - spec/api/media_spec.rb
98
116
  - spec/api/subscriptions_spec.rb
99
117
  - spec/em-instagram_spec.rb
118
+ - spec/request_spec.rb
100
119
  - spec/server_spec.rb
101
120
  - spec/spec_helper.rb
102
121
  homepage: ''
103
122
  licenses: []
123
+ metadata: {}
104
124
  post_install_message:
105
125
  rdoc_options: []
106
126
  require_paths:
107
127
  - lib
108
128
  required_ruby_version: !ruby/object:Gem::Requirement
109
- none: false
110
129
  requirements:
111
130
  - - ! '>='
112
131
  - !ruby/object:Gem::Version
113
132
  version: '0'
114
133
  required_rubygems_version: !ruby/object:Gem::Requirement
115
- none: false
116
134
  requirements:
117
135
  - - ! '>='
118
136
  - !ruby/object:Gem::Version
119
137
  version: 1.3.4
120
138
  requirements: []
121
139
  rubyforge_project:
122
- rubygems_version: 1.8.23
140
+ rubygems_version: 2.0.3
123
141
  signing_key:
124
- specification_version: 3
142
+ specification_version: 4
125
143
  summary: ''
126
144
  test_files:
127
145
  - spec/api/media_spec.rb
128
146
  - spec/api/subscriptions_spec.rb
129
147
  - spec/em-instagram_spec.rb
148
+ - spec/request_spec.rb
130
149
  - spec/server_spec.rb
131
150
  - spec/spec_helper.rb
132
151
  has_rdoc: