qualys-cli 0.3.1__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/CHANGELOG.md +41 -0
  2. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/PKG-INFO +1 -1
  3. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/pyproject.toml +1 -1
  4. qualys_cli-0.3.2/src/qualys_cli/__init__.py +1 -0
  5. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/_docs/usage.html +3 -3
  6. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/audit.py +31 -0
  7. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/cli.py +2 -0
  8. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/client.py +35 -2
  9. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/ca.py +21 -13
  10. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/cs.py +11 -2
  11. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/csam.py +8 -1
  12. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/vm.py +7 -3
  13. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/was.py +51 -37
  14. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_error_handling.py +29 -0
  15. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_flair.py +18 -0
  16. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_kev.py +30 -0
  17. qualys_cli-0.3.2/tests/test_xml_injection.py +115 -0
  18. qualys_cli-0.3.1/src/qualys_cli/__init__.py +0 -1
  19. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/.gitignore +0 -0
  20. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/LICENSE +0 -0
  21. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/README.md +0 -0
  22. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/__main__.py +0 -0
  23. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/auth.py +0 -0
  24. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/cache.py +0 -0
  25. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/__init__.py +0 -0
  26. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/asset.py +0 -0
  27. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/edr.py +0 -0
  28. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/etm.py +0 -0
  29. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/fim.py +0 -0
  30. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/pc.py +0 -0
  31. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/pm.py +0 -0
  32. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/scanauth.py +0 -0
  33. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/sub.py +0 -0
  34. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/tc.py +0 -0
  35. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/commands/user.py +0 -0
  36. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/config.py +0 -0
  37. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/detection_stats.py +0 -0
  38. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/extras.py +0 -0
  39. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/flair.py +0 -0
  40. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/formatters.py +0 -0
  41. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/history.py +0 -0
  42. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/http_server.py +0 -0
  43. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/mcp_server.py +0 -0
  44. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/metrics.py +0 -0
  45. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/platforms.py +0 -0
  46. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/src/qualys_cli/queries.py +0 -0
  47. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/__init__.py +0 -0
  48. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/conftest.py +0 -0
  49. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_agent_mode.py +0 -0
  50. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_all_commands_smoke.py +0 -0
  51. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_asset.py +0 -0
  52. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_asset_tags.py +0 -0
  53. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_audit.py +0 -0
  54. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_ca.py +0 -0
  55. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_client.py +0 -0
  56. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_completion.py +0 -0
  57. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_csam.py +0 -0
  58. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_detection_stats.py +0 -0
  59. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_detection_stats_cmd.py +0 -0
  60. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_etm.py +0 -0
  61. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_features.py +0 -0
  62. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_fim_edr.py +0 -0
  63. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_formatters.py +0 -0
  64. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_global_flags.py +0 -0
  65. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_help.py +0 -0
  66. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_high_fixes.py +0 -0
  67. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_isolation.py +0 -0
  68. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_kcs_mitigation.py +0 -0
  69. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_main.py +0 -0
  70. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_mcp_live.py +0 -0
  71. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_med_fixes.py +0 -0
  72. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_pc.py +0 -0
  73. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_pm.py +0 -0
  74. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_resiliency.py +0 -0
  75. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_review_fixes.py +0 -0
  76. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_scanauth.py +0 -0
  77. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_security_fixes.py +0 -0
  78. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_sub.py +0 -0
  79. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_tc.py +0 -0
  80. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_user.py +0 -0
  81. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_vm.py +0 -0
  82. {qualys_cli-0.3.1 → qualys_cli-0.3.2}/tests/test_was.py +0 -0
@@ -6,6 +6,47 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.3.2] — 2026-11-11
10
+
11
+ ### Fixed
12
+ - `vm kb kev-qids` (and `vm host detection-stats --kev`) never completed:
13
+ 200-CVE knowledge-base chunks exceeded the 60 s read timeout on every
14
+ retry. Default chunk is now 50 (`QUALYS_KEV_CVE_CHUNK` still overrides;
15
+ values < 1 are clamped). Full CISA catalog resolves in ~2 minutes.
16
+ - `cs sensor get` help said "Sensor UUID", but the API only accepts the
17
+ short `sensorId` from `cs sensor list`; the `uuid` returns HTTP 404. Help
18
+ and docstring corrected (the argument and request are unchanged).
19
+ - HTTP 403 now renders as **Permission Denied** with "ask a Qualys
20
+ administrator" guidance instead of "Authentication Failed — run
21
+ `qualys-cli configure`", which could not fix a missing role or module.
22
+ Exit code (3) and the agentic `"type": "auth_error"` tag are unchanged;
23
+ the new `PermissionDeniedError` subclasses `AuthError`.
24
+ - The request spinner animated into pipes when the profile's output mode is
25
+ `interactive` (forced terminal rendering), burying error messages for
26
+ callers that capture stderr (e.g. the MCP server). It now only runs when
27
+ stderr is a real TTY.
28
+ - 5xx responses with an empty body no longer produce an empty error message.
29
+
30
+ ### Security
31
+ - XML injection (CWE-91): user-supplied values (names, comments, tag names,
32
+ filter values, IDs) were interpolated raw into WAS and Cloud Agent
33
+ `ServiceRequest` XML bodies, so a value like `x</name><evil/>` could add
34
+ elements to the request. All values are now escaped (`_x()`), and CDATA
35
+ sections split embedded `]]>` so they cannot be broken out of (`_cdata()`).
36
+ - Query-string injection: `ca agent ... --module`, `ca scan launch-ods
37
+ --scan-type`, and `csam report download` report names are URL-encoded, so
38
+ a value containing `&` can no longer append extra API parameters.
39
+ - `--dry-run` / `--explain` output redacted secrets in JSON bodies only; XML
40
+ and form-encoded string bodies are now redacted too (`<password>`,
41
+ `<clientSecret>`, `password=…`).
42
+ - `commands/was.py` is now marked hand-edited so `generate_commands.py`
43
+ cannot regenerate it and silently drop the escaping.
44
+
45
+ ### Docs
46
+ - `csam asset sn-export` documents a known issue: the route returns HTTP 404
47
+ on US2 for all three paths in Qualys's docs; likely requires the
48
+ ServiceNow/CMDB integration.
49
+
9
50
  ## [0.3.1] — 2026-11-04
10
51
 
11
52
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: qualys-cli
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Unified command-line interface for the Qualys Cloud Platform REST APIs (VM, PC, PM, ETM, WAS, TotalCloud, Cloud Agent, Container Security, CSAM, Subscription, Asset, and User management).
5
5
  Project-URL: Homepage, https://www.qualys.com
6
6
  Author-email: Qualys <support@qualys.com>
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "qualys-cli"
7
- version = "0.3.1"
7
+ version = "0.3.2"
8
8
  description = "Unified command-line interface for the Qualys Cloud Platform REST APIs (VM, PC, PM, ETM, WAS, TotalCloud, Cloud Agent, Container Security, CSAM, Subscription, Asset, and User management)."
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  license = { file = "LICENSE" }
@@ -0,0 +1 @@
1
+ __version__ = "0.3.2"