doyoubuzz-showcase 0.0.2 → 0.1.0
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.
- checksums.yaml +4 -4
- data/.coveralls.yml +0 -0
- data/.travis.yml +8 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +6 -3
- data/README.md +3 -0
- data/doyoubuzz-showcase.gemspec +2 -2
- data/lib/doyoubuzz/showcase.rb +34 -18
- data/lib/doyoubuzz/showcase/error.rb +25 -0
- data/lib/doyoubuzz/showcase/version.rb +1 -1
- data/spec/showcase_spec.rb +41 -7
- data/spec/spec_helper.rb +3 -0
- metadata +24 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2aceb417792c107337b13ac22cfe4226fcddd93b
|
4
|
+
data.tar.gz: 6bbf214f97889a7439ed418b6e30d9761d54d426
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 464aee41aa33f7a9fcef0cae09e9864fcafcbbcd32efc6928ddebac83596474836b6d503920273a46611b34649b3b2f0d3c123f881ad08f5bd561b0cc7acb277
|
7
|
+
data.tar.gz: b2e5ef907ef149ac4dad612837edbd09be5196bad01aef7ef3b4db88eef96a17c7bb386926ab97a93d5b9c27b496a257db0dd2ad9aa9e3705cb46464982af1cd
|
data/.coveralls.yml
ADDED
File without changes
|
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
# Developpement dependencies
|
4
|
-
gem 'rspec', '~>
|
5
|
-
gem 'webmock', '~> 1.
|
6
|
-
gem 'vcr', '~> 2.
|
4
|
+
gem 'rspec', '~> 3.1'
|
5
|
+
gem 'webmock', '~> 1.20'
|
6
|
+
gem 'vcr', '~> 2.9'
|
7
|
+
|
8
|
+
# CI
|
9
|
+
gem 'coveralls', :require => false
|
7
10
|
|
8
11
|
# Specify the gem's dependencies in doyoubuzz-showcase.gemspec
|
9
12
|
gemspec
|
data/README.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
|
2
|
+
[](http://badge.fury.io/rb/doyoubuzz-showcase) [](https://travis-ci.org/mru2/doyoubuzz-showcase) [](https://coveralls.io/r/mru2/doyoubuzz-showcase?branch=master) [](https://codeclimate.com/github/mru2/doyoubuzz-showcase)
|
3
|
+
|
1
4
|
# Doyoubuzz::Showcase
|
2
5
|
|
3
6
|
## Description
|
data/doyoubuzz-showcase.gemspec
CHANGED
@@ -21,6 +21,6 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
|
24
|
-
spec.add_dependency "httparty", "~> 0.
|
25
|
-
spec.add_dependency "hashie", "
|
24
|
+
spec.add_dependency "httparty", "~> 0.13"
|
25
|
+
spec.add_dependency "hashie", ">= 2.1.2"
|
26
26
|
end
|
data/lib/doyoubuzz/showcase.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'httparty'
|
2
2
|
require 'hashie/mash'
|
3
3
|
|
4
|
+
require 'doyoubuzz/showcase/error'
|
5
|
+
|
4
6
|
module Doyoubuzz
|
5
7
|
class Showcase
|
6
8
|
|
@@ -20,6 +22,19 @@ module Doyoubuzz
|
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
25
|
+
# SSO redirection
|
26
|
+
def sso_redirect_url(application_name, timestamp, sso_key, user_attributes)
|
27
|
+
# Check mandatory attributes are given
|
28
|
+
missing_attributes = [:email, :external_id, :firstname, :lastname].reject{|key| user_attributes[key]}
|
29
|
+
|
30
|
+
if missing_attributes.length > 0
|
31
|
+
raise ArgumentError, "Missing mandatory attributes for SSO : #{missing_attributes.join(', ')}"
|
32
|
+
end
|
33
|
+
|
34
|
+
params = sign_sso_params(user_attributes.merge(timestamp: timestamp), sso_key)
|
35
|
+
|
36
|
+
"http://showcase.doyoubuzz.com/p/fr/#{application_name}/sso?#{URI.encode_www_form(params)}"
|
37
|
+
end
|
23
38
|
|
24
39
|
|
25
40
|
private
|
@@ -33,7 +48,7 @@ module Doyoubuzz
|
|
33
48
|
# Process the HTTParty response, checking for errors
|
34
49
|
def process_response(res)
|
35
50
|
if !res.success?
|
36
|
-
raise
|
51
|
+
raise Error.new(res.code, res.body)
|
37
52
|
end
|
38
53
|
|
39
54
|
if res.is_a? Hash
|
@@ -51,35 +66,36 @@ module Doyoubuzz
|
|
51
66
|
|
52
67
|
# GET, DELETE requests : the parameters are in the request query
|
53
68
|
if [:get, :delete].include? verb
|
54
|
-
return {:query =>
|
69
|
+
return {:query => sign_api_params(params.merge additional_parameters)}
|
55
70
|
|
56
71
|
# Otherwise, they are in the body
|
57
72
|
else
|
58
|
-
return {:body => params, :query =>
|
73
|
+
return {:body => params, :query => sign_api_params(additional_parameters)}
|
59
74
|
end
|
60
75
|
end
|
61
76
|
|
62
77
|
|
63
78
|
# The arguments processing and signing
|
64
|
-
def
|
65
|
-
params[:hash] = compute_signature(params)
|
66
|
-
params
|
67
|
-
end
|
68
|
-
|
69
|
-
# Computing the parameters signature hash
|
70
|
-
# Algorithm :
|
71
|
-
# - Order parameters by key
|
72
|
-
# - Concatenate their values
|
73
|
-
# - Append the current timestamp
|
74
|
-
# - Append the api secret
|
75
|
-
# - MD5 the resulting string
|
76
|
-
def compute_signature(params)
|
79
|
+
def sign_api_params(params)
|
77
80
|
ordered_params_values = params.sort.map{|k,v|v}
|
78
81
|
concatenated_params_string = ordered_params_values.join
|
79
|
-
concatenated_params_string <<
|
82
|
+
concatenated_params_string << secret_key
|
83
|
+
|
84
|
+
hash = Digest::MD5.hexdigest(concatenated_params_string)
|
85
|
+
params.merge(hash: hash)
|
86
|
+
end
|
80
87
|
|
81
|
-
|
88
|
+
# Different ordering
|
89
|
+
def sign_sso_params(params, sso_key)
|
90
|
+
# Custom ordering
|
91
|
+
tosign = params.values_at(:email, :firstname, :lastname, :external_id, :"group[]", :user_type, :timestamp).compact.join
|
92
|
+
tosign += sso_key
|
93
|
+
|
94
|
+
hash = Digest::MD5.hexdigest(tosign)
|
95
|
+
|
96
|
+
params.merge(hash: hash)
|
82
97
|
end
|
83
98
|
|
99
|
+
|
84
100
|
end
|
85
101
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Doyoubuzz
|
2
|
+
class Showcase
|
3
|
+
class Error < ::StandardError
|
4
|
+
attr_reader :status
|
5
|
+
|
6
|
+
def initialize(status, response_body)
|
7
|
+
# Try to extract a meaningful message from the error
|
8
|
+
message = begin
|
9
|
+
parsed_body = JSON.parse(response_body)
|
10
|
+
parsed_body['error']['message']
|
11
|
+
rescue => e
|
12
|
+
response_body
|
13
|
+
end
|
14
|
+
|
15
|
+
super(message)
|
16
|
+
@status = status
|
17
|
+
end
|
18
|
+
|
19
|
+
def inspect
|
20
|
+
"#<Doyoubuzz::Showcase::Error #{status}: #{message}>"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/spec/showcase_spec.rb
CHANGED
@@ -6,6 +6,7 @@ describe Doyoubuzz::Showcase do
|
|
6
6
|
|
7
7
|
let(:api_key){ 'an_api_key' }
|
8
8
|
let(:api_secret){ 'an_api_secret' }
|
9
|
+
let(:showcase){ Doyoubuzz::Showcase.new(api_key, api_secret) }
|
9
10
|
|
10
11
|
describe '#new' do
|
11
12
|
it 'should require an api key and secret key' do
|
@@ -16,29 +17,28 @@ describe Doyoubuzz::Showcase do
|
|
16
17
|
end
|
17
18
|
|
18
19
|
describe '#call' do
|
19
|
-
let(:showcase){ Doyoubuzz::Showcase.new(api_key, api_secret) }
|
20
20
|
let(:arguments){ {:foo => 'bar', :zab => 'baz'} }
|
21
21
|
let(:timestamp){ 1370534334 }
|
22
22
|
|
23
23
|
# The timestamp is important in the request generation and the VCR handling. Here it is set at a fixed date
|
24
24
|
before(:each) do
|
25
25
|
time = Time.at(timestamp)
|
26
|
-
Time.
|
26
|
+
allow(Time).to receive(:now).and_return time
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should compute a valid signature" do
|
30
|
-
Doyoubuzz::Showcase.new('IuQSDLKQLSDK344590Li987', 'IuJyt42BnUiOlPM8FvB67tG').send(:compute_signature, {:apikey => 'IuQSDLKQLSDK344590Li987', :timestamp => timestamp}).should == '1dd33466d71275d06c9e17e18235c9f0'
|
30
|
+
Doyoubuzz::Showcase.new('IuQSDLKQLSDK344590Li987', 'IuJyt42BnUiOlPM8FvB67tG').send(:compute_signature, {:apikey => 'IuQSDLKQLSDK344590Li987', :timestamp => timestamp}, 'IuJyt42BnUiOlPM8FvB67tG').should == '1dd33466d71275d06c9e17e18235c9f0'
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should generate a valid signed api call" do
|
34
|
-
showcase.
|
34
|
+
allow(showcase).to receive(:process_response) # We only want to check the sent parameters here
|
35
35
|
showcase.class.should_receive(:get).with("/path", {:query => {:foo => "bar", :zab => "baz", :apikey => "an_api_key", :timestamp => timestamp, :hash => "757b04a866f1d02f077471589341ff7a"}})
|
36
36
|
|
37
37
|
showcase.get('/path', arguments)
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should put the parameters in the body for PUT requests" do
|
41
|
-
showcase.
|
41
|
+
allow(showcase).to receive(:process_response) # We only want to check the sent parameters here
|
42
42
|
showcase.class.should_receive(:put).with("/path", {:query => {:apikey => "an_api_key", :timestamp => timestamp, :hash => "11a68a1bb9e23c681438efb714c9ad4d"}, :body => {:foo => "bar", :zab => "baz"}})
|
43
43
|
|
44
44
|
showcase.put('/path', arguments)
|
@@ -75,12 +75,46 @@ describe Doyoubuzz::Showcase do
|
|
75
75
|
it "should raise an exception on a failed call" do
|
76
76
|
VCR.use_cassette("failed_call") do
|
77
77
|
expect{ res = showcase.get('/users') }.to raise_error do |error|
|
78
|
-
error.should be_a(
|
79
|
-
error.
|
78
|
+
error.should be_a(Doyoubuzz::Showcase::Error)
|
79
|
+
error.status.should == 403
|
80
|
+
error.message.should == "Forbidden"
|
81
|
+
error.inspect.should == "#<Doyoubuzz::Showcase::Error 403: Forbidden>"
|
80
82
|
end
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
84
86
|
end
|
85
87
|
|
88
|
+
|
89
|
+
describe '#sso_redirect_url' do
|
90
|
+
|
91
|
+
let(:company_name){ 'my_company' }
|
92
|
+
let(:timestamp){ 1370534334 }
|
93
|
+
let(:user_attributes){
|
94
|
+
{
|
95
|
+
email: 'email@host.tld',
|
96
|
+
firstname: 'John',
|
97
|
+
lastname: 'Doe',
|
98
|
+
external_id: 12345
|
99
|
+
}
|
100
|
+
}
|
101
|
+
let(:sso_key){ 'vpsdihgfdso' }
|
102
|
+
|
103
|
+
it "should verify all the mandatory user attributes are given" do
|
104
|
+
|
105
|
+
user_attributes.keys.each do |mandatory_key|
|
106
|
+
|
107
|
+
incomplete_attributes = user_attributes.dup.tap{|attrs|attrs.delete mandatory_key}
|
108
|
+
expect { showcase.sso_redirect_url(company_name, timestamp, sso_key, incomplete_attributes) }.to raise_error ArgumentError, "Missing mandatory attributes for SSO : #{mandatory_key}"
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should compute the right url" do
|
115
|
+
showcase.sso_redirect_url(company_name, timestamp, sso_key, user_attributes).should == 'http://showcase.doyoubuzz.com/p/fr/my_company/sso?email=email%40host.tld&firstname=John&lastname=Doe&external_id=12345×tamp=1370534334&hash=d6bbfc7ead803a3578887d6429d60047'
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
86
120
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,71 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: doyoubuzz-showcase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David RUYER
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: httparty
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
47
|
+
version: '0.13'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
54
|
+
version: '0.13'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: hashie
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 2.1.2
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 2.1.2
|
69
69
|
description: Wrapper around the DoYouBuzz showcase API
|
70
70
|
email:
|
71
71
|
- david.ruyer@gmail.com
|
@@ -73,14 +73,18 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
- .
|
77
|
-
- .
|
76
|
+
- ".coveralls.yml"
|
77
|
+
- ".gitignore"
|
78
|
+
- ".rspec"
|
79
|
+
- ".travis.yml"
|
80
|
+
- CHANGELOG.md
|
78
81
|
- Gemfile
|
79
82
|
- LICENSE.txt
|
80
83
|
- README.md
|
81
84
|
- Rakefile
|
82
85
|
- doyoubuzz-showcase.gemspec
|
83
86
|
- lib/doyoubuzz/showcase.rb
|
87
|
+
- lib/doyoubuzz/showcase/error.rb
|
84
88
|
- lib/doyoubuzz/showcase/version.rb
|
85
89
|
- spec/fixtures/vcr_cassettes/failed_call.yml
|
86
90
|
- spec/fixtures/vcr_cassettes/good_call.yml
|
@@ -96,17 +100,17 @@ require_paths:
|
|
96
100
|
- lib
|
97
101
|
required_ruby_version: !ruby/object:Gem::Requirement
|
98
102
|
requirements:
|
99
|
-
- -
|
103
|
+
- - ">="
|
100
104
|
- !ruby/object:Gem::Version
|
101
105
|
version: '0'
|
102
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
107
|
requirements:
|
104
|
-
- -
|
108
|
+
- - ">="
|
105
109
|
- !ruby/object:Gem::Version
|
106
110
|
version: '0'
|
107
111
|
requirements: []
|
108
112
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
113
|
+
rubygems_version: 2.2.2
|
110
114
|
signing_key:
|
111
115
|
specification_version: 4
|
112
116
|
summary: Wrapper around the DoYouBuzz showcase API
|
@@ -115,3 +119,4 @@ test_files:
|
|
115
119
|
- spec/fixtures/vcr_cassettes/good_call.yml
|
116
120
|
- spec/showcase_spec.rb
|
117
121
|
- spec/spec_helper.rb
|
122
|
+
has_rdoc:
|