| // 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 CHROME_SERVICES_CUPS_PROXY_IPP_VALIDATOR_H_ |
| #define CHROME_SERVICES_CUPS_PROXY_IPP_VALIDATOR_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/memory/weak_ptr.h" |
| #include "base/strings/string_piece_forward.h" |
| #include "chrome/services/cups_proxy/cups_proxy_service_delegate.h" |
| #include "chrome/services/cups_proxy/public/cpp/ipp_messages.h" |
| #include "chrome/services/ipp_parser/public/cpp/ipp_converter.h" |
| #include "chrome/services/ipp_parser/public/mojom/ipp_parser.mojom.h" |
| #include "third_party/abseil-cpp/absl/types/optional.h" |
| |
| namespace cups_proxy { |
| |
| struct IppRequest; |
| |
| // This class fully validates incoming parsed IPP requests. HTTP metadata |
| // validation is handled with net/http. IPP metadata validation is handled |
| // largely via libCUPS. This class must be created and accessed from a |
| // sequenced context. |
| class IppValidator { |
| public: |
| explicit IppValidator(CupsProxyServiceDelegate* const delegate); |
| ~IppValidator(); |
| |
| // Validates each of |to_validate|'s fields and returns a POD representation |
| // of the IPP request. Returns empty Optional on failure. |
| absl::optional<IppRequest> ValidateIppRequest( |
| ipp_parser::mojom::IppRequestPtr to_validate); |
| |
| private: |
| absl::optional<HttpRequestLine> ValidateHttpRequestLine( |
| base::StringPiece method, |
| base::StringPiece endpoint, |
| base::StringPiece http_version); |
| |
| absl::optional<std::vector<ipp_converter::HttpHeader>> ValidateHttpHeaders( |
| const size_t http_content_length, |
| const base::flat_map<std::string, std::string>& headers); |
| |
| ipp_t* ValidateIppMessage(ipp_parser::mojom::IppMessagePtr ipp_message); |
| |
| bool ValidateIppData(const std::vector<uint8_t>& ipp_data); |
| |
| // Unowned delegate providing necessary Profile dependencies. |
| CupsProxyServiceDelegate* const delegate_; |
| |
| SEQUENCE_CHECKER(sequence_checker_); |
| }; |
| |
| } // namespace cups_proxy |
| |
| #endif // CHROME_SERVICES_CUPS_PROXY_IPP_VALIDATOR_H_ |