blob: edf5678092f7832e5372296dec3855b343672ae8 [file] [log] [blame]
# 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 = """\
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/xsl/glsa.xsl" type="text/xsl"?>
<?xml-stylesheet href="/xsl/guide.xsl" type="text/xsl"?>
<!DOCTYPE glsa SYSTEM "http://www.gentoo.org/dtd/glsa.dtd">
<glsa id="%(glsa_id)s">
<title>%(pkgname)s: Multiple vulnerabilities</title>
<synopsis>Multiple vulnerabilities have been found in %(pkgname)s.
</synopsis>
<product type="ebuild">%(pkgname)s</product>
<announced>January 18, 2013</announced>
<revised>January 18, 2013: 1</revised>
<bug>55555</bug>
<access>remote</access>
<affected>
<package name="%(cp)s" auto="yes" arch="*">
<unaffected range="ge">%(unaffected_version)s</unaffected>
<vulnerable range="lt">%(unaffected_version)s</vulnerable>
</package>
</affected>
<background>
<p>%(pkgname)s is software package.</p>
</background>
<description>
<p>Multiple vulnerabilities have been discovered in %(pkgname)s.
</p>
</description>
<impact type="normal">
<p>A remote attacker could exploit these vulnerabilities.</p>
</impact>
<workaround>
<p>There is no known workaround at this time.</p>
</workaround>
<resolution>
<p>All %(pkgname)s users should upgrade to the latest version:</p>
<code>
# emerge --sync
# emerge --ask --oneshot --verbose "&gt;=%(cp)s-%(unaffected_version)s"
</code>
</resolution>
<references>
</references>
</glsa>
"""
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()