From nobody Sat Apr 27 19:23:28 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634810711151710.0071468685265; Thu, 21 Oct 2021 03:05:11 -0700 (PDT) Received: from localhost ([::1]:48320 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mdUwf-0003i3-Es for importer@patchew.org; Thu, 21 Oct 2021 06:05:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:55684) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mdUtQ-0001gw-5f for qemu-devel@nongnu.org; Thu, 21 Oct 2021 06:01:48 -0400 Received: from proxmox-new.maurer-it.com ([94.136.29.106]:62483) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mdUtN-0002mZ-57 for qemu-devel@nongnu.org; Thu, 21 Oct 2021 06:01:47 -0400 Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 2B8EE468EF; Thu, 21 Oct 2021 12:01:41 +0200 (CEST) From: Stefan Reiter To: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , "Dr. David Alan Gilbert" , Markus Armbruster , Paolo Bonzini , Eric Blake , Gerd Hoffmann , Wolfgang Bumiller , Thomas Lamprecht Subject: [PATCH v7 1/4] monitor/hmp: add support for flag argument with value Date: Thu, 21 Oct 2021 12:01:32 +0200 Message-Id: <20211021100135.4146766-2-s.reiter@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211021100135.4146766-1-s.reiter@proxmox.com> References: <20211021100135.4146766-1-s.reiter@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=94.136.29.106; envelope-from=s.reiter@proxmox.com; helo=proxmox-new.maurer-it.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1634810711962100001 Content-Type: text/plain; charset="utf-8" Adds support for the "-xV" parameter type, where "-x" denotes a flag name and the "V" suffix indicates that this flag is supposed to take an arbitrary string parameter. These parameters are always optional, the entry in the qdict will be omitted if the flag is not given. Signed-off-by: Stefan Reiter Acked-by: Gerd Hoffmann Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Eric Blake --- v6: It wasn't possible to pass the 'connected' parameter to set_password, since= the code to handle optional parameters couldn't live with a different param (not starting with '-') coming up instead - fix that by advancing over the 'value flag' modifier in case `*p !=3D '-'`. Also change the modifier to 'V' instead of 'S' so it can be distinguished f= rom an actual trailing 'S' type param. Discovered in testing. I dropped Eric's R-b due to the code change. monitor/hmp.c | 19 ++++++++++++++++++- monitor/monitor-internal.h | 3 ++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/monitor/hmp.c b/monitor/hmp.c index d50c3124e1..899e0c990f 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -980,6 +980,7 @@ static QDict *monitor_parse_arguments(Monitor *mon, { const char *tmp =3D p; int skip_key =3D 0; + int ret; /* option */ =20 c =3D *typestr++; @@ -1002,11 +1003,27 @@ static QDict *monitor_parse_arguments(Monitor *mon, } if (skip_key) { p =3D tmp; + } else if (*typestr =3D=3D 'V') { + /* has option with string value */ + typestr++; + tmp =3D p++; + while (qemu_isspace(*p)) { + p++; + } + ret =3D get_str(buf, sizeof(buf), &p); + if (ret < 0) { + monitor_printf(mon, "%s: value expected for -%= c\n", + cmd->name, *tmp); + goto fail; + } + qdict_put_str(qdict, key, buf); } else { - /* has option */ + /* has boolean option */ p++; qdict_put_bool(qdict, key, true); } + } else if (*typestr =3D=3D 'V') { + typestr++; } } break; diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 9c3a09cb01..9e708b329d 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -63,7 +63,8 @@ * '.' other form of optional type (for 'i' and 'l') * 'b' boolean * user mode accepts "on" or "off" - * '-' optional parameter (eg. '-f') + * '-' optional parameter (eg. '-f'); if followed by an 'V', it + * specifies an optional string param (e.g. '-fV' allows '-f = foo') * */ =20 --=20 2.30.2 From nobody Sat Apr 27 19:23:28 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634810924220645.6855201665999; Thu, 21 Oct 2021 03:08:44 -0700 (PDT) Received: from localhost ([::1]:55804 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mdV07-0000Ld-9R for importer@patchew.org; Thu, 21 Oct 2021 06:08:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:55692) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mdUtQ-0001hJ-GY for qemu-devel@nongnu.org; Thu, 21 Oct 2021 06:01:48 -0400 Received: from proxmox-new.maurer-it.com ([94.136.29.106]:35344) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mdUtN-0002mX-56 for qemu-devel@nongnu.org; Thu, 21 Oct 2021 06:01:48 -0400 Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 8A3334550F; Thu, 21 Oct 2021 12:01:41 +0200 (CEST) From: Stefan Reiter To: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , "Dr. David Alan Gilbert" , Markus Armbruster , Paolo Bonzini , Eric Blake , Gerd Hoffmann , Wolfgang Bumiller , Thomas Lamprecht Subject: [PATCH v7 2/4] qapi/monitor: refactor set/expire_password with enums Date: Thu, 21 Oct 2021 12:01:33 +0200 Message-Id: <20211021100135.4146766-3-s.reiter@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211021100135.4146766-1-s.reiter@proxmox.com> References: <20211021100135.4146766-1-s.reiter@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=94.136.29.106; envelope-from=s.reiter@proxmox.com; helo=proxmox-new.maurer-it.com X-Spam_score_int: 0 X-Spam_score: 0.0 X-Spam_bar: / X-Spam_report: (0.0 / 5.0 requ) SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1634810925682100001 Content-Type: text/plain; charset="utf-8" 'protocol' and 'connected' are better suited as enums than as strings, make use of that. No functional change intended. Suggested-by: Markus Armbruster Reviewed-by: Markus Armbruster Signed-off-by: Stefan Reiter Acked-by: Gerd Hoffmann --- monitor/hmp-cmds.c | 29 +++++++++++++++++++++++++++-- monitor/qmp-cmds.c | 37 ++++++++++++------------------------- qapi/ui.json | 37 +++++++++++++++++++++++++++++++++++-- 3 files changed, 74 insertions(+), 29 deletions(-) diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index bcaa41350e..b8abe69609 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1453,8 +1453,24 @@ void hmp_set_password(Monitor *mon, const QDict *qdi= ct) const char *password =3D qdict_get_str(qdict, "password"); const char *connected =3D qdict_get_try_str(qdict, "connected"); Error *err =3D NULL; + DisplayProtocol proto; + SetPasswordAction conn; =20 - qmp_set_password(protocol, password, !!connected, connected, &err); + proto =3D qapi_enum_parse(&DisplayProtocol_lookup, protocol, + DISPLAY_PROTOCOL_VNC, &err); + if (err) { + goto out; + } + + conn =3D qapi_enum_parse(&SetPasswordAction_lookup, connected, + SET_PASSWORD_ACTION_KEEP, &err); + if (err) { + goto out; + } + + qmp_set_password(proto, password, !!connected, conn, &err); + +out: hmp_handle_error(mon, err); } =20 @@ -1463,8 +1479,17 @@ void hmp_expire_password(Monitor *mon, const QDict *= qdict) const char *protocol =3D qdict_get_str(qdict, "protocol"); const char *whenstr =3D qdict_get_str(qdict, "time"); Error *err =3D NULL; + DisplayProtocol proto; =20 - qmp_expire_password(protocol, whenstr, &err); + proto =3D qapi_enum_parse(&DisplayProtocol_lookup, protocol, + DISPLAY_PROTOCOL_VNC, &err); + if (err) { + goto out; + } + + qmp_expire_password(proto, whenstr, &err); + +out: hmp_handle_error(mon, err); } =20 diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index 5c0d5e116b..0654d7289a 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -163,33 +163,27 @@ void qmp_system_wakeup(Error **errp) qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, errp); } =20 -void qmp_set_password(const char *protocol, const char *password, - bool has_connected, const char *connected, Error **e= rrp) +void qmp_set_password(DisplayProtocol protocol, const char *password, + bool has_connected, SetPasswordAction connected, + Error **errp) { int disconnect_if_connected =3D 0; int fail_if_connected =3D 0; int rc; =20 if (has_connected) { - if (strcmp(connected, "fail") =3D=3D 0) { - fail_if_connected =3D 1; - } else if (strcmp(connected, "disconnect") =3D=3D 0) { - disconnect_if_connected =3D 1; - } else if (strcmp(connected, "keep") =3D=3D 0) { - /* nothing */ - } else { - error_setg(errp, QERR_INVALID_PARAMETER, "connected"); - return; - } + fail_if_connected =3D connected =3D=3D SET_PASSWORD_ACTION_FAIL; + disconnect_if_connected =3D connected =3D=3D SET_PASSWORD_ACTION_D= ISCONNECT; } =20 - if (strcmp(protocol, "spice") =3D=3D 0) { + if (protocol =3D=3D DISPLAY_PROTOCOL_SPICE) { if (!qemu_using_spice(errp)) { return; } rc =3D qemu_spice.set_passwd(password, fail_if_connected, disconnect_if_connected); - } else if (strcmp(protocol, "vnc") =3D=3D 0) { + } else { + assert(protocol =3D=3D DISPLAY_PROTOCOL_VNC); if (fail_if_connected || disconnect_if_connected) { /* vnc supports "connected=3Dkeep" only */ error_setg(errp, QERR_INVALID_PARAMETER, "connected"); @@ -198,10 +192,6 @@ void qmp_set_password(const char *protocol, const char= *password, /* Note that setting an empty password will not disable login thro= ugh * this interface. */ rc =3D vnc_display_password(NULL, password); - } else { - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "protocol", - "'vnc' or 'spice'"); - return; } =20 if (rc !=3D 0) { @@ -209,7 +199,7 @@ void qmp_set_password(const char *protocol, const char = *password, } } =20 -void qmp_expire_password(const char *protocol, const char *whenstr, +void qmp_expire_password(DisplayProtocol protocol, const char *whenstr, Error **errp) { time_t when; @@ -225,17 +215,14 @@ void qmp_expire_password(const char *protocol, const = char *whenstr, when =3D strtoull(whenstr, NULL, 10); } =20 - if (strcmp(protocol, "spice") =3D=3D 0) { + if (protocol =3D=3D DISPLAY_PROTOCOL_SPICE) { if (!qemu_using_spice(errp)) { return; } rc =3D qemu_spice.set_pw_expire(when); - } else if (strcmp(protocol, "vnc") =3D=3D 0) { - rc =3D vnc_display_pw_expire(NULL, when); } else { - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "protocol", - "'vnc' or 'spice'"); - return; + assert(protocol =3D=3D DISPLAY_PROTOCOL_VNC); + rc =3D vnc_display_pw_expire(NULL, when); } =20 if (rc !=3D 0) { diff --git a/qapi/ui.json b/qapi/ui.json index d7567ac866..15cc19dcc5 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -9,6 +9,35 @@ { 'include': 'common.json' } { 'include': 'sockets.json' } =20 +## +# @DisplayProtocol: +# +# Display protocols which support changing password options. +# +# Since: 6.2 +# +## +{ 'enum': 'DisplayProtocol', + 'data': [ { 'name': 'vnc', 'if': 'CONFIG_VNC' }, + { 'name': 'spice', 'if': 'CONFIG_SPICE' } ] } + +## +# @SetPasswordAction: +# +# An action to take on changing a password on a connection with active cli= ents. +# +# @fail: fail the command if clients are connected +# +# @disconnect: disconnect existing clients +# +# @keep: maintain existing clients +# +# Since: 6.2 +# +## +{ 'enum': 'SetPasswordAction', + 'data': [ 'fail', 'disconnect', 'keep' ] } + ## # @set_password: # @@ -38,7 +67,9 @@ # ## { 'command': 'set_password', - 'data': {'protocol': 'str', 'password': 'str', '*connected': 'str'} } + 'data': { 'protocol': 'DisplayProtocol', + 'password': 'str', + '*connected': 'SetPasswordAction' } } =20 ## # @expire_password: @@ -71,7 +102,9 @@ # <- { "return": {} } # ## -{ 'command': 'expire_password', 'data': {'protocol': 'str', 'time': 'str'}= } +{ 'command': 'expire_password', + 'data': { 'protocol': 'DisplayProtocol', + 'time': 'str' } } =20 ## # @screendump: --=20 2.30.2 From nobody Sat Apr 27 19:23:28 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634810730765852.6907039600862; Thu, 21 Oct 2021 03:05:30 -0700 (PDT) Received: from localhost ([::1]:48498 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mdUwz-0003p2-DC for importer@patchew.org; Thu, 21 Oct 2021 06:05:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:55704) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mdUtR-0001hd-Vu for qemu-devel@nongnu.org; Thu, 21 Oct 2021 06:01:50 -0400 Received: from proxmox-new.maurer-it.com ([94.136.29.106]:20857) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mdUtN-0002mt-6k for qemu-devel@nongnu.org; Thu, 21 Oct 2021 06:01:49 -0400 Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 6662344969; Thu, 21 Oct 2021 12:01:42 +0200 (CEST) From: Stefan Reiter To: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , "Dr. David Alan Gilbert" , Markus Armbruster , Paolo Bonzini , Eric Blake , Gerd Hoffmann , Wolfgang Bumiller , Thomas Lamprecht Subject: [PATCH v7 3/4] qapi/monitor: allow VNC display id in set/expire_password Date: Thu, 21 Oct 2021 12:01:34 +0200 Message-Id: <20211021100135.4146766-4-s.reiter@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211021100135.4146766-1-s.reiter@proxmox.com> References: <20211021100135.4146766-1-s.reiter@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=94.136.29.106; envelope-from=s.reiter@proxmox.com; helo=proxmox-new.maurer-it.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1634810731761100001 It is possible to specify more than one VNC server on the command line, either with an explicit ID or the auto-generated ones =C3=A0 la "default", "vnc2", "vnc3", ... It is not possible to change the password on one of these extra VNC displays though. Fix this by adding a "display" parameter to the "set_password" and "expire_password" QMP and HMP commands. For HMP, the display is specified using the "-d" value flag. For QMP, the schema is updated to explicitly express the supported variants of the commands with protocol-discriminated unions. Suggested-by: Markus Armbruster Signed-off-by: Stefan Reiter Acked-by: Dr. David Alan Gilbert Acked-by: Gerd Hoffmann Reviewed-by: Markus Armbruster --- hmp-commands.hx | 24 +++++----- monitor/hmp-cmds.c | 45 ++++++++++++------ monitor/qmp-cmds.c | 36 ++++++--------- qapi/ui.json | 112 +++++++++++++++++++++++++++++++++++---------- 4 files changed, 148 insertions(+), 69 deletions(-) diff --git a/hmp-commands.hx b/hmp-commands.hx index cf723c69ac..9fbb207b35 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1514,33 +1514,35 @@ ERST =20 { .name =3D "set_password", - .args_type =3D "protocol:s,password:s,connected:s?", - .params =3D "protocol password action-if-connected", + .args_type =3D "protocol:s,password:s,display:-dV,connected:s?", + .params =3D "protocol password [-d display] [action-if-connect= ed]", .help =3D "set spice/vnc password", .cmd =3D hmp_set_password, }, =20 SRST -``set_password [ vnc | spice ] password [ action-if-connected ]`` - Change spice/vnc password. *action-if-connected* specifies what - should happen in case a connection is established: *fail* makes the - password change fail. *disconnect* changes the password and +``set_password [ vnc | spice ] password [ -d display ] [ action-if-connect= ed ]`` + Change spice/vnc password. *display* can be used with 'vnc' to specify + which display to set the password on. *action-if-connected* specifies + what should happen in case a connection is established: *fail* makes + the password change fail. *disconnect* changes the password and disconnects the client. *keep* changes the password and keeps the connection up. *keep* is the default. ERST =20 { .name =3D "expire_password", - .args_type =3D "protocol:s,time:s", - .params =3D "protocol time", + .args_type =3D "protocol:s,time:s,display:-dV", + .params =3D "protocol time [-d display]", .help =3D "set spice/vnc password expire-time", .cmd =3D hmp_expire_password, }, =20 SRST -``expire_password [ vnc | spice ]`` *expire-time* - Specify when a password for spice/vnc becomes - invalid. *expire-time* accepts: +``expire_password [ vnc | spice ] expire-time [ -d display ]`` + Specify when a password for spice/vnc becomes invalid. + *display* behaves the same as in ``set_password``. + *expire-time* accepts: =20 ``now`` Invalidate password instantly. diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index b8abe69609..f0f0c82d59 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1451,24 +1451,34 @@ void hmp_set_password(Monitor *mon, const QDict *qd= ict) { const char *protocol =3D qdict_get_str(qdict, "protocol"); const char *password =3D qdict_get_str(qdict, "password"); + const char *display =3D qdict_get_try_str(qdict, "display"); const char *connected =3D qdict_get_try_str(qdict, "connected"); Error *err =3D NULL; - DisplayProtocol proto; - SetPasswordAction conn; =20 - proto =3D qapi_enum_parse(&DisplayProtocol_lookup, protocol, - DISPLAY_PROTOCOL_VNC, &err); + SetPasswordOptions opts =3D { + .password =3D (char *)password, + }; + + opts.protocol =3D qapi_enum_parse(&DisplayProtocol_lookup, protocol, + DISPLAY_PROTOCOL_VNC, &err); if (err) { goto out; } =20 - conn =3D qapi_enum_parse(&SetPasswordAction_lookup, connected, - SET_PASSWORD_ACTION_KEEP, &err); - if (err) { - goto out; + if (opts.protocol =3D=3D DISPLAY_PROTOCOL_VNC) { + opts.u.vnc.has_display =3D !!display; + opts.u.vnc.display =3D (char *)display; + } else if (opts.protocol =3D=3D DISPLAY_PROTOCOL_SPICE) { + opts.u.spice.has_connected =3D !!connected; + opts.u.spice.connected =3D + qapi_enum_parse(&SetPasswordAction_lookup, connected, + SET_PASSWORD_ACTION_KEEP, &err); + if (err) { + goto out; + } } =20 - qmp_set_password(proto, password, !!connected, conn, &err); + qmp_set_password(&opts, &err); =20 out: hmp_handle_error(mon, err); @@ -1478,16 +1488,25 @@ void hmp_expire_password(Monitor *mon, const QDict = *qdict) { const char *protocol =3D qdict_get_str(qdict, "protocol"); const char *whenstr =3D qdict_get_str(qdict, "time"); + const char *display =3D qdict_get_try_str(qdict, "display"); Error *err =3D NULL; - DisplayProtocol proto; =20 - proto =3D qapi_enum_parse(&DisplayProtocol_lookup, protocol, - DISPLAY_PROTOCOL_VNC, &err); + ExpirePasswordOptions opts =3D { + .time =3D (char *)whenstr, + }; + + opts.protocol =3D qapi_enum_parse(&DisplayProtocol_lookup, protocol, + DISPLAY_PROTOCOL_VNC, &err); if (err) { goto out; } =20 - qmp_expire_password(proto, whenstr, &err); + if (opts.protocol =3D=3D DISPLAY_PROTOCOL_VNC) { + opts.u.vnc.has_display =3D !!display; + opts.u.vnc.display =3D (char *)display; + } + + qmp_expire_password(&opts, &err); =20 out: hmp_handle_error(mon, err); diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index 0654d7289a..5637bd70b6 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -163,35 +163,27 @@ void qmp_system_wakeup(Error **errp) qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, errp); } =20 -void qmp_set_password(DisplayProtocol protocol, const char *password, - bool has_connected, SetPasswordAction connected, - Error **errp) +void qmp_set_password(SetPasswordOptions *opts, Error **errp) { - int disconnect_if_connected =3D 0; - int fail_if_connected =3D 0; - int rc; + int rc =3D 0; =20 - if (has_connected) { - fail_if_connected =3D connected =3D=3D SET_PASSWORD_ACTION_FAIL; - disconnect_if_connected =3D connected =3D=3D SET_PASSWORD_ACTION_D= ISCONNECT; - } - - if (protocol =3D=3D DISPLAY_PROTOCOL_SPICE) { + if (opts->protocol =3D=3D DISPLAY_PROTOCOL_SPICE) { if (!qemu_using_spice(errp)) { return; } - rc =3D qemu_spice.set_passwd(password, fail_if_connected, - disconnect_if_connected); + rc =3D qemu_spice.set_passwd(opts->password, + opts->u.spice.connected =3D=3D SET_PASSWORD_ACTION_FAIL, + opts->u.spice.connected =3D=3D SET_PASSWORD_ACTION_DISCONN= ECT); } else { - assert(protocol =3D=3D DISPLAY_PROTOCOL_VNC); - if (fail_if_connected || disconnect_if_connected) { + assert(opts->protocol =3D=3D DISPLAY_PROTOCOL_VNC); + if (opts->u.vnc.connected !=3D SET_PASSWORD_ACTION_KEEP) { /* vnc supports "connected=3Dkeep" only */ error_setg(errp, QERR_INVALID_PARAMETER, "connected"); return; } /* Note that setting an empty password will not disable login thro= ugh * this interface. */ - rc =3D vnc_display_password(NULL, password); + rc =3D vnc_display_password(opts->u.vnc.display, opts->password); } =20 if (rc !=3D 0) { @@ -199,11 +191,11 @@ void qmp_set_password(DisplayProtocol protocol, const= char *password, } } =20 -void qmp_expire_password(DisplayProtocol protocol, const char *whenstr, - Error **errp) +void qmp_expire_password(ExpirePasswordOptions *opts, Error **errp) { time_t when; int rc; + const char *whenstr =3D opts->time; =20 if (strcmp(whenstr, "now") =3D=3D 0) { when =3D 0; @@ -215,14 +207,14 @@ void qmp_expire_password(DisplayProtocol protocol, co= nst char *whenstr, when =3D strtoull(whenstr, NULL, 10); } =20 - if (protocol =3D=3D DISPLAY_PROTOCOL_SPICE) { + if (opts->protocol =3D=3D DISPLAY_PROTOCOL_SPICE) { if (!qemu_using_spice(errp)) { return; } rc =3D qemu_spice.set_pw_expire(when); } else { - assert(protocol =3D=3D DISPLAY_PROTOCOL_VNC); - rc =3D vnc_display_pw_expire(NULL, when); + assert(opts->protocol =3D=3D DISPLAY_PROTOCOL_VNC); + rc =3D vnc_display_pw_expire(opts->u.vnc.display, when); } =20 if (rc !=3D 0) { diff --git a/qapi/ui.json b/qapi/ui.json index 15cc19dcc5..99ac29ad9c 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -39,20 +39,61 @@ 'data': [ 'fail', 'disconnect', 'keep' ] } =20 ## -# @set_password: +# @SetPasswordOptions: # -# Sets the password of a remote display session. +# General options for set_password. # # @protocol: - 'vnc' to modify the VNC server password # - 'spice' to modify the Spice server password # # @password: the new password # -# @connected: how to handle existing clients when changing the -# password. If nothing is specified, defaults to 'keep' -# 'fail' to fail the command if clients are connected -# 'disconnect' to disconnect existing clients -# 'keep' to maintain existing clients +# Since: 6.2 +# +## +{ 'union': 'SetPasswordOptions', + 'base': { 'protocol': 'DisplayProtocol', + 'password': 'str' }, + 'discriminator': 'protocol', + 'data': { 'vnc': 'SetPasswordOptionsVnc', + 'spice': 'SetPasswordOptionsSpice' } } + +## +# @SetPasswordOptionsSpice: +# +# Options for set_password specific to the SPICE procotol. +# +# @connected: How to handle existing clients when changing the +# password. If nothing is specified, defaults to 'keep'. +# +# Since: 6.2 +# +## +{ 'struct': 'SetPasswordOptionsSpice', + 'data': { '*connected': 'SetPasswordAction' } } + +## +# @SetPasswordOptionsVnc: +# +# Options for set_password specific to the VNC procotol. +# +# @display: The id of the display where the password should be changed. +# Defaults to the first. +# +# @connected: How to handle existing clients when changing the +# password. +# +# Since: 6.2 +# +## +{ 'struct': 'SetPasswordOptionsVnc', + 'data': { '*display': 'str', + '*connected': 'SetPasswordAction' }} + +## +# @set_password: +# +# Set the password of a remote display server. # # Returns: - Nothing on success # - If Spice is not enabled, DeviceNotFound @@ -66,18 +107,16 @@ # <- { "return": {} } # ## -{ 'command': 'set_password', - 'data': { 'protocol': 'DisplayProtocol', - 'password': 'str', - '*connected': 'SetPasswordAction' } } +{ 'command': 'set_password', 'boxed': true, 'data': 'SetPasswordOptions' } =20 ## -# @expire_password: +# @ExpirePasswordOptions: # -# Expire the password of a remote display server. -# -# @protocol: the name of the remote display protocol 'vnc' or 'spice' +# General options for expire_password. # +# @protocol: - 'vnc' to modify the VNC server expiration +# - 'spice' to modify the Spice server expiration + # @time: when to expire the password. # # - 'now' to expire the password immediately @@ -85,16 +124,45 @@ # - '+INT' where INT is the number of seconds from now (integer) # - 'INT' where INT is the absolute time in seconds # -# Returns: - Nothing on success -# - If @protocol is 'spice' and Spice is not active, DeviceNotFou= nd -# -# Since: 0.14 -# # Notes: Time is relative to the server and currently there is no way to # coordinate server time with client time. It is not recommended to # use the absolute time version of the @time parameter unless you're # sure you are on the same machine as the QEMU instance. # +# Since: 6.2 +# +## +{ 'union': 'ExpirePasswordOptions', + 'base': { 'protocol': 'DisplayProtocol', + 'time': 'str' }, + 'discriminator': 'protocol', + 'data': { 'vnc': 'ExpirePasswordOptionsVnc' } } + +## +# @ExpirePasswordOptionsVnc: +# +# Options for expire_password specific to the VNC procotol. +# +# @display: The id of the display where the expiration should be changed. +# Defaults to the first. +# +# Since: 6.2 +# +## + +{ 'struct': 'ExpirePasswordOptionsVnc', + 'data': { '*display': 'str' } } + +## +# @expire_password: +# +# Expire the password of a remote display server. +# +# Returns: - Nothing on success +# - If @protocol is 'spice' and Spice is not active, DeviceNotFou= nd +# +# Since: 0.14 +# # Example: # # -> { "execute": "expire_password", "arguments": { "protocol": "vnc", @@ -102,9 +170,7 @@ # <- { "return": {} } # ## -{ 'command': 'expire_password', - 'data': { 'protocol': 'DisplayProtocol', - 'time': 'str' } } +{ 'command': 'expire_password', 'boxed': true, 'data': 'ExpirePasswordOpti= ons' } =20 ## # @screendump: --=20 2.30.2 From nobody Sat Apr 27 19:23:28 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634810864605389.743456362473; Thu, 21 Oct 2021 03:07:44 -0700 (PDT) Received: from localhost ([::1]:53682 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mdUz9-0007N2-MM for importer@patchew.org; Thu, 21 Oct 2021 06:07:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:55690) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mdUtQ-0001gz-6m for qemu-devel@nongnu.org; Thu, 21 Oct 2021 06:01:48 -0400 Received: from proxmox-new.maurer-it.com ([94.136.29.106]:64823) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mdUtN-0002mi-4W for qemu-devel@nongnu.org; Thu, 21 Oct 2021 06:01:47 -0400 Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id A0A2B45CDB; Thu, 21 Oct 2021 12:01:41 +0200 (CEST) From: Stefan Reiter To: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , "Dr. David Alan Gilbert" , Markus Armbruster , Paolo Bonzini , Eric Blake , Gerd Hoffmann , Wolfgang Bumiller , Thomas Lamprecht Subject: [PATCH v7 4/4] qapi/monitor: only allow 'keep' SetPasswordAction for VNC and deprecate Date: Thu, 21 Oct 2021 12:01:35 +0200 Message-Id: <20211021100135.4146766-5-s.reiter@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211021100135.4146766-1-s.reiter@proxmox.com> References: <20211021100135.4146766-1-s.reiter@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=94.136.29.106; envelope-from=s.reiter@proxmox.com; helo=proxmox-new.maurer-it.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1634810865078100001 Content-Type: text/plain; charset="utf-8" VNC only supports 'keep' here, enforce this via a seperate SetPasswordActionVnc enum and mark the option 'deprecated' (as it is useless with only one value possible). Also add a deprecation note to docs. Suggested-by: Eric Blake Reviewed-by: Markus Armbruster Signed-off-by: Stefan Reiter Acked-by: Gerd Hoffmann --- docs/about/deprecated.rst | 6 ++++++ monitor/qmp-cmds.c | 5 ----- qapi/ui.json | 21 ++++++++++++++++++++- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst index 0bed6ecb1d..f484b058bc 100644 --- a/docs/about/deprecated.rst +++ b/docs/about/deprecated.rst @@ -228,6 +228,12 @@ Use the more generic commands ``block-export-add`` and= ``block-export-del`` instead. As part of this deprecation, where ``nbd-server-add`` used a single ``bitmap``, the new ``block-export-add`` uses a list of ``bitmaps``. =20 +``set_password`` argument ``connected`` for VNC protocol (since 6.2) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +Only the value ``keep`` is and was ever supported for VNC. The (useless) +argument will be dropped in a future version of QEMU. + System accelerators ------------------- =20 diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index 5637bd70b6..4825d0cbea 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -176,11 +176,6 @@ void qmp_set_password(SetPasswordOptions *opts, Error = **errp) opts->u.spice.connected =3D=3D SET_PASSWORD_ACTION_DISCONN= ECT); } else { assert(opts->protocol =3D=3D DISPLAY_PROTOCOL_VNC); - if (opts->u.vnc.connected !=3D SET_PASSWORD_ACTION_KEEP) { - /* vnc supports "connected=3Dkeep" only */ - error_setg(errp, QERR_INVALID_PARAMETER, "connected"); - return; - } /* Note that setting an empty password will not disable login thro= ugh * this interface. */ rc =3D vnc_display_password(opts->u.vnc.display, opts->password); diff --git a/qapi/ui.json b/qapi/ui.json index 99ac29ad9c..5292617b44 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -38,6 +38,20 @@ { 'enum': 'SetPasswordAction', 'data': [ 'fail', 'disconnect', 'keep' ] } =20 +## +# @SetPasswordActionVnc: +# +# See @SetPasswordAction. VNC only supports the keep action. 'connection' +# should just be omitted for VNC, this is kept for backwards compatibility. +# +# @keep: maintain existing clients +# +# Since: 6.2 +# +## +{ 'enum': 'SetPasswordActionVnc', + 'data': [ 'keep' ] } + ## # @SetPasswordOptions: # @@ -83,12 +97,17 @@ # @connected: How to handle existing clients when changing the # password. # +# Features: +# @deprecated: For VNC, @connected will always be 'keep', parameter should= be +# omitted. +# # Since: 6.2 # ## { 'struct': 'SetPasswordOptionsVnc', 'data': { '*display': 'str', - '*connected': 'SetPasswordAction' }} + '*connected': { 'type': 'SetPasswordActionVnc', + 'features': ['deprecated'] } } } =20 ## # @set_password: --=20 2.30.2