diff --git a/js/modules/privacy.js b/js/modules/privacy.js index 154535a9e..de218bbe8 100644 --- a/js/modules/privacy.js +++ b/js/modules/privacy.js @@ -7,9 +7,10 @@ const { compose } = require('lodash/fp'); const { escapeRegExp } = require('lodash'); const APP_ROOT_PATH = path.join(__dirname, '..', '..', '..'); -const SESSION_ID_PATTERN = /\b(05[0-9a-f]{64})\b/gi; -const SNODE_PATTERN = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; +const SESSION_ID_PATTERN = /\b((05)?[0-9a-f]{64})\b/gi; +const SNODE_PATTERN = /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/; const GROUP_ID_PATTERN = /(group\()([^)]+)(\))/g; +const SERVER_URL_PATTERN = /https?:\/\/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/g; const REDACTION_PLACEHOLDER = '[REDACTED]'; // _redactPath :: Path -> String -> String @@ -73,6 +74,14 @@ exports.redactSnodeIP = text => { return text.replace(SNODE_PATTERN, REDACTION_PLACEHOLDER); }; +exports.redactServerUrl = text => { + if (!is.string(text)) { + throw new TypeError("'text' must be a string"); + } + + return text.replace(SERVER_URL_PATTERN, REDACTION_PLACEHOLDER); +}; + // redactGroupIds :: String -> String exports.redactGroupIds = text => { if (!is.string(text)) { @@ -94,7 +103,8 @@ exports.redactAll = compose( exports.redactSensitivePaths, exports.redactGroupIds, exports.redactSessionID, - exports.redactSnodeIP + exports.redactSnodeIP, + exports.redactServerUrl ); const removeNewlines = text => text.replace(/\r?\n|\r/g, ''); diff --git a/package.json b/package.json index 186e76c3b..a5f17d86e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "session-desktop", "productName": "Session", "description": "Private messaging from your desktop", - "version": "1.5.2", + "version": "1.5.3", "license": "GPL-3.0", "author": { "name": "Loki Project", diff --git a/test/modules/privacy_test.js b/test/modules/privacy_test.js index e51959f6a..2596351b1 100644 --- a/test/modules/privacy_test.js +++ b/test/modules/privacy_test.js @@ -63,20 +63,28 @@ describe('Privacy', () => { 'This is a log line with sensitive information:\n' + `path1 ${APP_ROOT_PATH}/main.js\n` + 'phone1 0531032fc7415b7cc1b7516480ad121d391eddce3cfb2cee27dd5b215609c32827 ipsum\n' + + 'group 31032fc7415b7cc1b7516480ad121d391eddce3cfb2cee27dd5b215609c32827 eeee\n' + 'group1 group(123456789) doloret\n' + `path2 file:///${encodedAppRootPath}/js/background.js.` + 'phone2 0531033dc7415b7cc1b7516480ad121d391eddce3cfb2cee27dd5b215609c32827 lorem\n' + - 'group2 group(abcdefghij) doloret\n'; + 'group2 group(abcdefghij) doloret\n' + + 'url1 https://you-have-to-hide.me aaa\n' + + 'url1 http://you-have-to-hide.me bbb\n' + + 'url1 127.0.0.1:22021 ccc\n'; const actual = Privacy.redactAll(text); const expected = 'This is a log line with sensitive information:\n' + 'path1 [REDACTED]/main.js\n' + 'phone1 [REDACTED] ipsum\n' + + 'group [REDACTED] eeee\n' + 'group1 group([REDACTED]789) doloret\n' + 'path2 file:///[REDACTED]/js/background.js.' + 'phone2 [REDACTED] lorem\n' + - 'group2 group([REDACTED]hij) doloret\n'; + 'group2 group([REDACTED]hij) doloret\n' + + 'url1 [REDACTED] aaa\n' + + 'url1 [REDACTED] bbb\n' + + 'url1 [REDACTED]:22021 ccc\n'; assert.equal(actual, expected); }); }); diff --git a/ts/components/UserDetailsDialog.tsx b/ts/components/UserDetailsDialog.tsx index 70e4e0301..70276c53d 100644 --- a/ts/components/UserDetailsDialog.tsx +++ b/ts/components/UserDetailsDialog.tsx @@ -64,7 +64,7 @@ export class UserDetailsDialog extends React.Component { private renderAvatar() { const { avatarPath, pubkey, profileName } = this.props; const size = this.state.isEnlargedImageShown ? 300 : 80; - const userName = name || profileName || pubkey; + const userName = profileName || pubkey; return ( = (() => PromiseLike) | (() => ResultType); // TODO: This needs to replace js/modules/job_queue.js export class JobQueue { - private pending: Promise = Promise.resolve(); + private pending?: Promise = Promise.resolve(); private readonly jobs: Map> = new Map(); public has(id: string): boolean {