Add some telemetry in order to know what are the certificates used in pdfs (bug 1973573)
This commit is contained in:
parent
1ebc896b6f
commit
194e2ede4d
@ -1099,6 +1099,49 @@ class PDFDocument {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#collectSignatureCertificates(
|
||||||
|
fields,
|
||||||
|
collectedSignatureCertificates,
|
||||||
|
visited = new RefSet()
|
||||||
|
) {
|
||||||
|
if (!Array.isArray(fields)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (let field of fields) {
|
||||||
|
if (field instanceof Ref) {
|
||||||
|
if (visited.has(field)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
visited.put(field);
|
||||||
|
}
|
||||||
|
field = this.xref.fetchIfRef(field);
|
||||||
|
if (!(field instanceof Dict)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (field.has("Kids")) {
|
||||||
|
this.#collectSignatureCertificates(
|
||||||
|
field.get("Kids"),
|
||||||
|
collectedSignatureCertificates,
|
||||||
|
visited
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const isSignature = isName(field.get("FT"), "Sig");
|
||||||
|
if (!isSignature) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const value = field.get("V");
|
||||||
|
if (!(value instanceof Dict)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const subFilter = value.get("SubFilter");
|
||||||
|
if (!(subFilter instanceof Name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
collectedSignatureCertificates.add(subFilter.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
get _xfaStreams() {
|
get _xfaStreams() {
|
||||||
const { acroForm } = this.catalog;
|
const { acroForm } = this.catalog;
|
||||||
if (!acroForm) {
|
if (!acroForm) {
|
||||||
@ -1414,6 +1457,20 @@ class PDFDocument {
|
|||||||
// specification).
|
// specification).
|
||||||
const sigFlags = acroForm.get("SigFlags");
|
const sigFlags = acroForm.get("SigFlags");
|
||||||
const hasSignatures = !!(sigFlags & 0x1);
|
const hasSignatures = !!(sigFlags & 0x1);
|
||||||
|
if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) {
|
||||||
|
if (hasSignatures) {
|
||||||
|
const collectedSignatureCertificates = new Set();
|
||||||
|
this.#collectSignatureCertificates(
|
||||||
|
fields,
|
||||||
|
collectedSignatureCertificates
|
||||||
|
);
|
||||||
|
if (collectedSignatureCertificates.size > 0) {
|
||||||
|
formInfo.collectedSignatureCertificates = Array.from(
|
||||||
|
collectedSignatureCertificates
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
const hasOnlyDocumentSignatures =
|
const hasOnlyDocumentSignatures =
|
||||||
hasSignatures && this.#hasOnlyDocumentSignatures(fields);
|
hasSignatures && this.#hasOnlyDocumentSignatures(fields);
|
||||||
formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures;
|
formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures;
|
||||||
@ -1441,6 +1498,11 @@ class PDFDocument {
|
|||||||
IsSignaturesPresent: formInfo.hasSignatures,
|
IsSignaturesPresent: formInfo.hasSignatures,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) {
|
||||||
|
docInfo.collectedSignatureCertificates =
|
||||||
|
formInfo.collectedSignatureCertificates ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
let infoDict;
|
let infoDict;
|
||||||
try {
|
try {
|
||||||
infoDict = xref.trailer.get("Info");
|
infoDict = xref.trailer.get("Info");
|
||||||
|
|||||||
@ -1637,6 +1637,13 @@ const PDFViewerApplication = {
|
|||||||
if (pdfDocument !== this.pdfDocument) {
|
if (pdfDocument !== this.pdfDocument) {
|
||||||
return; // The document was closed while the metadata resolved.
|
return; // The document was closed while the metadata resolved.
|
||||||
}
|
}
|
||||||
|
if (info.collectedSignatureCertificates) {
|
||||||
|
this.externalServices.reportTelemetry({
|
||||||
|
type: "signatureCertificates",
|
||||||
|
data: info.collectedSignatureCertificates,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.documentInfo = info;
|
this.documentInfo = info;
|
||||||
this.metadata = metadata;
|
this.metadata = metadata;
|
||||||
this._contentDispositionFilename ??= contentDispositionFilename;
|
this._contentDispositionFilename ??= contentDispositionFilename;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user