Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
fb8fd00
[WIP] Added another round of string truncation after applying data ma…
jongpie May 8, 2025
8b398fb
Refactored repetitive logic in LogEntryEventBuilder for truncating + …
jongpie May 9, 2025
ba88fcf
Added integration tests to validate the 3 included data masking rules…
jongpie May 9, 2025
5a3b3bc
[WIP] Added new *Truncated__c fields on LogEntry__c that correspond t…
jongpie May 9, 2025
68aa492
Moved some test methods for data masking rules to a new extra-tests c…
jongpie May 9, 2025
46549ff
Added new bundled data mask rule for AMEX credit card numbers
jongpie May 9, 2025
33f6f67
Added mappings in LogEntryEventHandler for new *Truncated__c fields
jongpie May 13, 2025
435b8b0
Bumped package version number, name, and description
jongpie May 13, 2025
4b1005a
Added inline help text to the new *Truncated__c fields on LogEntry__c
jongpie May 13, 2025
6d0d242
Added extra Apex script to generate sample records with masked + trun…
jongpie May 13, 2025
4bfa097
Fixed some PMD scan violations
jongpie May 13, 2025
1bbe0c9
Bumped the managed package's sfdx-project.json file to v4.17.0 (Summe…
jongpie May 20, 2025
6017dad
Added more pipeline-only tests for validating the CMDT records bundle…
jongpie May 20, 2025
d58c5a5
Scope creep: restructured extra-tests directory to add some organizat…
jongpie May 21, 2025
7b28450
Reverted data mask rule for social security numbers to use X instead …
jongpie May 21, 2025
a6aee8d
Created new core unlocked package version
actions-user May 21, 2025
ac9aa5e
Generated updated package.xml manifest file for core unlocked package…
actions-user May 21, 2025
c438d99
[skip ci] Made a few small corrections to comments in CMDT_LogStatus_…
jongpie May 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 0 additions & 18 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -174,9 +174,6 @@ jobs:
- name: 'Assign Logger Admin Permission Set'
run: npm run permset:assign:admin

- name: 'Validate Custom Metadata Records'
run: npx sf apex run --file ./scripts/build/validate-custom-metadata-records.apex

# Nebula Logger has functionality that queries the AuthSession object when the current user has an active session.
# The code should work with or without an active session, so the pipeline runs the tests twice - asynchronously and synchronously.
# This is done because, based on how you execute Apex tests, the running user may have an active session (synchrously) or not (asynchronously).
Expand Down Expand Up @@ -242,9 +239,6 @@ jobs:
- name: 'Assign Logger Admin Permission Set'
run: npm run permset:assign:admin

- name: 'Validate Custom Metadata Records'
run: npx sf apex run --file ./scripts/build/validate-custom-metadata-records.apex

# Nebula Logger has functionality that queries the AuthSession object when the current user has an active session.
# The code should work with or without an active session, so the pipeline runs the tests twice - asynchronously and synchronously.
# This is done because, based on how you execute Apex tests, the running user may have an active session (synchrously) or not (asynchronously).
Expand Down Expand Up @@ -310,9 +304,6 @@ jobs:
- name: 'Assign Logger Admin Permission Set'
run: npm run permset:assign:admin

- name: 'Validate Custom Metadata Records'
run: npx sf apex run --file ./scripts/build/validate-custom-metadata-records.apex

# Nebula Logger has functionality that queries the AuthSession object when the current user has an active session.
# The code should work with or without an active session, so the pipeline runs the tests twice - asynchronously and synchronously.
# This is done because, based on how you execute Apex tests, the running user may have an active session (synchrously) or not (asynchronously).
Expand Down Expand Up @@ -381,9 +372,6 @@ jobs:
- name: 'Assign Logger Admin Permission Set'
run: npm run permset:assign:admin

- name: 'Validate Custom Metadata Records'
run: npx sf apex run --file ./scripts/build/validate-custom-metadata-records.apex

# Nebula Logger has functionality that queries the AuthSession object when the current user has an active session.
# The code should work with or without an active session, so the pipeline runs the tests twice - asynchronously and synchronously.
# This is done because, based on how you execute Apex tests, the running user may have an active session (synchrously) or not (asynchronously).
Expand Down Expand Up @@ -456,9 +444,6 @@ jobs:
- name: 'Assign Logger Admin Permission Set'
run: npm run permset:assign:admin

- name: 'Validate Custom Metadata Records'
run: npx sf apex run --file ./scripts/build/validate-custom-metadata-records.apex

# Nebula Logger has functionality that queries the AuthSession object when the current user has an active session.
# The code should work with or without an active session, so the pipeline runs the tests twice - asynchronously and synchronously.
# This is done because, based on how you execute Apex tests, the running user may have an active session (synchrously) or not (asynchronously).
Expand Down Expand Up @@ -524,9 +509,6 @@ jobs:
- name: 'Assign Logger Admin Permission Set'
run: npm run permset:assign:admin

