Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
7944648
Error Classification & Taxonomy
mmhw May 31, 2026
e60ba01
Fix/XSUP-67021/Demisto Lock fixed version issues (#44469)
MosheEichler May 31, 2026
e832421
cnon relevant (#44470)
Shir2611 May 31, 2026
df32cfa
Update CODEOWNERS (#44372)
dantavori May 31, 2026
f0e5c4c
Auto RN: sendmail-improve-arg-descriptions (#44306)
content-bot May 31, 2026
3c04614
migrate search delete emails o365 to msg (#44461)
content-bot May 31, 2026
701d3c2
Crtx 243858 (#44428)
lironcohen272 May 31, 2026
7fd0ea6
changed image (#44475)
noydavidi Jun 1, 2026
1901672
XDR Issue commands (#43340)
noydavidi Jun 1, 2026
c3208f2
Deprecated Security and Compliance – Content Search V2 integration (#…
noydavidi Jun 1, 2026
b28eedf
Azure Command Alignment batch2 (#44362)
RotemAmit Jun 1, 2026
637e636
inc current version onepassword (#44484)
Shir2611 Jun 1, 2026
eac4b96
Microsoftcommandsaddition (#44480)
content-bot Jun 1, 2026
0aa0037
Add exposure_management to pack metadata in CSF, Rapid7, Tenable, Qua…
amshamah419 Jun 1, 2026
5d05cdd
New: SecurityScorecard Event Collector (#44420)
YaelShamai Jun 1, 2026
a44cdac
HY/CRTX-250066/bumpSlackVersionBatch4 (#44464)
hyaffe839 Jun 2, 2026
a6d8415
bump corepacks platform 8.14 after batch 4 (#44492)
israelpoli Jun 2, 2026
96e907d
Xsup 69286 cid fix (#44488)
Shellyber Jun 2, 2026
6c8cd15
poetry files (#44485)
content-bot Jun 2, 2026
9f81adf
Update Server URL parameter description in GuardiCore v2 (#44490)
kamalq97 Jun 2, 2026
14ad815
fix code (#44498)
tcarmeli1 Jun 2, 2026
3e51846
Tenable sc ingest - updated _time mapping and default fetch interval …
content-bot Jun 2, 2026
fefd777
SplunkPyV2: added new commands (#44364)
ilappe Jun 3, 2026
73ec0de
Rubrik Release 1.7.0 (#44345)
content-bot Jun 3, 2026
2808520
CrwdStrike - improve memory consumption (#44474)
MLainer1 Jun 3, 2026
63bd06d
New Integration DFIRe (#44481)
content-bot Jun 3, 2026
dbcc6dc
Rubrikpolaris incident field fix (#44518)
kamalq97 Jun 3, 2026
3d6177b
Support adding multiple entries to client list in Akamai WAF (#44510)
content-bot Jun 3, 2026
0204c6b
VectraAI Release 2.1.4 (#44515)
content-bot Jun 3, 2026
cc34cb7
KOI: Add XSOAR marketplace support and graceful should_push_events ha…
dtroushinsky Jun 3, 2026
ba6dbcf
fix code (#44522)
tcarmeli1 Jun 3, 2026
654eb75
HY/CRTX-244513/AddEDRToAgentixActions (#44386)
hyaffe839 Jun 4, 2026
8a1eff9
add unified error messages and Agentix-aware return_error
mmhw Jun 4, 2026
3bfc07f
Merge remote-tracking branch 'origin' into MW/CRTX-248311/Error_Class…
mmhw Jun 10, 2026
442df48
Fix
mmhw Jun 11, 2026
cc02ccf
Merge remote-tracking branch 'origin' into MW/CRTX-248311/Error_Class…
mmhw Jun 11, 2026
258805c
Merge remote-tracking branch 'origin' into MW/CRTX-248311/Error_Class…
mmhw Jun 17, 2026
483ca5d
Update
mmhw Jun 21, 2026
2dedd31
Merge remote-tracking branch 'origin' into MW/CRTX-248311/Error_Class…
mmhw Jun 21, 2026
769f1b8
Added response_body
mmhw Jun 21, 2026
1c6a617
Fix
mmhw Jun 21, 2026
7a1cb70
restore MicrosoftTeams
mmhw Jun 21, 2026
a868ded
Fix
mmhw Jun 21, 2026
a3c2938
Merge remote-tracking branch 'origin/master' into MW/CRTX-248311/Erro…
mmhw Jun 23, 2026
8719ad3
Merge remote-tracking branch 'origin/master' into MW/CRTX-248311/Erro…
mmhw Jul 1, 2026
cad7966
Add Release Note
mmhw Jul 1, 2026
798ae29
Fix
mmhw Jul 1, 2026
dde4a6c
Fix
mmhw Jul 1, 2026
221a474
ai review
mmhw Jul 1, 2026
703e6ef
Fix error
mmhw Jul 2, 2026
a820122
Merge remote-tracking branch 'origin/master' into MW/CRTX-248311/Erro…
mmhw Jul 2, 2026
325e40a
Fix error
mmhw Jul 2, 2026
0b87d23
Fix error
mmhw Jul 2, 2026
0cba3ed
Fix error
mmhw Jul 2, 2026
6dff982
Merge branch 'MW/CRTX-248311/Error_Classification' into HY/CRTX-25733…
hyaffe839 Jul 5, 2026
c4761be
HY/CRTX-257330/standardized-error-messages/UpdateCase,ListIssues,List…
hyaffe839 Jul 5, 2026
8c3655e
tests
hyaffe839 Jul 5, 2026
e870f08
handle return error
hyaffe839 Jul 5, 2026
2e5debb
rn
hyaffe839 Jul 5, 2026
cda1e16
merge from master
hyaffe839 Jul 5, 2026
0de60fe
rn
hyaffe839 Jul 5, 2026
f66d892
CSP
hyaffe839 Jul 5, 2026
a44487e
Merge branch 'master' into HY/CRTX-257330/standardized-error-messages
hyaffe839 Jul 5, 2026
aadd131
Merged master into current branch.
Jul 5, 2026
c3cc789
Bump pack from version Core to 3.5.68.
Jul 5, 2026
914eadf
searchIndicator, searchAssets
hyaffe839 Jul 6, 2026
1085891
rn
hyaffe839 Jul 6, 2026
f8f93a4
3_5_66 revert
hyaffe839 Jul 6, 2026
0b4b062
remove test
hyaffe839 Jul 6, 2026
56ba744
raise CortexInvalidArgError
hyaffe839 Jul 6, 2026
35883db
ruff
hyaffe839 Jul 6, 2026
10ea872
Merge branch 'master' into HY/CRTX-257330/standardized-error-messages
hyaffe839 Jul 6, 2026
fde2006
Merged master into current branch.
Jul 7, 2026
e16f56f
Bump pack from version CommonScripts to 1.22.31.
Jul 7, 2026
d139f4a
Merged master into current branch.
Jul 7, 2026
9ba4170
Bump pack from version Core to 3.5.69.
Jul 7, 2026
39e70b7
Merge remote-tracking branch 'origin' into HY/CRTX-257330/standardize…
hyaffe839 Jul 7, 2026
7d1228d
merge from master
hyaffe839 Jul 7, 2026
c96bea5
pre commit
hyaffe839 Jul 7, 2026
14b440d
pre commit
hyaffe839 Jul 7, 2026
e04f5fc
pre commit
hyaffe839 Jul 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Packs/ApiModules/ReleaseNotes/2_4_34.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

#### Scripts

##### CoreIRApiModule

- Documentation and metadata improvements.
Original file line number Diff line number Diff line change
Expand Up @@ -4484,7 +4484,12 @@ def fix_array_value(match: Match[str]) -> str:
custom_filter = json.loads(fixed_json_str)

except Exception as e:
raise DemistoException(f"custom_filter format is not valid. got: {str(e)}")
raise CortexInvalidArgError(
"custom_filter",
value=custom_filter_str,
reason=str(e),
override_message=f"custom_filter format is not valid. got: {str(e)}",
)

if custom_filter: # if exists, add custom filter to the built filter
if not filter_dict:
Expand Down
2 changes: 1 addition & 1 deletion Packs/ApiModules/pack_metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "ApiModules",
"description": "API Modules",
"support": "xsoar",
"currentVersion": "2.4.33",
"currentVersion": "2.4.34",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
Expand Down
11 changes: 11 additions & 0 deletions Packs/CommonScripts/ReleaseNotes/1_22_31.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## Common Scripts

- Documentation and metadata improvements.

<!--
#### Scripts

##### SearchIndicatorAgentix

- Updated error handling to use `CortexInvalidArgError` instead of `DemistoException` when the `value` argument contains invalid JSON. This enables Agentix agents to programmatically classify the failure and decide whether to retry or fix the argument.
-->
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,12 @@ def build_query_for_indicator_values(args: dict) -> list:
try:
values_as_list = json.loads(values)
except (json.JSONDecodeError, TypeError) as e:
raise DemistoException(f"JSON decode failed for values {values}: {str(e)}.")
raise CortexInvalidArgError(
"value",
value=values,
reason=str(e),
override_message=f"JSON decode failed for values {values}: {str(e)}.",
)

if not values_as_list:
return []
Expand Down
2 changes: 1 addition & 1 deletion Packs/CommonScripts/pack_metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "Common Scripts",
"description": "Frequently used scripts pack.",
"support": "xsoar",
"currentVersion": "1.22.30",
"currentVersion": "1.22.31",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
Expand Down
80 changes: 67 additions & 13 deletions Packs/Core/Integrations/CortexPlatformCore/CortexPlatformCore.py
Original file line number Diff line number Diff line change
Expand Up @@ -2059,7 +2059,13 @@ def get_cases_command(client: Client, args: dict[str, Any]):

def get_cases_sort_order(sort_by_creation_time, sort_by_modification_time):
if sort_by_creation_time and sort_by_modification_time:
raise ValueError("Should be provide either sort_by_creation_time or sort_by_modification_time. Can't provide both")
raise CortexConflictingArgsError(
override_message="Should be provide either sort_by_creation_time or sort_by_modification_time. Can't provide both",
arguments=["sort_by_creation_time", "sort_by_modification_time"],
reason="Only one sort field can be specified at a time.",
resolution="Provide either sort_by_creation_time or sort_by_modification_time, not both.",
mutually_exclusive=True,
)

if sort_by_creation_time:
sort_field = "CREATION_TIME"
Expand Down Expand Up @@ -2307,7 +2313,12 @@ def search_assets_command(client: Client, args):
if page_size is None:
page_size = SEARCH_ASSETS_DEFAULT_LIMIT
if page_size > SEARCH_ASSETS_MAX_LIMIT:
raise ValueError(f"page_size cannot exceed {SEARCH_ASSETS_MAX_LIMIT}")
raise CortexInvalidArgError(
"page_size",
value=page_size,
reason=f"must not exceed {SEARCH_ASSETS_MAX_LIMIT}",
override_message=f"page_size cannot exceed {SEARCH_ASSETS_MAX_LIMIT}",
)

if page_size == 0: # 0 Maps to max in the API, we will maintain this behavior with our max value instead
page_size = SEARCH_ASSETS_MAX_LIMIT
Expand Down Expand Up @@ -3393,21 +3404,40 @@ def update_case_command(client: Client, args: dict) -> CommandResults:
custom_fields = parse_custom_fields(args.get("custom_fields", []))

if status == "resolved" and (not resolve_reason or not CaseManagement.STATUS_RESOLVED_REASON.get(resolve_reason, False)):
raise ValueError("In order to set the case to resolved, you must provide a resolve reason.")
raise CortexMissingArgError(
"resolve_reason",
override_message="In order to set the case to resolved, you must provide a resolve reason.",
)

if (resolve_reason or resolve_all_alerts or resolved_comment) and not status == "resolved":
raise ValueError(
"In order to use resolve_reason, resolve_all_alerts, or resolved_comment, the case status must be set to "
"'resolved'."
if (resolve_reason or resolve_all_alerts or resolved_comment) and status != "resolved":
conflicting = [arg for arg in ("resolve_reason", "resolve_all_alerts", "resolved_comment") if args.get(arg)]
raise CortexConflictingArgsError(
override_message=(
"In order to use resolve_reason, resolve_all_alerts, or resolved_comment, the case status must be set to "
"'resolved'."
),
arguments=conflicting + ["status"],
reason="resolve_reason, resolve_all_alerts, and resolved_comment can only be used when status is 'resolved'.",
resolution="Set status to 'resolved' or remove the resolution-specific arguments.",
)

if status and not CaseManagement.STATUS.get(status):
raise ValueError(f"Invalid status '{status}'. Valid statuses are: {list(CaseManagement.STATUS.keys())}")
raise CortexInvalidArgError(
"status",
value=status,
allowed_values=list(CaseManagement.STATUS.keys()),
override_message=f"Invalid status '{status}'. Valid statuses are: {list(CaseManagement.STATUS.keys())}",
)

if user_defined_severity and not CaseManagement.SEVERITY.get(user_defined_severity, False):
raise ValueError(
f"Invalid user_defined_severity '{user_defined_severity}'. Valid severities are: "
f"{list(CaseManagement.SEVERITY.keys())}"
raise CortexInvalidArgError(
"user_defined_severity",
value=user_defined_severity,
allowed_values=list(CaseManagement.SEVERITY.keys()),
override_message=(
f"Invalid user_defined_severity '{user_defined_severity}'. Valid severities are: "
f"{list(CaseManagement.SEVERITY.keys())}"
),
)

valid_fields_to_update, error_messages = validate_custom_fields(custom_fields, client)
Expand All @@ -3429,7 +3459,23 @@ def update_case_command(client: Client, args: dict) -> CommandResults:
remove_nulls_from_dictionary(case_update_payload)

if not case_update_payload:
raise ValueError(f"No valid update parameters provided.\n{error_messages}")
raise CortexMissingArgError(
[
"case_name",
"description",
"assignee",
"status",
"notes",
"starred",
"user_defined_severity",
"resolve_reason",
"resolved_comment",
"resolve_all_alerts",
"custom_fields",
],
require_one=True,
override_message=f"No valid update parameters provided.\n{error_messages}",
)

def is_bulk_update_allowed(case_update_payload: dict) -> bool:
# Bulk update supports only those fields
Expand Down Expand Up @@ -3562,7 +3608,15 @@ def repackage_to_update_case_format(case_list):

if error_messages:
return_results(command_results)
return_error(f"The following fields could not be updated:\n{error_messages}")
# The fields failed validation (unknown field, invalid value/type, system field),
# so surface a standardized INVALID_ARGUMENT error_code while keeping the
# original human-readable message for backward compatibility.
error = CortexInvalidArgError(
"custom_fields",
reason=error_messages,
override_message=f"The following fields could not be updated:\n{error_messages}",
)
return_error(error.build_message(), error=error)

return command_results

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -980,11 +980,12 @@ def test_search_assets_page_size_exceeds_max_raises():
WHEN:
search_assets_command is invoked.
THEN:
A ValueError is raised with a message mentioning the max value,
A CortexInvalidArgError is raised with a message mentioning the max value,
and no request is sent to the API.
"""
import pytest

from CommonServerPython import CortexInvalidArgError
from CortexPlatformCore import Client, SEARCH_ASSETS_MAX_LIMIT, search_assets_command

mock_client = Client(base_url="", headers={})
Expand All @@ -994,7 +995,7 @@ def test_search_assets_page_size_exceeds_max_raises():
with (
mock.patch.object(mock_client, "get_webapp_data") as mock_get_webapp_data,
mock.patch("CortexPlatformCore.get_asset_group_ids_from_names", return_value=[]),
pytest.raises(ValueError, match=str(SEARCH_ASSETS_MAX_LIMIT)),
pytest.raises(CortexInvalidArgError, match=str(SEARCH_ASSETS_MAX_LIMIT)),
):
search_assets_command(mock_client, {"page_size": str(SEARCH_ASSETS_MAX_LIMIT + 1)})

Expand Down Expand Up @@ -9010,9 +9011,10 @@ def test_update_case_command_status_resolved_without_reason_raises_error(mocker:
WHEN:
The update_case_command function is called.
THEN:
ValueError is raised indicating resolve_reason is required.
CortexMissingArgError is raised indicating resolve_reason is required.
"""
from CortexPlatformCore import update_case_command, Client
from CommonServerPython import CortexMissingArgError

client = Client(base_url="", headers={})

Expand All @@ -9021,7 +9023,7 @@ def test_update_case_command_status_resolved_without_reason_raises_error(mocker:
"status": "resolved",
}

with pytest.raises(ValueError, match="In order to set the case to resolved, you must provide a resolve reason"):
with pytest.raises(CortexMissingArgError, match="In order to set the case to resolved, you must provide a resolve reason"):
update_case_command(client, args)


Expand All @@ -9032,9 +9034,10 @@ def test_update_case_command_resolve_reason_without_resolved_status_raises_error
WHEN:
The update_case_command function is called.
THEN:
ValueError is raised indicating status must be resolved.
CortexConflictingArgsError is raised indicating status must be resolved.
"""
from CortexPlatformCore import update_case_command, Client
from CommonServerPython import CortexConflictingArgsError

client = Client(base_url="", headers={})

Expand All @@ -9044,7 +9047,7 @@ def test_update_case_command_resolve_reason_without_resolved_status_raises_error
"resolve_reason": "false_positive",
}

with pytest.raises(ValueError, match="the case status must be set to 'resolved'."):
with pytest.raises(CortexConflictingArgsError, match="the case status must be set to 'resolved'."):
update_case_command(client, args)


Expand All @@ -9055,9 +9058,10 @@ def test_update_case_command_invalid_status_raises_error(mocker: MockerFixture):
WHEN:
The update_case_command function is called.
THEN:
ValueError is raised indicating invalid status.
CortexInvalidArgError is raised indicating invalid status.
"""
from CortexPlatformCore import update_case_command, Client
from CommonServerPython import CortexInvalidArgError

client = Client(base_url="", headers={})

Expand All @@ -9066,7 +9070,7 @@ def test_update_case_command_invalid_status_raises_error(mocker: MockerFixture):
"status": "invalid_status",
}

with pytest.raises(ValueError, match="Invalid status 'invalid_status'"):
with pytest.raises(CortexInvalidArgError, match="Invalid status 'invalid_status'"):
update_case_command(client, args)


Expand All @@ -9077,9 +9081,10 @@ def test_update_case_command_invalid_severity_raises_error(mocker: MockerFixture
WHEN:
The update_case_command function is called.
THEN:
ValueError is raised indicating invalid severity.
CortexInvalidArgError is raised indicating invalid severity.
"""
from CortexPlatformCore import update_case_command, Client
from CommonServerPython import CortexInvalidArgError

client = Client(base_url="", headers={})

Expand All @@ -9088,7 +9093,7 @@ def test_update_case_command_invalid_severity_raises_error(mocker: MockerFixture
"user_defined_severity": "invalid_severity",
}

with pytest.raises(ValueError, match="Invalid user_defined_severity 'invalid_severity'"):
with pytest.raises(CortexInvalidArgError, match="Invalid user_defined_severity 'invalid_severity'"):
update_case_command(client, args)


Expand All @@ -9099,18 +9104,35 @@ def test_update_case_command_no_valid_parameters_raises_error(mocker: MockerFixt
WHEN:
The update_case_command function is called.
THEN:
ValueError is raised indicating no valid update parameters.
CortexMissingArgError is raised indicating no valid update parameters.
"""
from CortexPlatformCore import update_case_command, Client
from CommonServerPython import CortexMissingArgError

client = Client(base_url="", headers={})

args = {"case_id": "123"}

with pytest.raises(ValueError, match="No valid update parameters provided."):
with pytest.raises(CortexMissingArgError, match="No valid update parameters provided."):
update_case_command(client, args)


def test_get_cases_sort_order_both_sort_args_raises_error():
"""
GIVEN:
Both sort_by_creation_time and sort_by_modification_time are provided.
WHEN:
get_cases_sort_order is called.
THEN:
CortexConflictingArgsError is raised with the original message preserved.
"""
from CortexPlatformCore import get_cases_sort_order
from CommonServerPython import CortexConflictingArgsError

with pytest.raises(CortexConflictingArgsError, match="Can't provide both"):
get_cases_sort_order(sort_by_creation_time="asc", sort_by_modification_time="desc")


def test_update_case_command_non_bulk_fields_trigger_individual_update(mocker: MockerFixture):
"""
GIVEN:
Expand Down
19 changes: 19 additions & 0 deletions Packs/Core/ReleaseNotes/3_5_69.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@

#### Integrations

##### Investigation & Response

- Documentation and metadata improvements.

##### Indicators detection

- Documentation and metadata improvements.

##### Cortex Platform - Core

- Documentation and metadata improvements.

<!--

- Updated error handling in **core-update-case**, **core-get-cases**, and **core-get-issues** commands to use standardized Cortex exception classes (`CortexMissingArgError`, `CortexInvalidArgError`, `CortexConflictingArgsError`) instead of generic `ValueError`/`DemistoException`.
-->
2 changes: 1 addition & 1 deletion Packs/Core/pack_metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "Core",
"description": "Automates incident response",
"support": "xsoar",
"currentVersion": "3.5.68",
"currentVersion": "3.5.69",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
Expand Down
6 changes: 6 additions & 0 deletions Packs/CortexXDR/ReleaseNotes/6_3_31.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

#### Integrations

##### Palo Alto Networks Cortex XDR - Investigation and Response

- Documentation and metadata improvements.
2 changes: 1 addition & 1 deletion Packs/CortexXDR/pack_metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "Cortex XDR by Palo Alto Networks",
"description": "Automates Cortex XDR incident response, and includes custom Cortex XDR incident views and layouts to aid analyst investigations.",
"support": "xsoar",
"currentVersion": "6.3.30",
"currentVersion": "6.3.31",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
Expand Down
6 changes: 6 additions & 0 deletions Packs/ctf01/ReleaseNotes/1_1_9.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

#### Integrations

##### Cortex XDR - IR CTF

- Documentation and metadata improvements.
2 changes: 1 addition & 1 deletion Packs/ctf01/pack_metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "Capture The Flag - 01",
"description": "XSOAR's Capture the flag (CTF)",
"support": "xsoar",
"currentVersion": "1.1.8",
"currentVersion": "1.1.9",
"serverMinVersion": "8.2.0",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
Expand Down
Loading