goldberg_generator 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. data/USAGE +34 -0
  2. data/goldberg_generator.rb +463 -0
  3. data/templates/README_GOLDBERG +22 -0
  4. data/templates/app/views/layouts/application.rhtml +80 -0
  5. data/templates/layouts/ewnf/README +8 -0
  6. data/templates/layouts/ewnf/app/views/layouts/application.rhtml +74 -0
  7. data/templates/layouts/ewnf/public/images/bg.gif +0 -0
  8. data/templates/layouts/ewnf/public/images/daddy_rightarrow.gif +0 -0
  9. data/templates/layouts/ewnf/public/images/sample.jpg +0 -0
  10. data/templates/layouts/ewnf/public/images/title_img.jpg +0 -0
  11. data/templates/layouts/ewnf/public/stylesheets/layout.css +223 -0
  12. data/templates/layouts/snooker/app/views/layouts/application.rhtml +74 -0
  13. data/templates/layouts/snooker/public/images/column_200.png +0 -0
  14. data/templates/layouts/snooker/public/images/daddy_rightarrow.gif +0 -0
  15. data/templates/layouts/snooker/public/images/footer_bg.png +0 -0
  16. data/templates/layouts/snooker/public/images/logo.jpg +0 -0
  17. data/templates/layouts/snooker/public/stylesheets/layout.css +183 -0
  18. data/templates/layouts/spoiled_brat/LICENSE.txt +211 -0
  19. data/templates/layouts/spoiled_brat/README +8 -0
  20. data/templates/layouts/spoiled_brat/app/views/layouts/application.rhtml +71 -0
  21. data/templates/layouts/spoiled_brat/public/images/blockquote-bg.gif +0 -0
  22. data/templates/layouts/spoiled_brat/public/images/body-bg.jpg +0 -0
  23. data/templates/layouts/spoiled_brat/public/images/centerColumn-bg.jpg +0 -0
  24. data/templates/layouts/spoiled_brat/public/images/daddy_leftarrow.gif +0 -0
  25. data/templates/layouts/spoiled_brat/public/images/h2-bg.gif +0 -0
  26. data/templates/layouts/spoiled_brat/public/images/h3-bg.gif +0 -0
  27. data/templates/layouts/spoiled_brat/public/images/header-bg.jpg +0 -0
  28. data/templates/layouts/spoiled_brat/public/images/hr-bg.jpg +0 -0
  29. data/templates/layouts/spoiled_brat/public/images/logo.jpg +0 -0
  30. data/templates/layouts/spoiled_brat/public/stylesheets/layout.css +379 -0
  31. data/templates/public/goldberg/images/action.png +0 -0
  32. data/templates/public/goldberg/images/add.png +0 -0
  33. data/templates/public/goldberg/images/bodybg.jpg +0 -0
  34. data/templates/public/goldberg/images/delete.png +0 -0
  35. data/templates/public/goldberg/images/down.png +0 -0
  36. data/templates/public/goldberg/images/footerbg.jpg +0 -0
  37. data/templates/public/goldberg/images/logo_right.jpg +0 -0
  38. data/templates/public/goldberg/images/menuhover.jpg +0 -0
  39. data/templates/public/goldberg/images/page.png +0 -0
  40. data/templates/public/goldberg/images/permission.png +0 -0
  41. data/templates/public/goldberg/images/role.png +0 -0
  42. data/templates/public/goldberg/images/up.png +0 -0
  43. data/templates/public/goldberg/javascripts/suckerfish.js +12 -0
  44. data/templates/public/goldberg/stylesheets/goldberg.css +142 -0
  45. data/templates/public/goldberg/stylesheets/layout.css +321 -0
  46. data/templates/public/goldberg/stylesheets/suckerfish.css +124 -0
  47. data/templates/vendor/plugins/goldberg/app/controllers/goldberg/auth_controller.rb +104 -0
  48. data/templates/vendor/plugins/goldberg/app/controllers/goldberg/content_pages_controller.rb +197 -0
  49. data/templates/vendor/plugins/goldberg/app/controllers/goldberg/controller_actions_controller.rb +134 -0
  50. data/templates/vendor/plugins/goldberg/app/controllers/goldberg/menu_items_controller.rb +184 -0
  51. data/templates/vendor/plugins/goldberg/app/controllers/goldberg/permissions_controller.rb +60 -0
  52. data/templates/vendor/plugins/goldberg/app/controllers/goldberg/roles_controller.rb +85 -0
  53. data/templates/vendor/plugins/goldberg/app/controllers/goldberg/roles_permissions_controller.rb +65 -0
  54. data/templates/vendor/plugins/goldberg/app/controllers/goldberg/site_controllers_controller.rb +157 -0
  55. data/templates/vendor/plugins/goldberg/app/controllers/goldberg/system_settings_controller.rb +75 -0
  56. data/templates/vendor/plugins/goldberg/app/controllers/goldberg/users_controller.rb +293 -0
  57. data/templates/vendor/plugins/goldberg/app/helpers/goldberg/auth_helper.rb +4 -0
  58. data/templates/vendor/plugins/goldberg/app/helpers/goldberg/content_pages_helper.rb +23 -0
  59. data/templates/vendor/plugins/goldberg/app/helpers/goldberg/controller_actions_helper.rb +5 -0
  60. data/templates/vendor/plugins/goldberg/app/helpers/goldberg/menu_items_helper.rb +4 -0
  61. data/templates/vendor/plugins/goldberg/app/helpers/goldberg/permissions_helper.rb +4 -0
  62. data/templates/vendor/plugins/goldberg/app/helpers/goldberg/roles_helper.rb +4 -0
  63. data/templates/vendor/plugins/goldberg/app/helpers/goldberg/roles_permissions_helper.rb +4 -0
  64. data/templates/vendor/plugins/goldberg/app/helpers/goldberg/site_controllers_helper.rb +4 -0
  65. data/templates/vendor/plugins/goldberg/app/helpers/goldberg/system_settings_helper.rb +4 -0
  66. data/templates/vendor/plugins/goldberg/app/helpers/goldberg/users_helper.rb +4 -0
  67. data/templates/vendor/plugins/goldberg/app/models/goldberg/content_page.rb +134 -0
  68. data/templates/vendor/plugins/goldberg/app/models/goldberg/controller_action.rb +86 -0
  69. data/templates/vendor/plugins/goldberg/app/models/goldberg/credentials.rb +128 -0
  70. data/templates/vendor/plugins/goldberg/app/models/goldberg/menu.rb +198 -0
  71. data/templates/vendor/plugins/goldberg/app/models/goldberg/menu_item.rb +127 -0
  72. data/templates/vendor/plugins/goldberg/app/models/goldberg/permission.rb +37 -0
  73. data/templates/vendor/plugins/goldberg/app/models/goldberg/role.rb +68 -0
  74. data/templates/vendor/plugins/goldberg/app/models/goldberg/roles_permission.rb +18 -0
  75. data/templates/vendor/plugins/goldberg/app/models/goldberg/site_controller.rb +59 -0
  76. data/templates/vendor/plugins/goldberg/app/models/goldberg/system_settings.rb +112 -0
  77. data/templates/vendor/plugins/goldberg/app/models/goldberg/user.rb +69 -0
  78. data/templates/vendor/plugins/goldberg/app/models/goldberg/user_mailer.rb +43 -0
  79. data/templates/vendor/plugins/goldberg/app/views/goldberg/auth/_login.rhtml +15 -0
  80. data/templates/vendor/plugins/goldberg/app/views/goldberg/auth/login.rhtml +22 -0
  81. data/templates/vendor/plugins/goldberg/app/views/goldberg/auth/logout.rhtml +2 -0
  82. data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/_fck_create_folder.rxml +6 -0
  83. data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/_fck_files.rxml +19 -0
  84. data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/_form.rhtml +32 -0
  85. data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/edit.rhtml +10 -0
  86. data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/fck_speller_pages.rhtml +58 -0
  87. data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/list.rhtml +22 -0
  88. data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/new.rhtml +8 -0
  89. data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/show.rhtml +57 -0
  90. data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/view.rhtml +1 -0
  91. data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/view_default.rhtml +1 -0
  92. data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/_form.rhtml +53 -0
  93. data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/edit.rhtml +9 -0
  94. data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/list.rhtml +27 -0
  95. data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/new.rhtml +10 -0
  96. data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/show.rhtml +13 -0
  97. data/templates/vendor/plugins/goldberg/app/views/goldberg/layouts/_tabpanel_js.rhtml +52 -0
  98. data/templates/vendor/plugins/goldberg/app/views/goldberg/layouts/_tabpanel_list.rhtml +7 -0
  99. data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_breadcrumbs.rhtml +5 -0
  100. data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_form.rhtml +42 -0
  101. data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_item_list.rhtml +52 -0
  102. data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_item_parent_list.rhtml +15 -0
  103. data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_menubar.rhtml +21 -0
  104. data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_suckerfish.rhtml +14 -0
  105. data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/edit.rhtml +10 -0
  106. data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/list-original.rhtml +27 -0
  107. data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/list.rhtml +16 -0
  108. data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/new.rhtml +9 -0
  109. data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/show.rhtml +8 -0
  110. data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/_form.rhtml +7 -0
  111. data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/edit.rhtml +9 -0
  112. data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/list.rhtml +14 -0
  113. data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/new.rhtml +8 -0
  114. data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/show.rhtml +38 -0
  115. data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/_form.rhtml +18 -0
  116. data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/edit.rhtml +9 -0
  117. data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/list.rhtml +21 -0
  118. data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/new.rhtml +8 -0
  119. data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/show.rhtml +79 -0
  120. data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/_form.rhtml +13 -0
  121. data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/edit.rhtml +9 -0
  122. data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/list.rhtml +24 -0
  123. data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/new.rhtml +8 -0
  124. data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/new_permission_for_role.rhtml +8 -0
  125. data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/show.rhtml +8 -0
  126. data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/_form.rhtml +15 -0
  127. data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/_list.rhtml +26 -0
  128. data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/edit.rhtml +9 -0
  129. data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/list.rhtml +107 -0
  130. data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/new.rhtml +8 -0
  131. data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/show.rhtml +38 -0
  132. data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/_form.rhtml +71 -0
  133. data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/edit.rhtml +9 -0
  134. data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/list.rhtml +27 -0
  135. data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/new.rhtml +8 -0
  136. data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/show.rhtml +189 -0
  137. data/templates/vendor/plugins/goldberg/app/views/goldberg/user_mailer/confirmation_request.rhtml +19 -0
  138. data/templates/vendor/plugins/goldberg/app/views/goldberg/user_mailer/reset_password.rhtml +17 -0
  139. data/templates/vendor/plugins/goldberg/app/views/goldberg/user_mailer/reset_password_request.rhtml +23 -0
  140. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/_form.rhtml +53 -0
  141. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/confirm_registration.rhtml +26 -0
  142. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/confirm_registration_submit.rhtml +4 -0
  143. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/create.rhtml +19 -0
  144. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/edit.rhtml +11 -0
  145. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/forgot_password.rhtml +27 -0
  146. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/forgot_password_submit.rhtml +4 -0
  147. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/list.rhtml +18 -0
  148. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/new.rhtml +19 -0
  149. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/reset_password.rhtml +11 -0
  150. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/reset_password_submit.rhtml +3 -0
  151. data/templates/vendor/plugins/goldberg/app/views/goldberg/users/show.rhtml +33 -0
  152. data/templates/vendor/plugins/goldberg/db/ContentPage.yml +466 -0
  153. data/templates/vendor/plugins/goldberg/db/ControllerAction.yml +162 -0
  154. data/templates/vendor/plugins/goldberg/db/MenuItem.yml +109 -0
  155. data/templates/vendor/plugins/goldberg/db/Permission.yml +21 -0
  156. data/templates/vendor/plugins/goldberg/db/Role.yml +493 -0
  157. data/templates/vendor/plugins/goldberg/db/RolesPermission.yml +26 -0
  158. data/templates/vendor/plugins/goldberg/db/SiteController.yml +61 -0
  159. data/templates/vendor/plugins/goldberg/db/SystemSettings.yml +21 -0
  160. data/templates/vendor/plugins/goldberg/db/User.yml +15 -0
  161. data/templates/vendor/plugins/goldberg/db/migrate/001_initial_setup.rb +128 -0
  162. data/templates/vendor/plugins/goldberg/db/migrate/002_menu_rest_items_users_cached_content_pages.rb +26 -0
  163. data/templates/vendor/plugins/goldberg/db/migrate/003_self_registration.rb +54 -0
  164. data/templates/vendor/plugins/goldberg/db/migrate/004_column_fixes.rb +119 -0
  165. data/templates/vendor/plugins/goldberg/init.rb +13 -0
  166. data/templates/vendor/plugins/goldberg/lib/goldberg.rb +37 -0
  167. data/templates/vendor/plugins/goldberg/lib/goldberg/controller.rb +11 -0
  168. data/templates/vendor/plugins/goldberg/lib/goldberg/filters.rb +197 -0
  169. data/templates/vendor/plugins/goldberg/lib/goldberg/helper.rb +66 -0
  170. data/templates/vendor/plugins/goldberg/lib/goldberg/migration.rb +113 -0
  171. data/templates/vendor/plugins/goldberg/lib/goldberg/migrator.rb +128 -0
  172. data/templates/vendor/plugins/goldberg/lib/goldberg/model.rb +110 -0
  173. data/templates/vendor/plugins/goldberg/lib/goldberg/routes.rb +49 -0
  174. data/templates/vendor/plugins/goldberg/lib/goldberg/test_helper.rb +82 -0
  175. data/templates/vendor/plugins/goldberg/tasks/goldberg_tasks.rake +47 -0
  176. data/templates/vendor/plugins/goldberg/test/functional/content_pages_controller_test.rb +31 -0
  177. data/templates/vendor/plugins/goldberg/test/integration/security_test.rb +134 -0
  178. data/templates/vendor/plugins/goldberg/test/test_helper.rb +40 -0
  179. data/templates/vendor/plugins/goldberg/test/unit/content_page_test.rb +87 -0
  180. data/templates/vendor/plugins/goldberg/test/unit/controller_action_test.rb +85 -0
  181. data/templates/vendor/plugins/goldberg/test/unit/menu_item_test.rb +46 -0
  182. data/templates/vendor/plugins/goldberg/test/unit/permission_test.rb +35 -0
  183. data/templates/vendor/plugins/goldberg/test/unit/site_controller_test.rb +53 -0
  184. data/templates/vendor/plugins/goldberg/test/unit/system_settings_test.rb +71 -0
  185. data/templates/vendor/plugins/goldberg/test/unit/user_test.rb +104 -0
  186. metadata +310 -0
