Skip to content

Commit

Permalink
Merge pull request #14600 from Snuffleupagus/getPageIndex-more-valida…
Browse files Browse the repository at this point in the history
…tion

[api-minor] Add validation for the  `PDFDocumentProxy.getPageIndex` method
  • Loading branch information
timvandermeij committed Feb 26, 2022
2 parents 0808376 + 172d007 commit cf7ce0a
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 45 deletions.
4 changes: 2 additions & 2 deletions src/core/worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -454,8 +454,8 @@ class WorkerMessageHandler {
});
});

handler.on("GetPageIndex", function wphSetupGetPageIndex({ ref }) {
const pageRef = Ref.get(ref.num, ref.gen);
handler.on("GetPageIndex", function wphSetupGetPageIndex(data) {
const pageRef = Ref.get(data.num, data.gen);
return pdfManager.ensureCatalog("getPageIndex", [pageRef]);
});

Expand Down
15 changes: 13 additions & 2 deletions src/display/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -2848,7 +2848,7 @@ class WorkerTransport {
pageNumber <= 0 ||
pageNumber > this._numPages
) {
return Promise.reject(new Error("Invalid page request"));
return Promise.reject(new Error("Invalid page request."));
}

const pageIndex = pageNumber - 1,
Expand Down Expand Up @@ -2879,8 +2879,19 @@ class WorkerTransport {
}

getPageIndex(ref) {
if (
typeof ref !== "object" ||
ref === null ||
!Number.isInteger(ref.num) ||
ref.num < 0 ||
!Number.isInteger(ref.gen) ||
ref.gen < 0
) {
return Promise.reject(new Error("Invalid pageIndex request."));
}
return this.messageHandler.sendWithPromise("GetPageIndex", {
ref,
num: ref.num,
gen: ref.gen,
});
}

Expand Down
82 changes: 41 additions & 41 deletions test/unit/api_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -815,40 +815,23 @@ describe("api", function () {
});

it("gets non-existent page", async function () {
let outOfRangePromise = pdfDocument.getPage(100);
let nonIntegerPromise = pdfDocument.getPage(2.5);
let nonNumberPromise = pdfDocument.getPage("1");
const pageNumbers = [
/* outOfRange = */ 100,
/* nonInteger = */ 2.5,
/* nonNumber = */ "1",
];

outOfRangePromise = outOfRangePromise.then(
function () {
throw new Error("shall fail for out-of-range pageNumber parameter");
},
function (reason) {
expect(reason instanceof Error).toEqual(true);
}
);
nonIntegerPromise = nonIntegerPromise.then(
function () {
throw new Error("shall fail for non-integer pageNumber parameter");
},
function (reason) {
expect(reason instanceof Error).toEqual(true);
}
);
nonNumberPromise = nonNumberPromise.then(
function () {
throw new Error("shall fail for non-number pageNumber parameter");
},
function (reason) {
for (const pageNumber of pageNumbers) {
try {
await pdfDocument.getPage(pageNumber);

// Shouldn't get here.
expect(false).toEqual(true);
} catch (reason) {
expect(reason instanceof Error).toEqual(true);
expect(reason.message).toEqual("Invalid page request.");
}
);

await Promise.all([
outOfRangePromise,
nonIntegerPromise,
nonNumberPromise,
]);
}
});

it("gets page, from /Pages tree with circular reference", async function () {
Expand Down Expand Up @@ -907,18 +890,35 @@ describe("api", function () {
});

it("gets invalid page index", async function () {
const ref = { num: 3, gen: 0 }; // Reference to a font dictionary.
const pageRefs = [
/* fontRef = */ { num: 3, gen: 0 },
/* invalidRef = */ { num: -1, gen: 0 },
/* nonRef = */ "qwerty",
/* nullRef = */ null,
];

const expectedErrors = [
{
exception: UnknownErrorException,
message: "The reference does not point to a /Page dictionary.",
},
{ exception: Error, message: "Invalid pageIndex request." },
{ exception: Error, message: "Invalid pageIndex request." },
{ exception: Error, message: "Invalid pageIndex request." },
];

try {
await pdfDocument.getPageIndex(ref);
for (let i = 0, ii = pageRefs.length; i < ii; i++) {
try {
await pdfDocument.getPageIndex(pageRefs[i]);

// Shouldn't get here.
expect(false).toEqual(true);
} catch (reason) {
expect(reason instanceof UnknownErrorException).toEqual(true);
expect(reason.message).toEqual(
"The reference does not point to a /Page dictionary."
);
// Shouldn't get here.
expect(false).toEqual(true);
} catch (reason) {
const { exception, message } = expectedErrors[i];

expect(reason instanceof exception).toEqual(true);
expect(reason.message).toEqual(message);
}
}
});

Expand Down

0 comments on commit cf7ce0a

Please sign in to comment.