effective_logging 3.0.13 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1fc5a45c2f4f2b72d25f2440ab60382a4e86455ac95176a4b8c927009aa1712b
4
- data.tar.gz: 75fb045296a8e2887ada0a2e637c3f0005b4ba7efaca433c2c7f49d29f0505b9
3
+ metadata.gz: 91790ca464dd429fb345fcbef0d15cbdebefdbd56f8685aaa8206653a7cd4350
4
+ data.tar.gz: fccd38fd9967c82487436ed7a25154bc7b84a4fc30c129691ce532683a951717
5
5
  SHA512:
6
- metadata.gz: c17d99ed81e95846c101e19384c6be111147fec944ec6fe95ed2913cbec52344e4ac0ba6132e3dcdb66cf811b9d0336ca6af3fb80ac1253b53e0b1296b442b59
7
- data.tar.gz: 971f6803ddf2e57e2b66068a33bd7ce6bdac5b8cfa735290656df37f2a569234d2dd5b86b9710c846cca37b49abdb0db16b15c1f99f9ae817289f37c94b4ce7a
6
+ metadata.gz: 57df8caf9cf1a316d2a4591f28ca072b08fa2fae0da1bf71cdd72474971e16637d60337eeb9ce903bfe35033c1fcf68fb7ed76e022aab47a8a7503289fd8cbbc
7
+ data.tar.gz: 0b6106eade70761e9d71602846c5000308533de2058a6f8097e8aec22439155e5e55c83fafeeaf6a7e9c9339ec19cdd17cb15b372e3b3d79a1dc623eaf8b8bdf
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2019 Code and Effect Inc.
1
+ Copyright 2021 Code and Effect Inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -1,21 +1,25 @@
1
1
  module Admin
2
2
  class LogsController < ApplicationController
3
- before_action :authenticate_user!
3
+ before_action(:authenticate_user!) if defined?(Devise)
4
+ before_action { EffectiveResources.authorize!(self, :admin, :effective_logging) }
5
+
6
+ include Effective::CrudController
4
7
  skip_log_page_views
5
8
 
6
- layout (EffectiveLogging.layout.kind_of?(Hash) ? EffectiveLogging.layout[:admin_logs] : EffectiveLogging.layout)
9
+ if (config = EffectiveLogging.layout)
10
+ layout(config.kind_of?(Hash) ? config[:admin] : config)
11
+ end
7
12
 
8
13
  def index
14
+ EffectiveResources.authorize!(self, :index, Effective::Log)
9
15
  @datatable = EffectiveLogsDatatable.new(self)
10
-
11
16
  @page_title = 'Logs'
12
-
13
- EffectiveLogging.authorize!(self, :index, Effective::Log)
14
- EffectiveLogging.authorize!(self, :admin, :effective_logging)
15
17
  end
16
18
 
17
19
  def show
18
20
  @log = Effective::Log.includes(:logs).find(params[:id])
21
+ EffectiveResources.authorize!(self, :show, @log)
22
+
19
23
  @log.next_log = Effective::Log.order(:id).where(parent_id: @log.parent_id).where('id > ?', @log.id).first
20
24
  @log.prev_log = Effective::Log.order(:id).where(parent_id: @log.parent_id).where('id < ?', @log.id).last
21
25
 
@@ -25,8 +29,6 @@ module Admin
25
29
  @log.datatable = EffectiveLogsDatatable.new(self, log_id: @log.id)
26
30
  end
27
31
 
28
- EffectiveLogging.authorize!(self, :show, @log)
29
- EffectiveLogging.authorize!(self, :admin, :effective_logging)
30
32
  end
31
33
  end
32
34
  end
@@ -1,11 +1,17 @@
1
1
  module Effective
2
2
  class LogsController < ApplicationController
3
+ before_action(:authenticate_user!, only: [:index, :show]) if defined?(Devise)
4
+
5
+ include Effective::CrudController
3
6
  skip_log_page_views
