conjur-cli 4.10.3 → 4.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9364641a7961f68f6327900c82a3b48df392a8ff
4
- data.tar.gz: aa7a0645cba4fc6055263fb7893e1a87272759a1
3
+ metadata.gz: 4340c1ab3fdec7c2cb49b4fa1ec442298df85a50
4
+ data.tar.gz: 4acef5138095751da921eba71e2a13780fddd9d6
5
5
  SHA512:
6
- metadata.gz: 885fe1eed115b3f3ca176a89cbbf50538a582f0610327a5b20bc77e8d4698bcc4781d45cb94927ddd3b2d76f3a849b718e5c7bbd3f62a267b09a9c76c294fdda
7
- data.tar.gz: 85d230b34bd07280dc4d24c495e24bae284073c66c0e58e4d01267b918f35d0ca1a836ba71768ca71dad3879bf0c3a39792d49e480bd8a8bba5423dce9eb8e2f
6
+ metadata.gz: 9d52290d6b3fb8a86df68d8bbc2faff5bd24e4b382f570096b74fe1d24b724592abb724df3e580448f52f93edf0376be8167e3b6fc4ff0b6c4daa45c90af959a
7
+ data.tar.gz: 70fa8e0a22fe5cc93eb51b08b07b0e8ee875b8336c6e4e06fa9fa5d66e2bae27345c50005e947c814fe6d2139448f76467b93bbfc20547201b5f499c9988cc79
data/conjur.gemspec CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
17
17
 
18
18
 
19
19
  gem.add_dependency 'activesupport'
20
- gem.add_dependency 'conjur-api', '>=4.9.1'
20
+ gem.add_dependency 'conjur-api', '>=4.9.2'
21
21
  gem.add_dependency 'gli', '>=2.8.0'
22
22
  gem.add_dependency 'highline'
23
23
  gem.add_dependency 'netrc'
data/lib/conjur/authn.rb CHANGED
@@ -54,7 +54,15 @@ module Conjur::Authn
54
54
  end
55
55
 
56
56
  def get_credentials(options = {})
57
- @credentials ||= (read_credentials || fetch_credentials(options))
57
+ @credentials ||= (env_credentials || read_credentials || fetch_credentials(options))
58
+ end
59
+
60
+ def env_credentials
61
+ if (login = ENV['CONJUR_AUTHN_LOGIN']) && (api_key = ENV['CONJUR_AUTHN_API_KEY'])
62
+ [ login, api_key ]
63
+ else
64
+ nil
65
+ end
58
66
  end
59
67
 
60
68
  def read_credentials
@@ -11,22 +11,30 @@ class Conjur::Command
11
11
  'resource:deny' => lambda{|e| "denied #{e[:privilege]} from #{e[:grantee]} on #{e[:resource]}" },
12
12
  'resource:permitted_roles' => lambda{|e| "listed roles permitted to #{e[:privilege]} on #{e[:resource]}" },
13
13
  'role:check' => lambda{|e| "checked that #{e[:role] == e[:user] ? 'they' : e[:role]} can #{e[:privilege]} #{e[:resource]} (#{e[:allowed]})" },
14
- 'role:grant' => lambda{|e| "granted role #{e[:role]} to #{e[:member]} #{e[:admin_option] ? ' with ' : ' without '}admin" },
14
+ 'role:grant' => lambda{|e| "granted role #{e[:role]} to #{e[:member]} #{e[:admin_option] ? 'with' : 'without'} admin" },
15
15
  'role:revoke' => lambda{|e| "revoked role #{e[:role]} from #{e[:member]}" },
16
- 'role:create' => lambda{|e| "created role #{e[:role]}" }
16
+ 'role:create' => lambda{|e| "created role #{e[:role]}" },
17
+ 'audit' => lambda{ |e|
18
+ action_part = [ e[:facility], e[:action] ].compact.join(":")
19
+ actor_part = e[:role] ? "by #{e[:role]}" : nil
20
+ resource_part = e[:resource_id] ? "on #{e[:resource_id]}" : nil
21
+ allowed_part = e.has_key?(:allowed) ? "(allowed: #{e[:allowed]})" : nil
22
+ message_part = e[:audit_message] ? "; message: #{e[:audit_message]}" : ""
23
+ statement = [ action_part, actor_part, resource_part, allowed_part ].compact.join(" ")
24
+ "reported #{statement}"+ message_part
25
+ }
17
26
  }
