conjur-cli 6.1.0 → 6.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +10 -0
  3. data/.github/ISSUE_TEMPLATE/bug.md +42 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +27 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +21 -0
  6. data/.gitleaks.toml +216 -0
  7. data/CHANGELOG.md +69 -209
  8. data/CONTRIBUTING.md +81 -0
  9. data/Jenkinsfile +83 -40
  10. data/LICENSE +202 -0
  11. data/NOTICES.txt +421 -0
  12. data/README.md +278 -48
  13. data/Rakefile +0 -1
  14. data/SECURITY.md +42 -0
  15. data/VERSION +1 -1
  16. data/bin/conjur +3 -1
  17. data/bin/parse-changelog.sh +12 -0
  18. data/build-standalone +42 -3
  19. data/ci/cli-test.sh +5 -1
  20. data/ci/submit-coverage +36 -0
  21. data/ci/test.sh +1 -1
  22. data/conjur-cli.gemspec +15 -13
  23. data/dev/docker-compose.yml +1 -0
  24. data/dev/start.sh +3 -3
  25. data/docker-compose.yml +2 -1
  26. data/features/authorization/resource/check.feature +6 -0
  27. data/features/authorization/resource/exists.feature +10 -3
  28. data/features/hostfactory/tokens.feature +1 -1
  29. data/features/pubkeys/show.feature +0 -4
  30. data/features/step_definitions/authn_steps.rb +1 -1
  31. data/features/step_definitions/cli_steps.rb +0 -19
  32. data/features/step_definitions/overrides.rb +3 -5
  33. data/features/support/env.rb +3 -1
  34. data/features/support/hooks.rb +0 -11
  35. data/jenkins.sh +1 -1
  36. data/lib/conjur/cli.rb +4 -3
  37. data/lib/conjur/command/hosts.rb +1 -1
  38. data/lib/conjur/command/ldap_sync.rb +37 -0
  39. data/lib/conjur/command/rspec/describe_command.rb +26 -7
  40. data/lib/conjur/command/rspec/mock_services.rb +7 -1
  41. data/lib/conjur/command/users.rb +5 -1
  42. data/lib/conjur/version.rb +1 -1
  43. data/needs-publishing +28 -0
  44. data/push-image +46 -28
  45. data/spec/authn_spec.rb +4 -4
  46. data/spec/command/authn_spec.rb +2 -2
  47. data/spec/command/hosts_spec.rb +26 -3
  48. data/spec/command/init_spec.rb +28 -28
  49. data/spec/command/ldap_sync_spec.rb +38 -0
  50. data/spec/command/users_spec.rb +18 -2
  51. data/spec/spec_helper.rb +5 -2
  52. data/test.sh +6 -1
  53. metadata +80 -77
  54. data/LICENSE.md +0 -195
@@ -36,7 +36,7 @@ class Conjur::Command::Hosts < Conjur::Command
36
36
  host_resourceid = full_resource_id("host:#{host}")
37
37
 
38
38
  unless api.resource(host_resourceid).exists?
39
- exit_now! "host '#{host}' not found"
39
+ exit_now! "Host '#{host}' not found"
40
40
  end
41
41
 
42
42
  # Prepend 'host/' if it wasn't passed in