4
- before_action :authenticate_user!, only: [:index, :show]
7
+
8
+ if (config = EffectiveLogging.layout)
9
+ layout(config.kind_of?(Hash) ? config[:application] : config)
10
+ end
5
11
 
6
12
  # This is a post from our Javascript
7
13
  def create
8
- EffectiveLogging.authorize!(self, :create, Effective::Log.new)
14
+ EffectiveResources.authorize!(self, :create, Effective::Log.new)
9
15
 
10
16
  @log = Effective::Log.new.tap do |log|
11
17
  log.message = log_params[:message]
@@ -34,7 +40,7 @@ module Effective
34
40
 
35
41
  # This is the User index event
36
42
  def index
37
- EffectiveLogging.authorize!(self, :index, Effective::Log.new(user_id: current_user.id))
43
+ EffectiveResources.authorize!(self, :index, Effective::Log.new(user_id: current_user.id))
38
44
 
39
45
  @datatable = EffectiveLogsDatatable.new(self, user_id: current_user.id)
40
46
  end
@@ -7,10 +7,8 @@ class EffectiveLogsDatatable < Effective::Datatable
7
7
 
8
8
  if attributes[:user] == false
9
9
  # Do not include
10
- elsif attributes[:for]
11
- col :user, search: :string
12
10
  else
13
- col :user
11
+ col :user, search: :string
14
12
  end
15
13
 
16
14
  unless attributes[:status] == false
@@ -27,8 +27,8 @@ module ActsAsLoggable
27
27
  except: Array(@acts_as_loggable_options[:except])
28
28
  }
29
29
 
30
- if name == 'User'
31
- log_changes_options[:except] += %i(sign_in_count current_sign_in_at current_sign_in_ip last_sign_in_at last_sign_in_ip encrypted_password remember_created_at reset_password_token invitation_sent_at invitation_created_at invitation_token)
30
+ if name.end_with?('User')
31
+ log_changes_options[:except] += %i(sign_in_count current_sign_in_at current_sign_in_ip last_sign_in_at last_sign_in_ip encrypted_password remember_created_at reset_password_token invitation_sent_at invitation_created_at invitation_token access_token refresh_token token_expires_at)
32
32
  end
33
33
 
34
34
  self.send(:define_method, :log_changes_options) { log_changes_options }
@@ -67,4 +67,3 @@ module ActsAsLoggable
67
67
  end
68
68
 
69
69
  end
70
-
@@ -11,33 +11,36 @@ module Effective
11
11
  belongs_to :parent, class_name: 'Effective::Log', counter_cache: true, optional: true
12
12
  has_many :logs, class_name: 'Effective::Log', foreign_key: :parent_id
13
13
 
14
- belongs_to :user, optional: true
14
+ belongs_to :user, polymorphic: true, optional: true
15
15
  belongs_to :changes_to, polymorphic: true, optional: true # This is the log_changes to: option
16
16
  belongs_to :associated, polymorphic: true, optional: true
17
17
 
18
- serialize :details, Hash
18
+ effective_resource do
19
+ logs_count :integer # Rails Counter Cache
20
+
21
+ changes_to_type :string
22
+ changes_to_id :string
19
23
 
20
- # Attributes
21
- # logs_count :integer # Rails Counter Cache
24
+ associated_type :string
25
+ associated_id :integer
26
+ associated_to_s :string
22
27
 
23
- # changes_to_type :string
24
- # changes_to_id :string
28
+ status :string
29
+ message :text
30
+ details :text
25
31
 
26
- # associated_type :string
27
- # associated_id :integer
28
- # associated_to_s :string
29
- # message :text
30
- # details :text
31
- # status :string
32
- # timestamps
32
+ timestamps
33
+ end
34
+
35
+ serialize :details, Hash
33
36
 
34
37
  validates :message, presence: true