18
27
 
19
-
20
28
  def short_event_format e
21
29
  e.symbolize_keys!
22
30
  s = "[#{Time.parse(e[:timestamp])}]"
23
31
  s << " #{e[:user]}"
24
32
  s << " (as #{e[:acting_as]})" if e[:acting_as] != e[:user]
25
- formatter = SHORT_FORMATS["#{e[:kind]}:#{e[:action]}"]
33
+ formatter = SHORT_FORMATS["#{e[:kind]}:#{e[:action]}"] || SHORT_FORMATS[e[:kind]]
26
34
  if formatter
27
35
  s << " " << formatter.call(e)
28
36
  else
29
- s << " unknown event: #{e[:asset]}:#{e[:action]}!"
37
+ s << " unknown event: #{e[:kind]}:#{e[:action]}!"
30
38
  end
31
39
  s << " (failed with #{e[:error]})" if e[:error]
32
40
  s
@@ -53,6 +61,10 @@ class Conjur::Command
53
61
 
54
62
  def show_audit_events events, options
55
63
  events = [events] unless events.kind_of?(Array)
64
+ # offset and limit options seem to be broken. this is a temporary workaround (should be applied on server-side eventually)
65
+ events = events.drop(options[:offset]) if options[:offset]
66
+ events = events.take(options[:limit]) if options[:limit]
67
+
56
68
  if options[:short]
57
69
  events.each{|e| puts short_event_format(e)}
58
70
  else
@@ -82,14 +94,13 @@ class Conjur::Command
82
94
  end
83
95
  end
84
96
 
85
- desc "Show audit events"
86
- command :audit do |audit|
97
+ desc "Fetch audit events"
98
+ command :audit do |audit|
87
99
  audit.desc "Show all audit events visible to the current user"
88
100
  audit_feed_command audit, :all do |args, options|
89
101
  api.audit(options){ |es| show_audit_events es, options }
90
102
  end
91
103
 
92
-
93
104
  audit.desc "Show audit events related to a role"
94
105
  audit.arg_name 'role'
95
106
  audit_feed_command audit, :role do |args, options|
@@ -97,13 +108,12 @@ class Conjur::Command
97
108
  api.audit_role(id, options){ |es| show_audit_events es, options }
98
109
  end
99
110
 
100
-
101
111
  audit.desc "Show audit events related to a resource"
102
112
  audit.arg_name 'resource'
103
113
  audit_feed_command audit, :resource do |args, options|
104
114
  id = full_resource_id(require_arg args, "resource")
105
115
  api.audit_resource(id, options){|es| show_audit_events es, options}
106
- end
116
+ end
107
117
  end
108
118
  end
109
- end
119
+ end
@@ -94,7 +94,10 @@ class Conjur::Command::Init < Conjur::Command
94
94
 
95
95
  exit_now! "account is required" if account.blank?
96
96
 
97
- config = { account: account }
97
+ config = {
98
+ account: account,
99
+ plugins: []
100
+ }
98
101
 
99
102
  config[:appliance_url] = "https://#{hostname}/api" unless hostname.blank?
100
103
 
