Update UID drivers to align with latest UEFI spec 2.3.1.
authorgdong1 <gdong1@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 26 Oct 2011 02:03:57 +0000 (02:03 +0000)
committergdong1 <gdong1@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 26 Oct 2011 02:03:57 +0000 (02:03 +0000)
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

SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialProvider.c
SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialProvider.c
SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyManager.c
SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyAccessPolicy.c [new file with mode: 0644]
SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyIdentityPolicy.c [new file with mode: 0644]
SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileAdd.c
SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileDelete.c
SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManager.h
SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManagerDxe.inf
SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileModify.c

index 0016db8..afb090a 100644 (file)
@@ -745,7 +745,6 @@ CredentialEnroll (
   EFI_USER_INFO             *UserInfo;\r
   CHAR8                     Password[CREDENTIAL_LEN];\r
   EFI_INPUT_KEY             Key;\r
-  EFI_USER_MANAGER_PROTOCOL *UserManager;\r
   UINT8                     *UserId;\r
   CHAR16                    *QuestionStr;\r
   CHAR16                    *PromptStr;\r
@@ -754,15 +753,6 @@ CredentialEnroll (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiUserManagerProtocolGuid,\r
-                  NULL,\r
-                  (VOID **) &UserManager\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
   //\r
   // Get User Identifier.\r
   //\r
@@ -835,11 +825,6 @@ CredentialEnroll (
     return Status;\r
   }\r
 \r
-  //\r
-  // Notify the user manager driver that credential information has changed.\r
-  //\r
-  UserManager->Notify (UserManager, mCallbackInfo->DriverHandle);  \r
-\r
   return EFI_SUCCESS;\r
 }\r
 \r
index 979cdfd..327a2b0 100644 (file)
@@ -674,7 +674,6 @@ CredentialEnroll (
   USB_INFO                  UsbInfo;\r
   EFI_USER_INFO             *UserInfo;\r
   EFI_INPUT_KEY             Key;\r
-  EFI_USER_MANAGER_PROTOCOL *UserManager;\r
   UINT8                     *UserId;\r
   CHAR16                    *QuestionStr;\r
   CHAR16                    *PromptStr;\r
@@ -683,15 +682,6 @@ CredentialEnroll (
     return EFI_INVALID_PARAMETER;\r
   }\r
  \r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiUserManagerProtocolGuid,\r
-                  NULL,\r
-                  (VOID **) &UserManager\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
   //\r
   // Get User Identifier\r
   //\r
@@ -749,11 +739,6 @@ CredentialEnroll (
     return Status;\r
   }\r
 \r
-  //\r
-  // Notify the user manager driver that credential information has changed.\r
-  //\r
-  UserManager->Notify (UserManager, mCallbackInfo->DriverHandle);  \r
-\r
   return EFI_SUCCESS;\r
 }\r
 \r
index 00826f7..268dfab 100644 (file)
@@ -400,43 +400,6 @@ FindUserProfileByInfo (
   return EFI_NOT_FOUND;\r
 }\r
 \r
-/**\r
-  Find the credential provider in the specified identity policy.\r
-\r
-  @param[in]  FindIdentity        Point to the user identity policy.\r
-  @param[in]  IdentifyInfo        Point to the user information to be searched.\r
-\r
-  @retval TRUE     The credential provider was found in the identity policy.\r
-  @retval FALSE    The credential provider was not found.\r
-**/\r
-BOOLEAN\r
-FindProvider (\r
-  IN       EFI_USER_INFO_IDENTITY_POLICY        *FindIdentity,\r
-  IN CONST EFI_USER_INFO                        *IdentifyInfo\r
-  )\r
-{\r
-  UINTN                         TotalLen;\r
-  EFI_USER_INFO_IDENTITY_POLICY *Identity;\r
-\r
-  //\r
-  // Found the credential provider.\r
-  //\r
-  TotalLen = 0;\r
-  while (TotalLen < IdentifyInfo->InfoSize - sizeof (EFI_USER_INFO)) {\r
-    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) ((UINT8 *) (IdentifyInfo + 1) + TotalLen);\r
-    if ((Identity->Type == FindIdentity->Type) &&\r
-        (Identity->Length == FindIdentity->Length) &&\r
-        CompareGuid ((EFI_GUID *) (Identity + 1), (EFI_GUID *) (FindIdentity + 1))\r
-        ) {\r
-      return TRUE;\r
-    }\r
-\r
-    TotalLen += Identity->Length;\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
 \r
 /**\r
   Check whether the access policy is valid.\r
@@ -1009,119 +972,6 @@ ExpandUserProfile (
 }\r
 \r
 \r
-/**\r
-  Add or delete the user's credential record in the provider.\r
-\r
-  @param[in]  ProviderGuid        Point to credential provider guid or class guid.\r
-  @param[in]  ByType              If TRUE, Provider is credential class guid.\r
-                                  If FALSE, Provider is provider guid.\r
-  @param[in]  User                Points to user profile.\r
-  @param[in]  Delete              If TRUE, delete User from the provider; If FALSE, add  \r
-                                  User info from the provider.\r
-\r
-  @retval EFI_SUCCESS      Add or delete record successfully.\r
-  @retval Others           Fail to add or delete record.\r
-\r
-**/\r
-EFI_STATUS\r
-ModifyProviderCredential (\r
-  IN  EFI_GUID                                  *Provider,\r
-  IN  BOOLEAN                                   ByType,\r
-  IN  USER_PROFILE_ENTRY                        *User,\r
-  IN  BOOLEAN                                   Delete\r
-  )\r
-{\r
-  UINTN                         Index;\r
-  EFI_USER_CREDENTIAL2_PROTOCOL *UserCredential;\r
-  \r
-  if (Provider == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  // Find the specified credential provider.\r
-  //\r
-  for (Index = 0; Index < mProviderDb->Count; Index++) {\r
-    //\r
-    // Check credential provider ID.\r
-    //\r
-    UserCredential = mProviderDb->Provider[Index];\r
-    if (CompareGuid (&UserCredential->Identifier, Provider)) {\r
-      if (Delete) {\r
-        return UserCredential->Delete (UserCredential, User);\r
-      } else {\r
-        return UserCredential->Enroll (UserCredential, User);\r
-      }\r
-    }\r
-  }\r
-\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
-  Modify user's credential record in the providers.\r
-\r
-  Found the providers information in PolicyInfo, and then add or delete the user's credential\r
-  record in the providers.\r
-\r
-  @param[in]  User                Points to user profile.\r
-  @param[in]  PolicyInfo          Point to identification policy to be modified.\r
-  @param[in]  InfoLen             The length of PolicyInfo.\r
-  @param[in]  Delete              If TRUE, delete User from the provider; If FALSE, add  \r
-                                  User info from the provider.\r
-\r
-  @retval EFI_SUCCESS      Modify PolicyInfo successfully.\r
-  @retval Others           Fail to modify PolicyInfo.\r
-\r
-**/\r
-EFI_STATUS\r
-ModifyCredentialInfo (\r
-  IN  USER_PROFILE_ENTRY                        *User,\r
-  IN  UINT8                                     *PolicyInfo,\r
-  IN  UINTN                                     InfoLen,\r
-  IN  BOOLEAN                                   Delete\r
-  )\r
-{\r
-  EFI_STATUS                    Status;\r
-  UINTN                         TotalLen;\r
-  EFI_USER_INFO_IDENTITY_POLICY *Identity;\r
-\r
-  //\r
-  // Modify user's credential.\r
-  //\r
-  TotalLen = 0;\r
-  while (TotalLen < InfoLen) {\r
-    //\r
-    // Check identification policy according to type.\r
-    //\r
-    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (PolicyInfo + TotalLen);\r
-    switch (Identity->Type) {\r
-    case EFI_USER_INFO_IDENTITY_CREDENTIAL_TYPE:\r
-      Status = ModifyProviderCredential ((EFI_GUID *) (Identity + 1), TRUE, User, Delete);\r
-      if (EFI_ERROR (Status)) {\r
-        return Status;\r
-      }\r
-      break;\r
-\r
-    case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:\r
-      Status = ModifyProviderCredential ((EFI_GUID *) (Identity + 1), FALSE, User, Delete);\r
-      if (EFI_ERROR (Status)) {\r
-        return Status;\r
-      }\r
-      break;\r
-\r
-    default:\r
-      break;\r
-    }\r
-\r
-    TotalLen += Identity->Length;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
 /**\r
   Save the user profile to non-volatile memory, or delete it from non-volatile memory.\r
 \r
@@ -1161,327 +1011,6 @@ SaveNvUserProfile (
   return Status;\r
 }\r
 \r
-\r
-/**\r
-  Replace the old identity info with NewInfo in NV Flash.\r
-\r
-  This function only replace the identity record in the user profile. Don't update\r
-  the the information on the credential provider.\r
-  \r
-  @param[in]   User               Point to the user profile.\r
-  @param[in]   NewInfo            Point to the new identity policy info.\r
-  @param[out]  UserInfo           Point to the new added identity info.\r
-\r
-  @retval EFI_SUCCESS      Replace user identity successfully.\r
-  @retval Others           Fail to Replace user identity.\r
-\r
-**/\r
-EFI_STATUS\r
-SaveUserIpInfo (\r
-  IN       USER_PROFILE_ENTRY                   * User,\r
-  IN CONST EFI_USER_INFO                        * NewInfo,\r
-  OUT   EFI_USER_INFO                           **UserInfo OPTIONAL\r
-  )\r
-{\r
-  EFI_STATUS    Status;\r
-  EFI_USER_INFO *OldIpInfo;\r
-  UINTN         Offset;\r
-  UINTN         NextOffset;\r
-\r
-  if ((NewInfo == NULL) || (User == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  \r
-  //\r
-  // Get user old identify policy information.\r
-  //\r
-  OldIpInfo = NULL;\r
-  Status    = FindUserInfoByType (User, &OldIpInfo, EFI_USER_INFO_IDENTITY_POLICY_RECORD);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  \r
-  //\r
-  // Get the old identity policy offset.\r
-  //\r
-  Status = FindUserInfo (User, &OldIpInfo, FALSE, &Offset);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  \r
-  //\r
-  // Delete the old identity policy information.\r
-  //\r
-  NextOffset = ALIGN_VARIABLE (OldIpInfo->InfoSize) + Offset;\r
-  User->UserProfileSize -= ALIGN_VARIABLE (OldIpInfo->InfoSize);\r
-  if (Offset < User->UserProfileSize) {\r
-    CopyMem (User->ProfileInfo + Offset, User->ProfileInfo + NextOffset, User->UserProfileSize - Offset);\r
-  }\r
-  \r
-  //\r
-  // Add new user information.\r
-  //\r
-  if (User->MaxProfileSize - User->UserProfileSize < ALIGN_VARIABLE (NewInfo->InfoSize)) {\r
-    if (!ExpandUserProfile (User, ALIGN_VARIABLE (NewInfo->InfoSize))) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-  }\r
-\r
-  CopyMem (User->ProfileInfo + User->UserProfileSize, (VOID *) NewInfo, NewInfo->InfoSize);\r
-  if (UserInfo != NULL) {\r
-    *UserInfo = (EFI_USER_INFO *) (User->ProfileInfo + User->UserProfileSize);\r
-  }\r
-\r
-  User->UserProfileSize += ALIGN_VARIABLE (NewInfo->InfoSize);\r
-\r
-  //\r
-  // Save user profile information.\r
-  //\r
-  Status = SaveNvUserProfile (User, FALSE);\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Remove the provider in FindIdentity from the user identification information record.\r
-  \r
-  @param[in, out] NewInfo       On entry, points to the user information to remove provider. \r
-                                On return, points to the user information the provider is removed.\r
-  @param[in]      FindIdentity  Point to the user identity policy.\r
-\r
-  @retval TRUE                  The provider is removed successfully.\r
-  @retval FALSE                 Fail to remove the provider.\r
-\r
-**/\r
-BOOLEAN\r
-RemoveProvider (\r
-  IN OUT EFI_USER_INFO                         **NewInfo,\r
-  IN     EFI_USER_INFO_IDENTITY_POLICY         *FindIdentity\r
-  )\r
-{\r
-  UINTN                         TotalLen;\r
-  EFI_USER_INFO_IDENTITY_POLICY *Identity;\r
-  EFI_USER_INFO                 *IdentifyInfo;\r
-  UINT8                         *Buffer;\r
-\r
-  IdentifyInfo = *NewInfo;\r
-  TotalLen = IdentifyInfo->InfoSize - sizeof (EFI_USER_INFO);\r
-  if (TotalLen == FindIdentity->Length) {\r
-    //\r
-    // Only one credential provider in the identification policy.\r
-    // Set the new policy to be TRUE after removed the provider.\r
-    //\r
-    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (IdentifyInfo + 1);\r
-    Identity->Type         = EFI_USER_INFO_IDENTITY_TRUE;\r
-    Identity->Length       = sizeof (EFI_USER_INFO_IDENTITY_POLICY);  \r
-    IdentifyInfo->InfoSize = sizeof (EFI_USER_INFO) + Identity->Length;\r
-    return TRUE;\r
-  }\r
-\r
-  //\r
-  // Found the credential provider.\r
-  //\r
-  TotalLen = 0;\r
-  while (TotalLen < IdentifyInfo->InfoSize - sizeof (EFI_USER_INFO)) {\r
-    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) ((UINT8 *) (IdentifyInfo + 1) + TotalLen);\r
-    if ((Identity->Type == FindIdentity->Type) &&\r
-        (Identity->Length == FindIdentity->Length) &&\r
-        CompareGuid ((EFI_GUID *) (Identity + 1), (EFI_GUID *) (FindIdentity + 1))\r
-        ) {\r
-      //\r
-      // Found the credential provider to delete\r
-      //\r
-      if (Identity == (EFI_USER_INFO_IDENTITY_POLICY *)(IdentifyInfo + 1)) {\r
-        //\r
-        // It is the first item in the identification policy, delete it and the connector after it.\r
-        //\r
-        Buffer = (UINT8 *) Identity + Identity->Length + sizeof(EFI_USER_INFO_IDENTITY_POLICY);\r
-        IdentifyInfo->InfoSize -= Identity->Length + sizeof(EFI_USER_INFO_IDENTITY_POLICY);\r
-        TotalLen = IdentifyInfo->InfoSize - sizeof (EFI_USER_INFO);\r
-        CopyMem (Identity, Buffer, TotalLen);\r
-       } else {\r
-        //\r
-        // It is not the first item in the identification policy, delete it and the connector before it.\r
-        //\r
-        Buffer    = (UINT8 *) Identity + Identity->Length;\r
-        TotalLen  = IdentifyInfo->InfoSize - sizeof (EFI_USER_INFO);\r
-        TotalLen -= (Buffer - (UINT8 *)(IdentifyInfo + 1));\r
-        IdentifyInfo->InfoSize -= Identity->Length + sizeof(EFI_USER_INFO_IDENTITY_POLICY);\r
-        CopyMem ((UINT8 *) (Identity - 1), Buffer, TotalLen);\r
-      }      \r
-      return TRUE;\r
-    }\r
-\r
-    TotalLen += Identity->Length;\r
-  }  \r
-  return FALSE;\r
-}\r
-\r
-\r
-/**\r
-  This function replaces the old identity policy with a new identity policy.\r
-\r
-  This function changes user identity policy information.\r
-  If enroll new credential failed, recover the old identity policy.\r
-\r
-  For new policy:\r
-  a. For each credential, if it is newly added, try to enroll it.\r
-     If enroll failed, try to delete the newly added ones.\r
-  \r
-  b. For each credential, if it exists in the old policy, delete old one, \r
-     and enroll new one. If failed to enroll the new one, removed it from new \r
-     identification policy.\r
-\r
-  For old policy:  \r
-  a. For each credential, if it does not exist in new one, delete it.\r
-\r
-  @param[in]  User         Point to the user profile.\r
-  @param[in]  Info         Points to the user identity information.\r
-  @param[in]  InfoSize     The size of Info (Not used in this function).\r
-  @param[out] IpInfo       The new identification info after modify.\r
-\r
-  @retval EFI_SUCCESS      Modify user identity policy successfully.\r
-  @retval Others           Fail to modify user identity policy.\r
-\r
-**/\r
-EFI_STATUS\r
-ModifyUserIpInfo (\r
-  IN        USER_PROFILE_ENTRY                  *User,\r
-  IN CONST  EFI_USER_INFO                       *Info,\r
-  IN        UINTN                               InfoSize,\r
-     OUT    EFI_USER_INFO                       **IpInfo\r
-  )\r
-{\r
-  EFI_STATUS                    Status;\r
-  EFI_USER_INFO                 *OldIpInfo;\r
-  UINTN                         TotalLen;\r
-  EFI_USER_INFO_IDENTITY_POLICY *Identity;\r
-  UINT32                        CredentialCount;\r
-  EFI_USER_INFO                 *NewIpInfo;\r
-\r
-  //\r
-  // Get user old identify policy information.\r
-  //\r
-  OldIpInfo = NULL;\r
-  Status    = FindUserInfoByType (User, &OldIpInfo, EFI_USER_INFO_IDENTITY_POLICY_RECORD);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  ASSERT (OldIpInfo != NULL);\r
-  \r
-  //\r
-  // Enroll new added credential provider.\r
-  //\r
-  CredentialCount = 0;\r
-  TotalLen        = 0;\r
-  while (TotalLen < Info->InfoSize - sizeof (EFI_USER_INFO)) {\r
-    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) ((UINT8 *) (Info + 1) + TotalLen);\r
-    if (Identity->Type == EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER) {\r
-      if (!FindProvider (Identity, OldIpInfo)) {\r
-        //\r
-        // The credential is NOT found in the old identity policy; add it.\r
-        //\r
-        Status = ModifyCredentialInfo (User, (UINT8 *) Identity, Identity->Length, FALSE);\r
-        if (EFI_ERROR (Status)) {\r
-          break;\r
-        }\r
-        CredentialCount++;\r
-      }\r
-    }\r
-\r
-    TotalLen += Identity->Length;\r
-  }\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    //\r
-    // Enroll new credential failed. Delete the newly enrolled credential, and return.\r
-    //\r
-    TotalLen = 0;\r
-    while (TotalLen < Info->InfoSize - sizeof (EFI_USER_INFO)) {\r
-      Identity = (EFI_USER_INFO_IDENTITY_POLICY *) ((UINT8 *) (Info + 1) + TotalLen);\r
-      if (Identity->Type == EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER) {\r
-        if (!FindProvider (Identity, OldIpInfo)) {\r
-          //\r
-          // The credential is NOT found in the old identity policy. Delete it.\r
-          //\r
-          if (CredentialCount == 0) {\r
-            break;\r
-          }\r
-\r
-          ModifyCredentialInfo (User, (UINT8 *) Identity, Identity->Length, TRUE);\r
-          CredentialCount--;\r
-        }\r
-      }\r
-      TotalLen += Identity->Length;\r
-    }\r
-\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  \r
-  //\r
-  // Backup new identification policy\r
-  //\r
-  NewIpInfo = AllocateCopyPool (Info->InfoSize, Info);    \r
-  ASSERT (NewIpInfo != NULL);\r
-\r
-  //\r
-  // Enroll the credential that existed in the old identity policy.\r
-  //\r
-  TotalLen = 0;\r
-  while (TotalLen < Info->InfoSize - sizeof (EFI_USER_INFO)) {\r
-    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) ((UINT8 *) (Info + 1) + TotalLen);\r
-    if (Identity->Type == EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER) {\r
-      if (FindProvider (Identity, OldIpInfo)) {\r
-        //\r
-        // The credential is found in the old identity policy, so delete the old credential first.\r
-        //\r
-        Status = ModifyCredentialInfo (User, (UINT8 *) Identity, Identity->Length, TRUE);\r
-        if (EFI_ERROR (Status)) {\r
-          //\r
-          // Failed to delete old credential.\r
-          //\r
-          FreePool (NewIpInfo);\r
-          return EFI_DEVICE_ERROR;\r
-        }\r
-\r
-        //\r
-        // Add the new credential.\r
-        //\r
-        Status = ModifyCredentialInfo (User, (UINT8 *) Identity, Identity->Length, FALSE);\r
-        if (EFI_ERROR (Status)) {\r
-          //\r
-          // Failed to enroll the user by new identification policy.\r
-          // So removed the credential provider from the identification policy          \r
-          //\r
-          RemoveProvider (&NewIpInfo, Identity);\r
-        }        \r
-      }\r
-    }\r
-    TotalLen += Identity->Length;\r
-  }\r
-  \r
-  //\r
-  // Delete old credential that didn't exist in the new identity policy.\r
-  //\r
-  TotalLen = 0;\r
-  while (TotalLen < OldIpInfo->InfoSize - sizeof (EFI_USER_INFO)) {\r
-    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) ((UINT8 *) (OldIpInfo + 1) + TotalLen);\r
-    if (Identity->Type == EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER) {\r
-      if (!FindProvider (Identity, Info)) {\r
-        //\r
-        // The credential is NOT found in the new identity policy. Delete the old credential.\r
-        //\r
-        ModifyCredentialInfo (User, (UINT8 *) Identity, Identity->Length, TRUE);\r
-      }\r
-    }\r
-    TotalLen += Identity->Length;\r
-  }\r
-\r
-  *IpInfo = NewIpInfo;\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
 /**\r
   Add one new user info into the user's profile.\r
 \r
@@ -1528,21 +1057,6 @@ AddUserInfo (
     }\r
   }\r
   \r
-  //\r
-  // Add credential.\r
-  //\r
-  if (((EFI_USER_INFO *) Info)->InfoType == EFI_USER_INFO_IDENTITY_POLICY_RECORD) {\r
-    Status = ModifyCredentialInfo (\r
-              User,\r
-              (UINT8 *) ((EFI_USER_INFO *) Info + 1),\r
-              InfoSize - sizeof (EFI_USER_INFO),\r
-              FALSE\r
-              );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-  \r
   //\r
   // Add new user information.\r
   //\r
@@ -1681,11 +1195,6 @@ DelUserInfo (
 \r
   if (Info->InfoType == EFI_USER_INFO_IDENTIFIER_RECORD) {\r
     return EFI_ACCESS_DENIED;\r
-  } else if (Info->InfoType == EFI_USER_INFO_IDENTITY_POLICY_RECORD) {\r
-    Status = ModifyCredentialInfo (User, (UINT8 *) (Info + 1), Info->InfoSize - sizeof (EFI_USER_INFO), TRUE);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
   }\r
   \r
   //\r
@@ -1731,7 +1240,6 @@ ModifyUserInfo (
   EFI_STATUS    Status;\r
   UINTN         PayloadLen;\r
   EFI_USER_INFO *OldInfo;\r
-  EFI_USER_INFO *IpInfo;\r
 \r
   if ((UserInfo == NULL) || (Info == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -1833,25 +1341,6 @@ ModifyUserInfo (
     } while (TRUE);    \r
   }\r
 \r
-  if (Info->InfoType == EFI_USER_INFO_IDENTITY_POLICY_RECORD) {\r
-    //\r
-    // For user identification policy, need to update the info in credential provider.\r
-    //\r
-    IpInfo = NULL;\r
-    Status = ModifyUserIpInfo (User, Info, InfoSize, &IpInfo);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-\r
-    ASSERT (IpInfo != NULL);\r
-    Status = SaveUserIpInfo (User, IpInfo, UserInfo);\r
-    if (IpInfo->InfoSize != Info->InfoSize) {\r
-      Status = EFI_DEVICE_ERROR;\r
-    }\r
-    FreePool (IpInfo);    \r
-    return Status;\r
-  }\r
-\r
   Status = DelUserInfo (User, *UserInfo, FALSE);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
@@ -1877,7 +1366,6 @@ DelUserProfile (
 {\r
   EFI_STATUS          Status;\r
   UINTN               Index;\r
-  EFI_USER_INFO       *UserInfo;\r
 \r
   //\r
   // Check whether it is in the user profile database.\r
@@ -1894,18 +1382,6 @@ DelUserProfile (
     return EFI_ACCESS_DENIED;\r
   }\r
   \r
-  //\r
-  // Delete user credential information.\r
-  //\r
-  UserInfo  = NULL;\r
-  Status    = FindUserInfoByType (User, &UserInfo, EFI_USER_INFO_IDENTITY_POLICY_RECORD);\r
-  if (Status == EFI_SUCCESS) {\r
-    Status = DelUserInfo (User, UserInfo, FALSE);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-  \r
   //\r
   // Delete user profile from the non-volatile memory.\r
   //\r
@@ -4028,6 +3504,8 @@ UserProfileGetInfo (
   This function changes user information.  If NULL is pointed to by UserInfo, then a new user \r
   information record is created and its handle is returned in UserInfo. Otherwise, the existing  \r
   one is replaced.\r
+  If EFI_USER_INFO_IDENITTY_POLICY_RECORD is changed, it is the caller's responsibility to keep \r
+  it to be synced with the information on credential providers.\r
   If EFI_USER_INFO_EXCLUSIVE is specified in Info and a user information record of the same \r
   type already exists in the user profile, then EFI_ACCESS_DENIED will be returned and UserInfo\r
   will point to the handle of the existing record.\r
@@ -4116,12 +3594,15 @@ UserProfileSetInfo (
   Called by credential provider to notify of information change.\r
 \r
   This function allows the credential provider to notify the User Identity Manager when user status  \r
-  has changed while deselected.\r
+  has changed.\r
   If the User Identity Manager doesn't support asynchronous changes in credentials, then this function \r
   should return EFI_UNSUPPORTED. \r
-  If the User Identity Manager supports this, it will call User() to get the user identifier and then \r
-  GetNextInfo() and GetInfo() in the User Credential Protocol to get all of the information from the \r
-  credential and add it.\r
+  If current user does not exist, and the credential provider can identify a user, then make the user \r
+  to be current user and signal the EFI_EVENT_GROUP_USER_PROFILE_CHANGED event.\r
+  If current user already exists, and the credential provider can identify another user, then switch \r
+  current user to the newly identified user, and signal the EFI_EVENT_GROUP_USER_PROFILE_CHANGED event.\r
+  If current user was identified by this credential provider and now the credential provider cannot identify \r
+  current user, then logout current user and signal the EFI_EVENT_GROUP_USER_PROFILE_CHANGED event.\r
 \r
   @param[in] This          Points to this instance of the EFI_USER_MANAGER_PROTOCOL.\r
   @param[in] Changed       Handle on which is installed an instance of the EFI_USER_CREDENTIAL2_PROTOCOL \r
@@ -4138,102 +3619,8 @@ UserProfileNotify (
   IN CONST  EFI_USER_MANAGER_PROTOCOL           *This,\r
   IN        EFI_HANDLE                          Changed\r
   )\r
-{\r
-  EFI_STATUS                    Status;\r
-  EFI_USER_CREDENTIAL2_PROTOCOL *Provider;\r
-  EFI_USER_INFO_IDENTIFIER      UserId;\r
-  EFI_USER_INFO_HANDLE          UserInfo;\r
-  EFI_USER_INFO_HANDLE          UserInfo2;\r
-  UINTN                         InfoSize;\r
-  EFI_USER_INFO                 *Info;\r
-  USER_PROFILE_ENTRY            *User;\r
-\r
-  if (This == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  \r
-  Status = gBS->HandleProtocol (\r
-                  Changed,\r
-                  &gEfiUserCredential2ProtocolGuid,\r
-                  (VOID **) &Provider\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  Status = Provider->User (Provider, NULL, &UserId);\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_NOT_READY;\r
-  }\r
-\r
-  //\r
-  // Find user with the UserId.\r
-  //\r
-  User = NULL;\r
-  while (TRUE) {\r
-    //\r
-    // Find next user profile.\r
-    // \r
-    Status = FindUserProfile (&User, TRUE, NULL);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  \r
-    //\r
-    // Find the user information.\r
-    //\r
-    Info = NULL;\r
-    FindUserInfoByType (User, &Info, EFI_USER_INFO_IDENTIFIER_RECORD);\r
-    if (CompareMem ((UINT8 *) (Info + 1), UserId, sizeof (UserId)) == 0) {\r
-      //\r
-      // Found the infomation record. \r
-      //\r
-      break;\r
-    }\r
-  }\r
-\r
-  UserInfo = NULL;\r
-  do {\r
-    //\r
-    // Get user info handle.\r
-    //\r
-    Status = Provider->GetNextInfo(Provider, &UserInfo);\r
-    if (EFI_ERROR (Status)) {\r
-      return EFI_SUCCESS;\r
-    }\r
-\r
-    //\r
-    // Get the user information from the user info handle.\r
-    // \r
-    InfoSize = 0;\r
-    Status = Provider->GetInfo(Provider, UserInfo, NULL, &InfoSize);\r
-    if (EFI_ERROR (Status)) {\r
-      if (Status == EFI_BUFFER_TOO_SMALL) {\r
-        Info = AllocateZeroPool (InfoSize);\r
-        if (Info == NULL) {\r
-          return EFI_OUT_OF_RESOURCES;\r
-        }\r
-        Status = Provider->GetInfo(Provider, UserInfo, Info, &InfoSize);\r
-        if (EFI_ERROR (Status)) {\r
-          FreePool (Info);\r
-          break;\r
-        }\r
-      }\r
-      break;\r
-    }\r
-\r
-    //\r
-    // Save the user information.\r
-    // \r
-    UserInfo2 = NULL;\r
-    Status = UserProfileSetInfo (&gUserIdentifyManager, (EFI_USER_PROFILE_HANDLE)User, &UserInfo2, Info, InfoSize);\r
-    FreePool (Info);\r
-    if (EFI_ERROR (Status)) {\r
-      break;\r
-    }\r
-  } while (TRUE);\r
-  \r
-  return Status;\r
+{    \r
+  return EFI_UNSUPPORTED;\r
 }\r
 \r
 \r
diff --git a/SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyAccessPolicy.c b/SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyAccessPolicy.c
new file mode 100644 (file)
index 0000000..613751e
--- /dev/null
@@ -0,0 +1,702 @@
+/** @file\r
+  The functions for access policy modification.\r
+    \r
+Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials \r
+are licensed and made available under the terms and conditions of the BSD License \r
+which accompanies this distribution.  The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "UserProfileManager.h"\r
+\r
+/**\r
+  Collect all the access policy data to mUserInfo.AccessPolicy, \r
+  and save it to user profile.\r
+\r
+**/\r
+VOID\r
+SaveAccessPolicy (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  UINTN                         OffSet;\r
+  UINTN                         Size;\r
+  EFI_USER_INFO_ACCESS_CONTROL  Control;\r
+  EFI_USER_INFO_HANDLE          UserInfo;\r
+  EFI_USER_INFO                 *Info;\r
+\r
+  if (mUserInfo.AccessPolicy != NULL) {\r
+    FreePool (mUserInfo.AccessPolicy);\r
+  }\r
+  mUserInfo.AccessPolicy          = NULL;\r
+  mUserInfo.AccessPolicyLen       = 0;\r
+  mUserInfo.AccessPolicyModified  = TRUE;\r
+  OffSet                          = 0;\r
+  \r
+  //\r
+  // Save access right.\r
+  //\r
+  Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL);\r
+  if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
+    ExpandMemory (OffSet, Size);\r
+  }\r
+\r
+  Control.Type = mAccessInfo.AccessRight;\r
+  Control.Size = (UINT32) Size;\r
+  CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
+  OffSet += sizeof (Control);\r
+  \r
+  //\r
+  // Save access setup.\r
+  //\r
+  Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (EFI_GUID);\r
+  if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
+    ExpandMemory (OffSet, Size);\r
+  }\r
+\r
+  Control.Type = EFI_USER_INFO_ACCESS_SETUP;\r
+  Control.Size = (UINT32) Size;  \r
+  CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
+  OffSet += sizeof (Control);\r
+  \r
+  if (mAccessInfo.AccessSetup == ACCESS_SETUP_NORMAL) {\r
+    CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupNormalGuid);\r
+  } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_RESTRICTED) {\r
+    CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupRestrictedGuid);\r
+  } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_ADMIN) {\r
+    CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupAdminGuid);\r
+  }\r
+  OffSet += sizeof (EFI_GUID);\r
+  \r
+  //\r
+  // Save access of boot order.\r
+  //\r
+  Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (UINT32);\r
+  if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
+    ExpandMemory (OffSet, Size);\r
+  }\r
+\r
+  Control.Type = EFI_USER_INFO_ACCESS_BOOT_ORDER;\r
+  Control.Size = (UINT32) Size;  \r
+  CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
+  OffSet += sizeof (Control);\r
+\r
+  CopyMem ((UINT8 *) (mUserInfo.AccessPolicy + OffSet), &mAccessInfo.AccessBootOrder, sizeof (UINT32));\r
+  OffSet += sizeof (UINT32);\r
+  \r
+  //\r
+  // Save permit load.\r
+  //\r
+  if (mAccessInfo.LoadPermitLen > 0) {\r
+    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.LoadPermitLen;\r
+    if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
+      ExpandMemory (OffSet, Size);\r
+    }\r
+\r
+    Control.Type = EFI_USER_INFO_ACCESS_PERMIT_LOAD;\r
+    Control.Size = (UINT32) Size;  \r
+    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
+    OffSet += sizeof (Control);\r
+  \r
+    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadPermit, mAccessInfo.LoadPermitLen);\r
+    OffSet += mAccessInfo.LoadPermitLen;\r
+  }\r
+  \r
+  //\r
+  // Save forbid load.\r
+  //\r
+  if (mAccessInfo.LoadForbidLen > 0) {\r
+    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.LoadForbidLen;\r
+    if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
+      ExpandMemory (OffSet, Size);\r
+    }\r
+\r
+    Control.Type = EFI_USER_INFO_ACCESS_FORBID_LOAD;\r
+    Control.Size = (UINT32) Size;  \r
+    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
+    OffSet += sizeof (Control);\r
+    \r
+    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadForbid, mAccessInfo.LoadForbidLen);\r
+    OffSet += mAccessInfo.LoadForbidLen;\r
+  }\r
+  \r
+  //\r
+  // Save permit connect.\r
+  //\r
+  if (mAccessInfo.ConnectPermitLen > 0) {\r
+    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.ConnectPermitLen;\r
+    if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
+      ExpandMemory (OffSet, Size);\r
+    }\r
+\r
+    Control.Type = EFI_USER_INFO_ACCESS_PERMIT_CONNECT;\r
+    Control.Size = (UINT32) Size;  \r
+    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
+    OffSet += sizeof (Control);\r
+    \r
+    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectPermit, mAccessInfo.ConnectPermitLen);\r
+    OffSet += mAccessInfo.ConnectPermitLen;\r
+  }\r
+  \r
+  //\r
+  // Save forbid connect.\r
+  //\r
+  if (mAccessInfo.ConnectForbidLen > 0) {\r
+    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.ConnectForbidLen;\r
+    if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
+      ExpandMemory (OffSet, Size);\r
+    }\r
+\r
+    Control.Type = EFI_USER_INFO_ACCESS_FORBID_CONNECT;\r
+    Control.Size = (UINT32) Size;  \r
+    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
+    OffSet += sizeof (Control);\r
+    \r
+    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectForbid, mAccessInfo.ConnectForbidLen);\r
+    OffSet += mAccessInfo.ConnectForbidLen;\r
+  }\r
+\r
+  mUserInfo.AccessPolicyLen = OffSet;\r
+\r
+  //\r
+  // Save access policy.\r
+  //\r
+  if (mUserInfo.AccessPolicyModified && (mUserInfo.AccessPolicyLen > 0)) {\r
+    Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + mUserInfo.AccessPolicyLen);\r
+    if (Info == NULL) {\r
+      return ;\r
+    }\r
+\r
+    Status = FindInfoByType (mModifyUser, EFI_USER_INFO_ACCESS_POLICY_RECORD, &UserInfo);\r
+    if (!EFI_ERROR (Status)) {\r
+      Info->InfoType    = EFI_USER_INFO_ACCESS_POLICY_RECORD;\r
+      Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |\r
+                          EFI_USER_INFO_PUBLIC |\r
+                          EFI_USER_INFO_EXCLUSIVE;\r
+      Info->InfoSize    = (UINT32) (sizeof (EFI_USER_INFO) + mUserInfo.AccessPolicyLen);\r
+      CopyMem ((UINT8 *) (Info + 1), mUserInfo.AccessPolicy, mUserInfo.AccessPolicyLen);\r
+      Status = mUserManager->SetInfo (\r
+                               mUserManager,\r
+                               mModifyUser,\r
+                               &UserInfo,\r
+                               Info,\r
+                               Info->InfoSize\r
+                               );\r
+      mUserInfo.AccessPolicyModified = FALSE;\r
+    }\r
+    FreePool (Info);\r
+  }\r
+\r
+  if (mAccessInfo.ConnectForbid != NULL) {\r
+    FreePool (mAccessInfo.ConnectForbid);\r
+    mAccessInfo.ConnectForbid = NULL;\r
+  }\r
+\r
+  if (mAccessInfo.ConnectPermit != NULL) {\r
+    FreePool (mAccessInfo.ConnectPermit);\r
+    mAccessInfo.ConnectPermit = NULL;\r
+  }\r
+\r
+  if (mAccessInfo.LoadForbid != NULL) {\r
+    FreePool (mAccessInfo.LoadForbid);\r
+    mAccessInfo.LoadForbid = NULL;\r
+  }\r
+\r
+  if (mAccessInfo.LoadPermit != NULL) {\r
+    FreePool (mAccessInfo.LoadPermit);\r
+    mAccessInfo.LoadPermit = NULL;\r
+  }\r
+}\r
+\r
+/**\r
+  Create an action OpCode with QuestionID and DevicePath on a given OpCodeHandle.\r
+\r
+  @param[in]  QuestionID            The question ID.\r
+  @param[in]  DevicePath            Points to device path.\r
+  @param[in]  OpCodeHandle          Points to container for dynamic created opcodes.\r
+\r
+**/\r
+VOID\r
+AddDevicePath (\r
+  IN  UINTN                                     QuestionID,\r
+  IN  EFI_DEVICE_PATH_PROTOCOL                  *DevicePath,\r
+  IN     VOID                                   *OpCodeHandle\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  EFI_DEVICE_PATH_PROTOCOL          *Next;\r
+  EFI_STRING_ID                     NameID;\r
+  EFI_STRING                        DriverName;\r
+  EFI_DEVICE_PATH_TO_TEXT_PROTOCOL  *DevicePathText;\r
+\r
+  //\r
+  // Locate device path to text protocol.\r
+  //\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiDevicePathToTextProtocolGuid,\r
+                  NULL,\r
+                  (VOID **) &DevicePathText\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return ;\r
+  }\r
+  \r
+  //\r
+  // Get driver file name node.\r
+  //\r
+  Next = DevicePath;\r
+  while (!IsDevicePathEnd (Next)) {\r
+    DevicePath  = Next;\r
+    Next        = NextDevicePathNode (Next);\r
+  }\r
+\r
+  //\r
+  // Display the device path in form.\r
+  //\r
+  DriverName = DevicePathText->ConvertDevicePathToText (DevicePath, FALSE, FALSE);\r
+  NameID = HiiSetString (mCallbackInfo->HiiHandle, 0, DriverName, NULL);\r
+  FreePool (DriverName);\r
+  if (NameID == 0) {\r
+    return ;\r
+  }\r
+\r
+  HiiCreateActionOpCode (\r
+    OpCodeHandle,                   // Container for dynamic created opcodes\r
+    (UINT16) QuestionID,            // Question ID\r
+    NameID,                         // Prompt text\r
+    STRING_TOKEN (STR_NULL_STRING), // Help text\r
+    EFI_IFR_FLAG_CALLBACK,          // Question flag\r
+    0                               // Action String ID\r
+    );\r
+}\r
+\r
+\r
+/**\r
+  Check whether the DevicePath is in the device path forbid list \r
+  (mAccessInfo.LoadForbid).\r
+\r
+  @param[in]  DevicePath           Points to device path.\r
+  \r
+  @retval TRUE     The DevicePath is in the device path forbid list.\r
+  @retval FALSE    The DevicePath is not in the device path forbid list.\r
+\r
+**/\r
+BOOLEAN\r
+IsLoadForbidden (\r
+  IN  EFI_DEVICE_PATH_PROTOCOL                  *DevicePath\r
+  )\r
+{\r
+  UINTN                     OffSet;\r
+  UINTN                     DPSize;\r
+  UINTN                     Size;\r
+  EFI_DEVICE_PATH_PROTOCOL  *Dp;\r
+\r
+  OffSet = 0;\r
+  Size   = GetDevicePathSize (DevicePath);\r
+  //\r
+  // Check each device path.\r
+  //\r
+  while (OffSet < mAccessInfo.LoadForbidLen) {\r
+    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);\r
+    DPSize  = GetDevicePathSize (Dp);\r
+    //\r
+    // Compare device path.\r
+    //\r
+    if ((DPSize == Size) && (CompareMem (DevicePath, Dp, Size) == 0)) {\r
+      return TRUE;\r
+    }\r
+    OffSet += DPSize;\r
+  }\r
+  return FALSE;\r
+}\r
+\r
+\r
+/**\r
+  Display the permit load device path in the loadable device path list.\r
+\r
+**/\r
+VOID\r
+DisplayLoadPermit(\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS          Status;\r
+  CHAR16              *Order;\r
+  UINTN               OrderSize;\r
+  UINTN               ListCount;\r
+  UINTN               Index;\r
+  UINT8               *Var;\r
+  UINT8               *VarPtr;\r
+  CHAR16              VarName[12];\r
+  VOID                *StartOpCodeHandle;\r
+  VOID                *EndOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL  *StartLabel;\r
+  EFI_IFR_GUID_LABEL  *EndLabel;\r
+\r
+  //\r
+  // Get DriverOrder.\r
+  //\r
+  OrderSize = 0;\r
+  Status    = gRT->GetVariable (\r
+                     L"DriverOrder", \r
+                     &gEfiGlobalVariableGuid, \r
+                     NULL, \r
+                     &OrderSize, \r
+                     NULL\r
+                     );\r
+  if (Status != EFI_BUFFER_TOO_SMALL) {\r
+    return ;\r
+  }\r
+\r
+  Order = AllocateZeroPool (OrderSize);\r
+  if (Order == NULL) {\r
+    return ;\r
+  }\r
+\r
+  Status = gRT->GetVariable (\r
+                  L"DriverOrder", \r
+                  &gEfiGlobalVariableGuid, \r
+                  NULL, \r
+                  &OrderSize, \r
+                  Order\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return ;\r
+  }\r
+  \r
+  //\r
+  // Initialize the container for dynamic opcodes.\r
+  //\r
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (StartOpCodeHandle != NULL);\r
+\r
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (EndOpCodeHandle != NULL);\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode.\r
+  //\r
+  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
+                                        StartOpCodeHandle,\r
+                                        &gEfiIfrTianoGuid,\r
+                                        NULL,\r
+                                        sizeof (EFI_IFR_GUID_LABEL)\r
+                                        );\r
+  StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;\r
+  StartLabel->Number        = LABEL_PERMIT_LOAD_FUNC;\r
+\r
+  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
+                                      EndOpCodeHandle,\r
+                                      &gEfiIfrTianoGuid,\r
+                                      NULL,\r
+                                      sizeof (EFI_IFR_GUID_LABEL)\r
+                                      );\r
+  EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;\r
+  EndLabel->Number        = LABEL_END;\r
+\r
+  //\r
+  // Add each driver option.\r
+  //\r
+  Var       = NULL;\r
+  ListCount = OrderSize / sizeof (UINT16);\r
+  for (Index = 0; Index < ListCount; Index++) {\r
+    //\r
+    // Get driver device path.\r
+    //\r
+    UnicodeSPrint (VarName, sizeof (VarName), L"Driver%04x", Order[Index]);\r
+    Var = GetEfiGlobalVariable (VarName);\r
+    if (Var == NULL) {\r
+      continue;\r
+    }\r
+    \r
+    //\r
+    // Check whether the driver is already forbidden.\r
+    //\r
+    \r
+    VarPtr = Var;\r
+    //\r
+    // Skip attribute.\r
+    //\r
+    VarPtr += sizeof (UINT32);\r
+\r
+    //\r
+    // Skip device path lenth.\r
+    //\r
+    VarPtr += sizeof (UINT16);\r
+\r
+    //\r
+    // Skip descript string.\r
+    //\r
+    VarPtr += StrSize ((UINT16 *) VarPtr);\r
+\r
+    if (IsLoadForbidden ((EFI_DEVICE_PATH_PROTOCOL *) VarPtr)) {\r
+      FreePool (Var);\r
+      Var = NULL;\r
+      continue;\r
+    }\r
+\r
+    AddDevicePath (\r
+      KEY_MODIFY_USER | KEY_MODIFY_AP_DP | KEY_LOAD_PERMIT_MODIFY | Order[Index],\r
+      (EFI_DEVICE_PATH_PROTOCOL *) VarPtr,\r
+      StartOpCodeHandle\r
+      );\r
+    FreePool (Var);\r
+    Var = NULL;\r
+  }\r
+\r
+  HiiUpdateForm (\r
+    mCallbackInfo->HiiHandle, // HII handle\r
+    &gUserProfileManagerGuid, // Formset GUID\r
+    FORMID_PERMIT_LOAD_DP,    // Form ID\r
+    StartOpCodeHandle,        // Label for where to insert opcodes\r
+    EndOpCodeHandle           // Replace data\r
+    );\r
+\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+\r
+  //\r
+  // Clear Environment.\r
+  //\r
+  if (Var != NULL) {\r
+    FreePool (Var);\r
+  }\r
+  FreePool (Order);\r
+}\r
+\r
+\r
+/**\r
+  Display the forbid load device path list (mAccessInfo.LoadForbid).\r
+\r
+**/\r
+VOID\r
+DisplayLoadForbid (\r
+  VOID\r
+  )\r
+{\r
+  UINTN                     Offset;\r
+  UINTN                     DPSize;\r
+  UINTN                     Index;\r
+  EFI_DEVICE_PATH_PROTOCOL  *Dp;\r
+  VOID                      *StartOpCodeHandle;\r
+  VOID                      *EndOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL        *StartLabel;\r
+  EFI_IFR_GUID_LABEL        *EndLabel;\r
+\r
+  //\r
+  // Initialize the container for dynamic opcodes.\r
+  //\r
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (StartOpCodeHandle != NULL);\r
+\r
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (EndOpCodeHandle != NULL);\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode.\r
+  //\r
+  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
+                                        StartOpCodeHandle,\r
+                                        &gEfiIfrTianoGuid,\r
+                                        NULL,\r
+                                        sizeof (EFI_IFR_GUID_LABEL)\r
+                                        );\r
+  StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;\r
+  StartLabel->Number        = LABLE_FORBID_LOAD_FUNC;\r
+\r
+  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
+                                      EndOpCodeHandle,\r
+                                      &gEfiIfrTianoGuid,\r
+                                      NULL,\r
+                                      sizeof (EFI_IFR_GUID_LABEL)\r
+                                      );\r
+  EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;\r
+  EndLabel->Number        = LABEL_END;\r
+\r
+  //\r
+  // Add each forbid load drivers.\r
+  //\r
+  Offset  = 0;\r
+  Index   = 0;\r
+  while (Offset < mAccessInfo.LoadForbidLen) {\r
+    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + Offset);\r
+    DPSize  = GetDevicePathSize (Dp);\r
+    AddDevicePath (\r
+      KEY_MODIFY_USER | KEY_MODIFY_AP_DP | KEY_LOAD_FORBID_MODIFY | Index,\r
+      Dp,\r
+      StartOpCodeHandle\r
+      );\r
+    Index++;\r
+    Offset += DPSize;\r
+  }\r
+\r
+  HiiUpdateForm (\r
+    mCallbackInfo->HiiHandle, // HII handle\r
+    &gUserProfileManagerGuid, // Formset GUID\r
+    FORMID_FORBID_LOAD_DP,    // Form ID\r
+    StartOpCodeHandle,        // Label for where to insert opcodes\r
+    EndOpCodeHandle           // Replace data\r
+    );\r
+\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+}\r
+\r
+\r
+/**\r
+  Display the permit connect device path.\r
+\r
+**/\r
+VOID\r
+DisplayConnectPermit (\r
+  VOID\r
+  )\r
+{\r
+  //\r
+  // Note: \r
+  // As no architect protocol/interface to be called in ConnectController()\r
+  // to verify the device path, just add a place holder for permitted connect\r
+  // device path.\r
+  //\r
+}\r
+\r
+\r
+/**\r
+  Display the forbid connect device path list.\r
+\r
+**/\r
+VOID\r
+DisplayConnectForbid (\r
+  VOID\r
+  )\r
+{\r
+  //\r
+  // Note: \r
+  // As no architect protocol/interface to be called in ConnectController()\r
+  // to verify the device path, just add a place holder for forbidden connect\r
+  // device path.\r
+  //\r
+}\r
+\r
+\r
+/**\r
+  Delete the specified device path by DriverIndex from the forbid device path \r
+  list (mAccessInfo.LoadForbid).\r
+\r
+  @param[in]  DriverIndex   The index of driver in forbidden device path list.\r
+  \r
+**/\r
+VOID\r
+DeleteFromForbidLoad (\r
+  IN  UINT16                                    DriverIndex\r
+  )\r
+{\r
+  UINTN                     OffSet;\r
+  UINTN                     DPSize;\r
+  UINTN                     OffLen;\r
+  EFI_DEVICE_PATH_PROTOCOL  *Dp;\r
+\r
+  OffSet = 0;\r
+  //\r
+  // Find the specified device path.\r
+  //\r
+  while ((OffSet < mAccessInfo.LoadForbidLen) && (DriverIndex > 0)) {\r
+    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);\r
+    DPSize  = GetDevicePathSize (Dp);\r
+    OffSet += DPSize;\r
+    DriverIndex--;\r
+  }\r
+  \r
+  //\r
+  // Specified device path found.\r
+  //\r
+  if (DriverIndex == 0) {\r
+    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);\r
+    DPSize  = GetDevicePathSize (Dp);\r
+    OffLen  = mAccessInfo.LoadForbidLen - OffSet - DPSize;\r
+    if (OffLen > 0) {\r
+      CopyMem (\r
+        mAccessInfo.LoadForbid + OffSet, \r
+        mAccessInfo.LoadForbid + OffSet + DPSize, \r
+        OffLen\r
+        );\r
+    }\r
+    mAccessInfo.LoadForbidLen -= DPSize;\r
+  }\r
+}\r
+\r
+\r
+/**\r
+  Add the specified device path by DriverIndex to the forbid device path \r
+  list (mAccessInfo.LoadForbid).\r
+\r
+  @param[in]  DriverIndex   The index of driver saved in driver options.\r
+  \r
+**/\r
+VOID\r
+AddToForbidLoad (\r
+  IN  UINT16                                    DriverIndex\r
+  )\r
+{\r
+  UINTN       DevicePathLen;\r
+  UINT8       *Var;\r
+  UINT8       *VarPtr;\r
+  UINTN       NewLen;\r
+  UINT8       *NewFL;\r
+  CHAR16      VarName[13];\r
+\r
+  //\r
+  // Get loadable driver device path.\r
+  //\r
+  UnicodeSPrint  (VarName, sizeof (VarName), L"Driver%04x", DriverIndex);\r
+  Var = GetEfiGlobalVariable (VarName);\r
+  if (Var == NULL) {\r
+    return;\r
+  }\r
+  \r
+  //\r
+  // Save forbid load driver.\r
+  //\r
+  \r
+  VarPtr = Var;\r
+  //\r
+  // Skip attribute.\r
+  //\r
+  VarPtr += sizeof (UINT32);\r
+\r
+  DevicePathLen = *(UINT16 *) VarPtr;\r
+  //\r
+  // Skip device path length.\r
+  //\r
+  VarPtr += sizeof (UINT16);\r
+\r
+  //\r
+  // Skip description string.\r
+  //\r
+  VarPtr += StrSize ((UINT16 *) VarPtr);\r
+\r
+  NewLen  = mAccessInfo.LoadForbidLen + DevicePathLen;\r
+  NewFL   = AllocateZeroPool (NewLen);\r
+  if (NewFL == NULL) {\r
+    FreePool (Var);\r
+    return ;\r
+  }\r
+\r
+  if (mAccessInfo.LoadForbidLen > 0) {\r
+    CopyMem (NewFL, mAccessInfo.LoadForbid, mAccessInfo.LoadForbidLen);\r
+    FreePool (mAccessInfo.LoadForbid);\r
+  }\r
+\r
+  CopyMem (NewFL + mAccessInfo.LoadForbidLen, VarPtr, DevicePathLen);\r
+  mAccessInfo.LoadForbidLen = NewLen;\r
+  mAccessInfo.LoadForbid    = NewFL;\r
+  FreePool (Var);\r
+}\r
+\r
+\r
diff --git a/SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyIdentityPolicy.c b/SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyIdentityPolicy.c
new file mode 100644 (file)
index 0000000..2e2d67e
--- /dev/null
@@ -0,0 +1,518 @@
+/** @file\r
+  The functions for identification policy modification.\r
+    \r
+Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials \r
+are licensed and made available under the terms and conditions of the BSD License \r
+which accompanies this distribution.  The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "UserProfileManager.h"\r
+\r
+\r
+/**\r
+  Verify the new identity policy in the current implementation. The same credential\r
+  provider can't appear twice in one identity policy.\r
+\r
+  @param[in] NewGuid       Points to the credential provider guid.\r
+  \r
+  @retval TRUE     The NewGuid was found in the identity policy.\r
+  @retval FALSE    The NewGuid was not found.\r
+\r
+**/\r
+BOOLEAN\r
+ProviderAlreadyInPolicy (\r
+  IN EFI_GUID                                      *NewGuid\r
+  )\r
+{\r
+  UINTN                         Offset;\r
+  EFI_USER_INFO_IDENTITY_POLICY *Identity;\r
+  EFI_INPUT_KEY                 Key;\r
+\r
+  Offset = 0;\r
+  while (Offset < mUserInfo.NewIdentityPolicyLen) {\r
+    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (mUserInfo.NewIdentityPolicy + Offset);\r
+    if (Identity->Type == EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER) {\r
+      if (CompareGuid (NewGuid, (EFI_GUID *) (Identity + 1))) {\r
+        CreatePopUp (\r
+          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+          &Key,\r
+          L"This Credential Provider Are Already Used!",\r
+          L"",\r
+          L"Press Any Key to Continue ...",\r
+          NULL\r
+          );\r
+        return TRUE;\r
+      }\r
+    }\r
+    Offset += Identity->Length;\r
+  }\r
+  \r
+  return FALSE;\r
+}\r
+\r
+\r
+/**\r
+  Add or delete the user's credential record in the provider.\r
+\r
+  @param[in]  ProviderGuid        Point to credential provider guid.\r
+  @param[in]  User                Points to user profile.\r
+\r
+  @retval EFI_SUCCESS      Add or delete record successfully.\r
+  @retval Others           Fail to add or delete record.\r
+\r
+**/\r
+EFI_STATUS\r
+EnrollUserOnProvider (\r
+  IN  EFI_USER_INFO_IDENTITY_POLICY              *Identity,\r
+  IN  EFI_USER_PROFILE_HANDLE                    User \r
+  )\r
+{\r
+  UINTN                          Index;\r
+  EFI_USER_CREDENTIAL2_PROTOCOL  *UserCredential;\r
+  \r
+  //\r
+  // Find the specified credential provider.\r
+  //\r
+  for (Index = 0; Index < mProviderInfo->Count; Index++) {\r
+    UserCredential = mProviderInfo->Provider[Index];\r
+    if (CompareGuid ((EFI_GUID *)(Identity + 1), &UserCredential->Identifier)) {\r
+      return UserCredential->Enroll (UserCredential, User);\r
+    }\r
+  }\r
+\r
+  return EFI_NOT_FOUND;  \r
+}\r
+\r
+\r
+/**\r
+  Delete the User's credential record on the provider.\r
+\r
+  @param[in]  Identity     Point to EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER user info.\r
+  @param[in]  User         Points to user profile.\r
+\r
+  @retval EFI_SUCCESS      Delete User's credential record successfully.\r
+  @retval Others           Fail to add or delete record.\r
+\r
+**/\r
+EFI_STATUS\r
+DeleteUserOnProvider (\r
+  IN  EFI_USER_INFO_IDENTITY_POLICY              *Identity,\r
+  IN  EFI_USER_PROFILE_HANDLE                    User \r
+  )\r
+{\r
+  UINTN                          Index;\r
+  EFI_USER_CREDENTIAL2_PROTOCOL  *UserCredential;\r
+  \r
+  //\r
+  // Find the specified credential provider.\r
+  //\r
+  for (Index = 0; Index < mProviderInfo->Count; Index++) {\r
+    UserCredential = mProviderInfo->Provider[Index];\r
+    if (CompareGuid ((EFI_GUID *)(Identity + 1), &UserCredential->Identifier)) {\r
+      return UserCredential->Delete (UserCredential, User);\r
+    }\r
+  }\r
+\r
+  return EFI_NOT_FOUND;  \r
+}\r
+\r
+\r
+/**\r
+  Delete User's credental from all the providers that exist in User's identity policy.\r
+  \r
+  @param[in]  IdentityPolicy     Point to User's identity policy.\r
+  @param[in]  IdentityPolicyLen  The length of the identity policy.\r
+  @param[in]  User               Points to user profile.\r
+\r
+**/\r
+VOID\r
+DeleteCredentialFromProviders (\r
+  IN     UINT8                                *IdentityPolicy,\r
+  IN     UINTN                                 IdentityPolicyLen,\r
+  IN     EFI_USER_PROFILE_HANDLE               User \r
+  )\r
+{\r
+  EFI_USER_INFO_IDENTITY_POLICY    *Identity;\r
+  UINTN                            Offset;\r
+\r
+  Offset = 0;\r
+  while (Offset < IdentityPolicyLen) {\r
+    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (IdentityPolicy + Offset);\r
+    if (Identity->Type == EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER) {\r
+      //\r
+      // Delete the user on this provider.\r
+      //\r
+      DeleteUserOnProvider (Identity, User);\r
+    }\r
+    Offset += Identity->Length;\r
+  }\r
+\r
+}\r
+\r
+\r
+/**\r
+  Remove the provider in FindIdentity from the user identification information record.\r
+  \r
+  @param[in, out] NewInfo       On entry, points to the user information to remove provider. \r
+                                On return, points to the user information the provider is removed.\r
+  @param[in]      FindIdentity  Point to the user identity policy.\r
+\r
+  @retval TRUE                  The provider is removed successfully.\r
+  @retval FALSE                 Fail to remove the provider.\r
+\r
+**/\r
+BOOLEAN\r
+DeleteProviderFromPolicy (\r
+  IN     EFI_USER_INFO_IDENTITY_POLICY         *IdentityPolicy,\r
+  IN     UINTN                                 Offset\r
+  )\r
+{\r
+  UINTN                         RemainingLen;\r
+  UINTN                         DeleteLen;\r
+\r
+  if (IdentityPolicy->Length == mUserInfo.NewIdentityPolicyLen) {\r
+    //\r
+    // Only one credential provider in the identification policy.\r
+    // Set the new policy to be TRUE after removed the provider.\r
+    //\r
+    IdentityPolicy->Type           = EFI_USER_INFO_IDENTITY_TRUE;\r
+    IdentityPolicy->Length         = sizeof (EFI_USER_INFO_IDENTITY_POLICY);\r
+    mUserInfo.NewIdentityPolicyLen = IdentityPolicy->Length;\r
+    return TRUE;\r
+  }\r
+\r
+  DeleteLen = IdentityPolicy->Length + sizeof(EFI_USER_INFO_IDENTITY_POLICY);\r
+  if ((Offset + IdentityPolicy->Length) != mUserInfo.NewIdentityPolicyLen) {\r
+    //\r
+    // This provider is not the last item in the identification policy, delete it and the connector.\r
+    //    \r
+    RemainingLen = mUserInfo.NewIdentityPolicyLen - Offset - DeleteLen;\r
+    CopyMem ((UINT8 *) IdentityPolicy, (UINT8 *) IdentityPolicy + DeleteLen, RemainingLen);\r
+  }\r
+  mUserInfo.NewIdentityPolicyLen -= DeleteLen;  \r
\r
+  return FALSE;\r
+}\r
+\r
+\r
+/**\r
+  Update the mUserInfo.NewIdentityPolicy, and UI when 'add option' is pressed.\r
+\r
+**/\r
+VOID\r
+ AddProviderToPolicy (\r
+  IN  EFI_GUID                                  *NewGuid\r
+  )\r
+{\r
+  UINT8                         *NewPolicyInfo;\r
+  UINTN                         NewPolicyInfoLen;\r
+  EFI_USER_INFO_IDENTITY_POLICY *Policy;\r
+\r
+  //\r
+  // Allocate memory for the new identity policy.\r
+  //\r
+  NewPolicyInfoLen = mUserInfo.NewIdentityPolicyLen + sizeof (EFI_USER_INFO_IDENTITY_POLICY) + sizeof (EFI_GUID);\r
+  if (mUserInfo.NewIdentityPolicyLen > 0) {\r
+    //\r
+    // It is not the first provider in the policy. Add a connector before provider.\r
+    //\r
+    NewPolicyInfoLen += sizeof (EFI_USER_INFO_IDENTITY_POLICY);\r
+  }\r
+  NewPolicyInfo = AllocateZeroPool (NewPolicyInfoLen);\r
+  if (NewPolicyInfo == NULL) {\r
+    return ;\r
+  }\r
+\r
+  NewPolicyInfoLen = 0;\r
+  if (mUserInfo.NewIdentityPolicyLen > 0) {\r
+    //\r
+    // Save orginal policy.\r
+    //\r
+    CopyMem (NewPolicyInfo, mUserInfo.NewIdentityPolicy, mUserInfo.NewIdentityPolicyLen);\r
+\r
+    //\r
+    // Save logical connector.\r
+    //\r
+    Policy = (EFI_USER_INFO_IDENTITY_POLICY *) (NewPolicyInfo + mUserInfo.NewIdentityPolicyLen);\r
+    if (mConncetLogical == 0) {\r
+      Policy->Type = EFI_USER_INFO_IDENTITY_AND;\r
+    } else {\r
+      Policy->Type = EFI_USER_INFO_IDENTITY_OR;\r
+    }\r
+\r
+    Policy->Length   = sizeof (EFI_USER_INFO_IDENTITY_POLICY);\r
+    NewPolicyInfoLen = mUserInfo.NewIdentityPolicyLen + Policy->Length;\r
+    FreePool (mUserInfo.NewIdentityPolicy);\r
+  }\r
+  \r
+  //\r
+  // Save credential provider.\r
+  //\r
+  Policy = (EFI_USER_INFO_IDENTITY_POLICY *) (NewPolicyInfo + NewPolicyInfoLen);\r
+  Policy->Length = sizeof (EFI_USER_INFO_IDENTITY_POLICY) + sizeof (EFI_GUID);\r
+  Policy->Type   = EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER;\r
+  CopyGuid ((EFI_GUID *) (Policy + 1), NewGuid);\r
+  NewPolicyInfoLen += Policy->Length;\r
+\r
+  //\r
+  // Update identity policy choice.\r
+  //\r
+  mUserInfo.NewIdentityPolicy         = NewPolicyInfo;\r
+  mUserInfo.NewIdentityPolicyLen      = NewPolicyInfoLen;\r
+  mUserInfo.NewIdentityPolicyModified = TRUE;\r
+}\r
+\r
+\r
+/**\r
+  This function replaces the old identity policy with a new identity policy.\r
+\r
+  This function delete the user identity policy information.\r
+  If enroll new credential failed, recover the old identity policy.\r
+\r
+  @retval EFI_SUCCESS      Modify user identity policy successfully.\r
+  @retval Others           Fail to modify user identity policy.\r
+\r
+**/\r
+EFI_STATUS\r
+UpdateCredentialProvider (\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  EFI_USER_INFO_IDENTITY_POLICY *Identity;\r
+  UINTN                         Offset;\r
+\r
+  //\r
+  // Delete the old identification policy.\r
+  //\r
+  DeleteCredentialFromProviders (mUserInfo.IdentityPolicy, mUserInfo.IdentityPolicyLen, mModifyUser);\r
+\r
+  //\r
+  // Add the new identification policy.\r
+  //\r
+  Offset  = 0;\r
+  while (Offset < mUserInfo.NewIdentityPolicyLen) {\r
+    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (mUserInfo.NewIdentityPolicy + Offset);\r
+    if (Identity->Type == EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER) {\r
+      //\r
+      // Enroll the user on this provider\r
+      //\r
+      Status = EnrollUserOnProvider (Identity, mModifyUser);\r
+      if (EFI_ERROR (Status)) {\r
+        //\r
+        // Failed to enroll the user by new identification policy.\r
+        // So removed the credential provider from the identification policy\r
+        //\r
+        DeleteProviderFromPolicy (Identity, Offset);\r
+        continue;\r
+      }\r
+    }\r
+    Offset += Identity->Length;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Check whether the identity policy is valid.\r
+\r
+  @param[in]  PolicyInfo          Point to the identity policy.\r
+  @param[in]  PolicyInfoLen       The policy length.\r
+\r
+  @retval TRUE     The policy is a valid identity policy.\r
+  @retval FALSE    The policy is not a valid identity policy.\r
+  \r
+**/\r
+BOOLEAN\r
+CheckNewIdentityPolicy (\r
+  IN  UINT8                                     *PolicyInfo,\r
+  IN  UINTN                                     PolicyInfoLen\r
+  )\r
+{\r
+  EFI_USER_INFO_IDENTITY_POLICY *Identity;\r
+  EFI_INPUT_KEY                 Key;\r
+  UINTN                         Offset;\r
+  UINT32                        OpCode;\r
+  \r
+  //\r
+  // Check policy expression.\r
+  //\r
+  OpCode  = EFI_USER_INFO_IDENTITY_FALSE;\r
+  Offset  = 0;\r
+  while (Offset < PolicyInfoLen) {\r
+    //\r
+    // Check identification policy according to type\r
+    //\r
+    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (PolicyInfo + Offset);\r
+    switch (Identity->Type) {\r
+      \r
+    case EFI_USER_INFO_IDENTITY_TRUE:\r
+      break;\r
+\r
+    case EFI_USER_INFO_IDENTITY_OR:\r
+      if (OpCode == EFI_USER_INFO_IDENTITY_AND) {\r
+        CreatePopUp (\r
+          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+          &Key,\r
+          L"Invalid Identity Policy, Mixed Connector Unsupport!",\r
+          L"",\r
+          L"Press Any Key to Continue ...",\r
+          NULL\r
+          );\r
+        return FALSE;\r
+      }\r
+\r
+      OpCode = EFI_USER_INFO_IDENTITY_OR;\r
+      break;\r
+\r
+    case EFI_USER_INFO_IDENTITY_AND:\r
+      if (OpCode == EFI_USER_INFO_IDENTITY_OR) {\r
+        CreatePopUp (\r
+          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+          &Key,\r
+          L"Invalid Identity Policy, Mixed Connector Unsupport!",\r
+          L"",\r
+          L"Press Any Key to Continue ...",\r
+          NULL\r
+          );\r
+        return FALSE;\r
+      }\r
+\r
+      OpCode = EFI_USER_INFO_IDENTITY_AND;\r
+      break;\r
+\r
+    case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:\r
+      break;\r
+\r
+    default:\r
+      CreatePopUp (\r
+        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+        &Key,\r
+        L"Unsupport parameter",\r
+        L"",\r
+        L"Press Any Key to Continue ...",\r
+        NULL\r
+        );\r
+      return FALSE;\r
+    }\r
+    Offset += Identity->Length;\r
+  }\r
+\r
+  return TRUE;\r
+}\r
+\r
+\r
+/**\r
+  Save the identity policy and update UI with it.\r
+  \r
+  This funciton will verify the new identity policy, in current implementation, \r
+  the identity policy can be:  T, P & P & P & ..., P | P | P | ...\r
+  Here, "T" means "True", "P" means "Credential Provider", "&" means "and", "|" means "or".\r
+  Other identity policies are not supported.  \r
+\r
+**/\r
+VOID\r
+SaveIdentityPolicy (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  EFI_USER_INFO_HANDLE          UserInfo;\r
+  EFI_USER_INFO                 *Info;\r
+\r
+  if (!mUserInfo.NewIdentityPolicyModified || (mUserInfo.NewIdentityPolicyLen == 0)) {\r
+    return;\r
+  }\r
+\r
+  //\r
+  // Check policy expression.\r
+  //\r
+  if (!CheckNewIdentityPolicy (mUserInfo.NewIdentityPolicy, mUserInfo.NewIdentityPolicyLen)) {\r
+    return;\r
+  }\r
+\r
+  Status = FindInfoByType (mModifyUser, EFI_USER_INFO_IDENTITY_POLICY_RECORD, &UserInfo);\r
+  if (EFI_ERROR (Status)) {\r
+    return ;\r
+  }\r
+  \r
+  //\r
+  // Update the informantion on credential provider.\r
+  //\r
+  Status = UpdateCredentialProvider ();\r
+  if (EFI_ERROR (Status)) {\r
+    return ;\r
+  }\r
+  \r
+  //\r
+  // Save new identification policy.\r
+  //\r
+  Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + mUserInfo.NewIdentityPolicyLen);\r
+  ASSERT (Info != NULL);\r
+\r
+  Info->InfoType    = EFI_USER_INFO_IDENTITY_POLICY_RECORD;\r
+  Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV | EFI_USER_INFO_PUBLIC | EFI_USER_INFO_EXCLUSIVE;\r
+  Info->InfoSize    = (UINT32) (sizeof (EFI_USER_INFO) + mUserInfo.NewIdentityPolicyLen);\r
+  CopyMem ((UINT8 *) (Info + 1), mUserInfo.NewIdentityPolicy, mUserInfo.NewIdentityPolicyLen);\r
+\r
+  Status = mUserManager->SetInfo (mUserManager, mModifyUser, &UserInfo, Info, Info->InfoSize);\r
+  FreePool (Info);\r
+   \r
+  //\r
+  // Update the mUserInfo.IdentityPolicy by mUserInfo.NewIdentityPolicy\r
+  //\r
+  if (mUserInfo.IdentityPolicy != NULL) {\r
+    FreePool (mUserInfo.IdentityPolicy);\r
+  }\r
+  mUserInfo.IdentityPolicy    = mUserInfo.NewIdentityPolicy;\r
+  mUserInfo.IdentityPolicyLen = mUserInfo.NewIdentityPolicyLen;\r
+\r
+  mUserInfo.NewIdentityPolicy         = NULL;\r
+  mUserInfo.NewIdentityPolicyLen      = 0;\r
+  mUserInfo.NewIdentityPolicyModified = FALSE;   \r
+\r
+  //\r
+  // Update identity policy choice.\r
+  //\r
+  ResolveIdentityPolicy (mUserInfo.IdentityPolicy, mUserInfo.IdentityPolicyLen, STRING_TOKEN (STR_IDENTIFY_POLICY_VAL));\r
+}\r
+\r
+\r
+/**\r
+  Update the mUserInfo.NewIdentityPolicy, and UI when 'add option' is pressed.\r
+\r
+**/\r
+VOID\r
+ AddIdentityPolicyItem (\r
+  VOID\r
+  )\r
+{\r
+  if (mProviderInfo->Count == 0) {\r
+    return ;\r
+  }\r
+  \r
+  //\r
+  // Check the identity policy.\r
+  //\r
+  if (ProviderAlreadyInPolicy (&mProviderInfo->Provider[mProviderChoice]->Identifier)) {\r
+    return;\r
+  }\r
+\r
+  //\r
+  // Add it to identification policy\r
+  //\r
+  AddProviderToPolicy (&mProviderInfo->Provider[mProviderChoice]->Identifier);\r
+\r
+  //\r
+  // Update identity policy choice.\r
+  //\r
+  ResolveIdentityPolicy (mUserInfo.NewIdentityPolicy, mUserInfo.NewIdentityPolicyLen, STRING_TOKEN (STR_IDENTIFY_POLICY_VALUE));\r
+}\r
+\r
+\r
index eb96c8e..11233a1 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   The functions to add a user profile.\r
     \r
-Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials \r
 are licensed and made available under the terms and conditions of the BSD License \r
 which accompanies this distribution.  The full text of the license may be found at \r
@@ -239,7 +239,7 @@ SetIdentityPolicy (
 \r
   NewUserInfo->InfoType    = EFI_USER_INFO_IDENTITY_POLICY_RECORD;\r
   NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV | \r
-                             EFI_USER_INFO_PRIVATE | \r
+                             EFI_USER_INFO_PUBLIC | \r
                              EFI_USER_INFO_EXCLUSIVE;\r
   NewUserInfo->InfoSize    = sizeof (EFI_USER_INFO) + Policy->Length;\r
   UserInfo                 = NULL;\r
index fffc93b..3fe4031 100644 (file)
@@ -185,6 +185,9 @@ DeleteUser (
   EFI_STATUS              Status;\r
   EFI_USER_PROFILE_HANDLE User;\r
   EFI_INPUT_KEY           Key;\r
+  EFI_USER_INFO_HANDLE    UserInfo;\r
+  EFI_USER_INFO           *Info;\r
+  UINTN                   InfoSize;\r
 \r
   //\r
   // Find specified user profile and delete it.\r
@@ -204,6 +207,31 @@ DeleteUser (
   }\r
 \r
   if (UserIndex == 1) {\r
+    //\r
+    // Get the identification policy.\r
+    //\r
+    Status = FindInfoByType (User, EFI_USER_INFO_IDENTITY_POLICY_RECORD, &UserInfo);\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    InfoSize = 0;\r
+    Info = NULL;\r
+    Status   = mUserManager->GetInfo (mUserManager, User, UserInfo, Info, &InfoSize);\r
+    if (Status == EFI_BUFFER_TOO_SMALL) {\r
+      Info = AllocateZeroPool (InfoSize);\r
+      if (Info == NULL) {\r
+        goto Done;\r
+      }\r
+      Status = mUserManager->GetInfo (mUserManager, User, UserInfo, Info, &InfoSize);\r
+    }\r
+\r
+    //\r
+    // Delete the user on the credential providers by its identification policy.\r
+    //\r
+    DeleteCredentialFromProviders ((UINT8 *)(Info + 1), Info->InfoSize - sizeof (EFI_USER_INFO), User);\r
+    FreePool (Info);\r
+    \r
     Status = mUserManager->Delete (mUserManager, User);\r
     if (EFI_ERROR (Status)) {\r
       goto Done;\r
index 9013d2f..fc0efaa 100644 (file)
@@ -140,6 +140,7 @@ extern USER_INFO                           mUserInfo;
 \r
 extern USER_PROFILE_MANAGER_CALLBACK_INFO  *mCallbackInfo;\r
 \r
+extern EFI_USER_PROFILE_HANDLE             mModifyUser;\r
 \r
 /**\r
   Get string by string id from HII Interface.\r
@@ -378,5 +379,67 @@ GetUserNameInput (
   IN OUT  UINTN         *UserNameLen,\r
      OUT  CHAR16        *UserName\r
   );\r
+\r
+/**\r
+  Find the specified info in User profile by the InfoType.\r
+\r
+  @param[in]  User         Handle of the user whose information will be searched.\r
+  @param[in]  InfoType     The user information type to find.\r
+  @param[out] UserInfo     Points to user information handle found.\r
+  \r
+  @retval EFI_SUCCESS      Find the user information successfully.\r
+  @retval Others           Fail to find the user information.\r
+\r
+**/\r
+EFI_STATUS\r
+FindInfoByType (\r
+  IN  EFI_USER_PROFILE_HANDLE                   User,\r
+  IN  UINT8                                     InfoType,\r
+  OUT EFI_USER_INFO_HANDLE                      *UserInfo\r
+  );\r
+\r
+/**\r
+  Convert the identity policy to a unicode string and update the Hii database\r
+  IpStringId string with it.\r
+\r
+  @param[in]  Ip         Points to identity policy.\r
+  @param[in]  IpLen      The identity policy length.\r
+  @param[in]  IpStringId String ID in the HII database to be replaced.\r
+\r
+**/\r
+VOID\r
+ResolveIdentityPolicy (\r
+  IN  UINT8                                     *Ip,\r
+  IN  UINTN                                     IpLen,\r
+  IN  EFI_STRING_ID                             IpStringId\r
+  );\r
+\r
+/**\r
+  Expand access policy memory size.\r
+\r
+  @param[in] ValidLen       The valid access policy length.\r
+  @param[in] ExpandLen      The length that is needed to expand.\r
+    \r
+**/\r
+VOID\r
+ExpandMemory (\r
+  IN      UINTN                                 ValidLen,\r
+  IN      UINTN                                 ExpandLen\r
+  );\r
+\r
+/**\r
+  Delete User's credental from all the providers that exist in User's identity policy.\r
+  \r
+  @param[in]  IdentityPolicy     Point to User's identity policy.\r
+  @param[in]  IdentityPolicyLen  The length of the identity policy.\r
+  @param[in]  User               Points to user profile.\r
+\r
+**/\r
+VOID\r
+DeleteCredentialFromProviders (\r
+  IN     UINT8                                *IdentityPolicy,\r
+  IN     UINTN                                 IdentityPolicyLen,\r
+  IN     EFI_USER_PROFILE_HANDLE               User \r
+  );\r
   \r
 #endif\r
index 9fb4bf9..bd19323 100644 (file)
@@ -25,6 +25,8 @@
   UserProfileAdd.c\r
   UserProfileDelete.c\r
   UserProfileModify.c\r
+  ModifyIdentityPolicy.c\r
+  ModifyAccessPolicy.c\r
   UserProfileManagerData.h\r
   UserProfileManagerStrings.uni\r
   UserProfileManagerVfr.Vfr\r
index 1d67b47..67fc300 100644 (file)
@@ -749,8 +749,9 @@ ResolveAccessPolicy (
 \r
 \r
 /**\r
-  Find the specified info in profile mModifyUser by the InfoType.\r
+  Find the specified info in User profile by the InfoType.\r
 \r
+  @param[in]  User         Handle of the user whose information will be searched.\r
   @param[in]  InfoType     The user information type to find.\r
   @param[out] UserInfo     Points to user information handle found.\r
   \r
@@ -760,6 +761,7 @@ ResolveAccessPolicy (
 **/\r
 EFI_STATUS\r
 FindInfoByType (\r
+  IN  EFI_USER_PROFILE_HANDLE                   User,\r
   IN  UINT8                                     InfoType,\r
   OUT EFI_USER_INFO_HANDLE                      *UserInfo\r
   )\r
@@ -787,7 +789,7 @@ FindInfoByType (
   // Get each user information.\r
   //\r
   while (TRUE) {\r
-    Status = mUserManager->GetNextInfo (mUserManager, mModifyUser, UserInfo);\r
+    Status = mUserManager->GetNextInfo (mUserManager, User, UserInfo);\r
     if (EFI_ERROR (Status)) {\r
       break;\r
     }\r
@@ -797,7 +799,7 @@ FindInfoByType (
     InfoSize  = MemSize;\r
     Status    = mUserManager->GetInfo (\r
                                 mUserManager,\r
-                                mModifyUser,\r
+                                User,\r
                                 *UserInfo,\r
                                 Info,\r
                                 &InfoSize\r
@@ -811,7 +813,7 @@ FindInfoByType (
       }\r
       Status = mUserManager->GetInfo (\r
                                mUserManager,\r
-                               mModifyUser,\r
+                               User,\r
                                *UserInfo,\r
                                Info,\r
                                &InfoSize\r
@@ -1104,207 +1106,6 @@ ExpandMemory (
 }\r
 \r
 \r
-/**\r
-  Collect all the access policy data to mUserInfo.AccessPolicy, \r
-  and save it to user profile.\r
-\r
-**/\r
-VOID\r
-SaveAccessPolicy (\r
-  VOID\r
-  )\r
-{\r
-  EFI_STATUS                    Status;\r
-  UINTN                         OffSet;\r
-  UINTN                         Size;\r
-  EFI_USER_INFO_ACCESS_CONTROL  Control;\r
-  EFI_USER_INFO_HANDLE          UserInfo;\r
-  EFI_USER_INFO                 *Info;\r
-\r
-  if (mUserInfo.AccessPolicy != NULL) {\r
-    FreePool (mUserInfo.AccessPolicy);\r
-  }\r
-  mUserInfo.AccessPolicy          = NULL;\r
-  mUserInfo.AccessPolicyLen       = 0;\r
-  mUserInfo.AccessPolicyModified  = TRUE;\r
-  OffSet                          = 0;\r
-  \r
-  //\r
-  // Save access right.\r
-  //\r
-  Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL);\r
-  if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
-    ExpandMemory (OffSet, Size);\r
-  }\r
-\r
-  Control.Type = mAccessInfo.AccessRight;\r
-  Control.Size = (UINT32) Size;\r
-  CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
-  OffSet += sizeof (Control);\r
-  \r
-  //\r
-  // Save access setup.\r
-  //\r
-  Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (EFI_GUID);\r
-  if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
-    ExpandMemory (OffSet, Size);\r
-  }\r
-\r
-  Control.Type = EFI_USER_INFO_ACCESS_SETUP;\r
-  Control.Size = (UINT32) Size;  \r
-  CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
-  OffSet += sizeof (Control);\r
-  \r
-  if (mAccessInfo.AccessSetup == ACCESS_SETUP_NORMAL) {\r
-    CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupNormalGuid);\r
-  } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_RESTRICTED) {\r
-    CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupRestrictedGuid);\r
-  } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_ADMIN) {\r
-    CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupAdminGuid);\r
-  }\r
-  OffSet += sizeof (EFI_GUID);\r
-  \r
-  //\r
-  // Save access of boot order.\r
-  //\r
-  Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (UINT32);\r
-  if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
-    ExpandMemory (OffSet, Size);\r
-  }\r
-\r
-  Control.Type = EFI_USER_INFO_ACCESS_BOOT_ORDER;\r
-  Control.Size = (UINT32) Size;  \r
-  CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
-  OffSet += sizeof (Control);\r
-\r
-  CopyMem ((UINT8 *) (mUserInfo.AccessPolicy + OffSet), &mAccessInfo.AccessBootOrder, sizeof (UINT32));\r
-  OffSet += sizeof (UINT32);\r
-  \r
-  //\r
-  // Save permit load.\r
-  //\r
-  if (mAccessInfo.LoadPermitLen > 0) {\r
-    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.LoadPermitLen;\r
-    if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
-      ExpandMemory (OffSet, Size);\r
-    }\r
-\r
-    Control.Type = EFI_USER_INFO_ACCESS_PERMIT_LOAD;\r
-    Control.Size = (UINT32) Size;  \r
-    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
-    OffSet += sizeof (Control);\r
-  \r
-    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadPermit, mAccessInfo.LoadPermitLen);\r
-    OffSet += mAccessInfo.LoadPermitLen;\r
-  }\r
-  \r
-  //\r
-  // Save forbid load.\r
-  //\r
-  if (mAccessInfo.LoadForbidLen > 0) {\r
-    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.LoadForbidLen;\r
-    if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
-      ExpandMemory (OffSet, Size);\r
-    }\r
-\r
-    Control.Type = EFI_USER_INFO_ACCESS_FORBID_LOAD;\r
-    Control.Size = (UINT32) Size;  \r
-    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
-    OffSet += sizeof (Control);\r
-    \r
-    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadForbid, mAccessInfo.LoadForbidLen);\r
-    OffSet += mAccessInfo.LoadForbidLen;\r
-  }\r
-  \r
-  //\r
-  // Save permit connect.\r
-  //\r
-  if (mAccessInfo.ConnectPermitLen > 0) {\r
-    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.ConnectPermitLen;\r
-    if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
-      ExpandMemory (OffSet, Size);\r
-    }\r
-\r
-    Control.Type = EFI_USER_INFO_ACCESS_PERMIT_CONNECT;\r
-    Control.Size = (UINT32) Size;  \r
-    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
-    OffSet += sizeof (Control);\r
-    \r
-    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectPermit, mAccessInfo.ConnectPermitLen);\r
-    OffSet += mAccessInfo.ConnectPermitLen;\r
-  }\r
-  \r
-  //\r
-  // Save forbid connect.\r
-  //\r
-  if (mAccessInfo.ConnectForbidLen > 0) {\r
-    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.ConnectForbidLen;\r
-    if (mUserInfo.AccessPolicyLen - OffSet < Size) {\r
-      ExpandMemory (OffSet, Size);\r
-    }\r
-\r
-    Control.Type = EFI_USER_INFO_ACCESS_FORBID_CONNECT;\r
-    Control.Size = (UINT32) Size;  \r
-    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));\r
-    OffSet += sizeof (Control);\r
-    \r
-    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectForbid, mAccessInfo.ConnectForbidLen);\r
-    OffSet += mAccessInfo.ConnectForbidLen;\r
-  }\r
-\r
-  mUserInfo.AccessPolicyLen = OffSet;\r
-\r
-  //\r
-  // Save access policy.\r
-  //\r
-  if (mUserInfo.AccessPolicyModified && (mUserInfo.AccessPolicyLen > 0)) {\r
-    Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + mUserInfo.AccessPolicyLen);\r
-    if (Info == NULL) {\r
-      return ;\r
-    }\r
-\r
-    Status = FindInfoByType (EFI_USER_INFO_ACCESS_POLICY_RECORD, &UserInfo);\r
-    if (!EFI_ERROR (Status)) {\r
-      Info->InfoType    = EFI_USER_INFO_ACCESS_POLICY_RECORD;\r
-      Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |\r
-                          EFI_USER_INFO_PUBLIC |\r
-                          EFI_USER_INFO_EXCLUSIVE;\r
-      Info->InfoSize    = (UINT32) (sizeof (EFI_USER_INFO) + mUserInfo.AccessPolicyLen);\r
-      CopyMem ((UINT8 *) (Info + 1), mUserInfo.AccessPolicy, mUserInfo.AccessPolicyLen);\r
-      Status = mUserManager->SetInfo (\r
-                               mUserManager,\r
-                               mModifyUser,\r
-                               &UserInfo,\r
-                               Info,\r
-                               Info->InfoSize\r
-                               );\r
-      mUserInfo.AccessPolicyModified = FALSE;\r
-    }\r
-    FreePool (Info);\r
-  }\r
-\r
-  if (mAccessInfo.ConnectForbid != NULL) {\r
-    FreePool (mAccessInfo.ConnectForbid);\r
-    mAccessInfo.ConnectForbid = NULL;\r
-  }\r
-\r
-  if (mAccessInfo.ConnectPermit != NULL) {\r
-    FreePool (mAccessInfo.ConnectPermit);\r
-    mAccessInfo.ConnectPermit = NULL;\r
-  }\r
-\r
-  if (mAccessInfo.LoadForbid != NULL) {\r
-    FreePool (mAccessInfo.LoadForbid);\r
-    mAccessInfo.LoadForbid = NULL;\r
-  }\r
-\r
-  if (mAccessInfo.LoadPermit != NULL) {\r
-    FreePool (mAccessInfo.LoadPermit);\r
-    mAccessInfo.LoadPermit = NULL;\r
-  }\r
-}\r
-\r
-\r
 /**\r
   Get the username from user input, and update username string in the Hii \r
   database with it.\r
@@ -1392,7 +1193,7 @@ ModifyUserName (
   //\r
   // Save the user name.\r
   //\r
-  Status = FindInfoByType (EFI_USER_INFO_NAME_RECORD, &UserInfo);\r
+  Status = FindInfoByType (mModifyUser, EFI_USER_INFO_NAME_RECORD, &UserInfo);\r
   if (!EFI_ERROR (Status)) {\r
     mUserManager->SetInfo (\r
                     mUserManager,\r
@@ -1572,940 +1373,103 @@ ModifyIdentityPolicy (
 \r
 \r
 /**\r
-  Save the identity policy and update UI with it.\r
-  \r
-  This funciton will verify the new identity policy, in current implementation, \r
-  the identity policy can be:  T, P & P & P & ..., P | P | P | ...\r
-  Here, "T" means "True", "P" means "Credential Provider", "&" means "and", "|" means "or".\r
-  Other identity policies are not supported.  \r
+  Get current user's access right.\r
+\r
+  @param[out]  AccessRight  Points to the buffer used for user's access right.\r
+\r
+  @retval EFI_SUCCESS       Get current user access right successfully.\r
+  @retval others            Fail to get current user access right.\r
 \r
 **/\r
