diff options
| author | Linus Färnstrand <linus@mullvad.net> | 2018-03-01 09:40:03 +0100 |
|---|---|---|
| committer | Linus Färnstrand <linus@mullvad.net> | 2018-03-01 09:40:03 +0100 |
| commit | a7a6a681421bc88c7789f74340a4eec0874c36b5 (patch) | |
| tree | c6535a60a3bc969cff7ff985a2258905a020ad63 | |
| parent | 13651b5bd3b4ea6f864803846c8b544ebc47dec5 (diff) | |
| parent | 2a2dd810f8941d072aa7b7fd30dc26dd510141e6 (diff) | |
| download | mullvadvpn-2018.1.tar.xz mullvadvpn-2018.1.zip | |
Merge branch 'fix-problem-report' into prepare-2018.12018.1
| -rw-r--r-- | CHANGELOG.md | 12 | ||||
| -rw-r--r-- | app/components/Support.js | 10 | ||||
| -rw-r--r-- | app/lib/problem-report.js | 59 | ||||
| -rw-r--r-- | app/main.js | 2 |
4 files changed, 45 insertions, 38 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index b00b96850c..63d10df066 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,8 +16,16 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ## [Unreleased] -## [2018.1] - 2018-02-27 -Identical to 2018.1-beta10, just removing the beta label. +## [2018.1] - 2018-03-01 +### Changed +- Redact all account numbers in the account number history from problem reports instead of only the + currently logged in one. + +### Fixed +- Increase a timeout for problem report collection to fix a timeout error on slower machines. +- Fix a memory leak in the problem report collection routine. +- Fix an issue when viewing a problem report brought up a dialog to choose the application to open + the file. ## [2018.1-beta10] - 2018-02-13 diff --git a/app/components/Support.js b/app/components/Support.js index dc646bdb0e..d1586430e0 100644 --- a/app/components/Support.js +++ b/app/components/Support.js @@ -56,16 +56,12 @@ export default class Support extends Component { }); } - _getLog() { - const toRedact = []; - if (this.props.account.accountToken) { - toRedact.push(this.props.account.accountToken.toString()); - } - + _getLog(): Promise<string> { + const accountsToRedact = this.props.account.accountHistory; const { savedReport } = this.state; return savedReport ? Promise.resolve(savedReport) : - this.props.onCollectLog(toRedact) + this.props.onCollectLog(accountsToRedact) .then( path => { return new Promise(resolve => this.setState({ savedReport: path }, () => resolve(path))); }); diff --git a/app/lib/problem-report.js b/app/lib/problem-report.js index 17130fd05d..94a435b617 100644 --- a/app/lib/problem-report.js +++ b/app/lib/problem-report.js @@ -5,39 +5,42 @@ import { ipcRenderer } from 'electron'; import { log } from './platform'; import uuid from 'uuid'; -const collectProblemReport = (toRedact: string) => { - const unAnsweredIpcCalls = new Map(); - function reapIpcCall(id) { - const promise = unAnsweredIpcCalls.get(id); - unAnsweredIpcCalls.delete(id); +const collectProblemReport = (toRedact: Array<string>): Promise<string> => { + return new Promise((resolve, reject) => { + const requestId = uuid.v4(); + let responseListener: Function; + + const removeResponseListener = () => { + ipcRenderer.removeListener('collect-logs-reply', responseListener); + }; + + // timeout after 10 seconds if no ipc response received + const requestTimeout = setTimeout(() => { + removeResponseListener(); + log.error('Timed out when collecting a problem report'); + reject(new Error('Timed out')); + }, 10000); - if (promise) { - promise.reject(new Error('Timed out')); - } - } - ipcRenderer.on('collect-logs-reply', (_event, id, err, reportId) => { - const promise = unAnsweredIpcCalls.get(id); - unAnsweredIpcCalls.delete(id); - if(promise) { - if(err) { - promise.reject(err); + responseListener = (_event, id, error, reportPath) => { + if(id !== requestId) { return; } + + clearTimeout(requestTimeout); + removeResponseListener(); + + if(error) { + log.error(`Cannot collect a problem report: ${ error.err }`); + log.error(`Stdout: ${ error.stdout }`); + reject(error); } else { - promise.resolve(reportId); + resolve(reportPath); } - } - }); - return new Promise((resolve, reject) => { + }; - const id = uuid.v4(); - unAnsweredIpcCalls.set(id, { resolve, reject }); - ipcRenderer.send('collect-logs', id, toRedact); - setTimeout(() => reapIpcCall(id), 1000); - }).catch((e) => { - const { err, stdout } = e; - log.error('Failed collecting problem report', err); - log.error(' stdout: ' + stdout); + // add ipc response listener + ipcRenderer.on('collect-logs-reply', responseListener); - throw e; + // send ipc request + ipcRenderer.send('collect-logs', requestId, toRedact); }); }; diff --git a/app/main.js b/app/main.js index 8cda655f47..639510a1d7 100644 --- a/app/main.js +++ b/app/main.js @@ -114,7 +114,7 @@ const appDelegate = { const logFiles = files.filter(file => file.endsWith('.log')) .map(f => path.join(appDelegate._logFileLocation, f)); - const reportPath = path.join(writableDirectory, uuid.v4() + '.report'); + const reportPath = path.join(writableDirectory, uuid.v4() + '.log'); const binPath = resolveBin('problem-report'); let args = [ |
