aptible-auth 0.11.8 → 0.11.10

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 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