Commit 4a131203 authored by Lei Zhang's avatar Lei Zhang Committed by Commit Bot

Split document permissions code from PDFiumEngine.

Move the code that handles PDF document permissions to
pdfium_permissions.cc.

Change-Id: I01704423d089d24f6bdbfbee3b8c981977f19a38
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1726904
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: default avatarHenrique Nakashima <hnakashima@chromium.org>
Cr-Commit-Position: refs/heads/master@{#683345}
parent 977b6dc3
......@@ -107,6 +107,8 @@ if (enable_pdf) {
"pdfium/pdfium_mem_buffer_file_write.h",
"pdfium/pdfium_page.cc",
"pdfium/pdfium_page.h",
"pdfium/pdfium_permissions.cc",
"pdfium/pdfium_permissions.h",
"pdfium/pdfium_print.cc",
"pdfium/pdfium_print.h",
"pdfium/pdfium_range.cc",
......
......@@ -34,6 +34,7 @@
#include "pdf/pdfium/pdfium_document.h"
#include "pdf/pdfium/pdfium_mem_buffer_file_read.h"
#include "pdf/pdfium/pdfium_mem_buffer_file_write.h"
#include "pdf/pdfium/pdfium_permissions.h"
#include "pdf/pdfium/pdfium_unsupported_features.h"
#include "pdf/url_loader_wrapper_impl.h"
#include "ppapi/cpp/instance.h"
......@@ -110,13 +111,6 @@ constexpr bool kViewerImplementedPanning = false;
constexpr bool kViewerImplementedPanning = true;
#endif
// See Table 3.20 in
// http://www.adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf
constexpr uint32_t kPDFPermissionPrintLowQualityMask = 1 << 2;
constexpr uint32_t kPDFPermissionPrintHighQualityMask = 1 << 11;
constexpr uint32_t kPDFPermissionCopyMask = 1 << 4;
constexpr uint32_t kPDFPermissionCopyAccessibleMask = 1 << 9;
constexpr int32_t kLoadingTextVerticalOffset = 50;
// The maximum amount of time we'll spend doing a paint before we give back
......@@ -1998,35 +1992,10 @@ std::string PDFiumEngine::GetLinkAtPosition(const pp::Point& point) {
}
bool PDFiumEngine::HasPermission(DocumentPermission permission) const {
// PDF 1.7 spec, section 3.5.2 says: "If the revision number is 2 or greater,
// the operations to which user access can be controlled are as follows: ..."
//
// Thus for revision numbers less than 2, permissions are ignored and this
// always returns true.
if (permissions_handler_revision_ < 2)
// No |permissions_| means no restrictions.
if (!permissions_)
return true;
// Handle high quality printing permission separately for security handler
// revision 3+. See table 3.20 in the PDF 1.7 spec.
if (permission == PERMISSION_PRINT_HIGH_QUALITY &&
permissions_handler_revision_ >= 3) {
return (permissions_ & kPDFPermissionPrintLowQualityMask) != 0 &&
(permissions_ & kPDFPermissionPrintHighQualityMask) != 0;
}
switch (permission) {
case PERMISSION_COPY:
return (permissions_ & kPDFPermissionCopyMask) != 0;
case PERMISSION_COPY_ACCESSIBLE:
return (permissions_ & kPDFPermissionCopyAccessibleMask) != 0;
case PERMISSION_PRINT_LOW_QUALITY:
case PERMISSION_PRINT_HIGH_QUALITY:
// With security handler revision 2 rules, check the same bit for high
// and low quality. See table 3.20 in the PDF 1.7 spec.
return (permissions_ & kPDFPermissionPrintLowQualityMask) != 0;
default:
return true;
}
return permissions_->HasPermission(permission);
}
void PDFiumEngine::SelectAll() {
......@@ -2396,8 +2365,7 @@ void PDFiumEngine::ContinueLoadingDocument(const std::string& password) {
if (FPDFDoc_GetPageMode(doc()) == PAGEMODE_USEOUTLINES)
client_->DocumentHasUnsupportedFeature("Bookmarks");
permissions_ = FPDF_GetDocPermissions(doc());
permissions_handler_revision_ = FPDF_GetSecurityHandlerRevision(doc());
permissions_ = std::make_unique<PDFiumPermissions>(doc());
LoadBody();
......
......@@ -39,6 +39,7 @@
namespace chrome_pdf {
class PDFiumDocument;
class PDFiumPermissions;
namespace draw_utils {
class ShadowMatrix;
......@@ -612,11 +613,7 @@ class PDFiumEngine : public PDFEngine,
// Where to resume searching. (0-based)
base::Optional<size_t> resume_find_index_;
// Permissions bitfield.
unsigned long permissions_ = 0;
// Permissions security handler revision number. -1 for unknown.
int permissions_handler_revision_ = -1;
std::unique_ptr<PDFiumPermissions> permissions_;
pp::Size default_page_size_;
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "pdf/pdfium/pdfium_permissions.h"
namespace chrome_pdf {
namespace {
// See Table 3.20 in
// http://www.adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf
constexpr uint32_t kPDFPermissionPrintLowQualityMask = 1 << 2;
constexpr uint32_t kPDFPermissionPrintHighQualityMask = 1 << 11;
constexpr uint32_t kPDFPermissionCopyMask = 1 << 4;
constexpr uint32_t kPDFPermissionCopyAccessibleMask = 1 << 9;
} // namespace
PDFiumPermissions::PDFiumPermissions(FPDF_DOCUMENT doc)
: permissions_handler_revision_(FPDF_GetSecurityHandlerRevision(doc)),
permission_bits_(FPDF_GetDocPermissions(doc)) {}
bool PDFiumPermissions::HasPermission(
PDFEngine::DocumentPermission permission) const {
// PDF 1.7 spec, section 3.5.2 says: "If the revision number is 2 or greater,
// the operations to which user access can be controlled are as follows: ..."
//
// Thus for revision numbers less than 2, permissions are ignored and this
// always returns true.
if (permissions_handler_revision_ < 2)
return true;
// Handle high quality printing permission separately for security handler
// revision 3+. See table 3.20 in the PDF 1.7 spec.
if (permission == PDFEngine::PERMISSION_PRINT_HIGH_QUALITY &&
permissions_handler_revision_ >= 3) {
return (permission_bits_ & kPDFPermissionPrintLowQualityMask) != 0 &&
(permission_bits_ & kPDFPermissionPrintHighQualityMask) != 0;
}
switch (permission) {
case PDFEngine::PERMISSION_COPY:
return (permission_bits_ & kPDFPermissionCopyMask) != 0;
case PDFEngine::PERMISSION_COPY_ACCESSIBLE:
return (permission_bits_ & kPDFPermissionCopyAccessibleMask) != 0;
case PDFEngine::PERMISSION_PRINT_LOW_QUALITY:
case PDFEngine::PERMISSION_PRINT_HIGH_QUALITY:
// With security handler revision 2 rules, check the same bit for high
// and low quality. See table 3.20 in the PDF 1.7 spec.
return (permission_bits_ & kPDFPermissionPrintLowQualityMask) != 0;
default:
return true;
}
}
} // namespace chrome_pdf
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PDF_PDFIUM_PDFIUM_PERMISSIONS_H_
#define PDF_PDFIUM_PDFIUM_PERMISSIONS_H_
#include "pdf/pdf_engine.h"
#include "third_party/pdfium/public/fpdfview.h"
namespace chrome_pdf {
// The permissions for a given FPDF_DOCUMENT.
class PDFiumPermissions final {
public:
explicit PDFiumPermissions(FPDF_DOCUMENT doc);
bool HasPermission(PDFEngine::DocumentPermission permission) const;
private:
// Permissions security handler revision number. -1 for unknown.
const int permissions_handler_revision_;
// Permissions bitfield.
const unsigned long permission_bits_;
};
} // namespace chrome_pdf
#endif // PDF_PDFIUM_PDFIUM_PERMISSIONS_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment