lockdown 0.6.3 → 0.7.0

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 (77) hide show
  1. data/.gitignore +5 -0
  2. data/History.txt +4 -0
  3. data/Manifest.txt +4 -31
  4. data/README.txt +6 -31
  5. data/Rakefile +26 -28
  6. data/lib/lockdown.rb +40 -10
  7. data/lib/lockdown/controller.rb +2 -5
  8. data/lib/lockdown/database.rb +1 -2
  9. data/lib/lockdown/frameworks/merb.rb +14 -4
  10. data/lib/lockdown/frameworks/merb/controller.rb +7 -3
  11. data/lib/lockdown/frameworks/merb/view.rb +5 -3
  12. data/lib/lockdown/frameworks/rails.rb +14 -4
  13. data/lib/lockdown/frameworks/rails/controller.rb +21 -20
  14. data/lib/lockdown/frameworks/rails/view.rb +20 -24
  15. data/lib/lockdown/orms/active_record.rb +4 -2
  16. data/lib/lockdown/orms/data_mapper.rb +4 -2
  17. data/lib/lockdown/rights.rb +1 -1
  18. data/lib/lockdown/system.rb +2 -3
  19. data/rails_generators/lockdown/lockdown_generator.rb +21 -11
  20. data/rails_generators/lockdown/templates/app/controllers/users_controller.rb +1 -4
  21. data/rails_generators/lockdown/templates/app/helpers/permissions_helper.rb +0 -11
  22. data/rails_generators/lockdown/templates/app/helpers/user_groups_helper.rb +0 -33
  23. data/rails_generators/lockdown/templates/app/helpers/users_helper.rb +0 -76
  24. data/rails_generators/lockdown/templates/app/models/user.rb +37 -11
  25. data/rails_generators/lockdown/templates/app/views/permissions/show.html.erb +24 -1
  26. data/rails_generators/lockdown/templates/app/views/user_groups/edit.html.erb +29 -2
  27. data/rails_generators/lockdown/templates/app/views/user_groups/new.html.erb +28 -2
  28. data/rails_generators/lockdown/templates/app/views/user_groups/show.html.erb +24 -1
  29. data/rails_generators/lockdown/templates/app/views/users/edit.html.erb +46 -1
  30. data/rails_generators/lockdown/templates/app/views/users/new.html.erb +46 -1
  31. data/rails_generators/lockdown/templates/app/views/users/show.html.erb +30 -1
  32. data/rails_generators/lockdown/templates/config/initializers/lockit.rb +1 -0
  33. data/{app_generators/lockdown/templates → rails_generators/lockdown/templates/lib/lockdown}/init.rb +0 -1
  34. data/{app_generators/lockdown/templates → rails_generators/lockdown/templates/lib/lockdown}/session.rb +13 -12
  35. data/tasks/ann.rake +80 -0
  36. data/tasks/bones.rake +20 -0
  37. data/tasks/gem.rake +192 -0
  38. data/tasks/git.rake +40 -0
  39. data/tasks/manifest.rake +48 -0
  40. data/tasks/notes.rake +27 -0
  41. data/tasks/post_load.rake +39 -0
  42. data/tasks/rdoc.rake +50 -0
  43. data/tasks/rubyforge.rake +55 -0
  44. data/tasks/setup.rb +279 -0
  45. data/tasks/spec.rake +54 -0
  46. data/tasks/svn.rake +47 -0
  47. data/tasks/test.rake +40 -0
  48. metadata +29 -73
  49. data/License.txt +0 -20
  50. data/PostInstall.txt +0 -3
  51. data/app_generators/lockdown/USAGE +0 -5
  52. data/app_generators/lockdown/lockdown_generator.rb +0 -25
  53. data/bin/lockdown +0 -132
  54. data/lib/lockdown/version.rb +0 -9
  55. data/rails_generators/lockdown/USAGE +0 -5
  56. data/rails_generators/lockdown/templates/app/views/permissions/_data.html.erb +0 -13
  57. data/rails_generators/lockdown/templates/app/views/user_groups/_data.html.erb +0 -68
  58. data/rails_generators/lockdown/templates/app/views/user_groups/_form.html.erb +0 -11
  59. data/rails_generators/lockdown/templates/app/views/users/_data.html.erb +0 -87
  60. data/rails_generators/lockdown/templates/app/views/users/_form.html.erb +0 -12
  61. data/script/console +0 -10
  62. data/script/destroy +0 -14
  63. data/script/generate +0 -14
  64. data/script/txt2html +0 -82
  65. data/setup.rb +0 -1585
  66. data/test/test_generator_helper.rb +0 -29
  67. data/test/test_helper.rb +0 -2
  68. data/test/test_lockdown.rb +0 -11
  69. data/test/test_lockdown_all_generator.rb +0 -43
  70. data/test/test_lockdown_generator.rb +0 -45
  71. data/test/test_lockdown_models_generator.rb +0 -43
  72. data/website/index.html +0 -62
  73. data/website/index.txt +0 -20
  74. data/website/javascripts/rounded_corners_lite.inc.js +0 -285
  75. data/website/model.jpg +0 -0
  76. data/website/stylesheets/screen.css +0 -138
  77. data/website/template.html.erb +0 -54
