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
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
Feature: List members of a role
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given I load the policy:
|
|
5
|
+
"""
|
|
6
|
+
- !user alice
|
|
7
|
+
|
|
8
|
+
- !group cooks
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
Scenario: Role members list is initally just the creator of the role
|
|
12
|
+
When I successfully run `conjur role members group:cooks`
|
|
13
|
+
Then the JSON should be:
|
|
14
|
+
"""
|
|
15
|
+
[
|
|
16
|
+
"cucumber:user:admin"
|
|
17
|
+
]
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
Scenario: Members can be added to the role by granting them the role
|
|
21
|
+
Given I apply the policy:
|
|
22
|
+
"""
|
|
23
|
+
- !grant
|
|
24
|
+
role: !group cooks
|
|
25
|
+
member: !user alice
|
|
26
|
+
"""
|
|
27
|
+
When I successfully run `conjur role members group:cooks`
|
|
28
|
+
Then the JSON should have 2 entries
|
|
29
|
+
|
|
30
|
+
Scenario: Members list is not expanded transitively
|
|
31
|
+
Given I apply the policy:
|
|
32
|
+
"""
|
|
33
|
+
- !group employees
|
|
34
|
+
|
|
35
|
+
- !grant
|
|
36
|
+
role: !group employees
|
|
37
|
+
member: !group cooks
|
|
38
|
+
|
|
39
|
+
- !grant
|
|
40
|
+
role: !group cooks
|
|
41
|
+
member: !user alice
|
|
42
|
+
"""
|
|
43
|
+
When I successfully run `conjur role members group:cooks`
|
|
44
|
+
Then the JSON should have 2 entries
|
|
45
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
Feature: List memberships of a role
|
|
2
|
+
|
|
3
|
+
Scenario: The role memberships list includes the role itself
|
|
4
|
+
Given I load the policy:
|
|
5
|
+
"""
|
|
6
|
+
- !group cooks
|
|
7
|
+
"""
|
|
8
|
+
When I successfully run `conjur role memberships group:cooks`
|
|
9
|
+
Then the JSON should have 1 entries
|
|
10
|
+
|
|
11
|
+
Scenario: Memberships can be added to a role by granting it a new role
|
|
12
|
+
Given I load the policy:
|
|
13
|
+
"""
|
|
14
|
+
- !group employees
|
|
15
|
+
|
|
16
|
+
- !group cooks
|
|
17
|
+
|
|
18
|
+
- !grant
|
|
19
|
+
role: !group employees
|
|
20
|
+
member: !group cooks
|
|
21
|
+
"""
|
|
22
|
+
When I successfully run `conjur role memberships group:cooks`
|
|
23
|
+
Then the JSON should have 2 entries
|
|
24
|
+
|
|
25
|
+
Scenario: Members list is expanded transitively
|
|
26
|
+
Given I load the policy:
|
|
27
|
+
"""
|
|
28
|
+
- !user alice
|
|
29
|
+
|
|
30
|
+
- !group employees
|
|
31
|
+
|
|
32
|
+
- !group cooks
|
|
33
|
+
|
|
34
|
+
- !grant
|
|
35
|
+
role: !group employees
|
|
36
|
+
member: !group cooks
|
|
37
|
+
|
|
38
|
+
- !grant
|
|
39
|
+
role: !group cooks
|
|
40
|
+
member: !user alice
|
|
41
|
+
"""
|
|
42
|
+
When I successfully run `conjur role memberships user:alice`
|
|
43
|
+
Then the JSON should have 3 entries
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
Feature: Check an environment
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given I load the policy:
|
|
5
|
+
"""
|
|
6
|
+
- !variable access_key
|
|
7
|
+
- !variable secret_key
|
|
8
|
+
- !variable ssh_private_key
|
|
9
|
+
|
|
10
|
+
- !user alice
|
|
11
|
+
|
|
12
|
+
- !permit
|
|
13
|
+
role: !user alice
|
|
14
|
+
privilege: execute
|
|
15
|
+
resources:
|
|
16
|
+
- !variable access_key
|
|
17
|
+
- !variable secret_key
|
|
18
|
+
|
|
19
|
+
"""
|
|
20
|
+
And I run `conjur variable values add access_key ABCDEF`
|
|
21
|
+
And I run `conjur variable values add secret_key XYZQWER`
|
|
22
|
+
And I run `conjur variable values add ssh_private_key PRIVATE_KEY_BODY`
|
|
23
|
+
And I login as "alice"
|
|
24
|
+
And I reset the command list
|
|
25
|
+
|
|
26
|
+
Scenario: Check against permitted variables
|
|
27
|
+
When I run `conjur env check --yaml '{ aws_access_key: !var access_key, aws_secret_key: !var secret_key }'`
|
|
28
|
+
Then the exit status should be 0
|
|
29
|
+
And the stdout should contain "aws_access_key: available\naws_secret_key: available\n"
|
|
30
|
+
|
|
31
|
+
Scenario: Check against restricted variables
|
|
32
|
+
When I run `conjur env check --yaml '{ aws_access_key: !var access_key, ssh_private_key: !var ssh_private_key }'`
|
|
33
|
+
Then the exit status should be 1
|
|
34
|
+
And the stdout should contain "aws_access_key: available\nssh_private_key: unavailable\n"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Feature: Run command in an environment populated from Conjur variables
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given I load the policy:
|
|
5
|
+
"""
|
|
6
|
+
- !variable access_key
|
|
7
|
+
- !variable secret_key
|
|
8
|
+
"""
|
|
9
|
+
And I run `conjur variable values add access_key ABCDEF`
|
|
10
|
+
And I run `conjur variable values add secret_key XYZQWER`
|
|
11
|
+
And I reset the command list
|
|
12
|
+
|
|
13
|
+
Scenario:
|
|
14
|
+
When I run `bash -c "conjur env run --yaml '{ cloud_access_key: !var access_key , cloud_secret_key: !var secret_key }' -- env | grep CLOUD_"`
|
|
15
|
+
Then the stdout should contain exactly "CLOUD_ACCESS_KEY=ABCDEF\nCLOUD_SECRET_KEY=XYZQWER"
|
|
@@ -2,10 +2,15 @@ Feature: Embed values of Conjur variables into ERB template
|
|
|
2
2
|
|
|
3
3
|
Background:
|
|
4
4
|
Given a file named "template.erb" with: 'aws credentials: [<%= conjurenv["aws_access_key"] %>, <%= conjurenv["aws_secret_key"] %>]'
|
|
5
|
-
And I
|
|
6
|
-
|
|
5
|
+
And I load the policy:
|
|
6
|
+
"""
|
|
7
|
+
- !variable access_key
|
|
8
|
+
- !variable secret_key
|
|
9
|
+
"""
|
|
10
|
+
And I run `conjur variable values add access_key ABCDEF`
|
|
11
|
+
And I run `conjur variable values add secret_key XYZQWER`
|
|
7
12
|
And I reset the command list
|
|
8
13
|
|
|
9
14
|
Scenario:
|
|
10
|
-
When I run `conjur env template --yaml '{ aws_access_key: !var
|
|
15
|
+
When I run `conjur env template --yaml '{ aws_access_key: !var access_key , aws_secret_key: !var secret_key }' template.erb `
|
|
11
16
|
Then it prints the path to temporary file which contains: 'aws credentials: [ABCDEF, XYZQWER]'
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
Feature: Update the password of the logged-in user
|
|
2
2
|
|
|
3
3
|
Background:
|
|
4
|
-
Given I
|
|
4
|
+
Given I load the policy:
|
|
5
|
+
"""
|
|
6
|
+
- !user alice
|
|
7
|
+
"""
|
|
8
|
+
And I login as "alice"
|
|
5
9
|
|
|
10
|
+
@restore-login
|
|
6
11
|
Scenario: A user can update her own password
|
|
7
12
|
And I run `conjur user update_password` interactively
|
|
8
13
|
Then I can type and confirm a new password
|
|
9
14
|
|
|
15
|
+
@restore-login
|
|
10
16
|
Scenario: The new password can be used to login
|
|
11
17
|
And I run `conjur user update_password` interactively
|
|
12
18
|
And I type and confirm a new password
|
|
13
|
-
And I run `conjur authn login alice
|
|
19
|
+
And I run `conjur authn login alice` interactively
|
|
14
20
|
And I enter the password
|
|
15
21
|
Then the exit status should be 0
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
Feature: Obtain value from variable
|
|
2
2
|
|
|
3
3
|
Background:
|
|
4
|
-
Given I
|
|
5
|
-
|
|
4
|
+
Given I load the policy:
|
|
5
|
+
"""
|
|
6
|
+
- !variable secret
|
|
7
|
+
"""
|
|
8
|
+
And I run `conjur variable values add secret secretvalue`
|
|
9
|
+
And I run `conjur variable values add secret updatedvalue`
|
|
6
10
|
And I reset the command list
|
|
7
11
|
|
|
8
12
|
Scenario: Recent value is obtained by default
|
|
9
|
-
When I run `conjur variable value
|
|
13
|
+
When I run `conjur variable value secret`
|
|
10
14
|
Then the stdout should contain exactly "updatedvalue"
|
|
11
|
-
|
|
15
|
+
|
|
12
16
|
Scenario: Previous values can be obtained by version
|
|
13
|
-
When I run `conjur variable value -v 1
|
|
17
|
+
When I run `conjur variable value -v 1 secret`
|
|
14
18
|
Then the stdout should contain exactly "secretvalue"
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
Feature: Populate variable with values
|
|
2
2
|
|
|
3
3
|
Background:
|
|
4
|
-
Given I
|
|
4
|
+
Given I load the policy:
|
|
5
|
+
"""
|
|
6
|
+
- !variable secret
|
|
7
|
+
"""
|
|
8
|
+
And I run `conjur variable values add secret initialvalue`
|
|
9
|
+
And I reset the command list
|
|
5
10
|
|
|
6
11
|
Scenario: Value provided via command-line parameter
|
|
7
|
-
When I run `conjur variable values add
|
|
12
|
+
When I run `conjur variable values add secret secretvalue`
|
|
8
13
|
Then the output should contain "Value added"
|
|
9
14
|
|
|
10
15
|
Scenario: Value provided via stdin
|
|
11
|
-
When I run `bash -c 'echo "secretvalue" | conjur variable values add
|
|
16
|
+
When I run `bash -c 'echo "secretvalue" | conjur variable values add secret'`
|
|
12
17
|
Then the output should contain "Value added"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Feature: Host factory tokens
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given I load the policy:
|
|
5
|
+
"""
|
|
6
|
+
- !policy
|
|
7
|
+
id: myapp
|
|
8
|
+
body:
|
|
9
|
+
- !layer
|
|
10
|
+
- !host-factory
|
|
11
|
+
layers: [ !layer ]
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
Scenario: create a host factory token
|
|
15
|
+
When I successfully run `conjur hostfactory tokens create myapp`
|
|
16
|
+
Then the JSON should have "0/token"
|
|
17
|
+
|
|
18
|
+
Scenario: create a host using a token
|
|
19
|
+
When I successfully run `conjur hostfactory tokens create myapp`
|
|
20
|
+
And I keep the JSON response at "0/token" as "TOKEN"
|
|
21
|
+
Then I successfully run `conjur hostfactory hosts create %{TOKEN} host-01`
|
|
22
|
+
And the JSON should have "api_key"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
Feature: Show public keys for a user
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given I load the policy:
|
|
5
|
+
"""
|
|
6
|
+
- !user
|
|
7
|
+
id: alice
|
|
8
|
+
public_keys:
|
|
9
|
+
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQ laptop
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
Scenario: After adding a key, the key is shown
|
|
13
|
+
When I run `conjur pubkeys show alice`
|
|
14
|
+
And the output should match /^ssh-rsa .* laptop$/
|
|
15
|
+
|
|
16
|
+
Scenario: Public keys can be listed using cURL, without authentication
|
|
17
|
+
When I successfully run `curl -k $conjur_url/public_keys/cucumber/user/alice`
|
|
18
|
+
Then the output should match /^ssh-rsa .* laptop$/
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Then(/^I(?: can)? type and confirm a new password/) do
|
|
2
|
+
@password = SecureRandom.hex(12)
|
|
3
|
+
step %Q(I type "#{@password}")
|
|
4
|
+
step %Q(I type "#{@password}")
|
|
5
|
+
step "the exit status should be 0"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
When(/^I enter the password/) do
|
|
9
|
+
raise "No current password" unless @password
|
|
10
|
+
step %Q(I type "#{@password}")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
When(/^I type the API key for "(.*?)"$/) do |username|
|
|
14
|
+
step %Q(I type "#{api_key_of username}")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
Given(/^I login as "(.*?)"$/) do |username|
|
|
18
|
+
api_key = api_key_of username
|
|
19
|
+
|
|
20
|
+
step %Q(I set the environment variable "CONJUR_AUTHN_LOGIN" to "#{username}")
|
|
21
|
+
step %Q(I set the environment variable "CONJUR_AUTHN_API_KEY" to "#{api_key}")
|
|
22
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
Transform /\$ns/ do |s|
|
|
2
|
+
s.gsub('$ns', namespace)
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
Transform /\$user_role/ do |s|
|
|
6
|
+
s.gsub('$user_role', test_user.role_id)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
Transform /^table:/ do |table|
|
|
10
|
+
table.tap do |t|
|
|
11
|
+
t.hashes.each do |row|
|
|
12
|
+
row.each do |_,v|
|
|
13
|
+
v.gsub!('$ns', namespace)
|
|
14
|
+
v.gsub!('$user_role', test_user.role_id)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
When /^the command completes successfully/ do
|
|
21
|
+
last_command_started.wait
|
|
22
|
+
last_command_started.terminate
|
|
23
|
+
expect(last_command_started.exit_status).to eq(0)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
Then /^the output from "([^"]*)" should match \/([^\/]*)\/$/ do |cmd, expected|
|
|
27
|
+
assert_matching_output(expected, output_from(cmd))
|
|
28
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# this is step copypasted from https://github.com/cucumber/aruba/blob/master/lib/aruba/cucumber.rb#L24
|
|
2
|
+
# original has typo in regexp, which is fixed here
|
|
3
|
+
Given(/^a file named "([^"]*?)" with: '(.*?)'$/) do |file_name, file_content|
|
|
4
|
+
write_file(file_name, file_content)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
Then /^it prints the path to temporary file which contains: '(.*)'$/ do |content|
|
|
8
|
+
filename = last_command_started.stdout.strip
|
|
9
|
+
tempfiles << filename
|
|
10
|
+
actual_content = File.read(filename)
|
|
11
|
+
expect(actual_content).to match(content)
|
|
12
|
+
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
|
+
Given /^a graph with edges$/ do |table|
|
|
2
3
|
graph table.raw
|
|
3
4
|
end
|
|
4
5
|
|
|
5
|
-
Then %r{the graph JSON should be} do |json|
|
|
6
|
+
Then %r{^the graph JSON should be:$} do |json|
|
|
6
7
|
json = expand_roles json
|
|
7
8
|
last_graph = extract_filtered_graph json
|
|
8
9
|
expect(last_graph.to_json).to be_json_eql(json)
|
|
@@ -18,4 +19,4 @@ When(/^I( successfully)? run with role expansion "(.*)"$/) do |successfully, cmd
|
|
|
18
19
|
else
|
|
19
20
|
step "I run `#{cmd}`"
|
|
20
21
|
end
|
|
21
|
-
end
|
|
22
|
+
end
|
|
File without changes
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Use a json_spec style memorized value as an environment variable
|
|
2
|
+
When /I set the environment variable "(.*)" to memorized value "(.*)"/ do |key, value|
|
|
3
|
+
JsonSpec.memory.each do |k,v|
|
|
4
|
+
# JSON parser doesn't function properly on a JSON encoded string
|
|
5
|
+
v = v[1...-1] if v[0] == '"'
|
|
6
|
+
value.gsub! "%{#{k}}", v
|
|
7
|
+
end
|
|
8
|
+
set_environment_variable key, value
|
|
9
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Given /^I load the policy:$/ do |policy|
|
|
2
|
+
load_policy 'root', policy, Conjur::API::POLICY_METHOD_PUT
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
Given /^I apply the policy:$/ do |policy|
|
|
6
|
+
load_policy 'root', policy, Conjur::API::POLICY_METHOD_PATCH
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
Given /^I add the policy:$/ do |policy|
|
|
10
|
+
load_policy 'root', policy, Conjur::API::POLICY_METHOD_POST
|
|
11
|
+
end
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
--- []
|
data/features/support/env.rb
CHANGED
|
@@ -1,12 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../..', File.dirname(__FILE__))
|
|
2
|
+
|
|
3
|
+
require 'json_spec/cucumber'
|
|
4
|
+
|
|
2
5
|
require 'aruba/cucumber'
|
|
3
|
-
require '
|
|
4
|
-
require '
|
|
5
|
-
require "json_spec/cucumber"
|
|
6
|
+
require 'json_spec/cucumber'
|
|
7
|
+
require 'simplecov'
|
|
6
8
|
|
|
7
9
|
SimpleCov.start
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
ENV['CONJUR_APPLIANCE_URL'] ||= 'http://localhost/api/v6'
|
|
12
|
+
ENV['CONJUR_ACCOUNT'] ||= 'cucumber'
|
|
13
|
+
|
|
14
|
+
require 'conjur/cli'
|
|
15
|
+
|
|
16
|
+
Conjur::Config.load
|
|
17
|
+
Conjur::Config.apply
|
|
18
|
+
|
|
19
|
+
$netrc_file_path = ENV['CONJURRC'] || File.expand_path('~/.netrc')
|
|
20
|
+
if File.exists?($netrc_file_path)
|
|
21
|
+
$netrc_file = File.read($netrc_file_path)
|
|
12
22
|
end
|
|
23
|
+
|
|
24
|
+
$conjur = Conjur::Authn.connect nil, noask: true
|
|
25
|
+
|
|
26
|
+
puts "Performing CLI tests as user '#{$conjur.current_role(Conjur.configuration.account).login}'"
|
data/features/support/hooks.rb
CHANGED
|
@@ -1,127 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def initialize
|
|
7
|
-
@things = {}
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def thing(kind, id)
|
|
11
|
-
(@things[kind.to_sym] || []).find{|r| r.id == id}
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def thing_like(kind, id_pattern)
|
|
15
|
-
(@things[kind.to_sym] || []).find{|r| id_pattern.match(r.id)}
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def create_host(options = {})
|
|
19
|
-
id = options.delete(:id)
|
|
20
|
-
if id
|
|
21
|
-
host = thing(:host, id)
|
|
22
|
-
else
|
|
23
|
-
id = SecureRandom.uuid
|
|
24
|
-
end
|
|
25
|
-
host ||= create_thing(:host, id, options, role: true, api_key: true)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def create_user(id, options = {})
|
|
29
|
-
thing(:user, id) || create_thing(:user, id, options, role: true, api_key: true)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def create_variable(mime_type, kind)
|
|
33
|
-
create_thing(:user, SecureRandom.uuid, mime_type: mime_type, kind: kind)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def create_resource(id, options = {})
|
|
37
|
-
resource(id).tap do |resource|
|
|
38
|
-
resource.send(:"exists?=", true)
|
|
39
|
-
populate_options resource, options
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def create_role(id, options = {})
|
|
44
|
-
role(id).tap do |role|
|
|
45
|
-
role.send(:"exists?=", true)
|
|
46
|
-
populate_options role, options
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
[ :user, :host ].each do |kind|
|
|
51
|
-
define_method kind do |id|
|
|
52
|
-
thing(kind, id)
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def role(id)
|
|
57
|
-
raise "Role id must be a string" unless id.is_a?(String)
|
|
58
|
-
thing(:role, id) || create_thing(:role, id, { exists?: false }, role: true)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def resource(id)
|
|
62
|
-
raise "Resource id must be a string" unless id.is_a?(String)
|
|
63
|
-
thing(:resource, id) || create_thing(:resource, id, exists?: false)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
protected
|
|
67
|
-
|
|
68
|
-
def create_thing(kind, id, options, kind_options = {})
|
|
69
|
-
thing = OpenStruct.new(kind: kind, id: id, exists?: true)
|
|
70
|
-
|
|
71
|
-
class << thing
|
|
72
|
-
def permit(privilege, role, options = {})
|
|
73
|
-
(self.permissions ||= []) << OpenStruct.new(privilege: privilege, role: role.id, grant_option: !!options[:grant_option])
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
if kind_options[:api_key]
|
|
78
|
-
thing.api_key = SecureRandom.uuid
|
|
79
|
-
end
|
|
80
|
-
if kind_options[:role]
|
|
81
|
-
thing.roleid = id
|
|
82
|
-
class << thing
|
|
83
|
-
def can(privilege, resource, options = {})
|
|
84
|
-
resource.permit privilege, self, options
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
populate_options(thing, options)
|
|
90
|
-
|
|
91
|
-
store_thing kind, thing
|
|
92
|
-
|
|
93
|
-
thing
|
|
94
|
-
end
|
|
1
|
+
# Future Aruba
|
|
2
|
+
Aruba.configure do |config|
|
|
3
|
+
config.exit_timeout = 15
|
|
4
|
+
config.io_wait_timeout = 2
|
|
5
|
+
end
|
|
95
6
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
end
|
|
100
|
-
end
|
|
7
|
+
Transform /\$conjur_url/ do |statement|
|
|
8
|
+
statement.gsub "$conjur_url", Conjur.configuration.appliance_url
|
|
9
|
+
end
|
|
101
10
|
|
|
102
|
-
|
|
103
|
-
|
|
11
|
+
Transform /\%\{\w+\}/ do |statement|
|
|
12
|
+
JsonSpec.memory.each do |k,v|
|
|
13
|
+
statement = statement.gsub("%{#{k}}", v)
|
|
104
14
|
end
|
|
15
|
+
statement
|
|
105
16
|
end
|
|
106
17
|
|
|
107
|
-
Before(
|
|
108
|
-
|
|
109
|
-
|
|
18
|
+
Before('@conjurapi-log') do
|
|
19
|
+
set_env 'CONJURAPI_LOG', 'stderr'
|
|
20
|
+
end
|
|
110
21
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
22
|
+
Before do
|
|
23
|
+
step %Q(I set the environment variable "CONJUR_AUTHN_LOGIN" to "#{$conjur.username}")
|
|
24
|
+
step %Q(I set the environment variable "CONJUR_AUTHN_API_KEY" to "#{$conjur.api_key}")
|
|
114
25
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
Conjur.stub(:account).and_return "cucumber"
|
|
26
|
+
$conjur.load_policy "root", File.read(File.expand_path('blank.yml', File.dirname(__FILE__))), method: Conjur::API::POLICY_METHOD_PUT
|
|
27
|
+
end
|
|
118
28
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
29
|
+
After '@restore-login' do
|
|
30
|
+
step %Q(I run `conjur authn login #{$conjur.username}` interactively)
|
|
31
|
+
step %Q(I type "#{$conjur.api_key}")
|
|
122
32
|
end
|
|
123
33
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
34
|
+
After do
|
|
35
|
+
tempfiles.each { |tempfile| File.unlink(tempfile) unless tempfile.nil? }
|
|
36
|
+
if $netrc_file && File.read($netrc_file_path) != $netrc_file
|
|
37
|
+
$stderr.puts "Restoring #{$netrc_file_path}"
|
|
38
|
+
require 'fileutils'
|
|
39
|
+
File.write($netrc_file_path, $netrc_file)
|
|
40
|
+
FileUtils.chmod 0600, $netrc_file_path
|
|
41
|
+
end
|
|
127
42
|
end
|