[MM-47202] - Desktop diagnostics (#2439)

* Add custom assertion to match object in array (#2358)

* Add custom assertion to match object in array

* Remove test that is not implemented yet

* [MM-48213] Add "Run diagnostics" menu item under Help (#2359)

* Add submenu item that runs diagnostics

* Add custom assertion to match object in array

* Remove test that is not implemented yet

* Add tests

* Add translation

* [MM-47206] Diagnostics steps setup (#2361)

* Add baseline code for diagnostics and their steps

* Fix failing test

* [MM-47206] [MM-48155] Obfuscate logs (#2369)

* Add logging hooks to mask sensitive data

* Add hook that truncates long strings in diagnostics logs

* Add template file for creating steps

* Add readme inside diagnostics

* [MM-48145] Diagnostics step 2 - internet connectivity (#2372)

* Add diagnostics step 2 - internet connectivity check

* Update tests

* [MM-48144] Diagnostics Step - Configure logger (#2390)

* Configure logger

* Move configure logger into step1

* Add file extension to fileName variable

* Diagnostics Step 2: Validate configuration (#2391)

* Resolve conflicts with base branch

* Update test and implement Code review suggestion

* Fix failing test

* [MM-48147]Diagnostics step 3 - server connectivity (#2397)

* Add step3: Check server connectivity by using the /api/v4/system/ping endpoint

* Fix failing tests

* Add better obfuscator functions that mask all types of data (#2399)

* Add better obfuscator functions that mask all types of data(string, array, objects)

* Update tests

* [MM-48148] Add Diagnostics step 4 - session validation (#2398)

* Add diagnostics step 4 - session data validation

* Fix failing tests

* [MM-48152] Add diagnostics step 5 - BrowserWindows checks (#2404)

* Add diagnostics step 5 - browserwindow checks for main window

* Add tests

* [MM-48151] Diagnostics step 6 - Permissions (#2409)

* Add diagnostics step 6 - Permissions check

* Check permissions for microphone ond screen onn mac, windows

* Update tests count in tests

* [MM-48551] Diagnostics step 7 - Performance & Memory (#2410)

* Add diagnostics step 6 - Permissions check

* Check permissions for microphone ond screen onn mac, windows

* Update tests count in tests

* Add diagnostics step 7 - performance and memory

* Fix failing tests

* [MM-48153] Add diagnostics step 8 - Log heuristics (#2418)

* Add diagnostics step 8 - Log heuristics

* Add diagnostics step 9 - config (#2422)

* [MM-48556] Diagnostics Step 10 - Crash reports (#2423)

* Add diagnostics step 9 - config

* Add diagnostics step 10 - include crash reports

* Update tests

* Add diagnostics step 11 - cookies report (#2427)

* [MM-48157] Diagnostics report (#2432)

* Add better logging and pretty print report

* Update last step

* Update log message

* Move log after hooks so that path is masked

* Use correct directory for diagnostics files
This commit is contained in:
Tasos Boulis
2022-12-02 16:33:42 +02:00
committed by GitHub
parent 567b48516b
commit 161ae99e94
36 changed files with 1809 additions and 30 deletions

View File

@@ -24,6 +24,7 @@ jest.mock('main/Validator', () => ({
validateV1ConfigData: (configData) => (configData.version === 1 ? configData : null),
validateV2ConfigData: (configData) => (configData.version === 2 ? configData : null),
validateV3ConfigData: (configData) => (configData.version === 3 ? configData : null),
validateConfigData: (configData) => (configData.version === 3 ? configData : null),
}));
jest.mock('common/tabs/TabView', () => ({

View File

@@ -357,19 +357,8 @@ export class Config extends EventEmitter {
configData = this.readFileSync(this.configFilePath);
// validate based on config file version
switch (configData.version) {
case 3:
configData = Validator.validateV3ConfigData(configData)!;
break;
case 2:
configData = Validator.validateV2ConfigData(configData)!;
break;
case 1:
configData = Validator.validateV1ConfigData(configData)!;
break;
default:
configData = Validator.validateV0ConfigData(configData)!;
}
configData = Validator.validateConfigData(configData);
if (!configData) {
throw new Error('Provided configuration file does not validate, using defaults instead.');
}

View File

@@ -0,0 +1,49 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {REGEX_EMAIL} from './constants';
const VALID_EMAILS_LIST = [
['email@example.com'],
['firstname.lastname@example.com'],
['disposable.style.email.with+symbol@example.com'],
['other.email-with-hyphen@example.com'],
['fully-qualified-domain@example.com'],
['user.name+tag+sorting@example.com'],
['x@example.com'],
['example-indeed@strange-example.com'],
['test/test@test.com'],
['admin@mailserver1'],
['example@s.example'],
['john..doe@example.org'],
['mailhost!username@example.org'],
['user%example.com@example.org'],
['user-@example.org'],
['email@subdomain.example.com'],
['firstname+lastname@example.com'],
['email@123.123.123.123'],
['1234567890@example.com'],
['email@example-one.com'],
['_______@example.com'],
['email@example.name'],
['email@example.museum'],
['email@example.co.jp'],
['firstname-lastname@example.com'],
];
const INVALID_EMAILS_LIST = [
['Abc.example.com'],
['QA[icon]CHOCOLATE[icon]@test.com'],
];
describe('main/common/constants', () => {
describe('Email regular expression', () => {
it.each(VALID_EMAILS_LIST)('%#:Should be VALID email address: %s', (a) => {
expect(REGEX_EMAIL.test(a)).toBe(true);
});
it.each(INVALID_EMAILS_LIST)('%#: Should be INVALID email address: %s', (a) => {
expect(REGEX_EMAIL.test(a)).toBe(false);
});
});
});

View File

@@ -20,3 +20,29 @@ export const UPDATE_DOWNLOAD_ITEM: Omit<DownloadedItem, 'filename' | 'state'> =
receivedBytes: 0,
totalBytes: 0,
};
// Regular expressions
export const REGEX_EMAIL = /[a-zA-Z0-9.!#$%&*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*/; // based on W3C input type email regex
export const REGEX_IPV4 = /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/;
export const REGEX_URL = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/;
export const REGEX_PATH_WIN32 = /(?:[a-z]:)?[/\\](?:[./\\ ](?![./\\\n])|[^<>:"|?*./\\ \n])+[a-zA-Z0-9]./;
export const REGEX_PATH_DARWIN = /([/]{1}[a-z0-9.]+)+(\/?)|^([/])/;
export const REGEX_PATH_LINUX = /([/]{1}[a-z0-9.]+)+(\/?)|^([/])/; // same as darwin
export const REGEX_LOG_FILE_LINE = /\[(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3})\]\s\[(silly|debug|verbose|info|warn|error)\]\s+(.*)/;
// Masks
export const MASK_EMAIL = 'EMAIL';
export const MASK_IPV4 = 'IPV4';
export const MASK_PATH = 'PATH';
export const MASK_URL = 'URL';
export const LOGS_MAX_STRING_LENGTH = 63;
// We use this URL inside the Diagnostics to check if the computer has internet connectivity
export const IS_ONLINE_ENDPOINT = 'https://community.mattermost.com/api/v4/system/ping';
export const COOKIE_NAME_USER_ID = 'MMUSERID';
export const COOKIE_NAME_CSRF = 'MMCSRF';
export const COOKIE_NAME_AUTH_TOKEN = 'MMAUTHTOKEN';