]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileAdd.c
ArmPkg/ArmMmuLib ARM: fix thinko in second level page table handling
[mirror_edk2.git] / SecurityPkg / UserIdentification / UserProfileManagerDxe / UserProfileAdd.c
CommitLineData
0c18794e 1/** @file\r
2 The functions to add 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/**\r
19 Get user name from the popup windows.\r
b3548d32 20\r
0c18794e 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
b3548d32 24\r
0c18794e 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
b3548d32 103\r
0c18794e 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
b3548d32 115 @retval EFI_SUCCESS Change the user's username successfully with\r
0c18794e 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
b3548d32 130\r
0c18794e 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
b3548d32
LG
135 NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |\r
136 EFI_USER_INFO_PUBLIC |\r
0c18794e 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
b3548d32 184\r
0c18794e 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
b3548d32
LG
192 NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |\r
193 EFI_USER_INFO_PUBLIC |\r
0c18794e 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
b3548d32 218 @param[in] User Handle of a user profile.\r
0c18794e 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
b3548d32 229\r
0c18794e 230 NewUserInfo = AllocateZeroPool (\r
b3548d32 231 sizeof (EFI_USER_INFO) +\r
0c18794e 232 sizeof (EFI_USER_INFO_IDENTITY_POLICY)\r
233 );\r
234 ASSERT (NewUserInfo != NULL);\r
b3548d32 235\r
0c18794e 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
b3548d32
LG
241 NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |\r
242 EFI_USER_INFO_PUBLIC |\r
0c18794e 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
b3548d32 260 @param[in] User Handle of a user profile.\r
0c18794e 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
b3548d32 271\r
0c18794e 272 NewUserInfo = AllocateZeroPool (\r
b3548d32 273 sizeof (EFI_USER_INFO) +\r
0c18794e 274 sizeof (EFI_USER_INFO_ACCESS_CONTROL)\r
275 );\r
276 ASSERT (NewUserInfo != NULL);\r
b3548d32 277\r
0c18794e 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
b3548d32
LG
283 NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |\r
284 EFI_USER_INFO_PUBLIC |\r
0c18794e 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
b3548d32 318\r
0c18794e 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
b3548d32 327 PromptStr = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE));\r
0c18794e 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
b3548d32 340 PromptStr = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE));\r
0c18794e 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
b3548d32 348 PromptStr = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE));\r
0c18794e 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
b3548d32 357 PromptStr = GetStringById (STRING_TOKEN (STR_STROKE_KEY_CONTINUE));\r
0c18794e 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