bcms_cas 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -7,8 +7,6 @@ as an example of a server.
7
7
  This module will allow user to login to the public area of the CMS, using the Login Form Portlet. It does not handle users that need to
8
8
  log into the CMS administrative area. It also handles single logout by redirecting the user to cas /logout service.
9
9
 
10
- As of 1.0.1, this is now managed via gemcutter.
11
-
12
10
  ## A. Instructions
13
11
  Here are the necessary steps to install this module.
14
12
 
@@ -16,7 +14,7 @@ Here are the necessary steps to install this module.
16
14
  2. Install the rubycas-client gem (See B below)
17
15
  3. Install the bcms_cas module, and configure it to point to your CAS server (see C below).
18
16
  4. Migrate the database to add the CAS Group (See D below)
19
- 5. Alter the Login Form Portlet to submit to the CAS server. (See E below)
17
+ 5. Create a Login Form to submit to the CAS server. (See E below)
20
18
 
21
19
  ## B. Installing RubyCAS-Client
22
20
  This project depends on RubyCAS-client (http://code.google.com/p/rubycas-client/). RubyCAS-Client is a standard Rails PluginGem, and the instructions
@@ -28,66 +26,33 @@ This will add the latest version of a gem. The bcms_cas module will require the
28
26
  make any configuration changes in your rails project.
29
27
 
30
28
  ## C. Installing/Configuring the Module
31
- To install a BrowserCMS module follow the instructions here http://www.browsercms.org/doc/guides/html/installing_modules.html .
32
- After that you will need to configure the rubycas-client to point to the correct CAS server, along with any other
33
- configuration options you need. Add the following to your config/initializers/browsercms.rb:
29
+ To install a BrowserCMS module see the following instructions http://www.browsercms.org/doc/guides/html/installing_modules.html . After you add the gem to your
30
+ environment.rb, run the following command to generate the necessary configuration files.
34
31
 
32
+ $ ./script/generate bcms_cas
35
33
 
36
- CASClient::Frameworks::Rails::Filter.configure(
37
- :cas_base_url => "https://cas.yourdomainname.org",
38
- :extra_attributes_session_key => :cas_extra_attributes
39
- )
34
+ This will generate several files. You will then need to edit one of them to point to the CAS server. Edit the config/initializers/bcms_cas.rb and change the server_url
35
+ value to whatever domain name your cas server is located at. The file should look similar to this:
40
36
 
41
- Make sure your SITE_DOMAIN variable in production/development is correctly set to the right top level domain. This will be needed
42
- to allow redirects between the servers to happen correctly (it requires Absolute URLs). For example, in config/environments/production.rb:
37
+ Cas::Module.configure do |config|
38
+ config.server_url = "https://cas.yourdomainname.com"
39
+ end
43
40
 
44
- SITE_DOMAIN="www.yourdomainname.com"
41
+ Next edit the production.rb to make sure your SITE_DOMAIN variable in production is correctly set to the right top level domain. This will be needed
42
+ to allow redirects between the servers to happen correctly (it requires Absolute URLs).
45
43
 
46
- ### Extra Attributes (Optional)
47
- The :extra_attributes_session_key may not be needed, depending on what type of Authenticator your CAS server is using. You can
48
- safely leave it out if you are just using the normal CMS logic. A CAS server can send additional information back, and these will be stored as
49
- session variables that can be accessed in other methods.
44
+ SITE_DOMAIN="www.yourdomainname.com"
50
45
 
51
- ## D. Add/Configure the 'CAS Authenticated User' Group
46
+ ## D. Configure the 'CAS Authenticated User' Group
52
47
  When you run rake db:migrate, this module will add a new group to the CMS called 'CAS Authenticated Users'. All users that
53
48
  log in successfully will be assigned to members of this group. You will potentially want to rename this group to something
54
49
  that more accurately reflects who these users are (i.e. Members, Staff, etc) and then set which sections of the website this
55
50
  group can visit.
56
51
 
57
- ## E. Configure Login Form Portlet
58
- Alter the Login Form portlet to look something like this:
59
-
60
- <% form_tag "https://cas.yourdomainname.org" do %>
61
- <%= login_ticket_tag %>
62
- <%= service_url_tag %>
63
- <p>
64
- <%= label_tag :login %>
65
- <%= text_field_tag :username, @login %>
66
- </p>
67
- <p>
68
- <%= label_tag :password %>
69
- <%= password_field_tag :password %>
70
- </p>
71
- <p>
72
- <%= label_tag :remember_me %>
73
- <%= check_box_tag :remember_me, '1', @remember_me %>
74
- </p>
75
- <p><%= submit_tag "Login" %></p>
76
- <% end %>
77
-
78
- The key changes are:
79
-
80
- 1. The form needs to submit directly to the CAS server
81
- 2. You need to add helpers for login_ticket_tag and service_url_tag. These generate hidden parameters CAS services need.
82
- 3. Change the username parameter from :login to :username
83
-
84
- You must also create a file in your project called: app/portlets/helpers/login_portlet_helper.rb, with the following contents:
85
-
86
- module LoginPortletHelper
87
- include Cas::Login
88
- end
89
-
90
- This will add the needed methods for the above class.
52
+ ## E. Create a Login Form
53
+
54
+ Via the BrowserCMS UI, create a page and place a Login Form portlet on it. It should use the newly generated login view created by the bcms_cas generator. If
55
+ the module is configured correctly, then logging in should correctly establish a CAS session.
91
56
 
92
57
  F. Known Issues
93
58
 
@@ -99,4 +64,5 @@ F. Known Issues
99
64
  * The CAS Login page has to be styled to match the look and feel of the site.
100
65
  * If the user types in wrong username/pw on CMS login form, they will be left on the CAS Login page, with message.
101
66
  * Every hit to a page with the login form portlet is fetching a LT from CAS. This is potentially slow. [Performance]
67
+ * A user that logs in as a CAS user and then as a cmsadmin will experience odd UI permission problems. This is due to CMS login not correctly clearing all session state.
102
68
 
@@ -1,20 +1,24 @@
1
1
  #
2
- # This represents a user was autheniticated using a CAS service. Their user data is not saved in the database (in the users table_,
2
+ # This represents a user was authenticated using a CAS service. Their user data is not saved in the database (in the users table_,
3
3
  # but is retrieved from an external service and stored purely as session data.
4
4
  #
5
5
  #
6
- class CasUser < GuestUser
6
+ class CasUser < Cms::TemporaryUser
7
7
 
8
8
  GROUP_NAME = "cas_group"
9
9
 
10
10
  def initialize(attributes={})
11
11
  super({ :first_name => "CAS", :last_name => "User"}.merge(attributes))
12
- @guest = false
13
12
  end
14
13
 
15
14
  # Using a single group for now. (This will need to be mapped to more groups later).
16
- def group
17
- @group ||= Group.find_by_code(GROUP_NAME)
15
+ def groups
16
+ @groups ||= [group]
18
17
  end
19
18
 
19
+ # @deprecated
20
+ # This exists only for backwards compatibility for when this used to inherit from GuestUser. It should be removed in 1.2.
21
+ def group
22
+ Group.find_by_code(GROUP_NAME)
23
+ end
20
24
  end
@@ -0,0 +1,27 @@
1
+ module Cms
2
+
3
+ # This represents a 'temporary' user who is never stored in the database, but lives only as a limited duration (generally tied to a session)
4
+ # This can be used to represent an externally verified user who should be granted access to areas of the site.
5
+ class TemporaryUser < User
6
+
7
+ # Shouldn't save these users to the db.
8
+ def save(perform_validations=true)
9
+ false
10
+ end
11
+
12
+ # Shouldn't save these users to the db.
13
+ def save!(perform_validation=true)
14
+ raise NotImplementedError
15
+ end
16
+
17
+ # Determines if this user has access to the CMS UI.
18
+ #
19
+ # Note: This overrides User.cms_access? which is implicitly dependant on groups being a proxy/has_many Array, rather than
20
+ # just an array of groups.
21
+ def cms_access?
22
+ groups.each do |g|
23
+ return true if g.cms_access?
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,4 +1,4 @@
1
- require 'cas/utils'
1
+ require 'bcms_cas/utils'
2
2
  require 'casclient'
3
3
  require 'casclient/frameworks/rails/filter'
4
4
 
@@ -20,25 +20,23 @@ module Cas
20
20
 
21
21
  # Each instance of the controller will gain these methods.
22
22
  module InstanceMethods
23
+
24
+ # This exists because we want to force this to happen AFTER login_from_cas_ticket. There may be a better way to do this.
23
25
  def check_access_to_page_normally
24
- logger.warn "Checking auth using normal Cms filter."
25
26
  check_access_to_page
26
27
  end
27
28
 
28
29
  # Attempts to set the current user based on the session attribute set by CAS.
29
30
  def login_from_cas_ticket
30
- logger.debug "Attempting to login using CAS session variable."
31
+ logger.debug "Checking for cas login. The current_user is '#{@current_user.login}'." if @current_user
31
32
  if session[:cas_user]
32
- logger.warn "Who is @current_user '#{@current_user.login}'?" if @current_user
33
- logger.warn "Who is User.current '#{User.current.login}'?" if User.current
34
-
35
33
  user = CasUser.new(:login=>session[:cas_user])
36
34
 
37
35
  # Having to set both of these feels very duplicative. Ideally I would like a way
38
- # to set only once, but calling current_user= has sideeffects.
36
+ # to set only once, but calling current_user= has side effects.
39
37
  @current_user = User.current = user
40
38
 
41
- logger.info "Found session[:cas_user]. Created CasUser with login '#{user.login}' and set as current_user." if @current_user
39
+ logger.debug "CasUser information found in session. Setting current_user as '#{user.login}" if @current_user
42
40
  end
43
41
  @current_user
44
42
  end
@@ -57,7 +55,7 @@ module Cas
57
55
  module InstanceMethods
58
56
 
59
57
  def destroy_with_cas
60
- logger.info "Handle single logout."
58
+ logger.debug "Logging user out of both cms and CAS server."
61
59
  logout_user
62
60
  Cas::Utils.logout(self, "http://#{SITE_DOMAIN}/")
63
61
  end
@@ -0,0 +1,25 @@
1
+ module Cas
2
+
3
+ module Module
4
+
5
+ class << self
6
+
7
+ attr_accessor :configuration
8
+
9
+ def configure()
10
+ self.configuration ||= Configuration.new
11
+ yield(configuration)
12
+ self.configuration.execute
13
+ end
14
+ end
15
+ end
16
+
17
+ class Configuration
18
+ attr_accessor :server_url
19
+
20
+ def execute
21
+ params = {:cas_base_url => server_url, :extra_attributes_session_key => :cas_extra_attributes}
22
+ CASClient::Frameworks::Rails::Filter.configure(params)
23
+ end
24
+ end
25
+ end
@@ -16,7 +16,10 @@ module Cas::LoginPortlet
16
16
 
17
17
  ##
18
18
  # Returns the URL to the CAS login service.
19
- def login_url
20
- CASClient::Frameworks::Rails::Filter.login_url
19
+ #
20
+ def login_url_tag
21
+ CASClient::Frameworks::Rails::Filter.login_url(@controller)
21
22
  end
23
+
24
+ alias_method :login_url, :login_url_tag
22
25
  end
File without changes
data/lib/bcms_cas.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  require 'bcms_cas/routes'
2
- require 'cas/authentication'
3
- require 'cas/login_portlet_extension'
2
+ require 'bcms_cas/configuration'
3
+ require 'bcms_cas/authentication'
4
+ require 'bcms_cas/login_portlet_extension'
data/rails/init.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # This seems necessary in order for rake gems:unpack to work.
2
+ require 'browsercms'
3
+
1
4
  gem_root = File.expand_path(File.join(File.dirname(__FILE__), ".."))
2
5
  Cms.add_to_rails_paths gem_root
3
6
  Cms.add_generator_paths gem_root, "db/migrate/[0-9]*_*.rb"
@@ -0,0 +1,16 @@
1
+ class BcmsCasGenerator < Rails::Generator::Base
2
+
3
+ def manifest
4
+ record do |m|
5
+ m.template "initializer.rb", "config/initializers/bcms_cas.rb"
6
+
7
+ # Provide a different default template for the Login Form.
8
+ m.directory File.join('app/views/portlets/login')
9
+ m.template "render.html.erb", "app/views/portlets/login/render.html.erb"
10
+
11
+ # Provide a helper for Login Form Portlet (this is a workaround for a core CMS bug where portlet helpers are not loaded from gems)
12
+ m.directory File.join('app/portlets/helpers')
13
+ m.template "login_portlet_helper.rb", "app/portlets/helpers/login_portlet_helper.rb"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ Cas::Module.configure do |config|
2
+ config.server_url = "https://some.domain.com"
3
+ end
@@ -0,0 +1,4 @@
1
+ # Necessary only while BrowserCMS can't load portlet helpers from gems. (Bug See https://browsermedia.lighthouseapp.com/projects/28481/tickets/280-loginportlethelper-methods-cant-be-found-in-loginportlet)
2
+ module LoginPortletHelper
3
+ include Cas::LoginPortlet
4
+ end
@@ -0,0 +1,18 @@
1
+ <%%# This will override the 'Stock' view provided by the LoginFormPortlet in order to make it work with CAS. -%>
2
+ <%% form_tag login_url_tag do %>
3
+ <%%= login_ticket_tag %>
4
+ <%%= service_url_tag %>
5
+ <p>
6
+ <%%= label_tag :login %>
7
+ <%%= text_field_tag :username, @login %>
8
+ </p>
9
+ <p>
10
+ <%%= label_tag :password %>
11
+ <%%= password_field_tag :password %>
12
+ </p>
13
+ <p>
14
+ <%%= label_tag :remember_me %>
15
+ <%%= check_box_tag :remember_me, '1', @remember_me %>
16
+ </p>
17
+ <p><%%= submit_tag "Login" %></p>
18
+ <%% end %>
@@ -0,0 +1,25 @@
1
+ require "test_helper"
2
+ require 'mocha'
3
+
4
+ class CasConfigurationTest < ActiveSupport::TestCase
5
+
6
+ def setup
7
+
8
+ end
9
+
10
+ def teardown
11
+
12
+ end
13
+
14
+ test "Simplified syntax for configuration that hides the details of the RubyCas-Client" do
15
+ expected_params = {:cas_base_url => "https://some.domain.com", :extra_attributes_session_key => :cas_extra_attributes}
16
+ CASClient::Frameworks::Rails::Filter.expects(:configure).with(expected_params)
17
+
18
+ Cas::Module.configure do |config|
19
+ config.server_url = "https://some.domain.com"
20
+ end
21
+
22
+ cfg = Cas::Module.configuration
23
+ assert_equal "https://some.domain.com", cfg.server_url
24
+ end
25
+ end
@@ -7,6 +7,10 @@ end
7
7
 
8
8
  class LoginPortletTest < ActiveSupport::TestCase
9
9
 
10
+ def setup
11
+ @obj = LoginObject.new
12
+ end
13
+
10
14
  test "service_url_tag" do
11
15
  obj = LoginObject.new
12
16
  assert obj.respond_to?(:service_url_tag)
@@ -30,4 +34,11 @@ class LoginPortletTest < ActiveSupport::TestCase
30
34
  assert_equal "http://example.com", obj.login_url
31
35
  end
32
36
 
37
+ test "Alias (to avoid helper conflicts)" do
38
+ CASClient::Frameworks::Rails::Filter.expects(:login_url).returns("http://example.com")
39
+
40
+ assert_equal "http://example.com", @obj.login_url_tag
41
+ end
42
+
43
+
33
44
  end
@@ -3,22 +3,20 @@ require 'test_helper'
3
3
  class CasUserTest < ActiveSupport::TestCase
4
4
 
5
5
  def setup
6
- @s = Section.create!(:name=>"root", :root=>true, :path=>"/")
7
- @p = Page.create!(:name=>"Home", :section=>@s, :path=>"/p")
8
- @g = Group.create!(:name=>"G", :code=>"cas_group")
9
- @g.sections = Section.all
6
+ @viewable_section = Section.create!(:name=>"root", :root=>true, :path=>"/")
7
+ @viewable_page = Page.create!(:name=>"Home", :section=>@viewable_section, :path=>"/p")
8
+ @cas_group = Group.create!(:name=>"G", :code=>"cas_group")
9
+ @cas_group.sections = Section.all
10
10
  end
11
11
 
12
12
  test "group returns the cas_group" do
13
13
  user = CasUser.new
14
-
15
- assert_equal @g, user.group
14
+ assert_equal @cas_group, user.group
16
15
  end
17
16
 
18
17
  test "cas_user should be able to view all sections (based on group)" do
19
18
  user = CasUser.new
20
-
21
- assert user.able_to_view?(@p)
19
+ assert user.able_to_view?(@viewable_page)
22
20
  end
23
21
 
24
22
  test "setting login" do
@@ -31,5 +29,11 @@ class CasUserTest < ActiveSupport::TestCase
31
29
  assert !user.guest?
32
30
  end
33
31
 
32
+ test "determine if a user has cms_access" do
33
+ user = CasUser.new
34
+ user.groups << @cas_group
34
35
 
36
+ @cas_group.expects(:cms_access?).returns(true)
37
+ assert_equal true, user.cms_access?
38
+ end
35
39
  end
@@ -0,0 +1,42 @@
1
+ require "test_helper"
2
+
3
+ class TemporaryUserTest < ActiveSupport::TestCase
4
+
5
+ MINIMUM_VALID_ATTRIBUTES = {:login=>"abc@bm.com", :password=>"123", :password_confirmation=>"123", :email=>"abc@bm.com"}
6
+ def setup
7
+ @user = Cms::TemporaryUser.new(MINIMUM_VALID_ATTRIBUTES)
8
+ end
9
+
10
+ def teardown
11
+
12
+ end
13
+
14
+ test "Should not be able to save or save!" do
15
+
16
+ assert_equal false, @user.save
17
+ assert_equal true, @user.valid?
18
+
19
+ assert_raise NotImplementedError do
20
+ @user.save!
21
+ end
22
+
23
+ end
24
+ test "Shouldn't be able to update attributes" do
25
+ assert_equal false, @user.update_attribute(:login, "OTHER")
26
+ assert_equal false, @user.update_attributes({:login =>"OTHER"})
27
+ end
28
+
29
+ test "Should belong to no groups by default" do
30
+ assert_equal 0, @user.groups.size
31
+ end
32
+ end
33
+
34
+
35
+ class GuestUserTest <ActiveSupport::TestCase
36
+
37
+ test "Verify save behavior of Guest is similar to TemporaryUser" do
38
+ guest = GuestUser.new(TemporaryUserTest::MINIMUM_VALID_ATTRIBUTES)
39
+ assert_equal false, guest.save()
40
+ assert_equal true, guest.valid?
41
+ end
42
+ end
@@ -7,4 +7,10 @@ class LoginPortletHelperTest < ActionView::TestCase
7
7
  ticket = Cas::Utils.expects(:fetch_lt_from_cas).with().returns("ABC")
8
8
  assert_equal hidden_field_tag( :lt, "ABC"), login_ticket_tag
9
9
  end
10
+
11
+ test "Get login URL" do
12
+ @controller = mock
13
+ CASClient::Frameworks::Rails::Filter.expects(:login_url).with(@controller).returns("http://someurl.com")
14
+ assert_equal "http://someurl.com", login_url_tag
15
+ end
10
16
  end
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bcms_cas
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ hash: 19
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 1
9
+ - 0
10
+ version: 1.1.0
5
11
  platform: ruby
6
12
  authors:
7
13
  - BrowserMedia
@@ -9,29 +15,38 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-01-19 00:00:00 -05:00
18
+ date: 2010-09-30 00:00:00 -04:00
13
19
  default_executable:
14
20
  dependencies:
15
21
  - !ruby/object:Gem::Dependency
16
22
  name: browsercms
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
20
26
  requirements:
21
27
  - - ">="
22
28
  - !ruby/object:Gem::Version
23
- version: 3.0.6
24
- version:
29
+ hash: 5
30
+ segments:
31
+ - 3
32
+ - 1
33
+ version: "3.1"
34
+ type: :runtime
35
+ version_requirements: *id001
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: rubycas-client
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
30
41
  requirements:
31
42
  - - ">="
32
43
  - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
33
47
  version: "0"
34
- version:
48
+ type: :runtime
49
+ version_requirements: *id002
35
50
  description: Allows a BrowserCMS project to connect to a CAS server to authenticate users.
36
51
  email: github@browsermedia.com
37
52
  executables: []
@@ -42,14 +57,29 @@ extra_rdoc_files:
42
57
  - README.markdown
43
58
  files:
44
59
  - app/models/cas_user.rb
60
+ - app/models/cms/temporary_user.rb
45
61
  - db/migrate/20091002162550_add_cas_user_group.rb
46
62
  - lib/bcms_cas.rb
63
+ - lib/bcms_cas/authentication.rb
64
+ - lib/bcms_cas/configuration.rb
65
+ - lib/bcms_cas/login_portlet_extension.rb
47
66
  - lib/bcms_cas/routes.rb
48
- - lib/cas/authentication.rb
49
- - lib/cas/login_portlet_extension.rb
50
- - lib/cas/utils.rb
67
+ - lib/bcms_cas/utils.rb
51
68
  - rails/init.rb
69
+ - rails_generators/bcms_cas/bcms_cas_generator.rb
70
+ - rails_generators/bcms_cas/templates/initializer.rb
71
+ - rails_generators/bcms_cas/templates/login_portlet_helper.rb
72
+ - rails_generators/bcms_cas/templates/render.html.erb
52
73
  - README.markdown
74
+ - test/performance/browsing_test.rb
75
+ - test/test_helper.rb
76
+ - test/unit/cas/cas_authentication_test.rb
77
+ - test/unit/cas/configuration_test.rb
78
+ - test/unit/cas/login_portlet_test.rb
79
+ - test/unit/cas_user_test.rb
80
+ - test/unit/cas_utils_test.rb
81
+ - test/unit/cms/temporary_user_test.rb
82
+ - test/unit/helpers/login_portlet_helper_test.rb
53
83
  has_rdoc: true
54
84
  homepage: http://browsercms.org
55
85
  licenses: []
@@ -60,21 +90,27 @@ rdoc_options:
60
90
  require_paths:
61
91
  - lib
62
92
  required_ruby_version: !ruby/object:Gem::Requirement
93
+ none: false
63
94
  requirements:
64
95
  - - ">="
65
96
  - !ruby/object:Gem::Version
97
+ hash: 3
98
+ segments:
99
+ - 0
66
100
  version: "0"
67
- version:
68
101
  required_rubygems_version: !ruby/object:Gem::Requirement
102
+ none: false
69
103
  requirements:
70
104
  - - ">="
71
105
  - !ruby/object:Gem::Version
106
+ hash: 3
107
+ segments:
108
+ - 0
72
109
  version: "0"
73
- version:
74
110
  requirements: []
75
111
 
76
112
  rubyforge_project: browsercms
77
- rubygems_version: 1.3.5
113
+ rubygems_version: 1.3.7
78
114
  signing_key:
79
115
  specification_version: 3
80
116
  summary: A CAS Module for BrowserCMS
@@ -82,7 +118,9 @@ test_files:
82
118
  - test/performance/browsing_test.rb
83
119
  - test/test_helper.rb
84
120
  - test/unit/cas/cas_authentication_test.rb
121
+ - test/unit/cas/configuration_test.rb
85
122
  - test/unit/cas/login_portlet_test.rb
86
123
  - test/unit/cas_user_test.rb
87
124
  - test/unit/cas_utils_test.rb
125
+ - test/unit/cms/temporary_user_test.rb
88
126
  - test/unit/helpers/login_portlet_helper_test.rb