From 95dc7f90701e56fc1ad10f818cead19bb3a1ca2f Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Mon, 12 Oct 2026 11:54:05 -0700 Subject: [PATCH] Remove obsolete MD5 compatibility wrapper Inline the two callers, preserving usedforsecurity=False, which has been supported since Python 3.9. --- datasette/database.py | 6 ++++-- datasette/utils/__init__.py | 10 +--------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/datasette/database.py b/datasette/database.py index 542b3012..0fecc068 100644 --- a/datasette/database.py +++ b/datasette/database.py @@ -1,6 +1,7 @@ import asyncio import atexit import contextvars +import hashlib import inspect import os import queue @@ -58,7 +59,6 @@ from .utils import ( escape_sqlite, get_all_foreign_keys, get_outbound_foreign_keys, - md5_not_usedforsecurity, sqlite3, sqlite_timelimit, table_column_details, @@ -160,7 +160,9 @@ class Database: def color(self): if self.hash: return self.hash[:6] - return md5_not_usedforsecurity(self.name)[:6] + return hashlib.md5(self.name.encode("utf8"), usedforsecurity=False).hexdigest()[ + :6 + ] def suggest_name(self): if self.is_temp_disk: diff --git a/datasette/utils/__init__.py b/datasette/utils/__init__.py index ad39025f..0df0a871 100644 --- a/datasette/utils/__init__.py +++ b/datasette/utils/__init__.py @@ -957,7 +957,7 @@ def to_css_class(s): """ if css_class_re.match(s): return s - md5_suffix = md5_not_usedforsecurity(s)[:6] + md5_suffix = hashlib.md5(s.encode("utf8"), usedforsecurity=False).hexdigest()[:6] # Strip leading _, - s = s.lstrip("_").lstrip("-") # Replace any whitespace with hyphens @@ -1757,14 +1757,6 @@ def redact_keys(original: dict, key_patterns: Iterable) -> dict: return redact(original) -def md5_not_usedforsecurity(s): - try: - return hashlib.md5(s.encode("utf8"), usedforsecurity=False).hexdigest() - except TypeError: - # For Python 3.8 which does not support usedforsecurity=False - return hashlib.md5(s.encode("utf8")).hexdigest() - - _etag_cache = {}