blob: 08dba8a598c292f9108791af7632d598f2a0df42 [file] [log] [blame]
// 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