infopark_fiona_connector 7.0.1.5.2.3.rc7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +5 -0
  3. data/app/assets/images/admin/minus.gif +0 -0
  4. data/app/assets/images/bg80.png +0 -0
  5. data/app/assets/images/edit.png +0 -0
  6. data/app/assets/images/icons/mm_generic.png +0 -0
  7. data/app/assets/images/icons/mm_menu.png +0 -0
  8. data/app/assets/javascripts/editmarker.js +240 -0
  9. data/app/assets/javascripts/infopark_rails_connector.js.erb +0 -0
  10. data/app/assets/stylesheets/editmarker.css +70 -0
  11. data/app/assets/stylesheets/infopark_rails_connector.css.erb +0 -0
  12. data/app/controllers/cms_controller.rb +7 -0
  13. data/app/controllers/rails_connector/default_cms_controller.rb +41 -0
  14. data/app/helpers/cms_helper.rb +7 -0
  15. data/app/helpers/cms_routing_helper.rb +7 -0
  16. data/app/helpers/rails_connector/cms_asset_helper.rb +54 -0
  17. data/app/helpers/rails_connector/cms_tag_helper.rb +4 -0
  18. data/app/helpers/rails_connector/default_cms_helper.rb +21 -0
  19. data/app/helpers/rails_connector/default_cms_routing_helper.rb +119 -0
  20. data/app/helpers/rails_connector/display_helper.rb +124 -0
  21. data/app/helpers/rails_connector/editing_helper.rb +7 -0
  22. data/app/helpers/rails_connector/layout_helper.rb +26 -0
  23. data/app/helpers/rails_connector/marker_helper.rb +371 -0
  24. data/app/helpers/rails_connector/table_of_contents_helper.rb +20 -0
  25. data/app/models/named_link.rb +2 -0
  26. data/app/views/cms/_index.html.erb +7 -0
  27. data/app/views/cms/index.html.erb +1 -0
  28. data/app/views/errors/403_forbidden.html.erb +3 -0
  29. data/app/views/errors/410_gone.html.erb +7 -0
  30. data/config/cms_routes.rb +17 -0
  31. data/config/locales/de.rails_connector.errors.yml +11 -0
  32. data/config/locales/de.rails_connector.lib.yml +6 -0
  33. data/config/locales/de.rails_connector.views.yml +9 -0
  34. data/config/locales/en.rails_connector.errors.yml +10 -0
  35. data/config/locales/en.rails_connector.lib.yml +6 -0
  36. data/config/locales/en.rails_connector.views.yml +9 -0
  37. data/lib/gem_dependencies.rb +68 -0
  38. data/lib/generators/rails_connector/install/install_generator.rb +37 -0
  39. data/lib/generators/rails_connector/install/templates/app/models/obj.rb.erb +5 -0
  40. data/lib/generators/rails_connector/install/templates/initializers/rails_connector.rb +2 -0
  41. data/lib/generators/rails_connector/install/templates/local/configuration.rb +2 -0
  42. data/lib/infopark_fiona_connector.rb +44 -0
  43. data/lib/meta_eager_loader.rb +1 -0
  44. data/lib/obj.rb +3 -0
  45. data/lib/rails_connector/attr_dict.rb +169 -0
  46. data/lib/rails_connector/attr_value_provider.bundle +0 -0
  47. data/lib/rails_connector/attr_value_provider.so +0 -0
  48. data/lib/rails_connector/attr_value_provider64.so +0 -0
  49. data/lib/rails_connector/attribute.rb +93 -0
  50. data/lib/rails_connector/authenticable.rb +37 -0
  51. data/lib/rails_connector/basic_obj.rb +571 -0
  52. data/lib/rails_connector/blob.rb +75 -0
  53. data/lib/rails_connector/blob_mapping.rb +15 -0
  54. data/lib/rails_connector/blob_mysql.rb +30 -0
  55. data/lib/rails_connector/blob_oracle.rb +37 -0
  56. data/lib/rails_connector/cache_middleware.rb +13 -0
  57. data/lib/rails_connector/channel.rb +18 -0
  58. data/lib/rails_connector/cms_accessible.rb +111 -0
  59. data/lib/rails_connector/cms_base_model.rb +62 -0
  60. data/lib/rails_connector/cms_dispatch_controller.rb +43 -0
  61. data/lib/rails_connector/cms_env.rb +65 -0
  62. data/lib/rails_connector/cms_test_request.rb +8 -0
  63. data/lib/rails_connector/configuration.rb +174 -0
  64. data/lib/rails_connector/content.rb +7 -0
  65. data/lib/rails_connector/core_extensions.rb +1 -0
  66. data/lib/rails_connector/core_extensions/time.rb +17 -0
  67. data/lib/rails_connector/date_attribute.rb +26 -0
  68. data/lib/rails_connector/default_search_request.rb +6 -0
  69. data/lib/rails_connector/engine.rb +65 -0
  70. data/lib/rails_connector/errors.rb +6 -0
  71. data/lib/rails_connector/fiona_datetime.rb +14 -0
  72. data/lib/rails_connector/fiona_engine.rb +8 -0
  73. data/lib/rails_connector/html_string.rb +17 -0
  74. data/lib/rails_connector/job.rb +10 -0
  75. data/lib/rails_connector/link.rb +148 -0
  76. data/lib/rails_connector/link_list.rb +28 -0
  77. data/lib/rails_connector/link_resolvable.rb +5 -0
  78. data/lib/rails_connector/lucene_search_request.rb +102 -0
  79. data/lib/rails_connector/markdown_string.rb +17 -0
  80. data/lib/rails_connector/meta.rb +143 -0
  81. data/lib/rails_connector/meta/eager_loader.rb +84 -0
  82. data/lib/rails_connector/named_link.rb +90 -0
  83. data/lib/rails_connector/news.rb +20 -0
  84. data/lib/rails_connector/obj_class.rb +138 -0
  85. data/lib/rails_connector/obj_class_attr.rb +5 -0
  86. data/lib/rails_connector/object_with_meta_data.rb +13 -0
  87. data/lib/rails_connector/permission.rb +37 -0
  88. data/lib/rails_connector/rack_middlewares.rb +5 -0
  89. data/lib/rails_connector/ses.rb +78 -0
  90. data/lib/rails_connector/ses/verity_accessor.rb +127 -0
  91. data/lib/rails_connector/string_tagging.rb +26 -0
  92. data/lib/rails_connector/verity_search_request.rb +86 -0
  93. data/lib/search_request.rb +2 -0
  94. data/lib/version.rb +7 -0
  95. metadata +277 -0
