summaryrefslogtreecommitdiffhomepage
path: root/app/lib
diff options
context:
space:
mode:
authorErik Larkö <erik@mullvad.net>2018-01-22 15:08:34 +0100
committerErik Larkö <erik@mullvad.net>2018-01-22 15:08:34 +0100
commit40efbb790f5776fad7336c4ba19db384179511f4 (patch)
tree6f224c8cae080d115409177c73e822a534b4d2d9 /app/lib
parent8b66a953f244dbe04148f550dc7a8c8b4f50d2a0 (diff)
parent430ea2955170aaf78900dd41ab72ddb101e80df3 (diff)
downloadmullvadvpn-40efbb790f5776fad7336c4ba19db384179511f4.tar.xz
mullvadvpn-40efbb790f5776fad7336c4ba19db384179511f4.zip
Merge branch 'problem-report'
Diffstat (limited to 'app/lib')
-rw-r--r--app/lib/problem-report.android.js12
-rw-r--r--app/lib/problem-report.js71
2 files changed, 83 insertions, 0 deletions
diff --git a/app/lib/problem-report.android.js b/app/lib/problem-report.android.js
new file mode 100644
index 0000000000..63deb102e4
--- /dev/null
+++ b/app/lib/problem-report.android.js
@@ -0,0 +1,12 @@
+// @flow
+import { MobileAppBridge } from 'NativeModules';
+
+const collectProblemReport = (toRedact: string) => {
+ return MobileAppBridge.collectProblemReport(toRedact);
+};
+
+const sendProblemReport = (email: string, message: string, savedReport: string) => {
+ return MobileAppBridge.sendProblemReport(email, message, savedReport);
+};
+
+export { collectProblemReport, sendProblemReport }; \ No newline at end of file
diff --git a/app/lib/problem-report.js b/app/lib/problem-report.js
new file mode 100644
index 0000000000..17130fd05d
--- /dev/null
+++ b/app/lib/problem-report.js
@@ -0,0 +1,71 @@
+// @flow
+import { resolveBin } from './proc';
+import { execFile } from 'child_process';
+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);
+
+ 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);
+ } else {
+ promise.resolve(reportId);
+ }
+ }
+ });
+ 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);
+
+ throw e;
+ });
+};
+
+const sendProblemReport = (email: string, message: string, savedReport: string) => {
+ const args = ['send',
+ '--email', email,
+ '--message', message,
+ '--report', savedReport,
+ ];
+
+ const binPath = resolveBin('problem-report');
+
+ return new Promise((resolve, reject) => {
+ execFile(binPath, args, { windowsHide: true }, (err, stdout, stderr) => {
+ if (err) {
+ reject({ err, stdout, stderr });
+ } else {
+ log.debug('Report sent');
+ resolve();
+ }
+ });
+ }).catch((e) => {
+ const { err, stdout } = e;
+ log.error('Failed sending problem report', err);
+ log.error(' stdout: ' + stdout);
+
+ throw e;
+ });
+};
+
+export { collectProblemReport, sendProblemReport }; \ No newline at end of file