35
38
  validates :status, presence: true, inclusion: { in: EffectiveLogging.statuses }
36
39
 
37
40
  scope :deep, -> { includes(:user, :associated) }
38
41
  scope :sorted, -> { order(:id) }
39
- scope :logged_changes, -> { where(status: EffectiveLogging.log_changes_status)}
40
- scope :changes, -> { where(status: EffectiveLogging.log_changes_status)}
42
+ scope :logged_changes, -> { where(status: EffectiveLogging.log_changes_status) }
43
+ scope :changes, -> { where(status: EffectiveLogging.log_changes_status) }
41
44
 
42
45
  def to_s
43
46
  "Log #{id}"
@@ -63,5 +66,3 @@ module Effective
63
66
 
64
67
  end
65
68
  end
66
-
67
-
@@ -6,7 +6,7 @@ class EffectiveLogger
6
6
 
7
7
  options = Hash(options).delete_if { |k, v| v.blank? }
8
8
 
9
- if options[:user].present? && !options[:user].kind_of?(User)
9
+ if options[:user].present? && !options[:user].class.name.end_with?('User')
10
10
  raise ArgumentError.new('Log.log :user => ... argument must be a User object')
11
11
  end
12
12
 
@@ -30,6 +30,7 @@ class EffectiveLogger
30
30
  message: message,
31
31
  status: status,
32
32
  user_id: options.delete(:user_id),
33
+ user_type: options.delete(:user_type),
33
34
  user: options.delete(:user),
34
35
  parent: options.delete(:parent),
35
36
  associated: options.delete(:associated),
@@ -2,37 +2,11 @@ EffectiveLogging.setup do |config|
2
2
  # Configure Database Tables
3
3
  config.logs_table_name = :logs
4
4
 
5
- # Authorization Method
6
- #
7
- # This method is called by all controller actions with the appropriate action and resource
8
- # If the method returns false, an Effective::AccessDenied Error will be raised (see README.md for complete info)
9
- #
10
- # Use via Proc (and with CanCan):
11
- # config.authorization_method = Proc.new { |controller, action, resource| can?(action, resource) }
12
- #
13
- # Use via custom method:
14
- # config.authorization_method = :my_authorization_method
15
- #
16
- # And then in your application_controller.rb:
17
- #
18
- # def my_authorization_method(action, resource)
19
- # current_user.is?(:admin)
20
- # end
21
- #
22
- # Or disable the check completely:
23
- # config.authorization_method = false
24
- config.authorization_method = Proc.new { |controller, action, resource| authorize!(action, resource) } # CanCanCan
25
-
26
5
  # Admin Screens Layout Settings
27
- config.layout = 'application' # All EffectiveLogging controllers will use this layout
28
-
29
- # config.layout = {
30
- # logs: 'application',
31
- # admin_logs: 'admin',
32
- # }
6
+ # config.layout = { application: 'application', admin: 'admin' }
33
7
 
34
8
  # EffectiveLogger.info('my message') macros
35
- # The following statuses are already present: info, success, error, view, change, email, sign_in, sign_out
9
+ # The following exist: info, success, error, view, change, download, email, sign_in, sign_out
36
10
  # Add more here
37
11
  config.additional_statuses = []
38
12
 
@@ -3,6 +3,7 @@ class CreateEffectiveLogging < ActiveRecord::Migration[4.2]
3
3
  create_table <%= @logs_table_name %> do |t|
4
4
  t.integer :parent_id
5
5
 
6
+ t.string :user_type
6
7
  t.integer :user_id
7
8
 
8
9
  t.string :changes_to_type
@@ -3,49 +3,16 @@ require 'effective_logging/engine'
3
3
  require 'effective_logging/version'
4
4
 
5
5
  module EffectiveLogging