@@ -0,0 +1,69 @@
1
+ shared_context "default audit behavior" do
2
+ let(:common_prefix) { "[#{default_audit_event["timestamp"]}] #{default_audit_event["user"]}" }
3
+
4
+ let(:default_audit_event) {
5
+ {
6
+ "request" => {
7
+ "ip" => "1.2.3.4",
8
+ "url"=>"https://conjur/api",
9
+ "method"=>"POST",
10
+ "uuid" => "abcdef",
11
+ "params"=> {
12
+ "controller"=>"role",
13
+ "action"=>"create",
14
+ "account"=>"the-account"
15
+ }
16
+ },
17
+ "user" => "account:user:alice",
18
+ "acting_as" => "account:group:admins",
19
+ "conjur" => { # new behaviour
20
+ "user" => "account:user:alice",
21
+ "role" => "account:group:admins",
22
+ "domain" => "authz",
23
+ "env" => "test",
24
+ "account" => "the-account"
25
+ },
26
+ "completely_custom_field" => "with some value",
27
+ "kind" => "some_asset",
28
+ "action" => "some_action",
29
+ "user" => "account:user:alice",
30
+ "id" => 12345,
31
+ "timestamp" => Time.now().to_s,
32
+ "event_id" => "xaxaxaxaxa",
33
+ "resources" => ["the-account:layer:resources/production", "layer:resources/frontend"],
34
+ "roles" => ["the-account:group:roles/qa", "group:roles/ssh_users"]
35
+ }
36
+ }
37
+
38
+ shared_examples_for "it supports standard prefix:" do
39
+ describe "if acting_as is the same as user" do
40
+ let(:audit_event) { test_event.tap { |e| e["acting_as"]=e["user"] } }
41
+ it "prints default prefix" do
42
+ expect { invoke }.to write(common_prefix)
43
+ end
44
+ it "does not print 'acting_as' statement" do
45
+ expect { invoke }.to_not write(common_prefix+" (as ")
46
+ end
47
+ end
48
+
49
+ describe "if acting_as is different from user" do
50
+ it 'prints default prefix followed by (acting as..) statement' do
51
+ expect { invoke }.to write(common_prefix+" (as #{audit_event['acting_as']})")
52
+ end
53
+ end
54
+ end
55
+
56
+ shared_examples_for "it recognizes error messages:" do
57
+ describe "if :error is not empty" do
58
+ let(:audit_event) { test_event.merge("error"=>"everything's down") }
59
+ it 'appends (failed with...) statement' do
60
+ expect { invoke }.to write(" (failed with everything's down)")
61
+ end
62
+ end
63
+ describe "if :error is empty" do
64
+ it 'does not print "failed with" statement' do
65
+ expect { invoke }.not_to write(" (failed with ")
66
+ end
67
+ end
68
+ end
69
+ end
@@ -3,6 +3,7 @@ module RSpec::Core::DSL
3
3
  describe *argv do
4
4
  let(:invoke) do
5
5
  Conjur::CLI.error_device = $stderr
6
+ # TODO: allow proper handling of description like "audit:send 'hello world'"
6
7
  Conjur::CLI.run argv.first.split(' ')
7
8
  end
8
9
  instance_eval &block
@@ -1,3 +1,4 @@
1
1
  require 'conjur/command/rspec/describe_command'
2
2
  require 'conjur/command/rspec/output_matchers'
3
3
  require 'conjur/command/rspec/mock_services'
4
+ require 'conjur/command/rspec/audit_helpers'
data/lib/conjur/config.rb CHANGED
@@ -31,7 +31,11 @@ module Conjur
31
31
  end
32
32
 
33
33
  def default_config_files
34
- [ File.join("/etc", "conjur.conf"), ( ENV['CONJURRC'] || File.expand_path("~/.conjurrc") ), '.conjurrc' ]
34
+ [ File.join("/etc", "conjur.conf"), ( ENV['CONJURRC'] || [ File.expand_path("~/.conjurrc"), '.conjurrc'] ) ].flatten.tap do |f|
35
+ if f.include?'.conjurrc' and File.file?('.conjurrc') and not ENV['CONJURRC']=='.conjurrc'
36
+ $stderr.puts "WARNING: .conjurrc file from current directory is used. This behaviour is deprecated. Use ENV['CONJURRC'] to explicitly define custom configuration file if needed"
37
+ end
38
+ end
35
39
  end
36
40
 
37
41
  def load(config_files = default_config_files)
