+++ /dev/null
-/** @file\r
- The functions to modify a user profile.\r
-\r
-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "UserProfileManager.h"\r
-\r
-EFI_USER_PROFILE_HANDLE mModifyUser = NULL;\r
-\r
-/**\r
- Display user select form, cab select a user to modify.\r
-\r
-**/\r
-VOID\r
-SelectUserToModify (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT8 Index;\r
- EFI_USER_PROFILE_HANDLE User;\r
- EFI_USER_PROFILE_HANDLE CurrentUser;\r
- UINT32 CurrentAccessRight;\r
- VOID *StartOpCodeHandle;\r
- VOID *EndOpCodeHandle;\r
- EFI_IFR_GUID_LABEL *StartLabel;\r
- EFI_IFR_GUID_LABEL *EndLabel;\r
-\r
- //\r
- // Initialize the container for dynamic opcodes.\r
- //\r
- StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (StartOpCodeHandle != NULL);\r
-\r
- EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (EndOpCodeHandle != NULL);\r
-\r
- //\r
- // Create Hii Extend Label OpCode.\r
- //\r
- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
- StartOpCodeHandle,\r
- &gEfiIfrTianoGuid,\r
- NULL,\r
- sizeof (EFI_IFR_GUID_LABEL)\r
- );\r
- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- StartLabel->Number = LABEL_USER_MOD_FUNC;\r
-\r
- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
- EndOpCodeHandle,\r
- &gEfiIfrTianoGuid,\r
- NULL,\r
- sizeof (EFI_IFR_GUID_LABEL)\r
- );\r
- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- EndLabel->Number = LABEL_END;\r
-\r
- //\r
- // Add each user can be modified.\r
- //\r
- User = NULL;\r
- Index = 1;\r
- mUserManager->Current (mUserManager, &CurrentUser);\r
- while (TRUE) {\r
- Status = mUserManager->GetNext (mUserManager, &User);\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
-\r
- Status = GetAccessRight (&CurrentAccessRight);\r
- if (EFI_ERROR (Status)) {\r
- CurrentAccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;\r
- }\r
-\r
- if ((CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) || (User == CurrentUser)) {\r
- AddUserToForm (User, (UINT16)(KEY_MODIFY_USER | KEY_SELECT_USER | Index), StartOpCodeHandle);\r
- }\r
- Index++;\r
- }\r
-\r
- HiiUpdateForm (\r
- mCallbackInfo->HiiHandle, // HII handle\r
- &gUserProfileManagerGuid, // Formset GUID\r
- FORMID_MODIFY_USER, // Form ID\r
- StartOpCodeHandle, // Label for where to insert opcodes\r
- EndOpCodeHandle // Replace data\r
- );\r
-\r
- HiiFreeOpCodeHandle (StartOpCodeHandle);\r
- HiiFreeOpCodeHandle (EndOpCodeHandle);\r
-}\r
-\r
-\r
-/**\r
- Get all the user info from mModifyUser in the user manager, and save on the\r
- global variable.\r
-\r
-**/\r
-VOID\r
-GetAllUserInfo (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_USER_INFO_HANDLE UserInfo;\r
- EFI_USER_INFO *Info;\r
- UINTN InfoSize;\r
- UINTN MemSize;\r
- UINTN DataLen;\r
-\r
- //\r
- // Init variable to default value.\r
- //\r
- mProviderChoice = 0;\r
- mConncetLogical = 0;\r
-\r
- mUserInfo.CreateDateExist = FALSE;\r
- mUserInfo.UsageDateExist = FALSE;\r
- mUserInfo.UsageCount = 0;\r
-\r
- mUserInfo.AccessPolicyLen = 0;\r
- mUserInfo.AccessPolicyModified = FALSE;\r
- if (mUserInfo.AccessPolicy != NULL) {\r
- FreePool (mUserInfo.AccessPolicy);\r
- mUserInfo.AccessPolicy = NULL;\r
- }\r
- mUserInfo.IdentityPolicyLen = 0;\r
- mUserInfo.IdentityPolicyModified = FALSE;\r
- if (mUserInfo.IdentityPolicy != NULL) {\r
- FreePool (mUserInfo.IdentityPolicy);\r
- mUserInfo.IdentityPolicy = NULL;\r
- }\r
-\r
- //\r
- // Allocate user information memory.\r
- //\r
- MemSize = sizeof (EFI_USER_INFO) + 63;\r
- Info = AllocateZeroPool (MemSize);\r
- if (Info == NULL) {\r
- return ;\r
- }\r
-\r
- //\r
- // Get each user information.\r
- //\r
- UserInfo = NULL;\r
- while (TRUE) {\r
- Status = mUserManager->GetNextInfo (mUserManager, mModifyUser, &UserInfo);\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
- //\r
- // Get information.\r
- //\r
- InfoSize = MemSize;\r
- Status = mUserManager->GetInfo (\r
- mUserManager,\r
- mModifyUser,\r
- UserInfo,\r
- Info,\r
- &InfoSize\r
- );\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- MemSize = InfoSize;\r
- FreePool (Info);\r
- Info = AllocateZeroPool (MemSize);\r
- if (Info == NULL) {\r
- return ;\r
- }\r
-\r
- Status = mUserManager->GetInfo (\r
- mUserManager,\r
- mModifyUser,\r
- UserInfo,\r
- Info,\r
- &InfoSize\r
- );\r
- }\r
-\r
- if (Status == EFI_SUCCESS) {\r
- //\r
- // Deal with each information according to informaiton type.\r
- //\r
- DataLen = Info->InfoSize - sizeof (EFI_USER_INFO);\r
- switch (Info->InfoType) {\r
- case EFI_USER_INFO_NAME_RECORD:\r
- CopyMem (&mUserInfo.UserName, (UINT8 *) (Info + 1), DataLen);\r
- break;\r
-\r
- case EFI_USER_INFO_CREATE_DATE_RECORD:\r
- CopyMem (&mUserInfo.CreateDate, (UINT8 *) (Info + 1), DataLen);\r
- mUserInfo.CreateDateExist = TRUE;\r
- break;\r
-\r
- case EFI_USER_INFO_USAGE_DATE_RECORD:\r
- CopyMem (&mUserInfo.UsageDate, (UINT8 *) (Info + 1), DataLen);\r
- mUserInfo.UsageDateExist = TRUE;\r
- break;\r
-\r
- case EFI_USER_INFO_USAGE_COUNT_RECORD:\r
- CopyMem (&mUserInfo.UsageCount, (UINT8 *) (Info + 1), DataLen);\r
- break;\r
-\r
- case EFI_USER_INFO_ACCESS_POLICY_RECORD:\r
- mUserInfo.AccessPolicy = AllocateZeroPool (DataLen);\r
- if (mUserInfo.AccessPolicy == NULL) {\r
- break;\r
- }\r
-\r
- CopyMem (mUserInfo.AccessPolicy, (UINT8 *) (Info + 1), DataLen);\r
- mUserInfo.AccessPolicyLen = DataLen;\r
- break;\r
-\r
- case EFI_USER_INFO_IDENTITY_POLICY_RECORD:\r
- mUserInfo.IdentityPolicy = AllocateZeroPool (DataLen);\r
- if (mUserInfo.IdentityPolicy == NULL) {\r
- break;\r
- }\r
-\r
- CopyMem (mUserInfo.IdentityPolicy, (UINT8 *) (Info + 1), DataLen);\r
- mUserInfo.IdentityPolicyLen = DataLen;\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- }\r
- }\r
- FreePool (Info);\r
-}\r
-\r
-\r
-/**\r
- Convert the Date to a string, and update the Hii database DateID string with it.\r
-\r
- @param[in] Date Points to the date to be converted.\r
- @param[in] DateId String ID in the HII database to be replaced.\r
-\r
-**/\r
-VOID\r
-ResolveDate (\r
- IN EFI_TIME *Date,\r
- IN EFI_STRING_ID DateId\r
- )\r
-{\r
- CHAR16 *Str;\r
- UINTN DateBufLen;\r
-\r
- //\r
- // Convert date to string.\r
- //\r
- DateBufLen = 64;\r
- Str = AllocateZeroPool (DateBufLen);\r
- if (Str == NULL) {\r
- return ;\r
- }\r
-\r
- UnicodeSPrint (\r
- Str,\r
- DateBufLen,\r
- L"%4d-%2d-%2d ",\r
- Date->Year,\r
- Date->Month,\r
- Date->Day\r
- );\r
-\r
- //\r
- // Convert time to string.\r
- //\r
- DateBufLen -= StrLen (Str);\r
- UnicodeSPrint (\r
- Str + StrLen (Str),\r
- DateBufLen,\r
- L"%2d:%2d:%2d",\r
- Date->Hour,\r
- Date->Minute,\r
- Date->Second\r
- );\r
-\r
- HiiSetString (mCallbackInfo->HiiHandle, DateId, Str, NULL);\r
- FreePool (Str);\r
-}\r
-\r
-\r
-/**\r
- Convert the CountVal to a string, and update the Hii database CountId string\r
- with it.\r
-\r
- @param[in] CountVal The hex value to convert.\r
- @param[in] CountId String ID in the HII database to be replaced.\r
-\r
-**/\r
-VOID\r
-ResolveCount (\r
- IN UINT32 CountVal,\r
- IN EFI_STRING_ID CountId\r
- )\r
-{\r
- CHAR16 Count[10];\r
-\r
- UnicodeSPrint (Count, 20, L"%d", CountVal);\r
- HiiSetString (mCallbackInfo->HiiHandle, CountId, Count, NULL);\r
-}\r
-\r
-\r
-/**\r
- Concatenates one Null-terminated Unicode string to another Null-terminated\r
- Unicode string.\r
-\r
- @param[in, out] Source1 On entry, point to a Null-terminated Unicode string.\r
- On exit, point to a new concatenated Unicode string\r
- @param[in] Source2 Pointer to a Null-terminated Unicode string.\r
-\r
-**/\r
-VOID\r
-AddStr (\r
- IN OUT CHAR16 **Source1,\r
- IN CONST CHAR16 *Source2\r
- )\r
-{\r
- CHAR16 *TmpStr;\r
- UINTN StrLength;\r
-\r
- ASSERT (Source1 != NULL);\r
- ASSERT (Source2 != NULL);\r
-\r
- if (*Source1 == NULL) {\r
- StrLength = StrSize (Source2);\r
- } else {\r
- StrLength = StrSize (*Source1);\r
- StrLength += StrSize (Source2) - 2;\r
- }\r
-\r
- TmpStr = AllocateZeroPool (StrLength);\r
- ASSERT (TmpStr != NULL);\r
-\r
- if (*Source1 == NULL) {\r
- StrCpyS (TmpStr, StrLength / sizeof (CHAR16), Source2);\r
- } else {\r
- StrCpyS (TmpStr, StrLength / sizeof (CHAR16), *Source1);\r
- FreePool (*Source1);\r
- StrCatS (TmpStr, StrLength / sizeof (CHAR16),Source2);\r
- }\r
-\r
- *Source1 = TmpStr;\r
-}\r
-\r
-\r
-/**\r
- Convert the identity policy to a unicode string and update the Hii database\r
- IpStringId string with it.\r
-\r
- @param[in] Ip Points to identity policy.\r
- @param[in] IpLen The identity policy length.\r
- @param[in] IpStringId String ID in the HII database to be replaced.\r
-\r
-**/\r
-VOID\r
-ResolveIdentityPolicy (\r
- IN UINT8 *Ip,\r
- IN UINTN IpLen,\r
- IN EFI_STRING_ID IpStringId\r
- )\r
-{\r
- CHAR16 *TmpStr;\r
- UINTN ChkLen;\r
- EFI_USER_INFO_IDENTITY_POLICY *Identity;\r
- UINT16 Index;\r
- CHAR16 *ProvStr;\r
- EFI_STRING_ID ProvId;\r
- EFI_HII_HANDLE HiiHandle;\r
- EFI_USER_CREDENTIAL2_PROTOCOL *UserCredential;\r
-\r
- TmpStr = NULL;\r
-\r
- //\r
- // Resolve each policy.\r
- //\r
- ChkLen = 0;\r
- while (ChkLen < IpLen) {\r
- Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (Ip + ChkLen);\r
- switch (Identity->Type) {\r
- case EFI_USER_INFO_IDENTITY_FALSE:\r
- AddStr (&TmpStr, L"False");\r
- break;\r
-\r
- case EFI_USER_INFO_IDENTITY_TRUE:\r
- AddStr (&TmpStr, L"None");\r
- break;\r
-\r
- case EFI_USER_INFO_IDENTITY_NOT:\r
- AddStr (&TmpStr, L"! ");\r
- break;\r
-\r
- case EFI_USER_INFO_IDENTITY_AND:\r
- AddStr (&TmpStr, L" && ");\r
- break;\r
-\r
- case EFI_USER_INFO_IDENTITY_OR:\r
- AddStr (&TmpStr, L" || ");\r
- break;\r
-\r
- case EFI_USER_INFO_IDENTITY_CREDENTIAL_TYPE:\r
- for (Index = 0; Index < mProviderInfo->Count; Index++) {\r
- UserCredential = mProviderInfo->Provider[Index];\r
- if (CompareGuid ((EFI_GUID *) (Identity + 1), &UserCredential->Type)) {\r
- UserCredential->Title (\r
- UserCredential,\r
- &HiiHandle,\r
- &ProvId\r
- );\r
- ProvStr = HiiGetString (HiiHandle, ProvId, NULL);\r
- if (ProvStr != NULL) {\r
- AddStr (&TmpStr, ProvStr);\r
- FreePool (ProvStr);\r
- }\r
- break;\r
- }\r
- }\r
- break;\r
-\r
- case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:\r
- for (Index = 0; Index < mProviderInfo->Count; Index++) {\r
- UserCredential = mProviderInfo->Provider[Index];\r
- if (CompareGuid ((EFI_GUID *) (Identity + 1), &UserCredential->Identifier)) {\r
- UserCredential->Title (\r
- UserCredential,\r
- &HiiHandle,\r
- &ProvId\r
- );\r
- ProvStr = HiiGetString (HiiHandle, ProvId, NULL);\r
- if (ProvStr != NULL) {\r
- AddStr (&TmpStr, ProvStr);\r
- FreePool (ProvStr);\r
- }\r
- break;\r
- }\r
- }\r
- break;\r
- }\r
-\r
- ChkLen += Identity->Length;\r
- }\r
-\r
- if (TmpStr != NULL) {\r
- HiiSetString (mCallbackInfo->HiiHandle, IpStringId, TmpStr, NULL);\r
- FreePool (TmpStr);\r
- }\r
-}\r
-\r
-\r
-/**\r
- Display modify user information form.\r
-\r
- This form displays, username, create Date, usage date, usage count, identity policy,\r
- and access policy.\r
-\r
- @param[in] UserIndex The index of the user in display list to modify.\r
-\r
-**/\r
-VOID\r
-ModifyUserInfo (\r
- IN UINT8 UserIndex\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_USER_PROFILE_HANDLE CurrentUser;\r
- UINT32 CurrentAccessRight;\r
- VOID *StartOpCodeHandle;\r
- VOID *EndOpCodeHandle;\r
- EFI_IFR_GUID_LABEL *StartLabel;\r
- EFI_IFR_GUID_LABEL *EndLabel;\r
-\r
- //\r
- // Initialize the container for dynamic opcodes.\r
- //\r
- StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (StartOpCodeHandle != NULL);\r
-\r
- EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (EndOpCodeHandle != NULL);\r
-\r
- //\r
- // Create Hii Extend Label OpCode.\r
- //\r
- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
- StartOpCodeHandle,\r
- &gEfiIfrTianoGuid,\r
- NULL,\r
- sizeof (EFI_IFR_GUID_LABEL)\r
- );\r
- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- StartLabel->Number = LABEL_USER_INFO_FUNC;\r
-\r
- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
- EndOpCodeHandle,\r
- &gEfiIfrTianoGuid,\r
- NULL,\r
- sizeof (EFI_IFR_GUID_LABEL)\r
- );\r
- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- EndLabel->Number = LABEL_END;\r
-\r
- //\r
- // Find the user profile to be modified.\r
- //\r
- mModifyUser = NULL;\r
- Status = mUserManager->GetNext (mUserManager, &mModifyUser);\r
- if (EFI_ERROR (Status)) {\r
- return ;\r
- }\r
-\r
- while (UserIndex > 1) {\r
- Status = mUserManager->GetNext (mUserManager, &mModifyUser);\r
- if (EFI_ERROR (Status)) {\r
- return ;\r
- }\r
- UserIndex--;\r
- }\r
-\r
- //\r
- // Get user profile information.\r
- //\r
- GetAllUserInfo ();\r
-\r
- //\r
- // Update user name.\r
- HiiSetString (\r
- mCallbackInfo->HiiHandle,\r
- STRING_TOKEN (STR_USER_NAME_VAL),\r
- mUserInfo.UserName,\r
- NULL\r
- );\r
-\r
- //\r
- // Update create date.\r
- //\r
- if (mUserInfo.CreateDateExist) {\r
- ResolveDate (&mUserInfo.CreateDate, STRING_TOKEN (STR_CREATE_DATE_VAL));\r
- } else {\r
- HiiSetString (\r
- mCallbackInfo->HiiHandle,\r
- STRING_TOKEN (STR_CREATE_DATE_VAL),\r
- L"",\r
- NULL\r
- );\r
- }\r
-\r
- //\r
- // Add usage date.\r
- //\r
- if (mUserInfo.UsageDateExist) {\r
- ResolveDate (&mUserInfo.UsageDate, STRING_TOKEN (STR_USAGE_DATE_VAL));\r
- } else {\r
- HiiSetString (\r
- mCallbackInfo->HiiHandle,\r
- STRING_TOKEN (STR_USAGE_DATE_VAL),\r
- L"",\r
- NULL\r
- );\r
- }\r
-\r
- //\r
- // Add usage count.\r
- //\r
- ResolveCount ((UINT32) mUserInfo.UsageCount, STRING_TOKEN (STR_USAGE_COUNT_VAL));\r
-\r
- //\r
- // Add identity policy.\r
- //\r
- mUserManager->Current (mUserManager, &CurrentUser);\r
- if (mModifyUser == CurrentUser) {\r
- ResolveIdentityPolicy (\r
- mUserInfo.IdentityPolicy,\r
- mUserInfo.IdentityPolicyLen,\r
- STRING_TOKEN (STR_IDENTIFY_POLICY_VAL)\r
- );\r
- HiiCreateGotoOpCode (\r
- StartOpCodeHandle, // Container for opcodes\r
- FORMID_MODIFY_IP, // Target Form ID\r
- STRING_TOKEN (STR_IDENTIFY_POLICY), // Prompt text\r
- STRING_TOKEN (STR_IDENTIFY_POLICY_VAL), // Help text\r
- EFI_IFR_FLAG_CALLBACK, // Question flag\r
- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_IP // Question ID\r
- );\r
- }\r
-\r
- //\r
- // Add access policy.\r
- //\r
- Status = GetAccessRight (&CurrentAccessRight);\r
- if (EFI_ERROR (Status)) {\r
- CurrentAccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;\r
- }\r
-\r
- if (CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) {\r
- HiiCreateGotoOpCode (\r
- StartOpCodeHandle, // Container for opcodes\r
- FORMID_MODIFY_AP, // Target Form ID\r
- STRING_TOKEN (STR_ACCESS_POLICY), // Prompt text\r
- STRING_TOKEN (STR_NULL_STRING), // Help text\r
- EFI_IFR_FLAG_CALLBACK, // Question flag\r
- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP // Question ID\r
- );\r
- }\r
-\r
- HiiUpdateForm (\r
- mCallbackInfo->HiiHandle, // HII handle\r
- &gUserProfileManagerGuid, // Formset GUID\r
- FORMID_USER_INFO, // Form ID\r
- StartOpCodeHandle, // Label\r
- EndOpCodeHandle // Replace data\r
- );\r
-\r
- HiiFreeOpCodeHandle (StartOpCodeHandle);\r
- HiiFreeOpCodeHandle (EndOpCodeHandle);\r
-}\r
-\r
-\r
-/**\r
- Get all the access policy info from current user info, and save in the global\r
- variable.\r
-\r
-**/\r
-VOID\r
-ResolveAccessPolicy (\r
- VOID\r
- )\r
-{\r
- UINTN OffSet;\r
- EFI_USER_INFO_ACCESS_CONTROL Control;\r
- UINTN ValLen;\r
- UINT8 *AccessData;\r
-\r
- //\r
- // Set default value\r
- //\r
- mAccessInfo.AccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;\r
- mAccessInfo.AccessSetup = ACCESS_SETUP_RESTRICTED;\r
- mAccessInfo.AccessBootOrder = EFI_USER_INFO_ACCESS_BOOT_ORDER_INSERT;\r
-\r
- mAccessInfo.LoadPermitLen = 0;\r
- mAccessInfo.LoadForbidLen = 0;\r
- mAccessInfo.ConnectPermitLen = 0;\r
- mAccessInfo.ConnectForbidLen = 0;\r
-\r
- //\r
- // Get each user access policy.\r
- //\r
- OffSet = 0;\r
- while (OffSet < mUserInfo.AccessPolicyLen) {\r
- CopyMem (&Control, mUserInfo.AccessPolicy + OffSet, sizeof (Control));\r
- ValLen = Control.Size - sizeof (Control);\r
- switch (Control.Type) {\r
- case EFI_USER_INFO_ACCESS_ENROLL_SELF:\r
- mAccessInfo.AccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;\r
- break;\r
-\r
- case EFI_USER_INFO_ACCESS_ENROLL_OTHERS:\r
- mAccessInfo.AccessRight = EFI_USER_INFO_ACCESS_ENROLL_OTHERS;\r
- break;\r
-\r
- case EFI_USER_INFO_ACCESS_MANAGE:\r
- mAccessInfo.AccessRight = EFI_USER_INFO_ACCESS_MANAGE;\r
- break;\r
-\r
- case EFI_USER_INFO_ACCESS_SETUP:\r
- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);\r
- if (CompareGuid ((EFI_GUID *) AccessData, &gEfiUserInfoAccessSetupNormalGuid)) {\r
- mAccessInfo.AccessSetup = ACCESS_SETUP_NORMAL;\r
- } else if (CompareGuid ((EFI_GUID *) AccessData, &gEfiUserInfoAccessSetupRestrictedGuid)) {\r
- mAccessInfo.AccessSetup = ACCESS_SETUP_RESTRICTED;\r
- } else if (CompareGuid ((EFI_GUID *) AccessData, &gEfiUserInfoAccessSetupAdminGuid)) {\r
- mAccessInfo.AccessSetup = ACCESS_SETUP_ADMIN;\r
- }\r
- break;\r
-\r
- case EFI_USER_INFO_ACCESS_BOOT_ORDER:\r
- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);\r
- CopyMem (&mAccessInfo.AccessBootOrder, AccessData, sizeof (UINT32));\r
- break;\r
-\r
- case EFI_USER_INFO_ACCESS_FORBID_LOAD:\r
- if (mAccessInfo.LoadForbid != NULL) {\r
- FreePool (mAccessInfo.LoadForbid);\r
- }\r
-\r
- mAccessInfo.LoadForbid = AllocateZeroPool (ValLen);\r
- if (mAccessInfo.LoadForbid != NULL) {\r
- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);\r
- CopyMem (mAccessInfo.LoadForbid, AccessData, ValLen);\r
- mAccessInfo.LoadForbidLen = ValLen;\r
- }\r
- break;\r
-\r
- case EFI_USER_INFO_ACCESS_PERMIT_LOAD:\r
- if (mAccessInfo.LoadPermit != NULL) {\r
- FreePool (mAccessInfo.LoadPermit);\r
- }\r
-\r
- mAccessInfo.LoadPermit = AllocateZeroPool (ValLen);\r
- if (mAccessInfo.LoadPermit != NULL) {\r
- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);\r
- CopyMem (mAccessInfo.LoadPermit, AccessData, ValLen);\r
- mAccessInfo.LoadPermitLen = ValLen;\r
- }\r
- break;\r
-\r
- case EFI_USER_INFO_ACCESS_FORBID_CONNECT:\r
- if (mAccessInfo.ConnectForbid != NULL) {\r
- FreePool (mAccessInfo.ConnectForbid);\r
- }\r
-\r
- mAccessInfo.ConnectForbid = AllocateZeroPool (ValLen);\r
- if (mAccessInfo.ConnectForbid != NULL) {\r
- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);\r
- CopyMem (mAccessInfo.ConnectForbid, AccessData, ValLen);\r
- mAccessInfo.ConnectForbidLen = ValLen;\r
- }\r
- break;\r
-\r
- case EFI_USER_INFO_ACCESS_PERMIT_CONNECT:\r
- if (mAccessInfo.ConnectPermit != NULL) {\r
- FreePool (mAccessInfo.ConnectPermit);\r
- }\r
-\r
- mAccessInfo.ConnectPermit = AllocateZeroPool (ValLen);\r
- if (mAccessInfo.ConnectPermit != NULL) {\r
- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);\r
- CopyMem (mAccessInfo.ConnectPermit, AccessData, ValLen);\r
- mAccessInfo.ConnectPermitLen = ValLen;\r
- }\r
- break;\r
- }\r
-\r
- OffSet += Control.Size;\r
- }\r
-}\r
-\r
-\r
-/**\r
- Find the specified info in User profile by the InfoType.\r
-\r
- @param[in] User Handle of the user whose information will be searched.\r
- @param[in] InfoType The user information type to find.\r
- @param[out] UserInfo Points to user information handle found.\r
-\r
- @retval EFI_SUCCESS Find the user information successfully.\r
- @retval Others Fail to find the user information.\r
-\r
-**/\r
-EFI_STATUS\r
-FindInfoByType (\r
- IN EFI_USER_PROFILE_HANDLE User,\r
- IN UINT8 InfoType,\r
- OUT EFI_USER_INFO_HANDLE *UserInfo\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_USER_INFO *Info;\r
- UINTN InfoSize;\r
- UINTN MemSize;\r
-\r
- if (UserInfo == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- *UserInfo = NULL;\r
- //\r
- // Allocate user information memory.\r
- //\r
- MemSize = sizeof (EFI_USER_INFO) + 63;\r
- Info = AllocateZeroPool (MemSize);\r
- if (Info == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- //\r
- // Get each user information.\r
- //\r
- while (TRUE) {\r
- Status = mUserManager->GetNextInfo (mUserManager, User, UserInfo);\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
- //\r
- // Get information.\r
- //\r
- InfoSize = MemSize;\r
- Status = mUserManager->GetInfo (\r
- mUserManager,\r
- User,\r
- *UserInfo,\r
- Info,\r
- &InfoSize\r
- );\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- MemSize = InfoSize;\r
- FreePool (Info);\r
- Info = AllocateZeroPool (MemSize);\r
- if (Info == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- Status = mUserManager->GetInfo (\r
- mUserManager,\r
- User,\r
- *UserInfo,\r
- Info,\r
- &InfoSize\r
- );\r
- }\r
- if (Status == EFI_SUCCESS) {\r
- if (Info->InfoType == InfoType) {\r
- break;\r
- }\r
- }\r
- }\r
-\r
- FreePool (Info);\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Display modify user access policy form.\r
-\r
- In this form, access right, access setup and access boot order are dynamically\r
- added. Load devicepath and connect devicepath are displayed too.\r
-\r
-**/\r
-VOID\r
-ModidyAccessPolicy (\r
- VOID\r
- )\r
-{\r
- VOID *StartOpCodeHandle;\r
- VOID *EndOpCodeHandle;\r
- VOID *OptionsOpCodeHandle;\r
- EFI_IFR_GUID_LABEL *StartLabel;\r
- EFI_IFR_GUID_LABEL *EndLabel;\r
- VOID *DefaultOpCodeHandle;\r
-\r
- //\r
- // Initialize the container for dynamic opcodes.\r
- //\r
- StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (StartOpCodeHandle != NULL);\r
-\r
- EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (EndOpCodeHandle != NULL);\r
-\r
- //\r
- // Create Hii Extend Label OpCode.\r
- //\r
- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
- StartOpCodeHandle,\r
- &gEfiIfrTianoGuid,\r
- NULL,\r
- sizeof (EFI_IFR_GUID_LABEL)\r
- );\r
- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- StartLabel->Number = LABEL_AP_MOD_FUNC;\r
-\r
- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
- EndOpCodeHandle,\r
- &gEfiIfrTianoGuid,\r
- NULL,\r
- sizeof (EFI_IFR_GUID_LABEL)\r
- );\r
- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- EndLabel->Number = LABEL_END;\r
-\r
-\r
- //\r
- // Resolve access policy information.\r
- //\r
- ResolveAccessPolicy ();\r
-\r
- //\r
- // Add access right one-of-code.\r
- //\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
- DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (DefaultOpCodeHandle != NULL);\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_NORMAL),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- EFI_USER_INFO_ACCESS_ENROLL_SELF\r
- );\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_ENROLL),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- EFI_USER_INFO_ACCESS_ENROLL_OTHERS\r
- );\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_MANAGE),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- EFI_USER_INFO_ACCESS_MANAGE\r
- );\r
-\r
- HiiCreateDefaultOpCode (\r
- DefaultOpCodeHandle,\r
- EFI_HII_DEFAULT_CLASS_STANDARD,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- mAccessInfo.AccessRight\r
- );\r
-\r
- HiiCreateOneOfOpCode (\r
- StartOpCodeHandle, // Container for dynamic created opcodes\r
- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP | KEY_MODIFY_RIGHT, // Question ID\r
- 0, // VarStore ID\r
- 0, // Offset in Buffer Storage\r
- STRING_TOKEN (STR_ACCESS_RIGHT), // Question prompt text\r
- STRING_TOKEN (STR_ACCESS_RIGHT_HELP), // Question help text\r
- EFI_IFR_FLAG_CALLBACK, // Question flag\r
- EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value\r
- OptionsOpCodeHandle, // Option Opcode list\r
- DefaultOpCodeHandle // Default Opcode\r
- );\r
- HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-\r
-\r
- //\r
- // Add setup type one-of-code.\r
- //\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
- DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (DefaultOpCodeHandle != NULL);\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_RESTRICTED),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- ACCESS_SETUP_RESTRICTED\r
- );\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_NORMAL),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- ACCESS_SETUP_NORMAL\r
- );\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_ADMIN),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- ACCESS_SETUP_ADMIN\r
- );\r
-\r
- HiiCreateDefaultOpCode (\r
- DefaultOpCodeHandle,\r
- EFI_HII_DEFAULT_CLASS_STANDARD,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- mAccessInfo.AccessSetup\r
- );\r
-\r
- HiiCreateOneOfOpCode (\r
- StartOpCodeHandle, // Container for dynamic created opcodes\r
- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP | KEY_MODIFY_SETUP, // Question ID\r
- 0, // VarStore ID\r
- 0, // Offset in Buffer Storage\r
- STRING_TOKEN (STR_ACCESS_SETUP), // Question prompt text\r
- STRING_TOKEN (STR_ACCESS_SETUP_HELP), // Question help text\r
- EFI_IFR_FLAG_CALLBACK, // Question flag\r
- EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value\r
- OptionsOpCodeHandle, // Option Opcode list\r
- DefaultOpCodeHandle // Default Opcode\r
- );\r
- HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-\r
- //\r
- // Add boot order one-of-code.\r
- //\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
- DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (DefaultOpCodeHandle != NULL);\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_INSERT),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_4,\r
- EFI_USER_INFO_ACCESS_BOOT_ORDER_INSERT\r
- );\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_APPEND),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_4,\r
- EFI_USER_INFO_ACCESS_BOOT_ORDER_APPEND\r
- );\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_REPLACE),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_4,\r
- EFI_USER_INFO_ACCESS_BOOT_ORDER_REPLACE\r
- );\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_NODEFAULT),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_4,\r
- EFI_USER_INFO_ACCESS_BOOT_ORDER_NODEFAULT\r
- );\r
-\r
- HiiCreateDefaultOpCode (\r
- DefaultOpCodeHandle,\r
- EFI_HII_DEFAULT_CLASS_STANDARD,\r
- EFI_IFR_NUMERIC_SIZE_4,\r
- mAccessInfo.AccessBootOrder\r
- );\r
-\r
- HiiCreateOneOfOpCode (\r
- StartOpCodeHandle, // Container for dynamic created opcodes\r
- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP | KEY_MODIFY_BOOT, // Question ID\r
- 0, // VarStore ID\r
- 0, // Offset in Buffer Storage\r
- STRING_TOKEN (STR_BOOR_ORDER), // Question prompt text\r
- STRING_TOKEN (STR_BOOT_ORDER_HELP), // Question help text\r
- EFI_IFR_FLAG_CALLBACK, // Question flag\r
- EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value\r
- OptionsOpCodeHandle, // Option Opcode list\r
- DefaultOpCodeHandle // Default Opcode\r
- );\r
- HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-\r
- //\r
- // Update Form.\r
- //\r
- HiiUpdateForm (\r
- mCallbackInfo->HiiHandle, // HII handle\r
- &gUserProfileManagerGuid, // Formset GUID\r
- FORMID_MODIFY_AP, // Form ID\r
- StartOpCodeHandle, // Label for where to insert opcodes\r
- EndOpCodeHandle // Replace data\r
- );\r
-\r
- HiiFreeOpCodeHandle (StartOpCodeHandle);\r
- HiiFreeOpCodeHandle (EndOpCodeHandle);\r
-}\r
-\r
-\r
-/**\r
- Expand access policy memory size.\r
-\r
- @param[in] ValidLen The valid access policy length.\r
- @param[in] ExpandLen The length that is needed to expand.\r
-\r
-**/\r
-VOID\r
-ExpandMemory (\r
- IN UINTN ValidLen,\r
- IN UINTN ExpandLen\r
- )\r
-{\r
- UINT8 *Mem;\r
- UINTN Len;\r
-\r
- //\r
- // Expand memory.\r
- //\r
- Len = mUserInfo.AccessPolicyLen + (ExpandLen / 64 + 1) * 64;\r
- Mem = AllocateZeroPool (Len);\r
- ASSERT (Mem != NULL);\r
-\r
- if (mUserInfo.AccessPolicy != NULL) {\r
- CopyMem (Mem, mUserInfo.AccessPolicy, ValidLen);\r
- FreePool (mUserInfo.AccessPolicy);\r
- }\r
-\r
- mUserInfo.AccessPolicy = Mem;\r
- mUserInfo.AccessPolicyLen = Len;\r
-}\r
-\r
-\r
-/**\r
- Get the username from user input, and update username string in the Hii\r
- database with it.\r
-\r
-**/\r
-VOID\r
-ModifyUserName (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CHAR16 UserName[USER_NAME_LENGTH];\r
- UINTN Len;\r
- EFI_INPUT_KEY Key;\r
- EFI_USER_INFO_HANDLE UserInfo;\r
- EFI_USER_INFO *Info;\r
- EFI_USER_PROFILE_HANDLE TempUser;\r
-\r
- //\r
- // Get the new user name.\r
- //\r
- Len = sizeof (UserName);\r
- Status = GetUserNameInput (&Len, UserName);\r
- if (EFI_ERROR (Status)) {\r
- if (Status != EFI_ABORTED) {\r
- CreatePopUp (\r
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
- &Key,\r
- L"Failed To Get User Name.",\r
- L"",\r
- L"Please Press Any Key to Continue ...",\r
- NULL\r
- );\r
- }\r
- return ;\r
- }\r
-\r
- //\r
- // Check whether the username had been used or not.\r
- //\r
- Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + Len);\r
- if (Info == NULL) {\r
- return ;\r
- }\r
-\r
- Info->InfoType = EFI_USER_INFO_NAME_RECORD;\r
- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |\r
- EFI_USER_INFO_PUBLIC |\r
- EFI_USER_INFO_EXCLUSIVE;\r
- Info->InfoSize = (UINT32) (sizeof (EFI_USER_INFO) + Len);\r
- CopyMem ((UINT8 *) (Info + 1), UserName, Len);\r
-\r
- TempUser = NULL;\r
- Status = mUserManager->Find (\r
- mUserManager,\r
- &TempUser,\r
- NULL,\r
- Info,\r
- Info->InfoSize\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- CreatePopUp (\r
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
- &Key,\r
- L"The User Name Had Been Used.",\r
- L"",\r
- L"Please Use Other User Name",\r
- NULL\r
- );\r
- FreePool (Info);\r
- return ;\r
- }\r
-\r
- //\r
- // Update username display in the form.\r
- //\r
- CopyMem (mUserInfo.UserName, UserName, Len);\r
- HiiSetString (\r
- mCallbackInfo->HiiHandle,\r
- STRING_TOKEN (STR_USER_NAME_VAL),\r
- mUserInfo.UserName,\r
- NULL\r
- );\r
-\r
- //\r
- // Save the user name.\r
- //\r
- Status = FindInfoByType (mModifyUser, EFI_USER_INFO_NAME_RECORD, &UserInfo);\r
- if (!EFI_ERROR (Status)) {\r
- mUserManager->SetInfo (\r
- mUserManager,\r
- mModifyUser,\r
- &UserInfo,\r
- Info,\r
- Info->InfoSize\r
- );\r
- }\r
- FreePool (Info);\r
-}\r
-\r
-\r
-/**\r
- Display the form of the modifying user identity policy.\r
-\r
-**/\r
-VOID\r
-ModifyIdentityPolicy (\r
- VOID\r
- )\r
-{\r
- UINTN Index;\r
- CHAR16 *ProvStr;\r
- EFI_STRING_ID ProvID;\r
- EFI_HII_HANDLE HiiHandle;\r
- VOID *OptionsOpCodeHandle;\r
- VOID *StartOpCodeHandle;\r
- VOID *EndOpCodeHandle;\r
- EFI_IFR_GUID_LABEL *StartLabel;\r
- EFI_IFR_GUID_LABEL *EndLabel;\r
-\r
- //\r
- // Initialize the container for dynamic opcodes.\r
- //\r
- StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (StartOpCodeHandle != NULL);\r
-\r
- EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (EndOpCodeHandle != NULL);\r
-\r
- //\r
- // Create Hii Extend Label OpCode.\r
- //\r
- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
- StartOpCodeHandle,\r
- &gEfiIfrTianoGuid,\r
- NULL,\r
- sizeof (EFI_IFR_GUID_LABEL)\r
- );\r
- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- StartLabel->Number = LABEL_IP_MOD_FUNC;\r
-\r
- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
- EndOpCodeHandle,\r
- &gEfiIfrTianoGuid,\r
- NULL,\r
- sizeof (EFI_IFR_GUID_LABEL)\r
- );\r
- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- EndLabel->Number = LABEL_END;\r
-\r
- //\r
- // Add credential providers\r
- //.\r
- if (mProviderInfo->Count > 0) {\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- //\r
- // Add credential provider Option OpCode.\r
- //\r
- for (Index = 0; Index < mProviderInfo->Count; Index++) {\r
- mProviderInfo->Provider[Index]->Title (\r
- mProviderInfo->Provider[Index],\r
- &HiiHandle,\r
- &ProvID\r
- );\r
- ProvStr = HiiGetString (HiiHandle, ProvID, NULL);\r
- ProvID = HiiSetString (mCallbackInfo->HiiHandle, 0, ProvStr, NULL);\r
- FreePool (ProvStr);\r
- if (ProvID == 0) {\r
- return ;\r
- }\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- ProvID,\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- (UINT8) Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- StartOpCodeHandle, // Container for dynamic created opcodes\r
- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_IP | KEY_MODIFY_PROV, // Question ID\r
- 0, // VarStore ID\r
- 0, // Offset in Buffer Storage\r
- STRING_TOKEN (STR_PROVIDER), // Question prompt text\r
- STRING_TOKEN (STR_PROVIDER_HELP), // Question help text\r
- EFI_IFR_FLAG_CALLBACK, // Question flag\r
- EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value\r
- OptionsOpCodeHandle, // Option Opcode list\r
- NULL // Default Opcode is NULl\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- }\r
-\r
- //\r
- // Add logical connector Option OpCode.\r
- //\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_AND_CON),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- 0\r
- );\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_OR_CON),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- 1\r
- );\r
-\r
- HiiCreateOneOfOpCode (\r
- StartOpCodeHandle, // Container for dynamic created opcodes\r
- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_IP | KEY_MODIFY_CONN, // Question ID\r
- 0, // VarStore ID\r
- 0, // Offset in Buffer Storage\r
- STRING_TOKEN (STR_CONNECTOR), // Question prompt text\r
- STRING_TOKEN (STR_CONNECTOR_HELP), // Question help text\r
- EFI_IFR_FLAG_CALLBACK, // Question flag\r
- EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value\r
- OptionsOpCodeHandle, // Option Opcode list\r
- NULL // Default Opcode is NULl\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-\r
- //\r
- // Update identity policy in the form.\r
- //\r
- ResolveIdentityPolicy (\r
- mUserInfo.IdentityPolicy,\r
- mUserInfo.IdentityPolicyLen,\r
- STRING_TOKEN (STR_IDENTIFY_POLICY_VALUE)\r
- );\r
-\r
- if (mUserInfo.NewIdentityPolicy != NULL) {\r
- FreePool (mUserInfo.NewIdentityPolicy);\r
- mUserInfo.NewIdentityPolicy = NULL;\r
- mUserInfo.NewIdentityPolicyLen = 0;\r
- mUserInfo.NewIdentityPolicyModified = FALSE;\r
- }\r
- mProviderChoice = 0;\r
- mConncetLogical = 0;\r
-\r
- HiiUpdateForm (\r
- mCallbackInfo->HiiHandle, // HII handle\r
- &gUserProfileManagerGuid, // Formset GUID\r
- FORMID_MODIFY_IP, // Form ID\r
- StartOpCodeHandle, // Label for where to insert opcodes\r
- EndOpCodeHandle // Replace data\r
- );\r
-\r
- HiiFreeOpCodeHandle (StartOpCodeHandle);\r
- HiiFreeOpCodeHandle (EndOpCodeHandle);\r
-}\r
-\r
-\r
-/**\r
- Get current user's access right.\r
-\r
- @param[out] AccessRight Points to the buffer used for user's access right.\r
-\r
- @retval EFI_SUCCESS Get current user access right successfully.\r
- @retval others Fail to get current user access right.\r
-\r
-**/\r
-EFI_STATUS\r
-GetAccessRight (\r
- OUT UINT32 *AccessRight\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_USER_INFO_HANDLE UserInfo;\r
- EFI_USER_INFO *Info;\r
- UINTN InfoSize;\r
- UINTN MemSize;\r
- EFI_USER_INFO_ACCESS_CONTROL Access;\r
- EFI_USER_PROFILE_HANDLE CurrentUser;\r
- UINTN TotalLen;\r
- UINTN CheckLen;\r
-\r
- //\r
- // Allocate user information memory.\r
- //\r
- MemSize = sizeof (EFI_USER_INFO) + 63;\r
- Info = AllocateZeroPool (MemSize);\r
- if (Info == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- //\r
- // Get user access information.\r
- //\r
- UserInfo = NULL;\r
- mUserManager->Current (mUserManager, &CurrentUser);\r
- while (TRUE) {\r
- InfoSize = MemSize;\r
- //\r
- // Get next user information.\r
- //\r
- Status = mUserManager->GetNextInfo (mUserManager, CurrentUser, &UserInfo);\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
-\r
- Status = mUserManager->GetInfo (\r
- mUserManager,\r
- CurrentUser,\r
- UserInfo,\r
- Info,\r
- &InfoSize\r
- );\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- MemSize = InfoSize;\r
- FreePool (Info);\r
- Info = AllocateZeroPool (MemSize);\r
- if (Info == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- Status = mUserManager->GetInfo (\r
- mUserManager,\r
- CurrentUser,\r
- UserInfo,\r
- Info,\r
- &InfoSize\r
- );\r
- }\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
-\r
- //\r
- // Check user information.\r
- //\r
- if (Info->InfoType == EFI_USER_INFO_ACCESS_POLICY_RECORD) {\r
- TotalLen = Info->InfoSize - sizeof (EFI_USER_INFO);\r
- CheckLen = 0;\r
- //\r
- // Get specified access information.\r
- //\r
- while (CheckLen < TotalLen) {\r
- CopyMem (&Access, (UINT8 *) (Info + 1) + CheckLen, sizeof (Access));\r
- if ((Access.Type == EFI_USER_INFO_ACCESS_ENROLL_SELF) ||\r
- (Access.Type == EFI_USER_INFO_ACCESS_ENROLL_OTHERS) ||\r
- (Access.Type == EFI_USER_INFO_ACCESS_MANAGE)\r
- ) {\r
- *AccessRight = Access.Type;\r
- FreePool (Info);\r
- return EFI_SUCCESS;\r
- }\r
- CheckLen += Access.Size;\r
- }\r
- }\r
- }\r
- FreePool (Info);\r
- return EFI_NOT_FOUND;\r
-}\r
-\r