conjur-cli 5.6.6 → 6.0.0.rc1
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 +5 -5
- data/.dockerignore +1 -1
- data/.gitignore +2 -0
- data/.rubocop.yml +1 -1
- data/APPLIANCE_VERSION +1 -1
- data/CHANGELOG.md +3 -42
- data/Gemfile +4 -7
- data/Humanfile.md +31 -0
- data/Jenkinsfile +34 -63
- data/README.md +41 -55
- data/Rakefile +5 -1
- data/bin/conjur +0 -2
- data/build-deb.sh +1 -3
- data/ci/cli-test.sh +6 -0
- data/ci/package.sh +3 -1
- data/ci/publish.sh +2 -2
- data/ci/secrets/publish.yml +2 -2
- data/ci/wait_for_server.sh +10 -0
- data/conjur-cli.gemspec +7 -7
- data/dev/docker-compose.yml +24 -0
- data/dev/start.sh +15 -0
- data/dev/stop.sh +5 -0
- data/docker-compose.yml +30 -0
- data/features/authentication/authenticate.feature +34 -0
- data/features/authentication/login.feature +13 -0
- data/features/authentication/logout.feature +15 -0
- data/{acceptance-features → features}/authentication/whoami.feature +0 -0
- data/features/authorization/resource/annotate.feature +22 -0
- data/features/authorization/resource/check.feature +47 -0
- data/{acceptance-features → features}/authorization/resource/exists.feature +18 -6
- data/features/authorization/resource/permitted_roles.feature +35 -0
- data/features/authorization/resource/show.feature +34 -0
- data/features/authorization/role/exists.feature +28 -0
- data/features/authorization/role/members.feature +45 -0
- data/features/authorization/role/memberships.feature +43 -0
- data/features/conjurenv/check.feature +34 -0
- data/features/conjurenv/run.feature +15 -0
- data/{acceptance-features → features}/conjurenv/template.feature +8 -3
- data/{acceptance-features → features}/directory/user/update_password.feature +8 -2
- data/{acceptance-features → features}/directory/variable/value.feature +9 -5
- data/{acceptance-features → features}/directory/variable/values-add.feature +8 -3
- data/features/hostfactory/tokens.feature +22 -0
- data/features/pubkeys/show.feature +18 -0
- data/features/step_definitions/authn_steps.rb +22 -0
- data/features/step_definitions/cli_steps.rb +28 -0
- data/features/step_definitions/file_steps.rb +12 -0
- data/features/step_definitions/flow_control_steps.rb +7 -0
- data/features/step_definitions/graph_steps.rb +4 -3
- data/{acceptance-features → features}/step_definitions/http_steps.rb +0 -0
- data/features/step_definitions/overrides.rb +9 -0
- data/features/step_definitions/policy_steps.rb +11 -0
- data/{acceptance-features → features}/step_definitions/trusted_proxy_steps.rb +0 -0
- data/features/support/blank.yml +1 -0
- data/features/support/env.rb +21 -7
- data/features/support/hooks.rb +31 -116
- data/features/support/world.rb +16 -76
- data/jenkins.sh +33 -0
- data/lib/conjur/authenticator.rb +83 -0
- data/lib/conjur/authn.rb +5 -20
- data/lib/conjur/cli.rb +13 -6
- data/lib/conjur/command.rb +30 -350
- data/lib/conjur/command/authn.rb +23 -15
- data/lib/conjur/command/host_factories.rb +2 -74
- data/lib/conjur/command/hosts.rb +6 -113
- data/lib/conjur/command/init.rb +20 -35
- data/lib/conjur/command/{secrets.rb → policies.rb} +33 -22
- data/lib/conjur/command/pubkeys.rb +3 -63
- data/lib/conjur/command/resources.rb +45 -162
- data/lib/conjur/command/roles.rb +11 -181
- data/lib/conjur/command/rspec/helpers.rb +0 -1
- data/lib/conjur/command/rspec/mock_services.rb +4 -4
- data/lib/conjur/command/users.rb +2 -159
- data/lib/conjur/command/variables.rb +5 -218
- data/lib/conjur/complete.rb +2 -2
- data/lib/conjur/config.rb +1 -11
- data/lib/conjur/conjurenv.rb +12 -9
- data/lib/conjur/identifier_manipulation.rb +3 -5
- data/lib/conjur/version.rb +2 -2
- data/{publish-rubygem.sh → publish.sh} +0 -4
- data/spec/authn_spec.rb +4 -0
- data/spec/command/hosts_spec.rb +2 -69
- data/spec/command/init_spec.rb +16 -11
- data/spec/command/pubkeys_spec.rb +1 -46
- data/spec/command/resources_spec.rb +21 -170
- data/spec/command/roles_spec.rb +5 -181
- data/spec/command/users_spec.rb +3 -79
- data/spec/command_spec.rb +1 -20
- data/spec/complete_spec.rb +1 -23
- data/spec/config_spec.rb +1 -1
- data/spec/spec_helper.rb +4 -5
- data/test.sh +29 -25
- metadata +92 -212
- data/.githooks/pre_commit/run_specs.rb +0 -23
- data/Dockerfile +0 -15
- data/Dockerfile.fpm +0 -18
- data/Dockerfile.publish +0 -12
- data/Dockerfile.standalone +0 -33
- data/Dockerfile.validate-packaging +0 -9
- data/VERSION +0 -1
- data/acceptance-features/audit/audit_event_send.feature +0 -107
- data/acceptance-features/audit/fetch.feature +0 -16
- data/acceptance-features/audit/send.feature +0 -51
- data/acceptance-features/authentication/authenticate.feature +0 -10
- data/acceptance-features/authentication/login.feature +0 -12
- data/acceptance-features/authentication/logout.feature +0 -13
- data/acceptance-features/authorization/resource/annotate.feature +0 -35
- data/acceptance-features/authorization/resource/check.feature +0 -24
- data/acceptance-features/authorization/resource/create.feature +0 -21
- data/acceptance-features/authorization/resource/deny.feature +0 -12
- data/acceptance-features/authorization/resource/give.feature +0 -24
- data/acceptance-features/authorization/resource/permit.feature +0 -20
- data/acceptance-features/authorization/resource/permitted_roles.feature +0 -16
- data/acceptance-features/authorization/resource/show.feature +0 -28
- data/acceptance-features/authorization/role/create.feature +0 -13
- data/acceptance-features/authorization/role/exists.feature +0 -19
- data/acceptance-features/authorization/role/grant_to.feature +0 -21
- data/acceptance-features/authorization/role/graph.feature +0 -57
- data/acceptance-features/authorization/role/members.feature +0 -23
- data/acceptance-features/authorization/role/memberships.feature +0 -27
- data/acceptance-features/bootstrap.feature +0 -13
- data/acceptance-features/conjurenv/check.feature +0 -21
- data/acceptance-features/conjurenv/run.feature +0 -10
- data/acceptance-features/directory/group/create.feature +0 -20
- data/acceptance-features/directory/group/retire.feature +0 -54
- data/acceptance-features/directory/host/create.feature +0 -23
- data/acceptance-features/directory/host/retire.feature +0 -6
- data/acceptance-features/directory/hostfactory/create.feature +0 -28
- data/acceptance-features/directory/hostfactory/tokens.feature +0 -16
- data/acceptance-features/directory/layer/create.feature +0 -10
- data/acceptance-features/directory/layer/hosts-add.feature +0 -9
- data/acceptance-features/directory/layer/hosts-remove.feature +0 -10
- data/acceptance-features/directory/layer/retire.feature +0 -43
- data/acceptance-features/directory/user/create.feature +0 -23
- data/acceptance-features/directory/user/retire.feature +0 -6
- data/acceptance-features/directory/variable/create.feature +0 -14
- data/acceptance-features/directory/variable/retire.feature +0 -17
- data/acceptance-features/dsl/policy_owner.feature +0 -45
- data/acceptance-features/dsl/resource_owner.feature +0 -17
- data/acceptance-features/dsl/retire.feature +0 -15
- data/acceptance-features/global-privilege/elevate.feature +0 -20
- data/acceptance-features/global-privilege/reveal.privilege +0 -20
- data/acceptance-features/pubkeys/add.feature +0 -22
- data/acceptance-features/pubkeys/delete.feature +0 -9
- data/acceptance-features/pubkeys/names.feature +0 -26
- data/acceptance-features/pubkeys/show.feature +0 -27
- data/acceptance-features/step_definitions/cli_steps.rb +0 -57
- data/acceptance-features/step_definitions/graph_steps.rb +0 -22
- data/acceptance-features/step_definitions/user_steps.rb +0 -51
- data/acceptance-features/support/env.rb +0 -23
- data/acceptance-features/support/hooks.rb +0 -178
- data/acceptance-features/support/world.rb +0 -176
- data/acceptance-features/trusted_proxies.feature +0 -82
- data/bin/conjurize +0 -26
- data/bin/jsonfield +0 -70
- data/build-standalone +0 -6
- data/deprecations.sh +0 -38
- data/features/conjurize.feature +0 -134
- data/features/dsl_context.feature +0 -36
- data/features/dsl_host_create.feature +0 -11
- data/features/dsl_ownership.feature +0 -30
- data/features/dsl_permission.feature +0 -45
- data/features/dsl_resource_create.feature +0 -23
- data/features/dsl_role_create.feature +0 -11
- data/features/dsl_user_create.feature +0 -23
- data/features/jsonfield.feature +0 -49
- data/features/role_graph.feature +0 -58
- data/features/step_definitions/conjurize_steps.rb +0 -5
- data/features/step_definitions/dsl_steps.rb +0 -52
- data/features/support/conjur.conf +0 -6
- data/lib/conjur/command/assets.rb +0 -121
- data/lib/conjur/command/audit.rb +0 -155
- data/lib/conjur/command/bootstrap.rb +0 -129
- data/lib/conjur/command/dsl_command.rb +0 -75
- data/lib/conjur/command/elevate.rb +0 -76
- data/lib/conjur/command/field.rb +0 -45
- data/lib/conjur/command/groups.rb +0 -208
- data/lib/conjur/command/ids.rb +0 -34
- data/lib/conjur/command/layers.rb +0 -211
- data/lib/conjur/command/ldapsync.rb +0 -118
- data/lib/conjur/command/rspec/audit_helpers.rb +0 -68
- data/lib/conjur/command/rubydsl.rb +0 -93
- data/lib/conjur/command/script.rb +0 -48
- data/lib/conjur/command/server.rb +0 -67
- data/lib/conjur/conjurize.rb +0 -71
- data/lib/conjur/conjurize/script.rb +0 -150
- data/lib/conjur/dsl/runner.rb +0 -273
- data/publish-deb.sh +0 -6
- data/push-image +0 -29
- data/spec/command/assets_spec.rb +0 -115
- data/spec/command/audit_spec.rb +0 -376
- data/spec/command/elevate_spec.rb +0 -28
- data/spec/command/env_spec.rb +0 -168
- data/spec/command/groups_spec.rb +0 -77
- data/spec/command/host_factories_spec.rb +0 -38
- data/spec/command/layers_spec.rb +0 -35
- data/spec/command/ldapsync_spec.rb +0 -28
- data/spec/command/rubydsl_spec.rb +0 -63
- data/spec/command/variable_expiration_spec.rb +0 -164
- data/spec/command/variables_spec.rb +0 -192
- data/spec/conjurize/script_spec.rb +0 -62
- data/spec/conjurize_spec.rb +0 -70
- data/spec/dsl/runner_spec.rb +0 -93
- data/spec/env_spec.rb +0 -214
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Conjur::Command::Elevate do
|
|
4
|
-
describe_command "elevate user show alice" do
|
|
5
|
-
include_context "with mock authn"
|
|
6
|
-
|
|
7
|
-
let(:token) { {login: 'dknuth'} }
|
|
8
|
-
before{
|
|
9
|
-
expect(Conjur::Authn).to receive(:connect).and_return(api)
|
|
10
|
-
}
|
|
11
|
-
it "invokes the sub-command with X-Conjur-Privilege header" do
|
|
12
|
-
allow_any_instance_of(Conjur::API).to receive(:token).and_return(token)
|
|
13
|
-
expect(Conjur::Command).to receive(:api=) do |api|
|
|
14
|
-
expect(api.api_key).to eq("sekrit")
|
|
15
|
-
expect(api.privilege).to eq("elevate")
|
|
16
|
-
end.and_call_original
|
|
17
|
-
|
|
18
|
-
expect(RestClient::Request).to receive(:execute).with({
|
|
19
|
-
method: :get,
|
|
20
|
-
url: "https://core.example.com/api/users/alice",
|
|
21
|
-
username: "dknuth",
|
|
22
|
-
headers: {:authorization=>"Token token=\"eyJsb2dpbiI6ImRrbnV0aCJ9\"", x_conjur_privilege: "elevate"}
|
|
23
|
-
}).and_return(double(:response, body: "[]"))
|
|
24
|
-
|
|
25
|
-
invoke
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
data/spec/command/env_spec.rb
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conjur/conjurenv'
|
|
3
|
-
require 'tempfile'
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
shared_examples_for "processes environment definition" do |cmd, options|
|
|
7
|
-
before { # suspend all interaction with the environment
|
|
8
|
-
allow(Kernel).to receive(:system).and_return(true)
|
|
9
|
-
}
|
|
10
|
-
let(:stub_object) { double(obtain:{}, check:{}) }
|
|
11
|
-
|
|
12
|
-
describe_command "env:#{cmd} #{options}" do
|
|
13
|
-
it "uses .conjurenv file by default" do
|
|
14
|
-
expect(Conjur::Env).to receive(:new).with(file:".conjurenv").and_return(stub_object)
|
|
15
|
-
invoke
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
describe_command "env:#{cmd} -c somefile #{options}" do
|
|
20
|
-
it "uses desired file" do
|
|
21
|
-
expect(Conjur::Env).to receive(:new).with(file:"somefile").and_return(stub_object)
|
|
22
|
-
invoke
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
describe_command "env:#{cmd} --yaml someyaml #{options}" do
|
|
27
|
-
it "uses inline yaml" do
|
|
28
|
-
expect(Conjur::Env).to receive(:new).with(yaml:"someyaml").and_return(stub_object)
|
|
29
|
-
invoke
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
describe_command "env:#{cmd} -c somefile --yaml someyaml #{options}" do
|
|
34
|
-
it "refuses to accept mutually exclusive options" do
|
|
35
|
-
expect(Conjur::Env).not_to receive(:new)
|
|
36
|
-
expect { invoke }.to raise_error /Options -c and --yaml can not be provided together/
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
shared_examples_for "accepts policy option" do |cmd, options|
|
|
42
|
-
before { # suspend all interaction with the environment
|
|
43
|
-
allow(Kernel).to receive(:system).and_return(true)
|
|
44
|
-
}
|
|
45
|
-
let(:stub_object) { double(obtain:{}, check:{}) }
|
|
46
|
-
describe_command "env:#{cmd} --policy foobar #{options}" do
|
|
47
|
-
it "uses .conjurenv file by default" do
|
|
48
|
-
expect(Conjur::Env).to receive(:new).with(file:".conjurenv", substitutions: { "$policy" => "foobar" }).and_return(stub_object)
|
|
49
|
-
invoke
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
describe Conjur::Command::Env, logged_in: true do
|
|
55
|
-
|
|
56
|
-
let(:stub_env) { double() }
|
|
57
|
-
describe ":check" do
|
|
58
|
-
it_behaves_like "processes environment definition", "check", ''
|
|
59
|
-
it_behaves_like "accepts policy option", "check", ''
|
|
60
|
-
|
|
61
|
-
describe_command "env:check" do
|
|
62
|
-
before { expect(Conjur::Env).to receive(:new).and_return(stub_env) }
|
|
63
|
-
describe "without api errors" do
|
|
64
|
-
let(:stub_result) { { "a" => :available, "b"=> :available } }
|
|
65
|
-
before {
|
|
66
|
-
expect(stub_env).to receive(:check).with(an_instance_of(Conjur::API)).and_return(stub_result)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
describe "if all variables are available" do
|
|
70
|
-
it "prints #check result to the output" do
|
|
71
|
-
expect { invoke }.to write "a: available\nb: available\n"
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
it "does not crash" do
|
|
75
|
-
expect { invoke }.to_not raise_error
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
describe "if some variables are unavailable" do
|
|
80
|
-
let(:stub_result) { { "a" => :unavailable, "b"=> :available } }
|
|
81
|
-
it "prints #check result to the output" do
|
|
82
|
-
expect { invoke rescue true }.to write "a: unavailable\nb: available\n"
|
|
83
|
-
end
|
|
84
|
-
it "crashes in the end" do
|
|
85
|
-
expect { invoke }.to raise_error "Some variables are not available"
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
it 'does not rescue unexpected errors' do
|
|
90
|
-
expect(stub_env).to receive(:check).with(an_instance_of(Conjur::API)) { raise "Custom error" }
|
|
91
|
-
expect { invoke }.to raise_error "Custom error"
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
describe ":run" do
|
|
97
|
-
it_behaves_like "processes environment definition", "run","-- extcmd"
|
|
98
|
-
it_behaves_like "accepts policy option", "run", '-- extcmd'
|
|
99
|
-
describe_command "env:run" do
|
|
100
|
-
it 'fails because of missing argument' do
|
|
101
|
-
expect(Kernel).not_to receive(:system)
|
|
102
|
-
expect { invoke }.to raise_error "External command with optional arguments should be provided"
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
describe_command "env:run -- extcmd --arg1 arg2" do
|
|
106
|
-
before {
|
|
107
|
-
expect(Conjur::Env).to receive(:new).and_return(stub_env)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
describe "if no errors are raised" do
|
|
111
|
-
let(:stub_result) { { "a" => "value_a", "b" => "value_b" } }
|
|
112
|
-
before {
|
|
113
|
-
expect(stub_env).to receive(:obtain).with(an_instance_of(Conjur::API)).and_return(stub_result)
|
|
114
|
-
}
|
|
115
|
-
it "performs #exec with environment (names in uppercase)" do
|
|
116
|
-
expect(Kernel).to receive(:system).with({"A"=>"value_a", "B"=>"value_b"}, "extcmd", "--arg1","arg2").and_return(true)
|
|
117
|
-
invoke
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
it "does not rescue unexpected errors" do
|
|
121
|
-
expect(stub_env).to receive(:obtain).with(an_instance_of(Conjur::API)) { raise "Custom error" }
|
|
122
|
-
expect { invoke }.to raise_error "Custom error"
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
describe ":template" do
|
|
128
|
-
context do
|
|
129
|
-
before { # prevent real operation
|
|
130
|
-
allow(File).to receive(:readable?).with("config.erb").and_return(true)
|
|
131
|
-
allow(File).to receive(:read).with("config.erb").and_return("template")
|
|
132
|
-
allow(ERB).to receive(:new).and_return(double(result:''))
|
|
133
|
-
allow(Tempfile).to receive(:new).and_return(double(write: true, close: true, path: 'somepath'))
|
|
134
|
-
allow(FileUtils).to receive(:copy).and_return(true)
|
|
135
|
-
}
|
|
136
|
-
it_behaves_like "processes environment definition", "template","config.erb"
|
|
137
|
-
it_behaves_like "accepts policy option", "template", 'config.erb'
|
|
138
|
-
end
|
|
139
|
-
describe_command "env:template" do
|
|
140
|
-
it 'fails because of missing argument' do
|
|
141
|
-
expect(Tempfile).not_to receive(:new)
|
|
142
|
-
expect { invoke }.to raise_error "Location of readable ERB template should be provided"
|
|
143
|
-
end
|
|
144
|
-
end
|
|
145
|
-
describe_command "env:template config.erb" do
|
|
146
|
-
let(:erb_template) { """
|
|
147
|
-
variable <%= conjurenv['a'] %>
|
|
148
|
-
other variable <%= conjurenv['b'] %>
|
|
149
|
-
"""
|
|
150
|
-
}
|
|
151
|
-
before {
|
|
152
|
-
allow(File).to receive(:readable?).with("config.erb").and_return(true)
|
|
153
|
-
allow(File).to receive(:read).with("config.erb").and_return(erb_template)
|
|
154
|
-
expect(Conjur::Env).to receive(:new).and_return(stub_env)
|
|
155
|
-
expect(stub_env).to receive(:obtain).with(an_instance_of(Conjur::API)).and_return( {"a"=>"value_a","b"=>"value_b","c"=>"value_c"} )
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
it "creates persistent tempfile, saves rendered template into it, prints out name of the file" do
|
|
159
|
-
stubpath="/tmp/temp.file"
|
|
160
|
-
tempfile=double(close: true, path: stubpath)
|
|
161
|
-
expect(Tempfile).to receive(:new).and_return(tempfile)
|
|
162
|
-
expect(tempfile).to receive(:write).with("\nvariable value_a\nother variable value_b\n")
|
|
163
|
-
expect(FileUtils).to receive(:copy).with(stubpath,stubpath+'.saved') # avoid garbage collection
|
|
164
|
-
expect { invoke }.to write stubpath+".saved"
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
end
|
data/spec/command/groups_spec.rb
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Conjur::Command::Groups, logged_in: true do
|
|
4
|
-
describe_command 'group create --gidnumber 12345 some-group' do
|
|
5
|
-
it "creates the group with a specified gidnumber" do
|
|
6
|
-
expect_any_instance_of(Conjur::API).to receive(:create_group).with('some-group', gidnumber: 12345).and_return "something"
|
|
7
|
-
expect { invoke }.to write "something"
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
describe_command 'group update --gidnumber 12345 some-group' do
|
|
12
|
-
it "updates the gid" do
|
|
13
|
-
expect_any_instance_of(Conjur::API).to \
|
|
14
|
-
receive(:group).with('some-group').and_return(group = double("group"))
|
|
15
|
-
expect(group).to receive(:update).with(gidnumber: 12_345)
|
|
16
|
-
expect { invoke }.to write "GID set"
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
context "lookup by GID" do
|
|
21
|
-
let(:search_result) { %w(g1 g2) }
|
|
22
|
-
describe_command "group gidsearch 12345" do
|
|
23
|
-
it "finds the groups" do
|
|
24
|
-
expect_any_instance_of(Conjur::API).to \
|
|
25
|
-
receive(:find_groups).with(gidnumber: 12_345).and_return search_result
|
|
26
|
-
expect { invoke }.to write(JSON.pretty_generate(search_result))
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
describe_command "group:members:add group user:alice" do
|
|
32
|
-
it "adds the role to the group" do
|
|
33
|
-
expect(RestClient::Request).to receive(:execute).with({
|
|
34
|
-
method: :put,
|
|
35
|
-
url: "https://authz.example.com/the-account/roles/group/group/?members&member=user:alice",
|
|
36
|
-
headers: {},
|
|
37
|
-
payload: nil
|
|
38
|
-
})
|
|
39
|
-
invoke
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
describe_command "group:members:add -a group user:alice" do
|
|
44
|
-
it "adds the role to the group with admin option" do
|
|
45
|
-
expect(RestClient::Request).to receive(:execute).with({
|
|
46
|
-
method: :put,
|
|
47
|
-
url: "https://authz.example.com/the-account/roles/group/group/?members&member=user:alice",
|
|
48
|
-
headers: {},
|
|
49
|
-
payload: { admin_option: true }
|
|
50
|
-
})
|
|
51
|
-
invoke
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
describe_command "group:members:add -a group alice" do
|
|
55
|
-
it "assumes that a nake member name is a user" do
|
|
56
|
-
expect(RestClient::Request).to receive(:execute).with({
|
|
57
|
-
method: :put,
|
|
58
|
-
url: "https://authz.example.com/the-account/roles/group/group/?members&member=user:alice",
|
|
59
|
-
headers: {},
|
|
60
|
-
payload: { admin_option: true }
|
|
61
|
-
})
|
|
62
|
-
invoke
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
describe_command "group:members:add -r group alice" do
|
|
67
|
-
it "revokes the admin rights" do
|
|
68
|
-
expect(RestClient::Request).to receive(:execute).with({
|
|
69
|
-
method: :put,
|
|
70
|
-
url: "https://authz.example.com/the-account/roles/group/group/?members&member=user:alice",
|
|
71
|
-
headers: {},
|
|
72
|
-
payload: { admin_option: false }
|
|
73
|
-
})
|
|
74
|
-
invoke
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conjur/command/host_factories'
|
|
3
|
-
|
|
4
|
-
describe Conjur::Command::HostFactories, :logged_in => true do
|
|
5
|
-
let (:group_memberships) { double(:group_memberships, :roleid => 'the-account:group:security_admin') }
|
|
6
|
-
let (:current_role) { double(:current_role, roleid: 'the-account:user:dknuth', :memberships => [ double(:current_role_role, roleid: 'the-account:user:dknuth') ]) }
|
|
7
|
-
let (:group_members) { double(:layer_members, :member => double(:member, :roleid => 'the-account:user:dknuth'), :admin_option => true ) }
|
|
8
|
-
let (:group) { double(:group, roleid: 'the-account:group:the-group', :exists? => true, :memberships => [group_memberships], :members => [group_members]) }
|
|
9
|
-
let (:layer_members) { double(:layer_members, :member => double(:member, :roleid => 'the-account:group:security_admin'), :admin_option => true ) }
|
|
10
|
-
let (:layer_role) { double(:layer_role, roleid: 'the-account:layer:layer1', :members => [layer_members]) }
|
|
11
|
-
let (:layer) { double(:layer, :exists? => true, :role => layer_role) }
|
|
12
|
-
|
|
13
|
-
before do
|
|
14
|
-
allow(Conjur::Command.api).to receive(:role).with("user:dknuth").and_return current_role
|
|
15
|
-
allow(Conjur::Command.api).to receive(:role).with("the-account:group:the-group").and_return group
|
|
16
|
-
allow(Conjur::Command.api).to receive(:layer).with("layer1").and_return layer
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
describe_command 'hostfactory:create --as-group the-group --layer layer1 hf1 ' do
|
|
20
|
-
it 'calls api.create_host_factory and prints the results' do
|
|
21
|
-
expect_any_instance_of(Conjur::API).to receive(:create_host_factory).and_return '{}'
|
|
22
|
-
expect { invoke }.to write('{}')
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
context 'command-line errors' do
|
|
27
|
-
describe_command 'hostfactory:create hf1' do
|
|
28
|
-
it "fails without owner" do
|
|
29
|
-
expect {invoke}.to raise_error('Use --as-group or --as-role to indicate the host factory role')
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
describe_command 'hostfactory:create --as-group the-group hf' do
|
|
33
|
-
it "fails without layer" do
|
|
34
|
-
expect {invoke}.to raise_error('Provide at least one layer')
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
data/spec/command/layers_spec.rb
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Conjur::Command::Layers, logged_in: true do
|
|
4
|
-
let(:layer) { double(:layer) }
|
|
5
|
-
|
|
6
|
-
[ "layer hosts add", "layer:hosts:add" ].each do |cmd|
|
|
7
|
-
describe_command "#{cmd} the-layer the-host" do
|
|
8
|
-
it "adds a host id to the layer" do
|
|
9
|
-
expect_any_instance_of(Conjur::API).to receive(:layer).with("the-layer").and_return layer
|
|
10
|
-
expect(layer).to receive(:add_host).with("the-account:host:the-host")
|
|
11
|
-
|
|
12
|
-
expect { invoke }.to write("Host added")
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
describe_command "#{cmd} the-layer host:the-host" do
|
|
16
|
-
it "adds a qualified host id to the layer" do
|
|
17
|
-
expect_any_instance_of(Conjur::API).to receive(:layer).with("the-layer").and_return layer
|
|
18
|
-
expect(layer).to receive(:add_host).with("host:the-host")
|
|
19
|
-
|
|
20
|
-
expect { invoke }.to write("Host added")
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
[ "layer hosts remove", "layer:hosts:remove" ].each do |cmd|
|
|
26
|
-
describe_command "#{cmd} the-layer the-host" do
|
|
27
|
-
it "adds a host to the layer" do
|
|
28
|
-
expect_any_instance_of(Conjur::API).to receive(:layer).with("the-layer").and_return layer
|
|
29
|
-
expect(layer).to receive(:remove_host).with("the-account:host:the-host")
|
|
30
|
-
|
|
31
|
-
expect { invoke }.to write("Host removed")
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Conjur::Command::LDAPSync, logged_in: true do
|
|
4
|
-
|
|
5
|
-
let (:policy_response) { { 'ok' => true, 'events' => [], 'policy' => <<eop
|
|
6
|
-
"---
|
|
7
|
-
- !user
|
|
8
|
-
annotations:
|
|
9
|
-
ldap-sync/source: ldap-server:389
|
|
10
|
-
ldap-sync/upstream-dn: CN=Administrator,OU=functest,OU=testdata,OU=dev-ci,DC=dev-ci,DC=conjur
|
|
11
|
-
id: Administrator
|
|
12
|
-
uidnumber:"}
|
|
13
|
-
eop
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
describe_command "ldap-sync policy show" do
|
|
18
|
-
|
|
19
|
-
before do
|
|
20
|
-
expect_any_instance_of(Conjur::API).to receive(:ldap_sync_policy).with('default').and_return policy_response
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
it "shows the policy" do
|
|
24
|
-
expect { invoke }.to write policy_response['policy']
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
end
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conjur/dsl/runner'
|
|
3
|
-
|
|
4
|
-
describe Conjur::Command::RubyDSL do
|
|
5
|
-
context "when logged in", logged_in: true do
|
|
6
|
-
let(:role) do
|
|
7
|
-
double("role", exists?: true, api_key: "the-api-key", roleid: "the-role")
|
|
8
|
-
end
|
|
9
|
-
let(:resource) do
|
|
10
|
-
double("resource", exists?: true).as_null_object
|
|
11
|
-
end
|
|
12
|
-
before {
|
|
13
|
-
allow(File).to receive(:read).and_call_original
|
|
14
|
-
allow(File).to receive(:exists?).and_call_original
|
|
15
|
-
allow(File).to receive(:exists?).with("policy.rb").and_return true
|
|
16
|
-
allow(File).to receive(:read).with("policy.rb").and_return "{}"
|
|
17
|
-
allow_any_instance_of(Conjur::DSL::Runner).to receive(:api).and_return api
|
|
18
|
-
}
|
|
19
|
-
before {
|
|
20
|
-
allow(api).to receive(:role).and_call_original
|
|
21
|
-
allow(api).to receive(:resource).and_call_original
|
|
22
|
-
allow(api).to receive(:role).with("the-account:policy:#{collection}/the-policy-1.0.0").and_return role
|
|
23
|
-
allow(api).to receive(:resource).with("the-account:policy:#{collection}/the-policy-1.0.0").and_return resource
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
describe_command 'rubydsl:load --collection the-collection http://example.com/policy.rb' do
|
|
27
|
-
let(:collection) { "the-collection" }
|
|
28
|
-
before {
|
|
29
|
-
allow(File).to receive(:exists?).with("http://example.com/policy.rb").and_return false
|
|
30
|
-
allow(URI).to receive(:parse).with("http://example.com/policy.rb").and_return double(:uri, read: "{}")
|
|
31
|
-
}
|
|
32
|
-
it "creates the policy" do
|
|
33
|
-
expect(invoke).to eq(0)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
describe_command 'rubydsl:load --collection the-collection policy.rb' do
|
|
37
|
-
let(:collection) { "the-collection" }
|
|
38
|
-
it "creates the policy" do
|
|
39
|
-
expect(invoke).to eq(0)
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
context "default collection" do
|
|
43
|
-
let(:collection) { "alice@localhost" }
|
|
44
|
-
before {
|
|
45
|
-
stub_const("ENV", "USER" => "alice", "HOSTNAME" => "localhost")
|
|
46
|
-
}
|
|
47
|
-
describe_command 'rubydsl:load --as-group the-group policy.rb' do
|
|
48
|
-
let(:group) { double(:group, exists?: true) }
|
|
49
|
-
it "creates the policy" do
|
|
50
|
-
allow(Conjur::Command.api).to receive(:role).with("the-account:group:the-group").and_return group
|
|
51
|
-
expect_any_instance_of(Conjur::DSL::Runner).to receive(:owner=).with("the-account:group:the-group")
|
|
52
|
-
|
|
53
|
-
expect(invoke).to eq(0)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
describe_command 'rubydsl:load policy.rb' do
|
|
57
|
-
it "creates the policy with default collection" do
|
|
58
|
-
expect(invoke).to eq(0)
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conjur/command/variables'
|
|
3
|
-
|
|
4
|
-
describe Conjur::Command::Variables, :logged_in => true do
|
|
5
|
-
let (:variable) { double(:name => 'foo') }
|
|
6
|
-
let (:incompatible_server_msg) { /not supported/ }
|
|
7
|
-
|
|
8
|
-
context "expiring a variable" do
|
|
9
|
-
|
|
10
|
-
let (:duration) { nil }
|
|
11
|
-
|
|
12
|
-
context "with valid arguments" do
|
|
13
|
-
before do
|
|
14
|
-
expect(RestClient::Request).to receive(:execute).with({
|
|
15
|
-
:method => :post,
|
|
16
|
-
:url => 'https://core.example.com/api/variables/foo/expiration',
|
|
17
|
-
:headers => {},
|
|
18
|
-
:payload => {:duration => duration}
|
|
19
|
-
}).and_return(double('response', :body => '{}'))
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
shared_examples 'it sets variable expiration' do
|
|
23
|
-
it do
|
|
24
|
-
expect {invoke}.to write
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
describe_command 'variable:expire --now foo' do
|
|
29
|
-
let (:duration) { 'P0Y' }
|
|
30
|
-
it_behaves_like 'it sets variable expiration'
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
describe_command 'variable:expire --days 1 foo' do
|
|
34
|
-
let (:duration) { 'P1D' }
|
|
35
|
-
it_behaves_like 'it sets variable expiration'
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
describe_command 'variable:expire --months 1 foo' do
|
|
39
|
-
let (:duration) { 'P1M' }
|
|
40
|
-
it_behaves_like 'it sets variable expiration'
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
describe_command 'variable:expire --in PT1M foo' do
|
|
44
|
-
let (:duration) { 'PT1M' }
|
|
45
|
-
it_behaves_like 'it sets variable expiration'
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
describe_command 'variable:expire --now --days 1 foo' do
|
|
51
|
-
it "fails" do
|
|
52
|
-
expect { invoke_silently }.to raise_error GLI::CustomExit
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
describe_command 'variable:expire' do
|
|
58
|
-
it 'should fail' do
|
|
59
|
-
expect { invoke_silently }.to raise_error RuntimeError
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
context "getting variable expirations" do
|
|
66
|
-
context "with valid arguments" do
|
|
67
|
-
let (:expected_params) { nil }
|
|
68
|
-
let (:expected_headers) { {}.tap {|h| h.merge!(:params => expected_params) if expected_params} }
|
|
69
|
-
before do
|
|
70
|
-
expect(RestClient::Request).to receive(:execute).with({
|
|
71
|
-
:method => :get,
|
|
72
|
-
:url => 'https://core.example.com/api/variables/expirations',
|
|
73
|
-
:headers => expected_headers
|
|
74
|
-
}).and_return(double('response', :body => '[]'))
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
shared_examples 'it writes expiration list' do
|
|
78
|
-
it do
|
|
79
|
-
expect { invoke }.to write "[\n\n]\n"
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
describe_command 'variable:expirations' do
|
|
84
|
-
it_behaves_like 'it writes expiration list'
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
describe_command 'variable:expirations --days 1' do
|
|
88
|
-
let (:expected_params) { { :duration => 'P1D' } }
|
|
89
|
-
it_behaves_like 'it writes expiration list'
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
describe_command 'variable:expirations --months 1' do
|
|
93
|
-
let (:expected_params) { { :duration => 'P1M' } }
|
|
94
|
-
it_behaves_like 'it writes expiration list'
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
describe_command 'variable:expirations --in P1D' do
|
|
98
|
-
let (:expected_params) { { :duration => 'P1D' } }
|
|
99
|
-
it_behaves_like 'it writes expiration list'
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
let(:certificate) do
|
|
106
|
-
OpenSSL::X509::Certificate.new.tap do |cert|
|
|
107
|
-
key = OpenSSL::PKey::RSA.new 512
|
|
108
|
-
cert.public_key = key.public_key
|
|
109
|
-
cert.not_before = Time.now
|
|
110
|
-
cert.not_after = 1.minute.from_now
|
|
111
|
-
cert.sign key, OpenSSL::Digest::SHA256.new
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
let(:certfile) do
|
|
116
|
-
Tempfile.new("cert").tap do |file|
|
|
117
|
-
file.write certificate.to_pem
|
|
118
|
-
file.close
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
context 'connecting to incompatible server version while' do
|
|
123
|
-
before do
|
|
124
|
-
allow(Conjur.config).to receive_messages \
|
|
125
|
-
cert_file: certfile.path,
|
|
126
|
-
appliance_url: core_host
|
|
127
|
-
|
|
128
|
-
expect(RestClient::Request).to receive(:execute).with({
|
|
129
|
-
:method => :get,
|
|
130
|
-
:url => "https://core.example.com/info",
|
|
131
|
-
:headers => {}
|
|
132
|
-
}).and_raise(RestClient::ResourceNotFound)
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
context 'setting variable expiration' do
|
|
136
|
-
describe_command 'variable:expire --days 1 foo' do
|
|
137
|
-
it 'should display error message' do
|
|
138
|
-
expect(RestClient::Request).to receive(:execute).with({
|
|
139
|
-
:method => :post,
|
|
140
|
-
:url => "https://core.example.com/api/variables/foo/expiration",
|
|
141
|
-
:headers => {},
|
|
142
|
-
:payload => anything
|
|
143
|
-
}).and_raise(RestClient::ResourceNotFound)
|
|
144
|
-
expect { invoke }.to raise_error(RestClient::ResourceNotFound)
|
|
145
|
-
.and write(incompatible_server_msg).to(:stderr)
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
context 'getting variable expirations' do
|
|
151
|
-
describe_command 'variable:expirations' do
|
|
152
|
-
it 'should display error message' do
|
|
153
|
-
expect(RestClient::Request).to receive(:execute).with({
|
|
154
|
-
:method => :get,
|
|
155
|
-
:url => 'https://core.example.com/api/variables/expirations',
|
|
156
|
-
:headers => {}
|
|
157
|
-
}).and_raise(RestClient::ResourceNotFound)
|
|
158
|
-
expect { invoke }.to raise_error(RestClient::ResourceNotFound)
|
|
159
|
-
.and write(incompatible_server_msg).to(:stderr)
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
end
|