]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileDelete.c
SecurityPkg: Clean up source files
[mirror_edk2.git] / SecurityPkg / UserIdentification / UserProfileManagerDxe / UserProfileDelete.c
CommitLineData
0c18794e 1/** @file\r
2 The functions to delete a user profile.\r
b3548d32
LG
3\r
4Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
0c18794e 8http://opensource.org/licenses/bsd-license.php\r
9\r
b3548d32 10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
0c18794e 11WITHOUT 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
b3548d32 20 @param[in] User Handle of a user profile.\r
0c18794e 21\r
22 @retval EFI_STRING_ID The String Id of the user's username.\r
23\r
24**/\r
b3548d32 25EFI_STRING_ID\r
0c18794e 26GetUserName (\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
b3548d32 38\r
0c18794e 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
b3548d32 45\r
0c18794e 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
b3548d32 119 @param[in] User Points to the user profile whose username is added.\r
0c18794e 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
124VOID\r
125AddUserToForm (\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
b3548d32 140\r
0c18794e 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
b3548d32 176 @param[in] UserIndex The index of user in the user name list\r
0c18794e 177 to be deleted.\r
178\r
179**/\r
180VOID\r
181DeleteUser (\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
0c5b25f0 188 EFI_USER_INFO_HANDLE UserInfo;\r
189 EFI_USER_INFO *Info;\r
190 UINTN InfoSize;\r
0c18794e 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
b3548d32 200\r
0c18794e 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
0c5b25f0 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
44a957c6 232 ASSERT (Info != NULL);\r
0c5b25f0 233 DeleteCredentialFromProviders ((UINT8 *)(Info + 1), Info->InfoSize - sizeof (EFI_USER_INFO), User);\r
234 FreePool (Info);\r
b3548d32 235\r
0c18794e 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
b3548d32 248 return ;\r
0c18794e 249 }\r
250\r
251Done:\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
267VOID\r
268SelectUserToDelete (\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
a0c56a82 335 &gUserProfileManagerGuid, // Formset GUID\r
0c18794e 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