Commit 41cfeaaa authored by Luum Habtemariam's avatar Luum Habtemariam Committed by Commit Bot

CupsProxyService now accepts PS too

PluginVm will be sending PS to be printed, now the pipeline can handle
both PS and PDF.

Bug: chromium:945409
Test: manually confirmed printer PS doc
Change-Id: Id3d3303f4673f65c4098495c83ea19a14f35736d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1795993
Commit-Queue: Luum Habtemariam <luum@chromium.org>
Reviewed-by: default avatarSean Kau <skau@chromium.org>
Cr-Commit-Position: refs/heads/master@{#695724}
parent 1149aaa9
...@@ -80,6 +80,14 @@ size_t GetAttributeValuesSize(const ipp_parser::mojom::IppAttributePtr& attr) { ...@@ -80,6 +80,14 @@ size_t GetAttributeValuesSize(const ipp_parser::mojom::IppAttributePtr& attr) {
return 0; return 0;
} }
// Returns true if |data| starts with the full |prefix|, false otherwise.
bool StartsWith(base::span<uint8_t const> data,
base::span<uint8_t const> prefix) {
if (data.size() < prefix.size())
return false;
return std::equal(data.begin(), data.begin() + prefix.size(), prefix.begin());
}
} // namespace } // namespace
// Verifies that |method|, |endpoint|, and |http_version| form a valid HTTP // Verifies that |method|, |endpoint|, and |http_version| form a valid HTTP
...@@ -257,24 +265,16 @@ ipp_t* IppValidator::ValidateIppMessage( ...@@ -257,24 +265,16 @@ ipp_t* IppValidator::ValidateIppMessage(
return ipp.release(); return ipp.release();
} }
// Requires IPP data portion is either empty or looks like a pdf. // Requires |ipp_data| to be empty or look like a PDF or PostScript document.
bool IppValidator::ValidateIppData(const std::vector<uint8_t>& ipp_data) { bool IppValidator::ValidateIppData(const std::vector<uint8_t>& ipp_data) {
const int pdf_magic_bytes_size = 4;
constexpr std::array<uint8_t, pdf_magic_bytes_size> pdf_magic_bytes = {
0x25, 0x50, 0x44, 0x46}; // { %PDF }
// Empty IPP data portion. // Empty IPP data portion.
if (ipp_data.empty()) { if (ipp_data.empty()) {
return true; return true;
} }
if (ipp_data.size() < pdf_magic_bytes_size) { // Check if |ipp_data| looks like a PDF or PostScript document.
return false; return StartsWith(ipp_data, pdf_magic_bytes) ||
} StartsWith(ipp_data, ps_magic_bytes);
// Check that |ipp_data| starts with pdf_magic_bytes.
return std::equal(ipp_data.begin(), ipp_data.begin() + pdf_magic_bytes_size,
pdf_magic_bytes.begin());
} }
IppValidator::IppValidator(CupsProxyServiceDelegate* const delegate) IppValidator::IppValidator(CupsProxyServiceDelegate* const delegate)
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <utility> #include <utility>
#include "chrome/services/cups_proxy/fake_cups_proxy_service_delegate.h" #include "chrome/services/cups_proxy/fake_cups_proxy_service_delegate.h"
#include "chrome/services/cups_proxy/public/cpp/cups_util.h"
#include "chrome/services/cups_proxy/public/cpp/ipp_messages.h" #include "chrome/services/cups_proxy/public/cpp/ipp_messages.h"
#include "printing/backend/cups_ipp_util.h" #include "printing/backend/cups_ipp_util.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -196,6 +197,22 @@ TEST_F(IppValidatorTest, UnknownAttribute) { ...@@ -196,6 +197,22 @@ TEST_F(IppValidatorTest, UnknownAttribute) {
EXPECT_FALSE(ippFindAttribute(ipp, fake_attr_name.c_str(), IPP_TAG_TEXT)); EXPECT_FALSE(ippFindAttribute(ipp, fake_attr_name.c_str(), IPP_TAG_TEXT));
} }
TEST_F(IppValidatorTest, IppDataVerification) {
auto request = GetBasicIppRequest();
// Should fail since the data too short to be a valid document.
request->data = {0x0};
EXPECT_FALSE(RunValidateIppRequest(request));
// Valid PDF.
request->data = {pdf_magic_bytes.begin(), pdf_magic_bytes.end()};
EXPECT_TRUE(RunValidateIppRequest(request));
// Valid PS.
request->data = {ps_magic_bytes.begin(), ps_magic_bytes.end()};
EXPECT_TRUE(RunValidateIppRequest(request));
}
// TODO(crbug.com/945409): Test IPP validation. // TODO(crbug.com/945409): Test IPP validation.
} // namespace } // namespace
......
...@@ -27,6 +27,12 @@ namespace cups_proxy { ...@@ -27,6 +27,12 @@ namespace cups_proxy {
// Note: This is assumed to be stable. // Note: This is assumed to be stable.
static const size_t kHttpMaxBufferSize = 2048; static const size_t kHttpMaxBufferSize = 2048;
// PDF and PostScript document format identifiers.
constexpr std::array<uint8_t, 5> pdf_magic_bytes = {0x25, 0x50, 0x44, 0x46,
0x2d}; // { %PDF- }
constexpr std::array<uint8_t, 4> ps_magic_bytes = {0x25, 0x21, 0x50,
0x53}; // { %!PS }
// Expects |request| to be an IPP_OP_GET_PRINTERS IPP request. This function // Expects |request| to be an IPP_OP_GET_PRINTERS IPP request. This function
// creates an appropriate IPP response referencing |printers|. // creates an appropriate IPP response referencing |printers|.
// TODO(crbug.com/945409): Expand testing suite. // TODO(crbug.com/945409): Expand testing suite.
......
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