]>
Commit | Line | Data |
---|---|---|
0c18794e | 1 | /** @file\r |
2 | The functions to delete a user profile.\r | |
3 | \r | |
a0c56a82 | 4 | Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r |
0c18794e | 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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 |