Skip to content

Commit d5c6c3f

Browse files
committed
fix: address Dependabot security alerts and drop EOL Python 3.9
- Bump Pillow floor to >=12.1.1 (fixes CVE out-of-bounds write on PSD images, Dependabot #241) - Raise requires-python to >=3.10 (Pillow 12.1.1 requires it; Python 3.9 is EOL since Oct 2025) - Upgrade swiper to 12.1.3 (fixes prototype pollution, Dependabot #222) - Replace unmaintained react-helmet with react-helmet-async; wrap app in HelmetProvider (resolves React 19 peer dependency warning) - Drop Python 3.9 from CI matrix
1 parent 203f96a commit d5c6c3f

8 files changed

Lines changed: 53 additions & 376 deletions

File tree

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jobs:
3333
strategy:
3434
fail-fast: false
3535
matrix:
36-
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
36+
python-version: ["3.10", "3.11", "3.12", "3.13"]
3737

3838
steps:
3939
- uses: actions/checkout@v4

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ If you prefer not to use Docker or want to develop Fussel, you can install it lo
9595

9696
#### Prerequisites
9797

98-
- **Python** 3.9+
98+
- **Python** 3.10+
9999
- **uv** - Python package manager ([install](https://docs.astral.sh/uv/getting-started/installation/))
100100
- **Node.js** v18+ (LTS recommended)
101101
- **Yarn** 1.22+ (required)

fussel/web/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"bulma": "^1.0.4",
99
"react": "^19.2.3",
1010
"react-dom": "^19.2.3",
11-
"react-helmet": "^6.1.0",
11+
"react-helmet-async": "^3.0.0",
1212
"react-modal": "^3.16.3",
1313
"react-photo-album": "^3.4.0",
1414
"react-responsive-masonry": "^2.7.1",

fussel/web/src/component/App.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Collection from "./Collection";
55
import NotFound from "./NotFound";
66
import { site_data } from "../_gallery/site_data.js"
77
import { Routes, Route } from "react-router-dom";
8-
import { Helmet } from "react-helmet";
8+
import { Helmet, HelmetProvider } from "react-helmet-async";
99

1010
export default class App extends Component {
1111

@@ -15,6 +15,7 @@ export default class App extends Component {
1515

1616
render() {
1717
return (
18+
<HelmetProvider>
1819
<div>
1920
<Helmet>
2021
<title>{site_data['site_name']}</title>
@@ -38,6 +39,7 @@ export default class App extends Component {
3839
</Routes>
3940

4041
</div>
42+
</HelmetProvider>
4143
);
4244
}
4345
}

fussel/web/src/component/App.test.jsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,10 @@ vi.mock('./NotFound', () => ({
4444
}));
4545

4646
// Mock Helmet
47-
vi.mock('react-helmet', () => {
48-
return {
49-
Helmet: ({ children }) => <div data-testid="helmet">{children}</div>
50-
};
51-
});
47+
vi.mock('react-helmet-async', () => ({
48+
HelmetProvider: ({ children }) => <>{children}</>,
49+
Helmet: ({ children }) => <div data-testid="helmet">{children}</div>
50+
}));
5251

5352
describe('App', () => {
5453
it('should render Helmet with site name', () => {

fussel/web/yarn.lock

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,6 +1293,13 @@ indent-string@^4.0.0:
12931293
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
12941294
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
12951295

1296+
invariant@^2.2.4:
1297+
version "2.2.4"
1298+
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
1299+
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
1300+
dependencies:
1301+
loose-envify "^1.0.0"
1302+
12961303
is-fullwidth-code-point@^3.0.0:
12971304
version "3.0.0"
12981305
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
@@ -1584,20 +1591,19 @@ react-dom@^19.2.3:
15841591
dependencies:
15851592
scheduler "^0.27.0"
15861593

1587-
react-fast-compare@^3.1.1:
1594+
react-fast-compare@^3.2.2:
15881595
version "3.2.2"
15891596
resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz"
15901597
integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==
15911598

1592-
react-helmet@^6.1.0:
1593-
version "6.1.0"
1594-
resolved "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz"
1595-
integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==
1599+
react-helmet-async@^3.0.0:
1600+
version "3.0.0"
1601+
resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-3.0.0.tgz#16f31779ea4e4e01827c071b2f15301d074dd570"
1602+
integrity sha512-nA3IEZfXiclgrz4KLxAhqJqIfFDuvzQwlKwpdmzZIuC1KNSghDEIXmyU0TKtbM+NafnkICcwx8CECFrZ/sL/1w==
15961603
dependencies:
1597-
object-assign "^4.1.1"
1598-
prop-types "^15.7.2"
1599-
react-fast-compare "^3.1.1"
1600-
react-side-effect "^2.1.0"
1604+
invariant "^2.2.4"
1605+
react-fast-compare "^3.2.2"
1606+
shallowequal "^1.1.0"
16011607

16021608
react-is@^16.13.1:
16031609
version "16.13.1"
@@ -1654,11 +1660,6 @@ [email protected]:
16541660
cookie "^1.0.1"
16551661
set-cookie-parser "^2.6.0"
16561662

1657-
react-side-effect@^2.1.0:
1658-
version "2.1.2"
1659-
resolved "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz"
1660-
integrity sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==
1661-
16621663
react@^19.2.3:
16631664
version "19.2.3"
16641665
resolved "https://registry.npmjs.org/react/-/react-19.2.3.tgz"
@@ -1743,6 +1744,11 @@ set-cookie-parser@^2.6.0:
17431744
resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz"
17441745
integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==
17451746

1747+
shallowequal@^1.1.0:
1748+
version "1.1.0"
1749+
resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
1750+
integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
1751+
17461752
shebang-command@^2.0.0:
17471753
version "2.0.0"
17481754
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -1850,9 +1856,9 @@ supports-color@^7.1.0:
18501856
has-flag "^4.0.0"
18511857

18521858
swiper@^12.0.3:
1853-
version "12.0.3"
1854-
resolved "https://registry.npmjs.org/swiper/-/swiper-12.0.3.tgz"
1855-
integrity sha512-BHd6U1VPEIksrXlyXjMmRWO0onmdNPaTAFduzqR3pgjvi7KfmUCAm/0cj49u2D7B0zNjMw02TSeXfinC1hDCXg==
1859+
version "12.1.3"
1860+
resolved "https://registry.yarnpkg.com/swiper/-/swiper-12.1.3.tgz#0fd256e6ee043c85c077b0fa48faef7ed6acb051"
1861+
integrity sha512-XcWlVmkHFICI4fuoJKgbp8PscDcS4i7pBH8nwJRBi3dpQvhCySwsWRYm4bOf/BzKVWkHOYaFw7qz9uBSrY3oug==
18561862

18571863
symbol-tree@^3.2.4:
18581864
version "3.2.4"

pyproject.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ name = "fussel"
77
version = "1.0.0"
88
description = "A static photo gallery generator"
99
readme = "README.md"
10-
requires-python = ">=3.9"
10+
requires-python = ">=3.10"
1111
license = {text = "MIT"}
1212
authors = [
1313
{name = "Fussel Contributors"}
@@ -18,15 +18,14 @@ classifiers = [
1818
"Intended Audience :: End Users/Desktop",
1919
"License :: OSI Approved :: MIT License",
2020
"Programming Language :: Python :: 3",
21-
"Programming Language :: Python :: 3.9",
2221
"Programming Language :: Python :: 3.10",
2322
"Programming Language :: Python :: 3.11",
2423
"Programming Language :: Python :: 3.12",
2524
"Programming Language :: Python :: 3.13",
2625
]
2726

2827
dependencies = [
29-
"Pillow>=10.4.0",
28+
"Pillow>=12.1.1",
3029
"beautifulsoup4>=4.12.3",
3130
"python-slugify>=8.0.4",
3231
"pyyaml>=6.0.2",

0 commit comments

Comments
 (0)