- name: 'Validate Custom Metadata Records'
run: npx sf apex run --file ./scripts/build/validate-custom-metadata-records.apex

# Nebula Logger has functionality that queries the AuthSession object when the current user has an active session.
# The code should work with or without an active session, so the pipeline runs the tests twice - asynchronously and synchronously.
# This is done because, based on how you execute Apex tests, the running user may have an active session (synchrously) or not (asynchronously).
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@

The most robust observability solution for Salesforce experts. Built 100% natively on the platform, and designed to work seamlessly with Apex, Lightning Components, Flow, OmniStudio, and integrations.

## Unlocked Package - v4.16.0
## Unlocked Package - v4.16.1

[![Install Unlocked Package in a Sandbox](./images/btn-install-unlocked-package-sandbox.png)](https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015pGyQAI)
[![Install Unlocked Package in Production](./images/btn-install-unlocked-package-production.png)](https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015pGyQAI)
[![Install Unlocked Package in a Sandbox](./images/btn-install-unlocked-package-sandbox.png)](https://test.salesforce.com/packaging/installPackage.apexp?p0=04tKe0000011MXEIA2)
[![Install Unlocked Package in Production](./images/btn-install-unlocked-package-production.png)](https://login.salesforce.com/packaging/installPackage.apexp?p0=04tKe0000011MXEIA2)
[![View Documentation](./images/btn-view-documentation.png)](https://github.com/jongpie/NebulaLogger/wiki)

`sf package install --wait 20 --security-type AdminsOnly --package 04t5Y0000015pGyQAI`
`sf package install --wait 20 --security-type AdminsOnly --package 04tKe0000011MXEIA2`

---

Expand Down
11 changes: 11 additions & 0 deletions nebula-logger/core.package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@
<members>LogEntryEvent__e.ExceptionStackTrace__c</members>
<members>LogEntryEvent__e.ExceptionType__c</members>
<members>LogEntryEvent__e.HttpRequestBodyMasked__c</members>
<members>LogEntryEvent__e.HttpRequestBodyTruncated__c</members>
<members>LogEntryEvent__e.HttpRequestBody__c</members>
<members>LogEntryEvent__e.HttpRequestCompressed__c</members>
<members>LogEntryEvent__e.HttpRequestEndpointAddress__c</members>
Expand All @@ -164,6 +165,7 @@
<members>LogEntryEvent__e.HttpRequestHeaders__c</members>
<members>LogEntryEvent__e.HttpRequestMethod__c</members>
<members>LogEntryEvent__e.HttpResponseBodyMasked__c</members>
<members>LogEntryEvent__e.HttpResponseBodyTruncated__c</members>
<members>LogEntryEvent__e.HttpResponseBody__c</members>
<members>LogEntryEvent__e.HttpResponseHeaderKeys__c</members>
<members>LogEntryEvent__e.HttpResponseHeaders__c</members>
Expand Down Expand Up @@ -248,12 +250,14 @@
<members>LogEntryEvent__e.RecordCollectionType__c</members>
<members>LogEntryEvent__e.RecordId__c</members>
<members>LogEntryEvent__e.RecordJsonMasked__c</members>
<members>LogEntryEvent__e.RecordJsonTruncated__c</members>
<members>LogEntryEvent__e.RecordJson__c</members>
<members>LogEntryEvent__e.RecordSObjectClassification__c</members>
<members>LogEntryEvent__e.RecordSObjectTypeNamespace__c</members>
<members>LogEntryEvent__e.RecordSObjectType__c</members>
<members>LogEntryEvent__e.RequestId__c</members>
<members>LogEntryEvent__e.RestRequestBodyMasked__c</members>
<members>LogEntryEvent__e.RestRequestBodyTruncated__c</members>
<members>LogEntryEvent__e.RestRequestBody__c</members>
<members>LogEntryEvent__e.RestRequestHeaderKeys__c</members>
<members>LogEntryEvent__e.RestRequestHeaders__c</members>
Expand All @@ -263,6 +267,7 @@
<members>LogEntryEvent__e.RestRequestResourcePath__c</members>
<members>LogEntryEvent__e.RestRequestUri__c</members>
<members>LogEntryEvent__e.RestResponseBodyMasked__c</members>
<members>LogEntryEvent__e.RestResponseBodyTruncated__c</members>
<members>LogEntryEvent__e.RestResponseBody__c</members>
<members>LogEntryEvent__e.RestResponseHeaderKeys__c</members>
<members>LogEntryEvent__e.RestResponseHeaders__c</members>
Expand Down Expand Up @@ -394,6 +399,7 @@
<members>LogEntry__c.HasRestResponseHeaders__c</members>
<members>LogEntry__c.HasStackTrace__c</members>
<members>LogEntry__c.HttpRequestBodyMasked__c</members>
<members>LogEntry__c.HttpRequestBodyTruncated__c</members>
<members>LogEntry__c.HttpRequestBody__c</members>
<members>LogEntry__c.HttpRequestCompressed__c</members>
<members>LogEntry__c.HttpRequestEndpointAddress__c</members>
Expand All @@ -402,6 +408,7 @@
<members>LogEntry__c.HttpRequestHeaders__c</members>
<members>LogEntry__c.HttpRequestMethod__c</members>
<members>LogEntry__c.HttpResponseBodyMasked__c</members>
<members>LogEntry__c.HttpResponseBodyTruncated__c</members>
<members>LogEntry__c.HttpResponseBody__c</members>
<members>LogEntry__c.HttpResponseHeaderKeys__c</members>
<members>LogEntry__c.HttpResponseHeaders__c</members>
Expand Down Expand Up @@ -490,13 +497,15 @@
<members>LogEntry__c.RecordDetailedLink__c</members>
<members>LogEntry__c.RecordId__c</members>
<members>LogEntry__c.RecordJsonMasked__c</members>
<members>LogEntry__c.RecordJsonTruncated__c</members>
<members>LogEntry__c.RecordJson__c</members>
<members>LogEntry__c.RecordLink__c</members>
<members>LogEntry__c.RecordName__c</members>
<members>LogEntry__c.RecordSObjectClassification__c</members>
<members>LogEntry__c.RecordSObjectTypeNamespace__c</members>
<members>LogEntry__c.RecordSObjectType__c</members>
<members>LogEntry__c.RestRequestBodyMasked__c</members>
<members>LogEntry__c.RestRequestBodyTruncated__c</members>
<members>LogEntry__c.RestRequestBody__c</members>
<members>LogEntry__c.RestRequestHeaderKeys__c</members>
<members>LogEntry__c.RestRequestHeaders__c</members>
Expand All @@ -506,6 +515,7 @@
<members>LogEntry__c.RestRequestResourcePath__c</members>
<members>LogEntry__c.RestRequestUri__c</members>
<members>LogEntry__c.RestResponseBodyMasked__c</members>
<members>LogEntry__c.RestResponseBodyTruncated__c</members>
<members>LogEntry__c.RestResponseBody__c</members>
<members>LogEntry__c.RestResponseHeaderKeys__c</members>
<members>LogEntry__c.RestResponseHeaders__c</members>
Expand Down Expand Up @@ -700,6 +710,7 @@
<name>CustomIndex</name>
</types>
<types>
<members>LogEntryDataMaskRule.AmericanExpressCreditCardNumber</members>
<members>LogEntryDataMaskRule.MastercardCreditCardNumber</members>
<members>LogEntryDataMaskRule.SocialSecurityNumber</members>
<members>LogEntryDataMaskRule.VisaCreditCardNumber</members>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<CustomMetadata xmlns="http://soap.sforce.com/2006/04/metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<label>American Express Credit Card Number</label>
<protected>false</protected>
<values>
<field>ApplyToMessage__c</field>
<value xsi:type="xsd:boolean">true</value>
</values>
<values>
<field>ApplyToRecordJson__c</field>
<value xsi:type="xsd:boolean">true</value>
</values>
<values>
<field>IsEnabled__c</field>
<value xsi:type="xsd:boolean">true</value>
</values>
<values>
<field>ReplacementRegEx__c</field>
<value xsi:type="xsd:string">$1****-******-$4</value>
</values>
<values>
<field>SensitiveDataRegEx__c</field>
<value xsi:type="xsd:string">(^|[^0-9A-Za-z])(3[47]\d{2})([- ]?)\d{6}\3(\d{5})(?=[^0-9A-Za-z]|$)</value>
</values>
</CustomMetadata>
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
</values>
<values>
<field>ReplacementRegEx__c</field>
<value xsi:type="xsd:string">$1****-****-****-$5</value>
<value xsi:type="xsd:string">$1****-****-****-$4</value>
</values>
<values>
<field>SensitiveDataRegEx__c</field>
<value xsi:type="xsd:string">(^|[ ])(5\d{3})[- ]*(\d{4})[- ]*(\d{4})[- ]*(\d{4})</value>
<value xsi:type="xsd:string">(^|[^0-9])(5[1-5]\d{2}|222[1-9]|22[3-9]\d|2[3-6]\d{2}|27[01]\d|2720)([- ]?)\d{4}\3\d{4}\3(\d{4})(?!\d)</value>
</values>
</CustomMetadata>
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
</values>
<values>
<field>ReplacementRegEx__c</field>
<value xsi:type="xsd:string">$1XXX-XX-$4$5</value>
<value xsi:type="xsd:string">$1XXX-XX-$4</value>
</values>
<values>
<field>SensitiveDataRegEx__c</field>
<value xsi:type="xsd:string">(^|[ ])(\d{3})[- ]*(\d{2})[- ]*(\d{4})([ ]|$)</value>
<value xsi:type="xsd:string">(^|[^0-9A-Za-z])(\d{3})[- ]?(\d{2})[- ]?(\d{4})(?=[^0-9A-Za-z]|$)</value>
</values>
</CustomMetadata>
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
</values>
<values>
<field>ReplacementRegEx__c</field>
<value xsi:type="xsd:string">$1****-****-****-$5</value>
<value xsi:type="xsd:string">$1****-****-****-$4</value>
</values>
<values>
<field>SensitiveDataRegEx__c</field>
<value xsi:type="xsd:string">(^|[ ])(4\d{3})[- ]*(\d{4})[- ]*(\d{4})[- ]*(\d{4})</value>
<value xsi:type="xsd:string">(^|[^0-9])(4\d{3})([- ]?)\d{4}\3\d{4}\3(\d{4})(?!\d)</value>
</values>
</CustomMetadata>
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ public without sharing class LogEntryEventHandler extends LoggerSObjectHandler {
ExceptionType__c = logEntryEvent.ExceptionType__c,
HttpRequestBody__c = logEntryEvent.HttpRequestBody__c,
HttpRequestBodyMasked__c = logEntryEvent.HttpRequestBodyMasked__c,
HttpRequestBodyTruncated__c = logEntryEvent.HttpRequestBodyTruncated__c,
HttpRequestCompressed__c = logEntryEvent.HttpRequestCompressed__c,
HttpRequestEndpoint__c = logEntryEvent.HttpRequestEndpoint__c,
HttpRequestEndpointAddress__c = logEntryEvent.HttpRequestEndpointAddress__c,
Expand All @@ -295,6 +296,7 @@ public without sharing class LogEntryEventHandler extends LoggerSObjectHandler {
HttpRequestMethod__c = logEntryEvent.HttpRequestMethod__c,
HttpResponseBody__c = logEntryEvent.HttpResponseBody__c,
HttpResponseBodyMasked__c = logEntryEvent.HttpResponseBodyMasked__c,
HttpResponseBodyTruncated__c = logEntryEvent.HttpResponseBodyTruncated__c,
HttpResponseHeaderKeys__c = logEntryEvent.HttpResponseHeaderKeys__c,
HttpResponseHeaders__c = logEntryEvent.HttpResponseHeaders__c,
HttpResponseStatus__c = logEntryEvent.HttpResponseStatus__c,
Expand Down Expand Up @@ -349,11 +351,13 @@ public without sharing class LogEntryEventHandler extends LoggerSObjectHandler {
RecordId__c = logEntryEvent.RecordId__c,
RecordJson__c = logEntryEvent.RecordJson__c,
RecordJsonMasked__c = logEntryEvent.RecordJsonMasked__c,
RecordJsonTruncated__c = logEntryEvent.RecordJsonTruncated__c,
RecordSObjectClassification__c = logEntryEvent.RecordSObjectClassification__c,
RecordSObjectType__c = logEntryEvent.RecordSObjectType__c,
RecordSObjectTypeNamespace__c = logEntryEvent.RecordSObjectTypeNamespace__c,
RestRequestBody__c = logEntryEvent.RestRequestBody__c,
RestRequestBodyMasked__c = logEntryEvent.RestRequestBodyMasked__c,
RestRequestBodyTruncated__c = logEntryEvent.RestRequestBodyTruncated__c,
RestRequestHeaderKeys__c = logEntryEvent.RestRequestHeaderKeys__c,
RestRequestHeaders__c = logEntryEvent.RestRequestHeaders__c,
RestRequestMethod__c = logEntryEvent.RestRequestMethod__c,
Expand All @@ -363,6 +367,7 @@ public without sharing class LogEntryEventHandler extends LoggerSObjectHandler {
RestRequestUri__c = logEntryEvent.RestRequestUri__c,
RestResponseBody__c = logEntryEvent.RestResponseBody__c,
RestResponseBodyMasked__c = logEntryEvent.RestResponseBodyMasked__c,
RestResponseBodyTruncated__c = logEntryEvent.RestResponseBodyTruncated__c,
RestResponseHeaderKeys__c = logEntryEvent.RestResponseHeaderKeys__c,
RestResponseHeaders__c = logEntryEvent.RestResponseHeaders__c,
RestResponseStatusCode__c = logEntryEvent.RestResponseStatusCode__c,
Expand Down
Loading