2 The functions for access policy modification.
\r
4 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
\r
5 This program and the accompanying materials
\r
6 are licensed and made available under the terms and conditions of the BSD License
\r
7 which accompanies this distribution. The full text of the license may be found at
\r
8 http://opensource.org/licenses/bsd-license.php
\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
\r
15 #include "UserProfileManager.h"
\r
18 Collect all the access policy data to mUserInfo.AccessPolicy,
\r
19 and save it to user profile.
\r
30 EFI_USER_INFO_ACCESS_CONTROL Control;
\r
31 EFI_USER_INFO_HANDLE UserInfo;
\r
32 EFI_USER_INFO *Info;
\r
34 if (mUserInfo.AccessPolicy != NULL) {
\r
35 FreePool (mUserInfo.AccessPolicy);
\r
37 mUserInfo.AccessPolicy = NULL;
\r
38 mUserInfo.AccessPolicyLen = 0;
\r
39 mUserInfo.AccessPolicyModified = TRUE;
\r
43 // Save access right.
\r
45 Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL);
\r
46 if (mUserInfo.AccessPolicyLen - OffSet < Size) {
\r
47 ExpandMemory (OffSet, Size);
\r
50 Control.Type = mAccessInfo.AccessRight;
\r
51 Control.Size = (UINT32) Size;
\r
52 CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
\r
53 OffSet += sizeof (Control);
\r
56 // Save access setup.
\r
58 Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (EFI_GUID);
\r
59 if (mUserInfo.AccessPolicyLen - OffSet < Size) {
\r
60 ExpandMemory (OffSet, Size);
\r
63 Control.Type = EFI_USER_INFO_ACCESS_SETUP;
\r
64 Control.Size = (UINT32) Size;
\r
65 CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
\r
66 OffSet += sizeof (Control);
\r
68 if (mAccessInfo.AccessSetup == ACCESS_SETUP_NORMAL) {
\r
69 CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupNormalGuid);
\r
70 } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_RESTRICTED) {
\r
71 CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupRestrictedGuid);
\r
72 } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_ADMIN) {
\r
73 CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupAdminGuid);
\r
75 OffSet += sizeof (EFI_GUID);
\r
78 // Save access of boot order.
\r
80 Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (UINT32);
\r
81 if (mUserInfo.AccessPolicyLen - OffSet < Size) {
\r
82 ExpandMemory (OffSet, Size);
\r
85 Control.Type = EFI_USER_INFO_ACCESS_BOOT_ORDER;
\r
86 Control.Size = (UINT32) Size;
\r
87 CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
\r
88 OffSet += sizeof (Control);
\r
90 CopyMem ((UINT8 *) (mUserInfo.AccessPolicy + OffSet), &mAccessInfo.AccessBootOrder, sizeof (UINT32));
\r
91 OffSet += sizeof (UINT32);
\r
94 // Save permit load.
\r
96 if (mAccessInfo.LoadPermitLen > 0) {
\r
97 Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.LoadPermitLen;
\r
98 if (mUserInfo.AccessPolicyLen - OffSet < Size) {
\r
99 ExpandMemory (OffSet, Size);
\r
102 Control.Type = EFI_USER_INFO_ACCESS_PERMIT_LOAD;
\r
103 Control.Size = (UINT32) Size;
\r
104 CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
\r
105 OffSet += sizeof (Control);
\r
107 CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadPermit, mAccessInfo.LoadPermitLen);
\r
108 OffSet += mAccessInfo.LoadPermitLen;
\r
112 // Save forbid load.
\r
114 if (mAccessInfo.LoadForbidLen > 0) {
\r
115 Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.LoadForbidLen;
\r
116 if (mUserInfo.AccessPolicyLen - OffSet < Size) {
\r
117 ExpandMemory (OffSet, Size);
\r
120 Control.Type = EFI_USER_INFO_ACCESS_FORBID_LOAD;
\r
121 Control.Size = (UINT32) Size;
\r
122 CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
\r
123 OffSet += sizeof (Control);
\r
125 CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadForbid, mAccessInfo.LoadForbidLen);
\r
126 OffSet += mAccessInfo.LoadForbidLen;
\r
130 // Save permit connect.
\r
132 if (mAccessInfo.ConnectPermitLen > 0) {
\r
133 Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.ConnectPermitLen;
\r
134 if (mUserInfo.AccessPolicyLen - OffSet < Size) {
\r
135 ExpandMemory (OffSet, Size);
\r
138 Control.Type = EFI_USER_INFO_ACCESS_PERMIT_CONNECT;
\r
139 Control.Size = (UINT32) Size;
\r
140 CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
\r
141 OffSet += sizeof (Control);
\r
143 CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectPermit, mAccessInfo.ConnectPermitLen);
\r
144 OffSet += mAccessInfo.ConnectPermitLen;
\r
148 // Save forbid connect.
\r
150 if (mAccessInfo.ConnectForbidLen > 0) {
\r
151 Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.ConnectForbidLen;
\r
152 if (mUserInfo.AccessPolicyLen - OffSet < Size) {
\r
153 ExpandMemory (OffSet, Size);
\r
156 Control.Type = EFI_USER_INFO_ACCESS_FORBID_CONNECT;
\r
157 Control.Size = (UINT32) Size;
\r
158 CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
\r
159 OffSet += sizeof (Control);
\r
161 CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectForbid, mAccessInfo.ConnectForbidLen);
\r
162 OffSet += mAccessInfo.ConnectForbidLen;
\r
165 mUserInfo.AccessPolicyLen = OffSet;
\r
168 // Save access policy.
\r
170 if (mUserInfo.AccessPolicyModified && (mUserInfo.AccessPolicyLen > 0) && (mUserInfo.AccessPolicy != NULL)) {
\r
171 Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + mUserInfo.AccessPolicyLen);
\r
172 if (Info == NULL) {
\r
176 Status = FindInfoByType (mModifyUser, EFI_USER_INFO_ACCESS_POLICY_RECORD, &UserInfo);
\r
177 if (!EFI_ERROR (Status)) {
\r
178 Info->InfoType = EFI_USER_INFO_ACCESS_POLICY_RECORD;
\r
179 Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
\r
180 EFI_USER_INFO_PUBLIC |
\r
181 EFI_USER_INFO_EXCLUSIVE;
\r
182 Info->InfoSize = (UINT32) (sizeof (EFI_USER_INFO) + mUserInfo.AccessPolicyLen);
\r
183 CopyMem ((UINT8 *) (Info + 1), mUserInfo.AccessPolicy, mUserInfo.AccessPolicyLen);
\r
184 Status = mUserManager->SetInfo (
\r
191 mUserInfo.AccessPolicyModified = FALSE;
\r
196 if (mAccessInfo.ConnectForbid != NULL) {
\r
197 FreePool (mAccessInfo.ConnectForbid);
\r
198 mAccessInfo.ConnectForbid = NULL;
\r
201 if (mAccessInfo.ConnectPermit != NULL) {
\r
202 FreePool (mAccessInfo.ConnectPermit);
\r
203 mAccessInfo.ConnectPermit = NULL;
\r
206 if (mAccessInfo.LoadForbid != NULL) {
\r
207 FreePool (mAccessInfo.LoadForbid);
\r
208 mAccessInfo.LoadForbid = NULL;
\r
211 if (mAccessInfo.LoadPermit != NULL) {
\r
212 FreePool (mAccessInfo.LoadPermit);
\r
213 mAccessInfo.LoadPermit = NULL;
\r
218 Create an action OpCode with QuestionID and DevicePath on a given OpCodeHandle.
\r
220 @param[in] QuestionID The question ID.
\r
221 @param[in] DevicePath Points to device path.
\r
222 @param[in] OpCodeHandle Points to container for dynamic created opcodes.
\r
227 IN UINTN QuestionID,
\r
228 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
\r
229 IN VOID *OpCodeHandle
\r
232 EFI_DEVICE_PATH_PROTOCOL *Next;
\r
233 EFI_STRING_ID NameID;
\r
234 EFI_STRING DriverName;
\r
237 // Get driver file name node.
\r
240 while (!IsDevicePathEnd (Next)) {
\r
242 Next = NextDevicePathNode (Next);
\r
246 // Display the device path in form.
\r
248 DriverName = ConvertDevicePathToText (DevicePath, FALSE, FALSE);
\r
249 NameID = HiiSetString (mCallbackInfo->HiiHandle, 0, DriverName, NULL);
\r
250 FreePool (DriverName);
\r
255 HiiCreateActionOpCode (
\r
256 OpCodeHandle, // Container for dynamic created opcodes
\r
257 (UINT16) QuestionID, // Question ID
\r
258 NameID, // Prompt text
\r
259 STRING_TOKEN (STR_NULL_STRING), // Help text
\r
260 EFI_IFR_FLAG_CALLBACK, // Question flag
\r
261 0 // Action String ID
\r
267 Check whether the DevicePath is in the device path forbid list
\r
268 (mAccessInfo.LoadForbid).
\r
270 @param[in] DevicePath Points to device path.
\r
272 @retval TRUE The DevicePath is in the device path forbid list.
\r
273 @retval FALSE The DevicePath is not in the device path forbid list.
\r
278 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
\r
284 EFI_DEVICE_PATH_PROTOCOL *Dp;
\r
287 Size = GetDevicePathSize (DevicePath);
\r
289 // Check each device path.
\r
291 while (OffSet < mAccessInfo.LoadForbidLen) {
\r
292 Dp = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);
\r
293 DPSize = GetDevicePathSize (Dp);
\r
295 // Compare device path.
\r
297 if ((DPSize == Size) && (CompareMem (DevicePath, Dp, Size) == 0)) {
\r
307 Display the permit load device path in the loadable device path list.
\r
322 CHAR16 VarName[12];
\r
323 VOID *StartOpCodeHandle;
\r
324 VOID *EndOpCodeHandle;
\r
325 EFI_IFR_GUID_LABEL *StartLabel;
\r
326 EFI_IFR_GUID_LABEL *EndLabel;
\r
329 // Get DriverOrder.
\r
332 Status = gRT->GetVariable (
\r
334 &gEfiGlobalVariableGuid,
\r
339 if (Status != EFI_BUFFER_TOO_SMALL) {
\r
343 Order = AllocateZeroPool (OrderSize);
\r
344 if (Order == NULL) {
\r
348 Status = gRT->GetVariable (
\r
350 &gEfiGlobalVariableGuid,
\r
355 if (EFI_ERROR (Status)) {
\r
360 // Initialize the container for dynamic opcodes.
\r
362 StartOpCodeHandle = HiiAllocateOpCodeHandle ();
\r
363 ASSERT (StartOpCodeHandle != NULL);
\r
365 EndOpCodeHandle = HiiAllocateOpCodeHandle ();
\r
366 ASSERT (EndOpCodeHandle != NULL);
\r
369 // Create Hii Extend Label OpCode.
\r
371 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
\r
375 sizeof (EFI_IFR_GUID_LABEL)
\r
377 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
\r
378 StartLabel->Number = LABEL_PERMIT_LOAD_FUNC;
\r
380 EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
\r
384 sizeof (EFI_IFR_GUID_LABEL)
\r
386 EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
\r
387 EndLabel->Number = LABEL_END;
\r
390 // Add each driver option.
\r
393 ListCount = OrderSize / sizeof (UINT16);
\r
394 for (Index = 0; Index < ListCount; Index++) {
\r
396 // Get driver device path.
\r
398 UnicodeSPrint (VarName, sizeof (VarName), L"Driver%04x", Order[Index]);
\r
399 GetEfiGlobalVariable2 (VarName, (VOID**)&Var, NULL);
\r
405 // Check whether the driver is already forbidden.
\r
412 VarPtr += sizeof (UINT32);
\r
415 // Skip device path lenth.
\r
417 VarPtr += sizeof (UINT16);
\r
420 // Skip descript string.
\r
422 VarPtr += StrSize ((UINT16 *) VarPtr);
\r
424 if (IsLoadForbidden ((EFI_DEVICE_PATH_PROTOCOL *) VarPtr)) {
\r
431 KEY_MODIFY_USER | KEY_MODIFY_AP_DP | KEY_LOAD_PERMIT_MODIFY | Order[Index],
\r
432 (EFI_DEVICE_PATH_PROTOCOL *) VarPtr,
\r
440 mCallbackInfo->HiiHandle, // HII handle
\r
441 &gUserProfileManagerGuid, // Formset GUID
\r
442 FORMID_PERMIT_LOAD_DP, // Form ID
\r
443 StartOpCodeHandle, // Label for where to insert opcodes
\r
444 EndOpCodeHandle // Replace data
\r
447 HiiFreeOpCodeHandle (StartOpCodeHandle);
\r
448 HiiFreeOpCodeHandle (EndOpCodeHandle);
\r
451 // Clear Environment.
\r
461 Display the forbid load device path list (mAccessInfo.LoadForbid).
\r
465 DisplayLoadForbid (
\r
472 EFI_DEVICE_PATH_PROTOCOL *Dp;
\r
473 VOID *StartOpCodeHandle;
\r
474 VOID *EndOpCodeHandle;
\r
475 EFI_IFR_GUID_LABEL *StartLabel;
\r
476 EFI_IFR_GUID_LABEL *EndLabel;
\r
479 // Initialize the container for dynamic opcodes.
\r
481 StartOpCodeHandle = HiiAllocateOpCodeHandle ();
\r
482 ASSERT (StartOpCodeHandle != NULL);
\r
484 EndOpCodeHandle = HiiAllocateOpCodeHandle ();
\r
485 ASSERT (EndOpCodeHandle != NULL);
\r
488 // Create Hii Extend Label OpCode.
\r
490 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
\r
494 sizeof (EFI_IFR_GUID_LABEL)
\r
496 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
\r
497 StartLabel->Number = LABLE_FORBID_LOAD_FUNC;
\r
499 EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
\r
503 sizeof (EFI_IFR_GUID_LABEL)
\r
505 EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
\r
506 EndLabel->Number = LABEL_END;
\r
509 // Add each forbid load drivers.
\r
513 while (Offset < mAccessInfo.LoadForbidLen) {
\r
514 Dp = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + Offset);
\r
515 DPSize = GetDevicePathSize (Dp);
\r
517 KEY_MODIFY_USER | KEY_MODIFY_AP_DP | KEY_LOAD_FORBID_MODIFY | Index,
\r
526 mCallbackInfo->HiiHandle, // HII handle
\r
527 &gUserProfileManagerGuid, // Formset GUID
\r
528 FORMID_FORBID_LOAD_DP, // Form ID
\r
529 StartOpCodeHandle, // Label for where to insert opcodes
\r
530 EndOpCodeHandle // Replace data
\r
533 HiiFreeOpCodeHandle (StartOpCodeHandle);
\r
534 HiiFreeOpCodeHandle (EndOpCodeHandle);
\r
539 Display the permit connect device path.
\r
543 DisplayConnectPermit (
\r
549 // As no architect protocol/interface to be called in ConnectController()
\r
550 // to verify the device path, just add a place holder for permitted connect
\r
557 Display the forbid connect device path list.
\r
561 DisplayConnectForbid (
\r
567 // As no architect protocol/interface to be called in ConnectController()
\r
568 // to verify the device path, just add a place holder for forbidden connect
\r
575 Delete the specified device path by DriverIndex from the forbid device path
\r
576 list (mAccessInfo.LoadForbid).
\r
578 @param[in] DriverIndex The index of driver in forbidden device path list.
\r
582 DeleteFromForbidLoad (
\r
583 IN UINT16 DriverIndex
\r
589 EFI_DEVICE_PATH_PROTOCOL *Dp;
\r
593 // Find the specified device path.
\r
595 while ((OffSet < mAccessInfo.LoadForbidLen) && (DriverIndex > 0)) {
\r
596 Dp = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);
\r
597 DPSize = GetDevicePathSize (Dp);
\r
603 // Specified device path found.
\r
605 if (DriverIndex == 0) {
\r
606 Dp = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);
\r
607 DPSize = GetDevicePathSize (Dp);
\r
608 OffLen = mAccessInfo.LoadForbidLen - OffSet - DPSize;
\r
611 mAccessInfo.LoadForbid + OffSet,
\r
612 mAccessInfo.LoadForbid + OffSet + DPSize,
\r
616 mAccessInfo.LoadForbidLen -= DPSize;
\r
622 Add the specified device path by DriverIndex to the forbid device path
\r
623 list (mAccessInfo.LoadForbid).
\r
625 @param[in] DriverIndex The index of driver saved in driver options.
\r
630 IN UINT16 DriverIndex
\r
633 UINTN DevicePathLen;
\r
638 CHAR16 VarName[13];
\r
641 // Get loadable driver device path.
\r
643 UnicodeSPrint (VarName, sizeof (VarName), L"Driver%04x", DriverIndex);
\r
644 GetEfiGlobalVariable2 (VarName, (VOID**)&Var, NULL);
\r
650 // Save forbid load driver.
\r
657 VarPtr += sizeof (UINT32);
\r
659 DevicePathLen = *(UINT16 *) VarPtr;
\r
661 // Skip device path length.
\r
663 VarPtr += sizeof (UINT16);
\r
666 // Skip description string.
\r
668 VarPtr += StrSize ((UINT16 *) VarPtr);
\r
670 NewLen = mAccessInfo.LoadForbidLen + DevicePathLen;
\r
671 NewFL = AllocateZeroPool (NewLen);
\r
672 if (NewFL == NULL) {
\r
677 if (mAccessInfo.LoadForbidLen > 0) {
\r
678 CopyMem (NewFL, mAccessInfo.LoadForbid, mAccessInfo.LoadForbidLen);
\r
679 FreePool (mAccessInfo.LoadForbid);
\r
682 CopyMem (NewFL + mAccessInfo.LoadForbidLen, VarPtr, DevicePathLen);
\r
683 mAccessInfo.LoadForbidLen = NewLen;
\r
684 mAccessInfo.LoadForbid = NewFL;
\r