Skip to content

Commit af73b22

Browse files
committed
Merge branch 'master' into fujin/chef-169
Conflicts: chef/lib/chef/config.rb
2 parents 5fe1641 + 6e4114f commit af73b22

6 files changed

Lines changed: 53 additions & 74 deletions

File tree

chef-server-slice/Rakefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ end
4848

4949
desc "Install the gem"
5050
task :install do
51-
Merb::RakeHelper.install(GEM_NAME, :version => CHEF_SERVER_VERSION)
51+
sh %{sudo gem install pkg/#{GEM_NAME}-#{CHEF_SERVER_VERSION} --no-rdoc --no-ri}
5252
end
5353

5454
desc "Uninstall the gem"
5555
task :uninstall do
56-
Merb::RakeHelper.uninstall(GEM_NAME, :version => CHEF_SERVER_VERSION)
56+
sh %{sudo gem uninstall #{GEM_NAME} -x -v #{CHEF_SERVER_VERSION} }
5757
end
5858

5959
desc "Create a gemspec file"

chef-server-slice/app/controllers/openid_consumer.rb

Lines changed: 29 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@
1818
#
1919

2020
require 'pathname'
21-
22-
require "openid"
23-
require 'openid/store/filesystem'
21+
require 'openid'
22+
require (Chef::Config[:openid_cstore_couchdb] ? 'openid-store-couchdb' : 'openid/store/filesystem')
2423

2524
class ChefServerSlice::OpenidConsumer < ChefServerSlice::Application
2625

@@ -29,14 +28,19 @@ class ChefServerSlice::OpenidConsumer < ChefServerSlice::Application
2928
def index
3029
render
3130
end
32-
31+
3332
def start
34-
check_valid_openid_provider(params[:openid_identifier])
33+
oid = params[:openid_identifier]
34+
providers = Chef::Config[:openid_providers]
35+
raise(Unauthorized, "Sorry, #{openid} is not an authorized OpenID.") unless is_authorized_openid_identifier?(oid, providers)
36+
raise(Unauthorized, "Sorry, #{openid} is not an allowed OpenID Provider.") unless is_valid_openid_provider?(oid,providers)
37+
3538
begin
36-
oidreq = consumer.begin(params[:openid_identifier])
39+
oidreq = consumer.begin(oid)
3740
rescue OpenID::OpenIDError => e
3841
raise BadRequest, "Discovery failed for #{params[:openid_identifier]}: #{e}"
3942
end
43+
4044
return_to = absolute_slice_url(:openid_consumer_complete)
4145
realm = absolute_slice_url(:openid_consumer)
4246

@@ -49,36 +53,17 @@ def start
4953
end
5054

5155
def login
52-
check_authorized_openid_identifier(params[:openid_identifier])
53-
check_valid_openid_provider(params[:openid_identifier])
54-
begin
55-
oidreq = consumer.begin(params[:openid_identifier])
56-
rescue OpenID::OpenIDError => e
57-
raise BadRequest, "Discovery failed for #{params[:openid_identifier]}: #{e}"
58-
end
59-
return_to = absolute_slice_url(:openid_consumer_complete)
60-
realm = absolute_slice_url(:openid_consumer)
61-
62-
if oidreq.send_redirect?(realm, return_to, params[:immediate])
63-
return redirect(oidreq.redirect_url(realm, return_to, params[:immediate]))
64-
else
65-
@form_text = oidreq.form_markup(realm, return_to, params[:immediate], {'id' => 'openid_form'})
66-
render
67-
end
56+
start
6857
end
69-
58+
7059
def complete
7160
# FIXME - url_for some action is not necessarily the current URL.
7261
current_url = absolute_slice_url(:openid_consumer_complete)
7362
parameters = params.reject{|k,v| k == "controller" || k == "action"}
7463
oidresp = consumer.complete(parameters, current_url)
7564
case oidresp.status
7665
when OpenID::Consumer::FAILURE
77-
if oidresp.display_identifier
78-
raise BadRequest, "Verification of #{oidresp.display_identifier} failed: #{oidresp.message}"
79-
else
80-
raise BadRequest, "Verification failed: #{oidresp.message}"
81-
end
66+
raise BadRequest, "Verification failed: #{oidresp.message}" + (oidresp.display_identifier ? " for identifier '#{oidresp.display_identifier}'" : "")
8267
when OpenID::Consumer::SUCCESS
8368
session[:openid] = oidresp.identity_url
8469
if oidresp.display_identifier =~ /openid\/server\/node\/(.+)$/
@@ -102,56 +87,31 @@ def complete
10287
end
10388

10489
def logout
105-
session[:openid] = nil if session.has_key?(:openid)
106-
session[:level] = nil if session.has_key?(:level)
107-
session[:node_name] = nil if session.has_key?(:node_name)
90+
[:openid,:level,:node_name].each { |n| session.delete(n) }
10891
redirect slice_url(:top)
10992
end
11093

11194
private
112-
95+
#
96+
#
97+
11398
# Returns true if the openid is at a valid provider, based on whether :openid_providers is
11499
# defined. Raises an exception if it is not an allowed provider.
115-
def check_valid_openid_provider(openid)
116-
if Chef::Config[:openid_providers]
117-
fp = Chef::Config[:openid_providers].detect do |p|
118-
case openid
119-
when /^https?:\/\/#{p}/, /^#{p}/
120-
true
121-
else
122-
false
123-
end
124-
end
125-
unless fp
126-
raise Unauthorized, "Sorry, #{openid} is not an allowed OpenID Provider."
127-
end
128-
end
129-
true
130-
end
100+
def is_valid_openid_provider?(openid,providers)
101+
(providers && providers.detect {|p| openid =~ /^https?:\/\/#{p}/ or openid =~ /^#{p}/}) || true
102+
end
131103

132-
def check_authorized_openid_identifier(openid)
133-
if Chef::Config[:authorized_openid_identifiers]
134-
fp = Chef::Config[:authorized_openid_identifiers].detect do |p|
135-
case openid
136-
when p
137-
true
138-
else
139-
false
140-
end
141-
end
142-
unless fp
143-
raise Unauthorized, "Sorry, #{openid} is not an authorized OpenID."
144-
end
145-
end
146-
true
104+
def is_authorized_openid_identifier?(openid,providers)
105+
(providers && providers.detect { |p| openid==p }) || true
147106
end
148107

149108
def consumer
150-
if @consumer.nil?
151-
dir = Chef::Config[:openid_cstore_path]
152-
store = OpenID::Store::Filesystem.new(dir)
153-
@consumer = OpenID::Consumer.new(session, store)
154-
end
155-
return @consumer
109+
@consumer ||= OpenID::Consumer.new(session,
110+
if Chef::Config[:openid_cstore_couchdb]
111+
OpenID::Store::CouchDB.new(Chef::Config[:couchdb_url])
112+
else
113+
OpenID::Store::Filesystem.new(Chef::Config[:openid_cstore_path])
114+
end)
156115
end
116+
157117
end

chef-server-slice/app/controllers/openid_server.rb

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
#rescue LoadError
2727
require "openid"
2828
require "openid/consumer/discovery"
29-
require 'openid/store/filesystem'
3029
require 'json'
3130
require 'chef' / 'openid_registration'
3231
#end
@@ -175,8 +174,14 @@ def encrypt_password(salt, password)
175174
def server
176175
if @server.nil?
177176
server_url = absolute_slice_url(:openid_server)
178-
dir = Chef::Config[:openid_store_path]
179-
store = OpenID::Store::Filesystem.new(dir)
177+
if Chef::Config[:openid_store_couchdb]
178+
require 'openid-store-couchdb'
179+
store = OpenID::Store::CouchDB.new(Chef::Config[:couchdb_url])
180+
else
181+
require 'openid/store/filesystem'
182+
dir = Chef::Config[:openid_store_path]
183+
store = OpenID::Store::Filesystem.new(dir)
184+
end
180185
@server = Server.new(store, server_url)
181186
end
182187
return @server

chef-server-slice/lib/chef-server-slice.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,18 @@ module ChefServerSlice
3434
def self.loaded
3535
Chef::Queue.connect
3636

37+
# create the couch databases for openid association and nonce storage, if configured
38+
if Chef::Config[:openid_store_couchdb] || Chef::Config[:openid_cstore_couchdb]
39+
rest = Chef::REST.new(Chef::Config[:couchdb_url])
40+
@database_list = rest.get_rest("_all_dbs")
41+
unless @database_list.detect { |db| db == 'associations' }
42+
response = rest.put_rest('associations', Hash.new)
43+
end
44+
unless @database_list.detect { |db| db == 'nonces' }
45+
response = rest.put_rest('nonces', Hash.new)
46+
end
47+
end
48+
3749
# create the couch design docs for nodes and openid registrations
3850
Chef::Node.create_design_document
3951
Chef::OpenIDRegistration.create_design_document

chef-server/bin/chef-server

100644100755
File mode changed.

chef/lib/chef/config.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ class Config
6464
:search_url => "http://localhost:4000",
6565
:couchdb_database => "chef",
6666
:couchdb_version => nil,
67+
:openid_store_couchdb => false,
68+
:openid_cstore_couchdb => false,
6769
:openid_store_path => "/var/chef/openid/db",
6870
:openid_cstore_path => "/var/chef/openid/cstore",
6971
:file_cache_path => "/var/chef/cache",

0 commit comments

Comments
 (0)