mirror of
https://github.com/documenso/documenso.git
synced 2025-11-15 01:01:49 +10:00
🚚 ➕ add node-signpdf copy to signing packgage until npm includes fix
This commit is contained in:
71
packages/signing/node-signpdf/dist/helpers/extractSignature.js
vendored
Normal file
71
packages/signing/node-signpdf/dist/helpers/extractSignature.js
vendored
Normal file
@ -0,0 +1,71 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.default = void 0;
|
||||
|
||||
var _SignPdfError = _interopRequireDefault(require("../SignPdfError"));
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
const getSubstringIndex = (str, substring, n) => {
|
||||
let times = 0;
|
||||
let index = null;
|
||||
|
||||
while (times < n && index !== -1) {
|
||||
index = str.indexOf(substring, index + 1);
|
||||
times += 1;
|
||||
}
|
||||
|
||||
return index;
|
||||
};
|
||||
/**
|
||||
* Basic implementation of signature extraction.
|
||||
*
|
||||
* Really basic. Would work in the simplest of cases where there is only one signature
|
||||
* in a document and ByteRange is only used once in it.
|
||||
*
|
||||
* @param {Buffer} pdf
|
||||
* @returns {Object} {ByteRange: Number[], signature: Buffer, signedData: Buffer}
|
||||
*/
|
||||
|
||||
|
||||
const extractSignature = (pdf, signatureCount = 1) => {
|
||||
if (!(pdf instanceof Buffer)) {
|
||||
throw new _SignPdfError.default('PDF expected as Buffer.', _SignPdfError.default.TYPE_INPUT);
|
||||
} // const byteRangePos = pdf.indexOf('/ByteRange [');
|
||||
|
||||
|
||||
const byteRangePos = getSubstringIndex(pdf, '/ByteRange [', signatureCount);
|
||||
|
||||
if (byteRangePos === -1) {
|
||||
throw new _SignPdfError.default('Failed to locate ByteRange.', _SignPdfError.default.TYPE_PARSE);
|
||||
}
|
||||
|
||||
const byteRangeEnd = pdf.indexOf(']', byteRangePos);
|
||||
|
||||
if (byteRangeEnd === -1) {
|
||||
throw new _SignPdfError.default('Failed to locate the end of the ByteRange.', _SignPdfError.default.TYPE_PARSE);
|
||||
}
|
||||
|
||||
const byteRange = pdf.slice(byteRangePos, byteRangeEnd + 1).toString();
|
||||
const matches = /\/ByteRange \[(\d+) +(\d+) +(\d+) +(\d+) *\]/.exec(byteRange);
|
||||
|
||||
if (matches === null) {
|
||||
throw new _SignPdfError.default('Failed to parse the ByteRange.', _SignPdfError.default.TYPE_PARSE);
|
||||
}
|
||||
|
||||
const ByteRange = matches.slice(1).map(Number);
|
||||
const signedData = Buffer.concat([pdf.slice(ByteRange[0], ByteRange[0] + ByteRange[1]), pdf.slice(ByteRange[2], ByteRange[2] + ByteRange[3])]);
|
||||
const signatureHex = pdf.slice(ByteRange[0] + ByteRange[1] + 1, ByteRange[2]).toString('binary').replace(/(?:00|>)+$/, '');
|
||||
const signature = Buffer.from(signatureHex, 'hex').toString('binary');
|
||||
return {
|
||||
ByteRange: matches.slice(1, 5).map(Number),
|
||||
signature,
|
||||
signedData
|
||||
};
|
||||
};
|
||||
|
||||
var _default = extractSignature;
|
||||
exports.default = _default;
|
||||
Reference in New Issue
Block a user