Skip to content

Commit 85b67f1

Browse files
authored
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)
2 parents 1ebc896 + 194e2ed commit 85b67f1

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

src/core/document.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,49 @@ class PDFDocument {
10991099
});
11001100
}
11011101

1102+
#collectSignatureCertificates(
1103+
fields,
1104+
collectedSignatureCertificates,
1105+
visited = new RefSet()
1106+
) {
1107+
if (!Array.isArray(fields)) {
1108+
return;
1109+
}
1110+
for (let field of fields) {
1111+
if (field instanceof Ref) {
1112+
if (visited.has(field)) {
1113+
continue;
1114+
}
1115+
visited.put(field);
1116+
}
1117+
field = this.xref.fetchIfRef(field);
1118+
if (!(field instanceof Dict)) {
1119+
continue;
1120+
}
1121+
if (field.has("Kids")) {
1122+
this.#collectSignatureCertificates(
1123+
field.get("Kids"),
1124+
collectedSignatureCertificates,
1125+
visited
1126+
);
1127+
continue;
1128+
}
1129+
const isSignature = isName(field.get("FT"), "Sig");
1130+
if (!isSignature) {
1131+
continue;
1132+
}
1133+
const value = field.get("V");
1134+
if (!(value instanceof Dict)) {
1135+
continue;
1136+
}
1137+
const subFilter = value.get("SubFilter");
1138+
if (!(subFilter instanceof Name)) {
1139+
continue;
1140+
}
1141+
collectedSignatureCertificates.add(subFilter.name);
1142+
}
1143+
}
1144+
11021145
get _xfaStreams() {
11031146
const { acroForm } = this.catalog;
11041147
if (!acroForm) {
@@ -1414,6 +1457,20 @@ class PDFDocument {
14141457
// specification).
14151458
const sigFlags = acroForm.get("SigFlags");
14161459
const hasSignatures = !!(sigFlags & 0x1);
1460+
if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) {
1461+
if (hasSignatures) {
1462+
const collectedSignatureCertificates = new Set();
1463+
this.#collectSignatureCertificates(
1464+
fields,
1465+
collectedSignatureCertificates
1466+
);
1467+
if (collectedSignatureCertificates.size > 0) {
1468+
formInfo.collectedSignatureCertificates = Array.from(
1469+
collectedSignatureCertificates
1470+
);
1471+
}
1472+
}
1473+
}
14171474
const hasOnlyDocumentSignatures =
14181475
hasSignatures && this.#hasOnlyDocumentSignatures(fields);
14191476
formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures;
@@ -1441,6 +1498,11 @@ class PDFDocument {
14411498
IsSignaturesPresent: formInfo.hasSignatures,
14421499
};
14431500

1501+
if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) {
1502+
docInfo.collectedSignatureCertificates =
1503+
formInfo.collectedSignatureCertificates ?? null;
1504+
}
1505+
14441506
let infoDict;
14451507
try {
14461508
infoDict = xref.trailer.get("Info");

web/app.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1637,6 +1637,13 @@ const PDFViewerApplication = {
16371637
if (pdfDocument !== this.pdfDocument) {
16381638
return; // The document was closed while the metadata resolved.
16391639
}
1640+
if (info.collectedSignatureCertificates) {
1641+
this.externalServices.reportTelemetry({
1642+
type: "signatureCertificates",
1643+
data: info.collectedSignatureCertificates,
1644+
});
1645+
}
1646+
16401647
this.documentInfo = info;
16411648
this.metadata = metadata;
16421649
this._contentDispositionFilename ??= contentDispositionFilename;

0 commit comments

Comments
 (0)