r2-shared-js
Version:
Readium 2 'shared' for NodeJS (TypeScript)
60 lines • 2.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransformerObfAdobe = void 0;
const tslib_1 = require("tslib");
const BufferUtils_1 = require("r2-utils-js/dist/es7-es2016/src/_utils/stream/BufferUtils");
class TransformerObfAdobe {
supports(_publication, link) {
return link.Properties && link.Properties.Encrypted &&
link.Properties.Encrypted.Algorithm === "http://ns.adobe.com/pdf/enc#RC";
}
transformStream(publication, link, _url, stream, _isPartialByteRangeRequest, _partialByteBegin, _partialByteEnd, _sessionInfo) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
let data;
try {
data = yield (0, BufferUtils_1.streamToBufferPromise)(stream.stream);
}
catch (err) {
return Promise.reject(err);
}
let buff;
try {
buff = yield this.transformBuffer(publication, link, data);
}
catch (err) {
return Promise.reject(err);
}
const sal = {
length: buff.length,
reset: () => tslib_1.__awaiter(this, void 0, void 0, function* () {
return Promise.resolve(sal);
}),
stream: (0, BufferUtils_1.bufferToStream)(buff),
};
return Promise.resolve(sal);
});
}
transformBuffer(publication, _link, data) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
let pubID = publication.Metadata.Identifier;
pubID = pubID.replace("urn:uuid:", "");
pubID = pubID.replace(/-/g, "");
pubID = pubID.replace(/\s/g, "");
const key = [];
for (let i = 0; i < 16; i++) {
const byteHex = pubID.substr(i * 2, 2);
const byteNumer = parseInt(byteHex, 16);
key.push(byteNumer);
}
const prefixLength = 1024;
const zipDataPrefix = data.slice(0, prefixLength);
for (let i = 0; i < prefixLength; i++) {
zipDataPrefix[i] = zipDataPrefix[i] ^ (key[i % key.length]);
}
const zipDataRemainder = data.slice(prefixLength);
return Promise.resolve(Buffer.concat([zipDataPrefix, zipDataRemainder]));
});
}
}
exports.TransformerObfAdobe = TransformerObfAdobe;
//# sourceMappingURL=transformer-obf-adobe.js.map