lockdown 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,169 @@
1
+ module Lockdown
2
+ class System
3
+ class << self
4
+ include Lockdown::ControllerInspector
5
+
6
+ attr_accessor :options #:nodoc:
7
+
8
+ attr_accessor :permissions #:nodoc:
9
+ attr_accessor :user_groups #:nodoc:
10
+
11
+ # :public_access allows access to all
12
+ attr_accessor :public_access #:nodoc:
13
+ # :protected_access will restrict access to authenticated users.
14
+ attr_accessor :protected_access #:nodoc:
15
+
16
+ # Future functionality:
17
+ # :private_access will restrict access to model data to their creators.
18
+ # attr_accessor :private_access #:nodoc:
19
+
20
+ def configure(&block)
21
+ self.set_defaults
22
+ self.instance_eval(&block)
23
+ end
24
+
25
+ def [](key)
26
+ (@options||={})[key]
27
+ end
28
+
29
+ def []=(key,val)
30
+ @options[key] = val
31
+ end
32
+
33
+ def set_permission(name, *method_arrays)
34
+ @permissions[name] ||= []
35
+ method_arrays.each{|ary| @permissions[name] += ary}
36
+ end
37
+
38
+ def get_permissions
39
+ @permissions.keys
40
+ end
41
+
42
+ def set_user_group(name, *perms)
43
+ @user_groups[name] ||= []
44
+ perms.each{|perm| @user_groups[name].push(perm)}
45
+ end
46
+
47
+ def get_user_groups
48
+ @user_groups.keys
49
+ end
50
+
51
+ def set_public_access(*perms)
52
+ perms.each{|perm| @public_access += @permissions[perm]}
53
+ end
54
+
55
+ def set_protected_access(*perms)
56
+ perms.each{|perm| @protected_access += @permissions[perm]}
57
+ end
58
+
59
+ def standard_authorized_user_rights
60
+ Lockdown::System.public_access + Lockdown::System.protected_access
61
+ end
62
+
63
+ #
64
+ # Create a user group record in the database
65
+ #
66
+ def create_user_group(str_sym)
67
+ return unless @options[:use_db_models]
68
+ UserGroup.create(:name => string_name(str_sym))
69
+ end
70
+
71
+ def create_administrator_user_group
72
+ return unless @options[:use_db_models]
73
+ Lockdown::System.create_user_group administrator_group_symbol
74
+ end
75
+
76
+ #
77
+ # Delete a user group record from the database
78
+ #
79
+ def delete_user_group(str_sym)
80
+ ug = UserGroup.find_by_name(string_name(str_sym))
81
+ ug.destroy unless ug.nil?
82
+ end
83
+
84
+ def access_rights_for_user(usr)
85
+ return unless usr
86
+ return :all if administrator?(usr)
87
+
88
+ rights = standard_authorized_user_rights
89
+
90
+ if @options[:use_db_models]
91
+ usr.user_groups.each do |grp|
92
+ if @user_groups.has_key? symbol_name(grp.name)
93
+ @user_groups[symbol_name(grp.name)].each do |perm|
94
+ rights += @permissions[perm]
95
+ end
96
+ else
97
+ grp.permissions.each do |perm|
98
+ rights += @permissions[symbol_name(perm.name)]
99
+ end
100
+ end
101
+ end
102
+ end
103
+ rights
104
+ end
105
+
106
+ #
107
+ # Use this for the management screen to restrict user group list to the
108
+ # user. This will prevent a user from creating a user with more power than
109
+ # him/her self.
110
+ #
111
+ #
112
+ def user_groups_assignable_for_user(usr)
113
+ return [] if usr.nil?
114
+
115
+ if administrator?(usr)
116
+ UserGroup.find(:all, :order => :name)
117
+ else
118
+ UserGroup.find_by_sql <<-SQL
119
+ select user_groups.* from user_groups, user_groups_users
120
+ where user_groups.id = user_groups_users.user_group_id
121
+ and user_groups_users.user_id = #{usr.id}
122
+ order by user_groups.name
123
+ SQL
124
+ end
125
+ end
126
+
127
+ def make_user_administrator(usr)
128
+ usr.user_groups << UserGroup.find_or_create_by_name(administrator_group_string)
129
+ end
130
+
131
+ def administrator?(usr)
132
+ user_has_user_group?(usr, administrator_group_symbol)
133
+ end
134
+
135
+ def administrator_rights
136
+ all_controllers
137
+ end
138
+
139
+ protected
140
+
141
+ def set_defaults
142
+ @permissions = {}
143
+ @user_groups = {}
144
+
145
+ @public_access = []
146
+ @protected_access = []
147
+ @private_access = []
148
+
149
+ @options = {
150
+ :use_db_models => true,
151
+ :session_timeout => (60 * 60),
152
+ :logout_on_access_violation => false,
153
+ :access_denied_path => "/",
154
+ :successful_login_path => "/"
155
+ }
156
+ end
157
+
158
+ private
159
+
160
+ def user_has_user_group?(usr, sym)
161
+ usr.user_groups.each do |ug|
162
+ return true if convert_reference_name(ug.name) == sym
163
+ end
164
+ false
165
+ end
166
+
167
+ end # class block
168
+ end # System class
169
+ end # Lockdown
@@ -1,8 +1,8 @@
1
1
  module Lockdown #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 2
