next version

- switch to uvu
- switch to ESM
- still broken
need to fix
This commit is contained in:
Nemo 2022-04-17 20:14:32 +05:30
parent 65049c9ed2
commit 2833c36bf1
16 changed files with 647 additions and 345 deletions

29
elftest.js Normal file
View File

@ -0,0 +1,29 @@
const E = require('elfinfo')
const fs = require('fs')
// Parse the specified ELF file.
const path ='../aur-notable/notable'
const elfdata = fs.readFileSync(path);
let info = null
E.open(elfdata).then((info)=>{
let rodata = info.elf.sections.filter((x)=>{return x.name=='.rodata'})[0]
const data = fs.createReadStream(path, {
start: Number(rodata.addr),
end: Number(rodata.addr) + rodata.size,
highWaterMark: rodata.addralign
})
data.on('data', function(data){
let found = data.toString().match(/Electron\/(\d+\.\d+\.\d+)/)
if(found) {
console.log(found[1])
}
});
})

175
package-lock.json generated
View File

@ -10,7 +10,9 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"7zip-bin": "^5.1.1", "7zip-bin": "^5.1.1",
"disassembler": "^0.3.0-beta",
"electron-fingerprints": "*", "electron-fingerprints": "*",
"elfinfo": "^0.3.0-beta",
"hasha": "^5.2.2", "hasha": "^5.2.2",
"is-valid-http-url": "^1.0.3", "is-valid-http-url": "^1.0.3",
"node-7z": "^3.0.0", "node-7z": "^3.0.0",
@ -23,7 +25,11 @@
"which-electron": "src/index.js" "which-electron": "src/index.js"
}, },
"devDependencies": { "devDependencies": {
"kuta": "*" "kuta": "*",
"uvu": "^0.5.3"
},
"engines": {
"node": " >=14.13.1 || >=16.0.0"
} }
}, },
"node_modules/7zip-bin": { "node_modules/7zip-bin": {
@ -110,11 +116,50 @@
} }
} }
}, },
"node_modules/dequal": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz",
"integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/diff": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
"integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
"dev": true,
"engines": {
"node": ">=0.3.1"
}
},
"node_modules/disassembler": {
"version": "0.3.0-beta",
"resolved": "https://registry.npmjs.org/disassembler/-/disassembler-0.3.0-beta.tgz",
"integrity": "sha512-mcuYZPmWOhv0S28ou9qYfWswXEJ+5oKUh8GVheLTRcqiMeQisQRDfsAdh80WByB144gT6FLjSFwVBRYX+wMIAw=="
},
"node_modules/electron-fingerprints": { "node_modules/electron-fingerprints": {
"version": "2022.3.30", "version": "2022.3.30",
"resolved": "https://registry.npmjs.org/electron-fingerprints/-/electron-fingerprints-2022.3.30.tgz", "resolved": "https://registry.npmjs.org/electron-fingerprints/-/electron-fingerprints-2022.3.30.tgz",
"integrity": "sha512-RciBhcnMYqNFqeibbKICOqTsCPPFgU+I2KQp3wt77Xw+3YOE3FOPD1XkE/u5k8B/c9tilJ78uowJjElnaRUtHA==" "integrity": "sha512-RciBhcnMYqNFqeibbKICOqTsCPPFgU+I2KQp3wt77Xw+3YOE3FOPD1XkE/u5k8B/c9tilJ78uowJjElnaRUtHA=="
}, },
"node_modules/elfinfo": {
"version": "0.3.0-beta",
"resolved": "https://registry.npmjs.org/elfinfo/-/elfinfo-0.3.0-beta.tgz",
"integrity": "sha512-pmKnUCHGTkloCxKMoP3GL6j0IzH2MC30STKhv+GJA4uGw1Zv9dfZ3OQQjXF30IHKQlPVW3eECRWCuPJtHqkCIQ==",
"bin": {
"elfinfo": "dist/src/elfinfo.js"
},
"peerDependencies": {
"disassembler": "^0.3.0-beta"
},
"peerDependenciesMeta": {
"disassembler": {
"optional": true
}
}
},
"node_modules/follow-redirects": { "node_modules/follow-redirects": {
"version": "1.14.9", "version": "1.14.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
@ -174,9 +219,9 @@
} }
}, },
"node_modules/https-proxy-agent": { "node_modules/https-proxy-agent": {
"version": "5.0.0", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dependencies": { "dependencies": {
"agent-base": "6", "agent-base": "6",
"debug": "4" "debug": "4"
@ -223,6 +268,15 @@
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
}, },
"node_modules/kleur": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz",
"integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/kuta": { "node_modules/kuta": {
"version": "2.0.0-beta.7", "version": "2.0.0-beta.7",
"resolved": "https://registry.npmjs.org/kuta/-/kuta-2.0.0-beta.7.tgz", "resolved": "https://registry.npmjs.org/kuta/-/kuta-2.0.0-beta.7.tgz",
@ -321,6 +375,15 @@
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true "dev": true
}, },
"node_modules/mri": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
"integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/ms": { "node_modules/ms": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@ -426,6 +489,18 @@
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
} }
}, },
"node_modules/sade": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
"integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
"dev": true,
"dependencies": {
"mri": "^1.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/sanitize-filename": { "node_modules/sanitize-filename": {
"version": "1.6.3", "version": "1.6.3",
"resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
@ -435,9 +510,9 @@
} }
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.3.5", "version": "7.3.7",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
"dependencies": { "dependencies": {
"lru-cache": "^6.0.0" "lru-cache": "^6.0.0"
}, },
@ -475,6 +550,24 @@
"resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
"integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E="
}, },
"node_modules/uvu": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.3.tgz",
"integrity": "sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==",
"dev": true,
"dependencies": {
"dequal": "^2.0.0",
"diff": "^5.0.0",
"kleur": "^4.0.3",
"sade": "^1.7.3"
},
"bin": {
"uvu": "bin.js"
},
"engines": {
"node": ">=8"
}
},
"node_modules/which": { "node_modules/which": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@ -562,11 +655,34 @@
"ms": "2.1.2" "ms": "2.1.2"
} }
}, },
"dequal": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz",
"integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==",
"dev": true
},
"diff": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
"integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
"dev": true
},
"disassembler": {
"version": "0.3.0-beta",
"resolved": "https://registry.npmjs.org/disassembler/-/disassembler-0.3.0-beta.tgz",
"integrity": "sha512-mcuYZPmWOhv0S28ou9qYfWswXEJ+5oKUh8GVheLTRcqiMeQisQRDfsAdh80WByB144gT6FLjSFwVBRYX+wMIAw=="
},
"electron-fingerprints": { "electron-fingerprints": {
"version": "2022.3.30", "version": "2022.3.30",
"resolved": "https://registry.npmjs.org/electron-fingerprints/-/electron-fingerprints-2022.3.30.tgz", "resolved": "https://registry.npmjs.org/electron-fingerprints/-/electron-fingerprints-2022.3.30.tgz",
"integrity": "sha512-RciBhcnMYqNFqeibbKICOqTsCPPFgU+I2KQp3wt77Xw+3YOE3FOPD1XkE/u5k8B/c9tilJ78uowJjElnaRUtHA==" "integrity": "sha512-RciBhcnMYqNFqeibbKICOqTsCPPFgU+I2KQp3wt77Xw+3YOE3FOPD1XkE/u5k8B/c9tilJ78uowJjElnaRUtHA=="
}, },
"elfinfo": {
"version": "0.3.0-beta",
"resolved": "https://registry.npmjs.org/elfinfo/-/elfinfo-0.3.0-beta.tgz",
"integrity": "sha512-pmKnUCHGTkloCxKMoP3GL6j0IzH2MC30STKhv+GJA4uGw1Zv9dfZ3OQQjXF30IHKQlPVW3eECRWCuPJtHqkCIQ==",
"requires": {}
},
"follow-redirects": { "follow-redirects": {
"version": "1.14.9", "version": "1.14.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
@ -600,9 +716,9 @@
} }
}, },
"https-proxy-agent": { "https-proxy-agent": {
"version": "5.0.0", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"requires": { "requires": {
"agent-base": "6", "agent-base": "6",
"debug": "4" "debug": "4"
@ -637,6 +753,12 @@
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
}, },
"kleur": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz",
"integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==",
"dev": true
},
"kuta": { "kuta": {
"version": "2.0.0-beta.7", "version": "2.0.0-beta.7",
"resolved": "https://registry.npmjs.org/kuta/-/kuta-2.0.0-beta.7.tgz", "resolved": "https://registry.npmjs.org/kuta/-/kuta-2.0.0-beta.7.tgz",
@ -717,6 +839,12 @@
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true "dev": true
}, },
"mri": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
"integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
"dev": true
},
"ms": { "ms": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@ -798,6 +926,15 @@
"glob": "^7.1.3" "glob": "^7.1.3"
} }
}, },
"sade": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
"integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
"dev": true,
"requires": {
"mri": "^1.1.0"
}
},
"sanitize-filename": { "sanitize-filename": {
"version": "1.6.3", "version": "1.6.3",
"resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
@ -807,9 +944,9 @@
} }
}, },
"semver": { "semver": {
"version": "7.3.5", "version": "7.3.7",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
"requires": { "requires": {
"lru-cache": "^6.0.0" "lru-cache": "^6.0.0"
} }
@ -838,6 +975,18 @@
"resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
"integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E="
}, },
"uvu": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.3.tgz",
"integrity": "sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==",
"dev": true,
"requires": {
"dequal": "^2.0.0",
"diff": "^5.0.0",
"kleur": "^4.0.3",
"sade": "^1.7.3"
}
},
"which": { "which": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",

View File

@ -2,18 +2,21 @@
"name": "which-electron", "name": "which-electron",
"version": "1.1.5", "version": "1.1.5",
"description": "Guess which electron version is bundled in an application", "description": "Guess which electron version is bundled in an application",
"main": "src/index.js",
"bin": { "bin": {
"which-electron": "src/index.js" "which-electron": "src/index.js"
}, },
"scripts": { "scripts": {
"test": "kuta tests/*.js", "test": "uvu tests",
"release": "npm update && php _scripts/gen_versions.php && git add src/versions.json package-lock.json && git commit -m 'new release' && npm version patch" "release": "npm update && php _scripts/gen_versions.php && git add src/versions.json package-lock.json && git commit -m 'new release' && npm version patch"
}, },
"type": "module",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+https://github.com/captn3m0/which-electron.git" "url": "git+https://github.com/captn3m0/which-electron.git"
}, },
"engines": {
"node": " >=14.13.1 || >=16.0.0"
},
"keywords": [ "keywords": [
"find", "find",
"electron", "electron",
@ -29,7 +32,9 @@
"homepage": "https://github.com/captn3m0/which-electron#readme", "homepage": "https://github.com/captn3m0/which-electron#readme",
"dependencies": { "dependencies": {
"7zip-bin": "^5.1.1", "7zip-bin": "^5.1.1",
"disassembler": "^0.3.0-beta",
"electron-fingerprints": "*", "electron-fingerprints": "*",
"elfinfo": "^0.3.0-beta",
"hasha": "^5.2.2", "hasha": "^5.2.2",
"is-valid-http-url": "^1.0.3", "is-valid-http-url": "^1.0.3",
"node-7z": "^3.0.0", "node-7z": "^3.0.0",
@ -38,7 +43,9 @@
"semver": "^7.3.5", "semver": "^7.3.5",
"which": "^2.0.2" "which": "^2.0.2"
}, },
"exports": "./src/index.js",
"devDependencies": { "devDependencies": {
"kuta": "*" "kuta": "*",
"uvu": "^0.5.3"
} }
} }

