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