@@ -3,52 +3,48 @@ module Lockdown
3
3
  module Rails
4
4
  module View
5
5
  def self.included(base)
6
- base.send :alias_method, :link_to_open, :link_to
7
- base.send :alias_method, :link_to, :link_to_secured
6
+ base.class_eval do
7
+ alias_method :link_to_open, :link_to
8
+ alias_method :link_to, :link_to_secured
8
9
 
9
- base.send :alias_method, :button_to_open, :button_to
10
- base.send :alias_method, :button_to, :button_to_secured
10
+ alias_method :button_to_open, :button_to
11
+ alias_method :button_to, :button_to_secured
12
+ end
11
13
  end
12
14
 
13
15
  def link_to_secured(name, options = {}, html_options = nil)
14
- # Don't want to go through the url_for twice
15
16
  url = url_for(options)
16
- if authorized? test_path(url, html_options)
17
+
18
+ method = html_options ? html_options[:method] : nil
19
+
20
+ if authorized?(url, method)
17
21
  return link_to_open(name, url, html_options)
18
22
  end
19
23
  return ""
20
24
  end
21
25
 
22
- def link_to_or_show(name, options = {}, html_options = nil)
23
- lnk = link_to(name, options, html_options)
24
- lnk.length == 0 ? name : lnk
25
- end
26
-
27
26
  def button_to_secured(name, options = {}, html_options = nil)
28
27
  url = url_for(options)
29
- if authorized? test_path(url, html_options)
28
+
29
+ method = html_options ? html_options[:method] : nil
30
+
31
+ if authorized?(url, method)
30
32
  return button_to_open(name, url, html_options)
31
33
  end
32
34
  return ""
33
35
  end
34
36
 
37
+ def link_to_or_show(name, options = {}, html_options = nil)
38
+ lnk = link_to(name, options, html_options)
39
+ lnk.length == 0 ? name : lnk
40
+ end
41
+
35
42
  def links(*lis)
36
43
  rvalue = []
37
44
  lis.each{|link| rvalue << link if link.length > 0 }
38
45
  rvalue.join(" | ")
39
46
  end
40
-
41
- private
42
-
43
- def test_path(url, html_options)
44
- if html_options.is_a?(Hash) && html_options[:method] == :delete
45
- url += "/destroy"
46
- elsif url.split("/").last =~ /\A\d+\z/
47
- url += "/show"
48
- end
49
- url
50
- end
51
47
  end # View
52
48
  end # Rails
53
49
  end # Frameworks
54
- end # Lockdown
50
+ end # Lockdown
@@ -12,7 +12,9 @@ module Lockdown
12
12
  end
13
13
 
14
14
  def mixin
15
- Lockdown.orm_parent.send :include, Lockdown::Orms::ActiveRecord::Stamps
15
+ Lockdown.orm_parent.class_eval do
16
+ include Lockdown::Orms::ActiveRecord::Stamps
17
+ end
16
18
  end
17
19
  end # class block
18
20
 
@@ -63,4 +65,4 @@ module Lockdown
63
65
  end
64
66
  end
65
67
  end
66
- end
68
+ end
@@ -12,7 +12,9 @@ module Lockdown
12
12
  end
13
13
 
14
14
  def mixin
15
- orm_parent.send :include, Lockdown::Orm::DataMapper::Stamps
15
+ orm_parent.class_eval do
16
+ include Lockdown::Orm::DataMapper::Stamps
17
+ end
16
18
  end
17
19
  end # class block
18
20
 
@@ -65,4 +67,4 @@ module Lockdown
65
67
  end
66
68
  end
67
69
  end
68
- end
70
+ end
@@ -205,4 +205,4 @@ module Lockdown
205
205
  end
206
206
 
207
207
  end
208
- end
208
+ end
@@ -14,9 +14,8 @@ module Lockdown
14
14
 