@@ -55,14 +59,14 @@ module Conjur
55
59
  require 'conjur/configuration'
56
60
  keys = Config.keys.dup
57
61
  keys.delete(:plugins)
58
-
62
+
59
63
  cfg = Conjur.configuration
60
64
  keys.each do |k|
61
- begin
62
- next if cfg.send(k)
63
- rescue
64
- # we use try..rescue because Conjur.configuration
65
- # provides no API to see if key is set
65
+ if Conjur.configuration.respond_to?("#{k}_env_var") && (env_var = Conjur.configuration.send("#{k}_env_var")) && (v = ENV[env_var])
66
+ if Conjur.log
67
+ Conjur.log << "Not overriding environment setting #{k}=#{v}\n"
68
+ end
69
+ next
66
70
  end
67
71
  value = Config[k]
68
72
  cfg.set k, value if value
@@ -195,7 +195,7 @@ module Conjur
195
195
  api.send(create_method, options)
196
196
  end
197
197
  end
198
- if annotations.kind_of? Hash
198
+ if annotations.kind_of?(Hash) && !annotations.blank?
199
199
  # TODO: fix API to make 'annotations' available directly on objects
200
200
  # https://basecamp.com/1949725/projects/4268938-api-version-4-x/todos/84970444-high-support
201
201
  obj_as_resource = obj.resource
@@ -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 = "4.10.3"
22
+ VERSION = "4.12.0"
23
23
  ::Version=VERSION
24
24
  end
data/spec/authn_spec.rb CHANGED
@@ -2,6 +2,23 @@ require 'conjur/authn'
2
2
  require 'conjur/config'
3
3
 
4
4
  describe Conjur::Authn do
5
+ describe "credentials from environment" do
6
+ before {
7
+ Conjur::Authn.instance_variable_set("@credentials", nil)
8
+ ENV.should_receive(:[]).with("CONJUR_AUTHN_LOGIN").and_return "the-login"
9
+ ENV.should_receive(:[]).with("CONJUR_AUTHN_API_KEY").and_return "the-api-key"
10
+ }
11
+ after {
12
+ Conjur::Authn.instance_variable_set("@credentials", nil)
13
+ }
14
+ it "are used to authn" do
15
+ Conjur::Authn.get_credentials.should == [ "the-login", "the-api-key" ]
16
+ end
17
+ it "are not written to netrc" do
18
+ Conjur::Authn.stub(:write_credentials).and_raise "should not write credentials"
19
+ Conjur::Authn.get_credentials
20
+ end
21
+ end
5
22
  describe "netrc" do