View File

@ -1,50 +1,50 @@
const Seven = require("node-7z"); import { list, extract } from "node-7z";
const which = require('which'); import which from "which";
const path = require("path"); import path from "path";
const fs = require("fs"); import fs from "fs";
let sevenBin = null; let sevenBin = null;
try { try {
sevenBin = which.sync('7z') sevenBin = which.sync("7z");
} catch(e) { } catch (e) {
sevenBin = require('7zip-bin').path7za import { path7za } from "7zip-bin";
console.error("Couldn't find 7-zip installed. Using the 7zip-bin package, which uses an older version of 7-zip. Not all files may work properly.") console.error(
"Couldn't find 7-zip installed. Using the 7zip-bin package, which uses an older version of 7-zip. Not all files may work properly."
);
} }
module.exports = { export function readFileContents(archive, filepath, dir, cb) {
readFileContents: function(archive, filepath, dir, cb) { let stream = extract(archive, dir, {
let stream = Seven.extract(archive, dir, { recursive: true,
recursive: true, $cherryPick: filepath,
$cherryPick: filepath, $bin: sevenBin,
$bin: sevenBin });
}); let fn = path.basename(filepath);
let fn = path.basename(filepath); stream.on("end", () => {
stream.on("end", ()=>{ cb(fs.readFileSync(`${dir}/${fn}`, { encoding: "utf8" }));
cb(fs.readFileSync(`${dir}/${fn}`, {encoding: 'utf8'})) });
}); }
}, export function extractSomeFiles(archive, list, dir, cb) {
extractSomeFiles: function(archive, list, dir, cb) { let stream = extract(archive, dir, {
let stream = Seven.extract(archive, dir, { $cherryPick: list,
$cherryPick: list, $bin: sevenBin,
$bin: sevenBin });
}) stream.on("end", () => {
stream.on('end', ()=>{ cb();
cb() });
}) }
}, export function listFileContents(archive, cb) {
listFileContents: function(archive, cb) { let zip = list(archive, {
let zip = Seven.list(archive, { $bin: sevenBin,
$bin: sevenBin, alternateStreamExtract: true,
alternateStreamExtract: true, alternateStreamReplace: true,
alternateStreamReplace: true, });
}); let entries = [];
let entries = []; zip.on("data", (data) => {
zip.on("data", (data) => { entries.push(data);
entries.push(data); });
}); zip.on("end", () => {
zip.on("end", () => { cb(entries);
cb(entries); });
}); }
},
};

