feat: integrate ClamAV for virus scanning of uploaded files and update pagination schema alias.

main
Cizz22 1 month ago
parent 4d5257986d
commit 47cacc50d2

14
poetry.lock generated

@ -393,6 +393,18 @@ files = [
{file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"},
]
[[package]]
name = "clamd"
version = "1.0.2"
description = "Clamd is a python interface to Clamd (Clamav daemon)."
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "clamd-1.0.2-py2.py3-none-any.whl", hash = "sha256:5c32546b7d1eb00fd6be00a889d79e00fbf980ed082826ccfa369bce3dcff5e7"},
{file = "clamd-1.0.2.tar.gz", hash = "sha256:d82a2fd814684a35a1b31feadafb2e69c8ebde9403613f6bdaa5d877c0f29560"},
]
[[package]]
name = "click"
version = "8.1.7"
@ -2811,4 +2823,4 @@ propcache = ">=0.2.1"
[metadata]
lock-version = "2.1"
python-versions = "^3.11"
content-hash = "9d879fd1a129aee9afcf93e7a1933a8d5b511a3bc3a09cb8b598a22835085716"
content-hash = "9d61d2415a02d2e9a0be0850394cd0d8dbf178f7a419e726cc9b3b1c37d8d4d1"

@ -31,6 +31,7 @@ dotenv = "^0.9.9"
aiohttp = "^3.12.14"
ijson = "^3.4.0"
redis = "^7.1.0"
clamd = "^1.0.2"
[build-system]

@ -1639,3 +1639,4 @@ yarl==1.20.1 ; python_version >= "3.11" and python_version < "4.0" \
--hash=sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce \
--hash=sha256:fe41919b9d899661c5c28a8b4b0acf704510b88f27f0934ac7a7bebdd8938d5e \
--hash=sha256:ff70f32aa316393eaf8222d518ce9118148eddb8a53073c2403863b41033eed5
clamd==1.0.2

@ -9,9 +9,11 @@ from sqlalchemy.orm import selectinload
from src.aeros_equipment.service import save_default_equipment
from src.aeros_simulation.service import save_default_simulation_node
from src.auth.service import CurrentUser
from src.config import WINDOWS_AEROS_BASE_URL, AEROS_BASE_URL
from src.config import WINDOWS_AEROS_BASE_URL, AEROS_BASE_URL, CLAMAV_HOST, CLAMAV_PORT
from src.database.core import DbSession
from src.database.service import search_filter_sort_paginate
import clamd
import io
from .model import AerosProject
from .schema import AerosProjectInput
@ -49,6 +51,30 @@ async def import_aro_project(*, db_session: DbSession, aeros_project_in: AerosPr
detail="File too large. Max size: 100Mb"
)
# ClamAV Scan
try:
cd = clamd.ClamdNetworkSocket(CLAMAV_HOST, CLAMAV_PORT)
scan_result = cd.instream(io.BytesIO(content))
# Result format: {'stream': ('FOUND', 'Eicar-Test-Signature')} or {'stream': ('OK', None)}
if scan_result and scan_result.get('stream') and scan_result['stream'][0] == 'FOUND':
raise HTTPException(
status_code=400,
detail=f"Virus detected: {scan_result['stream'][1]}"
)
except clamd.ConnectionError:
raise HTTPException(
status_code=500,
detail="Antivirus service unavailable"
)
except HTTPException:
raise
except Exception as e:
print(f"ClamAV error: {e}")
raise HTTPException(
status_code=500,
detail=f"Antivirus check failed: {str(e)}"
)
# Project name hardcode
# project_name = "trialapi"

@ -93,4 +93,7 @@ WINDOWS_AEROS_BASE_URL = config("WINDOWS_AEROS_BASE_URL", default="http://192.16
DEFAULT_PROJECT_NAME = config("DEFAULT_PROJECT_NAME", default="RBD TJB")
TEMPORAL_URL = config("TEMPORAL_URL", default="http://192.168.1.86:7233")
RELIABILITY_SERVICE_API = config("RELIABILITY_SERVICE_API", default="http://192.168.1.82:8000/reliability")
RELIABILITY_SERVICE_API = config("RELIABILITY_SERVICE_API", default="http://192.168.1.82:8000/reliability")
CLAMAV_HOST = config("CLAMAV_HOST", default="192.168.1.82")
CLAMAV_PORT = config("CLAMAV_PORT", cast=int, default=3310)

@ -8,7 +8,7 @@ class CommonParams(DefultBase):
# This ensures no extra query params are allowed
current_user: Optional[str] = Field(None, alias="currentUser")
page: int = Field(1, gt=0, lt=2147483647)
items_per_page: int = Field(5, gt=-2, lt=2147483647)
items_per_page: int = Field(5, gt=-2, lt=2147483647, alias="itemsPerPage")
query_str: Optional[str] = Field(None, alias="q")
filter_spec: Optional[str] = Field(None, alias="filter")
sort_by: List[str] = Field(default_factory=list, alias="sortBy[]")

Loading…
Cancel
Save