-
-
Notifications
You must be signed in to change notification settings - Fork 186
fix: add support for log file using split state format #88
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
9bef7e5
e5815da
6ee5e48
03aaa70
c3c1e02
64a020a
f8ad6fe
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -4,6 +4,9 @@ const passworder = require('@metamask/browser-passworder') | |
| function dedupe (arr) { | ||
| const result = [] | ||
| arr?.forEach(x => { | ||
| if (x == null) { | ||
| return | ||
| } | ||
| if (!result.find(y => Object.keys(x).length === Object.keys(y).length && Object.entries(x).every(([k,ex]) => y[k] === ex ))) { | ||
| result.push(x) | ||
| } | ||
|
|
@@ -116,27 +119,55 @@ function extractVaultFromFile (data) { | |
| } | ||
| } | ||
|
|
||
| // attempt 6: chromium 000005.ldb on windows | ||
| const matchRegex = /Keyring[0-9][^\}]*(\{[^\{\}]*\\"\})/gu | ||
| const captureRegex = /Keyring[0-9][^\}]*(\{[^\{\}]*\\"\})/u | ||
| const ivRegex = /\\"iv.{1,4}[^A-Za-z0-9+\/]{1,10}([A-Za-z0-9+\/]{10,40}=*)/u | ||
| const dataRegex = /\\"[^":,is]*\\":\\"([A-Za-z0-9+\/]*=*)/u | ||
| const saltRegex = /,\\"salt.{1,4}[^A-Za-z0-9+\/]{1,10}([A-Za-z0-9+\/]{10,100}=*)/u | ||
| const vaults = dedupe(data.match(matchRegex)?.map(m => m.match(captureRegex)[1]) | ||
| .map(s => [dataRegex, ivRegex, saltRegex].map(r => s.match(r))) | ||
| .filter(([d,i,s]) => d&&d.length>1 && i&&i.length>1 && s&&s.length>1) | ||
| .map(([d,i,s]) => ({ | ||
| data: d[1], | ||
| iv: i[1], | ||
| salt: s[1], | ||
| }))) | ||
| if (!vaults.length) { | ||
| return null | ||
| { | ||
| // attempt 6: chromium 000005.ldb on windows | ||
| const matchRegex = /Keyring[0-9][^\}]*(\{[^\{\}]*\\"\})/gu | ||
| const captureRegex = /Keyring[0-9][^\}]*(\{[^\{\}]*\\"\})/u | ||
| const ivRegex = /\\"iv.{1,4}[^A-Za-z0-9+\/]{1,10}([A-Za-z0-9+\/]{10,40}=*)/u | ||
| const dataRegex = /\\"[^":,is]*\\":\\"([A-Za-z0-9+\/]*=*)/u | ||
| const saltRegex = /,\\"salt.{1,4}[^A-Za-z0-9+\/]{1,10}([A-Za-z0-9+\/]{10,100}=*)/u | ||
| const vaults = dedupe(data.match(matchRegex)?.map(m => m.match(captureRegex)[1]) | ||
| .map(s => [dataRegex, ivRegex, saltRegex].map(r => s.match(r))) | ||
| .filter(([d,i,s]) => d&&d.length>1 && i&&i.length>1 && s&&s.length>1) | ||
| .map(([d,i,s]) => ({ | ||
| data: d[1], | ||
| iv: i[1], | ||
| salt: s[1], | ||
| }))) | ||
| if (vaults.length) { | ||
| /* istanbul ignore next */ | ||
| if (vaults.length > 1) { | ||
| console.log('Found multiple vaults!', vaults) | ||
| } | ||
| return vaults[0] | ||
| } | ||
|
Comment on lines
+122
to
+143
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this hasn't changed, other than putting it in its own lexical block now, and it doesn't
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hide whitespace changes removes this from the diff |
||
| } | ||
| if (vaults.length > 1) { | ||
| console.log('Found multiple vaults!', vaults) | ||
| { | ||
| // attempt 7: log file using split state format, chromium 000004.log on windows-2 | ||
| const vaultRegex = /KeyringController[\s\S]*?"vault":"((?:[^"\\]|\\.)*)"/g | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the vault is stored as a top-level key now, and the top-level keys aren't JSON serialized, so they aren't wrapped with quotes. |
||
| const vaults = [] | ||
| let match | ||
|
|
||
| while ((match = vaultRegex.exec(data)) !== null) { | ||
| try { | ||
| const vaultString = JSON.parse(`"${match[1]}"`) | ||
| const json = JSON.parse(vaultString) | ||
| vaults.push(json) | ||
| } catch (err) { | ||
| // Not valid JSON: continue | ||
| } | ||
| } | ||
|
|
||
| const dedupedVaults = dedupe(vaults) | ||
| if (dedupedVaults.length) { | ||
| /* istanbul ignore next */ | ||
| if (dedupedVaults.length > 1) { | ||
| console.log('Found multiple vaults!', dedupedVaults) | ||
| } | ||
| return dedupedVaults[0] | ||
| } | ||
| } | ||
| return vaults[0] | ||
| return null | ||
| } | ||
|
|
||
|
|
||
|
|
@@ -176,5 +207,3 @@ module.exports = { | |
| extractVaultFromFile, | ||
| isVaultValid, | ||
| } | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -15,6 +15,9 @@ var passworder = require('@metamask/browser-passworder'); | |
| function dedupe(arr) { | ||
| var result = []; | ||
| arr === null || arr === void 0 ? void 0 : arr.forEach(function (x) { | ||
| if (x == null) { | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. changes in the file are just from rebuilding and committing it. |
||
| return; | ||
| } | ||
| if (!result.find(function (y) { | ||
| return Object.keys(x).length === Object.keys(y).length && Object.entries(x).every(function (_ref) { | ||
| var _ref2 = _slicedToArray(_ref, 2), | ||
|
|
@@ -36,7 +39,6 @@ function decodeMnemonic(mnemonic) { | |
| } | ||
| } | ||
| function extractVaultFromFile(data) { | ||
| var _data$match; | ||
| var vaultBody; | ||
| try { | ||
| // attempt 1: raw json | ||
|
|
@@ -75,11 +77,11 @@ function extractVaultFromFile(data) { | |
| if (_matches2 && _matches2.length) { | ||
| try { | ||
| var keyringControllerStateFragment = _matches2[1]; | ||
| var _dataRegex = /\\"data\\":\\"([\+\/-9A-Za-z]*=*)/; | ||
| var _ivRegex = /,\\"iv\\":\\"([\+\/-9A-Za-z]{10,40}=*)/; | ||
| var _saltRegex = /,\\"salt\\":\\"([A-Za-z0-9+\/]{10,100}=*)\\"/; | ||
| var dataRegex = /\\"data\\":\\"([\+\/-9A-Za-z]*=*)/; | ||
| var ivRegex = /,\\"iv\\":\\"([\+\/-9A-Za-z]{10,40}=*)/; | ||
| var saltRegex = /,\\"salt\\":\\"([A-Za-z0-9+\/]{10,100}=*)\\"/; | ||
| var keyMetaRegex = /,\\"keyMetadata\\":(.*}})/; | ||
| var vaultParts = [_dataRegex, _ivRegex, _saltRegex, keyMetaRegex].map(function (reg) { | ||
| var vaultParts = [dataRegex, ivRegex, saltRegex, keyMetaRegex].map(function (reg) { | ||
| return keyringControllerStateFragment.match(reg); | ||
| }).map(function (match) { | ||
| return match[1]; | ||
|
|
@@ -102,11 +104,11 @@ function extractVaultFromFile(data) { | |
| if (_matches3 && _matches3.length) { | ||
| try { | ||
| var _keyringControllerStateFragment = _matches3[1]; | ||
| var _dataRegex2 = /\\"data\\":\\"([\+\/-9A-Za-z]*=*)/; | ||
| var _ivRegex2 = /,\\"iv\\":\\"([\+\/-9A-Za-z]{10,40}=*)/; | ||
| var _saltRegex2 = /,\\"salt\\":\\"([A-Za-z0-9+\/]{10,100}=*)\\"/; | ||
| var _dataRegex = /\\"data\\":\\"([\+\/-9A-Za-z]*=*)/; | ||
| var _ivRegex = /,\\"iv\\":\\"([\+\/-9A-Za-z]{10,40}=*)/; | ||
| var _saltRegex = /,\\"salt\\":\\"([A-Za-z0-9+\/]{10,100}=*)\\"/; | ||
| var _keyMetaRegex = /,\\"keyMetadata\\":(.*}})/; | ||
| var _vaultParts = [_dataRegex2, _ivRegex2, _saltRegex2, _keyMetaRegex].map(function (reg) { | ||
| var _vaultParts = [_dataRegex, _ivRegex, _saltRegex, _keyMetaRegex].map(function (reg) { | ||
| return _keyringControllerStateFragment.match(reg); | ||
| }).map(function (match) { | ||
| return match[1]; | ||
|
|
@@ -122,43 +124,69 @@ function extractVaultFromFile(data) { | |
| } | ||
| } | ||
| } | ||
|
|
||
| // attempt 6: chromium 000005.ldb on windows | ||
| var matchRegex = /Keyring[0-9](?:[\0-\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*(\{(?:[\0-z\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\"\})/g; | ||
| var captureRegex = /Keyring[0-9](?:[\0-\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*(\{(?:[\0-z\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\"\})/; | ||
| var ivRegex = /\\"iv(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,4}(?:[\0-\*,-\.:-@\[-`\{-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,10}([\+\/-9A-Za-z]{10,40}=*)/; | ||
| var dataRegex = /\\"(?:[\0-!#-\+\x2D-9;-hj-rt-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\":\\"([\+\/-9A-Za-z]*=*)/; | ||
| var saltRegex = /,\\"salt(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,4}(?:[\0-\*,-\.:-@\[-`\{-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,10}([\+\/-9A-Za-z]{10,100}=*)/; | ||
| var vaults = dedupe((_data$match = data.match(matchRegex)) === null || _data$match === void 0 ? void 0 : _data$match.map(function (m) { | ||
| return m.match(captureRegex)[1]; | ||
| }).map(function (s) { | ||
| return [dataRegex, ivRegex, saltRegex].map(function (r) { | ||
| return s.match(r); | ||
| }); | ||
| }).filter(function (_ref3) { | ||
| var _ref4 = _slicedToArray(_ref3, 3), | ||
| d = _ref4[0], | ||
| i = _ref4[1], | ||
| s = _ref4[2]; | ||
| return d && d.length > 1 && i && i.length > 1 && s && s.length > 1; | ||
| }).map(function (_ref5) { | ||
| var _ref6 = _slicedToArray(_ref5, 3), | ||
| d = _ref6[0], | ||
| i = _ref6[1], | ||
| s = _ref6[2]; | ||
| return { | ||
| data: d[1], | ||
| iv: i[1], | ||
| salt: s[1] | ||
| }; | ||
| })); | ||
| if (!vaults.length) { | ||
| return null; | ||
| { | ||
davidmurdoch marked this conversation as resolved.
Show resolved
Hide resolved
davidmurdoch marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| var _data$match; | ||
davidmurdoch marked this conversation as resolved.
Show resolved
Hide resolved
davidmurdoch marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| // attempt 6: chromium 000005.ldb on windows | ||
davidmurdoch marked this conversation as resolved.
Show resolved
Hide resolved
davidmurdoch marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| var matchRegex = /Keyring[0-9](?:[\0-\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*(\{(?:[\0-z\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\"\})/g; | ||
davidmurdoch marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| var captureRegex = /Keyring[0-9](?:[\0-\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*(\{(?:[\0-z\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\"\})/; | ||
davidmurdoch marked this conversation as resolved.
Show resolved
Hide resolved
davidmurdoch marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| var _ivRegex2 = /\\"iv(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,4}(?:[\0-\*,-\.:-@\[-`\{-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,10}([\+\/-9A-Za-z]{10,40}=*)/; | ||
| var _dataRegex2 = /\\"(?:[\0-!#-\+\x2D-9;-hj-rt-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\":\\"([\+\/-9A-Za-z]*=*)/; | ||
| var _saltRegex2 = /,\\"salt(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,4}(?:[\0-\*,-\.:-@\[-`\{-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,10}([\+\/-9A-Za-z]{10,100}=*)/; | ||
| var vaults = dedupe((_data$match = data.match(matchRegex)) === null || _data$match === void 0 ? void 0 : _data$match.map(function (m) { | ||
| return m.match(captureRegex)[1]; | ||
| }).map(function (s) { | ||
| return [_dataRegex2, _ivRegex2, _saltRegex2].map(function (r) { | ||
| return s.match(r); | ||
| }); | ||
| }).filter(function (_ref3) { | ||
| var _ref4 = _slicedToArray(_ref3, 3), | ||
| d = _ref4[0], | ||
| i = _ref4[1], | ||
| s = _ref4[2]; | ||
| return d && d.length > 1 && i && i.length > 1 && s && s.length > 1; | ||
| }).map(function (_ref5) { | ||
| var _ref6 = _slicedToArray(_ref5, 3), | ||
| d = _ref6[0], | ||
| i = _ref6[1], | ||
| s = _ref6[2]; | ||
| return { | ||
| data: d[1], | ||
| iv: i[1], | ||
| salt: s[1] | ||
| }; | ||
| })); | ||
| if (vaults.length) { | ||
| /* istanbul ignore next */ | ||
| if (vaults.length > 1) { | ||
| console.log('Found multiple vaults!', vaults); | ||
| } | ||
| return vaults[0]; | ||
| } | ||
| } | ||
| if (vaults.length > 1) { | ||
| console.log('Found multiple vaults!', vaults); | ||
| { | ||
| // attempt 7: log file using split state format, chromium 000004.log on windows-2 | ||
| var vaultRegex = /KeyringController[\s\S]*?"vault":"((?:[^"\\]|\\.)*)"/g; | ||
| var _vaults = []; | ||
| var match; | ||
| while ((match = vaultRegex.exec(data)) !== null) { | ||
| try { | ||
| var vaultString = JSON.parse("\"".concat(match[1], "\"")); | ||
| var json = JSON.parse(vaultString); | ||
| _vaults.push(json); | ||
| } catch (err) { | ||
| // Not valid JSON: continue | ||
| } | ||
| } | ||
| var dedupedVaults = dedupe(_vaults); | ||
| if (dedupedVaults.length) { | ||
| /* istanbul ignore next */ | ||
| if (dedupedVaults.length > 1) { | ||
| console.log('Found multiple vaults!', dedupedVaults); | ||
| } | ||
| return dedupedVaults[0]; | ||
| } | ||
| } | ||
| return vaults[0]; | ||
| return null; | ||
| } | ||
| function isVaultValid(vault) { | ||
| return _typeof(vault) === 'object' && ['data', 'iv', 'salt'].every(function (e) { | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AI review caught this bug that could cause dedupe to throw.