Class: Sqreen::Frameworks::RailsFramework

Inherits:
GenericFramework show all
Defined in:
lib/sqreen/frameworks/rails.rb

Overview

Rails related framework code

Direct Known Subclasses

Rails3Framework

Defined Under Namespace

Classes: Init

Constant Summary collapse

DB_MAPPING =
{
  'SQLite' => :sqlite,
  'MySQL' => :mysql,
  'Mysql2' => :mysql,
}.freeze
P_OTHER =
'other'.freeze

Constants inherited from GenericFramework

GenericFramework::LOCALHOST, GenericFramework::PREFERRED_IP_HEADERS, GenericFramework::P_COOKIE, GenericFramework::P_FORM, GenericFramework::P_GRAPE, GenericFramework::P_QUERY, GenericFramework::P_RACK, GenericFramework::P_RACK_ROUTING, GenericFramework::TRUSTED_PROXIES

Instance Attribute Summary

Attributes inherited from GenericFramework

#req_end_cb, #req_start_cb, #sqreen_configuration

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from GenericFramework

#body, #clean_request, #client_ip, #client_user_agent, cookies_params, #cwd, #datadog_span, #datadog_trace, #filtered_request_params, form_params, #full_params_include?, #graphql_args=, #header, #hostname, #http_headers, #mark_request_overtime!, #params_include?, query_params, #rack_client_ip, rack_params, #remaining_perf_budget, #remaining_perf_budget=, #remote_addr, #request, #request_infos, #request_params, #request_path, #response, #response_infos, #store_request, #store_response, #test?, #whitelisted_ip, #whitelisted_match, #whitelisted_path, #xss_params

Methods included from RequestRecorder

#clean_request_record, #close_request_record, #observe, #observed_items, #observed_items=, #only_metric_observation, #only_metric_observation=, #payload_requests, #payload_requests=

Constructor Details

#initializeRailsFramework

Returns a new instance of RailsFramework.



22
23
24
# File 'lib/sqreen/frameworks/rails.rb', line 22

def initialize
  super
end

Class Method Details

.parameters_from_request(request) ⇒ Object



135
136
137
138
139
140
# File 'lib/sqreen/frameworks/rails.rb', line 135

def self.parameters_from_request(request)
  return {} unless request
  ret = super(request)
  ret[P_OTHER] = rails_params(request)
  ret
end

.rails_params(request) ⇒ Object



122
123
124
125
126
127
128
129
130
131
# File 'lib/sqreen/frameworks/rails.rb', line 122

def self.rails_params(request)
  return nil unless request
  other = request.env['action_dispatch.request.parameters']
  return nil unless other
  # Remove Rails created parameters:
  other = other.dup
  other.delete :action
  other.delete :controller
  other
end

Instance Method Details

#application_nameObject



84
85
86
# File 'lib/sqreen/frameworks/rails.rb', line 84

def application_name
  Rails.application.class.name.deconstantize.underscore
end

#db_settings(options = {}) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/sqreen/frameworks/rails.rb', line 38

def db_settings(options = {})
  adapter = options[:connection_adapter]
  return nil unless adapter

  begin
    adapter_name = adapter.adapter_name
  rescue
    # FIXME: we may want to log that
    Sqreen.log.warn 'cannot find ADAPTER_NAME'
    return nil
  end
  db_type = DB_MAPPING[adapter_name]
  db_infos = { :name => adapter_name }
  [db_type, db_infos]
end

#development?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/sqreen/frameworks/rails.rb', line 34

def development?
  Rails.env.development?
end

#framework_infosObject



26
27
28
29
30
31
32
# File 'lib/sqreen/frameworks/rails.rb', line 26

def framework_infos
  {
    :framework_type => 'Rails',
    :framework_version => Rails::VERSION::STRING,
    :environment => Rails.env.to_s,
  }
end

#instrument_when_ready!(instrumentor, rules) ⇒ Object



114
115
116
# File 'lib/sqreen/frameworks/rails.rb', line 114

def instrument_when_ready!(instrumentor, rules)
  instrumentor.instrument!(rules, self)
end

#ip_headersObject



54
55
56
57
58
59
# File 'lib/sqreen/frameworks/rails.rb', line 54

def ip_headers
  ret = super
  remote_ip = rails_client_ip
  ret << ['action_dispatch.remote_ip', remote_ip] unless remote_ip.nil?
  ret
end

#prevent_startupObject



100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/sqreen/frameworks/rails.rb', line 100

def prevent_startup
  res = super
  return res if res
  run_in_test = sqreen_configuration.get(:run_in_test)
  return :rails_test if !run_in_test && (Rails.env.test? || Rails.env.cucumber?)

  return nil unless defined?(Rails::CommandsTasks)
  return nil if defined?(Rails::Server)
  return :rails_console    if defined?(Rails::Console)
  return :rails_dbconsole  if defined?(Rails::DBConsole)
  return :rails_generators if defined?(Rails::Generators)
  nil
end

#rails_client_ipObject

What is the current client IP as seen by rails



62
63
64
65
66
67
68
69
70
71
72
# File 'lib/sqreen/frameworks/rails.rb', line 62

def rails_client_ip
  req = request
  return unless req && req.env
  remote_ip = req.env['action_dispatch.remote_ip']
  return unless remote_ip
  # FIXME: - this exist only since Rails 3.2.1
  # http://apidock.com/rails/v3.2.1/ActionDispatch/RemoteIp/GetIp/calculate_ip
  return remote_ip.calculate_ip if remote_ip.respond_to?(:calculate_ip)
  # This might not return the same value as calculate IP
  remote_ip.to_s
end

#rails_paramsObject



118
119
120
# File 'lib/sqreen/frameworks/rails.rb', line 118

def rails_params
  self.class.rails_params(request)
end

#request_idObject



74
75
76
77
78
# File 'lib/sqreen/frameworks/rails.rb', line 74

def request_id
  req = request
  return super unless req
  req.env['action_dispatch.request_id'] || super
end

#rootObject



80
81
82
# File 'lib/sqreen/frameworks/rails.rb', line 80

def root
  Rails.application.root
end