ArmPkg/ArmMmuLib ARM: fix thinko in second level page table handling
[mirror_edk2.git] / SecurityPkg / UserIdentification / UserProfileManagerDxe / UserProfileAdd.c
1 /** @file\r
2   The functions to add a user profile.\r
3 \r
4 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
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 /**\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
30 EFI_STATUS\r
31 GetUserNameInput (\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
119 EFI_STATUS\r
120 SetUserName (\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
175 VOID\r
176 SetCreateDate (\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
221 VOID\r
222 SetIdentityPolicy (\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_PUBLIC |\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
263 VOID\r
264 SetAccessPolicy (\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
303 VOID\r
304 CallAddUser (\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
360 Done:\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