15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/nacl_file_host.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/scoped_path_override.h" 110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "components/nacl/browser/nacl_browser.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/nacl_browser_delegate.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/test_nacl_browser_delegate.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using nacl_file_host::PnaclCanOpenFile; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class FileHostTestNaClBrowserDelegate : public TestNaClBrowserDelegate { 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FileHostTestNaClBrowserDelegate() {} 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool GetPnaclDirectory(base::FilePath* pnacl_dir) OVERRIDE { 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch *pnacl_dir = pnacl_path_; 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetPnaclDirectory(const base::FilePath& pnacl_dir) { 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pnacl_path_ = pnacl_dir; 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath pnacl_path_; 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass NaClFileHostTest : public testing::Test { 362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch protected: 372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch NaClFileHostTest(); 382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual ~NaClFileHostTest(); 392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual void SetUp() OVERRIDE { 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) nacl_browser_delegate_ = new FileHostTestNaClBrowserDelegate; 420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) nacl::NaClBrowser::SetDelegate(nacl_browser_delegate_); 432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual void TearDown() OVERRIDE { 460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // This deletes nacl_browser_delegate_. 470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) nacl::NaClBrowser::SetDelegate(NULL); 482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FileHostTestNaClBrowserDelegate* nacl_browser_delegate() { 512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return nacl_browser_delegate_; 522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private: 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FileHostTestNaClBrowserDelegate* nacl_browser_delegate_; 562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DISALLOW_COPY_AND_ASSIGN(NaClFileHostTest); 572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}; 582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)NaClFileHostTest::NaClFileHostTest() : nacl_browser_delegate_(NULL) {} 602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochNaClFileHostTest::~NaClFileHostTest() { 622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Try to pass a few funny filenames with a dummy PNaCl directory set. 652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(NaClFileHostTest, TestFilenamesWithPnaclPath) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir scoped_tmp_dir; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(scoped_tmp_dir.CreateUniqueTempDir()); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath kTestPnaclPath = scoped_tmp_dir.path(); 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch nacl_browser_delegate()->SetPnaclDirectory(kTestPnaclPath); 720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_TRUE(nacl::NaClBrowser::GetDelegate()->GetPnaclDirectory( 730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) &kTestPnaclPath)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check allowed strings, and check that the expected prefix is added. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath out_path; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PnaclCanOpenFile("pnacl_json", &out_path)); 782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath expected_path = kTestPnaclPath.Append( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("pnacl_public_pnacl_json")); 802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(expected_path, out_path); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PnaclCanOpenFile("x86_32_llc", &out_path)); 832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch expected_path = kTestPnaclPath.Append( 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("pnacl_public_x86_32_llc")); 852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(expected_path, out_path); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check character ranges. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile(".xchars", &out_path)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("/xchars", &out_path)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("x/chars", &out_path)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("\\xchars", &out_path)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("x\\chars", &out_path)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("$xchars", &out_path)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("%xchars", &out_path)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("CAPS", &out_path)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char non_ascii[] = "\xff\xfe"; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile(non_ascii, &out_path)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check file length restriction. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("thisstringisactuallywaaaaaaaaaaaaaaaaaaaaaaaa" 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "toolongwaytoolongwaaaaayyyyytoooooooooooooooo" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "looooooooong", 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &out_path)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Other bad files. 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile(std::string(), &out_path)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile(".", &out_path)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("..", &out_path)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("..\\llc", &out_path)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("%SystemRoot%", &out_path)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("%SystemRoot%\\explorer.exe", &out_path)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("../llc", &out_path)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("/bin/sh", &out_path)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("$HOME", &out_path)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PnaclCanOpenFile("$HOME/.bashrc", &out_path)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 120