summaryrefslogtreecommitdiffhomepage
path: root/gui/src
diff options
context:
space:
mode:
authorOskar Nyberg <oskar@mullvad.net>2020-12-09 16:31:50 +0100
committerOskar Nyberg <oskar@mullvad.net>2020-12-10 11:30:31 +0100
commit6a8cf020b3a561b28773831fc2cef4066d445884 (patch)
tree98b494619e4ddde3949011f06082ef48e493b04b /gui/src
parentae3cae40c16b01683b2a562ac48799699c711ca2 (diff)
downloadmullvadvpn-6a8cf020b3a561b28773831fc2cef4066d445884.tar.xz
mullvadvpn-6a8cf020b3a561b28773831fc2cef4066d445884.zip
Move problem report ipc calls to ipc-event-channel
Diffstat (limited to 'gui/src')
-rw-r--r--gui/src/main/index.ts67
-rw-r--r--gui/src/renderer/app.tsx12
-rw-r--r--gui/src/renderer/containers/SupportPage.tsx10
-rw-r--r--gui/src/renderer/lib/problem-report.ts53
-rw-r--r--gui/src/shared/ipc-event-channel.ts4
5 files changed, 43 insertions, 103 deletions
diff --git a/gui/src/main/index.ts b/gui/src/main/index.ts
index 36744104b5..f0cd89a52d 100644
--- a/gui/src/main/index.ts
+++ b/gui/src/main/index.ts
@@ -1097,52 +1097,36 @@ class ApplicationMain {
}
});
- ipcMain.on(
- 'collect-logs',
- (event: Electron.IpcMainEvent, requestId: string, toRedact: string[]) => {
- const reportPath = path.join(app.getPath('temp'), uuid.v4() + '.log');
- const executable = resolveBin('mullvad-problem-report');
- const args = ['collect', '--output', reportPath];
- if (toRedact.length > 0) {
- args.push('--redact', ...toRedact);
- }
+ IpcMainEventChannel.problemReport.handleCollectLogs((toRedact) => {
+ const reportPath = path.join(app.getPath('temp'), uuid.v4() + '.log');
+ const executable = resolveBin('mullvad-problem-report');
+ const args = ['collect', '--output', reportPath];
+ if (toRedact.length > 0) {
+ args.push('--redact', ...toRedact);
+ }
+ return new Promise((resolve, reject) => {
execFile(executable, args, { windowsHide: true }, (error, stdout, stderr) => {
if (error) {
log.error(
`Failed to collect a problem report.
- Stdout: ${stdout.toString()}
- Stderr: ${stderr.toString()}`,
+ Stdout: ${stdout.toString()}
+ Stderr: ${stderr.toString()}`,
);
-
- event.sender.send('collect-logs-reply', requestId, {
- success: false,
- error: error.message,
- });
+ reject(error.message);
} else {
log.debug(`Problem report was written to ${reportPath}`);
-
- event.sender.send('collect-logs-reply', requestId, {
- success: true,
- reportPath,
- });
+ resolve(reportPath);
}
});
- },
- );
+ });
+ });
- ipcMain.on(
- 'send-problem-report',
- (
- event: Electron.IpcMainEvent,
- requestId: string,
- email: string,
- message: string,
- savedReport: string,
- ) => {
- const executable = resolveBin('mullvad-problem-report');
- const args = ['send', '--email', email, '--message', message, '--report', savedReport];
+ IpcMainEventChannel.problemReport.handleSendReport(({ email, message, savedReport }) => {
+ const executable = resolveBin('mullvad-problem-report');
+ const args = ['send', '--email', email, '--message', message, '--report', savedReport];
+ return new Promise((resolve, reject) => {
execFile(executable, args, { windowsHide: true }, (error, stdout, stderr) => {
if (error) {
log.error(
@@ -1150,21 +1134,14 @@ class ApplicationMain {
Stdout: ${stdout.toString()}
Stderr: ${stderr.toString()}`,
);
-
- event.sender.send('send-problem-report-reply', requestId, {
- success: false,
- error: error.message,
- });
+ reject(error.message);
} else {
log.info('Problem report was sent.');
-
- event.sender.send('send-problem-report-reply', requestId, {
- success: true,
- });
+ resolve();
}
});
- },
- );
+ });
+ });
}
private async createNewAccount(): Promise<string> {
diff --git a/gui/src/renderer/app.tsx b/gui/src/renderer/app.tsx
index a16718945c..091aa6137e 100644
--- a/gui/src/renderer/app.tsx
+++ b/gui/src/renderer/app.tsx
@@ -424,6 +424,18 @@ export default class AppRenderer {
consumePromise(IpcRendererEventChannel.splitTunneling.launchApplication(application));
}
+ public collectProblemReport(toRedact: string[]): Promise<string> {
+ return IpcRendererEventChannel.problemReport.collectLogs(toRedact);
+ }
+
+ public async sendProblemReport(
+ email: string,
+ message: string,
+ savedReport: string,
+ ): Promise<void> {
+ await IpcRendererEventChannel.problemReport.sendReport({ email, message, savedReport });
+ }
+
public getPreferredLocaleList(): IPreferredLocaleDescriptor[] {
return [
{
diff --git a/gui/src/renderer/containers/SupportPage.tsx b/gui/src/renderer/containers/SupportPage.tsx
index d77ec3e421..e3e5ee7d4f 100644
--- a/gui/src/renderer/containers/SupportPage.tsx
+++ b/gui/src/renderer/containers/SupportPage.tsx
@@ -4,7 +4,7 @@ import { RouteComponentProps, withRouter } from 'react-router';
import { bindActionCreators } from 'redux';
import consumePromise from '../../shared/promise';
import Support from '../components/Support';
-import { collectProblemReport, sendProblemReport } from '../lib/problem-report';
+import withAppContext, { IAppContext } from '../context';
import { IReduxState, ReduxDispatch } from '../redux/store';
import supportActions from '../redux/support/actions';
@@ -16,7 +16,7 @@ const mapStateToProps = (state: IReduxState) => ({
outdatedVersion: state.version.suggestedUpgrade ? true : false,
});
-const mapDispatchToProps = (dispatch: ReduxDispatch, props: RouteComponentProps) => {
+const mapDispatchToProps = (dispatch: ReduxDispatch, props: IAppContext & RouteComponentProps) => {
const { saveReportForm, clearReportForm } = bindActionCreators(supportActions, dispatch);
return {
@@ -28,10 +28,10 @@ const mapDispatchToProps = (dispatch: ReduxDispatch, props: RouteComponentProps)
},
saveReportForm,
clearReportForm,
- collectProblemReport,
- sendProblemReport,
+ collectProblemReport: props.app.collectProblemReport,
+ sendProblemReport: props.app.sendProblemReport,
onExternalLink: (url: string) => shell.openExternal(url),
};
};
-export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Support));
+export default withAppContext(withRouter(connect(mapStateToProps, mapDispatchToProps)(Support)));
diff --git a/gui/src/renderer/lib/problem-report.ts b/gui/src/renderer/lib/problem-report.ts
deleted file mode 100644
index 7213ed8d07..0000000000
--- a/gui/src/renderer/lib/problem-report.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { ipcRenderer } from 'electron';
-import * as uuid from 'uuid';
-
-interface IErrorResult {
- success: false;
- error: string;
-}
-type CollectResult = { success: true; reportPath: string } | IErrorResult;
-type SendResult = { success: true } | IErrorResult;
-
-const collectProblemReport = (toRedact: string[]): Promise<string> => {
- return new Promise((resolve, reject) => {
- const requestId = uuid.v4();
- const responseListener = (
- _event: Electron.Event,
- responseId: string,
- result: CollectResult,
- ) => {
- if (responseId === requestId) {
- ipcRenderer.removeListener('collect-logs-reply', responseListener);
- if (result.success) {
- resolve(result.reportPath);
- } else {
- reject(new Error(result.error));
- }
- }
- };
-
- ipcRenderer.on('collect-logs-reply', responseListener);
- ipcRenderer.send('collect-logs', requestId, toRedact);
- });
-};
-
-const sendProblemReport = (email: string, message: string, savedReport: string): Promise<void> => {
- return new Promise((resolve, reject) => {
- const requestId = uuid.v4();
- const responseListener = (_event: Electron.Event, responseId: string, result: SendResult) => {
- if (requestId === responseId) {
- ipcRenderer.removeListener('send-problem-report-reply', responseListener);
- if (result.success) {
- resolve();
- } else {
- reject(new Error(result.error));
- }
- }
- };
-
- ipcRenderer.on('send-problem-report-reply', responseListener);
- ipcRenderer.send('send-problem-report', requestId, email, message, savedReport);
- });
-};
-
-export { collectProblemReport, sendProblemReport };
diff --git a/gui/src/shared/ipc-event-channel.ts b/gui/src/shared/ipc-event-channel.ts
index 11bbeef31f..b18e47e9f9 100644
--- a/gui/src/shared/ipc-event-channel.ts
+++ b/gui/src/shared/ipc-event-channel.ts
@@ -172,6 +172,10 @@ const ipc = {
getApplications: invoke<void, ISplitTunnelingApplication[]>(),
launchApplication: invoke<ISplitTunnelingApplication | string, void>(),
},
+ problemReport: {
+ collectLogs: invoke<string[], string>(),
+ sendReport: invoke<{ email: string; message: string; savedReport: string }, void>(),
+ },
};
export const IpcMainEventChannel = createIpcMain(ipc);