@@ -0,0 +1,37 @@
1
+ require 'conjur/command'
2
+
3
+ class Conjur::Command::LDAPSync < Conjur::Command
4
+ desc 'LDAP sync management commands'
5
+ command :'ldap-sync' do |cgrp|
6
+
7
+ cgrp.desc 'Manage the policy used to sync Conjur and the LDAP server'
8
+ cgrp.command :policy do |policy|
9
+
10
+ policy.desc 'Show the current policy'
11
+ policy.command :show do |show|
12
+
13
+ show.desc 'LDAP Sync profile to use (defined in UI)'
14
+ show.arg_name 'profile'
15
+ show.flag ['p', 'profile'], default_value: 'default'
16
+
17
+ show.action do |_,options,_|
18
+ begin
19
+ resp = api.ldap_sync_policy(config_name: options[:profile])
20
+
21
+ if (policy = resp['policy'])
22
+ if resp['ok']
23
+ puts(policy)
24
+ else
25
+ exit_now! 'Failed creating the policy.'
26
+ end
27
+ else
28
+ exit_now! resp['error']['message']
29
+ end
30
+ rescue RestClient::ResourceNotFound => ex
31
+ exit_now! "LDAP sync is not supported by the server #{Conjur.configuration.appliance_url}"
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -5,15 +5,34 @@ RSpec::Core::DSL.change_global_dsl do
5
5
 
6
6
  before do
7
7
  allow(cert_store).to receive(:add_file)
8
+ # Stub the constant OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE which is
9
+ # implicitly used in many places in the CLI and in conjur-api-ruby as the de facto
10
+ # cert store.
8
11
  stub_const 'OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE', cert_store
12
+
13
+ # Reset the rest_client_options defaults to avoid using expired rspec doubles.
14
+ #
15
+ # Conjur.configuration is a lazy-loaded singleton. There is single CLI instance
16
+ # shared across this test suite. When Conjur.configuration is loaded for the first
17
+ # time it assumes the defaults value for Conjur.configuration.rest_client_options
18
+ # of:
19
+ # {
20
+ # :ssl_cert_store => OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE
21
+ # }
22
+ #
23
+ # Notice above that each test case stubs the constant
24
+ # OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE with a double. Without further
25
+ # modification this means the first time the CLI is run and Conjur.configuration
26
+ # is loaded Conjur.configuration.rest_client_options[:ssl_cert_store] it is set to
27
+ # the double associated with the test case at that point in time. Since
28
+ # Conjur.configuration is only loaded once, without modification, that double will
29
+ # be retained and its usage will result in a RSpec::Mocks::ExpiredTestDoubleError.
30
+ # To avoid this for each test case we must reset
31
+ # Conjur.configuration.rest_client_options[:ssl_cert_store] with the double for
32
+ # the current test case.
33
+ Conjur.configuration.rest_client_options[:ssl_cert_store] = cert_store
9
34
  end
10
-
11
- let(:cert_store_options) do
12
- {
13
- ssl_cert_store: cert_store
14
- }
15
- end
16
-
35
+
17
36
  let(:invoke) do
18
37
  Conjur::CLI.error_device = $stderr
19
38
  # TODO: allow proper handling of description like "audit:send 'hello world'"
@@ -29,7 +29,13 @@ end
29
29
  shared_context "when logged in", logged_in: true do
30
30
  include_context "with mock authn"
31
31
  before do
32
- allow(api).to receive(:credentials) { {} }
32
+ allow(api).to receive(:credentials) do
33
+ {
34
+ :username => 'dknuth',
35
+ :headers => { :authorization => "fakeauth" },
36
+ }
37
+ end
38
+
33
39
  netrc[authn_host] = [username, api_key]
34
40
  allow(Conjur::Command).to receive_messages api: api
35
41
  end
@@ -47,7 +47,11 @@ class Conjur::Command::Users < Conjur::Command
47
47
  if api.username == options[:user]
48
48
  exit_now! 'To rotate the API key of the currently logged-in user, use this command without any flags or options'
49
49
  end
50
- puts api.resource([ Conjur.configuration.account, "user", options[:user] ].join(":")).rotate_api_key
50
+ user_resource_id = [Conjur.configuration.account, "user", options[:user]].join(":")
51
+ unless api.resource(user_resource_id).exists?
52
+ exit_now! "User '#{options[:user]}' not found"
53
+ end
54
+ puts api.resource(user_resource_id).rotate_api_key
51
55
  else
52
56
  username, password = Conjur::Authn.read_credentials
