Skip to content

Commit

Permalink
Add base, omvs, and tso, add user test, and add beta version getters …
Browse files Browse the repository at this point in the history
…and setters.

Signed-off-by: Leonard Carcaramo <lcarcaramo@ibm.com>
  • Loading branch information
lcarcaramo committed Oct 21, 2023
1 parent b9c0bb7 commit 8f3bd5e
Show file tree
Hide file tree
Showing 8 changed files with 626 additions and 12 deletions.
13 changes: 10 additions & 3 deletions pyracf/common/security_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -309,14 +309,21 @@ def _get_profile(
]

def _get_field(
self, profile: Union[dict, bytes], segment: str, field: str
self,
profile: Union[dict, bytes],
segment: str,
field: str,
string: bool = False,
) -> Union[bytes, Any, None]:
"""Extract the value of a field from a segment in a profile."""
if self.__generate_requests_only:
# Allows this function to work with "self.__generate_requests_only" mode.
return profile
try:
return profile[segment][field]
field = profile[segment][field]
if string and field is not None:
return str(field)
return field
except KeyError:
return None

Expand Down Expand Up @@ -611,7 +618,7 @@ def __add_key_value_pairs_to_segment(
if current_key not in segment:
segment[current_key] = []
values = [
self._cast_from_str(value)
str(self._cast_from_str(value))
for value in value.split()
if value != "NONE"
]
Expand Down
388 changes: 379 additions & 9 deletions pyracf/user/user_admin.py

Large diffs are not rendered by default.

38 changes: 38 additions & 0 deletions tests/user/test_user_constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@ def get_sample(sample_file: str) -> Union[str, bytes]:
TEST_EXTRACT_USER_RESULT_WITH_COMMAND_AUDIT_TRAIL_XML = get_sample(
"extract_user_result_with_command_audit_trail.xml"
)
TEST_EXTRACT_USER_RESULT_BASE_OVMS_TSO_REVOKE_RESUME_XML = get_sample(
"extract_user_result_base_omvs_tso_revoke_resume.xml"
)
TEST_EXTRACT_USER_RESULT_BASE_OMVS_TSO_REVOKE_RESUME_DICTIONARY = get_sample(
"extract_user_result_base_omvs_tso_revoke_resume.json"
)

# Delete User
TEST_DELETE_USER_RESULT_SUCCESS_XML = get_sample("delete_user_result_success.xml")
Expand All @@ -103,6 +109,9 @@ def get_sample(sample_file: str) -> Union[str, bytes]:

# Add User
TEST_ADD_USER_REQUEST_XML = get_sample("add_user_request.xml")
TEST_ADD_USER_BASE_OMVS_TSO_REVOKE_RESUME_REQUEST_XML = get_sample(
"add_user_request_base_omvs_tso_revoke_resume.xml"
)
TEST_ADD_USER_REQUEST_PASSWORD_XML = get_sample("add_user_request_password.xml")
TEST_ADD_USER_REQUEST_PASSPHRASE_XML = get_sample("add_user_request_passphrase.xml")
TEST_ADD_USER_REQUEST_PASSPHRASE_AND_PASSWORD_XML = get_sample(
Expand All @@ -117,6 +126,35 @@ def get_sample(sample_file: str) -> Union[str, bytes]:
"omvs:home_directory": "/u/squidwrd",
"omvs:default_shell": "/bin/sh",
}
TEST_ADD_USER_BASE_OMVS_TSO_REVOKE_RESUME_REQUEST_TRAITS = {
"base:name": "Squidward",
"base:password": "PASSWORD",
"base:owner": "LEONARD",
"base:revoke_date": "10/22/23",
"base:resume_date": "11/2/23",
"omvs:max_address_space_size": 10485760,
"omvs:max_cpu_time": 1500,
"omvs:max_files_per_process": 50,
"omvs:max_non_shared_memory": "4g",
"omvs:max_file_mapping_pages": 350,
"omvs:max_processes": 128,
"omvs:shared": True,
"omvs:max_shared_memory": "2g",
"omvs:max_therads": 48,
"omvs:uid": 1919,
"omvs:home_directory": "/u/squidward",
"omvs:default_shell": "/bin/sh",
"tso:account_number": "D999",
"tso:logon_command": "ISPF",
"tso:hold_class": "A",
"tso:max_region_size": 2048,
"tso:message_class": "O",
"tso:logon_procedure": "PROC",
"tso:region_size": 1024,
"tso:sysout_class": "O",
"tso:user_data": "ABCD",
"tso:data_set_allocation_unit": "SYSDA",
}
TEST_ADD_USER_REQUEST_TRAITS_PASSWORD = dict(TEST_ADD_USER_REQUEST_TRAITS)
TEST_ADD_USER_REQUEST_TRAITS_PASSWORD["base:password"] = "GIyTTqdF"
TEST_ADD_USER_REQUEST_TRAITS_PASSWORD_SIMPLE = dict(TEST_ADD_USER_REQUEST_TRAITS)
Expand Down
11 changes: 11 additions & 0 deletions tests/user/test_user_request_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,17 @@ def test_user_admin_build_add_user_request(self):
)
self.assertEqual(result, TestUserConstants.TEST_ADD_USER_REQUEST_XML)

