From: "Saloni Kasbekar" <saloni.kasbekar@intel.com>
To: devel@edk2.groups.io
Cc: Saloni Kasbekar <saloni.kasbekar@intel.com>,
Maciej Rabeda <maciej.rabeda@linux.intel.com>,
Wu Jiaxin <jiaxin.wu@intel.com>, Siyuan Fu <siyuan.fu@intel.com>
Subject: [edk2-staging/HttpProxy PATCH v3 7/7] NetworkPkg/HttpBootDxe: Add Proxy URI input in setup menu
Date: Fri, 2 Dec 2022 11:12:26 -0800 [thread overview]
Message-ID: <14497137c1d8f0a847047080bd9f5e922f780ffa.1670008048.git.saloni.kasbekar@intel.com> (raw)
In-Reply-To: <cover.1670008048.git.saloni.kasbekar@intel.com>
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3951
Allows users to input the Proxy Server URI in the
HTTP setup menu
Cc: Maciej Rabeda <maciej.rabeda@linux.intel.com>
Cc: Wu Jiaxin <jiaxin.wu@intel.com>
Cc: Siyuan Fu <siyuan.fu@intel.com>
Signed-off-by: Saloni Kasbekar <saloni.kasbekar@intel.com>
---
NetworkPkg/HttpBootDxe/HttpBootConfig.c | 99 ++++++++++++++-----
.../HttpBootDxe/HttpBootConfigNVDataStruc.h | 4 +-
.../HttpBootDxe/HttpBootConfigStrings.uni | 2 +
NetworkPkg/HttpBootDxe/HttpBootConfigVfr.vfr | 9 ++
4 files changed, 88 insertions(+), 26 deletions(-)
diff --git a/NetworkPkg/HttpBootDxe/HttpBootConfig.c b/NetworkPkg/HttpBootDxe/HttpBootConfig.c
index 42d3fdc1fb..2cdd5043fe 100644
--- a/NetworkPkg/HttpBootDxe/HttpBootConfig.c
+++ b/NetworkPkg/HttpBootDxe/HttpBootConfig.c
@@ -18,6 +18,7 @@ CHAR16 mHttpBootConfigStorageName[] = L"HTTP_BOOT_CONFIG_IFR_NVDATA";
@param[in] UsingIpv6 Set to TRUE if creating boot option for IPv6.
@param[in] Description The description text of the boot option.
@param[in] Uri The URI string of the boot file.
+ @param[in] ProxyUri The Proxy URI string for the boot path.
@retval EFI_SUCCESS The boot option is created successfully.
@retval Others Failed to create new boot option.
@@ -28,48 +29,59 @@ HttpBootAddBootOption (
IN HTTP_BOOT_PRIVATE_DATA *Private,
IN BOOLEAN UsingIpv6,
IN CHAR16 *Description,
- IN CHAR16 *Uri
+ IN CHAR16 *Uri,
+ IN CHAR16 *ProxyUri
)
{
EFI_DEV_PATH *Node;
EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
+ EFI_DEVICE_PATH_PROTOCOL *FinalDevicePath;
UINTN Length;
CHAR8 AsciiUri[URI_STR_MAX_SIZE];
+ CHAR8 AsciiProxyUri[URI_STR_MAX_SIZE];
+ UINTN AsciiProxyUriSize;
EFI_STATUS Status;
- UINTN Index;
EFI_BOOT_MANAGER_LOAD_OPTION NewOption;
- NewDevicePath = NULL;
- Node = NULL;
- TmpDevicePath = NULL;
+ NewDevicePath = NULL;
+ Node = NULL;
+ TmpDevicePath = NULL;
+ FinalDevicePath = NULL;
if (StrLen (Description) == 0) {
return EFI_INVALID_PARAMETER;
}
//
- // Convert the scheme to all lower case.
+ // Check the URI Scheme
//
- for (Index = 0; Index < StrLen (Uri); Index++) {
- if (Uri[Index] == L':') {
- break;
+ UnicodeStrToAsciiStrS (Uri, AsciiUri, sizeof (AsciiUri));
+ UnicodeStrToAsciiStrS (ProxyUri, AsciiProxyUri, sizeof (AsciiProxyUri));
+ Status = HttpBootCheckUriScheme (AsciiUri);
+ if (EFI_ERROR (Status)) {
+ if (Status == EFI_INVALID_PARAMETER) {
+ DEBUG ((DEBUG_ERROR, "Error: Invalid URI address.\n"));
+ } else if (Status == EFI_ACCESS_DENIED) {
+ DEBUG ((DEBUG_ERROR, "Error: Access forbidden, only HTTPS connection is allowed.\n"));
}
- if ((Uri[Index] >= L'A') && (Uri[Index] <= L'Z')) {
- Uri[Index] -= (CHAR16)(L'A' - L'a');
- }
+ return Status;
}
- //
- // Only accept empty URI, or http and https URI.
- //
- if ((StrLen (Uri) != 0) && (StrnCmp (Uri, L"http://", 7) != 0) && (StrnCmp (Uri, L"https://", 8) != 0)) {
- return EFI_INVALID_PARAMETER;
+ Status = HttpBootCheckUriScheme (AsciiProxyUri);
+ if (EFI_ERROR (Status)) {
+ if (Status == EFI_INVALID_PARAMETER) {
+ DEBUG ((DEBUG_ERROR, "Error: Invalid URI address.\n"));
+ } else if (Status == EFI_ACCESS_DENIED) {
+ DEBUG ((DEBUG_ERROR, "Error: Access forbidden, only HTTPS connection is allowed.\n"));
+ }
+
+ return Status;
}
//
- // Create a new device path by appending the IP node and URI node to
+ // Create a new device path by appending the IP node, Proxy node and URI node to
// the driver's parent device path
//
if (!UsingIpv6) {
@@ -100,15 +112,43 @@ HttpBootAddBootOption (
return EFI_OUT_OF_RESOURCES;
}
+ //
+ // Update the Proxy node with the input Proxy URI
+ //
+ if (StrLen (ProxyUri) != 0) {
+ AsciiProxyUriSize = AsciiStrSize (AsciiProxyUri);
+ Length = sizeof (EFI_DEVICE_PATH_PROTOCOL) + AsciiProxyUriSize;
+ Node = AllocatePool (Length);
+ if (Node == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
+ }
+
+ Node->DevPath.Type = MESSAGING_DEVICE_PATH;
+ Node->DevPath.SubType = MSG_URI_DP;
+ SetDevicePathNodeLength (Node, Length);
+ CopyMem (
+ (UINT8 *)Node + sizeof (EFI_DEVICE_PATH_PROTOCOL),
+ AsciiProxyUri,
+ AsciiProxyUriSize
+ );
+ NewDevicePath = AppendDevicePathNode (TmpDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
+ FreePool (Node);
+ if (NewDevicePath == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
+ }
+ } else {
+ NewDevicePath = TmpDevicePath;
+ }
+
//
// Update the URI node with the input boot file URI.
//
- UnicodeStrToAsciiStrS (Uri, AsciiUri, sizeof (AsciiUri));
Length = sizeof (EFI_DEVICE_PATH_PROTOCOL) + AsciiStrSize (AsciiUri);
Node = AllocatePool (Length);
if (Node == NULL) {
Status = EFI_OUT_OF_RESOURCES;
- FreePool (TmpDevicePath);
goto ON_EXIT;
}
@@ -116,10 +156,9 @@ HttpBootAddBootOption (
Node->DevPath.SubType = MSG_URI_DP;
SetDevicePathNodeLength (Node, Length);
CopyMem ((UINT8 *)Node + sizeof (EFI_DEVICE_PATH_PROTOCOL), AsciiUri, AsciiStrSize (AsciiUri));
- NewDevicePath = AppendDevicePathNode (TmpDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
+ FinalDevicePath = AppendDevicePathNode (NewDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
FreePool (Node);
- FreePool (TmpDevicePath);
- if (NewDevicePath == NULL) {
+ if (FinalDevicePath == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_EXIT;
}
@@ -133,7 +172,7 @@ HttpBootAddBootOption (
LoadOptionTypeBoot,
LOAD_OPTION_ACTIVE,
Description,
- NewDevicePath,
+ FinalDevicePath,
NULL,
0
);
@@ -146,10 +185,18 @@ HttpBootAddBootOption (
ON_EXIT:
+ if (TmpDevicePath != NULL) {
+ FreePool (TmpDevicePath);
+ }
+
if (NewDevicePath != NULL) {
FreePool (NewDevicePath);
}
+ if (FinalDevicePath != NULL) {
+ FreePool (FinalDevicePath);
+ }
+
return Status;
}
@@ -406,7 +453,8 @@ HttpBootFormRouteConfig (
Private,
(CallbackInfo->HttpBootNvData.IpVersion == HTTP_BOOT_IP_VERSION_6) ? TRUE : FALSE,
CallbackInfo->HttpBootNvData.Description,
- CallbackInfo->HttpBootNvData.Uri
+ CallbackInfo->HttpBootNvData.Uri,
+ CallbackInfo->HttpBootNvData.ProxyUri
);
return EFI_SUCCESS;
@@ -472,6 +520,7 @@ HttpBootFormCallback (
switch (QuestionId) {
case KEY_INITIATOR_URI:
+ case KEY_INITIATOR_PROXY_URI:
//
// Get user input URI string
//
diff --git a/NetworkPkg/HttpBootDxe/HttpBootConfigNVDataStruc.h b/NetworkPkg/HttpBootDxe/HttpBootConfigNVDataStruc.h
index a24fa5cb08..f0da21e8fd 100644
--- a/NetworkPkg/HttpBootDxe/HttpBootConfigNVDataStruc.h
+++ b/NetworkPkg/HttpBootDxe/HttpBootConfigNVDataStruc.h
@@ -27,7 +27,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#define FORMID_MAIN_FORM 1
-#define KEY_INITIATOR_URI 0x101
+#define KEY_INITIATOR_URI 0x101
+#define KEY_INITIATOR_PROXY_URI 0x102
#define HTTP_BOOT_DEFAULT_DESCRIPTION_STR L"UEFI HTTP"
@@ -37,6 +38,7 @@ typedef struct _HTTP_BOOT_CONFIG_IFR_NVDATA {
UINT8 Padding;
CHAR16 Description[DESCRIPTION_STR_MAX_SIZE];
CHAR16 Uri[URI_STR_MAX_SIZE];
+ CHAR16 ProxyUri[URI_STR_MAX_SIZE];
} HTTP_BOOT_CONFIG_IFR_NVDATA;
#pragma pack()
diff --git a/NetworkPkg/HttpBootDxe/HttpBootConfigStrings.uni b/NetworkPkg/HttpBootDxe/HttpBootConfigStrings.uni
index 40abb13d0d..28af02bc14 100644
--- a/NetworkPkg/HttpBootDxe/HttpBootConfigStrings.uni
+++ b/NetworkPkg/HttpBootDxe/HttpBootConfigStrings.uni
@@ -18,4 +18,6 @@
#string STR_BOOT_URI_PROMPT #language en-US "Boot URI"
#string STR_BOOT_URI_HELP #language en-US "A new Boot Option will be created according to this Boot URI."
#string STR_BOOT_DESCRIPTION_PROMPT #language en-US "Input the description"
+#string STR_BOOT_PROXY_URI_PROMPT #language en-US "Proxy URI"
+#string STR_BOOT_PROXY_URI_HELP #language en-US "Proxy URI through which to connect to Boot URI"
#string STR_NULL_STRING #language en-US ""
diff --git a/NetworkPkg/HttpBootDxe/HttpBootConfigVfr.vfr b/NetworkPkg/HttpBootDxe/HttpBootConfigVfr.vfr
index 65a60216bc..6a23e57d6b 100644
--- a/NetworkPkg/HttpBootDxe/HttpBootConfigVfr.vfr
+++ b/NetworkPkg/HttpBootDxe/HttpBootConfigVfr.vfr
@@ -44,6 +44,15 @@ formset
minsize = URI_STR_MIN_SIZE,
maxsize = URI_STR_MAX_SIZE,
endstring;
+
+ string varid = HTTP_BOOT_CONFIG_IFR_NVDATA.ProxyUri,
+ prompt = STRING_TOKEN(STR_BOOT_PROXY_URI_PROMPT),
+ help = STRING_TOKEN(STR_BOOT_PROXY_URI_HELP),
+ flags = INTERACTIVE,
+ key = KEY_INITIATOR_PROXY_URI,
+ minsize = URI_STR_MIN_SIZE,
+ maxsize = URI_STR_MAX_SIZE,
+ endstring;
endform;
endformset;
--
2.36.1.windows.1
prev parent reply other threads:[~2022-12-02 19:12 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-02 19:12 [edk2-staging/HttpProxy PATCH v3 0/7] Support HTTPS Proxy Server for HTTP Boot Saloni Kasbekar
2022-12-02 19:12 ` [edk2-staging/HttpProxy PATCH v3 1/7] MdeModulePkg/Library: Support multi-URI HTTP Boot device path Saloni Kasbekar
2022-12-02 19:12 ` [edk2-staging/HttpProxy PATCH v3 2/7] MdePkg/Include: Add Proxy Server URL in EFI_HTTP_REQUEST_DATA Saloni Kasbekar
2022-12-02 19:12 ` [edk2-staging/HttpProxy PATCH v3 3/7] NetworkPkg/HttpBootDxe: Update HTTP Boot Driver with parsed Proxy URL Saloni Kasbekar
2022-12-02 19:12 ` [edk2-staging/HttpProxy PATCH v3 4/7] NetworkPkg: Add Proxy Support to HTTP_PROTOCOL Saloni Kasbekar
2022-12-02 19:12 ` [edk2-staging/HttpProxy PATCH v3 5/7] NetworkPkg: Add support for HTTP CONNECT Method Saloni Kasbekar
2022-12-02 19:12 ` [edk2-staging/HttpProxy PATCH v3 6/7] NetworkPkg/HttpDxe: Support HTTPS EndPoint server with Proxy Saloni Kasbekar
2022-12-02 19:12 ` Saloni Kasbekar [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=14497137c1d8f0a847047080bd9f5e922f780ffa.1670008048.git.saloni.kasbekar@intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox