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);
 | 
						|
}
 |