rubycas-client 2.3.1 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format nested
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - ree
data/Gemfile CHANGED
@@ -1,13 +1,14 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  group :development do
4
- gem "riot"
5
- gem "rr"
4
+ gem "json", "~> 1.6.1"
5
+ gem "rspec", "~> 2.7.0"
6
6
  gem "bundler", "~> 1.0.0"
7
7
  gem "jeweler", "~> 1.6.2"
8
- gem "rcov"
9
8
  gem "actionpack"
9
+ gem "rake"
10
+ gem "rcov"
10
11
  end
11
12
 
12
- gem "activesupport"
13
+ gem "activesupport", :require => "active_support"
13
14
 
data/Gemfile.lock CHANGED
@@ -5,17 +5,24 @@ GEM
5
5
  activesupport (= 2.3.11)
6
6
  rack (~> 1.1.0)
7
7
  activesupport (2.3.11)
8
+ diff-lcs (1.1.3)
8
9
  git (1.2.5)
9
- jeweler (1.6.2)
10
+ jeweler (1.6.4)
10
11
  bundler (~> 1.0)
11
12
  git (>= 1.2.5)
12
13
  rake
14
+ json (1.6.1)
13
15
  rack (1.1.2)
14
- rake (0.9.2)
15
- rcov (0.9.9)
16
- riot (0.12.5)
17
- rr
18
- rr (1.0.4)
16
+ rake (0.9.2.2)
17
+ rcov (0.9.11)
18
+ rspec (2.7.0)
19
+ rspec-core (~> 2.7.0)
20
+ rspec-expectations (~> 2.7.0)
21
+ rspec-mocks (~> 2.7.0)
22
+ rspec-core (2.7.1)
23
+ rspec-expectations (2.7.0)
24
+ diff-lcs (~> 1.1.2)
25
+ rspec-mocks (2.7.0)
19
26
 
20
27
  PLATFORMS
21
28
  ruby
@@ -25,6 +32,7 @@ DEPENDENCIES
25
32
  activesupport
26
33
  bundler (~> 1.0.0)
27
34
  jeweler (~> 1.6.2)
35
+ json (~> 1.6.1)
36
+ rake
28
37
  rcov
29
- riot
30
- rr
38
+ rspec (~> 2.7.0)
data/History.txt CHANGED
@@ -1,6 +1,13 @@
1
1
  = RubyCAS-Client Changelog
2
2
 
3
- == Version 2.3.0 :: 2011-10-22
3
+ == Version 2.3.2 :: 2011-11-11
4
+
5
+ * Bug Fixes
6
+ * Removed a puts that didn't get cleaned up
7
+ * Fix a bug with parsing extra attributes caused by a strange edge
8
+ case in active_support
9
+
10
+ == Version 2.3.1 :: 2011-10-22
4
11
 
5
12
  * New Functionality
6
13
  * Add configuration option to expect complex extra attributes to be encoded
@@ -33,7 +40,7 @@ See http://www.opensource.org/licenses/mit-license.php
33
40
 
34
41
  * New functionality:
35
42
  * Added config parameter force_ssl_verification (self explanatory) [Roberto Klein]
36
- * Added explicit SingleSignutFilter for Rails (convenient?) [Adam Elliot]
43
+ * Added explicit SingleSigoutFilter for Rails (convenient?) [Adam Elliot]
37
44
  * Added support for faking out the filter; useful when testing. See
38
45
  http://github.com/gunark/rubycas-client/commit/1eb10cc285d59193eede3d4406f95cad9db9d93a
39
46
  [Brian Hogan]
data/Rakefile CHANGED
@@ -19,28 +19,34 @@ Jeweler::Tasks.new do |gem|
19
19
  gem.summary = "Client library for the Central Authentication Service (CAS) protocol."
20
20
  gem.authors = ["Matt Zukowski", "Matt Walker", "Matt Campbell"]
21
21
  gem.rdoc_options = ['--main', 'README.rdoc']
22
- gem.files.exclude '.rvmrc', '.infinity_test'
22
+ gem.files.exclude '.rvmrc', '.infinity_test', '.rbenv-version', '.rbenv-gemsets'
23
23
  # dependencies defined in Gemfile
24
24
  end
25
25
  Jeweler::RubygemsDotOrgTasks.new
26
26
 
27
- require 'rake/testtask'
28
- Rake::TestTask.new(:test) do |test|
29
- test.libs << 'test'
30
- test.pattern = 'test/**/*_test.rb'
31
- test.verbose = true
27
+ begin
28
+ require 'rcov/rcovtask'
29
+ Rcov::RcovTask.new do |test|
30
+ test.libs << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ test.rcov_opts << '--exclude "gems/*"'
34
+ end
35
+ rescue LoadError
36
+ puts "Hiding rcov tasks because rcov is not available"
32
37
  end
33
38
 
