[pve-devel] [PATCH qemu 1/2] fix #2190: Base64 encode SMBIOS value strings in order to allow more characters
Tim Marx
t.marx at proxmox.com
Thu Jun 6 14:51:05 CEST 2019
looks good as well.
> Christian Ebner <c.ebner at proxmox.com> hat am 4. Juni 2019 um 16:47 geschrieben:
>
>
> On some occasions e.g. license checking, the manufacturer string in the
> SMBIOS settings edit has to allow characters such as whitespaces.
> https://forum.proxmox.com/threads/proxmox-and-windows-rok-license-for-dell.53236/
> In principle SMBIOS allows to pass any zero terminated string to the
> corresponding fields in the structure type 1 (System Information).
>
> By base64 encoding the values clashing of the config is avoided.
>
> Relies on the corresponding patch to pve-manager to obtain base64 encoded values.
>
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
> Version 3:
> * use base64 instead of URL encoding
> * maintain backwards compatibility when reading old configs
>
> PVE/QemuServer.pm | 53 +++++++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 39 insertions(+), 14 deletions(-)
>
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index 1a22fb4..741081c 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -21,6 +21,7 @@ use JSON;
> use Fcntl;
> use PVE::SafeSyslog;
> use Storable qw(dclone);
> +use MIME::Base64;
> use PVE::Exception qw(raise raise_param_exc);
> use PVE::Storage;
> use PVE::Tools qw(run_command lock_file lock_file_full file_read_firstline dir_glob_foreach $IPV6RE);
> @@ -2358,7 +2359,7 @@ sub vmconfig_cleanup_pending {
> return $changes;
> }
>
> -# smbios: [manufacturer=str][,product=str][,version=str][,serial=str][,uuid=uuid][,sku=str][,family=str]
> +# smbios: [manufacturer=str][,product=str][,version=str][,serial=str][,uuid=uuid][,sku=str][,family=str][,base64=bool]
> my $smbios1_fmt = {
> uuid => {
> type => 'string',
> @@ -2369,46 +2370,51 @@ my $smbios1_fmt = {
> },
> version => {
> type => 'string',
> - pattern => '\S+',
> - format_description => 'string',
> + pattern => '[A-Za-z0-9+\/=]+',
> + format_description => 'Base64 encoded string',
> description => "Set SMBIOS1 version.",
> optional => 1,
> },
> serial => {
> type => 'string',
> - pattern => '\S+',
> - format_description => 'string',
> + pattern => '[A-Za-z0-9+\/=]+',
> + format_description => 'Base64 encoded string',
> description => "Set SMBIOS1 serial number.",
> optional => 1,
> },
> manufacturer => {
> type => 'string',
> - pattern => '\S+',
> - format_description => 'string',
> + pattern => '[A-Za-z0-9+\/=]+',
> + format_description => 'Base64 encoded string',
> description => "Set SMBIOS1 manufacturer.",
> optional => 1,
> },
> product => {
> type => 'string',
> - pattern => '\S+',
> - format_description => 'string',
> + pattern => '[A-Za-z0-9+\/=]+',
> + format_description => 'Base64 encoded string',
> description => "Set SMBIOS1 product ID.",
> optional => 1,
> },
> sku => {
> type => 'string',
> - pattern => '\S+',
> - format_description => 'string',
> + pattern => '[A-Za-z0-9+\/=]+',
> + format_description => 'Base64 encoded string',
> description => "Set SMBIOS1 SKU string.",
> optional => 1,
> },
> family => {
> type => 'string',
> - pattern => '\S+',
> - format_description => 'string',
> + pattern => '[A-Za-z0-9+\/=]+',
> + format_description => 'Base64 encoded string',
> description => "Set SMBIOS1 family string.",
> optional => 1,
> },
> + base64 => {
> + type => 'boolean',
> + description => 'Flag to indicate that the SMBIOS values are base64 encoded',
> + optional => 1,
> + },
> };
What if I just send one character, which AFAIK is not valid base64?
Would be no harm I guess because it's a string anyway, but just to mention it.
>
> sub parse_smbios1 {
> @@ -3524,7 +3530,26 @@ sub config_to_command {
> push @$cmd, '-daemonize';
>
> if ($conf->{smbios1}) {
> - push @$cmd, '-smbios', "type=1,$conf->{smbios1}";
> + my $smbios_conf = parse_smbios1($conf->{smbios1});
> + if ($smbios_conf->{base64}) {
> + # Do not pass base64 flag to qemu
> + delete $smbios_conf->{base64};
> + my $smbios_string = "";
> + foreach my $key (keys %$smbios_conf) {
> + my $value;
> + if ($key eq "uuid") {
> + $value = $smbios_conf->{uuid}
> + } else {
> + $value = decode_base64($smbios_conf->{$key});
> + }
> + # qemu accepts any binary data, only commas need escaping by double comma
> + $value =~ s/,/,,/g;
> + $smbios_string .= "," . $key . "=" . $value if $value;
> + }
> + push @$cmd, '-smbios', "type=1" . $smbios_string;
> + } else {
> + push @$cmd, '-smbios', "type=1,$conf->{smbios1}";
> + }
> }
>
> if ($conf->{vmgenid}) {
> --
> 2.11.0
>
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
More information about the pve-devel
mailing list