~ubuntu-branches/ubuntu/quantal/nova/quantal-proposed

« back to all changes in this revision

Viewing changes to nova/utils.py

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2013-03-22 12:40:07 UTC
  • Revision ID: package-import@ubuntu.com-20130322124007-yulmow8qdfbxsigv
Tags: 2012.2.3-0ubuntu2
* Re-sync with latest security updates.
* SECURITY UPDATE: fix denial of service via fixed IPs when using extensions
  - debian/patches/CVE-2013-1838.patch: add explicit quota for fixed IP
  - CVE-2013-1838
* SECURITY UPDATE: fix VNC token validation
  - debian/patches/CVE-2013-0335.patch: force console auth service to flush
    all tokens associated with an instance when it is deleted
  - CVE-2013-0335
* SECURITY UPDATE: fix denial of service
  - CVE-2013-1664.patch: Add a new utils.safe_minidom_parse_string function
    and update external API facing Nova modules to use it
  - CVE-2013-1664

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
import time
40
40
import uuid
41
41
import weakref
 
42
from xml.dom import minidom
 
43
from xml.parsers import expat
 
44
from xml import sax
 
45
from xml.sax import expatreader
42
46
from xml.sax import saxutils
43
47
 
44
48
from eventlet import event
567
571
        return self.done.wait()
568
572
 
569
573
 
 
574
class ProtectedExpatParser(expatreader.ExpatParser):
 
575
    """An expat parser which disables DTD's and entities by default."""
 
576
 
 
577
    def __init__(self, forbid_dtd=True, forbid_entities=True,
 
578
                 *args, **kwargs):
 
579
        # Python 2.x old style class
 
580
        expatreader.ExpatParser.__init__(self, *args, **kwargs)
 
581
        self.forbid_dtd = forbid_dtd
 
582
        self.forbid_entities = forbid_entities
 
583
 
 
584
    def start_doctype_decl(self, name, sysid, pubid, has_internal_subset):
 
585
        raise ValueError("Inline DTD forbidden")
 
586
 
 
587
    def entity_decl(self, entityName, is_parameter_entity, value, base,
 
588
                    systemId, publicId, notationName):
 
589
        raise ValueError("<!ENTITY> forbidden")
 
590
 
 
591
    def unparsed_entity_decl(self, name, base, sysid, pubid, notation_name):
 
592
        # expat 1.2
 
593
        raise ValueError("<!ENTITY> forbidden")
 
594
 
 
595
    def reset(self):
 
596
        expatreader.ExpatParser.reset(self)
 
597
        if self.forbid_dtd:
 
598
            self._parser.StartDoctypeDeclHandler = self.start_doctype_decl
 
599
        if self.forbid_entities:
 
600
            self._parser.EntityDeclHandler = self.entity_decl
 
601
            self._parser.UnparsedEntityDeclHandler = self.unparsed_entity_decl
 
602
 
 
603
 
 
604
def safe_minidom_parse_string(xml_string):
 
605
    """Parse an XML string using minidom safely.
 
606
 
 
607
    """
 
608
    try:
 
609
        return minidom.parseString(xml_string, parser=ProtectedExpatParser())
 
610
    except sax.SAXParseException as se:
 
611
        raise expat.ExpatError()
 
612
 
 
613
 
570
614
def xhtml_escape(value):
571
615
    """Escapes a string so it is valid within XML or XHTML.
572
616