34
- require 'rcov/rcovtask'
35
- Rcov::RcovTask.new do |test|
36
- test.libs << 'test'
37
- test.pattern = 'test/**/test_*.rb'
38
- test.verbose = true
39
- test.rcov_opts << '--exclude "gems/*"'
39
+ begin
40
+ require 'rspec/core/rake_task'
41
+ desc 'Run RSpecs to confirm that all functionality is working as expected'
42
+ RSpec::Core::RakeTask.new('spec') do |t|
43
+ t.pattern = 'spec/**/*_spec.rb'
44
+ end
45
+ task :default => :spec
46
+ rescue LoadError
47
+ puts "Hiding spec tasks because RSpec is not available"
40
48
  end
41
49
 
42
- task :default => :test
43
-
44
50
  require 'rake/rdoctask'
45
51
  Rake::RDocTask.new do |rdoc|
46
52
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
data/TODO.md ADDED
@@ -0,0 +1,44 @@
1
+ # Planned Changes
2
+
3
+ Also take a look at the [issues page](/rubycas/rubycas-client/issues)
4
+
5
+ ## Version 2.4
6
+
7
+ 1. Support for Ruby 1.9.3
8
+ 1. Integration with travis for CI
9
+ 1. Test against Rails 2.3
10
+ 1. Test without Rails
11
+ 1. Test against 1.8.7, 1.9.2, 1.9.3, jruby
12
+
13
+ ## Version 3.0
14
+
15
+ 1. Convert test cases from riot to rspec2 - Done!
16
+ 1. Move Service Callback, PGT Callback and Single Sign Out Callback to
17
+ a Rack Middleware.
18
+
19
+ ## Version 3.1
20
+
21
+ 1. Cleanup the way Ticket Store integration works
22
+ 1. Improve test coverage for CASClient::Client
23
+ 1. Remove dependency on activesupport (expect in Rails specific classes)
24
+ 1. Support for Rails 3.0 and 3.1
25
+
26
+ ## Future
27
+
28
+ 1. Support for other Rubies (JRuby, Rubinius, etc.)
29
+ 1. Support for Rails 3.2
30
+
31
+ # Documentation Needs
32
+
33
+ ## Improve/Rewrite Documentation
34
+
35
+ The documentation isn't the clearest and is now a bit out of date. That
36
+ needs addressing
37
+
38
+ ## Examples
39
+
40
+ We could use some new and/or improved examples for
41
+
42
+ 1. Rails 2.3
43
+ 1. Rails 3.x
44
+ 1. Sinatra
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.1
1
+ 2.3.2
@@ -66,9 +66,7 @@ module CASClient
66
66
 
67
67
  @extra_attributes = {}
68
68
  @xml.elements.to_a('//cas:authenticationSuccess/cas:attributes/* | //cas:authenticationSuccess/*[local-name() != \'proxies\' and local-name() != \'proxyGrantingTicket\' and local-name() != \'user\' and local-name() != \'attributes\']').each do |el|
69
- # generating the hash requires prefixes to be defined, so add all of the namespaces
70
- el.namespaces.each {|k,v| el.add_namespace(k,v)}
71
- @extra_attributes.merge!(Hash.from_xml(el.to_s))
69
+ @extra_attributes.merge! el.name => el.text
72
70
  end
73
71
 
74
72
  # unserialize extra attributes
@@ -56,7 +56,7 @@ module CASClient
56
56
  end
57
57
 
58
58
  end
59
- puts "loaded active record ticket store!"
59
+
60
60
  ::ACTIVE_RECORD_TICKET_STORE = ActiveRecordTicketStore
61
61
 
62
62
  class CasPgtiou < ActiveRecord::Base
@@ -63,13 +63,13 @@ module CASClient
63
63
  # worker processes have access to a shared file system.
64
64
  #
65
65
  # This ticket store takes the following config parameters
66
- # :storage_dir - The directory to store data in. Defaults to RAILS_ROOT/tmp
66
+ # :storage_dir - The directory to store data in. Defaults to Rails.root/tmp
67
67
  # :service_session_lookup_dir - The directory to store Service Ticket/Session ID files in. Defaults to :storage_dir/sessions
68
68
  # :pgt_store_path - The location to store the pgt PStore file. Defaults to :storage_dir/cas_pgt.pstore
69
69
  class LocalDirTicketStore < AbstractTicketStore
70
70
  require 'pstore'
71
71
 
72
- DEFAULT_TMP_DIR = defined?(RAILS_ROOT) ? "#{RAILS_ROOT}/tmp" : "#{Dir.pwd}/tmp"
72
+ DEFAULT_TMP_DIR = defined?(Rails.root) ? "#{Rails.root}/tmp" : "#{Dir.pwd}/tmp"
73
73
 
74
74
  def initialize(config={})
75
75
  config ||= {}
@@ -4,17 +4,19 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{rubycas-client}
8
- s.version = "2.3.1"
7
+ s.name = "rubycas-client"
8
+ s.version = "2.3.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Matt Zukowski", "Matt Walker", "Matt Campbell"]
12
- s.date = %q{2011-10-23}
12
+ s.date = "2011-11-11"
13
13
  s.extra_rdoc_files = [
14
14
  "LICENSE.txt",
15
15
  "README.rdoc"
16
16
  ]