53
57
  new_api_key = Conjur::API.rotate_api_key username, password
@@ -19,6 +19,6 @@
19
19
  # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
20
  #
21
21
  module Conjur
22
- VERSION = '6.1.0'
22
+ VERSION = '6.2.4'
23
23
  ::Version=VERSION
24
24
  end
data/needs-publishing ADDED
@@ -0,0 +1,28 @@
1
+ #!/bin/bash -ex
2
+
3
+ echo "Determining if publishing is requested..."
4
+
5
+ VERSION=$(ruby -I lib -r conjur/version -e 'puts Conjur::VERSION')
6
+ echo Declared version: $VERSION
7
+
8
+ if curl -s https://rubygems.org/api/v1/versions/conjur-cli.json | jq -e ".[] | select(.number == \"$VERSION\")" >/dev/null; then
9
+ echo "Found $VERSION on rubygems, not republishing"
10
+ exit 1
11
+ fi
12
+
13
+ # Jenkins git plugin is broken and always fetches with `--no-tags`
14
+ # (or `--tags`, neither of which is what you want), so tags end up
15
+ # not being fetched. Try to fix that.
16
+ # (Unfortunately this fetches all remote heads, so we may have to find
17
+ # another solution for bigger repos.)
18
+ git fetch -q
19
+
20
+ # note when tag not found git rev-parse will just print its name
21
+ # TAG=`git rev-parse tags/v$VERSION 2>/dev/null || :`
22
+ TAG=`git rev-list -n 1 "v$VERSION" 2>/dev/null || :`
23
+ echo Tag v$VERSION: $TAG
24
+
25
+ HEAD=`git rev-parse HEAD`
26
+ echo HEAD: $HEAD
27
+
28
+ test "$HEAD" = "$TAG"
data/push-image CHANGED
@@ -1,28 +1,46 @@
1
- #!/bin/bash -eu
2
-
3
- # Push the 'cli:5' image to Dockerhub when on the 'master' branch
4
-
5
- cd "$(git rev-parse --show-toplevel)"
6
-
7
- IMAGE='cyberark/conjur-cli'
8
-
9
- function tag_and_push() {
10
- local image="$1"
11
- local tag="$2"
12
- local description="$3"
13
-
14
- echo "TAG = $tag, $description"
15
-
16
- docker tag "$image" "$image:$tag"
17
- docker push "$image:$tag"
18
- }
19
-
20
- version_tag="5-$(cat VERSION)"
21
-
22
- tag_and_push $IMAGE '5' 'latest image'
23
- tag_and_push $IMAGE '5-latest' 'same as "5"'
24
- tag_and_push $IMAGE $version_tag 'version-specific image'
25
-
26
- # push to legacy `conjurinc/cli5` tag
27
- docker tag "$IMAGE" conjurinc/cli5:latest
28
- docker push conjurinc/cli5:latest
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ readonly REGISTRY="cyberark"
6
+ readonly INTERNAL_REGISTRY="registry2.itci.conjur.net"
7
+ readonly VERSION="$(cat VERSION)"
8
+ readonly VERSION_TAG="5-${VERSION}"
9
+ readonly image_name="conjur-cli"
10
+ readonly full_image_name="${REGISTRY}/${image_name}:latest"
11
+
12
+ readonly TAGS=(
13
+ "5"
14
+ "5-latest"
15
+ "$VERSION_TAG"
16
+ )
17
+
18
+ # fetching tags is required for git_description to work
19
+ git fetch --tags
20
+ git_description=$(git describe)
21
+
22
+ # if it’s not a tagged commit, VERSION will have extra junk (i.e. -g666c4b2), so we won’t publish that commit
23
+ # only when tag matches the VERSION, push VERSION and latest releases
24
+ # and x and x.y releases
25
+ #Ex: v5-6.2.1
26
+ if [ "${git_description}" = "v${VERSION}" ]; then
27
+ echo "Revision ${git_description} matches version ${VERSION} exactly. Pushing to Dockerhub..."
28
+
29
+ for tag in "${TAGS[@]}"; do
30
+ echo "Tagging and pushing ${REGISTRY}/${image_name}:${tag}"
31
+
32
+ # push to dockerhub
33
+ docker tag "${full_image_name}" "${REGISTRY}/${image_name}:${tag}"
34
+ docker push "${REGISTRY}/${image_name}:${tag}"
35
+
36
+ # push to internal registry
37
+ # necessary because some cyberark teams/networks can't pull from dockerhub
38
+ docker tag "${full_image_name}" "${INTERNAL_REGISTRY}/${image_name}:${tag}"
39
+ docker push "${INTERNAL_REGISTRY}/${image_name}:${tag}"
40
+
41
+ done
42
+
43
+ # push to legacy `conjurinc/cli5` tag
44
+ docker tag "${full_image_name}" conjurinc/cli5:latest
45
+ docker push conjurinc/cli5:latest
46
+ fi
data/spec/authn_spec.rb CHANGED
@@ -37,11 +37,11 @@ describe Conjur::Authn do
37
37
  allow(ENV).to receive(:[]).with("CONJUR_AUTHN_LOGIN").and_return "the-login"