5
- TINY = 0
4
+ MINOR = 3
5
+ TINY = 1
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -14,25 +14,49 @@ class LockdownAllGenerator < Rails::Generator::Base
14
14
  m.directory 'app/controllers'
15
15
 
16
16
  #Controllers
17
- m.file "app/controllers/permissions_controller.rb", "app/controllers/permissions_controller.rb"
18
- m.file "app/controllers/users_controller.rb", "app/controllers/users_controller.rb"
19
- m.file "app/controllers/user_groups_controller.rb", "app/controllers/user_groups_controller.rb"
20
- m.file "app/controllers/sessions_controller.rb", "app/controllers/sessions_controller.rb"
17
+ m.file "app/controllers/permissions_controller.rb",
18
+ "app/controllers/permissions_controller.rb"
19
+
20
+ m.file "app/controllers/users_controller.rb",
21
+ "app/controllers/users_controller.rb"
22
+
23
+ m.file "app/controllers/user_groups_controller.rb",
24
+ "app/controllers/user_groups_controller.rb"
25
+
26
+ m.file "app/controllers/sessions_controller.rb",
27
+ "app/controllers/sessions_controller.rb"
21
28
 
22
29
  #Models
23
- m.file "app/models/permission.rb", "app/models/permission.rb"
24
- m.file "app/models/user.rb", "app/models/user.rb"
25
- m.file "app/models/user_group.rb", "app/models/user_group.rb"
26
- m.file "app/models/profile.rb", "app/models/profile.rb"
30
+ m.file "app/models/permission.rb",
31
+ "app/models/permission.rb"
32
+
33
+ m.file "app/models/user.rb",
34
+ "app/models/user.rb"
35
+
36
+ m.file "app/models/user_group.rb",
37
+ "app/models/user_group.rb"
38
+
39
+ m.file "app/models/profile.rb",
40
+ "app/models/profile.rb"
27
41
 
28
42
 
29
43
 
30
44
  #Migrations
31
- m.migration_template "db/migrate/create_profiles.rb", "db/migrate", :migration_file_name => "create_profiles"
32
- m.migration_template "db/migrate/create_users.rb", "db/migrate", :migration_file_name => "create_users"
33
- m.migration_template "db/migrate/create_user_groups.rb", "db/migrate", :migration_file_name => "create_user_groups"
34
- m.migration_template "db/migrate/create_permissions.rb", "db/migrate", :migration_file_name => "create_permissions"
35
- m.migration_template "db/migrate/create_base_user_groups.rb", "db/migrate", :migration_file_name => "create_base_user_groups"
45
+ m.migration_template "db/migrate/create_profiles.rb", "db/migrate",
46
+ :migration_file_name => "create_profiles"
47
+
48
+ m.migration_template "db/migrate/create_users.rb", "db/migrate",
49
+ :migration_file_name => "create_users"
50
+
51
+ m.migration_template "db/migrate/create_user_groups.rb", "db/migrate",
52
+ :migration_file_name => "create_user_groups"
53
+
54
+ m.migration_template "db/migrate/create_permissions.rb", "db/migrate",
55
+ :migration_file_name => "create_permissions"
56
+
57
+ m.migration_template "db/migrate/create_admin_user_and_user_group.rb",
58
+ "db/migrate",
59
+ :migration_file_name => "create_admin_user_and_user_group"
36
60
 
