]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add IFR Security Op-code support in the Form Browser.
authorrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 26 Nov 2009 09:26:42 +0000 (09:26 +0000)
committerrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 26 Nov 2009 09:26:42 +0000 (09:26 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9492 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/SetupBrowserDxe/Expression.c
MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf

index 08e830b5d9764885ad0959ffa7bee32033968d00..508a80524a9dfa359f4924b2460541e783649f39 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Utility functions for expression evaluation.\r
 \r
-Copyright (c) 2007 - 2008, Intel Corporation\r
+Copyright (c) 2007 - 2009, Intel Corporation\r
 All rights reserved. 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
@@ -29,7 +29,7 @@ EFI_HII_VALUE *mExpressionEvaluationStackPointer = NULL;
 // Unicode collation protocol interface\r
 //\r
 EFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollation = NULL;\r
-\r
+EFI_USER_MANAGER_PROTOCOL      *mUserManager = NULL;\r
 \r
 /**\r
   Grow size of the stack.\r
@@ -1296,6 +1296,108 @@ CompareHiiValue (
   return Result;\r
 }\r
 \r
+/**\r
+  Check if current user has the privilege specified by the permissions GUID.\r
+\r
+  @param[in] Guid  A GUID specifying setup access permissions.\r
+\r
+  @retval TRUE     Current user has the privilege.\r
+  @retval FALSE    Current user does not have the privilege.\r
+**/\r
+BOOLEAN\r
+CheckUserPrivilege (\r
+  IN EFI_GUID *Guid\r
+  )\r
+{\r
+  EFI_STATUS                   Status;\r
+  EFI_USER_PROFILE_HANDLE      UserProfileHandle;\r
+  EFI_USER_INFO_HANDLE         UserInfoHandle;\r
+  EFI_USER_INFO                *UserInfo;\r
+  EFI_GUID                     *UserPermissionsGuid;\r
+  UINTN                        UserInfoSize;\r
+  UINTN                        AccessControlDataSize;\r
+  EFI_USER_INFO_ACCESS_CONTROL *AccessControl;\r
+  UINTN                        RemainSize;\r
+\r
+  if (mUserManager == NULL) {\r
+    Status = gBS->LocateProtocol (\r
+                    &gEfiUserManagerProtocolGuid,\r
+                    NULL,\r
+                    (VOID **) &mUserManager\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      ///\r
+      /// If the system does not support user management, then it is assumed that\r
+      /// all users have admin privilege and evaluation of each EFI_IFR_SECURITY\r
+      /// op-code is always TRUE.\r
+      ///\r
+      return TRUE;\r
+    }\r
+  }\r
+\r
+  Status = mUserManager->Current (mUserManager, &UserProfileHandle);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  ///\r
+  /// Enumerate all user information of the current user profile\r
+  /// to look for any EFI_USER_INFO_ACCESS_SETUP record.\r
+  ///\r
+  \r
+  for (UserInfoHandle = NULL;;) {\r
+    Status = mUserManager->GetNextInfo (mUserManager, UserProfileHandle, &UserInfoHandle);\r
+    if (EFI_ERROR (Status)) {\r
+      break;\r
+    }\r
+\r
+    UserInfoSize = 0;\r
+    Status = mUserManager->GetInfo (mUserManager, UserProfileHandle, UserInfoHandle, NULL, &UserInfoSize);\r
+    if (Status != EFI_BUFFER_TOO_SMALL) {\r
+      continue;\r
+    }\r
+\r
+    UserInfo = (EFI_USER_INFO *) AllocatePool (UserInfoSize);\r
+    if (UserInfo == NULL) {\r
+      break;\r
+    }\r
+\r
+    Status = mUserManager->GetInfo (mUserManager, UserProfileHandle, UserInfoHandle, UserInfo, &UserInfoSize);\r
+    if (EFI_ERROR (Status) ||\r
+        UserInfo->InfoType != EFI_USER_INFO_ACCESS_POLICY_RECORD ||\r
+        UserInfo->InfoSize <= sizeof (EFI_USER_INFO)) {\r
+      FreePool (UserInfo);\r
+      continue;\r
+    }\r
+\r
+    RemainSize = UserInfo->InfoSize - sizeof (EFI_USER_INFO);\r
+    AccessControl = (EFI_USER_INFO_ACCESS_CONTROL *)(UserInfo + 1);\r
+    while (RemainSize >= sizeof (EFI_USER_INFO_ACCESS_CONTROL)) {\r
+      if (RemainSize < AccessControl->Size || AccessControl->Size <= sizeof (EFI_USER_INFO_ACCESS_CONTROL)) {\r
+        break;\r
+      }\r
+      if (AccessControl->Type == EFI_USER_INFO_ACCESS_SETUP) {\r
+        ///\r
+        /// Check if current user has the privilege specified by the permissions GUID.\r
+        ///\r
+\r
+        UserPermissionsGuid = (EFI_GUID *)(AccessControl + 1);\r
+        AccessControlDataSize = AccessControl->Size - sizeof (EFI_USER_INFO_ACCESS_CONTROL);\r
+        while (AccessControlDataSize >= sizeof (EFI_GUID)) {\r
+          if (CompareGuid (Guid, UserPermissionsGuid)) {\r
+            FreePool (UserInfo);\r
+            return TRUE;\r
+          }\r
+          UserPermissionsGuid++;\r
+          AccessControlDataSize -= sizeof (EFI_GUID);\r
+        }\r
+      }\r
+      RemainSize -= AccessControl->Size;\r
+      AccessControl = (EFI_USER_INFO_ACCESS_CONTROL *)((UINT8 *)AccessControl + AccessControl->Size);\r
+    }\r
+\r
+    FreePool (UserInfo);\r
+  }\r
+  return FALSE;\r
+}\r
 \r
 /**\r
   Evaluate the result of a HII expression.\r
@@ -1428,6 +1530,10 @@ EvaluateExpression (
       Value = &Question->HiiValue;\r
       break;\r
 \r
+    case EFI_IFR_SECURITY_OP:\r
+      Value->Value.b = CheckUserPrivilege (&OpCode->Guid);\r
+      break;\r
+\r
     case EFI_IFR_QUESTION_REF3_OP:\r
       if (OpCode->DevicePath == 0) {\r
         //\r
index c0b2de7f05e7da3aa6cfd48ec18f4b88b020ec36..161e15401b8785dc45583f32ad61199261f8792b 100644 (file)
@@ -747,8 +747,8 @@ IsExpressionOpCode (
       (Operand == EFI_IFR_CATENATE_OP) ||\r
       (Operand == EFI_IFR_TO_LOWER_OP) ||\r
       (Operand == EFI_IFR_TO_UPPER_OP) ||\r
-      (Operand == EFI_IFR_VERSION_OP)\r
-     ) {\r
+      (Operand == EFI_IFR_VERSION_OP)  ||\r
+      (Operand == EFI_IFR_SECURITY_OP)) {\r
     return TRUE;\r
   } else {\r
     return FALSE;\r
@@ -982,6 +982,10 @@ ParseOpCodes (
         ExpressionOpCode->QuestionId = CurrentStatement->QuestionId;\r
         break;\r
 \r
+      case EFI_IFR_SECURITY_OP:\r
+        CopyMem (&ExpressionOpCode->Guid, &((EFI_IFR_SECURITY *) OpCodeData)->Permissions, sizeof (EFI_GUID));\r
+        break;\r
+\r
       case EFI_IFR_QUESTION_REF1_OP:\r
         CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
         break;\r
index 041e1b88a8697d40d5cebb2ab41fcaa25adf3d9f..b5cbc67028b19d085efee029ee8b3ffa3c3da6c0 100644 (file)
@@ -28,6 +28,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Protocol/HiiConfigRouting.h>\r
 #include <Protocol/HiiDatabase.h>\r
 #include <Protocol/HiiString.h>\r
+#include <Protocol/UserManager.h>\r
 \r
 #include <Guid/MdeModuleHii.h>\r
 #include <Guid/HiiPlatformSetupFormset.h>\r
index a4305aabb8933035b30b36d3023f72227f24053b..77b0d528c7c1dc60a9237b78152a2b7b36e50346 100644 (file)
@@ -72,6 +72,7 @@
   gEfiHiiConfigRoutingProtocolGuid              ## CONSUMES\r
   gEfiHiiDatabaseProtocolGuid                   ## CONSUMES\r
   gEfiUnicodeCollation2ProtocolGuid             ## CONSUMES\r
+  gEfiUserManagerProtocolGuid                   ## SOMETIMES_CONSUMES\r
 \r
 [FeaturePcd.common]\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFrameworkCompatibilitySupport\r