OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <memory> | 5 #include <memory> |
6 #include <utility> | 6 #include <utility> |
7 | 7 |
8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
10 #include "build/build_config.h" | 10 #include "build/build_config.h" |
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
833 base::test::ScopedTaskScheduler scoped_task_scheduler_; | 833 base::test::ScopedTaskScheduler scoped_task_scheduler_; |
834 | 834 |
835 protected: | 835 protected: |
836 TestNetLog net_log_; | 836 TestNetLog net_log_; |
837 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. | 837 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. |
838 URLRequestJobFactoryImpl* job_factory_impl_; | 838 URLRequestJobFactoryImpl* job_factory_impl_; |
839 std::unique_ptr<URLRequestJobFactory> job_factory_; | 839 std::unique_ptr<URLRequestJobFactory> job_factory_; |
840 TestURLRequestContext default_context_; | 840 TestURLRequestContext default_context_; |
841 }; | 841 }; |
842 | 842 |
843 // This NetworkDelegate is picky about what files are accessible. Only | |
844 // whitelisted files are allowed. | |
845 class PickyNetworkDelegate : public TestNetworkDelegate { | |
846 public: | |
847 // Adds |path| to the access white list. | |
848 void AddToWhitelist(const base::FilePath& path) { | |
849 whitelist_.insert(base::MakeAbsoluteFilePath(path)); | |
850 } | |
851 | |
852 bool OnCanAccessFile(const URLRequest& request, | |
853 const base::FilePath& original_path, | |
854 const base::FilePath& absolute_path) const override { | |
855 return whitelist_.count(absolute_path) > 0; | |
856 } | |
857 | |
858 private: | |
859 std::set<base::FilePath> whitelist_; | |
860 }; | |
861 | |
843 TEST_F(URLRequestTest, AboutBlankTest) { | 862 TEST_F(URLRequestTest, AboutBlankTest) { |
844 TestDelegate d; | 863 TestDelegate d; |
845 { | 864 { |
846 std::unique_ptr<URLRequest> r( | 865 std::unique_ptr<URLRequest> r( |
847 default_context_.CreateRequest(GURL("about:blank"), DEFAULT_PRIORITY, | 866 default_context_.CreateRequest(GURL("about:blank"), DEFAULT_PRIORITY, |
848 &d, TRAFFIC_ANNOTATION_FOR_TESTS)); | 867 &d, TRAFFIC_ANNOTATION_FOR_TESTS)); |
849 | 868 |
850 r->Start(); | 869 r->Start(); |
851 EXPECT_TRUE(r->is_pending()); | 870 EXPECT_TRUE(r->is_pending()); |
852 | 871 |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1078 r->Start(); | 1097 r->Start(); |
1079 EXPECT_TRUE(r->is_pending()); | 1098 EXPECT_TRUE(r->is_pending()); |
1080 | 1099 |
1081 base::RunLoop().Run(); | 1100 base::RunLoop().Run(); |
1082 EXPECT_TRUE(d.request_failed()); | 1101 EXPECT_TRUE(d.request_failed()); |
1083 } | 1102 } |
1084 | 1103 |
1085 EXPECT_TRUE(base::DeleteFile(temp_path, false)); | 1104 EXPECT_TRUE(base::DeleteFile(temp_path, false)); |
1086 } | 1105 } |
1087 | 1106 |
1088 TEST_F(URLRequestTest, AllowFileURLs) { | 1107 TEST_F(URLRequestTest, AllowFileURLs) { |
mmenke
2017/05/10 18:03:31
Think we still need to test the original_path argu
satorux1
2017/05/12 13:24:11
Good point! My original plan was to always use abs
| |
1089 base::ScopedTempDir temp_dir; | 1108 base::ScopedTempDir temp_dir; |
1090 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 1109 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
1091 base::FilePath test_file; | 1110 base::FilePath test_file; |
1092 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.GetPath(), &test_file)); | 1111 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.GetPath(), &test_file)); |
1093 std::string test_data("monkey"); | 1112 std::string test_data("monkey"); |
1094 base::WriteFile(test_file, test_data.data(), test_data.size()); | 1113 base::WriteFile(test_file, test_data.data(), test_data.size()); |
1095 GURL test_file_url = FilePathToFileURL(test_file); | 1114 GURL test_file_url = FilePathToFileURL(test_file); |
1096 | |
1097 { | 1115 { |
1098 TestDelegate d; | 1116 TestDelegate d; |
1099 TestNetworkDelegate network_delegate; | 1117 PickyNetworkDelegate network_delegate; |
1100 network_delegate.set_can_access_files(true); | 1118 network_delegate.AddToWhitelist(test_file); |
1101 default_context_.set_network_delegate(&network_delegate); | 1119 default_context_.set_network_delegate(&network_delegate); |
1102 std::unique_ptr<URLRequest> r(default_context_.CreateRequest( | 1120 std::unique_ptr<URLRequest> r(default_context_.CreateRequest( |
1103 test_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS)); | 1121 test_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS)); |
1104 r->Start(); | 1122 r->Start(); |
1105 base::RunLoop().Run(); | 1123 base::RunLoop().Run(); |
1124 // This should be allowed as the file path is white listed. | |
1106 EXPECT_FALSE(d.request_failed()); | 1125 EXPECT_FALSE(d.request_failed()); |
1107 EXPECT_EQ(test_data, d.data_received()); | 1126 EXPECT_EQ(test_data, d.data_received()); |
1108 } | 1127 } |
1109 | 1128 |
1110 { | 1129 { |
1111 TestDelegate d; | 1130 TestDelegate d; |
1112 TestNetworkDelegate network_delegate; | 1131 PickyNetworkDelegate network_delegate; |
1113 network_delegate.set_can_access_files(false); | |
1114 default_context_.set_network_delegate(&network_delegate); | 1132 default_context_.set_network_delegate(&network_delegate); |
1115 std::unique_ptr<URLRequest> r(default_context_.CreateRequest( | 1133 std::unique_ptr<URLRequest> r(default_context_.CreateRequest( |
1116 test_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS)); | 1134 test_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS)); |
1117 r->Start(); | 1135 r->Start(); |
1118 base::RunLoop().Run(); | 1136 base::RunLoop().Run(); |
1137 // This should be rejected as the file path is not white listed. | |
1119 EXPECT_TRUE(d.request_failed()); | 1138 EXPECT_TRUE(d.request_failed()); |
1120 EXPECT_EQ("", d.data_received()); | 1139 EXPECT_EQ("", d.data_received()); |
1121 } | 1140 } |
1122 } | 1141 } |
1123 | 1142 |
1143 #if defined(OS_POSIX) // Bacause of symbolic links. | |
1144 | |
1145 TEST_F(URLRequestTest, SymlinksToFiles) { | |
1146 base::ScopedTempDir temp_dir; | |
1147 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
1148 // The test file be added to the whitelist. | |
1149 base::FilePath test_file; | |
1150 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.GetPath(), &test_file)); | |
1151 std::string test_data("monkey"); | |
1152 base::WriteFile(test_file, test_data.data(), test_data.size()); | |
1153 | |
1154 // This_symlink will point to the test file. | |
1155 base::FilePath good_symlink = temp_dir.GetPath().AppendASCII("good_symlink"); | |
1156 ASSERT_TRUE(base::CreateSymbolicLink(test_file, good_symlink)); | |
1157 GURL good_file_url = FilePathToFileURL(good_symlink); | |
1158 // This_symlink will point to /dev/null. | |
1159 base::FilePath bad_symlink = temp_dir.GetPath().AppendASCII("bad_symlink"); | |
1160 ASSERT_TRUE(base::CreateSymbolicLink( | |
1161 base::FilePath(FILE_PATH_LITERAL("/dev/null")), bad_symlink)); | |
1162 GURL bad_file_url = FilePathToFileURL(bad_symlink); | |
1163 | |
1164 { | |
1165 TestDelegate d; | |
1166 PickyNetworkDelegate network_delegate; | |
1167 network_delegate.AddToWhitelist(test_file); | |
1168 default_context_.set_network_delegate(&network_delegate); | |
1169 std::unique_ptr<URLRequest> r( | |
1170 default_context_.CreateRequest(good_file_url, DEFAULT_PRIORITY, &d)); | |
1171 r->Start(); | |
1172 base::RunLoop().Run(); | |
1173 // good_file_url should be allowed. | |
1174 EXPECT_FALSE(d.request_failed()); | |
1175 EXPECT_EQ(test_data, d.data_received()); | |
1176 } | |
1177 | |
1178 { | |
1179 TestDelegate d; | |
1180 PickyNetworkDelegate network_delegate; | |
1181 network_delegate.AddToWhitelist(test_file); | |
1182 default_context_.set_network_delegate(&network_delegate); | |
1183 std::unique_ptr<URLRequest> r( | |
1184 default_context_.CreateRequest(bad_file_url, DEFAULT_PRIORITY, &d)); | |
1185 r->Start(); | |
1186 base::RunLoop().Run(); | |
1187 // bad_file_url should be rejected. | |
1188 EXPECT_TRUE(d.request_failed()); | |
1189 EXPECT_EQ("", d.data_received()); | |
mmenke
2017/05/10 18:03:31
For the failure cases, can you check that d.reques
satorux1
2017/05/12 13:24:11
Good idea! Done.
| |
1190 } | |
1191 } | |
1192 | |
1193 TEST_F(URLRequestTest, SymlinksToDirs) { | |
1194 // The temporary dir will be added to the whitelist. | |
1195 base::ScopedTempDir temp_dir; | |
1196 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
1197 | |
1198 // This_symlink will point to the temp dir. | |
1199 base::FilePath good_symlink = temp_dir.GetPath().AppendASCII("good_symlink"); | |
1200 ASSERT_TRUE(base::CreateSymbolicLink(temp_dir.GetPath(), good_symlink)); | |
1201 GURL good_file_url = FilePathToFileURL(good_symlink); | |
1202 // This_symlink will point to /dev. | |
1203 base::FilePath bad_symlink = temp_dir.GetPath().AppendASCII("bad_symlink"); | |
1204 ASSERT_TRUE(base::CreateSymbolicLink( | |
1205 base::FilePath(FILE_PATH_LITERAL("/dev")), bad_symlink)); | |
1206 GURL bad_file_url = FilePathToFileURL(bad_symlink); | |
1207 | |
1208 { | |
1209 TestDelegate d; | |
1210 PickyNetworkDelegate network_delegate; | |
1211 network_delegate.AddToWhitelist(temp_dir.GetPath()); | |
1212 default_context_.set_network_delegate(&network_delegate); | |
1213 std::unique_ptr<URLRequest> r( | |
1214 default_context_.CreateRequest(good_file_url, DEFAULT_PRIORITY, &d)); | |
1215 r->Start(); | |
1216 base::RunLoop().Run(); | |
1217 // good_file_url should be allowed. | |
1218 EXPECT_FALSE(d.request_failed()); | |
1219 ASSERT_NE(d.data_received().find("good_symlink"), std::string::npos); | |
1220 } | |
1221 | |
1222 { | |
1223 TestDelegate d; | |
1224 PickyNetworkDelegate network_delegate; | |
1225 network_delegate.AddToWhitelist(temp_dir.GetPath()); | |
1226 default_context_.set_network_delegate(&network_delegate); | |
1227 std::unique_ptr<URLRequest> r( | |
1228 default_context_.CreateRequest(bad_file_url, DEFAULT_PRIORITY, &d)); | |
1229 r->Start(); | |
1230 base::RunLoop().Run(); | |
1231 // bad_file_url should be rejected. | |
1232 EXPECT_TRUE(d.request_failed()); | |
1233 EXPECT_EQ("", d.data_received()); | |
1234 } | |
1235 } | |
1236 | |
1237 #endif // defined(OS_POSIX) | |
1124 | 1238 |
1125 TEST_F(URLRequestTest, FileDirCancelTest) { | 1239 TEST_F(URLRequestTest, FileDirCancelTest) { |
1126 // Put in mock resource provider. | 1240 // Put in mock resource provider. |
1127 NetModule::SetResourceProvider(TestNetResourceProvider); | 1241 NetModule::SetResourceProvider(TestNetResourceProvider); |
1128 | 1242 |
1129 TestDelegate d; | 1243 TestDelegate d; |
1130 { | 1244 { |
1131 base::FilePath file_path; | 1245 base::FilePath file_path; |
1132 PathService::Get(base::DIR_SOURCE_ROOT, &file_path); | 1246 PathService::Get(base::DIR_SOURCE_ROOT, &file_path); |
1133 file_path = file_path.Append(FILE_PATH_LITERAL("net")); | 1247 file_path = file_path.Append(FILE_PATH_LITERAL("net")); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1165 req->Start(); | 1279 req->Start(); |
1166 base::RunLoop().Run(); | 1280 base::RunLoop().Run(); |
1167 | 1281 |
1168 // Generate entry for the sentinel file. | 1282 // Generate entry for the sentinel file. |
1169 base::FilePath sentinel_path = path.AppendASCII(sentinel_name); | 1283 base::FilePath sentinel_path = path.AppendASCII(sentinel_name); |
1170 base::File::Info info; | 1284 base::File::Info info; |
1171 EXPECT_TRUE(base::GetFileInfo(sentinel_path, &info)); | 1285 EXPECT_TRUE(base::GetFileInfo(sentinel_path, &info)); |
1172 EXPECT_GT(info.size, 0); | 1286 EXPECT_GT(info.size, 0); |
1173 std::string sentinel_output = GetDirectoryListingEntry( | 1287 std::string sentinel_output = GetDirectoryListingEntry( |
1174 base::string16(sentinel_name, sentinel_name + strlen(sentinel_name)), | 1288 base::string16(sentinel_name, sentinel_name + strlen(sentinel_name)), |
1175 std::string(sentinel_name), | 1289 std::string(sentinel_name), false /* is_dir */, info.size, |
1176 false /* is_dir */, | 1290 |
1177 info.size, | |
1178 info.last_modified); | 1291 info.last_modified); |
1179 | 1292 |
1180 ASSERT_LT(0, d.bytes_received()); | 1293 ASSERT_LT(0, d.bytes_received()); |
1181 ASSERT_FALSE(d.request_failed()); | 1294 ASSERT_FALSE(d.request_failed()); |
1182 EXPECT_EQ(OK, d.request_status()); | 1295 EXPECT_EQ(OK, d.request_status()); |
1183 // Check for the entry generated for the "sentinel" file. | 1296 // Check for the entry generated for the "sentinel" file. |
1184 const std::string& data = d.data_received(); | 1297 const std::string& data = d.data_received(); |
1185 ASSERT_NE(data.find(sentinel_output), std::string::npos); | 1298 ASSERT_NE(data.find(sentinel_output), std::string::npos); |
1186 } | 1299 } |
1187 | 1300 |
(...skipping 9887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11075 AddTestInterceptor()->set_main_intercept_job(std::move(job)); | 11188 AddTestInterceptor()->set_main_intercept_job(std::move(job)); |
11076 | 11189 |
11077 req->Start(); | 11190 req->Start(); |
11078 req->Cancel(); | 11191 req->Cancel(); |
11079 base::RunLoop().RunUntilIdle(); | 11192 base::RunLoop().RunUntilIdle(); |
11080 EXPECT_EQ(ERR_ABORTED, d.request_status()); | 11193 EXPECT_EQ(ERR_ABORTED, d.request_status()); |
11081 EXPECT_EQ(0, d.received_redirect_count()); | 11194 EXPECT_EQ(0, d.received_redirect_count()); |
11082 } | 11195 } |
11083 | 11196 |
11084 } // namespace net | 11197 } // namespace net |
OLD | NEW |