17
17
  s.files = [
18
+ ".rspec",
19
+ ".travis.yml",
18
20
  "CHANGELOG.txt",
19
21
  "Gemfile",
20
22
  "Gemfile.lock",
@@ -22,6 +24,7 @@ Gem::Specification.new do |s|
22
24
  "LICENSE.txt",
23
25
  "README.rdoc",
24
26
  "Rakefile",
27
+ "TODO.md",
25
28
  "VERSION",
26
29
  "examples/rails/README",
27
30
  "examples/rails/app/controllers/advanced_example_controller.rb",
@@ -60,44 +63,48 @@ Gem::Specification.new do |s|
60
63
  "rails_generators/active_record_ticket_store/templates/README",
61
64
  "rails_generators/active_record_ticket_store/templates/migration.rb",
62
65
  "rubycas-client.gemspec",
63
- "test/teststrap.rb",
64
- "test/units/casclient/frameworks/rails/filter_test.rb"
66
+ "spec/casclient/frameworks/rails/filter_spec.rb",
67
+ "spec/casclient/validation_response_spec.rb",
68
+ "spec/spec_helper.rb"
65
69
  ]
66
- s.homepage = %q{http://github.com/rubycas/rubycas-client}
70
+ s.homepage = "http://github.com/rubycas/rubycas-client"
67
71
  s.licenses = ["MIT"]
68
72
  s.rdoc_options = ["--main", "README.rdoc"]
69
73
  s.require_paths = ["lib"]
70
- s.rubygems_version = %q{1.7.2}
71
- s.summary = %q{Client library for the Central Authentication Service (CAS) protocol.}
74
+ s.rubygems_version = "1.8.11"
75
+ s.summary = "Client library for the Central Authentication Service (CAS) protocol."
72
76
 
73
77
  if s.respond_to? :specification_version then
74
78
  s.specification_version = 3
75
79
 
76
80
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
77
81
  s.add_runtime_dependency(%q<activesupport>, [">= 0"])
78
- s.add_development_dependency(%q<riot>, [">= 0"])
79
- s.add_development_dependency(%q<rr>, [">= 0"])
82
+ s.add_development_dependency(%q<json>, ["~> 1.6.1"])
83
+ s.add_development_dependency(%q<rspec>, ["~> 2.7.0"])
80
84
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
81
85
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
82
- s.add_development_dependency(%q<rcov>, [">= 0"])
83
86
  s.add_development_dependency(%q<actionpack>, [">= 0"])
87
+ s.add_development_dependency(%q<rake>, [">= 0"])
88
+ s.add_development_dependency(%q<rcov>, [">= 0"])
84
89
  else
85
90
  s.add_dependency(%q<activesupport>, [">= 0"])
86
- s.add_dependency(%q<riot>, [">= 0"])
87
- s.add_dependency(%q<rr>, [">= 0"])
91
+ s.add_dependency(%q<json>, ["~> 1.6.1"])
92
+ s.add_dependency(%q<rspec>, ["~> 2.7.0"])
88
93
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
89
94
  s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
90
- s.add_dependency(%q<rcov>, [">= 0"])
91
95
  s.add_dependency(%q<actionpack>, [">= 0"])
96
+ s.add_dependency(%q<rake>, [">= 0"])
97
+ s.add_dependency(%q<rcov>, [">= 0"])
92
98
  end
93
99
  else
94
100
  s.add_dependency(%q<activesupport>, [">= 0"])
95
- s.add_dependency(%q<riot>, [">= 0"])
96
- s.add_dependency(%q<rr>, [">= 0"])
101
+ s.add_dependency(%q<json>, ["~> 1.6.1"])
102
+ s.add_dependency(%q<rspec>, ["~> 2.7.0"])
97
103
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
98
104
  s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
99
- s.add_dependency(%q<rcov>, [">= 0"])
100
105
  s.add_dependency(%q<actionpack>, [">= 0"])
106
+ s.add_dependency(%q<rake>, [">= 0"])
107
+ s.add_dependency(%q<rcov>, [">= 0"])
101
108
  end
102
109
  end
103
110
 
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+ require 'action_controller'
3
+ require 'casclient/frameworks/rails/filter'
4
+
5
+ describe CASClient::Frameworks::Rails::Filter do
6
+
7
+ def controller_with_session(request = nil, session={})
8
+ request ||= mock_post_request
9
+ controller = double("Controller")
10
+ controller.stub(:session) {session}
11
+ controller.stub(:request) {request}
12
+ controller.stub(:url_for) {"bogusurl"}
13
+ controller.stub(:params) {{:ticket => "bogusticket", :renew => false}}
14
+ controller
15
+ end
16
+
17
+ def mock_post_request
18
+ mock_request = ActionController::Request.new({})
19
+ mock_request.stub(:post?) {true}
20
+ mock_request
21
+ end
22
+
23
+ before(:each) do
24
+ CASClient::Frameworks::Rails::Filter.configure(
25
+ :cas_base_url => 'http://test.local/',
26
+ :logger => double("Logger")
27
+ )
28
+ end
29
+
30
+ describe "#fake" do
31
+ subject { Hash.new }
32
+ context "faking user without attributes" do
33
+ before { CASClient::Frameworks::Rails::Filter.fake('tester@test.com') }
34
+ it 'should set the session user' do
35
+ CASClient::Frameworks::Rails::Filter.filter(controller_with_session(nil, subject))
36
+ subject.should eq({:cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com'})
37
+ end
38
+ after { CASClient::Frameworks::Rails::Filter.fake(nil,nil) }
39
+ end
40
+
41
+ context "faking user with attributes" do
42
+ before { CASClient::Frameworks::Rails::Filter.fake('tester@test.com', {:test => 'stuff', :this => 'that'}) }
43
+ it 'should set the session user and attributes' do
44
+ CASClient::Frameworks::Rails::Filter.filter(controller_with_session(nil, subject))
45
+ subject.should eq({ :cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com', :cas_extra_attributes => {:test => 'stuff', :this => 'that' }})
46
+ end
47
+ after { CASClient::Frameworks::Rails::Filter.fake(nil,nil) }
48
+ end
49
+ end
50
+
51
+ context "new valid service ticket" do
52
+ it "should return successfully from filter" do
53
+
54
+ pgt = CASClient::ProxyGrantingTicket.new(
55
+ "PGT-1308586001r9573FAD5A8C62E134A4AA93273F226BD3F0C3A983DCCCD176",
56
+ "PGTIOU-1308586001r29DC1F852C95930FE6694C1EFC64232A3359798893BC0B")
57
+
58
+ raw_text = "<cas:serviceResponse xmlns:cas=\"http://www.yale.edu/tp/cas\">
59
+ <cas:authenticationSuccess>
60
+ <cas:user>rich.yarger@vibes.com</cas:user>
61
+ <cas:proxyGrantingTicket>PGTIOU-1308586001r29DC1F852C95930FE6694C1EFC64232A3359798893BC0B</cas:proxyGrantingTicket>
62
+ </cas:authenticationSuccess>
63
+ </cas:serviceResponse>"
64
+ response = CASClient::ValidationResponse.new(raw_text)
65
+
66
+ CASClient::Client.any_instance.stub(:request_cas_response).and_return(response)
67
+ CASClient::Client.any_instance.stub(:retrieve_proxy_granting_ticket).and_return(pgt)
68
+
69
+ controller = controller_with_session()
70
+ CASClient::Frameworks::Rails::Filter.filter(controller).should eq(true)
71
+ end
72
+ end
73
+
74
+ context "new invalid service ticket" do
75
+ it "should return failure from filter" do
76
+
77
+ raw_text = "<cas:serviceResponse xmlns:cas=\"http://www.yale.edu/tp/cas\">
78
+ <cas:authenticationFailure>Some Error Text</cas:authenticationFailure>
79
+ </cas:serviceResponse>"
80
+ response = CASClient::ValidationResponse.new(raw_text)
81
+
82
+ CASClient::Client.any_instance.stub(:request_cas_response).and_return(response)
83
+ CASClient::Frameworks::Rails::Filter.stub(:unauthorized!) {"bogusresponse"}
84
+
85
+ controller = controller_with_session()
86
+ CASClient::Frameworks::Rails::Filter.filter(controller).should eq(false)
87
+ end
88
+ end
89
+
90
+ context "does not have new input service ticket" do
91
+ context "with last service ticket" do
92
+ it "should return failure from filter" do
93
+
94
+ CASClient::Frameworks::Rails::Filter.stub(:unauthorized!) {"bogusresponse"}
95
+
96
+ controller = controller_with_session()
97
+ controller.stub(:params) {{}}
98
+ CASClient::Frameworks::Rails::Filter.filter(controller).should eq(false)
99
+ end
100
+ end
101
+
102
+ context "sent through gateway" do
103
+ context "gatewaying off" do
104
+ it "should return failure from filter" do
105
+
106
+ CASClient::Frameworks::Rails::Filter.stub(:unauthorized!) {"bogusresponse"}
107
+
108
+ CASClient::Frameworks::Rails::Filter.config[:use_gatewaying] = false
109
+ controller = controller_with_session()
110
+ controller.session[:cas_sent_to_gateway] = true
111
+ controller.stub(:params) {{}}
112
+ CASClient::Frameworks::Rails::Filter.filter(controller).should eq(false)
113
+ end
114
+ end
115
+
116
+ context "gatewaying on" do
117
+ it "should return failure from filter" do
118
+
119
+ CASClient::Frameworks::Rails::Filter.config[:use_gatewaying] = true
120
+ controller = controller_with_session()
121
+ controller.session[:cas_sent_to_gateway] = true
122
+ controller.stub(:params) {{}}
123
+ CASClient::Frameworks::Rails::Filter.filter(controller).should eq(true)
124
+ end
125
+ end
126
+ end
127
+ end
128
+
129
+ context "has new input service ticket" do
130
+ context "no PGT" do
131
+ it "should return failure from filter" do
132
+
133
+ raw_text = "<cas:serviceResponse xmlns:cas=\"http://www.yale.edu/tp/cas\">
134
+ <cas:authenticationSuccess>
135
+ <cas:user>rich.yarger@vibes.com</cas:user>
136
+ <cas:proxyGrantingTicket>PGTIOU-1308586001r29DC1F852C95930FE6694C1EFC64232A3359798893BC0B</cas:proxyGrantingTicket>
137
+ </cas:authenticationSuccess>
138
+ </cas:serviceResponse>"
139
+ response = CASClient::ValidationResponse.new(raw_text)
140
+
141
+ CASClient::Client.any_instance.stub(:request_cas_response).and_return(response)
142
+ CASClient::Client.any_instance.stub(:retrieve_proxy_granting_ticket).and_raise CASClient::CASException
143
+
144
+ controller = controller_with_session()
145
+ expect { CASClient::Frameworks::Rails::Filter.filter(controller) }.to raise_error(CASClient::CASException)
146
+ end
147
+ end
148
+
149
+ context "cannot connect to CASServer" do
150
+ it "should return failure from filter" do
151
+
152
+ CASClient::Client.any_instance.stub(:request_cas_response).and_raise "Some exception"
153
+
154
+ controller = controller_with_session()
155
+ expect { CASClient::Frameworks::Rails::Filter.filter(controller) }.to raise_error(RuntimeError)
156
+ end
157
+ end
158
+
159
+ context "matches existing service ticket" do
160
+ subject { Hash.new }
161
+ it "should return successfully from filter" do
162
+
163
+ mock_client = CASClient::Client.new()
164
+ mock_client.should_receive(:request_cas_response).at_most(0).times
165
+ mock_client.should_receive(:retrieve_proxy_granting_ticket).at_most(0).times
166
+ CASClient::Frameworks::Rails::Filter.send(:class_variable_set, :@@client, mock_client)
167
+
168
+ subject[:cas_last_valid_ticket] = 'bogusticket'
169
+ subject[:cas_last_valid_ticket_service] = 'bogusurl'
170
+ controller = controller_with_session(mock_post_request(), subject)
171
+ CASClient::Frameworks::Rails::Filter.filter(controller).should eq(true)
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+ require 'casclient/responses.rb'
3
+
4
+ describe CASClient::ValidationResponse do
5
+ context "when parsing extra attributes as JSON" do
6
+ let(:response_text) do
7
+ <<RESPONSE_TEXT
8
+ <cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
9
+ <cas:authenticationSuccess>
10
+ <cas:attributes>
11
+ <cas:first_name>Jack</cas:first_name>
12
+ <cas:mobile_phone></cas:mobile_phone>
13
+ <cas:global_roles><![CDATA[]]></cas:global_roles>
14
+ <cas:foo_data><![CDATA[{ foo: "bar" }]]></cas:foo_data>
15
+ </cas:attributes>
16
+ </cas:authenticationSuccess>
17
+ </cas:serviceResponse>
18
+ RESPONSE_TEXT
19
+ end
20
+
21
+ let(:subject) { CASClient::ValidationResponse.new response_text, :encode_extra_attributes_as => :json }
22
+
23
+ it "sets the value of non-CDATA escaped empty attribute to nil" do
24
+ subject.extra_attributes["mobile_phone"].should be_nil
25
+ end
26
+
27
+ it "sets the value of CDATA escaped empty attribute to nil" do
28
+ subject.extra_attributes["global_roles"].should be_nil
29
+ end
30
+
31
+ it "sets the value of literal attributes to their value" do
32
+ subject.extra_attributes["first_name"].should == "Jack"
33
+ end
34
+
35
+ it "sets the value of JSON attributes to their parsed value" do
36
+ subject.extra_attributes["foo_data"]["foo"].should == "bar"
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ require 'bundler'
2
+
3
+ Bundler.setup(:default, :test)
4
+ Bundler.require
5
+
6
+ RSpec.configure do |config|
7
+ #config.include Rack::Test::Methods
8
+ #config.include Webrat::Methods
9
+ #config.include Webrat::Matchers
10
+ #config.include TestHelpers
11
+ #config.include Helpers
12
+ config.mock_with :rspec
13
+ config.mock_framework = :rspec
14
+ end
15
+
16
+ require 'rubycas-client'
metadata CHANGED
@@ -1,136 +1,116 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rubycas-client
3
- version: !ruby/object:Gem::Version
4
- hash: 1
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.3.2
5
5
  prerelease:
6
- segments:
7
- - 2
8
- - 3
9
- - 1
10
- version: 2.3.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Matt Zukowski
14
9
  - Matt Walker
15
10
  - Matt Campbell
16
11
  autorequire:
17
12
  bindir: bin
18
13
  cert_chain: []
19
-
20
- date: 2011-10-23 00:00:00 Z
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
32
- version_requirements: *id001
14
+ date: 2011-11-11 00:00:00.000000000Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
33
17
  name: activesupport
34
- prerelease: false
35
- type: :runtime
36
- - !ruby/object:Gem::Dependency
37
- requirement: &id002 !ruby/object:Gem::Requirement
18
+ requirement: &70128146526380 !ruby/object:Gem::Requirement
38
19
  none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
46
- version_requirements: *id002
47
- name: riot
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
24
+ type: :runtime
48
25
  prerelease: false
49
- type: :development
50
- - !ruby/object:Gem::Dependency
51
- requirement: &id003 !ruby/object:Gem::Requirement
26
+ version_requirements: *70128146526380
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: &70128146525800 !ruby/object:Gem::Requirement
52
30
  none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
60
- version_requirements: *id003
61
- name: rr
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 1.6.1
35
+ type: :development
62
36
  prerelease: false
37
+ version_requirements: *70128146525800
38
+ - !ruby/object:Gem::Dependency
39
+ name: rspec
40
+ requirement: &70128146525180 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.7.0
63
46
  type: :development
64
- - !ruby/object:Gem::Dependency
65
- requirement: &id004 !ruby/object:Gem::Requirement
47
+ prerelease: false
48
+ version_requirements: *70128146525180
49
+ - !ruby/object:Gem::Dependency
50
+ name: bundler
51
+ requirement: &70128146524640 !ruby/object:Gem::Requirement
66
52
  none: false
67
- requirements:
53
+ requirements:
68
54
  - - ~>
69
- - !ruby/object:Gem::Version
70
- hash: 23
71
- segments:
72
- - 1
73
- - 0
74
- - 0
55
+ - !ruby/object:Gem::Version
75
56
  version: 1.0.0
76
- version_requirements: *id004
77
- name: bundler
78
- prerelease: false
79
57
  type: :development
80
- - !ruby/object:Gem::Dependency
81
- requirement: &id005 !ruby/object:Gem::Requirement
58
+ prerelease: false
59
+ version_requirements: *70128146524640
60
+ - !ruby/object:Gem::Dependency
61
+ name: jeweler
62
+ requirement: &70128146524100 !ruby/object:Gem::Requirement
82
63
  none: false
83
- requirements:
64
+ requirements:
84
65
  - - ~>
85
- - !ruby/object:Gem::Version
86
- hash: 11
87
- segments:
88
- - 1
89
- - 6
90
- - 2
66
+ - !ruby/object:Gem::Version
91
67
  version: 1.6.2
92
- version_requirements: *id005
93
- name: jeweler
94
- prerelease: false
95
68
  type: :development
96
- - !ruby/object:Gem::Dependency
97
- requirement: &id006 !ruby/object:Gem::Requirement
98
- none: false
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- hash: 3
103
- segments:
104
- - 0
105
- version: "0"
106
- version_requirements: *id006
107
- name: rcov
108
69
  prerelease: false
70
+ version_requirements: *70128146524100
71
+ - !ruby/object:Gem::Dependency
72
+ name: actionpack
73
+ requirement: &70128146523500 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
109
79
  type: :development
110
- - !ruby/object:Gem::Dependency
111
- requirement: &id007 !ruby/object:Gem::Requirement
80
+ prerelease: false
81
+ version_requirements: *70128146523500
82
+ - !ruby/object:Gem::Dependency
83
+ name: rake
84
+ requirement: &70128146522900 !ruby/object:Gem::Requirement
112
85
  none: false
113
- requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- hash: 3
117
- segments:
118
- - 0
119
- version: "0"
120
- version_requirements: *id007
121
- name: actionpack
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
122
91
  prerelease: false
92
+ version_requirements: *70128146522900
93
+ - !ruby/object:Gem::Dependency
94
+ name: rcov
95
+ requirement: &70128146522320 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
123
101
  type: :development
102
+ prerelease: false
103
+ version_requirements: *70128146522320
124
104
  description:
125
105
  email:
126
106
  executables: []
127
-
128
107
  extensions: []
129
-
130
- extra_rdoc_files:
108
+ extra_rdoc_files:
131
109
  - LICENSE.txt
132
110
  - README.rdoc
133
- files:
111
+ files:
112
+ - .rspec
113
+ - .travis.yml
134
114
  - CHANGELOG.txt
135
115
  - Gemfile
136
116
  - Gemfile.lock
@@ -138,6 +118,7 @@ files:
138
118
  - LICENSE.txt
139
119
  - README.rdoc
140
120
  - Rakefile
121
+ - TODO.md
141
122
  - VERSION
142
123
  - examples/rails/README
143
124
  - examples/rails/app/controllers/advanced_example_controller.rb
@@ -176,41 +157,37 @@ files:
176
157
  - rails_generators/active_record_ticket_store/templates/README
177
158
  - rails_generators/active_record_ticket_store/templates/migration.rb
178
159
  - rubycas-client.gemspec
179
- - test/teststrap.rb
180
- - test/units/casclient/frameworks/rails/filter_test.rb
160
+ - spec/casclient/frameworks/rails/filter_spec.rb
161
+ - spec/casclient/validation_response_spec.rb
162
+ - spec/spec_helper.rb
181
163
  homepage: http://github.com/rubycas/rubycas-client
182
- licenses:
164
+ licenses:
183
165
  - MIT
184
166
  post_install_message:
185
- rdoc_options:
167
+ rdoc_options:
186
168
  - --main
187
169
  - README.rdoc
188
- require_paths:
170
+ require_paths:
189
171
  - lib
190
- required_ruby_version: !ruby/object:Gem::Requirement
172
+ required_ruby_version: !ruby/object:Gem::Requirement
191
173
  none: false
192
- requirements:
193
- - - ">="
194
- - !ruby/object:Gem::Version
195
- hash: 3
196
- segments:
174
+ requirements:
175
+ - - ! '>='
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ segments:
197
179
  - 0
198
- version: "0"
199
- required_rubygems_version: !ruby/object:Gem::Requirement
180
+ hash: 631183831459328070
181
+ required_rubygems_version: !ruby/object:Gem::Requirement
200
182
  none: false
201
- requirements:
202
- - - ">="
203
- - !ruby/object:Gem::Version
204
- hash: 3
205
- segments:
206
- - 0
207
- version: "0"
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
208
187
  requirements: []
209
-
210
188
  rubyforge_project:
211
- rubygems_version: 1.7.2
189
+ rubygems_version: 1.8.11
212
190
  signing_key:
213
191
  specification_version: 3
214
192
  summary: Client library for the Central Authentication Service (CAS) protocol.
215
193
  test_files: []
216
-
data/test/teststrap.rb DELETED
@@ -1,10 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
- require 'casclient'
4
- require 'riot'
5
- require 'riot/rr'
6
- require 'action_pack'
7
-
8
- RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
9
-
10
- Riot.reporter = Riot::VerboseStoryReporter
@@ -1,184 +0,0 @@
1
- require 'teststrap'
2
- require 'casclient/frameworks/rails/filter'
3
- require 'action_controller'
4
-
5
- context CASClient::Frameworks::Rails::Filter do
6
-
7
- helper(:controller_with_session) do |session, request|
8
- controller = Object.new
9
- stub(controller).session {session}
10
- stub(controller).request {request}
11
- stub(controller).url_for {"bogusurl"}
12
- stub(controller).params {{:ticket => "bogusticket", :renew => false}}
13
- controller
14
- end
15
-
16
- setup do
17
- CASClient::Frameworks::Rails::Filter.configure(
18
- :cas_base_url => 'http://test.local/',
19
- :logger => stub!
20
- )
21
- end
22
-
23
- context "fake user without attributes" do
24
- setup { CASClient::Frameworks::Rails::Filter.fake('tester@test.com') }
25
- should 'set the session user on #filter' do
26
- setup { Hash.new }
27
- CASClient::Frameworks::Rails::Filter.filter(controller_with_session(topic,nil))
28
- topic
29
- end.equals :cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com'
30
- teardown { CASClient::Frameworks::Rails::Filter.fake(nil,nil) }
31
- end
32
-
33
- context "fake user with attributes" do
34
- setup { CASClient::Frameworks::Rails::Filter.fake('tester@test.com', {:test => 'stuff', :this => 'that'}) }
35
- should 'set the session user and attributes on #filter' do
36
- setup { Hash.new }
37
- CASClient::Frameworks::Rails::Filter.filter(controller_with_session(topic,nil))
38
- topic
39
- end.equals :cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com', :cas_extra_attributes => {:test => 'stuff', :this => 'that' }
40
- teardown { CASClient::Frameworks::Rails::Filter.fake(nil,nil) }
41
- end
42
-
43
- context "new service ticket successfully" do
44
- should("return successfully from filter") do
45
- setup { Hash.new }
46
- mock_request = ActionController::Request.new({})
47
- mock(mock_request).post? {true}
48
-
49
- pgt = CASClient::ProxyGrantingTicket.new(
50
- "PGT-1308586001r9573FAD5A8C62E134A4AA93273F226BD3F0C3A983DCCCD176",
51
- "PGTIOU-1308586001r29DC1F852C95930FE6694C1EFC64232A3359798893BC0B")
52
-
53
- raw_text = "<cas:serviceResponse xmlns:cas=\"http://www.yale.edu/tp/cas\">
54
- <cas:authenticationSuccess>
55
- <cas:user>rich.yarger@vibes.com</cas:user>
56
- <cas:proxyGrantingTicket>PGTIOU-1308586001r29DC1F852C95930FE6694C1EFC64232A3359798893BC0B</cas:proxyGrantingTicket>
57
- </cas:authenticationSuccess>
58
- </cas:serviceResponse>"
59
- response = CASClient::ValidationResponse.new(raw_text)
60
-
61
- any_instance_of(CASClient::Client, :request_cas_response => response)
62
- any_instance_of(CASClient::Client, :retrieve_proxy_granting_ticket => pgt)
63
-
64
- controller = controller_with_session(topic,mock_request)
65
- CASClient::Frameworks::Rails::Filter.filter(controller)
66
- end.equals(true)
67
- end
68
-
69
- context "new service ticket with invalid service ticket" do
70
- should("return failure from filter") do
71
- setup { Hash.new }
72
- mock_request = ActionController::Request.new({})
73
- mock(mock_request).post? {true}
74
-
75
- raw_text = "<cas:serviceResponse xmlns:cas=\"http://www.yale.edu/tp/cas\">
76
- <cas:authenticationFailure>Some Error Text</cas:authenticationFailure>
77
- </cas:serviceResponse>"
78
- response = CASClient::ValidationResponse.new(raw_text)
79
-
80
- any_instance_of(CASClient::Client, :request_cas_response => response)
81
- stub(CASClient::Frameworks::Rails::Filter).unauthorized!{"bogusresponse"}
82
-
83
- controller = controller_with_session(topic,mock_request)
84
- CASClient::Frameworks::Rails::Filter.filter(controller)
85
- end.equals(false)
86
- end
87
-
88
- context "no new service ticket but with last service ticket" do
89
- should("return failure from filter") do
90
- setup { Hash.new }
91
- mock_request = ActionController::Request.new({})
92
- mock(mock_request).post? {true}
93
-
94
- stub(CASClient::Frameworks::Rails::Filter).unauthorized!{"bogusresponse"}
95
-
96
- controller = controller_with_session(topic,mock_request)
97
- stub(controller).params {{}}
98
- CASClient::Frameworks::Rails::Filter.filter(controller)
99
- end.equals(false)
100
- end
101
-
102
- context "no new service ticket sent through gateway, gatewaying off" do
103
- should("return failure from filter") do
104
- setup { Hash.new }
105
- mock_request = ActionController::Request.new({})
106
- mock(mock_request).post? {true}
107
-
108
- stub(CASClient::Frameworks::Rails::Filter).unauthorized!{"bogusresponse"}
109
-
110
- CASClient::Frameworks::Rails::Filter.config[:use_gatewaying] = false
111
- controller = controller_with_session(topic,mock_request)
112
- controller.session[:cas_sent_to_gateway] = true
113
- stub(controller).params {{}}
114
- CASClient::Frameworks::Rails::Filter.filter(controller)
115
- end.equals(false)
116
- end
117
-
118
- context "no new service ticket sent through gateway, gatewaying on" do
119
- should("return failure from filter") do
120
- setup { Hash.new }
121
- mock_request = ActionController::Request.new({})
122
- mock(mock_request).post? {true}
123
-
124
- CASClient::Frameworks::Rails::Filter.config[:use_gatewaying] = true
125
- controller = controller_with_session(topic,mock_request)
126
- controller.session[:cas_sent_to_gateway] = true
127
- stub(controller).params {{}}
128
- CASClient::Frameworks::Rails::Filter.filter(controller)
129
- end.equals(true)
130
- end
131
-
132
- context "new service ticket with no PGT" do
133
- should("return failure from filter") do
134
- setup { Hash.new }
135
- mock_request = ActionController::Request.new({})
136
- mock(mock_request).post? {true}
137
-
138
- raw_text = "<cas:serviceResponse xmlns:cas=\"http://www.yale.edu/tp/cas\">
139
- <cas:authenticationSuccess>
140
- <cas:user>rich.yarger@vibes.com</cas:user>
141
- <cas:proxyGrantingTicket>PGTIOU-1308586001r29DC1F852C95930FE6694C1EFC64232A3359798893BC0B</cas:proxyGrantingTicket>
142
- </cas:authenticationSuccess>
143
- </cas:serviceResponse>"
144
- response = CASClient::ValidationResponse.new(raw_text)
145
-
146
- any_instance_of(CASClient::Client, :request_cas_response => response)
147
- any_instance_of(CASClient::Client, :retrieve_proxy_granting_ticket => lambda{raise CASClient::CASException})
148
-
149
- controller = controller_with_session(topic,mock_request)
150
- CASClient::Frameworks::Rails::Filter.filter(controller)
151
- end.raises(CASClient::CASException)
152
- end
153
-
154
- context "new service ticket, but cannot connect to CASServer" do
155
- should("return failure from filter") do
156
- setup { Hash.new }
157
- mock_request = ActionController::Request.new({})
158
- mock(mock_request).post? {true}
159
-
160
- any_instance_of(CASClient::Client, :request_cas_response => lambda{raise "Some exception"})
161
-
162
- controller = controller_with_session(topic,mock_request)
163
- CASClient::Frameworks::Rails::Filter.filter(controller)
164
- end.raises(RuntimeError)
165
- end
166
-
167
- context "reuse service ticket successfully" do
168
- should("return successfully from filter") do
169
- setup { Hash.new }
170
- mock_request = ActionController::Request.new({})
171
- mock(mock_request).post? {true}
172
-
173
- mock_client = CASClient::Client.new()
174
- mock(mock_client).request_cas_response().never
175
- mock(mock_client).retrieve_proxy_granting_ticket().never
176
- CASClient::Frameworks::Rails::Filter.send(:class_variable_set, :@@client, mock_client)
177
-
178
- topic[:cas_last_valid_ticket] = 'bogusticket'
179
- topic[:cas_last_valid_ticket_service] = 'bogusurl'
180
- controller = controller_with_session(topic,mock_request)
181
- CASClient::Frameworks::Rails::Filter.filter(controller)
182
- end.equals(true)
183
- end
184
- end