]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileAdd.c
Update UID drivers to align with latest UEFI spec 2.3.1 errata A.
[mirror_edk2.git] / SecurityPkg / UserIdentification / UserProfileManagerDxe / UserProfileAdd.c
CommitLineData
0c18794e 1/** @file\r
2 The functions to add 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/**\r
19 Get user name from the popup windows.\r
20 \r
21 @param[in, out] UserNameLen On entry, point to UserName buffer lengh, in bytes.\r
22 On exit, point to input user name length, in bytes.\r
23 @param[out] UserName The buffer to hold the input user name.\r
24 \r
25 @retval EFI_ABORTED It is given up by pressing 'ESC' key.\r
26 @retval EFI_NOT_READY Not a valid input at all.\r
27 @retval EFI_SUCCESS Get a user name successfully.\r
28\r
29**/\r
30EFI_STATUS\r
31GetUserNameInput (\r
32 IN OUT UINTN *UserNameLen,\r
33 OUT CHAR16 *UserName\r
34 )\r
35{\r
36 EFI_INPUT_KEY Key;\r
37 UINTN NameLen;\r
38 CHAR16 Name[USER_NAME_LENGTH];\r
39\r
40 NameLen = 0;\r
41 while (TRUE) {\r
42 Name[NameLen] = L'_';\r
43 Name[NameLen + 1] = L'\0';\r
44 CreatePopUp (\r
45 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
46 &Key,\r
47 L"Input User Name",\r
48 L"---------------------",\r
49 Name,\r
50 NULL\r
51 );\r
52 //\r
53 // Check key.\r
54 //\r
55 if (Key.ScanCode == SCAN_NULL) {\r
56 if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
57 //\r
58 // Add the null terminator.\r
59 //\r
60 Name[NameLen] = 0;\r
61 NameLen++;\r
62 break;\r
63 } else if ((Key.UnicodeChar == CHAR_NULL) ||\r
64 (Key.UnicodeChar == CHAR_TAB) ||\r
65 (Key.UnicodeChar == CHAR_LINEFEED)\r
66 ) {\r
67 continue;\r
68 } else {\r
69 if (Key.UnicodeChar == CHAR_BACKSPACE) {\r
70 if (NameLen > 0) {\r
71 NameLen--;\r
72 }\r
73 } else {\r
74 Name[NameLen] = Key.UnicodeChar;\r
75 NameLen++;\r
76 if (NameLen + 1 == USER_NAME_LENGTH) {\r
77 //\r
78 // Add the null terminator.\r
79 //\r
80 Name[NameLen] = 0;\r
81 NameLen++;\r
82 break;\r
83 }\r
84 }\r
85 }\r
86 }\r
87\r
88 if (Key.ScanCode == SCAN_ESC) {\r
89 return EFI_ABORTED;\r
90 }\r
91 }\r
92\r
93 if (NameLen <= 1) {\r
94 return EFI_NOT_READY;\r
95 }\r
96\r
97 if (*UserNameLen < NameLen * sizeof (CHAR16)) {\r
98 return EFI_NOT_READY;\r
99 }\r
100\r
101 *UserNameLen = NameLen * sizeof (CHAR16);\r
102 CopyMem (UserName, Name, *UserNameLen);\r
103 \r
104 return EFI_SUCCESS;\r
105}\r
106\r
107/**\r
108 Set a user's username.\r
109\r
110 @param[in] User Handle of a user profile .\r
111 @param[in] UserNameLen The lengh of UserName.\r
112 @param[in] UserName Point to the buffer of user name.\r
113\r
114 @retval EFI_NOT_READY The usernme in mAddUserName had been used.\r
115 @retval EFI_SUCCESS Change the user's username successfully with \r
116 username in mAddUserName.\r
117\r
118**/\r
119EFI_STATUS\r
120SetUserName (\r
121 IN EFI_USER_PROFILE_HANDLE User,\r
122 IN UINTN UserNameLen,\r
123 IN CHAR16 *UserName\r
124 )\r
125{\r
126 EFI_STATUS Status;\r
127 EFI_USER_INFO_HANDLE UserInfo;\r
128 EFI_USER_PROFILE_HANDLE TempUser;\r
129 EFI_USER_INFO *NewUserInfo;\r
130 \r
131 NewUserInfo = AllocateZeroPool (sizeof (EFI_USER_INFO) + UserNameLen);\r
132 ASSERT (NewUserInfo != NULL);\r
133\r
134 NewUserInfo->InfoType = EFI_USER_INFO_NAME_RECORD;\r
135 NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV | \r
136 EFI_USER_INFO_PUBLIC | \r
137 EFI_USER_INFO_EXCLUSIVE;\r
138 NewUserInfo->InfoSize = (UINT32) (sizeof (EFI_USER_INFO) + UserNameLen);\r
139 CopyMem ((UINT8 *) (NewUserInfo + 1), UserName, UserNameLen);\r
140 TempUser = NULL;\r
141 Status = mUserManager->Find (\r
142 mUserManager,\r
143 &TempUser,\r
144 NULL,\r
145 NewUserInfo,\r
146 NewUserInfo->InfoSize\r
147 );\r
148 if (!EFI_ERROR (Status)) {\r
149 //\r
150 // The user name had been used, return error.\r
151 //\r
152 FreePool (NewUserInfo);\r
153 return EFI_NOT_READY;\r
154 }\r
155\r
156 UserInfo = NULL;\r
157 mUserManager->SetInfo (\r
158 mUserManager,\r
159 User,\r
160 &UserInfo,\r
161 NewUserInfo,\r
162 NewUserInfo->InfoSize\r
163 );\r
164 FreePool (NewUserInfo);\r
165 return EFI_SUCCESS;\r
166}\r
167\r
168\r
169/**\r
170 Set create date of the specified user.\r
171\r
172 @param[in] User Handle of a user profile.\r
173\r
174**/\r
175VOID\r
176SetCreateDate (\r
177 IN EFI_USER_PROFILE_HANDLE User\r
178 )\r
179{\r
180 EFI_STATUS Status;\r
181 EFI_USER_INFO_HANDLE UserInfo;\r
182 EFI_USER_INFO_CREATE_DATE Date;\r
183 EFI_USER_INFO *NewUserInfo;\r
184 \r
185 NewUserInfo = AllocateZeroPool (\r
186 sizeof (EFI_USER_INFO) +\r
187 sizeof (EFI_USER_INFO_CREATE_DATE)\r
188 );\r
189 ASSERT (NewUserInfo != NULL);\r
190\r
191 NewUserInfo->InfoType = EFI_USER_INFO_CREATE_DATE_RECORD;\r
192 NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV | \r
193 EFI_USER_INFO_PUBLIC | \r
194 EFI_USER_INFO_EXCLUSIVE;\r
195 NewUserInfo->InfoSize = sizeof (EFI_USER_INFO) + sizeof (EFI_USER_INFO_CREATE_DATE);\r
196 Status = gRT->GetTime (&Date, NULL);\r
197 if (EFI_ERROR (Status)) {\r
198 FreePool (NewUserInfo);\r
199 return ;\r
200 }\r
201\r
202 CopyMem ((UINT8 *) (NewUserInfo + 1), &Date, sizeof (EFI_USER_INFO_CREATE_DATE));\r
203 UserInfo = NULL;\r
204 mUserManager->SetInfo (\r
205 mUserManager,\r
206 User,\r
207 &UserInfo,\r
208 NewUserInfo,\r
209 NewUserInfo->InfoSize\r
210 );\r
211 FreePool (NewUserInfo);\r
212}\r
213\r
214\r
215/**\r
216 Set the default identity policy of the specified user.\r
217\r
218 @param[in] User Handle of a user profile. \r
219\r
220**/\r
221VOID\r
222SetIdentityPolicy (\r
223 IN EFI_USER_PROFILE_HANDLE User\r
224 )\r
225{\r
226 EFI_USER_INFO_IDENTITY_POLICY *Policy;\r
227 EFI_USER_INFO_HANDLE UserInfo;\r
228 EFI_USER_INFO *NewUserInfo;\r
229 \r
230 NewUserInfo = AllocateZeroPool (\r
231 sizeof (EFI_USER_INFO) + \r
232 sizeof (EFI_USER_INFO_IDENTITY_POLICY)\r
233 );\r
234 ASSERT (NewUserInfo != NULL);\r
235 \r
236 Policy = (EFI_USER_INFO_IDENTITY_POLICY *) (NewUserInfo + 1);\r
237 Policy->Type = EFI_USER_INFO_IDENTITY_TRUE;\r
238 Policy->Length = sizeof (EFI_USER_INFO_IDENTITY_POLICY);\r
239\r
240 NewUserInfo->InfoType = EFI_USER_INFO_IDENTITY_POLICY_RECORD;\r
241 NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV | \r
242 EFI_USER_INFO_PRIVATE | \r
243 EFI_USER_INFO_EXCLUSIVE;\r
244 NewUserInfo->InfoSize = sizeof (EFI_USER_INFO) + Policy->Length;\r
245 UserInfo = NULL;\r
246 mUserManager->SetInfo (\r
247 mUserManager,\r
248 User,\r
249 &UserInfo,\r
250 NewUserInfo,\r
251 NewUserInfo->InfoSize\r
252 );\r
253 FreePool (NewUserInfo);\r
254}\r
255\r
256\r
257/**\r
258 Set the default access policy of the specified user.\r
259\r
260 @param[in] User Handle of a user profile. \r
261\r
262**/\r
263VOID\r
264SetAccessPolicy (\r
265 IN EFI_USER_PROFILE_HANDLE User\r
266 )\r
267{\r
268 EFI_USER_INFO_ACCESS_CONTROL *Control;\r
269 EFI_USER_INFO_HANDLE UserInfo;\r
270 EFI_USER_INFO *NewUserInfo;\r
271 \r
272 NewUserInfo = AllocateZeroPool (\r
273 sizeof (EFI_USER_INFO) + \r
274 sizeof (EFI_USER_INFO_ACCESS_CONTROL)\r
275 );\r
276 ASSERT (NewUserInfo != NULL);\r
277 \r
278 Control = (EFI_USER_INFO_ACCESS_CONTROL *) (NewUserInfo + 1);\r
279 Control->Type = EFI_USER_INFO_ACCESS_ENROLL_SELF;\r
280 Control->Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL);\r
281\r
282 NewUserInfo->InfoType = EFI_USER_INFO_ACCESS_POLICY_RECORD;\r
283 NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV | \r
284 EFI_USER_INFO_PUBLIC | \r
285 EFI_USER_INFO_EXCLUSIVE;\r
286 NewUserInfo->InfoSize = sizeof (EFI_USER_INFO) + Control->Size;\r
287 UserInfo = NULL;\r
288 mUserManager->SetInfo (\r
289 mUserManager,\r
290 User,\r
291 &UserInfo,\r
292 NewUserInfo,\r
293 NewUserInfo->InfoSize\r
294 );\r
295 FreePool (NewUserInfo);\r
296}\r
297\r
298\r
299/**\r
300 Add a new user profile into the user profile database.\r
301\r
302**/\r
303VOID\r
304CallAddUser (\r
305 VOID\r
306 )\r
307{\r
308 EFI_STATUS Status;\r
309 EFI_INPUT_KEY Key;\r
310 EFI_USER_PROFILE_HANDLE User;\r
311 UINTN UserNameLen;\r
312 CHAR16 UserName[USER_NAME_LENGTH];\r
313 CHAR16 *QuestionStr;\r
314 CHAR16 *PromptStr;\r
315\r
316 QuestionStr = NULL;\r
317 PromptStr = NULL;\r
318 \r
319 //\r
320 // Get user name to add.\r
321 //\r
322 UserNameLen = sizeof (UserName);\r
323 Status = GetUserNameInput (&UserNameLen, UserName);\r
324 if (EFI_ERROR (Status)) {\r
325 if (Status != EFI_ABORTED) {\r
326 QuestionStr = GetStringById (STRING_TOKEN (STR_GET_USERNAME_FAILED));\r
327 PromptStr = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE)); \r
328 goto Done;\r
329 }\r
330 return ;\r
331 }\r
332\r
333 //\r
334 // Create a new user profile.\r
335 //\r
336 User = NULL;\r
337 Status = mUserManager->Create (mUserManager, &User);\r
338 if (EFI_ERROR (Status)) {\r
339 QuestionStr = GetStringById (STRING_TOKEN (STR_CREATE_PROFILE_FAILED));\r
340 PromptStr = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE)); \r
341 } else {\r
342 //\r
343 // Add default user information.\r
344 //\r
345 Status = SetUserName (User, UserNameLen, UserName);\r
346 if (EFI_ERROR (Status)) {\r
347 QuestionStr = GetStringById (STRING_TOKEN (STR_USER_ALREADY_EXISTED));\r
348 PromptStr = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE)); \r
349 goto Done;\r
350 }\r
351\r
352 SetCreateDate (User);\r
353 SetIdentityPolicy (User);\r
354 SetAccessPolicy (User);\r
355\r
356 QuestionStr = GetStringById (STRING_TOKEN (STR_CREATE_PROFILE_SUCCESS));\r
357 PromptStr = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE)); \r
358 }\r
359\r
360Done:\r
361 CreatePopUp (\r
362 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
363 &Key,\r
364 QuestionStr,\r
365 L"",\r
366 PromptStr,\r
367 NULL\r
368 );\r
369 FreePool (QuestionStr);\r
370 FreePool (PromptStr);\r
371}\r
372\r