ridley 2.3.0 → 2.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f571021ed99ad605622448d1f79edcb954abfafa
4
- data.tar.gz: 3549b22251eba2ecf03e1829531e90d6d32dc50e
3
+ metadata.gz: f7da3aeb7959de4937cc94f7ca1f72214816ed75
4
+ data.tar.gz: e103b754e4768cf2a704104978da665fcccf27f3
5
5
  SHA512:
6
- metadata.gz: 83ab54c5ef8ceb4128a6d12d1e6c741b9126b9e13fdc84b5a2cf68cc4eb76047e2bb77a3d28c8c4a3b3803d5ab970fa40b8494c260b552e1d0c60c38f748d71d
7
- data.tar.gz: e9662d26e3d80e53f6ee3e710f2cc089f8bfe07c6d32d23d3e337ebdf4bf438e45bf35d435b22c54da6e5b34c25b5e3f8cd2a5d0a5ecc23045526022d892619d
6
+ metadata.gz: 52b2039fca91e517019c01472e0bd8679a33427c964f7508989d77f19ca60037e5a5a68ceb75a6089f7997c5812c83516139cea71f6c0c68006b65ef8642c223
7
+ data.tar.gz: d550361f34542efa082c38ff3c8abd71aca4d0ee59a4427f640e49e3a9405db7fadf8b56b6e7fa8903ccb160406391114206ddd25c0836f9cfd636350fd7f6b6
data/README.md CHANGED
@@ -134,6 +134,7 @@ ridley.node #=> Ridley::NodeResource
134
134
  ridley.role #=> Ridley::RoleResource
135
135
  ridley.sandbox #=> Ridley::SandboxResource
136
136
  ridley.search #=> Ridley::SearchResource
