diff --git a/ChangeLog b/ChangeLog index 7cbdf69d..b9f52952 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-03-13 Tatsuhiro Tsujikawa + + Prepended _dir+"/" after joining path elements in torrent file. + * src/DefaultBtContext.cc + * test/DefaultBtContextTest.cc + 2009-03-13 Tatsuhiro Tsujikawa Added missing IndexBtMessageValidator.h diff --git a/src/DefaultBtContext.cc b/src/DefaultBtContext.cc index ccea61ab..1f6d28ad 100644 --- a/src/DefaultBtContext.cc +++ b/src/DefaultBtContext.cc @@ -154,19 +154,18 @@ void DefaultBtContext::extractFileEntries(const bencode::BDE& infoDict, std::vector pathelem(pathList.size()); std::transform(pathList.listBegin(), pathList.listEnd(), pathelem.begin(), std::mem_fun_ref(&bencode::BDE::s)); - std::string path = Util::joinPath(pathelem.begin(), pathelem.end()); + std::string path = + name+"/"+Util::joinPath(pathelem.begin(), pathelem.end()); // Split path with '/' again because each pathList element can // contain "/" inside. std::deque elements; Util::slice(elements, path, '/'); - elements.push_front(name); - elements.push_front(_dir); path = Util::joinPath(elements.begin(), elements.end()); std::deque uris; std::transform(urlList.begin(), urlList.end(), std::back_inserter(uris), std::bind2nd(std::plus(), "/"+path)); - FileEntryHandle fileEntry(new FileEntry(path, fileLengthData.i(), + FileEntryHandle fileEntry(new FileEntry(_dir+"/"+path, fileLengthData.i(), offset, uris)); fileEntries.push_back(fileEntry); offset += fileEntry->getLength(); @@ -184,9 +183,8 @@ void DefaultBtContext::extractFileEntries(const bencode::BDE& infoDict, // Slice path by '/' just in case nasty ".." is included in name std::deque pathelems; Util::slice(pathelems, name, '/'); - pathelems.push_front(_dir); SharedHandle fileEntry - (new FileEntry(Util::joinPath(pathelems.begin(), pathelems.end()), + (new FileEntry(_dir+"/"+Util::joinPath(pathelems.begin(),pathelems.end()), totalLength, 0, urlList)); fileEntries.push_back(fileEntry); } diff --git a/test/DefaultBtContextTest.cc b/test/DefaultBtContextTest.cc index dd0ad2b5..81362710 100644 --- a/test/DefaultBtContextTest.cc +++ b/test/DefaultBtContextTest.cc @@ -39,6 +39,8 @@ class DefaultBtContextTest:public CppUnit::TestFixture { CPPUNIT_TEST(testLoadFromMemory); CPPUNIT_TEST(testLoadFromMemory_somethingMissing); CPPUNIT_TEST(testLoadFromMemory_overrideName); + CPPUNIT_TEST(testLoadFromMemory_joinPathMulti); + CPPUNIT_TEST(testLoadFromMemory_joinPathSingle); CPPUNIT_TEST(testGetNodes); CPPUNIT_TEST_SUITE_END(); public: @@ -67,6 +69,8 @@ public: void testLoadFromMemory(); void testLoadFromMemory_somethingMissing(); void testLoadFromMemory_overrideName(); + void testLoadFromMemory_joinPathMulti(); + void testLoadFromMemory_joinPathSingle(); void testGetNodes(); }; @@ -108,11 +112,11 @@ void DefaultBtContextTest::testGetFileEntries() { std::deque >::iterator itr = fileEntries.begin(); SharedHandle fileEntry1 = *itr; - CPPUNIT_ASSERT_EQUAL(std::string("aria2-test/aria2/src/aria2c"), + CPPUNIT_ASSERT_EQUAL(std::string("./aria2-test/aria2/src/aria2c"), fileEntry1->getPath()); itr++; SharedHandle fileEntry2 = *itr; - CPPUNIT_ASSERT_EQUAL(std::string("aria2-test/aria2-0.2.2.tar.bz2"), + CPPUNIT_ASSERT_EQUAL(std::string("./aria2-test/aria2-0.2.2.tar.bz2"), fileEntry2->getPath()); } @@ -126,7 +130,7 @@ void DefaultBtContextTest::testGetFileEntriesSingle() { std::deque >::iterator itr = fileEntries.begin(); SharedHandle fileEntry1 = *itr; - CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.8.2.tar.bz2"), + CPPUNIT_ASSERT_EQUAL(std::string("./aria2-0.8.2.tar.bz2"), fileEntry1->getPath()); } @@ -289,7 +293,7 @@ void DefaultBtContextTest::testGetFileEntries_multiFileUrlList() { std::deque >::iterator itr = fileEntries.begin(); SharedHandle fileEntry1 = *itr; - CPPUNIT_ASSERT_EQUAL(std::string("aria2-test/aria2/src/aria2c"), + CPPUNIT_ASSERT_EQUAL(std::string("./aria2-test/aria2/src/aria2c"), fileEntry1->getPath()); std::deque uris1 = fileEntry1->getAssociatedUris(); CPPUNIT_ASSERT_EQUAL((size_t)2, uris1.size()); @@ -300,7 +304,7 @@ void DefaultBtContextTest::testGetFileEntries_multiFileUrlList() { itr++; SharedHandle fileEntry2 = *itr; - CPPUNIT_ASSERT_EQUAL(std::string("aria2-test/aria2-0.2.2.tar.bz2"), + CPPUNIT_ASSERT_EQUAL(std::string("./aria2-test/aria2-0.2.2.tar.bz2"), fileEntry2->getPath()); std::deque uris2 = fileEntry2->getAssociatedUris(); CPPUNIT_ASSERT_EQUAL((size_t)2, uris2.size()); @@ -319,7 +323,7 @@ void DefaultBtContextTest::testGetFileEntries_singleFileUrlList() { CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntries.size()); SharedHandle fileEntry1 = fileEntries.front(); - CPPUNIT_ASSERT_EQUAL(std::string("aria2.tar.bz2"), + CPPUNIT_ASSERT_EQUAL(std::string("./aria2.tar.bz2"), fileEntry1->getPath()); std::deque uris1 = fileEntry1->getAssociatedUris(); CPPUNIT_ASSERT_EQUAL((size_t)1, uris1.size()); @@ -364,6 +368,34 @@ void DefaultBtContextTest::testLoadFromMemory_overrideName() CPPUNIT_ASSERT_EQUAL(std::string("aria2-override.name"), btContext.getName()); } +void DefaultBtContextTest::testLoadFromMemory_joinPathMulti() +{ + std::string memory = + "d8:announce27:http://example.com/announce4:infod5:filesld6:lengthi262144e4:pathl7:../dir14:dir28:file.imgeee4:name14:../name1/name212:piece lengthi262144e6:pieces20:00000000000000000000ee"; + + DefaultBtContext btContext; + btContext.setDir("/tmp"); + btContext.loadFromMemory(memory, "default"); + + CPPUNIT_ASSERT_EQUAL(std::string("../name1/name2"), btContext.getName()); + CPPUNIT_ASSERT_EQUAL(std::string("/tmp/name1/dir1/dir2/file.img"), + btContext.getFileEntries().front()->getPath()); +} + +void DefaultBtContextTest::testLoadFromMemory_joinPathSingle() +{ + std::string memory = + "d8:announce27:http://example.com/announce4:infod4:name14:../name1/name26:lengthi262144e12:piece lengthi262144e6:pieces20:00000000000000000000ee"; + + DefaultBtContext btContext; + btContext.setDir("/tmp"); + btContext.loadFromMemory(memory, "default"); + + CPPUNIT_ASSERT_EQUAL(std::string("../name1/name2"), btContext.getName()); + CPPUNIT_ASSERT_EQUAL(std::string("/tmp/name1/name2"), + btContext.getFileEntries().front()->getPath()); +} + void DefaultBtContextTest::testGetNodes() { {