audited 5.3.0 → 5.3.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of audited might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/audited/auditor.rb +7 -0
- data/lib/audited/version.rb +1 -1
- data/spec/audited/auditor_spec.rb +57 -8
- data/spec/support/active_record/models.rb +2 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 051f76b7a9cfbc91222643f2e0ddaa7738d2e446c00ec079dcf0b5d64d7146d3
|
4
|
+
data.tar.gz: 70ef8ed6c1473ca9d2ac21dc444ae66c0b8d42280e5a3c6bf4d1fe46c07f0e60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e085b0764b5feb96dc88cb5db4361f07148550368bde350a45fe21aba47ed80bfa38bb5683437bf3ad7cd983d7dbfe5f4980a80a7da0f1bf76dabea037323b58
|
7
|
+
data.tar.gz: d55bbe1f1f139efd63ac97281d954bfac440b091e292ad57b23668a456f4e389f4401c9a6e6e4ebb9627d4556a9460cb94d2d71c0f0f2f5174b0e62cb2c10968
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Audited ChangeLog
|
2
2
|
|
3
|
+
## 5.3.1 (2023-02-21)
|
4
|
+
|
5
|
+
- Ensure touch support doesn't cause double audits - @mcyoung
|
6
|
+
[#660](https://github.com/collectiveidea/audited/pull/660)
|
7
|
+
- Testing Improvements - @vlad-psh
|
8
|
+
[#628](https://github.com/collectiveidea/audited/pull/628)
|
9
|
+
- Testing Improvements - @mcyoung
|
10
|
+
[#658](https://github.com/collectiveidea/audited/pull/658)
|
11
|
+
|
3
12
|
## 5.3.0 (2023-02-14)
|
4
13
|
|
5
14
|
- Audit touch calls - @mcyoung
|
data/lib/audited/auditor.rb
CHANGED
@@ -247,6 +247,13 @@ module Audited
|
|
247
247
|
all_changes.except(*self.class.non_audited_columns)
|
248
248
|
end
|
249
249
|
|
250
|
+
if for_touch
|
251
|
+
filtered_changes.reject! do |k, v|
|
252
|
+
audits.last.audited_changes[k].to_json == v.to_json ||
|
253
|
+
audits.last.audited_changes[k].to_json == v[1].to_json
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
250
257
|
filtered_changes = redact_values(filtered_changes)
|
251
258
|
filtered_changes = filter_encrypted_attrs(filtered_changes)
|
252
259
|
filtered_changes = normalize_enum_changes(filtered_changes)
|
data/lib/audited/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
# not testing proxy_respond_to? hack / 2 methods / deprecation of `version`
|
4
|
-
# also, an additional
|
5
|
-
uncovered = ActiveRecord::VERSION::MAJOR < 6 ?
|
4
|
+
# also, an additional 5 around `after_touch` for Versions before 6.
|
5
|
+
uncovered = ActiveRecord::VERSION::MAJOR < 6 ? 14 : 9
|
6
6
|
SingleCov.covered! uncovered: uncovered
|
7
7
|
|
8
8
|
class ConditionalPrivateCompany < ::ActiveRecord::Base
|
@@ -146,7 +146,7 @@ describe Audited::Auditor do
|
|
146
146
|
end
|
147
147
|
|
148
148
|
it "should be configurable which attributes are not audited via ignored_attributes" do
|
149
|
-
Audited.ignored_attributes = ["delta", "top_secret", "created_at"]
|
149
|
+
Audited.ignored_attributes = ["delta", "top_secret", "created_at", "updated_at"]
|
150
150
|
|
151
151
|
expect(Secret.non_audited_columns).to include("delta", "top_secret", "created_at")
|
152
152
|
end
|
@@ -218,17 +218,25 @@ describe Audited::Auditor do
|
|
218
218
|
redacted = Audited::Auditor::AuditedInstanceMethods::REDACTED
|
219
219
|
user =
|
220
220
|
Models::ActiveRecord::UserMultipleRedactedAttributes.create(
|
221
|
-
password: "password"
|
222
|
-
ssn: 123456789
|
221
|
+
password: "password"
|
223
222
|
)
|
224
223
|
user.save!
|
225
224
|
expect(user.audits.last.audited_changes["password"]).to eq(redacted)
|
225
|
+
# Saving '[REDACTED]' value for 'ssn' even if value wasn't set explicitly when record was created
|
226
226
|
expect(user.audits.last.audited_changes["ssn"]).to eq(redacted)
|
227
|
+
|
227
228
|
user.password = "new_password"
|
228
229
|
user.ssn = 987654321
|
229
230
|
user.save!
|
230
231
|
expect(user.audits.last.audited_changes["password"]).to eq([redacted, redacted])
|
231
232
|
expect(user.audits.last.audited_changes["ssn"]).to eq([redacted, redacted])
|
233
|
+
|
234
|
+
# If we haven't changed any attrs from 'redacted' list, audit should not contain these keys
|
235
|
+
user.name = "new name"
|
236
|
+
user.save!
|
237
|
+
expect(user.audits.last.audited_changes).to have_key('name')
|
238
|
+
expect(user.audits.last.audited_changes).not_to have_key('password')
|
239
|
+
expect(user.audits.last.audited_changes).not_to have_key('ssn')
|
232
240
|
end
|
233
241
|
|
234
242
|
it "should redact columns in 'redacted' column with custom option" do
|
@@ -420,7 +428,7 @@ describe Audited::Auditor do
|
|
420
428
|
if ::ActiveRecord::VERSION::MAJOR >= 6
|
421
429
|
describe "on touch" do
|
422
430
|
before do
|
423
|
-
@user = create_user(name: "Brandon", status: :active
|
431
|
+
@user = create_user(name: "Brandon", status: :active)
|
424
432
|
end
|
425
433
|
|
426
434
|
it "should save an audit" do
|
@@ -437,11 +445,14 @@ describe Audited::Auditor do
|
|
437
445
|
it "should store the changed attributes" do
|
438
446
|
@user.touch(:suspended_at)
|
439
447
|
expect(@user.audits.last.audited_changes["suspended_at"][0]).to be_nil
|
440
|
-
expect(Time.parse(@user.audits.last.audited_changes["suspended_at"][1].to_s)).to be_within(
|
448
|
+
expect(Time.parse(@user.audits.last.audited_changes["suspended_at"][1].to_s)).to be_within(2.seconds).of(Time.current)
|
441
449
|
end
|
442
450
|
|
443
451
|
it "should store audit comment" do
|
444
|
-
|
452
|
+
@user.audit_comment = "Here exists a touch comment"
|
453
|
+
@user.touch(:suspended_at)
|
454
|
+
expect(@user.audits.last.action).to eq("update")
|
455
|
+
expect(@user.audits.last.comment).to eq("Here exists a touch comment")
|
445
456
|
end
|
446
457
|
|
447
458
|
it "should not save an audit if only specified on create/destroy" do
|
@@ -450,6 +461,44 @@ describe Audited::Auditor do
|
|
450
461
|
on_create_destroy.touch(:suspended_at)
|
451
462
|
}.to_not change(Audited::Audit, :count)
|
452
463
|
end
|
464
|
+
|
465
|
+
context "don't double audit" do
|
466
|
+
let(:user) { Models::ActiveRecord::Owner.create(name: "OwnerUser", suspended_at: 1.month.ago, companies_attributes: [{ name: "OwnedCompany" }]) }
|
467
|
+
let(:company) { user.companies.first }
|
468
|
+
|
469
|
+
it "should only create 1 (create) audit for object" do
|
470
|
+
expect(user.audits.count).to eq(1)
|
471
|
+
expect(user.audits.first.action).to eq("create")
|
472
|
+
end
|
473
|
+
|
474
|
+
it "should only create 1 (create) audit for nested resource" do
|
475
|
+
expect(company.audits.count).to eq(1)
|
476
|
+
expect(company.audits.first.action).to eq("create")
|
477
|
+
end
|
478
|
+
|
479
|
+
context "after creating" do
|
480
|
+
it "updating / touching nested resource shouldn't save touch audit on parent object" do
|
481
|
+
expect { company.touch(:type) }.not_to change(user.audits, :count)
|
482
|
+
expect { company.update(type: "test") }.not_to change(user.audits, :count)
|
483
|
+
end
|
484
|
+
|
485
|
+
it "updating / touching parent object shouldn't save previous data" do
|
486
|
+
expect { user.touch(:suspended_at) }.to change(user.audits, :count).from(1).to(2)
|
487
|
+
expect(user.audits.last.action).to eq("update")
|
488
|
+
expect(user.audits.last.audited_changes.keys).to eq(%w[suspended_at])
|
489
|
+
end
|
490
|
+
end
|
491
|
+
|
492
|
+
context "after updating" do
|
493
|
+
it "changing nested resource shouldn't audit owner" do
|
494
|
+
expect { user.update(username: "test") }.to change(user.audits, :count).from(1).to(2)
|
495
|
+
expect { company.update(type: "test") }.not_to change(user.audits, :count)
|
496
|
+
|
497
|
+
expect { user.touch(:suspended_at) }.to change(user.audits, :count).from(2).to(3)
|
498
|
+
expect { company.update(type: "another_test") }.not_to change(user.audits, :count)
|
499
|
+
end
|
500
|
+
end
|
501
|
+
end
|
453
502
|
end
|
454
503
|
end
|
455
504
|
|
@@ -124,11 +124,12 @@ module Models
|
|
124
124
|
audited
|
125
125
|
has_associated_audits
|
126
126
|
has_many :companies, class_name: "OwnedCompany", dependent: :destroy
|
127
|
+
accepts_nested_attributes_for :companies
|
127
128
|
end
|
128
129
|
|
129
130
|
class OwnedCompany < ::ActiveRecord::Base
|
130
131
|
self.table_name = "companies"
|
131
|
-
belongs_to :owner, class_name: "Owner"
|
132
|
+
belongs_to :owner, class_name: "Owner", touch: true
|
132
133
|
attr_accessible :name, :owner if respond_to?(:attr_accessible) # declare attr_accessible before calling aaa
|
133
134
|
audited associated_with: :owner
|
134
135
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: audited
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.3.
|
4
|
+
version: 5.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Keepers
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2023-02-
|
16
|
+
date: 2023-02-21 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: activerecord
|
@@ -252,7 +252,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
252
252
|
- !ruby/object:Gem::Version
|
253
253
|
version: '0'
|
254
254
|
requirements: []
|
255
|
-
rubygems_version: 3.
|
255
|
+
rubygems_version: 3.4.6
|
256
256
|
signing_key:
|
257
257
|
specification_version: 4
|
258
258
|
summary: Log all changes to your models
|