infopark_cloud_connector 6.9.4 → 6.9.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/README +1 -3
- data/app/controllers/cms_controller.rb +7 -0
- data/app/controllers/rails_connector/default_cms_controller.rb +43 -0
- data/app/controllers/rails_connector/objs_controller.rb +29 -0
- data/app/controllers/rails_connector/widget_renderer.rb +1 -1
- data/app/controllers/rails_connector/workspaces_controller.rb +4 -0
- data/app/helpers/cms_helper.rb +7 -0
- data/app/helpers/cms_routing_helper.rb +7 -0
- data/app/helpers/rails_connector/cms_asset_helper.rb +24 -17
- data/app/helpers/rails_connector/cms_tag_helper.rb +9 -6
- data/app/helpers/rails_connector/default_cms_helper.rb +23 -0
- data/app/helpers/rails_connector/default_cms_routing_helper.rb +101 -0
- data/app/helpers/rails_connector/display_helper.rb +4 -30
- data/app/helpers/rails_connector/editing_helper.rb +3 -0
- data/app/helpers/rails_connector/layout_helper.rb +29 -0
- data/app/helpers/rails_connector/table_of_contents_helper.rb +22 -0
- data/app/models/named_link.rb +2 -0
- data/app/views/cms/_index.html.erb +7 -0
- data/app/views/cms/index.html.erb +1 -0
- data/app/views/errors/403_forbidden.html.erb +3 -0
- data/app/views/errors/410_gone.html.erb +7 -0
- data/app/views/rails_connector/_editing_javascript.html.erb +2 -0
- data/config/ca-bundle.crt +1 -1
- data/config/cms_routes.rb +14 -0
- data/config/locales/de.rails_connector.errors.yml +11 -0
- data/config/locales/de.rails_connector.lib.yml +6 -0
- data/config/locales/de.rails_connector.views.yml +9 -0
- data/config/locales/en.rails_connector.errors.yml +10 -0
- data/config/locales/en.rails_connector.lib.yml +6 -0
- data/config/locales/en.rails_connector.views.yml +9 -0
- data/config/routes.rb +4 -0
- data/lib/assets/javascripts/infopark_editing.js +689 -285
- data/lib/assets/stylesheets/infopark_editing.css +17 -0
- data/lib/infopark_cloud_connector.rb +22 -0
- data/lib/obj.rb +3 -0
- data/lib/rails_connector/attribute_content.rb +190 -0
- data/lib/rails_connector/authenticable.rb +30 -0
- data/lib/rails_connector/basic_obj.rb +25 -139
- data/lib/rails_connector/basic_widget.rb +35 -0
- data/lib/rails_connector/cms_accessible.rb +114 -0
- data/lib/rails_connector/cms_cache_storage.rb +1 -1
- data/lib/rails_connector/cms_dispatch_controller.rb +46 -0
- data/lib/rails_connector/cms_env.rb +68 -0
- data/lib/rails_connector/cms_test_request.rb +23 -0
- data/lib/rails_connector/configuration.rb +3 -2
- data/lib/rails_connector/core_extensions.rb +1 -0
- data/lib/rails_connector/core_extensions/time.rb +18 -0
- data/lib/rails_connector/date_attribute.rb +1 -17
- data/lib/rails_connector/engine.rb +57 -0
- data/lib/rails_connector/html_string.rb +19 -0
- data/lib/rails_connector/link.rb +102 -17
- data/lib/rails_connector/link_resolvable.rb +9 -0
- data/lib/rails_connector/migrations/migrator.rb +8 -4
- data/lib/rails_connector/migrations/workspace_lock.rb +3 -2
- data/lib/rails_connector/named_link.rb +1 -1
- data/lib/rails_connector/obj_data_from_service.rb +18 -0
- data/lib/rails_connector/string_tagging.rb +29 -0
- data/lib/rails_connector/type_computer.rb +30 -0
- data/lib/widget.rb +3 -0
- metadata +103 -18
@@ -0,0 +1,35 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
class BasicWidget
|
4
|
+
include AttributeContent
|
5
|
+
|
6
|
+
def self.type_computer
|
7
|
+
@_type_computer ||= TypeComputer.new(RailsConnector::BasicWidget, ::Widget)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.reset_type_computer!
|
11
|
+
@_type_computer = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_accessor :id, :obj
|
15
|
+
|
16
|
+
alias_method :initialize, :update_data
|
17
|
+
|
18
|
+
def obj_class
|
19
|
+
data_from_cms.value_of('_obj_class')
|
20
|
+
end
|
21
|
+
|
22
|
+
def ==(other)
|
23
|
+
other.respond_to?(:obj) && obj == other.obj && other.respond_to?(:id) && id == other.id
|
24
|
+
end
|
25
|
+
|
26
|
+
def eql?(other)
|
27
|
+
self == other
|
28
|
+
end
|
29
|
+
|
30
|
+
def hash
|
31
|
+
(id + obj.id).hash
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
# @api public
|
4
|
+
module CmsAccessible
|
5
|
+
|
6
|
+
protected
|
7
|
+
|
8
|
+
# Filter method to load a CMS object.
|
9
|
+
#
|
10
|
+
# To require the loading for all actions, use this in your controllers:
|
11
|
+
# before_filter :load_object
|
12
|
+
def load_object
|
13
|
+
CmsEnv.new(request.env).load
|
14
|
+
loaded_obj = request.env[CmsEnv::OBJ_ENV_KEY]
|
15
|
+
raise loaded_obj if loaded_obj.is_a?(StandardError)
|
16
|
+
@obj = loaded_obj
|
17
|
+
end
|
18
|
+
|
19
|
+
# Filter method to check if the already loaded object is active. If it is
|
20
|
+
# not, a 410 Gone error message will be generate (by calling render_obj_error).
|
21
|
+
#
|
22
|
+
# To require the check for all actions, use this in your controllers:
|
23
|
+
# before_filter :load_object
|
24
|
+
# before_filter :ensure_object_is_active
|
25
|
+
def ensure_object_is_active
|
26
|
+
unless @obj.active?
|
27
|
+
@valid_from = @obj.valid_from
|
28
|
+
@valid_until = @obj.valid_until
|
29
|
+
@obj = nil
|
30
|
+
render_obj_error(410, "gone")
|
31
|
+
return false
|
32
|
+
end
|
33
|
+
return true
|
34
|
+
end
|
35
|
+
|
36
|
+
# Filter method to check if access to the loaded object is permitted. If it is
|
37
|
+
# not, a 403 Forbidden error message will be generated (by calling render_obj_error)
|
38
|
+
#
|
39
|
+
# To require the check for all actions, use this in your controllers:
|
40
|
+
# before_filter :load_object
|
41
|
+
# before_filter :ensure_object_is_permitted
|
42
|
+
def ensure_object_is_permitted
|
43
|
+
unless is_permitted(@obj)
|
44
|
+
@obj = nil
|
45
|
+
render_obj_error(403, "forbidden")
|
46
|
+
return false
|
47
|
+
end
|
48
|
+
return true
|
49
|
+
end
|
50
|
+
|
51
|
+
# This method is called when rendering an error caused by either {ensure_object_is_permitted}
|
52
|
+
# or {ensure_object_is_active} before filter. It renders an error template located in
|
53
|
+
# "errors/*.html.erb" with given HTTP status and content type "text/html" and with no layout.
|
54
|
+
# Overwrite this method to change the error page.
|
55
|
+
# @api public
|
56
|
+
def render_obj_error(status, name)
|
57
|
+
force_html_format
|
58
|
+
render(
|
59
|
+
:template => "errors/#{status}_#{name}",
|
60
|
+
:layout => false,
|
61
|
+
:status => status,
|
62
|
+
:content_type => Mime::HTML
|
63
|
+
)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Enforce "html" as template format.
|
67
|
+
# @api public
|
68
|
+
def force_html_format
|
69
|
+
request.format = :html
|
70
|
+
end
|
71
|
+
|
72
|
+
# Inclusion hook to make is_permitted available as helper method.
|
73
|
+
def self.included(base)
|
74
|
+
base.__send__ :helper_method, :is_permitted
|
75
|
+
end
|
76
|
+
|
77
|
+
# Helper method to check live permissions
|
78
|
+
def is_permitted(obj)
|
79
|
+
obj.permitted_for_user?(current_user)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Filter method which sets the header 'X-Robots-Tag: unavailable_after'
|
83
|
+
# to the valid_until date of the current object.
|
84
|
+
def set_google_expire_header
|
85
|
+
if @obj && (date = @obj.valid_until)
|
86
|
+
headers['X-Robots-Tag: unavailable_after'] = date.rfc822
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Deliver the obj's body as response by file or data.
|
91
|
+
# May respond with status 304 if a If-Modified-Since header is found.
|
92
|
+
# @api public
|
93
|
+
def deliver_file
|
94
|
+
if @obj.body_data_url
|
95
|
+
redirect_to enforce_protocol_from_request(@obj.body_data_url)
|
96
|
+
elsif stale?(:last_modified => @obj.last_changed.utc)
|
97
|
+
mime_type = @obj.mime_type
|
98
|
+
mime_type += '; charset=utf-8' if mime_type =~ /^text\//
|
99
|
+
|
100
|
+
if (filepath = @obj.body_data_path).present?
|
101
|
+
send_file(File.expand_path(filepath), {
|
102
|
+
:type => mime_type,
|
103
|
+
:filename => @obj.filename,
|
104
|
+
:disposition => 'inline',
|
105
|
+
})
|
106
|
+
else
|
107
|
+
# generics should send its body, empty files should be delivered as
|
108
|
+
# empty files - and not lead to an application error
|
109
|
+
send_data @obj.body || '', :type => mime_type, :filename => @obj.filename, :disposition => 'inline'
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
class CmsDispatchController < ActionController::Metal
|
4
|
+
def process(action)
|
5
|
+
CmsEnv.new(env).load
|
6
|
+
controller = target_controller(env)
|
7
|
+
env["action_dispatch.request.path_parameters"]["controller"] = controller.controller_path
|
8
|
+
|
9
|
+
if !obj_not_found? && action == 'index'
|
10
|
+
action = loaded_obj.controller_action_name
|
11
|
+
end
|
12
|
+
|
13
|
+
env["action_dispatch.request.path_parameters"]["action"] = action
|
14
|
+
|
15
|
+
self.response = controller.action(action).call(env)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def target_controller(env)
|
21
|
+
return default_controller if obj_not_found?
|
22
|
+
controller = "#{loaded_obj.controller_name}Controller".constantize
|
23
|
+
|
24
|
+
if controller.respond_to?(:use_for_obj_dispatch?) && controller.use_for_obj_dispatch?
|
25
|
+
controller
|
26
|
+
else
|
27
|
+
default_controller
|
28
|
+
end
|
29
|
+
rescue NameError
|
30
|
+
default_controller
|
31
|
+
end
|
32
|
+
|
33
|
+
def loaded_obj
|
34
|
+
env[CmsEnv::OBJ_ENV_KEY]
|
35
|
+
end
|
36
|
+
|
37
|
+
def obj_not_found?
|
38
|
+
loaded_obj.is_a?(StandardError)
|
39
|
+
end
|
40
|
+
|
41
|
+
def default_controller
|
42
|
+
CmsController
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
class CmsEnv
|
4
|
+
|
5
|
+
OBJ_ENV_KEY = "INFOPARK_OBJ"
|
6
|
+
|
7
|
+
def initialize(env)
|
8
|
+
@env = env
|
9
|
+
end
|
10
|
+
|
11
|
+
def load
|
12
|
+
return if env[OBJ_ENV_KEY]
|
13
|
+
load_object
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
attr_reader :env
|
19
|
+
|
20
|
+
def load_object
|
21
|
+
env[OBJ_ENV_KEY] =
|
22
|
+
begin
|
23
|
+
find_obj
|
24
|
+
rescue StandardError => e
|
25
|
+
e
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def find_obj
|
30
|
+
found_obj =
|
31
|
+
if params[:id]
|
32
|
+
Obj.find(params[:id])
|
33
|
+
elsif params[:permalink].present?
|
34
|
+
self.class.find_permalink_by_param(params[:permalink])
|
35
|
+
else
|
36
|
+
if callback = RailsConnector::Configuration.choose_homepage_callback
|
37
|
+
callback_result = callback.call(env)
|
38
|
+
if callback_result.is_a?(Obj)
|
39
|
+
callback_result
|
40
|
+
else
|
41
|
+
raise "choose_homepage callback did not return an Obj. "\
|
42
|
+
"Instead saw #{callback_result.class}."
|
43
|
+
end
|
44
|
+
else
|
45
|
+
Obj.homepage
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
if found_obj.suppressed?
|
50
|
+
raise RailsConnector::ResourceNotFound,
|
51
|
+
"Tried to access Obj #{found_obj.inspect}, but it is suppressed (suppress_export is set)!"
|
52
|
+
end
|
53
|
+
|
54
|
+
found_obj
|
55
|
+
end
|
56
|
+
|
57
|
+
def params
|
58
|
+
env["action_dispatch.request.path_parameters"]
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.find_permalink_by_param(permalink_param)
|
62
|
+
permalink = Array(permalink_param).join("/")
|
63
|
+
Obj.find_by_permalink!(permalink)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
module CmsTestRequest
|
3
|
+
def for_cms_object(test_obj=nil)
|
4
|
+
# prepare the env as if the given obj was loaded by CmsEnv
|
5
|
+
env[RailsConnector::CmsEnv::OBJ_ENV_KEY] = test_obj if test_obj
|
6
|
+
class << self
|
7
|
+
# This special behaviour is necessary for testing controllers that descend from DefaultCmsController.
|
8
|
+
# These controllers do not have explicit routes by default.
|
9
|
+
# Instead, they are reached via the CmsDispatchController.
|
10
|
+
# The TestRequest must therefore use CmsDispatchController as a fallback route.
|
11
|
+
def assign_parameters(routes, controller_path, action, parameters = {})
|
12
|
+
super(routes, controller_path, action, parameters)
|
13
|
+
rescue ActionController::RoutingError, AbstractController::ActionNotFound => e
|
14
|
+
begin
|
15
|
+
super(routes, "rails_connector/cms_dispatch", action, parameters)
|
16
|
+
rescue ActionController::RoutingError, AbstractController::ActionNotFound
|
17
|
+
raise e
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -40,7 +40,7 @@ module RailsConnector
|
|
40
40
|
|
41
41
|
# The +RailsConnector+ makes heavy use of filesystem caching.
|
42
42
|
# Use this method to configure the directory that should be used to store cached data.
|
43
|
-
# By default, +RAILS_ROOT/tmp/
|
43
|
+
# By default, +RAILS_ROOT/tmp/infopark_cache+ will be used.
|
44
44
|
# @param path [String] Path to directory that should be used to store cached data.
|
45
45
|
# @example Configure +RailsConnector+ to store it's cache under +/tmp/my_cache+.
|
46
46
|
# RailsConnector::Configuration.cache_path = '/tmp/my_cache'
|
@@ -143,7 +143,8 @@ module RailsConnector
|
|
143
143
|
unless Rails.configuration.cache_classes
|
144
144
|
after_initialize
|
145
145
|
NamedLink.reset_cache
|
146
|
-
BasicObj.
|
146
|
+
BasicObj.reset_type_computer!
|
147
|
+
BasicWidget.reset_type_computer!
|
147
148
|
::ApplicationController.__send__(:helper, :cms)
|
148
149
|
end
|
149
150
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "rails_connector/core_extensions/time"
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Time
|
2
|
+
|
3
|
+
# Returns a new Time created from the ISO date format String "YYYYMMDDhhmmss"
|
4
|
+
def self.from_iso(t)
|
5
|
+
return nil unless t
|
6
|
+
if t.to_s =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/
|
7
|
+
utc($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i)
|
8
|
+
else
|
9
|
+
raise ArgumentError, "invalid iso time format: #{t}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns the Time as ISO date format String "YYYYMMDDhhmmss"
|
14
|
+
def to_iso
|
15
|
+
getutc.strftime('%Y%m%d%H%M%S')
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -2,22 +2,6 @@ module RailsConnector
|
|
2
2
|
|
3
3
|
# Adds support for string columns which contain ISO dates
|
4
4
|
module DateAttribute
|
5
|
-
module ClassMethods
|
6
|
-
def date_attribute(*names)
|
7
|
-
names.each do |name|
|
8
|
-
module_eval %Q!
|
9
|
-
def #{name}
|
10
|
-
DateAttribute.parse(#{name}_before_type_cast) unless #{name}_before_type_cast.nil?
|
11
|
-
end
|
12
|
-
!
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.included(base)
|
18
|
-
base.extend(ClassMethods)
|
19
|
-
end
|
20
|
-
|
21
5
|
def self.parse(iso_date_time)
|
22
6
|
Time.from_iso(iso_date_time).in_time_zone
|
23
7
|
rescue ArgumentError
|
@@ -25,4 +9,4 @@ module RailsConnector
|
|
25
9
|
end
|
26
10
|
end
|
27
11
|
|
28
|
-
end
|
12
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "rails"
|
2
|
+
require "action_view"
|
3
|
+
|
4
|
+
require 'jquery-rails'
|
5
|
+
|
6
|
+
require 'rails_connector/configuration'
|
7
|
+
|
8
|
+
module ::RailsConnector
|
9
|
+
class Engine < Rails::Engine
|
10
|
+
config.to_prepare { RailsConnector::Configuration.to_prepare }
|
11
|
+
config.after_initialize { RailsConnector::Configuration.after_initialize }
|
12
|
+
|
13
|
+
# make sure our exceptions cause an adequate error page and http status code
|
14
|
+
config.action_dispatch.rescue_responses.merge!("RailsConnector::ResourceNotFound" => :not_found)
|
15
|
+
|
16
|
+
initializer "rails_connector.add_cms_routing_paths", :after => :add_routing_paths do |app|
|
17
|
+
cms_route = File.expand_path("cms_routes.rb", paths['config'].to_a.first)
|
18
|
+
app.routes_reloader.paths.push(cms_route)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Expose rails connector runtime to controller for logging.
|
22
|
+
initializer "rails_connector.log_runtime" do |app|
|
23
|
+
runtime =
|
24
|
+
begin
|
25
|
+
RailsConnector::ControllerRuntime
|
26
|
+
rescue NameError
|
27
|
+
nil
|
28
|
+
end
|
29
|
+
|
30
|
+
if runtime
|
31
|
+
RailsConnector::LogSubscriber.attach_to :rails_connector
|
32
|
+
ActiveSupport.on_load(:action_controller) do
|
33
|
+
include runtime
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
initializer "rails_connector.configure_database", :before => :load_config_initializers do |app|
|
39
|
+
RailsConnector::Configuration.configure_cms_database
|
40
|
+
end
|
41
|
+
|
42
|
+
initializer "rails_connector.routing_helpers" do
|
43
|
+
if Rails.env == 'test'
|
44
|
+
ActionDispatch::TestRequest.__send__(:include, RailsConnector::CmsTestRequest)
|
45
|
+
end
|
46
|
+
|
47
|
+
ActionController::Base.__send__(:include, CmsRoutingHelper)
|
48
|
+
ActionView::Base.__send__(:include, CmsRoutingHelper)
|
49
|
+
end
|
50
|
+
|
51
|
+
config.autoload_paths += paths['lib'].to_a
|
52
|
+
config.autoload_once_paths += paths['lib'].to_a
|
53
|
+
|
54
|
+
RailsConnector.rack_middlewares.each { |middleware| config.app_middleware.use middleware }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
# Include this module in order to tag the string as one with HTML content
|
4
|
+
module HtmlString
|
5
|
+
include LinkResolvable
|
6
|
+
# Returns whether the String contains HTML (default to true, overrides String.html?).
|
7
|
+
def html?
|
8
|
+
true
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
class String
|
15
|
+
# Returns whether the String contains HTML (default to false).
|
16
|
+
def html?
|
17
|
+
false
|
18
|
+
end
|
19
|
+
end
|