38
38
  allow(ENV).to receive(:[]).with("CONJUR_AUTHN_API_KEY").and_return "the-api-key"
39
39
  end
40
-
40
+
41
41
  context "login and API key" do
42
42
  it "are used to authn" do
43
43
  expect(Conjur::Authn.get_credentials).to eq([ "the-login", "the-api-key" ])
44
-
44
+
45
45
  expect(api.username).to eq('the-login')
46
46
  expect(api.api_key).to eq('the-api-key')
47
47
  end
@@ -94,7 +94,7 @@ describe Conjur::Authn do
94
94
  before do
95
95
  allow(Conjur::Config).to receive(:[]).with(:netrc_path).and_return path
96
96
  end
97
-
97
+
98
98
  context "with specified netrc_path" do
99
99
  let(:path) { "/a/dummy/netrc/path" }
100
100
  it "consults Conjur::Config for netrc_path" do
@@ -102,7 +102,7 @@ describe Conjur::Authn do
102
102
  expect(Conjur::Authn.netrc).to eq(netrc)
103
103
  end
104
104
  end
105
-
105
+
106
106
  context "without specified netrc_path" do
107
107
  let(:path) { nil }
108
108
  it "uses default netrc path" do
@@ -10,14 +10,14 @@ describe Conjur::Command::Authn do
10
10
  describe_command "#{cmd}" do
11
11
  it "prompts for username and password and logs in the user" do
12
12
  expect(Conjur::Authn).to receive(:ask_for_credentials).with({}).and_return [ "the-user", "the-api-key" ]
13
-
13
+
14
14
  expect { invoke }.to write("Logged in")
15
15
  end
16
16
  end
17
17
  describe_command "#{cmd} -u the-user" do
18
18
  it "prompts for password and logs in the user" do
19
19
  expect(Conjur::Authn).to receive(:ask_for_credentials).with({username: 'the-user'}).and_return [ "the-user", "the-api-key" ]
20
-
20
+
21
21
  expect { invoke }.to write("Logged in")
22
22
  end
23
23
  end
@@ -9,13 +9,21 @@ describe Conjur::Command::Hosts, logged_in: true do
9
9
  expect(RestClient::Request).to receive(:execute).with({
10
10
  method: :head,
11
11
  url: "https://core.example.com/api/resources/#{account}/host/redis001",
12
- headers: {}
12
+ headers: {
13
+ authorization: "fakeauth",
14
+ },
15
+ username: "dknuth",
16
+ ssl_cert_store: cert_store
13
17
  }).and_return true