35
src/elf.js Normal file
View File

@ -0,0 +1,35 @@
import elfinfo from "elfinfo";
import fs from "fs";
// Parse the specified ELF file.
export function getVersion(path, cb) {
const elfdata = fs.readFileSync(path);
let info = null;
elfinfo.open(elfdata).then((info) => {
let rodata = info.elf.sections.filter((x) => {
return x.name == ".rodata";
})[0];
const data = fs.createReadStream(path, {
start: Number(rodata.addr),
end: Number(rodata.addr) + rodata.size,
highWaterMark: rodata.addralign,
});
let ret = false;
data.on("data", function (data) {
let found = data.toString().match(/Electron\/(\d+\.\d+\.\d+)/);
if (found) {
ret = true;
cb(found[1]);
}
});
data.on("end", function (e) {
if (!ret) {
cb(false);
}
});
});
}

View File

@ -1,56 +1,62 @@
// finds specific files from a list // finds specific files from a list
const path = require("path"); import path from "path";
const isDirectory = require('./utils').isDirectory; import { isDirectory } from "./utils.js";
module.exports = { // Finds the electron asar file, if we can
// Finds the electron asar file, if we can export function asar(entries) {
asar: function(entries) { return entries
return entries .filter((e) => {
.filter((e) => { return (
return ( isDirectory(e.attributes) == false &&
isDirectory(e.attributes) == false && path.basename(e.file) == "electron.asar"
path.basename(e.file) == "electron.asar" );
); })
}) .map((e) => e.file);
.map((e) => e.file); }
},
binary: function(entries) { export function binaries(entries) {
entries = entries.sort((a, b) => b.size - a.size); entries = entries.sort((a, b) => b.size - a.size);
for (const entry of entries) { for (const entry of entries) {
if (isDirectory(entry.attributes)) { if (isDirectory(entry.attributes)) {
continue; continue;
}
let ext = path.extname(entry.file);
let size = entry.size;
// Return the first exe file
if (ext == ".exe") {
return entry.file;
} else if (ext == "") {
// or the largest file with no extension
return entry.file;
}
} }
}, let ext = path.extname(entry.file);
let size = entry.size;
// Return the first exe file
if (ext == ".exe") {
return [entry.file];
} else if (ext == "") {
// or the largest file with no extension
return [entry.file];
}
}
}
version: function(entries) { export function version(entries) {
return entries return entries
.filter((e) => { .filter((e) => {
return isDirectory(e.attributes) == false && path.basename(e.file) == "version"; return (
}) isDirectory(e.attributes) == false && path.basename(e.file) == "version"
.map((e) => e.file); );
}, })
.map((e) => e.file);
}
findElectronPackageInsideNodeModules: function(entries) { export function findElectronPackageInsideNodeModules(entries) {
return entries return entries
.filter((e) => { .filter((e) => {
return isDirectory(e.attributes) == false && e.file.match(/node_modules\/electron\/package\.json$/); return (
}) isDirectory(e.attributes) == false &&
.map((e) => e.file); e.file.match(/node_modules\/electron\/package\.json$/)
}, );
})
.map((e) => e.file);
}
// Return a list of files that might be worth fingerprinting // Return a list of files that might be worth fingerprinting
fingerprintable: function(entries) { export function fingerprintable(entries) {
return entries.filter((e) =>{ return entries
.filter((e) => {
if (isDirectory(e.attributes)) { if (isDirectory(e.attributes)) {
return false; return false;
} }
@ -58,17 +64,29 @@ module.exports = {
return false; return false;
} }
let ext = path.extname(e.file); let ext = path.extname(e.file);
if (['.h', '.dll', '.bin', '.asar', '.dylib', '.so', '.exe'].indexOf(ext) !== -1) { if (
return true [".h", ".dll", ".bin", ".asar", ".dylib", ".so", ".exe"].indexOf(
ext
) !== -1
) {
return true;
} }
let b = path.basename(e.file); let b = path.basename(e.file);
if (['electron framework', 'squirrel', 'electron', 'electron helper', 'chrome_100_percent', 'chrome_200_percent'].indexOf(b)!== -1) { if (
[
"electron framework",
"squirrel",
"electron",
"electron helper",
"chrome_100_percent",
"chrome_200_percent",
].indexOf(b) !== -1
) {
return true; return true;
} }
return false; return false;
}) })
.map((e)=>e.file) .map((e) => e.file);
} }
};

