# Copyright 2013 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 from __future__ import unicode_literals import io import portage from portage import os, _encodings from portage.tests import TestCase from portage.tests.resolver.ResolverPlayground import (ResolverPlayground, ResolverPlaygroundTestCase) class SecuritySetTestCase(TestCase): glsa_template = """\ %(pkgname)s: Multiple vulnerabilities Multiple vulnerabilities have been found in %(pkgname)s. %(pkgname)s January 18, 2013 January 18, 2013: 1 55555 remote %(unaffected_version)s %(unaffected_version)s

%(pkgname)s is software package.

Multiple vulnerabilities have been discovered in %(pkgname)s.

A remote attacker could exploit these vulnerabilities.

There is no known workaround at this time.

All %(pkgname)s users should upgrade to the latest version:

# emerge --sync # emerge --ask --oneshot --verbose ">=%(cp)s-%(unaffected_version)s"
""" def _must_skip(self): try: __import__("xml.etree.ElementTree") __import__("xml.parsers.expat").parsers.expat.ExpatError except (AttributeError, ImportError): return "python is missing xml support" def testSecuritySet(self): skip_reason = self._must_skip() if skip_reason: self.portage_skip = skip_reason self.assertFalse(True, skip_reason) return ebuilds = { "cat/A-vulnerable-2.2": { "KEYWORDS": "x86" }, "cat/B-not-vulnerable-4.5": { "KEYWORDS": "x86" }, } installed = { "cat/A-vulnerable-2.1": { "KEYWORDS": "x86" }, "cat/B-not-vulnerable-4.4": { "KEYWORDS": "x86" }, } glsas = ( { "glsa_id": "201301-01", "pkgname": "A-vulnerable", "cp": "cat/A-vulnerable", "unaffected_version": "2.2" }, { "glsa_id": "201301-02", "pkgname": "B-not-vulnerable", "cp": "cat/B-not-vulnerable", "unaffected_version": "4.4" }, { "glsa_id": "201301-03", "pkgname": "NotInstalled", "cp": "cat/NotInstalled", "unaffected_version": "3.5" }, ) world = ["cat/A"] test_cases = ( ResolverPlaygroundTestCase( ["@security"], options = {}, success = True, mergelist = ["cat/A-vulnerable-2.2"]), ) playground = ResolverPlayground(ebuilds=ebuilds, installed=installed, world=world, debug=False) try: portdb = playground.trees[playground.eroot]["porttree"].dbapi glsa_dir = os.path.join(portdb.porttree_root, 'metadata', 'glsa') portage.util.ensure_dirs(glsa_dir) for glsa in glsas: with io.open(os.path.join(glsa_dir, 'glsa-' + glsa["glsa_id"] + '.xml'), encoding=_encodings['repo.content'], mode='w') as f: f.write(self.glsa_template % glsa) for test_case in test_cases: playground.run_TestCase(test_case) self.assertEqual(test_case.test_success, True, test_case.fail_msg) finally: playground.cleanup()