@@ -0,0 +1,110 @@
1
+ require 'active_record/connection_adapters/postgresql_adapter'
2
+
3
+ # Set the appropriate table prefix using AR's "set_table_name"
4
+
5
+ # This module is included in all Goldberg's model classes. On load it
6
+ # adds the prefix "goldberg." to all table names if the connection is
7
+ # to PostgreSQL; otherwise it adds the prefix "g_".
8
+
9
+ module Goldberg
10
+ module Model
11
+
12
+ def self.included(base)
13
+ base.class_eval do
14
+
15
+ def self.prefix
16
+ if not @prefix
17
+ if self.connection.class.to_s ==
18
+ 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter'
19
+ @prefix = 'goldberg.'
20
+ else
21
+ @prefix = 'goldberg_'
22
+ end
23
+ end
24
+ @prefix
25
+ end
26
+
27
+ (table_name =~ /goldberg/) ||
28
+ (set_table_name "#{self.prefix}#{self.table_name}")
29
+ end
30
+ end
31
+
32
+ end
33
+
34
+
35
+ # Fixes the "pk_and_sequence_for" method in the PostgreSQL adapter, to
36
+ # include namespace support.
37
+
38
+ module PostgreSQL
39
+ def self.included(base)
40
+ base.class_eval do
41
+ alias_method :pk_and_sequence_for_without_goldberg, :pk_and_sequence_for
42
+ alias_method :pk_and_sequence_for, :pk_and_sequence_for_with_goldberg
43
+ end
44
+ end
45
+
46
+ # (From
47
+ # vendor/rails/activerecord/lib/active_record/connection_adapters/
48
+ # postgresql_adapter.rb)
49
+
50
+ def pk_and_sequence_for_with_goldberg(table)
51
+ # First try looking for a sequence with a dependency on the
52
+ # given table's primary key.
53
+ result = query(<<-end_sql, 'PK and serial sequence')[0]
54
+ SELECT attr.attname, name.nspname, seq.relname
55
+ FROM pg_class seq,
56
+ pg_attribute attr,
57
+ pg_depend dep,
58
+ pg_namespace name,
59
+ pg_constraint cons
60
+ WHERE seq.oid = dep.objid
61
+ AND seq.relnamespace = name.oid
62
+ AND seq.relkind = 'S'
63
+ AND attr.attrelid = dep.refobjid
64
+ AND attr.attnum = dep.refobjsubid
65
+ AND attr.attrelid = cons.conrelid
66
+ AND attr.attnum = cons.conkey[1]
67
+ AND cons.contype = 'p'
68
+ AND dep.refobjid = '#{table}'::regclass
69
+ end_sql
70
+
71
+ if result.nil? or result.empty?
72
+ # If that fails, try parsing the primary key's default value.
73
+ # Support the 7.x and 8.0 nextval('foo'::text) as well as
74
+ # the 8.1+ nextval('foo'::regclass).
75
+ # TODO: assumes sequence is in same schema as table.
76
+ result = query(<<-end_sql, 'PK and custom sequence')[0]
77
+ SELECT attr.attname, name.nspname, split_part(def.adsrc, '''', 2)
78
+ FROM pg_class t
79
+ JOIN pg_namespace name ON (t.relnamespace = name.oid)
80
+ JOIN pg_attribute attr ON (t.oid = attrelid)
81
+ JOIN pg_attrdef def ON (adrelid = attrelid AND adnum = attnum)
82
+ JOIN pg_constraint cons ON (conrelid = adrelid AND adnum = conkey[1])
83
+ WHERE t.oid = '#{table}'::regclass
84
+ AND cons.contype = 'p'
85
+ AND def.adsrc ~* 'nextval'
86
+ end_sql
87
+ end
88
+ # check for existence of . in sequence name as in public.foo_sequence. if it does not exist, return unqualified sequence
89
+ # We cannot qualify unqualified sequences, as rails doesn't qualify any table access, using the search path
90
+ # Commented out (DN):
91
+ # [result.first, result.last]
92
+
93
+ # Added (DN):
94
+ # The above consideration is irrelevant. PostgreSQL
95
+ # databases always have tables in schemas, so specifying a schema
96
+ # (even if it is "public") is valid; and in the case where schemas
97
+ # *are* in use (using 'set_table_name' to set a schema on a model)
98
+ # the schema path is *required*, otherwise INSERTs are broken.
99
+
100
+ [ result[0], "#{result[1]}.#{result[2]}" ]
101
+ rescue
102
+ nil
103
+ end
104
+
105
+ end
106
+ end
107
+
108
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
109
+ include Goldberg::PostgreSQL
110
+ end
@@ -0,0 +1,49 @@
1
+
2
+ module Goldberg
3
+ module Routes
4
+ def self.included(base)
5
+ base.class_eval do
6
+ alias_method :draw_without_goldberg_routes, :draw
7
+ alias_method :draw, :draw_with_goldberg_routes
8
+ end
9
+ end
10
+
11
+ def draw_with_goldberg_routes(&block)
12
+
13
+ draw_without_goldberg_routes do |map|
14
+ block.call map
15
+ end
16
+
17
+ routes = [
18
+ ['',
19
+ {:controller => "goldberg/content_pages",
20
+ :action => "view_default"}],
21
+
22
+ ['menu/*name',
23
+ {:controller => 'goldberg/menu_items', :action => 'link'}],
24
+
25
+ ['*page_name',
26
+ {:controller => "goldberg/content_pages", :action => "view"}]
27
+ ]
28
+
29
+ route_method = ActionController::Routing::Routes.respond_to?(:add_route)?
30
+ :add_route : :connect
31
+
32
+ for route in routes do
33
+ ActionController::Routing::Routes.send(route_method, *route)
34
+ end
35
+
36
+ # Install the new routes (Rails 1.1 only)
37
+ if ActionController::Routing::Routes.respond_to? :write_generation and
38
+ ActionController::Routing::Routes.respond_to? :write_recognition
39
+ ActionController::Routing::Routes.write_generation
40
+ ActionController::Routing::Routes.write_recognition
41
+ end
42
+ end
43
+
44
+ end
45
+ end
46
+
47
+ ActionController::Routing::RouteSet.class_eval do
48
+ include Goldberg::Routes
49
+ end
@@ -0,0 +1,82 @@
1
+ module Goldberg
2
+ # Goldberg's TestHelper module loads Goldberg's bootstrap
3
+ # environment for use in functional and integration testing. It
4
+ # also provides some methods for logging a user in and out.
5
+ #
6
+ # The fixtures are loaded from
7
+ # RAILS_ROOT/vendor/plugins/goldberg/db. By default this contains
8
+ # the bootstrap that came with Goldberg. However you can configure
9
+ # your system (create roles, permissions, users, controllers/actions
10
+ # and a menu) then dump a bootstrap that represents your
11
+ # configuration using the Rake task:
12
+ #
13
+ # rake goldberg:dump_bootstrap
14
+ #
15
+ # This offers an arguably more realistic approach than conventional
16
+ # fixtures: tests are performed using a real Goldberg setup.
17
+ # Furthermore dumping a bootstrap from your configured site allows
18
+ # you to test your security in functional and integration tests: you
19
+ # can log in and perform actions in your tests, and ensure that
20
+ # actions and/or pages are appropriately allowed or forbidden based
21
+ # on the security you have defined.
22
+ module TestHelper
23
+
24
+ def self.included(klass)
25
+ # The first time this is included make sure the database is
26
+ # up-to-date (especially applicable for PostgreSQL, for which the
27
+ # schema is not dumped properly), then load Goldberg's fixtures.
28
+ unless @already_done
29
+ begin
30
+ verbosity = ActiveRecord::Migration.verbose
31
+ ActiveRecord::Migration.verbose = false
32
+ Goldberg::Migrator.plugin_name = 'goldberg'
33
+ Goldberg::Migrator.migrate
34
+ rescue ActiveRecord::StatementInvalid
35
+ # Must already exist. Continue...
36
+ ensure
37
+ ActiveRecord::Migration.verbose = verbosity
38
+ end
39
+
40
+ fixture_path = File.dirname(__FILE__) + '/../../db' # default
41
+ # Goldberg prefers to use fixtures from its own test/fixtures dir
42
+ if ( (caller.first =~ %r<vendor/plugins/goldberg/test>) &&
43
+ File.exists?(File.dirname(__FILE__) + '/../../test/fixtures') )
44
+ fixture_path = File.dirname(__FILE__) + '/../../test/fixtures'
45
+ end
46
+ # Load Goldberg's bootstrap data
47
+ puts "Loading fixtures from '#{fixture_path}'..."
48
+ klasses ||= Goldberg::Migration.goldberg_classes
49
+ klasses.each do |klass|
50
+ klass.delete_all
51
+ Goldberg::Migration.load_for_class(klass, fixture_path)
52
+ end
53
+ puts "Done loading fixtures."
54
+ else
55
+ # Do nothing...
56
+ end
57
+ @already_done = true
58
+ end
59
+
60
+ # Set logged-in user (for functional testing)
61
+ def login_user(user_name)
62
+ user = Goldberg::User.find_by_name(user_name)
63
+ @request.session[:goldberg] = {:user_id => (user ? user.id : nil)}
64
+ Goldberg::AuthController.set_user(@request.session)
65
+ @request.session[:last_time] = Time.now
66
+ end
67
+
68
+ # Form-based login (for integration testing)
69
+ def form_login(user, password)
70
+ post '/goldberg/auth/login', :login => {
71
+ :name => user,
72
+ :password => password
73
+ }
74
+ end
75
+
76
+ # Form-based logout (for integration testing)
77
+ def form_logout
78
+ post '/goldberg/auth/logout'
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,47 @@
1
+ namespace :goldberg do
2
+
3
+ desc "Dump standard Goldberg tables to files in db/"
4
+ task :dump_bootstrap => :environment do
5
+ Goldberg::Migration.dump_bootstrap
6
+ end
7
+
8
+ desc "Migrate Goldberg"
9
+ task :migrate => :environment do
10
+ Goldberg::Migrator.plugin_name = 'goldberg'
11
+ Goldberg::Migrator.migrate(ENV['VERSION'])
12
+ end
13
+
14
+ desc "Load standard Goldberg tables from files in db/"
15
+ task :load_bootstrap => :migrate do
16
+ Goldberg::Migration.load_bootstrap
17
+ end
18
+
19
+ desc "Install Goldberg"
20
+ task :install => :load_bootstrap do
21
+ index = "#{RAILS_ROOT}/public/index.html"
22
+ FileTest.exists?(index) and File.delete(index)
23
+ end
24
+
25
+ desc "Upgrade Goldberg"
26
+ task :upgrade => :migrate do
27
+ end
28
+
29
+ desc "Flush cached data out of sessions and Roles"
30
+ task :flush => :environment do
31
+ puts "Deleting any Rails session files"
32
+ Dir["#{RAILS_ROOT}/tmp/sessions/ruby_sess*"].each do |fname|
33
+ File.delete fname
34
+ end
35
+
36
+ puts "Deleting any ActiveRecord sessions, and resetting the Role cache"
37
+ conn = ActiveRecord::Base.connection
38
+ begin # Capture error if sessions table doesn't exist
39
+ conn.execute "delete from sessions"
40
+ rescue
41
+ nil
42
+ end
43
+ # conn.execute "update roles set cache = NULL"
44
+ Goldberg::Role.rebuild_cache
45
+ end
46
+
47
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+ require 'goldberg/content_pages_controller'
3
+ require 'goldberg/auth_controller'
4
+
5
+ # Re-raise errors caught by the controller.
6
+ class Goldberg::ContentPagesController; def rescue_action(e) raise e end; end
7
+
8
+ class ContentPagesControllerTest < Test::Unit::TestCase
9
+ include Goldberg::TestHelper
10
+
11
+ def setup
12
+ @controller = Goldberg::ContentPagesController.new
13
+ @request = ActionController::TestRequest.new
14
+ @response = ActionController::TestResponse.new
15
+ end
16
+
17
+ def test_get_public_page
18
+ get :view, :page_name => ['home']
19
+ assert_response :success
20
+ end
21
+
22
+ def test_get_admin_page
23
+ get :view, {:page_name => ['admin']}
24
+ assert_response :redirect
25
+
26
+ login_user('admin')
27
+ get :view, {:page_name => ['admin']}
28
+ assert_response :success
29
+ end
30
+
31
+ end
@@ -0,0 +1,134 @@
1
+ require "#{File.dirname(__FILE__)}/../test_helper"
2
+
3
+
4
+ # (Also need to test for pending registration confirmation, and for
5
+ # session expiry.)
6
+
7
+ class SecurityTest < ActionController::IntegrationTest
8
+ include Goldberg::TestHelper
9
+
10
+ # Public user can execute public actions, but when they try
11
+ # executing an administrator action they are redirected to login.
12
+ def test_action_security
13
+ # A public action
14
+ get '/goldberg/auth/login'
15
+ assert_response :success
16
+ # An administrator action
17
+ get '/goldberg/users/list'
18
+ assert_redirected_to_login
19
+
20
+ form_login('admin', 'admin')
21
+
22
+ get '/goldberg/users/list'
23
+ assert_response :success
24
+
25
+ form_logout
26
+
27
+ get '/goldberg/users/list'
28
+ assert_redirected_to_login
29
+ end
30
+
31
+ # When a user with insufficient rights tries to access a page or
32
+ # action they don't get redirected to login: they get redirected to
33
+ # the "denied" page.
34
+ def test_insufficient_security
35
+ old_count = Goldberg::User.count
36
+ form_login('admin', 'admin')
37
+ post '/goldberg/users/create', :user => {
38
+ :name => 'fred',
39
+ :fullname => 'Fred Bloggs',
40
+ :role_id => '2', # "Member"
41
+ :clear_password => 'fred',
42
+ :confirm_password => 'fred',
43
+ }
44
+ # User was created OK
45
+ assert_equal (old_count + 1), Goldberg::User.count
46
+
47
+ # Logout, then login as new user
48
+ form_logout
49
+ form_login('fred', 'fred')
50
+ assert_not_nil session[:goldberg][:user_id]
51
+
52
+ # An administrator action: denied
53
+ get '/goldberg/users/list'
54
+ assert_redirected_to :permission_denied_page
55
+ # An administrator page: denied
56
+ get '/admin'
57
+ assert_redirected_to :permission_denied_page
58
+ end
59
+
60
+ # Public user can view public pages, but when they try accessing an
61
+ # administrator page they are redirected to login.
62
+ def test_page_security
63
+ # A public page
64
+ get '/home'
65
+ assert_response :success
66
+ # An administrator page
67
+ get '/admin'
68
+ assert_redirected_to_login
69
+
70
+ form_login('admin', 'admin')
71
+
72
+ get '/admin'
73
+ assert_response :success
74
+
75
+ form_logout
76
+
77
+ get '/admin'
78
+ assert_redirected_to_login
79
+ end
80
+
81
+ # If a public user tries to access a resource for which they lack
82
+ # authorisation, after logging in they should be redirected to that
83
+ # resource.
84
+ def test_pending_request
85
+ get '/goldberg/users/list'
86
+ assert_redirected_to_login
87
+
88
+ form_login('admin', 'admin')
89
+ assert_match /goldberg\/users\/list/, response.redirected_to
90
+ end
91
+
92
+ # User should be redirected to the session expired page if they
93
+ # remain inactive longer than the session timeout in System
94
+ # Settings.
95
+ def test_session_expiry
96
+ # Set the timeout really short
97
+ settings = Goldberg::SystemSettings.find :first
98
+ settings.session_timeout = 3 # Three seconds should be ample
99
+ settings.save!
100
+
101
+ form_login('admin', 'admin')
102
+ get '/site_admin'
103
+ assert_response :success
104
+
105
+ # Wait longer than the timeout
106
+ sleep 4
107
+ get '/site_admin'
108
+ assert_redirected_to :session_expired_page
109
+ end
110
+
111
+ # User is not logged in if password is wrong
112
+ def test_wrong_password
113
+ form_login('admin', 'foobar')
114
+ assert_nil session[:goldberg][:user_id]
115
+ end
116
+
117
+ protected
118
+
119
+ # A user who was not logged in was redirected to the login page
120
+ # because they tried accessing an action or page for which they
121
+ # lacked authorisation.
122
+ def assert_redirected_to_login
123
+ assert_equal({ :controller => 'goldberg/auth',
124
+ :action => 'login' },
125
+ response.redirected_to)
126
+ end
127
+
128
+ # User was redirected to one of the standard Goldberg pages, as
129
+ # specified by :page_name.
130
+ def assert_redirected_to(page_name)
131
+ assert_match(/#{Goldberg.settings.send(page_name).url}$/,
132
+ response.redirected_to)
133
+ end
134
+ end