diff --git a/python_tests/conftest.py b/python_tests/conftest.py index dd1159ed..1f89efcc 100644 --- a/python_tests/conftest.py +++ b/python_tests/conftest.py @@ -99,6 +99,25 @@ def create_resource(delete_resource): run_tso_command(f"SETROPTS RACLIST({class_name}) REFRESH") yield profile_name, class_name +@pytest.fixture +def delete_resource_in_search_class(): + profile_name=f"SEARTEST.DISCRETE{secrets.token_hex(2)}.**".upper() + class_name = "SEARTEST" + yield profile_name, class_name + try: # noqa: SIM105 + run_tso_command(f"RDELETE {class_name} ({profile_name})") + except: # noqa: E722 + pass + +@pytest.fixture +def create_resource_in_search_class(delete_resource_in_search_class): + """Create a new resource profile for a test""" + profile_name, class_name = delete_resource_in_search_class + run_tso_command(f"RDEFINE {class_name} {profile_name} DATA('RESOURCE PROFILE GENERATED DURING SEAR TESTING, NOT IMPORTANT') OWNER(SYS1) FGENERIC") # noqa: E501 + run_tso_command(f"SETROPTS GENERIC({class_name}) REFRESH") + run_tso_command(f"SETROPTS RACLIST({class_name}) REFRESH") + yield profile_name, class_name + @pytest.fixture def delete_keyring(): ring_name=f"SEARTEST.RING{secrets.token_hex(2)}".upper() diff --git a/python_tests/helper.py b/python_tests/helper.py index 8f2c0018..4fad9165 100644 --- a/python_tests/helper.py +++ b/python_tests/helper.py @@ -38,4 +38,11 @@ "racf_return_code": 4, "saf_return_code": 4, "sear_return_code": 4, + } + +successful_return_codes_search = { + "racf_reason_code": 4, + "racf_return_code": 4, + "saf_return_code": 4, + "sear_return_code": 0, } \ No newline at end of file diff --git a/python_tests/test_search.py b/python_tests/test_search.py index e648e959..d400371d 100644 --- a/python_tests/test_search.py +++ b/python_tests/test_search.py @@ -1,5 +1,5 @@ -from helper import successful_return_codes +from helper import successful_return_codes, successful_return_codes_search # Import SEAR from sear import sear @@ -36,4 +36,44 @@ def test_search_resource_profiles_nonexistent_class(): }, ) assert "errors" in str(search_result.result) - assert search_result.result["return_codes"] != successful_return_codes \ No newline at end of file + assert search_result.result["return_codes"] != successful_return_codes + +def test_search_resource_profiles_all(): + """This test is supposed to succeed""" + search_result = sear( + { + "operation": "search", + "admin_type": "resource", + "class": "seartest", + }, + ) + assert "errors" not in str(search_result.result) + assert search_result.result["return_codes"] == successful_return_codes_search + +def test_search_resource_profiles_filter(): + """This test is supposed to succeed""" + search_result = sear( + { + "operation": "search", + "admin_type": "resource", + "class": "seartest", + "resource_filter": "filter", + }, + ) + assert "errors" not in str(search_result.result) + assert search_result.result["return_codes"] == successful_return_codes + +def test_search_resource_profiles_discrete(create_resource_in_search_class): + """This test is supposed to succeed""" + profile_name, class_name = create_resource_in_search_class + search_result = sear( + { + "operation": "search", + "admin_type": "resource", + "class": class_name, + "resource_filter": f"{profile_name}", + }, + ) + assert "errors" not in str(search_result.result) + assert profile_name in search_result.result["profiles"] + assert search_result.result["return_codes"] == successful_return_codes \ No newline at end of file diff --git a/sear/irrseq00/profile_extractor.cpp b/sear/irrseq00/profile_extractor.cpp index ba3960ec..c257e3ce 100644 --- a/sear/irrseq00/profile_extractor.cpp +++ b/sear/irrseq00/profile_extractor.cpp @@ -153,8 +153,14 @@ void ProfileExtractor::extract(SecurityRequest &request) { function_code = save_function_code; p_arg_area->args.function_code = function_code; - p_arg_area->arg_pointers.p_profile_extract_parms->flags |= + if (function_code == DATASET_EXTRACT_NEXT_FUNCTION_CODE) { + p_arg_area->arg_pointers.p_profile_extract_parms->flags |= htonl(0x14000000); + } else { + p_arg_area->arg_pointers.p_profile_extract_parms->flags = + htonl(0x04000000); + } + // Call R_Admin Logger::getInstance().debug("Calling IRRSEQ00 ..."); @@ -170,12 +176,17 @@ void ProfileExtractor::extract(SecurityRequest &request) { p_arg_area->args.p_result_buffer != nullptr && (function_code == USER_EXTRACT_NEXT_FUNCTION_CODE || function_code == GROUP_EXTRACT_NEXT_FUNCTION_CODE || - function_code == DATASET_EXTRACT_NEXT_FUNCTION_CODE || - function_code == RESOURCE_EXTRACT_NEXT_FUNCTION_CODE)) { + function_code == RESOURCE_EXTRACT_NEXT_FUNCTION_CODE || + function_code == DATASET_EXTRACT_NEXT_FUNCTION_CODE)) { generic_extract_parms_results_t *p_save_generic_result; - p_arg_area->arg_pointers.p_profile_extract_parms->flags |= + if (function_code == DATASET_EXTRACT_NEXT_FUNCTION_CODE) { + p_arg_area->arg_pointers.p_profile_extract_parms->flags |= htonl(0x14000000); + } else { + p_arg_area->arg_pointers.p_profile_extract_parms->flags = + htonl(0x04000000); + } do { p_save_generic_result =