15
15
  instance_eval(&block)
16
16
 
17
- unless Lockdown::System.fetch(:skip_db_sync_in).include?(ENV['RAILS_ENV'])
18
- Lockdown::Database.sync_with_db
19
- end
17
+ Lockdown::Database.sync_with_db unless skip_sync?
18
+
20
19
  end
21
20
 
22
21
  # Return option value for key
@@ -3,7 +3,7 @@
3
3
  if Rails::VERSION::MAJOR >= 2 && Rails::VERSION::MINOR >= 1
4
4
  if Rails::VERSION::TINY == 0
5
5
  @override_next_migration_string = true
6
- elsif ActiveRecord::Base.timestamped_migrations
6
+ elsif ActiveRecord::Base.timestamped_migrations
7
7
  @override_next_migration_string = true
8
8
  end
9
9
  end
@@ -35,6 +35,9 @@ class LockdownGenerator < Rails::Generator::Base
35
35
  @view_path = "app/views"
36
36
  @controller_path = "app/controllers"
37
37
  @helper_path = "app/helpers"
38
+ @lib_path = "lib/lockdown"
39
+
40
+ @initializer = "config/environment.rb"
38
41
 
39
42
  if @namespace
40
43
  @view_path += "/#{@namespace}"
@@ -44,12 +47,17 @@ class LockdownGenerator < Rails::Generator::Base
44
47
  end
45
48
 
46
49
  def manifest
47
- record do |m|
48
- @m = m
50
+ record do |@m|
49
51
  # Ensure appropriate folder(s) exists
50
52
  @m.directory @view_path
51
53
  @m.directory @controller_path
52
54
  @m.directory @helper_path
55
+ @m.directory @lib_path
56
+
57
+ unless options[:skip_rules]
58
+ @m.template "lib/lockdown/session.rb", "lib/lockdown/session.rb"
59
+ @m.file "lib/lockdown/init.rb", "lib/lockdown/init.rb"
60
+ end
53
61
 
54
62
  if options[:basics]
55
63
  options[:skip_management] = true
@@ -61,6 +69,8 @@ class LockdownGenerator < Rails::Generator::Base
61
69
  add_login unless options[:skip_login]
62
70
 
63
71
  add_models
72
+
73
+ @m.file "config/initializers/lockit.rb", "config/initializers/lockit.rb"
64
74
  end #record do |m|
65
75
  end
66
76
 
@@ -79,9 +89,6 @@ class LockdownGenerator < Rails::Generator::Base
79
89
 
80
90
  copy_views("user_groups")
81
91
 
82
- @m.template "app/views/permissions/_data.html.erb",
83
- "#{@view_path}/permissions/_data.html.erb"
84
-
85
92
  @m.template "app/views/permissions/index.html.erb",
86
93
  "#{@view_path}/permissions/index.html.erb"
87
94
 
@@ -123,8 +130,6 @@ class LockdownGenerator < Rails::Generator::Base
123
130
  end
124
131
 
125
132
  def copy_views(vw)
126
- @m.template "app/views/#{vw}/_data.html.erb", "#{@view_path}/#{vw}/_data.html.erb"
127
- @m.template "app/views/#{vw}/_form.html.erb", "#{@view_path}/#{vw}/_form.html.erb"
128
133
  @m.template "app/views/#{vw}/index.html.erb", "#{@view_path}/#{vw}/index.html.erb"
129
134
  @m.template "app/views/#{vw}/show.html.erb", "#{@view_path}/#{vw}/show.html.erb"
130
135
  @m.template "app/views/#{vw}/edit.html.erb", "#{@view_path}/#{vw}/edit.html.erb"
@@ -187,7 +192,9 @@ class LockdownGenerator < Rails::Generator::Base
187
192
  Installs the lockdown framework to managing users user_groups
188
193
  and viewing permissions. Also includes a login screen.
189
194
 
190
- By default the entire set of stubs are installed. Please use the appropriate options to customize your install.
195
+ By default the entire set of stubs are installed.
196
+
197
+ Please use the appropriate options to customize your install.
191
198
 
192
199
  USAGE: #{$0} #{spec.name}
193
200
  EOS
@@ -199,11 +206,13 @@ EOS
199
206
  opt.on("--namespace=admin",
200
207
  "Install lockdown templates with a namespace, in this example 'admin'.") { |v| options[:namespace] = v }
