fix(cert-server): autorise les noms Unicode (espaces insécables) à l'import
La whitelist ASCII de safe_name rejetait les noms copiés depuis Windows contenant des espaces insécables (U+00A0) ou d'autres caractères Unicode, d'où « nom invalide » sur des fichiers au format DN pourtant valides. Passage à une blacklist : tout nom est accepté sauf séparateurs de chemin (/, \), « . » / « .. », noms vides et caractères de contrôle — la protection anti-traversal reste identique. Suppression de l'import re devenu inutile. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
f3c490322e
commit
baeeb11f84
1 changed files with 8 additions and 5 deletions
|
|
@ -13,7 +13,7 @@ Usage :
|
||||||
Sert la RACINE du projet (parent), donc les 3 apps + le switcher fonctionnent.
|
Sert la RACINE du projet (parent), donc les 3 apps + le switcher fonctionnent.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sys, os, json, base64, shutil, re
|
import sys, os, json, base64, shutil
|
||||||
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
|
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
|
||||||
|
|
||||||
PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 8000
|
PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 8000
|
||||||
|
|
@ -23,12 +23,15 @@ ROOT = os.path.dirname(SCRIPT_DIR) # racine projet
|
||||||
WORK = os.path.join(SCRIPT_DIR, "LISTS_ALL_CERT") # dossier de travail (disque)
|
WORK = os.path.join(SCRIPT_DIR, "LISTS_ALL_CERT") # dossier de travail (disque)
|
||||||
ARCH = os.path.join(WORK, "archives")
|
ARCH = os.path.join(WORK, "archives")
|
||||||
|
|
||||||
SAFE = re.compile(r"^[A-Za-z0-9._@\-,=+*() ]+$") # noms de dossier/fichier autorisés (incl. DN : « CN=x, OU=y »)
|
# Blacklist plutôt que whitelist : on autorise tout nom (DN avec « , = » et
|
||||||
|
# espaces, y compris insécables/Unicode venant de Windows) SAUF ce qui permet
|
||||||
|
# de sortir du dossier ou de casser le FS.
|
||||||
def safe_name(n):
|
def safe_name(n):
|
||||||
n = (n or "").strip()
|
n = (n or "").strip()
|
||||||
if not n or n in (".", "..") or "/" in n or "\\" in n or not SAFE.match(n):
|
if (not n or n in (".", "..")
|
||||||
|
or "/" in n or "\\" in n
|
||||||
|
or "\x00" in n
|
||||||
|
or any(ord(c) < 32 or ord(c) == 0x7f for c in n)): # caractères de contrôle
|
||||||
raise ValueError("nom invalide: %r" % n)
|
raise ValueError("nom invalide: %r" % n)
|
||||||
return n
|
return n
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue