- Create backend/services/image_storage.py with 4 core functions:
- sanitize_filename(): remove unsafe chars, limit to 255 chars, convert to lowercase
- get_unique_filename(): handle collisions with UUID suffix (format: {name}_{uuid8}_{variant}.jpg)
- ensure_image_directories(): create /images/ root and category subdirs on startup
- save_image(): save bytes to /images/{category}/{filename}, returns relative path
- Create comprehensive test suite (22 tests) covering all functionality
- Integrate ensure_image_directories() into FastAPI startup event
- Directory structure: /images/{category}/{filename}
- Collision handling: auto-suffix with UUID if filename exists
- All tests passing, pathlib.Path for safe operations
47 lines
2.1 KiB
Python
47 lines
2.1 KiB
Python
"""
|
|
passlib.utils.des - DEPRECATED LOCATION, WILL BE REMOVED IN 2.0
|
|
|
|
This has been moved to :mod:`passlib.crypto.des`.
|
|
"""
|
|
#=============================================================================
|
|
# import from new location
|
|
#=============================================================================
|
|
from warnings import warn
|
|
warn("the 'passlib.utils.des' module has been relocated to 'passlib.crypto.des' "
|
|
"as of passlib 1.7, and the old location will be removed in passlib 2.0",
|
|
DeprecationWarning)
|
|
|
|
#=============================================================================
|
|
# relocated functions
|
|
#=============================================================================
|
|
from passlib.utils.decor import deprecated_function
|
|
from passlib.crypto.des import expand_des_key, des_encrypt_block, des_encrypt_int_block
|
|
|
|
expand_des_key = deprecated_function(deprecated="1.7", removed="1.8",
|
|
replacement="passlib.crypto.des.expand_des_key")(expand_des_key)
|
|
|
|
des_encrypt_block = deprecated_function(deprecated="1.7", removed="1.8",
|
|
replacement="passlib.crypto.des.des_encrypt_block")(des_encrypt_block)
|
|
|
|
des_encrypt_int_block = deprecated_function(deprecated="1.7", removed="1.8",
|
|
replacement="passlib.crypto.des.des_encrypt_int_block")(des_encrypt_int_block)
|
|
|
|
#=============================================================================
|
|
# deprecated functions -- not carried over to passlib.crypto.des
|
|
#=============================================================================
|
|
import struct
|
|
_unpack_uint64 = struct.Struct(">Q").unpack
|
|
|
|
@deprecated_function(deprecated="1.6", removed="1.8",
|
|
replacement="passlib.crypto.des.des_encrypt_int_block()")
|
|
def mdes_encrypt_int_block(key, input, salt=0, rounds=1): # pragma: no cover -- deprecated & unused
|
|
if isinstance(key, bytes):
|
|
if len(key) == 7:
|
|
key = expand_des_key(key)
|
|
key = _unpack_uint64(key)[0]
|
|
return des_encrypt_int_block(key, input, salt, rounds)
|
|
|
|
#=============================================================================
|
|
# eof
|
|
#=============================================================================
|