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.
- data/USAGE +34 -0
- data/goldberg_generator.rb +463 -0
- data/templates/README_GOLDBERG +22 -0
- data/templates/app/views/layouts/application.rhtml +80 -0
- data/templates/layouts/ewnf/README +8 -0
- data/templates/layouts/ewnf/app/views/layouts/application.rhtml +74 -0
- data/templates/layouts/ewnf/public/images/bg.gif +0 -0
- data/templates/layouts/ewnf/public/images/daddy_rightarrow.gif +0 -0
- data/templates/layouts/ewnf/public/images/sample.jpg +0 -0
- data/templates/layouts/ewnf/public/images/title_img.jpg +0 -0
- data/templates/layouts/ewnf/public/stylesheets/layout.css +223 -0
- data/templates/layouts/snooker/app/views/layouts/application.rhtml +74 -0
- data/templates/layouts/snooker/public/images/column_200.png +0 -0
- data/templates/layouts/snooker/public/images/daddy_rightarrow.gif +0 -0
- data/templates/layouts/snooker/public/images/footer_bg.png +0 -0
- data/templates/layouts/snooker/public/images/logo.jpg +0 -0
- data/templates/layouts/snooker/public/stylesheets/layout.css +183 -0
- data/templates/layouts/spoiled_brat/LICENSE.txt +211 -0
- data/templates/layouts/spoiled_brat/README +8 -0
- data/templates/layouts/spoiled_brat/app/views/layouts/application.rhtml +71 -0
- data/templates/layouts/spoiled_brat/public/images/blockquote-bg.gif +0 -0
- data/templates/layouts/spoiled_brat/public/images/body-bg.jpg +0 -0
- data/templates/layouts/spoiled_brat/public/images/centerColumn-bg.jpg +0 -0
- data/templates/layouts/spoiled_brat/public/images/daddy_leftarrow.gif +0 -0
- data/templates/layouts/spoiled_brat/public/images/h2-bg.gif +0 -0
- data/templates/layouts/spoiled_brat/public/images/h3-bg.gif +0 -0
- data/templates/layouts/spoiled_brat/public/images/header-bg.jpg +0 -0
- data/templates/layouts/spoiled_brat/public/images/hr-bg.jpg +0 -0
- data/templates/layouts/spoiled_brat/public/images/logo.jpg +0 -0
- data/templates/layouts/spoiled_brat/public/stylesheets/layout.css +379 -0
- data/templates/public/goldberg/images/action.png +0 -0
- data/templates/public/goldberg/images/add.png +0 -0
- data/templates/public/goldberg/images/bodybg.jpg +0 -0
- data/templates/public/goldberg/images/delete.png +0 -0
- data/templates/public/goldberg/images/down.png +0 -0
- data/templates/public/goldberg/images/footerbg.jpg +0 -0
- data/templates/public/goldberg/images/logo_right.jpg +0 -0
- data/templates/public/goldberg/images/menuhover.jpg +0 -0
- data/templates/public/goldberg/images/page.png +0 -0
- data/templates/public/goldberg/images/permission.png +0 -0
- data/templates/public/goldberg/images/role.png +0 -0
- data/templates/public/goldberg/images/up.png +0 -0
- data/templates/public/goldberg/javascripts/suckerfish.js +12 -0
- data/templates/public/goldberg/stylesheets/goldberg.css +142 -0
- data/templates/public/goldberg/stylesheets/layout.css +321 -0
- data/templates/public/goldberg/stylesheets/suckerfish.css +124 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/auth_controller.rb +104 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/content_pages_controller.rb +197 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/controller_actions_controller.rb +134 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/menu_items_controller.rb +184 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/permissions_controller.rb +60 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/roles_controller.rb +85 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/roles_permissions_controller.rb +65 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/site_controllers_controller.rb +157 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/system_settings_controller.rb +75 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/users_controller.rb +293 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/auth_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/content_pages_helper.rb +23 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/controller_actions_helper.rb +5 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/menu_items_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/permissions_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/roles_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/roles_permissions_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/site_controllers_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/system_settings_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/users_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/content_page.rb +134 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/controller_action.rb +86 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/credentials.rb +128 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/menu.rb +198 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/menu_item.rb +127 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/permission.rb +37 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/role.rb +68 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/roles_permission.rb +18 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/site_controller.rb +59 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/system_settings.rb +112 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/user.rb +69 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/user_mailer.rb +43 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/auth/_login.rhtml +15 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/auth/login.rhtml +22 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/auth/logout.rhtml +2 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/_fck_create_folder.rxml +6 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/_fck_files.rxml +19 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/_form.rhtml +32 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/edit.rhtml +10 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/fck_speller_pages.rhtml +58 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/list.rhtml +22 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/show.rhtml +57 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/view.rhtml +1 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/view_default.rhtml +1 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/_form.rhtml +53 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/list.rhtml +27 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/new.rhtml +10 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/show.rhtml +13 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/layouts/_tabpanel_js.rhtml +52 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/layouts/_tabpanel_list.rhtml +7 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_breadcrumbs.rhtml +5 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_form.rhtml +42 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_item_list.rhtml +52 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_item_parent_list.rhtml +15 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_menubar.rhtml +21 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_suckerfish.rhtml +14 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/edit.rhtml +10 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/list-original.rhtml +27 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/list.rhtml +16 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/new.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/show.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/_form.rhtml +7 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/list.rhtml +14 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/show.rhtml +38 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/_form.rhtml +18 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/list.rhtml +21 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/show.rhtml +79 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/_form.rhtml +13 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/list.rhtml +24 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/new_permission_for_role.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/show.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/_form.rhtml +15 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/_list.rhtml +26 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/list.rhtml +107 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/show.rhtml +38 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/_form.rhtml +71 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/list.rhtml +27 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/show.rhtml +189 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/user_mailer/confirmation_request.rhtml +19 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/user_mailer/reset_password.rhtml +17 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/user_mailer/reset_password_request.rhtml +23 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/_form.rhtml +53 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/confirm_registration.rhtml +26 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/confirm_registration_submit.rhtml +4 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/create.rhtml +19 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/edit.rhtml +11 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/forgot_password.rhtml +27 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/forgot_password_submit.rhtml +4 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/list.rhtml +18 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/new.rhtml +19 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/reset_password.rhtml +11 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/reset_password_submit.rhtml +3 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/show.rhtml +33 -0
- data/templates/vendor/plugins/goldberg/db/ContentPage.yml +466 -0
- data/templates/vendor/plugins/goldberg/db/ControllerAction.yml +162 -0
- data/templates/vendor/plugins/goldberg/db/MenuItem.yml +109 -0
- data/templates/vendor/plugins/goldberg/db/Permission.yml +21 -0
- data/templates/vendor/plugins/goldberg/db/Role.yml +493 -0
- data/templates/vendor/plugins/goldberg/db/RolesPermission.yml +26 -0
- data/templates/vendor/plugins/goldberg/db/SiteController.yml +61 -0
- data/templates/vendor/plugins/goldberg/db/SystemSettings.yml +21 -0
- data/templates/vendor/plugins/goldberg/db/User.yml +15 -0
- data/templates/vendor/plugins/goldberg/db/migrate/001_initial_setup.rb +128 -0
- data/templates/vendor/plugins/goldberg/db/migrate/002_menu_rest_items_users_cached_content_pages.rb +26 -0
- data/templates/vendor/plugins/goldberg/db/migrate/003_self_registration.rb +54 -0
- data/templates/vendor/plugins/goldberg/db/migrate/004_column_fixes.rb +119 -0
- data/templates/vendor/plugins/goldberg/init.rb +13 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg.rb +37 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/controller.rb +11 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/filters.rb +197 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/helper.rb +66 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/migration.rb +113 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/migrator.rb +128 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/model.rb +110 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/routes.rb +49 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/test_helper.rb +82 -0
- data/templates/vendor/plugins/goldberg/tasks/goldberg_tasks.rake +47 -0
- data/templates/vendor/plugins/goldberg/test/functional/content_pages_controller_test.rb +31 -0
- data/templates/vendor/plugins/goldberg/test/integration/security_test.rb +134 -0
- data/templates/vendor/plugins/goldberg/test/test_helper.rb +40 -0
- data/templates/vendor/plugins/goldberg/test/unit/content_page_test.rb +87 -0
- data/templates/vendor/plugins/goldberg/test/unit/controller_action_test.rb +85 -0
- data/templates/vendor/plugins/goldberg/test/unit/menu_item_test.rb +46 -0
- data/templates/vendor/plugins/goldberg/test/unit/permission_test.rb +35 -0
- data/templates/vendor/plugins/goldberg/test/unit/site_controller_test.rb +53 -0
- data/templates/vendor/plugins/goldberg/test/unit/system_settings_test.rb +71 -0
- data/templates/vendor/plugins/goldberg/test/unit/user_test.rb +104 -0
- 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
|