37
61
  #Route file (i like having them on individual lines)
38
62
  m.route_resources "permissions"
@@ -41,40 +65,54 @@ class LockdownAllGenerator < Rails::Generator::Base
41
65
  m.route_resources "sessions"
42
66
 
43
67
  #Helpers
44
- m.file "app/helpers/permissions_helper.rb", "app/helpers/permissions_helper.rb"
45
- m.file "app/helpers/users_helper.rb", "app/helpers/users_helper.rb"
46
- m.file "app/helpers/user_groups_helper.rb", "app/helpers/user_groups_helper.rb"
68
+ m.file "app/helpers/permissions_helper.rb",
69
+ "app/helpers/permissions_helper.rb"
70
+
71
+ m.file "app/helpers/users_helper.rb",
72
+ "app/helpers/users_helper.rb"
73
+
74
+ m.file "app/helpers/user_groups_helper.rb",
75
+ "app/helpers/user_groups_helper.rb"
47
76
 
48
77
  #Views
49
78
  copy_views(m, "users")
50
- m.file "app/views/users/_password.html.erb", "app/views/users/_password.html.erb"
79
+
80
+ m.file "app/views/users/_password.html.erb",
81
+ "app/views/users/_password.html.erb"
51
82
 
52
83
  copy_views(m, "user_groups")
53
84
 
54
- m.file "app/views/permissions/_data.html.erb", "app/views/permissions/_data.html.erb"
55
- m.file "app/views/permissions/index.html.erb", "app/views/permissions/index.html.erb"
56
- m.file "app/views/permissions/show.html.erb", "app/views/permissions/show.html.erb"
85
+ m.file "app/views/permissions/_data.html.erb",
86
+ "app/views/permissions/_data.html.erb"
87
+
88
+ m.file "app/views/permissions/index.html.erb",
89
+ "app/views/permissions/index.html.erb"
90
+
91
+ m.file "app/views/permissions/show.html.erb",
92
+ "app/views/permissions/show.html.erb"
57
93
 
58
- m.file "app/views/sessions/new.html.erb", "app/views/sessions/new.html.erb"
94
+ m.file "app/views/sessions/new.html.erb",
95
+ "app/views/sessions/new.html.erb"
59
96
  end
60
97
  end
61
98
 
62
99
  protected
63
- def banner
64
- <<-EOS
65
- Installs the lockdown framework to managing users user_groups and viewing permissions.
66
- Also includes a login screen.
100
+
101
+ def banner
102
+ <<-EOS
103
+ Installs the lockdown framework to managing users user_groups
104
+ and viewing permissions. Also includes a login screen.
67
105
 
68
106
  USAGE: #{$0} #{spec.name}
69
107
  EOS
70
- end
108
+ end
71
109
 
