Merge pull request #20031 from calixteman/telemetry_signature_certificate

Add some telemetry in order to know what are the certificates used in pdfs (bug 1973573)
This commit is contained in:
calixteman 2025-06-24 22:36:14 +02:00 committed by GitHub
commit 85b67f19bc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 69 additions and 0 deletions

View File

@ -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");

View File

@ -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;