View File

@ -1,54 +1,52 @@
const DB = require("electron-fingerprints"); import DB from "electron-fingerprints";
const fs = require("fs"); import fs from "fs";
const hasha = require("hasha"); import hasha from "hasha";
const allVersions = require("./versions")["all"]; import crypto from "crypto";
import V from "./versions.json" assert { type: "json" };
const allVersions = V["all"];
function checksumFile(algorithm, path) { function checksumFile(algorithm, path) {
return new Promise(function(resolve, reject) { return new Promise(function (resolve, reject) {
let fs = require("fs");
let crypto = require("crypto");
let hash = crypto.createHash(algorithm).setEncoding("hex"); let hash = crypto.createHash(algorithm).setEncoding("hex");
fs.createReadStream(path) fs.createReadStream(path)
.once("error", reject) .once("error", reject)
.pipe(hash) .pipe(hash)
.once("finish", function() { .once("finish", function () {
resolve(hash.read()); resolve(hash.read());
}); });
}); });
} }
module.exports = { export function guessFromHashes(os, arch, hashList) {
guessFromHashes: function(os, arch, hashList) { let lookupTable = DB[`${os}-${arch}`];
let lookupTable = DB[`${os}-${arch}`]; let allPossibleHashes = Object.keys(lookupTable);
let allPossibleHashes = Object.keys(lookupTable); const intersectingHashes = allPossibleHashes.filter((value) =>
const intersectingHashes = allPossibleHashes.filter((value) => hashList.includes(value)
hashList.includes(value) );
); // Set it to the starting list of versions.
// Set it to the starting list of versions. let possibleVersions = allVersions;
let possibleVersions = allVersions; for (i in hashList) {
for (i in hashList) { let hash = hashList[i];
let hash = hashList[i]; let versions = lookupTable[hash];
let versions = lookupTable[hash]; if (versions) {
if (versions) { possibleVersions = possibleVersions.filter((value) =>
possibleVersions = possibleVersions.filter((value) => versions.includes(value)
versions.includes(value) );
);
}
} }
}
if (possibleVersions == allVersions) { if (possibleVersions == allVersions) {
return []; return [];
} else { } else {
return possibleVersions; return possibleVersions;
} }
}, }
getHashes: function(dir) { export function getHashes(dir) {
let list = fs.readdirSync(dir); let list = fs.readdirSync(dir);
return list.map((f) => { return list.map((f) => {
let fn = `${dir}/${f}`; let fn = `${dir}/${f}`;
return hasha.fromFileSync(fn, { algorithm: "sha1" }); return hasha.fromFileSync(fn, { algorithm: "sha1" });
}); });
}, }
};

View File

