| // Copyright 2019 The Chromium OS 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 <gtest/gtest.h> |
| |
| #include <string> |
| #include <vector> |
| |
| #include "debugd/src/helpers/cups_uri_helper_utils.h" |
| |
| namespace debugd { |
| namespace cups_helper { |
| namespace { |
| |
| static const char* known_schemes[] = {"usb://", "ipp://", "ipps://", |
| "http://", "https://", "socket://", |
| "lpd://", "ippusb://"}; |
| |
| // We reject empty and over-short URIs. |
| TEST(CupsUriHelperTest, CatchShortUri) { |
| // This URI is trivially bad. |
| EXPECT_FALSE(UriSeemsReasonable("")); |
| |
| // Our URIs must have an authority - it's too short otherwise. |
| for (const char* sch : known_schemes) { |
| EXPECT_FALSE(UriSeemsReasonable(sch)); |
| } |
| } |
| |
| // We reject strings obviously dissimilar to HTTP URIs. |
| TEST(CupsUriHelperTest, CatchGarbageUri) { |
| // This is straight nonsense. |
| EXPECT_FALSE(UriSeemsReasonable("aoeu")); |
| // We expect 2 slashes preceding the authority. |
| EXPECT_FALSE(UriSeemsReasonable("ipps:/i-accidentally-a-slash")); |
| } |
| |
| // URIs must not contain literal spaces. |
| TEST(CupsUriHelperTest, DontAllowSpaces) { |
| EXPECT_FALSE(UriSeemsReasonable("ipp:// 127.0.0.1:9001/hello-there")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://127. 0.0.1:9001/hello-there")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://127.0.0.1:90 01/hello-there")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://127.0.0.1:9001 /hello-there")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://127.0.0.1:9001/ hello-there")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://127.0.0.1:9001/hello- there")); |
| } |
| |
| // URIs must not contain characters outside the printable ASCII range. |
| TEST(CupsUriHelperTest, DontAllowUnprintableOctets) { |
| EXPECT_FALSE( |
| UriSeemsReasonable("ipp://\x7F" |
| "127.0.0.1:9001/hello-there")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://127.0.0.1:9001\x7F/hello-there")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://127.0.0.1:7001/hello-there\x7F")); |
| } |
| |
| // We pass URIs not violating the above conditions. |
| TEST(CupsUriHelperTest, OkayUri) { |
| for (const char* uri : known_schemes) { |
| std::string new_uri = uri; |
| // Tack on any old hostname (and then some) to make a valid URI. |
| new_uri.append("1.2.3.4:9001/ipp/print"); |
| EXPECT_TRUE(UriSeemsReasonable(new_uri)); |
| } |
| } |
| |
| TEST(CupsUriHelperTest, PercentedUris) { |
| std::string uri_with_space("lpd://127.0.0.1/PRINTER%20NAME"); |
| EXPECT_TRUE(UriSeemsReasonable(uri_with_space)); |
| |
| // We allow valid percent encodings anywhere after the scheme. |
| std::string lots_of_percents("lpd://%20%FF%00%20%2E/PRINTER%20NAME"); |
| EXPECT_TRUE(UriSeemsReasonable(lots_of_percents)); |
| } |
| |
| TEST(CupsUriHelperTest, InvalidPercentedUris) { |
| std::string incomplete("lpd://127.0.0.1/PRINTER%2"); |
| EXPECT_FALSE(UriSeemsReasonable(incomplete)); |
| |
| std::string bad_hex("lpd://127.0.0.1/PRINTER%ZZ%ZZ"); |
| EXPECT_FALSE(UriSeemsReasonable(bad_hex)); |
| } |
| |
| TEST(CupsUriHelperTest, PortNumbers) { |
| // URIs might not refer to a port number. |
| EXPECT_TRUE(UriSeemsReasonable("ipp://[2001:4860:4860::8888]")); |
| EXPECT_TRUE(UriSeemsReasonable("ipp://localhost")); |
| EXPECT_TRUE(UriSeemsReasonable("ipp://127.0.0.1")); |
| |
| // If there is a port number, it must be in range. |
| EXPECT_TRUE(UriSeemsReasonable("ipp://[2001:4860:4860::8888]:65535")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://[2001:4860:4860::8888]:65536")); |
| EXPECT_TRUE(UriSeemsReasonable("ipp://localhost:65535")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://localhost:65536")); |
| EXPECT_TRUE(UriSeemsReasonable("ipp://127.0.0.1:65535")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://127.0.0.1:65536")); |
| } |
| |
| TEST(CupsUriHelperTest, PortNumbersAndPaths) { |
| // Port number range checks should work with trailing characters beyond |
| // the port number. |
| EXPECT_TRUE(UriSeemsReasonable("ipp://[2001:4860:4860::8888]:65535/")); |
| EXPECT_TRUE( |
| UriSeemsReasonable("ipp://[2001:4860:4860::8888]:65535/blah%20blah")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://[2001:4860:4860::8888]:65536/")); |
| EXPECT_FALSE( |
| UriSeemsReasonable("ipp://[2001:4860:4860::8888]:65536/blah%20blah")); |
| EXPECT_TRUE(UriSeemsReasonable("ipp://localhost:65535/")); |
| EXPECT_TRUE(UriSeemsReasonable("ipp://localhost:65535/blah%20blah")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://localhost:65536/")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://localhost:65536/blah%20blah")); |
| EXPECT_TRUE(UriSeemsReasonable("ipp://127.0.0.1:65535/")); |
| EXPECT_TRUE(UriSeemsReasonable("ipp://127.0.0.1:65535/blah%20blah")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://127.0.0.1:65536/")); |
| EXPECT_FALSE(UriSeemsReasonable("ipp://127.0.0.1:65536/blah%20blah")); |
| } |
| |
| } // namespace |
| } // namespace cups_helper |
| } // namespace debugd |