14
18
  expect(RestClient::Request).to receive(:execute).with({
15
19
  method: :put,
16
20
  url: "https://core.example.com/api/authn/#{account}/api_key?role=#{account}:host:redis001",
17
- headers: {},
18
- payload: ''
21
+ headers: {
22
+ authorization: "fakeauth",
23
+ },
24
+ payload: '',
25
+ username: "dknuth",
26
+ ssl_cert_store: cert_store
19
27
  }).and_return double(:response, body: 'new api key')
20
28
  end
21
29
 
@@ -23,5 +31,20 @@ describe Conjur::Command::Hosts, logged_in: true do
23
31
  invoke
24
32
  end
25
33
  end
34
+
35
+ describe_command 'host rotate_api_key --host non-existing' do
36
+ before do
37
+ expect(RestClient::Request).to receive(:execute).with({
38
+ method: :head,
39
+ url: "https://core.example.com/api/resources/#{account}/host/non-existing",
40
+ headers: {authorization: "fakeauth"},
41
+ username: username,
42
+ ssl_cert_store: cert_store
43
+ }).and_raise RestClient::ResourceNotFound
44
+ end
45
+ it 'rotate_api_key with non-existing --host option' do
46
+ expect { invoke }.to raise_error(GLI::CustomExit, /Host 'non-existing' not found/i)
47
+ end
48
+ end
26
49
  end
27
50
  end
@@ -1,36 +1,36 @@
1
1
  require 'spec_helper'
2
2
  require 'highline'
3
3
 
4
- GITHUB_FP = "SHA1 Fingerprint=D7:9F:07:61:10:B3:92:93:E3:49:AC:89:84:5B:03:80:C1:9E:2F:8B"
4
+ GITHUB_FP = "SHA1 Fingerprint=84:63:B3:A9:29:12:CC:FD:1D:31:47:05:98:9B:EC:13:99:37:D0:D7"
5
5
  GITHUB_CERT = <<EOF
6
6
  -----BEGIN CERTIFICATE-----