def test_user_admin_build_add_user_base_omvs_tso_revoke_resume_request(self):
result = self.user_admin.add(
"squidwrd",
traits=TestUserConstants.TEST_ADD_USER_BASE_OMVS_TSO_REVOKE_RESUME_REQUEST_TRAITS,
)
print(result)
self.assertEqual(
result,
TestUserConstants.TEST_ADD_USER_BASE_OMVS_TSO_REVOKE_RESUME_REQUEST_XML,
)

def test_user_admin_build_alter_user_request(self):
result = self.user_admin.alter(
"squidwrd", traits=TestUserConstants.TEST_ALTER_USER_REQUEST_TRAITS
Expand Down
12 changes: 12 additions & 0 deletions tests/user/test_user_result_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,18 @@ def test_user_admin_can_parse_extract_user_and_ignore_command_audit_trail_xml(
TestUserConstants.TEST_EXTRACT_USER_RESULT_BASE_OMVS_SUCCESS_DICTIONARY,
)

def test_user_admin_can_parse_extract_user_base_omvs_tso_revoke_resume_success_xml(
self,
call_racf_mock: Mock,
):
call_racf_mock.return_value = (
TestUserConstants.TEST_EXTRACT_USER_RESULT_BASE_OVMS_TSO_REVOKE_RESUME_XML
)
self.assertEqual(
self.user_admin.extract("squidwrd", segments={"omvs": True, "tso": True}),
TestUserConstants.TEST_EXTRACT_USER_RESULT_BASE_OMVS_TSO_REVOKE_RESUME_DICTIONARY,
)

# ============================================================================
# Password and Password Phrase Redaction
# ============================================================================
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<securityrequest xmlns="http://www.ibm.com/systems/zos/saf" xmlns:racf="http://www.ibm.com/systems/zos/racf">
<user name="squidwrd" operation="set" requestid="UserRequest">
<base>
<name>Squidward</name>
<racf:password>********</racf:password>
<racf:owner>LEONARD</racf:owner>
<revokedate>10/22/23</revokedate>
<resumedate>11/2/23</resumedate>
</base>
<omvs>
<assize>10485760</assize>
<cputime>1500</cputime>
<filemax>50</filemax>
<memlim>4g</memlim>
<mmaparea>350</mmaparea>
<procmax>128</procmax>
<racf:shared />
<shmemmax>2g</shmemmax>
<uid>1919</uid>
<home>/u/squidward</home>
<pgm>/bin/sh</pgm>
</omvs>
<tso>
<acctnum>D999</acctnum>
<command>ISPF</command>
<holdclass>A</holdclass>
<maxsize>2048</maxsize>
<msgclass>O</msgclass>
<proc>PROC</proc>
<size>1024</size>
<sysclass>O</sysclass>
<userdata>ABCD</userdata>
<unit>SYSDA</unit>
</tso>
</user>
</securityrequest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
{
"securityResult": {
"user": {
"name": "SQUIDWRD",
"operation": "listdata",
"requestId": "UserRequest",
"commands": [
{
"safReturnCode": 0,
"returnCode": 0,
"reasonCode": 0,
"image": "LISTUSER SQUIDWRD OMVS TSO ",
"profiles": [
{
"base": {
"user": "squidwrd",
"name": "squidwrd",
"owner": "leonard",
"created": "10/21/2023",
"defaultGroup": "sys1",
"passwordDate": null,
"passwordInterval": 186,
"passphraseDate": null,
"attributes": [],
"revokeDate": "10/22/2023",
"resumeDate": "11/2/2023",
"lastAccess": "10/21/2023 12:20 PM",
"classAuthorizations": [],
"logonAllowedDays": "anyday",
"logonAllowedTime": "anytime",
"groups": {
"SYS1": {
"auth": "use",
"connectOwner": "leonard",
"connectDate": "10/21/2023",
"connects": 0,
"uacc": null,
"lastConnect": "unknown",
"connectAttributes": [],
"revokeDate": null,
"resumeDate": null
}
},
"securityLevel": null,
"categoryAuthorization": null,
"securityLabel": null
},
"omvs": {
"uid": 1919,
"homeDirectory": "/u/squidward",
"defaultShell": "/bin/sh",
"maxCpuTime": 1500,
"maxAddressSpaceSize": 10485760,
"maxFilesPerProcess": 50,
"maxProcesses": 128,
"maxThreads": null,
"maxFileMappingPages": 350,
"maxNonSharedMemory": "4g",
"maxSharedMemory": "2g"
},
"tso": {
"accountNumber": "d999",
"holdclass": "a",
"messageClass": "o",
"logonProcedure": "proc",
"regionSize": 1024,
"maxRegionSize": 2048,
"sysoutClass": "o",
"dataSetAllocationUnit": "sysda",
"userData": "abcd",
"logonCommand": "ispf"
}
}
]
}
]
},
"returnCode": 0,
"reasonCode": 0
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="IBM-1047"?>
<securityresult xmlns="http://www.ibm.com/systems/zos/saf/IRRSMO00Result1">
<user name="SQUIDWRD" operation="listdata" requestid="UserRequest">
<command>
<safreturncode>0</safreturncode>
<returncode>0</returncode>
<reasoncode>0</reasoncode>
<image>LISTUSER SQUIDWRD OMVS TSO </image>
<message>USER=SQUIDWRD NAME=SQUIDWRD OWNER=LEONARD CREATED=23.294</message>
<message> DEFAULT-GROUP=SYS1 PASSDATE=00.000 PASS-INTERVAL=186 PHRASEDATE=N/A</message>
<message> ATTRIBUTES=NONE</message>
<message> REVOKE DATE=OCTOBER 22, 2023 RESUME DATE=NOVEMBER 2, 2023</message>
<message> LAST-ACCESS=23.294/12:20:06</message>
<message> CLASS AUTHORIZATIONS=NONE</message>
<message> NO-INSTALLATION-DATA</message>
<message> NO-MODEL-NAME</message>
<message> LOGON ALLOWED (DAYS) (TIME)</message>
<message> ---------------------------------------------</message>
<message> ANYDAY ANYTIME</message>
<message> GROUP=SYS1 AUTH=USE CONNECT-OWNER=LEONARD CONNECT-DATE=23.294</message>
<message> CONNECTS= 00 UACC=NONE LAST-CONNECT=UNKNOWN</message>
<message> CONNECT ATTRIBUTES=NONE</message>
<message> REVOKE DATE=NONE RESUME DATE=NONE</message>
<message>SECURITY-LEVEL=NONE SPECIFIED</message>
<message>CATEGORY-AUTHORIZATION</message>
<message> NONE SPECIFIED</message>
<message>SECURITY-LABEL=NONE SPECIFIED</message>
<message> </message>
<message>OMVS INFORMATION</message>
<message>----------------</message>
<message>UID= 0000001919</message>
<message>HOME= /u/squidward</message>
<message>PROGRAM= /bin/sh</message>
<message>CPUTIMEMAX= 0000001500</message>
<message>ASSIZEMAX= 0010485760</message>
<message>FILEPROCMAX= 00000050</message>
<message>PROCUSERMAX= 00000128</message>
<message>THREADSMAX= NONE</message>
<message>MMAPAREAMAX= 00000350</message>
<message>MEMLIMIT= 4G</message>
<message>SHMEMMAX= 2G</message>
<message> </message>
<message>TSO INFORMATION</message>
<message>---------------</message>
<message>ACCTNUM= D999</message>
<message>HOLDCLASS= A</message>
<message>MSGCLASS= O</message>
<message>PROC= PROC</message>
<message>SIZE= 00001024</message>
<message>MAXSIZE= 00002048</message>
<message>SYSOUTCLASS= O</message>
<message>UNIT= SYSDA</message>
<message>USERDATA= ABCD</message>
<message>COMMAND= ISPF</message>
</command>
</user>
<returncode>0</returncode>
<reasoncode>0</reasoncode>
</securityresult>

0 comments on commit 8f3bd5e

Please sign in to comment.