@ -3,54 +3,59 @@ const finder = require("./finder");
const archive = require("./archive"); const archive = require("./archive");
const fp = require("./fingerprint"); const fp = require("./fingerprint");
const V = require("./version"); const V = require("./version");
const elf = require("./elf");
const magic = require("file-identity");
const isUrl = require("is-valid-http-url"); const isUrl = require("is-valid-http-url");
const cleanup = require("rimraf"); const cleanup = require("rimraf");
const dl = require('nodejs-file-downloader') const dl = require("nodejs-file-downloader");
const path = require("path"); const path = require("path");
const fs = require('fs'); const fs = require("fs");
const os = require('os'); const os = require("os");
const process = require('process'); const process = require("process");
const TMPDIR = path.join(os.tmpdir(), 'which-electron') const TMPDIR = path.join(os.tmpdir(), "which-electron");
// Input file comes from process.argv[2] // Input file comes from process.argv[2]
let FILENAME = process.argv[2]; let FILENAME = process.argv[2];
if (!FILENAME) { if (!FILENAME) {
console.error("Please pass a valid URL or file as the first argument"); console.error("Please pass a valid URL or file as the first argument");
process.exit(1) process.exit(1);
} }
if(isUrl(FILENAME)) { if (isUrl(FILENAME)) {
let url = FILENAME; let url = FILENAME;
// Download to temporary directory // Download to temporary directory
let tmpdir = fs.mkdtempSync(TMPDIR); let tmpdir = fs.mkdtempSync(TMPDIR);
let fn = `${tmpdir}/${path.basename(url)}`; let fn = `${tmpdir}/${path.basename(url)}`;
const downloader = new dl({ const downloader = new dl({
url: url, url: url,
directory: tmpdir,//This folder will be created, if it doesn't exist. directory: tmpdir, //This folder will be created, if it doesn't exist.
}) });
downloader.download().then(()=> { downloader
console.log(`Downloaded ${url}`) .download()
validateFile(fn) .then(() => {
}).catch((e)=> { console.log(`Downloaded ${url}`);
console.error(`Error while downloading ${url}`) validateFile(fn);
console.error(e) })
process.exit(1) .catch((e) => {
}) console.error(`Error while downloading ${url}`);
console.error(e);
process.exit(1);
});
} else { } else {
validateFile(FILENAME) validateFile(FILENAME);
} }
function validateFile(fn) { function validateFile(fn) {
fs.access(fn, fs.constants.R_OK, (err) => { fs.access(fn, fs.constants.R_OK, (err) => {
if (err) { if (err) {
console.error(`${fn} not readable`) console.error(`${fn} not readable`);
process.exit(1); process.exit(1);
} else { } else {
console.log(fn); console.log(fn);
whichElectron(fn) whichElectron(fn);
} }
}); });
} }
@ -63,47 +68,63 @@ function logSupport(version) {
} }
} }
let whichElectron = function(filename) { let whichElectron = function (filename) {
archive.listFileContents(filename, (entries) => { archive.listFileContents(filename, (entries) => {
let osguess1 = osguess.guessFromFilename(filename); let osguess1 = osguess.guessFromFilename(filename);
let osguess2 = osguess.guessFromContents(entries); let osguess2 = osguess.guessFromContents(entries);
if (osguess1 !== osguess2 && osguess1 && osguess2) { if (osguess1 !== osguess2 && osguess1 && osguess2) {
console.log(`Unsure about operating system. Going with ${osguess2}. Other option was ${osguess1}`); console.log(
`Unsure about operating system. Going with ${osguess2}. Other option was ${osguess1}`
);
} }
if (osguess1 && !osguess2) { if (osguess1 && !osguess2) {
osguess2 = osguess1 osguess2 = osguess1;
} }
let arch = osguess.guessArch(filename, entries); let arch = osguess.guessArch(filename, entries);
let asar = finder.asar(entries); let asar = finder.asar(entries);
let binary = finder.binary(entries); let binaries = finder.binaries(entries);
let versionFiles = finder.version(entries); let versionFiles = finder.version(entries);
let enm = finder.findElectronPackageInsideNodeModules(entries); let enm = finder.findElectronPackageInsideNodeModules(entries);
let filesToHash = finder.fingerprintable(entries); let filesToHash = finder.fingerprintable(entries);
archive.extractSomeFiles(filename, filesToHash, TMPDIR, () => { archive.extractSomeFiles(
hashes = fp.getHashes(TMPDIR); filename,
guesses = fp.guessFromHashes(osguess2, arch, hashes); filesToHash.concat(binaries),
if (guesses.length == 1) { TMPDIR,
console.log("Fingerprint: " + guesses[0]); () => {
logSupport(guesses[0]) hashes = fp.getHashes(TMPDIR);
} else if (guesses.length > 1) { guesses = fp.guessFromHashes(osguess2, arch, hashes);
console.log("Fingerprint: " + V.asText(guesses)); if (guesses.length == 1) {
logSupport(V.max(guesses)) console.log("Fingerprint: " + guesses[0]);
logSupport(guesses[0]);
} else if (guesses.length > 1) {
console.log("Fingerprint: " + V.asText(guesses));
logSupport(V.max(guesses));
}
if (binaries.length > 0) {
for (i in binaries) {
let binary = binaries[i];
let type = magic.fromFile(`${TMPDIR}/${binary}`);
if (type) {
console.log(type);
} else {
console.log(fs.existsSync(`${TMPDIR}/${binary}`));
}
}
}
cleanup.sync(TMPDIR);
} }
);
cleanup.sync(TMPDIR);
});
// if (binary) {
// console.log(`${process.argv[2]}:${binary}`);
// }
if (versionFiles.length > 0) { if (versionFiles.length > 0) {
versionFiles.map((f) => { versionFiles.map((f) => {
archive.readFileContents(filename, f, TMPDIR, (c) => { archive.readFileContents(filename, f, TMPDIR, (c) => {
console.log("Found Version file: " + c); console.log("Found Version file: " + c);
logSupport(`${c}`) logSupport(`${c}`);
}); });
}); });
} }
@ -120,7 +141,7 @@ let whichElectron = function(filename) {
console.log( console.log(
"Found version in package.json file: " + packageData["version"] "Found version in package.json file: " + packageData["version"]
); );
logSupport(`v${packageData["version"]}`) logSupport(`v${packageData["version"]}`);
} catch (e) { } catch (e) {
// TODO: Do something // TODO: Do something
} }
@ -128,6 +149,4 @@ let whichElectron = function(filename) {
}); });
} }
}); });
} };

View File

@ -1,43 +1,44 @@
// Guess the OS // Guess the OS
import path from 'path'
const path = require('path') export function guessFromFilename(inputFile) {
let fn = path.basename(inputFile);
module.exports = { if (fn.match(/linux/)) {
guessFromFilename(inputFile) { return "linux";
let fn = path.basename(inputFile) } else if (fn.match(/mac/)) {
if (fn.match(/linux/)) { return "darwin";
return 'linux' } else if (fn.match(/darwin/)) {
} else if (fn.match(/mac/)) { return "darwin";
return 'darwin' } else if (fn.match(/win/)) {
} else if (fn.match(/darwin/)) { return "win32";
return 'darwin' } else {
} else if (fn.match(/win/)) { let ext = path.extname(inputFile).toLowerCase();
return 'win32' if (ext == ".dmg") {
} else { return "darwin";
let ext = path.extname(inputFile).toLowerCase() }
if (ext == '.dmg') {return 'darwin'} if (ext == ".exe") {
if (ext == '.exe') {return 'win32'} return "win32";
if (['.deb', '.appimage', '.pacman'].indexOf(ext) !== -1) { }
return 'linux' if ([".deb", ".appimage", ".pacman"].indexOf(ext) !== -1) {
} return "linux";
} }
return null; }
}, return null;
guessArch(filename, entries) { }
return 'x64'; export function guessArch(filename, entries) {
}, return "x64";
guessFromContents(entries) { }
for (i in entries) { export function guessFromContents(entries) {
let entry = entries[i] for (let i in entries) {
if (path.extname(entry.file) == ".so") { let entry = entries[i];
return 'linux' if (path.extname(entry.file) == ".so") {
} else if (path.extname(entry.file) == '.dll') { return "linux";
return 'win32' } else if (path.extname(entry.file) == ".dll") {
} else if (path.extname(entry.file) == '.dylib') { return "win32";
return 'darwin' } else if (path.extname(entry.file) == ".dylib") {
} else if (path.extname(entry.file) == '.plist') { return "darwin";
return 'darwin' } else if (path.extname(entry.file) == ".plist") {
} return "darwin";
} }
} }
} }

View File

@ -1,5 +1,3 @@
module.exports = { export function isDirectory(a) {
isDirectory: function(a) { return a ? a[0] == "D" : null;
return (a? a[0] == "D" : null) }
},
};

View File

