conjur-api 4.3.0 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/conjur-api/version.rb +1 -1
- data/lib/conjur/api.rb +1 -0
- data/lib/conjur/api/deputies.rb +33 -0
- data/lib/conjur/api/resources.rb +10 -0
- data/lib/conjur/audit-api.rb +1 -10
- data/lib/conjur/authn-api.rb +1 -10
- data/lib/conjur/authz-api.rb +1 -10
- data/lib/conjur/configuration.rb +166 -0
- data/lib/conjur/core-api.rb +5 -13
- data/lib/conjur/deputy.rb +38 -0
- data/lib/conjur/env.rb +4 -9
- data/lib/conjur/host.rb +1 -16
- data/lib/conjur/resource.rb +20 -1
- data/spec/api/resources_spec.rb +21 -0
- data/spec/lib/api_spec.rb +23 -23
- data/spec/lib/configuration_spec.rb +85 -0
- data/spec/lib/deputy_spec.rb +12 -0
- data/spec/lib/host_spec.rb +0 -4
- data/spec/lib/resource_spec.rb +33 -0
- metadata +10 -3
data/lib/conjur-api/version.rb
CHANGED
data/lib/conjur/api.rb
CHANGED
@@ -18,6 +18,7 @@
|
|
18
18
|
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
19
19
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
20
|
#
|
21
|
+
require 'conjur/configuration'
|
21
22
|
require 'conjur/env'
|
22
23
|
require 'conjur/base'
|
23
24
|
require 'conjur/build_from_response'
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2013 Conjur Inc
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
5
|
+
# this software and associated documentation files (the "Software"), to deal in
|
6
|
+
# the Software without restriction, including without limitation the rights to
|
7
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
8
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
9
|
+
# subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in all
|
12
|
+
# copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
16
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
17
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
18
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
19
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
#
|
21
|
+
require 'conjur/deputy'
|
22
|
+
|
23
|
+
module Conjur
|
24
|
+
class API
|
25
|
+
def create_deputy options
|
26
|
+
standard_create Conjur::Core::API.host, :deputy, nil, options
|
27
|
+
end
|
28
|
+
|
29
|
+
def deputy id
|
30
|
+
standard_show Conjur::Core::API.host, :deputy, id
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/conjur/api/resources.rb
CHANGED
@@ -34,5 +34,15 @@ module Conjur
|
|
34
34
|
path = [ paths[0], 'resources', paths[1], paths[2..-1].join(':') ].flatten.join('/')
|
35
35
|
Resource.new(Conjur::Authz::API.host, credentials)[path]
|
36
36
|
end
|
37
|
+
|
38
|
+
# Return all visible resources.
|
39
|
+
# In opts you should pass an account to filter by, and optionally a kind.
|
40
|
+
def resources opts = {}
|
41
|
+
Resource.all({ host: Conjur::Authz::API.host, credentials: credentials }.merge opts).map do |result|
|
42
|
+
resource(result['id']).tap do |r|
|
43
|
+
r.attributes = result
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
37
47
|
end
|
38
48
|
end
|
data/lib/conjur/audit-api.rb
CHANGED
@@ -24,16 +24,7 @@ module Conjur
|
|
24
24
|
class API < Conjur::API
|
25
25
|
class << self
|
26
26
|
def host
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
def default_host
|
31
|
-
case Conjur.env
|
32
|
-
when 'test', 'development'
|
33
|
-
"http://localhost:#{Conjur.service_base_port + 300}"
|
34
|
-
else
|
35
|
-
"https://audit-#{Conjur.stack}-conjur.herokuapp.com"
|
36
|
-
end
|
27
|
+
Conjur.configuration.audit_url
|
37
28
|
end
|
38
29
|
end
|
39
30
|
end
|
data/lib/conjur/authn-api.rb
CHANGED
@@ -23,16 +23,7 @@ module Conjur
|
|
23
23
|
class API < Conjur::API
|
24
24
|
class << self
|
25
25
|
def host
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
def default_host
|
30
|
-
case Conjur.env
|
31
|
-
when 'test', 'development'
|
32
|
-
"http://localhost:#{Conjur.service_base_port}"
|
33
|
-
else
|
34
|
-
"https://authn-#{Conjur.account}-conjur.herokuapp.com"
|
35
|
-
end
|
26
|
+
Conjur.configuration.authn_url
|
36
27
|
end
|
37
28
|
end
|
38
29
|
end
|
data/lib/conjur/authz-api.rb
CHANGED
@@ -23,16 +23,7 @@ module Conjur
|
|
23
23
|
class API < Conjur::API
|
24
24
|
class << self
|
25
25
|
def host
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
def default_host
|
30
|
-
case Conjur.env
|
31
|
-
when 'test', 'development'
|
32
|
-
"http://localhost:#{Conjur.service_base_port + 100}"
|
33
|
-
else
|
34
|
-
"https://authz-#{Conjur.stack}-conjur.herokuapp.com"
|
35
|
-
end
|
26
|
+
Conjur.configuration.authz_url
|
36
27
|
end
|
37
28
|
end
|
38
29
|
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2013 Conjur Inc
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
5
|
+
# this software and associated documentation files (the "Software"), to deal in
|
6
|
+
# the Software without restriction, including without limitation the rights to
|
7
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
8
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
9
|
+
# subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in all
|
12
|
+
# copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
16
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
17
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
18
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
19
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
#
|
21
|
+
module Conjur
|
22
|
+
|
23
|
+
class << self
|
24
|
+
def configuration
|
25
|
+
@config ||= Configuration.new
|
26
|
+
end
|
27
|
+
|
28
|
+
def configuration=(config)
|
29
|
+
@config = config
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Configuration
|
34
|
+
class << self
|
35
|
+
# @api private
|
36
|
+
def accepted_options
|
37
|
+
@options ||= Set.new
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param [Symbol] name
|
41
|
+
# @param [Hash] options
|
42
|
+
# @option options [Boolean] :boolean (false) whether this option should have a '?' accessor
|
43
|
+
# @option options [Boolean, String] :env Environment variable for this option. Set to false
|
44
|
+
# to disallow environment based configuration. Default is VM2_OPTION_NAME.
|
45
|
+
# @option options [Proc, *] :default Default value or proc to provide it
|
46
|
+
# @option options [Boolean] :required (false) when true, raise an exception if the option is
|
47
|
+
# not set
|
48
|
+
# @option options [Boolean] :sticky (true) when false, default proc will be called every time,
|
49
|
+
# otherwise the proc's result will be cached
|
50
|
+
# @option options [Proc, #to_proc] :convert proc-ish to convert environment
|
51
|
+
# values to appropriate types
|
52
|
+
# @param [Proc] def_proc block to provide default values
|
53
|
+
# @api private
|
54
|
+
def add_option name, options = {}, &def_proc
|
55
|
+
accepted_options << name
|
56
|
+
allow_env = options[:env].nil? or options[:env]
|
57
|
+
sticky = options.member?(:sticky) ? options[:sticky] : true
|
58
|
+
env_var = options[:env] || "CONJUR_#{name.to_s.upcase}"
|
59
|
+
def_val = options[:default]
|
60
|
+
opt_name = name
|
61
|
+
|
62
|
+
def_proc ||= if def_val.respond_to?(:call)
|
63
|
+
def_val
|
64
|
+
elsif options[:required]
|
65
|
+
proc { raise "Missing required option #{opt_name}" }
|
66
|
+
else
|
67
|
+
proc { def_val }
|
68
|
+
end
|
69
|
+
|
70
|
+
convert = options[:convert] || ->(x){ x }
|
71
|
+
# Allow a Symbol, for example
|
72
|
+
convert = convert.to_proc if convert.respond_to?(:to_proc)
|
73
|
+
|
74
|
+
define_method("#{name}=") do |value|
|
75
|
+
set name, value
|
76
|
+
end
|
77
|
+
|
78
|
+
define_method(name) do
|
79
|
+
if supplied.member?(name)
|
80
|
+
supplied[name]
|
81
|
+
elsif allow_env && ENV.member?(env_var)
|
82
|
+
instance_exec(ENV[env_var], &convert)
|
83
|
+
else
|
84
|
+
value = instance_eval(&def_proc)
|
85
|
+
supplied[name] = value if sticky
|
86
|
+
value
|
87
|
+
end
|
88
|
+
end
|
89
|
+
alias_method("#{name}?", name) if options[:boolean]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def set(key, value)
|
94
|
+
if self.class.accepted_options.include?(key.to_sym)
|
95
|
+
supplied[key.to_sym] = value
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
add_option :authn_url do
|
100
|
+
account_service_url 'authn', 0
|
101
|
+
end
|
102
|
+
|
103
|
+
add_option :authz_url do
|
104
|
+
global_service_url 'authz', 100
|
105
|
+
end
|
106
|
+
|
107
|
+
add_option :core_url do
|
108
|
+
account_service_url 'core', 200
|
109
|
+
end
|
110
|
+
|
111
|
+
add_option :audit_url do
|
112
|
+
global_service_url 'audit', 300
|
113
|
+
end
|
114
|
+
|
115
|
+
add_option :service_url
|
116
|
+
|
117
|
+
add_option :service_base_port, default: 5000
|
118
|
+
|
119
|
+
add_option :account, required: true
|
120
|
+
|
121
|
+
add_option :env do
|
122
|
+
ENV['RAILS_ENV'] || ENV['RACK_ENV'] || "production"
|
123
|
+
end
|
124
|
+
|
125
|
+
add_option :stack do
|
126
|
+
case env
|
127
|
+
when "production"
|
128
|
+
"v4"
|
129
|
+
else
|
130
|
+
env
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
private
|
135
|
+
|
136
|
+
def global_service_url(service_name, service_port_offset)
|
137
|
+
if service_url
|
138
|
+
URI.join(service_url, service_name).to_s
|
139
|
+
else
|
140
|
+
case env
|
141
|
+
when 'test', 'development'
|
142
|
+
"http://localhost:#{service_base_port + service_port_offset}"
|
143
|
+
else
|
144
|
+
"https://#{service_name}-#{stack}-conjur.herokuapp.com"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def account_service_url(service_name, service_port_offset)
|
150
|
+
if service_url
|
151
|
+
URI.join(service_url, "/#{service_name}/", account).to_s
|
152
|
+
else
|
153
|
+
case env
|
154
|
+
when 'test', 'development'
|
155
|
+
"http://localhost:#{service_base_port + service_port_offset}"
|
156
|
+
else
|
157
|
+
"https://#{service_name}-#{account}-conjur.herokuapp.com"
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def supplied
|
163
|
+
@supplied ||= {}
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
data/lib/conjur/core-api.rb
CHANGED
@@ -30,6 +30,10 @@ module Conjur
|
|
30
30
|
module Core
|
31
31
|
class API < Conjur::API
|
32
32
|
class << self
|
33
|
+
def host
|
34
|
+
Conjur.configuration.core_url
|
35
|
+
end
|
36
|
+
|
33
37
|
def conjur_account
|
34
38
|
info['account'] or raise "No account field in #{info.inspect}"
|
35
39
|
end
|
@@ -37,24 +41,12 @@ module Conjur
|
|
37
41
|
def info
|
38
42
|
@info ||= JSON.parse RestClient::Resource.new(Conjur::Core::API.host)['info'].get
|
39
43
|
end
|
40
|
-
|
41
|
-
def host
|
42
|
-
ENV['CONJUR_CORE_URL'] || default_host
|
43
|
-
end
|
44
|
-
|
45
|
-
def default_host
|
46
|
-
case Conjur.env
|
47
|
-
when 'test', 'development'
|
48
|
-
"http://localhost:#{Conjur.service_base_port + 200}"
|
49
|
-
else
|
50
|
-
"https://core-#{Conjur.account}-conjur.herokuapp.com"
|
51
|
-
end
|
52
|
-
end
|
53
44
|
end
|
54
45
|
end
|
55
46
|
end
|
56
47
|
end
|
57
48
|
|
49
|
+
require 'conjur/api/deputies'
|
58
50
|
require 'conjur/api/hosts'
|
59
51
|
require 'conjur/api/secrets'
|
60
52
|
require 'conjur/api/users'
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2013 Conjur Inc
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
5
|
+
# this software and associated documentation files (the "Software"), to deal in
|
6
|
+
# the Software without restriction, including without limitation the rights to
|
7
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
8
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
9
|
+
# subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in all
|
12
|
+
# copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
16
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
17
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
18
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
19
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
#
|
21
|
+
module Conjur
|
22
|
+
class Deputy < RestClient::Resource
|
23
|
+
include Exists
|
24
|
+
include HasId
|
25
|
+
include HasIdentifier
|
26
|
+
include HasAttributes
|
27
|
+
include ActsAsUser
|
28
|
+
include ActsAsResource
|
29
|
+
|
30
|
+
def login
|
31
|
+
[ self.class.name.split('::')[-1].downcase, id ].join('/')
|
32
|
+
end
|
33
|
+
|
34
|
+
def api_key
|
35
|
+
self.attributes['api_key']
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/conjur/env.rb
CHANGED
@@ -22,23 +22,18 @@ module Conjur
|
|
22
22
|
extend self
|
23
23
|
|
24
24
|
def service_base_port
|
25
|
-
|
25
|
+
Conjur.configuration.service_base_port
|
26
26
|
end
|
27
27
|
|
28
28
|
def account
|
29
|
-
|
29
|
+
Conjur.configuration.account
|
30
30
|
end
|
31
31
|
|
32
32
|
def env
|
33
|
-
|
33
|
+
Conjur.configuration.env
|
34
34
|
end
|
35
35
|
|
36
36
|
def stack
|
37
|
-
|
38
|
-
when "production"
|
39
|
-
"v4"
|
40
|
-
else
|
41
|
-
env
|
42
|
-
end
|
37
|
+
Conjur.configuration.stack
|
43
38
|
end
|
44
39
|
end
|
data/lib/conjur/host.rb
CHANGED
@@ -19,22 +19,7 @@
|
|
19
19
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
20
|
#
|
21
21
|
module Conjur
|
22
|
-
class Host <
|
23
|
-
include Exists
|
24
|
-
include HasId
|
25
|
-
include HasIdentifier
|
26
|
-
include HasAttributes
|
27
|
-
include ActsAsUser
|
28
|
-
include ActsAsResource
|
29
|
-
|
30
|
-
def login
|
31
|
-
[ 'host', id ].join('/')
|
32
|
-
end
|
33
|
-
|
34
|
-
def api_key
|
35
|
-
self.attributes['api_key']
|
36
|
-
end
|
37
|
-
|
22
|
+
class Host < Deputy
|
38
23
|
def enrollment_url
|
39
24
|
log do |logger|
|
40
25
|
logger << "Fetching enrollment_url for #{id}"
|
data/lib/conjur/resource.rb
CHANGED
@@ -103,7 +103,26 @@ module Conjur
|
|
103
103
|
rescue RestClient::ResourceNotFound
|
104
104
|
false
|
105
105
|
end
|
106
|
-
|
106
|
+
|
107
|
+
# Returns all resources (optionally qualified by kind)
|
108
|
+
# visible to the user with given credentials.
|
109
|
+
# Options are:
|
110
|
+
# - host - authz url,
|
111
|
+
# - credentials,
|
112
|
+
# - account,
|
113
|
+
# - kind (optional).
|
114
|
+
def self.all opts = {}
|
115
|
+
host, credentials, account, kind = opts.values_at(*[:host, :credentials, :account, :kind])
|
116
|
+
fail ArgumentError, "host and account are required" unless [host, account].all?
|
117
|
+
|
118
|
+
credentials ||= {}
|
119
|
+
|
120
|
+
path = "#{account}/resources"
|
121
|
+
path += "/#{kind}" if kind
|
122
|
+
resource = RestClient::Resource.new(host, credentials)[path]
|
123
|
+
JSON.parse resource.get
|
124
|
+
end
|
125
|
+
|
107
126
|
protected
|
108
127
|
|
109
128
|
def eachable(item)
|
data/spec/api/resources_spec.rb
CHANGED
@@ -16,4 +16,25 @@ describe Conjur::API, api: :dummy do
|
|
16
16
|
res.url.should == "#{authz_host}/some-account/resources/a-kind/the-id"
|
17
17
|
end
|
18
18
|
end
|
19
|
+
|
20
|
+
describe '.resources' do
|
21
|
+
let(:ids) { %w(acc:kind:foo acc:chunky:bar) }
|
22
|
+
let(:resources) {
|
23
|
+
ids.map do |id|
|
24
|
+
{ 'id' => id }
|
25
|
+
end
|
26
|
+
}
|
27
|
+
it "lists all resources" do
|
28
|
+
expect(Conjur::Resource).to receive(:all)
|
29
|
+
.with(host: authz_host, credentials: api.credentials).and_return(resources)
|
30
|
+
|
31
|
+
expect(api.resources.map(&:url)).to eql(ids.map { |id| api.resource(id).url })
|
32
|
+
end
|
33
|
+
it "can filter by kind" do
|
34
|
+
expect(Conjur::Resource).to receive(:all)
|
35
|
+
.with(host: authz_host, credentials: api.credentials, kind: :chunky).and_return(resources)
|
36
|
+
|
37
|
+
expect(api.resources(kind: :chunky).map(&:url)).to eql(ids.map { |id| api.resource(id).url })
|
38
|
+
end
|
39
|
+
end
|
19
40
|
end
|
data/spec/lib/api_spec.rb
CHANGED
@@ -1,33 +1,34 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
shared_examples_for "API endpoint" do
|
4
|
+
before { Conjur.configuration = Conjur::Configuration.new }
|
4
5
|
subject { api }
|
5
6
|
let(:service_name) { api.name.split('::')[-2].downcase }
|
6
7
|
context "in development" do
|
7
8
|
before(:each) do
|
8
|
-
Conjur.stub(:env).and_return "development"
|
9
|
+
Conjur::Configuration.any_instance.stub(:env).and_return "development"
|
9
10
|
end
|
10
|
-
its "
|
11
|
-
should == "http://localhost:#{Conjur.service_base_port + port_offset}"
|
11
|
+
its "host" do
|
12
|
+
should == "http://localhost:#{Conjur.configuration.service_base_port + port_offset}"
|
12
13
|
end
|
13
14
|
end
|
14
15
|
context "'ci' account" do
|
15
16
|
before {
|
16
|
-
Conjur.stub(:account).and_return 'ci'
|
17
|
+
Conjur::Configuration.any_instance.stub(:account).and_return 'ci'
|
17
18
|
}
|
18
19
|
context "in stage" do
|
19
20
|
before(:each) do
|
20
|
-
Conjur.stub(:env).and_return "stage"
|
21
|
+
Conjur::Configuration.any_instance.stub(:env).and_return "stage"
|
21
22
|
end
|
22
|
-
its "
|
23
|
+
its "host" do
|
23
24
|
should == "https://#{service_name}-ci-conjur.herokuapp.com"
|
24
25
|
end
|
25
26
|
end
|
26
27
|
context "in ci" do
|
27
28
|
before(:each) do
|
28
|
-
Conjur.stub(:env).and_return "ci"
|
29
|
+
Conjur::Configuration.any_instance.stub(:env).and_return "ci"
|
29
30
|
end
|
30
|
-
its "
|
31
|
+
its "host" do
|
31
32
|
should == "https://#{service_name}-ci-conjur.herokuapp.com"
|
32
33
|
end
|
33
34
|
end
|
@@ -111,6 +112,7 @@ describe Conjur::API do
|
|
111
112
|
end
|
112
113
|
|
113
114
|
context "host construction" do
|
115
|
+
before { Conjur.configuration = Conjur::Configuration.new }
|
114
116
|
context "of authn service" do
|
115
117
|
let(:port_offset) { 0 }
|
116
118
|
let(:api) { Conjur::Authn::API }
|
@@ -122,15 +124,15 @@ describe Conjur::API do
|
|
122
124
|
subject { api }
|
123
125
|
context "'ci' account" do
|
124
126
|
before {
|
125
|
-
Conjur.stub(:account).and_return 'ci'
|
127
|
+
Conjur::Configuration.any_instance.stub(:account).and_return 'ci'
|
126
128
|
}
|
127
129
|
context "in stage" do
|
128
130
|
before(:each) do
|
129
131
|
# Looks at "ENV['CONJUR_STACK']" first, stub this out
|
130
132
|
ENV.stub(:[]).with('CONJUR_STACK').and_return nil
|
131
|
-
Conjur.stub(:env).and_return "stage"
|
133
|
+
Conjur::Configuration.any_instance.stub(:env).and_return "stage"
|
132
134
|
end
|
133
|
-
its "
|
135
|
+
its "host" do
|
134
136
|
should == "https://authz-stage-conjur.herokuapp.com"
|
135
137
|
end
|
136
138
|
end
|
@@ -138,36 +140,34 @@ describe Conjur::API do
|
|
138
140
|
before(:each) do
|
139
141
|
# Looks at "ENV['CONJUR_STACK']" first, stub this out
|
140
142
|
ENV.stub(:[]).with('CONJUR_STACK').and_return nil
|
141
|
-
Conjur.stub(:env).and_return "ci"
|
143
|
+
Conjur::Configuration.any_instance.stub(:env).and_return "ci"
|
142
144
|
end
|
143
|
-
its "
|
145
|
+
its "host" do
|
144
146
|
should == "https://authz-ci-conjur.herokuapp.com"
|
145
147
|
end
|
146
148
|
end
|
147
149
|
context "when ENV['CONJUR_STACK'] is set to 'v12'" do
|
148
150
|
before do
|
149
|
-
|
150
|
-
|
151
|
-
# If the "real" env is used ('test') then the URL is always localhost:<someport>
|
152
|
-
Conjur.stub(:env).and_return "ci"
|
151
|
+
Conjur::Configuration.any_instance.stub(:stack).and_return "v12"
|
152
|
+
Conjur::Configuration.any_instance.stub(:env).and_return "ci"
|
153
153
|
end
|
154
|
-
its(:
|
154
|
+
its(:host){ should == "https://authz-v12-conjur.herokuapp.com"}
|
155
155
|
end
|
156
156
|
end
|
157
157
|
context "in production" do
|
158
158
|
before(:each) do
|
159
|
-
Conjur.stub(:env).and_return "production"
|
159
|
+
Conjur::Configuration.any_instance.stub(:env).and_return "production"
|
160
160
|
end
|
161
|
-
its "
|
161
|
+
its "host" do
|
162
162
|
should == "https://authz-v4-conjur.herokuapp.com"
|
163
163
|
end
|
164
164
|
end
|
165
165
|
context "in named production version" do
|
166
166
|
before(:each) do
|
167
|
-
Conjur.stub(:env).and_return "production"
|
168
|
-
Conjur.stub(:stack).and_return "waffle"
|
167
|
+
Conjur::Configuration.any_instance.stub(:env).and_return "production"
|
168
|
+
Conjur::Configuration.any_instance.stub(:stack).and_return "waffle"
|
169
169
|
end
|
170
|
-
its "
|
170
|
+
its "host" do
|
171
171
|
should == "https://authz-waffle-conjur.herokuapp.com"
|
172
172
|
end
|
173
173
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Conjur::Configuration do
|
4
|
+
before {
|
5
|
+
Conjur.configuration = Conjur::Configuration.new
|
6
|
+
}
|
7
|
+
subject { Conjur.configuration }
|
8
|
+
context "CONJUR_ENV unspecified" do
|
9
|
+
before(:all) {
|
10
|
+
ENV.delete('CONJUR_ENV')
|
11
|
+
}
|
12
|
+
after(:all) {
|
13
|
+
ENV['CONJUR_ENV'] = 'test'
|
14
|
+
}
|
15
|
+
context "default env" do
|
16
|
+
its(:env) { should == "production" }
|
17
|
+
end
|
18
|
+
context "default stack" do
|
19
|
+
its(:stack) { should == "v4" }
|
20
|
+
end
|
21
|
+
describe 'authn_url' do
|
22
|
+
before {
|
23
|
+
Conjur::Configuration.any_instance.stub(:account).and_return "the-account"
|
24
|
+
}
|
25
|
+
context "with service_url" do
|
26
|
+
before {
|
27
|
+
Conjur::Configuration.any_instance.stub(:service_url).and_return "http://example.com"
|
28
|
+
}
|
29
|
+
its(:authn_url) { should == "http://example.com/authn/the-account" }
|
30
|
+
end
|
31
|
+
context "without service_url" do
|
32
|
+
its(:authn_url) { should == "https://authn-the-account-conjur.herokuapp.com" }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
describe 'authz_url' do
|
36
|
+
before {
|
37
|
+
Conjur::Configuration.any_instance.stub(:account).and_return "the-account"
|
38
|
+
}
|
39
|
+
context "with service_url" do
|
40
|
+
before {
|
41
|
+
Conjur::Configuration.any_instance.stub(:service_url).and_return "http://example.com"
|
42
|
+
}
|
43
|
+
its(:authz_url) { should == "http://example.com/authz" }
|
44
|
+
end
|
45
|
+
context "without service_url" do
|
46
|
+
its(:authz_url) { should == "https://authz-v4-conjur.herokuapp.com" }
|
47
|
+
context "with specific stack" do
|
48
|
+
before { Conjur::Configuration.any_instance.stub(:stack).and_return "the-stack" }
|
49
|
+
its(:authz_url) { should == "https://authz-the-stack-conjur.herokuapp.com" }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
context "CONJUR_ENV = 'test'" do
|
55
|
+
its(:env) { should == "test" }
|
56
|
+
describe 'authn_url' do
|
57
|
+
before {
|
58
|
+
Conjur::Configuration.any_instance.stub(:account).and_return "the-account"
|
59
|
+
}
|
60
|
+
context "with service_url" do
|
61
|
+
before {
|
62
|
+
Conjur::Configuration.any_instance.stub(:service_url).and_return "http://example.com"
|
63
|
+
}
|
64
|
+
its(:authn_url) { should == "http://example.com/authn/the-account" }
|
65
|
+
end
|
66
|
+
context "without service_url" do
|
67
|
+
its(:authn_url) { should == "http://localhost:5000" }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
describe 'authz_url' do
|
71
|
+
before {
|
72
|
+
Conjur::Configuration.any_instance.stub(:account).and_return "the-account"
|
73
|
+
}
|
74
|
+
context "with service_url" do
|
75
|
+
before {
|
76
|
+
Conjur::Configuration.any_instance.stub(:service_url).and_return "http://example.com"
|
77
|
+
}
|
78
|
+
its(:authz_url) { should == "http://example.com/authz" }
|
79
|
+
end
|
80
|
+
context "without service_url" do
|
81
|
+
its(:authz_url) { should == "http://localhost:5100" }
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Conjur::Deputy, api: :dummy do
|
4
|
+
subject { Conjur::Deputy.new 'http://example.com/deputies/my/hostname', nil }
|
5
|
+
|
6
|
+
its(:resource) { should be }
|
7
|
+
its(:login) { should == 'deputy/my/hostname' }
|
8
|
+
|
9
|
+
let(:api_key) { 'theapikey' }
|
10
|
+
before { subject.attributes = { 'api_key' => api_key } }
|
11
|
+
its(:api_key) { should == api_key }
|
12
|
+
end
|
data/spec/lib/host_spec.rb
CHANGED
@@ -6,10 +6,6 @@ describe Conjur::Host, api: :dummy do
|
|
6
6
|
its(:resource) { should be }
|
7
7
|
its(:login) { should == 'host/my/hostname' }
|
8
8
|
|
9
|
-
let(:api_key) { 'theapikey' }
|
10
|
-
before { subject.attributes = { 'api_key' => api_key } }
|
11
|
-
its(:api_key) { should == api_key }
|
12
|
-
|
13
9
|
it "fetches enrollment_url" do
|
14
10
|
stub_request(:head, "http://example.com/hosts/my/hostname/enrollment_url").
|
15
11
|
to_return(:status => 200, :headers => {location: 'foo'})
|
data/spec/lib/resource_spec.rb
CHANGED
@@ -126,4 +126,37 @@ describe Conjur::Resource, api: :dummy, logging: :temp do
|
|
126
126
|
subject.permitted? 'fry'
|
127
127
|
end
|
128
128
|
end
|
129
|
+
|
130
|
+
describe '.all' do
|
131
|
+
it "calls /account/resources" do
|
132
|
+
RestClient::Request.should_receive(:execute).with(
|
133
|
+
method: :get,
|
134
|
+
url: "http://authz.example.com/the-account/resources",
|
135
|
+
headers: {}
|
136
|
+
).and_return '["foo", "bar"]'
|
137
|
+
|
138
|
+
expect(Conjur::Resource.all host: authz_host, account: account).to eql(%w(foo bar))
|
139
|
+
end
|
140
|
+
|
141
|
+
it "can filter by kind" do
|
142
|
+
RestClient::Request.should_receive(:execute).with(
|
143
|
+
method: :get,
|
144
|
+
url: "http://authz.example.com/the-account/resources/chunky",
|
145
|
+
headers: {}
|
146
|
+
).and_return '["foo", "bar"]'
|
147
|
+
|
148
|
+
expect(Conjur::Resource.all host: authz_host, account: account, kind: :chunky)
|
149
|
+
.to eql(%w(foo bar))
|
150
|
+
end
|
151
|
+
|
152
|
+
it "uses the given authz url" do
|
153
|
+
RestClient::Request.should_receive(:execute).with(
|
154
|
+
method: :get,
|
155
|
+
url: "http://otherhost.example.com/the-account/resources",
|
156
|
+
headers: {}
|
157
|
+
).and_return '["foo", "bar"]'
|
158
|
+
|
159
|
+
Conjur::Resource.all host: 'http://otherhost.example.com', account: account
|
160
|
+
end
|
161
|
+
end
|
129
162
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: conjur-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-12-24 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rest-client
|
@@ -217,6 +217,7 @@ files:
|
|
217
217
|
- lib/conjur/api.rb
|
218
218
|
- lib/conjur/api/audit.rb
|
219
219
|
- lib/conjur/api/authn.rb
|
220
|
+
- lib/conjur/api/deputies.rb
|
220
221
|
- lib/conjur/api/groups.rb
|
221
222
|
- lib/conjur/api/hosts.rb
|
222
223
|
- lib/conjur/api/resources.rb
|
@@ -229,7 +230,9 @@ files:
|
|
229
230
|
- lib/conjur/authz-api.rb
|
230
231
|
- lib/conjur/base.rb
|
231
232
|
- lib/conjur/build_from_response.rb
|
233
|
+
- lib/conjur/configuration.rb
|
232
234
|
- lib/conjur/core-api.rb
|
235
|
+
- lib/conjur/deputy.rb
|
233
236
|
- lib/conjur/env.rb
|
234
237
|
- lib/conjur/escape.rb
|
235
238
|
- lib/conjur/exists.rb
|
@@ -262,6 +265,8 @@ files:
|
|
262
265
|
- spec/lib/asset_spec.rb
|
263
266
|
- spec/lib/audit_spec.rb
|
264
267
|
- spec/lib/build_from_response_spec.rb
|
268
|
+
- spec/lib/configuration_spec.rb
|
269
|
+
- spec/lib/deputy_spec.rb
|
265
270
|
- spec/lib/exists_spec.rb
|
266
271
|
- spec/lib/host_spec.rb
|
267
272
|
- spec/lib/log_source_spec.rb
|
@@ -299,7 +304,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
299
304
|
version: '0'
|
300
305
|
segments:
|
301
306
|
- 0
|
302
|
-
hash:
|
307
|
+
hash: 3244723837953791122
|
303
308
|
requirements: []
|
304
309
|
rubyforge_project:
|
305
310
|
rubygems_version: 1.8.25
|
@@ -324,6 +329,8 @@ test_files:
|
|
324
329
|
- spec/lib/asset_spec.rb
|
325
330
|
- spec/lib/audit_spec.rb
|
326
331
|
- spec/lib/build_from_response_spec.rb
|
332
|
+
- spec/lib/configuration_spec.rb
|
333
|
+
- spec/lib/deputy_spec.rb
|
327
334
|
- spec/lib/exists_spec.rb
|
328
335
|
- spec/lib/host_spec.rb
|
329
336
|
- spec/lib/log_source_spec.rb
|