6
23
  before {
7
24
  Conjur::Authn.instance_variable_set("@netrc", nil)
@@ -80,4 +80,271 @@ describe Conjur::Command::Audit, logged_in: true do
80
80
  describe "audit:all" do
81
81
  it_calls_the_api "audit:all", :audit, {}
82
82
  end
83
- end
83
+
84
+ describe "output formatting:" do
85
+ include_context "default audit behavior"
86
+
87
+ before {
88
+ api.stub(:audit_event_feed).and_yield([audit_event])
89
+ }
90
+
91
+ describe_command "audit all" do
92
+ let(:audit_event) { default_audit_event }
93
+ it 'prints full JSON retrieved from API' do
94
+ expect { invoke }.to write( JSON.pretty_generate(audit_event) )
95
+ end
96
+ end
97
+
98
+ describe_command "audit all -s" do
99
+ let(:common_prefix) { "[#{default_audit_event["timestamp"]}] #{default_audit_event["user"]}" }
100
+ let(:audit_event) { test_event }
101
+ shared_examples_for "it supports standard prefix:" do
102
+ describe "if acting_as is the same as user" do
103
+ let(:audit_event) { test_event.tap { |e| e["acting_as"]=e["user"] } }
104
+ it "prints default prefix" do
105
+ expect { invoke }.to write(common_prefix)
106
+ end
107
+ it "does not print 'acting_as' statement" do
108
+ expect { invoke }.to_not write(common_prefix+" (as ")
109
+ end
110
+ end
111
+
112
+ describe "if acting_as is different from user" do
113
+ it 'prints default prefix followed by (acting as..) statement' do
114
+ expect { invoke }.to write(common_prefix+" (as #{audit_event['acting_as']})")
115
+ end
116
+ end
117
+ end
118
+
119
+ shared_examples_for "it recognizes error messages:" do
120
+ describe "if :error is not empty" do
121
+ let(:audit_event) { test_event.merge("error"=>"everything's down") }
122
+ it 'appends (failed with...) statement' do
123
+ expect { invoke }.to write(" (failed with everything's down)")
124
+ end
125
+ end
126
+ describe "if :error is empty" do
127
+ it 'does not print "failed with" statement' do
128
+ expect { invoke }.not_to write(" (failed with ")
129
+ end
130
+ end
131
+
132
+ end
133
+
134
+ describe "(unknown kind:action)" do
135
+ let(:test_event) { default_audit_event }
136
+ it_behaves_like "it supports standard prefix:"
137
+ it_behaves_like "it recognizes error messages:"
138
+ it "prints 'unknown event: <kind>:<action>'" do
139
+ expect { invoke }.to write(" unknown event: some_asset:some_action!")
140
+ end
141
+ end
142
+
143
+ describe "(resource:check)" do
144
+ let(:test_event) { default_audit_event.merge("kind"=>"resource",
145
+ "action"=>"check",
146
+ "privilege"=>"fry",
147
+ "resource"=>"food:bacon",
148
+ "allowed" => "false"
149
+ )
150
+ }
151
+ it_behaves_like "it supports standard prefix:"
152
+ it_behaves_like "it recognizes error messages:"
153
+ it "prints 'checked that they...'" do
154
+ expect { invoke }.to write(" checked that they can fry food:bacon (false)")
155
+ end
156
+
157
+ end
158
+
159
+ describe "(resource:create)" do
160
+ let(:test_event) { default_audit_event.merge("kind"=>"resource", "action" => "create",
161
+ "resource" => "food:bacon",
162
+ "owner" => "user:cook"
163
+ )
164
+ }
165
+ it_behaves_like "it supports standard prefix:"
166
+ it_behaves_like "it recognizes error messages:"
167
+ it "prints 'created resource ... owned by ... '" do
168
+ expect { invoke }.to write(" created resource food:bacon owned by user:cook")
169
+ end
170
+ end
171
+
172
+ describe "(resource:update)" do
173
+ let(:test_event) { default_audit_event.merge("kind"=>"resource", "action" => "update",
174
+ "resource" => "food:bacon",
175
+ "owner" => "user:cook"
176
+ )
177
+ }
178
+ it_behaves_like "it supports standard prefix:"
179
+ it_behaves_like "it recognizes error messages:"
180
+ it "prints 'gave .. to .. '" do
181
+ expect { invoke }.to write(" gave food:bacon to user:cook")
182
+ end
183
+ end
184
+
185
+ describe "(resource:destroy)" do
186
+ let(:test_event) { default_audit_event.merge("kind"=>"resource", "action" => "destroy",
187
+ "resource" => "food:bacon"
188
+ )
189
+ }
190
+ it_behaves_like "it supports standard prefix:"
191
+ it_behaves_like "it recognizes error messages:"
192
+ it "prints 'destroyed resource ... '" do
193
+ expect { invoke }.to write(" destroyed resource food:bacon")
194
+ end
195
+ end
196
+
197
+ describe "(resource:permit)" do
198
+ let(:test_event) { default_audit_event.merge("kind"=>"resource", "action" => "permit",
199
+ "resource" => "food:bacon",
200
+ "privilege" => "fry",
201
+ "grantee" => "user:cook"
202
+ )
203
+ }
204
+ it_behaves_like "it supports standard prefix:"
205
+ it_behaves_like "it recognizes error messages:"
206
+ it "prints 'permitted .. to .. (grant option: .. ) '" do
207
+ expect { invoke }.to write(" permitted user:cook to fry food:bacon (grant option: false)")
208
+ end
209
+ end
210
+
211
+ describe "(resource:deny)" do
212
+ let(:test_event) { default_audit_event.merge("kind"=>"resource", "action" => "deny",
213
+ "resource" => "food:bacon",
214
+ "privilege" => "fry",
215
+ "grantee" => "user:cook"
216
+ )
217
+ }
218
+ it_behaves_like "it supports standard prefix:"
219
+ it_behaves_like "it recognizes error messages:"
220
+ it "prints 'denied .. from .. on ..'" do
221
+ expect { invoke }.to write(" denied fry from user:cook on food:bacon")
222
+ end
223
+ end
224
+
225
+ describe "(resource:permitted_roles)" do
226
+ let(:test_event) { default_audit_event.merge("kind"=>"resource", "action" => "permitted_roles",
227
+ "resource" => "food:bacon",
228
+ "privilege" => "fry"
229
+ )
230
+ }
231
+ it_behaves_like "it supports standard prefix:"
232
+ it_behaves_like "it recognizes error messages:"
233
+ it "prints 'listed roles permitted to .. on ..'" do
234
+ expect { invoke }.to write(" listed roles permitted to fry on food:bacon")
235
+ end
236
+ end
237
+
238
+ describe "(role:check)" do
239
+ let(:options_set) {
240
+ {
241
+ "kind"=>"role", "action" => "check",
242
+ "resource" => "food:bacon",
243
+ "privilege" => "fry",
244
+ "allowed" => "false"
245
+ }
246
+ }
247
+ describe 'on themselves' do
248
+ let(:test_event) { default_audit_event.merge(options_set).merge("role" => default_audit_event["user"]) }
249
+ it_behaves_like "it supports standard prefix:"
250
+ it_behaves_like "it recognizes error messages:"
251
+ it "prints 'checked that they...'" do
252
+ expect { invoke }.to write(" checked that they can fry food:bacon (false)")
253
+ end
254
+ end
255
+ describe 'on others' do
256
+ let(:test_event) { default_audit_event.merge(options_set).merge("role" => "some:other:guy") }
257
+ it_behaves_like "it supports standard prefix:"
258
+ it_behaves_like "it recognizes error messages:"
259
+ it "prints 'checked that they...'" do
260
+ expect { invoke }.to write(" checked that some:other:guy can fry food:bacon (false)")
261
+ end
262
+ end
263
+ end
264
+
265
+ describe "(role:grant)" do
266
+ let(:options_set) {
267
+ {
268
+ "kind"=>"role", "action" => "grant",
269
+ "member" => "other:guy",
270
+ "role" => "super:user"
271
+ }
272
+ }
273
+ describe 'without admin option' do
274
+ let(:test_event) { default_audit_event.merge(options_set) }
275
+ it_behaves_like "it supports standard prefix:"
276
+ it_behaves_like "it recognizes error messages:"
277
+ it "prints 'granted role .. to .. without admin'" do
278
+ expect { invoke }.to write(" granted role super:user to other:guy without admin")
279
+ end
280
+ end
281
+ describe 'with admin option' do
282
+ let(:test_event) { default_audit_event.merge(options_set).merge("admin_option" => true) }
283
+ it_behaves_like "it supports standard prefix:"
284
+ it_behaves_like "it recognizes error messages:"
285
+ it "prints 'granted role .. to .. with admin'" do
286
+ expect { invoke }.to write(" granted role super:user to other:guy with admin")
287
+ end
288
+ end
289
+ end
290
+
291
+ describe "(role:revoke)" do
292
+ let(:test_event) { default_audit_event.merge("kind"=>"role", "action" => "revoke",
293
+ "role" => "super:user",
294
+ "member" => "other:guy"
295
+ )
296
+ }
297
+ it_behaves_like "it supports standard prefix:"
298
+ it_behaves_like "it recognizes error messages:"
299
+ it "prints 'revoked role .. from .." do
300
+ expect { invoke }.to write(" revoked role super:user from other:guy")
301
+ end
302
+ end
303
+
304
+ describe "(role:create)" do
305
+ let(:test_event) { default_audit_event.merge("kind"=>"role", "action" => "create",
306
+ "role" => "super:user",
307
+ )
308
+ }
309
+ it_behaves_like "it supports standard prefix:"
310
+ it_behaves_like "it recognizes error messages:"
311
+ it "prints 'created role .. " do
312
+ expect { invoke }.to write(" created role super:user")
313
+ end
314
+ end
315
+ end
316
+ end
317
+
318
+ describe "limit and offset" do
319
+ let(:events) { (1 .. 5).map { |x| { event: x } } }
320
+ before {
321
+ api.stub(:audit_event_feed).and_yield(events)
322
+ }
323
+
324
+ describe_command "audit all" do
325
+ it "prints all the elements" do
326
+ (expect { invoke }.to write).should == events.map {|e| JSON.pretty_generate(e)}.join("\n")+"\n"
327
+ end
328
+ end
329
+
330
+ describe_command "audit all -l 2" do
331
+ it "prints only <limit> elements" do
332
+ (expect { invoke }.to write).should == events[0..1].map {|e| JSON.pretty_generate(e)}.join("\n")+"\n"
333
+ end
334
+ end
335
+
336
+ describe_command "audit all -o 2" do
337
+ it "skips <offset> elements" do
338
+ (expect { invoke }.to write).should == events[2..4].map {|e| JSON.pretty_generate(e)}.join("\n")+"\n"
339
+ end
340
+ end
341
+
342
+ describe_command "audit all -o 2 -l 2" do
343
+ it "skips <offset> elements and prints only <limit> of remaining part" do
344
+ (expect { invoke }.to write).should == events[2..3].map {|e| JSON.pretty_generate(e)}.join("\n")+"\n"
345
+ end
346
+ end
347
+
348
+ end
349
+
350
+ end
@@ -83,20 +83,21 @@ describe Conjur::Command::Init do
83
83
  expect { invoke }.to raise_error(GLI::CustomExit, /unable to retrieve certificate/i)
84
84
  end
85
85
  end
86
- describe_command 'init -a the-account -h google.com' do
87
- it "writes the config and cert" do
88
- HighLine.any_instance.stub(:ask).and_return "yes"
89
- File.should_receive(:open).twice
90
- invoke
91
- end
92
- end
93
- describe_command 'init -a the-account -h https://google.com' do
94
- it "writes the config and cert" do
95
- HighLine.any_instance.stub(:ask).and_return "yes"
96
- File.should_receive(:open).twice
97
- invoke
98
- end
99
- end
86
+ # KEG: These tests have a nasty habit of hanging
87
+ # describe_command 'init -a the-account -h google.com' do
88
+ # it "writes the config and cert" do
89
+ # HighLine.any_instance.stub(:ask).and_return "yes"
90
+ # File.should_receive(:open).twice
91
+ # invoke
92
+ # end
93
+ # end
94
+ # describe_command 'init -a the-account -h https://google.com' do
95
+ # it "writes the config and cert" do
96
+ # HighLine.any_instance.stub(:ask).and_return "yes"
97
+ # File.should_receive(:open).twice
98
+ # invoke
99
+ # end
100
+ # end
100
101
  describe_command 'init -a the-account -h localhost -c the-cert' do
101
102
  it "writes config and cert files" do
102
103
  File.should_receive(:open).twice
@@ -111,7 +112,8 @@ describe Conjur::Command::Init do
111
112
  expect(YAML.load(File.read(File.join(tmpdir, ".conjurrc")))).to eq({
112
113
  account: 'the-account',
113
114
  appliance_url: "https://localhost/api",
114
- cert_file: "#{tmpdir}/conjur-the-account.pem"
115
+ cert_file: "#{tmpdir}/conjur-the-account.pem",
116
+ plugins: [],
115
117
  }.stringify_keys)
116
118
 
117
119
  File.read(File.join(tmpdir, "conjur-the-account.pem")).should == "the-cert\n"
data/spec/config_spec.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'conjur/authn'
2
2
  require 'conjur/config'
3
+ require 'conjur/command/rspec/output_matchers'
3
4
 
4
5
  describe Conjur::Config do
5
6
  after {
@@ -15,6 +16,7 @@ describe Conjur::Config do
15
16
  ENV['HOME'] = realhome
16
17
  end
17
18
 
19
+ let(:deprecation_warning) { "WARNING: .conjurrc file from current directory is used. This behaviour is deprecated. Use ENV['CONJURRC'] to explicitly define custom configuration file if needed" }
18
20
  context "when CONJURRC is not set" do
19
21
  around do |example|
20
22
  oldrc = ENV.delete 'CONJURRC'
@@ -22,7 +24,53 @@ describe Conjur::Config do
22
24
  ENV['CONJURRC'] = oldrc
23
25
  end
24
26
 
27
+ it { should include('/etc/conjur.conf') }
25
28
  it { should include('/home/isfake/.conjurrc') }
29
+ it { should include('.conjurrc') }
30
+ context "When .conjurrc is present" do
31
+ before { File.stub(:file?).with('.conjurrc').and_return true }
32
+ it "Issues a deprecation warning" do
33
+ expect { subject }.to write(deprecation_warning).to(:stderr)
34
+ end
35
+ end
36
+ context "When .conjurrc is missing" do
37
+ before { File.stub(:file?).with('.conjurrc').and_return false }
38
+ it "Does not issue a deprecation warning" do
39
+ expect { subject }.to_not write(deprecation_warning).to(:stderr)
40
+ end
41
+ end
42
+ end
43
+
44
+ context "when CONJURRC is set" do
45
+ around do |example|
46
+ oldrc = ENV['CONJURRC']
47
+ ENV['CONJURRC']='stub_conjurrc'
48
+ example.run
49
+ ENV['CONJURRC'] = oldrc
50
+ end
51
+ it { should include('/etc/conjur.conf') }
52
+ it { should include('stub_conjurrc') }
53
+ it { should_not include('/home/isfake/.conjurrc') }
54
+ it { should_not include('.conjurrc') }
55
+ it "Does not issue a deprecation warning" do
56
+ expect { subject }.to_not write(deprecation_warning).to(:stderr)
57
+ end
58
+ end
59
+
60
+ context "when CONJURRC is set to .conjurrc" do
61
+ around do |example|
62
+ oldrc = ENV['CONJURRC']
63
+ ENV['CONJURRC']='.conjurrc'
64
+ example.run
65
+ ENV['CONJURRC'] = oldrc
66
+ end
67
+ before { File.stub(:file?).with('.conjurrc').and_return true }
68
+ it { should include('/etc/conjur.conf') }
69
+ it { should include('.conjurrc') }
70
+ it { should_not include('/home/isfake/.conjurrc') }
71
+ it "Does not issue a deprecation warning" do
72
+ expect { subject }.to_not write(deprecation_warning).to(:stderr)
73
+ end
26
74
  end
27
75
  end
28
76
 
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.10.3
4
+ version: 4.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafał Rzepecki
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-07-17 00:00:00.000000000 Z
12
+ date: 2014-08-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - '>='
33
33
  - !ruby/object:Gem::Version
34
- version: 4.9.1
34
+ version: 4.9.2
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - '>='
40
40
  - !ruby/object:Gem::Version
41
- version: 4.9.1
41
+ version: 4.9.2
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: gli
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -255,6 +255,7 @@ files:
255
255
  - lib/conjur/command/pubkeys.rb
256
256
  - lib/conjur/command/resources.rb
257
257
  - lib/conjur/command/roles.rb
258
+ - lib/conjur/command/rspec/audit_helpers.rb
258
259
  - lib/conjur/command/rspec/describe_command.rb
259
260
  - lib/conjur/command/rspec/helpers.rb
260
261
  - lib/conjur/command/rspec/mock_services.rb