Validate if requested svg icon is an svg

This commit is contained in:
Yarninator 2024-08-05 13:37:03 +02:00
parent 2b096baa88
commit a659bbfffc
5 changed files with 36 additions and 3 deletions

4
icons/cart.svg Normal file
View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.29977 5H21L19 12H7.37671M20 16H8L6 3H3M9 20C9 20.5523 8.55228 21 8 21C7.44772 21 7 20.5523 7 20C7 19.4477 7.44772 19 8 19C8.55228 19 9 19.4477 9 20ZM20 20C20 20.5523 19.5523 21 19 21C18.4477 21 18 20.5523 18 20C18 19.4477 18.4477 19 19 19C19.5523 19 20 19.4477 20 20Z" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 594 B

View file

@ -1,7 +1,7 @@
from src.classes import product_classes from src.classes import product_classes
pizza = product_classes.Product(name="Pizza", price=3.0, barcode=1000 , image_filename="pizza.svg") pizza = product_classes.Product(name="Pizza", price=3.0, barcode=1000 , image_filename="pizza")
banana = product_classes.Product(name="Banana", price=1.0, barcode=1001 ,image_filename="banana.svg") banana = product_classes.Product(name="Banana", price=1.0, barcode=1001 ,image_filename="banana")
product_list = [pizza, banana] product_list = [pizza, banana]

View file

@ -1,9 +1,11 @@
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse from fastapi.responses import FileResponse
import os
from src.classes import product_classes from src.classes import product_classes
from src.config import definitions from src.config import definitions
from validators import image_validator
from src import data_connection from src import data_connection
app = FastAPI() app = FastAPI()
@ -20,6 +22,7 @@ app.add_middleware(
allow_headers=["*"], allow_headers=["*"],
) )
@app.get("/") @app.get("/")
def read_root(): def read_root():
return {"Hello": "World"} return {"Hello": "World"}
@ -34,5 +37,8 @@ def get_single_product(barcode: int):
@app.get("/icons/{icon_filename}", response_class=FileResponse) @app.get("/icons/{icon_filename}", response_class=FileResponse)
def get_icon(icon_filename: str): def get_icon(icon_filename: str):
full_filepath = f"{definitions.ICONS_PATH}/{icon_filename}" full_filepath = os.path.join(definitions.ICONS_PATH, icon_filename) + ".svg"
assert os.path.exists(full_filepath), f"File {full_filepath} not found"
assert image_validator.is_valid_svg(full_filepath), f"File {full_filepath} is not a valid image"
return full_filepath return full_filepath

0
validators/__init__.py Normal file
View file

View file

@ -0,0 +1,23 @@
import re
from PIL import Image
def is_valid_image(file_name):
try:
with Image.open(file_name) as img:
img.verify()
return True
except (IOError, SyntaxError):
return False
def is_valid_svg(file_name):
SVG_R = r'(?:<\?xml\b[^>]*>[^<]*)?(?:<!--.*?-->[^<]*)*(?:<svg|<!DOCTYPE svg)\b'
SVG_RE = re.compile(SVG_R, re.DOTALL)
file_object = open(file_name, 'r')
file_contents = file_object.read()
is_svg = SVG_RE.match(file_contents) is not None
return is_svg