Browse Source

2010-02-26 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Store name attribute of metalink:metaurl element in MetalinkMetaurl.
	* src/MetalinkMetaurl.h
	* src/MetalinkParserController.cc
	* src/MetalinkParserController.h
	* src/MetalinkParserStateMachine.cc
	* src/MetalinkParserStateMachine.h
	* src/MetalinkParserStateV4Impl.cc
	* test/MetalinkProcessorTest.cc
	* test/metalink4-dirtraversal.xml
Tatsuhiro Tsujikawa 15 years ago
parent
commit
5032394c6a

+ 12 - 0
ChangeLog

@@ -1,3 +1,15 @@
+2010-02-26  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Store name attribute of metalink:metaurl element in MetalinkMetaurl.
+	* src/MetalinkMetaurl.h
+	* src/MetalinkParserController.cc
+	* src/MetalinkParserController.h
+	* src/MetalinkParserStateMachine.cc
+	* src/MetalinkParserStateMachine.h
+	* src/MetalinkParserStateV4Impl.cc
+	* test/MetalinkProcessorTest.cc
+	* test/metalink4-dirtraversal.xml
+
 2010-02-26  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Added MetalinkMetaurl class. It corresponds to metalink:metaurl

+ 1 - 0
src/MetalinkMetaurl.h

@@ -46,6 +46,7 @@ public:
   std::string url;
   std::string mediatype;
   int priority;
+  std::string name;
 
   MetalinkMetaurl();
 

+ 8 - 0
src/MetalinkParserController.cc

@@ -567,6 +567,14 @@ void MetalinkParserController::setPriorityOfMetaurl(int priority)
   _tMetaurl->priority = priority;
 }
 
+void MetalinkParserController::setNameOfMetaurl(const std::string& name)
+{
+  if(_tMetaurl.isNull()) {
+    return;
+  }
+  _tMetaurl->name = name;
+}
+
 void MetalinkParserController::commitMetaurlTransaction()
 {
   if(_tMetaurl.isNull()) {

+ 2 - 0
src/MetalinkParserController.h

@@ -187,6 +187,8 @@ public:
 
   void setPriorityOfMetaurl(int priority);
 
+  void setNameOfMetaurl(const std::string& name);
+
   void commitMetaurlTransaction();
 
   void cancelMetaurlTransaction();

+ 5 - 0
src/MetalinkParserStateMachine.cc

@@ -475,6 +475,11 @@ void MetalinkParserStateMachine::setPriorityOfMetaurl(int priority)
   _ctrl->setPriorityOfMetaurl(priority);
 }
 
+void MetalinkParserStateMachine::setNameOfMetaurl(const std::string& name)
+{
+  _ctrl->setNameOfMetaurl(name);
+}
+
 void MetalinkParserStateMachine::commitMetaurlTransaction()
 {
   _ctrl->commitMetaurlTransaction();

+ 2 - 0
src/MetalinkParserStateMachine.h

@@ -237,6 +237,8 @@ public:
 
   void setPriorityOfMetaurl(int priority);
 
+  void setNameOfMetaurl(const std::string& name);
+
   void commitMetaurlTransaction();
 
   void cancelMetaurlTransaction();

+ 11 - 0
src/MetalinkParserStateV4Impl.cc

@@ -130,6 +130,16 @@ void FileMetalinkParserStateV4::beginElement
     stm->setOSStateV4();
   } else if(localname == METAURL) {
     stm->setMetaurlStateV4();
+    std::string name;
+    {
+      std::vector<XmlAttr>::const_iterator itr = findAttr(attrs, NAME);
+      if(itr != attrs.end()) {
+        name = (*itr).value;
+        if(util::detectDirTraversal(name)) {
+          return;
+        }
+      }
+    }
     // TODO currently NAME is ignored
     int priority;
     {
@@ -159,6 +169,7 @@ void FileMetalinkParserStateV4::beginElement
     stm->newMetaurlTransaction();
     stm->setPriorityOfMetaurl(priority);
     stm->setMediatypeOfMetaurl(mediatype);
+    stm->setNameOfMetaurl(name);
   } else if(localname == URL) {
     stm->setURLStateV4();
     std::string location;

+ 3 - 1
test/MetalinkProcessorTest.cc

@@ -135,7 +135,9 @@ void MetalinkProcessorTest::testParseFileV4_dirtraversal()
 {
   MetalinkProcessor proc;
   SharedHandle<Metalinker> m = proc.parseFile("metalink4-dirtraversal.xml");
-  CPPUNIT_ASSERT_EQUAL((size_t)0, m->entries.size());
+  CPPUNIT_ASSERT_EQUAL((size_t)1, m->entries.size());
+  CPPUNIT_ASSERT_EQUAL((size_t)0, m->entries[0]->resources.size());
+  CPPUNIT_ASSERT_EQUAL((size_t)0, m->entries[0]->metaurls.size());
 }
 
 void MetalinkProcessorTest::testParseFileV4_attrs()

+ 3 - 0
test/metalink4-dirtraversal.xml

@@ -21,4 +21,7 @@
   <file name="..">
     <url location="fr" priority="1">http://example.com/example.ext</url>
   </file>
+  <file name="foo">
+    <metaurl name="../foo" mediatype="torrent">http://example.com/example.torrent</metaurl>
+  </file>
 </metalink>