@ -1,18 +1,15 @@
const semver = require("semver"); import semver from "semver";
const VERSIONS = require("./versions"); import VERSIONS from "./versions.json" assert { type: "json" };
module.exports = { export function asText(listOfVersions) {
asText: function (listOfVersions) { sorted = listOfVersions.sort(semver.compare);
sorted = listOfVersions.sort(semver.compare); return `${sorted[0]}-${sorted[sorted.length - 1]}`;
return `${sorted[0]}-${sorted[sorted.length - 1]}`; }
},
max: function (listOfVersions) { export function max(listOfVersions) {
sorted = listOfVersions.sort(semver.compare); sorted = listOfVersions.sort(semver.compare);
return sorted[sorted.length - 1]; return sorted[sorted.length - 1];
}, }
export function isSupported(v) {
isSupported: function (v) { return VERSIONS["supported"].indexOf(v) !== -1;
return VERSIONS["supported"].indexOf(v) !== -1; }
},
};

View File

@ -1,9 +1,9 @@
{ {
"supported": [ "supported": [
"v15.5.0", "v15.5.2",
"v16.2.0", "v16.2.2",
"v17.3.0", "v17.4.0",
"v18.0.0" "v18.0.4"
], ],
"all": [ "all": [
"v0.24.0", "v0.24.0",
@ -495,6 +495,7 @@
"v14.2.6", "v14.2.6",
"v14.2.7", "v14.2.7",
"v14.2.8", "v14.2.8",
"v14.2.9",
"v15.0.0", "v15.0.0",
"v15.1.0", "v15.1.0",
"v15.1.1", "v15.1.1",
@ -512,6 +513,8 @@
"v15.4.1", "v15.4.1",
"v15.4.2", "v15.4.2",
"v15.5.0", "v15.5.0",
"v15.5.1",
"v15.5.2",
"v16.0.0", "v16.0.0",
"v16.0.1", "v16.0.1",
"v16.0.2", "v16.0.2",
@ -526,6 +529,8 @@
"v16.1.0", "v16.1.0",
"v16.1.1", "v16.1.1",
"v16.2.0", "v16.2.0",
"v16.2.1",
"v16.2.2",
"v17.0.0", "v17.0.0",
"v17.0.1", "v17.0.1",
"v17.1.0", "v17.1.0",
@ -533,6 +538,12 @@
"v17.1.2", "v17.1.2",
"v17.2.0", "v17.2.0",
"v17.3.0", "v17.3.0",
"v18.0.0" "v17.3.1",
"v17.4.0",
"v18.0.0",
"v18.0.1",
"v18.0.2",
"v18.0.3",
"v18.0.4"
] ]
} }

View File