72
- def copy_views(m, vw)
73
- m.file "app/views/#{vw}/_data.html.erb", "app/views/#{vw}/_data.html.erb"
74
- m.file "app/views/#{vw}/_form.html.erb", "app/views/#{vw}/_form.html.erb"
75
- m.file "app/views/#{vw}/index.html.erb", "app/views/#{vw}/index.html.erb"
76
- m.file "app/views/#{vw}/show.html.erb", "app/views/#{vw}/show.html.erb"
77
- m.file "app/views/#{vw}/edit.html.erb", "app/views/#{vw}/edit.html.erb"
78
- m.file "app/views/#{vw}/new.html.erb", "app/views/#{vw}/new.html.erb"
79
- end
110
+ def copy_views(m, vw)
111
+ m.file "app/views/#{vw}/_data.html.erb", "app/views/#{vw}/_data.html.erb"
112
+ m.file "app/views/#{vw}/_form.html.erb", "app/views/#{vw}/_form.html.erb"
113
+ m.file "app/views/#{vw}/index.html.erb", "app/views/#{vw}/index.html.erb"
114
+ m.file "app/views/#{vw}/show.html.erb", "app/views/#{vw}/show.html.erb"
115
+ m.file "app/views/#{vw}/edit.html.erb", "app/views/#{vw}/edit.html.erb"
116
+ m.file "app/views/#{vw}/new.html.erb", "app/views/#{vw}/new.html.erb"
117
+ end
80
118
  end
@@ -27,7 +27,7 @@ class UserGroupsController < ApplicationController
27
27
  # GET /user_groups/new.xml
28
28
  def new
29
29
  @user_group = UserGroup.new
30
- @all_permissions = Permission.all_but_public
30
+ @all_permissions = Lockdown::System.get_permissions
31
31
 
32
32
  respond_to do |format|
33
33
  format.html # new.html.erb
@@ -37,7 +37,7 @@ class UserGroupsController < ApplicationController
37
37
 
38
38
  # GET /user_groups/1/edit
39
39
  def edit
40
- @all_permissions = Permission.all_but_public
40
+ @all_permissions = Lockdown::System.get_permissions
41
41
  end
42
42
 
43
43
  # POST /user_groups
@@ -25,7 +25,7 @@ class UsersController < ApplicationController
25
25
  def new
26
26
  @user = User.new
27
27
  @profile = Profile.new
28
- @user_groups_for_user = UserGroup.find_assignable_for_user(current_user)
28
+ @user_groups_for_user = Lockdown::System.user_groups_assignable_for_user(current_user)
29
29
  respond_to do |format|
30
30
  format.html # new.html.erb
31
31
  format.xml { render :xml => @user }
@@ -34,7 +34,7 @@ class UsersController < ApplicationController
34
34
 
35
35
  # GET /users/1/edit
36
36
  def edit
37
- @user_groups_for_user = UserGroup.find_assignable_for_user(current_user)
37
+ @user_groups_for_user = Lockdown::System.user_groups_assignable_for_user(current_user)
38
38
  end
39
39
 
40
40
  # POST /users
@@ -1,59 +1,6 @@
1
- #
2
- # This is merely an extension of the Lockdown::Permissions module to
3
- # allow for database manipulation of Permissions
4
- #
5
- # This is typically done via management screens.
6
- #
7
1
  class Permission < ActiveRecord::Base
8
- include Lockdown::Helper
9
2
  has_and_belongs_to_many :user_groups
10
3
 
11
- before_save :ensure_lockdown_permission_exists
12
-
13
- class << self
14
- include Lockdown::Helper
15
- #
16
- # Use this in your migrations to create a db record for management
17
- # functionality.
18
- #
19
- # Permission must be defined in:
20
- # RAILS_ROOT/config/initializers/lockdown/access.rb
21
- #
22
- def create_record(sym)
23
- raise NameError.new("#{sym} is not defined.") unless Lockdown::Permissions.respond_to?(sym)
24
- create(:name => convert_reference_name(sym) )
25
- end
26
-
27
- #
28
- # Use this in your migrations to delete the permission identified by sym.
29
- #
30
- def delete_record(sym)
31
- privi = find_by_sym(sym)
32
- privi.destroy unless privi.nil?
33
- end
34
-
35
-
36
- def find_by_sym(sym)
37
- if ENV['RAILS_ENV'] == "test"
38
- new(:name => convert_reference_name(sym))
39
- else
40
- find_by_name(convert_reference_name(sym))
41
- end
42
- end
43
-
44
- def all_but_public
45
- find(:all).delete_if do |perm|
46
- Lockdown::UserGroups.public_access.include?(convert_reference_name(perm.name))
47
- end
48
- end
49
- end # end class block
50
-
51
-
52
- def access_rights
53
- sym = convert_reference_name(self.name)
54
- Lockdown::Permissions[sym]
55
- end
56
-
57
4
  def all_users
