/** @file | |
Internal Functions for RedfishLib. | |
Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> | |
(C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR> | |
Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include "RedfishMisc.h" | |
EDKII_REDFISH_CREDENTIAL_PROTOCOL *mCredentialProtocol = NULL; | |
/** | |
This function returns the string of Redfish service version. | |
@param[in] RedfishService Redfish service instance. | |
@param[out] ServiceVersionStr Redfish service string. | |
@return EFI_STATUS | |
**/ | |
EFI_STATUS | |
RedfishGetServiceVersion ( | |
IN REDFISH_SERVICE RedfishService, | |
OUT CHAR8 **ServiceVersionStr | |
) | |
{ | |
redfishService *Redfish; | |
CHAR8 **KeysArray; | |
UINTN KeysNum; | |
if ((RedfishService == NULL) || (ServiceVersionStr == NULL)) { | |
return EFI_INVALID_PARAMETER; | |
} | |
Redfish = (redfishService *)RedfishService; | |
if (Redfish->versions == NULL) { | |
return EFI_INVALID_PARAMETER; | |
} | |
KeysArray = JsonObjectGetKeys (Redfish->versions, &KeysNum); | |
if ((KeysNum == 0) || (KeysArray == NULL)) { | |
return EFI_NOT_FOUND; | |
} | |
*ServiceVersionStr = *KeysArray; | |
return EFI_SUCCESS; | |
} | |
/** | |
Creates a REDFISH_SERVICE which can be later used to access the Redfish resources. | |
This function will configure REST EX child according to parameters described in | |
Redfish network host interface in SMBIOS type 42 record. The service enumerator will also | |
handle the authentication flow automatically if HTTP basic auth or Redfish session | |
login is configured to use. | |
@param[in] RedfishConfigServiceInfo Redfish service information the EFI Redfish | |
feature driver communicates with. | |
@param[in] AuthMethod None, HTTP basic auth, or Redfish session login. | |
@param[in] UserId User Name used for authentication. | |
@param[in] Password Password used for authentication. | |
@return New created Redfish service, or NULL if error happens. | |
**/ | |
REDFISH_SERVICE | |
RedfishCreateLibredfishService ( | |
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo, | |
IN EDKII_REDFISH_AUTH_METHOD AuthMethod, | |
IN CHAR8 *UserId, | |
IN CHAR8 *Password | |
) | |
{ | |
UINTN Flags; | |
enumeratorAuthentication Auth; | |
redfishService *Redfish; | |
Redfish = NULL; | |
ZeroMem (&Auth, sizeof (Auth)); | |
if (AuthMethod == AuthMethodHttpBasic) { | |
Auth.authType = REDFISH_AUTH_BASIC; | |
} else if (AuthMethod == AuthMethodRedfishSession) { | |
Auth.authType = REDFISH_AUTH_SESSION; | |
} | |
Auth.authCodes.userPass.username = UserId; | |
Auth.authCodes.userPass.password = Password; | |
Flags = REDFISH_FLAG_SERVICE_NO_VERSION_DOC; | |
if (AuthMethod != AuthMethodNone) { | |
Redfish = createServiceEnumerator (RedfishConfigServiceInfo, NULL, &Auth, (unsigned int)Flags); | |
} else { | |
Redfish = createServiceEnumerator (RedfishConfigServiceInfo, NULL, NULL, (unsigned int)Flags); | |
} | |
// | |
// Zero the Password after use. | |
// | |
if (Password != NULL) { | |
ZeroMem (Password, AsciiStrLen (Password)); | |
} | |
return (REDFISH_SERVICE)Redfish; | |
} | |
/** | |
Retrieve platform's Redfish authentication information. | |
This functions returns the Redfish authentication method together with the user | |
Id and password. | |
For AuthMethodNone, UserId and Password will point to NULL which means authentication | |
is not required to access the Redfish service. | |
For AuthMethodHttpBasic, the UserId and Password could be used for | |
HTTP header authentication as defined by RFC7235. For AuthMethodRedfishSession, | |
the UserId and Password could be used for Redfish session login as defined by | |
Redfish API specification (DSP0266). | |
Callers are responsible for freeing the returned string storage pointed by UserId | |
and Password. | |
@param[out] AuthMethod Type of Redfish authentication method. | |
@param[out] UserId The pointer to store the returned UserId string. | |
@param[out] Password The pointer to store the returned Password string. | |
@retval EFI_SUCCESS Get the authentication information successfully. | |
@retval EFI_INVALID_PARAMETER AuthMethod or UserId or Password is NULL. | |
@retval EFI_UNSUPPORTED Unsupported authentication method is found. | |
**/ | |
EFI_STATUS | |
RedfishGetAuthInfo ( | |
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod, | |
OUT CHAR8 **UserId, | |
OUT CHAR8 **Password | |
) | |
{ | |
EFI_STATUS Status; | |
if ((AuthMethod == NULL) || (UserId == NULL) || (Password == NULL)) { | |
return EFI_INVALID_PARAMETER; | |
} | |
// | |
// Locate Redfish Credential Protocol. | |
// | |
if (mCredentialProtocol == NULL) { | |
Status = gBS->LocateProtocol (&gEdkIIRedfishCredentialProtocolGuid, NULL, (VOID **)&mCredentialProtocol); | |
if (EFI_ERROR (Status)) { | |
return EFI_UNSUPPORTED; | |
} | |
} | |
ASSERT (mCredentialProtocol != NULL); | |
Status = mCredentialProtocol->GetAuthInfo (mCredentialProtocol, AuthMethod, UserId, Password); | |
if (EFI_ERROR (Status)) { | |
DEBUG ((DEBUG_ERROR, "RedfishGetAuthInfo: failed to retrieve Redfish credential - %r\n", Status)); | |
return Status; | |
} | |
return Status; | |
} | |
/** | |
This function returns the string of Redfish service version. | |
@param[in] ServiceVersionStr The string of Redfish service version. | |
@param[in] Url The URL to build Redpath with ID. | |
Start with "/", for example "/Registries" | |
@param[in] Id ID string | |
@param[out] Redpath Pointer to retrieved Redpath, caller has to free | |
the memory allocated for this string. | |
@return EFI_STATUS | |
**/ | |
EFI_STATUS | |
RedfishBuildRedpathUseId ( | |
IN CHAR8 *ServiceVersionStr, | |
IN CHAR8 *Url, | |
IN CHAR8 *Id, | |
OUT CHAR8 **Redpath | |
) | |
{ | |
UINTN RedpathSize; | |
if ((Redpath == NULL) || (ServiceVersionStr == NULL) || (Url == NULL) || (Id == NULL)) { | |
return EFI_INVALID_PARAMETER; | |
} | |
RedpathSize = AsciiStrLen ("/") + | |
AsciiStrLen (ServiceVersionStr) + | |
AsciiStrLen (Url) + | |
AsciiStrLen ("[Id=]") + | |
AsciiStrLen (Id) + 1; | |
*Redpath = AllocatePool (RedpathSize); | |
if (*Redpath == NULL) { | |
return EFI_OUT_OF_RESOURCES; | |
} | |
AsciiSPrint (*Redpath, RedpathSize, "/%a%a[Id=%a]", ServiceVersionStr, Url, Id); | |
return EFI_SUCCESS; | |
} |