1*** Settings ***
2Documentation    Test Redfish user account.
3
4Resource         ../../lib/resource.robot
5Resource         ../../lib/bmc_redfish_resource.robot
6Resource         ../../lib/openbmc_ffdc.robot
7Resource         ../../lib/bmc_redfish_utils.robot
8
9Library          SSHLibrary
10
11Test Setup       Redfish.Login
12Test Teardown    Test Teardown Execution
13
14*** Variables ***
15
16${account_lockout_duration}   ${30}
17${account_lockout_threshold}  ${3}
18
19${ssh_status}                 ${True}
20
21** Test Cases **
22
23Verify AccountService Available
24    [Documentation]  Verify Redfish account service is available.
25    [Tags]  Verify_AccountService_Available
26
27    ${resp} =  Redfish_utils.Get Attribute  /redfish/v1/AccountService  ServiceEnabled
28    Should Be Equal As Strings  ${resp}  ${True}
29
30
31Verify Redfish Admin User Persistence After Reboot
32    [Documentation]  Verify Redfish admin user persistence after reboot.
33    [Tags]  Verify_Redfish_Admin_User_Persistence_After_Reboot
34    [Setup]  Run Keywords  Redfish.Login  AND
35    ...  Redfish Create User  admin_user  TestPwd123  Administrator  ${True}
36    [Teardown]  Run Keywords  Redfish.Delete  /redfish/v1/AccountService/Accounts/admin_user
37    ...  AND  Test Teardown Execution
38
39    # Reboot BMC.
40    Redfish OBMC Reboot (off)  stack_mode=normal
41
42    # Verify users after reboot.
43    Redfish Verify User  admin_user     TestPwd123  Administrator   ${True}
44
45
46Verify Redfish Operator User Persistence After Reboot
47    [Documentation]  Verify Redfish operator user persistence after reboot.
48    [Tags]  Verify_Redfish_Operator_User_Persistence_After_Reboot
49    [Setup]  Run Keywords  Redfish.Login  AND
50    ...  Redfish Create User  operator_user  TestPwd123  Operator  ${True}
51    [Teardown]  Run Keywords  Redfish.Delete  /redfish/v1/AccountService/Accounts/operator_user
52    ...  AND  Test Teardown Execution
53
54    # Reboot BMC.
55    Redfish OBMC Reboot (off)  stack_mode=normal
56
57    # Verify users after reboot.
58    Redfish Verify User  operator_user  TestPwd123  Operator        ${True}
59
60
61Verify Redfish Readonly User Persistence After Reboot
62    [Documentation]  Verify Redfish readonly user persistence after reboot.
63    [Tags]  Verify_Redfish_Readonly_User_Persistence_After_Reboot
64    [Setup]  Run Keywords  Redfish.Login  AND
65    ...  Redfish Create User  readonly_user  TestPwd123  ReadOnly  ${True}
66    [Teardown]  Run Keywords  Redfish.Delete  /redfish/v1/AccountService/Accounts/readonly_user
67    ...  AND  Test Teardown Execution
68
69    # Reboot BMC.
70    Redfish OBMC Reboot (off)  stack_mode=normal
71
72    # Verify users after reboot.
73    Redfish Verify User  readonly_user  TestPwd123  ReadOnly        ${True}
74
75
76Redfish Create and Verify Admin User
77    [Documentation]  Create a Redfish user with administrator role and verify.
78    [Tags]  Redfish_Create_and_Verify_Admin_User
79    [Template]  Redfish Create And Verify User
80
81    #username      password    role_id         enabled
82    admin_user     TestPwd123  Administrator   ${True}
83
84
85Redfish Create and Verify Operator User
86    [Documentation]  Create a Redfish user with operator role and verify.
87    [Tags]  Redfish_Create_and_Verify_Operator_User
88    [Template]  Redfish Create And Verify User
89
90    #username      password    role_id         enabled
91    operator_user  TestPwd123  Operator        ${True}
92
93
94Redfish Create and Verify Readonly User
95    [Documentation]  Create a Redfish user with readonly role and verify.
96    [Tags]  Redfish_Create_and_Verify_Readonly_User
97    [Template]  Redfish Create And Verify User
98
99    #username      password    role_id         enabled
100    readonly_user  TestPwd123  ReadOnly        ${True}
101
102
103Verify Redfish Admin User With Wrong Password
104    [Documentation]  Verify Redfish admin user with wrong password.
105    [Tags]  Verify_Redfish_Admin_User_With_Wrong_Password
106    [Template]  Verify Redfish User with Wrong Password
107
108    #username      password    role_id         enabled  wrong_password
109    admin_user     TestPwd123  Administrator   ${True}  alskjhfwurh
110
111
112Verify Redfish Operator User with Wrong Password
113    [Documentation]  Verify Redfish operator user with wrong password.
114    [Tags]  Verify_Redfish_Operator_User_with_Wrong_Password
115    [Template]  Verify Redfish User with Wrong Password
116
117    #username      password    role_id         enabled  wrong_password
118    operator_user  TestPwd123  Operator        ${True}  12j8a8uakjhdaosiruf024
119
120
121Verify Redfish Readonly User With Wrong Password
122    [Documentation]  Verify Redfish readonly user with wrong password.
123    [Tags]  Verify_Redfish_Readonly_User_With_Wrong_Password
124    [Template]  Verify Redfish User with Wrong Password
125
126    #username      password    role_id         enabled  wrong_password
127    readonly_user  TestPwd123  ReadOnly        ${True}  12
128
129
130Verify Login with Deleted Redfish Admin User
131    [Documentation]  Verify login with deleted Redfish admin user.
132    [Tags]  Verify_Login_with_Deleted_Redfish_Admin_User
133    [Template]  Verify Login with Deleted Redfish User
134
135    #username     password    role_id         enabled
136    admin_user     TestPwd123  Administrator   ${True}
137
138
139Verify Login with Deleted Redfish Operator User
140    [Documentation]  Verify login with deleted Redfish operator user.
141    [Tags]  Verify_Login_with_Deleted_Redfish_Operator_User
142    [Template]  Verify Login with Deleted Redfish User
143
144    #username     password    role_id         enabled
145    operator_user  TestPwd123  Operator        ${True}
146
147
148Verify Login with Deleted Redfish Readonly User
149    [Documentation]  Verify login with deleted Redfish readonly user.
150    [Tags]  Verify_Login_with_Deleted_Redfish_Readonly_User
151    [Template]  Verify Login with Deleted Redfish User
152
153    #username     password    role_id         enabled
154    readonly_user  TestPwd123  ReadOnly        ${True}
155
156
157Verify Admin User Creation Without Enabling It
158    [Documentation]  Verify admin user creation without enabling it.
159    [Tags]  Verify_Admin_User_Creation_Without_Enabling_It
160    [Template]  Verify Create User Without Enabling
161
162    #username      password    role_id         enabled
163    admin_user     TestPwd123  Administrator   ${False}
164
165
166Verify Operator User Creation Without Enabling It
167    [Documentation]  Verify operator user creation without enabling it.
168    [Tags]  Verify_Operator_User_Creation_Without_Enabling_It
169    [Template]  Verify Create User Without Enabling
170
171    #username      password    role_id         enabled
172    operator_user  TestPwd123  Operator        ${False}
173
174
175Verify Readonly User Creation Without Enabling It
176    [Documentation]  Verify readonly user creation without enabling it.
177    [Tags]  Verify_Readonly_User_Creation_Without_Enabling_It
178    [Template]  Verify Create User Without Enabling
179
180    #username      password    role_id         enabled
181    readonly_user  TestPwd123  ReadOnly        ${False}
182
183
184Verify User Creation With Invalid Role Id
185    [Documentation]  Verify user creation with invalid role ID.
186    [Tags]  Verify_User_Creation_With_Invalid_Role_Id
187
188    # Make sure the user account in question does not already exist.
189    Redfish.Delete  /redfish/v1/AccountService/Accounts/test_user
190    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}]
191
192    # Create specified user.
193    ${payload}=  Create Dictionary
194    ...  UserName=test_user  Password=TestPwd123  RoleId=wrongroleid  Enabled=${True}
195    Redfish.Post  /redfish/v1/AccountService/Accounts/  body=&{payload}
196    ...  valid_status_codes=[${HTTP_BAD_REQUEST}]
197
198Verify Error Upon Creating Same Users With Different Privileges
199    [Documentation]  Verify error upon creating same users with different privileges.
200    [Tags]  Verify_Error_Upon_Creating_Same_Users_With_Different_Privileges
201
202    Redfish Create User  test_user  TestPwd123  Administrator  ${True}
203
204    # Create specified user.
205    ${payload}=  Create Dictionary
206    ...  UserName=test_user  Password=TestPwd123  RoleId=ReadOnly  Enabled=${True}
207    Redfish.Post  /redfish/v1/AccountService/Accounts/  body=&{payload}
208    ...  valid_status_codes=[${HTTP_BAD_REQUEST}]
209
210    Redfish.Delete  /redfish/v1/AccountService/Accounts/test_user
211
212
213Verify Modifying User Attributes
214    [Documentation]  Verify modifying user attributes.
215    [Tags]  Verify_Modifying_User_Attributes
216
217    # Create Redfish users.
218    Redfish Create User  admin_user     TestPwd123  Administrator   ${True}
219    Redfish Create User  readonly_user  TestPwd123  ReadOnly        ${True}
220
221    # Make sure the new user account does not already exist.
222    Redfish.Delete  /redfish/v1/AccountService/Accounts/newadmin_user
223    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}]
224
225    # Update admin_user username using Redfish.
226    ${payload}=  Create Dictionary  UserName=newadmin_user
227    Redfish.Patch  /redfish/v1/AccountService/Accounts/admin_user  body=&{payload}
228
229    # Update readonly_user role using Redfish.
230    ${payload}=  Create Dictionary  RoleId=Administrator
231    Redfish.Patch  /redfish/v1/AccountService/Accounts/readonly_user  body=&{payload}
232
233    # Verify users after updating
234    Redfish Verify User  newadmin_user  TestPwd123     Administrator   ${True}
235    Redfish Verify User  readonly_user  TestPwd123     Administrator   ${True}
236
237    # Delete created users.
238    Redfish.Delete  /redfish/v1/AccountService/Accounts/newadmin_user
239    Redfish.Delete  /redfish/v1/AccountService/Accounts/readonly_user
240
241
242Verify Modifying Operator User Attributes
243    [Documentation]  Verify modifying operator user attributes.
244    [Tags]  Verify_Modifying_Operator_User_Attributes
245    [Setup]  Run Keywords  Redfish.Login  AND
246    ...  Redfish Create User  operator_user  TestPwd123  Operator  ${True}
247    [Teardown]  Run Keywords  Redfish.Delete  /redfish/v1/AccountService/Accounts/operator_user
248    ...  AND  Test Teardown Execution
249
250    # Update operator_user password using Redfish.
251    ${payload}=  Create Dictionary  Password=NewTestPwd123
252    Redfish.Patch  /redfish/v1/AccountService/Accounts/operator_user  body=&{payload}
253
254    # Verify users after updating
255    Redfish Verify User  operator_user  NewTestPwd123  Operator        ${True}
256
257
258Verify User Account Locked
259    [Documentation]  Verify user account locked upon trying with invalid password.
260    [Tags]  Verify_User_Account_Locked
261
262    Redfish Create User  admin_user  TestPwd123  Administrator   ${True}
263
264    ${payload}=  Create Dictionary  AccountLockoutThreshold=${account_lockout_threshold}
265    ...  AccountLockoutDuration=${account_lockout_duration}
266    Redfish.Patch  ${REDFISH_ACCOUNTS_SERVICE_URI}  body=${payload}
267
268    Redfish.Logout
269
270    # Make ${account_lockout_threshold} failed login attempts.
271    Repeat Keyword  ${account_lockout_threshold} times
272    ...  Run Keyword And Expect Error  InvalidCredentialsError*  Redfish.Login  admin_user  abc123
273
274    # Verify that legitimate login fails due to lockout.
275    Run Keyword And Expect Error  InvalidCredentialsError*
276    ...  Redfish.Login  admin_user  TestPwd123
277
278    # Wait for lockout duration to expire and then verify that login works.
279    Sleep  ${account_lockout_duration}s
280    Redfish.Login  admin_user  TestPwd123
281
282    Redfish.Logout
283
284    Redfish.Login
285
286    Redfish.Delete  /redfish/v1/AccountService/Accounts/admin_user
287
288
289Verify User Account Unlock
290    [Documentation]  Verify manually unlocking the account before lockout time
291    [Tags]  Verify_User_Account_Unlock
292    [Teardown]  Run Keywords  Redfish.Logout
293    ...  AND  Redfish.Login
294    ...  AND  Redfish.Delete  /redfish/v1/AccountService/Accounts/test_user
295    ...  AND  SSHLibrary.Close All Connections
296
297    Redfish Create User  test_user  TestPwd123  Administrator  ${True}
298
299    ${payload}=  Create Dictionary
300    ...  AccountLockoutThreshold=${account_lockout_threshold}
301    ...  AccountLockoutDuration=${account_lockout_duration}
302    Redfish.Patch  ${REDFISH_ACCOUNTS_SERVICE_URI}  body=${payload}
303
304    Redfish.Logout
305
306    # Make ${account_lockout_threshold} failed login attempts.
307    Repeat Keyword  ${account_lockout_threshold} times
308    ...  Run Keyword And Expect Error  InvalidCredentialsError*
309    ...  Redfish.Login  test_user  abc123
310
311    # Ensure SSH Login with locked account gets failed
312    SSHLibrary.Open Connection  ${OPENBMC_HOST}
313    Run Keyword And Expect Error  Authentication failed*
314    ...  SSHLibrary.Login  test_user  TestPwd123
315
316    # Verify that legitimate login fails due to lockout.
317    Run Keyword And Expect Error  InvalidCredentialsError*
318    ...  Redfish.Login  test_user  TestPwd123
319
320    ${payload}=  Create Dictionary  Locked=${FALSE}
321
322    # Manually unlock the account before lockout threshold expires
323    Redfish.Login
324    Redfish.Patch  ${REDFISH_ACCOUNTS_URI}test_user  body=${payload}
325    Redfish.Logout
326
327    # Try redfish login with the recently unlocked account
328    Redfish.Login  test_user  TestPwd123
329
330    # Try SSH login with the unlocked account
331    SSHLibrary.Open Connection  ${OPENBMC_HOST}
332    SSHLibrary.Login  test_user  TestPwd123
333
334
335Verify Admin User Privilege
336    [Documentation]  Verify admin user privilege.
337    [Tags]  Verify_Admin_User_Privilege
338
339    Redfish Create User  admin_user  TestPwd123  Administrator  ${True}
340    Redfish Create User  readonly_user  TestPwd123  ReadOnly  ${True}
341
342    Redfish.Logout
343
344    Redfish.Login  admin_user  TestPwd123
345
346    # Change password of 'readonly' user with admin user.
347    Redfish.Patch  /redfish/v1/AccountService/Accounts/readonly_user  body={'Password': 'NewTestPwd123'}
348
349    # Verify modified user.
350    Redfish Verify User  readonly_user  NewTestPwd123  ReadOnly  ${True}
351
352    # Note: Delete user would work here because a root login is
353    # performed as part of "Redfish Verify User" keyword's teardown.
354    Redfish.Delete  /redfish/v1/AccountService/Accounts/admin_user
355    Redfish.Delete  /redfish/v1/AccountService/Accounts/readonly_user
356
357
358Verify Operator User Role Change Using Admin Privilege User
359    [Documentation]  Verify operator user role change using admin privilege user
360    [Tags]  Verify_Operator_User_Role_Change_Using_Admin_Privilege_User
361
362    Redfish Create User  admin_user  TestPwd123  Administrator  ${True}
363    Redfish Create User  operator_user  TestPwd123  Operator  ${True}
364
365    Redfish.Logout
366
367    # Change role ID of operator user with admin user.
368    # Login with admin user.
369    Redfish.Login  admin_user  TestPwd123
370
371    # Modify Role ID of Operator user.
372    Redfish.Patch  /redfish/v1/AccountService/Accounts/operator_user  body={'RoleId': 'Administrator'}
373
374    # Verify modified user.
375    Redfish Verify User  operator_user  TestPwd123  Administrator  ${True}
376
377    Redfish.Delete  /redfish/v1/AccountService/Accounts/admin_user
378    Redfish.Delete  /redfish/v1/AccountService/Accounts/operator_user
379
380
381Verify Operator User Privilege
382    [Documentation]  Verify operator user privilege.
383    [Tags]  Verify_Operator_User_Privilege
384
385    Redfish Create User  admin_user  TestPwd123  Administrator  ${True}
386    Redfish Create User  operator_user  TestPwd123  Operator  ${True}
387
388    Redfish.Logout
389    # Login with operator user.
390    Redfish.Login  operator_user  TestPwd123
391
392    # Verify BMC reset.
393    Run Keyword And Expect Error  ValueError*  Redfish BMC Reset Operation
394
395    # Attempt to change password of admin user with operator user.
396    Redfish.Patch  /redfish/v1/AccountService/Accounts/admin_user  body={'Password': 'NewTestPwd123'}
397    ...  valid_status_codes=[${HTTP_FORBIDDEN}]
398
399    Redfish.Logout
400
401    Redfish.Login
402
403    Redfish.Delete  /redfish/v1/AccountService/Accounts/admin_user
404    Redfish.Delete  /redfish/v1/AccountService/Accounts/operator_user
405
406
407Verify ReadOnly User Privilege
408    [Documentation]  Verify ReadOnly user privilege.
409    [Tags]  Verify_ReadOnly_User_Privilege
410
411    Redfish Create User  readonly_user  TestPwd123  ReadOnly  ${True}
412    Redfish.Logout
413
414    # Login with read_only user.
415    Redfish.Login  readonly_user  TestPwd123
416
417    # Read system level data.
418    ${system_model}=  Redfish_Utils.Get Attribute
419    ...  ${SYSTEM_BASE_URI}  Model
420
421    Redfish.Logout
422    Redfish.Login
423    Redfish.Delete  ${REDFISH_ACCOUNTS_URI}readonly_user
424
425
426Verify Minimum Password Length For Redfish User
427    [Documentation]  Verify minimum password length for new and existing user.
428    [Tags]  Verify_Minimum_Password_Length_For_Redfish_User
429
430    ${user_name}=  Set Variable  testUser
431
432    # Make sure the user account in question does not already exist.
433    Redfish.Delete  /redfish/v1/AccountService/Accounts/${user_name}
434    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}]
435
436    # Try to create a user with invalid length password.
437    ${payload}=  Create Dictionary
438    ...  UserName=${user_name}  Password=UserPwd  RoleId=Administrator  Enabled=${True}
439    Redfish.Post  /redfish/v1/AccountService/Accounts/  body=&{payload}
440    ...  valid_status_codes=[${HTTP_BAD_REQUEST}]
441
442    # Create specified user with valid length password.
443    Set To Dictionary  ${payload}  Password  UserPwd1
444    Redfish.Post  /redfish/v1/AccountService/Accounts/  body=&{payload}
445    ...  valid_status_codes=[${HTTP_CREATED}]
446
447    # Try to change to an invalid password.
448    Redfish.Patch  /redfish/v1/AccountService/Accounts/${user_name}  body={'Password': 'UserPwd'}
449    ...  valid_status_codes=[${HTTP_BAD_REQUEST}]
450
451    # Change to a valid password.
452    Redfish.Patch  /redfish/v1/AccountService/Accounts/${user_name}  body={'Password': 'UserPwd1'}
453
454    # Verify login.
455    Redfish.Logout
456    Redfish.Login  ${user_name}  UserPwd1
457    Redfish.Logout
458    Redfish.Login
459    Redfish.Delete  /redfish/v1/AccountService/Accounts/${user_name}
460
461
462Verify Standard User Roles Defined By Redfish
463    [Documentation]  Verify standard user roles defined by Redfish.
464    [Tags]  Verify_Standard_User_Roles_Defined_By_Redfish
465
466    ${member_list}=  Redfish_Utils.Get Member List
467    ...  /redfish/v1/AccountService/Roles
468
469    @{roles}=  Create List
470    ...  /redfish/v1/AccountService/Roles/Administrator
471    ...  /redfish/v1/AccountService/Roles/Operator
472    ...  /redfish/v1/AccountService/Roles/ReadOnly
473
474    List Should Contain Sub List  ${member_list}  ${roles}
475
476    # The standard roles are:
477
478    # | Role name | Assigned privileges |
479    # | Administrator | Login, ConfigureManager, ConfigureUsers, ConfigureComponents, ConfigureSelf |
480    # | Operator | Login, ConfigureComponents, ConfigureSelf |
481    # | ReadOnly | Login, ConfigureSelf |
482
483    @{admin}=  Create List  Login  ConfigureManager  ConfigureUsers  ConfigureComponents  ConfigureSelf
484    @{operator}=  Create List  Login  ConfigureComponents  ConfigureSelf
485    @{readOnly}=  Create List  Login  ConfigureSelf
486
487    ${roles_dict}=  create dictionary  admin_privileges=${admin}  operator_privileges=${operator}
488    ...  readOnly_privileges=${readOnly}
489
490    ${resp}=  redfish.Get  /redfish/v1/AccountService/Roles/Administrator
491    List Should Contain Sub List  ${resp.dict['AssignedPrivileges']}  ${roles_dict['admin_privileges']}
492
493    ${resp}=  redfish.Get  /redfish/v1/AccountService/Roles/Operator
494    List Should Contain Sub List  ${resp.dict['AssignedPrivileges']}  ${roles_dict['operator_privileges']}
495
496    ${resp}=  redfish.Get  /redfish/v1/AccountService/Roles/ReadOnly
497    List Should Contain Sub List  ${resp.dict['AssignedPrivileges']}  ${roles_dict['readOnly_privileges']}
498
499
500Verify Error While Deleting Root User
501    [Documentation]  Verify error while deleting root user.
502    [Tags]  Verify_Error_While_Deleting_Root_User
503
504    Redfish.Delete  /redfish/v1/AccountService/Accounts/root  valid_status_codes=[${HTTP_FORBIDDEN}]
505
506
507Verify SSH Login Access With Admin User
508    [Documentation]  Verify that admin user have SSH login access.
509    ...              By default, admin should have access but there could be
510    ...              case where admin user shell access is restricted by design
511    ...              in the community sphere..
512    [Tags]  Verify_SSH_Login_Access_With_Admin_User
513
514    # Create an admin User.
515    Redfish Create User  new_admin  TestPwd1  Administrator  ${True}
516
517    # Attempt SSH login with admin user.
518    SSHLibrary.Open Connection  ${OPENBMC_HOST}
519    ${status}=  Run Keyword And Return Status  SSHLibrary.Login  new_admin  TestPwd1
520
521    # By default ssh_status is True, user can change the status via CLI
522    # -v ssh_status:False
523    Should Be Equal As Strings  "${status}"  "${ssh_status}"
524
525    Redfish.Login
526    Redfish.Delete  /redfish/v1/AccountService/Accounts/new_admin
527
528
529Verify Configure BasicAuth Enable And Disable
530    [Documentation]  Verify configure basicauth enable and disable
531    [Tags]  Verify_Configure_BasicAuth_Enable_And_Disable
532    [Template]  Template For Configure Auth Methods
533
534    # auth_method
535    BasicAuth
536    XToken
537
538*** Keywords ***
539
540Test Teardown Execution
541    [Documentation]  Do the post test teardown.
542
543    Run Keyword And Ignore Error  Redfish.Logout
544    FFDC On Test Case Fail
545
546
547Redfish Create User
548    [Documentation]  Redfish create user.
549    [Arguments]   ${username}  ${password}  ${role_id}  ${enabled}  ${login_check}=${True}
550
551    # Description of argument(s):
552    # username            The username to be created.
553    # password            The password to be assigned.
554    # role_id             The role ID of the user to be created
555    #                     (e.g. "Administrator", "Operator", etc.).
556    # enabled             Indicates whether the username being created
557    #                     should be enabled (${True}, ${False}).
558    # login_check         Checks user login for created user.
559    #                     (e.g. ${True}, ${False}).
560
561    # Make sure the user account in question does not already exist.
562    Redfish.Delete  /redfish/v1/AccountService/Accounts/${userName}
563    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}]
564
565    # Create specified user.
566    ${payload}=  Create Dictionary
567    ...  UserName=${username}  Password=${password}  RoleId=${role_id}  Enabled=${enabled}
568    Redfish.Post  /redfish/v1/AccountService/Accounts/  body=&{payload}
569    ...  valid_status_codes=[${HTTP_CREATED}]
570
571    # Resetting faillock count as a workaround for issue
572    # openbmc/phosphor-user-manager#4
573    ${cmd}=  Catenate  test -f /usr/sbin/faillock && /usr/sbin/faillock --user USER --reset
574    ...  || /usr/sbin/pam_tally2 -u ${username} --reset
575    Bmc Execute Command  ${cmd}
576
577    # Verify login with created user.
578    ${status}=  Run Keyword If  '${login_check}' == '${True}'
579    ...  Verify Redfish User Login  ${username}  ${password}
580    Run Keyword If  '${login_check}' == '${True}'  Should Be Equal  ${status}  ${enabled}
581
582    # Validate Role ID of created user.
583    ${role_config}=  Redfish_Utils.Get Attribute
584    ...  /redfish/v1/AccountService/Accounts/${username}  RoleId
585    Should Be Equal  ${role_id}  ${role_config}
586
587
588Redfish Verify User
589    [Documentation]  Redfish user verification.
590    [Arguments]   ${username}  ${password}  ${role_id}  ${enabled}
591
592    # Description of argument(s):
593    # username            The username to be created.
594    # password            The password to be assigned.
595    # role_id             The role ID of the user to be created
596    #                     (e.g. "Administrator", "Operator", etc.).
597    # enabled             Indicates whether the username being created
598    #                     should be enabled (${True}, ${False}).
599
600    ${status}=  Verify Redfish User Login  ${username}  ${password}
601    # Doing a check of the returned status.
602    Should Be Equal  ${status}  ${enabled}
603
604    # Validate Role Id of user.
605    ${role_config}=  Redfish_Utils.Get Attribute
606    ...  /redfish/v1/AccountService/Accounts/${username}  RoleId
607    Should Be Equal  ${role_id}  ${role_config}
608
609
610Verify Redfish User Login
611    [Documentation]  Verify Redfish login with given user id.
612    [Teardown]  Run Keywords  Run Keyword And Ignore Error  Redfish.Logout  AND  Redfish.Login
613    [Arguments]   ${username}  ${password}
614
615    # Description of argument(s):
616    # username            Login username.
617    # password            Login password.
618
619    # Logout from current Redfish session.
620    # We don't really care if the current session is flushed out since we are going to login
621    # with new credential in next.
622    Run Keyword And Ignore Error  Redfish.Logout
623
624    ${status}=  Run Keyword And Return Status  Redfish.Login  ${username}  ${password}
625    [Return]  ${status}
626
627
628Redfish Create And Verify User
629    [Documentation]  Redfish create and verify user.
630    [Arguments]   ${username}  ${password}  ${role_id}  ${enabled}
631
632    # Description of argument(s):
633    # username            The username to be created.
634    # password            The password to be assigned.
635    # role_id             The role ID of the user to be created
636    #                     (e.g. "Administrator", "Operator", etc.).
637    # enabled             Indicates whether the username being created
638    #                     should be enabled (${True}, ${False}).
639
640    # Example:
641    #{
642    #"@odata.context": "/redfish/v1/$metadata#ManagerAccount.ManagerAccount",
643    #"@odata.id": "/redfish/v1/AccountService/Accounts/test1",
644    #"@odata.type": "#ManagerAccount.v1_0_3.ManagerAccount",
645    #"Description": "User Account",
646    #"Enabled": true,
647    #"Id": "test1",
648    #"Links": {
649    #  "Role": {
650    #    "@odata.id": "/redfish/v1/AccountService/Roles/Administrator"
651    #  }
652    #},
653
654    Redfish Create User  ${username}  ${password}  ${role_id}  ${enabled}
655
656    Redfish Verify User  ${username}  ${password}  ${role_id}  ${enabled}
657
658    # Delete Specified User
659    Redfish.Delete  /redfish/v1/AccountService/Accounts/${username}
660
661Verify Redfish User with Wrong Password
662    [Documentation]  Verify Redfish User with Wrong Password.
663    [Arguments]   ${username}  ${password}  ${role_id}  ${enabled}  ${wrong_password}
664
665    # Description of argument(s):
666    # username            The username to be created.
667    # password            The password to be assigned.
668    # role_id             The role ID of the user to be created
669    #                     (e.g. "Administrator", "Operator", etc.).
670    # enabled             Indicates whether the username being created
671    #                     should be enabled (${True}, ${False}).
672    # wrong_password      Any invalid password.
673
674    Redfish Create User  ${username}  ${password}  ${role_id}  ${enabled}
675
676    Redfish.Logout
677
678    # Attempt to login with created user with invalid password.
679    Run Keyword And Expect Error  InvalidCredentialsError*
680    ...  Redfish.Login  ${username}  ${wrong_password}
681
682    Redfish.Login
683
684    # Delete newly created user.
685    Redfish.Delete  /redfish/v1/AccountService/Accounts/${username}
686
687
688Verify Login with Deleted Redfish User
689    [Documentation]  Verify Login with Deleted Redfish User.
690    [Arguments]   ${username}  ${password}  ${role_id}  ${enabled}
691
692    # Description of argument(s):
693    # username            The username to be created.
694    # password            The password to be assigned.
695    # role_id             The role ID of the user to be created
696    #                     (e.g. "Administrator", "Operator", etc.).
697    # enabled             Indicates whether the username being created
698    #                     should be enabled (${True}, ${False}).
699
700    Redfish Create User  ${username}  ${password}  ${role_id}  ${enabled}
701
702    # Delete newly created user.
703    Redfish.Delete  /redfish/v1/AccountService/Accounts/${userName}
704
705    Redfish.Logout
706
707    # Attempt to login with deleted user account.
708    Run Keyword And Expect Error  InvalidCredentialsError*
709    ...  Redfish.Login  ${username}  ${password}
710
711    Redfish.Login
712
713
714Verify Create User Without Enabling
715    [Documentation]  Verify Create User Without Enabling.
716    [Arguments]   ${username}  ${password}  ${role_id}  ${enabled}
717
718    # Description of argument(s):
719    # username            The username to be created.
720    # password            The password to be assigned.
721    # role_id             The role ID of the user to be created
722    #                     (e.g. "Administrator", "Operator", etc.).
723    # enabled             Indicates whether the username being created
724    #                     should be enabled (${True}, ${False}).
725
726    Redfish Create User  ${username}  ${password}  ${role_id}  ${enabled}  ${False}
727
728    Redfish.Logout
729
730    # Login with created user.
731    Run Keyword And Expect Error  InvalidCredentialsError*
732    ...  Redfish.Login  ${username}  ${password}
733
734    Redfish.Login
735
736    # Delete newly created user.
737    Redfish.Delete  /redfish/v1/AccountService/Accounts/${username}
738
739Template For Configure Auth Methods
740    [Documentation]  Template to configure auth methods.
741    [Arguments]  ${auth_method}
742    [Teardown]  Configure AuthMethods  ${auth_method}=${initial_value}
743
744    # Description of Argument(s):
745    # authmethods   The authmethod setting which needs to be
746    #               set in account service URI.
747    # valid values  BasicAuth, XToken.
748
749    Get AuthMethods Default Values  ${auth_method}
750
751    # Patch basicauth to TRUE
752    Configure AuthMethods  ${auth_method}=${TRUE}
753
754    Run Keyword IF  "${auth_method}" == "XToken"
755    ...    Check XToken Works Fine  ${HTTP_OK}
756    ...  ELSE
757    ...    Check BasicAuth Works Fine  ${HTTP_OK}
758
759    # Patch basicauth to FALSE
760    Configure AuthMethods  ${auth_method}=${FALSE}
761
762    Run Keyword IF  "${auth_method}" == "BasicAuth"
763    ...    Check BasicAuth Works Fine  ${HTTP_UNAUTHORIZED}
764    ...  ELSE
765    ...    Check XToken Works Fine  ${HTTP_UNAUTHORIZED}
766
767Configure AuthMethods
768    [Documentation]  Enable/disable authmethod types.
769    [Arguments]  &{authmethods}
770
771    # Description of argument(s):
772    # authmethods            The authmethod setting which needs to be
773    #                        set in account service URI.
774    # Usage Example          Configure AuthMethods  XToken=${TRUE}  BasicAuth=${TRUE}
775    #                        This will set the value of "XToken" and "BasicAuth"
776    #                        property in accountservice uri to TRUE.
777
778    ${openbmc}=  Create Dictionary  AuthMethods=${authmethods}
779    ${oem}=  Create Dictionary  OpenBMC=${openbmc}
780    ${payload}=  Create Dictionary  Oem=${oem}
781
782    # Setting authmethod properties using Redfish session based auth
783    ${status}=  Run Keyword And Return Status
784    ...  Redfish.Patch  ${REDFISH_BASE_URI}AccountService
785    ...  body=${payload}  valid_status_codes=[${HTTP_OK},${HTTP_NO_CONTENT}]
786
787    # Setting authmethod properties using basic auth in case the former fails
788    IF  ${status}==${FALSE}
789        # Payload dictionary pre-process to match json formatting
790        ${payload}=  Convert To String  ${payload}
791        ${payload}=  Replace String  ${payload}  '  "
792        ${payload}=  Replace String  ${payload}  False  false
793        ${payload}=  Replace String  ${payload}  True  true
794
795        # Curl Command Framing for PATCH authmethod
796        ${cmd}=  Catenate  curl -k -i -u ${OPENBMC_USERNAME}:${OPENBMC_PASSWORD}
797        ...  -X PATCH '${AUTH_URI}${REDFISH_ACCOUNTS_SERVICE_URI}'
798        ...  -H 'content-type:application/json' -H 'If-Match:*'
799        ...  -d '${payload}'
800        ${rc}  ${out}=  Run And Return Rc And Output  ${cmd}
801
802        #  Check the response of curl command is 200 or 204
803        ${check_no_content}=
804        ...  Run Keyword and Return Status  Should Contain  ${out}  204
805        ${check_ok}=
806        ...  Run Keyword and Return Status  Should Contain  ${out}  200
807        Pass Execution If  ${check_no_content}==${TRUE}
808        ...  OR  ${check_ok}==${TRUE}
809    END
810
811
812Get AuthMethods Default Values
813    [Documentation]  Get enabled/disabled status of all authmethods
814    ...  from Redfish account service URI
815    [Arguments]  ${authmethod}
816
817    # Description of argument(s):
818    # authmethod            The authmethod property whose value needs to be
819    #                       retrieved from account service URI.
820    # Usage Example         Get AuthMethods Default Values  BasicAuth
821    #                       returns >> ${TRUE}
822    # Example:
823    # {
824    #     "@odata.id": "/redfish/v1/AccountService",
825    #     (...)
826    #     "Oem": {
827    #         "OpenBMC": {
828    #             "AuthMethods": {
829    #                 "BasicAuth": true,
830    #                 "Cookie": true,
831    #                 "SessionToken": true,
832    #                 "TLS": true,
833    #                 "XToken": true
834    #             }
835    #         }
836    #     }
837    # }
838
839    ${resp}=  Redfish.Get Attribute  ${REDFISH_ACCOUNTS_SERVICE_URI}  Oem
840    ${authmethods}=  Set Variable  ${resp['OpenBMC']['AuthMethods']}
841    ${initial_value}=  Get From Dictionary  ${authmethods}  ${authmethod}
842    Set Test Variable  ${initial_value}
843
844Check XToken Works Fine
845    [Documentation]  Verify Xtoken works fine.
846    [Arguments]  ${status_code}
847
848    # Description of Argument(s):
849    # status_code : 200, 401.
850
851    # Verify xtoken auth works for xtoken
852    Redfish.Get  ${REDFISH_ACCOUNTS_SERVICE_URI}
853    ...  valid_status_codes=[${status_code}]
854
855Check BasicAuth Works Fine
856    [Documentation]  Verify Basic Auth works fine.
857    [Arguments]  ${status_code}
858
859    # Description of Argument(s):
860    # status_code : 200, 401.
861
862    # Verify basic auth works based on basic auth.
863    ${cmd}=  Catenate  curl -k -i -u ${OPENBMC_USERNAME}:${OPENBMC_PASSWORD}
864    ...  ${AUTH_URI}/redfish/v1/AccountService
865    ${rc}  ${out}=  Run And Return Rc And Output  ${cmd}
866
867    #  Check the response of curl command is 200/401
868    Should Contain  ${out}  ${status_code}
869