201
208
  opt.on("--skip-management",
202
- "Generate everything but management screens. (controllers, helpers and views for users, permissions and user_groups are not generated). Renders namespace option meaningless.") { |v| options[:skip_management] = v }
209
+ "Only lib/lockdown and app/models are generated.") { |v| options[:skip_management] = v }
203
210
  opt.on("--skip-login",
204
- "Generate everything but login (sessions controller and sessions view dir).") { |v| options[:skip_login] = v }
211
+ "Skips generation of session controller and views.") { |v| options[:skip_login] = v }
205
212
  opt.on("--basics",
206
213
  "Install only models and migrations. Equivalent to skip-management and skip-login.") { |v| options[:basics] = v }
214
+ opt.on("--skip-rules",
215
+ "Skip installation of lib/lockdown/init.rb lib/lockdown/session.rb") { |v| options[:skip_rules] = v }
207
216
  opt.on("--skip-migrations",
208
217
  "Skip migrations installation") { |v| options[:skip_migrations] = v }
209
218
  end
@@ -241,4 +250,5 @@ EOS
241
250
  "#{match}\n #{str}"
242
251
  end
243
252
  end
253
+
244
254
  end
@@ -101,15 +101,12 @@ class <%= "#{namespace.camelcase}::" unless namespace.blank? %>UsersController <
101
101
 
102
102
  def update_user_groups
103
103
  new_ug_ids = params.collect{|p| p[0].split("_")[1].to_i if p[0] =~ /^ug_/}.compact
104
- #
105
104
  # Removed previously associated user_groups if not checked this time.
106
105
  #
107
106
  @user.user_groups.dup.each do |g|
108
- #Don't remove the automatically assigned user groups
109
- next if Lockdown::System.has_user_group?(g)
110
107
  @user.user_groups.delete(g) unless new_ug_ids.include?(g.id)
111
108
  end
112
- #
109
+
113
110
  # Add in the new permissions
114
111
  #
115
112
  new_ug_ids.each do |id|
@@ -1,13 +1,2 @@
1
1
  module <%= "#{namespace.camelcase}::" unless namespace.blank? %>PermissionsHelper
2
- def permission_name_value
3
- h @permission.name
4
- end
5
-
6
- def permission_access_rights_value
7
- Lockdown::System.access_rights_for_permission(@permission).collect{|r| r}.join("<br/>")
8
- end
9
-
10
- def permission_users_value
11
- @permission.all_users.collect{|u| link_to_or_show(u.full_name, <%= namespace.blank? ? 'u' : "#{namespace}_user_path(u)" %>)}.join("<br/>")
12
- end
13
2
  end
@@ -1,35 +1,2 @@
1
1
  module <%= "#{namespace.camelcase}::" unless namespace.blank? %>UserGroupsHelper
2
- def user_group_name_value
3
- if <%= action_name %> == "show"
4
- h @user_group.name
5
- else
6
- text_field :user_group, :name
7
- end
8
- end
9
-
10
- def user_group_permissions_value
11
- if <%= action_name %> == "show"
12
- @user_group.permissions.collect{|p| p.name + "<br/>"}
13
- else
14
- rvalue = %{<ul id="all_permissions" class="checklist">}
15
- @all_permissions.each_with_index do |perm,i|
16
- bg = ( i % 2 == 0 ) ? "even" : "odd"
17
- input_id = "perm_#{perm.id}"
18
- checked = (@user_group.permission_ids.include?(perm.id) ? "checked" : "")
19
- bg << "_" << checked if checked.length > 0
20
- rvalue << <<-HTML
21
- <li class="#{bg}" id="li_#{input_id}">
22
- <label for="#{input_id}" onclick="do_highlight('#{input_id}')">
23
- <input id="#{input_id}" name="#{input_id}" type="checkbox" #{checked}/>&nbsp;&nbsp;#{perm.name}
24
- </label>
25
- </li>
26
- HTML
27
- end
28
- rvalue << "</ul>"
29
- end
30
- end
31
-
32
- def user_group_users_value
33
- @user_group.all_users.collect{|u| link_to_or_show(u.full_name, <%= namespace.blank? ? 'u' : "#{namespace}_user_path(u)" %>)}.join("<br/>")
34
- end
35
2
  end
@@ -1,78 +1,2 @@
1
1
  module <%= "#{namespace.camelcase}::" unless namespace.blank? %>UsersHelper
