doyoubuzz-showcase 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Gem Version](https://badge.fury.io/rb/doyoubuzz-showcase.svg)](http://badge.fury.io/rb/doyoubuzz-showcase) [![Build Status](https://api.travis-ci.org/mru2/doyoubuzz-showcase.svg)](https://travis-ci.org/mru2/doyoubuzz-showcase) [![Coverage Status](https://coveralls.io/repos/mru2/doyoubuzz-showcase/badge.png?branch=master)](https://coveralls.io/r/mru2/doyoubuzz-showcase?branch=master) [![Code Climate](https://codeclimate.com/github/mru2/doyoubuzz-showcase/badges/gpa.svg)](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:
|