+++ /dev/null
-/** @file\r
- The functions to delete 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
-/**\r
- Get the username from the specified user.\r
-\r
- @param[in] User Handle of a user profile.\r
-\r
- @retval EFI_STRING_ID The String Id of the user's username.\r
-\r
-**/\r
-EFI_STRING_ID\r
-GetUserName (\r
- IN EFI_USER_PROFILE_HANDLE User\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 NameLen;\r
- CHAR16 UserName[USER_NAME_LENGTH];\r
- EFI_STRING_ID UserId;\r
-\r
- //\r
- // Allocate user information memory.\r
- //\r
- MemSize = sizeof (EFI_USER_INFO) + 63;\r
- Info = AllocateZeroPool (MemSize);\r
- ASSERT (Info != NULL);\r
-\r
- //\r
- // Get user name information.\r
- //\r
- UserInfo = NULL;\r
- while (TRUE) {\r
- InfoSize = MemSize;\r
- //\r
- // Get next user information.\r
- //\r
- Status = mUserManager->GetNextInfo (\r
- mUserManager,\r
- User,\r
- &UserInfo\r
- );\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
-\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
- ASSERT (Info != NULL);\r
-\r
- Status = mUserManager->GetInfo (\r
- mUserManager,\r
- User,\r
- UserInfo,\r
- Info,\r
- &InfoSize\r
- );\r
- }\r
- //\r
- // Check user information.\r
- //\r
- if (Status == EFI_SUCCESS) {\r
- if (Info->InfoType == EFI_USER_INFO_NAME_RECORD) {\r
- NameLen = Info->InfoSize - sizeof (EFI_USER_INFO);\r
- if (NameLen > USER_NAME_LENGTH * sizeof (CHAR16)) {\r
- NameLen = USER_NAME_LENGTH * sizeof (CHAR16);\r
- }\r
- ASSERT (NameLen >= sizeof (CHAR16));\r
- CopyMem (UserName, (UINT8 *) (Info + 1), NameLen);\r
- UserName[NameLen / sizeof (CHAR16) - 1] = 0;\r
- UserId = HiiSetString (\r
- mCallbackInfo->HiiHandle,\r
- 0,\r
- UserName,\r
- NULL\r
- );\r
- if (UserId != 0) {\r
- FreePool (Info);\r
- return UserId;\r
- }\r
- }\r
- }\r
- }\r
-\r
- FreePool (Info);\r
- return 0;\r
-}\r
-\r
-\r
-/**\r
- Add a username item in form.\r
-\r
- @param[in] User Points to the user profile whose username is added.\r
- @param[in] Index The index of the user in the user name list\r
- @param[in] OpCodeHandle Points to container for dynamic created opcodes.\r
-\r
-**/\r
-VOID\r
-AddUserToForm (\r
- IN EFI_USER_PROFILE_HANDLE User,\r
- IN UINT16 Index,\r
- IN VOID *OpCodeHandle\r
- )\r
-{\r
- EFI_STRING_ID NameId;\r
-\r
- //\r
- // Get user name\r
- //\r
- NameId = GetUserName (User);\r
- if (NameId == 0) {\r
- return ;\r
- }\r
-\r
- //\r
- // Create user name option.\r
- //\r
- switch (Index & KEY_FIRST_FORM_MASK) {\r
- case KEY_MODIFY_USER:\r
- HiiCreateGotoOpCode (\r
- OpCodeHandle, // Container for dynamic created opcodes\r
- FORMID_USER_INFO, // Target Form ID\r
- NameId, // Prompt text\r
- STRING_TOKEN (STR_NULL_STRING), // Help text\r
- EFI_IFR_FLAG_CALLBACK, // Question flag\r
- Index // Question ID\r
- );\r
- break;\r
-\r
- case KEY_DEL_USER:\r
- HiiCreateActionOpCode (\r
- OpCodeHandle, // Container for dynamic created opcodes\r
- Index, // Question ID\r
- NameId, // Prompt text\r
- STRING_TOKEN (STR_NULL_STRING), // Help text\r
- EFI_IFR_FLAG_CALLBACK, // Question flag\r
- 0 // Action String ID\r
- );\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-}\r
-\r
-\r
-/**\r
- Delete the user specified by UserIndex in user profile database.\r
-\r
- @param[in] UserIndex The index of user in the user name list\r
- to be deleted.\r
-\r
-**/\r
-VOID\r
-DeleteUser (\r
- IN UINT8 UserIndex\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_USER_PROFILE_HANDLE User;\r
- EFI_INPUT_KEY Key;\r
- EFI_USER_INFO_HANDLE UserInfo;\r
- EFI_USER_INFO *Info;\r
- UINTN InfoSize;\r
-\r
- //\r
- // Find specified user profile and delete it.\r
- //\r
- User = NULL;\r
- Status = mUserManager->GetNext (mUserManager, &User);\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
-\r
- while (UserIndex > 1) {\r
- Status = mUserManager->GetNext (mUserManager, &User);\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
- UserIndex--;\r
- }\r
-\r
- if (UserIndex == 1) {\r
- //\r
- // Get the identification policy.\r
- //\r
- Status = FindInfoByType (User, EFI_USER_INFO_IDENTITY_POLICY_RECORD, &UserInfo);\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
-\r
- InfoSize = 0;\r
- Info = NULL;\r
- Status = mUserManager->GetInfo (mUserManager, User, UserInfo, Info, &InfoSize);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- Info = AllocateZeroPool (InfoSize);\r
- if (Info == NULL) {\r
- goto Done;\r
- }\r
- Status = mUserManager->GetInfo (mUserManager, User, UserInfo, Info, &InfoSize);\r
- }\r
-\r
- //\r
- // Delete the user on the credential providers by its identification policy.\r
- //\r
- ASSERT (Info != NULL);\r
- DeleteCredentialFromProviders ((UINT8 *)(Info + 1), Info->InfoSize - sizeof (EFI_USER_INFO), User);\r
- FreePool (Info);\r
-\r
- Status = mUserManager->Delete (mUserManager, User);\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
- CreatePopUp (\r
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
- &Key,\r
- L"Delete User Succeed!",\r
- L"",\r
- L"Please Press Any Key to Continue ...",\r
- NULL\r
- );\r
- return ;\r
- }\r
-\r
-Done:\r
- CreatePopUp (\r
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
- &Key,\r
- L"Delete User Failed!",\r
- L"",\r
- L"Please Press Any Key to Continue ...",\r
- NULL\r
- );\r
-}\r
-\r
-\r
-/**\r
- Display user select form, cab select a user to delete.\r
-\r
-**/\r
-VOID\r
-SelectUserToDelete (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT8 Index;\r
- EFI_USER_PROFILE_HANDLE User;\r
- EFI_USER_PROFILE_HANDLE CurrentUser;\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_DEL_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 deleted.\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
- if (User != CurrentUser) {\r
- AddUserToForm (\r
- User,\r
- (UINT16)(KEY_DEL_USER | KEY_SELECT_USER | Index),\r
- StartOpCodeHandle\r
- );\r
- }\r
- Index++;\r
- }\r
-\r
- HiiUpdateForm (\r
- mCallbackInfo->HiiHandle, // HII handle\r
- &gUserProfileManagerGuid, // Formset GUID\r
- FORMID_DEL_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