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