Signed-off-by: gdong1 Reviewed-by: ydong10 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12622 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			344 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			344 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   The functions to delete a user profile.
 | |
|     
 | |
| Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
 | |
| This program and the accompanying materials 
 | |
| are licensed and made available under the terms and conditions of the BSD License 
 | |
| which accompanies this distribution.  The full text of the license may be found at 
 | |
| http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "UserProfileManager.h"
 | |
| 
 | |
| /**
 | |
|   Get the username from the specified user.
 | |
| 
 | |
|   @param[in]   User              Handle of a user profile. 
 | |
| 
 | |
|   @retval EFI_STRING_ID          The String Id of the user's username.
 | |
| 
 | |
| **/
 | |
| EFI_STRING_ID 
 | |
| GetUserName (
 | |
|   IN  EFI_USER_PROFILE_HANDLE                   User
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS            Status;
 | |
|   EFI_USER_INFO_HANDLE  UserInfo;
 | |
|   EFI_USER_INFO         *Info;
 | |
|   UINTN                 InfoSize;
 | |
|   UINTN                 MemSize;
 | |
|   UINTN                 NameLen;
 | |
|   CHAR16                UserName[USER_NAME_LENGTH];
 | |
|   EFI_STRING_ID         UserId;
 | |
|   
 | |
|   //
 | |
|   // Allocate user information memory.
 | |
|   //
 | |
|   MemSize = sizeof (EFI_USER_INFO) + 63;
 | |
|   Info    = AllocateZeroPool (MemSize);
 | |
|   ASSERT (Info != NULL);
 | |
|   
 | |
|   //
 | |
|   // Get user name information.
 | |
|   //
 | |
|   UserInfo = NULL;
 | |
|   while (TRUE) {
 | |
|     InfoSize = MemSize;
 | |
|     //
 | |
|     // Get next user information.
 | |
|     //
 | |
|     Status = mUserManager->GetNextInfo (
 | |
|                              mUserManager,
 | |
|                              User,
 | |
|                              &UserInfo
 | |
|                              );
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     Status = mUserManager->GetInfo (
 | |
|                              mUserManager,
 | |
|                              User,
 | |
|                              UserInfo,
 | |
|                              Info,
 | |
|                              &InfoSize
 | |
|                              );
 | |
|     if (Status == EFI_BUFFER_TOO_SMALL) {
 | |
|       MemSize = InfoSize;
 | |
|       FreePool (Info);
 | |
|       Info = AllocateZeroPool (MemSize);
 | |
|       ASSERT (Info != NULL);
 | |
| 
 | |
|       Status = mUserManager->GetInfo (
 | |
|                                mUserManager,
 | |
|                                User,
 | |
|                                UserInfo,
 | |
|                                Info,
 | |
|                                &InfoSize
 | |
|                                );
 | |
|     }
 | |
|     //
 | |
|     // Check user information.
 | |
|     //
 | |
|     if (Status == EFI_SUCCESS) {
 | |
|       if (Info->InfoType == EFI_USER_INFO_NAME_RECORD) {
 | |
|         NameLen = Info->InfoSize - sizeof (EFI_USER_INFO);
 | |
|         if (NameLen > USER_NAME_LENGTH * sizeof (CHAR16)) {
 | |
|           NameLen = USER_NAME_LENGTH * sizeof (CHAR16);
 | |
|         }
 | |
|         ASSERT (NameLen >= sizeof (CHAR16));
 | |
|         CopyMem (UserName, (UINT8 *) (Info + 1), NameLen);
 | |
|         UserName[NameLen / sizeof (CHAR16) - 1] = 0;
 | |
|         UserId = HiiSetString (
 | |
|                    mCallbackInfo->HiiHandle,
 | |
|                    0,
 | |
|                    UserName,
 | |
|                    NULL
 | |
|                    );
 | |
|         if (UserId != 0) {
 | |
|           FreePool (Info);
 | |
|           return UserId;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   FreePool (Info);
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Add a username item in form.
 | |
| 
 | |
|   @param[in]  User          Points to the user profile whose username is added. 
 | |
|   @param[in]  Index         The index of the user in the user name list
 | |
|   @param[in]  OpCodeHandle  Points to container for dynamic created opcodes.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| AddUserToForm (
 | |
|   IN  EFI_USER_PROFILE_HANDLE                   User,
 | |
|   IN  UINT16                                    Index,
 | |
|   IN  VOID                                      *OpCodeHandle
 | |
|   )
 | |
| {
 | |
|   EFI_STRING_ID NameId;
 | |
| 
 | |
|   //
 | |
|   // Get user name
 | |
|   //
 | |
|   NameId = GetUserName (User);
 | |
|   if (NameId == 0) {
 | |
|     return ;
 | |
|   }
 | |
|   
 | |
|   //
 | |
|   // Create user name option.
 | |
|   //
 | |
|   switch (Index & KEY_FIRST_FORM_MASK) {
 | |
|   case KEY_MODIFY_USER:
 | |
|     HiiCreateGotoOpCode (
 | |
|       OpCodeHandle,                   // Container for dynamic created opcodes
 | |
|       FORMID_USER_INFO,               // Target Form ID
 | |
|       NameId,                         // Prompt text
 | |
|       STRING_TOKEN (STR_NULL_STRING), // Help text
 | |
|       EFI_IFR_FLAG_CALLBACK,          // Question flag
 | |
|       Index                           // Question ID
 | |
|       );
 | |
|     break;
 | |
| 
 | |
|   case KEY_DEL_USER:
 | |
|     HiiCreateActionOpCode (
 | |
|       OpCodeHandle,                   // Container for dynamic created opcodes
 | |
|       Index,                          // Question ID
 | |
|       NameId,                         // Prompt text
 | |
|       STRING_TOKEN (STR_NULL_STRING), // Help text
 | |
|       EFI_IFR_FLAG_CALLBACK,          // Question flag
 | |
|       0                               // Action String ID
 | |
|       );
 | |
|     break;
 | |
| 
 | |
|   default:
 | |
|     break;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Delete the user specified by UserIndex in user profile database.
 | |
| 
 | |
|   @param[in]  UserIndex       The index of user in the user name list 
 | |
|                               to be deleted.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| DeleteUser (
 | |
|   IN UINT8                                      UserIndex
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS              Status;
 | |
|   EFI_USER_PROFILE_HANDLE User;
 | |
|   EFI_INPUT_KEY           Key;
 | |
|   EFI_USER_INFO_HANDLE    UserInfo;
 | |
|   EFI_USER_INFO           *Info;
 | |
|   UINTN                   InfoSize;
 | |
| 
 | |
|   //
 | |
|   // Find specified user profile and delete it.
 | |
|   //
 | |
|   User    = NULL;
 | |
|   Status  = mUserManager->GetNext (mUserManager, &User);
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     goto Done;
 | |
|   }
 | |
|   
 | |
|   while (UserIndex > 1) {
 | |
|     Status = mUserManager->GetNext (mUserManager, &User);
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       goto Done;
 | |
|     }
 | |
|     UserIndex--;
 | |
|   }
 | |
| 
 | |
|   if (UserIndex == 1) {
 | |
|     //
 | |
|     // Get the identification policy.
 | |
|     //
 | |
|     Status = FindInfoByType (User, EFI_USER_INFO_IDENTITY_POLICY_RECORD, &UserInfo);
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       goto Done;
 | |
|     }
 | |
| 
 | |
|     InfoSize = 0;
 | |
|     Info = NULL;
 | |
|     Status   = mUserManager->GetInfo (mUserManager, User, UserInfo, Info, &InfoSize);
 | |
|     if (Status == EFI_BUFFER_TOO_SMALL) {
 | |
|       Info = AllocateZeroPool (InfoSize);
 | |
|       if (Info == NULL) {
 | |
|         goto Done;
 | |
|       }
 | |
|       Status = mUserManager->GetInfo (mUserManager, User, UserInfo, Info, &InfoSize);
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Delete the user on the credential providers by its identification policy.
 | |
|     //
 | |
|     ASSERT (Info != NULL);
 | |
|     DeleteCredentialFromProviders ((UINT8 *)(Info + 1), Info->InfoSize - sizeof (EFI_USER_INFO), User);
 | |
|     FreePool (Info);
 | |
|     
 | |
|     Status = mUserManager->Delete (mUserManager, User);
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       goto Done;
 | |
|     }
 | |
|     CreatePopUp (
 | |
|       EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
 | |
|       &Key,
 | |
|       L"Delete User Succeed!",
 | |
|       L"",
 | |
|       L"Please Press Any Key to Continue ...",
 | |
|       NULL
 | |
|       );
 | |
|     return ;  
 | |
|   }
 | |
| 
 | |
| Done:
 | |
|   CreatePopUp (
 | |
|     EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
 | |
|     &Key,
 | |
|     L"Delete User Failed!",
 | |
|     L"",
 | |
|     L"Please Press Any Key to Continue ...",
 | |
|     NULL
 | |
|     );
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Display user select form, cab select a user to delete.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| SelectUserToDelete (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS              Status;
 | |
|   UINT8                   Index;
 | |
|   EFI_USER_PROFILE_HANDLE User;
 | |
|   EFI_USER_PROFILE_HANDLE CurrentUser;
 | |
|   VOID                    *StartOpCodeHandle;
 | |
|   VOID                    *EndOpCodeHandle;
 | |
|   EFI_IFR_GUID_LABEL      *StartLabel;
 | |
|   EFI_IFR_GUID_LABEL      *EndLabel;
 | |
| 
 | |
|   //
 | |
|   // Initialize the container for dynamic opcodes.
 | |
|   //
 | |
|   StartOpCodeHandle = HiiAllocateOpCodeHandle ();
 | |
|   ASSERT (StartOpCodeHandle != NULL);
 | |
| 
 | |
|   EndOpCodeHandle = HiiAllocateOpCodeHandle ();
 | |
|   ASSERT (EndOpCodeHandle != NULL);
 | |
| 
 | |
|   //
 | |
|   // Create Hii Extend Label OpCode.
 | |
|   //
 | |
|   StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | |
|                                         StartOpCodeHandle,
 | |
|                                         &gEfiIfrTianoGuid,
 | |
|                                         NULL,
 | |
|                                         sizeof (EFI_IFR_GUID_LABEL)
 | |
|                                         );
 | |
|   StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | |
|   StartLabel->Number        = LABEL_USER_DEL_FUNC;
 | |
| 
 | |
|   EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | |
|                                       EndOpCodeHandle,
 | |
|                                       &gEfiIfrTianoGuid,
 | |
|                                       NULL,
 | |
|                                       sizeof (EFI_IFR_GUID_LABEL)
 | |
|                                       );
 | |
|   EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | |
|   EndLabel->Number        = LABEL_END;
 | |
| 
 | |
|   //
 | |
|   // Add each user can be deleted.
 | |
|   //
 | |
|   User  = NULL;
 | |
|   Index = 1;
 | |
|   mUserManager->Current (mUserManager, &CurrentUser);
 | |
|   while (TRUE) {
 | |
|     Status = mUserManager->GetNext (mUserManager, &User);
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     if (User != CurrentUser) {
 | |
|       AddUserToForm (
 | |
|         User,
 | |
|         (UINT16)(KEY_DEL_USER | KEY_SELECT_USER | Index),
 | |
|         StartOpCodeHandle
 | |
|         );
 | |
|     }
 | |
|     Index++;
 | |
|   }
 | |
| 
 | |
|   HiiUpdateForm (
 | |
|     mCallbackInfo->HiiHandle, // HII handle
 | |
|     &gUserProfileManagerGuid, // Formset GUID
 | |
|     FORMID_DEL_USER,          // Form ID
 | |
|     StartOpCodeHandle,        // Label for where to insert opcodes
 | |
|     EndOpCodeHandle           // Replace data
 | |
|     );
 | |
| 
 | |
|   HiiFreeOpCodeHandle (StartOpCodeHandle);
 | |
|   HiiFreeOpCodeHandle (EndOpCodeHandle);
 | |
| }
 |