@@ -0,0 +1,75 @@
1
+ module RailsConnector
2
+ # A binary containing the blob data of a Content or CMS management
3
+ # data of Attribute (fields), ObjClass (object classes), for example.
4
+ class Blob < CmsBaseModel
5
+ self.primary_key = "blob_name"
6
+
7
+ class << self
8
+ # Does not retrieve the column blob_data.
9
+ def find_with_excluded_blob_data(primary_key)
10
+ select(:blob_name, :blob_length).find(primary_key)
11
+ end
12
+
13
+ alias_method :find_without_excluded_blob_data, :find
14
+ alias_method :find, :find_with_excluded_blob_data
15
+ end
16
+
17
+ def length
18
+ blob_length
19
+ end
20
+
21
+ def data
22
+ @data ||= self.class.find_without_excluded_blob_data(id).blob_data
23
+ end
24
+
25
+ def path_of_stored_data(use_cached_file_if_older_than = Time.now)
26
+ store_data if !File.exist?(path) || file_size_differs? || stale?(use_cached_file_if_older_than)
27
+ path
28
+ end
29
+
30
+ def self.cache_dir
31
+ Configuration.blob_cache_dir || File.join(Rails.root, %w(tmp cache))
32
+ end
33
+
34
+ def self.initialize_blob_streaming_for(adapter_name)
35
+ # Redefines store_data:
36
+ case adapter_name
37
+ when /mysql$/i
38
+ raise "Adapter 'mysql' no longer supported. " +
39
+ "Please change adapter in your database.yml to 'mysql2'."
40
+ when /mysql2/i
41
+ require "rails_connector/blob_mysql"
42
+ include BlobMysql
43
+ when /oracle/i
44
+ require "rails_connector/blob_oracle"
45
+ include BlobOracle
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def path
52
+ "#{Blob.cache_dir}/#{id}"
53
+ end
54
+
55
+ def store_data
56
+ store_data_atomically do |f|
57
+ f << data
58
+ end
59
+ end
60
+
61
+ def store_data_atomically(&block)
62
+ tmp_file = "#{path}.#{Process.pid}"
63
+ File.open(tmp_file, "wb", &block)
64
+ File.rename(tmp_file, path)
65
+ end
66
+
67
+ def stale?(time)
68
+ time > File.mtime(path)
69
+ end
70
+
71
+ def file_size_differs?
72
+ blob_length != File.stat(path).size
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,15 @@
1
+ module RailsConnector
2
+ class BlobMapping < CmsBaseModel
3
+ def self.exists?
4
+ table_exists?
5
+ end
6
+
7
+ def self.get_fingerprint(name)
8
+ find_by_blob_name(name).fingerprint
9
+ end
10
+
11
+ def self.get_fingerprint_map(blob_names)
12
+ Hash[where(blob_name: blob_names).select(%i(blob_name fingerprint)).map { |b| [b.blob_name, b.fingerprint] }]
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,30 @@
1
+ require "mysql2"
2
+ require "mysql_blob_streaming"
3
+
4
+ module RailsConnector
5
+ module BlobMysql
6
+ def self.included(base)
7
+ base.instance_eval do
8
+ define_method :store_data do
9
+ store_data_atomically { |f| fetch_into_file(f) }
10
+ end
11
+ end
12
+ end
13
+
14
+ def fetch_into_file(file)
15
+ mysql2_client = self.class.connection.raw_connection
16
+ ActiveRecord::Base.logger.debug "Streaming blob from MySQL2 into #{file.path}"
17
+
18
+ table_name = mysql2_client.escape(self.class.table_name)
19
+ primary_key = mysql2_client.escape(self.class.primary_key)
20
+ escaped_id = mysql2_client.escape(id)
21
+ query = "SELECT `blob_data` FROM `#{table_name}` WHERE `#{primary_key}`='#{escaped_id}'"
22
+
23
+ MysqlBlobStreaming.stream(mysql2_client, query, 1.megabyte) do |chunk|
24
+ file << chunk
25
+ chunk = nil
26
+ GC.start
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,37 @@
1
+ module RailsConnector
2
+ module BlobOracle
3
+ def self.included(base)
4
+ base.instance_eval do
5
+ define_method :store_data do
6
+ store_data_atomically { |f| fetch_into_file(f) }
7
+ end
8
+ end
9
+ end
10
+
11
+ def fetch_into_file(file)
12
+ blob = blob_handle
13
+ while data = blob.read(buff_size ||= 1.megabyte)
14
+ file << data
15
+ data = nil
16
+ GC.start
17
+ end
18
+ ensure
19
+ blob&.close
20
+ end
21
+
22
+ private
23
+
24
+ def sql
25
+ %(
26
+ SELECT blob_data
27
+ FROM #{self.class.table_name}
28
+ WHERE #{self.class.primary_key} = :1
29
+ )
30
+ end
31
+
32
+ def blob_handle
33
+ con = self.class.connection.raw_connection
34
+ con.exec(sql, id).fetch.first
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,13 @@
1
+ module RailsConnector
2
+ class CacheMiddleware
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def call(env)
8
+ CmsBaseModel.cache do
9
+ @app.call(env)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module RailsConnector
2
+ class Channel < CmsBaseModel
3
+ self.primary_key = "channel_name"
4
+
5
+ def self.table_name
6
+ "#{table_name_prefix}" "channels"
7
+ end
8
+
9
+ has_many :news, class_name: "RailsConnector::News", foreign_key: "channel_name"
10
+ has_many :active_news,
11
+ -> { where(["valid_from <= :now AND valid_until >= :now", { now: Time.now.to_s(:number) }]) },
12
+ class_name: "RailsConnector::News", foreign_key: "channel_name"
13
+
14
+ has_many :objects, through: :news
15
+
16
+ scope :with_prefix, ->(prefix) { where(["channel_name LIKE ?", "#{prefix}%"]) }
17
+ end
18
+ end
@@ -0,0 +1,111 @@
1
+ module RailsConnector
2
+ # @api public
3
+ module CmsAccessible
4
+ protected
5
+
6
+ # Filter method to load a CMS object.
7
+ #
8
+ # To require the loading for all actions, use this in your controllers:
9
+ # before_action :load_object
10
+ def load_object
11
+ CmsEnv.new(request.env).load
12
+ loaded_obj = request.env[CmsEnv::OBJ_ENV_KEY]
13
+ raise loaded_obj if loaded_obj.is_a?(StandardError)
14
+
15
+ @obj = loaded_obj
16
+ end
17
+
18
+ # Filter method to check if the already loaded object is active. If it is
19
+ # not, a 410 Gone error message will be generate (by calling render_obj_error).
20
+ #
21
+ # To require the check for all actions, use this in your controllers:
22
+ # before_action :load_object
23
+ # before_action :ensure_object_is_active
24
+ def ensure_object_is_active
25
+ unless @obj.active?
26
+ @valid_from = @obj.valid_from
27
+ @valid_until = @obj.valid_until
28
+ @obj = nil
29
+ render_obj_error(410, "gone")
30
+ end
31
+ true
32
+ end
33
+
34
+ # Filter method to check if access to the loaded object is permitted. If it is
35
+ # not, a 403 Forbidden error message will be generated (by calling render_obj_error)
36
+ #
37
+ # To require the check for all actions, use this in your controllers:
38
+ # before_action :load_object
39
+ # before_action :ensure_object_is_permitted
40
+ def ensure_object_is_permitted
41
+ unless is_permitted(@obj)
42
+ @obj = nil
43
+ render_obj_error(403, "forbidden")
44
+ end
45
+ true
46
+ end
47
+
48
+ # This method is called when rendering an error caused by either {ensure_object_is_permitted}
49
+ # or {ensure_object_is_active} before filter. It renders an error template located in
50
+ # "errors/*.html.erb" with given HTTP status and content type "text/html" and with no layout.
51
+ # Overwrite this method to change the error page.
52
+ # @api public
53
+ def render_obj_error(status, name)
54
+ force_html_format
55
+ render(
56
+ template: "errors/#{status}_#{name}",
57
+ layout: false,
58
+ status: status,
59
+ content_type: Mime[:html]
60
+ )
61
+ end
62
+
63
+ # Enforce "html" as template format.
64
+ # @api public
65
+ def force_html_format
66
+ request.format = :html
67
+ end
68
+
69
+ # Inclusion hook to make is_permitted available as helper method.
70
+ def self.included(base)
71
+ base.__send__ :helper_method, :is_permitted
72
+ end
73
+
74
+ # Helper method to check live permissions
75
+ def is_permitted(obj)
76
+ obj.permitted_for_user?(current_user)
77
+ end
78
+
79
+ # Filter method which sets the header 'X-Robots-Tag: unavailable_after'
80
+ # to the valid_until date of the current object.
81
+ def set_google_expire_header
82
+ if @obj && (date = @obj.valid_until)
83
+ headers["X-Robots-Tag: unavailable_after"] = date.rfc822
84
+ end
85
+ end
86
+
87
+ # Deliver the obj's body as response by file or data.
88
+ # May respond with status 304 if a If-Modified-Since header is found.
89
+ # @api public
90
+ def deliver_file
91
+ if @obj.body_data_url
92
+ redirect_to enforce_protocol_from_request(@obj.body_data_url)
93
+ elsif stale?(last_modified: @obj.last_changed.utc)
94
+ mime_type = @obj.mime_type
95
+ mime_type += "; charset=utf-8" if %r{^text/}.match?(mime_type)
96
+
97
+ if (filepath = @obj.body_data_path).present?
98
+ send_file(File.expand_path(filepath), {
99
+ type: mime_type,
100
+ filename: @obj.filename,
101
+ disposition: "inline"
102
+ })
103
+ else
104
+ # generics should send its body, empty files should be delivered as
105
+ # empty files - and not lead to an application error
106
+ send_data @obj.body || "", type: mime_type, filename: @obj.filename, disposition: "inline"
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,62 @@
1
+ module RailsConnector
2
+ # This is the abstract class from which all CMS models derive.
3
+ # The database connection is set to "infopark_rails_connector_${RAILS_ENV}" and the table prefix is
4
+ # determined from the instance_name.
5
+ #
6
+ # [instance_name] the name of the CMS instance
7
+ class CmsBaseModel < ActiveRecord::Base
8
+ @@instance_name = "default"
9
+ cattr_accessor :instance_name
10
+ self.abstract_class = true
11
+
12
+ def self.configure_database(db_connection_spec)
13
+ establish_connection(db_connection_spec)
14
+ Blob.initialize_blob_streaming_for(connection.adapter_name)
15
+ end
16
+
17
+ # Returns :table_name_with_underscore. All CMS models use this kind of primary key naming.
18
+ def self.primary_key_prefix_type
19
+ :table_name_with_underscore
20
+ end
21
+
22
+ # CmsBaseModel and all of its descendants are model classes that can access CMS contents.
23
+ def self.cms_model?
24
+ true
25
+ end
26
+
27
+ # FIXME: Find a more stable solution for this
28
+ #
29
+ # Since ActiveRecord 4.2 finding Objs by name is no longer consistent when
30
+ # switching between edited and released content at runtime. As long as we
31
+ # find a better solution this mitigates the behaviour.
32
+ def self.find_by(arg, *args)
33
+ where(arg, *args).take
34
+ end
35
+
36
+ def readonly?
37
+ true
38
+ end
39
+
40
+ def attribute_for_inspect(attr_name)
41
+ value = read_attribute(attr_name)
42
+
43
+ if value.is_a?(RailsConnector::LinkList)
44
+ value.destination_objects.map(&:to_s)
45
+ else
46
+ super
47
+ end
48
+ end
49
+
50
+ class << self
51
+ # The prefix of the table name is determined by using the instance name followed by an underscore.
52
+ # Set the instance_name in your environment to the CMS instance name (defaults to 'default').
53
+ #
54
+ # CmsBaseModel.instance_name = 'default'
55
+ #
56
+ # ActiveRecord::Base::primary_key_prefix_type has no effect here.
57
+ def table_name_prefix
58
+ @@instance_name.blank? ? "" : (@@instance_name + "_")
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,43 @@
1
+ module RailsConnector
2
+ class CmsDispatchController < ActionController::Metal
3
+ def process(action)
4
+ CmsEnv.new(request.env).load
5
+ controller = target_controller(request.env)
6
+ request.env["action_dispatch.request.path_parameters"][:controller] = controller.controller_path
7
+
8
+ action = loaded_obj.controller_action_name if !obj_not_found? && action == "index"
9
+
10
+ request.env["action_dispatch.request.path_parameters"][:action] = action
11
+
12
+ self.response = controller.action(action).call(request.env)
13
+ end
14
+
15
+ private
16
+
17
+ def target_controller(_env)
18
+ return default_controller if obj_not_found?
19
+
20
+ controller = "#{loaded_obj.controller_name}Controller".constantize
21
+
22
+ if controller.respond_to?(:use_for_obj_dispatch?) && controller.use_for_obj_dispatch?
23
+ controller
24
+ else
25
+ default_controller
26
+ end
27
+ rescue NameError
28
+ default_controller
29
+ end
30
+
31
+ def loaded_obj
32
+ request.env[CmsEnv::OBJ_ENV_KEY]
33
+ end
34
+
35
+ def obj_not_found?
36
+ loaded_obj.is_a?(StandardError)
37
+ end
38
+
39
+ def default_controller
40
+ CmsController
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,65 @@
1
+ module RailsConnector
2
+ class CmsEnv
3
+ OBJ_ENV_KEY = "INFOPARK_OBJ".freeze
4
+
5
+ def initialize(env)
6
+ @env = env
7
+ end
8
+
9
+ def load
10
+ return if env[OBJ_ENV_KEY]
11
+
12
+ load_object
13
+ end
14
+
15
+ protected
16
+
17
+ attr_reader :env
18
+
19
+ def load_object
20
+ env[OBJ_ENV_KEY] =
21
+ begin
22
+ find_obj
23
+ rescue StandardError => e
24
+ e
25
+ end
26
+ end
27
+
28
+ def find_obj
29
+ found_obj =
30
+ if params[:id]
31
+ Obj.find(params[:id])
32
+ elsif params[:permalink].present?
33
+ self.class.find_permalink_by_param(params[:permalink])
34
+ else
35
+ if callback = RailsConnector::Configuration.choose_homepage_callback
36
+ callback_result = callback.call(env)
37
+ if callback_result.is_a?(Obj)
38
+ callback_result
39
+ else
40
+ raise "choose_homepage callback did not return an Obj. "\
41
+ "Instead saw #{callback_result.class}."
42
+ end
43
+ else
44
+ Obj.homepage
45
+ end
46
+ end
47
+
48
+ if found_obj.suppressed?
49
+ raise RailsConnector::ResourceNotFound,
50
+ "Tried to access Obj #{found_obj.inspect}, but it is suppressed (suppress_export is set)!"
51
+ end
52
+
53
+ found_obj
54
+ end
55
+
56
+ def params
57
+ env["action_dispatch.request.path_parameters"]
58
+ end
59
+
60
+ def self.find_permalink_by_param(permalink_param)
61
+ permalink = Array(permalink_param).join("/")
62
+ Obj.find_by_permalink!(permalink)
63
+ end
64
+ end
65
+ end