bf4-browsercms 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE.txt +165 -0
- data/README.markdown +57 -0
- data/app/controllers/application_controller.rb +14 -0
- data/app/controllers/cms/application_controller.rb +69 -0
- data/app/controllers/cms/attachments_controller.rb +11 -0
- data/app/controllers/cms/base_controller.rb +13 -0
- data/app/controllers/cms/cache_controller.rb +22 -0
- data/app/controllers/cms/categories_controller.rb +5 -0
- data/app/controllers/cms/category_types_controller.rb +5 -0
- data/app/controllers/cms/connectors_controller.rb +63 -0
- data/app/controllers/cms/content_block_controller.rb +285 -0
- data/app/controllers/cms/content_controller.rb +176 -0
- data/app/controllers/cms/content_types_controller.rb +7 -0
- data/app/controllers/cms/dashboard_controller.rb +10 -0
- data/app/controllers/cms/dynamic_views_controller.rb +65 -0
- data/app/controllers/cms/email_messages_controller.rb +14 -0
- data/app/controllers/cms/error_handling.rb +25 -0
- data/app/controllers/cms/file_blocks_controller.rb +2 -0
- data/app/controllers/cms/groups_controller.rb +26 -0
- data/app/controllers/cms/home_controller.rb +5 -0
- data/app/controllers/cms/html_blocks_controller.rb +2 -0
- data/app/controllers/cms/image_blocks_controller.rb +2 -0
- data/app/controllers/cms/links_controller.rb +67 -0
- data/app/controllers/cms/page_route_conditions_controller.rb +2 -0
- data/app/controllers/cms/page_route_options_controller.rb +56 -0
- data/app/controllers/cms/page_route_requirements_controller.rb +2 -0
- data/app/controllers/cms/page_routes_controller.rb +45 -0
- data/app/controllers/cms/pages_controller.rb +135 -0
- data/app/controllers/cms/portlet_controller.rb +12 -0
- data/app/controllers/cms/portlets_controller.rb +40 -0
- data/app/controllers/cms/redirects_controller.rb +19 -0
- data/app/controllers/cms/resource_controller.rb +108 -0
- data/app/controllers/cms/routes_controller.rb +23 -0
- data/app/controllers/cms/section_nodes_controller.rb +40 -0
- data/app/controllers/cms/sections_controller.rb +130 -0
- data/app/controllers/cms/sessions_controller.rb +71 -0
- data/app/controllers/cms/tags_controller.rb +12 -0
- data/app/controllers/cms/task_items_controller.rb +52 -0
- data/app/controllers/cms/toolbar_controller.rb +12 -0
- data/app/controllers/cms/users_controller.rb +100 -0
- data/app/controllers/tests/pretend_controller.rb +32 -0
- data/app/helpers/application_helper.rb +3 -0
- data/app/helpers/cms/application_helper.rb +187 -0
- data/app/helpers/cms/form_builder.rb +176 -0
- data/app/helpers/cms/form_tag_helper.rb +32 -0
- data/app/helpers/cms/menu_helper.rb +165 -0
- data/app/helpers/cms/page_helper.rb +92 -0
- data/app/helpers/cms/path_helper.rb +48 -0
- data/app/helpers/cms/rendering_helper.rb +38 -0
- data/app/helpers/cms/section_nodes_helper.rb +13 -0
- data/app/helpers/cms/template_support.rb +21 -0
- data/app/models/abstract_file_block.rb +17 -0
- data/app/models/attachment.rb +193 -0
- data/app/models/category.rb +40 -0
- data/app/models/category_type.rb +34 -0
- data/app/models/connector.rb +80 -0
- data/app/models/content_type.rb +95 -0
- data/app/models/content_type_group.rb +3 -0
- data/app/models/dynamic_view.rb +80 -0
- data/app/models/email_message.rb +31 -0
- data/app/models/email_message_mailer.rb +11 -0
- data/app/models/file_block.rb +21 -0
- data/app/models/forgot_password_mailer.rb +12 -0
- data/app/models/group.rb +41 -0
- data/app/models/group_permission.rb +7 -0
- data/app/models/group_section.rb +4 -0
- data/app/models/group_type.rb +12 -0
- data/app/models/group_type_permission.rb +4 -0
- data/app/models/guest_user.rb +53 -0
- data/app/models/html_block.rb +40 -0
- data/app/models/image_block.rb +22 -0
- data/app/models/link.rb +35 -0
- data/app/models/page.rb +275 -0
- data/app/models/page_partial.rb +22 -0
- data/app/models/page_route.rb +58 -0
- data/app/models/page_route_condition.rb +2 -0
- data/app/models/page_route_option.rb +3 -0
- data/app/models/page_route_requirement.rb +2 -0
- data/app/models/page_template.rb +48 -0
- data/app/models/permission.rb +10 -0
- data/app/models/portlet.rb +167 -0
- data/app/models/redirect.rb +4 -0
- data/app/models/section.rb +147 -0
- data/app/models/section_node.rb +93 -0
- data/app/models/site.rb +41 -0
- data/app/models/tag.rb +62 -0
- data/app/models/tagging.rb +9 -0
- data/app/models/task_item.rb +67 -0
- data/app/models/user.rb +169 -0
- data/app/models/user_group_membership.rb +4 -0
- data/app/portlets/dynamic_portlet.rb +7 -0
- data/app/portlets/email_page_portlet.rb +24 -0
- data/app/portlets/forgot_password_portlet.rb +28 -0
- data/app/portlets/login_portlet.rb +10 -0
- data/app/portlets/reset_password_portlet.rb +28 -0
- data/app/portlets/tag_cloud_portlet.rb +13 -0
- data/app/views/cms/blocks/_hidden_fields.html.erb +10 -0
- data/app/views/cms/blocks/_toolbar.html.erb +9 -0
- data/app/views/cms/blocks/_toolbar_for_collection.html.erb +26 -0
- data/app/views/cms/blocks/_toolbar_for_member.html.erb +38 -0
- data/app/views/cms/blocks/edit.html.erb +25 -0
- data/app/views/cms/blocks/index.html.erb +128 -0
- data/app/views/cms/blocks/new.html.erb +21 -0
- data/app/views/cms/blocks/show.html.erb +40 -0
- data/app/views/cms/blocks/usages.html.erb +44 -0
- data/app/views/cms/blocks/versions.html.erb +90 -0
- data/app/views/cms/cache/show.html.erb +12 -0
- data/app/views/cms/categories/_form.html.erb +36 -0
- data/app/views/cms/category_types/_form.html.erb +1 -0
- data/app/views/cms/connectors/new.html.erb +71 -0
- data/app/views/cms/content/no_page.html.erb +37 -0
- data/app/views/cms/content/show.html.erb +21 -0
- data/app/views/cms/content_types/index.html.erb +14 -0
- data/app/views/cms/dashboard/_page_drafts.html.erb +49 -0
- data/app/views/cms/dashboard/_task_items.html.erb +55 -0
- data/app/views/cms/dashboard/index.html.erb +15 -0
- data/app/views/cms/dynamic_views/_form.html.erb +11 -0
- data/app/views/cms/dynamic_views/edit.html.erb +3 -0
- data/app/views/cms/dynamic_views/index.html.erb +52 -0
- data/app/views/cms/dynamic_views/new.html.erb +3 -0
- data/app/views/cms/email_messages/index.html.erb +39 -0
- data/app/views/cms/email_messages/show.html.erb +57 -0
- data/app/views/cms/file_blocks/_form.html.erb +30 -0
- data/app/views/cms/file_blocks/render.html.erb +5 -0
- data/app/views/cms/forgot_password_mailer/reset_password.text.html.erb +3 -0
- data/app/views/cms/forgot_password_mailer/reset_password.text.plain.erb +3 -0
- data/app/views/cms/form_builder/_cms_check_box.html.erb +7 -0
- data/app/views/cms/form_builder/_cms_date_picker.html.erb +12 -0
- data/app/views/cms/form_builder/_cms_datetime_select.html.erb +12 -0
- data/app/views/cms/form_builder/_cms_drop_down.html.erb +12 -0
- data/app/views/cms/form_builder/_cms_fancy_drop_down.html.erb +9 -0
- data/app/views/cms/form_builder/_cms_file_field.html.erb +36 -0
- data/app/views/cms/form_builder/_cms_instructions.html.erb +4 -0
- data/app/views/cms/form_builder/_cms_tag_list.html.erb +15 -0
- data/app/views/cms/form_builder/_cms_template_editor.html.erb +8 -0
- data/app/views/cms/form_builder/_cms_text_area.html.erb +13 -0
- data/app/views/cms/form_builder/_cms_text_editor.html.erb +18 -0
- data/app/views/cms/form_builder/_cms_text_field.html.erb +12 -0
- data/app/views/cms/groups/_form.html.erb +45 -0
- data/app/views/cms/groups/_permissions.html.erb +37 -0
- data/app/views/cms/groups/_sections.html.erb +19 -0
- data/app/views/cms/groups/edit.html.erb +4 -0
- data/app/views/cms/groups/index.html.erb +58 -0
- data/app/views/cms/groups/new.html.erb +4 -0
- data/app/views/cms/html_blocks/_form.html.erb +3 -0
- data/app/views/cms/html_blocks/render.html.erb +1 -0
- data/app/views/cms/image_blocks/_form.html.erb +30 -0
- data/app/views/cms/image_blocks/render.html.erb +1 -0
- data/app/views/cms/links/_form.html.erb +13 -0
- data/app/views/cms/links/destroy.js.rjs +2 -0
- data/app/views/cms/links/edit.html.erb +14 -0
- data/app/views/cms/links/new.html.erb +15 -0
- data/app/views/cms/menus/_menu.html.erb +9 -0
- data/app/views/cms/menus/_menu_item.html.erb +11 -0
- data/app/views/cms/page_routes/_form.html.erb +11 -0
- data/app/views/cms/page_routes/edit.html.erb +3 -0
- data/app/views/cms/page_routes/index.html.erb +56 -0
- data/app/views/cms/page_routes/new.html.erb +3 -0
- data/app/views/cms/page_routes/show.html.erb +14 -0
- data/app/views/cms/pages/_edit_connector.html.erb +27 -0
- data/app/views/cms/pages/_edit_container.html.erb +12 -0
- data/app/views/cms/pages/_form.html.erb +46 -0
- data/app/views/cms/pages/edit.html.erb +23 -0
- data/app/views/cms/pages/new.html.erb +33 -0
- data/app/views/cms/pages/versions.html.erb +91 -0
- data/app/views/cms/redirects/_form.html.erb +15 -0
- data/app/views/cms/redirects/edit.html.erb +3 -0
- data/app/views/cms/redirects/index.html.erb +50 -0
- data/app/views/cms/redirects/new.html.erb +3 -0
- data/app/views/cms/routes/index.html.erb +40 -0
- data/app/views/cms/section_nodes/_link.html.erb +11 -0
- data/app/views/cms/section_nodes/_node.html.erb +34 -0
- data/app/views/cms/section_nodes/_page.html.erb +14 -0
- data/app/views/cms/section_nodes/_section.html.erb +12 -0
- data/app/views/cms/section_nodes/_section_node.html.erb +10 -0
- data/app/views/cms/section_nodes/index.html.erb +31 -0
- data/app/views/cms/sections/_form.html.erb +59 -0
- data/app/views/cms/sections/_page.html.erb +4 -0
- data/app/views/cms/sections/_section.html.erb +8 -0
- data/app/views/cms/sections/destroy.js.rjs +2 -0
- data/app/views/cms/sections/edit.html.erb +10 -0
- data/app/views/cms/sections/file_browser.xml.builder +14 -0
- data/app/views/cms/sections/index.html.erb +23 -0
- data/app/views/cms/sections/new.html.erb +21 -0
- data/app/views/cms/sessions/new.html.erb +32 -0
- data/app/views/cms/shared/_admin_sidebar.html.erb +30 -0
- data/app/views/cms/shared/_exception.html.erb +6 -0
- data/app/views/cms/shared/_pagination.html.erb +31 -0
- data/app/views/cms/shared/_version_conflict_diff.html.erb +11 -0
- data/app/views/cms/shared/_version_conflict_error.html.erb +6 -0
- data/app/views/cms/shared/access_denied.html.erb +3 -0
- data/app/views/cms/shared/error.html.erb +40 -0
- data/app/views/cms/tags/_form.html.erb +1 -0
- data/app/views/cms/tags/render.html.erb +53 -0
- data/app/views/cms/task_items/new.html.erb +36 -0
- data/app/views/cms/toolbar/index.html.erb +1 -0
- data/app/views/cms/users/_form.html.erb +12 -0
- data/app/views/cms/users/_groups.html.erb +12 -0
- data/app/views/cms/users/_password.html.erb +8 -0
- data/app/views/cms/users/_toolbar.html.erb +22 -0
- data/app/views/cms/users/_user_fields.html.erb +20 -0
- data/app/views/cms/users/change_password.html.erb +21 -0
- data/app/views/cms/users/edit.html.erb +16 -0
- data/app/views/cms/users/index.html.erb +62 -0
- data/app/views/cms/users/new.html.erb +13 -0
- data/app/views/cms/users/show.html.erb +50 -0
- data/app/views/layouts/_cms_toolbar.html.erb +54 -0
- data/app/views/layouts/_page_toolbar.html.erb +118 -0
- data/app/views/layouts/application.html.erb +11 -0
- data/app/views/layouts/cms/_footer.erb +4 -0
- data/app/views/layouts/cms/_head.html.erb +28 -0
- data/app/views/layouts/cms/administration.html.erb +51 -0
- data/app/views/layouts/cms/application.html.erb +25 -0
- data/app/views/layouts/cms/content_library.html.erb +94 -0
- data/app/views/layouts/cms/dashboard.html.erb +16 -0
- data/app/views/layouts/cms/login.html.erb +30 -0
- data/app/views/layouts/cms/section_nodes.html.erb +20 -0
- data/app/views/layouts/cms/thickbox.html.erb +24 -0
- data/app/views/layouts/cms/toolbar.html.erb +23 -0
- data/app/views/portlets/dynamic/_form.html.erb +3 -0
- data/app/views/portlets/email_page/_form.html.erb +7 -0
- data/app/views/portlets/email_page/render.html.erb +17 -0
- data/app/views/portlets/forgot_password/_form.html.erb +6 -0
- data/app/views/portlets/forgot_password/render.html.erb +14 -0
- data/app/views/portlets/login/_form.html.erb +6 -0
- data/app/views/portlets/login/render.html.erb +27 -0
- data/app/views/portlets/portlets/_form.html.erb +19 -0
- data/app/views/portlets/reset_password/_form.html.erb +3 -0
- data/app/views/portlets/reset_password/render.html.erb +24 -0
- data/app/views/portlets/tag_cloud/_form.html.erb +4 -0
- data/app/views/portlets/tag_cloud/render.html.erb +5 -0
- data/app/views/tests/pretend/open_with_layout.html.erb +2 -0
- data/bf4-browsercms.gemspec +1030 -0
- data/db/demo/data.rb +97 -0
- data/db/demo/page_partials/_footer.html.erb +6 -0
- data/db/demo/page_partials/_header.html.erb +24 -0
- data/db/demo/page_templates/home_page.html.erb +49 -0
- data/db/demo/page_templates/sub_page.html.erb +37 -0
- data/db/migrate/20080815014337_browsercms_3_0_0.rb +274 -0
- data/db/migrate/20081114172307_load_seed_data.rb +92 -0
- data/db/migrate/20091109175123_browsercms_3_0_5.rb +9 -0
- data/db/migrate/20110127230131_change_task_to_task_item_due_to_namespace_issue.rb +9 -0
- data/doc/app/classes/AbstractFileBlock.html +146 -0
- data/doc/app/classes/ActiveRecord.html +105 -0
- data/doc/app/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html +242 -0
- data/doc/app/classes/ActiveSupport.html +111 -0
- data/doc/app/classes/ActiveSupport/Cache.html +111 -0
- data/doc/app/classes/ActiveSupport/Cache/FileStore.html +146 -0
- data/doc/app/classes/ActsAsList.html +147 -0
- data/doc/app/classes/ActsAsList/ClassMethods.html +202 -0
- data/doc/app/classes/ActsAsList/InstanceMethods.html +510 -0
- data/doc/app/classes/ApplicationController.html +119 -0
- data/doc/app/classes/ApplicationHelper.html +112 -0
- data/doc/app/classes/Attachment.html +726 -0
- data/doc/app/classes/Category.html +230 -0
- data/doc/app/classes/CategoryType.html +214 -0
- data/doc/app/classes/Cms.html +638 -0
- data/doc/app/classes/Cms/Acts.html +111 -0
- data/doc/app/classes/Cms/Acts/ContentBlock.html +146 -0
- data/doc/app/classes/Cms/Acts/ContentBlock/MacroMethods.html +165 -0
- data/doc/app/classes/Cms/Acts/ContentBlock/MacroMethods/InstanceMethods.html +140 -0
- data/doc/app/classes/Cms/ApplicationController.html +418 -0
- data/doc/app/classes/Cms/ApplicationHelper.html +814 -0
- data/doc/app/classes/Cms/AttachmentsController.html +154 -0
- data/doc/app/classes/Cms/Authentication.html +116 -0
- data/doc/app/classes/Cms/Authentication/Controller.html +702 -0
- data/doc/app/classes/Cms/Authentication/Model.html +165 -0
- data/doc/app/classes/Cms/Authentication/Model/ClassMethods.html +246 -0
- data/doc/app/classes/Cms/Authentication/Model/InstanceMethods.html +412 -0
- data/doc/app/classes/Cms/BaseController.html +113 -0
- data/doc/app/classes/Cms/Behaviors.html +235 -0
- data/doc/app/classes/Cms/Behaviors/Archiving.html +147 -0
- data/doc/app/classes/Cms/Behaviors/Archiving/InstanceMethods.html +220 -0
- data/doc/app/classes/Cms/Behaviors/Archiving/MacroMethods.html +175 -0
- data/doc/app/classes/Cms/Behaviors/Attaching.html +160 -0
- data/doc/app/classes/Cms/Behaviors/Attaching/InstanceMethods.html +670 -0
- data/doc/app/classes/Cms/Behaviors/Attaching/MacroMethods.html +188 -0
- data/doc/app/classes/Cms/Behaviors/Categorizing.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Categorizing/ClassMethods.html +105 -0
- data/doc/app/classes/Cms/Behaviors/Categorizing/InstanceMethods.html +140 -0
- data/doc/app/classes/Cms/Behaviors/Categorizing/MacroMethods.html +178 -0
- data/doc/app/classes/Cms/Behaviors/ClassMethods.html +272 -0
- data/doc/app/classes/Cms/Behaviors/Connecting.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Connecting/ClassMethods.html +188 -0
- data/doc/app/classes/Cms/Behaviors/Connecting/InstanceMethods.html +312 -0
- data/doc/app/classes/Cms/Behaviors/Connecting/MacroMethods.html +184 -0
- data/doc/app/classes/Cms/Behaviors/DynamicAttributes.html +285 -0
- data/doc/app/classes/Cms/Behaviors/DynamicAttributes/InstanceMethods.html +181 -0
- data/doc/app/classes/Cms/Behaviors/DynamicAttributes/MacroMethods.html +243 -0
- data/doc/app/classes/Cms/Behaviors/FlushCacheOnChange.html +178 -0
- data/doc/app/classes/Cms/Behaviors/FlushCacheOnChange/InstanceMethods.html +142 -0
- data/doc/app/classes/Cms/Behaviors/FlushCacheOnChange/MacroMethods.html +175 -0
- data/doc/app/classes/Cms/Behaviors/Hiding.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Hiding/ClassMethods.html +105 -0
- data/doc/app/classes/Cms/Behaviors/Hiding/InstanceMethods.html +220 -0
- data/doc/app/classes/Cms/Behaviors/Hiding/MacroMethods.html +176 -0
- data/doc/app/classes/Cms/Behaviors/InstanceMethods.html +234 -0
- data/doc/app/classes/Cms/Behaviors/Pagination.html +151 -0
- data/doc/app/classes/Cms/Behaviors/Pagination/ClassMethods.html +252 -0
- data/doc/app/classes/Cms/Behaviors/Pagination/Collection.html +437 -0
- data/doc/app/classes/Cms/Behaviors/Pagination/InvalidPage.html +146 -0
- data/doc/app/classes/Cms/Behaviors/Publishing.html +179 -0
- data/doc/app/classes/Cms/Behaviors/Publishing/ClassMethods.html +105 -0
- data/doc/app/classes/Cms/Behaviors/Publishing/InstanceMethods.html +333 -0
- data/doc/app/classes/Cms/Behaviors/Publishing/MacroMethods.html +180 -0
- data/doc/app/classes/Cms/Behaviors/Rendering.html +179 -0
- data/doc/app/classes/Cms/Behaviors/Rendering/MacroMethods.html +186 -0
- data/doc/app/classes/Cms/Behaviors/Searching.html +147 -0
- data/doc/app/classes/Cms/Behaviors/Searching/ClassMethods.html +164 -0
- data/doc/app/classes/Cms/Behaviors/Searching/MacroMethods.html +188 -0
- data/doc/app/classes/Cms/Behaviors/SoftDeleting.html +148 -0
- data/doc/app/classes/Cms/Behaviors/SoftDeleting/ClassMethods.html +217 -0
- data/doc/app/classes/Cms/Behaviors/SoftDeleting/InstanceMethods.html +247 -0
- data/doc/app/classes/Cms/Behaviors/SoftDeleting/MacroMethods.html +205 -0
- data/doc/app/classes/Cms/Behaviors/Taggable.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Taggable/ClassMethods.html +164 -0
- data/doc/app/classes/Cms/Behaviors/Taggable/InstanceMethods.html +197 -0
- data/doc/app/classes/Cms/Behaviors/Taggable/MacroMethods.html +182 -0
- data/doc/app/classes/Cms/Behaviors/Userstamping.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Userstamping/ClassMethods.html +105 -0
- data/doc/app/classes/Cms/Behaviors/Userstamping/InstanceMethods.html +143 -0
- data/doc/app/classes/Cms/Behaviors/Userstamping/MacroMethods.html +181 -0
- data/doc/app/classes/Cms/Behaviors/Versioning.html +148 -0
- data/doc/app/classes/Cms/Behaviors/Versioning/ClassMethods.html +237 -0
- data/doc/app/classes/Cms/Behaviors/Versioning/InstanceMethods.html +685 -0
- data/doc/app/classes/Cms/Behaviors/Versioning/MacroMethods.html +290 -0
- data/doc/app/classes/Cms/CacheController.html +174 -0
- data/doc/app/classes/Cms/Caching.html +171 -0
- data/doc/app/classes/Cms/CategoriesController.html +113 -0
- data/doc/app/classes/Cms/CategoryTypesController.html +148 -0
- data/doc/app/classes/Cms/ConnectorsController.html +215 -0
- data/doc/app/classes/Cms/ContentBlockController.html +1175 -0
- data/doc/app/classes/Cms/ContentController.html +313 -0
- data/doc/app/classes/Cms/ContentTypesController.html +148 -0
- data/doc/app/classes/Cms/DashboardController.html +151 -0
- data/doc/app/classes/Cms/DataLoader.html +182 -0
- data/doc/app/classes/Cms/DynamicViewsController.html +359 -0
- data/doc/app/classes/Cms/EmailMessagesController.html +172 -0
- data/doc/app/classes/Cms/ErrorHandling.html +172 -0
- data/doc/app/classes/Cms/Errors.html +111 -0
- data/doc/app/classes/Cms/Errors/AccessDenied.html +146 -0
- data/doc/app/classes/Cms/Extensions.html +140 -0
- data/doc/app/classes/Cms/Extensions/ActionView.html +111 -0
- data/doc/app/classes/Cms/Extensions/ActionView/Base.html +141 -0
- data/doc/app/classes/Cms/Extensions/ActiveRecord.html +116 -0
- data/doc/app/classes/Cms/Extensions/ActiveRecord/Base.html +144 -0
- data/doc/app/classes/Cms/Extensions/ActiveRecord/Errors.html +140 -0
- data/doc/app/classes/Cms/Extensions/Hash.html +175 -0
- data/doc/app/classes/Cms/Extensions/Integer.html +146 -0
- data/doc/app/classes/Cms/Extensions/NilClass.html +212 -0
- data/doc/app/classes/Cms/Extensions/String.html +212 -0
- data/doc/app/classes/Cms/FileBlocksController.html +113 -0
- data/doc/app/classes/Cms/FormBuilder.html +312 -0
- data/doc/app/classes/Cms/FormTagHelper.html +245 -0
- data/doc/app/classes/Cms/GroupsController.html +225 -0
- data/doc/app/classes/Cms/HomeController.html +148 -0
- data/doc/app/classes/Cms/HtmlBlocksController.html +113 -0
- data/doc/app/classes/Cms/ImageBlocksController.html +113 -0
- data/doc/app/classes/Cms/LinksController.html +341 -0
- data/doc/app/classes/Cms/MenuHelper.html +330 -0
- data/doc/app/classes/Cms/PageHelper.html +292 -0
- data/doc/app/classes/Cms/PageRouteConditionsController.html +113 -0
- data/doc/app/classes/Cms/PageRouteOptionsController.html +355 -0
- data/doc/app/classes/Cms/PageRouteRequirementsController.html +113 -0
- data/doc/app/classes/Cms/PageRoutesController.html +284 -0
- data/doc/app/classes/Cms/PagesController.html +331 -0
- data/doc/app/classes/Cms/PathHelper.html +268 -0
- data/doc/app/classes/Cms/PortletController.html +150 -0
- data/doc/app/classes/Cms/PortletsController.html +301 -0
- data/doc/app/classes/Cms/RedirectsController.html +172 -0
- data/doc/app/classes/Cms/ResourceController.html +616 -0
- data/doc/app/classes/Cms/Routes.html +303 -0
- data/doc/app/classes/Cms/RoutesController.html +164 -0
- data/doc/app/classes/Cms/SectionNodesController.html +272 -0
- data/doc/app/classes/Cms/SectionNodesHelper.html +145 -0
- data/doc/app/classes/Cms/SectionsController.html +542 -0
- data/doc/app/classes/Cms/SessionsController.html +270 -0
- data/doc/app/classes/Cms/TagsController.html +152 -0
- data/doc/app/classes/Cms/TasksController.html +221 -0
- data/doc/app/classes/Cms/ToolbarController.html +153 -0
- data/doc/app/classes/Cms/UsersController.html +405 -0
- data/doc/app/classes/Connector.html +350 -0
- data/doc/app/classes/ContentType.html +448 -0
- data/doc/app/classes/ContentTypeGroup.html +111 -0
- data/doc/app/classes/DynamicPortlet.html +148 -0
- data/doc/app/classes/DynamicView.html +411 -0
- data/doc/app/classes/EmailMessage.html +228 -0
- data/doc/app/classes/EmailMessageMailer.html +150 -0
- data/doc/app/classes/EmailPagePortlet.html +184 -0
- data/doc/app/classes/FileBlock.html +202 -0
- data/doc/app/classes/Group.html +170 -0
- data/doc/app/classes/GroupPermission.html +111 -0
- data/doc/app/classes/GroupSection.html +111 -0
- data/doc/app/classes/GroupType.html +111 -0
- data/doc/app/classes/GroupTypePermission.html +111 -0
- data/doc/app/classes/GuestUser.html +347 -0
- data/doc/app/classes/HtmlBlock.html +170 -0
- data/doc/app/classes/ImageBlock.html +202 -0
- data/doc/app/classes/InitialData.html +171 -0
- data/doc/app/classes/Link.html +249 -0
- data/doc/app/classes/LoginPortlet.html +151 -0
- data/doc/app/classes/Page.html +954 -0
- data/doc/app/classes/PagePartial.html +201 -0
- data/doc/app/classes/PageRoute.html +335 -0
- data/doc/app/classes/PageRouteCondition.html +113 -0
- data/doc/app/classes/PageRouteOption.html +111 -0
- data/doc/app/classes/PageRouteRequirement.html +113 -0
- data/doc/app/classes/PageTemplate.html +278 -0
- data/doc/app/classes/Permission.html +111 -0
- data/doc/app/classes/Portlet.html +738 -0
- data/doc/app/classes/Redirect.html +111 -0
- data/doc/app/classes/Section.html +580 -0
- data/doc/app/classes/SectionNode.html +410 -0
- data/doc/app/classes/Sequence.html +146 -0
- data/doc/app/classes/Site.html +253 -0
- data/doc/app/classes/Tag.html +292 -0
- data/doc/app/classes/TagCloudPortlet.html +176 -0
- data/doc/app/classes/Tagging.html +146 -0
- data/doc/app/classes/Task.html +288 -0
- data/doc/app/classes/User.html +618 -0
- data/doc/app/classes/UserGroupMembership.html +111 -0
- data/doc/app/created.rid +1 -0
- data/doc/app/files/app/controllers/application_controller_rb.html +109 -0
- data/doc/app/files/app/controllers/cms/application_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/attachments_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/base_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/cache_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/categories_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/category_types_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/connectors_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/content_block_controller_rb.html +107 -0
- data/doc/app/files/app/controllers/cms/content_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/content_types_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/dashboard_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/dynamic_views_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/email_messages_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/error_handling_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/file_blocks_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/groups_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/home_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/html_blocks_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/image_blocks_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/links_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/page_route_conditions_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/page_route_options_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/page_route_requirements_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/page_routes_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/pages_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/portlet_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/portlets_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/redirects_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/resource_controller_rb.html +108 -0
- data/doc/app/files/app/controllers/cms/routes_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/section_nodes_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/sections_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/sessions_controller_rb.html +107 -0
- data/doc/app/files/app/controllers/cms/tags_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/tasks_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/toolbar_controller_rb.html +101 -0
- data/doc/app/files/app/controllers/cms/users_controller_rb.html +101 -0
- data/doc/app/files/app/helpers/application_helper_rb.html +108 -0
- data/doc/app/files/app/helpers/cms/application_helper_rb.html +107 -0
- data/doc/app/files/app/helpers/cms/form_builder_rb.html +101 -0
- data/doc/app/files/app/helpers/cms/form_tag_helper_rb.html +101 -0
- data/doc/app/files/app/helpers/cms/menu_helper_rb.html +101 -0
- data/doc/app/files/app/helpers/cms/page_helper_rb.html +101 -0
- data/doc/app/files/app/helpers/cms/path_helper_rb.html +101 -0
- data/doc/app/files/app/helpers/cms/section_nodes_helper_rb.html +101 -0
- data/doc/app/files/app/models/abstract_file_block_rb.html +101 -0
- data/doc/app/files/app/models/attachment_rb.html +109 -0
- data/doc/app/files/app/models/category_rb.html +101 -0
- data/doc/app/files/app/models/category_type_rb.html +101 -0
- data/doc/app/files/app/models/connector_rb.html +101 -0
- data/doc/app/files/app/models/content_type_group_rb.html +101 -0
- data/doc/app/files/app/models/content_type_rb.html +101 -0
- data/doc/app/files/app/models/dynamic_view_rb.html +101 -0
- data/doc/app/files/app/models/email_message_mailer_rb.html +101 -0
- data/doc/app/files/app/models/email_message_rb.html +101 -0
- data/doc/app/files/app/models/file_block_rb.html +101 -0
- data/doc/app/files/app/models/group_permission_rb.html +101 -0
- data/doc/app/files/app/models/group_rb.html +101 -0
- data/doc/app/files/app/models/group_section_rb.html +101 -0
- data/doc/app/files/app/models/group_type_permission_rb.html +101 -0
- data/doc/app/files/app/models/group_type_rb.html +101 -0
- data/doc/app/files/app/models/guest_user_rb.html +101 -0
- data/doc/app/files/app/models/html_block_rb.html +101 -0
- data/doc/app/files/app/models/image_block_rb.html +101 -0
- data/doc/app/files/app/models/link_rb.html +101 -0
- data/doc/app/files/app/models/page_partial_rb.html +101 -0
- data/doc/app/files/app/models/page_rb.html +101 -0
- data/doc/app/files/app/models/page_route_condition_rb.html +101 -0
- data/doc/app/files/app/models/page_route_option_rb.html +101 -0
- data/doc/app/files/app/models/page_route_rb.html +101 -0
- data/doc/app/files/app/models/page_route_requirement_rb.html +101 -0
- data/doc/app/files/app/models/page_template_rb.html +101 -0
- data/doc/app/files/app/models/permission_rb.html +101 -0
- data/doc/app/files/app/models/portlet_rb.html +101 -0
- data/doc/app/files/app/models/redirect_rb.html +101 -0
- data/doc/app/files/app/models/section_node_rb.html +101 -0
- data/doc/app/files/app/models/section_rb.html +101 -0
- data/doc/app/files/app/models/site_rb.html +101 -0
- data/doc/app/files/app/models/tag_rb.html +101 -0
- data/doc/app/files/app/models/tagging_rb.html +101 -0
- data/doc/app/files/app/models/task_rb.html +101 -0
- data/doc/app/files/app/models/user_group_membership_rb.html +101 -0
- data/doc/app/files/app/models/user_rb.html +108 -0
- data/doc/app/files/app/portlets/dynamic_portlet_rb.html +101 -0
- data/doc/app/files/app/portlets/email_page_portlet_rb.html +101 -0
- data/doc/app/files/app/portlets/login_portlet_rb.html +101 -0
- data/doc/app/files/app/portlets/tag_cloud_portlet_rb.html +101 -0
- data/doc/app/files/doc/README_FOR_APP.html +127 -0
- data/doc/app/files/lib/acts_as_list_rb.html +101 -0
- data/doc/app/files/lib/browsercms_rb.html +113 -0
- data/doc/app/files/lib/cms/acts/content_block_rb.html +101 -0
- data/doc/app/files/lib/cms/authentication/controller_rb.html +101 -0
- data/doc/app/files/lib/cms/authentication/model_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/archiving_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/attaching_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/categorizing_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/connecting_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/dynamic_attributes_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/flush_cache_on_change_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/hiding_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/pagination_rb.html +107 -0
- data/doc/app/files/lib/cms/behaviors/publishing_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/rendering_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/searching_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/soft_deleting_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/taggable_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/userstamping_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors/versioning_rb.html +101 -0
- data/doc/app/files/lib/cms/behaviors_rb.html +147 -0
- data/doc/app/files/lib/cms/caching_rb.html +101 -0
- data/doc/app/files/lib/cms/data_loader_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/action_view/base_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/active_record/base_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/active_record/errors_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/active_support/cache/file_store_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/hash_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/integer_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/nil_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions/string_rb.html +101 -0
- data/doc/app/files/lib/cms/extensions_rb.html +101 -0
- data/doc/app/files/lib/cms/init_rb.html +101 -0
- data/doc/app/files/lib/cms/routes_rb.html +101 -0
- data/doc/app/files/lib/initial_data_rb.html +101 -0
- data/doc/app/files/lib/sequence_rb.html +101 -0
- data/doc/app/fr_class_index.html +205 -0
- data/doc/app/fr_file_index.html +152 -0
- data/doc/app/fr_method_index.html +738 -0
- data/doc/app/index.html +24 -0
- data/doc/app/rdoc-style.css +208 -0
- data/doc/guides/html/build_it_yourself.html +175 -0
- data/doc/guides/html/building_modules.html +193 -0
- data/doc/guides/html/deployment_guide.html +181 -0
- data/doc/guides/html/designer_guide.html +163 -0
- data/doc/guides/html/developer_guide.html +304 -0
- data/doc/guides/html/files/javascripts/code_highlighter.js +188 -0
- data/doc/guides/html/files/javascripts/guides.js +7 -0
- data/doc/guides/html/files/javascripts/highlighters.js +90 -0
- data/doc/guides/html/files/stylesheets/main.css +441 -0
- data/doc/guides/html/files/stylesheets/reset.css +43 -0
- data/doc/guides/html/files/stylesheets/style.css +13 -0
- data/doc/guides/html/files/stylesheets/syntax.css +31 -0
- data/doc/guides/html/getting_started.html +181 -0
- data/doc/guides/html/images/bg.png +0 -0
- data/doc/guides/html/images/bottom_cap.png +0 -0
- data/doc/guides/html/images/browsercms_logo.png +0 -0
- data/doc/guides/html/images/dot.png +0 -0
- data/doc/guides/html/images/icons/README +5 -0
- data/doc/guides/html/images/icons/callouts/1.png +0 -0
- data/doc/guides/html/images/icons/callouts/10.png +0 -0
- data/doc/guides/html/images/icons/callouts/11.png +0 -0
- data/doc/guides/html/images/icons/callouts/12.png +0 -0
- data/doc/guides/html/images/icons/callouts/13.png +0 -0
- data/doc/guides/html/images/icons/callouts/14.png +0 -0
- data/doc/guides/html/images/icons/callouts/15.png +0 -0
- data/doc/guides/html/images/icons/callouts/2.png +0 -0
- data/doc/guides/html/images/icons/callouts/3.png +0 -0
- data/doc/guides/html/images/icons/callouts/4.png +0 -0
- data/doc/guides/html/images/icons/callouts/5.png +0 -0
- data/doc/guides/html/images/icons/callouts/6.png +0 -0
- data/doc/guides/html/images/icons/callouts/7.png +0 -0
- data/doc/guides/html/images/icons/callouts/8.png +0 -0
- data/doc/guides/html/images/icons/callouts/9.png +0 -0
- data/doc/guides/html/images/icons/caution.png +0 -0
- data/doc/guides/html/images/icons/example.png +0 -0
- data/doc/guides/html/images/icons/home.png +0 -0
- data/doc/guides/html/images/icons/important.png +0 -0
- data/doc/guides/html/images/icons/next.png +0 -0
- data/doc/guides/html/images/icons/note.png +0 -0
- data/doc/guides/html/images/icons/prev.png +0 -0
- data/doc/guides/html/images/icons/tip.png +0 -0
- data/doc/guides/html/images/icons/up.png +0 -0
- data/doc/guides/html/images/icons/warning.png +0 -0
- data/doc/guides/html/images/top_cap.png +0 -0
- data/doc/guides/html/images/top_cap_content.png +0 -0
- data/doc/guides/html/index.html +168 -0
- data/doc/guides/html/installing_modules.html +181 -0
- data/doc/guides/html/user_guide.html +266 -0
- data/lib/acts_as_list.rb +256 -0
- data/lib/browsercms.rb +12 -0
- data/lib/cms/acts/content_block.rb +31 -0
- data/lib/cms/acts/content_page.rb +69 -0
- data/lib/cms/authentication/controller.rb +214 -0
- data/lib/cms/authentication/model.rb +116 -0
- data/lib/cms/behaviors.rb +33 -0
- data/lib/cms/behaviors/archiving.rb +43 -0
- data/lib/cms/behaviors/attaching.rb +184 -0
- data/lib/cms/behaviors/categorizing.rb +31 -0
- data/lib/cms/behaviors/connecting.rb +99 -0
- data/lib/cms/behaviors/dynamic_attributes.rb +367 -0
- data/lib/cms/behaviors/flush_cache_on_change.rb +33 -0
- data/lib/cms/behaviors/hiding.rb +46 -0
- data/lib/cms/behaviors/pagination.rb +209 -0
- data/lib/cms/behaviors/publishing.rb +123 -0
- data/lib/cms/behaviors/rendering.rb +156 -0
- data/lib/cms/behaviors/searching.rb +49 -0
- data/lib/cms/behaviors/soft_deleting.rb +77 -0
- data/lib/cms/behaviors/taggable.rb +57 -0
- data/lib/cms/behaviors/userstamping.rb +37 -0
- data/lib/cms/behaviors/versioning.rb +273 -0
- data/lib/cms/caching.rb +20 -0
- data/lib/cms/content_rendering_support.rb +96 -0
- data/lib/cms/data_loader.rb +28 -0
- data/lib/cms/domain_support.rb +20 -0
- data/lib/cms/extensions.rb +4 -0
- data/lib/cms/extensions/action_view/base.rb +13 -0
- data/lib/cms/extensions/active_record/base.rb +16 -0
- data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +88 -0
- data/lib/cms/extensions/active_record/errors.rb +12 -0
- data/lib/cms/extensions/active_support/cache/file_store.rb +9 -0
- data/lib/cms/extensions/hash.rb +21 -0
- data/lib/cms/extensions/integer.rb +16 -0
- data/lib/cms/extensions/nil.rb +19 -0
- data/lib/cms/extensions/string.rb +19 -0
- data/lib/cms/init.rb +100 -0
- data/lib/cms/routes.rb +136 -0
- data/lib/initial_data.rb +30 -0
- data/lib/sequence.rb +6 -0
- data/lib/tasks/cms.rake +39 -0
- data/lib/tasks/db.rake +71 -0
- data/lib/tasks/dev.rake +20 -0
- data/public/images/cms/administration/user_browser_bg.gif +0 -0
- data/public/images/cms/bg.png +0 -0
- data/public/images/cms/bl_curve.png +0 -0
- data/public/images/cms/bottom_cap.png +0 -0
- data/public/images/cms/bottom_cap_content.png +0 -0
- data/public/images/cms/browse.gif +0 -0
- data/public/images/cms/browser_media_logo.png +0 -0
- data/public/images/cms/browsercms_logo.png +0 -0
- data/public/images/cms/buttons/button.png +0 -0
- data/public/images/cms/buttons/button_bg.png +0 -0
- data/public/images/cms/buttons/button_cap.png +0 -0
- data/public/images/cms/buttons/button_cap_h.png +0 -0
- data/public/images/cms/buttons/button_cap_off.gif +0 -0
- data/public/images/cms/buttons/button_cap_off_middle.gif +0 -0
- data/public/images/cms/buttons/button_h.png +0 -0
- data/public/images/cms/buttons/button_left_bg.png +0 -0
- data/public/images/cms/buttons/button_off.png +0 -0
- data/public/images/cms/buttons/button_off_middle.png +0 -0
- data/public/images/cms/buttons/delete_x.png +0 -0
- data/public/images/cms/buttons/delete_x_disabled.png +0 -0
- data/public/images/cms/buttons/delete_x_h.png +0 -0
- data/public/images/cms/buttons/sm_button.gif +0 -0
- data/public/images/cms/buttons/sm_button_2.gif +0 -0
- data/public/images/cms/buttons/sm_button_2_h.gif +0 -0
- data/public/images/cms/buttons/sm_button_h.gif +0 -0
- data/public/images/cms/containers/add.gif +0 -0
- data/public/images/cms/containers/alpha.png +0 -0
- data/public/images/cms/containers/beta.png +0 -0
- data/public/images/cms/containers/delete.gif +0 -0
- data/public/images/cms/containers/down.gif +0 -0
- data/public/images/cms/containers/edit.gif +0 -0
- data/public/images/cms/containers/up.gif +0 -0
- data/public/images/cms/containers/view.gif +0 -0
- data/public/images/cms/content_bg.gif +0 -0
- data/public/images/cms/dashboard/bottom_cap.png +0 -0
- data/public/images/cms/dashboard/bottom_cap_content.png +0 -0
- data/public/images/cms/dashboard/header_bg.gif +0 -0
- data/public/images/cms/dashboard/header_left_bg.gif +0 -0
- data/public/images/cms/dashboard/table_header_bg.gif +0 -0
- data/public/images/cms/dashboard/top_cap.png +0 -0
- data/public/images/cms/dashed.gif +0 -0
- data/public/images/cms/datepicker/clear.gif +0 -0
- data/public/images/cms/datepicker/close.gif +0 -0
- data/public/images/cms/dk_button_l.gif +0 -0
- data/public/images/cms/dk_button_r.gif +0 -0
- data/public/images/cms/dot.png +0 -0
- data/public/images/cms/draft_status.gif +0 -0
- data/public/images/cms/gray_long_bg.gif +0 -0
- data/public/images/cms/icons/actions/add.png +0 -0
- data/public/images/cms/icons/actions/config.png +0 -0
- data/public/images/cms/icons/actions/connect.png +0 -0
- data/public/images/cms/icons/actions/delete.png +0 -0
- data/public/images/cms/icons/actions/down.png +0 -0
- data/public/images/cms/icons/actions/edit.png +0 -0
- data/public/images/cms/icons/actions/folder.png +0 -0
- data/public/images/cms/icons/actions/folder_add.png +0 -0
- data/public/images/cms/icons/actions/folder_delete.png +0 -0
- data/public/images/cms/icons/actions/folder_edit.png +0 -0
- data/public/images/cms/icons/actions/folder_move.png +0 -0
- data/public/images/cms/icons/actions/folder_open.png +0 -0
- data/public/images/cms/icons/actions/history.png +0 -0
- data/public/images/cms/icons/actions/home.png +0 -0
- data/public/images/cms/icons/actions/left.png +0 -0
- data/public/images/cms/icons/actions/link.png +0 -0
- data/public/images/cms/icons/actions/page.png +0 -0
- data/public/images/cms/icons/actions/page_add.png +0 -0
- data/public/images/cms/icons/actions/page_edit.png +0 -0
- data/public/images/cms/icons/actions/page_move.png +0 -0
- data/public/images/cms/icons/actions/redo.png +0 -0
- data/public/images/cms/icons/actions/refresh.png +0 -0
- data/public/images/cms/icons/actions/right.png +0 -0
- data/public/images/cms/icons/actions/root_folder.png +0 -0
- data/public/images/cms/icons/actions/root_link.png +0 -0
- data/public/images/cms/icons/actions/root_page.png +0 -0
- data/public/images/cms/icons/actions/undo.png +0 -0
- data/public/images/cms/icons/actions/up.png +0 -0
- data/public/images/cms/icons/actions/view.png +0 -0
- data/public/images/cms/icons/file_types/doc.png +0 -0
- data/public/images/cms/icons/file_types/file.png +0 -0
- data/public/images/cms/icons/file_types/gif.png +0 -0
- data/public/images/cms/icons/file_types/htm.png +0 -0
- data/public/images/cms/icons/file_types/pdf.png +0 -0
- data/public/images/cms/icons/file_types/ppt.png +0 -0
- data/public/images/cms/icons/file_types/swf.png +0 -0
- data/public/images/cms/icons/file_types/txt.png +0 -0
- data/public/images/cms/icons/file_types/xls.png +0 -0
- data/public/images/cms/icons/file_types/xml.png +0 -0
- data/public/images/cms/icons/file_types/zip.png +0 -0
- data/public/images/cms/icons/status/archived.gif +0 -0
- data/public/images/cms/icons/status/draft.gif +0 -0
- data/public/images/cms/icons/status/hidden.gif +0 -0
- data/public/images/cms/icons/status/locked.gif +0 -0
- data/public/images/cms/icons/status/published.gif +0 -0
- data/public/images/cms/icons/status/unlocked.gif +0 -0
- data/public/images/cms/icons/user.png +0 -0
- data/public/images/cms/login_bg.jpg +0 -0
- data/public/images/cms/login_bottom.jpg +0 -0
- data/public/images/cms/login_top.gif +0 -0
- data/public/images/cms/lt_button_bg.gif +0 -0
- data/public/images/cms/lt_button_l.gif +0 -0
- data/public/images/cms/lt_button_r.gif +0 -0
- data/public/images/cms/menu.png +0 -0
- data/public/images/cms/menu/block_cap_h.gif +0 -0
- data/public/images/cms/menu/bottom_cap.png +0 -0
- data/public/images/cms/menu/bottom_cap_menu.png +0 -0
- data/public/images/cms/menu/bottom_cap_menu_first.png +0 -0
- data/public/images/cms/menu/menu_header_first_bg.gif +0 -0
- data/public/images/cms/menu/selected_block_cap.gif +0 -0
- data/public/images/cms/menu/top_cap.png +0 -0
- data/public/images/cms/menu/top_cap_menu_header.png +0 -0
- data/public/images/cms/menu_h.gif +0 -0
- data/public/images/cms/menu_header.png +0 -0
- data/public/images/cms/menu_open.png +0 -0
- data/public/images/cms/menu_open_bg.gif +0 -0
- data/public/images/cms/nav.png +0 -0
- data/public/images/cms/nav/on_bg.gif +0 -0
- data/public/images/cms/nav_admin.gif +0 -0
- data/public/images/cms/nav_admin_h.gif +0 -0
- data/public/images/cms/nav_admin_on.gif +0 -0
- data/public/images/cms/nav_cap.png +0 -0
- data/public/images/cms/nav_cap_h.gif +0 -0
- data/public/images/cms/nav_content_library.gif +0 -0
- data/public/images/cms/nav_content_library_h.gif +0 -0
- data/public/images/cms/nav_content_library_on.gif +0 -0
- data/public/images/cms/nav_dash.gif +0 -0
- data/public/images/cms/nav_dash_h.gif +0 -0
- data/public/images/cms/nav_dash_on.gif +0 -0
- data/public/images/cms/nav_h.gif +0 -0
- data/public/images/cms/nav_sitemap.gif +0 -0
- data/public/images/cms/nav_sitemap_h.gif +0 -0
- data/public/images/cms/nav_sitemap_on.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_bg.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_bg.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_draft_bg.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_draft_l.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_draft_r.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_l.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_published_bg.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_published_l.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_published_r.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_inset_r.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_l.gif +0 -0
- data/public/images/cms/page_toolbar/page_toolbar_r.gif +0 -0
- data/public/images/cms/page_toolbar/status_draft_bg.gif +0 -0
- data/public/images/cms/page_toolbar/status_draft_l.gif +0 -0
- data/public/images/cms/page_toolbar/status_l.gif +0 -0
- data/public/images/cms/page_toolbar/status_published_bg.gif +0 -0
- data/public/images/cms/page_toolbar/status_published_l.gif +0 -0
- data/public/images/cms/page_toolbar/visual_editor_bg.gif +0 -0
- data/public/images/cms/page_toolbar/visual_editor_end.gif +0 -0
- data/public/images/cms/page_toolbar/visual_editor_r.gif +0 -0
- data/public/images/cms/page_toolbar/visual_editor_state_bg.gif +0 -0
- data/public/images/cms/pages/add_connectable.gif +0 -0
- data/public/images/cms/pages/connect_connectable.gif +0 -0
- data/public/images/cms/pages/container_border.gif +0 -0
- data/public/images/cms/pages/container_border_l.gif +0 -0
- data/public/images/cms/pages/container_border_r.gif +0 -0
- data/public/images/cms/pages/delete_connectable.gif +0 -0
- data/public/images/cms/pages/down_connectable.gif +0 -0
- data/public/images/cms/pages/down_connectable_disabled.gif +0 -0
- data/public/images/cms/pages/edit_connectable.gif +0 -0
- data/public/images/cms/pages/edit_connectable_2.gif +0 -0
- data/public/images/cms/pages/show_connectable.gif +0 -0
- data/public/images/cms/pages/up_connectable.gif +0 -0
- data/public/images/cms/pages/up_connectable_disabled.gif +0 -0
- data/public/images/cms/pagination/first.gif +0 -0
- data/public/images/cms/pagination/first_h.gif +0 -0
- data/public/images/cms/pagination/input.gif +0 -0
- data/public/images/cms/pagination/last.gif +0 -0
- data/public/images/cms/pagination/last_h.gif +0 -0
- data/public/images/cms/pagination/next.gif +0 -0
- data/public/images/cms/pagination/next_h.gif +0 -0
- data/public/images/cms/pagination/previous.gif +0 -0
- data/public/images/cms/pagination/previous_h.gif +0 -0
- data/public/images/cms/published_status.gif +0 -0
- data/public/images/cms/search.png +0 -0
- data/public/images/cms/search_submit.gif +0 -0
- data/public/images/cms/search_submit_h.gif +0 -0
- data/public/images/cms/searchbox_gradient.gif +0 -0
- data/public/images/cms/select_bg.gif +0 -0
- data/public/images/cms/select_bg_2.gif +0 -0
- data/public/images/cms/sitemap/bottom_cap.png +0 -0
- data/public/images/cms/sitemap/buffer_caps.png +0 -0
- data/public/images/cms/sitemap/contract.png +0 -0
- data/public/images/cms/sitemap/corners.gif +0 -0
- data/public/images/cms/sitemap/corners_hover.gif +0 -0
- data/public/images/cms/sitemap/divider.gif +0 -0
- data/public/images/cms/sitemap/expand.png +0 -0
- data/public/images/cms/sitemap/gradient.gif +0 -0
- data/public/images/cms/sitemap/gray_contract.png +0 -0
- data/public/images/cms/sitemap/gray_expand.png +0 -0
- data/public/images/cms/sitemap/no_contents.png +0 -0
- data/public/images/cms/sitemap/site_root_cap.png +0 -0
- data/public/images/cms/sitemap/tooltip.gif +0 -0
- data/public/images/cms/sitemap/top_cap_content.png +0 -0
- data/public/images/cms/solid.gif +0 -0
- data/public/images/cms/table/bl.gif +0 -0
- data/public/images/cms/table/br.gif +0 -0
- data/public/images/cms/table/divider.gif +0 -0
- data/public/images/cms/table/td_cap_first_h.gif +0 -0
- data/public/images/cms/table/td_cap_first_s.gif +0 -0
- data/public/images/cms/table/td_cap_last_h.gif +0 -0
- data/public/images/cms/table/td_cap_last_s.gif +0 -0
- data/public/images/cms/table/td_last_bg.gif +0 -0
- data/public/images/cms/table/th_bg.gif +0 -0
- data/public/images/cms/table/th_divider.gif +0 -0
- data/public/images/cms/table/th_last_bg.gif +0 -0
- data/public/images/cms/table/tl.gif +0 -0
- data/public/images/cms/table/tr.gif +0 -0
- data/public/images/cms/table/tr_bg.gif +0 -0
- data/public/images/cms/thickbox/loadingAnimation.gif +0 -0
- data/public/images/cms/thickbox/macFFBgHack.png +0 -0
- data/public/images/cms/toolbar_bg.png +0 -0
- data/public/images/cms/top_cap.png +0 -0
- data/public/images/cms/top_cap_content.png +0 -0
- data/public/images/cms/top_cap_menu_header.png +0 -0
- data/public/images/cms/user_search_submit.gif +0 -0
- data/public/images/cms/usercontrols_bg.png +0 -0
- data/public/images/cms/usercontrols_bg_cap.png +0 -0
- data/public/javascripts/cms/application.js +148 -0
- data/public/javascripts/cms/content_library.js +36 -0
- data/public/javascripts/cms/editor.js +50 -0
- data/public/javascripts/cms/sitemap.js +438 -0
- data/public/javascripts/jquery-ui.js +298 -0
- data/public/javascripts/jquery.contextMenu.js +211 -0
- data/public/javascripts/jquery.cookie.js +96 -0
- data/public/javascripts/jquery.dimensions.js +119 -0
- data/public/javascripts/jquery.js +19 -0
- data/public/javascripts/jquery.selectbox-1.0.js +246 -0
- data/public/javascripts/jquery.taglist.js +136 -0
- data/public/javascripts/jquery.thickbox.js +10 -0
- data/public/site/customconfig.js +1 -0
- data/public/stylesheets/cms/administration.css +91 -0
- data/public/stylesheets/cms/application.css +166 -0
- data/public/stylesheets/cms/block.css +26 -0
- data/public/stylesheets/cms/buttons.css +120 -0
- data/public/stylesheets/cms/content_library.css +139 -0
- data/public/stylesheets/cms/content_types.css +4 -0
- data/public/stylesheets/cms/dashboard.css +118 -0
- data/public/stylesheets/cms/data_table.css +156 -0
- data/public/stylesheets/cms/date_picker.css +78 -0
- data/public/stylesheets/cms/form_layout.css +279 -0
- data/public/stylesheets/cms/jquery.contextMenu.css +61 -0
- data/public/stylesheets/cms/login.css +78 -0
- data/public/stylesheets/cms/menu.css +116 -0
- data/public/stylesheets/cms/nav.css +99 -0
- data/public/stylesheets/cms/page_toolbar.css +135 -0
- data/public/stylesheets/cms/reset.css +46 -0
- data/public/stylesheets/cms/selectbox.css +56 -0
- data/public/stylesheets/cms/sitemap.css +390 -0
- data/public/stylesheets/cms/taglist.css +18 -0
- data/public/stylesheets/cms/thickbox.css +163 -0
- data/public/themes/blue_steel/images/logo.jpg +0 -0
- data/public/themes/blue_steel/images/splash.jpg +0 -0
- data/public/themes/blue_steel/stylesheets/style.css +257 -0
- data/rails/init.rb +3 -0
- data/rails_generators/browser_cms/USAGE +2 -0
- data/rails_generators/browser_cms/browser_cms_generator.rb +35 -0
- data/rails_generators/browser_cms/templates/README +1 -0
- data/rails_generators/browser_cms_demo_site/USAGE +1 -0
- data/rails_generators/browser_cms_demo_site/browser_cms_demo_site_generator.rb +63 -0
- data/rails_generators/browser_cms_demo_site/templates/migration.rb +21 -0
- data/rails_generators/content_block/USAGE +32 -0
- data/rails_generators/content_block/content_block_generator.rb +69 -0
- data/rails_generators/content_block/templates/_form.html.erb +22 -0
- data/rails_generators/content_block/templates/content_block.rb +27 -0
- data/rails_generators/content_block/templates/controller.rb +2 -0
- data/rails_generators/content_block/templates/functional_test.erb +11 -0
- data/rails_generators/content_block/templates/migration.rb +38 -0
- data/rails_generators/content_block/templates/render.html.erb +14 -0
- data/rails_generators/content_block/templates/unit_test.erb +9 -0
- data/rails_generators/portlet/USAGE +37 -0
- data/rails_generators/portlet/portlet_generator.rb +31 -0
- data/rails_generators/portlet/templates/_form.html.erb +5 -0
- data/rails_generators/portlet/templates/portlet.rb +10 -0
- data/rails_generators/portlet/templates/render.html.erb +1 -0
- data/rails_generators/portlet/templates/unit_test.erb +9 -0
- data/templates/blank.rb +30 -0
- data/templates/demo.rb +28 -0
- data/templates/module.rb +945 -0
- data/test/custom_assertions.rb +68 -0
- data/test/factories.rb +109 -0
- data/test/functional/cms/cache_controller_test.rb +14 -0
- data/test/functional/cms/categories_controller_test.rb +25 -0
- data/test/functional/cms/connectors_controller_test.rb +60 -0
- data/test/functional/cms/content_block_controller_test.rb +120 -0
- data/test/functional/cms/content_controller_test.rb +434 -0
- data/test/functional/cms/content_types_controller_test.rb +18 -0
- data/test/functional/cms/dashboard_controller_test.rb +17 -0
- data/test/functional/cms/dynamic_views_controller_test.rb +28 -0
- data/test/functional/cms/file_blocks_controller_test.rb +51 -0
- data/test/functional/cms/groups_controller_test.rb +50 -0
- data/test/functional/cms/home_controller_test.rb +156 -0
- data/test/functional/cms/html_blocks_controller_test.rb +163 -0
- data/test/functional/cms/image_blocks_controller_test.rb +75 -0
- data/test/functional/cms/links_controller_test.rb +148 -0
- data/test/functional/cms/pages_controller_test.rb +227 -0
- data/test/functional/cms/portlets_controller_test.rb +67 -0
- data/test/functional/cms/section_nodes_controller_test.rb +84 -0
- data/test/functional/cms/sections_controller_test.rb +225 -0
- data/test/functional/cms/sessions_controller_test.rb +76 -0
- data/test/functional/cms/toolbar_controller_test.rb +64 -0
- data/test/functional/cms/users_controller_test.rb +231 -0
- data/test/functional/tests/pretend_controller_test.rb +54 -0
- data/test/integration/cms/ckeditor_test.rb +20 -0
- data/test/integration/cms/password_management_test.rb +57 -0
- data/test/integration/login_test.rb +14 -0
- data/test/test_helper.rb +175 -0
- data/test/test_logging.rb +67 -0
- data/test/unit/behaviors/attaching_test.rb +359 -0
- data/test/unit/behaviors/dynamic_attributes_test.rb +38 -0
- data/test/unit/behaviors/publishable_test.rb +53 -0
- data/test/unit/behaviors/searching_test.rb +102 -0
- data/test/unit/behaviors/taggable_test.rb +109 -0
- data/test/unit/extensions/active_record/base_test.rb +10 -0
- data/test/unit/extensions/hash_test.rb +17 -0
- data/test/unit/extensions/integer_test.rb +10 -0
- data/test/unit/helpers/application_helper_test.rb +77 -0
- data/test/unit/helpers/form_builder_test.rb +36 -0
- data/test/unit/helpers/menu_helper_test.rb +225 -0
- data/test/unit/helpers/page_helper_test.rb +65 -0
- data/test/unit/helpers/path_helper_test.rb +57 -0
- data/test/unit/lib/acts_as_content_page_test.rb +72 -0
- data/test/unit/lib/cms_domain_support_test.rb +43 -0
- data/test/unit/lib/content_block_test.rb +203 -0
- data/test/unit/lib/content_rendering_support_test.rb +40 -0
- data/test/unit/lib/generators_test.rb +40 -0
- data/test/unit/lib/routes_test.rb +57 -0
- data/test/unit/models/attachment_test.rb +96 -0
- data/test/unit/models/category_test.rb +40 -0
- data/test/unit/models/category_type_test.rb +8 -0
- data/test/unit/models/connector_test.rb +152 -0
- data/test/unit/models/content_type_test.rb +44 -0
- data/test/unit/models/email_page_portlet_test.rb +14 -0
- data/test/unit/models/file_block_test.rb +211 -0
- data/test/unit/models/group_test.rb +13 -0
- data/test/unit/models/html_block_test.rb +102 -0
- data/test/unit/models/link_test.rb +8 -0
- data/test/unit/models/page_partial_test.rb +29 -0
- data/test/unit/models/page_route_test.rb +29 -0
- data/test/unit/models/page_template_test.rb +37 -0
- data/test/unit/models/page_test.rb +726 -0
- data/test/unit/models/permission_test.rb +10 -0
- data/test/unit/models/portlet_test.rb +69 -0
- data/test/unit/models/section_node_test.rb +92 -0
- data/test/unit/models/sections_test.rb +137 -0
- data/test/unit/models/site_test.rb +50 -0
- data/test/unit/models/task_test.rb +126 -0
- data/test/unit/models/user_test.rb +239 -0
- data/test/unit/schema_statements_test.rb +41 -0
- metadata +1131 -0
data/lib/browsercms.rb
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'cms/extensions'
|
|
2
|
+
require 'cms/init'
|
|
3
|
+
require 'cms/routes'
|
|
4
|
+
require 'cms/caching'
|
|
5
|
+
|
|
6
|
+
#Load libraries that are included with CMS
|
|
7
|
+
require 'acts_as_list'
|
|
8
|
+
ActiveRecord::Base.send(:include, ActsAsList)
|
|
9
|
+
|
|
10
|
+
#Include CMS Behaviors
|
|
11
|
+
ActiveRecord::Base.send(:include, Cms::Acts::ContentBlock)
|
|
12
|
+
require 'cms/behaviors'
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
module Acts
|
|
3
|
+
module ContentBlock
|
|
4
|
+
def self.included(model_class)
|
|
5
|
+
model_class.extend(MacroMethods)
|
|
6
|
+
end
|
|
7
|
+
module MacroMethods
|
|
8
|
+
def acts_as_content_block(options={})
|
|
9
|
+
belongs_to_attachment(options[:belongs_to_attachment].is_a?(Hash) ? options[:belongs_to_attachment] : {}) if options[:belongs_to_attachment]
|
|
10
|
+
is_archivable(options[:archiveable].is_a?(Hash) ? options[:archiveable] : {}) unless options[:archiveable] == false
|
|
11
|
+
is_connectable(options[:connectable].is_a?(Hash) ? options[:connectable] : {}) unless options[:connectable] == false
|
|
12
|
+
flush_cache_on_change(options[:flush_cache_on_change].is_a?(Hash) ? options[:flush_cache_on_change] : {}) unless options[:flush_cache_on_change] == false
|
|
13
|
+
is_renderable({:instance_variable_name_for_view => "@content_block"}.merge(options[:renderable].is_a?(Hash) ? options[:renderable] : {})) unless options[:renderable] == false
|
|
14
|
+
is_publishable(options[:publishable].is_a?(Hash) ? options[:publishable] : {}) unless options[:publishable] == false
|
|
15
|
+
is_searchable(options[:searchable].is_a?(Hash) ? options[:searchable] : {}) unless options[:searchable] == false
|
|
16
|
+
uses_soft_delete(options[:soft_delete].is_a?(Hash) ? options[:soft_delete] : {}) unless options[:soft_delete] == false
|
|
17
|
+
is_taggable(options[:taggable].is_a?(Hash) ? options[:taggable] : {}) if options[:taggable]
|
|
18
|
+
is_userstamped(options[:userstamped].is_a?(Hash) ? options[:userstamped] : {}) unless options[:userstamped] == false
|
|
19
|
+
is_versioned(options[:versioned].is_a?(Hash) ? options[:versioned] : {}) unless options[:versioned] == false
|
|
20
|
+
|
|
21
|
+
include InstanceMethods
|
|
22
|
+
end
|
|
23
|
+
module InstanceMethods
|
|
24
|
+
def to_s
|
|
25
|
+
"#{self.class.name.titleize} '#{name}'"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Can be included into Controllers in your project to allow them to act as though they are CMS pages.
|
|
3
|
+
# This means they can be:
|
|
4
|
+
#
|
|
5
|
+
# 1. Marked as having requiring permission as though they were in a particular section.
|
|
6
|
+
# 2. Handle errors thrown from within the methods in the same way that CMS Pages do.
|
|
7
|
+
# 3. Use CMS page templates as layouts (like TemplateSupport)
|
|
8
|
+
#
|
|
9
|
+
# This is intend to replace and deprecate TemplateSupport (which will be supported for a while for backwards compatibility)
|
|
10
|
+
#
|
|
11
|
+
# Minor Issue:
|
|
12
|
+
# Error handling for Page not found behaves slightly differently than ContentController currently. If the user is logged
|
|
13
|
+
# in as an editor, they will get a 500 page rather than 404. This would require reworking how the error processing
|
|
14
|
+
# works in Cms::ContentRenderingSupport.
|
|
15
|
+
module Cms
|
|
16
|
+
module Acts
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
module ContentPage
|
|
20
|
+
|
|
21
|
+
def self.included(base)
|
|
22
|
+
base.send :include, Cms::ContentRenderingSupport
|
|
23
|
+
base.send :include, Cms::Authentication::Controller
|
|
24
|
+
base.extend ClassMethods
|
|
25
|
+
|
|
26
|
+
base.helper Cms::PageHelper
|
|
27
|
+
base.helper Cms::RenderingHelper
|
|
28
|
+
base.helper Cms::MenuHelper
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Before filter that determines if the current user can access a specific section.
|
|
32
|
+
def check_access_to_section
|
|
33
|
+
user = current_user
|
|
34
|
+
logger.warn "Checking that current_user '#{user.login}' has access to view section with path '#{self.class.in_section}'."
|
|
35
|
+
unless user.able_to_view?(self.class.in_section)
|
|
36
|
+
store_location
|
|
37
|
+
raise Cms::Errors::AccessDenied
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
module ClassMethods
|
|
42
|
+
|
|
43
|
+
# Requires that some or all of the actions on this controller require the same permissions as a specific section of the website.
|
|
44
|
+
# Note that section paths aren't currently unique so the 'first' section found will be looked at.
|
|
45
|
+
#
|
|
46
|
+
# Params:
|
|
47
|
+
# path - Should match the 'path' attribute for a given section.
|
|
48
|
+
# options - Hash of options that will be passed to the before_filter call. See before_filter for valid options.
|
|
49
|
+
#
|
|
50
|
+
# Example:
|
|
51
|
+
# MyController < ApplicationController
|
|
52
|
+
# include Cms::Acts::ContentPage
|
|
53
|
+
# requires_permission_for_section "/somepath", :except=>"action_name"
|
|
54
|
+
# ...
|
|
55
|
+
#
|
|
56
|
+
def requires_permission_for_section(path, options={})
|
|
57
|
+
logger.warn "Setting path #{path}"
|
|
58
|
+
@section_path = path
|
|
59
|
+
before_filter :check_access_to_section, options
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def in_section
|
|
63
|
+
@section_path
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Defines the authentication behavior for controllers in BrowserCMS. It can be added to any controller that needs to
|
|
3
|
+
# hook into the BrowserCMS Authentication behavior like so:
|
|
4
|
+
#
|
|
5
|
+
# class MySuperSecureController < ApplicationController
|
|
6
|
+
# include Cms::Authentication::Controller
|
|
7
|
+
#
|
|
8
|
+
# It is based off Restful_Authentication, and adds in behavior to deal with several concepts specific to BrowserCMS.
|
|
9
|
+
#
|
|
10
|
+
# (Note: 10/8/09 - I was comparing this to a very old version of the generated code from Restful_Authentication,
|
|
11
|
+
# so some of the following items may be 'stock' to that. (Especially #2)
|
|
12
|
+
#
|
|
13
|
+
# 1. Guests - These represents users that are not logged in. What guests can see and do can be modified via the CMS UI. Guests
|
|
14
|
+
# are not considered to be 'logged in'.
|
|
15
|
+
# 2. 'Current' User - The currently logged in user is stored in a thread local, and can be accessed anywhere via 'User.current'.
|
|
16
|
+
# This allows model code to easily record which user is making changes to records, for versioning, etc.
|
|
17
|
+
#
|
|
18
|
+
# 3. 'Admin' Access Denied Page - If users try to access a protected controller, they are redirected to the CMS administration Login page
|
|
19
|
+
# which may be different than the 'front end' user login page. (Cms::Controller handles that differently)
|
|
20
|
+
#
|
|
21
|
+
#
|
|
22
|
+
# To Dos: It appears as though we are storing the 'current' user in two places, @current_user and User.current. This is probably not DRY, but
|
|
23
|
+
# more testing would be needed.
|
|
24
|
+
#
|
|
25
|
+
module Cms
|
|
26
|
+
module Authentication
|
|
27
|
+
module Controller
|
|
28
|
+
protected
|
|
29
|
+
# Returns true or false if the user is logged in.
|
|
30
|
+
# Preloads User.current with the user model if they're logged in.
|
|
31
|
+
def logged_in?
|
|
32
|
+
!current_user.nil? && !current_user.guest?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Accesses the current user from the session or 'remember me' cookie.
|
|
36
|
+
# If the user is not logged in, this will be set to the guest user, which represents a public
|
|
37
|
+
# user, who will likely have more limited permissions
|
|
38
|
+
def current_user
|
|
39
|
+
# Note: We have disabled basic_http_auth
|
|
40
|
+
@current_user ||= begin
|
|
41
|
+
User.current = (login_from_session || login_from_cookie || User.guest)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Store the given user id in the session.
|
|
46
|
+
def current_user=(new_user)
|
|
47
|
+
session[:user_id] = new_user ? new_user.id : nil
|
|
48
|
+
@current_user = new_user || false
|
|
49
|
+
@current_user = User.current
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Check if the user is authorized
|
|
53
|
+
#
|
|
54
|
+
# Override this method in your controllers if you want to restrict access
|
|
55
|
+
# to only a few actions or if you want to check if the user
|
|
56
|
+
# has the correct rights.
|
|
57
|
+
#
|
|
58
|
+
# Example:
|
|
59
|
+
#
|
|
60
|
+
# # only allow nonbobs
|
|
61
|
+
# def authorized?
|
|
62
|
+
# current_user.login != "bob"
|
|
63
|
+
# end
|
|
64
|
+
#
|
|
65
|
+
def authorized?(action=nil, resource=nil, *args)
|
|
66
|
+
logged_in?
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Filter method to enforce a login requirement.
|
|
70
|
+
#
|
|
71
|
+
# To require logins for all actions, use this in your controllers:
|
|
72
|
+
#
|
|
73
|
+
# before_filter :login_required
|
|
74
|
+
#
|
|
75
|
+
# To require logins for specific actions, use this in your controllers:
|
|
76
|
+
#
|
|
77
|
+
# before_filter :login_required, :only => [ :edit, :update ]
|
|
78
|
+
#
|
|
79
|
+
# To skip this in a subclassed controller:
|
|
80
|
+
#
|
|
81
|
+
# skip_before_filter :login_required
|
|
82
|
+
#
|
|
83
|
+
def login_required
|
|
84
|
+
authorized? || access_denied
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Redirect as appropriate when an access request fails.
|
|
88
|
+
#
|
|
89
|
+
# The default action is to redirect to the BrowserCMS admin login screen.
|
|
90
|
+
#
|
|
91
|
+
# Override this method in your controllers if you want to have special
|
|
92
|
+
# behavior in case the user is not authorized
|
|
93
|
+
# to access the requested action. For example, a popup window might
|
|
94
|
+
# simply close itself.
|
|
95
|
+
def access_denied
|
|
96
|
+
respond_to do |format|
|
|
97
|
+
format.html do
|
|
98
|
+
store_location
|
|
99
|
+
redirect_to cms_login_path
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Store the URI of the current request in the session.
|
|
105
|
+
#
|
|
106
|
+
# We can return to this location by calling #redirect_back_or_default.
|
|
107
|
+
def store_location
|
|
108
|
+
session[:return_to] = request.request_uri
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Redirect to the URI stored by the most recent store_location call or
|
|
112
|
+
# to the passed default. Set an appropriately modified
|
|
113
|
+
# after_filter :store_location, :only => [:index, :new, :show, :edit]
|
|
114
|
+
# for any controller you want to be bounce-backable.
|
|
115
|
+
def redirect_back_or_default(default)
|
|
116
|
+
redirect_to(session[:return_to] || default)
|
|
117
|
+
session[:return_to] = nil
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Inclusion hook to make #current_user and #logged_in?
|
|
121
|
+
# available as ActionView helper methods.
|
|
122
|
+
def self.included(base)
|
|
123
|
+
base.send :helper_method, :current_user, :logged_in?, :authorized? if base.respond_to? :helper_method
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
#
|
|
127
|
+
# Login
|
|
128
|
+
#
|
|
129
|
+
|
|
130
|
+
# Called from #current_user. First attempt to login by the user id stored in the session.
|
|
131
|
+
def login_from_session
|
|
132
|
+
self.current_user = User.find_by_id(session[:user_id]) if session[:user_id]
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Called from #current_user. Now, attempt to login by basic authentication information.
|
|
136
|
+
def login_from_basic_auth
|
|
137
|
+
authenticate_with_http_basic do |login, password|
|
|
138
|
+
self.current_user = User.authenticate(login, password)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
#
|
|
143
|
+
# Logout
|
|
144
|
+
#
|
|
145
|
+
|
|
146
|
+
# Called from #current_user. Finaly, attempt to login by an expiring token in the cookie.
|
|
147
|
+
# for the paranoid: we _should_ be storing user_token = hash(cookie_token, request IP)
|
|
148
|
+
def login_from_cookie
|
|
149
|
+
user = cookies[:auth_token] && User.find_by_remember_token(cookies[:auth_token])
|
|
150
|
+
if user && user.remember_token?
|
|
151
|
+
self.current_user = user
|
|
152
|
+
handle_remember_cookie! false # freshen cookie token (keeping date)
|
|
153
|
+
self.current_user
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# This is ususally what you want; resetting the session willy-nilly wreaks
|
|
158
|
+
# havoc with forgery protection, and is only strictly necessary on login.
|
|
159
|
+
# However, **all session state variables should be unset here**.
|
|
160
|
+
def logout_keeping_session!
|
|
161
|
+
# Kill server-side auth cookie
|
|
162
|
+
User.current.forget_me if User.current.is_a? User
|
|
163
|
+
User.current = false # not logged in, and don't do it for me
|
|
164
|
+
kill_remember_cookie! # Kill client-side auth cookie
|
|
165
|
+
session[:user_id] = nil # keeps the session but kill our variable
|
|
166
|
+
# explicitly kill any other session variables you set
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# The session should only be reset at the tail end of a form POST --
|
|
170
|
+
# otherwise the request forgery protection fails. It's only really necessary
|
|
171
|
+
# when you cross quarantine (logged-out to logged-in).
|
|
172
|
+
def logout_killing_session!
|
|
173
|
+
logout_keeping_session!
|
|
174
|
+
reset_session
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
#
|
|
178
|
+
# Remember_me Tokens
|
|
179
|
+
#
|
|
180
|
+
# Cookies shouldn't be allowed to persist past their freshness date,
|
|
181
|
+
# and they should be changed at each login
|
|
182
|
+
|
|
183
|
+
# Cookies shouldn't be allowed to persist past their freshness date,
|
|
184
|
+
# and they should be changed at each login
|
|
185
|
+
def valid_remember_cookie?
|
|
186
|
+
return nil unless User.current
|
|
187
|
+
(User.current.remember_token?) &&
|
|
188
|
+
(cookies[:auth_token] == User.current.remember_token)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Refresh the cookie auth token if it exists, create it otherwise
|
|
192
|
+
def handle_remember_cookie! new_cookie_flag
|
|
193
|
+
return unless User.current
|
|
194
|
+
case
|
|
195
|
+
when valid_remember_cookie? then User.current.refresh_token # keeping same expiry date
|
|
196
|
+
when new_cookie_flag then User.current.remember_me
|
|
197
|
+
else User.current.forget_me
|
|
198
|
+
end
|
|
199
|
+
send_remember_cookie!
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def kill_remember_cookie!
|
|
203
|
+
cookies.delete :auth_token
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def send_remember_cookie!
|
|
207
|
+
cookies[:auth_token] = {
|
|
208
|
+
:value => User.current.remember_token,
|
|
209
|
+
:expires => User.current.remember_token_expires_at }
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
module Authentication
|
|
3
|
+
module Model
|
|
4
|
+
def self.included(model_class)
|
|
5
|
+
model_class.extend ClassMethods
|
|
6
|
+
model_class.class_eval do
|
|
7
|
+
include InstanceMethods
|
|
8
|
+
|
|
9
|
+
# Virtual attribute for the unencrypted password
|
|
10
|
+
attr_accessor :password
|
|
11
|
+
validates_presence_of :password, :if => :password_required?
|
|
12
|
+
validates_presence_of :password_confirmation, :if => :password_required?
|
|
13
|
+
validates_confirmation_of :password, :if => :password_required?
|
|
14
|
+
#validates_length_of :password, :within => 6..40, :if => :password_required?
|
|
15
|
+
before_save :encrypt_password
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module ClassMethods
|
|
20
|
+
def authenticate(login, password)
|
|
21
|
+
u = find_by_login(login) # need to get the salt
|
|
22
|
+
u && u.authenticated?(password) && !u.expired? ? u : nil
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
#Method to make it easy to change a user's password from the console, not used in the app
|
|
26
|
+
def change_password(login, new_password)
|
|
27
|
+
find_by_login(login).change_password(new_password)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def make_token
|
|
31
|
+
secure_digest(Time.now, (1..10).map{ rand.to_s })
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def password_digest(password, salt)
|
|
35
|
+
key = '8771d0d9bef6f1091b723d2e701a17c811d69b26'
|
|
36
|
+
digest = key
|
|
37
|
+
10.times do
|
|
38
|
+
digest = secure_digest(digest, salt, password, key)
|
|
39
|
+
end
|
|
40
|
+
digest
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def secure_digest(*args)
|
|
44
|
+
Digest::SHA1.hexdigest(args.flatten.join('--'))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
module InstanceMethods
|
|
50
|
+
#Method to make it easy to change a user's password from the console, not used in the app
|
|
51
|
+
def change_password(new_password)
|
|
52
|
+
update_attributes(:password => new_password, :password_confirmation => new_password)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Encrypts the password with the user salt
|
|
56
|
+
def encrypt(password)
|
|
57
|
+
self.class.password_digest(password, salt)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def authenticated?(password)
|
|
61
|
+
crypted_password == encrypt(password)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# before filter
|
|
65
|
+
def encrypt_password
|
|
66
|
+
return if password.blank?
|
|
67
|
+
self.salt = self.class.make_token if new_record?
|
|
68
|
+
self.crypted_password = encrypt(password)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def password_required?
|
|
72
|
+
crypted_password.blank? || !password.blank?
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def remember_token?
|
|
76
|
+
(!remember_token.blank?) &&
|
|
77
|
+
remember_token_expires_at && (Time.now.utc < remember_token_expires_at.utc)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# These create and unset the fields required for remembering users between browser closes
|
|
81
|
+
def remember_me
|
|
82
|
+
remember_me_for 2.weeks
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def remember_me_for(time)
|
|
86
|
+
remember_me_until time.from_now.utc
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def remember_me_until(time)
|
|
90
|
+
self.remember_token_expires_at = time
|
|
91
|
+
self.remember_token = self.class.make_token
|
|
92
|
+
save
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# refresh token (keeping same expires_at) if it exists
|
|
96
|
+
def refresh_token
|
|
97
|
+
if remember_token?
|
|
98
|
+
self.remember_token = self.class.make_token
|
|
99
|
+
save
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
#
|
|
104
|
+
# Deletes the server-side record of the authentication token. The
|
|
105
|
+
# client-side (browser cookie) and server-side (this remember_token) must
|
|
106
|
+
# always be deleted together.
|
|
107
|
+
#
|
|
108
|
+
def forget_me
|
|
109
|
+
self.remember_token_expires_at = nil
|
|
110
|
+
self.remember_token = nil
|
|
111
|
+
save
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Behaviors are used in CMS to add features to a model.
|
|
2
|
+
# They are very similar to the various "acts_as_*" or "*_fu" plugins/gems
|
|
3
|
+
# that have been created for Rails.
|
|
4
|
+
#
|
|
5
|
+
# Generally, each behavior has three modules in it. They are:
|
|
6
|
+
# * MacroMethods
|
|
7
|
+
# * ClassMethods
|
|
8
|
+
# * InstanceMethods
|
|
9
|
+
#
|
|
10
|
+
# When the CMS starts up, all of the Behaviors are included into ActiveRecord::Base.
|
|
11
|
+
# The MacroMethods module of each Behavior is also included into ActiveRecord::Base.
|
|
12
|
+
# The MacroMethods module contains Class methods that you can call within your model
|
|
13
|
+
# in order to enable that Behavior for that Class. For example, if you want to have
|
|
14
|
+
# an Article module that is taggable, you would do this:
|
|
15
|
+
#
|
|
16
|
+
# class Article < ActiveRecord::Base
|
|
17
|
+
# is_taggable
|
|
18
|
+
# end
|
|
19
|
+
#
|
|
20
|
+
# So in this case, you are calling the `is_taggable` macro method, which enables the
|
|
21
|
+
# taggable behavior for the Article model. It enables the behavior by extending the
|
|
22
|
+
# ClassMethods module and including the InstanceMethods module into the Article class.
|
|
23
|
+
# Each Behavior typically has one macro method which takes an options Hash, which of course
|
|
24
|
+
# varies from Behavior to Behavior. The macro method will also sometimes call other
|
|
25
|
+
# macro methods, like before_fitler, named_scope, etc. to modify the model.
|
|
26
|
+
# Consult the documentation for each module for specific details as to what
|
|
27
|
+
# the Behavior does.
|
|
28
|
+
module Cms::Behaviors; end
|
|
29
|
+
|
|
30
|
+
Dir["#{File.dirname(__FILE__)}/behaviors/*.rb"].each do |b|
|
|
31
|
+
require File.join("cms", "behaviors", File.basename(b, ".rb"))
|
|
32
|
+
ActiveRecord::Base.send(:include, "Cms::Behaviors::#{File.basename(b, ".rb").camelize}".constantize)
|
|
33
|
+
end
|