7
- MIIEtjCCA56gAwIBAgIQDHmpRLCMEZUgkmFf4msdgzANBgkqhkiG9w0BAQsFADBs
8
- MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
9
- d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
10
- ZSBFViBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowdTEL
11
- MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
12
- LmRpZ2ljZXJ0LmNvbTE0MDIGA1UEAxMrRGlnaUNlcnQgU0hBMiBFeHRlbmRlZCBW
13
- YWxpZGF0aW9uIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
14
- ggEBANdTpARR+JmmFkhLZyeqk0nQOe0MsLAAh/FnKIaFjI5j2ryxQDji0/XspQUY
15
- uD0+xZkXMuwYjPrxDKZkIYXLBxA0sFKIKx9om9KxjxKws9LniB8f7zh3VFNfgHk/
16
- LhqqqB5LKw2rt2O5Nbd9FLxZS99RStKh4gzikIKHaq7q12TWmFXo/a8aUGxUvBHy
17
- /Urynbt/DvTVvo4WiRJV2MBxNO723C3sxIclho3YIeSwTQyJ3DkmF93215SF2AQh
18
- cJ1vb/9cuhnhRctWVyh+HA1BV6q3uCe7seT6Ku8hI3UarS2bhjWMnHe1c63YlC3k
19
- 8wyd7sFOYn4XwHGeLN7x+RAoGTMCAwEAAaOCAUkwggFFMBIGA1UdEwEB/wQIMAYB
20
- Af8CAQAwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
21
- BQcDAjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
22
- Z2ljZXJ0LmNvbTBLBgNVHR8ERDBCMECgPqA8hjpodHRwOi8vY3JsNC5kaWdpY2Vy
23
- dC5jb20vRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3JsMD0GA1UdIAQ2
24
- MDQwMgYEVR0gADAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5j
25
- b20vQ1BTMB0GA1UdDgQWBBQ901Cl1qCt7vNKYApl0yHU+PjWDzAfBgNVHSMEGDAW
26
- gBSxPsNpA/i/RwHUmCYaCALvY2QrwzANBgkqhkiG9w0BAQsFAAOCAQEAnbbQkIbh
27
- hgLtxaDwNBx0wY12zIYKqPBKikLWP8ipTa18CK3mtlC4ohpNiAexKSHc59rGPCHg
28
- 4xFJcKx6HQGkyhE6V6t9VypAdP3THYUYUN9XR3WhfVUgLkc3UHKMf4Ib0mKPLQNa
29
- 2sPIoc4sUqIAY+tzunHISScjl2SFnjgOrWNoPLpSgVh5oywM395t6zHyuqB8bPEs
30
- 1OG9d4Q3A84ytciagRpKkk47RpqF/oOi+Z6Mo8wNXrM9zwR4jxQUezKcxwCmXMS1
31
- oVWNWlZopCJwqjyBcdmdqEU79OX2olHdx3ti6G8MdOu42vi/hw15UJGQmxg7kVkn
32
- 8TUoE6smftX3eg==
33
- -----END CERTIFICATE-----
7
+ MIIFBjCCBK2gAwIBAgIQDovzdw2S0Zbwu2H5PEFmvjAKBggqhkjOPQQDAjBnMQsw
8
+ CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xPzA9BgNVBAMTNkRp
9
+ Z2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIFRMUyBIeWJyaWQgRUNDIFNIQTI1NiAyMDIw
10
+ IENBMTAeFw0yMTAzMjUwMDAwMDBaFw0yMjAzMzAyMzU5NTlaMGYxCzAJBgNVBAYT
11
+ AlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
12
+ MRUwEwYDVQQKEwxHaXRIdWIsIEluYy4xEzARBgNVBAMTCmdpdGh1Yi5jb20wWTAT
13
+ BgcqhkjOPQIBBggqhkjOPQMBBwNCAASt9vd1sdNJVApdEHG93CUGSyIcoiNOn6H+
14
+ udCMvTm8DCPHz5GmkFrYRasDE77BI3q5xMidR/aW4Ll2a1A2ZvcNo4IDOjCCAzYw
15
+ HwYDVR0jBBgwFoAUUGGmoNI1xBEqII0fD6xC8M0pz0swHQYDVR0OBBYEFCexfp+7
16
+ JplQ2PPDU1v+MRawux5yMCUGA1UdEQQeMByCCmdpdGh1Yi5jb22CDnd3dy5naXRo
17
+ dWIuY29tMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB
18
+ BQUHAwIwgbEGA1UdHwSBqTCBpjBRoE+gTYZLaHR0cDovL2NybDMuZGlnaWNlcnQu
19
+ Y29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZVRMU0h5YnJpZEVDQ1NIQTI1NjIwMjBD
20
+ QTEuY3JsMFGgT6BNhktodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRI
21
+ aWdoQXNzdXJhbmNlVExTSHlicmlkRUNDU0hBMjU2MjAyMENBMS5jcmwwPgYDVR0g
22
+ BDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2Vy
23
+ dC5jb20vQ1BTMIGSBggrBgEFBQcBAQSBhTCBgjAkBggrBgEFBQcwAYYYaHR0cDov
24
+ L29jc3AuZGlnaWNlcnQuY29tMFoGCCsGAQUFBzAChk5odHRwOi8vY2FjZXJ0cy5k
25
+ aWdpY2VydC5jb20vRGlnaUNlcnRIaWdoQXNzdXJhbmNlVExTSHlicmlkRUNDU0hB
26
+ MjU2MjAyMENBMS5jcnQwDAYDVR0TAQH/BAIwADCCAQUGCisGAQQB1nkCBAIEgfYE
27
+ gfMA8QB2ACl5vvCeOTkh8FZzn2Old+W+V32cYAr4+U1dJlwlXceEAAABeGq/vRoA
28
+ AAQDAEcwRQIhAJ7miER//DRFnDJNn6uUhgau3WMt4vVfY5dGigulOdjXAiBIVCfR
29
+ xjK1v4F31+sVaKzyyO7JAa0fzDQM7skQckSYWQB3ACJFRQdZVSRWlj+hL/H3bYbg
30
+ IyZjrcBLf13Gg1xu4g8CAAABeGq/vTkAAAQDAEgwRgIhAJgAEkoJQRivBlwo7x67
31
+ 3oVsf1ip096WshZqmRCuL/JpAiEA3cX4rb3waLDLq4C48NSoUmcw56PwO/m2uwnQ
32
+ prb+yh0wCgYIKoZIzj0EAwIDRwAwRAIgK+Kv7G+/KkWkNZg3PcQFp866Z7G6soxo
33
+ a4etSZ+SRlYCIBSiXS20Wc+yjD111nPzvQUCfsP4+DKZ3K+2GKsERD6d
34
34
  EOF
