From 223c50f56508f0067bf3fb34dc81312651741718 Mon Sep 17 00:00:00 2001
From: Hugo van Kemenade
Date: Thu, 30 Nov 2023 23:15:44 +0200
Subject: [PATCH 1/7] Add CVE role
---
doc/usage/restructuredtext/roles.rst | 12 +++++++
sphinx/environment/__init__.py | 4 +++
sphinx/roles.py | 37 +++++++++++++++++++++
tests/test_markup.py | 48 ++++++++++++++++++++++++++++
4 files changed, 101 insertions(+)
diff --git a/doc/usage/restructuredtext/roles.rst b/doc/usage/restructuredtext/roles.rst
index eb1a94b3916..c3a41a6774c 100644
--- a/doc/usage/restructuredtext/roles.rst
+++ b/doc/usage/restructuredtext/roles.rst
@@ -242,6 +242,18 @@ There is also an :rst:role:`index` role to generate index entries.
The following roles generate external links:
+.. rst:role:: cve
+
+ A reference to a Common Vulnerabilities and Exposures record. This
+ generates appropriate index entries. The text "CVE *number*\ " is
+ generated; in the HTML output, this text is a hyperlink to an online copy
+ of the specified CVE. You can link to a specific section by saying
+ ``:cve:`number#anchor```.
+
+ For example: :cve:`2020-10735`
+
+ .. versionadded:: 7.3
+
.. rst:role:: pep
A reference to a Python Enhancement Proposal. This generates appropriate
diff --git a/sphinx/environment/__init__.py b/sphinx/environment/__init__.py
index 24fbe33d4e3..498f4b6bcf0 100644
--- a/sphinx/environment/__init__.py
+++ b/sphinx/environment/__init__.py
@@ -43,6 +43,10 @@
'image_loading': 'link',
'embed_stylesheet': False,
'cloak_email_addresses': True,
+ 'cve_base_url': 'https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-',
+ 'cve_references': None,
+ 'cwe_base_url': 'https://cwe.mitre.org/data/definitions/',
+ 'cwe_references': None,
'pep_base_url': 'https://peps.python.org/',
'pep_references': None,
'rfc_base_url': 'https://datatracker.ietf.org/doc/html/',
diff --git a/sphinx/roles.py b/sphinx/roles.py
index d734429ebad..567ad85e112 100644
--- a/sphinx/roles.py
+++ b/sphinx/roles.py
@@ -172,6 +172,42 @@ def process_link(self, env: BuildEnvironment, refnode: Element, has_explicit_tit
return result
+class CVE(ReferenceRole):
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ target_id = f"index-{self.env.new_serialno('index')}"
+ entries = [("single", _("Common Vulnerabilities and Exposures; CVE %s") % self.target,
+ target_id, "", None)]
+
+ index = addnodes.index(entries=entries)
+ target = nodes.target("", "", ids=[target_id])
+ self.inliner.document.note_explicit_target(target)
+
+ try:
+ refuri = self.build_uri()
+ reference = nodes.reference("", "", internal=False, refuri=refuri, classes=["cve"])
+ if self.has_explicit_title:
+ reference += nodes.strong(self.title, self.title)
+ else:
+ title = "CVE " + self.title
+ reference += nodes.strong(title, title)
+ except ValueError:
+ msg = self.inliner.reporter.error(
+ __("invalid CVE number %s") % self.target, line=self.lineno,
+ )
+ prb = self.inliner.problematic(self.rawtext, self.rawtext, msg)
+ return [prb], [msg]
+
+ return [index, target, reference], []
+
+ def build_uri(self) -> str:
+ base_url = self.inliner.document.settings.cve_base_url
+ ret = self.target.split("#", 1)
+ if len(ret) == 2:
+ return f"{base_url}{ret[0]}#{ret[1]}"
+ else:
+ return f"{base_url}{ret[0]}"
+
+
class PEP(ReferenceRole):
def run(self) -> tuple[list[Node], list[system_message]]:
target_id = 'index-%s' % self.env.new_serialno('index')
@@ -401,6 +437,7 @@ def code_role(name: str, rawtext: str, text: str, lineno: int,
# links to anything
'any': AnyXRefRole(warn_dangling=True),
+ 'cve': CVE(),
'pep': PEP(),
'rfc': RFC(),
'guilabel': GUILabel(),
diff --git a/tests/test_markup.py b/tests/test_markup.py
index 0d877b3acf5..c68969c5293 100644
--- a/tests/test_markup.py
+++ b/tests/test_markup.py
@@ -150,6 +150,54 @@ def get(name):
@pytest.mark.parametrize(('type', 'rst', 'html_expected', 'latex_expected'), [
+ (
+ # cve role
+ 'verify',
+ ':cve:`2020-10735`',
+ (''
+ 'CVE 2020-10735
'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{Common Vulnerabilities and Exposures@\\spxentry{Common Vulnerabilities and Exposures}'
+ '!CVE 2020\\sphinxhyphen{}10735@\\spxentry{CVE 2020\\sphinxhyphen{}10735}}'
+ '\\sphinxhref{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735}'
+ '{\\sphinxstylestrong{CVE 2020\\sphinxhyphen{}10735}}'),
+ ),
+ (
+ # cve role with anchor
+ 'verify',
+ ':cve:`2020-10735#id1`',
+ (''
+ 'CVE 2020-10735#id1
'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{Common Vulnerabilities and Exposures@\\spxentry{Common Vulnerabilities and Exposures}'
+ '!CVE 2020\\sphinxhyphen{}10735\\#id1@\\spxentry{CVE 2020\\sphinxhyphen{}10735\\#id1}}'
+ '\\sphinxhref{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735\\#id1}'
+ '{\\sphinxstylestrong{CVE 2020\\sphinxhyphen{}10735\\#id1}}'),
+ ),
+ (
+ # cwe role
+ 'verify',
+ ':cwe:`787`',
+ ('CWE 787
'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
+ '!CWE 787@\\spxentry{CWE 787}}\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html}'
+ '{\\sphinxstylestrong{CWE 787}}'),
+ ),
+ (
+ # cwe role with anchor
+ 'verify',
+ ':cwe:`787#id1`',
+ ('CWE 787#id1
'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
+ '!CWE 787\\#id1@\\spxentry{CWE 787\\#id1}}\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html\\#id1}'
+ '{\\sphinxstylestrong{CWE 787\\#id1}}'),
+ ),
(
# pep role
'verify',
From 4c2e2511ab727ec395932b8545a49eb077ae884d Mon Sep 17 00:00:00 2001
From: Hugo van Kemenade
Date: Thu, 30 Nov 2023 23:47:52 +0200
Subject: [PATCH 2/7] Add CWE role
---
doc/usage/restructuredtext/roles.rst | 11 +++++++++
sphinx/roles.py | 37 ++++++++++++++++++++++++++++
tests/test_markup.py | 12 ++++++---
3 files changed, 56 insertions(+), 4 deletions(-)
diff --git a/doc/usage/restructuredtext/roles.rst b/doc/usage/restructuredtext/roles.rst
index c3a41a6774c..2270decb03a 100644
--- a/doc/usage/restructuredtext/roles.rst
+++ b/doc/usage/restructuredtext/roles.rst
@@ -254,6 +254,17 @@ The following roles generate external links:
.. versionadded:: 7.3
+.. rst:role:: cwe
+
+ A reference to a Common Weakness Enumeration. This generates appropriate
+ index entries. The text "CWE *number*\ " is generated; in the HTML output,
+ this text is a hyperlink to an online copy of the specified CWE. You can
+ link to a specific section by saying ``:cwe:`number#anchor```.
+
+ For example: :cwe:`787`
+
+ .. versionadded:: 7.3
+
.. rst:role:: pep
A reference to a Python Enhancement Proposal. This generates appropriate
diff --git a/sphinx/roles.py b/sphinx/roles.py
index 567ad85e112..fa4f4e3b043 100644
--- a/sphinx/roles.py
+++ b/sphinx/roles.py
@@ -208,6 +208,42 @@ def build_uri(self) -> str:
return f"{base_url}{ret[0]}"
+class CWE(ReferenceRole):
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ target_id = f"index-{self.env.new_serialno('index')}"
+ entries = [("single", _("Common Weakness Enumeration; CWE %s") % self.target,
+ target_id, "", None)]
+
+ index = addnodes.index(entries=entries)
+ target = nodes.target("", "", ids=[target_id])
+ self.inliner.document.note_explicit_target(target)
+
+ try:
+ refuri = self.build_uri()
+ reference = nodes.reference("", "", internal=False, refuri=refuri, classes=["cwe"])
+ if self.has_explicit_title:
+ reference += nodes.strong(self.title, self.title)
+ else:
+ title = "CWE " + self.title
+ reference += nodes.strong(title, title)
+ except ValueError:
+ msg = self.inliner.reporter.error(
+ __("invalid CWE number %s") % self.target, line=self.lineno,
+ )
+ prb = self.inliner.problematic(self.rawtext, self.rawtext, msg)
+ return [prb], [msg]
+
+ return [index, target, reference], []
+
+ def build_uri(self) -> str:
+ base_url = self.inliner.document.settings.cwe_base_url
+ ret = self.target.split("#", 1)
+ if len(ret) == 2:
+ return f"{base_url}{int(ret[0])}.html#{ret[1]}"
+ else:
+ return f"{base_url}{int(ret[0])}.html"
+
+
class PEP(ReferenceRole):
def run(self) -> tuple[list[Node], list[system_message]]:
target_id = 'index-%s' % self.env.new_serialno('index')
@@ -438,6 +474,7 @@ def code_role(name: str, rawtext: str, text: str, lineno: int,
'any': AnyXRefRole(warn_dangling=True),
'cve': CVE(),
+ 'cwe': CWE(),
'pep': PEP(),
'rfc': RFC(),
'guilabel': GUILabel(),
diff --git a/tests/test_markup.py b/tests/test_markup.py
index c68969c5293..6b6520c94ad 100644
--- a/tests/test_markup.py
+++ b/tests/test_markup.py
@@ -181,10 +181,12 @@ def get(name):
'verify',
':cwe:`787`',
('CWE 787
'),
+ 'href="https://cwe.mitre.org/data/definitions/787.html">'
+ 'CWE 787
'),
('\\sphinxAtStartPar\n'
'\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
- '!CWE 787@\\spxentry{CWE 787}}\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html}'
+ '!CWE 787@\\spxentry{CWE 787}}'
+ '\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html}'
'{\\sphinxstylestrong{CWE 787}}'),
),
(
@@ -192,10 +194,12 @@ def get(name):
'verify',
':cwe:`787#id1`',
('CWE 787#id1
'),
+ 'href="https://cwe.mitre.org/data/definitions/787.html#id1">'
+ 'CWE 787#id1'),
('\\sphinxAtStartPar\n'
'\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
- '!CWE 787\\#id1@\\spxentry{CWE 787\\#id1}}\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html\\#id1}'
+ '!CWE 787\\#id1@\\spxentry{CWE 787\\#id1}}'
+ '\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html\\#id1}'
'{\\sphinxstylestrong{CWE 787\\#id1}}'),
),
(
From c34734b0b5cd598258bf4fa459936af2d9e84895 Mon Sep 17 00:00:00 2001
From: Hugo van Kemenade
Date: Sun, 24 Dec 2023 13:24:56 -0700
Subject: [PATCH 3/7] Use f-strings and remove else after return
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
---
sphinx/roles.py | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/sphinx/roles.py b/sphinx/roles.py
index fa4f4e3b043..0e7639dc415 100644
--- a/sphinx/roles.py
+++ b/sphinx/roles.py
@@ -188,7 +188,7 @@ def run(self) -> tuple[list[Node], list[system_message]]:
if self.has_explicit_title:
reference += nodes.strong(self.title, self.title)
else:
- title = "CVE " + self.title
+ title = f"CVE {self.title}"
reference += nodes.strong(title, title)
except ValueError:
msg = self.inliner.reporter.error(
@@ -204,8 +204,7 @@ def build_uri(self) -> str:
ret = self.target.split("#", 1)
if len(ret) == 2:
return f"{base_url}{ret[0]}#{ret[1]}"
- else:
- return f"{base_url}{ret[0]}"
+ return f"{base_url}{ret[0]}"
class CWE(ReferenceRole):
@@ -224,7 +223,7 @@ def run(self) -> tuple[list[Node], list[system_message]]:
if self.has_explicit_title:
reference += nodes.strong(self.title, self.title)
else:
- title = "CWE " + self.title
+ title = f"CWE {self.title}"
reference += nodes.strong(title, title)
except ValueError:
msg = self.inliner.reporter.error(
@@ -240,8 +239,7 @@ def build_uri(self) -> str:
ret = self.target.split("#", 1)
if len(ret) == 2:
return f"{base_url}{int(ret[0])}.html#{ret[1]}"
- else:
- return f"{base_url}{int(ret[0])}.html"
+ return f"{base_url}{int(ret[0])}.html"
class PEP(ReferenceRole):
From eb1069ad92af55658d769b44f10fd99790ef8455 Mon Sep 17 00:00:00 2001
From: Adam Turner <9087854+aa-turner@users.noreply.github.com>
Date: Sat, 5 Oct 2024 18:08:24 +0100
Subject: [PATCH 4/7] post-merge
---
doc/usage/restructuredtext/roles.rst | 27 ++++---
sphinx/roles.py | 60 ++++++++++------
tests/test_markup/test_markup.py | 104 +++++++++++++--------------
3 files changed, 107 insertions(+), 84 deletions(-)
diff --git a/doc/usage/restructuredtext/roles.rst b/doc/usage/restructuredtext/roles.rst
index 1613773ee1a..4774b06195b 100644
--- a/doc/usage/restructuredtext/roles.rst
+++ b/doc/usage/restructuredtext/roles.rst
@@ -251,26 +251,31 @@ The following roles generate external links:
.. rst:role:: cve
- A reference to a Common Vulnerabilities and Exposures record. This
- generates appropriate index entries. The text "CVE *number*\ " is
- generated; in the HTML output, this text is a hyperlink to an online copy
- of the specified CVE. You can link to a specific section by saying
- ``:cve:`number#anchor```.
+ A reference to a `Common Vulnerabilities and Exposures`_ record.
+ This generates appropriate index entries.
+ The text "CVE *number*\ " is generated;
+ with a link to an online copy of the specified CVE.
+ You can link to a specific section by using ``:cve:`number#anchor```.
+
+ .. _Common Vulnerabilities and Exposures: https://www.cve.org/
For example: :cve:`2020-10735`
- .. versionadded:: 7.3
+ .. versionadded:: 8.1
.. rst:role:: cwe
- A reference to a Common Weakness Enumeration. This generates appropriate
- index entries. The text "CWE *number*\ " is generated; in the HTML output,
- this text is a hyperlink to an online copy of the specified CWE. You can
- link to a specific section by saying ``:cwe:`number#anchor```.
+ A reference to a `Common Weakness Enumeration`_.
+ This generates appropriate index entries.
+ The text "CWE *number*\ " is generated; in the HTML output,
+ with a link to an online copy of the specified CWE.
+ You can link to a specific section by using ``:cwe:`number#anchor```.
+
+ .. _Common Weakness Enumeration: https://cwe.mitre.org/
For example: :cwe:`787`
- .. versionadded:: 7.3
+ .. versionadded:: 8.1
.. rst:role:: pep
diff --git a/sphinx/roles.py b/sphinx/roles.py
index d09290ac749..48f3c7ce993 100644
--- a/sphinx/roles.py
+++ b/sphinx/roles.py
@@ -198,25 +198,34 @@ def process_link(
class CVE(ReferenceRole):
def run(self) -> tuple[list[Node], list[system_message]]:
- target_id = f"index-{self.env.new_serialno('index')}"
- entries = [("single", _("Common Vulnerabilities and Exposures; CVE %s") % self.target,
- target_id, "", None)]
+ target_id = f'index-{self.env.new_serialno("index")}'
+ entries = [
+ (
+ 'single',
+ _('Common Vulnerabilities and Exposures; CVE %s') % self.target,
+ target_id,
+ '',
+ None,
+ )
+ ]
index = addnodes.index(entries=entries)
- target = nodes.target("", "", ids=[target_id])
+ target = nodes.target('', '', ids=[target_id])
self.inliner.document.note_explicit_target(target)
try:
refuri = self.build_uri()
- reference = nodes.reference("", "", internal=False, refuri=refuri, classes=["cve"])
+ reference = nodes.reference(
+ '', '', internal=False, refuri=refuri, classes=['cve']
+ )
if self.has_explicit_title:
reference += nodes.strong(self.title, self.title)
else:
- title = f"CVE {self.title}"
+ title = f'CVE {self.title}'
reference += nodes.strong(title, title)
except ValueError:
msg = self.inliner.reporter.error(
- __("invalid CVE number %s") % self.target, line=self.lineno,
+ __('invalid CVE number %s') % self.target, line=self.lineno
)
prb = self.inliner.problematic(self.rawtext, self.rawtext, msg)
return [prb], [msg]
@@ -225,33 +234,42 @@ def run(self) -> tuple[list[Node], list[system_message]]:
def build_uri(self) -> str:
base_url = self.inliner.document.settings.cve_base_url
- ret = self.target.split("#", 1)
+ ret = self.target.split('#', 1)
if len(ret) == 2:
- return f"{base_url}{ret[0]}#{ret[1]}"
- return f"{base_url}{ret[0]}"
+ return f'{base_url}{ret[0]}#{ret[1]}'
+ return f'{base_url}{ret[0]}'
class CWE(ReferenceRole):
def run(self) -> tuple[list[Node], list[system_message]]:
- target_id = f"index-{self.env.new_serialno('index')}"
- entries = [("single", _("Common Weakness Enumeration; CWE %s") % self.target,
- target_id, "", None)]
+ target_id = f'index-{self.env.new_serialno("index")}'
+ entries = [
+ (
+ 'single',
+ _('Common Weakness Enumeration; CWE %s') % self.target,
+ target_id,
+ '',
+ None,
+ )
+ ]
index = addnodes.index(entries=entries)
- target = nodes.target("", "", ids=[target_id])
+ target = nodes.target('', '', ids=[target_id])
self.inliner.document.note_explicit_target(target)
try:
refuri = self.build_uri()
- reference = nodes.reference("", "", internal=False, refuri=refuri, classes=["cwe"])
+ reference = nodes.reference(
+ '', '', internal=False, refuri=refuri, classes=['cwe']
+ )
if self.has_explicit_title:
reference += nodes.strong(self.title, self.title)
else:
- title = f"CWE {self.title}"
+ title = f'CWE {self.title}'
reference += nodes.strong(title, title)
except ValueError:
msg = self.inliner.reporter.error(
- __("invalid CWE number %s") % self.target, line=self.lineno,
+ __('invalid CWE number %s') % self.target, line=self.lineno
)
prb = self.inliner.problematic(self.rawtext, self.rawtext, msg)
return [prb], [msg]
@@ -259,11 +277,11 @@ def run(self) -> tuple[list[Node], list[system_message]]:
return [index, target, reference], []
def build_uri(self) -> str:
- base_url = self.inliner.document.settings.cwe_base_url
- ret = self.target.split("#", 1)
+ base_url = self.inliner.document.settings.cve_base_url
+ ret = self.target.split('#', 1)
if len(ret) == 2:
- return f"{base_url}{int(ret[0])}.html#{ret[1]}"
- return f"{base_url}{int(ret[0])}.html"
+ return f'{base_url}{int(ret[0])}.html#{ret[1]}'
+ return f'{base_url}{int(ret[0])}.html'
class PEP(ReferenceRole):
diff --git a/tests/test_markup/test_markup.py b/tests/test_markup/test_markup.py
index 42246db5d8e..8d99cd6e414 100644
--- a/tests/test_markup/test_markup.py
+++ b/tests/test_markup/test_markup.py
@@ -162,58 +162,58 @@ def get(name):
[
(
# cve role
- 'verify',
- ':cve:`2020-10735`',
- (''
- 'CVE 2020-10735
'),
- ('\\sphinxAtStartPar\n'
- '\\index{Common Vulnerabilities and Exposures@\\spxentry{Common Vulnerabilities and Exposures}'
- '!CVE 2020\\sphinxhyphen{}10735@\\spxentry{CVE 2020\\sphinxhyphen{}10735}}'
- '\\sphinxhref{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735}'
- '{\\sphinxstylestrong{CVE 2020\\sphinxhyphen{}10735}}'),
- ),
- (
- # cve role with anchor
- 'verify',
- ':cve:`2020-10735#id1`',
- (''
- 'CVE 2020-10735#id1
'),
- ('\\sphinxAtStartPar\n'
- '\\index{Common Vulnerabilities and Exposures@\\spxentry{Common Vulnerabilities and Exposures}'
- '!CVE 2020\\sphinxhyphen{}10735\\#id1@\\spxentry{CVE 2020\\sphinxhyphen{}10735\\#id1}}'
- '\\sphinxhref{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735\\#id1}'
- '{\\sphinxstylestrong{CVE 2020\\sphinxhyphen{}10735\\#id1}}'),
- ),
- (
- # cwe role
- 'verify',
- ':cwe:`787`',
- (''
- 'CWE 787
'),
- ('\\sphinxAtStartPar\n'
- '\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
- '!CWE 787@\\spxentry{CWE 787}}'
- '\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html}'
- '{\\sphinxstylestrong{CWE 787}}'),
- ),
- (
- # cwe role with anchor
- 'verify',
- ':cwe:`787#id1`',
- (''
- 'CWE 787#id1
'),
- ('\\sphinxAtStartPar\n'
- '\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
- '!CWE 787\\#id1@\\spxentry{CWE 787\\#id1}}'
- '\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html\\#id1}'
- '{\\sphinxstylestrong{CWE 787\\#id1}}'),
- ),
- (
- # pep role
+ 'verify',
+ ':cve:`2020-10735`',
+ (''
+ 'CVE 2020-10735
'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{Common Vulnerabilities and Exposures@\\spxentry{Common Vulnerabilities and Exposures}'
+ '!CVE 2020\\sphinxhyphen{}10735@\\spxentry{CVE 2020\\sphinxhyphen{}10735}}'
+ '\\sphinxhref{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735}'
+ '{\\sphinxstylestrong{CVE 2020\\sphinxhyphen{}10735}}'),
+ ),
+ (
+ # cve role with anchor
+ 'verify',
+ ':cve:`2020-10735#id1`',
+ (''
+ 'CVE 2020-10735#id1
'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{Common Vulnerabilities and Exposures@\\spxentry{Common Vulnerabilities and Exposures}'
+ '!CVE 2020\\sphinxhyphen{}10735\\#id1@\\spxentry{CVE 2020\\sphinxhyphen{}10735\\#id1}}'
+ '\\sphinxhref{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735\\#id1}'
+ '{\\sphinxstylestrong{CVE 2020\\sphinxhyphen{}10735\\#id1}}'),
+ ),
+ (
+ # cwe role
+ 'verify',
+ ':cwe:`787`',
+ (''
+ 'CWE 787
'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
+ '!CWE 787@\\spxentry{CWE 787}}'
+ '\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html}'
+ '{\\sphinxstylestrong{CWE 787}}'),
+ ),
+ (
+ # cwe role with anchor
+ 'verify',
+ ':cwe:`787#id1`',
+ (''
+ 'CWE 787#id1
'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
+ '!CWE 787\\#id1@\\spxentry{CWE 787\\#id1}}'
+ '\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html\\#id1}'
+ '{\\sphinxstylestrong{CWE 787\\#id1}}'),
+ ),
+ (
+ # pep role
'verify',
':pep:`8`',
(
From ca149a88669e9abf5e4bd7b1f970eca967aeada1 Mon Sep 17 00:00:00 2001
From: Adam Turner <9087854+aa-turner@users.noreply.github.com>
Date: Sat, 5 Oct 2024 18:10:26 +0100
Subject: [PATCH 5/7] post-merge
---
sphinx/roles.py | 4 +-
tests/test_markup/test_markup.py | 80 +++++++++++++++++++-------------
2 files changed, 51 insertions(+), 33 deletions(-)
diff --git a/sphinx/roles.py b/sphinx/roles.py
index 48f3c7ce993..3f40307ef57 100644
--- a/sphinx/roles.py
+++ b/sphinx/roles.py
@@ -542,15 +542,17 @@ def code_role(
'download': XRefRole(nodeclass=addnodes.download_reference),
# links to anything
'any': AnyXRefRole(warn_dangling=True),
-
+ # external links
'cve': CVE(),
'cwe': CWE(),
'pep': PEP(),
'rfc': RFC(),
+ # emphasised things
'guilabel': GUILabel(),
'menuselection': MenuSelection(),
'file': EmphasizedLiteral(),
'samp': EmphasizedLiteral(),
+ # other
'abbr': Abbreviation(),
'manpage': Manpage(),
}
diff --git a/tests/test_markup/test_markup.py b/tests/test_markup/test_markup.py
index 8d99cd6e414..3be45a9736d 100644
--- a/tests/test_markup/test_markup.py
+++ b/tests/test_markup/test_markup.py
@@ -164,53 +164,69 @@ def get(name):
# cve role
'verify',
':cve:`2020-10735`',
- (''
- 'CVE 2020-10735
'),
- ('\\sphinxAtStartPar\n'
- '\\index{Common Vulnerabilities and Exposures@\\spxentry{Common Vulnerabilities and Exposures}'
- '!CVE 2020\\sphinxhyphen{}10735@\\spxentry{CVE 2020\\sphinxhyphen{}10735}}'
- '\\sphinxhref{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735}'
- '{\\sphinxstylestrong{CVE 2020\\sphinxhyphen{}10735}}'),
+ (
+ ''
+ 'CVE 2020-10735
'
+ ),
+ (
+ '\\sphinxAtStartPar\n'
+ '\\index{Common Vulnerabilities and Exposures@\\spxentry{Common Vulnerabilities and Exposures}'
+ '!CVE 2020\\sphinxhyphen{}10735@\\spxentry{CVE 2020\\sphinxhyphen{}10735}}'
+ '\\sphinxhref{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735}'
+ '{\\sphinxstylestrong{CVE 2020\\sphinxhyphen{}10735}}'
+ ),
),
(
# cve role with anchor
'verify',
':cve:`2020-10735#id1`',
- (''
- 'CVE 2020-10735#id1
'),
- ('\\sphinxAtStartPar\n'
- '\\index{Common Vulnerabilities and Exposures@\\spxentry{Common Vulnerabilities and Exposures}'
- '!CVE 2020\\sphinxhyphen{}10735\\#id1@\\spxentry{CVE 2020\\sphinxhyphen{}10735\\#id1}}'
- '\\sphinxhref{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735\\#id1}'
- '{\\sphinxstylestrong{CVE 2020\\sphinxhyphen{}10735\\#id1}}'),
+ (
+ ''
+ 'CVE 2020-10735#id1
'
+ ),
+ (
+ '\\sphinxAtStartPar\n'
+ '\\index{Common Vulnerabilities and Exposures@\\spxentry{Common Vulnerabilities and Exposures}'
+ '!CVE 2020\\sphinxhyphen{}10735\\#id1@\\spxentry{CVE 2020\\sphinxhyphen{}10735\\#id1}}'
+ '\\sphinxhref{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735\\#id1}'
+ '{\\sphinxstylestrong{CVE 2020\\sphinxhyphen{}10735\\#id1}}'
+ ),
),
(
# cwe role
'verify',
':cwe:`787`',
- (''
- 'CWE 787
'),
- ('\\sphinxAtStartPar\n'
- '\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
- '!CWE 787@\\spxentry{CWE 787}}'
- '\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html}'
- '{\\sphinxstylestrong{CWE 787}}'),
+ (
+ ''
+ 'CWE 787
'
+ ),
+ (
+ '\\sphinxAtStartPar\n'
+ '\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
+ '!CWE 787@\\spxentry{CWE 787}}'
+ '\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html}'
+ '{\\sphinxstylestrong{CWE 787}}'
+ ),
),
(
# cwe role with anchor
'verify',
':cwe:`787#id1`',
- (''
- 'CWE 787#id1
'),
- ('\\sphinxAtStartPar\n'
- '\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
- '!CWE 787\\#id1@\\spxentry{CWE 787\\#id1}}'
- '\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html\\#id1}'
- '{\\sphinxstylestrong{CWE 787\\#id1}}'),
+ (
+ ''
+ 'CWE 787#id1
'
+ ),
+ (
+ '\\sphinxAtStartPar\n'
+ '\\index{Common Weakness Enumeration@\\spxentry{Common Weakness Enumeration}'
+ '!CWE 787\\#id1@\\spxentry{CWE 787\\#id1}}'
+ '\\sphinxhref{https://cwe.mitre.org/data/definitions/787.html\\#id1}'
+ '{\\sphinxstylestrong{CWE 787\\#id1}}'
+ ),
),
(
# pep role
From 705cdf4c76da15a64893ee82540b6d80cab3d78b Mon Sep 17 00:00:00 2001
From: Adam Turner <9087854+aa-turner@users.noreply.github.com>
Date: Sat, 5 Oct 2024 18:27:46 +0100
Subject: [PATCH 6/7] fixup! post-merge
---
sphinx/roles.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sphinx/roles.py b/sphinx/roles.py
index 3f40307ef57..9d4b407665d 100644
--- a/sphinx/roles.py
+++ b/sphinx/roles.py
@@ -277,7 +277,7 @@ def run(self) -> tuple[list[Node], list[system_message]]:
return [index, target, reference], []
def build_uri(self) -> str:
- base_url = self.inliner.document.settings.cve_base_url
+ base_url = self.inliner.document.settings.cwe_base_url
ret = self.target.split('#', 1)
if len(ret) == 2:
return f'{base_url}{int(ret[0])}.html#{ret[1]}'
From ebbcbcd0dadf1c16cb62880b5ab370b7fe950880 Mon Sep 17 00:00:00 2001
From: Adam Turner <9087854+aa-turner@users.noreply.github.com>
Date: Sat, 5 Oct 2024 18:41:49 +0100
Subject: [PATCH 7/7] CHANGES
---
CHANGES.rst | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGES.rst b/CHANGES.rst
index 232f4f83e22..6001fd22035 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -59,6 +59,9 @@ Features added
such as :py:mod:`time` or :py:mod:`datetime` in :file:`conf.py`.
See :ref:`the docs ` for further detail.
Patch by Adam Turner.
+* #11781: Add roles for referencing CVEs (:rst:role:`:cve: `)
+ and CWEs (:rst:role:`:cwe: `).
+ Patch by Hugo van Kemenade.
Bugs fixed
----------