goldberg_generator 0.2.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 (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