xref: /openbmc/qemu/ui/ui-qmp-cmds.c (revision 9949b06e2e95f821a76215194413bb78aa782d53)
1*9949b06eSMarkus Armbruster /*
2*9949b06eSMarkus Armbruster  * QMP commands related to UI
3*9949b06eSMarkus Armbruster  *
4*9949b06eSMarkus Armbruster  * Copyright IBM, Corp. 2011
5*9949b06eSMarkus Armbruster  *
6*9949b06eSMarkus Armbruster  * Authors:
7*9949b06eSMarkus Armbruster  *  Anthony Liguori   <aliguori@us.ibm.com>
8*9949b06eSMarkus Armbruster  *
9*9949b06eSMarkus Armbruster  * This work is licensed under the terms of the GNU GPL, version 2.  See
10*9949b06eSMarkus Armbruster  * the COPYING file in the top-level directory.
11*9949b06eSMarkus Armbruster  *
12*9949b06eSMarkus Armbruster  * Contributions after 2012-01-13 are licensed under the terms of the
13*9949b06eSMarkus Armbruster  * GNU GPL, version 2 or (at your option) any later version.
14*9949b06eSMarkus Armbruster  */
15*9949b06eSMarkus Armbruster 
16*9949b06eSMarkus Armbruster #include "qemu/osdep.h"
17*9949b06eSMarkus Armbruster #include "qapi/qapi-commands-ui.h"
18*9949b06eSMarkus Armbruster #include "qapi/qmp/qerror.h"
19*9949b06eSMarkus Armbruster #include "qemu/cutils.h"
20*9949b06eSMarkus Armbruster #include "ui/console.h"
21*9949b06eSMarkus Armbruster #include "ui/qemu-spice.h"
22*9949b06eSMarkus Armbruster 
23*9949b06eSMarkus Armbruster void qmp_set_password(SetPasswordOptions *opts, Error **errp)
24*9949b06eSMarkus Armbruster {
25*9949b06eSMarkus Armbruster     int rc;
26*9949b06eSMarkus Armbruster 
27*9949b06eSMarkus Armbruster     if (opts->protocol == DISPLAY_PROTOCOL_SPICE) {
28*9949b06eSMarkus Armbruster         if (!qemu_using_spice(errp)) {
29*9949b06eSMarkus Armbruster             return;
30*9949b06eSMarkus Armbruster         }
31*9949b06eSMarkus Armbruster         rc = qemu_spice.set_passwd(opts->password,
32*9949b06eSMarkus Armbruster                 opts->connected == SET_PASSWORD_ACTION_FAIL,
33*9949b06eSMarkus Armbruster                 opts->connected == SET_PASSWORD_ACTION_DISCONNECT);
34*9949b06eSMarkus Armbruster     } else {
35*9949b06eSMarkus Armbruster         assert(opts->protocol == DISPLAY_PROTOCOL_VNC);
36*9949b06eSMarkus Armbruster         if (opts->connected != SET_PASSWORD_ACTION_KEEP) {
37*9949b06eSMarkus Armbruster             /* vnc supports "connected=keep" only */
38*9949b06eSMarkus Armbruster             error_setg(errp, QERR_INVALID_PARAMETER, "connected");
39*9949b06eSMarkus Armbruster             return;
40*9949b06eSMarkus Armbruster         }
41*9949b06eSMarkus Armbruster         /*
42*9949b06eSMarkus Armbruster          * Note that setting an empty password will not disable login
43*9949b06eSMarkus Armbruster          * through this interface.
44*9949b06eSMarkus Armbruster          */
45*9949b06eSMarkus Armbruster         rc = vnc_display_password(opts->u.vnc.display, opts->password);
46*9949b06eSMarkus Armbruster     }
47*9949b06eSMarkus Armbruster 
48*9949b06eSMarkus Armbruster     if (rc != 0) {
49*9949b06eSMarkus Armbruster         error_setg(errp, "Could not set password");
50*9949b06eSMarkus Armbruster     }
51*9949b06eSMarkus Armbruster }
52*9949b06eSMarkus Armbruster 
53*9949b06eSMarkus Armbruster void qmp_expire_password(ExpirePasswordOptions *opts, Error **errp)
54*9949b06eSMarkus Armbruster {
55*9949b06eSMarkus Armbruster     time_t when;
56*9949b06eSMarkus Armbruster     int rc;
57*9949b06eSMarkus Armbruster     const char *whenstr = opts->time;
58*9949b06eSMarkus Armbruster     const char *numstr = NULL;
59*9949b06eSMarkus Armbruster     uint64_t num;
60*9949b06eSMarkus Armbruster 
61*9949b06eSMarkus Armbruster     if (strcmp(whenstr, "now") == 0) {
62*9949b06eSMarkus Armbruster         when = 0;
63*9949b06eSMarkus Armbruster     } else if (strcmp(whenstr, "never") == 0) {
64*9949b06eSMarkus Armbruster         when = TIME_MAX;
65*9949b06eSMarkus Armbruster     } else if (whenstr[0] == '+') {
66*9949b06eSMarkus Armbruster         when = time(NULL);
67*9949b06eSMarkus Armbruster         numstr = whenstr + 1;
68*9949b06eSMarkus Armbruster     } else {
69*9949b06eSMarkus Armbruster         when = 0;
70*9949b06eSMarkus Armbruster         numstr = whenstr;
71*9949b06eSMarkus Armbruster     }
72*9949b06eSMarkus Armbruster 
73*9949b06eSMarkus Armbruster     if (numstr) {
74*9949b06eSMarkus Armbruster         if (qemu_strtou64(numstr, NULL, 10, &num) < 0) {
75*9949b06eSMarkus Armbruster             error_setg(errp, "Parameter 'time' doesn't take value '%s'",
76*9949b06eSMarkus Armbruster                        whenstr);
77*9949b06eSMarkus Armbruster             return;
78*9949b06eSMarkus Armbruster         }
79*9949b06eSMarkus Armbruster         when += num;
80*9949b06eSMarkus Armbruster     }
81*9949b06eSMarkus Armbruster 
82*9949b06eSMarkus Armbruster     if (opts->protocol == DISPLAY_PROTOCOL_SPICE) {
83*9949b06eSMarkus Armbruster         if (!qemu_using_spice(errp)) {
84*9949b06eSMarkus Armbruster             return;
85*9949b06eSMarkus Armbruster         }
86*9949b06eSMarkus Armbruster         rc = qemu_spice.set_pw_expire(when);
87*9949b06eSMarkus Armbruster     } else {
88*9949b06eSMarkus Armbruster         assert(opts->protocol == DISPLAY_PROTOCOL_VNC);
89*9949b06eSMarkus Armbruster         rc = vnc_display_pw_expire(opts->u.vnc.display, when);
90*9949b06eSMarkus Armbruster     }
91*9949b06eSMarkus Armbruster 
92*9949b06eSMarkus Armbruster     if (rc != 0) {
93*9949b06eSMarkus Armbruster         error_setg(errp, "Could not set password expire time");
94*9949b06eSMarkus Armbruster     }
95*9949b06eSMarkus Armbruster }
96*9949b06eSMarkus Armbruster 
97*9949b06eSMarkus Armbruster #ifdef CONFIG_VNC
98*9949b06eSMarkus Armbruster void qmp_change_vnc_password(const char *password, Error **errp)
99*9949b06eSMarkus Armbruster {
100*9949b06eSMarkus Armbruster     if (vnc_display_password(NULL, password) < 0) {
101*9949b06eSMarkus Armbruster         error_setg(errp, "Could not set password");
102*9949b06eSMarkus Armbruster     }
103*9949b06eSMarkus Armbruster }
104*9949b06eSMarkus Armbruster #endif
105*9949b06eSMarkus Armbruster 
106*9949b06eSMarkus Armbruster void qmp_display_reload(DisplayReloadOptions *arg, Error **errp)
107*9949b06eSMarkus Armbruster {
108*9949b06eSMarkus Armbruster     switch (arg->type) {
109*9949b06eSMarkus Armbruster     case DISPLAY_RELOAD_TYPE_VNC:
110*9949b06eSMarkus Armbruster #ifdef CONFIG_VNC
111*9949b06eSMarkus Armbruster         if (arg->u.vnc.has_tls_certs && arg->u.vnc.tls_certs) {
112*9949b06eSMarkus Armbruster             vnc_display_reload_certs(NULL, errp);
113*9949b06eSMarkus Armbruster         }
114*9949b06eSMarkus Armbruster #else
115*9949b06eSMarkus Armbruster         error_setg(errp, "vnc is invalid, missing 'CONFIG_VNC'");
116*9949b06eSMarkus Armbruster #endif
117*9949b06eSMarkus Armbruster         break;
118*9949b06eSMarkus Armbruster     default:
119*9949b06eSMarkus Armbruster         abort();
120*9949b06eSMarkus Armbruster     }
121*9949b06eSMarkus Armbruster }
122*9949b06eSMarkus Armbruster 
123*9949b06eSMarkus Armbruster void qmp_display_update(DisplayUpdateOptions *arg, Error **errp)
124*9949b06eSMarkus Armbruster {
125*9949b06eSMarkus Armbruster     switch (arg->type) {
126*9949b06eSMarkus Armbruster     case DISPLAY_UPDATE_TYPE_VNC:
127*9949b06eSMarkus Armbruster #ifdef CONFIG_VNC
128*9949b06eSMarkus Armbruster         vnc_display_update(&arg->u.vnc, errp);
129*9949b06eSMarkus Armbruster #else
130*9949b06eSMarkus Armbruster         error_setg(errp, "vnc is invalid, missing 'CONFIG_VNC'");
131*9949b06eSMarkus Armbruster #endif
132*9949b06eSMarkus Armbruster         break;
133*9949b06eSMarkus Armbruster     default:
134*9949b06eSMarkus Armbruster         abort();
135*9949b06eSMarkus Armbruster     }
136*9949b06eSMarkus Armbruster }
137