2 The functions to modify a user profile.
4 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UserProfileManager.h"
17 EFI_USER_PROFILE_HANDLE mModifyUser
= NULL
;
20 Display user select form, cab select a user to modify.
30 EFI_USER_PROFILE_HANDLE User
;
31 EFI_USER_PROFILE_HANDLE CurrentUser
;
32 UINT32 CurrentAccessRight
;
33 VOID
*StartOpCodeHandle
;
34 VOID
*EndOpCodeHandle
;
35 EFI_IFR_GUID_LABEL
*StartLabel
;
36 EFI_IFR_GUID_LABEL
*EndLabel
;
39 // Initialize the container for dynamic opcodes.
41 StartOpCodeHandle
= HiiAllocateOpCodeHandle ();
42 ASSERT (StartOpCodeHandle
!= NULL
);
44 EndOpCodeHandle
= HiiAllocateOpCodeHandle ();
45 ASSERT (EndOpCodeHandle
!= NULL
);
48 // Create Hii Extend Label OpCode.
50 StartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
54 sizeof (EFI_IFR_GUID_LABEL
)
56 StartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
57 StartLabel
->Number
= LABEL_USER_MOD_FUNC
;
59 EndLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
63 sizeof (EFI_IFR_GUID_LABEL
)
65 EndLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
66 EndLabel
->Number
= LABEL_END
;
69 // Add each user can be modified.
73 mUserManager
->Current (mUserManager
, &CurrentUser
);
75 Status
= mUserManager
->GetNext (mUserManager
, &User
);
76 if (EFI_ERROR (Status
)) {
80 Status
= GetAccessRight (&CurrentAccessRight
);
81 if (EFI_ERROR (Status
)) {
82 CurrentAccessRight
= EFI_USER_INFO_ACCESS_ENROLL_SELF
;
85 if ((CurrentAccessRight
== EFI_USER_INFO_ACCESS_MANAGE
) || (User
== CurrentUser
)) {
86 AddUserToForm (User
, (UINT16
)(KEY_MODIFY_USER
| KEY_SELECT_USER
| Index
), StartOpCodeHandle
);
92 mCallbackInfo
->HiiHandle
, // HII handle
93 &gUserProfileManagerGuid
, // Formset GUID
94 FORMID_MODIFY_USER
, // Form ID
95 StartOpCodeHandle
, // Label for where to insert opcodes
96 EndOpCodeHandle
// Replace data
99 HiiFreeOpCodeHandle (StartOpCodeHandle
);
100 HiiFreeOpCodeHandle (EndOpCodeHandle
);
105 Get all the user info from mModifyUser in the user manager, and save on the
115 EFI_USER_INFO_HANDLE UserInfo
;
122 // Init variable to default value.
127 mUserInfo
.CreateDateExist
= FALSE
;
128 mUserInfo
.UsageDateExist
= FALSE
;
129 mUserInfo
.UsageCount
= 0;
131 mUserInfo
.AccessPolicyLen
= 0;
132 mUserInfo
.AccessPolicyModified
= FALSE
;
133 if (mUserInfo
.AccessPolicy
!= NULL
) {
134 FreePool (mUserInfo
.AccessPolicy
);
135 mUserInfo
.AccessPolicy
= NULL
;
137 mUserInfo
.IdentityPolicyLen
= 0;
138 mUserInfo
.IdentityPolicyModified
= FALSE
;
139 if (mUserInfo
.IdentityPolicy
!= NULL
) {
140 FreePool (mUserInfo
.IdentityPolicy
);
141 mUserInfo
.IdentityPolicy
= NULL
;
145 // Allocate user information memory.
147 MemSize
= sizeof (EFI_USER_INFO
) + 63;
148 Info
= AllocateZeroPool (MemSize
);
154 // Get each user information.
158 Status
= mUserManager
->GetNextInfo (mUserManager
, mModifyUser
, &UserInfo
);
159 if (EFI_ERROR (Status
)) {
166 Status
= mUserManager
->GetInfo (
173 if (Status
== EFI_BUFFER_TOO_SMALL
) {
176 Info
= AllocateZeroPool (MemSize
);
181 Status
= mUserManager
->GetInfo (
190 if (Status
== EFI_SUCCESS
) {
192 // Deal with each information according to informaiton type.
194 DataLen
= Info
->InfoSize
- sizeof (EFI_USER_INFO
);
195 switch (Info
->InfoType
) {
196 case EFI_USER_INFO_NAME_RECORD
:
197 CopyMem (&mUserInfo
.UserName
, (UINT8
*) (Info
+ 1), DataLen
);
200 case EFI_USER_INFO_CREATE_DATE_RECORD
:
201 CopyMem (&mUserInfo
.CreateDate
, (UINT8
*) (Info
+ 1), DataLen
);
202 mUserInfo
.CreateDateExist
= TRUE
;
205 case EFI_USER_INFO_USAGE_DATE_RECORD
:
206 CopyMem (&mUserInfo
.UsageDate
, (UINT8
*) (Info
+ 1), DataLen
);
207 mUserInfo
.UsageDateExist
= TRUE
;
210 case EFI_USER_INFO_USAGE_COUNT_RECORD
:
211 CopyMem (&mUserInfo
.UsageCount
, (UINT8
*) (Info
+ 1), DataLen
);
214 case EFI_USER_INFO_ACCESS_POLICY_RECORD
:
215 mUserInfo
.AccessPolicy
= AllocateZeroPool (DataLen
);
216 if (mUserInfo
.AccessPolicy
== NULL
) {
220 CopyMem (mUserInfo
.AccessPolicy
, (UINT8
*) (Info
+ 1), DataLen
);
221 mUserInfo
.AccessPolicyLen
= DataLen
;
224 case EFI_USER_INFO_IDENTITY_POLICY_RECORD
:
225 mUserInfo
.IdentityPolicy
= AllocateZeroPool (DataLen
);
226 if (mUserInfo
.IdentityPolicy
== NULL
) {
230 CopyMem (mUserInfo
.IdentityPolicy
, (UINT8
*) (Info
+ 1), DataLen
);
231 mUserInfo
.IdentityPolicyLen
= DataLen
;
244 Convert the Date to a string, and update the Hii database DateID string with it.
246 @param[in] Date Points to the date to be converted.
247 @param[in] DateId String ID in the HII database to be replaced.
253 IN EFI_STRING_ID DateId
260 // Convert date to string.
263 Str
= AllocateZeroPool (DateBufLen
);
278 // Convert time to string.
280 DateBufLen
-= StrLen (Str
);
290 HiiSetString (mCallbackInfo
->HiiHandle
, DateId
, Str
, NULL
);
296 Convert the CountVal to a string, and update the Hii database CountId string
299 @param[in] CountVal The hex value to convert.
300 @param[in] CountId String ID in the HII database to be replaced.
306 IN EFI_STRING_ID CountId
311 UnicodeSPrint (Count
, 20, L
"%d", CountVal
);
312 HiiSetString (mCallbackInfo
->HiiHandle
, CountId
, Count
, NULL
);
317 Concatenates one Null-terminated Unicode string to another Null-terminated
320 @param[in, out] Source1 On entry, point to a Null-terminated Unicode string.
321 On exit, point to a new concatenated Unicode string
322 @param[in] Source2 Pointer to a Null-terminated Unicode string.
327 IN OUT CHAR16
**Source1
,
328 IN CONST CHAR16
*Source2
334 ASSERT (Source1
!= NULL
);
335 ASSERT (Source2
!= NULL
);
337 if (*Source1
== NULL
) {
338 StrLength
= StrSize (Source2
);
340 StrLength
= StrSize (*Source1
);
341 StrLength
+= StrSize (Source2
) -1;
344 TmpStr
= AllocateZeroPool (StrLength
);
345 ASSERT (TmpStr
!= NULL
);
347 if (*Source1
== NULL
) {
348 StrCpy (TmpStr
, Source2
);;
350 StrCpy (TmpStr
, *Source1
);
352 StrCat (TmpStr
, Source2
);
360 Convert the identity policy to a unicode string and update the Hii database
361 IpStringId string with it.
363 @param[in] Ip Points to identity policy.
364 @param[in] IpLen The identity policy length.
365 @param[in] IpStringId String ID in the HII database to be replaced.
369 ResolveIdentityPolicy (
372 IN EFI_STRING_ID IpStringId
377 EFI_USER_INFO_IDENTITY_POLICY
*Identity
;
380 EFI_STRING_ID ProvId
;
381 EFI_HII_HANDLE HiiHandle
;
382 EFI_USER_CREDENTIAL2_PROTOCOL
*UserCredential
;
387 // Resolve each policy.
390 while (ChkLen
< IpLen
) {
391 Identity
= (EFI_USER_INFO_IDENTITY_POLICY
*) (Ip
+ ChkLen
);
392 switch (Identity
->Type
) {
393 case EFI_USER_INFO_IDENTITY_FALSE
:
394 AddStr (&TmpStr
, L
"False");
397 case EFI_USER_INFO_IDENTITY_TRUE
:
398 AddStr (&TmpStr
, L
"None");
401 case EFI_USER_INFO_IDENTITY_NOT
:
402 AddStr (&TmpStr
, L
"! ");
405 case EFI_USER_INFO_IDENTITY_AND
:
406 AddStr (&TmpStr
, L
" && ");
409 case EFI_USER_INFO_IDENTITY_OR
:
410 AddStr (&TmpStr
, L
" || ");
413 case EFI_USER_INFO_IDENTITY_CREDENTIAL_TYPE
:
414 for (Index
= 0; Index
< mProviderInfo
->Count
; Index
++) {
415 UserCredential
= mProviderInfo
->Provider
[Index
];
416 if (CompareGuid ((EFI_GUID
*) (Identity
+ 1), &UserCredential
->Type
)) {
417 UserCredential
->Title (
422 ProvStr
= HiiGetString (HiiHandle
, ProvId
, NULL
);
423 if (ProvStr
!= NULL
) {
424 AddStr (&TmpStr
, ProvStr
);
432 case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER
:
433 for (Index
= 0; Index
< mProviderInfo
->Count
; Index
++) {
434 UserCredential
= mProviderInfo
->Provider
[Index
];
435 if (CompareGuid ((EFI_GUID
*) (Identity
+ 1), &UserCredential
->Identifier
)) {
436 UserCredential
->Title (
441 ProvStr
= HiiGetString (HiiHandle
, ProvId
, NULL
);
442 if (ProvStr
!= NULL
) {
443 AddStr (&TmpStr
, ProvStr
);
452 ChkLen
+= Identity
->Length
;
455 if (TmpStr
!= NULL
) {
456 HiiSetString (mCallbackInfo
->HiiHandle
, IpStringId
, TmpStr
, NULL
);
463 Display modify user information form.
465 This form displays, username, create Date, usage date, usage count, identity policy,
468 @param[in] UserIndex The index of the user in display list to modify.
477 EFI_USER_PROFILE_HANDLE CurrentUser
;
478 UINT32 CurrentAccessRight
;
479 VOID
*StartOpCodeHandle
;
480 VOID
*EndOpCodeHandle
;
481 EFI_IFR_GUID_LABEL
*StartLabel
;
482 EFI_IFR_GUID_LABEL
*EndLabel
;
485 // Initialize the container for dynamic opcodes.
487 StartOpCodeHandle
= HiiAllocateOpCodeHandle ();
488 ASSERT (StartOpCodeHandle
!= NULL
);
490 EndOpCodeHandle
= HiiAllocateOpCodeHandle ();
491 ASSERT (EndOpCodeHandle
!= NULL
);
494 // Create Hii Extend Label OpCode.
496 StartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
500 sizeof (EFI_IFR_GUID_LABEL
)
502 StartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
503 StartLabel
->Number
= LABEL_USER_INFO_FUNC
;
505 EndLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
509 sizeof (EFI_IFR_GUID_LABEL
)
511 EndLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
512 EndLabel
->Number
= LABEL_END
;
515 // Find the user profile to be modified.
518 Status
= mUserManager
->GetNext (mUserManager
, &mModifyUser
);
519 if (EFI_ERROR (Status
)) {
523 while (UserIndex
> 1) {
524 Status
= mUserManager
->GetNext (mUserManager
, &mModifyUser
);
525 if (EFI_ERROR (Status
)) {
532 // Get user profile information.
539 mCallbackInfo
->HiiHandle
,
540 STRING_TOKEN (STR_USER_NAME_VAL
),
546 // Update create date.
548 if (mUserInfo
.CreateDateExist
) {
549 ResolveDate (&mUserInfo
.CreateDate
, STRING_TOKEN (STR_CREATE_DATE_VAL
));
552 mCallbackInfo
->HiiHandle
,
553 STRING_TOKEN (STR_CREATE_DATE_VAL
),
562 if (mUserInfo
.UsageDateExist
) {
563 ResolveDate (&mUserInfo
.UsageDate
, STRING_TOKEN (STR_USAGE_DATE_VAL
));
566 mCallbackInfo
->HiiHandle
,
567 STRING_TOKEN (STR_USAGE_DATE_VAL
),
576 ResolveCount ((UINT32
) mUserInfo
.UsageCount
, STRING_TOKEN (STR_USAGE_COUNT_VAL
));
579 // Add identity policy.
581 mUserManager
->Current (mUserManager
, &CurrentUser
);
582 if (mModifyUser
== CurrentUser
) {
583 ResolveIdentityPolicy (
584 mUserInfo
.IdentityPolicy
,
585 mUserInfo
.IdentityPolicyLen
,
586 STRING_TOKEN (STR_IDENTIFY_POLICY_VAL
)
588 HiiCreateGotoOpCode (
589 StartOpCodeHandle
, // Container for opcodes
590 FORMID_MODIFY_IP
, // Target Form ID
591 STRING_TOKEN (STR_IDENTIFY_POLICY
), // Prompt text
592 STRING_TOKEN (STR_IDENTIFY_POLICY_VAL
), // Help text
593 EFI_IFR_FLAG_CALLBACK
, // Question flag
594 KEY_MODIFY_USER
| KEY_SELECT_USER
| KEY_MODIFY_IP
// Question ID
599 // Add access policy.
601 Status
= GetAccessRight (&CurrentAccessRight
);
602 if (EFI_ERROR (Status
)) {
603 CurrentAccessRight
= EFI_USER_INFO_ACCESS_ENROLL_SELF
;
606 if (CurrentAccessRight
== EFI_USER_INFO_ACCESS_MANAGE
) {
607 HiiCreateGotoOpCode (
608 StartOpCodeHandle
, // Container for opcodes
609 FORMID_MODIFY_AP
, // Target Form ID
610 STRING_TOKEN (STR_ACCESS_POLICY
), // Prompt text
611 STRING_TOKEN (STR_NULL_STRING
), // Help text
612 EFI_IFR_FLAG_CALLBACK
, // Question flag
613 KEY_MODIFY_USER
| KEY_SELECT_USER
| KEY_MODIFY_AP
// Question ID
618 mCallbackInfo
->HiiHandle
, // HII handle
619 &gUserProfileManagerGuid
, // Formset GUID
620 FORMID_USER_INFO
, // Form ID
621 StartOpCodeHandle
, // Label
622 EndOpCodeHandle
// Replace data
625 HiiFreeOpCodeHandle (StartOpCodeHandle
);
626 HiiFreeOpCodeHandle (EndOpCodeHandle
);
631 Get all the access policy info from current user info, and save in the global
636 ResolveAccessPolicy (
641 EFI_USER_INFO_ACCESS_CONTROL Control
;
648 mAccessInfo
.AccessRight
= EFI_USER_INFO_ACCESS_ENROLL_SELF
;
649 mAccessInfo
.AccessSetup
= ACCESS_SETUP_RESTRICTED
;
650 mAccessInfo
.AccessBootOrder
= EFI_USER_INFO_ACCESS_BOOT_ORDER_INSERT
;
652 mAccessInfo
.LoadPermitLen
= 0;
653 mAccessInfo
.LoadForbidLen
= 0;
654 mAccessInfo
.ConnectPermitLen
= 0;
655 mAccessInfo
.ConnectForbidLen
= 0;
658 // Get each user access policy.
661 while (OffSet
< mUserInfo
.AccessPolicyLen
) {
662 CopyMem (&Control
, mUserInfo
.AccessPolicy
+ OffSet
, sizeof (Control
));
663 ValLen
= Control
.Size
- sizeof (Control
);
664 switch (Control
.Type
) {
665 case EFI_USER_INFO_ACCESS_ENROLL_SELF
:
666 mAccessInfo
.AccessRight
= EFI_USER_INFO_ACCESS_ENROLL_SELF
;
669 case EFI_USER_INFO_ACCESS_ENROLL_OTHERS
:
670 mAccessInfo
.AccessRight
= EFI_USER_INFO_ACCESS_ENROLL_OTHERS
;
673 case EFI_USER_INFO_ACCESS_MANAGE
:
674 mAccessInfo
.AccessRight
= EFI_USER_INFO_ACCESS_MANAGE
;
677 case EFI_USER_INFO_ACCESS_SETUP
:
678 AccessData
= mUserInfo
.AccessPolicy
+ OffSet
+ sizeof (Control
);
679 if (CompareGuid ((EFI_GUID
*) AccessData
, &gEfiUserInfoAccessSetupNormalGuid
)) {
680 mAccessInfo
.AccessSetup
= ACCESS_SETUP_NORMAL
;
681 } else if (CompareGuid ((EFI_GUID
*) AccessData
, &gEfiUserInfoAccessSetupRestrictedGuid
)) {
682 mAccessInfo
.AccessSetup
= ACCESS_SETUP_RESTRICTED
;
683 } else if (CompareGuid ((EFI_GUID
*) AccessData
, &gEfiUserInfoAccessSetupAdminGuid
)) {
684 mAccessInfo
.AccessSetup
= ACCESS_SETUP_ADMIN
;
688 case EFI_USER_INFO_ACCESS_BOOT_ORDER
:
689 AccessData
= mUserInfo
.AccessPolicy
+ OffSet
+ sizeof (Control
);
690 CopyMem (&mAccessInfo
.AccessBootOrder
, AccessData
, sizeof (UINT32
));
693 case EFI_USER_INFO_ACCESS_FORBID_LOAD
:
694 if (mAccessInfo
.LoadForbid
!= NULL
) {
695 FreePool (mAccessInfo
.LoadForbid
);
698 mAccessInfo
.LoadForbid
= AllocateZeroPool (ValLen
);
699 if (mAccessInfo
.LoadForbid
!= NULL
) {
700 AccessData
= mUserInfo
.AccessPolicy
+ OffSet
+ sizeof (Control
);
701 CopyMem (mAccessInfo
.LoadForbid
, AccessData
, ValLen
);
702 mAccessInfo
.LoadForbidLen
= ValLen
;
706 case EFI_USER_INFO_ACCESS_PERMIT_LOAD
:
707 if (mAccessInfo
.LoadPermit
!= NULL
) {
708 FreePool (mAccessInfo
.LoadPermit
);
711 mAccessInfo
.LoadPermit
= AllocateZeroPool (ValLen
);
712 if (mAccessInfo
.LoadPermit
!= NULL
) {
713 AccessData
= mUserInfo
.AccessPolicy
+ OffSet
+ sizeof (Control
);
714 CopyMem (mAccessInfo
.LoadPermit
, AccessData
, ValLen
);
715 mAccessInfo
.LoadPermitLen
= ValLen
;
719 case EFI_USER_INFO_ACCESS_FORBID_CONNECT
:
720 if (mAccessInfo
.ConnectForbid
!= NULL
) {
721 FreePool (mAccessInfo
.ConnectForbid
);
724 mAccessInfo
.ConnectForbid
= AllocateZeroPool (ValLen
);
725 if (mAccessInfo
.ConnectForbid
!= NULL
) {
726 AccessData
= mUserInfo
.AccessPolicy
+ OffSet
+ sizeof (Control
);
727 CopyMem (mAccessInfo
.ConnectForbid
, AccessData
, ValLen
);
728 mAccessInfo
.ConnectForbidLen
= ValLen
;
732 case EFI_USER_INFO_ACCESS_PERMIT_CONNECT
:
733 if (mAccessInfo
.ConnectPermit
!= NULL
) {
734 FreePool (mAccessInfo
.ConnectPermit
);
737 mAccessInfo
.ConnectPermit
= AllocateZeroPool (ValLen
);
738 if (mAccessInfo
.ConnectPermit
!= NULL
) {
739 AccessData
= mUserInfo
.AccessPolicy
+ OffSet
+ sizeof (Control
);
740 CopyMem (mAccessInfo
.ConnectPermit
, AccessData
, ValLen
);
741 mAccessInfo
.ConnectPermitLen
= ValLen
;
746 OffSet
+= Control
.Size
;
752 Find the specified info in User profile by the InfoType.
754 @param[in] User Handle of the user whose information will be searched.
755 @param[in] InfoType The user information type to find.
756 @param[out] UserInfo Points to user information handle found.
758 @retval EFI_SUCCESS Find the user information successfully.
759 @retval Others Fail to find the user information.
764 IN EFI_USER_PROFILE_HANDLE User
,
766 OUT EFI_USER_INFO_HANDLE
*UserInfo
774 if (UserInfo
== NULL
) {
775 return EFI_INVALID_PARAMETER
;
780 // Allocate user information memory.
782 MemSize
= sizeof (EFI_USER_INFO
) + 63;
783 Info
= AllocateZeroPool (MemSize
);
785 return EFI_OUT_OF_RESOURCES
;
789 // Get each user information.
792 Status
= mUserManager
->GetNextInfo (mUserManager
, User
, UserInfo
);
793 if (EFI_ERROR (Status
)) {
800 Status
= mUserManager
->GetInfo (
807 if (Status
== EFI_BUFFER_TOO_SMALL
) {
810 Info
= AllocateZeroPool (MemSize
);
812 return EFI_OUT_OF_RESOURCES
;
814 Status
= mUserManager
->GetInfo (
822 if (Status
== EFI_SUCCESS
) {
823 if (Info
->InfoType
== InfoType
) {
835 Display modify user access policy form.
837 In this form, access right, access setup and access boot order are dynamically
838 added. Load devicepath and connect devicepath are displayed too.
846 VOID
*StartOpCodeHandle
;
847 VOID
*EndOpCodeHandle
;
848 VOID
*OptionsOpCodeHandle
;
849 EFI_IFR_GUID_LABEL
*StartLabel
;
850 EFI_IFR_GUID_LABEL
*EndLabel
;
851 VOID
*DefaultOpCodeHandle
;
854 // Initialize the container for dynamic opcodes.
856 StartOpCodeHandle
= HiiAllocateOpCodeHandle ();
857 ASSERT (StartOpCodeHandle
!= NULL
);
859 EndOpCodeHandle
= HiiAllocateOpCodeHandle ();
860 ASSERT (EndOpCodeHandle
!= NULL
);
863 // Create Hii Extend Label OpCode.
865 StartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
869 sizeof (EFI_IFR_GUID_LABEL
)
871 StartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
872 StartLabel
->Number
= LABEL_AP_MOD_FUNC
;
874 EndLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
878 sizeof (EFI_IFR_GUID_LABEL
)
880 EndLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
881 EndLabel
->Number
= LABEL_END
;
885 // Resolve access policy information.
887 ResolveAccessPolicy ();
890 // Add access right one-of-code.
892 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
893 ASSERT (OptionsOpCodeHandle
!= NULL
);
894 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
895 ASSERT (DefaultOpCodeHandle
!= NULL
);
897 HiiCreateOneOfOptionOpCode (
899 STRING_TOKEN (STR_NORMAL
),
901 EFI_IFR_NUMERIC_SIZE_1
,
902 EFI_USER_INFO_ACCESS_ENROLL_SELF
905 HiiCreateOneOfOptionOpCode (
907 STRING_TOKEN (STR_ENROLL
),
909 EFI_IFR_NUMERIC_SIZE_1
,
910 EFI_USER_INFO_ACCESS_ENROLL_OTHERS
913 HiiCreateOneOfOptionOpCode (
915 STRING_TOKEN (STR_MANAGE
),
917 EFI_IFR_NUMERIC_SIZE_1
,
918 EFI_USER_INFO_ACCESS_MANAGE
921 HiiCreateDefaultOpCode (
923 EFI_HII_DEFAULT_CLASS_STANDARD
,
924 EFI_IFR_NUMERIC_SIZE_1
,
925 mAccessInfo
.AccessRight
928 HiiCreateOneOfOpCode (
929 StartOpCodeHandle
, // Container for dynamic created opcodes
930 KEY_MODIFY_USER
| KEY_SELECT_USER
| KEY_MODIFY_AP
| KEY_MODIFY_RIGHT
, // Question ID
932 0, // Offset in Buffer Storage
933 STRING_TOKEN (STR_ACCESS_RIGHT
), // Question prompt text
934 STRING_TOKEN (STR_ACCESS_RIGHT_HELP
), // Question help text
935 EFI_IFR_FLAG_CALLBACK
, // Question flag
936 EFI_IFR_NUMERIC_SIZE_1
, // Data type of Question Value
937 OptionsOpCodeHandle
, // Option Opcode list
938 DefaultOpCodeHandle
// Default Opcode
940 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
941 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
945 // Add setup type one-of-code.
947 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
948 ASSERT (OptionsOpCodeHandle
!= NULL
);
949 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
950 ASSERT (DefaultOpCodeHandle
!= NULL
);
952 HiiCreateOneOfOptionOpCode (
954 STRING_TOKEN (STR_RESTRICTED
),
956 EFI_IFR_NUMERIC_SIZE_1
,
957 ACCESS_SETUP_RESTRICTED
960 HiiCreateOneOfOptionOpCode (
962 STRING_TOKEN (STR_NORMAL
),
964 EFI_IFR_NUMERIC_SIZE_1
,
968 HiiCreateOneOfOptionOpCode (
970 STRING_TOKEN (STR_ADMIN
),
972 EFI_IFR_NUMERIC_SIZE_1
,
976 HiiCreateDefaultOpCode (
978 EFI_HII_DEFAULT_CLASS_STANDARD
,
979 EFI_IFR_NUMERIC_SIZE_1
,
980 mAccessInfo
.AccessSetup
983 HiiCreateOneOfOpCode (
984 StartOpCodeHandle
, // Container for dynamic created opcodes
985 KEY_MODIFY_USER
| KEY_SELECT_USER
| KEY_MODIFY_AP
| KEY_MODIFY_SETUP
, // Question ID
987 0, // Offset in Buffer Storage
988 STRING_TOKEN (STR_ACCESS_SETUP
), // Question prompt text
989 STRING_TOKEN (STR_ACCESS_SETUP_HELP
), // Question help text
990 EFI_IFR_FLAG_CALLBACK
, // Question flag
991 EFI_IFR_NUMERIC_SIZE_1
, // Data type of Question Value
992 OptionsOpCodeHandle
, // Option Opcode list
993 DefaultOpCodeHandle
// Default Opcode
995 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
996 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
999 // Add boot order one-of-code.
1001 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1002 ASSERT (OptionsOpCodeHandle
!= NULL
);
1003 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
1004 ASSERT (DefaultOpCodeHandle
!= NULL
);
1006 HiiCreateOneOfOptionOpCode (
1007 OptionsOpCodeHandle
,
1008 STRING_TOKEN (STR_INSERT
),
1010 EFI_IFR_NUMERIC_SIZE_4
,
1011 EFI_USER_INFO_ACCESS_BOOT_ORDER_INSERT
1014 HiiCreateOneOfOptionOpCode (
1015 OptionsOpCodeHandle
,
1016 STRING_TOKEN (STR_APPEND
),
1018 EFI_IFR_NUMERIC_SIZE_4
,
1019 EFI_USER_INFO_ACCESS_BOOT_ORDER_APPEND
1022 HiiCreateOneOfOptionOpCode (
1023 OptionsOpCodeHandle
,
1024 STRING_TOKEN (STR_REPLACE
),
1026 EFI_IFR_NUMERIC_SIZE_4
,
1027 EFI_USER_INFO_ACCESS_BOOT_ORDER_REPLACE
1030 HiiCreateOneOfOptionOpCode (
1031 OptionsOpCodeHandle
,
1032 STRING_TOKEN (STR_NODEFAULT
),
1034 EFI_IFR_NUMERIC_SIZE_4
,
1035 EFI_USER_INFO_ACCESS_BOOT_ORDER_NODEFAULT
1038 HiiCreateDefaultOpCode (
1039 DefaultOpCodeHandle
,
1040 EFI_HII_DEFAULT_CLASS_STANDARD
,
1041 EFI_IFR_NUMERIC_SIZE_4
,
1042 mAccessInfo
.AccessBootOrder
1045 HiiCreateOneOfOpCode (
1046 StartOpCodeHandle
, // Container for dynamic created opcodes
1047 KEY_MODIFY_USER
| KEY_SELECT_USER
| KEY_MODIFY_AP
| KEY_MODIFY_BOOT
, // Question ID
1049 0, // Offset in Buffer Storage
1050 STRING_TOKEN (STR_BOOR_ORDER
), // Question prompt text
1051 STRING_TOKEN (STR_BOOT_ORDER_HELP
), // Question help text
1052 EFI_IFR_FLAG_CALLBACK
, // Question flag
1053 EFI_IFR_NUMERIC_SIZE_1
, // Data type of Question Value
1054 OptionsOpCodeHandle
, // Option Opcode list
1055 DefaultOpCodeHandle
// Default Opcode
1057 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
1058 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1064 mCallbackInfo
->HiiHandle
, // HII handle
1065 &gUserProfileManagerGuid
, // Formset GUID
1066 FORMID_MODIFY_AP
, // Form ID
1067 StartOpCodeHandle
, // Label for where to insert opcodes
1068 EndOpCodeHandle
// Replace data
1071 HiiFreeOpCodeHandle (StartOpCodeHandle
);
1072 HiiFreeOpCodeHandle (EndOpCodeHandle
);
1077 Expand access policy memory size.
1079 @param[in] ValidLen The valid access policy length.
1080 @param[in] ExpandLen The length that is needed to expand.
1095 Len
= mUserInfo
.AccessPolicyLen
+ (ExpandLen
/ 64 + 1) * 64;
1096 Mem
= AllocateZeroPool (Len
);
1097 ASSERT (Mem
!= NULL
);
1099 if (mUserInfo
.AccessPolicy
!= NULL
) {
1100 CopyMem (Mem
, mUserInfo
.AccessPolicy
, ValidLen
);
1101 FreePool (mUserInfo
.AccessPolicy
);
1104 mUserInfo
.AccessPolicy
= Mem
;
1105 mUserInfo
.AccessPolicyLen
= Len
;
1110 Get the username from user input, and update username string in the Hii
1120 CHAR16 UserName
[USER_NAME_LENGTH
];
1123 EFI_USER_INFO_HANDLE UserInfo
;
1124 EFI_USER_INFO
*Info
;
1125 EFI_USER_PROFILE_HANDLE TempUser
;
1128 // Get the new user name.
1130 Len
= sizeof (UserName
);
1131 Status
= GetUserNameInput (&Len
, UserName
);
1132 if (EFI_ERROR (Status
)) {
1133 if (Status
!= EFI_ABORTED
) {
1135 EFI_LIGHTGRAY
| EFI_BACKGROUND_BLUE
,
1137 L
"Failed To Get User Name.",
1139 L
"Please Press Any Key to Continue ...",
1147 // Check whether the username had been used or not.
1149 Info
= AllocateZeroPool (sizeof (EFI_USER_INFO
) + Len
);
1154 Info
->InfoType
= EFI_USER_INFO_NAME_RECORD
;
1155 Info
->InfoAttribs
= EFI_USER_INFO_STORAGE_PLATFORM_NV
|
1156 EFI_USER_INFO_PUBLIC
|
1157 EFI_USER_INFO_EXCLUSIVE
;
1158 Info
->InfoSize
= (UINT32
) (sizeof (EFI_USER_INFO
) + Len
);
1159 CopyMem ((UINT8
*) (Info
+ 1), UserName
, Len
);
1162 Status
= mUserManager
->Find (
1169 if (!EFI_ERROR (Status
)) {
1171 EFI_LIGHTGRAY
| EFI_BACKGROUND_BLUE
,
1173 L
"The User Name Had Been Used.",
1175 L
"Please Use Other User Name",
1183 // Update username display in the form.
1185 CopyMem (mUserInfo
.UserName
, UserName
, Len
);
1187 mCallbackInfo
->HiiHandle
,
1188 STRING_TOKEN (STR_USER_NAME_VAL
),
1194 // Save the user name.
1196 Status
= FindInfoByType (mModifyUser
, EFI_USER_INFO_NAME_RECORD
, &UserInfo
);
1197 if (!EFI_ERROR (Status
)) {
1198 mUserManager
->SetInfo (
1211 Display the form of the modifying user identity policy.
1215 ModifyIdentityPolicy (
1221 EFI_STRING_ID ProvID
;
1222 EFI_HII_HANDLE HiiHandle
;
1223 VOID
*OptionsOpCodeHandle
;
1224 VOID
*StartOpCodeHandle
;
1225 VOID
*EndOpCodeHandle
;
1226 EFI_IFR_GUID_LABEL
*StartLabel
;
1227 EFI_IFR_GUID_LABEL
*EndLabel
;
1230 // Initialize the container for dynamic opcodes.
1232 StartOpCodeHandle
= HiiAllocateOpCodeHandle ();
1233 ASSERT (StartOpCodeHandle
!= NULL
);
1235 EndOpCodeHandle
= HiiAllocateOpCodeHandle ();
1236 ASSERT (EndOpCodeHandle
!= NULL
);
1239 // Create Hii Extend Label OpCode.
1241 StartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
1245 sizeof (EFI_IFR_GUID_LABEL
)
1247 StartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
1248 StartLabel
->Number
= LABEL_IP_MOD_FUNC
;
1250 EndLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
1254 sizeof (EFI_IFR_GUID_LABEL
)
1256 EndLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
1257 EndLabel
->Number
= LABEL_END
;
1260 // Add credential providers
1262 if (mProviderInfo
->Count
> 0) {
1263 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1264 ASSERT (OptionsOpCodeHandle
!= NULL
);
1267 // Add credential provider Option OpCode.
1269 for (Index
= 0; Index
< mProviderInfo
->Count
; Index
++) {
1270 mProviderInfo
->Provider
[Index
]->Title (
1271 mProviderInfo
->Provider
[Index
],
1275 ProvStr
= HiiGetString (HiiHandle
, ProvID
, NULL
);
1276 ProvID
= HiiSetString (mCallbackInfo
->HiiHandle
, 0, ProvStr
, NULL
);
1282 HiiCreateOneOfOptionOpCode (
1283 OptionsOpCodeHandle
,
1286 EFI_IFR_NUMERIC_SIZE_1
,
1291 HiiCreateOneOfOpCode (
1292 StartOpCodeHandle
, // Container for dynamic created opcodes
1293 KEY_MODIFY_USER
| KEY_SELECT_USER
| KEY_MODIFY_IP
| KEY_MODIFY_PROV
, // Question ID
1295 0, // Offset in Buffer Storage
1296 STRING_TOKEN (STR_PROVIDER
), // Question prompt text
1297 STRING_TOKEN (STR_PROVIDER_HELP
), // Question help text
1298 EFI_IFR_FLAG_CALLBACK
, // Question flag
1299 EFI_IFR_NUMERIC_SIZE_1
, // Data type of Question Value
1300 OptionsOpCodeHandle
, // Option Opcode list
1301 NULL
// Default Opcode is NULl
1304 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1308 // Add logical connector Option OpCode.
1310 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1311 ASSERT (OptionsOpCodeHandle
!= NULL
);
1313 HiiCreateOneOfOptionOpCode (
1314 OptionsOpCodeHandle
,
1315 STRING_TOKEN (STR_AND_CON
),
1317 EFI_IFR_NUMERIC_SIZE_1
,
1321 HiiCreateOneOfOptionOpCode (
1322 OptionsOpCodeHandle
,
1323 STRING_TOKEN (STR_OR_CON
),
1325 EFI_IFR_NUMERIC_SIZE_1
,
1329 HiiCreateOneOfOpCode (
1330 StartOpCodeHandle
, // Container for dynamic created opcodes
1331 KEY_MODIFY_USER
| KEY_SELECT_USER
| KEY_MODIFY_IP
| KEY_MODIFY_CONN
, // Question ID
1333 0, // Offset in Buffer Storage
1334 STRING_TOKEN (STR_CONNECTOR
), // Question prompt text
1335 STRING_TOKEN (STR_CONNECTOR_HELP
), // Question help text
1336 EFI_IFR_FLAG_CALLBACK
, // Question flag
1337 EFI_IFR_NUMERIC_SIZE_1
, // Data type of Question Value
1338 OptionsOpCodeHandle
, // Option Opcode list
1339 NULL
// Default Opcode is NULl
1342 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1345 // Update identity policy in the form.
1347 ResolveIdentityPolicy (
1348 mUserInfo
.IdentityPolicy
,
1349 mUserInfo
.IdentityPolicyLen
,
1350 STRING_TOKEN (STR_IDENTIFY_POLICY_VALUE
)
1353 if (mUserInfo
.NewIdentityPolicy
!= NULL
) {
1354 FreePool (mUserInfo
.NewIdentityPolicy
);
1355 mUserInfo
.NewIdentityPolicy
= NULL
;
1356 mUserInfo
.NewIdentityPolicyLen
= 0;
1357 mUserInfo
.NewIdentityPolicyModified
= FALSE
;
1359 mProviderChoice
= 0;
1360 mConncetLogical
= 0;
1363 mCallbackInfo
->HiiHandle
, // HII handle
1364 &gUserProfileManagerGuid
, // Formset GUID
1365 FORMID_MODIFY_IP
, // Form ID
1366 StartOpCodeHandle
, // Label for where to insert opcodes
1367 EndOpCodeHandle
// Replace data
1370 HiiFreeOpCodeHandle (StartOpCodeHandle
);
1371 HiiFreeOpCodeHandle (EndOpCodeHandle
);
1376 Get current user's access right.
1378 @param[out] AccessRight Points to the buffer used for user's access right.
1380 @retval EFI_SUCCESS Get current user access right successfully.
1381 @retval others Fail to get current user access right.
1386 OUT UINT32
*AccessRight
1390 EFI_USER_INFO_HANDLE UserInfo
;
1391 EFI_USER_INFO
*Info
;
1394 EFI_USER_INFO_ACCESS_CONTROL Access
;
1395 EFI_USER_PROFILE_HANDLE CurrentUser
;
1400 // Allocate user information memory.
1402 MemSize
= sizeof (EFI_USER_INFO
) + 63;
1403 Info
= AllocateZeroPool (MemSize
);
1405 return EFI_OUT_OF_RESOURCES
;
1409 // Get user access information.
1412 mUserManager
->Current (mUserManager
, &CurrentUser
);
1416 // Get next user information.
1418 Status
= mUserManager
->GetNextInfo (mUserManager
, CurrentUser
, &UserInfo
);
1419 if (EFI_ERROR (Status
)) {
1423 Status
= mUserManager
->GetInfo (
1430 if (Status
== EFI_BUFFER_TOO_SMALL
) {
1433 Info
= AllocateZeroPool (MemSize
);
1435 return EFI_OUT_OF_RESOURCES
;
1437 Status
= mUserManager
->GetInfo (
1445 if (EFI_ERROR (Status
)) {
1450 // Check user information.
1452 if (Info
->InfoType
== EFI_USER_INFO_ACCESS_POLICY_RECORD
) {
1453 TotalLen
= Info
->InfoSize
- sizeof (EFI_USER_INFO
);
1456 // Get specified access information.
1458 while (CheckLen
< TotalLen
) {
1459 CopyMem (&Access
, (UINT8
*) (Info
+ 1) + CheckLen
, sizeof (Access
));
1460 if ((Access
.Type
== EFI_USER_INFO_ACCESS_ENROLL_SELF
) ||
1461 (Access
.Type
== EFI_USER_INFO_ACCESS_ENROLL_OTHERS
) ||
1462 (Access
.Type
== EFI_USER_INFO_ACCESS_MANAGE
)
1464 *AccessRight
= Access
.Type
;
1468 CheckLen
+= Access
.Size
;
1473 return EFI_NOT_FOUND
;