summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jacob <adam@hjksolutions.com>2008-05-30 09:09:18 -0700
committerAdam Jacob <adam@hjksolutions.com>2008-05-30 09:09:18 -0700
commitd373915a1ac9ea25fcb52ac8468e4670425e3376 (patch)
tree6273a88ff4c37f42bb817c95db177bc41133c64a
parent900e8372d8232cf5b2c3489065b4568670e0e487 (diff)
downloadchef-d373915a1ac9ea25fcb52ac8468e4670425e3376.tar.gz
Cleaning up openid, starting client support
-rw-r--r--examples/sample_recipe.rb6
-rw-r--r--lib/chef/file_store.rb19
-rw-r--r--lib/chef/rest.rb33
-rw-r--r--packages/chef-server/app/controllers/nodes.rb1
-rw-r--r--packages/chef-server/app/controllers/openid_consumer.rb33
-rw-r--r--packages/chef-server/app/controllers/openid_login.rb42
-rw-r--r--packages/chef-server/app/controllers/openid_register.rb93
-rw-r--r--packages/chef-server/app/controllers/openid_server.rb55
-rw-r--r--packages/chef-server/app/helpers/openid_server_helpers.rb2
-rw-r--r--packages/chef-server/app/views/layout/application.html.haml4
-rw-r--r--packages/chef-server/app/views/nodes/_action.html.haml13
-rw-r--r--packages/chef-server/app/views/nodes/_resource.html.haml17
-rw-r--r--packages/chef-server/app/views/openid_consumer/index.html.haml25
-rw-r--r--packages/chef-server/app/views/openid_consumer/start.htmlhaml4
-rw-r--r--packages/chef-server/app/views/openid_login/index.html.haml2
-rw-r--r--packages/chef-server/app/views/openid_server/decide.html.haml21
-rw-r--r--packages/chef-server/config/init.rb5
-rw-r--r--packages/chef-server/config/router.rb31
-rw-r--r--packages/chef-server/log/merb_test.log806
-rw-r--r--packages/chef-server/spec/authenticated_system_spec_helper.rb16
-rw-r--r--packages/chef-server/spec/controllers/log/merb_test.log3
-rw-r--r--packages/chef-server/spec/controllers/nodes_spec.rb1
-rw-r--r--packages/chef-server/spec/controllers/openid_register_spec.rb88
-rw-r--r--packages/chef-server/spec/controllers/sessions_spec.rb97
-rw-r--r--packages/chef-server/spec/ident_spec_helper.rb8
-rw-r--r--packages/chef-server/spec/log/merb_test.log2
-rw-r--r--packages/chef-server/spec/models/ident_spec.rb258
-rw-r--r--packages/chef-server/spec/views/nodes/edit.html.erb_spec.rb2
-rw-r--r--spec/unit/file_store_spec.rb11
-rw-r--r--spec/unit/rest_spec.rb52
30 files changed, 1636 insertions, 114 deletions
diff --git a/examples/sample_recipe.rb b/examples/sample_recipe.rb
index 4b8548cb90..6abb31bfcd 100644
--- a/examples/sample_recipe.rb
+++ b/examples/sample_recipe.rb
@@ -4,6 +4,12 @@ require_recipe "openldap::server"
require_recipe "resolver"
require_recipe "base"
+exec "restart-apache" do
+ path "/usr/bin:/usr/local/bin"
+ command "/etc/init.d/apache2 restart"
+ action :nothing
+end
+
service "apache2" do
insure "running"
has_restart true
diff --git a/lib/chef/file_store.rb b/lib/chef/file_store.rb
index b834624090..1c2b02ed2f 100644
--- a/lib/chef/file_store.rb
+++ b/lib/chef/file_store.rb
@@ -77,6 +77,25 @@ class Chef
keys
end
+ def has_key?(obj_type, name)
+ validate(
+ {
+ :obj_type => obj_type,
+ :name => name,
+ },
+ {
+ :obj_type => { :kind_of => String },
+ :name => { :kind_of => String },
+ }
+ )
+ Dir[File.join(Chef::Config[:file_store_path], obj_type, '**', '*')].each do |f|
+ if File.file?(f)
+ return true if File.basename(f) == name
+ end
+ end
+ return false
+ end
+
def create_store_path(obj_type, key)
shadigest = Digest::SHA2.hexdigest("#{obj_type}#{key}")
diff --git a/lib/chef/rest.rb b/lib/chef/rest.rb
new file mode 100644
index 0000000000..1ca18e4ef5
--- /dev/null
+++ b/lib/chef/rest.rb
@@ -0,0 +1,33 @@
+#
+# Author:: Adam Jacob (<adam@hjksolutions.com>)
+# Copyright:: Copyright (c) 2008 HJK Solutions, LLC
+# License:: GNU General Public License version 2 or later
+#
+# This program and entire repository is free software; you can
+# redistribute it and/or modify it under the terms of the GNU
+# General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+
+require File.join(File.dirname(__FILE__), "mixin", "params_validate")
+require 'net/https'
+require 'uri'
+require 'json'
+
+class Chef
+ class REST
+
+ def initialize(url, username)
+ end
+
+ end
+end \ No newline at end of file
diff --git a/packages/chef-server/app/controllers/nodes.rb b/packages/chef-server/app/controllers/nodes.rb
index f9af3fdc57..340a981899 100644
--- a/packages/chef-server/app/controllers/nodes.rb
+++ b/packages/chef-server/app/controllers/nodes.rb
@@ -67,6 +67,7 @@ class Nodes < Application
stored_node.recipes.each do |r|
compile.node.recipes << r unless compile.node.recipes.detect { |h| r == h }
end
+ Chef::FileStore.store("node", params[:id], compile.node)
compile.load_definitions
compile.load_recipes
@output = {
diff --git a/packages/chef-server/app/controllers/openid_consumer.rb b/packages/chef-server/app/controllers/openid_consumer.rb
index 5b3142262e..58f18445e1 100644
--- a/packages/chef-server/app/controllers/openid_consumer.rb
+++ b/packages/chef-server/app/controllers/openid_consumer.rb
@@ -4,60 +4,59 @@ require "openid"
require 'openid/store/filesystem'
class OpenidConsumer < Application
- layout nil
def index
- # render an openid form
+ render
end
def start
begin
oidreq = consumer.begin(params[:openid_identifier])
rescue OpenID::OpenIDError => e
- flash[:error] = "Discovery failed for #{params[:openid_identifier]}: #{e}"
- redirect_to :action => 'index'
- return
+ session[:error] = "Discovery failed for #{params[:openid_identifier]}: #{e}"
+ return redirect(url(:openid_consumer))
end
- return_to = url_for :action => 'complete', :only_path => false
- realm = url_for :action => 'index', :only_path => false
+ return_to = absolute_url(:openid_consumer_complete)
+ realm = absolute_url(:openid_consumer)
if oidreq.send_redirect?(realm, return_to, params[:immediate])
- redirect_to oidreq.redirect_url(realm, return_to, params[:immediate])
+ return redirect(oidreq.redirect_url(realm, return_to, params[:immediate]))
else
@form_text = oidreq.form_markup(realm, return_to, params[:immediate], {'id' => 'openid_form'})
+ render
end
end
def complete
# FIXME - url_for some action is not necessarily the current URL.
- current_url = url_for(:action => 'complete', :only_path => false)
- parameters = params.reject{|k,v|request.path_parameters[k]}
+ current_url = absolute_url(:openid_consumer_complete)
+ parameters = params.reject{|k,v| k == "controller" || k == "action"}
oidresp = consumer.complete(parameters, current_url)
case oidresp.status
when OpenID::Consumer::FAILURE
if oidresp.display_identifier
- flash[:error] = ("Verification of #{oidresp.display_identifier}"\
+ session[:error] = ("Verification of #{oidresp.display_identifier}"\
" failed: #{oidresp.message}")
else
- flash[:error] = "Verification failed: #{oidresp.message}"
+ session[:error] = "Verification failed: #{oidresp.message}"
end
when OpenID::Consumer::SUCCESS
- flash[:success] = ("Verification of #{oidresp.display_identifier}"\
+ session[:success] = ("Verification of #{oidresp.display_identifier}"\
" succeeded.")
when OpenID::Consumer::SETUP_NEEDED
- flash[:alert] = "Immediate request failed - Setup Needed"
+ session[:alert] = "Immediate request failed - Setup Needed"
when OpenID::Consumer::CANCEL
- flash[:alert] = "OpenID transaction cancelled."
+ session[:alert] = "OpenID transaction cancelled."
else
end
- redirect_to :action => 'index'
+ redirect url(:openid_consumer)
end
private
def consumer
if @consumer.nil?
- dir = Pathname.new(RAILS_ROOT).join('db').join('cstore')
+ dir = Pathname.new(Merb.root).join('db').join('cstore')
store = OpenID::Store::Filesystem.new(dir)
@consumer = OpenID::Consumer.new(session, store)
end
diff --git a/packages/chef-server/app/controllers/openid_login.rb b/packages/chef-server/app/controllers/openid_login.rb
deleted file mode 100644
index dfb621ca5c..0000000000
--- a/packages/chef-server/app/controllers/openid_login.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# Controller for handling the login, logout process for "users" of our
-# little server. Users have no password. This is just an example.
-
-require 'openid'
-
-class OpenidLogin < Application
-
- provides :html, :json
-
- def index
- @headers['X-XRDS-Location'] = url(:controller => "server",
- :action => "idp_xrds",
- :only_path => false)
- display({ })
- end
-
- def submit
- user = params[:username]
-
- # if we get a user, log them in by putting their username in
- # the session hash.
- unless user.nil?
- session[:username] = user unless user.nil?
- session[:approvals] = []
- session[:notice] = "Your OpenID URL is <b>
- #{url(:controller => "openid_server", :action => "user_page", :username => params[:username])}
- </b><br/><br/>Proceed to step 2 below."
- else
- session[:error] = "Sorry, couldn't log you in. Try again."
- end
-
- redirect url(:controller => "openid_login")
- end
-
- def logout
- # delete the username from the session hash
- session[:username] = nil
- session[:approvals] = nil
- redirect url(:controller => "openid_login")
- end
-
-end
diff --git a/packages/chef-server/app/controllers/openid_register.rb b/packages/chef-server/app/controllers/openid_register.rb
new file mode 100644
index 0000000000..2636524a2d
--- /dev/null
+++ b/packages/chef-server/app/controllers/openid_register.rb
@@ -0,0 +1,93 @@
+# Controller for handling the login, logout process for "users" of our
+# little server. Users have no password. This is just an example.
+
+require 'openid'
+
+class OpenidRegister < Application
+
+ provides :html, :json
+
+ def index
+ @headers['X-XRDS-Location'] = absolute_url(:controller => "server", :action => "idp_xrds")
+ @registered_nodes = Chef::FileStore.list("openid_node")
+ display @registered_nodes
+ end
+
+ def show
+ begin
+ @registered_node = Chef::FileStore.load("openid_node", params[:id])
+ rescue RuntimeError => e
+ raise NotFound, "Cannot load node registration for #{params[:id]}"
+ end
+ display @registered_node
+ end
+
+ def create
+ params.has_key?(:id) or raise BadRequest, "You must provide an id to register"
+ params.has_key?(:password) or raise BadRequest, "You must provide a password to register"
+ if Chef::FileStore.has_key?("openid_node", params[:id])
+ raise BadRequest, "You cannot re-register #{params[:id]}!"
+ end
+ salt = generate_salt
+ @registered_node = {
+ :id => params[:id],
+ :salt => salt,
+ :password => encrypt_password(salt, params[:password])
+ }
+ Chef::FileStore.store(
+ "openid_node",
+ params[:id],
+ @registered_node
+ )
+ display @registered_node
+ end
+
+ def update
+ raise BadRequest, "You cannot update your registration -- delete #{params[:id]} and re-register"
+ end
+
+ def destroy
+ unless Chef::FileStore.has_key?("openid_node", params[:id])
+ raise BadRequest, "Cannot find the registration for #{params[:id]}"
+ end
+ Chef::FileStore.delete("openid_node", params[:id])
+ display({ :message => "Deleted registration for #{params[:id]}"})
+ end
+
+ def submit
+ user = params[:username]
+
+ # if we get a user, log them in by putting their username in
+ # the session hash.
+ unless user.nil?
+ session[:username] = user unless user.nil?
+ session[:approvals] = []
+ session[:notice] = "Your OpenID URL is <b>
+ #{url(:controller => "openid_server", :action => "user_page", :username => params[:username])}
+ </b><br/><br/>Proceed to step 2 below."
+ else
+ session[:error] = "Sorry, couldn't log you in. Try again."
+ end
+
+ redirect url(:openid_login)
+ end
+
+ def logout
+ # delete the username from the session hash
+ session[:username] = nil
+ session[:approvals] = nil
+ redirect url(:openid_login)
+ end
+
+ private
+ def generate_salt
+ salt = Time.now.to_s
+ chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
+ 1.upto(30) { |i| salt << chars[rand(chars.size-1)] }
+ salt
+ end
+
+ def encrypt_password(salt, password)
+ Digest::SHA1.hexdigest("--#{salt}--#{password}--")
+ end
+end
diff --git a/packages/chef-server/app/controllers/openid_server.rb b/packages/chef-server/app/controllers/openid_server.rb
index aa0d59ab61..cfdb4c4169 100644
--- a/packages/chef-server/app/controllers/openid_server.rb
+++ b/packages/chef-server/app/controllers/openid_server.rb
@@ -14,15 +14,16 @@ class OpenidServer < Application
include Merb::OpenidServerHelper
include OpenID::Server
+
layout nil
def index
+
oidreq = server.decode_request(params)
# no openid.mode was given
unless oidreq
- render :text => "This is an OpenID server endpoint."
- return
+ return "This is the Chef OpenID server endpoint."
end
oidresp = nil
@@ -36,8 +37,7 @@ class OpenidServer < Application
oidresp = oidreq.answer(false)
elsif session[:username].nil?
# The user hasn't logged in.
- show_decision_page(oidreq)
- return
+ return show_decision_page(oidreq)
else
# Else, set the identity to the one the user is using.
identity = url_for_user
@@ -49,11 +49,10 @@ class OpenidServer < Application
elsif self.is_authorized(identity, oidreq.trust_root)
oidresp = oidreq.answer(true, nil, identity)
elsif oidreq.immediate
- server_url = url_for :action => 'index'
+ server_url = url :openid_server
oidresp = oidreq.answer(false, server_url)
else
- show_decision_page(oidreq)
- return
+ return show_decision_page(oidreq)
end
else
@@ -68,10 +67,10 @@ class OpenidServer < Application
@oidreq = oidreq
if message
- flash[:notice] = message
+ session[:notice] = message
end
- render :template => 'server/decide', :layout => 'server'
+ render :template => 'openid_server/decide'
end
def user_page
@@ -82,24 +81,23 @@ class OpenidServer < Application
# to do real Accept header parsing and logic. Though I expect it will work
# 99% of the time.
if accept and accept.include?('application/xrds+xml')
- user_xrds
- return
+ return user_xrds
end
# content negotiation failed, so just render the user page
- xrds_url = url_for(:controller=>'user',:action=>params[:username])+'/xrds'
+ xrds_url = url(:openid_user_xrds, :username => params[:username])
identity_page = <<EOS
<html><head>
<meta http-equiv="X-XRDS-Location" content="#{xrds_url}" />
-<link rel="openid.server" href="#{url_for :action => 'index'}" />
+<link rel="openid.server" href="#{absolute_url :openid_user, :username}" />
</head><body><p>OpenID identity page for #{params[:username]}</p>
</body></html>
EOS
# Also add the Yadis location header, so that they don't have
# to parse the html unless absolutely necessary.
- response.headers['X-XRDS-Location'] = xrds_url
- render :text => identity_page
+ @headers['X-XRDS-Location'] = xrds_url
+ render identity_page
end
def user_xrds
@@ -125,7 +123,7 @@ EOS
session[:last_oidreq] = nil
if params[:yes].nil?
- redirect_to oidreq.cancel_url
+ redirect oidreq.cancel_url
return
else
id_to_send = params[:id_to_send]
@@ -139,8 +137,7 @@ EOS
else
msg = "You must enter a username to in order to send " +
"an identifier to the Relying Party."
- show_decision_page(oidreq, msg)
- return
+ return show_decision_page(oidreq, msg)
end
end
@@ -150,8 +147,6 @@ EOS
session[:approvals] = [oidreq.trust_root]
end
oidresp = oidreq.answer(true, nil, identity)
- add_sreg(oidreq, oidresp)
- add_pape(oidreq, oidresp)
return self.render_response(oidresp)
end
end
@@ -160,8 +155,8 @@ EOS
def server
if @server.nil?
- server_url = url_for :action => 'index', :only_path => false
- dir = Pathname.new(RAILS_ROOT).join('db').join('openid-store')
+ server_url = absolute_url(:openid_server)
+ dir = Pathname.new(Merb.root).join('db').join('openid-store')
store = OpenID::Store::Filesystem.new(dir)
@server = Server.new(store, server_url)
end
@@ -192,14 +187,14 @@ EOS
<XRD>
<Service priority="0">
#{type_str}
- <URI>#{url_for(:controller => 'server', :only_path => false)}</URI>
+ <URI>#{absolute_url(:openid_server)}</URI>
</Service>
</XRD>
</xrds:XRDS>
EOS
- response.headers['content-type'] = 'application/xrds+xml'
- render :text => yadis
+ @headers['content-type'] = 'application/xrds+xml'
+ render yadis
end
def render_response(oidresp)
@@ -210,13 +205,13 @@ EOS
case web_response.code
when HTTP_OK
- render :text => web_response.body, :status => 200
-
+ @status = 200
+ render web_response.body
when HTTP_REDIRECT
- redirect_to web_response.headers['location']
-
+ redirect web_response.headers['location']
else
- render :text => web_response.body, :status => 400
+ @status = 400
+ render web_response.body
end
end
diff --git a/packages/chef-server/app/helpers/openid_server_helpers.rb b/packages/chef-server/app/helpers/openid_server_helpers.rb
index 466287ac1a..8e595ead01 100644
--- a/packages/chef-server/app/helpers/openid_server_helpers.rb
+++ b/packages/chef-server/app/helpers/openid_server_helpers.rb
@@ -2,7 +2,7 @@ module Merb
module OpenidServerHelper
def url_for_user
- url :controller => 'user', :action => session[:username]
+ url(:openid_user, :username => session[:username])
end
end
diff --git a/packages/chef-server/app/views/layout/application.html.haml b/packages/chef-server/app/views/layout/application.html.haml
index 074c55ce0f..ea9d378ad4 100644
--- a/packages/chef-server/app/views/layout/application.html.haml
+++ b/packages/chef-server/app/views/layout/application.html.haml
@@ -9,7 +9,7 @@
= catch_content :for_layout
.footer
- if session[:username]
- %a{:href => url(:controller => "openid_login", :action => "logout")}= "Log Out #{session[:username]}"
+ %a{:href => url(:openid_logout)}= "Log Out #{session[:username]}"
%br/
- = url(:controller => "openid_server", :action => "user_page", :username => session[:username])
+ = absolute_url(:openid_user, :username => session[:username])
\ No newline at end of file
diff --git a/packages/chef-server/app/views/nodes/_action.html.haml b/packages/chef-server/app/views/nodes/_action.html.haml
new file mode 100644
index 0000000000..a809a6d70c
--- /dev/null
+++ b/packages/chef-server/app/views/nodes/_action.html.haml
@@ -0,0 +1,13 @@
+%table
+ - actions.each do |action, resource_hash|
+ %tr
+ %td.action_name= action.to_s
+ %td.action_resources
+ %table
+ - resource_hash.keys.sort{ |a,b| a.to_s <=> b.to_s }.each do |rk|
+ %tr
+ %td.action_when= rk.to_s
+ %td
+ - resource_hash[rk].each do |resource|
+ = partial(:resource, :resource => resource)
+ \ No newline at end of file
diff --git a/packages/chef-server/app/views/nodes/_resource.html.haml b/packages/chef-server/app/views/nodes/_resource.html.haml
index bc7b55f91f..7b9776b816 100644
--- a/packages/chef-server/app/views/nodes/_resource.html.haml
+++ b/packages/chef-server/app/views/nodes/_resource.html.haml
@@ -7,17 +7,16 @@
%tr.attr_group
%td.attr_name
= "#{h attr_name}"
- - value = resource.instance_variable_get(v)
- - if value.kind_of?(String)
- %td.attr_value
+ %td.attr_value
+ - value = resource.instance_variable_get(v)
+ - if value.kind_of?(String)
= "#{h value}"
- - elsif value.kind_of?(Array)
- %td.attr_value
+ - elsif value.kind_of?(Array)
= "#{h value.join(", ")}"
- - elsif value.kind_of?(Symbol)
- %td.attr_value
+ - elsif value.kind_of?(Symbol)
= "#{h value.to_s}"
- - else
- %td.attr_value
+ - elsif attr_name == "actions"
+ = partial(:action, :actions => value)
+ - else
= "#{h value.inspect}"
diff --git a/packages/chef-server/app/views/openid_consumer/index.html.haml b/packages/chef-server/app/views/openid_consumer/index.html.haml
new file mode 100644
index 0000000000..576ef8d787
--- /dev/null
+++ b/packages/chef-server/app/views/openid_consumer/index.html.haml
@@ -0,0 +1,25 @@
+%h1 OpenID Relying Party
+-if session[:alert]
+ .alert= h session[:alert]
+-if session[:error]
+ .error= h session[:error]
+-if session[:success]
+ .success= h session[:success]
+#verify-form
+ %form{ :method => "get", "accept-charset" => "UTF-8", :action => url(:openid_consumer_start) }
+ Identifier:
+ %input.openid{ :type => "text", :name => "openid_identifier" }/
+ %input{ :type => "submit", :value => "Verify"}/
+ %br
+ %input#immediate{ :name => "immediate", :type => "checkbox" }/
+ %label{:for => "immediate"} Use immediate mode
+ %br
+ %input#immediate{ :name => "use_sreg", :type => "checkbox" }/
+ %label{:for => "use_sreg"} Request registration data
+ %br
+ %input#immediate{ :name => "use_pape", :type => "checkbox" }/
+ %label{:for => "use_pape"} Request phishing-resistent auth policy
+ %br
+ %input#immediate{ :name => "force_post", :type => "checkbox" }/
+ %label{:for => "force_post"} Force the transaction to POST
+ %br
diff --git a/packages/chef-server/app/views/openid_consumer/start.htmlhaml b/packages/chef-server/app/views/openid_consumer/start.htmlhaml
new file mode 100644
index 0000000000..75ed9a9257
--- /dev/null
+++ b/packages/chef-server/app/views/openid_consumer/start.htmlhaml
@@ -0,0 +1,4 @@
+<%= @form_text %>
+<script type="text/javascript">
+document.getElementById('openid_form').submit();
+</script> \ No newline at end of file
diff --git a/packages/chef-server/app/views/openid_login/index.html.haml b/packages/chef-server/app/views/openid_login/index.html.haml
index 2bc2ef7c65..17ae69017a 100644
--- a/packages/chef-server/app/views/openid_login/index.html.haml
+++ b/packages/chef-server/app/views/openid_login/index.html.haml
@@ -1,6 +1,6 @@
%h1 Login
#login-form
- %form{ :method => "get", :action => url(:controller => "openid_login", :action => 'submit') }
+ %form{ :method => "get", :action => url(:openid_login_submit) }
%input{ :type => "text", :name => "username" }/
%input{ :type => "submit", :value => "Log In"}/
\ No newline at end of file
diff --git a/packages/chef-server/app/views/openid_server/decide.html.haml b/packages/chef-server/app/views/openid_server/decide.html.haml
new file mode 100644
index 0000000000..78b0b60881
--- /dev/null
+++ b/packages/chef-server/app/views/openid_server/decide.html.haml
@@ -0,0 +1,21 @@
+%form{:method => "post", :action => url(:openid_server_decision)}
+ %table
+ %tr
+ %td Site:
+ %td= @oidreq.trust_root
+ - if @oidreq.id_select
+ %tr
+ %td{:colspan => "2"}
+ You entered the server identifier at the relying party.
+ You will need to send an identifier of your choosing.
+ Enter a username below.
+ %tr
+ %td Identity to send:
+ %td
+ %input{:type => "text", :name => "id_to_send", :size => "25"}
+ - else
+ %tr
+ %td Identity:
+ %td= @oidreq.identity
+ %input{:type => "submit", :name => "yes", :value => "yes"}
+ %input{:type => "submit", :name => "no", :value => "no"} \ No newline at end of file
diff --git a/packages/chef-server/config/init.rb b/packages/chef-server/config/init.rb
index bdd6d3f8ce..258690f7c8 100644
--- a/packages/chef-server/config/init.rb
+++ b/packages/chef-server/config/init.rb
@@ -150,3 +150,8 @@ end
# And the result is:
# irb> "wife".plural
# => wives
+
+begin
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'authenticated_system/authenticated_dependencies')
+rescue LoadError
+end
diff --git a/packages/chef-server/config/router.rb b/packages/chef-server/config/router.rb
index 500154be33..9cf5725c44 100644
--- a/packages/chef-server/config/router.rb
+++ b/packages/chef-server/config/router.rb
@@ -31,20 +31,29 @@ Merb::Router.prepare do |r|
r.resources :nodes
r.resources :nodes, :member => { :compile => :get }
+
+ r.resources :openid do |res|
+ res.resources :register, :controller => "openid_register"
+ end
- r.match("/openid_server").to(:controller => "openid_server", :action => "index")
- r.match("/openid_server/server/xrds").
- to(:controller => "openid_server", :action => 'idp_xrds')
- r.match("/openid_server/user/:username").
- to(:controller => "openid_server", :action => 'user_page')
- r.match('/openid_server/user/:username/xrds').
- to(:controller => 'openid_server', :action => 'user_xrds')
- r.match('/openid_login').to(:controller => 'openid_login', :action => 'index')
- r.match('/openid_login/submit').to(:controller => 'openid_login', :action => 'submit')
- r.match('/openid_login/logout').to(:controller => 'openid_login', :action => 'logout')
+ r.match("/openid/server").to(:controller => "openid_server", :action => "index").name(:openid_server)
+ r.match("/openid/server/server/xrds").
+ to(:controller => "openid_server", :action => 'idp_xrds').name(:openid_server_xrds)
+ r.match("/openid/server/user/:username").
+ to(:controller => "openid_server", :action => 'user_page').name(:openid_user)
+ r.match('/openid/server/user/:username/xrds').
+ to(:controller => 'openid_server', :action => 'user_xrds').name(:openid_user_xrds)
+ r.match('/openid/server/decision').to(:controller => "openid_server", :action => "decision").name(:openid_server_decision)
+ r.match('/openid/login').to(:controller => 'openid_login', :action => 'index').name(:openid_login)
+ r.match('/openid/login/submit').to(:controller => 'openid_login', :action => 'submit').name(:openid_login_submit)
+ r.match('/openid/login/logout').to(:controller => 'openid_login', :action => 'logout').name(:openid_logout)
+ r.match('/openid/consumer').to(:controller => 'openid_consumer', :action => 'index').name(:openid_consumer)
+ r.match('/openid/consumer/start').to(:controller => 'openid_consumer', :action => 'start').name(:openid_consumer_start)
+ r.match('/openid/consumer/complete').to(:controller => 'openid_consumer', :action => 'complete').name(:openid_consumer_complete)
#r.default_routes
# Change this for your home page to be available at /
# r.match('/').to(:controller => 'whatever', :action =>'index')
-end \ No newline at end of file
+end
+
diff --git a/packages/chef-server/log/merb_test.log b/packages/chef-server/log/merb_test.log
index d56430f23a..b60074d0ae 100644
--- a/packages/chef-server/log/merb_test.log
+++ b/packages/chef-server/log/merb_test.log
@@ -3857,3 +3857,809 @@ undefined method `connect' for #<Merb::Router::Behavior:0x1830e7c> - (NoMethodEr
~ {:after_filters_time=>6.0e-06, :action_time=>0.000325, :before_filters_time=>7.7e-05}
~ {:after_filters_time=>5.0e-06, :action_time=>0.000327, :before_filters_time=>7.5e-05}
~ {:after_filters_time=>5.0e-06, :action_time=>0.000348, :before_filters_time=>7.8e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.001767, :before_filters_time=>0.0001}
+ ~ {:after_filters_time=>8.0e-06, :action_time=>0.000325, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000404, :before_filters_time=>0.000133}
+ ~ {:after_filters_time=>8.0e-06, :action_time=>0.000318, :before_filters_time=>0.00011}
+ ~ {:after_filters_time=>8.0e-06, :action_time=>0.000328, :before_filters_time=>5.0e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000282, :before_filters_time=>4.0e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000306, :before_filters_time=>0.0001}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000265, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000281, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000279, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000263, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000358, :before_filters_time=>8.4e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000359, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000327, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000328, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000333, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000335, :before_filters_time=>7.8e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001247, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000234, :before_filters_time=>6.3e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000279, :before_filters_time=>9.9e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.00023, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000238, :before_filters_time=>3.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000275, :before_filters_time=>4.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000277, :before_filters_time=>8.9e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000247, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.00026, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000261, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000246, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000368, :before_filters_time=>8.4e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000361, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000354, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000384, :before_filters_time=>9.0e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000376, :before_filters_time=>9.1e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000351, :before_filters_time=>8.1e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001175, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000243, :before_filters_time=>7.0e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000267, :before_filters_time=>9.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000216, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000251, :before_filters_time=>3.6e-05}
+ ~ {:after_filters_time=>2.7e-05, :action_time=>0.000257, :before_filters_time=>3.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00034, :before_filters_time=>0.000118}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000322, :before_filters_time=>9.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000269, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000302, :before_filters_time=>0.00011}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000254, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000396, :before_filters_time=>9.3e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.00038, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000345, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000332, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000329, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000353, :before_filters_time=>8.3e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001155, :before_filters_time=>7.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.0002, :before_filters_time=>5.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000288, :before_filters_time=>0.000112}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000215, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000247, :before_filters_time=>3.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000245, :before_filters_time=>3.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000264, :before_filters_time=>8.4e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000268, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000262, :before_filters_time=>7.4e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000259, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000244, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000365, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000358, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000392, :before_filters_time=>8.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000345, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000335, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000346, :before_filters_time=>8.0e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.001156, :before_filters_time=>7.1e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000207, :before_filters_time=>5.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000264, :before_filters_time=>9.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000227, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000235, :before_filters_time=>3.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000269, :before_filters_time=>3.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000285, :before_filters_time=>8.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000305, :before_filters_time=>0.000121}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.00058, :before_filters_time=>0.000338}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000262, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000308, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000372, :before_filters_time=>8.7e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000364, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000337, :before_filters_time=>8.0e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000341, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000331, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000337, :before_filters_time=>7.9e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.001132, :before_filters_time=>7.0e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000202, :before_filters_time=>5.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000265, :before_filters_time=>9.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000235, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000246, :before_filters_time=>3.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000235, :before_filters_time=>3.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000282, :before_filters_time=>8.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000247, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000273, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000259, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000243, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000369, :before_filters_time=>8.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000361, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000334, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000328, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000347, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000381, :before_filters_time=>9.0e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001131, :before_filters_time=>7.3e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000211, :before_filters_time=>5.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000291, :before_filters_time=>9.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000215, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000288, :before_filters_time=>4.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000285, :before_filters_time=>4.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00034, :before_filters_time=>0.000106}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000288, :before_filters_time=>8.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000305, :before_filters_time=>8.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00027, :before_filters_time=>8.0e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000246, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000398, :before_filters_time=>9.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000373, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000341, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000327, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000339, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000328, :before_filters_time=>7.6e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.001415, :before_filters_time=>8.8e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.00024, :before_filters_time=>6.6e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.00032, :before_filters_time=>0.000107}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.00026, :before_filters_time=>9.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000263, :before_filters_time=>3.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000244, :before_filters_time=>3.4e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000265, :before_filters_time=>8.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000246, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00026, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00028, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000244, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000372, :before_filters_time=>8.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000373, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000328, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000335, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000344, :before_filters_time=>8.0e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000326, :before_filters_time=>7.7e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001192, :before_filters_time=>8.0e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000268, :before_filters_time=>8.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000279, :before_filters_time=>9.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000218, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000238, :before_filters_time=>3.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000245, :before_filters_time=>3.4e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000269, :before_filters_time=>8.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000247, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000261, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000259, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000242, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000371, :before_filters_time=>8.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000448, :before_filters_time=>9.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000347, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000329, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000336, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000336, :before_filters_time=>7.8e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001128, :before_filters_time=>7.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000368, :before_filters_time=>5.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000278, :before_filters_time=>9.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000224, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000266, :before_filters_time=>3.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000253, :before_filters_time=>3.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000264, :before_filters_time=>8.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000254, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000268, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000261, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000242, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000373, :before_filters_time=>8.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.00036, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000329, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000325, :before_filters_time=>7.4e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000333, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.00033, :before_filters_time=>7.6e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.001236, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.0002, :before_filters_time=>5.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000295, :before_filters_time=>0.0001}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000217, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000307, :before_filters_time=>4.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000273, :before_filters_time=>3.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000267, :before_filters_time=>8.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000277, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000313, :before_filters_time=>9.1e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000297, :before_filters_time=>8.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000276, :before_filters_time=>8.4e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000437, :before_filters_time=>0.000102}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000364, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000376, :before_filters_time=>8.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000347, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.00033, :before_filters_time=>7.4e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000392, :before_filters_time=>7.4e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001106, :before_filters_time=>7.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000407, :before_filters_time=>5.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000264, :before_filters_time=>9.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000253, :before_filters_time=>9.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000248, :before_filters_time=>3.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000233, :before_filters_time=>3.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000261, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000471, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000278, :before_filters_time=>8.4e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000279, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000264, :before_filters_time=>8.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000366, :before_filters_time=>8.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000378, :before_filters_time=>8.0e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000346, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000328, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000331, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000334, :before_filters_time=>7.7e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001271, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000423, :before_filters_time=>5.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000297, :before_filters_time=>0.000105}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000257, :before_filters_time=>8.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000288, :before_filters_time=>4.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000279, :before_filters_time=>4.1e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000321, :before_filters_time=>0.000103}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000304, :before_filters_time=>9.4e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000283, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000282, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000257, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000409, :before_filters_time=>9.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000397, :before_filters_time=>8.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00036, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000339, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000354, :before_filters_time=>8.0e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.002329, :before_filters_time=>8.8e-05}
+ ~ Compiling routes...
+ ~ Compiling routes...
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001102, :before_filters_time=>7.1e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000202, :before_filters_time=>5.4e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000263, :before_filters_time=>9.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000223, :before_filters_time=>8.0e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000237, :before_filters_time=>3.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000243, :before_filters_time=>3.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000265, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000264, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000272, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000284, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000244, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000364, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000366, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000393, :before_filters_time=>9.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00033, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000334, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000351, :before_filters_time=>8.1e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.001126, :before_filters_time=>7.1e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000185, :before_filters_time=>5.1e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000256, :before_filters_time=>8.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000215, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000231, :before_filters_time=>3.0e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000297, :before_filters_time=>4.5e-05}
+ ~ {:after_filters_time=>1.0e-05, :action_time=>0.00108, :before_filters_time=>0.000704}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000436, :before_filters_time=>0.00014}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000414, :before_filters_time=>0.00012}
+ ~ {:after_filters_time=>8.0e-06, :action_time=>0.000394, :before_filters_time=>0.000114}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000265, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>8.0e-06, :action_time=>0.002102, :before_filters_time=>8.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000693, :before_filters_time=>9.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000643, :before_filters_time=>8.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000572, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000597, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000948, :before_filters_time=>9.4e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001129, :before_filters_time=>7.4e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000211, :before_filters_time=>5.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000265, :before_filters_time=>9.3e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000219, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000236, :before_filters_time=>3.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000238, :before_filters_time=>3.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000261, :before_filters_time=>8.4e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000244, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000261, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000259, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000268, :before_filters_time=>8.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000433, :before_filters_time=>0.000118}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000417, :before_filters_time=>8.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000385, :before_filters_time=>8.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000401, :before_filters_time=>8.1e-05}
+ ~ {:after_filters_time=>8.0e-06, :action_time=>0.001825, :before_filters_time=>8.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000446, :before_filters_time=>8.8e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>1.2e-05, :action_time=>0.023814, :before_filters_time=>0.000147}
+ ~ {:after_filters_time=>1.6e-05, :action_time=>0.000572, :before_filters_time=>0.000151}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000443, :before_filters_time=>0.000151}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000388, :before_filters_time=>0.00014}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000466, :before_filters_time=>5.9e-05}
+ ~ {:after_filters_time=>8.0e-06, :action_time=>0.000352, :before_filters_time=>4.9e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000346, :before_filters_time=>0.00011}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000294, :before_filters_time=>8.9e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.00031, :before_filters_time=>8.9e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000257, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000243, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000431, :before_filters_time=>8.9e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000388, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000359, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000355, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>1.0e-05, :action_time=>0.001889, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000411, :before_filters_time=>9.1e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001137, :before_filters_time=>7.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000214, :before_filters_time=>5.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000273, :before_filters_time=>9.4e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000218, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000241, :before_filters_time=>3.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000233, :before_filters_time=>3.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000263, :before_filters_time=>8.4e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000241, :before_filters_time=>7.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00027, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000261, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000243, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.0004, :before_filters_time=>8.7e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000387, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000392, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000359, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.00178, :before_filters_time=>7.8e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000442, :before_filters_time=>0.000138}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.001771, :before_filters_time=>0.000106}
+ ~ {:after_filters_time=>1.0e-05, :action_time=>0.000332, :before_filters_time=>9.1e-05}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000448, :before_filters_time=>0.000153}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000367, :before_filters_time=>0.000129}
+ ~ {:after_filters_time=>1.0e-05, :action_time=>0.000517, :before_filters_time=>5.6e-05}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000393, :before_filters_time=>5.3e-05}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000459, :before_filters_time=>0.000145}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000433, :before_filters_time=>0.000134}
+ ~ {:after_filters_time=>1.0e-05, :action_time=>0.000444, :before_filters_time=>0.000129}
+ ~ {:after_filters_time=>1.0e-05, :action_time=>0.000442, :before_filters_time=>0.00013}
+ ~ {:after_filters_time=>8.0e-06, :action_time=>0.000362, :before_filters_time=>0.000113}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000525, :before_filters_time=>0.000113}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000456, :before_filters_time=>9.1e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000356, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000352, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>8.0e-06, :action_time=>0.001721, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000374, :before_filters_time=>8.5e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001082, :before_filters_time=>6.8e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.00021, :before_filters_time=>5.4e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000273, :before_filters_time=>9.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000216, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000236, :before_filters_time=>3.3e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000243, :before_filters_time=>3.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000264, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000251, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000261, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000596, :before_filters_time=>0.000381}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000253, :before_filters_time=>8.0e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00042, :before_filters_time=>8.9e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000398, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000353, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000357, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00175, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000385, :before_filters_time=>8.7e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>7.0e-05, :after_filters_time=>6.0e-06, :action_time=>0.001103}
+ ~ {:before_filters_time=>5.5e-05, :after_filters_time=>6.0e-06, :action_time=>0.000201}
+ ~ {:before_filters_time=>9.0e-05, :after_filters_time=>5.0e-06, :action_time=>0.000258}
+ ~ {:before_filters_time=>7.5e-05, :after_filters_time=>5.0e-06, :action_time=>0.000215}
+ ~ {:before_filters_time=>3.1e-05, :after_filters_time=>6.0e-06, :action_time=>0.000237}
+ ~ {:before_filters_time=>3.3e-05, :after_filters_time=>5.0e-06, :action_time=>0.000244}
+ ~ {:before_filters_time=>8.5e-05, :after_filters_time=>6.0e-06, :action_time=>0.000268}
+ ~ {:before_filters_time=>8.4e-05, :after_filters_time=>5.0e-06, :action_time=>0.000267}
+ ~ {:before_filters_time=>7.6e-05, :after_filters_time=>5.0e-06, :action_time=>0.000261}
+ ~ {:before_filters_time=>7.4e-05, :after_filters_time=>5.0e-06, :action_time=>0.000257}
+ ~ {:before_filters_time=>7.4e-05, :after_filters_time=>5.0e-06, :action_time=>0.000242}
+ ~ {:before_filters_time=>8.8e-05, :after_filters_time=>5.0e-06, :action_time=>0.000405}
+ ~ {:before_filters_time=>8.4e-05, :after_filters_time=>5.0e-06, :action_time=>0.000394}
+ ~ {:before_filters_time=>7.6e-05, :after_filters_time=>5.0e-06, :action_time=>0.000356}
+ ~ {:before_filters_time=>0.0001, :after_filters_time=>5.0e-06, :action_time=>0.000393}
+ ~ {:before_filters_time=>7.6e-05, :after_filters_time=>8.0e-06, :action_time=>0.001782}
+ ~ {:before_filters_time=>8.6e-05, :after_filters_time=>5.0e-06, :action_time=>0.000374}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>7.0e-05, :after_filters_time=>6.0e-06, :action_time=>0.001082}
+ ~ {:before_filters_time=>8.2e-05, :after_filters_time=>6.0e-06, :action_time=>0.000229}
+ ~ {:before_filters_time=>9.2e-05, :after_filters_time=>5.0e-06, :action_time=>0.000271}
+ ~ {:before_filters_time=>7.8e-05, :after_filters_time=>5.0e-06, :action_time=>0.000224}
+ ~ {:before_filters_time=>3.1e-05, :after_filters_time=>6.0e-06, :action_time=>0.000235}
+ ~ {:before_filters_time=>3.0e-05, :after_filters_time=>5.0e-06, :action_time=>0.000235}
+ ~ {:before_filters_time=>8.9e-05, :after_filters_time=>8.0e-06, :action_time=>0.000283}
+ ~ {:before_filters_time=>7.5e-05, :after_filters_time=>6.0e-06, :action_time=>0.00025}
+ ~ {:before_filters_time=>7.9e-05, :after_filters_time=>5.0e-06, :action_time=>0.000274}
+ ~ {:before_filters_time=>7.7e-05, :after_filters_time=>6.0e-06, :action_time=>0.000265}
+ ~ {:before_filters_time=>8.0e-05, :after_filters_time=>5.0e-06, :action_time=>0.000262}
+ ~ {:before_filters_time=>8.8e-05, :after_filters_time=>6.0e-06, :action_time=>0.000408}
+ ~ {:before_filters_time=>7.5e-05, :after_filters_time=>5.0e-06, :action_time=>0.00038}
+ ~ {:before_filters_time=>7.9e-05, :after_filters_time=>6.0e-06, :action_time=>0.000369}
+ ~ {:before_filters_time=>7.7e-05, :after_filters_time=>5.0e-06, :action_time=>0.000362}
+ ~ {:before_filters_time=>8.4e-05, :after_filters_time=>1.9e-05, :action_time=>0.093813}
+ ~ {:before_filters_time=>0.000278, :after_filters_time=>1.0e-05, :action_time=>0.000793}
+ ~ Compiling routes...
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>1.1e-05, :action_time=>0.018998, :before_filters_time=>0.000118}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000337, :before_filters_time=>9.1e-05}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000543, :before_filters_time=>0.000152}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000368, :before_filters_time=>0.000127}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000331, :before_filters_time=>4.1e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000309, :before_filters_time=>4.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000265, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000264, :before_filters_time=>7.9e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000264, :before_filters_time=>7.6e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000255, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000243, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.00043, :before_filters_time=>8.3e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000388, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000374, :before_filters_time=>8.2e-05}
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000357, :before_filters_time=>7.7e-05}
+ ~ {:after_filters_time=>1.4e-05, :action_time=>0.011019, :before_filters_time=>7.5e-05}
+ ~ {:after_filters_time=>1.0e-05, :action_time=>0.000678, :before_filters_time=>0.000157}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001096, :before_filters_time=>7.0e-05, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001103, :before_filters_time=>6.9e-05, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001071, :before_filters_time=>6.8e-05, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001121, :before_filters_time=>6.8e-05, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001196, :before_filters_time=>7.3e-05, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001087, :before_filters_time=>6.8e-05, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001087, :before_filters_time=>6.8e-05, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.0011, :before_filters_time=>6.8e-05, :after_filters_time=>8.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.00112, :before_filters_time=>7.7e-05, :after_filters_time=>8.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001218, :before_filters_time=>7.5e-05, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001219, :before_filters_time=>7.0e-05, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001112, :before_filters_time=>6.8e-05, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001286, :before_filters_time=>7.2e-05, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001077, :before_filters_time=>7.0e-05, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001078, :before_filters_time=>6.8e-05, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001124, :before_filters_time=>7.3e-05, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001176, :before_filters_time=>7.2e-05, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001078, :before_filters_time=>6.9e-05, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001078, :before_filters_time=>6.8e-05, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000428, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.001178, :before_filters_time=>8.1e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001267, :before_filters_time=>7.3e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000439, :before_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.001688, :before_filters_time=>9.9e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000473, :before_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.001556, :before_filters_time=>0.000127}
+ ~ {:after_filters_time=>9.0e-06, :action_time=>0.000524, :before_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.001082, :before_filters_time=>7.1e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000442, :before_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00044, :before_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.0011, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000436, :before_filters_time=>6.0e-06, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Compiling routes...
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001106, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000432, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.00111, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000551, :before_filters_time=>6.0e-06, :after_filters_time=>9.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001126, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.00044, :before_filters_time=>6.0e-06, :after_filters_time=>8.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001264, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000459, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001127, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000428, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001495, :before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.00045, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001143, :before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000421, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001445, :before_filters_time=>1.1e-05, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000521, :before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.00117, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.00043, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001098, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000426, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001114, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000433, :before_filters_time=>6.0e-06, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001599, :before_filters_time=>1.2e-05, :after_filters_time=>8.0e-06}
+ ~ {:action_time=>0.000498, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001155, :before_filters_time=>1.0e-05, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000423, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001107, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000464, :before_filters_time=>7.0e-06, :after_filters_time=>5.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001109, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.00046, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001118, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000425, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001099, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000421, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.00113, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000433, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001459, :before_filters_time=>1.0e-05, :after_filters_time=>8.0e-06}
+ ~ {:action_time=>0.000527, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.001208, :before_filters_time=>8.0e-06}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000485, :before_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>8.0e-06, :action_time=>0.001511, :before_filters_time=>1.0e-05}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.00043, :before_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001232, :before_filters_time=>8.0e-06}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000426, :before_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001143, :before_filters_time=>8.0e-06}
+ ~ {:after_filters_time=>7.0e-06, :action_time=>0.000428, :before_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.001344, :before_filters_time=>1.0e-05}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000432, :before_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.00115, :before_filters_time=>9.0e-06}
+ ~ {:after_filters_time=>6.0e-06, :action_time=>0.000437, :before_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.001157}
+ ~ {:before_filters_time=>9.0e-06, :after_filters_time=>9.0e-06, :action_time=>0.000538}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>1.0e-05, :after_filters_time=>7.0e-06, :action_time=>0.001235}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000898}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>1.2e-05, :after_filters_time=>9.0e-06, :action_time=>0.00151}
+ ~ {:before_filters_time=>6.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000435}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.001131}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000456}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>1.0e-05, :after_filters_time=>7.0e-06, :action_time=>0.001146}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000436}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000193}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>9.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.001138}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000423}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000242}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>8.0e-06, :after_filters_time=>8.0e-06, :action_time=>0.001145}
+ ~ {:before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000426}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000234}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>1.1e-05, :after_filters_time=>6.0e-06, :action_time=>0.001343}
+ ~ {:before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000433}
+ ~ {:before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000297}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>1.1e-05, :after_filters_time=>7.0e-06, :action_time=>0.00119}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000437}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000225}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>1.0e-05, :after_filters_time=>6.0e-06, :action_time=>0.001123}
+ ~ {:before_filters_time=>1.0e-05, :after_filters_time=>1.0e-05, :action_time=>0.001585}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000378}
+ ~ {:before_filters_time=>6.0e-06, :after_filters_time=>8.0e-06, :action_time=>0.000266}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.001215}
+ ~ {:before_filters_time=>9.0e-06, :after_filters_time=>9.0e-06, :action_time=>0.001497}
+ ~ {:before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000378}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000254}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>1.2e-05, :after_filters_time=>8.0e-06, :action_time=>0.001513}
+ ~ {:before_filters_time=>1.4e-05, :after_filters_time=>1.2e-05, :action_time=>0.001781}
+ ~ {:before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000447}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000279}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.001134}
+ ~ {:before_filters_time=>1.0e-05, :after_filters_time=>1.1e-05, :action_time=>0.001625}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000402}
+ ~ {:before_filters_time=>6.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.00023}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>1.2e-05, :after_filters_time=>1.0e-05, :action_time=>0.001618}
+ ~ {:before_filters_time=>8.0e-06, :after_filters_time=>2.0e-05, :action_time=>0.000471}
+ ~ {:before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000271}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.001246}
+ ~ {:before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000458}
+ ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000255}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001124, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000426, :before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000224, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.023019, :before_filters_time=>1.9e-05, :after_filters_time=>1.3e-05}
+ ~ {:action_time=>0.000733, :before_filters_time=>1.1e-05, :after_filters_time=>1.1e-05}
+ ~ {:action_time=>0.000404, :before_filters_time=>1.1e-05, :after_filters_time=>1.2e-05}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001142, :before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000427, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000225, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.00115, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06}
+ ~ {:action_time=>0.000427, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000231, :before_filters_time=>6.0e-06, :after_filters_time=>7.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.001186, :before_filters_time=>9.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000203, :before_filters_time=>7.0e-06, :after_filters_time=>5.0e-06}
+ ~ {:action_time=>0.000427, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000225, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06}
+ ~ Compiling routes...
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
+ ~ {:action_time=>0.0016, :before_filters_time=>1.0e-05, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.000213, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06}
+ ~ {:action_time=>0.00045, :before_filters_time=>7.0e-06, :after_filters_time=>5.0e-06}
+ ~ {:action_time=>0.000228, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06}
diff --git a/packages/chef-server/spec/authenticated_system_spec_helper.rb b/packages/chef-server/spec/authenticated_system_spec_helper.rb
new file mode 100644
index 0000000000..a1a484da0f
--- /dev/null
+++ b/packages/chef-server/spec/authenticated_system_spec_helper.rb
@@ -0,0 +1,16 @@
+Merb::Config.use do |c|
+ c[:session_store] = "memory"
+end
+
+
+class Hash
+
+ def with( opts )
+ self.merge(opts)
+ end
+
+ def without(*args)
+ self.dup.delete_if{ |k,v| args.include?(k)}
+ end
+
+end \ No newline at end of file
diff --git a/packages/chef-server/spec/controllers/log/merb_test.log b/packages/chef-server/spec/controllers/log/merb_test.log
new file mode 100644
index 0000000000..646c8bb701
--- /dev/null
+++ b/packages/chef-server/spec/controllers/log/merb_test.log
@@ -0,0 +1,3 @@
+Tue, 27 May 2008 00:52:34 GMT ~ info ~ Logfile created
+ ~ Not Using Sessions
+ ~ Not Using Sessions
diff --git a/packages/chef-server/spec/controllers/nodes_spec.rb b/packages/chef-server/spec/controllers/nodes_spec.rb
index b28714cc40..3cf48fdbe2 100644
--- a/packages/chef-server/spec/controllers/nodes_spec.rb
+++ b/packages/chef-server/spec/controllers/nodes_spec.rb
@@ -150,6 +150,7 @@ describe Nodes, "compile action" do
end
def do_compile
+ Chef::FileStore.stub!(:store).and_return(true)
Chef::FileStore.stub!(:load).and_return(@stored_node)
Chef::Compile.stub!(:new).and_return(@compile)
dispatch_to(Nodes, :compile, { :id => "one" }) do |c|
diff --git a/packages/chef-server/spec/controllers/openid_register_spec.rb b/packages/chef-server/spec/controllers/openid_register_spec.rb
new file mode 100644
index 0000000000..2f3a58b287
--- /dev/null
+++ b/packages/chef-server/spec/controllers/openid_register_spec.rb
@@ -0,0 +1,88 @@
+require File.join(File.dirname(__FILE__), "..", 'spec_helper.rb')
+
+describe OpenidRegister, "index action" do
+ it "should get a list of all registered nodes" do
+ Chef::FileStore.should_receive(:list).with("openid_node").and_return(["one"])
+ dispatch_to(OpenidRegister, :index) do |c|
+ c.stub!(:display)
+ end
+ end
+end
+
+describe OpenidRegister, "show action" do
+ it "should raise a 404 if the nodes registration is not found" do
+ Chef::FileStore.should_receive(:load).with("openid_node", "foo").and_raise(RuntimeError)
+ lambda {
+ dispatch_to(OpenidRegister, :show, { :id => "foo" })
+ }.should raise_error(Merb::ControllerExceptions::NotFound)
+ end
+
+ it "should call display on the node registration" do
+ Chef::FileStore.stub!(:load).and_return(true)
+ dispatch_to(OpenidRegister, :show, { :id => "foo" }) do |c|
+ c.should_receive(:display).with(true)
+ end
+ end
+end
+
+describe OpenidRegister, "create action" do
+ def do_create
+ dispatch_to(OpenidRegister, :create, { :id => "foo", :password => "beck" }) do |c|
+ c.stub!(:display)
+ end
+ end
+
+ it "should require an id to register" do
+ lambda {
+ dispatch_to(OpenidRegister, :create, { :password => "beck" })
+ }.should raise_error(Merb::ControllerExceptions::BadRequest)
+ end
+
+ it "should require a password to register" do
+ lambda {
+ dispatch_to(OpenidRegister, :create, { :id => "foo" })
+ }.should raise_error(Merb::ControllerExceptions::BadRequest)
+ end
+
+ it "should return 400 if a node is already registered" do
+ Chef::FileStore.should_receive(:has_key?).with("openid_node", "foo").and_return(true)
+ lambda {
+ dispatch_to(OpenidRegister, :create, { :id => "foo", :password => "beck" })
+ }.should raise_error(Merb::ControllerExceptions::BadRequest)
+ end
+
+ it "should store the registered node in the file store" do
+ Chef::FileStore.stub!(:has_key?).and_return(false)
+ Chef::FileStore.should_receive(:store).and_return(true)
+ do_create
+ end
+end
+
+describe OpenidRegister, "update action" do
+ it "should raise a 400 error" do
+ lambda {
+ dispatch_to(OpenidRegister, :update)
+ }
+ end
+end
+
+describe OpenidRegister, "destroy action" do
+ def do_destroy
+ dispatch_to(OpenidRegister, :destroy, { :id => "foo" }) do |c|
+ c.stub!(:display)
+ end
+ end
+
+ it "should return 400 if it cannot find the registration" do
+ Chef::FileStore.should_receive(:has_key?).with("openid_node", "foo").and_return(false)
+ lambda {
+ do_destroy
+ }.should raise_error(Merb::ControllerExceptions::BadRequest)
+ end
+
+ it "should delete the registration from the store" do
+ Chef::FileStore.stub!(:has_key?).and_return(true)
+ Chef::FileStore.should_receive(:delete).with("openid_node", "foo").and_return(true)
+ do_destroy
+ end
+end \ No newline at end of file
diff --git a/packages/chef-server/spec/controllers/sessions_spec.rb b/packages/chef-server/spec/controllers/sessions_spec.rb
new file mode 100644
index 0000000000..afec8f7ab1
--- /dev/null
+++ b/packages/chef-server/spec/controllers/sessions_spec.rb
@@ -0,0 +1,97 @@
+require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
+require File.join( File.dirname(__FILE__), "..", "ident_spec_helper")
+require File.join( File.dirname(__FILE__), "..", "authenticated_system_spec_helper")
+require 'cgi'
+
+describe "Sessions Controller", "index action" do
+ include IdentSpecHelper
+
+ before(:each) do
+ Ident.clear_database_table
+ @quentin = Ident.create(valid_ident_hash.with(:login => "quentin", :password => "test", :password_confirmation => "test"))
+ @controller = Sessions.new(fake_request)
+ end
+
+ it "should have a route to Sessions#new from '/login'" do
+ request_to("/login") do |params|
+ params[:controller].should == "Sessions"
+ params[:action].should == "create"
+ end
+ end
+
+ it "should route to Sessions#create from '/login' via post" do
+ request_to("/login", :post) do |params|
+ params[:controller].should == "Sessions"
+ params[:action].should == "create"
+ end
+ end
+
+ it "should have a named route :login" do
+ @controller.url(:login).should == "/login"
+ end
+
+ it "should have route to Sessions#destroy from '/logout' via delete" do
+ request_to("/logout", :delete) do |params|
+ params[:controller].should == "Sessions"
+ params[:action].should == "destroy"
+ end
+ end
+
+ it "should route to Sessions#destroy from '/logout' via get" do
+ request_to("/logout") do |params|
+ params[:controller].should == "Sessions"
+ params[:action].should == "destroy"
+ end
+ end
+
+ it 'logins and redirects' do
+ controller = post "/login", :login => 'quentin', :password => 'test'
+ controller.session[:ident].should_not be_nil
+ controller.session[:ident].should == @quentin.id
+ controller.should redirect_to("/")
+ end
+
+ it 'fails login and does not redirect' do
+ controller = post "/login", :login => 'quentin', :password => 'bad password'
+ controller.session[:ident].should be_nil
+ controller.should be_successful
+ end
+
+ it 'logs out' do
+ controller = get("/logout"){|controller| controller.stub!(:current_ident).and_return(@quentin) }
+ controller.session[:ident].should be_nil
+ controller.should redirect
+ end
+
+ it 'remembers me' do
+ controller = post "/login", :login => 'quentin', :password => 'test', :remember_me => "1"
+ controller.cookies["auth_token"].should_not be_nil
+ end
+
+ it 'does not remember me' do
+ controller = post "/login", :login => 'quentin', :password => 'test', :remember_me => "0"
+ controller.cookies["auth_token"].should be_nil
+ end
+
+ it 'deletes token on logout' do
+ controller = get("/logout") {|request| request.stub!(:current_ident).and_return(@quentin) }
+ controller.cookies["auth_token"].should == nil
+ end
+
+
+ it 'logs in with cookie' do
+ @quentin.remember_me
+ controller = get "/login" do |c|
+ c.request.env[Merb::Const::HTTP_COOKIE] = "auth_token=#{@quentin.remember_token}"
+ end
+ controller.should be_logged_in
+ end
+
+ def auth_token(token)
+ CGI::Cookie.new('name' => 'auth_token', 'value' => token)
+ end
+
+ def cookie_for(ident)
+ auth_token ident.remember_token
+ end
+end \ No newline at end of file
diff --git a/packages/chef-server/spec/ident_spec_helper.rb b/packages/chef-server/spec/ident_spec_helper.rb
new file mode 100644
index 0000000000..17fad80004
--- /dev/null
+++ b/packages/chef-server/spec/ident_spec_helper.rb
@@ -0,0 +1,8 @@
+module IdentSpecHelper
+ def valid_ident_hash
+ { :login => "daniel",
+ :email => "daniel@example.com",
+ :password => "sekret",
+ :password_confirmation => "sekret"}
+ end
+end \ No newline at end of file
diff --git a/packages/chef-server/spec/log/merb_test.log b/packages/chef-server/spec/log/merb_test.log
new file mode 100644
index 0000000000..dbd7cd0dce
--- /dev/null
+++ b/packages/chef-server/spec/log/merb_test.log
@@ -0,0 +1,2 @@
+Tue, 27 May 2008 00:52:46 GMT ~ info ~ Logfile created
+ ~ Not Using Sessions
diff --git a/packages/chef-server/spec/models/ident_spec.rb b/packages/chef-server/spec/models/ident_spec.rb
new file mode 100644
index 0000000000..5dd15288bf
--- /dev/null
+++ b/packages/chef-server/spec/models/ident_spec.rb
@@ -0,0 +1,258 @@
+require File.join( File.dirname(__FILE__), "..", "spec_helper" )
+require File.join( File.dirname(__FILE__), "..", "ident_spec_helper")
+require File.join( File.dirname(__FILE__), "..", "authenticated_system_spec_helper")
+
+describe Ident do
+ include IdentSpecHelper
+
+ before(:each) do
+ Ident.clear_database_table
+ end
+
+ it "should have a login field" do
+ ident = Ident.new
+ ident.should respond_to(:login)
+ ident.valid?
+ ident.errors.on(:login).should_not be_nil
+ end
+
+ it "should fail login if there are less than 3 chars" do
+ ident = Ident.new
+ ident.login = "AB"
+ ident.valid?
+ ident.errors.on(:login).should_not be_nil
+ end
+
+ it "should not fail login with between 3 and 40 chars" do
+ ident = Ident.new
+ [3,40].each do |num|
+ ident.login = "a" * num
+ ident.valid?
+ ident.errors.on(:login).should be_nil
+ end
+ end
+
+ it "should fail login with over 90 chars" do
+ ident = Ident.new
+ ident.login = "A" * 41
+ ident.valid?
+ ident.errors.on(:login).should_not be_nil
+ end
+
+ it "should make a valid ident" do
+ ident = Ident.new(valid_ident_hash)
+ ident.save
+ ident.errors.should be_empty
+
+ end
+
+ it "should make sure login is unique" do
+ ident = Ident.new( valid_ident_hash.with(:login => "Daniel") )
+ ident2 = Ident.new( valid_ident_hash.with(:login => "Daniel"))
+ ident.save.should be_true
+ ident.login = "Daniel"
+ ident2.save.should be_false
+ ident2.errors.on(:login).should_not be_nil
+ end
+
+ it "should make sure login is unique regardless of case" do
+ Ident.find_with_conditions(:login => "Daniel").should be_nil
+ ident = Ident.new( valid_ident_hash.with(:login => "Daniel") )
+ ident2 = Ident.new( valid_ident_hash.with(:login => "daniel"))
+ ident.save.should be_true
+ ident.login = "Daniel"
+ ident2.save.should be_false
+ ident2.errors.on(:login).should_not be_nil
+ end
+
+ it "should downcase logins" do
+ ident = Ident.new( valid_ident_hash.with(:login => "DaNieL"))
+ ident.login.should == "daniel"
+ end
+
+ it "should authenticate a ident using a class method" do
+ ident = Ident.new(valid_ident_hash)
+ ident.save
+ Ident.authenticate(valid_ident_hash[:login], valid_ident_hash[:password]).should_not be_nil
+ end
+
+ it "should not authenticate a ident using the wrong password" do
+ ident = Ident.new(valid_ident_hash)
+ ident.save
+ Ident.authenticate(valid_ident_hash[:login], "not_the_password").should be_nil
+ end
+
+ it "should not authenticate a ident using the wrong login" do
+ ident = Ident.create(valid_ident_hash)
+ Ident.authenticate("not_the_login", valid_ident_hash[:password]).should be_nil
+ end
+
+ it "should not authenticate a ident that does not exist" do
+ Ident.authenticate("i_dont_exist", "password").should be_nil
+ end
+
+
+end
+
+describe Ident, "the password fields for Ident" do
+ include IdentSpecHelper
+
+ before(:each) do
+ Ident.clear_database_table
+ @ident = Ident.new( valid_ident_hash )
+ end
+
+ it "should respond to password" do
+ @ident.should respond_to(:password)
+ end
+
+ it "should respond to password_confirmation" do
+ @ident.should respond_to(:password_confirmation)
+ end
+
+ it "should have a protected password_required method" do
+ @ident.protected_methods.should include("password_required?")
+ end
+
+ it "should respond to crypted_password" do
+ @ident.should respond_to(:crypted_password)
+ end
+
+ it "should require password if password is required" do
+ ident = Ident.new( valid_ident_hash.without(:password))
+ ident.stub!(:password_required?).and_return(true)
+ ident.valid?
+ ident.errors.on(:password).should_not be_nil
+ ident.errors.on(:password).should_not be_empty
+ end
+
+ it "should set the salt" do
+ ident = Ident.new(valid_ident_hash)
+ ident.salt.should be_nil
+ ident.send(:encrypt_password)
+ ident.salt.should_not be_nil
+ end
+
+ it "should require the password on create" do
+ ident = Ident.new(valid_ident_hash.without(:password))
+ ident.save
+ ident.errors.on(:password).should_not be_nil
+ ident.errors.on(:password).should_not be_empty
+ end
+
+ it "should require password_confirmation if the password_required?" do
+ ident = Ident.new(valid_ident_hash.without(:password_confirmation))
+ ident.save
+ (ident.errors.on(:password) || ident.errors.on(:password_confirmation)).should_not be_nil
+ end
+
+ it "should fail when password is outside 4 and 40 chars" do
+ [3,41].each do |num|
+ ident = Ident.new(valid_ident_hash.with(:password => ("a" * num)))
+ ident.valid?
+ ident.errors.on(:password).should_not be_nil
+ end
+ end
+
+ it "should pass when password is within 4 and 40 chars" do
+ [4,30,40].each do |num|
+ ident = Ident.new(valid_ident_hash.with(:password => ("a" * num), :password_confirmation => ("a" * num)))
+ ident.valid?
+ ident.errors.on(:password).should be_nil
+ end
+ end
+
+ it "should autenticate against a password" do
+ ident = Ident.new(valid_ident_hash)
+ ident.save
+ ident.should be_authenticated(valid_ident_hash[:password])
+ end
+
+ it "should not require a password when saving an existing ident" do
+ ident = Ident.create(valid_ident_hash)
+ ident = Ident.find_with_conditions(:login => valid_ident_hash[:login])
+ ident.password.should be_nil
+ ident.password_confirmation.should be_nil
+ ident.login = "some_different_login_to_allow_saving"
+ (ident.save).should be_true
+ end
+
+end
+
+
+describe Ident, "remember_me" do
+ include IdentSpecHelper
+
+ predicate_matchers[:remember_token] = :remember_token?
+
+ before do
+ Ident.clear_database_table
+ @ident = Ident.new(valid_ident_hash)
+ end
+
+ it "should have a remember_token_expires_at attribute" do
+ @ident.attributes.keys.any?{|a| a.to_s == "remember_token_expires_at"}.should_not be_nil
+ end
+
+ it "should respond to remember_token?" do
+ @ident.should respond_to(:remember_token?)
+ end
+
+ it "should return true if remember_token_expires_at is set and is in the future" do
+ @ident.remember_token_expires_at = DateTime.now + 3600
+ @ident.should remember_token
+ end
+
+ it "should set remember_token_expires_at to a specific date" do
+ time = Time.mktime(2009,12,25)
+ @ident.remember_me_until(time)
+ @ident.remember_token_expires_at.should == time
+ end
+
+ it "should set the remember_me token when remembering" do
+ time = Time.mktime(2009,12,25)
+ @ident.remember_me_until(time)
+ @ident.remember_token.should_not be_nil
+ @ident.save
+ Ident.find_with_conditions(:login => valid_ident_hash[:login]).remember_token.should_not be_nil
+ end
+
+ it "should remember me for" do
+ t = Time.now
+ Time.stub!(:now).and_return(t)
+ today = Time.now
+ remember_until = today + (2* Merb::Const::WEEK)
+ @ident.remember_me_for( Merb::Const::WEEK * 2)
+ @ident.remember_token_expires_at.should == (remember_until)
+ end
+
+ it "should remember_me for two weeks" do
+ t = Time.now
+ Time.stub!(:now).and_return(t)
+ @ident.remember_me
+ @ident.remember_token_expires_at.should == (Time.now + (2 * Merb::Const::WEEK ))
+ end
+
+ it "should forget me" do
+ @ident.remember_me
+ @ident.save
+ @ident.forget_me
+ @ident.remember_token.should be_nil
+ @ident.remember_token_expires_at.should be_nil
+ end
+
+ it "should persist the forget me to the database" do
+ @ident.remember_me
+ @ident.save
+
+ @ident = Ident.find_with_conditions(:login => valid_ident_hash[:login])
+ @ident.remember_token.should_not be_nil
+
+ @ident.forget_me
+
+ @ident = Ident.find_with_conditions(:login => valid_ident_hash[:login])
+ @ident.remember_token.should be_nil
+ @ident.remember_token_expires_at.should be_nil
+ end
+
+end \ No newline at end of file
diff --git a/packages/chef-server/spec/views/nodes/edit.html.erb_spec.rb b/packages/chef-server/spec/views/nodes/edit.html.erb_spec.rb
index 33a0c3631f..a931e8e519 100644
--- a/packages/chef-server/spec/views/nodes/edit.html.erb_spec.rb
+++ b/packages/chef-server/spec/views/nodes/edit.html.erb_spec.rb
@@ -1 +1 @@
-require File.join(File.dirname(__FILE__), "../..", 'spec_helper.rb') \ No newline at end of file
+require File.join(File.dirname(__FILE__), "../..", 'spec_helper.rb')
diff --git a/spec/unit/file_store_spec.rb b/spec/unit/file_store_spec.rb
index f2f1070f2d..e7371653f1 100644
--- a/spec/unit/file_store_spec.rb
+++ b/spec/unit/file_store_spec.rb
@@ -91,5 +91,16 @@ describe Chef::FileStore do
File.should_receive(:file?).with("pool").and_return(true)
Chef::FileStore.list("node").should eql(["pool"])
end
+
+ it "should let you test whether a key exists for an object type with has_key?" do
+ Dir.should_receive(:[]).with("/tmp/chef-test/node/**/*").and_return(["pool"])
+ File.should_receive(:file?).with("pool").and_return(true)
+ Chef::FileStore.has_key?("node", "pool").should eql(true)
+ end
+ it "should let you test whether a key doesnt exist for an object type with has_key?" do
+ Dir.should_receive(:[]).with("/tmp/chef-test/node/**/*").and_return(["pool"])
+ File.should_receive(:file?).with("pool").and_return(true)
+ Chef::FileStore.has_key?("node", "snake").should eql(false)
+ end
end \ No newline at end of file
diff --git a/spec/unit/rest_spec.rb b/spec/unit/rest_spec.rb
new file mode 100644
index 0000000000..df77d163e9
--- /dev/null
+++ b/spec/unit/rest_spec.rb
@@ -0,0 +1,52 @@
+#
+# Author:: Adam Jacob (<adam@hjksolutions.com>)
+# Copyright:: Copyright (c) 2008 HJK Solutions, LLC
+# License:: GNU General Public License version 2 or later
+#
+# This program and entire repository is free software; you can
+# redistribute it and/or modify it under the terms of the GNU
+# General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
+
+describe Chef::REST do
+
+ it "should make a connection to an http server" do
+
+ end
+
+ it "should make a connection to an https server" do
+ end
+
+ it "should authenticate if given a redirect" do
+
+ end
+
+ it "should GET a URL" do
+
+ end
+
+ it "should PUT to an URL " do
+
+ end
+
+ it "should POST to an URL" do
+
+ end
+
+ it "should DELETE an URL" do
+
+ end
+
+end \ No newline at end of file