/** @file
  The header file for user profile manager driver.
    
Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials 
are licensed and made available under the terms and conditions of the BSD License 
which accompanies this distribution.  The full text of the license may be found at 
http://opensource.org/licenses/bsd-license.php

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#ifndef __EFI_USER_PROFILE_MANAGER_H__
#define __EFI_USER_PROFILE_MANAGER_H__

#include <Uefi.h>

#include <Guid/GlobalVariable.h>
#include <Guid/MdeModuleHii.h>

#include <Protocol/HiiConfigAccess.h>
#include <Protocol/UserCredential2.h>
#include <Protocol/UserManager.h>

#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DevicePathLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiLib.h>
#include <Library/PrintLib.h>
#include <Library/HiiLib.h>

#include "UserProfileManagerData.h"

#define  USER_NAME_LENGTH          17

//
// Credential Provider Information.
//
typedef struct {
  UINTN                         Count;
  EFI_USER_CREDENTIAL2_PROTOCOL *Provider[1];
} CREDENTIAL_PROVIDER_INFO;

//
// User profile information structure.
//
typedef struct {
  UINT64    UsageCount;
  EFI_TIME  CreateDate;
  EFI_TIME  UsageDate;
  UINTN     AccessPolicyLen;
  UINTN     IdentityPolicyLen;
  UINTN     NewIdentityPolicyLen;    
  UINT8     *AccessPolicy;
  UINT8     *IdentityPolicy;
  UINT8     *NewIdentityPolicy;
  CHAR16    UserName[USER_NAME_LENGTH];
  BOOLEAN   CreateDateExist;
  BOOLEAN   UsageDateExist;
  BOOLEAN   AccessPolicyModified;
  BOOLEAN   IdentityPolicyModified;
  BOOLEAN   NewIdentityPolicyModified;
} USER_INFO;

//
// User access information structure.
//
typedef struct {
  UINTN  LoadPermitLen;
  UINTN  LoadForbidLen;
  UINTN  ConnectPermitLen;
  UINTN  ConnectForbidLen;
  UINT8  *LoadPermit;
  UINT8  *LoadForbid;
  UINT8  *ConnectPermit;
  UINT8  *ConnectForbid;
  UINT32 AccessBootOrder;
  UINT8  AccessRight;
  UINT8  AccessSetup;
} USER_INFO_ACCESS;

#define USER_PROFILE_MANAGER_SIGNATURE  SIGNATURE_32 ('U', 'P', 'M', 'S')

typedef struct {
  UINTN                           Signature;
  EFI_HANDLE                      DriverHandle;
  EFI_HII_HANDLE                  HiiHandle;
  EFI_HII_CONFIG_ACCESS_PROTOCOL  ConfigAccess;
} USER_PROFILE_MANAGER_CALLBACK_INFO;

//
// HII specific Vendor Device Path definition.
//
typedef struct {
  VENDOR_DEVICE_PATH        VendorDevicePath;
  EFI_DEVICE_PATH_PROTOCOL  End;
} HII_VENDOR_DEVICE_PATH;

//
// This is the generated IFR binary data for each formset defined in VFR.
//
extern UINT8                               UserProfileManagerVfrBin[];

//
// This is the generated String package data for .UNI file.
//
extern UINT8                               UserProfileManagerStrings[];

//
// The user manager protocol, used in several function.
//
extern EFI_USER_MANAGER_PROTOCOL           *mUserManager;

//
// The credential providers database in system.
//
extern CREDENTIAL_PROVIDER_INFO            *mProviderInfo;

//
// The variables used to update identity policy.
//
extern UINT8                               mProviderChoice;
extern UINT8                               mConncetLogical;

//
// The variables used to update access policy.
//
extern USER_INFO_ACCESS                    mAccessInfo;

//
// The user information used to record all data in UI.
//
extern USER_INFO                           mUserInfo;

extern USER_PROFILE_MANAGER_CALLBACK_INFO  *mCallbackInfo;

extern EFI_USER_PROFILE_HANDLE             mModifyUser;

/**
  Get string by string id from HII Interface.


  @param[in] Id      String ID to get the string from.

  @retval  CHAR16 *  String from ID.
  @retval  NULL      If error occurs.

**/
CHAR16 *
GetStringById (
  IN EFI_STRING_ID             Id
  );

/**
  Add a new user profile into the user profile database.

**/
VOID
CallAddUser (
  VOID
  );

/**
  Display user select form; can select a user to modify.

**/
VOID
SelectUserToModify  (
  VOID
  );

/**
  Display user select form, cab select a user to delete.

**/
VOID
SelectUserToDelete (
  VOID
  );

/**
  Delete the user specified by UserIndex in user profile database.

  @param[in]  UserIndex    The index of user in the user name list to be deleted.

**/
VOID
DeleteUser (
  IN UINT8                                      UserIndex
  );

/**
  Add a username item in form.

  @param[in]  User             Points to the user profile whose username is added. 
  @param[in]  Index            The index of the user in the user name list.
  @param[in]  OpCodeHandle     Points to container for dynamic created opcodes.

**/
VOID
AddUserToForm (
  IN  EFI_USER_PROFILE_HANDLE                   User,
  IN  UINT16                                    Index,
  IN  VOID                                      *OpCodeHandle
  );

