1 /** @file
2   The header file for User identify Manager driver.
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 #ifndef _USER_IDENTIFY_MANAGER_H_
16 #define _USER_IDENTIFY_MANAGER_H_
17 
18 #include <Uefi.h>
19 
20 #include <Guid/GlobalVariable.h>
21 #include <Guid/MdeModuleHii.h>
22 
23 #include <Protocol/FormBrowser2.h>
24 #include <Protocol/HiiDatabase.h>
25 #include <Protocol/HiiConfigAccess.h>
26 #include <Protocol/HiiString.h>
27 #include <Protocol/HiiConfigRouting.h>
28 #include <Protocol/UserCredential2.h>
29 #include <Protocol/UserManager.h>
30 #include <Protocol/DeferredImageLoad.h>
31 #include <Protocol/SimpleTextOut.h>
32 #include <Protocol/SimpleTextIn.h>
33 #include <Protocol/SimpleTextInEx.h>
34 
35 #include <Library/UefiRuntimeServicesTableLib.h>
36 #include <Library/UefiBootServicesTableLib.h>
37 #include <Library/MemoryAllocationLib.h>
38 #include <Library/BaseMemoryLib.h>
39 #include <Library/DevicePathLib.h>
40 #include <Library/DebugLib.h>
41 #include <Library/UefiLib.h>
42 #include <Library/PrintLib.h>
43 #include <Library/HiiLib.h>
44 
45 #include "UserIdentifyManagerData.h"
46 
47 //
48 // This is the generated IFR binary data for each formset defined in VFR.
49 // This data array is ready to be used as input of HiiAddPackages() to
50 // create a packagelist.
51 //
52 extern UINT8                UserIdentifyManagerVfrBin[];
53 
54 //
55 // This is the generated String package data for all .UNI files.
56 // This data array is ready to be used as input of HiiAddPackages() to
57 // create a packagelist.
58 //
59 extern UINT8                UserIdentifyManagerStrings[];
60 
61 #define   USER_NUMBER_INC           32
62 #define   DEFAULT_PROFILE_SIZE      512
63 #define   INFO_PAYLOAD_SIZE         64
64 
65 //
66 // Credential Provider Information.
67 //
68 typedef struct {
69   UINTN                         Count;
70   EFI_USER_CREDENTIAL2_PROTOCOL *Provider[1];
71 } CREDENTIAL_PROVIDER_INFO;
72 
73 //
74 // Internal user profile entry.
75 //
76 typedef struct {
77   UINTN   MaxProfileSize;
78   UINTN   UserProfileSize;
79   CHAR16  UserVarName[9];
80   UINT8   *ProfileInfo;
81 } USER_PROFILE_ENTRY;
82 
83 //
84 // Internal user profile database.
85 //
86 typedef struct {
87   UINTN                   UserProfileNum;
88   UINTN                   MaxProfileNum;
89   EFI_USER_PROFILE_HANDLE UserProfile[1];
90 } USER_PROFILE_DB;
91 
92 #define USER_MANAGER_SIGNATURE  SIGNATURE_32 ('U', 'I', 'M', 'S')
93 
94 typedef struct {
95   UINTN                           Signature;
96   EFI_HANDLE                      DriverHandle;
97   EFI_HII_HANDLE                  HiiHandle;
98 
99   //
100   // Consumed protocol.
101   //
102   EFI_HII_DATABASE_PROTOCOL       *HiiDatabase;
103   EFI_HII_STRING_PROTOCOL         *HiiString;
104   EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
105   EFI_FORM_BROWSER2_PROTOCOL      *FormBrowser2;
106 
107   //
108   // Produced protocol.
109   //
110   EFI_HII_CONFIG_ACCESS_PROTOCOL  ConfigAccess;
111 } USER_MANAGER_CALLBACK_INFO;
112 
113 ///
114 /// HII specific Vendor Device Path definition.
115 ///
116 typedef struct {
117   VENDOR_DEVICE_PATH        VendorDevicePath;
118   EFI_DEVICE_PATH_PROTOCOL  End;
119 } HII_VENDOR_DEVICE_PATH;
120 
121 /**
122   Register an event notification function for the user profile changed.
123 
124   @param[in]  ImageHandle     Image handle this driver.
125 
126 **/
127 VOID
128 LoadDeferredImageInit (
129   IN EFI_HANDLE        ImageHandle
130   );
131 
132 
133 /**
134   This function creates a new user profile with only
135   a new user identifier attached and returns its handle.
136   The user profile is non-volatile, but the handle User
137   can change across reboots.
138 
139   @param[in]   This               Protocol EFI_USER_MANAGER_PROTOCOL instance
140                                   pointer.
141   @param[out]  User               Handle of a new user profile.
142 
143   @retval EFI_SUCCESS             User profile was successfully created.
144   @retval EFI_ACCESS_DENIED       Current user does not have sufficient permissions
145                                   to create a user profile.
146   @retval EFI_UNSUPPORTED         Creation of new user profiles is not supported.
147   @retval EFI_INVALID_PARAMETER   User is NULL.
148 
149 **/
150 EFI_STATUS
151 EFIAPI
152 UserProfileCreate (
153   IN CONST  EFI_USER_MANAGER_PROTOCOL           *This,
154   OUT       EFI_USER_PROFILE_HANDLE             *User
155   );
156 
157 
158 /**
159   Delete an existing user profile.
160 
161   @param  This                    Protocol EFI_USER_MANAGER_PROTOCOL instance
162                                   pointer.
163   @param  User                    User profile handle.
164 
165   @retval EFI_SUCCESS             User profile was successfully deleted.
166   @retval EFI_ACCESS_DENIED       Current user does not have sufficient permissions
167                                   to delete a user profile or there is only one
168                                   user profile.
169   @retval EFI_UNSUPPORTED         Deletion of new user profiles is not supported.
170   @retval EFI_INVALID_PARAMETER   User does not refer to a valid user profile.
171 
172 **/
173 EFI_STATUS
174 EFIAPI
175 UserProfileDelete (
176   IN CONST  EFI_USER_MANAGER_PROTOCOL           *This,
177   IN        EFI_USER_PROFILE_HANDLE             User
178   );
179 
180 
181 /**
182   Get next user profile from the user profile database.
183 
184   @param[in]       This           Protocol EFI_USER_MANAGER_PROTOCOL instance
185                                   pointer.
186   @param[in, out]  User           User profile handle.
187 
188   @retval EFI_SUCCESS             Next enrolled user profile successfully returned.
189   @retval EFI_INVALID_PARAMETER   User is NULL.
190 
191 **/
192 EFI_STATUS
193 EFIAPI
194 UserProfileGetNext (
195   IN CONST  EFI_USER_MANAGER_PROTOCOL           *This,
196   IN OUT    EFI_USER_PROFILE_HANDLE             *User
197   );
198 
199 
200 /**
201   This function returns the current user profile handle.
202 
203   @param[in]  This                Protocol EFI_USER_MANAGER_PROTOCOL instance pointer.
204   @param[out]  CurrentUser        User profile handle.
205 
206   @retval EFI_SUCCESS             Current user profile handle returned successfully.
207   @retval EFI_INVALID_PARAMETER   CurrentUser is NULL.
208 
209 **/
210 EFI_STATUS
211 EFIAPI
212 UserProfileCurrent (
213   IN CONST  EFI_USER_MANAGER_PROTOCOL           *This,
214   OUT       EFI_USER_PROFILE_HANDLE             *CurrentUser
215   );
216 
217 
218 /**
219   Identify the user and, if authenticated, returns the user handle and changes
220   the current user profile.
221 
222   @param  This                    Protocol EFI_USER_MANAGER_PROTOCOL instance pointer.
223   @param  CurrentUser             User profile handle.
224 
225   @retval EFI_SUCCESS             User was successfully identified.
226   @retval EFI_INVALID_PARAMETER   User is NULL.
227   @retval EFI_ACCESS_DENIED       User was not successfully identified.
228 
229 **/
230 EFI_STATUS
231 EFIAPI
232 UserProfileIdentify (
233   IN CONST  EFI_USER_MANAGER_PROTOCOL           *This,
234   OUT       EFI_USER_PROFILE_HANDLE             *User
235   );
236 
237 
238 /**
239   Find a user using a user information record.
240 
241   This function searches all user profiles for the specified user information record.
242   The search starts with the user information record handle following UserInfo and
243   continues until either the information is found or there are no more user profiles.
244   A match occurs when the Info.InfoType field matches the user information record
245   type and the user information record data matches the portion of Info passed the
246   EFI_USER_INFO header.
247 
248   @param[in]      This     Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
249   @param[in, out] User     On entry, points to the previously returned user profile
250                            handle, or NULL to start searching with the first user profile.
251                            On return, points to the user profile handle, or NULL if not
252                            found.
253   @param[in, out] UserInfo On entry, points to the previously returned user information
254                            handle, or NULL to start searching with the first. On return,
255                            points to the user information handle of the user information
256                            record, or NULL if not found. Can be NULL, in which case only
257                            one user information record per user can be returned.
258   @param[in]      Info     Points to the buffer containing the user information to be
259                            compared to the user information record. If NULL, then only
260                            the user information record type is compared. If InfoSize is 0,
261                            then the user information record must be empty.
262 
263   @param[in]      InfoSize The size of Info, in bytes.
264 
265   @retval EFI_SUCCESS      User information was found. User points to the user profile handle,
266                            and UserInfo points to the user information handle.
267   @retval EFI_NOT_FOUND    User information was not found. User points to NULL and UserInfo
268                            points to NULL.
269 
270 **/
271 EFI_STATUS
272 EFIAPI
273 UserProfileFind (
274   IN     CONST EFI_USER_MANAGER_PROTOCOL        *This,
275   IN OUT EFI_USER_PROFILE_HANDLE                *User,
276   IN OUT EFI_USER_INFO_HANDLE                   *UserInfo OPTIONAL,
277   IN     CONST EFI_USER_INFO                    *Info,
278   IN     UINTN                                  InfoSize
279   );
280 
281 
282 /**
283   This function returns user information.
284 
285   @param  This                    Protocol EFI_USER_MANAGER_PROTOCOL instance
286                                   pointer.
287   @param  User                    Handle of the user whose profile will be
288                                   retrieved.
289   @param  UserInfo                Handle of the user information data record.
290   @param  Info                    On entry, points to a buffer of at least
291                                   *InfoSize bytes.  On exit, holds the user
292                                   information.
293   @param  InfoSize                On entry, points to the size of Info. On return,
294                                   points to the size of the user information.
295 
296   @retval EFI_SUCCESS             Information returned successfully.
297   @retval EFI_ACCESS_DENIED       The information about the specified user cannot
298                                   be accessed  by the current user.
299                                   EFI_BUFFER_TOO_SMALL- The number of bytes
300                                   specified by *InfoSize is too small to hold the
301                                   returned data.
302 
303 **/
304 EFI_STATUS
305 EFIAPI
306 UserProfileGetInfo (
307   IN CONST  EFI_USER_MANAGER_PROTOCOL           *This,
308   IN        EFI_USER_PROFILE_HANDLE             User,
309   IN        EFI_USER_INFO_HANDLE                UserInfo,
310   OUT       EFI_USER_INFO                       *Info,
311   IN OUT    UINTN                               *InfoSize
312   );
313 
314 
315 /**
316   This function changes user information.
317 
318   @param  This                    Protocol EFI_USER_MANAGER_PROTOCOL instance
319                                   pointer.
320   @param  User                    Handle of the user whose profile will be
321                                   retrieved.
322   @param  UserInfo                Handle of the user information data record.
323   @param  Info                    Points to the user information.
324   @param  InfoSize                The size of Info, in bytes.
325 
326   @retval EFI_SUCCESS             User profile information was successfully
327                                   changed/added.
328   @retval EFI_ACCESS_DENIED       The record is exclusive.
329   @retval EFI_SECURITY_VIOLATION  The current user does not have permission to
330                                   change  the specified user profile or user
331                                   information record.
332 
333 **/
334 EFI_STATUS
335 EFIAPI
336 UserProfileSetInfo (
337   IN CONST  EFI_USER_MANAGER_PROTOCOL           *This,
338   IN        EFI_USER_PROFILE_HANDLE             User,
339   IN OUT    EFI_USER_INFO_HANDLE                *UserInfo,
340   IN CONST  EFI_USER_INFO                       *Info,
341   IN        UINTN                               InfoSize
342   );
343 
344 
345 /**
346   This function allows the credential provider to notify the User Identity Manager
347   when user status has changed while deselected.
348 
349   @param  This                    Protocol EFI_USER_MANAGER_PROTOCOL instance
350                                   pointer.
351   @param  Changed                 Points to the instance of the
352                                   EFI_USER_CREDENTIAL_PROTOCOL  where the user has
353                                   changed.
354 
355   @retval EFI_SUCCESS             The User Identity Manager has handled the
356                                   notification.
357   @retval EFI_NOT_READY           The function was called while the specified
358                                   credential  provider was not selected.
359   @retval EFI_UNSUPPORTED         The User Identity Manager doesn't support
360                                   asynchronous  notifications.
361 
362 **/
363 EFI_STATUS
364 EFIAPI
365 UserProfileNotify (
366   IN CONST  EFI_USER_MANAGER_PROTOCOL           *This,
367   IN        EFI_HANDLE                          Changed
368   );
369 
370 
371 /**
372   Delete the user information attached to the user profile specified by the UserInfo.
373 
374   @param  This                    Protocol EFI_USER_MANAGER_PROTOCOL instance pointer.
375   @param  User                    Handle of the user whose profile will be retrieved.
376   @param  UserInfo                Handle of the user information data record.
377 
378   @retval EFI_SUCCESS             User information deleted successfully.
379   @retval EFI_ACCESS_DENIED       The current user does not have permission to
380                                   delete this user in-formation.
381   @retval EFI_NOT_FOUND           User information record UserInfo does not exist
382                                   in the user pro-file.
383 
384 **/
385 EFI_STATUS
386 EFIAPI
387 UserProfileDeleteInfo (
388   IN CONST  EFI_USER_MANAGER_PROTOCOL           *This,
389   IN        EFI_USER_PROFILE_HANDLE             User,
390   IN        EFI_USER_INFO_HANDLE                UserInfo
391   );
392 
393 
394 /**
395   This function returns the next user information record.
396 
397   @param  This                    Protocol EFI_USER_MANAGER_PROTOCOL instance pointer.
398   @param  User                    Handle of the user whose profile will be retrieved.
399   @param  UserInfo                Handle of the user information data record.
400 
401   @retval EFI_SUCCESS             User information returned.
402   @retval EFI_NOT_FOUND           No more user information found.
403 
404 **/
405 EFI_STATUS
406 EFIAPI
407 UserProfileGetNextInfo (
408   IN CONST  EFI_USER_MANAGER_PROTOCOL           *This,
409   IN        EFI_USER_PROFILE_HANDLE             User,
410   IN OUT    EFI_USER_INFO_HANDLE                *UserInfo
411   );
412 
413 #endif
414