goldberg_generator 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|