ccls-calnet_authenticated 1.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.
Files changed (26) hide show
  1. data/README.rdoc +59 -0
  2. data/generators/calnet_authenticated/USAGE +15 -0
  3. data/generators/calnet_authenticated/calnet_authenticated_generator.rb +118 -0
  4. data/generators/calnet_authenticated/templates/autotest_calnet_authenticated.rb +3 -0
  5. data/generators/calnet_authenticated/templates/calnet_authenticated.rake +6 -0
  6. data/generators/calnet_authenticated/templates/controllers/sessions_controller.rb +8 -0
  7. data/generators/calnet_authenticated/templates/controllers/users_controller.rb +40 -0
  8. data/generators/calnet_authenticated/templates/functional/sessions_controller_test.rb +68 -0
  9. data/generators/calnet_authenticated/templates/functional/users_controller_test.rb +94 -0
  10. data/generators/calnet_authenticated/templates/migration.rb +41 -0
  11. data/generators/calnet_authenticated/templates/views/users/_form.html.erb +27 -0
  12. data/generators/calnet_authenticated/templates/views/users/edit.html.erb +1 -0
  13. data/generators/calnet_authenticated/templates/views/users/index.html.erb +26 -0
  14. data/generators/calnet_authenticated/templates/views/users/menu.js.erb +4 -0
  15. data/generators/calnet_authenticated/templates/views/users/new.html.erb +1 -0
  16. data/generators/calnet_authenticated/templates/views/users/show.html.erb +19 -0
  17. data/lib/calnet_authenticated.rb +83 -0
  18. data/lib/calnet_authenticated/autotest.rb +54 -0
  19. data/lib/calnet_authenticated/calnet_user.rb +89 -0
  20. data/lib/calnet_authenticated/controller.rb +94 -0
  21. data/lib/calnet_authenticated/test_helper.rb +100 -0
  22. data/lib/calnet_authenticated/test_tasks.rb +42 -0
  23. data/lib/ccls-calnet_authenticated.rb +1 -0
  24. data/rails/init.rb +4 -0
  25. data/test/unit/calnet/user_test.rb +137 -0
  26. metadata +222 -0
