effective_logging 3.0.13 → 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.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/app/controllers/admin/logs_controller.rb +10 -8
- data/app/controllers/effective/logs_controller.rb +9 -3
- data/app/datatables/effective_logs_datatable.rb +1 -3
- data/app/models/concerns/acts_as_loggable.rb +2 -3
- data/app/models/effective/log.rb +18 -17
- data/app/models/effective_logger.rb +2 -1
- data/config/effective_logging.rb +2 -28
- data/db/migrate/01_create_effective_logging.rb.erb +1 -0
- data/lib/effective_logging.rb +19 -42
- data/lib/effective_logging/email_logger.rb +33 -13
- data/lib/effective_logging/log_page_views.rb +1 -2
- data/lib/effective_logging/set_current_user.rb +2 -1
- data/lib/effective_logging/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91790ca464dd429fb345fcbef0d15cbdebefdbd56f8685aaa8206653a7cd4350
|
4
|
+
data.tar.gz: fccd38fd9967c82487436ed7a25154bc7b84a4fc30c129691ce532683a951717
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57df8caf9cf1a316d2a4591f28ca072b08fa2fae0da1bf71cdd72474971e16637d60337eeb9ce903bfe35033c1fcf68fb7ed76e022aab47a8a7503289fd8cbbc
|
7
|
+
data.tar.gz: 0b6106eade70761e9d71602846c5000308533de2058a6f8097e8aec22439155e5e55c83fafeeaf6a7e9c9339ec19cdd17cb15b372e3b3d79a1dc623eaf8b8bdf
|
data/MIT-LICENSE
CHANGED
@@ -1,21 +1,25 @@
|
|
1
1
|
module Admin
|
2
2
|
class LogsController < ApplicationController
|
3
|
-
before_action
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
data/app/models/effective/log.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
21
|
-
|
24
|
+
associated_type :string
|
25
|
+
associated_id :integer
|
26
|
+
associated_to_s :string
|
22
27
|
|
23
|
-
|
24
|
-
|
28
|
+
status :string
|
29
|
+
message :text
|
30
|
+
details :text
|
25
31
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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].
|
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),
|
data/config/effective_logging.rb
CHANGED
@@ -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'
|
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
|
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
|
|
data/lib/effective_logging.rb
CHANGED
@@ -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.
|
22
|
-
|
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
|
-
|
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(
|
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
|
-
|
43
|
+
Thread.current[:effective_logging_current_user] = user
|
77
44
|
end
|
78
45
|
|
79
46
|
def self.current_user
|
80
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
21
|
-
|
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
|
-
|
28
|
+
user_klass = "#{tenant.to_s.classify}::User".safe_constantize
|
24
29
|
|
25
|
-
|
26
|
-
|
30
|
+
body = (message.body.try(:parts) || []).find { |part| part.content_type.to_s.downcase.include?('text/html') }
|
31
|
+
body ||= message.body
|
27
32
|
|
28
|
-
|
29
|
-
logged_fields[:associated] ||= user
|
30
|
-
logged_fields[:user] ||= user
|
33
|
+
fields[:email] = "#{message.header}<hr>#{body}"
|
31
34
|
|
32
|
-
|
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
|
-
|
36
|
-
|
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
|
-
|
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
|
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-
|
11
|
+
date: 2021-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|