6
-
7
- # The following are all valid config keys
8
- mattr_accessor :logs_table_name
9
-
10
- mattr_accessor :authorization_method
11
- mattr_accessor :layout
12
- mattr_accessor :additional_statuses
13
-
14
- mattr_accessor :active_storage_enabled
15
- mattr_accessor :email_enabled
16
- mattr_accessor :sign_in_enabled
17
- mattr_accessor :sign_out_enabled
18
-
19
6
  mattr_accessor :supressed
20
7
 
21
- def self.setup
22
- yield self
8
+ def self.config_keys
9
+ [
10
+ :logs_table_name, :layout, :additional_statuses,
11
+ :active_storage_enabled, :email_enabled, :sign_in_enabled, :sign_out_enabled
12
+ ]
23
13
  end
24
14
 
25
- def self.authorized?(controller, action, resource)
26
- @_exceptions ||= [Effective::AccessDenied, (CanCan::AccessDenied if defined?(CanCan)), (Pundit::NotAuthorizedError if defined?(Pundit))].compact
27
-
28
- return !!authorization_method unless authorization_method.respond_to?(:call)
29
- controller = controller.controller if controller.respond_to?(:controller)
30
-
31
- begin
32
- !!(controller || self).instance_exec((controller || self), action, resource, &authorization_method)
33
- rescue *@_exceptions
34
- false
35
- end
36
- end
37
-
38
- def self.authorize!(controller, action, resource)
39
- raise Effective::AccessDenied unless authorized?(controller, action, resource)
40
- end
41
-
42
- def self.supressed(&block)
43
- @@supressed = true; yield; @@supressed = false
44
- end
45
-
46
- def self.supressed?
47
- @@supressed == true
48
- end
15
+ include EffectiveGem
49
16
 
50
17
  def self.statuses
51
18
  @statuses ||= (
@@ -61,7 +28,7 @@ module EffectiveLogging
61
28
  ('sign_out' if sign_out_enabled)
62
29
  ].compact
63
30
 
64
- additional = Array(@@additional_statuses).map { |status| status.to_s.downcase }
31
+ additional = Array(additional_statuses).map { |status| status.to_s.downcase }
65
32
 
66
33
  base | additional # union
67
34
  )
@@ -73,11 +40,21 @@ module EffectiveLogging
73
40
 
74
41
  # This is set by the "set_effective_logging_current_user" before_filter.
75
42
  def self.current_user=(user)
76
- @effective_logging_current_user = user
43
+ Thread.current[:effective_logging_current_user] = user
77
44
  end
78
45
 
79
46
  def self.current_user
80
- @effective_logging_current_user
47
+ Thread.current[:effective_logging_current_user]
48
+ end
49
+
50
+ def self.supressed(&block)
51
+ Thread.current[:effective_logging_supressed] = true
52
+ yield
53
+ Thread.current[:effective_logging_supressed] = nil
54
+ end
55
+
56
+ def self.supressed?
57
+ Thread.current[:effective_logging_supressed] == true
81
58
  end
82
59
 
83
60
  end
@@ -5,37 +5,57 @@ module EffectiveLogging
5
5
  return unless message.present?
6
6
 
7
7
  # collect a Hash of arguments used to invoke EffectiveLogger.success
8
- logged_fields = { from: message.from.join(','), to: message.to, subject: message.subject, cc: message.cc, bcc: message.bcc }
8
+ fields = { from: message.from.join(','), to: message.to, subject: message.subject, cc: message.cc, bcc: message.bcc }
9
9
 
10
10
  # Add a log header to your mailer to pass some objects or additional things to EffectiveLogger
11
11
  # mail(to: 'admin@example.com', subject: @post.title, log: { post: @post })
12
12
  if message.header['log'].present?
13
13
  # This is a bit sketchy, but gives access to the object in Rails 4.2 anyway
14
- logged_fields.merge!(message.header['log'].instance_variable_get(:@value) || {})
14
+ fields.merge!(message.header['log'].instance_variable_get(:@value) || {})
15
15
 
16
16
  # Get rid of the extra header, as it should not be set in the real mail message.
