aptible-auth 0.11.8 → 0.11.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 520acb00965a2fa94b34f7a9b50b1748c63448f7
4
- data.tar.gz: 9b277167812d2a3224f5dd51c4ab61e687d814cf
3
+ metadata.gz: 981b35248a15b30129e3bd155aae3ef7cedc59ac
4
+ data.tar.gz: ae3b8a9e77e095f0c71a1d923629ee65af15c4bc
5
5
  SHA512:
6
- metadata.gz: 3f369a8ffa25f60c40ac9c1a6b9515ad50630a5b170c42504107d08c2631f7dce8603a0ead649636435fe735bc4793b77d99c585229e15d54f3387cf0fb32687
7
- data.tar.gz: 00dfd3edec0ea8318ace8c803a137f96de6b9503648cb78d62c4a93b9330a4e88e7cd872ac105820c5420a736322c768ea32ff484c34c07f2857e391731a8cec
6
+ metadata.gz: 83312c36af6756eaa8599516ad25cdfbf96d61d64829609b31de3e63fea97a8ea24595a38529d807d75ba46e04341f82b8b3e9d46c796b4493110c3db336e9fa
7
+ data.tar.gz: 8e152096f8680ef4a670bd10138f3061a68385c147c5769f7039f804b663a94131451a33d0c68c11300c7ee57e3245c6882af71da1e22b5fc7b103b841134b9f
@@ -1,4 +1,7 @@
1
1
  sudo: false
2
+ language: ruby
2
3
  rvm:
3
4
  - 2.0.0
4
- - jruby
5
+ - 2.1.0
6
+ - 2.2.0
7
+ - jruby-9.0.5.0
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ['lib']
21
21
 
22
22
  spec.add_dependency 'aptible-billing'
23
+ spec.add_dependency 'activesupport', '~> 4.0'
23
24
  spec.add_dependency 'aptible-resource', '>= 0.3.1'
24
25
  spec.add_dependency 'stripe', '>= 1.13.0'
25
26
  spec.add_dependency 'gem_config'
@@ -31,4 +32,5 @@ Gem::Specification.new do |spec|
31
32
  spec.add_development_dependency 'rspec', '~> 2.0'
32
33
  spec.add_development_dependency 'rspec-its'
33
34
  spec.add_development_dependency 'pry'
35
+ spec.add_development_dependency 'timecop', '~> 0.8.1'
34
36
  end
@@ -7,7 +7,7 @@ module Aptible
7
7
 
8
8
  field :id
9
9
  field :name
10
- field :privileged, type: Aptible::Resource::Boolean
10
+ field :type
11
11
  field :created_at, type: Time
12
12
  field :updated_at, type: Time
13
13
 
@@ -47,6 +47,11 @@ module Aptible
47
47
 
48
48
  def authenticate_client(id, secret, subject, options = {})
49
49
  options[:scope] ||= 'manage'