2
- def user_first_name_value
3
- if <%= action_name %> == "show"
4
- h @user.first_name
5
- else
6
- text_field :user, :first_name
7
- end
8
- end
9
-
10
- def user_last_name_value
11
- if <%= action_name %> == "show"
12
- h @user.last_name
13
- else
14
- text_field :user, :last_name
15
- end
16
- end
17
-
18
- def user_email_value
19
- if <%= action_name %> == "show"
20
- h @user.email
21
- else
22
- text_field :user, :email
23
- end
24
- end
25
-
26
- def user_login_value
27
- if <%= action_name %> == "show"
28
- h @user.login
29
- else
30
- text_field :user, :login
31
- end
32
- end
33
-
34
- def user_password_value
35
- if <%= action_name %> == "show"
36
- h "Hidden for security..."
37
- else
38
- %{<input autocomplete="off" type="password" name="user[password]" id="user_password"/>}
39
- end
40
- end
41
-
42
- def user_password_confirmation_value
43
- if <%= action_name %> == "show"
44
- h "Hidden for security..."
45
- else
46
- %{<input autocomplete="off" type="password" name="user[password_confirmation]" id="user_password_confirmation"/>}
47
- end
48
- end
49
-
50
- def user_user_groups_value
51
- if <%= action_name %> == "show"
52
- @user.user_groups.collect{|ug| ug.name + "<br/>"}
53
- else
54
- rvalue = %{<ul id="all_user_groups" class="checklist">}
55
- #
56
- # Restrict user group list to the list of the current user.
57
- # This prevents a user from creating someone with more access than
58
- # him/herself.
59
- #
60
- @user_groups_for_user.each_with_index do |ug,i|
61
- bg = ( i % 2 == 0 ) ? "even" : "odd"
62
- input_id = "ug_#{ug.id}"
63
- checked = (@user.user_group_ids.include?(ug.id) ? "checked" : "")
64
- bg << "_" << checked if checked.length > 0
65
- rvalue << <<-HTML
66
- <li class="#{bg}" id="li_#{input_id}">
67
- <label for="#{input_id}" onclick="do_highlight('#{input_id}')">
68
- <input id="#{input_id}" name="#{input_id}" type="checkbox" #{checked}/>&nbsp;&nbsp;#{ug.name}
69
- </label>
70
- </li>
71
- HTML
72
- end
73
- rvalue << "</ul>"
74
- end
75
- end
76
-
77
-
78
2
  end
@@ -1,11 +1,7 @@
1
1
  require 'digest/sha1'
2
2
  class User < ActiveRecord::Base
3
3
  has_and_belongs_to_many :user_groups
4
- # depends_on functionality is from the classy-inheritance gem
5
- # that is bundled with lockdown.
6
- # For more info: http://stonean.com
7
- #
8
- depends_on :profile, :attrs => [:first_name, :last_name, :email]
4
+ belongs_to :profile
9
5
 
10
6
  # Virtual attributes
11
7
  attr_accessor :password
@@ -18,7 +14,8 @@ class User < ActiveRecord::Base
18
14
  validates_length_of :login, :within => 3..40
19
15
  validates_uniqueness_of :login, :case_sensitive => false
20
16
 
21
- before_save :prepare_for_save
17
+ before_save :encrypt_password
18
+ before_save :save_profile
22
19
 
23
20
  attr_accessible :login, :password, :password_confirmation,
24
21
  :first_name, :last_name, :email
@@ -45,14 +42,39 @@ class User < ActiveRecord::Base
45
42
  end
46
43
 
47
44
  def full_name
48
- self.first_name + " " + self.last_name
45
+ first_name + " " + last_name
46
+ end
47
+
48
+ # Profile information
49
+ def first_name
50
+ user_profile.first_name
49
51
  end
50
52
 
51
- protected
53
+ def first_name=(string)
54
+ user_profile.first_name = string
55
+ end
56
+
57
+ def last_name
58
+ user_profile.last_name
59
+ end
60
+
61
+ def last_name=(string)
62
+ user_profile.last_name = string
63
+ end
64
+
65
+ def email
66
+ user_profile.email
67
+ end
68
+
69
+ def email=(string)
70
+ user_profile.email = string
71
+ end
52
72
 
53
- def prepare_for_save
54
- encrypt_password
73
+ def user_profile
74
+ self.profile || self.profile = Profile.new
55
75
  end
76
+
77
+ protected
56
78
 
57
79
  def encrypt_password
58
80
  return if password.blank?
@@ -61,7 +83,11 @@ class User < ActiveRecord::Base
61
83
  end
62
84
  self.crypted_password = encrypt(password)
63
85
  end
64
-
86
+
87
+ def save_profile
88
+ profile.save
89
+ end
90
+
65
91
  def password_required?
66
92
  (crypted_password.blank? || !password.blank?)
67
93
  end