data/README.rdoc ADDED
@@ -0,0 +1,59 @@
1
+ = CalNet Authenticated
2
+
3
+ In Heavy Development ...
4
+
5
+ This is a "rails" gem, so much of the code will
6
+ be for testing in a rails app, but will not be
7
+ included in the actual gem.
8
+
9
+ == ToDo
10
+
11
+ * Include migrations with an rsync or a generator
12
+ * preferably a generator, but they are diff in rails 3
13
+ * rake task require mods to the Rakefile
14
+ * append requirement to Rakefile ?
15
+ * perhaps add initializer (don't know how rails 3 does it)
16
+ * import some tests
17
+ * include any test helpers for users
18
+ * Cleanup code. Isolate requirements
19
+ * Too many quirks to keep controllers and views in gem so install them in app with generator.
20
+
21
+ == Installation / Usage
22
+
23
+ config.gem 'ccls-calnet_authenticated',
24
+ :source => 'http://rubygems.org'
25
+
26
+ class User
27
+ calnet_authenticated
28
+ end
29
+
30
+ # Generates a db migration
31
+ script/generate calnet_authenticated User
32
+
33
+ As some methods, like current_user, are flexible
34
+ and dependent upon the developer's choice of user
35
+ model, eager loading isn't good enough.
36
+ The developer will need to ensure that the model
37
+ is always around. I chose to simply add ...
38
+
39
+ require 'user' <- or whatever your user model is
40
+
41
+ to the bottom of my config/environment.rb outside
42
+ of the initializer block.
43
+
44
+
45
+ == Gemified with Jeweler
46
+
47
+ vi Rakefile
48
+ rake version:write
49
+
50
+ rake version:bump:patch
51
+ rake version:bump:minor
52
+ rake version:bump:major
53
+
54
+ rake gemspec
55
+
56
+ rake install
57
+ rake release
58
+
59
+ Copyright (c) 2010 [George 'Jake' Wendt], released under the MIT license
@@ -0,0 +1,15 @@
1
+ script/generate calnet_authenticated
2
+
3
+ Description:
4
+ Explain the generator
5
+
6
+ Example:
7
+ ./script/generate calnet_authenticated
8
+
9
+ This will create:
10
+ a migration file for
11
+
12
+ a bunch of stuff
13
+
14
+
15
+ blah blah blah
@@ -0,0 +1,118 @@
1
+ #class CalnetAuthenticatedGenerator < Rails::Generator::NamedBase
2
+ class CalnetAuthenticatedGenerator < Rails::Generator::Base
3
+
4
+ def manifest
5
+ record do |m|
6
+ # The autotest file will require that the app actually
7
+ # looks for autotest files.
8
+ m.directory('config/autotest')
9
+ m.file('autotest_calnet_authenticated.rb', 'config/autotest/calnet_authenticated.rb')
10
+
11
+ # *.rake files in the lib/tasks/ directory are automatically
12
+ # loaded so nothing is required to include this.
13
+ m.directory('lib/tasks')
14
+ m.file('calnet_authenticated.rake', 'lib/tasks/calnet_authenticated.rake')
15
+
16
+ # may want to consider installing roles.yml ( actually have in simply_authorized )
17
+
18
+ m.migration_template 'migration.rb', 'db/migrate',
19
+ :migration_file_name => "add_calnet_authenticated_columns_to_users"
20
+ # :migration_file_name => "add_calnet_authenticated_columns_to_#{file_path.gsub(/\//, '_').pluralize}"
21
+
22
+ dot = File.dirname(__FILE__)
23
+
24
+ m.directory('public/javascripts')
25
+ Dir["#{dot}/templates/javascripts/*js"].each{|file|
26
+ f = file.split('/').slice(-2,2).join('/')
27
+ m.file(f, "public/javascripts/#{File.basename(file)}")
28
+ }
29
+ m.directory('public/stylesheets')
30
+ Dir["#{dot}/templates/stylesheets/*css"].each{|file|
31
+ f = file.split('/').slice(-2,2).join('/')
32
+ m.file(f, "public/stylesheets/#{File.basename(file)}")
33
+ }
34
+
35
+
36
+
37
+ # Due to the ApplicationController errors, don't use
38
+ # controllers in the gem. Models and unit tests
39
+ # seem to work just fine as they are subclasses of
40
+ # ActiveRecord::Base. Controllers are subclasses of
41
+ # ApplicationController, which is in the application.
42
+ #
43
+ # TODO copy routes maybe? How to copy in the complex route?
44
+ # Simple, restful route is simple.
45
+ # Probably have to do this manually.
46
+ #
47
+ # TODO copy controllers, views and functional tests.
48
+ # there are no views
49
+
50
+ # m.directory('app/views/photos')
51
+ # Dir["#{dot}/templates/views/photos/*rb"].each{|file|
52
+ # f = file.split('/').slice(-3,3).join('/')
53
+ # has an extra directory in path which is needed in m.file(f
54
+ # which is relative to templates/
55
+ # m.file(f, "app/views/photos/#{File.basename(file)}")
56
+ # }
57
+ #
58
+ # more generic way (not yet actually tested)
59
+
60
+ Dir["#{dot}/templates/views/*/**/"].each do |dir|
61
+ last_dir = dir.split('/').last
62
+ m.directory("app/views/#{last_dir}")
63
+ Dir["#{dot}/templates/views/#{last_dir}/*rb"].each do |file|
64
+ f = file.split('/').slice(-3,3).join('/')
65
+ m.file(f, "app/views/#{last_dir}/#{File.basename(file)}")
66
+ end
67
+ end
68
+
69
+ m.directory('app/controllers')
70
+ Dir["#{dot}/templates/controllers/*rb"].each{|file|
71
+ f = file.split('/').slice(-2,2).join('/')
72
+ m.file(f, "app/controllers/#{File.basename(file)}")
73
+ }
74
+ m.directory('test/functional/calnet_authenticated')
75
+ Dir["#{dot}/templates/functional/*rb"].each{|file|
76
+ f = file.split('/').slice(-2,2).join('/')
77
+ m.file(f, "test/functional/calnet_authenticated/#{File.basename(file)}")
78
+ }
79
+
80
+ # m.directory('test/unit/authorized')
81
+ # Dir["#{dot}/templates/unit/*rb"].each{|file|
82
+ # f = file.split('/').slice(-2,2).join('/')
83
+ # m.file(f, "test/unit/authorized/#{File.basename(file)}")
84
+ # }
85
+
86
+ end
87
+ end
88
+
89
+ end
90
+ module Rails::Generator::Commands
91
+ class Create
92
+ def migration_template(relative_source,
93
+ relative_destination, template_options = {})
94
+ migration_directory relative_destination
95
+ migration_file_name = template_options[
96
+ :migration_file_name] || file_name
97
+ if migration_exists?(migration_file_name)
98
+ puts "Another migration is already named #{migration_file_name}: #{existing_migrations(migration_file_name).first}: Skipping"
99
+ else
100
+ template(relative_source, "#{relative_destination}/#{next_migration_string}_#{migration_file_name}.rb", template_options)
101
+ end
102
+ end
103
+ end # Create
104
+ class Base
105
+ protected
106
+ # the loop through migrations happens so fast
107
+ # that they all have the same timestamp which
108
+ # won't work when you actually try to migrate.
109
+ # All the timestamps MUST be unique.
110
+ def next_migration_string(padding = 3)
111
+ @s = (!@s.nil?)? @s.to_i + 1 : if ActiveRecord::Base.timestamped_migrations
112
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
113
+ else
114
+ "%.#{padding}d" % next_migration_number
115
+ end
116
+ end
117
+ end # Base
118
+ end
@@ -0,0 +1,3 @@
1
+ # From `script/generate calnet_authenticated` ...
2
+ gem 'ccls-calnet_authenticated'
3
+ require 'calnet_authenticated/autotest'
@@ -0,0 +1,6 @@
1
+ # From `script/generate calnet_authenticated` ...
2
+ # condition added to allow clean 'rake gems:install'
3
+ unless Gem.source_index.find_name('ccls-calnet_authenticated').empty?
4
+ gem 'ccls-calnet_authenticated'
5
+ require 'calnet_authenticated/test_tasks'
6
+ end
@@ -0,0 +1,8 @@
1
+ class SessionsController < ApplicationController
2
+
3
+ def destroy
4
+ calnetuid = session[:calnetuid]
5
+ CASClient::Frameworks::Rails::Filter.logout(self)
6
+ end
7
+
8
+ end
@@ -0,0 +1,40 @@
1
+ class UsersController < ApplicationController
2
+
3
+ skip_before_filter :login_required, :only => :menu
4
+
5
+ before_filter :id_required, :only => [:edit, :show, :update, :destroy]
6
+ before_filter :may_view_user_required, :except => [:index,:menu]
7
+ before_filter :may_view_users_required, :only => :index
8
+
9
+ ssl_allowed :menu
10
+
11
+ def menu
12
+ respond_to do |format|
13
+ format.js {}
14
+ end
15
+ end
16
+
17
+ def show
18
+ @roles = Role.all
19
+ end
20
+
21
+ def index
22
+ @users = User.search(params)
23
+ end
24
+
25
+ def destroy
26
+ @user.destroy
27
+ redirect_to users_path
28
+ end
29
+
30
+ protected
31
+
32
+ def id_required
33
+ if !params[:id].blank? and User.exists?(params[:id])
34
+ @user = User.find(params[:id])
35
+ else
36
+ access_denied("user id required!", users_path)
37
+ end
38
+ end
39
+
40
+ end
@@ -0,0 +1,68 @@
1
+ require 'test_helper'
2
+
3
+ class CalnetAuthenticated::SessionsControllerTest < ActionController::TestCase
4
+ tests SessionsController
5
+
6
+ test "should logout if authenticated" do
7
+ login_as Factory(:user)
8
+ assert_logged_in
9
+ delete :destroy
10
+ assert_redirected_to_logout
11
+ end
12
+
13
+ test "should NOT logout if NOT authenticated" do
14
+ assert_not_logged_in
15
+ delete :destroy
16
+ assert_redirected_to_login
17
+ end
18
+
19
+ #
20
+ # A temp testing route :show was created specifically to
21
+ # test the current_user and logged_in? methods. Without
22
+ # actually making a request, these methods fail as the
23
+ # session is nil. When making a :destroy request, it is
24
+ # destroyed and can't be checked.
25
+ #
26
+ # I suppose that I could create a new controller that
27
+ # doesn't meddle with the session, but ...
28
+ #
29
+
30
+ # test "should not be logged_in? without login" do
31
+ # assert_not_logged_in
32
+ # get :show
33
+ # assert_not_logged_in
34
+ # assert_equal false, @controller.logged_in?
35
+ # assert_redirected_to_login
36
+ # end
37
+ #
38
+ # test "should be logged_in? with login" do
39
+ # assert_not_logged_in
40
+ # login_as Factory(:user)
41
+ # assert_logged_in
42
+ # get :show
43
+ # assert_logged_in
44
+ # assert_equal true, @controller.logged_in?
45
+ # assert_redirected_to '/'
46
+ # end
47
+ #
48
+ # test "should not have current_user without login" do
49
+ # assert_not_logged_in
50
+ # get :show
51
+ # assert_not_logged_in
52
+ # assert_nil @controller.current_user
53
+ # assert_redirected_to_login
54
+ # end
55
+ #
56
+ # test "should have a current_user with login" do
57
+ # assert_not_logged_in
58
+ # login_as Factory(:user)
59
+ # assert_logged_in
60
+ # get :show
61
+ # assert_logged_in
62
+ # assert_not_nil @controller.current_user
63
+ # assert @controller.current_user.is_a?(User)
64
+ # assert @controller.current_user.is_a?(CalnetAuthenticatedUser())
65
+ # assert_redirected_to '/'
66
+ # end
67
+
68
+ end
@@ -0,0 +1,94 @@
1
+ require 'test_helper'
2
+
3
+ class CalnetAuthenticated::UsersControllerTest < ActionController::TestCase
4
+ tests UsersController
5
+
6
+ ASSERT_ACCESS_OPTIONS = {
7
+ :model => 'User',
8
+ :actions => [:destroy,:index,:show],
9
+ :attributes_for_create => :factory_attributes,
10
+ :method_for_create => :factory_create
11
+ }
12
+
13
+ def factory_attributes
14
+ Factory.attributes_for(:user)
15
+ end
16
+ def factory_create
17
+ Factory(:user)
18
+ end
19
+
20
+ assert_access_with_login( :logins => site_administrators )
21
+ assert_no_access_with_login( :logins => non_site_administrators )
22
+ assert_no_access_without_login
23
+ assert_access_with_https
24
+ assert_no_access_with_http
25
+
26
+ # use full role names as used in one test method
27
+ site_administrators.each do |cu|
28
+
29
+ test "should filter users index by role with #{cu} login" do
30
+ some_other_user = send(cu)
31
+ login_as send(cu)
32
+ get :index, :role_name => cu
33
+ assert assigns(:users).length >= 2
34
+ assigns(:users).each do |u|
35
+ assert u.role_names.include?(cu)
36
+ end
37
+ assert_nil flash[:error]
38
+ assert_response :success
39
+ end
40
+
41
+ test "should ignore empty role_name with #{cu} login" do
42
+ some_other_user = admin
43
+ login_as send(cu)
44
+ get :index, :role_name => ''
45
+ assert assigns(:users).length >= 2
46
+ assert_nil flash[:error]
47
+ assert_response :success
48
+ end
49
+
50
+ test "should ignore invalid role with #{cu} login" do
51
+ login_as send(cu)
52
+ get :index, :role_name => 'suffocator'
53
+ # assert_not_nil flash[:error]
54
+ assert_response :success
55
+ end
56
+
57
+ test "should get private users menu via js with #{cu} login" do
58
+ login_as send(cu)
59
+ @request.accept = "text/javascript"
60
+ get :menu
61
+ assert_response :success
62
+ assert_match /jQuery/, @response.body
63
+ end
64
+
65
+ end
66
+
67
+ all_test_roles.each do |cu|
68
+
69
+ test "should NOT get user info with invalid id with #{cu} login" do
70
+ login_as send(cu)
71
+ get :show, :id => 0
72
+ assert_not_nil flash[:error]
73
+ assert_redirected_to users_path
74
+ end
75
+
76
+ test "should get #{cu} info with self login" do
77
+ u = send(cu)
78
+ login_as u
79
+ get :show, :id => u.id
80
+ assert_response :success
81
+ assert_not_nil assigns(:user)
82
+ assert_equal u, assigns(:user)
83
+ end
84
+
85
+ end
86
+
87
+ test "should get empty private users menu via js without login" do
88
+ @request.accept = "text/javascript"
89
+ get :menu
90
+ assert_response :success
91
+ assert_match /\A\s*\z/, @response.body
92
+ end
93
+
94
+ end
@@ -0,0 +1,41 @@
1
+ #class AddCalnetAuthenticatedColumnsTo<%= class_name.pluralize.gsub(/::/, '') -%> < ActiveRecord::Migration
2
+ #class AddCalnetAuthenticatedColumnsToUsers -%> < ActiveRecord::Migration
3
+ class AddCalnetAuthenticatedColumnsToUsers < ActiveRecord::Migration
4
+ def self.up
5
+ # table_name = '<%= file_path.gsub(/\//, '_').pluralize %>'
6
+ table_name = 'users'
7
+ create_table table_name do |t|
8
+ t.timestamps
9
+ end unless table_exists?(table_name)
10
+ cols = columns(table_name).map(&:name)
11
+ add_column( table_name, :uid, :string
12
+ ) unless cols.include?('uid')
13
+ add_column( table_name, :sn, :string
14
+ ) unless cols.include?('sn')
15
+ add_column( table_name, :displayname, :string
16
+ ) unless cols.include?('displayname')
17
+ add_column( table_name, :mail, :string, {
18
+ :default => '', :null => false }
19
+ ) unless cols.include?('mail')
20
+ add_column( table_name, :telephonenumber, :string
21
+ ) unless cols.include?('telephonenumber')
22
+
23
+ idxs = indexes(table_name).map(&:name)
24
+ add_index( table_name, :uid, :unique => true
25
+ ) unless idxs.include?("index_#{table_name}_on_uid")
26
+ add_index( table_name, :sn
27
+ ) unless idxs.include?("index_#{table_name}_on_sn")
28
+ end
29
+
30
+ def self.down
31
+ # table_name = '<%= file_path.gsub(/\//, '_').pluralize %>'
32
+ table_name = 'users'
33
+ remove_index table_name, :uid
34
+ remove_index table_name, :sn
35
+ remove_column table_name, :uid
36
+ remove_column table_name, :sn
37
+ remove_column table_name, :displayname
38
+ remove_column table_name, :mail
39
+ remove_column table_name, :telephonenumber
40
+ end
41
+ end