@ -1,50 +1,50 @@
const test = require("kuta").test; import * as finder from "../src/finder.js";
const finder = require("../src/finder"); import { test } from "uvu";
const assert = require("assert"); import * as assert from "uvu/assert";
const _ = require("./utils"); import { getEntries } from "./utils.js";
test("it should find the electron.asar file", () => { test("it should find the electron.asar file", () => {
assert.deepEqual( assert.equal(
["Hyper.app/Contents/Resources/electron.asar"], ["Hyper.app/Contents/Resources/electron.asar"],
finder.asar(_.getEntries("Hyper-3.0.2-mac.zip")) finder.asar(getEntries("Hyper-3.0.2-mac.zip"))
); );
}); });
test("it should find the correct binary file", () => { test("it should find the correct binary file", () => {
assert.deepEqual( assert.equal(
"Hyper.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework", "Hyper.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework",
finder.binary(_.getEntries("Hyper-3.0.2-mac.zip")) finder.binary(getEntries("Hyper-3.0.2-mac.zip"))
); );
assert.deepEqual( assert.equal(
"Notable.exe", "Notable.exe",
finder.binary(_.getEntries("Notable-1.8.4-win.zip")) finder.binary(getEntries("Notable-1.8.4-win.zip"))
); );
assert.deepEqual( assert.equal(
"rambox", "rambox",
finder.binary(_.getEntries("Rambox-0.7.7-linux-x64.zip")) finder.binary(getEntries("Rambox-0.7.7-linux-x64.zip"))
); );
}); });
test("it should find the version file", () => { test("it should find the version file", () => {
assert.deepEqual( assert.equal(
["chronobreak-linux-x64/version"], ["chronobreak-linux-x64/version"],
finder.version(_.getEntries("chronobreak-linux-x64.zip")) finder.version(getEntries("chronobreak-linux-x64.zip"))
); );
assert.deepEqual( assert.equal(
["release-builds/encrypt0r-darwin-x64/version"], ["release-builds/encrypt0r-darwin-x64/version"],
finder.version(_.getEntries("encrypt0r-mac.zip")) finder.version(getEntries("encrypt0r-mac.zip"))
); );
assert.deepEqual( assert.equal(
[ [
"Arizona v.1.0.0/resources/app/node_modules/electron/dist/version", "Arizona v.1.0.0/resources/app/node_modules/electron/dist/version",
"Arizona v.1.0.0/version", "Arizona v.1.0.0/version",
], ],
finder.version(_.getEntries("Arizona-v1.0.0-beta-Windows.zip")) finder.version(getEntries("Arizona-v1.0.0-beta-Windows.zip"))
); );
}); });
test("it should find fingerprinteable files", () => { test("it should find fingerprinteable files", () => {
assert.deepEqual( assert.equal(
[ [
"Arizona v.1.0.0/Arizona.exe", "Arizona v.1.0.0/Arizona.exe",
"Arizona v.1.0.0/d3dcompiler_47.dll", "Arizona v.1.0.0/d3dcompiler_47.dll",
@ -74,9 +74,9 @@ test("it should find fingerprinteable files", () => {
"Arizona v.1.0.0/vk_swiftshader.dll", "Arizona v.1.0.0/vk_swiftshader.dll",
"Arizona v.1.0.0/vulkan-1.dll", "Arizona v.1.0.0/vulkan-1.dll",
], ],
finder.fingerprintable(_.getEntries("Arizona-v1.0.0-beta-Windows.zip")) finder.fingerprintable(getEntries("Arizona-v1.0.0-beta-Windows.zip"))
); );
assert.deepEqual( assert.equal(
[ [
"Lax-win32-x64/v8_context_snapshot.bin", "Lax-win32-x64/v8_context_snapshot.bin",
"Lax-win32-x64/d3dcompiler_47.dll", "Lax-win32-x64/d3dcompiler_47.dll",
@ -89,10 +89,10 @@ test("it should find fingerprinteable files", () => {
"Lax-win32-x64/swiftshader/libEGL.dll", "Lax-win32-x64/swiftshader/libEGL.dll",
"Lax-win32-x64/swiftshader/libGLESv2.dll", "Lax-win32-x64/swiftshader/libGLESv2.dll",
], ],
finder.fingerprintable(_.getEntries("Lax-win32-x64.zip")) finder.fingerprintable(getEntries("Lax-win32-x64.zip"))
); );
assert.deepEqual( assert.equal(
[ [
"resources/app.asar", "resources/app.asar",
"swiftshader/libvk_swiftshader.so", "swiftshader/libvk_swiftshader.so",
@ -105,10 +105,10 @@ test("it should find fingerprinteable files", () => {
"libEGL.so", "libEGL.so",
"natives_blob.bin", "natives_blob.bin",
], ],
finder.fingerprintable(_.getEntries("Rambox-0.7.7-linux-x64.zip")) finder.fingerprintable(getEntries("Rambox-0.7.7-linux-x64.zip"))
); );
assert.deepEqual( assert.equal(
[ [
"chronobreak-linux-x64/libEGL.so", "chronobreak-linux-x64/libEGL.so",
"chronobreak-linux-x64/libffmpeg.so", "chronobreak-linux-x64/libffmpeg.so",
@ -121,10 +121,10 @@ test("it should find fingerprinteable files", () => {
"chronobreak-linux-x64/swiftshader/libGLESv2.so", "chronobreak-linux-x64/swiftshader/libGLESv2.so",
"chronobreak-linux-x64/v8_context_snapshot.bin", "chronobreak-linux-x64/v8_context_snapshot.bin",
], ],
finder.fingerprintable(_.getEntries("chronobreak-linux-x64.zip")) finder.fingerprintable(getEntries("chronobreak-linux-x64.zip"))
); );
assert.deepEqual( assert.equal(
[ [
"Hyper.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib", "Hyper.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib",
"Hyper.app/Contents/Resources/app.asar", "Hyper.app/Contents/Resources/app.asar",
@ -203,10 +203,10 @@ test("it should find fingerprinteable files", () => {
"Hyper.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACUnit.h", "Hyper.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACUnit.h",
"Hyper.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSFileHandle+RACSupport.h", "Hyper.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSFileHandle+RACSupport.h",
], ],
finder.fingerprintable(_.getEntries("Hyper-3.0.2-mac.zip")) finder.fingerprintable(getEntries("Hyper-3.0.2-mac.zip"))
); );
assert.deepEqual( assert.equal(
[ [
"Notable.exe", "Notable.exe",
"libGLESv2.dll", "libGLESv2.dll",
@ -220,10 +220,10 @@ test("it should find fingerprinteable files", () => {
"libEGL.dll", "libEGL.dll",
"natives_blob.bin", "natives_blob.bin",
], ],
finder.fingerprintable(_.getEntries("Notable-1.8.4-win.zip")) finder.fingerprintable(getEntries("Notable-1.8.4-win.zip"))
); );
assert.deepEqual( assert.equal(
[ [
"release-builds/encrypt0r-darwin-x64/encrypt0r.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libGLESv2.dylib", "release-builds/encrypt0r-darwin-x64/encrypt0r.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libGLESv2.dylib",
"release-builds/encrypt0r-darwin-x64/encrypt0r.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libswiftshader_libGLESv2.dylib", "release-builds/encrypt0r-darwin-x64/encrypt0r.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libswiftshader_libGLESv2.dylib",
@ -247,6 +247,8 @@ test("it should find fingerprinteable files", () => {
"release-builds/encrypt0r-darwin-x64/encrypt0r.app/Contents/Frameworks/Electron Framework.framework/Libraries/libswiftshader_libEGL.dylib", "release-builds/encrypt0r-darwin-x64/encrypt0r.app/Contents/Frameworks/Electron Framework.framework/Libraries/libswiftshader_libEGL.dylib",
"release-builds/encrypt0r-darwin-x64/encrypt0r.app/Contents/Frameworks/Electron Framework.framework/Resources/v8_context_snapshot.x86_64.bin", "release-builds/encrypt0r-darwin-x64/encrypt0r.app/Contents/Frameworks/Electron Framework.framework/Resources/v8_context_snapshot.x86_64.bin",
], ],
finder.fingerprintable(_.getEntries("encrypt0r-mac.zip")) finder.fingerprintable(getEntries("encrypt0r-mac.zip"))
); );
}); });
test.run();

View File

@ -1,19 +1,19 @@
const test = require("kuta").test; import { test } from "uvu";
const fp = require("../src/fingerprint"); import * as assert from "uvu/assert";
const assert = require("assert"); import { guessFromHashes, getHashes } from "../src/fingerprint.js";
test("it should work with a single fingerprint", () => { test("it should work with a single fingerprint", () => {
guess = fp.guessFromHashes("win32", "x64", [ guess = guessFromHashes("win32", "x64", [
"cbdbe566564c323032c02c1a838358a314af63b4", "cbdbe566564c323032c02c1a838358a314af63b4",
]); ]);
assert.deepEqual(guess, ["v0.24.0"]); assert.equal(guess, ["v0.24.0"]);
}); });
test("it should work with a ffmpeg hash", () => { test("it should work with a ffmpeg hash", () => {
guess = fp.guessFromHashes("win32", "x64", [ guess = guessFromHashes("win32", "x64", [
"baf786083f482c1f035e50e105b5f7475af1e00b", "baf786083f482c1f035e50e105b5f7475af1e00b",
]); ]);
assert.deepEqual(guess, ["v1.4.3", "v1.4.4", "v1.4.5"]); assert.equal(guess, ["v1.4.3", "v1.4.4", "v1.4.5"]);
}); });
test("it should work with multiple fingerprints", () => { test("it should work with multiple fingerprints", () => {
@ -22,6 +22,8 @@ test("it should work with multiple fingerprints", () => {
"944bff8704d4b152279fbdacb911b516502be056", "944bff8704d4b152279fbdacb911b516502be056",
"3c592e2cdadbb0bcd8f522071a63da5febe9aa37", "3c592e2cdadbb0bcd8f522071a63da5febe9aa37",
]; ];
guess = fp.guessFromHashes("darwin", "x64", hashes); guess = guessFromHashes("darwin", "x64", hashes);
assert.deepEqual(guess, ["v1.7.6"]); assert.equal(guess, ["v1.7.6"]);
}); });
test.run();

View File

@ -1,37 +1,75 @@
const test = require('kuta').test; import { test } from "uvu";
const os = require('../src/os') import * as assert from "uvu/assert";
const assert = require('assert')
const _ = require('./utils')
test('it should linux correctly from filename', ()=> { import { guessFromFilename, guessFromContents } from "../src/os.js";
assert.deepEqual('linux', os.guessFromFilename('kube-dev-dashboard-0.10.1-linux.zip')) import { getEntries } from "./utils.js";
assert.deepEqual('linux', os.guessFromFilename('magiccap-linux.zip'))
assert.deepEqual('linux', os.guessFromFilename('Rambox-0.7.7-linux-ia32.zip')) test("it should linux correctly from filename", () => {
assert.deepEqual('linux', os.guessFromFilename('authme-2.6.0-linux-x64-portable.zip')) assert.equal(
assert.deepEqual('linux', os.guessFromFilename('mojibar-linux.zip')) "linux",
assert.deepEqual('linux', os.guessFromFilename('mojibar-linux.deb')) guessFromFilename("kube-dev-dashboard-0.10.1-linux.zip")
assert.deepEqual('linux', os.guessFromFilename('mojibar.AppImage')) );
assert.deepEqual('linux', os.guessFromFilename('mojibar.pacman')) assert.equal("linux", guessFromFilename("magiccap-linux.zip"));
assert.equal("linux", guessFromFilename("Rambox-0.7.7-linux-ia32.zip"));
assert.equal(
"linux",
guessFromFilename("authme-2.6.0-linux-x64-portable.zip")
);
assert.equal("linux", guessFromFilename("mojibar-linux.zip"));
assert.equal("linux", guessFromFilename("mojibar-linux.deb"));
assert.equal("linux", guessFromFilename("mojibar.AppImage"));
assert.equal("linux", guessFromFilename("mojibar.pacman"));
}); });
test('it should darwin correctly from filename', ()=> { test("it should darwin correctly from filename", () => {
assert.deepEqual('darwin', os.guessFromFilename('Merge-Request-Notifier-1.9.0-mac.zip')) assert.equal(
assert.deepEqual('darwin', os.guessFromFilename('Merge-Request-Notifier-1.9.0.dmg')) "darwin",
guessFromFilename("Merge-Request-Notifier-1.9.0-mac.zip")
);
assert.equal(
"darwin",
guessFromFilename("Merge-Request-Notifier-1.9.0.dmg")
);
}); });
test('it should windows correctly from filename', ()=> { test("it should windows correctly from filename", () => {
assert.deepEqual('win32', os.guessFromFilename('particl-desktop-2.3.6-win-ia32.zip')) assert.equal(
assert.deepEqual('win32', os.guessFromFilename('Multrin-1.3.0-ia32-win.zip')) "win32",
assert.deepEqual('win32', os.guessFromFilename('Multrin-1.3.0-ia32-win.exe')) guessFromFilename("particl-desktop-2.3.6-win-ia32.zip")
assert.deepEqual('win32', os.guessFromFilename('Assessment.Disaggregation-1.1.4.Setup.exe')) );
assert.equal("win32", guessFromFilename("Multrin-1.3.0-ia32-win.zip"));
assert.equal("win32", guessFromFilename("Multrin-1.3.0-ia32-win.exe"));
assert.equal(
"win32",
guessFromFilename("Assessment.Disaggregation-1.1.4.Setup.exe")
);
}); });
test('it should guess correctly from file list', ()=> { test("it should guess correctly from file list", () => {
assert.deepEqual('win32', os.guessFromContents(_.getEntries('Arizona-v1.0.0-beta-Windows.zip'))); assert.equal(
assert.deepEqual('win32', os.guessFromContents(_.getEntries('Notable-1.8.4-win.zip'))); "win32",
assert.deepEqual('darwin', os.guessFromContents(_.getEntries('encrypt0r-mac.zip'))); guessFromContents(getEntries("Arizona-v1.0.0-beta-Windows.zip"))
assert.deepEqual('darwin', os.guessFromContents(_.getEntries('Hyper-3.0.2-mac.zip'))); );
assert.deepEqual('linux', os.guessFromContents(_.getEntries('chronobreak-linux-x64.zip'))); assert.equal(
assert.deepEqual('linux', os.guessFromContents(_.getEntries('Rambox-0.7.7-linux-x64.zip'))); "win32",
guessFromContents(getEntries("Notable-1.8.4-win.zip"))
);
assert.equal(
"darwin",
guessFromContents(getEntries("encrypt0r-mac.zip"))
);
assert.equal(
"darwin",
guessFromContents(getEntries("Hyper-3.0.2-mac.zip"))
);
assert.equal(
"linux",
guessFromContents(getEntries("chronobreak-linux-x64.zip"))
);
assert.equal(
"linux",
guessFromContents(getEntries("Rambox-0.7.7-linux-x64.zip"))
);
}); });
test.run();

View File

@ -1,14 +1,12 @@
const fs = require("fs"); import fs from "fs";
entries = {}; let entries = {};
module.exports = { export function getEntries(f) {
getEntries: function(f) { if (entries[f]) {
if (entries[f]) { return entries[f];
return entries[f]; } else {
} else { return (entries[f] = JSON.parse(
return (entries[f] = JSON.parse( fs.readFileSync(`./tests/fixtures/${f}.json`)
fs.readFileSync(`./tests/fixtures/${f}.json`) ));
)); }
} }
},
};