Signed-off-by: gdong1 Reviewed-by: tye Reviewed-by: qianouyang git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12567 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			373 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			373 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  The functions to add 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 user name from the popup windows.
 | 
						|
  
 | 
						|
  @param[in, out]  UserNameLen  On entry, point to UserName buffer lengh, in bytes.
 | 
						|
                                On exit, point to input user name length, in bytes.
 | 
						|
  @param[out]      UserName     The buffer to hold the input user name.
 | 
						|
 
 | 
						|
  @retval EFI_ABORTED           It is given up by pressing 'ESC' key.
 | 
						|
  @retval EFI_NOT_READY         Not a valid input at all.
 | 
						|
  @retval EFI_SUCCESS           Get a user name successfully.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
GetUserNameInput (
 | 
						|
  IN OUT  UINTN         *UserNameLen,
 | 
						|
     OUT  CHAR16        *UserName
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_INPUT_KEY Key;
 | 
						|
  UINTN         NameLen;
 | 
						|
  CHAR16        Name[USER_NAME_LENGTH];
 | 
						|
 | 
						|
  NameLen = 0;
 | 
						|
  while (TRUE) {
 | 
						|
    Name[NameLen]     = L'_';
 | 
						|
    Name[NameLen + 1] = L'\0';
 | 
						|
    CreatePopUp (
 | 
						|
      EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
 | 
						|
      &Key,
 | 
						|
      L"Input User Name",
 | 
						|
      L"---------------------",
 | 
						|
      Name,
 | 
						|
      NULL
 | 
						|
      );
 | 
						|
    //
 | 
						|
    // Check key.
 | 
						|
    //
 | 
						|
    if (Key.ScanCode == SCAN_NULL) {
 | 
						|
      if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
 | 
						|
        //
 | 
						|
        // Add the null terminator.
 | 
						|
        //
 | 
						|
        Name[NameLen] = 0;
 | 
						|
        NameLen++;
 | 
						|
        break;
 | 
						|
      } else if ((Key.UnicodeChar == CHAR_NULL) ||
 | 
						|
                 (Key.UnicodeChar == CHAR_TAB) ||
 | 
						|
                 (Key.UnicodeChar == CHAR_LINEFEED)
 | 
						|
                 ) {
 | 
						|
        continue;
 | 
						|
      } else {
 | 
						|
        if (Key.UnicodeChar == CHAR_BACKSPACE) {
 | 
						|
          if (NameLen > 0) {
 | 
						|
            NameLen--;
 | 
						|
          }
 | 
						|
        } else {
 | 
						|
          Name[NameLen] = Key.UnicodeChar;
 | 
						|
          NameLen++;
 | 
						|
          if (NameLen + 1 == USER_NAME_LENGTH) {
 | 
						|
            //
 | 
						|
            // Add the null terminator.
 | 
						|
            //
 | 
						|
            Name[NameLen] = 0;
 | 
						|
            NameLen++;
 | 
						|
            break;
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if (Key.ScanCode == SCAN_ESC) {
 | 
						|
      return EFI_ABORTED;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  if (NameLen <= 1) {
 | 
						|
    return EFI_NOT_READY;
 | 
						|
  }
 | 
						|
 | 
						|
  if (*UserNameLen < NameLen * sizeof (CHAR16)) {
 | 
						|
    return EFI_NOT_READY;
 | 
						|
  }
 | 
						|
 | 
						|
  *UserNameLen = NameLen * sizeof (CHAR16);
 | 
						|
  CopyMem (UserName, Name, *UserNameLen);
 | 
						|
  
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Set a user's username.
 | 
						|
 | 
						|
  @param[in]   User          Handle of a user profile .
 | 
						|
  @param[in]   UserNameLen   The lengh of UserName.
 | 
						|
  @param[in]   UserName      Point to the buffer of user name.
 | 
						|
 | 
						|
  @retval EFI_NOT_READY      The usernme in mAddUserName had been used.
 | 
						|
  @retval EFI_SUCCESS        Change the user's username successfully with 
 | 
						|
                             username in mAddUserName.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
SetUserName (
 | 
						|
  IN  EFI_USER_PROFILE_HANDLE    User,
 | 
						|
  IN  UINTN                      UserNameLen,
 | 
						|
  IN  CHAR16                     *UserName
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS              Status;
 | 
						|
  EFI_USER_INFO_HANDLE    UserInfo;
 | 
						|
  EFI_USER_PROFILE_HANDLE TempUser;
 | 
						|
  EFI_USER_INFO           *NewUserInfo;
 | 
						|
   
 | 
						|
  NewUserInfo = AllocateZeroPool (sizeof (EFI_USER_INFO) + UserNameLen);
 | 
						|
  ASSERT (NewUserInfo != NULL);
 | 
						|
 | 
						|
  NewUserInfo->InfoType    = EFI_USER_INFO_NAME_RECORD;
 | 
						|
  NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV | 
 | 
						|
                             EFI_USER_INFO_PUBLIC | 
 | 
						|
                             EFI_USER_INFO_EXCLUSIVE;
 | 
						|
  NewUserInfo->InfoSize    = (UINT32) (sizeof (EFI_USER_INFO) + UserNameLen);
 | 
						|
  CopyMem ((UINT8 *) (NewUserInfo + 1), UserName, UserNameLen);
 | 
						|
  TempUser  = NULL;
 | 
						|
  Status    = mUserManager->Find (
 | 
						|
                              mUserManager,
 | 
						|
                              &TempUser,
 | 
						|
                              NULL,
 | 
						|
                              NewUserInfo,
 | 
						|
                              NewUserInfo->InfoSize
 | 
						|
                              );
 | 
						|
  if (!EFI_ERROR (Status)) {
 | 
						|
    //
 | 
						|
    // The user name had been used, return error.
 | 
						|
    //
 | 
						|
    FreePool (NewUserInfo);
 | 
						|
    return EFI_NOT_READY;
 | 
						|
  }
 | 
						|
 | 
						|
  UserInfo = NULL;
 | 
						|
  mUserManager->SetInfo (
 | 
						|
                  mUserManager,
 | 
						|
                  User,
 | 
						|
                  &UserInfo,
 | 
						|
                  NewUserInfo,
 | 
						|
                  NewUserInfo->InfoSize
 | 
						|
                  );
 | 
						|
  FreePool (NewUserInfo);
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Set create date of the specified user.
 | 
						|
 | 
						|
  @param[in]  User               Handle of a user profile.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SetCreateDate (
 | 
						|
  IN        EFI_USER_PROFILE_HANDLE   User
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                Status;
 | 
						|
  EFI_USER_INFO_HANDLE      UserInfo;
 | 
						|
  EFI_USER_INFO_CREATE_DATE Date;
 | 
						|
  EFI_USER_INFO             *NewUserInfo;
 | 
						|
  
 | 
						|
  NewUserInfo = AllocateZeroPool (
 | 
						|
                  sizeof (EFI_USER_INFO) +
 | 
						|
                  sizeof (EFI_USER_INFO_CREATE_DATE)
 | 
						|
                  );
 | 
						|
  ASSERT (NewUserInfo != NULL);
 | 
						|
 | 
						|
  NewUserInfo->InfoType    = EFI_USER_INFO_CREATE_DATE_RECORD;
 | 
						|
  NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV | 
 | 
						|
                             EFI_USER_INFO_PUBLIC | 
 | 
						|
                             EFI_USER_INFO_EXCLUSIVE;
 | 
						|
  NewUserInfo->InfoSize    = sizeof (EFI_USER_INFO) + sizeof (EFI_USER_INFO_CREATE_DATE);
 | 
						|
  Status                   = gRT->GetTime (&Date, NULL);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    FreePool (NewUserInfo);
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  CopyMem ((UINT8 *) (NewUserInfo + 1), &Date, sizeof (EFI_USER_INFO_CREATE_DATE));
 | 
						|
  UserInfo = NULL;
 | 
						|
  mUserManager->SetInfo (
 | 
						|
                  mUserManager,
 | 
						|
                  User,
 | 
						|
                  &UserInfo,
 | 
						|
                  NewUserInfo,
 | 
						|
                  NewUserInfo->InfoSize
 | 
						|
                  );
 | 
						|
  FreePool (NewUserInfo);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Set the default identity policy of the specified user.
 | 
						|
 | 
						|
  @param[in]  User               Handle of a user profile. 
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SetIdentityPolicy (
 | 
						|
  IN        EFI_USER_PROFILE_HANDLE   User
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_USER_INFO_IDENTITY_POLICY *Policy;
 | 
						|
  EFI_USER_INFO_HANDLE          UserInfo;
 | 
						|
  EFI_USER_INFO                 *NewUserInfo;
 | 
						|
  
 | 
						|
  NewUserInfo = AllocateZeroPool (
 | 
						|
                  sizeof (EFI_USER_INFO) + 
 | 
						|
                  sizeof (EFI_USER_INFO_IDENTITY_POLICY)
 | 
						|
                  );
 | 
						|
  ASSERT (NewUserInfo != NULL);
 | 
						|
  
 | 
						|
  Policy                   = (EFI_USER_INFO_IDENTITY_POLICY *) (NewUserInfo + 1);
 | 
						|
  Policy->Type             = EFI_USER_INFO_IDENTITY_TRUE;
 | 
						|
  Policy->Length           = sizeof (EFI_USER_INFO_IDENTITY_POLICY);
 | 
						|
 | 
						|
  NewUserInfo->InfoType    = EFI_USER_INFO_IDENTITY_POLICY_RECORD;
 | 
						|
  NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV | 
 | 
						|
                             EFI_USER_INFO_PUBLIC | 
 | 
						|
                             EFI_USER_INFO_EXCLUSIVE;
 | 
						|
  NewUserInfo->InfoSize    = sizeof (EFI_USER_INFO) + Policy->Length;
 | 
						|
  UserInfo                 = NULL;
 | 
						|
  mUserManager->SetInfo (
 | 
						|
                  mUserManager,
 | 
						|
                  User,
 | 
						|
                  &UserInfo,
 | 
						|
                  NewUserInfo,
 | 
						|
                  NewUserInfo->InfoSize
 | 
						|
                  );
 | 
						|
  FreePool (NewUserInfo);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Set the default access policy of the specified user.
 | 
						|
 | 
						|
  @param[in]  User               Handle of a user profile. 
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SetAccessPolicy (
 | 
						|
  IN        EFI_USER_PROFILE_HANDLE   User
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_USER_INFO_ACCESS_CONTROL  *Control;
 | 
						|
  EFI_USER_INFO_HANDLE          UserInfo;
 | 
						|
  EFI_USER_INFO                 *NewUserInfo;
 | 
						|
  
 | 
						|
  NewUserInfo = AllocateZeroPool (
 | 
						|
                  sizeof (EFI_USER_INFO) + 
 | 
						|
                  sizeof (EFI_USER_INFO_ACCESS_CONTROL)
 | 
						|
                  );
 | 
						|
  ASSERT (NewUserInfo != NULL);
 | 
						|
  
 | 
						|
  Control                  = (EFI_USER_INFO_ACCESS_CONTROL *) (NewUserInfo + 1);
 | 
						|
  Control->Type            = EFI_USER_INFO_ACCESS_ENROLL_SELF;
 | 
						|
  Control->Size            = sizeof (EFI_USER_INFO_ACCESS_CONTROL);
 | 
						|
 | 
						|
  NewUserInfo->InfoType    = EFI_USER_INFO_ACCESS_POLICY_RECORD;
 | 
						|
  NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV | 
 | 
						|
                             EFI_USER_INFO_PUBLIC | 
 | 
						|
                             EFI_USER_INFO_EXCLUSIVE;
 | 
						|
  NewUserInfo->InfoSize    = sizeof (EFI_USER_INFO) + Control->Size;
 | 
						|
  UserInfo                 = NULL;
 | 
						|
  mUserManager->SetInfo (
 | 
						|
                  mUserManager,
 | 
						|
                  User,
 | 
						|
                  &UserInfo,
 | 
						|
                  NewUserInfo,
 | 
						|
                  NewUserInfo->InfoSize
 | 
						|
                  );
 | 
						|
  FreePool (NewUserInfo);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Add a new user profile into the user profile database.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
CallAddUser (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS              Status;
 | 
						|
  EFI_INPUT_KEY           Key;
 | 
						|
  EFI_USER_PROFILE_HANDLE User;
 | 
						|
  UINTN                   UserNameLen;
 | 
						|
  CHAR16                  UserName[USER_NAME_LENGTH];
 | 
						|
  CHAR16                  *QuestionStr;
 | 
						|
  CHAR16                  *PromptStr;
 | 
						|
 | 
						|
  QuestionStr = NULL;
 | 
						|
  PromptStr   = NULL;
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Get user name to add.
 | 
						|
  //
 | 
						|
  UserNameLen = sizeof (UserName);
 | 
						|
  Status = GetUserNameInput (&UserNameLen, UserName);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    if (Status != EFI_ABORTED) {
 | 
						|
      QuestionStr = GetStringById (STRING_TOKEN (STR_GET_USERNAME_FAILED));
 | 
						|
      PromptStr   = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE)); 
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Create a new user profile.
 | 
						|
  //
 | 
						|
  User    = NULL;
 | 
						|
  Status  = mUserManager->Create (mUserManager, &User);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    QuestionStr = GetStringById (STRING_TOKEN (STR_CREATE_PROFILE_FAILED));
 | 
						|
    PromptStr   = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE)); 
 | 
						|
  } else {
 | 
						|
    //
 | 
						|
    // Add default user information.
 | 
						|
    //
 | 
						|
    Status = SetUserName (User, UserNameLen, UserName);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      QuestionStr = GetStringById (STRING_TOKEN (STR_USER_ALREADY_EXISTED));
 | 
						|
      PromptStr   = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE)); 
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    SetCreateDate (User);
 | 
						|
    SetIdentityPolicy (User);
 | 
						|
    SetAccessPolicy (User);
 | 
						|
 | 
						|
    QuestionStr = GetStringById (STRING_TOKEN (STR_CREATE_PROFILE_SUCCESS));
 | 
						|
    PromptStr   = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE)); 
 | 
						|
  }
 | 
						|
 | 
						|
Done:
 | 
						|
  CreatePopUp (
 | 
						|
    EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
 | 
						|
    &Key,
 | 
						|
    QuestionStr,
 | 
						|
    L"",
 | 
						|
    PromptStr,
 | 
						|
    NULL
 | 
						|
    );
 | 
						|
  FreePool (QuestionStr);
 | 
						|
  FreePool (PromptStr);
 | 
						|
}
 | 
						|
 |