node-apk
Version:
A library to parse Android application manifest and signature
67 lines (66 loc) • 2.88 kB
JavaScript
;
/*
* Copyright (c) 2021 XdevL. All rights reserved.
*
* This work is licensed under the terms of the MIT license.
* For a copy, see <https://opensource.org/licenses/MIT>.
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var fs_1 = __importDefault(require("fs"));
var android_1 = require("./android");
var certificate_1 = __importDefault(require("./certificate"));
var resources_1 = require("./resources");
var source_1 = __importDefault(require("./source"));
var xml_1 = __importDefault(require("./xml"));
var zip_1 = require("./zip");
var Apk = /** @class */ (function () {
function Apk(input) {
if (typeof input === "string") {
this.loader = function () { return fs_1.default.promises.readFile(input); };
}
else {
this.loader = function () { return Promise.resolve(input); };
}
}
Apk.prototype.getCertificateInfo = function () {
var _this = this;
return zip_1.ZipEntry.index(this.loader).then(function (map) {
return Promise.all(Array.from(map.values())
.filter(function (entry) { return entry.name.startsWith("META-INF/") && entry.name.endsWith(".RSA"); })
.map(function (certEntry) { return _this.bufferize(certEntry.stream()).then(function (buffer) { return certificate_1.default.fromPkcs7(buffer); }); })).then(function (certs) {
var _a;
return (_a = []).concat.apply(_a, certs);
});
});
};
Apk.prototype.getManifestInfo = function () {
return this.extract("AndroidManifest.xml")
.then(function (buffer) { return new android_1.Manifest(new xml_1.default(new source_1.default(buffer))); });
};
Apk.prototype.getResources = function () {
return this.extract("resources.arsc")
.then(function (buffer) { return new resources_1.Resources(new source_1.default(buffer)); });
};
Apk.prototype.extract = function (key) {
var _this = this;
return zip_1.ZipEntry.lookup(this.loader, key)
.then(function (entry) { return entry.stream(); })
.then(function (stream) { return _this.bufferize(stream); });
};
Apk.prototype.close = function () {
return undefined;
};
Apk.prototype.bufferize = function (stream) {
return new Promise(function (resolve, reject) {
var buffers = [];
stream.on("data", function (buffer) { return buffers.push(buffer); });
stream.on("end", function () { return resolve(Buffer.concat(buffers)); });
stream.on("error", function (error) { return reject(error); });
});
};
return Apk;
}());
exports.default = Apk;