-VOID\r
-SaveIdentityPolicy (\r
-  VOID\r
+EFI_STATUS\r
+GetAccessRight (\r
+  OUT  UINT32                                    *AccessRight\r
   )\r
 {\r
   EFI_STATUS                    Status;\r
-  EFI_USER_INFO_IDENTITY_POLICY *Identity;\r
   EFI_USER_INFO_HANDLE          UserInfo;\r
   EFI_USER_INFO                 *Info;\r
-  EFI_INPUT_KEY                 Key;\r
-  UINTN                         Offset;\r
-  UINT32                        OpCode;\r
   UINTN                         InfoSize;\r
+  UINTN                         MemSize;\r
+  EFI_USER_INFO_ACCESS_CONTROL  Access;\r
+  EFI_USER_PROFILE_HANDLE       CurrentUser;\r
+  UINTN                         TotalLen;\r
+  UINTN                         CheckLen;\r
 \r
-  if (!mUserInfo.NewIdentityPolicyModified || (mUserInfo.NewIdentityPolicyLen == 0)) {\r
-    return;\r
+  //\r
+  // Allocate user information memory.\r
+  //\r
+  MemSize = sizeof (EFI_USER_INFO) + 63;\r
+  Info    = AllocateZeroPool (MemSize);\r
+  if (Info == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
-  \r
\r
   //\r
-  // Check policy expression.\r
+  // Get user access information.\r
   //\r
-  OpCode  = EFI_USER_INFO_IDENTITY_FALSE;\r
-  Offset  = 0;\r
-  while (Offset < mUserInfo.NewIdentityPolicyLen) {\r
+  UserInfo = NULL;\r
+  mUserManager->Current (mUserManager, &CurrentUser);\r
+  while (TRUE) {\r
+    InfoSize = MemSize;\r
     //\r
-    // Check access policy according to type\r
+    // Get next user information.\r
     //\r
-    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (mUserInfo.NewIdentityPolicy + Offset);\r
-    switch (Identity->Type) {\r
-\r
-    case EFI_USER_INFO_IDENTITY_TRUE:\r
-      break;\r
-\r
-    case EFI_USER_INFO_IDENTITY_OR:\r
-      if (OpCode == EFI_USER_INFO_IDENTITY_AND) {\r
-        CreatePopUp (\r
-          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-          &Key,\r
-          L"Invalid Identity Policy, Mixed Connector Unsupport!",\r
-          L"",\r
-          L"Press Any Key to Continue ...",\r
-          NULL\r
-          );\r
-        return ;\r
-      }\r
-\r
-      OpCode = EFI_USER_INFO_IDENTITY_OR;\r
-      break;\r
-\r
-    case EFI_USER_INFO_IDENTITY_AND:\r
-      if (OpCode == EFI_USER_INFO_IDENTITY_OR) {\r
-        CreatePopUp (\r
-          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-          &Key,\r
-          L"Invalid Identity Policy, Mixed Connector Unsupport!",\r
-          L"",\r
-          L"Press Any Key to Continue ...",\r
-          NULL\r
-          );\r
-        return ;\r
-      }\r
-\r
-      OpCode = EFI_USER_INFO_IDENTITY_AND;\r
-      break;\r
-\r
-    case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:\r
+    Status = mUserManager->GetNextInfo (mUserManager, CurrentUser, &UserInfo);\r
+    if (EFI_ERROR (Status)) {\r
       break;\r
-\r
-    default:\r
-      CreatePopUp (\r
-        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-        &Key,\r
-        L"Unsupport parameter",\r
-        L"",\r
-        L"Press Any Key to Continue ...",\r
-        NULL\r
-        );\r
-      return ;\r
     }\r
-    Offset += Identity->Length;\r
-  }\r
-\r
-  //\r
-  // Save identity policy.\r
-  //\r
-  Info = AllocateZeroPool (\r
-           sizeof (EFI_USER_INFO) + \r
-           mUserInfo.NewIdentityPolicyLen\r
-           );\r
-  if (Info == NULL) {\r
-    return ;\r
-  }\r
 \r
-  Status = FindInfoByType (EFI_USER_INFO_IDENTITY_POLICY_RECORD, &UserInfo);\r
-  if (EFI_ERROR (Status)) {\r
-    FreePool (Info);\r
-    return ;\r
-  }\r
-  \r
-  Info->InfoType    = EFI_USER_INFO_IDENTITY_POLICY_RECORD;\r
-  Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |\r
-                      EFI_USER_INFO_PRIVATE |\r
-                      EFI_USER_INFO_EXCLUSIVE;\r
-  Info->InfoSize    = (UINT32) (sizeof (EFI_USER_INFO) + mUserInfo.NewIdentityPolicyLen);\r
-  CopyMem ((UINT8 *) (Info + 1), mUserInfo.NewIdentityPolicy, mUserInfo.NewIdentityPolicyLen);\r
-  Status = mUserManager->SetInfo (\r
-                           mUserManager,\r
-                           mModifyUser,\r
-                           &UserInfo,\r
-                           Info,\r
-                           Info->InfoSize\r
-                           );\r
-  FreePool (Info);                           \r
-  if (EFI_ERROR (Status)) {\r
-    //\r
-    // Get the user information again, it may be changed during saving it.\r
-    //\r
-    InfoSize = 0;\r
     Status = mUserManager->GetInfo (\r
                              mUserManager,\r
-                             mModifyUser,\r
+                             CurrentUser,\r
                              UserInfo,\r
                              Info,\r
                              &InfoSize\r
                              );\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      Info = AllocateZeroPool (InfoSize);\r
-      ASSERT (Info != NULL);\r
+      MemSize = InfoSize;\r
+      FreePool (Info);\r
+      Info = AllocateZeroPool (MemSize);\r
+      if (Info == NULL) {\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
       Status = mUserManager->GetInfo (\r
                                mUserManager,\r
-                               mModifyUser,\r
+                               CurrentUser,\r
                                UserInfo,\r
                                Info,\r
                                &InfoSize\r
                                );\r
     }\r
-    ASSERT_EFI_ERROR (Status);\r
-    \r
-    //\r
-    // Save current identification policy to mUserInfo.IdentityPolicy. \r
-    //\r
-    ASSERT (Info != NULL);\r
-    if (mUserInfo.IdentityPolicy != NULL) {\r
-      FreePool (mUserInfo.IdentityPolicy);\r
-    }\r
-\r
-    mUserInfo.IdentityPolicyLen = Info->InfoSize - sizeof (EFI_USER_INFO);\r
-    mUserInfo.IdentityPolicy    = AllocateCopyPool (mUserInfo.IdentityPolicyLen, Info + 1);    \r
-    ASSERT (mUserInfo.IdentityPolicy != NULL);  \r
-\r
-    //\r
-    // Free the memory\r
-    //\r
-    FreePool (Info);\r
-    FreePool (mUserInfo.NewIdentityPolicy);\r
-  } else {  \r
-    //\r
-    // Update the mUserInfo.IdentityPolicy by mUserInfo.NewIdentityPolicy\r
-    //\r
-    if (mUserInfo.IdentityPolicy != NULL) {\r
-      FreePool (mUserInfo.IdentityPolicy);\r
+    if (EFI_ERROR (Status)) {\r
+      break;\r
     }\r
-    mUserInfo.IdentityPolicy    = mUserInfo.NewIdentityPolicy;\r
-    mUserInfo.IdentityPolicyLen = mUserInfo.NewIdentityPolicyLen;\r
-  }\r
-\r
-  mUserInfo.NewIdentityPolicy         = NULL;\r
-  mUserInfo.NewIdentityPolicyLen      = 0;\r
-  mUserInfo.NewIdentityPolicyModified = FALSE;   \r
-\r
-  //\r
-  // Update identity policy choice.\r
-  //\r
-  ResolveIdentityPolicy (\r
-    mUserInfo.IdentityPolicy, \r
-    mUserInfo.IdentityPolicyLen, \r
-    STRING_TOKEN (STR_IDENTIFY_POLICY_VAL)\r
-    );\r
-}\r
-\r
-\r
-/**\r
-  Verify the new identity policy in the current implementation. The same credential\r
-  provider can't appear twice in one identity policy.\r
-\r
-  @param[in] NewGuid       Points to the credential provider guid.\r
-  \r
-  @retval TRUE     The NewGuid was found in the identity policy.\r
-  @retval FALSE    The NewGuid was not found.\r
-\r
-**/\r
-BOOLEAN\r
-CheckIdentityPolicy (\r
-  IN EFI_GUID                                      *NewGuid\r
-  )\r
-{\r
-  UINTN                         Offset;\r
-  EFI_USER_INFO_IDENTITY_POLICY *Identity;\r
-  EFI_INPUT_KEY                 Key;\r
-\r
-  Offset = 0;\r
-  while (Offset < mUserInfo.NewIdentityPolicyLen) {\r
+    \r
     //\r
-    // Check access policy according to type.\r
+    // Check user information.\r
     //\r
-    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (mUserInfo.NewIdentityPolicy + Offset);\r
-    switch (Identity->Type) {\r
-\r
-    case EFI_USER_INFO_IDENTITY_TRUE:\r
-    case EFI_USER_INFO_IDENTITY_OR:\r
-    case EFI_USER_INFO_IDENTITY_AND:\r
-      break;\r
-\r
-    case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:\r
-      if (CompareGuid (NewGuid, (EFI_GUID *) (Identity + 1))) {\r
-        CreatePopUp (\r
-          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-          &Key,\r
-          L"This Credential Provider Are Already Used!",\r
-          L"",\r
-          L"Press Any Key to Continue ...",\r
-          NULL\r
-          );\r
-        return FALSE;\r
+    if (Info->InfoType == EFI_USER_INFO_ACCESS_POLICY_RECORD) {\r
+      TotalLen  = Info->InfoSize - sizeof (EFI_USER_INFO);\r
+      CheckLen  = 0;\r
+      //\r
+      // Get specified access information.\r
+      //\r
+      while (CheckLen < TotalLen) {\r
+        CopyMem (&Access, (UINT8 *) (Info + 1) + CheckLen, sizeof (Access));\r
+        if ((Access.Type == EFI_USER_INFO_ACCESS_ENROLL_SELF) ||\r
+            (Access.Type == EFI_USER_INFO_ACCESS_ENROLL_OTHERS) ||\r
+            (Access.Type == EFI_USER_INFO_ACCESS_MANAGE)\r
+            ) {\r
+          *AccessRight = Access.Type;\r
+          FreePool (Info);\r
+          return EFI_SUCCESS;\r
+        }\r
+        CheckLen += Access.Size;\r
       }\r
-      break;\r
-\r
-    default:\r
-      CreatePopUp (\r
-        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-        &Key,\r
-        L"Unsupport parameter",\r
-        L"",\r
-        L"Press Any Key to Continue ...",\r
-        NULL\r
-        );\r
-      return FALSE;\r
     }\r
-\r
-    Offset += Identity->Length;\r
   }\r
-  return TRUE;\r
+  FreePool (Info);\r
+  return EFI_NOT_FOUND;\r
 }\r
 \r
-\r
-/**\r
-  Update the mUserInfo.NewIdentityPolicy, and UI when 'add option' is pressed.\r
-\r
-**/\r
-VOID\r
-AddIdentityPolicyItem (\r
-  VOID\r
-  )\r
-{\r
-  UINT8                         *NewInfo;\r
-  EFI_USER_INFO_IDENTITY_POLICY *Policy;\r
-\r
-  if (mProviderInfo->Count == 0) {\r
-    return ;\r
-  }\r
-\r
-  if (!mUserInfo.NewIdentityPolicyModified && (mUserInfo.NewIdentityPolicyLen > 0)) {\r
-    FreePool (mUserInfo.NewIdentityPolicy);\r
-    mUserInfo.NewIdentityPolicy     = NULL;\r
-    mUserInfo.NewIdentityPolicyLen  = 0;\r
-  }\r
-  //\r
-  // Expand the identity policy memory for the newly added policy info.\r
-  //\r
-  if (mUserInfo.NewIdentityPolicyLen > 0) {\r
-    //\r
-    // The new policy is not empty, expand space for connetor and provider.\r
-    //\r
-    if (!CheckIdentityPolicy (&mProviderInfo->Provider[mProviderChoice]->Identifier)) {\r
-      return ;\r
-    }\r
-    NewInfo = AllocateZeroPool (\r
-                mUserInfo.NewIdentityPolicyLen + \r
-                sizeof (EFI_USER_INFO_IDENTITY_POLICY) * 2 + \r
-                sizeof (EFI_GUID)\r
-                );\r
-  } else {\r
-    //\r
-    // The new policy is empty, only expand space for provider.\r
-    //\r
-    NewInfo = AllocateZeroPool (\r
-                mUserInfo.NewIdentityPolicyLen + \r
-                sizeof (EFI_USER_INFO_IDENTITY_POLICY) + \r
-                sizeof (EFI_GUID)\r
-                );\r
-  }\r
-\r
-  if (NewInfo == NULL) {\r
-    return ;\r
-  }\r
-\r
-  if (mUserInfo.NewIdentityPolicyLen > 0) {\r
-    CopyMem (NewInfo, mUserInfo.NewIdentityPolicy, mUserInfo.NewIdentityPolicyLen);\r
-    FreePool (mUserInfo.NewIdentityPolicy);\r
-  }\r
-  mUserInfo.NewIdentityPolicy = NewInfo;\r
-\r
-  //\r
-  // Save logical connector.\r
-  //\r
-  if (mUserInfo.NewIdentityPolicyLen > 0) {\r
-    Policy = (EFI_USER_INFO_IDENTITY_POLICY *) (mUserInfo.NewIdentityPolicy +\r
-                                                mUserInfo.NewIdentityPolicyLen);\r
-    if (mConncetLogical == 0) {\r
-      Policy->Type = EFI_USER_INFO_IDENTITY_AND;\r
-    } else {\r
-      Policy->Type = EFI_USER_INFO_IDENTITY_OR;\r
-    }\r
-\r
-    Policy->Length = sizeof (EFI_USER_INFO_IDENTITY_POLICY);\r
-    mUserInfo.NewIdentityPolicyLen += Policy->Length;\r
-  }\r
-  \r
-  //\r
-  // Save credential provider.\r
-  //\r
-  Policy = (EFI_USER_INFO_IDENTITY_POLICY *) (mUserInfo.NewIdentityPolicy + \r
-                                              mUserInfo.NewIdentityPolicyLen);\r
-  Policy->Length = sizeof (EFI_USER_INFO_IDENTITY_POLICY) + sizeof (EFI_GUID);\r
-  Policy->Type   = EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER;\r
-  CopyGuid ((EFI_GUID *) (Policy + 1), &mProviderInfo->Provider[mProviderChoice]->Identifier);\r
-  mUserInfo.NewIdentityPolicyLen += Policy->Length;\r
-\r
-  //\r
-  // Update identity policy choice.\r
-  //\r
-  mUserInfo.NewIdentityPolicyModified = TRUE;\r
-  ResolveIdentityPolicy (\r
-    mUserInfo.NewIdentityPolicy, \r
-    mUserInfo.NewIdentityPolicyLen, \r
-    STRING_TOKEN (STR_IDENTIFY_POLICY_VALUE)\r
-    );\r
-}\r
-\r
-\r
-/**\r
-  Create an action OpCode with QuestionID and DevicePath on a given OpCodeHandle.\r
-\r
-  @param[in]  QuestionID            The question ID.\r
-  @param[in]  DevicePath            Points to device path.\r
-  @param[in]  OpCodeHandle          Points to container for dynamic created opcodes.\r
-\r
-**/\r
-VOID\r
-AddDevicePath (\r
-  IN  UINTN                                     QuestionID,\r
-  IN  EFI_DEVICE_PATH_PROTOCOL                  *DevicePath,\r
-  IN     VOID                                   *OpCodeHandle\r
-  )\r
-{\r
-  EFI_STATUS                        Status;\r
-  EFI_DEVICE_PATH_PROTOCOL          *Next;\r
-  EFI_STRING_ID                     NameID;\r
-  EFI_STRING                        DriverName;\r
-  EFI_DEVICE_PATH_TO_TEXT_PROTOCOL  *DevicePathText;\r
-\r
-  //\r
-  // Locate device path to text protocol.\r
-  //\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiDevicePathToTextProtocolGuid,\r
-                  NULL,\r
-                  (VOID **) &DevicePathText\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return ;\r
-  }\r
-  \r
-  //\r
-  // Get driver file name node.\r
-  //\r
-  Next = DevicePath;\r
-  while (!IsDevicePathEnd (Next)) {\r
-    DevicePath  = Next;\r
-    Next        = NextDevicePathNode (Next);\r
-  }\r
-\r
-  //\r
-  // Display the device path in form.\r
-  //\r
-  DriverName = DevicePathText->ConvertDevicePathToText (DevicePath, FALSE, FALSE);\r
-  NameID = HiiSetString (mCallbackInfo->HiiHandle, 0, DriverName, NULL);\r
-  FreePool (DriverName);\r
-  if (NameID == 0) {\r
-    return ;\r
-  }\r
-\r
-  HiiCreateActionOpCode (\r
-    OpCodeHandle,                   // Container for dynamic created opcodes\r
-    (UINT16) QuestionID,            // Question ID\r
-    NameID,                         // Prompt text\r
-    STRING_TOKEN (STR_NULL_STRING), // Help text\r
-    EFI_IFR_FLAG_CALLBACK,          // Question flag\r
-    0                               // Action String ID\r
-    );\r
-}\r
-\r
-\r
-/**\r
-  Check whether the DevicePath is in the device path forbid list \r
-  (mAccessInfo.LoadForbid).\r
-\r
-  @param[in]  DevicePath           Points to device path.\r
-  \r
-  @retval TRUE     The DevicePath is in the device path forbid list.\r
-  @retval FALSE    The DevicePath is not in the device path forbid list.\r
-\r
-**/\r
-BOOLEAN\r
-IsLoadForbidden (\r
-  IN  EFI_DEVICE_PATH_PROTOCOL                  *DevicePath\r
-  )\r
-{\r
-  UINTN                     OffSet;\r
-  UINTN                     DPSize;\r
-  UINTN                     Size;\r
-  EFI_DEVICE_PATH_PROTOCOL  *Dp;\r
-\r
-  OffSet = 0;\r
-  Size   = GetDevicePathSize (DevicePath);\r
-  //\r
-  // Check each device path.\r
-  //\r
-  while (OffSet < mAccessInfo.LoadForbidLen) {\r
-    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);\r
-    DPSize  = GetDevicePathSize (Dp);\r
-    //\r
-    // Compare device path.\r
-    //\r
-    if ((DPSize == Size) && (CompareMem (DevicePath, Dp, Size) == 0)) {\r
-      return TRUE;\r
-    }\r
-    OffSet += DPSize;\r
-  }\r
-  return FALSE;\r
-}\r
-\r
-\r
-/**\r
-  Display the permit load device path in the loadable device path list.\r
-\r
-**/\r
-VOID\r
-DisplayLoadPermit(\r
-  VOID\r
-  )\r
-{\r
-  EFI_STATUS          Status;\r
-  CHAR16              *Order;\r
-  UINTN               OrderSize;\r
-  UINTN               ListCount;\r
-  UINTN               Index;\r
-  UINT8               *Var;\r
-  UINT8               *VarPtr;\r
-  CHAR16              VarName[12];\r
-  VOID                *StartOpCodeHandle;\r
-  VOID                *EndOpCodeHandle;\r
-  EFI_IFR_GUID_LABEL  *StartLabel;\r
-  EFI_IFR_GUID_LABEL  *EndLabel;\r
-\r
-  //\r
-  // Get DriverOrder.\r
-  //\r
-  OrderSize = 0;\r
-  Status    = gRT->GetVariable (\r
-                     L"DriverOrder", \r
-                     &gEfiGlobalVariableGuid, \r
-                     NULL, \r
-                     &OrderSize, \r
-                     NULL\r
-                     );\r
-  if (Status != EFI_BUFFER_TOO_SMALL) {\r
-    return ;\r
-  }\r
-\r
-  Order = AllocateZeroPool (OrderSize);\r
-  if (Order == NULL) {\r
-    return ;\r
-  }\r
-\r
-  Status = gRT->GetVariable (\r
-                  L"DriverOrder", \r
-                  &gEfiGlobalVariableGuid, \r
-                  NULL, \r
-                  &OrderSize, \r
-                  Order\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return ;\r
-  }\r
-  \r
-  //\r
-  // Initialize the container for dynamic opcodes.\r
-  //\r
-  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (StartOpCodeHandle != NULL);\r
-\r
-  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (EndOpCodeHandle != NULL);\r
-\r
-  //\r
-  // Create Hii Extend Label OpCode.\r
-  //\r
-  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
-                                        StartOpCodeHandle,\r
-                                        &gEfiIfrTianoGuid,\r
-                                        NULL,\r
-                                        sizeof (EFI_IFR_GUID_LABEL)\r
-                                        );\r
-  StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;\r
-  StartLabel->Number        = LABEL_PERMIT_LOAD_FUNC;\r
-\r
-  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
-                                      EndOpCodeHandle,\r
-                                      &gEfiIfrTianoGuid,\r
-                                      NULL,\r
-                                      sizeof (EFI_IFR_GUID_LABEL)\r
-                                      );\r
-  EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;\r
-  EndLabel->Number        = LABEL_END;\r
-\r
-  //\r
-  // Add each driver option.\r
-  //\r
-  Var       = NULL;\r
-  ListCount = OrderSize / sizeof (UINT16);\r
-  for (Index = 0; Index < ListCount; Index++) {\r
-    //\r
-    // Get driver device path.\r
-    //\r
-    UnicodeSPrint (VarName, sizeof (VarName), L"Driver%04x", Order[Index]);\r
-    Var = GetEfiGlobalVariable (VarName);\r
-    if (Var == NULL) {\r
-      continue;\r
-    }\r
-    \r
-    //\r
-    // Check whether the driver is already forbidden.\r
-    //\r
-    \r
-    VarPtr = Var;\r
-    //\r
-    // Skip attribute.\r
-    //\r
-    VarPtr += sizeof (UINT32);\r
-\r
-    //\r
-    // Skip device path lenth.\r
-    //\r
-    VarPtr += sizeof (UINT16);\r
-\r
-    //\r
-    // Skip descript string.\r
-    //\r
-    VarPtr += StrSize ((UINT16 *) VarPtr);\r
-\r
-    if (IsLoadForbidden ((EFI_DEVICE_PATH_PROTOCOL *) VarPtr)) {\r
-      FreePool (Var);\r
-      Var = NULL;\r
-      continue;\r
-    }\r
-\r
-    AddDevicePath (\r
-      KEY_MODIFY_USER | KEY_MODIFY_AP_DP | KEY_LOAD_PERMIT_MODIFY | Order[Index],\r
-      (EFI_DEVICE_PATH_PROTOCOL *) VarPtr,\r
-      StartOpCodeHandle\r
-      );\r
-    FreePool (Var);\r
-    Var = NULL;\r
-  }\r
-\r
-  HiiUpdateForm (\r
-    mCallbackInfo->HiiHandle, // HII handle\r
-    &gUserProfileManagerGuid, // Formset GUID\r
-    FORMID_PERMIT_LOAD_DP,    // Form ID\r
-    StartOpCodeHandle,        // Label for where to insert opcodes\r
-    EndOpCodeHandle           // Replace data\r
-    );\r
-\r
-  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
-  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
-\r
-  //\r
-  // Clear Environment.\r
-  //\r
-  if (Var != NULL) {\r
-    FreePool (Var);\r
-  }\r
-  FreePool (Order);\r
-}\r
-\r
-\r
-/**\r
-  Display the forbid load device path list (mAccessInfo.LoadForbid).\r
-\r
-**/\r
-VOID\r
-DisplayLoadForbid (\r
-  VOID\r
-  )\r
-{\r
-  UINTN                     Offset;\r
-  UINTN                     DPSize;\r
-  UINTN                     Index;\r
-  EFI_DEVICE_PATH_PROTOCOL  *Dp;\r
-  VOID                      *StartOpCodeHandle;\r
-  VOID                      *EndOpCodeHandle;\r
-  EFI_IFR_GUID_LABEL        *StartLabel;\r
-  EFI_IFR_GUID_LABEL        *EndLabel;\r
-\r
-  //\r
-  // Initialize the container for dynamic opcodes.\r
-  //\r
-  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (StartOpCodeHandle != NULL);\r
-\r
-  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (EndOpCodeHandle != NULL);\r
-\r
-  //\r
-  // Create Hii Extend Label OpCode.\r
-  //\r
-  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
-                                        StartOpCodeHandle,\r
-                                        &gEfiIfrTianoGuid,\r
-                                        NULL,\r
-                                        sizeof (EFI_IFR_GUID_LABEL)\r
-                                        );\r
-  StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;\r
-  StartLabel->Number        = LABLE_FORBID_LOAD_FUNC;\r
-\r
-  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
-                                      EndOpCodeHandle,\r
-                                      &gEfiIfrTianoGuid,\r
-                                      NULL,\r
-                                      sizeof (EFI_IFR_GUID_LABEL)\r
-                                      );\r
-  EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;\r
-  EndLabel->Number        = LABEL_END;\r
-\r
-  //\r
-  // Add each forbid load drivers.\r
-  //\r
-  Offset  = 0;\r
-  Index   = 0;\r
-  while (Offset < mAccessInfo.LoadForbidLen) {\r
-    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + Offset);\r
-    DPSize  = GetDevicePathSize (Dp);\r
-    AddDevicePath (\r
-      KEY_MODIFY_USER | KEY_MODIFY_AP_DP | KEY_LOAD_FORBID_MODIFY | Index,\r
-      Dp,\r
-      StartOpCodeHandle\r
-      );\r
-    Index++;\r
-    Offset += DPSize;\r
-  }\r
-\r
-  HiiUpdateForm (\r
-    mCallbackInfo->HiiHandle, // HII handle\r
-    &gUserProfileManagerGuid, // Formset GUID\r
-    FORMID_FORBID_LOAD_DP,    // Form ID\r
-    StartOpCodeHandle,        // Label for where to insert opcodes\r
-    EndOpCodeHandle           // Replace data\r
-    );\r
-\r
-  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
-  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
-}\r
-\r
-\r
-/**\r
-  Display the permit connect device path.\r
-\r
-**/\r
-VOID\r
-DisplayConnectPermit (\r
-  VOID\r
-  )\r
-{\r
-  //\r
-  // Note: \r
-  // As no architect protocol/interface to be called in ConnectController()\r
-  // to verify the device path, just add a place holder for permitted connect\r
-  // device path.\r
-  //\r
-}\r
-\r
-\r
-/**\r
-  Display the forbid connect device path list.\r
-\r
-**/\r
-VOID\r
-DisplayConnectForbid (\r
-  VOID\r
-  )\r
-{\r
-  //\r
-  // Note: \r
-  // As no architect protocol/interface to be called in ConnectController()\r
-  // to verify the device path, just add a place holder for forbidden connect\r
-  // device path.\r
-  //\r
-}\r
-\r
-\r
-/**\r
-  Delete the specified device path by DriverIndex from the forbid device path \r
-  list (mAccessInfo.LoadForbid).\r
-\r
-  @param[in]  DriverIndex   The index of driver in forbidden device path list.\r
-  \r
-**/\r
-VOID\r
-DeleteFromForbidLoad (\r
-  IN  UINT16                                    DriverIndex\r
-  )\r
-{\r
-  UINTN                     OffSet;\r
-  UINTN                     DPSize;\r
-  UINTN                     OffLen;\r
-  EFI_DEVICE_PATH_PROTOCOL  *Dp;\r
-\r
-  OffSet = 0;\r
-  //\r
-  // Find the specified device path.\r
-  //\r
-  while ((OffSet < mAccessInfo.LoadForbidLen) && (DriverIndex > 0)) {\r
-    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);\r
-    DPSize  = GetDevicePathSize (Dp);\r
-    OffSet += DPSize;\r
-    DriverIndex--;\r
-  }\r
-  \r
-  //\r
-  // Specified device path found.\r
-  //\r
-  if (DriverIndex == 0) {\r
-    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);\r
-    DPSize  = GetDevicePathSize (Dp);\r
-    OffLen  = mAccessInfo.LoadForbidLen - OffSet - DPSize;\r
-    if (OffLen > 0) {\r
-      CopyMem (\r
-        mAccessInfo.LoadForbid + OffSet, \r
-        mAccessInfo.LoadForbid + OffSet + DPSize, \r
-        OffLen\r
-        );\r
-    }\r
-    mAccessInfo.LoadForbidLen -= DPSize;\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Add the specified device path by DriverIndex to the forbid device path \r
-  list (mAccessInfo.LoadForbid).\r
-\r
-  @param[in]  DriverIndex   The index of driver saved in driver options.\r
-  \r
-**/\r
-VOID\r
-AddToForbidLoad (\r
-  IN  UINT16                                    DriverIndex\r
-  )\r
-{\r
-  UINTN       DevicePathLen;\r
-  UINT8       *Var;\r
-  UINT8       *VarPtr;\r
-  UINTN       NewLen;\r
-  UINT8       *NewFL;\r
-  CHAR16      VarName[13];\r
-\r
-  //\r
-  // Get loadable driver device path.\r
-  //\r
-  UnicodeSPrint  (VarName, sizeof (VarName), L"Driver%04x", DriverIndex);\r
-  Var = GetEfiGlobalVariable (VarName);\r
-  if (Var == NULL) {\r
-    return;\r
-  }\r
-  \r
-  //\r
-  // Save forbid load driver.\r
-  //\r
-  \r
-  VarPtr = Var;\r
-  //\r
-  // Skip attribute.\r
-  //\r
-  VarPtr += sizeof (UINT32);\r
-\r
-  DevicePathLen = *(UINT16 *) VarPtr;\r
-  //\r
-  // Skip device path length.\r
-  //\r
-  VarPtr += sizeof (UINT16);\r
-\r
-  //\r
-  // Skip description string.\r
-  //\r
-  VarPtr += StrSize ((UINT16 *) VarPtr);\r
-\r
-  NewLen  = mAccessInfo.LoadForbidLen + DevicePathLen;\r
-  NewFL   = AllocateZeroPool (NewLen);\r
-  if (NewFL == NULL) {\r
-    FreePool (Var);\r
-    return ;\r
-  }\r
-\r
-  if (mAccessInfo.LoadForbidLen > 0) {\r
-    CopyMem (NewFL, mAccessInfo.LoadForbid, mAccessInfo.LoadForbidLen);\r
-    FreePool (mAccessInfo.LoadForbid);\r
-  }\r
-\r
-  CopyMem (NewFL + mAccessInfo.LoadForbidLen, VarPtr, DevicePathLen);\r
-  mAccessInfo.LoadForbidLen = NewLen;\r
-  mAccessInfo.LoadForbid    = NewFL;\r
-  FreePool (Var);\r
-}\r
-\r
-\r
-/**\r
-  Get current user's access right.\r
-\r
-  @param[out]  AccessRight  Points to the buffer used for user's access right.\r
-\r
-  @retval EFI_SUCCESS       Get current user access right successfully.\r
-  @retval others            Fail to get current user access right.\r
-\r
-**/\r
-EFI_STATUS\r
-GetAccessRight (\r
-  OUT  UINT32                                    *AccessRight\r
-  )\r
-{\r
-  EFI_STATUS                    Status;\r
-  EFI_USER_INFO_HANDLE          UserInfo;\r
-  EFI_USER_INFO                 *Info;\r
-  UINTN                         InfoSize;\r
-  UINTN                         MemSize;\r
-  EFI_USER_INFO_ACCESS_CONTROL  Access;\r
-  EFI_USER_PROFILE_HANDLE       CurrentUser;\r
-  UINTN                         TotalLen;\r
-  UINTN                         CheckLen;\r
-\r
-  //\r
-  // Allocate user information memory.\r
-  //\r
-  MemSize = sizeof (EFI_USER_INFO) + 63;\r
-  Info    = AllocateZeroPool (MemSize);\r
-  if (Info == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
\r
-  //\r
-  // Get user access information.\r
-  //\r
-  UserInfo = NULL;\r
-  mUserManager->Current (mUserManager, &CurrentUser);\r
-  while (TRUE) {\r
-    InfoSize = MemSize;\r
-    //\r
-    // Get next user information.\r
-    //\r
-    Status = mUserManager->GetNextInfo (mUserManager, CurrentUser, &UserInfo);\r
-    if (EFI_ERROR (Status)) {\r
-      break;\r
-    }\r
-\r
-    Status = mUserManager->GetInfo (\r
-                             mUserManager,\r
-                             CurrentUser,\r
-                             UserInfo,\r
-                             Info,\r
-                             &InfoSize\r
-                             );\r
-    if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      MemSize = InfoSize;\r
-      FreePool (Info);\r
-      Info = AllocateZeroPool (MemSize);\r
-      if (Info == NULL) {\r
-        return EFI_OUT_OF_RESOURCES;\r
-      }\r
-      Status = mUserManager->GetInfo (\r
-                               mUserManager,\r
-                               CurrentUser,\r
-                               UserInfo,\r
-                               Info,\r
-                               &InfoSize\r
-                               );\r
-    }\r
-    if (EFI_ERROR (Status)) {\r
-      break;\r
-    }\r
-    \r
-    //\r
-    // Check user information.\r
-    //\r
-    if (Info->InfoType == EFI_USER_INFO_ACCESS_POLICY_RECORD) {\r
-      TotalLen  = Info->InfoSize - sizeof (EFI_USER_INFO);\r
-      CheckLen  = 0;\r
-      //\r
-      // Get specified access information.\r
-      //\r
-      while (CheckLen < TotalLen) {\r
-        CopyMem (&Access, (UINT8 *) (Info + 1) + CheckLen, sizeof (Access));\r
-        if ((Access.Type == EFI_USER_INFO_ACCESS_ENROLL_SELF) ||\r
-            (Access.Type == EFI_USER_INFO_ACCESS_ENROLL_OTHERS) ||\r
-            (Access.Type == EFI_USER_INFO_ACCESS_MANAGE)\r
-            ) {\r
-          *AccessRight = Access.Type;\r
-          FreePool (Info);\r
-          return EFI_SUCCESS;\r
-        }\r
-        CheckLen += Access.Size;\r
-      }\r
-    }\r
-  }\r
-  FreePool (Info);\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-\r