17
17
  message.header['log'] = nil
18
18
  end
19
19
 
20
- body = (message.body.try(:parts) || []).find { |part| part.content_type.to_s.downcase.include?('text/html') }
21
- to = Array(message.to) - [nil, '']
20
+ # Pass a tenant to your mailer
21
+ # mail(to: 'admin@example.com', subject: @post.title, tenant: Tenant.current)
22
+ tenant = if message.header['tenant'].present?
23
+ value = message.header['tenant'].to_s.to_sym # OptionalField, not a String here
24
+ message.header['tenant'] = nil
25
+ value
26
+ end || (Tenant.current if defined?(Tenant))
22
27
 
23
- logged_fields[:email] = "#{message.header}<hr>#{(body.presence || message.body)}"
28
+ user_klass = "#{tenant.to_s.classify}::User".safe_constantize
24
29
 
25
- to.each do |to|
26
- user = (User.where(email: to).first rescue nil)
30
+ body = (message.body.try(:parts) || []).find { |part| part.content_type.to_s.downcase.include?('text/html') }
31
+ body ||= message.body
27
32
 
28
- logged_fields[:to] = to
29
- logged_fields[:associated] ||= user
30
- logged_fields[:user] ||= user
33
+ fields[:email] = "#{message.header}<hr>#{body}"
31
34
 
32
- ::EffectiveLogger.email("#{message.subject} - #{message.to.join(', ')}", logged_fields)
35
+ if tenant.present?
36
+ Tenant.as(tenant) { log_email(message, fields, user_klass) }
37
+ else
38
+ log_email(message, fields, user_klass)
33
39
  end
34
40
 
35
- if to.blank? && (message.cc.present? || message.bcc.present?)
36
- ::EffectiveLogger.email("#{message.subject} - multiple recipients", logged_fields)
41
+ true
42
+ end
43
+
44
+ private
45
+
46
+ def self.log_email(message, fields, user_klass)
47
+ tos = Array(message.to) - [nil, '']
48
+
49
+ tos.each do |to|
50
+ user = (user_klass.where(email: to.downcase).first if user_klass.present?)
51
+
52
+ user_fields = fields.merge(to: to, user: user, associated: user)
53
+ ::EffectiveLogger.email("#{message.subject} - #{tos.join(', ')}", user_fields)
37
54
  end
38
55
 
56
+ if tos.blank? && (message.cc.present? || message.bcc.present?)
57
+ ::EffectiveLogger.email("#{message.subject} - multiple recipients", fields)
58
+ end
39
59
  end
40
60
 
41
61
  end
@@ -39,7 +39,7 @@ module EffectiveLogging
39
39
  return if @_effective_logging_skip_log_page_view == true
40
40
  return if (self.class.log_page_views_opts[:skip_namespace] || []).include?(self.class.parent)
41
41
 
42
- user = EffectiveLogging.current_user || current_user
42
+ user = EffectiveLogging.current_user || (current_user if respond_to?(:current_user))
43
43
 
44
44
  if self.class.log_page_views_opts[:details] == false
45
45
  ::EffectiveLogger.view("#{request.request_method} #{request.path}", user: user)
@@ -66,4 +66,3 @@ module EffectiveLogging
66
66
 
67
67
  end
68
68
  end
69
-
@@ -9,8 +9,9 @@ module EffectiveLogging
9
9
  EffectiveLogging.current_user = current_user
10
10
 
11
11
  if block_given?
12
- yield
12
+ retval = yield
13
13
  EffectiveLogging.current_user = nil
14
+ retval
14
15
  end
15
16
  end
16
17
 
@@ -1,3 +1,3 @@
1
1
  module EffectiveLogging
2
- VERSION = '3.0.13'.freeze
2
+ VERSION = '3.1.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_logging
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.13
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-02 00:00:00.000000000 Z
11
+ date: 2021-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails