Commit 62115439 authored by Pranav Batra's avatar Pranav Batra Committed by Commit Bot

cups_proxy: add support for job-password IPP attribute

Bug: 1138044
Test: tast run -buildbundle pita <DUT> printer.*
Change-Id: I9f7beed9bc761869fc16e9b565d5e351f5231bb3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2470304Reviewed-by: default avatarAlex Gough <ajgo@chromium.org>
Reviewed-by: default avatarSean Kau <skau@chromium.org>
Commit-Queue: Sean Kau <skau@chromium.org>
Cr-Commit-Position: refs/heads/master@{#817594}
parent 63ea4c07
......@@ -67,6 +67,7 @@ ValidateAttributeResult ValidateAttribute(ipp_op_t ipp_oper_id,
{"job-originating-host-name", {false, ValueType::STRING}},
{"job-originating-user-name", {false, ValueType::STRING}},
{"job-page-limit", {false, ValueType::INTEGER}},
{"job-password", {false, ValueType::OCTET}},
{"job-printer-state-message", {false, ValueType::STRING}},
{"job-printer-state-reasons", {true, ValueType::STRING}},
{"job-printer-up-time", {false, ValueType::INTEGER}},
......
......@@ -71,6 +71,9 @@ size_t GetAttributeValuesSize(const ipp_parser::mojom::IppAttributePtr& attr) {
case ValueType::STRING:
DCHECK(attr_value->is_strings());
return attr_value->get_strings().size();
case ValueType::OCTET:
DCHECK(attr_value->is_octets());
return attr_value->get_octets().size();
default:
break;
......@@ -251,6 +254,29 @@ ipp_t* IppValidator::ValidateIppMessage(
}
break;
}
case ValueType::OCTET: {
DCHECK(attribute->value->is_octets());
size_t num = attribute->value->get_octets().size();
if (num != 1) {
LOG(ERROR) << "CUPS API only supports adding a single octet string "
"- cannot add "
<< num << " octet strings.";
return nullptr;
}
int size = attribute->value->get_octets()[0].size();
if (size < 1) {
LOG(ERROR) << "Invalid octet string size=" << size;
return nullptr;
}
auto* attr = ippAddOctetString(
ipp.get(), static_cast<ipp_tag_t>(attribute->group_tag),
attribute->name.c_str(), attribute->value->get_octets()[0].data(),
size);
if (!attr) {
return nullptr;
}
break;
}
default:
NOTREACHED() << "Unknown IPP attribute type found.";
}
......
......@@ -106,6 +106,10 @@ base::Optional<ValueType> ValueTagToType(const int value_tag) {
case IPP_TAG_NAMELANG:
return ValueType::STRING;
// Octet (binary) string
case IPP_TAG_STRING:
return ValueType::OCTET;
default:
break;
}
......@@ -157,6 +161,24 @@ base::Optional<std::vector<std::string>> IppGetStrings(ipp_attribute_t* attr) {
}
return ret;
}
base::Optional<std::vector<std::vector<uint8_t>>> IppGetOctets(
ipp_attribute_t* attr) {
const size_t count = ippGetCount(attr);
std::vector<std::vector<uint8_t>> ret;
ret.reserve(count);
for (size_t i = 0; i < count; ++i) {
int len = 0;
const uint8_t* v =
static_cast<const uint8_t*>(ippGetOctetString(attr, i, &len));
if (!v || len <= 0) {
return base::nullopt;
}
ret.emplace_back(v, v + len);
}
return ret;
}
} // namespace
base::Optional<std::vector<std::string>> ParseRequestLine(
......@@ -395,6 +417,14 @@ ipp_parser::mojom::IppMessagePtr ConvertIppToMojo(ipp_t* ipp) {
attrptr->value->set_strings(*vals);
break;
}
case ValueType::OCTET: {
auto vals = IppGetOctets(attr);
if (!vals.has_value()) {
return nullptr;
}
attrptr->value->set_octets(*vals);
break;
}
default:
NOTREACHED();
}
......
......@@ -35,6 +35,7 @@
"job-constraints-supported"
"job-creation-attributes-supported"
"job-ids-supported"
"job-password"
"job-password-supported"
"job-password-encryption-supported"
"job-resolvers-supported"
......
......@@ -8,12 +8,12 @@
module ipp_parser.mojom;
[Extensible]
enum ValueType {
[Extensible] enum ValueType {
BOOLEAN,
DATE,
INTEGER,
STRING,
OCTET,
};
union IppAttributeValue {
......@@ -25,6 +25,7 @@ union IppAttributeValue {
array<int32> ints;
array<string> strings;
array<array<uint8>> octets;
};
struct IppAttribute {
......
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