Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-nbconvert for 
openSUSE:Factory checked in at 2026-11-13 18:30:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-nbconvert (Old)
 and      /work/SRC/openSUSE:Factory/.python-nbconvert.new.1251 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-nbconvert"

Fri Nov 13 18:30:01 2026 rev:41 rq:1396973 version:7.17.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-nbconvert/python-nbconvert.changes        
2026-09-08 17:00:25.438756888 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-nbconvert.new.1251/python-nbconvert.changes  
    2026-11-13 18:32:43.604683412 +0100
@@ -1,0 +2,7 @@
+Thu Nov 12 00:01:45 UTC 2026 - Steve Kowalik <[email protected]>
+
+- Update to 7.17.2:
+  * Addresses CVE-2026-114140 (bsc#1286876)
+  * Use org-level security policy
+
+-------------------------------------------------------------------

Old:
----
  nbconvert-7.17.1.tar.gz

New:
----
  nbconvert-7.17.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-nbconvert.spec ++++++
--- /var/tmp/diff_new_pack.MzEWRV/_old  2026-11-13 18:32:45.915781258 +0100
+++ /var/tmp/diff_new_pack.MzEWRV/_new  2026-11-13 18:32:45.917781343 +0100
@@ -30,10 +30,10 @@
 %bcond_with libalternatives
 %endif
 # X.X.0 gets abbreviated by pythondistdeps
-%define shortversion 7.17.1
+%define shortversion 7.17.2
 %{?sle15_python_module_pythons}
 Name:           python-nbconvert%{psuffix}
-Version:        7.17.1
+Version:        7.17.2
 Release:        0
 Summary:        Conversion of Jupyter Notebooks
 License:        BSD-3-Clause AND MIT
@@ -41,7 +41,7 @@
 Source0:        
https://files.pythonhosted.org/packages/source/n/nbconvert/nbconvert-%{version}.tar.gz
 # PATCH-FIX-OPENSUSE 0001-fix-XSS-in-text-vnd.mermaid.patch bsc#1269365 
gh#jupyter/nbconvert#2294
 Patch1:         0001-fix-XSS-in-text-vnd.mermaid.patch
-BuildRequires:  %{python_module base >= 3.8}
+BuildRequires:  %{python_module base >= 3.9}
 BuildRequires:  %{python_module hatchling >= 0.25}
 BuildRequires:  %{python_module pip}
 BuildRequires:  fdupes

++++++ nbconvert-7.17.1.tar.gz -> nbconvert-7.17.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-7.17.1/CHANGELOG.md 
new/nbconvert-7.17.2/CHANGELOG.md
--- old/nbconvert-7.17.1/CHANGELOG.md   2020-02-02 01:00:00.000000000 +0100
+++ new/nbconvert-7.17.2/CHANGELOG.md   2020-02-02 01:00:00.000000000 +0100
@@ -2,6 +2,29 @@
 
 <!-- <START NEW CHANGELOG ENTRY> -->
 
+## 7.17.2
+
+([Full 
Changelog](https://github.com/jupyter/nbconvert/compare/v7.17.1...8685e15e2d924fa39be38aeafb6ac859fc254ccc))
+
+### Maintenance and upkeep improvements
+
+- Fix CI: fetch the classic CSS from PyPI, update dead links 
[#2327](https://github.com/jupyter/nbconvert/pull/2327) 
([@Yann-P](https://github.com/Yann-P), [@Carreau](https://github.com/Carreau), 
[@claude](https://github.com/claude))
+
+### Other merged PRs
+
+- Use org-level security policy (jupyter/.github/SECURITY.md) 
[#2318](https://github.com/jupyter/nbconvert/pull/2318) 
([@Yann-P](https://github.com/Yann-P), [@minrk](https://github.com/minrk))
+
+### Contributors to this release
+
+The following people contributed discussions, new ideas, code and 
documentation contributions, and review.
+See [our definition of 
contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
+
+([GitHub contributors page for this 
release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2026-04-08&to=2026-10-12&type=c))
+
+@Carreau 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ACarreau+updated%3A2026-04-08..2026-10-12&type=Issues))
 | @claude 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aclaude+updated%3A2026-04-08..2026-10-12&type=Issues))
 | @GruffElixir 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AGruffElixir+updated%3A2026-04-08..2026-10-12&type=Issues))
 | @minrk 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aminrk+updated%3A2026-04-08..2026-10-12&type=Issues))
 | @Yann-P 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AYann-P+updated%3A2026-04-08..2026-10-12&type=Issues))
+
+<!-- <END NEW CHANGELOG ENTRY> -->
+
 ## 7.17.1
 
 This is a security release, fixing two CVEs:
@@ -15,7 +38,7 @@
 
 ### Enhancements made
 
-- Allow configureable WebPDF JavaScript processing timeout 
[#2250](https://github.com/jupyter/nbconvert/pull/2250) 
([@timkpaine](https://github.com/timkpaine), 
[@Carreau](https://github.com/Carreau))
+- Allow configurable WebPDF JavaScript processing timeout 
[#2250](https://github.com/jupyter/nbconvert/pull/2250) 
([@timkpaine](https://github.com/timkpaine), 
[@Carreau](https://github.com/Carreau))
 
 ### Bugs fixed
 
@@ -35,8 +58,6 @@
 
 @akhmerov 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aakhmerov+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @bollwyvl 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abollwyvl+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @Carreau 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ACarreau+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @ctcjab 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Actcjab+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @davidbrochart 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Adavidbrochart+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @Ken-B 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AKen-B+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @krassowski 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Akrassowski+updated%3A2026-01-29..
 2026-04-08&type=Issues)) | @mgeier 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Amgeier+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @minrk 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aminrk+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @mpacer 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ampacer+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @MSeal 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AMSeal+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @SylvainCorlay 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ASylvainCorlay+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @takluyver 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Atakluyver+updated%3A2026-01-29..2026-04-08&type=Issues))
 | @timkpaine 
([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Atimkpaine+upd
 ated%3A2026-01-29..2026-04-08&type=Issues))
 
-<!-- <END NEW CHANGELOG ENTRY> -->
-
 ## 7.17.0
 
 ([Full 
Changelog](https://github.com/jupyter/nbconvert/compare/v7.16.6...c9ac1d1040459ed1ff9eb34e9918ce5a87cf9d71))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-7.17.1/PKG-INFO 
new/nbconvert-7.17.2/PKG-INFO
--- old/nbconvert-7.17.1/PKG-INFO       2020-02-02 01:00:00.000000000 +0100
+++ new/nbconvert-7.17.2/PKG-INFO       2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
-Metadata-Version: 2.4
+Metadata-Version: 2.5
 Name: nbconvert
-Version: 7.17.1
+Version: 7.17.2
 Summary: Convert Jupyter Notebooks (.ipynb files) to other formats.
 Project-URL: Homepage, https://jupyter.org
 Author-email: Jupyter Development Team <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-7.17.1/SECURITY.md 
new/nbconvert-7.17.2/SECURITY.md
--- old/nbconvert-7.17.1/SECURITY.md    2020-02-02 01:00:00.000000000 +0100
+++ new/nbconvert-7.17.2/SECURITY.md    1970-01-01 01:00:00.000000000 +0100
@@ -1,10 +0,0 @@
-# Security Policy
-
-## Reporting a Vulnerability
-
-All IPython and Jupyter security are handled via [email protected].
-You can find more information on the Jupyter website. 
https://jupyter.org/security
-
-## Tidelift
-
-You can report security concerns for IPython via the [Tidelift 
platform](https://tidelift.com).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-7.17.1/docs/source/install.rst 
new/nbconvert-7.17.2/docs/source/install.rst
--- old/nbconvert-7.17.1/docs/source/install.rst        2020-02-02 
01:00:00.000000000 +0100
+++ new/nbconvert-7.17.2/docs/source/install.rst        2020-02-02 
01:00:00.000000000 +0100
@@ -24,7 +24,7 @@
 
     conda install nbconvert
 
-The `Miniconda <https://docs.conda.io/en/latest/miniconda.html>`_ and 
`Miniforge <https://github.com/conda-forge/miniforge/>`_ distributions both 
provide a minimal conda installation.
+The `Miniconda 
<https://www.anaconda.com/docs/getting-started/concepts/anaconda-or-miniconda>`_
 and `Miniforge <https://github.com/conda-forge/miniforge/>`_ distributions 
both provide a minimal conda installation.
 
 .. important::
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-7.17.1/hatch_build.py 
new/nbconvert-7.17.2/hatch_build.py
--- old/nbconvert-7.17.1/hatch_build.py 2020-02-02 01:00:00.000000000 +0100
+++ new/nbconvert-7.17.2/hatch_build.py 2020-02-02 01:00:00.000000000 +0100
@@ -1,13 +1,20 @@
 """Custom build script for hatch backend"""
 
+import io
 import os
 import sys
+import zipfile
 from urllib.request import urlopen
 
 from hatchling.builders.hooks.plugin.interface import BuildHookInterface
 
 notebook_css_version = "5.4.0"
-notebook_css_url = "https://cdn.jupyter.org/notebook/%s/style/style.min.css"; % 
notebook_css_version
+# cdn.jupyter.org is unreliable, so take the same stylesheet from the notebook 
wheel on PyPI.
+notebook_css_url = (
+    
"https://files.pythonhosted.org/packages/d0/ca/a5a5ac9c839868ceddaa2672c399492ac1dbd4c4ce68f833a72a619fc225/";
+    "notebook-%s-py2.py3-none-any.whl" % notebook_css_version
+)
+notebook_css_member = "notebook/static/style/style.min.css"
 
 jupyterlab_css_version = "4.0.2"
 jupyterlab_css_url = (
@@ -28,11 +35,11 @@
 
 template_css_urls = {
     "lab": [
-        (jupyterlab_css_url, "index.css"),
-        (jupyterlab_theme_light_url, "theme-light.css"),
-        (jupyterlab_theme_dark_url, "theme-dark.css"),
+        (jupyterlab_css_url, "index.css", None),
+        (jupyterlab_theme_light_url, "theme-light.css", None),
+        (jupyterlab_theme_dark_url, "theme-dark.css", None),
     ],
-    "classic": [(notebook_css_url, "style.css")],
+    "classic": [(notebook_css_url, "style.css", notebook_css_member)],
 }
 
 osp = os.path
@@ -40,8 +47,8 @@
 templates_dir = osp.join(here, "share", "templates")
 
 
-def _get_css_file(template_name, url, filename):
-    """Get a css file and download it to the templates dir"""
+def _get_css_file(template_name, url, filename, member):
+    """Get a css file, or the member of the zip archive at url, into the 
templates dir"""
     directory = osp.join(templates_dir, template_name, "static")
     dest = osp.join(directory, filename)
     if osp.exists(dest):
@@ -52,6 +59,8 @@
     print("Downloading CSS: %s" % url)
     try:
         css = urlopen(url).read()  # noqa: S310
+        if member:
+            css = zipfile.ZipFile(io.BytesIO(css)).read(member)
     except Exception as e:
         msg = f"Failed to download css from {url}: {e}"
         print(msg, file=sys.stderr)
@@ -72,8 +81,8 @@
         return
 
     for template_name, resources in template_css_urls.items():
-        for url, filename in resources:
-            _get_css_file(template_name, url, filename)
+        for url, filename, member in resources:
+            _get_css_file(template_name, url, filename, member)
 
 
 class CustomHook(BuildHookInterface):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-7.17.1/nbconvert/_version.py 
new/nbconvert-7.17.2/nbconvert/_version.py
--- old/nbconvert-7.17.1/nbconvert/_version.py  2020-02-02 01:00:00.000000000 
+0100
+++ new/nbconvert-7.17.2/nbconvert/_version.py  2020-02-02 01:00:00.000000000 
+0100
@@ -3,7 +3,7 @@
 import re
 
 # Version string must appear intact for versioning
-__version__ = "7.17.1"
+__version__ = "7.17.2"
 
 # Build up version_info tuple for backwards compatibility
 pattern = r"(?P<major>\d+).(?P<minor>\d+).(?P<patch>\d+)(?P<rest>.*)"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-7.17.1/nbconvert/preprocessors/extractoutput.py 
new/nbconvert-7.17.2/nbconvert/preprocessors/extractoutput.py
--- old/nbconvert-7.17.1/nbconvert/preprocessors/extractoutput.py       
2020-02-02 01:00:00.000000000 +0100
+++ new/nbconvert-7.17.2/nbconvert/preprocessors/extractoutput.py       
2020-02-02 01:00:00.000000000 +0100
@@ -114,7 +114,22 @@
                     if ext is None:
                         ext = "." + mime_type.rsplit("/")[-1]
                     if out.metadata.get("filename", ""):
-                        filename = out.metadata["filename"]
+                        fname = out.metadata["filename"]
+                        # Sanitize: use only the basename to prevent path 
traversal
+                        filename = os.path.basename(fname)
+                        if not filename:
+                            self.log.warning(
+                                "Output filename '%s' is invalid (empty 
basename), skipping",
+                                fname,
+                            )
+                            continue
+                        if filename != fname:
+                            self.log.warning(
+                                "Output filename '%s' contained path 
components, "
+                                "using basename '%s'",
+                                fname,
+                                filename,
+                            )
                         if not filename.endswith(ext):
                             filename += ext
                     else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-7.17.1/tests/preprocessors/test_extractoutput.py 
new/nbconvert-7.17.2/tests/preprocessors/test_extractoutput.py
--- old/nbconvert-7.17.1/tests/preprocessors/test_extractoutput.py      
2020-02-02 01:00:00.000000000 +0100
+++ new/nbconvert-7.17.2/tests/preprocessors/test_extractoutput.py      
2020-02-02 01:00:00.000000000 +0100
@@ -4,6 +4,7 @@
 # Distributed under the terms of the Modified BSD License.
 
 import json
+import os
 
 from nbconvert.preprocessors.extractoutput import ExtractOutputPreprocessor
 
@@ -84,3 +85,24 @@
 
         # Verify equivalence of extracted outputs.
         self.assertEqual(sorted(outputs), sorted(reference_files))
+
+    def test_filename_path_traversal(self):
+        """Are path components stripped from output filename metadata?"""
+        for name in ["/tmp/evil.png", "../../evil.png", "sub/evil.png"]:
+            nb = self.build_notebook()
+            nb.cells[0].outputs[6].metadata["filename"] = name
+            res = self.build_resources()
+            res["output_files_dir"] = "nb_files"
+            nb, res = self.build_preprocessor()(nb, res)
+            expected = os.path.join("nb_files", "evil.png")
+            
self.assertEqual(nb.cells[0].outputs[6].metadata.filenames["image/png"], 
expected)
+            self.assertEqual(res["outputs"][expected], b"g")
+
+    def test_filename_empty_basename(self):
+        """Is an output whose filename metadata has an empty basename 
skipped?"""
+        nb = self.build_notebook()
+        nb.cells[0].outputs[6].metadata["filename"] = "../../../tmp/"
+        res = self.build_resources()
+        nb, res = self.build_preprocessor()(nb, res)
+        self.assertNotIn("image/png", 
nb.cells[0].outputs[6].metadata.get("filenames", {}))
+        self.assertNotIn(b"g", res["outputs"].values())

Reply via email to