Skip to content

Commit ffb946d

Browse files
ihor-borysov-prypcobroso005
authored andcommitted
fix/add onyx mask keys
1 parent 7a30ca9 commit ffb946d

File tree

2 files changed

+56
-12
lines changed

2 files changed

+56
-12
lines changed

src/libs/ExportOnyxState/common.ts

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type OnyxState from '@src/types/onyx/OnyxState';
66
import type {MaskOnyxState} from './types';
77

88
const MASKING_PATTERN = '***';
9+
910
const keysToMask = [
1011
'plaidLinkToken',
1112
'plaidAccessToken',
@@ -21,8 +22,51 @@ const keysToMask = [
2122
'edits',
2223
'lastMessageHtml',
2324
'lastMessageText',
25+
'login',
26+
'avatar',
27+
'avatarURL',
28+
'email',
29+
'remainingWalletLimit',
30+
'walletLimit',
31+
'availableBalance',
32+
'currentBalance',
33+
'walletLinkedAccountType',
34+
'walletLimitEnforcementPeriod',
35+
'tier',
36+
'tierName',
37+
'primaryLogin',
38+
'validateCode',
39+
'displayName',
40+
'zipCode',
41+
'owner',
42+
'name',
43+
'oldPolicyName',
44+
'policyAvatar',
45+
'policyName',
46+
'receivableAccount',
47+
'payableAcct',
48+
'invoiceItem',
49+
'payableList',
50+
'merchant',
51+
'cardName',
52+
'cardNumber',
53+
'amount',
54+
'comment',
55+
'bank',
56+
'modifiedMerchant',
57+
'originalAmount'
2458
];
2559

60+
function getMaskingPattern(value: unknown) {
61+
if (typeof value === 'string') {
62+
return '*'.repeat(value.length);
63+
}
64+
if (Array.isArray(value)) {
65+
return value.map(v => (typeof v === 'string' ? '*'.repeat(v.length) : ''));
66+
}
67+
return MASKING_PATTERN;
68+
}
69+
2670
const onyxKeysToRemove: Array<ValueOf<typeof ONYXKEYS>> = [ONYXKEYS.NVP_PRIVATE_PUSH_NOTIFICATION_ID];
2771

2872
const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/;
@@ -64,7 +108,7 @@ const maskSessionDetails = (onyxState: OnyxState): OnyxState => {
64108
maskedData[key] = session[key as keyof Session];
65109
return;
66110
}
67-
maskedData[key] = MASKING_PATTERN;
111+
maskedData[key] = getMaskingPattern(session[key as keyof Session]);
68112
});
69113

70114
return {
@@ -118,20 +162,20 @@ const maskFragileData = (data: OnyxState | unknown[] | null, parentKey?: string)
118162

119163
if (keysToMask.includes(key)) {
120164
if (Array.isArray(value)) {
121-
maskedData[key] = value.map(() => MASKING_PATTERN);
165+
maskedData[key] = value.map((v) => getMaskingPattern(v));
122166
} else {
123-
maskedData[key] = MASKING_PATTERN;
167+
maskedData[key] = getMaskingPattern(value);
124168
}
125169
} else if (typeof value === 'string' && Str.isValidEmail(value)) {
126170
maskedData[propertyName] = maskEmail(value);
127171
} else if (typeof value === 'string' && stringContainsEmail(value)) {
128172
maskedData[propertyName] = replaceEmailInString(value, maskEmail(extractEmail(value) ?? ''));
129173
} else if (parentKey && parentKey.includes(ONYXKEYS.COLLECTION.REPORT_ACTIONS) && (propertyName === 'text' || propertyName === 'html')) {
130-
maskedData[key] = MASKING_PATTERN;
174+
maskedData[key] = getMaskingPattern(value);
131175
} else if (typeof value === 'object') {
132176
maskedData[propertyName] = maskFragileData(value as OnyxState, propertyName.includes(ONYXKEYS.COLLECTION.REPORT_ACTIONS) ? propertyName : parentKey);
133177
} else {
134-
maskedData[propertyName] = value;
178+
maskedData[propertyName] = getMaskingPattern(value);
135179
}
136180
});
137181

tests/unit/ExportOnyxStateTest.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ describe('maskOnyxState', () => {
1818
const input = {session: mockSession};
1919
const result = ExportOnyxState.maskOnyxState(input) as ExampleOnyxState;
2020

21-
expect(result.session.authToken).toBe('***');
22-
expect(result.session.encryptedAuthToken).toBe('***');
21+
expect(result.session.authToken).toBe('********************');
22+
expect(result.session.encryptedAuthToken).toBe('*************************');
2323
});
2424

2525
it('should not mask fragile data when isMaskingFragileDataEnabled is false', () => {
@@ -28,8 +28,8 @@ describe('maskOnyxState', () => {
2828
};
2929
const result = ExportOnyxState.maskOnyxState(input) as ExampleOnyxState;
3030

31-
expect(result.session.authToken).toBe('***');
32-
expect(result.session.encryptedAuthToken).toBe('***');
31+
expect(result.session.authToken).toBe('********************');
32+
expect(result.session.encryptedAuthToken).toBe('*************************');
3333
expect(result.session.email).toBe('[email protected]');
3434
});
3535

@@ -39,8 +39,8 @@ describe('maskOnyxState', () => {
3939
};
4040
const result = ExportOnyxState.maskOnyxState(input, true) as ExampleOnyxState;
4141

42-
expect(result.session.authToken).toBe('***');
43-
expect(result.session.encryptedAuthToken).toBe('***');
42+
expect(result.session.authToken).toBe('********************');
43+
expect(result.session.encryptedAuthToken).toBe('*************************');
4444
});
4545

4646
it('should mask emails as a string value in property with a random email', () => {
@@ -96,7 +96,7 @@ describe('maskOnyxState', () => {
9696

9797
const result = ExportOnyxState.maskOnyxState(input, true) as ExampleOnyxState;
9898

99-
expect(result.edits).toEqual(['***', '***']);
99+
expect(result.edits).toEqual(['***', '**']);
100100
expect(result.lastMessageHtml).toEqual('***');
101101
});
102102
});

0 commit comments

Comments
 (0)