/**
  Display modify user information form

  In this form, username, create Date, usage date, usage count, identity policy,
  and access policy are displayed.

  @param[in] UserIndex       The index of the user in display list to modify.
  
**/
VOID
ModifyUserInfo (
  IN UINT8                                      UserIndex
  );

/**
  Get the username from user input and update username string in Hii 
  database with it.

**/
VOID
ModifyUserName (
  VOID
  );

/**
  Display the form of modifying user identity policy.

**/
VOID
ModifyIdentityPolicy (
  VOID
  );

/**
  Update the mUserInfo.NewIdentityPolicy and UI when 'add option' is pressed.

**/
VOID
AddIdentityPolicyItem (
  VOID
  );

/**
  Save the identity policy and update UI with it.
  
  This function will verify the new identity policy, in current implementation, 
  the identity policy can be:  T, P & P & P & ..., P | P | P | ...
  Here, "T" means "True", "P" means "Credential Provider", "&" means "and", "|" means "or".
  Other identity policies are not supported.  

**/
VOID
SaveIdentityPolicy (
  VOID
  );

/**
  Display modify user access policy form

  In this form, access right, access setu,p and access boot order are dynamically
  added. Load devicepath and connect devicepath are displayed too.
  
**/
VOID
ModidyAccessPolicy (
  VOID
  );

/**
  Collect all the access policy data to mUserInfo.AccessPolicy, 
  and save it to user profile.

**/
VOID
SaveAccessPolicy (
  VOID
  );

/**
  Get current user's access rights.

  @param[out]  AccessRight   Points to the buffer used for user's access rights.

  @retval EFI_SUCCESS        Get current user access rights successfully.
  @retval others             Fail to get current user access rights.

**/
EFI_STATUS
GetAccessRight (
  OUT  UINT32                                    *AccessRight
  );

/**
  Display the permit load device path in the loadable device path list.

**/
VOID
DisplayLoadPermit(
  VOID
  );

/**
  Display the forbid load device path list (mAccessInfo.LoadForbid).

**/
VOID
DisplayLoadForbid (
  VOID
  );

/**
  Display the permit connect device path.

**/
VOID
DisplayConnectPermit (
  VOID
  );

/**
  Display the forbid connect device path list.

**/
VOID
DisplayConnectForbid (
  VOID
  );

/**
  Delete the specified device path by DriverIndex from the forbid device path 
  list (mAccessInfo.LoadForbid).

  @param[in]  DriverIndex   The index of driver in a forbidden device path list.
  
**/
VOID
DeleteFromForbidLoad (
  IN  UINT16                                    DriverIndex
  );
  
/**
  Add the specified device path by DriverIndex to the forbid device path 
  list (mAccessInfo.LoadForbid).

  @param[in]  DriverIndex   The index of driver saved in driver options.
  
**/
VOID
AddToForbidLoad (
  IN  UINT16                                    DriverIndex
  );

/**
  Get user name from the popup windows.
  
  @param[in, out]  UserNameLen   On entry, point to the buffer lengh of UserName.
                                 On exit, point to the input user name length.
  @param[out]      UserName      The buffer to hold the input user name.
 
  @retval EFI_ABORTED            It is given up by pressing 'ESC' key.
  @retval EFI_NOT_READY          Not a valid input at all.
  @retval EFI_SUCCESS            Get a user name successfully.

**/
EFI_STATUS
GetUserNameInput (
  IN OUT  UINTN         *UserNameLen,
     OUT  CHAR16        *UserName
  );

/**
  Find the specified info in User profile by the InfoType.

  @param[in]  User         Handle of the user whose information will be searched.
  @param[in]  InfoType     The user information type to find.
  @param[out] UserInfo     Points to user information handle found.
  
  @retval EFI_SUCCESS      Find the user information successfully.
  @retval Others           Fail to find the user information.

**/
EFI_STATUS
FindInfoByType (
  IN  EFI_USER_PROFILE_HANDLE                   User,
  IN  UINT8                                     InfoType,
  OUT EFI_USER_INFO_HANDLE                      *UserInfo
  );

/**
  Convert the identity policy to a unicode string and update the Hii database
  IpStringId string with it.

  @param[in]  Ip         Points to identity policy.
  @param[in]  IpLen      The identity policy length.
  @param[in]  IpStringId String ID in the HII database to be replaced.

**/
VOID
ResolveIdentityPolicy (
  IN  UINT8                                     *Ip,
  IN  UINTN                                     IpLen,
  IN  EFI_STRING_ID                             IpStringId
  );

/**
  Expand access policy memory size.

  @param[in] ValidLen       The valid access policy length.
  @param[in] ExpandLen      The length that is needed to expand.
    
**/
VOID
ExpandMemory (
  IN      UINTN                                 ValidLen,
  IN      UINTN                                 ExpandLen
  );

/**
  Delete User's credental from all the providers that exist in User's identity policy.
  
  @param[in]  IdentityPolicy     Point to User's identity policy.
  @param[in]  IdentityPolicyLen  The length of the identity policy.
  @param[in]  User               Points to user profile.

**/
VOID
DeleteCredentialFromProviders (
  IN     UINT8                                *IdentityPolicy,
  IN     UINTN                                 IdentityPolicyLen,
  IN     EFI_USER_PROFILE_HANDLE               User 
  );
  
#endif
