From 672632a0c28fdd86d3903c80b44a2d5bf8b97c67 Mon Sep 17 00:00:00 2001 From: longpanda Date: Fri, 14 May 2021 22:27:26 +0800 Subject: [PATCH] Add isopwd wimpwd efipwd imgpwd vhdpwd vtoypwd option in password plugin (#898) --- .../grub-2.04/grub-core/ventoy/ventoy_cmd.c | 2 +- .../grub-2.04/grub-core/ventoy/ventoy_def.h | 15 ++-- .../grub-core/ventoy/ventoy_plugin.c | 70 +++++++++++++++++-- 3 files changed, 75 insertions(+), 12 deletions(-) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c index e4dce219..f5256408 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c @@ -134,7 +134,7 @@ static const char *g_menu_class[] = "vtoyiso", "vtoywim", "vtoyefi", "vtoyimg", "vtoyvhd", "vtoyvtoy" }; -static const char *g_menu_prefix[] = +const char *g_menu_prefix[img_type_max] = { "iso", "wim", "efi", "img", "vhd", "vtoy" }; diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h index f7b4f9de..bb61fbbb 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h @@ -194,12 +194,14 @@ typedef struct ventoy_iso9660_vd #pragma pack() -#define img_type_iso 0 -#define img_type_wim 1 -#define img_type_efi 2 -#define img_type_img 3 -#define img_type_vhd 4 -#define img_type_vtoy 5 +#define img_type_start 0 +#define img_type_iso 0 +#define img_type_wim 1 +#define img_type_efi 2 +#define img_type_img 3 +#define img_type_vhd 4 +#define img_type_vtoy 5 +#define img_type_max 6 typedef struct img_info { @@ -282,6 +284,7 @@ extern ventoy_img_chunk_list g_img_chunk_list; extern ventoy_img_chunk_list g_wimiso_chunk_list; extern char *g_wimiso_path; extern char g_arch_mode_suffix[64]; +extern const char *g_menu_prefix[img_type_max]; extern int g_ventoy_debug; void ventoy_debug(const char *fmt, ...); diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c index 7069b599..f44a4ea4 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c @@ -43,6 +43,7 @@ GRUB_MOD_LICENSE ("GPLv3+"); char g_arch_mode_suffix[64]; static char g_iso_disk_name[128]; static vtoy_password g_boot_pwd; +static vtoy_password g_file_type_pwd[img_type_max]; static install_template *g_install_template_head = NULL; static dud *g_dud_head = NULL; static menu_password *g_pwd_head = NULL; @@ -809,8 +810,26 @@ static int ventoy_plugin_parse_pwdstr(char *pwdstr, vtoy_password *pwd) return 0; } +static int ventoy_plugin_get_pwd_type(const char *pwd) +{ + int i; + char pwdtype[64]; + + for (i = 0; pwd && i < (int)ARRAY_SIZE(g_menu_prefix); i++) + { + grub_snprintf(pwdtype, sizeof(pwdtype), "%spwd", g_menu_prefix[i]); + if (grub_strcmp(pwdtype, pwd) == 0) + { + return img_type_start + i; + } + } + + return -1; +} + static int ventoy_plugin_pwd_entry(VTOY_JSON *json, const char *isodisk) { + int type = -1; const char *iso = NULL; const char *pwd = NULL; VTOY_JSON *pNode = NULL; @@ -844,6 +863,10 @@ static int ventoy_plugin_pwd_entry(VTOY_JSON *json, const char *isodisk) { ventoy_plugin_parse_pwdstr(pNode->unData.pcStrVal, &g_boot_pwd); } + else if ((type = ventoy_plugin_get_pwd_type(pNode->pcName)) >= 0) + { + ventoy_plugin_parse_pwdstr(pNode->unData.pcStrVal, g_file_type_pwd + type); + } else if (pNode->pcName && grub_strcmp("menupwd", pNode->pcName) == 0) { for (pCNode = pNode->pstChild; pCNode; pCNode = pCNode->pstNext) @@ -888,6 +911,7 @@ static int ventoy_plugin_pwd_entry(VTOY_JSON *json, const char *isodisk) static int ventoy_plugin_pwd_check(VTOY_JSON *json, const char *isodisk) { + int type = -1; char *pos = NULL; const char *iso = NULL; const char *pwd = NULL; @@ -913,6 +937,17 @@ static int ventoy_plugin_pwd_check(VTOY_JSON *json, const char *isodisk) grub_printf("Invalid bootpwd.\n"); } } + else if ((type = ventoy_plugin_get_pwd_type(pNode->pcName)) >= 0) + { + if (0 == ventoy_plugin_parse_pwdstr(pNode->unData.pcStrVal, NULL)) + { + grub_printf("%s:<%s>\n", pNode->pcName, pNode->unData.pcStrVal); + } + else + { + grub_printf("Invalid pwd <%s>\n", pNode->unData.pcStrVal); + } + } else if (pNode->pcName && grub_strcmp("menupwd", pNode->pcName) == 0) { grub_printf("\n"); @@ -2475,20 +2510,45 @@ int ventoy_plugin_load_dud(dud *node, const char *isopart) static const vtoy_password * ventoy_plugin_get_password(const char *isopath) { + int i; int len; + const char *pos = NULL; menu_password *node = NULL; - if ((!g_pwd_head) || (!isopath)) + if (!isopath) { return NULL; } - len = (int)grub_strlen(isopath); - for (node = g_pwd_head; node; node = node->next) + if (g_pwd_head) { - if (node->pathlen == len && ventoy_strncmp(node->isopath, isopath, len) == 0) + len = (int)grub_strlen(isopath); + for (node = g_pwd_head; node; node = node->next) { - return &(node->password); + if (node->pathlen == len && ventoy_strncmp(node->isopath, isopath, len) == 0) + { + return &(node->password); + } + } + } + + while (*isopath) + { + if (*isopath == '.') + { + pos = isopath; + } + isopath++; + } + + if (pos) + { + for (i = 0; i < (int)ARRAY_SIZE(g_menu_prefix); i++) + { + if (g_file_type_pwd[i].type && 0 == grub_strcasecmp(pos + 1, g_menu_prefix[i])) + { + return g_file_type_pwd + i; + } } }