35
35
 
36
36
  describe Conjur::Command::Init do
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Conjur::Command::LDAPSync, logged_in: true do
4
+ let (:policy_response) { { 'ok' => true, 'events' => [], 'policy' => <<eop
5
+ "---
6
+ - !user
7
+ annotations:
8
+ ldap-sync/source: ldap-server:389
9
+ ldap-sync/upstream-dn: CN=Administrator,OU=functest,OU=testdata,OU=dev-ci,DC=dev-ci,DC=conjur
10
+ id: Administrator
11
+ uidnumber:"}
12
+ eop
13
+ }
14
+ }
15
+
16
+ describe_command "ldap-sync policy show" do
17
+
18
+ context "on a server that supports LDAP sync" do
19
+ before do
20
+ expect_any_instance_of(Conjur::API).to receive(:ldap_sync_policy).with(config_name: '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
+ context "on a server that doesn't support LDAP sync" do
29
+ before do
30
+ expect_any_instance_of(Conjur::API).to receive(:ldap_sync_policy).and_raise(RestClient::ResourceNotFound)
31
+ end
32
+
33
+ it "shows an error message" do
34
+ expect {invoke}.to raise_error(GLI::CustomExit, /LDAP sync is not supported by the server/)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -12,7 +12,8 @@ describe Conjur::Command::Users, logged_in: true do
12
12
  user: username,
13
13
  password: api_key,
14
14
  headers: { },
15
- payload: "new-password"
15
+ payload: "new-password",
16
+ ssl_cert_store: cert_store
16
17
  })
17
18
  end
18
19
 
@@ -40,7 +41,8 @@ describe Conjur::Command::Users, logged_in: true do
40
41
  user: username,
41
42
  password: api_key,
42
43
  headers: {},
43
- payload: ''
44
+ payload: '',
45
+ ssl_cert_store: cert_store
44
46
  }).and_return double(:response, body: 'new api key')
45
47
  expect(Conjur::Authn).to receive(:save_credentials).with({
46
48
  username: username,
@@ -52,5 +54,19 @@ describe Conjur::Command::Users, logged_in: true do
52
54
  invoke
53
55
  end
54
56
  end
57
+ describe_command 'user rotate_api_key --user non-existing' do
58
+ before do
59
+ expect(RestClient::Request).to receive(:execute).with({
60
+ method: :head,
61
+ url: "https://core.example.com/api/resources/#{account}/user/non-existing",
62
+ headers: {authorization: "fakeauth"},
63
+ username: username,
64
+ ssl_cert_store: cert_store
65
+ }).and_raise RestClient::ResourceNotFound
66
+ end
67
+ it 'rotate_api_key with non-existing --user option' do
68
+ expect { invoke }.to raise_error(GLI::CustomExit, /User 'non-existing' not found/i)
69
+ end
70
+ end
55
71
  end
56
72
  end