50
+ # Unlike other methods, the assertion token grant requirs an "exp"
51
+ # parameter rather than expires_in, but since we'd like to expose a
52
+ # consistent API to consumers, we override it here
53
+ expires_in = options.delete(:expires_in)
54
+ options[:exp] = Time.now.utc.to_i + expires_in if expires_in
50
55
  oauth_token = oauth.assertion.get_token({
51
56
  iss: id,
52
57
  sub: subject
@@ -68,7 +73,8 @@ module Aptible
68
73
  options[:scope] ||= 'manage'
69
74
  oauth_token = oauth.token_exchange.get_token(
70
75
  actor_token, 'urn:ietf:params:oauth:token-type:jwt',
71
- subject_token, subject_token_type, options)
76
+ subject_token, subject_token_type, options
77
+ )
72
78
  apply_oauth_response(oauth_token)
73
79
  end
74
80
 
@@ -93,7 +99,9 @@ module Aptible
93
99
  elsif (email = options.delete(:user_email))
94
100
  authenticate_impersonate(email, 'aptible:user:email', options)
95
101
  else
102
+ # rubocop:disable Style/SignalException
96
103
  fail 'Unrecognized options'
104
+ # rubocop:enable Style/SignalException
97
105
  end
98
106
  end
99
107
 
@@ -137,7 +145,7 @@ module Aptible
137
145
  end
138
146
 
139
147
  def parse_private_key(string)
140
- if string =~ /\A-----/
148
+ if string.start_with?('-----')
141
149
  OpenSSL::PKey::RSA.new(string)
142
150
  else
143
151
  formatted_string = <<-PRIVATE_KEY.gsub(/^\s+/, '')
@@ -12,73 +12,14 @@ module Aptible
12
12
  field :created_at, type: Time
13
13
  field :updated_at, type: Time
14
14
 
15
- # rubocop:disable MethodLength
16
- def set_organization_roles(organization, roles)
17
- self.roles.each do |role|
18
- next unless role.organization.id == organization.id
19
- next if roles.map(&:id).include? role.id
20
-
21
- role_membership = role.memberships.find do |membership|
22
- membership.user.id == id
23
- end
24
-
25
- role_membership.destroy
26
- end
27
-
28
- add_to_roles(roles)
29
- end
30
- # rubocop:enable MethodLength
31
-
32
15
  def organizations
33
16
  roles.map(&:organization).uniq(&:id)
34
17
  end
35
18
 
36
- def organization_roles(organization)
37
- roles.select do |role|
38
- role.links['organization'].href == organization.href
39
- end
40
- end
41
-
42
- def organization_privileged_roles(organization)
43
- privileged_roles.select do |role|
44
- role.links['organization'].href == organization.href
45
- end
46
- end
47
-
48
19
  def operations
49
20
  # TODO: Implement query params for /operations
50
21
  []
51
22
  end
52
-
53
- def privileged_organizations
54
- privileged_roles.map(&:organization)
55
- end
56
-
57
- def privileged_roles
58
- @privileged_roles ||= roles.select(&:privileged?)
59
- end
60
-
61
- # rubocop:disable PredicateName
62
- def is_billing_contact?(organization)
63
- organization.billing_contact_id && organization.billing_contact_id == id
64
- end
65
-
66
- def has_role?(role)
67
- roles.select { |user_role| role.id == user_role.id }.count > 0
68
- end
69
- # rubocop:enable PredicateName
70
-
71
- def can_manage?(organization)
72
- privileged_organizations.map(&:id).include? organization.id
73
- end
74
-
75
- def add_to_roles(roles)
76
- roles.each { |role| add_to_role(role) }
77
- end
78
-
79
- def add_to_role(role)
80
- role.create_membership(user: self, token: token) unless has_role? role
81
- end
82
23
  end
83
24
  end
84
25
  end
@@ -1,5 +1,5 @@
1
1
  module Aptible
2
2
  module Auth
3
- VERSION = '0.11.8'
3
+ VERSION = '0.11.10'.freeze
4
4
  end
5
5
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Aptible::Auth::Organization do
4
4
  describe '#can_manage_compliance?' do
5
- before { subject.stub(:billing_detail) { billing_detail } }
5
+ before { subject.stub(:billing_detail) { billing_detail } }
6
6
 
7
7
  context 'without a billing detail' do
8
8
  let(:billing_detail) { nil }
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Aptible::Auth::Resource do
4
- its(:namespace) { should eq 'Aptible::Auth' }
4
+ its(:namespace) { should eq 'Aptible::Auth' }
5
5
  its(:root_url) { should eq 'https://auth.aptible.com' }
6
6
 
7
7
  describe '#bearer_token' do
@@ -112,6 +112,20 @@ describe Aptible::Auth::Token do
112
112
  subject.authenticate_client(*args)
113
113
  end
114
114
 
115
+ it 'should replace expires_in in exp' do
116
+ args << { expires_in: 1800 }
117
+ Timecop.freeze do
118
+ expect(oauth.assertion).to receive(:get_token).with(
119
+ iss: 'id',
120
+ sub: 'user@example.com',
121
+ exp: Time.now.to_i + 1800,
122
+ algorithm: 'foobar',
123
+ scope: 'manage'
124
+ )
125
+ subject.authenticate_client(*args)
126
+ end
127
+ end
128
+
115
129
  it 'should set the access_token' do
116
130
  subject.authenticate_client(*args)
117
131
  expect(subject.access_token).to eq 'access_token'
@@ -158,7 +172,7 @@ describe Aptible::Auth::Token do
158
172
  end
159
173
 
160
174
  it 'should return a correct :private_key for Base64-only keys' do
161
- stripped_key = private_key_string.gsub(/^-.*-$/, '').gsub("\n", '')
175
+ stripped_key = private_key_string.gsub(/^-.*-$/, '').delete("\n")
162
176
  params = subject.call(stripped_key)
163
177
  expect(params[:private_key]).to be_a OpenSSL::PKey::RSA
164
178
  end
@@ -1,35 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Aptible::Auth::User do
4
- describe '#can_manage?' do
5
- let(:developer) { double 'Aptible::Auth::Role' }
6
- let(:owner) { double 'Aptible::Auth::Role' }
7
- let(:org) { double 'Aptible::Auth::Organization' }
8
-
9
- before do
10
- org.stub(:id) { 1 }
11
- developer.stub(:organization) { org }
12
- allow(developer).to receive(:privileged?).and_return(false)
13
- owner.stub(:organization) { org }
14
- allow(owner).to receive(:privileged?).and_return(true)
15
- end
16
-
17
- it 'should return false if not member of org privileged role' do
18
- subject.stub(:roles) { [developer] }
19
- expect(subject.can_manage?(org)).to eq false
20
- end
21
-
22
- it 'should return true if member of org privileged role' do
23
- subject.stub(:roles) { [developer, owner] }
24
- expect(subject.can_manage?(org)).to eq true
25
- end
26
-
27
- it 'should return false if member of no roles' do
28
- subject.stub(:roles) { [] }
29
- expect(subject.can_manage?(org)).to eq false
30
- end
31
- end
32
-
33
4
  describe '#organizations' do
34
5
  let(:so) { double 'Aptible::Auth::Role' }
35
6
  let(:owner) { double 'Aptible::Auth::Role' }
@@ -51,89 +22,4 @@ describe Aptible::Auth::User do
51
22
  expect(subject.organizations.count).to eq 1
52
23
  end
53
24
  end
54
-
55
- describe '#roles' do
56
- let(:so) { double 'Aptible::Auth::Role' }
57
- let(:owner) { double 'Aptible::Auth::Role' }
58
-
59
- before do
60
- so.stub(:id) { 1 }
61
- owner.stub(:id) { 2 }
62
- end
63
-
64
- it 'should have role' do
65
- subject.stub(:roles) { [so] }
66
- expect(subject.has_role?(so)).to eq true
67
- expect(subject.has_role?(owner)).to eq false
68
- end
69
- end
70
-
71
- describe '#set_organization_roles' do
72
- let(:so) { double 'Aptible::Auth::Role' }
73
- let(:owner) { double 'Aptible::Auth::Role' }
74
- let(:org) { double 'Aptible::Auth::Organization' }
75
- let(:owner_membership) { double 'Aptible::Auth::Membership' }
76
- let(:so_membership) { double 'Aptible::Auth::Membership' }
77
-
78
- before do
79
- org.stub(:id) { 1 }
80
-
81
- so.stub(:organization) { org }
82
- so.stub(:id) { 1 }
83
-
84
- owner.stub(:organization) { org }
85
- owner.stub(:id) { 2 }
86
-
87
- allow(Aptible::Auth::Role).to receive(:find)
88
- .with(1, token: 'token').and_return(so)
89
- allow(Aptible::Auth::Role).to receive(:find)
90
- .with(2, token: 'token').and_return(owner)
91
- end
92
-
93
- it 'should overwrite existing memberships' do
94
- subject.stub(:roles) { [so] }
95
- subject.stub(:token) { 'token' }
96
- subject.stub(:headers) { {} }
97
- so_membership.stub(:user) { subject }
98
- so_membership.stub(:role) { so }
99
- so.stub(:memberships) { [so_membership] }
100
- owner.stub(:memberships) { [] }
101
-
102
- expect(so_membership).to receive(:destroy)
103
- expect(owner).to receive(:create_membership)
104
- .with(user: subject, token: 'token')
105
-
106
- subject.set_organization_roles(org, [owner])
107
- end
108
-
109
- it 'should create new memberships' do
110
- subject.stub(:roles) { [] }
111
- subject.stub(:token) { 'token' }
112
- subject.stub(:headers) { {} }
113
- so.stub(:memberships) { [] }
114
- owner.stub(:memberships) { [] }
115
-
116
- expect(so).to receive(:create_membership)
117
- .with(user: subject, token: 'token')
118
- expect(owner).to receive(:create_membership)
119
- .with(user: subject, token: 'token')
120
-
121
- subject.set_organization_roles(org, [so, owner])
122
- end
123
-
124
- it 'should delete all existing memberships' do
125
- subject.stub(:roles) { [so, owner] }
126
- so.stub(:memberships) { [so_membership] }
127
- owner.stub(:memberships) { [owner_membership] }
128
- so_membership.stub(:user) { subject }
129
- so_membership.stub(:role) { so }
130
- owner_membership.stub(:user) { subject }
131
- owner_membership.stub(:role) { owner }
132
-
133
- expect(so_membership).to receive(:destroy)
134
- expect(owner_membership).to receive(:destroy)
135
-
136
- subject.set_organization_roles(org, [])
137
- end
138
- end
139
25
  end
@@ -1,6 +1,8 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
3
 
4
+ Bundler.require :development
5
+
4
6
  # Load shared spec files
5
7
  Dir["#{File.dirname(__FILE__)}/shared/**/*.rb"].each do |file|
6
8
  require file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aptible-auth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.8
4
+ version: 0.11.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Frank Macreery
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-21 00:00:00.000000000 Z
11
+ date: 2016-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aptible-billing
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: aptible-resource
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +178,20 @@ dependencies:
164
178
  - - ">="
165
179
  - !ruby/object:Gem::Version
166
180
  version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: timecop
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 0.8.1
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: 0.8.1
167
195
  description: Ruby client for auth.aptible.com
168
196
  email:
169
197
  - frank@macreery.com