mirror of https://github.com/aria2/aria2
2010-03-03 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
In Metalink4, if size element contains invalid size, discard whole document. Added strict hash value check for metalink3/4. * src/MetalinkParserController.cc * src/MetalinkParserStateMachine.cc * src/MetalinkParserStateMachine.h * src/MetalinkParserStateV3Impl.cc * src/MetalinkParserStateV4Impl.cc * src/util.cc * src/util.h * test/MetalinkParserControllerTest.cc * test/MetalinkProcessorTest.cc * test/metalink4.xmlpull/1/head
parent
ba78b6f167
commit
3bb7855a56
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
||||||
|
2010-03-03 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
|
In Metalink4, if size element contains invalid size, discard whole
|
||||||
|
document. Added strict hash value check for metalink3/4.
|
||||||
|
* src/MetalinkParserController.cc
|
||||||
|
* src/MetalinkParserStateMachine.cc
|
||||||
|
* src/MetalinkParserStateMachine.h
|
||||||
|
* src/MetalinkParserStateV3Impl.cc
|
||||||
|
* src/MetalinkParserStateV4Impl.cc
|
||||||
|
* src/util.cc
|
||||||
|
* src/util.h
|
||||||
|
* test/MetalinkParserControllerTest.cc
|
||||||
|
* test/MetalinkProcessorTest.cc
|
||||||
|
* test/metalink4.xml
|
||||||
|
|
||||||
2010-03-02 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
2010-03-02 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Added strict attribute validation for metalink4. When
|
Added strict attribute validation for metalink4. When
|
||||||
|
|
|
@ -53,6 +53,13 @@
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
static bool isValidHash(const std::string& algo, const std::string& hash)
|
||||||
|
{
|
||||||
|
return util::isHexDigit(hash) &&
|
||||||
|
MessageDigestContext::supports(algo) &&
|
||||||
|
MessageDigestContext::digestLength(algo)*2 == hash.size();
|
||||||
|
}
|
||||||
|
|
||||||
MetalinkParserController::MetalinkParserController():
|
MetalinkParserController::MetalinkParserController():
|
||||||
_metalinker(new Metalinker())
|
_metalinker(new Metalinker())
|
||||||
{}
|
{}
|
||||||
|
@ -281,7 +288,11 @@ void MetalinkParserController::setHashOfChecksum(const std::string& md)
|
||||||
if(_tChecksum.isNull()) {
|
if(_tChecksum.isNull()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(isValidHash(_tChecksum->getAlgo(), md)) {
|
||||||
_tChecksum->setMessageDigest(md);
|
_tChecksum->setMessageDigest(md);
|
||||||
|
} else {
|
||||||
|
cancelChecksumTransaction();
|
||||||
|
}
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,7 +363,11 @@ void MetalinkParserController::addHashOfChunkChecksumV4(const std::string& md)
|
||||||
if(_tChunkChecksumV4.isNull()) {
|
if(_tChunkChecksumV4.isNull()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(isValidHash(_tChunkChecksumV4->getAlgo(), md)) {
|
||||||
_tempChunkChecksumsV4.push_back(md);
|
_tempChunkChecksumsV4.push_back(md);
|
||||||
|
} else {
|
||||||
|
cancelChunkChecksumTransactionV4();
|
||||||
|
}
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,7 +441,11 @@ void MetalinkParserController::addHashOfChunkChecksum(size_t order, const std::s
|
||||||
if(_tChunkChecksum.isNull()) {
|
if(_tChunkChecksum.isNull()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_tempChunkChecksums.push_back(std::pair<size_t, std::string>(order, md));
|
if(isValidHash(_tChunkChecksum->getAlgo(), md)) {
|
||||||
|
_tempChunkChecksums.push_back(std::make_pair(order, md));
|
||||||
|
} else {
|
||||||
|
cancelChunkChecksumTransaction();
|
||||||
|
}
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,7 +465,11 @@ void MetalinkParserController::setMessageDigestOfChunkChecksum(const std::string
|
||||||
if(_tChunkChecksum.isNull()) {
|
if(_tChunkChecksum.isNull()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(isValidHash(_tChunkChecksum->getAlgo(), md)) {
|
||||||
_tempHashPair.second = md;
|
_tempHashPair.second = md;
|
||||||
|
} else {
|
||||||
|
cancelChunkChecksumTransaction();
|
||||||
|
}
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -290,6 +290,11 @@ void MetalinkParserStateMachine::commitEntryTransaction()
|
||||||
_ctrl->commitEntryTransaction();
|
_ctrl->commitEntryTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MetalinkParserStateMachine::cancelEntryTransaction()
|
||||||
|
{
|
||||||
|
_ctrl->cancelEntryTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
void MetalinkParserStateMachine::newResourceTransaction()
|
void MetalinkParserStateMachine::newResourceTransaction()
|
||||||
{
|
{
|
||||||
_ctrl->newResourceTransaction();
|
_ctrl->newResourceTransaction();
|
||||||
|
|
|
@ -166,6 +166,8 @@ public:
|
||||||
|
|
||||||
void commitEntryTransaction();
|
void commitEntryTransaction();
|
||||||
|
|
||||||
|
void cancelEntryTransaction();
|
||||||
|
|
||||||
void newResourceTransaction();
|
void newResourceTransaction();
|
||||||
|
|
||||||
void setURLOfResource(const std::string& url);
|
void setURLOfResource(const std::string& url);
|
||||||
|
|
|
@ -183,7 +183,7 @@ void SizeMetalinkParserState::endElement
|
||||||
const std::string& characters)
|
const std::string& characters)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
stm->setFileLengthOfEntry(util::parseLLInt(characters));
|
stm->setFileLengthOfEntry(util::parseULLInt(characters));
|
||||||
} catch(RecoverableException& e) {
|
} catch(RecoverableException& e) {
|
||||||
// current metalink specification doesn't require size element.
|
// current metalink specification doesn't require size element.
|
||||||
}
|
}
|
||||||
|
|
|
@ -281,9 +281,10 @@ void SizeMetalinkParserStateV4::endElement
|
||||||
const std::string& characters)
|
const std::string& characters)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
stm->setFileLengthOfEntry(util::parseLLInt(characters));
|
stm->setFileLengthOfEntry(util::parseULLInt(characters));
|
||||||
} catch(RecoverableException& e) {
|
} catch(RecoverableException& e) {
|
||||||
// current metalink specification doesn't require size element.
|
stm->cancelEntryTransaction();
|
||||||
|
stm->logError("Bad size");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
src/util.cc
10
src/util.cc
|
@ -216,6 +216,16 @@ bool isHexDigit(const char c)
|
||||||
return isDigit(c) || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f');
|
return isDigit(c) || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isHexDigit(const std::string& s)
|
||||||
|
{
|
||||||
|
for(std::string::const_iterator i = s.begin(), eoi = s.end(); i != eoi; ++i) {
|
||||||
|
if(!isHexDigit(*i)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool inRFC3986ReservedChars(const char c)
|
bool inRFC3986ReservedChars(const char c)
|
||||||
{
|
{
|
||||||
static const char reserved[] = {
|
static const char reserved[] = {
|
||||||
|
|
|
@ -255,6 +255,10 @@ void usleep(long microseconds);
|
||||||
|
|
||||||
bool isNumber(const std::string& what);
|
bool isNumber(const std::string& what);
|
||||||
|
|
||||||
|
bool isHexDigit(const char c);
|
||||||
|
|
||||||
|
bool isHexDigit(const std::string& s);
|
||||||
|
|
||||||
bool isLowercase(const std::string& what);
|
bool isLowercase(const std::string& what);
|
||||||
|
|
||||||
bool isUppercase(const std::string& what);
|
bool isUppercase(const std::string& what);
|
||||||
|
|
|
@ -150,19 +150,27 @@ void MetalinkParserControllerTest::testChecksumTransaction()
|
||||||
ctrl.newEntryTransaction();
|
ctrl.newEntryTransaction();
|
||||||
ctrl.newChecksumTransaction();
|
ctrl.newChecksumTransaction();
|
||||||
ctrl.setTypeOfChecksum("md5");
|
ctrl.setTypeOfChecksum("md5");
|
||||||
ctrl.setHashOfChecksum("hash");
|
ctrl.setHashOfChecksum("acbd18db4cc2f85cedef654fccc4a4d8");
|
||||||
ctrl.commitEntryTransaction();
|
ctrl.commitEntryTransaction();
|
||||||
{
|
{
|
||||||
SharedHandle<Metalinker> m = ctrl.getResult();
|
SharedHandle<Metalinker> m = ctrl.getResult();
|
||||||
SharedHandle<Checksum> md = m->entries.front()->checksum;
|
SharedHandle<Checksum> md = m->entries.front()->checksum;
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("md5"), md->getAlgo());
|
CPPUNIT_ASSERT_EQUAL(std::string("md5"), md->getAlgo());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hash"), md->getMessageDigest());
|
CPPUNIT_ASSERT_EQUAL(std::string("acbd18db4cc2f85cedef654fccc4a4d8"),
|
||||||
|
md->getMessageDigest());
|
||||||
}
|
}
|
||||||
|
ctrl.newEntryTransaction();
|
||||||
|
ctrl.newChecksumTransaction();
|
||||||
|
ctrl.setTypeOfChecksum("md5");
|
||||||
|
ctrl.setHashOfChecksum("badhash");
|
||||||
|
ctrl.commitEntryTransaction();
|
||||||
|
CPPUNIT_ASSERT(ctrl.getResult()->entries[1]->checksum.isNull());
|
||||||
|
|
||||||
ctrl.newEntryTransaction();
|
ctrl.newEntryTransaction();
|
||||||
ctrl.newChecksumTransaction();
|
ctrl.newChecksumTransaction();
|
||||||
ctrl.cancelChecksumTransaction();
|
ctrl.cancelChecksumTransaction();
|
||||||
ctrl.commitEntryTransaction();
|
ctrl.commitEntryTransaction();
|
||||||
CPPUNIT_ASSERT(ctrl.getResult()->entries[1]->checksum.isNull());
|
CPPUNIT_ASSERT(ctrl.getResult()->entries[2]->checksum.isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetalinkParserControllerTest::testChunkChecksumTransaction()
|
void MetalinkParserControllerTest::testChunkChecksumTransaction()
|
||||||
|
@ -172,11 +180,11 @@ void MetalinkParserControllerTest::testChunkChecksumTransaction()
|
||||||
ctrl.newChunkChecksumTransaction();
|
ctrl.newChunkChecksumTransaction();
|
||||||
ctrl.setTypeOfChunkChecksum("md5");
|
ctrl.setTypeOfChunkChecksum("md5");
|
||||||
ctrl.setLengthOfChunkChecksum(256*1024);
|
ctrl.setLengthOfChunkChecksum(256*1024);
|
||||||
ctrl.addHashOfChunkChecksum(4, "hash4");
|
ctrl.addHashOfChunkChecksum(4, "4cbd18db4cc2f85cedef654fccc4a4d8");
|
||||||
ctrl.addHashOfChunkChecksum(1, "hash1");
|
ctrl.addHashOfChunkChecksum(1, "1cbd18db4cc2f85cedef654fccc4a4d8");
|
||||||
ctrl.addHashOfChunkChecksum(3, "hash3");
|
ctrl.addHashOfChunkChecksum(3, "3cbd18db4cc2f85cedef654fccc4a4d8");
|
||||||
ctrl.addHashOfChunkChecksum(2, "hash2");
|
ctrl.addHashOfChunkChecksum(2, "2cbd18db4cc2f85cedef654fccc4a4d8");
|
||||||
ctrl.addHashOfChunkChecksum(5, "hash5");
|
ctrl.addHashOfChunkChecksum(5, "5cbd18db4cc2f85cedef654fccc4a4d8");
|
||||||
ctrl.commitEntryTransaction();
|
ctrl.commitEntryTransaction();
|
||||||
{
|
{
|
||||||
SharedHandle<Metalinker> m = ctrl.getResult();
|
SharedHandle<Metalinker> m = ctrl.getResult();
|
||||||
|
@ -184,17 +192,30 @@ void MetalinkParserControllerTest::testChunkChecksumTransaction()
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("md5"), md->getAlgo());
|
CPPUNIT_ASSERT_EQUAL(std::string("md5"), md->getAlgo());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)256*1024, md->getChecksumLength());
|
CPPUNIT_ASSERT_EQUAL((size_t)256*1024, md->getChecksumLength());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)5, md->countChecksum());
|
CPPUNIT_ASSERT_EQUAL((size_t)5, md->countChecksum());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hash1"), md->getChecksums()[0]);
|
CPPUNIT_ASSERT_EQUAL(std::string("1cbd18db4cc2f85cedef654fccc4a4d8"),
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hash2"), md->getChecksums()[1]);
|
md->getChecksums()[0]);
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hash3"), md->getChecksums()[2]);
|
CPPUNIT_ASSERT_EQUAL(std::string("2cbd18db4cc2f85cedef654fccc4a4d8"),
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hash4"), md->getChecksums()[3]);
|
md->getChecksums()[1]);
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hash5"), md->getChecksums()[4]);
|
CPPUNIT_ASSERT_EQUAL(std::string("3cbd18db4cc2f85cedef654fccc4a4d8"),
|
||||||
|
md->getChecksums()[2]);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("4cbd18db4cc2f85cedef654fccc4a4d8"),
|
||||||
|
md->getChecksums()[3]);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("5cbd18db4cc2f85cedef654fccc4a4d8"),
|
||||||
|
md->getChecksums()[4]);
|
||||||
}
|
}
|
||||||
|
ctrl.newEntryTransaction();
|
||||||
|
ctrl.newChunkChecksumTransaction();
|
||||||
|
ctrl.setTypeOfChunkChecksum("md5");
|
||||||
|
ctrl.setLengthOfChunkChecksum(256*1024);
|
||||||
|
ctrl.addHashOfChunkChecksum(1, "badhash");
|
||||||
|
ctrl.commitEntryTransaction();
|
||||||
|
CPPUNIT_ASSERT(ctrl.getResult()->entries[1]->chunkChecksum.isNull());
|
||||||
|
|
||||||
ctrl.newEntryTransaction();
|
ctrl.newEntryTransaction();
|
||||||
ctrl.newChunkChecksumTransaction();
|
ctrl.newChunkChecksumTransaction();
|
||||||
ctrl.cancelChunkChecksumTransaction();
|
ctrl.cancelChunkChecksumTransaction();
|
||||||
ctrl.commitEntryTransaction();
|
ctrl.commitEntryTransaction();
|
||||||
CPPUNIT_ASSERT(ctrl.getResult()->entries[1]->chunkChecksum.isNull());
|
CPPUNIT_ASSERT(ctrl.getResult()->entries[2]->chunkChecksum.isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetalinkParserControllerTest::testChunkChecksumTransactionV4()
|
void MetalinkParserControllerTest::testChunkChecksumTransactionV4()
|
||||||
|
@ -202,27 +223,43 @@ void MetalinkParserControllerTest::testChunkChecksumTransactionV4()
|
||||||
MetalinkParserController ctrl;
|
MetalinkParserController ctrl;
|
||||||
ctrl.newEntryTransaction();
|
ctrl.newEntryTransaction();
|
||||||
ctrl.newChunkChecksumTransactionV4();
|
ctrl.newChunkChecksumTransactionV4();
|
||||||
ctrl.setTypeOfChunkChecksumV4("md5");
|
ctrl.setTypeOfChunkChecksumV4("sha-1");
|
||||||
ctrl.setLengthOfChunkChecksumV4(256*1024);
|
ctrl.setLengthOfChunkChecksumV4(256*1024);
|
||||||
ctrl.addHashOfChunkChecksumV4("hash1");
|
|
||||||
ctrl.addHashOfChunkChecksumV4("hash2");
|
ctrl.addHashOfChunkChecksumV4("5bd9f7248df0f3a6a86ab6c95f48787d546efa14");
|
||||||
ctrl.addHashOfChunkChecksumV4("hash3");
|
ctrl.addHashOfChunkChecksumV4("9413ee70957a09d55704123687478e07f18c7b29");
|
||||||
|
ctrl.addHashOfChunkChecksumV4("44213f9f4d59b557314fadcd233232eebcac8012");
|
||||||
ctrl.commitEntryTransaction();
|
ctrl.commitEntryTransaction();
|
||||||
{
|
{
|
||||||
SharedHandle<Metalinker> m = ctrl.getResult();
|
SharedHandle<Metalinker> m = ctrl.getResult();
|
||||||
SharedHandle<ChunkChecksum> md = m->entries.front()->chunkChecksum;
|
SharedHandle<ChunkChecksum> md = m->entries.front()->chunkChecksum;
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("md5"), md->getAlgo());
|
CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), md->getAlgo());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)256*1024, md->getChecksumLength());
|
CPPUNIT_ASSERT_EQUAL((size_t)256*1024, md->getChecksumLength());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)3, md->countChecksum());
|
CPPUNIT_ASSERT_EQUAL((size_t)3, md->countChecksum());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hash1"), md->getChecksums()[0]);
|
CPPUNIT_ASSERT_EQUAL
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hash2"), md->getChecksums()[1]);
|
(std::string("5bd9f7248df0f3a6a86ab6c95f48787d546efa14"),
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hash3"), md->getChecksums()[2]);
|
md->getChecksums()[0]);
|
||||||
|
CPPUNIT_ASSERT_EQUAL
|
||||||
|
(std::string("9413ee70957a09d55704123687478e07f18c7b29"),
|
||||||
|
md->getChecksums()[1]);
|
||||||
|
CPPUNIT_ASSERT_EQUAL
|
||||||
|
(std::string("44213f9f4d59b557314fadcd233232eebcac8012"),
|
||||||
|
md->getChecksums()[2]);
|
||||||
}
|
}
|
||||||
|
ctrl.newEntryTransaction();
|
||||||
|
ctrl.newChunkChecksumTransactionV4();
|
||||||
|
ctrl.setTypeOfChunkChecksumV4("sha-1");
|
||||||
|
ctrl.setLengthOfChunkChecksumV4(256*1024);
|
||||||
|
ctrl.addHashOfChunkChecksumV4("5bd9f7248df0f3a6a86ab6c95f48787d546efa14");
|
||||||
|
ctrl.addHashOfChunkChecksumV4("badhash");
|
||||||
|
ctrl.commitEntryTransaction();
|
||||||
|
CPPUNIT_ASSERT(ctrl.getResult()->entries[1]->chunkChecksum.isNull());
|
||||||
|
|
||||||
ctrl.newEntryTransaction();
|
ctrl.newEntryTransaction();
|
||||||
ctrl.newChunkChecksumTransactionV4();
|
ctrl.newChunkChecksumTransactionV4();
|
||||||
ctrl.cancelChunkChecksumTransactionV4();
|
ctrl.cancelChunkChecksumTransactionV4();
|
||||||
ctrl.commitEntryTransaction();
|
ctrl.commitEntryTransaction();
|
||||||
CPPUNIT_ASSERT(ctrl.getResult()->entries[1]->chunkChecksum.isNull());
|
CPPUNIT_ASSERT(ctrl.getResult()->entries[2]->chunkChecksum.isNull());
|
||||||
}
|
}
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ class MetalinkProcessorTest:public CppUnit::TestFixture {
|
||||||
CPPUNIT_TEST(testMalformedXML);
|
CPPUNIT_TEST(testMalformedXML);
|
||||||
CPPUNIT_TEST(testMalformedXML2);
|
CPPUNIT_TEST(testMalformedXML2);
|
||||||
CPPUNIT_TEST(testBadSize);
|
CPPUNIT_TEST(testBadSize);
|
||||||
|
CPPUNIT_TEST(testBadSizeV4);
|
||||||
CPPUNIT_TEST(testBadMaxConn);
|
CPPUNIT_TEST(testBadMaxConn);
|
||||||
CPPUNIT_TEST(testNoName);
|
CPPUNIT_TEST(testNoName);
|
||||||
CPPUNIT_TEST(testBadURLPrefs);
|
CPPUNIT_TEST(testBadURLPrefs);
|
||||||
|
@ -58,6 +59,7 @@ public:
|
||||||
void testMalformedXML();
|
void testMalformedXML();
|
||||||
void testMalformedXML2();
|
void testMalformedXML2();
|
||||||
void testBadSize();
|
void testBadSize();
|
||||||
|
void testBadSizeV4();
|
||||||
void testBadMaxConn();
|
void testBadMaxConn();
|
||||||
void testNoName();
|
void testNoName();
|
||||||
void testBadURLPrefs();
|
void testBadURLPrefs();
|
||||||
|
@ -90,7 +92,7 @@ void MetalinkProcessorTest::testParseFileV4()
|
||||||
CPPUNIT_ASSERT_EQUAL((uint64_t)786430LL, e->getLength());
|
CPPUNIT_ASSERT_EQUAL((uint64_t)786430LL, e->getLength());
|
||||||
CPPUNIT_ASSERT_EQUAL(-1, e->maxConnections);
|
CPPUNIT_ASSERT_EQUAL(-1, e->maxConnections);
|
||||||
#ifdef ENABLE_MESSAGE_DIGEST
|
#ifdef ENABLE_MESSAGE_DIGEST
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("80bc95fd391772fa61c91ed68567f0980bb45fd9"),
|
CPPUNIT_ASSERT_EQUAL(std::string("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"),
|
||||||
e->checksum->getMessageDigest());
|
e->checksum->getMessageDigest());
|
||||||
CPPUNIT_ASSERT(!e->checksum.isNull());
|
CPPUNIT_ASSERT(!e->checksum.isNull());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), e->checksum->getAlgo());
|
CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), e->checksum->getAlgo());
|
||||||
|
@ -98,11 +100,11 @@ void MetalinkProcessorTest::testParseFileV4()
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("sha-256"), e->chunkChecksum->getAlgo());
|
CPPUNIT_ASSERT_EQUAL(std::string("sha-256"), e->chunkChecksum->getAlgo());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)262144, e->chunkChecksum->getChecksumLength());
|
CPPUNIT_ASSERT_EQUAL((size_t)262144, e->chunkChecksum->getChecksumLength());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)3, e->chunkChecksum->countChecksum());
|
CPPUNIT_ASSERT_EQUAL((size_t)3, e->chunkChecksum->countChecksum());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("metalinkhash1"),
|
CPPUNIT_ASSERT_EQUAL(std::string("0245178074fd042e19b7c3885b360fc21064b30e73f5626c7e3b005d048069c5"),
|
||||||
e->chunkChecksum->getChecksum(0));
|
e->chunkChecksum->getChecksum(0));
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("metalinkhash2"),
|
CPPUNIT_ASSERT_EQUAL(std::string("487ba2299be7f759d7c7bf6a4ac3a32cee81f1bb9332fc485947e32918864fb2"),
|
||||||
e->chunkChecksum->getChecksum(1));
|
e->chunkChecksum->getChecksum(1));
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("metalinkhash3"),
|
CPPUNIT_ASSERT_EQUAL(std::string("37290d74ac4d186e3a8e5785d259d2ec04fac91ae28092e7620ec8bc99e830aa"),
|
||||||
e->chunkChecksum->getChecksum(2));
|
e->chunkChecksum->getChecksum(2));
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
CPPUNIT_ASSERT(!e->getSignature().isNull());
|
CPPUNIT_ASSERT(!e->getSignature().isNull());
|
||||||
|
@ -202,6 +204,11 @@ void MetalinkProcessorTest::testParseFileV4_attrs()
|
||||||
} catch(RecoverableException& e) {
|
} catch(RecoverableException& e) {
|
||||||
// success
|
// success
|
||||||
}
|
}
|
||||||
|
dw->setString(StringFormat(tmpl, "A").str());
|
||||||
|
try {
|
||||||
|
m = proc.parseFromBinaryStream(dw);
|
||||||
|
CPPUNIT_FAIL("exception must be thrown.");
|
||||||
|
} catch(RecoverableException& e) {}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
// Testing metaurl@priority
|
// Testing metaurl@priority
|
||||||
|
@ -239,6 +246,11 @@ void MetalinkProcessorTest::testParseFileV4_attrs()
|
||||||
} catch(RecoverableException& e) {
|
} catch(RecoverableException& e) {
|
||||||
// success
|
// success
|
||||||
}
|
}
|
||||||
|
dw->setString(StringFormat(tmpl, "A").str());
|
||||||
|
try {
|
||||||
|
m = proc.parseFromBinaryStream(dw);
|
||||||
|
CPPUNIT_FAIL("exception must be thrown.");
|
||||||
|
} catch(RecoverableException& e) {}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
// Testing metaurl@mediatype
|
// Testing metaurl@mediatype
|
||||||
|
@ -346,6 +358,12 @@ void MetalinkProcessorTest::testParseFileV4_attrs()
|
||||||
m = proc.parseFromBinaryStream(dw);
|
m = proc.parseFromBinaryStream(dw);
|
||||||
CPPUNIT_FAIL("exception must be thrown.");
|
CPPUNIT_FAIL("exception must be thrown.");
|
||||||
} catch(RecoverableException& e) {}
|
} catch(RecoverableException& e) {}
|
||||||
|
// not a number
|
||||||
|
try {
|
||||||
|
dw->setString(StringFormat(tmpl, "A").str());
|
||||||
|
m = proc.parseFromBinaryStream(dw);
|
||||||
|
CPPUNIT_FAIL("exception must be thrown.");
|
||||||
|
} catch(RecoverableException& e) {}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
// Testing pieces@type
|
// Testing pieces@type
|
||||||
|
@ -622,6 +640,31 @@ void MetalinkProcessorTest::testMalformedXML2()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MetalinkProcessorTest::testBadSizeV4()
|
||||||
|
{
|
||||||
|
MetalinkProcessor proc;
|
||||||
|
SharedHandle<Metalinker> m;
|
||||||
|
SharedHandle<ByteArrayDiskWriter> dw(new ByteArrayDiskWriter());
|
||||||
|
|
||||||
|
const char* tmpl =
|
||||||
|
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
||||||
|
"<metalink xmlns=\"urn:ietf:params:xml:ns:metalink\">"
|
||||||
|
"<file name=\"foo\">"
|
||||||
|
"<size>%s</size>"
|
||||||
|
"<url>http://example.org</url>"
|
||||||
|
"</file>"
|
||||||
|
"</metalink>";
|
||||||
|
|
||||||
|
dw->setString(StringFormat(tmpl, "9223372036854775807").str());
|
||||||
|
m = proc.parseFromBinaryStream(dw);
|
||||||
|
|
||||||
|
dw->setString(StringFormat(tmpl, "-1").str());
|
||||||
|
try {
|
||||||
|
m = proc.parseFromBinaryStream(dw);
|
||||||
|
CPPUNIT_FAIL("exception must be thrown.");
|
||||||
|
} catch(RecoverableException& e) {}
|
||||||
|
}
|
||||||
|
|
||||||
void MetalinkProcessorTest::testBadSize()
|
void MetalinkProcessorTest::testBadSize()
|
||||||
{
|
{
|
||||||
MetalinkProcessor proc;
|
MetalinkProcessor proc;
|
||||||
|
@ -850,16 +893,17 @@ void MetalinkProcessorTest::testBadPieceNo()
|
||||||
{
|
{
|
||||||
MetalinkProcessor proc;
|
MetalinkProcessor proc;
|
||||||
SharedHandle<ByteArrayDiskWriter> dw(new ByteArrayDiskWriter());
|
SharedHandle<ByteArrayDiskWriter> dw(new ByteArrayDiskWriter());
|
||||||
dw->setString("<metalink version=\"3.0\" xmlns=\"http://www.metalinker.org/\">"
|
dw->setString
|
||||||
|
("<metalink version=\"3.0\" xmlns=\"http://www.metalinker.org/\">"
|
||||||
"<files>"
|
"<files>"
|
||||||
"<file name=\"aria2.tar.bz2\">"
|
"<file name=\"aria2.tar.bz2\">"
|
||||||
" <verification>"
|
" <verification>"
|
||||||
" <pieces length=\"512\" type=\"sha1\">"
|
" <pieces length=\"512\" type=\"sha1\">"
|
||||||
" <hash piece=\"0\">abc</hash>"
|
" <hash piece=\"0\">44213f9f4d59b557314fadcd233232eebcac8012</hash>"
|
||||||
" <hash piece=\"xyz\">xyz</hash>"
|
" <hash piece=\"xyz\">44213f9f4d59b557314fadcd233232eebcac8012</hash>"
|
||||||
" </pieces>"
|
" </pieces>"
|
||||||
" <pieces length=\"1024\" type=\"sha1\">"
|
" <pieces length=\"1024\" type=\"sha1\">"
|
||||||
" <hash piece=\"0\">abc</hash>"
|
" <hash piece=\"0\">44213f9f4d59b557314fadcd233232eebcac8012</hash>"
|
||||||
" </pieces>"
|
" </pieces>"
|
||||||
" </verification>"
|
" </verification>"
|
||||||
"</file>"
|
"</file>"
|
||||||
|
@ -883,15 +927,16 @@ void MetalinkProcessorTest::testBadPieceLength()
|
||||||
{
|
{
|
||||||
MetalinkProcessor proc;
|
MetalinkProcessor proc;
|
||||||
SharedHandle<ByteArrayDiskWriter> dw(new ByteArrayDiskWriter());
|
SharedHandle<ByteArrayDiskWriter> dw(new ByteArrayDiskWriter());
|
||||||
dw->setString("<metalink version=\"3.0\" xmlns=\"http://www.metalinker.org/\">"
|
dw->setString
|
||||||
|
("<metalink version=\"3.0\" xmlns=\"http://www.metalinker.org/\">"
|
||||||
"<files>"
|
"<files>"
|
||||||
"<file name=\"aria2.tar.bz2\">"
|
"<file name=\"aria2.tar.bz2\">"
|
||||||
" <verification>"
|
" <verification>"
|
||||||
" <pieces length=\"xyz\" type=\"sha1\">"
|
" <pieces length=\"xyz\" type=\"sha1\">"
|
||||||
" <hash piece=\"0\">abc</hash>"
|
" <hash piece=\"0\">44213f9f4d59b557314fadcd233232eebcac8012</hash>"
|
||||||
" </pieces>"
|
" </pieces>"
|
||||||
" <pieces length=\"1024\" type=\"sha1\">"
|
" <pieces length=\"1024\" type=\"sha1\">"
|
||||||
" <hash piece=\"0\">abc</hash>"
|
" <hash piece=\"0\">44213f9f4d59b557314fadcd233232eebcac8012</hash>"
|
||||||
" </pieces>"
|
" </pieces>"
|
||||||
" </verification>"
|
" </verification>"
|
||||||
"</file>"
|
"</file>"
|
||||||
|
@ -915,15 +960,16 @@ void MetalinkProcessorTest::testUnsupportedType_piece()
|
||||||
{
|
{
|
||||||
MetalinkProcessor proc;
|
MetalinkProcessor proc;
|
||||||
SharedHandle<ByteArrayDiskWriter> dw(new ByteArrayDiskWriter());
|
SharedHandle<ByteArrayDiskWriter> dw(new ByteArrayDiskWriter());
|
||||||
dw->setString("<metalink version=\"3.0\" xmlns=\"http://www.metalinker.org/\">"
|
dw->setString
|
||||||
|
("<metalink version=\"3.0\" xmlns=\"http://www.metalinker.org/\">"
|
||||||
"<files>"
|
"<files>"
|
||||||
"<file name=\"aria2.tar.bz2\">"
|
"<file name=\"aria2.tar.bz2\">"
|
||||||
" <verification>"
|
" <verification>"
|
||||||
" <pieces length=\"512\" type=\"ARIA2\">"
|
" <pieces length=\"512\" type=\"ARIA2\">"
|
||||||
" <hash piece=\"0\">abc</hash>"
|
" <hash piece=\"0\">44213f9f4d59b557314fadcd233232eebcac8012</hash>"
|
||||||
" </pieces>"
|
" </pieces>"
|
||||||
" <pieces length=\"1024\" type=\"sha1\">"
|
" <pieces length=\"1024\" type=\"sha1\">"
|
||||||
" <hash piece=\"0\">abc</hash>"
|
" <hash piece=\"0\">44213f9f4d59b557314fadcd233232eebcac8012</hash>"
|
||||||
" </pieces>"
|
" </pieces>"
|
||||||
" </verification>"
|
" </verification>"
|
||||||
"</file>"
|
"</file>"
|
||||||
|
|
|
@ -7,17 +7,17 @@
|
||||||
<version>1.0</version>
|
<version>1.0</version>
|
||||||
<language>en</language>
|
<language>en</language>
|
||||||
<description>A description of the example file for download.</description>
|
<description>A description of the example file for download.</description>
|
||||||
<hash type="md5">80bc95fd391772fa61c91ed68567f0980bb45fd9</hash>
|
<hash type="md5">cbd18db4cc2f85cedef654fccc4a4d8</hash>
|
||||||
<hash type="sha-1">80bc95fd391772fa61c91ed68567f0980bb45fd9</hash>
|
<hash type="sha-1">0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33</hash>
|
||||||
<pieces length="262144" type="sha-1">
|
<pieces length="262144" type="sha-1">
|
||||||
<hash>metalinkhash1</hash>
|
<hash>5bd9f7248df0f3a6a86ab6c95f48787d546efa14</hash>
|
||||||
<hash>metalinkhash2</hash>
|
<hash>9413ee70957a09d55704123687478e07f18c7b29</hash>
|
||||||
<hash>metalinkhash3</hash>
|
<hash>44213f9f4d59b557314fadcd233232eebcac8012</hash>
|
||||||
</pieces>
|
</pieces>
|
||||||
<pieces length="262144" type="sha-256">
|
<pieces length="262144" type="sha-256">
|
||||||
<hash>metalinkhash1</hash>
|
<hash>0245178074fd042e19b7c3885b360fc21064b30e73f5626c7e3b005d048069c5</hash>
|
||||||
<hash>metalinkhash2</hash>
|
<hash>487ba2299be7f759d7c7bf6a4ac3a32cee81f1bb9332fc485947e32918864fb2</hash>
|
||||||
<hash>metalinkhash3</hash>
|
<hash>37290d74ac4d186e3a8e5785d259d2ec04fac91ae28092e7620ec8bc99e830aa</hash>
|
||||||
</pieces>
|
</pieces>
|
||||||
<url location="de" priority="1">ftp://ftp.example.com/example.ext</url>
|
<url location="de" priority="1">ftp://ftp.example.com/example.ext</url>
|
||||||
<url location="fr" priority="1">http://example.com/example.ext</url>
|
<url location="fr" priority="1">http://example.com/example.ext</url>
|
||||||
|
|
Loading…
Reference in New Issue