Skip to content

Commit e2aca1a

Browse files
Add Segment-Trait validation
Throw InvalidSegmentTraitError when there is an invalid segment trait combination. Signed-off-by: Elijah Swift <elijah.swift@ibm.com>
1 parent a4ea8e6 commit e2aca1a

File tree

4 files changed

+39
-3
lines changed

4 files changed

+39
-3
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
"""Exception to use when the user passes invalid segment-trait(s) in the traits dictionary."""
2+
3+
4+
class InvalidSegmentTraitError(Exception):
5+
"""
6+
Raised when a user passes an invalid segment-trait combination in the traits dictionary.
7+
"""
8+
9+
def __init__(self, invalid_traits: list) -> None:
10+
self.message = "Building of Security Request failed.\n\n"
11+
for trait in invalid_traits:
12+
self.message += (
13+
"Could not find "
14+
+ f"'{trait}' in valid segment traits for the requested operation.\n"
15+
)
16+
17+
def __str__(self) -> str:
18+
return self.message

pyracf/common/security_admin.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from datetime import datetime
66
from typing import Any, List, Tuple, Union
77

8+
from .invalid_segment_trait_error import InvalidSegmentTraitError
89
from .irrsmo00 import IRRSMO00
910
from .logger import Logger
1011
from .security_request import SecurityRequest
@@ -266,9 +267,21 @@ def _build_bool_segment_dictionaries(self, segments: dict) -> None:
266267

267268
def _build_segment_dictionaries(self, traits: dict) -> None:
268269
"""Build segemnt dictionaries for each segment."""
270+
invalid_traits = []
269271
for trait in traits:
272+
trait_valid = False
270273
for segment in self._valid_segment_traits:
271-
self.__validate_and_add_trait(trait, segment, traits[trait])
274+
trait_valid = self.__validate_and_add_trait(
275+
trait, segment, traits[trait]
276+
)
277+
if trait_valid:
278+
break
279+
if not trait_valid:
280+
invalid_traits.append(trait)
281+
282+
if invalid_traits:
283+
raise InvalidSegmentTraitError(invalid_traits)
284+
272285
# preserve segment traits for debug logging.
273286
self.__preserved_segment_traits = self._segment_traits
274287

tests/user/test_user_constants.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,12 +229,16 @@ def get_sample(sample_file: str) -> Union[str, bytes]:
229229
# ============================================================================
230230

231231
# Alter User Traits
232-
TEST_ALTER_USER_CSDATA_REQUEST_TRAITS = {
232+
TEST_ALTER_USER_CSDATA_AND_OMVS_REQUEST_TRAITS = {
233233
"base:special": False,
234234
"omvs:home": "/u/clarinet",
235235
"omvs:program": False,
236236
"csdata:tstcsfld": "testval",
237237
}
238+
TEST_ALTER_USER_CSDATA_REQUEST_TRAITS = {
239+
"base:special": False,
240+
"csdata:tstcsfld": "testval",
241+
}
238242

239243
# Valid Segment Traits Updates
240244
TEST_USER_REPLACE_SEGMENT_TRAITS = {

tests/user/test_user_request_builder.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ def test_user_admin_build_alter_request_update_existing_segment_traits(self):
104104
update_existing_segment_traits=TestUserConstants.TEST_USER_ADDITIONAL_SEGMENT_TRAITS,
105105
)
106106
result = user_admin.alter(
107-
"squidwrd", traits=TestUserConstants.TEST_ALTER_USER_CSDATA_REQUEST_TRAITS
107+
"squidwrd",
108+
traits=TestUserConstants.TEST_ALTER_USER_CSDATA_AND_OMVS_REQUEST_TRAITS,
108109
)
109110
self.assertEqual(
110111
result,

0 commit comments

Comments
 (0)