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