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) {
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
// Verifies that |method|, |endpoint|, and |http_version| form a valid HTTP
......@@ -257,24 +265,16 @@ ipp_t* IppValidator::ValidateIppMessage(
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) {
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.
if (ipp_data.empty()) {
return true;
}
if (ipp_data.size() < pdf_magic_bytes_size) {
return false;
}
// 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());
// Check if |ipp_data| looks like a PDF or PostScript document.
return StartsWith(ipp_data, pdf_magic_bytes) ||
StartsWith(ipp_data, ps_magic_bytes);
}
IppValidator::IppValidator(CupsProxyServiceDelegate* const delegate)
......
......@@ -11,6 +11,7 @@
#include <utility>
#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 "printing/backend/cups_ipp_util.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -196,6 +197,22 @@ TEST_F(IppValidatorTest, UnknownAttribute) {
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.
} // namespace
......
......@@ -27,6 +27,12 @@ namespace cups_proxy {
// Note: This is assumed to be stable.
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
// creates an appropriate IPP response referencing |printers|.
// 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