Revision: 290
Author: bslatkin
Date: Mon Oct 26 08:57:19 2009
Log: fixed external entity processing
http://code.google.com/p/pubsubhubbub/source/detail?r=290

Modified:
 /trunk/hub/feed_diff.py
 /trunk/hub/feed_diff_test.py

=======================================
--- /trunk/hub/feed_diff.py     Mon Aug 24 23:34:17 2009
+++ /trunk/hub/feed_diff.py     Mon Oct 26 08:57:19 2009
@@ -34,6 +34,13 @@
   """Exception for errors in this module."""


+class TrivialEntityResolver(xml.sax.handler.EntityResolver):
+  """Pass-through entity resolver."""
+
+  def resolveEntity(self, publicId, systemId):
+    return cStringIO.StringIO()
+
+
 class FeedContentHandler(xml.sax.handler.ContentHandler):
   """Sax content handler for quickly parsing Atom and RSS feeds."""

@@ -217,7 +224,11 @@
     raise Error('Invalid feed format "%s"' % format)

   parser.setContentHandler(handler)
-  parser.parse(data_stream)
+  parser.setEntityResolver(TrivialEntityResolver())
+  try:
+    parser.parse(data_stream)
+  except IOError, e:
+    raise Error('Encountered IOError while parsing: %s' % e)

   for entry_id, content in handler.entries_map.iteritems():
     if format == 'atom' and not entry_id:
=======================================
--- /trunk/hub/feed_diff_test.py        Mon Aug 24 23:34:17 2009
+++ /trunk/hub/feed_diff_test.py        Mon Oct 26 08:57:19 2009
@@ -249,6 +249,19 @@
     self.verify_entries(expected_list, entries)


+class FilterTest(TestBase):
+
+  format = 'atom'
+
+  def testEntities(self):
+    """Tests that external entities cause parsing to fail."""
+    try:
+      self.load_feed('xhtml_entities.xml')
+      self.fail('Should have raised an exception')
+    except feed_diff.Error, e:
+      self.assertFalse('IOError' in str(e))
+
+
 if __name__ == '__main__':
   ## feed_diff.DEBUG = True
   ## logging.getLogger().setLevel(logging.DEBUG)

Reply via email to