em-instagram 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: