conjur-cli 4.22.0 → 4.23.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/features/conjurize.feature +1 -1
- data/lib/conjur/authn.rb +14 -1
- data/lib/conjur/command/dsl_command.rb +2 -3
- data/lib/conjur/command/plugin.rb +1 -1
- data/lib/conjur/config.rb +7 -7
- data/lib/conjur/conjurize.rb +5 -5
- data/lib/conjur/dsl/runner.rb +10 -4
- data/lib/conjur/version.rb +1 -1
- data/spec/authn_spec.rb +44 -16
- data/spec/config_spec.rb +1 -1
- data/spec/dsl/runner_spec.rb +73 -48
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf3b61260f8129d53e15aaca659af65769bdd729
|
4
|
+
data.tar.gz: b40c45ae844b63e70d1975b2fc2934806562a8b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0105965b5726d5449fe576a034f7b4f90627d0277d44d9f7c5f95744052fe9a012a037d28ca70f1ba1deef793a5aa0c71bcf9546e221769348aaca60faf37a29
|
7
|
+
data.tar.gz: d0b1bd9f7f6b094bc846439914d4fbcb852b6b3d6a20a195dd24bc7f2bc6e69b781c4494d3def7d51d188620aabf7432d668fd6c1bd5c51bcdf9ad16d1df8fbb
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
# Unreleased
|
2
|
+
|
3
|
+
# 4.23.0
|
4
|
+
|
5
|
+
* Don't check if netrc is world-readable on Windows, since the answer is not reliable
|
6
|
+
* Use new [conjur](https://supermarket.chef.io/cookbooks/conjur) cookbook for conjurize
|
7
|
+
* Fix faulty initialization of plugins list, if it's nil, in the .conjurrc
|
8
|
+
* Log DSL commands to stderr, even if CONJURAPI_LOG is not explicitly configured
|
9
|
+
* In policy DSL, allow creation of records without an explicit `id`. In this case, the current scope is used as the `id`.
|
10
|
+
|
1
11
|
# 4.22.0
|
2
12
|
|
3
13
|
* New 'plugin' subcommand to manage CLI plugins
|
data/features/conjurize.feature
CHANGED
@@ -112,7 +112,7 @@ curl -L https://www.opscode.com/chef/install.sh | bash
|
|
112
112
|
"""
|
113
113
|
And the output should match:
|
114
114
|
"""
|
115
|
-
chef-solo -r https:\/\/github.com\/conjur-cookbooks\/conjur
|
115
|
+
chef-solo -r https:\/\/github.com\/conjur-cookbooks\/conjur\/releases\/download/v\d\.\d\.\d/conjur-v\d\.\d\.\d.tar.gz -o conjur
|
116
116
|
"""
|
117
117
|
|
118
118
|
Scenario: conjurize with arbitrary cookbook
|
data/lib/conjur/authn.rb
CHANGED
@@ -66,7 +66,7 @@ module Conjur::Authn
|
|
66
66
|
else
|
67
67
|
path = Netrc.default_path
|
68
68
|
end
|
69
|
-
|
69
|
+
fail_if_world_readable path
|
70
70
|
Netrc.read(*args)
|
71
71
|
end
|
72
72
|
|
@@ -126,5 +126,18 @@ module Conjur::Authn
|
|
126
126
|
end
|
127
127
|
cls.new_from_key(*get_credentials(options))
|
128
128
|
end
|
129
|
+
|
130
|
+
protected
|
131
|
+
|
132
|
+
def fail_if_world_readable path
|
133
|
+
if !windows? && File.world_readable?(path)
|
134
|
+
fail "netrc (#{path}) shouldn't be world-readable"
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# see http://stackoverflow.com/questions/4871309/what-is-the-correct-way-to-detect-if-ruby-is-running-on-windows
|
139
|
+
def windows?
|
140
|
+
RbConfig::CONFIG["host_os"] =~ /mswin|mingw|cygwin/
|
141
|
+
end
|
129
142
|
end
|
130
143
|
end
|
@@ -126,7 +126,7 @@ def modify_plugin_list(op, plugin_name)
|
|
126
126
|
config_exists = true
|
127
127
|
config = YAML.load(IO.read(f)).stringify_keys rescue {}
|
128
128
|
|
129
|
-
config['plugins'] ||=
|
129
|
+
config['plugins'] ||= []
|
130
130
|
config['plugins'] += [plugin_name] if op == 'add'
|
131
131
|
config['plugins'] -= [plugin_name] if op == 'remove'
|
132
132
|
config['plugins'].uniq!
|
data/lib/conjur/config.rb
CHANGED
@@ -87,14 +87,14 @@ module Conjur
|
|
87
87
|
end
|
88
88
|
|
89
89
|
if Conjur.log
|
90
|
-
|
91
|
-
|
92
|
-
Conjur
|
90
|
+
require 'conjur/api'
|
91
|
+
host = begin
|
92
|
+
Conjur::Authn::API.host
|
93
93
|
rescue RuntimeError
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
94
|
+
nil
|
95
|
+
end
|
96
|
+
if host
|
97
|
+
Conjur.log << "Using authn host #{Conjur::Authn::API.host}\n"
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
data/lib/conjur/conjurize.rb
CHANGED
@@ -3,11 +3,11 @@ require 'json'
|
|
3
3
|
require 'open-uri'
|
4
4
|
require 'conjur/version.rb'
|
5
5
|
|
6
|
-
def
|
7
|
-
url = 'https://api.github.com/repos/conjur-cookbooks/conjur
|
6
|
+
def latest_conjur_release
|
7
|
+
url = 'https://api.github.com/repos/conjur-cookbooks/conjur/releases'
|
8
8
|
resp = open(url)
|
9
9
|
json = JSON.parse(resp.read)
|
10
|
-
latest = json[0]['assets'].select {|asset| asset['name'] =~ /conjur-
|
10
|
+
latest = json[0]['assets'].select {|asset| asset['name'] =~ /conjur-v\d.\d.\d.tar.gz/}[0]
|
11
11
|
latest['browser_download_url']
|
12
12
|
end
|
13
13
|
|
@@ -51,8 +51,8 @@ DESC
|
|
51
51
|
chef_executable = options[:"chef-executable"]
|
52
52
|
|
53
53
|
if options[:ssh]
|
54
|
-
conjur_run_list ||= "conjur
|
55
|
-
conjur_cookbook_url ||=
|
54
|
+
conjur_run_list ||= "conjur"
|
55
|
+
conjur_cookbook_url ||= latest_conjur_release()
|
56
56
|
end
|
57
57
|
|
58
58
|
sudo = lambda{|str|
|
data/lib/conjur/dsl/runner.rb
CHANGED
@@ -112,12 +112,12 @@ module Conjur
|
|
112
112
|
instance_eval(*args)
|
113
113
|
end
|
114
114
|
|
115
|
-
def resource kind, id, options = {}, &block
|
115
|
+
def resource kind, id = nil, options = {}, &block
|
116
116
|
id = full_resource_id([kind, qualify_id(id, kind) ].join(':'))
|
117
117
|
find_or_create :resource, id, options, &block
|
118
118
|
end
|
119
119
|
|
120
|
-
def role kind, id, options = {}, &block
|
120
|
+
def role kind, id = nil, options = {}, &block
|
121
121
|
id = full_resource_id([ kind, qualify_id(id, kind) ].join(':'))
|
122
122
|
find_or_create :role, id, options, &block
|
123
123
|
end
|
@@ -146,11 +146,12 @@ module Conjur
|
|
146
146
|
protected
|
147
147
|
|
148
148
|
def qualify_id id, kind
|
149
|
-
if id[0] == "/"
|
149
|
+
if id && id[0] == "/"
|
150
150
|
id[1..-1]
|
151
151
|
else
|
152
152
|
case kind.to_sym
|
153
153
|
when :user
|
154
|
+
raise "User id is required" unless id
|
154
155
|
[ id, current_user_scope ].compact.join('@')
|
155
156
|
else
|
156
157
|
[ current_scope, id ].compact.join('/')
|
@@ -175,6 +176,11 @@ module Conjur
|
|
175
176
|
lambda { args.length == 1 },
|
176
177
|
lambda { args.length == 2 && args[1].is_a?(Hash) }
|
177
178
|
]
|
179
|
+
if current_scope
|
180
|
+
# If there is a scope, it's valid to create a record without an id, because the
|
181
|
+
# scope name will be used as the id.
|
182
|
+
valid_prototypes << lambda { args.length == 0 }
|
183
|
+
end
|
178
184
|
!valid_prototypes.find{|p| p.call}.nil?
|
179
185
|
end
|
180
186
|
|
@@ -213,7 +219,7 @@ module Conjur
|
|
213
219
|
|
214
220
|
def do_object obj, &block
|
215
221
|
begin
|
216
|
-
api_keys[obj.roleid] = obj.api_key if obj.api_key
|
222
|
+
api_keys[obj.roleid] = obj.api_key if obj.respond_to?(:api_key) && obj.api_key
|
217
223
|
rescue
|
218
224
|
end
|
219
225
|
|
data/lib/conjur/version.rb
CHANGED
data/spec/authn_spec.rb
CHANGED
@@ -27,26 +27,54 @@ describe Conjur::Authn do
|
|
27
27
|
Conjur::Authn.get_credentials
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
describe "netrc" do
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
32
|
+
describe "fail_if_world_readable" do
|
33
|
+
let(:path) { "the-path" }
|
34
|
+
around { |example|
|
35
|
+
host_os = RbConfig::CONFIG["host_os"]
|
36
|
+
RbConfig::CONFIG["host_os"] = os
|
37
|
+
begin
|
38
|
+
example.run
|
39
|
+
ensure
|
40
|
+
RbConfig::CONFIG["host_os"] = host_os
|
41
|
+
end
|
42
|
+
}
|
43
|
+
context "on Windows" do
|
44
|
+
let(:os) { "mswin" }
|
45
|
+
it "bypasses the readability check" do
|
46
|
+
Conjur::Authn.send :fail_if_world_readable, path
|
47
|
+
end
|
48
|
+
end
|
49
|
+
context "on Linux" do
|
50
|
+
let(:os) { "linux" }
|
51
|
+
it "raises an error if the file is world readable" do
|
52
|
+
expect(File).to receive(:world_readable?).with(path).and_return(true)
|
53
|
+
expect { Conjur::Authn.send :fail_if_world_readable, path }.to raise_error("netrc (the-path) shouldn't be world-readable")
|
54
|
+
end
|
42
55
|
end
|
43
56
|
end
|
44
57
|
|
45
|
-
context "
|
46
|
-
let(:
|
47
|
-
|
48
|
-
|
49
|
-
|
58
|
+
context "loading" do
|
59
|
+
let(:netrc) { nil }
|
60
|
+
before do
|
61
|
+
allow(Conjur::Config).to receive(:[]).with(:netrc_path).and_return path
|
62
|
+
end
|
63
|
+
|
64
|
+
context "with specified netrc_path" do
|
65
|
+
let(:path) { "/a/dummy/netrc/path" }
|
66
|
+
it "consults Conjur::Config for netrc_path" do
|
67
|
+
expect(Netrc).to receive(:read).with(path).and_return netrc = double("netrc")
|
68
|
+
expect(Conjur::Authn.netrc).to eq(netrc)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "without specified netrc_path" do
|
73
|
+
let(:path) { nil }
|
74
|
+
it "uses default netrc path" do
|
75
|
+
expect(Netrc).to receive(:read).with(no_args).and_return netrc = double("netrc")
|
76
|
+
expect(Conjur::Authn.netrc).to eq(netrc)
|
77
|
+
end
|
50
78
|
end
|
51
79
|
end
|
52
80
|
end
|
data/spec/config_spec.rb
CHANGED
@@ -114,7 +114,7 @@ describe Conjur::Config do
|
|
114
114
|
}
|
115
115
|
|
116
116
|
context "ssl_certificate string" do
|
117
|
-
let(:ssl_certificate){ 'the
|
117
|
+
let(:ssl_certificate){ 'the-certificate' }
|
118
118
|
let(:certificate){ double('Certificate') }
|
119
119
|
before{
|
120
120
|
Conjur::Config.class_variable_set('@@attributes', {'ssl_certificate' => ssl_certificate})
|
data/spec/dsl/runner_spec.rb
CHANGED
@@ -6,63 +6,88 @@ describe Conjur::DSL::Runner, logged_in: true do
|
|
6
6
|
|
7
7
|
let(:filename) { nil }
|
8
8
|
let(:runner) { Conjur::DSL::Runner.new script, filename }
|
9
|
-
let(:script) { "user 'alice'" }
|
10
|
-
let(:alice) {
|
11
|
-
Conjur::User.new("alice").tap do |user|
|
12
|
-
user.attributes = { "api_key" => "the-api-key" }
|
13
|
-
end
|
14
|
-
}
|
15
9
|
before {
|
16
10
|
allow(Conjur).to receive(:account).and_return "the-account"
|
17
11
|
allow(runner).to receive(:api).and_return api
|
18
12
|
}
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
it "should store the api_key in the context keyed by roleid" do
|
27
|
-
expect(api).to receive(:user).with("alice").and_return double("alice-exists", exists?: false)
|
28
|
-
expect(api).to receive(:create_user).with(id: "alice").and_return alice
|
29
|
-
|
30
|
-
runner.execute
|
31
|
-
|
32
|
-
expect(runner.context['api_keys']).to eq({
|
33
|
-
"the-account:user:alice" => "the-api-key"
|
34
|
-
})
|
35
|
-
end
|
36
|
-
|
37
|
-
it "doesn't store default env and stack in context" do
|
38
|
-
expect(runner.context).to_not have_key 'env'
|
39
|
-
expect(runner.context).to_not have_key 'stack'
|
40
|
-
end
|
41
|
-
|
42
|
-
context "with non-default stack and env" do
|
43
|
-
let(:runner) do
|
44
|
-
Conjur::Config.merge env: 'baz', stack: 'bar'
|
45
|
-
Conjur::Config.apply
|
46
|
-
Conjur::DSL::Runner.new '', nil
|
13
|
+
context "nil record ids" do
|
14
|
+
subject { runner.execute }
|
15
|
+
context "creating a user" do
|
16
|
+
let(:script) { "user" }
|
17
|
+
it "isn't allowed" do
|
18
|
+
expect{ subject }.to raise_error
|
19
|
+
end
|
47
20
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
21
|
+
context "creating a resource" do
|
22
|
+
let(:script) { "scope 'kitchen' do; resource 'food'; end" }
|
23
|
+
it "creates resource with id matching the scope" do
|
24
|
+
expect(api).to receive(:resource).with("the-account:food:kitchen").and_return double("kitchen-exists", :exists? => true)
|
25
|
+
subject
|
26
|
+
end
|
27
|
+
end
|
28
|
+
context "creating a layer" do
|
29
|
+
let(:script) { "scope 'kitchen' do; layer; end" }
|
30
|
+
it "creates layer with id matching the scope" do
|
31
|
+
expect(api).to receive(:layer).with("kitchen").and_return double("kitchen-exists", :exists? => true)
|
32
|
+
subject
|
33
|
+
end
|
52
34
|
end
|
53
35
|
end
|
54
|
-
|
55
|
-
|
56
|
-
let(:
|
57
|
-
|
58
|
-
|
59
|
-
|
36
|
+
context "creating user:alice" do
|
37
|
+
let(:script) { "user 'alice'" }
|
38
|
+
let(:alice) {
|
39
|
+
Conjur::User.new("alice").tap do |user|
|
40
|
+
user.attributes = { "api_key" => "the-api-key" }
|
41
|
+
end
|
42
|
+
}
|
43
|
+
it "should populate the root ownerid" do
|
44
|
+
expect(api).to receive(:user).with("alice").and_return double("alice-exists", exists?: false)
|
45
|
+
expect(api).to receive(:create_user).with(id: "alice", ownerid: "user:bob").and_return alice
|
60
46
|
|
61
|
-
|
47
|
+
runner.owner = "user:bob"
|
48
|
+
runner.execute
|
62
49
|
end
|
63
|
-
|
64
|
-
|
65
|
-
expect(
|
50
|
+
it "should store the api_key in the context keyed by roleid" do
|
51
|
+
expect(api).to receive(:user).with("alice").and_return double("alice-exists", exists?: false)
|
52
|
+
expect(api).to receive(:create_user).with(id: "alice").and_return alice
|
53
|
+
|
54
|
+
runner.execute
|
55
|
+
|
56
|
+
expect(runner.context['api_keys']).to eq({
|
57
|
+
"the-account:user:alice" => "the-api-key"
|
58
|
+
})
|
59
|
+
end
|
60
|
+
|
61
|
+
it "doesn't store default env and stack in context" do
|
62
|
+
expect(runner.context).to_not have_key 'env'
|
63
|
+
expect(runner.context).to_not have_key 'stack'
|
64
|
+
end
|
65
|
+
|
66
|
+
context "with non-default stack and env" do
|
67
|
+
let(:runner) do
|
68
|
+
Conjur::Config.merge env: 'baz', stack: 'bar'
|
69
|
+
Conjur::Config.apply
|
70
|
+
Conjur::DSL::Runner.new '', nil
|
71
|
+
end
|
72
|
+
|
73
|
+
it "stores them in context" do
|
74
|
+
expect(runner.context['env']).to eq 'baz'
|
75
|
+
expect(runner.context['stack']).to eq 'bar'
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context "with appliance url" do
|
80
|
+
let(:appliance_url) { "https://conjur.example.com/api" }
|
81
|
+
let(:runner) do
|
82
|
+
Conjur::Config.merge appliance_url: appliance_url
|
83
|
+
Conjur::Config.apply
|
84
|
+
|
85
|
+
Conjur::DSL::Runner.new '', nil
|
86
|
+
end
|
87
|
+
|
88
|
+
it "stores appliance url in the context" do
|
89
|
+
expect(runner.context['appliance_url']).to eq appliance_url
|
90
|
+
end
|
66
91
|
end
|
67
92
|
end
|
68
93
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: conjur-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.23.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafal Rzepecki
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-04
|
12
|
+
date: 2015-05-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|