58
5
  User.find_by_sql <<-SQL
59
6
  select users.*
@@ -63,18 +10,4 @@ class Permission < ActiveRecord::Base
63
10
  and permissions_user_groups.permission_id = #{self.id}
64
11
  SQL
65
12
  end
66
- protected
67
- #
68
- # Cannot create a permission record in the db that is not defined
69
- # in config/initializers/lock_down_access
70
- #
71
- # Creating a db record is to simplify the creation of user groups
72
- # via management screens.
73
- #
74
- def ensure_lockdown_permission_exists
75
- unless Lockdown::Permissions.respond_to?(convert_reference_name(self.name))
76
- raise NameError.new("#{sym} is not defined.")
77
- end
78
- end
79
-
80
13
  end
@@ -20,11 +20,10 @@ class User < ActiveRecord::Base
20
20
 
21
21
  before_save :prepare_for_save
22
22
 
23
- after_create :assign_registered_users_user_group
24
-
25
23
  attr_accessible :login, :password, :password_confirmation
26
24
 
27
- # Authenticates a user by their login name and unencrypted password. Returns the user or nil.
25
+ # Authenticates a user by their login name and unencrypted password.
26
+ # Returns the user or nil.
28
27
  def self.authenticate(login, password)
29
28
  u = find :first, :conditions => ['login = ?', login] # need to get the salt
30
29
  u && u.authenticated?(password) ? u : nil
@@ -35,10 +34,6 @@ class User < ActiveRecord::Base
35
34
  Digest::SHA1.hexdigest("--#{salt}--#{password}--")
36
35
  end
37
36
 
38
- def self.all
39
- find :all, :include => [:profile, :user_groups]
40
- end
41
-
42
37
  # Encrypts the password with the user salt
43
38
  def encrypt(password)
44
39
  self.class.encrypt(password, salt)
@@ -48,13 +43,7 @@ class User < ActiveRecord::Base
48
43
  crypted_password == encrypt(password)
49
44
  end
50
45
 
51
- def access_rights
52
- rvalue = Lockdown::UserGroups[:public_access]
53
- self.user_groups.each{|grp| rvalue += grp.access_rights}
54
- rvalue
55
- end
56
-
57
- def email
46
+ def email
58
47
  self.profile.email
59
48
  end
60
49
 
@@ -62,35 +51,23 @@ class User < ActiveRecord::Base
62
51
  self.profile.first_name + " " + self.profile.last_name
63
52
  end
64
53
 
65
- def administrator?
66
- has_user_group? :administrators
67
- end
68
-
69
- def has_user_group?(sym)
70
- self.user_groups.each do |ug|
71
- return true if convert_reference_name(ug.name) == sym
72
- end
73
- false
74
- end
75
-
76
54
  protected
77
- def assign_registered_users_user_group
78
- self.user_groups << UserGroup.find_by_sym(:registered_users)
79
- end
80
55
 
81
- def prepare_for_save
82
- encrypt_password
83
- self.profile.save
84
- end
56
+ def prepare_for_save
57
+ encrypt_password
58
+ self.profile.save
59
+ end
85
60
 
86
- def encrypt_password
87
- return if password.blank?
88
- self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{login}--") if new_record?
89
- self.crypted_password = encrypt(password)
90
- end
61
+ def encrypt_password
62
+ return if password.blank?
63
+ if new_record?
64
+ self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{login}--")
65
+ end
66
+ self.crypted_password = encrypt(password)
67
+ end
91
68
 
92
- def password_required?
93
- (crypted_password.blank? || !password.blank?)
94
- end
69
+ def password_required?
70
+ (crypted_password.blank? || !password.blank?)
71
+ end
95
72
 
96
73
  end