ArmPkg/ArmMmuLib ARM: fix thinko in second level page table handling
[mirror_edk2.git] / SecurityPkg / UserIdentification / UserProfileManagerDxe / UserProfileDelete.c
1 /** @file\r
2   The functions to delete a user profile.\r
3 \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
9 \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
12 \r
13 **/\r
14 \r
15 #include "UserProfileManager.h"\r
16 \r
17 /**\r
18   Get the username from the specified user.\r
19 \r
20   @param[in]   User              Handle of a user profile.\r
21 \r
22   @retval EFI_STRING_ID          The String Id of the user's username.\r
23 \r
24 **/\r
25 EFI_STRING_ID\r
26 GetUserName (\r
27   IN  EFI_USER_PROFILE_HANDLE                   User\r
28   )\r
29 {\r
30   EFI_STATUS            Status;\r
31   EFI_USER_INFO_HANDLE  UserInfo;\r
32   EFI_USER_INFO         *Info;\r
33   UINTN                 InfoSize;\r
34   UINTN                 MemSize;\r
35   UINTN                 NameLen;\r
36   CHAR16                UserName[USER_NAME_LENGTH];\r
37   EFI_STRING_ID         UserId;\r
38 \r
39   //\r
40   // Allocate user information memory.\r
41   //\r
42   MemSize = sizeof (EFI_USER_INFO) + 63;\r
43   Info    = AllocateZeroPool (MemSize);\r
44   ASSERT (Info != NULL);\r
45 \r
46   //\r
47   // Get user name information.\r
48   //\r
49   UserInfo = NULL;\r
50   while (TRUE) {\r
51     InfoSize = MemSize;\r
52     //\r
53     // Get next user information.\r
54     //\r
55     Status = mUserManager->GetNextInfo (\r
56                              mUserManager,\r
57                              User,\r
58                              &UserInfo\r
59                              );\r
60     if (EFI_ERROR (Status)) {\r
61       break;\r
62     }\r
63 \r
64     Status = mUserManager->GetInfo (\r
65                              mUserManager,\r
66                              User,\r
67                              UserInfo,\r
68                              Info,\r
69                              &InfoSize\r
70                              );\r
71     if (Status == EFI_BUFFER_TOO_SMALL) {\r
72       MemSize = InfoSize;\r
73       FreePool (Info);\r
74       Info = AllocateZeroPool (MemSize);\r
75       ASSERT (Info != NULL);\r
76 \r
77       Status = mUserManager->GetInfo (\r
78                                mUserManager,\r
79                                User,\r
80                                UserInfo,\r
81                                Info,\r
82                                &InfoSize\r
83                                );\r
84     }\r
85     //\r
86     // Check user information.\r
87     //\r
88     if (Status == EFI_SUCCESS) {\r
89       if (Info->InfoType == EFI_USER_INFO_NAME_RECORD) {\r
90         NameLen = Info->InfoSize - sizeof (EFI_USER_INFO);\r
91         if (NameLen > USER_NAME_LENGTH * sizeof (CHAR16)) {\r
92           NameLen = USER_NAME_LENGTH * sizeof (CHAR16);\r
93         }\r
94         ASSERT (NameLen >= sizeof (CHAR16));\r
95         CopyMem (UserName, (UINT8 *) (Info + 1), NameLen);\r
96         UserName[NameLen / sizeof (CHAR16) - 1] = 0;\r
97         UserId = HiiSetString (\r
98                    mCallbackInfo->HiiHandle,\r
99                    0,\r
100                    UserName,\r
101                    NULL\r
102                    );\r
103         if (UserId != 0) {\r
104           FreePool (Info);\r
105           return UserId;\r
106         }\r
107       }\r
108     }\r
109   }\r
110 \r
111   FreePool (Info);\r
112   return 0;\r
113 }\r
114 \r
115 \r
116 /**\r
117   Add a username item in form.\r
118 \r
119   @param[in]  User          Points to the user profile whose username is added.\r
120   @param[in]  Index         The index of the user in the user name list\r
121   @param[in]  OpCodeHandle  Points to container for dynamic created opcodes.\r
122 \r
123 **/\r
124 VOID\r
125 AddUserToForm (\r
126   IN  EFI_USER_PROFILE_HANDLE                   User,\r
127   IN  UINT16                                    Index,\r
128   IN  VOID                                      *OpCodeHandle\r
129   )\r
130 {\r
131   EFI_STRING_ID NameId;\r
132 \r
133   //\r
134   // Get user name\r
135   //\r
136   NameId = GetUserName (User);\r
137   if (NameId == 0) {\r
138     return ;\r
139   }\r
140 \r
141   //\r
142   // Create user name option.\r
143   //\r
144   switch (Index & KEY_FIRST_FORM_MASK) {\r
145   case KEY_MODIFY_USER:\r
146     HiiCreateGotoOpCode (\r
147       OpCodeHandle,                   // Container for dynamic created opcodes\r
148       FORMID_USER_INFO,               // Target Form ID\r
149       NameId,                         // Prompt text\r
150       STRING_TOKEN (STR_NULL_STRING), // Help text\r
151       EFI_IFR_FLAG_CALLBACK,          // Question flag\r
152       Index                           // Question ID\r
153       );\r
154     break;\r
155 \r
156   case KEY_DEL_USER:\r
157     HiiCreateActionOpCode (\r
158       OpCodeHandle,                   // Container for dynamic created opcodes\r
159       Index,                          // Question ID\r
160       NameId,                         // Prompt text\r
161       STRING_TOKEN (STR_NULL_STRING), // Help text\r
162       EFI_IFR_FLAG_CALLBACK,          // Question flag\r
163       0                               // Action String ID\r
164       );\r
165     break;\r
166 \r
167   default:\r
168     break;\r
169   }\r
170 }\r
171 \r
172 \r
173 /**\r
174   Delete the user specified by UserIndex in user profile database.\r
175 \r
176   @param[in]  UserIndex       The index of user in the user name list\r
177                               to be deleted.\r
178 \r
179 **/\r
180 VOID\r
181 DeleteUser (\r
182   IN UINT8                                      UserIndex\r
183   )\r
184 {\r
185   EFI_STATUS              Status;\r
186   EFI_USER_PROFILE_HANDLE User;\r
187   EFI_INPUT_KEY           Key;\r
188   EFI_USER_INFO_HANDLE    UserInfo;\r
189   EFI_USER_INFO           *Info;\r
190   UINTN                   InfoSize;\r
191 \r
192   //\r
193   // Find specified user profile and delete it.\r
194   //\r
195   User    = NULL;\r
196   Status  = mUserManager->GetNext (mUserManager, &User);\r
197   if (EFI_ERROR (Status)) {\r
198     goto Done;\r
199   }\r
200 \r
201   while (UserIndex > 1) {\r
202     Status = mUserManager->GetNext (mUserManager, &User);\r
203     if (EFI_ERROR (Status)) {\r
204       goto Done;\r
205     }\r
206     UserIndex--;\r
207   }\r
208 \r
209   if (UserIndex == 1) {\r
210     //\r
211     // Get the identification policy.\r
212     //\r
213     Status = FindInfoByType (User, EFI_USER_INFO_IDENTITY_POLICY_RECORD, &UserInfo);\r
214     if (EFI_ERROR (Status)) {\r
215       goto Done;\r
216     }\r
217 \r
218     InfoSize = 0;\r
219     Info = NULL;\r
220     Status   = mUserManager->GetInfo (mUserManager, User, UserInfo, Info, &InfoSize);\r
221     if (Status == EFI_BUFFER_TOO_SMALL) {\r
222       Info = AllocateZeroPool (InfoSize);\r
223       if (Info == NULL) {\r
224         goto Done;\r
225       }\r
226       Status = mUserManager->GetInfo (mUserManager, User, UserInfo, Info, &InfoSize);\r
227     }\r
228 \r
229     //\r
230     // Delete the user on the credential providers by its identification policy.\r
231     //\r
232     ASSERT (Info != NULL);\r
233     DeleteCredentialFromProviders ((UINT8 *)(Info + 1), Info->InfoSize - sizeof (EFI_USER_INFO), User);\r
234     FreePool (Info);\r
235 \r
236     Status = mUserManager->Delete (mUserManager, User);\r
237     if (EFI_ERROR (Status)) {\r
238       goto Done;\r
239     }\r
240     CreatePopUp (\r
241       EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
242       &Key,\r
243       L"Delete User Succeed!",\r
244       L"",\r
245       L"Please Press Any Key to Continue ...",\r
246       NULL\r
247       );\r
248     return ;\r
249   }\r
250 \r
251 Done:\r
252   CreatePopUp (\r
253     EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
254     &Key,\r
255     L"Delete User Failed!",\r
256     L"",\r
257     L"Please Press Any Key to Continue ...",\r
258     NULL\r
259     );\r
260 }\r
261 \r
262 \r
263 /**\r
264   Display user select form, cab select a user to delete.\r
265 \r
266 **/\r
267 VOID\r
268 SelectUserToDelete (\r
269   VOID\r
270   )\r
271 {\r
272   EFI_STATUS              Status;\r
273   UINT8                   Index;\r
274   EFI_USER_PROFILE_HANDLE User;\r
275   EFI_USER_PROFILE_HANDLE CurrentUser;\r
276   VOID                    *StartOpCodeHandle;\r
277   VOID                    *EndOpCodeHandle;\r
278   EFI_IFR_GUID_LABEL      *StartLabel;\r
279   EFI_IFR_GUID_LABEL      *EndLabel;\r
280 \r
281   //\r
282   // Initialize the container for dynamic opcodes.\r
283   //\r
284   StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
285   ASSERT (StartOpCodeHandle != NULL);\r
286 \r
287   EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
288   ASSERT (EndOpCodeHandle != NULL);\r
289 \r
290   //\r
291   // Create Hii Extend Label OpCode.\r
292   //\r
293   StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
294                                         StartOpCodeHandle,\r
295                                         &gEfiIfrTianoGuid,\r
296                                         NULL,\r
297                                         sizeof (EFI_IFR_GUID_LABEL)\r
298                                         );\r
299   StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;\r
300   StartLabel->Number        = LABEL_USER_DEL_FUNC;\r
301 \r
302   EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
303                                       EndOpCodeHandle,\r
304                                       &gEfiIfrTianoGuid,\r
305                                       NULL,\r
306                                       sizeof (EFI_IFR_GUID_LABEL)\r
307                                       );\r
308   EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;\r
309   EndLabel->Number        = LABEL_END;\r
310 \r
311   //\r
312   // Add each user can be deleted.\r
313   //\r
314   User  = NULL;\r
315   Index = 1;\r
316   mUserManager->Current (mUserManager, &CurrentUser);\r
317   while (TRUE) {\r
318     Status = mUserManager->GetNext (mUserManager, &User);\r
319     if (EFI_ERROR (Status)) {\r
320       break;\r
321     }\r
322 \r
323     if (User != CurrentUser) {\r
324       AddUserToForm (\r
325         User,\r
326         (UINT16)(KEY_DEL_USER | KEY_SELECT_USER | Index),\r
327         StartOpCodeHandle\r
328         );\r
329     }\r
330     Index++;\r
331   }\r
332 \r
333   HiiUpdateForm (\r
334     mCallbackInfo->HiiHandle, // HII handle\r
335     &gUserProfileManagerGuid, // Formset GUID\r
336     FORMID_DEL_USER,          // Form ID\r
337     StartOpCodeHandle,        // Label for where to insert opcodes\r
338     EndOpCodeHandle           // Replace data\r
339     );\r
340 \r
341   HiiFreeOpCodeHandle (StartOpCodeHandle);\r
342   HiiFreeOpCodeHandle (EndOpCodeHandle);\r
343 }\r