fix(qualys): search_assets_api utilise XML body au lieu de JSON (API 5.0 attend XML, JSON donnait 400). Message d erreur enrichi avec le debut de la reponse

This commit is contained in:
Pierre & Lumière 2026-05-05 16:43:22 +02:00
parent 37faba382e
commit e7eecf0346

View File

@ -49,23 +49,31 @@ def search_assets_api(db, query, field="name", operator="CONTAINS", force_refres
proxies = {"https": qualys_proxy, "http": qualys_proxy} if qualys_proxy else None proxies = {"https": qualys_proxy, "http": qualys_proxy} if qualys_proxy else None
try: try:
from xml.sax.saxutils import escape as xml_escape
xml_body = (
"<ServiceRequest>"
"<preferences><limitResults>200</limitResults></preferences>"
"<filters>"
f"<Criteria field=\"{xml_escape(field)}\" operator=\"{xml_escape(operator)}\">"
f"{xml_escape(query)}</Criteria>"
"</filters>"
"</ServiceRequest>"
)
r = requests.post( r = requests.post(
f"{qualys_url}/qps/rest/5.0/search/am/hostasset", f"{qualys_url}/qps/rest/5.0/search/am/hostasset",
json={"ServiceRequest": { data=xml_body,
"preferences": {"limitResults": 200},
"filters": {"Criteria": [
{"field": field, "operator": operator, "value": query}
]}
}},
auth=(qualys_user, qualys_pass), auth=(qualys_user, qualys_pass),
verify=False, timeout=60, proxies=proxies, verify=False, timeout=60, proxies=proxies,
headers={"Content-Type": "application/json"} headers={"Content-Type": "text/xml", "X-Requested-With": "PatchCenter"}
) )
except Exception as e: except Exception as e:
return {"ok": False, "msg": f"Erreur API: {e}", "assets": []} return {"ok": False, "msg": f"Erreur API: {e}", "assets": []}
if r.status_code != 200 or "SUCCESS" not in r.text: if r.status_code != 200 or "SUCCESS" not in r.text:
return {"ok": False, "msg": f"API HTTP {r.status_code}", "assets": []} # Inclure le début du body pour faciliter le diagnostic
return {"ok": False,
"msg": f"API HTTP {r.status_code}{r.text[:200]}",
"assets": []}
assets = _parse_assets_full(r.text) assets = _parse_assets_full(r.text)
result = {"ok": True, "msg": f"{len(assets)} résultat(s)", "assets": assets, "from_cache": False} result = {"ok": True, "msg": f"{len(assets)} résultat(s)", "assets": assets, "from_cache": False}