fix #1263: desktop apps crashes when argon2 is used

This commit is contained in:
antelle 2019-10-16 22:07:11 +02:00
parent be79f67510
commit b7f020f69c
5 changed files with 115 additions and 65 deletions

View File

@ -16,6 +16,7 @@ const Features = {
!isDesktop &&
!/^http(s?):\/\/((localhost:8085)|((app|beta)\.keeweb\.info))/.test(location.href),
needFixClicks: /Edge\/14/.test(navigator.appVersion),
canUseWasmInWebWorker: !isDesktop && !/Chrome/.test(navigator.appVersion),
supportsTitleBarStyles() {
return this.isMac;

View File

@ -1,5 +1,6 @@
import kdbxweb from 'kdbxweb';
import { Logger } from 'util/logger';
import { Features } from 'util/features';
const logger = new Logger('argon2');
@ -43,6 +44,7 @@ const KdbxwebInit = {
totalMemory
);
if (Features.canUseWasmInWebWorker) {
const memoryDecl = `var wasmMemory=new WebAssembly.Memory({initial:${initialMemory},maximum:${totalMemory}});`;
const moduleDecl =
'var Module={' +
@ -63,7 +65,10 @@ const KdbxwebInit = {
'TOTAL_MEMORY:' +
initialMemory * WASM_PAGE_SIZE +
'}';
const script = argon2LoaderCode.replace(/^var Module.*?}/, memoryDecl + moduleDecl);
const script = argon2LoaderCode.replace(
/^var Module.*?}/,
memoryDecl + moduleDecl
);
const blob = new Blob([script], { type: 'application/javascript' });
const objectUrl = URL.createObjectURL(blob);
const worker = new Worker(objectUrl);
@ -73,7 +78,10 @@ const KdbxwebInit = {
logger.debug(...e.data.args);
break;
case 'postRun':
logger.debug('WebAssembly runtime loaded', logger.ts(ts));
logger.debug(
'WebAssembly runtime loaded (web worker)',
logger.ts(ts)
);
URL.revokeObjectURL(objectUrl);
clearTimeout(loadTimeout);
worker.removeEventListener('message', onMessage);
@ -82,16 +90,21 @@ const KdbxwebInit = {
return new Promise((resolve, reject) => {
worker.postMessage(args);
const onHashMessage = e => {
worker.removeEventListener('message', onHashMessage);
worker.removeEventListener(
'message',
onHashMessage
);
worker.terminate();
KdbxwebInit.runtimeModule = null;
if (!e.data || e.data.error || !e.data.hash) {
const ex =
(e.data && e.data.error) || 'unexpected error';
(e.data && e.data.error) ||
'unexpected error';
logger.error('Worker error', ex);
reject(ex);
}
} else {
resolve(e.data.hash);
}
};
worker.addEventListener('message', onHashMessage);
});
@ -106,6 +119,41 @@ const KdbxwebInit = {
}
};
worker.addEventListener('message', onMessage);
} else {
// Chrome and Electron crash if we use WASM in WebWorker
// see https://github.com/keeweb/keeweb/issues/1263
const wasmMemory = new WebAssembly.Memory({
initial: initialMemory,
maximum: totalMemory
});
global.Module = {
wasmJSMethod: 'native-wasm',
wasmBinary: Uint8Array.from(atob(wasmBinaryBase64), c => c.charCodeAt(0)),
print(...args) {
logger.debug(...args);
},
printErr(...args) {
logger.debug(...args);
},
postRun: () => {
logger.debug('WebAssembly runtime loaded (main thread)', logger.ts(ts));
clearTimeout(loadTimeout);
resolve({
hash: args => {
const hash = this.calcHash(global.Module, args);
global.Module.unloadRuntime();
global.Module = undefined;
return Promise.resolve(hash);
}
});
},
wasmMemory,
buffer: wasmMemory.buffer,
TOTAL_MEMORY: initialMemory * WASM_PAGE_SIZE
};
// eslint-disable-next-line no-eval
eval(argon2LoaderCode);
}
} catch (err) {
reject(err);
}

6
package-lock.json generated
View File

@ -1361,9 +1361,9 @@
}
},
"argon2-browser": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/argon2-browser/-/argon2-browser-1.11.1.tgz",
"integrity": "sha512-C+WsBLSkwQExkDYB7vriugrBTXq2z+fTRDlGWqr2zm89TaKo7zYtSGARMgoBxpDnmNNzduNlZJmpY2j0Dp7ZOQ=="
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/argon2-browser/-/argon2-browser-1.12.0.tgz",
"integrity": "sha512-qdEW311acXGGLTjslqO5f7cKG3foP6QUkeuav9au00aRY/B5AvNrqAVlL47a2MUdr6i7dx8Xp+5OreRGoXvCgQ=="
},
"argparse": {
"version": "1.0.10",

View File

@ -14,7 +14,7 @@
"@babel/plugin-external-helpers": "^7.2.0",
"@babel/plugin-proposal-class-properties": "^7.5.5",
"@babel/preset-env": "^7.6.2",
"argon2-browser": "1.11.1",
"argon2-browser": "1.12.0",
"autoprefixer": "^9.6.1",
"babel-cli": "^6.26.0",
"babel-eslint": "^10.0.3",

View File

@ -2,6 +2,7 @@ Release notes
-------------
##### v1.11.10 (2019-10-15)
`-` fix #1305: WebDAV issues
`-` fix #1263: desktop apps crashes when argon2 is used
##### v1.11.9 (2019-10-13)
`-` fix #1300: selecting auto-type sequence items issues