]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileDelete.c
Clean up the private GUID definition in module Level.
[mirror_edk2.git] / SecurityPkg / UserIdentification / UserProfileManagerDxe / UserProfileDelete.c
CommitLineData
0c18794e 1/** @file\r
2 The functions to delete a user profile.\r
3 \r
4Copyright (c) 2009 - 2010, 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
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
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
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
25EFI_STRING_ID \r
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
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
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
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
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
188\r
189 //\r
190 // Find specified user profile and delete it.\r
191 //\r
192 User = NULL;\r
193 Status = mUserManager->GetNext (mUserManager, &User);\r
194 if (EFI_ERROR (Status)) {\r
195 goto Done;\r
196 }\r
197 \r
198 while (UserIndex > 1) {\r
199 Status = mUserManager->GetNext (mUserManager, &User);\r
200 if (EFI_ERROR (Status)) {\r
201 goto Done;\r
202 }\r
203 UserIndex--;\r
204 }\r
205\r
206 if (UserIndex == 1) {\r
207 Status = mUserManager->Delete (mUserManager, User);\r
208 if (EFI_ERROR (Status)) {\r
209 goto Done;\r
210 }\r
211 CreatePopUp (\r
212 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
213 &Key,\r
214 L"Delete User Succeed!",\r
215 L"",\r
216 L"Please Press Any Key to Continue ...",\r
217 NULL\r
218 );\r
219 return ; \r
220 }\r
221\r
222Done:\r
223 CreatePopUp (\r
224 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
225 &Key,\r
226 L"Delete User Failed!",\r
227 L"",\r
228 L"Please Press Any Key to Continue ...",\r
229 NULL\r
230 );\r
231}\r
232\r
233\r
234/**\r
235 Display user select form, cab select a user to delete.\r
236\r
237**/\r
238VOID\r
239SelectUserToDelete (\r
240 VOID\r
241 )\r
242{\r
243 EFI_STATUS Status;\r
244 UINT8 Index;\r
245 EFI_USER_PROFILE_HANDLE User;\r
246 EFI_USER_PROFILE_HANDLE CurrentUser;\r
247 VOID *StartOpCodeHandle;\r
248 VOID *EndOpCodeHandle;\r
249 EFI_IFR_GUID_LABEL *StartLabel;\r
250 EFI_IFR_GUID_LABEL *EndLabel;\r
251\r
252 //\r
253 // Initialize the container for dynamic opcodes.\r
254 //\r
255 StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
256 ASSERT (StartOpCodeHandle != NULL);\r
257\r
258 EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
259 ASSERT (EndOpCodeHandle != NULL);\r
260\r
261 //\r
262 // Create Hii Extend Label OpCode.\r
263 //\r
264 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
265 StartOpCodeHandle,\r
266 &gEfiIfrTianoGuid,\r
267 NULL,\r
268 sizeof (EFI_IFR_GUID_LABEL)\r
269 );\r
270 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
271 StartLabel->Number = LABEL_USER_DEL_FUNC;\r
272\r
273 EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
274 EndOpCodeHandle,\r
275 &gEfiIfrTianoGuid,\r
276 NULL,\r
277 sizeof (EFI_IFR_GUID_LABEL)\r
278 );\r
279 EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
280 EndLabel->Number = LABEL_END;\r
281\r
282 //\r
283 // Add each user can be deleted.\r
284 //\r
285 User = NULL;\r
286 Index = 1;\r
287 mUserManager->Current (mUserManager, &CurrentUser);\r
288 while (TRUE) {\r
289 Status = mUserManager->GetNext (mUserManager, &User);\r
290 if (EFI_ERROR (Status)) {\r
291 break;\r
292 }\r
293\r
294 if (User != CurrentUser) {\r
295 AddUserToForm (\r
296 User,\r
297 (UINT16)(KEY_DEL_USER | KEY_SELECT_USER | Index),\r
298 StartOpCodeHandle\r
299 );\r
300 }\r
301 Index++;\r
302 }\r
303\r
304 HiiUpdateForm (\r
305 mCallbackInfo->HiiHandle, // HII handle\r
306 &mUserProfileManagerGuid, // Formset GUID\r
307 FORMID_DEL_USER, // Form ID\r
308 StartOpCodeHandle, // Label for where to insert opcodes\r
309 EndOpCodeHandle // Replace data\r
310 );\r
311\r
312 HiiFreeOpCodeHandle (StartOpCodeHandle);\r
313 HiiFreeOpCodeHandle (EndOpCodeHandle);\r
314}\r