137
+ ridley.user #=> Ridley::UserResource
137
138
  ```
138
139
 
139
140
  DataBagItems are the only exception to this rule. The DataBagItem resource is accessed from a DataBagObject
@@ -377,6 +378,21 @@ Search will return an array of the appropriate Chef Objects if one of the defaul
377
378
  - client
378
379
  - environment
379
380
 
381
+ User Resource
382
+ -------------
383
+
384
+ ### Regenerating a user's private key
385
+
386
+ Works the same way as with a client resource.
387
+
388
+ ### Authenticating user's password
389
+
390
+ ```ruby
391
+ ridley = Ridley.new(...)
392
+ ridley.user.authenticate('username', 'password')
393
+ ridley.user.find('username').authenticate('password')
394
+ ```
395
+
380
396
  Authors and Contributors
381
397
  ------------------------
382
398
  - Jamie Winsor (<jamie@vialstudios.com>)
@@ -0,0 +1,57 @@
1
+ module Ridley
2
+ class UserObject < Ridley::ChefObject
3
+ set_chef_id "name"
4
+ set_chef_type "user"
5
+ set_chef_json_class "Chef::User"
6
+
7
+ attribute :name,
8
+ type: String,
9
+ required: true
10
+
11
+ attribute :admin,
12
+ type: Boolean,
13
+ required: true,
14
+ default: false
15
+
16
+ attribute :certificate,
17
+ type: String
18
+
19
+ attribute :public_key,
20
+ type: String
21
+
22
+ attribute :private_key,
23
+ type: [ String, Boolean ],
24
+ default: false
25
+
26
+ attribute :password,
27
+ type: String
28
+
29
+ attribute :orgname,
30
+ type: String
31
+
32
+ # Regenerates the private key of the instantiated user object. The new
33
+ # private key will be set to the value of the 'private_key' accessor
34
+ # of the instantiated user object.
35
+ #
36
+ # @return [Boolean]
37
+ # true for success and false for failure
38
+ def regenerate_key
39
+ self.private_key = true
40
+ self.save
41
+ end
42
+
43
+ def authenticate(password)
44
+ @resource.authenticate(self.chef_id, password)
45
+ end
46
+
47
+ # Override to_json to reflect to massage the returned attributes based on the type
48
+ # of connection. Only OHC/OPC requires the json_class attribute is not present.
49
+ def to_json
50
+ if resource.connection.hosted?
51
+ to_hash.except(:json_class).to_json
52
+ else
53
+ super
54
+ end
55
+ end
56
+ end
57
+ end
data/lib/ridley/client.rb CHANGED
@@ -26,6 +26,7 @@ module Ridley
26
26
  supervise_as :sandbox_resource, Ridley::SandboxResource, connection_registry,
27
27
  options[:client_name], options[:client_key], options.slice(*Ridley::Connection::VALID_OPTIONS)
28
28
  supervise_as :search_resource, Ridley::SearchResource, connection_registry
29
+ supervise_as :user_resource, Ridley::UserResource, connection_registry
29
30
  end
30
31
  end
31
32
 
@@ -181,6 +182,11 @@ module Ridley
181
182
  @resources_registry[:sandbox_resource]
182
183
  end
183
184
 
185
+ # @return [Ridley::UserResource]
186
+ def user
187
+ @resources_registry[:user_resource]
188
+ end
189
+
184
190
  # Perform a search the Chef Server
185
191
  #
186
192
  # @param [#to_sym, #to_s] index
@@ -0,0 +1,36 @@
1
+ module Ridley
2
+ # @example listing all users
3
+ # conn = Ridley.new(...)
4
+ # conn.user.all #=> [
5
+ # #<Ridley::ClientObject chef_id:'admin'>
6
+ # ]
7
+ class UserResource < Ridley::Resource
8
+ set_resource_path "users"
9
+ represented_by Ridley::UserObject
10
+
11
+ # Retrieves a user from the remote connection matching the given chef_id
12
+ # and regenerates it's private key. An instance of the updated object will
13
+ # be returned and have a value set for the 'private_key' accessor.
14
+ #
15
+ # @param [String, #chef_id] chef_user
16
+ #
17
+ # @raise [Errors::ResourceNotFound]
18
+ # if a user with the given chef_id is not found
19
+ #
20
+ # @return [Ridley::UserObject]
21
+ def regenerate_key(chef_user)
22
+ unless chef_user = find(chef_user)
23
+ abort Errors::ResourceNotFound.new("user '#{chef_user}' not found")
24
+ end
25
+
26
+ chef_user.private_key = true
27
+ update(chef_user)
28
+ end
29
+
30
+ def authenticate(username, password)
31
+ resp = request(:post, '/authenticate_user', {'name' => username, 'password' => password}.to_json)
32
+ abort("Username mismatch: sent #{username}, received #{resp['name']}") unless resp['name'] == username
33
+ resp['verified']
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
1
  module Ridley
2
- VERSION = "2.3.0"
2
+ VERSION = "2.4.0"
3
3
  end
@@ -0,0 +1,130 @@
1
+ require 'spec_helper'
2
+
3
+ describe "User API operations", type: "wip" do
4
+ let(:server_url) { Ridley::RSpec::ChefServer.server_url }
5
+ let(:user_name) { "reset" }
6
+ let(:user_key) { fixtures_path.join('reset.pem').to_s }
7
+ let(:connection) { Ridley.new(server_url: server_url, client_name: user_name, client_key: user_key) }
8
+
9
+ describe "finding a user" do
10
+ context "when the server has a user of the given name" do
11
+ before { chef_user("reset", admin: false) }
12
+
13
+ it "returns a UserObject" do
14
+ connection.user.find("reset").should be_a(Ridley::UserObject)
15
+ end
16
+ end
17
+
18
+ context "when the server does not have the user" do
19
+ it "returns a nil value" do
20
+ connection.user.find("not_there").should be_nil
21
+ end
22
+ end
23
+ end
24
+
25
+ describe "creating a user" do
26
+ it "returns a Ridley::UserObject" do
27
+ connection.user.create(name: "reset").should be_a(Ridley::UserObject)
28
+ end
29
+
30
+ it "adds a user to the chef server" do
31
+ old = connection.user.all.length
32
+ connection.user.create(name: "reset")
33
+ connection.user.all.should have(old + 1).items
34
+ end
35
+
36
+ it "has a value for #private_key" do
37
+ connection.user.create(name: "reset").private_key.should_not be_nil
38
+ end
39
+ end
40
+
41
+ describe "deleting a user" do
42
+ before { chef_user("reset", admin: false) }
43
+
44
+ it "returns a Ridley::UserObject object" do
45
+ connection.user.delete("reset").should be_a(Ridley::UserObject)
46
+ end
47
+
48
+ it "removes the user from the server" do
49
+ connection.user.delete("reset")
50
+
51
+ connection.user.find("reset").should be_nil
52
+ end
53
+ end
54
+
55
+ describe "deleting all users" do
56
+ before(:each) do
57
+ chef_user("reset", admin: false)
58
+ chef_user("jwinsor", admin: false)
59
+ end
60
+
61
+ it "returns an array of Ridley::UserObject objects" do
62
+ connection.user.delete_all.should each be_a(Ridley::UserObject)
63
+ end
64
+
65
+ it "deletes all users from the remote" do
66
+ connection.user.delete_all
67
+ connection.user.all.should have(0).users
68
+ end
69
+ end
70
+
71
+ describe "listing all users" do
72
+ before(:each) do
73
+ chef_user("reset", admin: false)
74
+ chef_user("jwinsor", admin: false)
75
+ end
76
+
77
+ it "returns an array of Ridley::UserObject objects" do
78
+ connection.user.all.should each be_a(Ridley::UserObject)
79
+ end
80
+
81
+ it "returns all of the users on the server" do
82
+ connection.user.all.should have(3).items
83
+ end
84
+ end
85
+
86
+ describe "regenerating a user's private key" do
87
+ before { chef_user("reset", admin: false) }
88
+
89
+ it "returns a Ridley::UserObject object with a value for #private_key" do
90
+ connection.user.regenerate_key("reset").private_key.should match(/^-----BEGIN RSA PRIVATE KEY-----/)
91
+ end
92
+ end
93
+
94
+ describe "authenticating a user" do
95
+ before { chef_user('reset', password: 'swordfish') }
96
+
97
+ it "returns true when given valid username & password" do
98
+ expect(connection.user.authenticate('reset', 'swordfish')).to be_true
99
+ end
100
+
101
+ it "returns false when given valid username & invalid password" do
102
+ expect(connection.user.authenticate('reset', "not a swordfish")).to be_false
103
+ end
104
+
105
+ it "returns false when given invalid username & valid password" do
106
+ expect(connection.user.authenticate("someone-else", 'swordfish')).to be_false
107
+ end
108
+
109
+ it "works also on a User object level" do
110
+ expect(connection.user.find('reset').authenticate('swordfish')).to be_true
111
+ expect(connection.user.find('reset').authenticate('not a swordfish')).to be_false
112
+ end
113
+ end
114
+
115
+ describe "changing user's password" do
116
+ before { chef_user('reset', password: 'swordfish') }
117
+ subject { connection.user.find('reset') }
118
+
119
+ it "changes the password with which user can authenticate" do
120
+ expect(subject.authenticate('swordfish')).to be_true
121
+ expect(subject.authenticate('salmon')).to be_false
122
+
123
+ subject.password = 'salmon'
124
+ subject.save
125
+
126
+ expect(subject.authenticate('swordfish')).to be_false
127
+ expect(subject.authenticate('salmon')).to be_true
128
+ end
129
+ end
130
+ end
@@ -69,6 +69,10 @@ module Ridley::RSpec
69
69
  load_data(:roles, name, hash)
70
70
  end
71
71
 
72
+ def chef_user(name, hash = Hash.new)
73
+ load_data(:users, name, hash)
74
+ end
75
+
72
76
  def chef_zero_connection
73
77
  Ridley::Connection.new(ChefServer.server_url, "reset", fixtures_path.join('reset.pem').to_s)
74
78
  end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ridley::UserResource, type: 'wip' do
4
+ subject { described_class.new(double('registry')) }
5
+ let(:user_id) { "rspec-user" }
6
+ let(:user_password) { "swordfish" }
7
+
8
+ describe "#regenerate_key" do
9
+ before { subject.stub(find: nil) }
10
+
11
+ context "when a user with the given ID exists" do
12
+ let(:user) { double('chef-user') }
13
+ before { subject.should_receive(:find).with(user_id).and_return(user) }
14
+
15
+ it "sets the private key to true and updates the user" do
16
+ user.should_receive(:private_key=).with(true)
17
+ subject.should_receive(:update).with(user)
18
+
19
+ subject.regenerate_key(user_id)
20
+ end
21
+ end
22
+
23
+ context "when a user with the given ID does not exist" do
24
+ before { subject.should_receive(:find).with(user_id).and_return(nil) }
25
+
26
+ it "raises a ResourceNotFound error" do
27
+ expect {
28
+ subject.regenerate_key(user_id)
29
+ }.to raise_error(Ridley::Errors::ResourceNotFound)
30
+ end
31
+ end
32
+ end
33
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ridley
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamie Winsor
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-27 00:00:00.000000000 Z
12
+ date: 2013-12-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -289,6 +289,7 @@ files:
289
289
  - lib/ridley/chef_objects/node_object.rb
290
290
  - lib/ridley/chef_objects/role_object.rb
291
291
  - lib/ridley/chef_objects/sandbox_object.rb
292
+ - lib/ridley/chef_objects/user_object.rb
292
293
  - lib/ridley/client.rb
293
294
  - lib/ridley/command_context.rb
294
295
  - lib/ridley/command_context/unix_uninstall.rb
@@ -319,6 +320,7 @@ files:
319
320
  - lib/ridley/resources/role_resource.rb
320
321
  - lib/ridley/resources/sandbox_resource.rb
321
322
  - lib/ridley/resources/search_resource.rb
323
+ - lib/ridley/resources/user_resource.rb
322
324
  - lib/ridley/sandbox_uploader.rb
323
325
  - lib/ridley/version.rb
324
326
  - ridley.gemspec
@@ -333,6 +335,7 @@ files:
333
335
  - spec/acceptance/role_resource_spec.rb
334
336
  - spec/acceptance/sandbox_resource_spec.rb
335
337
  - spec/acceptance/search_resource_spec.rb
338
+ - spec/acceptance/user_resource_spec.rb
336
339
  - spec/fixtures/chefignore
337
340
  - spec/fixtures/encrypted_data_bag_secret
338
341
  - spec/fixtures/example_cookbook/Guardfile
@@ -394,6 +397,7 @@ files:
394
397
  - spec/unit/ridley/resources/role_resource_spec.rb
395
398
  - spec/unit/ridley/resources/sandbox_resource_spec.rb
396
399
  - spec/unit/ridley/resources/search_resource_spec.rb
400
+ - spec/unit/ridley/resources/user_resource_spec.rb
397
401
  - spec/unit/ridley/sandbox_uploader_spec.rb
398
402
  - spec/unit/ridley_spec.rb
399
403
  homepage: https://github.com/RiotGames/ridley
@@ -430,6 +434,7 @@ test_files:
430
434
  - spec/acceptance/role_resource_spec.rb
431
435
  - spec/acceptance/sandbox_resource_spec.rb
432
436
  - spec/acceptance/search_resource_spec.rb
437
+ - spec/acceptance/user_resource_spec.rb
433
438
  - spec/fixtures/chefignore
434
439
  - spec/fixtures/encrypted_data_bag_secret
435
440
  - spec/fixtures/example_cookbook/Guardfile
@@ -491,6 +496,7 @@ test_files:
491
496
  - spec/unit/ridley/resources/role_resource_spec.rb
492
497
  - spec/unit/ridley/resources/sandbox_resource_spec.rb
493
498
  - spec/unit/ridley/resources/search_resource_spec.rb
499
+ - spec/unit/ridley/resources/user_resource_spec.rb
494
500
  - spec/unit/ridley/sandbox_uploader_spec.rb
495
501
  - spec/unit/ridley_spec.rb
496
502
  has_rdoc: