qemu/ui/vnc.c
<<
>>
Prefs
   1/*
   2 * QEMU VNC display driver
   3 *
   4 * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
   5 * Copyright (C) 2006 Fabrice Bellard
   6 * Copyright (C) 2009 Red Hat, Inc
   7 *
   8 * Permission is hereby granted, free of charge, to any person obtaining a copy
   9 * of this software and associated documentation files (the "Software"), to deal
  10 * in the Software without restriction, including without limitation the rights
  11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  12 * copies of the Software, and to permit persons to whom the Software is
  13 * furnished to do so, subject to the following conditions:
  14 *
  15 * The above copyright notice and this permission notice shall be included in
  16 * all copies or substantial portions of the Software.
  17 *
  18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  24 * THE SOFTWARE.
  25 */
  26
  27#include "qemu/osdep.h"
  28#include "vnc.h"
  29#include "vnc-jobs.h"
  30#include "trace.h"
  31#include "sysemu/sysemu.h"
  32#include "qemu/error-report.h"
  33#include "qemu/option.h"
  34#include "qemu/sockets.h"
  35#include "qemu/timer.h"
  36#include "qemu/acl.h"
  37#include "qemu/config-file.h"
  38#include "qapi/qapi-events.h"
  39#include "qapi/error.h"
  40#include "qapi/qapi-commands-ui.h"
  41#include "ui/input.h"
  42#include "crypto/hash.h"
  43#include "crypto/tlscredsanon.h"
  44#include "crypto/tlscredsx509.h"
  45#include "qom/object_interfaces.h"
  46#include "qemu/cutils.h"
  47#include "io/dns-resolver.h"
  48
  49#define VNC_REFRESH_INTERVAL_BASE GUI_REFRESH_INTERVAL_DEFAULT
  50#define VNC_REFRESH_INTERVAL_INC  50
  51#define VNC_REFRESH_INTERVAL_MAX  GUI_REFRESH_INTERVAL_IDLE
  52static const struct timeval VNC_REFRESH_STATS = { 0, 500000 };
  53static const struct timeval VNC_REFRESH_LOSSY = { 2, 0 };
  54
  55#include "vnc_keysym.h"
  56#include "crypto/cipher.h"
  57
  58static QTAILQ_HEAD(, VncDisplay) vnc_displays =
  59    QTAILQ_HEAD_INITIALIZER(vnc_displays);
  60
  61static int vnc_cursor_define(VncState *vs);
  62static void vnc_release_modifiers(VncState *vs);
  63static void vnc_update_throttle_offset(VncState *vs);
  64
  65static void vnc_set_share_mode(VncState *vs, VncShareMode mode)
  66{
  67#ifdef _VNC_DEBUG
  68    static const char *mn[] = {
  69        [0]                           = "undefined",
  70        [VNC_SHARE_MODE_CONNECTING]   = "connecting",
  71        [VNC_SHARE_MODE_SHARED]       = "shared",
  72        [VNC_SHARE_MODE_EXCLUSIVE]    = "exclusive",
  73        [VNC_SHARE_MODE_DISCONNECTED] = "disconnected",
  74    };
  75    fprintf(stderr, "%s/%p: %s -> %s\n", __func__,
  76            vs->ioc, mn[vs->share_mode], mn[mode]);
  77#endif
  78
  79    switch (vs->share_mode) {
  80    case VNC_SHARE_MODE_CONNECTING:
  81        vs->vd->num_connecting--;
  82        break;
  83    case VNC_SHARE_MODE_SHARED:
  84        vs->vd->num_shared--;
  85        break;
  86    case VNC_SHARE_MODE_EXCLUSIVE:
  87        vs->vd->num_exclusive--;
  88        break;
  89    default:
  90        break;
  91    }
  92
  93    vs->share_mode = mode;
  94
  95    switch (vs->share_mode) {
  96    case VNC_SHARE_MODE_CONNECTING:
  97        vs->vd->num_connecting++;
  98        break;
  99    case VNC_SHARE_MODE_SHARED:
 100        vs->vd->num_shared++;
 101        break;
 102    case VNC_SHARE_MODE_EXCLUSIVE:
 103        vs->vd->num_exclusive++;
 104        break;
 105    default:
 106        break;
 107    }
 108}
 109
 110
 111static void vnc_init_basic_info(SocketAddress *addr,
 112                                VncBasicInfo *info,
 113                                Error **errp)
 114{
 115    switch (addr->type) {
 116    case SOCKET_ADDRESS_TYPE_INET:
 117        info->host = g_strdup(addr->u.inet.host);
 118        info->service = g_strdup(addr->u.inet.port);
 119        if (addr->u.inet.ipv6) {
 120            info->family = NETWORK_ADDRESS_FAMILY_IPV6;
 121        } else {
 122            info->family = NETWORK_ADDRESS_FAMILY_IPV4;
 123        }
 124        break;
 125
 126    case SOCKET_ADDRESS_TYPE_UNIX:
 127        info->host = g_strdup("");
 128        info->service = g_strdup(addr->u.q_unix.path);
 129        info->family = NETWORK_ADDRESS_FAMILY_UNIX;
 130        break;
 131
 132    case SOCKET_ADDRESS_TYPE_VSOCK:
 133    case SOCKET_ADDRESS_TYPE_FD:
 134        error_setg(errp, "Unsupported socket address type %s",
 135                   SocketAddressType_str(addr->type));
 136        break;
 137    default:
 138        abort();
 139    }
 140
 141    return;
 142}
 143
 144static void vnc_init_basic_info_from_server_addr(QIOChannelSocket *ioc,
 145                                                 VncBasicInfo *info,
 146                                                 Error **errp)
 147{
 148    SocketAddress *addr = NULL;
 149
 150    if (!ioc) {
 151        error_setg(errp, "No listener socket available");
 152        return;
 153    }
 154
 155    addr = qio_channel_socket_get_local_address(ioc, errp);
 156    if (!addr) {
 157        return;
 158    }
 159
 160    vnc_init_basic_info(addr, info, errp);
 161    qapi_free_SocketAddress(addr);
 162}
 163
 164static void vnc_init_basic_info_from_remote_addr(QIOChannelSocket *ioc,
 165                                                 VncBasicInfo *info,
 166                                                 Error **errp)
 167{
 168    SocketAddress *addr = NULL;
 169
 170    addr = qio_channel_socket_get_remote_address(ioc, errp);
 171    if (!addr) {
 172        return;
 173    }
 174
 175    vnc_init_basic_info(addr, info, errp);
 176    qapi_free_SocketAddress(addr);
 177}
 178
 179static const char *vnc_auth_name(VncDisplay *vd) {
 180    switch (vd->auth) {
 181    case VNC_AUTH_INVALID:
 182        return "invalid";
 183    case VNC_AUTH_NONE:
 184        return "none";
 185    case VNC_AUTH_VNC:
 186        return "vnc";
 187    case VNC_AUTH_RA2:
 188        return "ra2";
 189    case VNC_AUTH_RA2NE:
 190        return "ra2ne";
 191    case VNC_AUTH_TIGHT:
 192        return "tight";
 193    case VNC_AUTH_ULTRA:
 194        return "ultra";
 195    case VNC_AUTH_TLS:
 196        return "tls";
 197    case VNC_AUTH_VENCRYPT:
 198        switch (vd->subauth) {
 199        case VNC_AUTH_VENCRYPT_PLAIN:
 200            return "vencrypt+plain";
 201        case VNC_AUTH_VENCRYPT_TLSNONE:
 202            return "vencrypt+tls+none";
 203        case VNC_AUTH_VENCRYPT_TLSVNC:
 204            return "vencrypt+tls+vnc";
 205        case VNC_AUTH_VENCRYPT_TLSPLAIN:
 206            return "vencrypt+tls+plain";
 207        case VNC_AUTH_VENCRYPT_X509NONE:
 208            return "vencrypt+x509+none";
 209        case VNC_AUTH_VENCRYPT_X509VNC:
 210            return "vencrypt+x509+vnc";
 211        case VNC_AUTH_VENCRYPT_X509PLAIN:
 212            return "vencrypt+x509+plain";
 213        case VNC_AUTH_VENCRYPT_TLSSASL:
 214            return "vencrypt+tls+sasl";
 215        case VNC_AUTH_VENCRYPT_X509SASL:
 216            return "vencrypt+x509+sasl";
 217        default:
 218            return "vencrypt";
 219        }
 220    case VNC_AUTH_SASL:
 221        return "sasl";
 222    }
 223    return "unknown";
 224}
 225
 226static VncServerInfo *vnc_server_info_get(VncDisplay *vd)
 227{
 228    VncServerInfo *info;
 229    Error *err = NULL;
 230
 231    if (!vd->listener || !vd->listener->nsioc) {
 232        return NULL;
 233    }
 234
 235    info = g_malloc0(sizeof(*info));
 236    vnc_init_basic_info_from_server_addr(vd->listener->sioc[0],
 237                                         qapi_VncServerInfo_base(info), &err);
 238    info->has_auth = true;
 239    info->auth = g_strdup(vnc_auth_name(vd));
 240    if (err) {
 241        qapi_free_VncServerInfo(info);
 242        info = NULL;
 243        error_free(err);
 244    }
 245    return info;
 246}
 247
 248static void vnc_client_cache_auth(VncState *client)
 249{
 250    if (!client->info) {
 251        return;
 252    }
 253
 254    if (client->tls) {
 255        client->info->x509_dname =
 256            qcrypto_tls_session_get_peer_name(client->tls);
 257        client->info->has_x509_dname =
 258            client->info->x509_dname != NULL;
 259    }
 260#ifdef CONFIG_VNC_SASL
 261    if (client->sasl.conn &&
 262        client->sasl.username) {
 263        client->info->has_sasl_username = true;
 264        client->info->sasl_username = g_strdup(client->sasl.username);
 265    }
 266#endif
 267}
 268
 269static void vnc_client_cache_addr(VncState *client)
 270{
 271    Error *err = NULL;
 272
 273    client->info = g_malloc0(sizeof(*client->info));
 274    vnc_init_basic_info_from_remote_addr(client->sioc,
 275                                         qapi_VncClientInfo_base(client->info),
 276                                         &err);
 277    if (err) {
 278        qapi_free_VncClientInfo(client->info);
 279        client->info = NULL;
 280        error_free(err);
 281    }
 282}
 283
 284static void vnc_qmp_event(VncState *vs, QAPIEvent event)
 285{
 286    VncServerInfo *si;
 287
 288    if (!vs->info) {
 289        return;
 290    }
 291
 292    si = vnc_server_info_get(vs->vd);
 293    if (!si) {
 294        return;
 295    }
 296
 297    switch (event) {
 298    case QAPI_EVENT_VNC_CONNECTED:
 299        qapi_event_send_vnc_connected(si, qapi_VncClientInfo_base(vs->info),
 300                                      &error_abort);
 301        break;
 302    case QAPI_EVENT_VNC_INITIALIZED:
 303        qapi_event_send_vnc_initialized(si, vs->info, &error_abort);
 304        break;
 305    case QAPI_EVENT_VNC_DISCONNECTED:
 306        qapi_event_send_vnc_disconnected(si, vs->info, &error_abort);
 307        break;
 308    default:
 309        break;
 310    }
 311
 312    qapi_free_VncServerInfo(si);
 313}
 314
 315static VncClientInfo *qmp_query_vnc_client(const VncState *client)
 316{
 317    VncClientInfo *info;
 318    Error *err = NULL;
 319
 320    info = g_malloc0(sizeof(*info));
 321
 322    vnc_init_basic_info_from_remote_addr(client->sioc,
 323                                         qapi_VncClientInfo_base(info),
 324                                         &err);
 325    if (err) {
 326        error_free(err);
 327        qapi_free_VncClientInfo(info);
 328        return NULL;
 329    }
 330
 331    info->websocket = client->websocket;
 332
 333    if (client->tls) {
 334        info->x509_dname = qcrypto_tls_session_get_peer_name(client->tls);
 335        info->has_x509_dname = info->x509_dname != NULL;
 336    }
 337#ifdef CONFIG_VNC_SASL
 338    if (client->sasl.conn && client->sasl.username) {
 339        info->has_sasl_username = true;
 340        info->sasl_username = g_strdup(client->sasl.username);
 341    }
 342#endif
 343
 344    return info;
 345}
 346
 347static VncDisplay *vnc_display_find(const char *id)
 348{
 349    VncDisplay *vd;
 350
 351    if (id == NULL) {
 352        return QTAILQ_FIRST(&vnc_displays);
 353    }
 354    QTAILQ_FOREACH(vd, &vnc_displays, next) {
 355        if (strcmp(id, vd->id) == 0) {
 356            return vd;
 357        }
 358    }
 359    return NULL;
 360}
 361
 362static VncClientInfoList *qmp_query_client_list(VncDisplay *vd)
 363{
 364    VncClientInfoList *cinfo, *prev = NULL;
 365    VncState *client;
 366
 367    QTAILQ_FOREACH(client, &vd->clients, next) {
 368        cinfo = g_new0(VncClientInfoList, 1);
 369        cinfo->value = qmp_query_vnc_client(client);
 370        cinfo->next = prev;
 371        prev = cinfo;
 372    }
 373    return prev;
 374}
 375
 376VncInfo *qmp_query_vnc(Error **errp)
 377{
 378    VncInfo *info = g_malloc0(sizeof(*info));
 379    VncDisplay *vd = vnc_display_find(NULL);
 380    SocketAddress *addr = NULL;
 381
 382    if (vd == NULL || !vd->listener || !vd->listener->nsioc) {
 383        info->enabled = false;
 384    } else {
 385        info->enabled = true;
 386
 387        /* for compatibility with the original command */
 388        info->has_clients = true;
 389        info->clients = qmp_query_client_list(vd);
 390
 391        addr = qio_channel_socket_get_local_address(vd->listener->sioc[0],
 392                                                    errp);
 393        if (!addr) {
 394            goto out_error;
 395        }
 396
 397        switch (addr->type) {
 398        case SOCKET_ADDRESS_TYPE_INET:
 399            info->host = g_strdup(addr->u.inet.host);
 400            info->service = g_strdup(addr->u.inet.port);
 401            if (addr->u.inet.ipv6) {
 402                info->family = NETWORK_ADDRESS_FAMILY_IPV6;
 403            } else {
 404                info->family = NETWORK_ADDRESS_FAMILY_IPV4;
 405            }
 406            break;
 407
 408        case SOCKET_ADDRESS_TYPE_UNIX:
 409            info->host = g_strdup("");
 410            info->service = g_strdup(addr->u.q_unix.path);
 411            info->family = NETWORK_ADDRESS_FAMILY_UNIX;
 412            break;
 413
 414        case SOCKET_ADDRESS_TYPE_VSOCK:
 415        case SOCKET_ADDRESS_TYPE_FD:
 416            error_setg(errp, "Unsupported socket address type %s",
 417                       SocketAddressType_str(addr->type));
 418            goto out_error;
 419        default:
 420            abort();
 421        }
 422
 423        info->has_host = true;
 424        info->has_service = true;
 425        info->has_family = true;
 426
 427        info->has_auth = true;
 428        info->auth = g_strdup(vnc_auth_name(vd));
 429    }
 430
 431    qapi_free_SocketAddress(addr);
 432    return info;
 433
 434out_error:
 435    qapi_free_SocketAddress(addr);
 436    qapi_free_VncInfo(info);
 437    return NULL;
 438}
 439
 440
 441static void qmp_query_auth(int auth, int subauth,
 442                           VncPrimaryAuth *qmp_auth,
 443                           VncVencryptSubAuth *qmp_vencrypt,
 444                           bool *qmp_has_vencrypt);
 445
 446static VncServerInfo2List *qmp_query_server_entry(QIOChannelSocket *ioc,
 447                                                  bool websocket,
 448                                                  int auth,
 449                                                  int subauth,
 450                                                  VncServerInfo2List *prev)
 451{
 452    VncServerInfo2List *list;
 453    VncServerInfo2 *info;
 454    Error *err = NULL;
 455    SocketAddress *addr;
 456
 457    addr = qio_channel_socket_get_local_address(ioc, &err);
 458    if (!addr) {
 459        error_free(err);
 460        return prev;
 461    }
 462
 463    info = g_new0(VncServerInfo2, 1);
 464    vnc_init_basic_info(addr, qapi_VncServerInfo2_base(info), &err);
 465    qapi_free_SocketAddress(addr);
 466    if (err) {
 467        qapi_free_VncServerInfo2(info);
 468        error_free(err);
 469        return prev;
 470    }
 471    info->websocket = websocket;
 472
 473    qmp_query_auth(auth, subauth, &info->auth,
 474                   &info->vencrypt, &info->has_vencrypt);
 475
 476    list = g_new0(VncServerInfo2List, 1);
 477    list->value = info;
 478    list->next = prev;
 479    return list;
 480}
 481
 482static void qmp_query_auth(int auth, int subauth,
 483                           VncPrimaryAuth *qmp_auth,
 484                           VncVencryptSubAuth *qmp_vencrypt,
 485                           bool *qmp_has_vencrypt)
 486{
 487    switch (auth) {
 488    case VNC_AUTH_VNC:
 489        *qmp_auth = VNC_PRIMARY_AUTH_VNC;
 490        break;
 491    case VNC_AUTH_RA2:
 492        *qmp_auth = VNC_PRIMARY_AUTH_RA2;
 493        break;
 494    case VNC_AUTH_RA2NE:
 495        *qmp_auth = VNC_PRIMARY_AUTH_RA2NE;
 496        break;
 497    case VNC_AUTH_TIGHT:
 498        *qmp_auth = VNC_PRIMARY_AUTH_TIGHT;
 499        break;
 500    case VNC_AUTH_ULTRA:
 501        *qmp_auth = VNC_PRIMARY_AUTH_ULTRA;
 502        break;
 503    case VNC_AUTH_TLS:
 504        *qmp_auth = VNC_PRIMARY_AUTH_TLS;
 505        break;
 506    case VNC_AUTH_VENCRYPT:
 507        *qmp_auth = VNC_PRIMARY_AUTH_VENCRYPT;
 508        *qmp_has_vencrypt = true;
 509        switch (subauth) {
 510        case VNC_AUTH_VENCRYPT_PLAIN:
 511            *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_PLAIN;
 512            break;
 513        case VNC_AUTH_VENCRYPT_TLSNONE:
 514            *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_NONE;
 515            break;
 516        case VNC_AUTH_VENCRYPT_TLSVNC:
 517            *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_VNC;
 518            break;
 519        case VNC_AUTH_VENCRYPT_TLSPLAIN:
 520            *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_PLAIN;
 521            break;
 522        case VNC_AUTH_VENCRYPT_X509NONE:
 523            *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_NONE;
 524            break;
 525        case VNC_AUTH_VENCRYPT_X509VNC:
 526            *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_VNC;
 527            break;
 528        case VNC_AUTH_VENCRYPT_X509PLAIN:
 529            *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_PLAIN;
 530            break;
 531        case VNC_AUTH_VENCRYPT_TLSSASL:
 532            *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_SASL;
 533            break;
 534        case VNC_AUTH_VENCRYPT_X509SASL:
 535            *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_SASL;
 536            break;
 537        default:
 538            *qmp_has_vencrypt = false;
 539            break;
 540        }
 541        break;
 542    case VNC_AUTH_SASL:
 543        *qmp_auth = VNC_PRIMARY_AUTH_SASL;
 544        break;
 545    case VNC_AUTH_NONE:
 546    default:
 547        *qmp_auth = VNC_PRIMARY_AUTH_NONE;
 548        break;
 549    }
 550}
 551
 552VncInfo2List *qmp_query_vnc_servers(Error **errp)
 553{
 554    VncInfo2List *item, *prev = NULL;
 555    VncInfo2 *info;
 556    VncDisplay *vd;
 557    DeviceState *dev;
 558    size_t i;
 559
 560    QTAILQ_FOREACH(vd, &vnc_displays, next) {
 561        info = g_new0(VncInfo2, 1);
 562        info->id = g_strdup(vd->id);
 563        info->clients = qmp_query_client_list(vd);
 564        qmp_query_auth(vd->auth, vd->subauth, &info->auth,
 565                       &info->vencrypt, &info->has_vencrypt);
 566        if (vd->dcl.con) {
 567            dev = DEVICE(object_property_get_link(OBJECT(vd->dcl.con),
 568                                                  "device", NULL));
 569            info->has_display = true;
 570            info->display = g_strdup(dev->id);
 571        }
 572        for (i = 0; vd->listener != NULL && i < vd->listener->nsioc; i++) {
 573            info->server = qmp_query_server_entry(
 574                vd->listener->sioc[i], false, vd->auth, vd->subauth,
 575                info->server);
 576        }
 577        for (i = 0; vd->wslistener != NULL && i < vd->wslistener->nsioc; i++) {
 578            info->server = qmp_query_server_entry(
 579                vd->wslistener->sioc[i], true, vd->ws_auth,
 580                vd->ws_subauth, info->server);
 581        }
 582
 583        item = g_new0(VncInfo2List, 1);
 584        item->value = info;
 585        item->next = prev;
 586        prev = item;
 587    }
 588    return prev;
 589}
 590
 591/* TODO
 592   1) Get the queue working for IO.
 593   2) there is some weirdness when using the -S option (the screen is grey
 594      and not totally invalidated
 595   3) resolutions > 1024
 596*/
 597
 598static int vnc_update_client(VncState *vs, int has_dirty);
 599static void vnc_disconnect_start(VncState *vs);
 600
 601static void vnc_colordepth(VncState *vs);
 602static void framebuffer_update_request(VncState *vs, int incremental,
 603                                       int x_position, int y_position,
 604                                       int w, int h);
 605static void vnc_refresh(DisplayChangeListener *dcl);
 606static int vnc_refresh_server_surface(VncDisplay *vd);
 607
 608static int vnc_width(VncDisplay *vd)
 609{
 610    return MIN(VNC_MAX_WIDTH, ROUND_UP(surface_width(vd->ds),
 611                                       VNC_DIRTY_PIXELS_PER_BIT));
 612}
 613
 614static int vnc_height(VncDisplay *vd)
 615{
 616    return MIN(VNC_MAX_HEIGHT, surface_height(vd->ds));
 617}
 618
 619static void vnc_set_area_dirty(DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT],
 620                               VNC_MAX_WIDTH / VNC_DIRTY_PIXELS_PER_BIT),
 621                               VncDisplay *vd,
 622                               int x, int y, int w, int h)
 623{
 624    int width = vnc_width(vd);
 625    int height = vnc_height(vd);
 626
 627    /* this is needed this to ensure we updated all affected
 628     * blocks if x % VNC_DIRTY_PIXELS_PER_BIT != 0 */
 629    w += (x % VNC_DIRTY_PIXELS_PER_BIT);
 630    x -= (x % VNC_DIRTY_PIXELS_PER_BIT);
 631
 632    x = MIN(x, width);
 633    y = MIN(y, height);
 634    w = MIN(x + w, width) - x;
 635    h = MIN(y + h, height);
 636
 637    for (; y < h; y++) {
 638        bitmap_set(dirty[y], x / VNC_DIRTY_PIXELS_PER_BIT,
 639                   DIV_ROUND_UP(w, VNC_DIRTY_PIXELS_PER_BIT));
 640    }
 641}
 642
 643static void vnc_dpy_update(DisplayChangeListener *dcl,
 644                           int x, int y, int w, int h)
 645{
 646    VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
 647    struct VncSurface *s = &vd->guest;
 648
 649    vnc_set_area_dirty(s->dirty, vd, x, y, w, h);
 650}
 651
 652void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
 653                            int32_t encoding)
 654{
 655    vnc_write_u16(vs, x);
 656    vnc_write_u16(vs, y);
 657    vnc_write_u16(vs, w);
 658    vnc_write_u16(vs, h);
 659
 660    vnc_write_s32(vs, encoding);
 661}
 662
 663
 664static void vnc_desktop_resize(VncState *vs)
 665{
 666    if (vs->ioc == NULL || !vnc_has_feature(vs, VNC_FEATURE_RESIZE)) {
 667        return;
 668    }
 669    if (vs->client_width == pixman_image_get_width(vs->vd->server) &&
 670        vs->client_height == pixman_image_get_height(vs->vd->server)) {
 671        return;
 672    }
 673
 674    assert(pixman_image_get_width(vs->vd->server) < 65536 &&
 675           pixman_image_get_width(vs->vd->server) >= 0);
 676    assert(pixman_image_get_height(vs->vd->server) < 65536 &&
 677           pixman_image_get_height(vs->vd->server) >= 0);
 678    vs->client_width = pixman_image_get_width(vs->vd->server);
 679    vs->client_height = pixman_image_get_height(vs->vd->server);
 680    vnc_lock_output(vs);
 681    vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
 682    vnc_write_u8(vs, 0);
 683    vnc_write_u16(vs, 1); /* number of rects */
 684    vnc_framebuffer_update(vs, 0, 0, vs->client_width, vs->client_height,
 685                           VNC_ENCODING_DESKTOPRESIZE);
 686    vnc_unlock_output(vs);
 687    vnc_flush(vs);
 688}
 689
 690static void vnc_abort_display_jobs(VncDisplay *vd)
 691{
 692    VncState *vs;
 693
 694    QTAILQ_FOREACH(vs, &vd->clients, next) {
 695        vnc_lock_output(vs);
 696        vs->abort = true;
 697        vnc_unlock_output(vs);
 698    }
 699    QTAILQ_FOREACH(vs, &vd->clients, next) {
 700        vnc_jobs_join(vs);
 701    }
 702    QTAILQ_FOREACH(vs, &vd->clients, next) {
 703        vnc_lock_output(vs);
 704        vs->abort = false;
 705        vnc_unlock_output(vs);
 706    }
 707}
 708
 709int vnc_server_fb_stride(VncDisplay *vd)
 710{
 711    return pixman_image_get_stride(vd->server);
 712}
 713
 714void *vnc_server_fb_ptr(VncDisplay *vd, int x, int y)
 715{
 716    uint8_t *ptr;
 717
 718    ptr  = (uint8_t *)pixman_image_get_data(vd->server);
 719    ptr += y * vnc_server_fb_stride(vd);
 720    ptr += x * VNC_SERVER_FB_BYTES;
 721    return ptr;
 722}
 723
 724static void vnc_update_server_surface(VncDisplay *vd)
 725{
 726    int width, height;
 727
 728    qemu_pixman_image_unref(vd->server);
 729    vd->server = NULL;
 730
 731    if (QTAILQ_EMPTY(&vd->clients)) {
 732        return;
 733    }
 734
 735    width = vnc_width(vd);
 736    height = vnc_height(vd);
 737    vd->server = pixman_image_create_bits(VNC_SERVER_FB_FORMAT,
 738                                          width, height,
 739                                          NULL, 0);
 740
 741    memset(vd->guest.dirty, 0x00, sizeof(vd->guest.dirty));
 742    vnc_set_area_dirty(vd->guest.dirty, vd, 0, 0,
 743                       width, height);
 744}
 745
 746static void vnc_dpy_switch(DisplayChangeListener *dcl,
 747                           DisplaySurface *surface)
 748{
 749    static const char placeholder_msg[] =
 750        "Display output is not active.";
 751    static DisplaySurface *placeholder;
 752    VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
 753    VncState *vs;
 754
 755    if (surface == NULL) {
 756        if (placeholder == NULL) {
 757            placeholder = qemu_create_message_surface(640, 480, placeholder_msg);
 758        }
 759        surface = placeholder;
 760    }
 761
 762    vnc_abort_display_jobs(vd);
 763    vd->ds = surface;
 764
 765    /* server surface */
 766    vnc_update_server_surface(vd);
 767
 768    /* guest surface */
 769    qemu_pixman_image_unref(vd->guest.fb);
 770    vd->guest.fb = pixman_image_ref(surface->image);
 771    vd->guest.format = surface->format;
 772
 773    QTAILQ_FOREACH(vs, &vd->clients, next) {
 774        vnc_colordepth(vs);
 775        vnc_desktop_resize(vs);
 776        if (vs->vd->cursor) {
 777            vnc_cursor_define(vs);
 778        }
 779        memset(vs->dirty, 0x00, sizeof(vs->dirty));
 780        vnc_set_area_dirty(vs->dirty, vd, 0, 0,
 781                           vnc_width(vd),
 782                           vnc_height(vd));
 783        vnc_update_throttle_offset(vs);
 784    }
 785}
 786
 787/* fastest code */
 788static void vnc_write_pixels_copy(VncState *vs,
 789                                  void *pixels, int size)
 790{
 791    vnc_write(vs, pixels, size);
 792}
 793
 794/* slowest but generic code. */
 795void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v)
 796{
 797    uint8_t r, g, b;
 798
 799#if VNC_SERVER_FB_FORMAT == PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
 800    r = (((v & 0x00ff0000) >> 16) << vs->client_pf.rbits) >> 8;
 801    g = (((v & 0x0000ff00) >>  8) << vs->client_pf.gbits) >> 8;
 802    b = (((v & 0x000000ff) >>  0) << vs->client_pf.bbits) >> 8;
 803#else
 804# error need some bits here if you change VNC_SERVER_FB_FORMAT
 805#endif
 806    v = (r << vs->client_pf.rshift) |
 807        (g << vs->client_pf.gshift) |
 808        (b << vs->client_pf.bshift);
 809    switch (vs->client_pf.bytes_per_pixel) {
 810    case 1:
 811        buf[0] = v;
 812        break;
 813    case 2:
 814        if (vs->client_be) {
 815            buf[0] = v >> 8;
 816            buf[1] = v;
 817        } else {
 818            buf[1] = v >> 8;
 819            buf[0] = v;
 820        }
 821        break;
 822    default:
 823    case 4:
 824        if (vs->client_be) {
 825            buf[0] = v >> 24;
 826            buf[1] = v >> 16;
 827            buf[2] = v >> 8;
 828            buf[3] = v;
 829        } else {
 830            buf[3] = v >> 24;
 831            buf[2] = v >> 16;
 832            buf[1] = v >> 8;
 833            buf[0] = v;
 834        }
 835        break;
 836    }
 837}
 838
 839static void vnc_write_pixels_generic(VncState *vs,
 840                                     void *pixels1, int size)
 841{
 842    uint8_t buf[4];
 843
 844    if (VNC_SERVER_FB_BYTES == 4) {
 845        uint32_t *pixels = pixels1;
 846        int n, i;
 847        n = size >> 2;
 848        for (i = 0; i < n; i++) {
 849            vnc_convert_pixel(vs, buf, pixels[i]);
 850            vnc_write(vs, buf, vs->client_pf.bytes_per_pixel);
 851        }
 852    }
 853}
 854
 855int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
 856{
 857    int i;
 858    uint8_t *row;
 859    VncDisplay *vd = vs->vd;
 860
 861    row = vnc_server_fb_ptr(vd, x, y);
 862    for (i = 0; i < h; i++) {
 863        vs->write_pixels(vs, row, w * VNC_SERVER_FB_BYTES);
 864        row += vnc_server_fb_stride(vd);
 865    }
 866    return 1;
 867}
 868
 869int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
 870{
 871    int n = 0;
 872    bool encode_raw = false;
 873    size_t saved_offs = vs->output.offset;
 874
 875    switch(vs->vnc_encoding) {
 876        case VNC_ENCODING_ZLIB:
 877            n = vnc_zlib_send_framebuffer_update(vs, x, y, w, h);
 878            break;
 879        case VNC_ENCODING_HEXTILE:
 880            vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_HEXTILE);
 881            n = vnc_hextile_send_framebuffer_update(vs, x, y, w, h);
 882            break;
 883        case VNC_ENCODING_TIGHT:
 884            n = vnc_tight_send_framebuffer_update(vs, x, y, w, h);
 885            break;
 886        case VNC_ENCODING_TIGHT_PNG:
 887            n = vnc_tight_png_send_framebuffer_update(vs, x, y, w, h);
 888            break;
 889        case VNC_ENCODING_ZRLE:
 890            n = vnc_zrle_send_framebuffer_update(vs, x, y, w, h);
 891            break;
 892        case VNC_ENCODING_ZYWRLE:
 893            n = vnc_zywrle_send_framebuffer_update(vs, x, y, w, h);
 894            break;
 895        default:
 896            encode_raw = true;
 897            break;
 898    }
 899
 900    /* If the client has the same pixel format as our internal buffer and
 901     * a RAW encoding would need less space fall back to RAW encoding to
 902     * save bandwidth and processing power in the client. */
 903    if (!encode_raw && vs->write_pixels == vnc_write_pixels_copy &&
 904        12 + h * w * VNC_SERVER_FB_BYTES <= (vs->output.offset - saved_offs)) {
 905        vs->output.offset = saved_offs;
 906        encode_raw = true;
 907    }
 908
 909    if (encode_raw) {
 910        vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_RAW);
 911        n = vnc_raw_send_framebuffer_update(vs, x, y, w, h);
 912    }
 913
 914    return n;
 915}
 916
 917static void vnc_mouse_set(DisplayChangeListener *dcl,
 918                          int x, int y, int visible)
 919{
 920    /* can we ask the client(s) to move the pointer ??? */
 921}
 922
 923static int vnc_cursor_define(VncState *vs)
 924{
 925    QEMUCursor *c = vs->vd->cursor;
 926    int isize;
 927
 928    if (vnc_has_feature(vs, VNC_FEATURE_RICH_CURSOR)) {
 929        vnc_lock_output(vs);
 930        vnc_write_u8(vs,  VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
 931        vnc_write_u8(vs,  0);  /*  padding     */
 932        vnc_write_u16(vs, 1);  /*  # of rects  */
 933        vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height,
 934                               VNC_ENCODING_RICH_CURSOR);
 935        isize = c->width * c->height * vs->client_pf.bytes_per_pixel;
 936        vnc_write_pixels_generic(vs, c->data, isize);
 937        vnc_write(vs, vs->vd->cursor_mask, vs->vd->cursor_msize);
 938        vnc_unlock_output(vs);
 939        return 0;
 940    }
 941    return -1;
 942}
 943
 944static void vnc_dpy_cursor_define(DisplayChangeListener *dcl,
 945                                  QEMUCursor *c)
 946{
 947    VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
 948    VncState *vs;
 949
 950    cursor_put(vd->cursor);
 951    g_free(vd->cursor_mask);
 952
 953    vd->cursor = c;
 954    cursor_get(vd->cursor);
 955    vd->cursor_msize = cursor_get_mono_bpl(c) * c->height;
 956    vd->cursor_mask = g_malloc0(vd->cursor_msize);
 957    cursor_get_mono_mask(c, 0, vd->cursor_mask);
 958
 959    QTAILQ_FOREACH(vs, &vd->clients, next) {
 960        vnc_cursor_define(vs);
 961    }
 962}
 963
 964static int find_and_clear_dirty_height(VncState *vs,
 965                                       int y, int last_x, int x, int height)
 966{
 967    int h;
 968
 969    for (h = 1; h < (height - y); h++) {
 970        if (!test_bit(last_x, vs->dirty[y + h])) {
 971            break;
 972        }
 973        bitmap_clear(vs->dirty[y + h], last_x, x - last_x);
 974    }
 975
 976    return h;
 977}
 978
 979/*
 980 * Figure out how much pending data we should allow in the output
 981 * buffer before we throttle incremental display updates, and/or
 982 * drop audio samples.
 983 *
 984 * We allow for equiv of 1 full display's worth of FB updates,
 985 * and 1 second of audio samples. If audio backlog was larger
 986 * than that the client would already suffering awful audio
 987 * glitches, so dropping samples is no worse really).
 988 */
 989static void vnc_update_throttle_offset(VncState *vs)
 990{
 991    size_t offset =
 992        vs->client_width * vs->client_height * vs->client_pf.bytes_per_pixel;
 993
 994    if (vs->audio_cap) {
 995        int bps;
 996        switch (vs->as.fmt) {
 997        default:
 998        case  AUD_FMT_U8:
 999        case  AUD_FMT_S8:
1000            bps = 1;
1001            break;
1002        case  AUD_FMT_U16:
1003        case  AUD_FMT_S16:
1004            bps = 2;
1005            break;
1006        case  AUD_FMT_U32:
1007        case  AUD_FMT_S32:
1008            bps = 4;
1009            break;
1010        }
1011        offset += vs->as.freq * bps * vs->as.nchannels;
1012    }
1013
1014    /* Put a floor of 1MB on offset, so that if we have a large pending
1015     * buffer and the display is resized to a small size & back again
1016     * we don't suddenly apply a tiny send limit
1017     */
1018    offset = MAX(offset, 1024 * 1024);
1019
1020    if (vs->throttle_output_offset != offset) {
1021        trace_vnc_client_throttle_threshold(
1022            vs, vs->ioc, vs->throttle_output_offset, offset, vs->client_width,
1023            vs->client_height, vs->client_pf.bytes_per_pixel, vs->audio_cap);
1024    }
1025
1026    vs->throttle_output_offset = offset;
1027}
1028
1029static bool vnc_should_update(VncState *vs)
1030{
1031    switch (vs->update) {
1032    case VNC_STATE_UPDATE_NONE:
1033        break;
1034    case VNC_STATE_UPDATE_INCREMENTAL:
1035        /* Only allow incremental updates if the pending send queue
1036         * is less than the permitted threshold, and the job worker
1037         * is completely idle.
1038         */
1039        if (vs->output.offset < vs->throttle_output_offset &&
1040            vs->job_update == VNC_STATE_UPDATE_NONE) {
1041            return true;
1042        }
1043        trace_vnc_client_throttle_incremental(
1044            vs, vs->ioc, vs->job_update, vs->output.offset);
1045        break;
1046    case VNC_STATE_UPDATE_FORCE:
1047        /* Only allow forced updates if the pending send queue
1048         * does not contain a previous forced update, and the
1049         * job worker is completely idle.
1050         *
1051         * Note this means we'll queue a forced update, even if
1052         * the output buffer size is otherwise over the throttle
1053         * output limit.
1054         */
1055        if (vs->force_update_offset == 0 &&
1056            vs->job_update == VNC_STATE_UPDATE_NONE) {
1057            return true;
1058        }
1059        trace_vnc_client_throttle_forced(
1060            vs, vs->ioc, vs->job_update, vs->force_update_offset);
1061        break;
1062    }
1063    return false;
1064}
1065
1066static int vnc_update_client(VncState *vs, int has_dirty)
1067{
1068    VncDisplay *vd = vs->vd;
1069    VncJob *job;
1070    int y;
1071    int height, width;
1072    int n = 0;
1073
1074    if (vs->disconnecting) {
1075        vnc_disconnect_finish(vs);
1076        return 0;
1077    }
1078
1079    vs->has_dirty += has_dirty;
1080    if (!vnc_should_update(vs)) {
1081        return 0;
1082    }
1083
1084    if (!vs->has_dirty && vs->update != VNC_STATE_UPDATE_FORCE) {
1085        return 0;
1086    }
1087
1088    /*
1089     * Send screen updates to the vnc client using the server
1090     * surface and server dirty map.  guest surface updates
1091     * happening in parallel don't disturb us, the next pass will
1092     * send them to the client.
1093     */
1094    job = vnc_job_new(vs);
1095
1096    height = pixman_image_get_height(vd->server);
1097    width = pixman_image_get_width(vd->server);
1098
1099    y = 0;
1100    for (;;) {
1101        int x, h;
1102        unsigned long x2;
1103        unsigned long offset = find_next_bit((unsigned long *) &vs->dirty,
1104                                             height * VNC_DIRTY_BPL(vs),
1105                                             y * VNC_DIRTY_BPL(vs));
1106        if (offset == height * VNC_DIRTY_BPL(vs)) {
1107            /* no more dirty bits */
1108            break;
1109        }
1110        y = offset / VNC_DIRTY_BPL(vs);
1111        x = offset % VNC_DIRTY_BPL(vs);
1112        x2 = find_next_zero_bit((unsigned long *) &vs->dirty[y],
1113                                VNC_DIRTY_BPL(vs), x);
1114        bitmap_clear(vs->dirty[y], x, x2 - x);
1115        h = find_and_clear_dirty_height(vs, y, x, x2, height);
1116        x2 = MIN(x2, width / VNC_DIRTY_PIXELS_PER_BIT);
1117        if (x2 > x) {
1118            n += vnc_job_add_rect(job, x * VNC_DIRTY_PIXELS_PER_BIT, y,
1119                                  (x2 - x) * VNC_DIRTY_PIXELS_PER_BIT, h);
1120        }
1121        if (!x && x2 == width / VNC_DIRTY_PIXELS_PER_BIT) {
1122            y += h;
1123            if (y == height) {
1124                break;
1125            }
1126        }
1127    }
1128
1129    vs->job_update = vs->update;
1130    vs->update = VNC_STATE_UPDATE_NONE;
1131    vnc_job_push(job);
1132    vs->has_dirty = 0;
1133    return n;
1134}
1135
1136/* audio */
1137static void audio_capture_notify(void *opaque, audcnotification_e cmd)
1138{
1139    VncState *vs = opaque;
1140
1141    switch (cmd) {
1142    case AUD_CNOTIFY_DISABLE:
1143        vnc_lock_output(vs);
1144        vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1145        vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1146        vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_END);
1147        vnc_unlock_output(vs);
1148        vnc_flush(vs);
1149        break;
1150
1151    case AUD_CNOTIFY_ENABLE:
1152        vnc_lock_output(vs);
1153        vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1154        vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1155        vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_BEGIN);
1156        vnc_unlock_output(vs);
1157        vnc_flush(vs);
1158        break;
1159    }
1160}
1161
1162static void audio_capture_destroy(void *opaque)
1163{
1164}
1165
1166static void audio_capture(void *opaque, void *buf, int size)
1167{
1168    VncState *vs = opaque;
1169
1170    vnc_lock_output(vs);
1171    if (vs->output.offset < vs->throttle_output_offset) {
1172        vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1173        vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1174        vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_DATA);
1175        vnc_write_u32(vs, size);
1176        vnc_write(vs, buf, size);
1177    } else {
1178        trace_vnc_client_throttle_audio(vs, vs->ioc, vs->output.offset);
1179    }
1180    vnc_unlock_output(vs);
1181    vnc_flush(vs);
1182}
1183
1184static void audio_add(VncState *vs)
1185{
1186    struct audio_capture_ops ops;
1187
1188    if (vs->audio_cap) {
1189        error_report("audio already running");
1190        return;
1191    }
1192
1193    ops.notify = audio_capture_notify;
1194    ops.destroy = audio_capture_destroy;
1195    ops.capture = audio_capture;
1196
1197    vs->audio_cap = AUD_add_capture(&vs->as, &ops, vs);
1198    if (!vs->audio_cap) {
1199        error_report("Failed to add audio capture");
1200    }
1201}
1202
1203static void audio_del(VncState *vs)
1204{
1205    if (vs->audio_cap) {
1206        AUD_del_capture(vs->audio_cap, vs);
1207        vs->audio_cap = NULL;
1208    }
1209}
1210
1211static void vnc_disconnect_start(VncState *vs)
1212{
1213    if (vs->disconnecting) {
1214        return;
1215    }
1216    trace_vnc_client_disconnect_start(vs, vs->ioc);
1217    vnc_set_share_mode(vs, VNC_SHARE_MODE_DISCONNECTED);
1218    if (vs->ioc_tag) {
1219        g_source_remove(vs->ioc_tag);
1220        vs->ioc_tag = 0;
1221    }
1222    qio_channel_close(vs->ioc, NULL);
1223    vs->disconnecting = TRUE;
1224}
1225
1226void vnc_disconnect_finish(VncState *vs)
1227{
1228    int i;
1229
1230    trace_vnc_client_disconnect_finish(vs, vs->ioc);
1231
1232    vnc_jobs_join(vs); /* Wait encoding jobs */
1233
1234    vnc_lock_output(vs);
1235    vnc_qmp_event(vs, QAPI_EVENT_VNC_DISCONNECTED);
1236
1237    buffer_free(&vs->input);
1238    buffer_free(&vs->output);
1239
1240    qapi_free_VncClientInfo(vs->info);
1241
1242    vnc_zlib_clear(vs);
1243    vnc_tight_clear(vs);
1244    vnc_zrle_clear(vs);
1245
1246#ifdef CONFIG_VNC_SASL
1247    vnc_sasl_client_cleanup(vs);
1248#endif /* CONFIG_VNC_SASL */
1249    audio_del(vs);
1250    vnc_release_modifiers(vs);
1251
1252    if (vs->mouse_mode_notifier.notify != NULL) {
1253        qemu_remove_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
1254    }
1255    QTAILQ_REMOVE(&vs->vd->clients, vs, next);
1256    if (QTAILQ_EMPTY(&vs->vd->clients)) {
1257        /* last client gone */
1258        vnc_update_server_surface(vs->vd);
1259    }
1260
1261    vnc_unlock_output(vs);
1262
1263    qemu_mutex_destroy(&vs->output_mutex);
1264    if (vs->bh != NULL) {
1265        qemu_bh_delete(vs->bh);
1266    }
1267    buffer_free(&vs->jobs_buffer);
1268
1269    for (i = 0; i < VNC_STAT_ROWS; ++i) {
1270        g_free(vs->lossy_rect[i]);
1271    }
1272    g_free(vs->lossy_rect);
1273
1274    object_unref(OBJECT(vs->ioc));
1275    vs->ioc = NULL;
1276    object_unref(OBJECT(vs->sioc));
1277    vs->sioc = NULL;
1278    g_free(vs);
1279}
1280
1281size_t vnc_client_io_error(VncState *vs, ssize_t ret, Error **errp)
1282{
1283    if (ret <= 0) {
1284        if (ret == 0) {
1285            trace_vnc_client_eof(vs, vs->ioc);
1286            vnc_disconnect_start(vs);
1287        } else if (ret != QIO_CHANNEL_ERR_BLOCK) {
1288            trace_vnc_client_io_error(vs, vs->ioc,
1289                                      errp ? error_get_pretty(*errp) :
1290                                      "Unknown");
1291            vnc_disconnect_start(vs);
1292        }
1293
1294        if (errp) {
1295            error_free(*errp);
1296            *errp = NULL;
1297        }
1298        return 0;
1299    }
1300    return ret;
1301}
1302
1303
1304void vnc_client_error(VncState *vs)
1305{
1306    VNC_DEBUG("Closing down client sock: protocol error\n");
1307    vnc_disconnect_start(vs);
1308}
1309
1310
1311/*
1312 * Called to write a chunk of data to the client socket. The data may
1313 * be the raw data, or may have already been encoded by SASL.
1314 * The data will be written either straight onto the socket, or
1315 * written via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1316 *
1317 * NB, it is theoretically possible to have 2 layers of encryption,
1318 * both SASL, and this TLS layer. It is highly unlikely in practice
1319 * though, since SASL encryption will typically be a no-op if TLS
1320 * is active
1321 *
1322 * Returns the number of bytes written, which may be less than
1323 * the requested 'datalen' if the socket would block. Returns
1324 * 0 on I/O error, and disconnects the client socket.
1325 */
1326size_t vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen)
1327{
1328    Error *err = NULL;
1329    ssize_t ret;
1330    ret = qio_channel_write(
1331        vs->ioc, (const char *)data, datalen, &err);
1332    VNC_DEBUG("Wrote wire %p %zd -> %ld\n", data, datalen, ret);
1333    return vnc_client_io_error(vs, ret, &err);
1334}
1335
1336
1337/*
1338 * Called to write buffered data to the client socket, when not
1339 * using any SASL SSF encryption layers. Will write as much data
1340 * as possible without blocking. If all buffered data is written,
1341 * will switch the FD poll() handler back to read monitoring.
1342 *
1343 * Returns the number of bytes written, which may be less than
1344 * the buffered output data if the socket would block.  Returns
1345 * 0 on I/O error, and disconnects the client socket.
1346 */
1347static size_t vnc_client_write_plain(VncState *vs)
1348{
1349    size_t offset;
1350    size_t ret;
1351
1352#ifdef CONFIG_VNC_SASL
1353    VNC_DEBUG("Write Plain: Pending output %p size %zd offset %zd. Wait SSF %d\n",
1354              vs->output.buffer, vs->output.capacity, vs->output.offset,
1355              vs->sasl.waitWriteSSF);
1356
1357    if (vs->sasl.conn &&
1358        vs->sasl.runSSF &&
1359        vs->sasl.waitWriteSSF) {
1360        ret = vnc_client_write_buf(vs, vs->output.buffer, vs->sasl.waitWriteSSF);
1361        if (ret)
1362            vs->sasl.waitWriteSSF -= ret;
1363    } else
1364#endif /* CONFIG_VNC_SASL */
1365        ret = vnc_client_write_buf(vs, vs->output.buffer, vs->output.offset);
1366    if (!ret)
1367        return 0;
1368
1369    if (ret >= vs->force_update_offset) {
1370        if (vs->force_update_offset != 0) {
1371            trace_vnc_client_unthrottle_forced(vs, vs->ioc);
1372        }
1373        vs->force_update_offset = 0;
1374    } else {
1375        vs->force_update_offset -= ret;
1376    }
1377    offset = vs->output.offset;
1378    buffer_advance(&vs->output, ret);
1379    if (offset >= vs->throttle_output_offset &&
1380        vs->output.offset < vs->throttle_output_offset) {
1381        trace_vnc_client_unthrottle_incremental(vs, vs->ioc, vs->output.offset);
1382    }
1383
1384    if (vs->output.offset == 0) {
1385        if (vs->ioc_tag) {
1386            g_source_remove(vs->ioc_tag);
1387        }
1388        vs->ioc_tag = qio_channel_add_watch(
1389            vs->ioc, G_IO_IN, vnc_client_io, vs, NULL);
1390    }
1391
1392    return ret;
1393}
1394
1395
1396/*
1397 * First function called whenever there is data to be written to
1398 * the client socket. Will delegate actual work according to whether
1399 * SASL SSF layers are enabled (thus requiring encryption calls)
1400 */
1401static void vnc_client_write_locked(VncState *vs)
1402{
1403#ifdef CONFIG_VNC_SASL
1404    if (vs->sasl.conn &&
1405        vs->sasl.runSSF &&
1406        !vs->sasl.waitWriteSSF) {
1407        vnc_client_write_sasl(vs);
1408    } else
1409#endif /* CONFIG_VNC_SASL */
1410    {
1411        vnc_client_write_plain(vs);
1412    }
1413}
1414
1415static void vnc_client_write(VncState *vs)
1416{
1417
1418    vnc_lock_output(vs);
1419    if (vs->output.offset) {
1420        vnc_client_write_locked(vs);
1421    } else if (vs->ioc != NULL) {
1422        if (vs->ioc_tag) {
1423            g_source_remove(vs->ioc_tag);
1424        }
1425        vs->ioc_tag = qio_channel_add_watch(
1426            vs->ioc, G_IO_IN, vnc_client_io, vs, NULL);
1427    }
1428    vnc_unlock_output(vs);
1429}
1430
1431void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting)
1432{
1433    vs->read_handler = func;
1434    vs->read_handler_expect = expecting;
1435}
1436
1437
1438/*
1439 * Called to read a chunk of data from the client socket. The data may
1440 * be the raw data, or may need to be further decoded by SASL.
1441 * The data will be read either straight from to the socket, or
1442 * read via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1443 *
1444 * NB, it is theoretically possible to have 2 layers of encryption,
1445 * both SASL, and this TLS layer. It is highly unlikely in practice
1446 * though, since SASL encryption will typically be a no-op if TLS
1447 * is active
1448 *
1449 * Returns the number of bytes read, which may be less than
1450 * the requested 'datalen' if the socket would block. Returns
1451 * 0 on I/O error or EOF, and disconnects the client socket.
1452 */
1453size_t vnc_client_read_buf(VncState *vs, uint8_t *data, size_t datalen)
1454{
1455    ssize_t ret;
1456    Error *err = NULL;
1457    ret = qio_channel_read(
1458        vs->ioc, (char *)data, datalen, &err);
1459    VNC_DEBUG("Read wire %p %zd -> %ld\n", data, datalen, ret);
1460    return vnc_client_io_error(vs, ret, &err);
1461}
1462
1463
1464/*
1465 * Called to read data from the client socket to the input buffer,
1466 * when not using any SASL SSF encryption layers. Will read as much
1467 * data as possible without blocking.
1468 *
1469 * Returns the number of bytes read, which may be less than
1470 * the requested 'datalen' if the socket would block. Returns
1471 * 0 on I/O error or EOF, and disconnects the client socket.
1472 */
1473static size_t vnc_client_read_plain(VncState *vs)
1474{
1475    size_t ret;
1476    VNC_DEBUG("Read plain %p size %zd offset %zd\n",
1477              vs->input.buffer, vs->input.capacity, vs->input.offset);
1478    buffer_reserve(&vs->input, 4096);
1479    ret = vnc_client_read_buf(vs, buffer_end(&vs->input), 4096);
1480    if (!ret)
1481        return 0;
1482    vs->input.offset += ret;
1483    return ret;
1484}
1485
1486static void vnc_jobs_bh(void *opaque)
1487{
1488    VncState *vs = opaque;
1489
1490    vnc_jobs_consume_buffer(vs);
1491}
1492
1493/*
1494 * First function called whenever there is more data to be read from
1495 * the client socket. Will delegate actual work according to whether
1496 * SASL SSF layers are enabled (thus requiring decryption calls)
1497 * Returns 0 on success, -1 if client disconnected
1498 */
1499static int vnc_client_read(VncState *vs)
1500{
1501    size_t ret;
1502
1503#ifdef CONFIG_VNC_SASL
1504    if (vs->sasl.conn && vs->sasl.runSSF)
1505        ret = vnc_client_read_sasl(vs);
1506    else
1507#endif /* CONFIG_VNC_SASL */
1508        ret = vnc_client_read_plain(vs);
1509    if (!ret) {
1510        if (vs->disconnecting) {
1511            vnc_disconnect_finish(vs);
1512            return -1;
1513        }
1514        return 0;
1515    }
1516
1517    while (vs->read_handler && vs->input.offset >= vs->read_handler_expect) {
1518        size_t len = vs->read_handler_expect;
1519        int ret;
1520
1521        ret = vs->read_handler(vs, vs->input.buffer, len);
1522        if (vs->disconnecting) {
1523            vnc_disconnect_finish(vs);
1524            return -1;
1525        }
1526
1527        if (!ret) {
1528            buffer_advance(&vs->input, len);
1529        } else {
1530            vs->read_handler_expect = ret;
1531        }
1532    }
1533    return 0;
1534}
1535
1536gboolean vnc_client_io(QIOChannel *ioc G_GNUC_UNUSED,
1537                       GIOCondition condition, void *opaque)
1538{
1539    VncState *vs = opaque;
1540    if (condition & G_IO_IN) {
1541        if (vnc_client_read(vs) < 0) {
1542            goto end;
1543        }
1544    }
1545    if (condition & G_IO_OUT) {
1546        vnc_client_write(vs);
1547    }
1548end:
1549    if (vs->disconnecting) {
1550        if (vs->ioc_tag != 0) {
1551            g_source_remove(vs->ioc_tag);
1552        }
1553        vs->ioc_tag = 0;
1554    }
1555    return TRUE;
1556}
1557
1558
1559/*
1560 * Scale factor to apply to vs->throttle_output_offset when checking for
1561 * hard limit. Worst case normal usage could be x2, if we have a complete
1562 * incremental update and complete forced update in the output buffer.
1563 * So x3 should be good enough, but we pick x5 to be conservative and thus
1564 * (hopefully) never trigger incorrectly.
1565 */
1566#define VNC_THROTTLE_OUTPUT_LIMIT_SCALE 5
1567
1568void vnc_write(VncState *vs, const void *data, size_t len)
1569{
1570    if (vs->disconnecting) {
1571        return;
1572    }
1573    /* Protection against malicious client/guest to prevent our output
1574     * buffer growing without bound if client stops reading data. This
1575     * should rarely trigger, because we have earlier throttling code
1576     * which stops issuing framebuffer updates and drops audio data
1577     * if the throttle_output_offset value is exceeded. So we only reach
1578     * this higher level if a huge number of pseudo-encodings get
1579     * triggered while data can't be sent on the socket.
1580     *
1581     * NB throttle_output_offset can be zero during early protocol
1582     * handshake, or from the job thread's VncState clone
1583     */
1584    if (vs->throttle_output_offset != 0 &&
1585        (vs->output.offset / VNC_THROTTLE_OUTPUT_LIMIT_SCALE) >
1586        vs->throttle_output_offset) {
1587        trace_vnc_client_output_limit(vs, vs->ioc, vs->output.offset,
1588                                      vs->throttle_output_offset);
1589        vnc_disconnect_start(vs);
1590        return;
1591    }
1592    buffer_reserve(&vs->output, len);
1593
1594    if (vs->ioc != NULL && buffer_empty(&vs->output)) {
1595        if (vs->ioc_tag) {
1596            g_source_remove(vs->ioc_tag);
1597        }
1598        vs->ioc_tag = qio_channel_add_watch(
1599            vs->ioc, G_IO_IN | G_IO_OUT, vnc_client_io, vs, NULL);
1600    }
1601
1602    buffer_append(&vs->output, data, len);
1603}
1604
1605void vnc_write_s32(VncState *vs, int32_t value)
1606{
1607    vnc_write_u32(vs, *(uint32_t *)&value);
1608}
1609
1610void vnc_write_u32(VncState *vs, uint32_t value)
1611{
1612    uint8_t buf[4];
1613
1614    buf[0] = (value >> 24) & 0xFF;
1615    buf[1] = (value >> 16) & 0xFF;
1616    buf[2] = (value >>  8) & 0xFF;
1617    buf[3] = value & 0xFF;
1618
1619    vnc_write(vs, buf, 4);
1620}
1621
1622void vnc_write_u16(VncState *vs, uint16_t value)
1623{
1624    uint8_t buf[2];
1625
1626    buf[0] = (value >> 8) & 0xFF;
1627    buf[1] = value & 0xFF;
1628
1629    vnc_write(vs, buf, 2);
1630}
1631
1632void vnc_write_u8(VncState *vs, uint8_t value)
1633{
1634    vnc_write(vs, (char *)&value, 1);
1635}
1636
1637void vnc_flush(VncState *vs)
1638{
1639    vnc_lock_output(vs);
1640    if (vs->ioc != NULL && vs->output.offset) {
1641        vnc_client_write_locked(vs);
1642    }
1643    if (vs->disconnecting) {
1644        if (vs->ioc_tag != 0) {
1645            g_source_remove(vs->ioc_tag);
1646        }
1647        vs->ioc_tag = 0;
1648    }
1649    vnc_unlock_output(vs);
1650}
1651
1652static uint8_t read_u8(uint8_t *data, size_t offset)
1653{
1654    return data[offset];
1655}
1656
1657static uint16_t read_u16(uint8_t *data, size_t offset)
1658{
1659    return ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF);
1660}
1661
1662static int32_t read_s32(uint8_t *data, size_t offset)
1663{
1664    return (int32_t)((data[offset] << 24) | (data[offset + 1] << 16) |
1665                     (data[offset + 2] << 8) | data[offset + 3]);
1666}
1667
1668uint32_t read_u32(uint8_t *data, size_t offset)
1669{
1670    return ((data[offset] << 24) | (data[offset + 1] << 16) |
1671            (data[offset + 2] << 8) | data[offset + 3]);
1672}
1673
1674static void client_cut_text(VncState *vs, size_t len, uint8_t *text)
1675{
1676}
1677
1678static void check_pointer_type_change(Notifier *notifier, void *data)
1679{
1680    VncState *vs = container_of(notifier, VncState, mouse_mode_notifier);
1681    int absolute = qemu_input_is_absolute();
1682
1683    if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute != absolute) {
1684        vnc_lock_output(vs);
1685        vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1686        vnc_write_u8(vs, 0);
1687        vnc_write_u16(vs, 1);
1688        vnc_framebuffer_update(vs, absolute, 0,
1689                               pixman_image_get_width(vs->vd->server),
1690                               pixman_image_get_height(vs->vd->server),
1691                               VNC_ENCODING_POINTER_TYPE_CHANGE);
1692        vnc_unlock_output(vs);
1693        vnc_flush(vs);
1694    }
1695    vs->absolute = absolute;
1696}
1697
1698static void pointer_event(VncState *vs, int button_mask, int x, int y)
1699{
1700    static uint32_t bmap[INPUT_BUTTON__MAX] = {
1701        [INPUT_BUTTON_LEFT]       = 0x01,
1702        [INPUT_BUTTON_MIDDLE]     = 0x02,
1703        [INPUT_BUTTON_RIGHT]      = 0x04,
1704        [INPUT_BUTTON_WHEEL_UP]   = 0x08,
1705        [INPUT_BUTTON_WHEEL_DOWN] = 0x10,
1706    };
1707    QemuConsole *con = vs->vd->dcl.con;
1708    int width = pixman_image_get_width(vs->vd->server);
1709    int height = pixman_image_get_height(vs->vd->server);
1710
1711    if (vs->last_bmask != button_mask) {
1712        qemu_input_update_buttons(con, bmap, vs->last_bmask, button_mask);
1713        vs->last_bmask = button_mask;
1714    }
1715
1716    if (vs->absolute) {
1717        qemu_input_queue_abs(con, INPUT_AXIS_X, x, 0, width);
1718        qemu_input_queue_abs(con, INPUT_AXIS_Y, y, 0, height);
1719    } else if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE)) {
1720        qemu_input_queue_rel(con, INPUT_AXIS_X, x - 0x7FFF);
1721        qemu_input_queue_rel(con, INPUT_AXIS_Y, y - 0x7FFF);
1722    } else {
1723        if (vs->last_x != -1) {
1724            qemu_input_queue_rel(con, INPUT_AXIS_X, x - vs->last_x);
1725            qemu_input_queue_rel(con, INPUT_AXIS_Y, y - vs->last_y);
1726        }
1727        vs->last_x = x;
1728        vs->last_y = y;
1729    }
1730    qemu_input_event_sync();
1731}
1732
1733static void reset_keys(VncState *vs)
1734{
1735    int i;
1736    for(i = 0; i < 256; i++) {
1737        if (vs->modifiers_state[i]) {
1738            qemu_input_event_send_key_number(vs->vd->dcl.con, i, false);
1739            qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
1740            vs->modifiers_state[i] = 0;
1741        }
1742    }
1743}
1744
1745static void press_key(VncState *vs, int keysym)
1746{
1747    int keycode = keysym2scancode(vs->vd->kbd_layout, keysym,
1748                                  false, false, false) & SCANCODE_KEYMASK;
1749    qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, true);
1750    qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
1751    qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, false);
1752    qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
1753}
1754
1755static void vnc_led_state_change(VncState *vs)
1756{
1757    if (!vnc_has_feature(vs, VNC_FEATURE_LED_STATE)) {
1758        return;
1759    }
1760
1761    vnc_lock_output(vs);
1762    vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1763    vnc_write_u8(vs, 0);
1764    vnc_write_u16(vs, 1);
1765    vnc_framebuffer_update(vs, 0, 0, 1, 1, VNC_ENCODING_LED_STATE);
1766    vnc_write_u8(vs, vs->vd->ledstate);
1767    vnc_unlock_output(vs);
1768    vnc_flush(vs);
1769}
1770
1771static void kbd_leds(void *opaque, int ledstate)
1772{
1773    VncDisplay *vd = opaque;
1774    VncState *client;
1775
1776    trace_vnc_key_guest_leds((ledstate & QEMU_CAPS_LOCK_LED),
1777                             (ledstate & QEMU_NUM_LOCK_LED),
1778                             (ledstate & QEMU_SCROLL_LOCK_LED));
1779
1780    if (ledstate == vd->ledstate) {
1781        return;
1782    }
1783
1784    vd->ledstate = ledstate;
1785
1786    QTAILQ_FOREACH(client, &vd->clients, next) {
1787        vnc_led_state_change(client);
1788    }
1789}
1790
1791static void do_key_event(VncState *vs, int down, int keycode, int sym)
1792{
1793    /* QEMU console switch */
1794    switch(keycode) {
1795    case 0x2a:                          /* Left Shift */
1796    case 0x36:                          /* Right Shift */
1797    case 0x1d:                          /* Left CTRL */
1798    case 0x9d:                          /* Right CTRL */
1799    case 0x38:                          /* Left ALT */
1800    case 0xb8:                          /* Right ALT */
1801        if (down)
1802            vs->modifiers_state[keycode] = 1;
1803        else
1804            vs->modifiers_state[keycode] = 0;
1805        break;
1806    case 0x02 ... 0x0a: /* '1' to '9' keys */
1807        if (vs->vd->dcl.con == NULL &&
1808            down && vs->modifiers_state[0x1d] && vs->modifiers_state[0x38]) {
1809            /* Reset the modifiers sent to the current console */
1810            reset_keys(vs);
1811            console_select(keycode - 0x02);
1812            return;
1813        }
1814        break;
1815    case 0x3a:                        /* CapsLock */
1816    case 0x45:                        /* NumLock */
1817        if (down)
1818            vs->modifiers_state[keycode] ^= 1;
1819        break;
1820    }
1821
1822    /* Turn off the lock state sync logic if the client support the led
1823       state extension.
1824    */
1825    if (down && vs->vd->lock_key_sync &&
1826        !vnc_has_feature(vs, VNC_FEATURE_LED_STATE) &&
1827        keycode_is_keypad(vs->vd->kbd_layout, keycode)) {
1828        /* If the numlock state needs to change then simulate an additional
1829           keypress before sending this one.  This will happen if the user
1830           toggles numlock away from the VNC window.
1831        */
1832        if (keysym_is_numlock(vs->vd->kbd_layout, sym & 0xFFFF)) {
1833            if (!vs->modifiers_state[0x45]) {
1834                trace_vnc_key_sync_numlock(true);
1835                vs->modifiers_state[0x45] = 1;
1836                press_key(vs, 0xff7f);
1837            }
1838        } else {
1839            if (vs->modifiers_state[0x45]) {
1840                trace_vnc_key_sync_numlock(false);
1841                vs->modifiers_state[0x45] = 0;
1842                press_key(vs, 0xff7f);
1843            }
1844        }
1845    }
1846
1847    if (down && vs->vd->lock_key_sync &&
1848        !vnc_has_feature(vs, VNC_FEATURE_LED_STATE) &&
1849        ((sym >= 'A' && sym <= 'Z') || (sym >= 'a' && sym <= 'z'))) {
1850        /* If the capslock state needs to change then simulate an additional
1851           keypress before sending this one.  This will happen if the user
1852           toggles capslock away from the VNC window.
1853        */
1854        int uppercase = !!(sym >= 'A' && sym <= 'Z');
1855        int shift = !!(vs->modifiers_state[0x2a] | vs->modifiers_state[0x36]);
1856        int capslock = !!(vs->modifiers_state[0x3a]);
1857        if (capslock) {
1858            if (uppercase == shift) {
1859                trace_vnc_key_sync_capslock(false);
1860                vs->modifiers_state[0x3a] = 0;
1861                press_key(vs, 0xffe5);
1862            }
1863        } else {
1864            if (uppercase != shift) {
1865                trace_vnc_key_sync_capslock(true);
1866                vs->modifiers_state[0x3a] = 1;
1867                press_key(vs, 0xffe5);
1868            }
1869        }
1870    }
1871
1872    if (qemu_console_is_graphic(NULL)) {
1873        qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, down);
1874        qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
1875    } else {
1876        bool numlock = vs->modifiers_state[0x45];
1877        bool control = (vs->modifiers_state[0x1d] ||
1878                        vs->modifiers_state[0x9d]);
1879        /* QEMU console emulation */
1880        if (down) {
1881            switch (keycode) {
1882            case 0x2a:                          /* Left Shift */
1883            case 0x36:                          /* Right Shift */
1884            case 0x1d:                          /* Left CTRL */
1885            case 0x9d:                          /* Right CTRL */
1886            case 0x38:                          /* Left ALT */
1887            case 0xb8:                          /* Right ALT */
1888                break;
1889            case 0xc8:
1890                kbd_put_keysym(QEMU_KEY_UP);
1891                break;
1892            case 0xd0:
1893                kbd_put_keysym(QEMU_KEY_DOWN);
1894                break;
1895            case 0xcb:
1896                kbd_put_keysym(QEMU_KEY_LEFT);
1897                break;
1898            case 0xcd:
1899                kbd_put_keysym(QEMU_KEY_RIGHT);
1900                break;
1901            case 0xd3:
1902                kbd_put_keysym(QEMU_KEY_DELETE);
1903                break;
1904            case 0xc7:
1905                kbd_put_keysym(QEMU_KEY_HOME);
1906                break;
1907            case 0xcf:
1908                kbd_put_keysym(QEMU_KEY_END);
1909                break;
1910            case 0xc9:
1911                kbd_put_keysym(QEMU_KEY_PAGEUP);
1912                break;
1913            case 0xd1:
1914                kbd_put_keysym(QEMU_KEY_PAGEDOWN);
1915                break;
1916
1917            case 0x47:
1918                kbd_put_keysym(numlock ? '7' : QEMU_KEY_HOME);
1919                break;
1920            case 0x48:
1921                kbd_put_keysym(numlock ? '8' : QEMU_KEY_UP);
1922                break;
1923            case 0x49:
1924                kbd_put_keysym(numlock ? '9' : QEMU_KEY_PAGEUP);
1925                break;
1926            case 0x4b:
1927                kbd_put_keysym(numlock ? '4' : QEMU_KEY_LEFT);
1928                break;
1929            case 0x4c:
1930                kbd_put_keysym('5');
1931                break;
1932            case 0x4d:
1933                kbd_put_keysym(numlock ? '6' : QEMU_KEY_RIGHT);
1934                break;
1935            case 0x4f:
1936                kbd_put_keysym(numlock ? '1' : QEMU_KEY_END);
1937                break;
1938            case 0x50:
1939                kbd_put_keysym(numlock ? '2' : QEMU_KEY_DOWN);
1940                break;
1941            case 0x51:
1942                kbd_put_keysym(numlock ? '3' : QEMU_KEY_PAGEDOWN);
1943                break;
1944            case 0x52:
1945                kbd_put_keysym('0');
1946                break;
1947            case 0x53:
1948                kbd_put_keysym(numlock ? '.' : QEMU_KEY_DELETE);
1949                break;
1950
1951            case 0xb5:
1952                kbd_put_keysym('/');
1953                break;
1954            case 0x37:
1955                kbd_put_keysym('*');
1956                break;
1957            case 0x4a:
1958                kbd_put_keysym('-');
1959                break;
1960            case 0x4e:
1961                kbd_put_keysym('+');
1962                break;
1963            case 0x9c:
1964                kbd_put_keysym('\n');
1965                break;
1966
1967            default:
1968                if (control) {
1969                    kbd_put_keysym(sym & 0x1f);
1970                } else {
1971                    kbd_put_keysym(sym);
1972                }
1973                break;
1974            }
1975        }
1976    }
1977}
1978
1979static void vnc_release_modifiers(VncState *vs)
1980{
1981    static const int keycodes[] = {
1982        /* shift, control, alt keys, both left & right */
1983        0x2a, 0x36, 0x1d, 0x9d, 0x38, 0xb8,
1984    };
1985    int i, keycode;
1986
1987    if (!qemu_console_is_graphic(NULL)) {
1988        return;
1989    }
1990    for (i = 0; i < ARRAY_SIZE(keycodes); i++) {
1991        keycode = keycodes[i];
1992        if (!vs->modifiers_state[keycode]) {
1993            continue;
1994        }
1995        qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, false);
1996        qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
1997    }
1998}
1999
2000static const char *code2name(int keycode)
2001{
2002    return QKeyCode_str(qemu_input_key_number_to_qcode(keycode));
2003}
2004
2005static void key_event(VncState *vs, int down, uint32_t sym)
2006{
2007    bool shift = vs->modifiers_state[0x2a] || vs->modifiers_state[0x36];
2008    bool altgr = vs->modifiers_state[0xb8];
2009    bool ctrl  = vs->modifiers_state[0x1d] || vs->modifiers_state[0x9d];
2010    int keycode;
2011    int lsym = sym;
2012
2013    if (lsym >= 'A' && lsym <= 'Z' && qemu_console_is_graphic(NULL)) {
2014        lsym = lsym - 'A' + 'a';
2015    }
2016
2017    keycode = keysym2scancode(vs->vd->kbd_layout, lsym & 0xFFFF,
2018                              shift, altgr, ctrl) & SCANCODE_KEYMASK;
2019    trace_vnc_key_event_map(down, sym, keycode, code2name(keycode));
2020    do_key_event(vs, down, keycode, sym);
2021}
2022
2023static void ext_key_event(VncState *vs, int down,
2024                          uint32_t sym, uint16_t keycode)
2025{
2026    /* if the user specifies a keyboard layout, always use it */
2027    if (keyboard_layout) {
2028        key_event(vs, down, sym);
2029    } else {
2030        trace_vnc_key_event_ext(down, sym, keycode, code2name(keycode));
2031        do_key_event(vs, down, keycode, sym);
2032    }
2033}
2034
2035static void framebuffer_update_request(VncState *vs, int incremental,
2036                                       int x, int y, int w, int h)
2037{
2038    if (incremental) {
2039        if (vs->update != VNC_STATE_UPDATE_FORCE) {
2040            vs->update = VNC_STATE_UPDATE_INCREMENTAL;
2041        }
2042    } else {
2043        vs->update = VNC_STATE_UPDATE_FORCE;
2044        vnc_set_area_dirty(vs->dirty, vs->vd, x, y, w, h);
2045    }
2046}
2047
2048static void send_ext_key_event_ack(VncState *vs)
2049{
2050    vnc_lock_output(vs);
2051    vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
2052    vnc_write_u8(vs, 0);
2053    vnc_write_u16(vs, 1);
2054    vnc_framebuffer_update(vs, 0, 0,
2055                           pixman_image_get_width(vs->vd->server),
2056                           pixman_image_get_height(vs->vd->server),
2057                           VNC_ENCODING_EXT_KEY_EVENT);
2058    vnc_unlock_output(vs);
2059    vnc_flush(vs);
2060}
2061
2062static void send_ext_audio_ack(VncState *vs)
2063{
2064    vnc_lock_output(vs);
2065    vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
2066    vnc_write_u8(vs, 0);
2067    vnc_write_u16(vs, 1);
2068    vnc_framebuffer_update(vs, 0, 0,
2069                           pixman_image_get_width(vs->vd->server),
2070                           pixman_image_get_height(vs->vd->server),
2071                           VNC_ENCODING_AUDIO);
2072    vnc_unlock_output(vs);
2073    vnc_flush(vs);
2074}
2075
2076static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
2077{
2078    int i;
2079    unsigned int enc = 0;
2080
2081    vs->features = 0;
2082    vs->vnc_encoding = 0;
2083    vs->tight.compression = 9;
2084    vs->tight.quality = -1; /* Lossless by default */
2085    vs->absolute = -1;
2086
2087    /*
2088     * Start from the end because the encodings are sent in order of preference.
2089     * This way the preferred encoding (first encoding defined in the array)
2090     * will be set at the end of the loop.
2091     */
2092    for (i = n_encodings - 1; i >= 0; i--) {
2093        enc = encodings[i];
2094        switch (enc) {
2095        case VNC_ENCODING_RAW:
2096            vs->vnc_encoding = enc;
2097            break;
2098        case VNC_ENCODING_COPYRECT:
2099            vs->features |= VNC_FEATURE_COPYRECT_MASK;
2100            break;
2101        case VNC_ENCODING_HEXTILE:
2102            vs->features |= VNC_FEATURE_HEXTILE_MASK;
2103            vs->vnc_encoding = enc;
2104            break;
2105        case VNC_ENCODING_TIGHT:
2106            vs->features |= VNC_FEATURE_TIGHT_MASK;
2107            vs->vnc_encoding = enc;
2108            break;
2109#ifdef CONFIG_VNC_PNG
2110        case VNC_ENCODING_TIGHT_PNG:
2111            vs->features |= VNC_FEATURE_TIGHT_PNG_MASK;
2112            vs->vnc_encoding = enc;
2113            break;
2114#endif
2115        case VNC_ENCODING_ZLIB:
2116            vs->features |= VNC_FEATURE_ZLIB_MASK;
2117            vs->vnc_encoding = enc;
2118            break;
2119        case VNC_ENCODING_ZRLE:
2120            vs->features |= VNC_FEATURE_ZRLE_MASK;
2121            vs->vnc_encoding = enc;
2122            break;
2123        case VNC_ENCODING_ZYWRLE:
2124            vs->features |= VNC_FEATURE_ZYWRLE_MASK;
2125            vs->vnc_encoding = enc;
2126            break;
2127        case VNC_ENCODING_DESKTOPRESIZE:
2128            vs->features |= VNC_FEATURE_RESIZE_MASK;
2129            break;
2130        case VNC_ENCODING_POINTER_TYPE_CHANGE:
2131            vs->features |= VNC_FEATURE_POINTER_TYPE_CHANGE_MASK;
2132            break;
2133        case VNC_ENCODING_RICH_CURSOR:
2134            vs->features |= VNC_FEATURE_RICH_CURSOR_MASK;
2135            if (vs->vd->cursor) {
2136                vnc_cursor_define(vs);
2137            }
2138            break;
2139        case VNC_ENCODING_EXT_KEY_EVENT:
2140            send_ext_key_event_ack(vs);
2141            break;
2142        case VNC_ENCODING_AUDIO:
2143            send_ext_audio_ack(vs);
2144            break;
2145        case VNC_ENCODING_WMVi:
2146            vs->features |= VNC_FEATURE_WMVI_MASK;
2147            break;
2148        case VNC_ENCODING_LED_STATE:
2149            vs->features |= VNC_FEATURE_LED_STATE_MASK;
2150            break;
2151        case VNC_ENCODING_COMPRESSLEVEL0 ... VNC_ENCODING_COMPRESSLEVEL0 + 9:
2152            vs->tight.compression = (enc & 0x0F);
2153            break;
2154        case VNC_ENCODING_QUALITYLEVEL0 ... VNC_ENCODING_QUALITYLEVEL0 + 9:
2155            if (vs->vd->lossy) {
2156                vs->tight.quality = (enc & 0x0F);
2157            }
2158            break;
2159        default:
2160            VNC_DEBUG("Unknown encoding: %d (0x%.8x): %d\n", i, enc, enc);
2161            break;
2162        }
2163    }
2164    vnc_desktop_resize(vs);
2165    check_pointer_type_change(&vs->mouse_mode_notifier, NULL);
2166    vnc_led_state_change(vs);
2167}
2168
2169static void set_pixel_conversion(VncState *vs)
2170{
2171    pixman_format_code_t fmt = qemu_pixman_get_format(&vs->client_pf);
2172
2173    if (fmt == VNC_SERVER_FB_FORMAT) {
2174        vs->write_pixels = vnc_write_pixels_copy;
2175        vnc_hextile_set_pixel_conversion(vs, 0);
2176    } else {
2177        vs->write_pixels = vnc_write_pixels_generic;
2178        vnc_hextile_set_pixel_conversion(vs, 1);
2179    }
2180}
2181
2182static void send_color_map(VncState *vs)
2183{
2184    int i;
2185
2186    vnc_write_u8(vs, VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES);
2187    vnc_write_u8(vs,  0);    /* padding     */
2188    vnc_write_u16(vs, 0);    /* first color */
2189    vnc_write_u16(vs, 256);  /* # of colors */
2190
2191    for (i = 0; i < 256; i++) {
2192        PixelFormat *pf = &vs->client_pf;
2193
2194        vnc_write_u16(vs, (((i >> pf->rshift) & pf->rmax) << (16 - pf->rbits)));
2195        vnc_write_u16(vs, (((i >> pf->gshift) & pf->gmax) << (16 - pf->gbits)));
2196        vnc_write_u16(vs, (((i >> pf->bshift) & pf->bmax) << (16 - pf->bbits)));
2197    }
2198}
2199
2200static void set_pixel_format(VncState *vs, int bits_per_pixel,
2201                             int big_endian_flag, int true_color_flag,
2202                             int red_max, int green_max, int blue_max,
2203                             int red_shift, int green_shift, int blue_shift)
2204{
2205    if (!true_color_flag) {
2206        /* Expose a reasonable default 256 color map */
2207        bits_per_pixel = 8;
2208        red_max = 7;
2209        green_max = 7;
2210        blue_max = 3;
2211        red_shift = 0;
2212        green_shift = 3;
2213        blue_shift = 6;
2214    }
2215
2216    switch (bits_per_pixel) {
2217    case 8:
2218    case 16:
2219    case 32:
2220        break;
2221    default:
2222        vnc_client_error(vs);
2223        return;
2224    }
2225
2226    vs->client_pf.rmax = red_max ? red_max : 0xFF;
2227    vs->client_pf.rbits = ctpopl(red_max);
2228    vs->client_pf.rshift = red_shift;
2229    vs->client_pf.rmask = red_max << red_shift;
2230    vs->client_pf.gmax = green_max ? green_max : 0xFF;
2231    vs->client_pf.gbits = ctpopl(green_max);
2232    vs->client_pf.gshift = green_shift;
2233    vs->client_pf.gmask = green_max << green_shift;
2234    vs->client_pf.bmax = blue_max ? blue_max : 0xFF;
2235    vs->client_pf.bbits = ctpopl(blue_max);
2236    vs->client_pf.bshift = blue_shift;
2237    vs->client_pf.bmask = blue_max << blue_shift;
2238    vs->client_pf.bits_per_pixel = bits_per_pixel;
2239    vs->client_pf.bytes_per_pixel = bits_per_pixel / 8;
2240    vs->client_pf.depth = bits_per_pixel == 32 ? 24 : bits_per_pixel;
2241    vs->client_be = big_endian_flag;
2242
2243    if (!true_color_flag) {
2244        send_color_map(vs);
2245    }
2246
2247    set_pixel_conversion(vs);
2248
2249    graphic_hw_invalidate(vs->vd->dcl.con);
2250    graphic_hw_update(vs->vd->dcl.con);
2251}
2252
2253static void pixel_format_message (VncState *vs) {
2254    char pad[3] = { 0, 0, 0 };
2255
2256    vs->client_pf = qemu_default_pixelformat(32);
2257
2258    vnc_write_u8(vs, vs->client_pf.bits_per_pixel); /* bits-per-pixel */
2259    vnc_write_u8(vs, vs->client_pf.depth); /* depth */
2260
2261#ifdef HOST_WORDS_BIGENDIAN
2262    vnc_write_u8(vs, 1);             /* big-endian-flag */
2263#else
2264    vnc_write_u8(vs, 0);             /* big-endian-flag */
2265#endif
2266    vnc_write_u8(vs, 1);             /* true-color-flag */
2267    vnc_write_u16(vs, vs->client_pf.rmax);     /* red-max */
2268    vnc_write_u16(vs, vs->client_pf.gmax);     /* green-max */
2269    vnc_write_u16(vs, vs->client_pf.bmax);     /* blue-max */
2270    vnc_write_u8(vs, vs->client_pf.rshift);    /* red-shift */
2271    vnc_write_u8(vs, vs->client_pf.gshift);    /* green-shift */
2272    vnc_write_u8(vs, vs->client_pf.bshift);    /* blue-shift */
2273    vnc_write(vs, pad, 3);           /* padding */
2274
2275    vnc_hextile_set_pixel_conversion(vs, 0);
2276    vs->write_pixels = vnc_write_pixels_copy;
2277}
2278
2279static void vnc_colordepth(VncState *vs)
2280{
2281    if (vnc_has_feature(vs, VNC_FEATURE_WMVI)) {
2282        /* Sending a WMVi message to notify the client*/
2283        vnc_lock_output(vs);
2284        vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
2285        vnc_write_u8(vs, 0);
2286        vnc_write_u16(vs, 1); /* number of rects */
2287        vnc_framebuffer_update(vs, 0, 0,
2288                               pixman_image_get_width(vs->vd->server),
2289                               pixman_image_get_height(vs->vd->server),
2290                               VNC_ENCODING_WMVi);
2291        pixel_format_message(vs);
2292        vnc_unlock_output(vs);
2293        vnc_flush(vs);
2294    } else {
2295        set_pixel_conversion(vs);
2296    }
2297}
2298
2299static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len)
2300{
2301    int i;
2302    uint16_t limit;
2303    uint32_t freq;
2304    VncDisplay *vd = vs->vd;
2305
2306    if (data[0] > 3) {
2307        update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
2308    }
2309
2310    switch (data[0]) {
2311    case VNC_MSG_CLIENT_SET_PIXEL_FORMAT:
2312        if (len == 1)
2313            return 20;
2314
2315        set_pixel_format(vs, read_u8(data, 4),
2316                         read_u8(data, 6), read_u8(data, 7),
2317                         read_u16(data, 8), read_u16(data, 10),
2318                         read_u16(data, 12), read_u8(data, 14),
2319                         read_u8(data, 15), read_u8(data, 16));
2320        break;
2321    case VNC_MSG_CLIENT_SET_ENCODINGS:
2322        if (len == 1)
2323            return 4;
2324
2325        if (len == 4) {
2326            limit = read_u16(data, 2);
2327            if (limit > 0)
2328                return 4 + (limit * 4);
2329        } else
2330            limit = read_u16(data, 2);
2331
2332        for (i = 0; i < limit; i++) {
2333            int32_t val = read_s32(data, 4 + (i * 4));
2334            memcpy(data + 4 + (i * 4), &val, sizeof(val));
2335        }
2336
2337        set_encodings(vs, (int32_t *)(data + 4), limit);
2338        break;
2339    case VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST:
2340        if (len == 1)
2341            return 10;
2342
2343        framebuffer_update_request(vs,
2344                                   read_u8(data, 1), read_u16(data, 2), read_u16(data, 4),
2345                                   read_u16(data, 6), read_u16(data, 8));
2346        break;
2347    case VNC_MSG_CLIENT_KEY_EVENT:
2348        if (len == 1)
2349            return 8;
2350
2351        key_event(vs, read_u8(data, 1), read_u32(data, 4));
2352        break;
2353    case VNC_MSG_CLIENT_POINTER_EVENT:
2354        if (len == 1)
2355            return 6;
2356
2357        pointer_event(vs, read_u8(data, 1), read_u16(data, 2), read_u16(data, 4));
2358        break;
2359    case VNC_MSG_CLIENT_CUT_TEXT:
2360        if (len == 1) {
2361            return 8;
2362        }
2363        if (len == 8) {
2364            uint32_t dlen = read_u32(data, 4);
2365            if (dlen > (1 << 20)) {
2366                error_report("vnc: client_cut_text msg payload has %u bytes"
2367                             " which exceeds our limit of 1MB.", dlen);
2368                vnc_client_error(vs);
2369                break;
2370            }
2371            if (dlen > 0) {
2372                return 8 + dlen;
2373            }
2374        }
2375
2376        client_cut_text(vs, read_u32(data, 4), data + 8);
2377        break;
2378    case VNC_MSG_CLIENT_QEMU:
2379        if (len == 1)
2380            return 2;
2381
2382        switch (read_u8(data, 1)) {
2383        case VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT:
2384            if (len == 2)
2385                return 12;
2386
2387            ext_key_event(vs, read_u16(data, 2),
2388                          read_u32(data, 4), read_u32(data, 8));
2389            break;
2390        case VNC_MSG_CLIENT_QEMU_AUDIO:
2391            if (len == 2)
2392                return 4;
2393
2394            switch (read_u16 (data, 2)) {
2395            case VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE:
2396                audio_add(vs);
2397                break;
2398            case VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE:
2399                audio_del(vs);
2400                break;
2401            case VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT:
2402                if (len == 4)
2403                    return 10;
2404                switch (read_u8(data, 4)) {
2405                case 0: vs->as.fmt = AUD_FMT_U8; break;
2406                case 1: vs->as.fmt = AUD_FMT_S8; break;
2407                case 2: vs->as.fmt = AUD_FMT_U16; break;
2408                case 3: vs->as.fmt = AUD_FMT_S16; break;
2409                case 4: vs->as.fmt = AUD_FMT_U32; break;
2410                case 5: vs->as.fmt = AUD_FMT_S32; break;
2411                default:
2412                    VNC_DEBUG("Invalid audio format %d\n", read_u8(data, 4));
2413                    vnc_client_error(vs);
2414                    break;
2415                }
2416                vs->as.nchannels = read_u8(data, 5);
2417                if (vs->as.nchannels != 1 && vs->as.nchannels != 2) {
2418                    VNC_DEBUG("Invalid audio channel count %d\n",
2419                              read_u8(data, 5));
2420                    vnc_client_error(vs);
2421                    break;
2422                }
2423                freq = read_u32(data, 6);
2424                /* No official limit for protocol, but 48khz is a sensible
2425                 * upper bound for trustworthy clients, and this limit
2426                 * protects calculations involving 'vs->as.freq' later.
2427                 */
2428                if (freq > 48000) {
2429                    VNC_DEBUG("Invalid audio frequency %u > 48000", freq);
2430                    vnc_client_error(vs);
2431                    break;
2432                }
2433                vs->as.freq = freq;
2434                break;
2435            default:
2436                VNC_DEBUG("Invalid audio message %d\n", read_u8(data, 4));
2437                vnc_client_error(vs);
2438                break;
2439            }
2440            break;
2441
2442        default:
2443            VNC_DEBUG("Msg: %d\n", read_u16(data, 0));
2444            vnc_client_error(vs);
2445            break;
2446        }
2447        break;
2448    default:
2449        VNC_DEBUG("Msg: %d\n", data[0]);
2450        vnc_client_error(vs);
2451        break;
2452    }
2453
2454    vnc_update_throttle_offset(vs);
2455    vnc_read_when(vs, protocol_client_msg, 1);
2456    return 0;
2457}
2458
2459static int protocol_client_init(VncState *vs, uint8_t *data, size_t len)
2460{
2461    char buf[1024];
2462    VncShareMode mode;
2463    int size;
2464
2465    mode = data[0] ? VNC_SHARE_MODE_SHARED : VNC_SHARE_MODE_EXCLUSIVE;
2466    switch (vs->vd->share_policy) {
2467    case VNC_SHARE_POLICY_IGNORE:
2468        /*
2469         * Ignore the shared flag.  Nothing to do here.
2470         *
2471         * Doesn't conform to the rfb spec but is traditional qemu
2472         * behavior, thus left here as option for compatibility
2473         * reasons.
2474         */
2475        break;
2476    case VNC_SHARE_POLICY_ALLOW_EXCLUSIVE:
2477        /*
2478         * Policy: Allow clients ask for exclusive access.
2479         *
2480         * Implementation: When a client asks for exclusive access,
2481         * disconnect all others. Shared connects are allowed as long
2482         * as no exclusive connection exists.
2483         *
2484         * This is how the rfb spec suggests to handle the shared flag.
2485         */
2486        if (mode == VNC_SHARE_MODE_EXCLUSIVE) {
2487            VncState *client;
2488            QTAILQ_FOREACH(client, &vs->vd->clients, next) {
2489                if (vs == client) {
2490                    continue;
2491                }
2492                if (client->share_mode != VNC_SHARE_MODE_EXCLUSIVE &&
2493                    client->share_mode != VNC_SHARE_MODE_SHARED) {
2494                    continue;
2495                }
2496                vnc_disconnect_start(client);
2497            }
2498        }
2499        if (mode == VNC_SHARE_MODE_SHARED) {
2500            if (vs->vd->num_exclusive > 0) {
2501                vnc_disconnect_start(vs);
2502                return 0;
2503            }
2504        }
2505        break;
2506    case VNC_SHARE_POLICY_FORCE_SHARED:
2507        /*
2508         * Policy: Shared connects only.
2509         * Implementation: Disallow clients asking for exclusive access.
2510         *
2511         * Useful for shared desktop sessions where you don't want
2512         * someone forgetting to say -shared when running the vnc
2513         * client disconnect everybody else.
2514         */
2515        if (mode == VNC_SHARE_MODE_EXCLUSIVE) {
2516            vnc_disconnect_start(vs);
2517            return 0;
2518        }
2519        break;
2520    }
2521    vnc_set_share_mode(vs, mode);
2522
2523    if (vs->vd->num_shared > vs->vd->connections_limit) {
2524        vnc_disconnect_start(vs);
2525        return 0;
2526    }
2527
2528    assert(pixman_image_get_width(vs->vd->server) < 65536 &&
2529           pixman_image_get_width(vs->vd->server) >= 0);
2530    assert(pixman_image_get_height(vs->vd->server) < 65536 &&
2531           pixman_image_get_height(vs->vd->server) >= 0);
2532    vs->client_width = pixman_image_get_width(vs->vd->server);
2533    vs->client_height = pixman_image_get_height(vs->vd->server);
2534    vnc_write_u16(vs, vs->client_width);
2535    vnc_write_u16(vs, vs->client_height);
2536
2537    pixel_format_message(vs);
2538
2539    if (qemu_name) {
2540        size = snprintf(buf, sizeof(buf), "QEMU (%s)", qemu_name);
2541        if (size > sizeof(buf)) {
2542            size = sizeof(buf);
2543        }
2544    } else {
2545        size = snprintf(buf, sizeof(buf), "QEMU");
2546    }
2547
2548    vnc_write_u32(vs, size);
2549    vnc_write(vs, buf, size);
2550    vnc_flush(vs);
2551
2552    vnc_client_cache_auth(vs);
2553    vnc_qmp_event(vs, QAPI_EVENT_VNC_INITIALIZED);
2554
2555    vnc_read_when(vs, protocol_client_msg, 1);
2556
2557    return 0;
2558}
2559
2560void start_client_init(VncState *vs)
2561{
2562    vnc_read_when(vs, protocol_client_init, 1);
2563}
2564
2565static void make_challenge(VncState *vs)
2566{
2567    int i;
2568
2569    srand(time(NULL)+getpid()+getpid()*987654+rand());
2570
2571    for (i = 0 ; i < sizeof(vs->challenge) ; i++)
2572        vs->challenge[i] = (int) (256.0*rand()/(RAND_MAX+1.0));
2573}
2574
2575static int protocol_client_auth_vnc(VncState *vs, uint8_t *data, size_t len)
2576{
2577    unsigned char response[VNC_AUTH_CHALLENGE_SIZE];
2578    size_t i, pwlen;
2579    unsigned char key[8];
2580    time_t now = time(NULL);
2581    QCryptoCipher *cipher = NULL;
2582    Error *err = NULL;
2583
2584    if (!vs->vd->password) {
2585        trace_vnc_auth_fail(vs, vs->auth, "password is not set", "");
2586        goto reject;
2587    }
2588    if (vs->vd->expires < now) {
2589        trace_vnc_auth_fail(vs, vs->auth, "password is expired", "");
2590        goto reject;
2591    }
2592
2593    memcpy(response, vs->challenge, VNC_AUTH_CHALLENGE_SIZE);
2594
2595    /* Calculate the expected challenge response */
2596    pwlen = strlen(vs->vd->password);
2597    for (i=0; i<sizeof(key); i++)
2598        key[i] = i<pwlen ? vs->vd->password[i] : 0;
2599
2600    cipher = qcrypto_cipher_new(
2601        QCRYPTO_CIPHER_ALG_DES_RFB,
2602        QCRYPTO_CIPHER_MODE_ECB,
2603        key, G_N_ELEMENTS(key),
2604        &err);
2605    if (!cipher) {
2606        trace_vnc_auth_fail(vs, vs->auth, "cannot create cipher",
2607                            error_get_pretty(err));
2608        error_free(err);
2609        goto reject;
2610    }
2611
2612    if (qcrypto_cipher_encrypt(cipher,
2613                               vs->challenge,
2614                               response,
2615                               VNC_AUTH_CHALLENGE_SIZE,
2616                               &err) < 0) {
2617        trace_vnc_auth_fail(vs, vs->auth, "cannot encrypt challenge response",
2618                            error_get_pretty(err));
2619        error_free(err);
2620        goto reject;
2621    }
2622
2623    /* Compare expected vs actual challenge response */
2624    if (memcmp(response, data, VNC_AUTH_CHALLENGE_SIZE) != 0) {
2625        trace_vnc_auth_fail(vs, vs->auth, "mis-matched challenge response", "");
2626        goto reject;
2627    } else {
2628        trace_vnc_auth_pass(vs, vs->auth);
2629        vnc_write_u32(vs, 0); /* Accept auth */
2630        vnc_flush(vs);
2631
2632        start_client_init(vs);
2633    }
2634
2635    qcrypto_cipher_free(cipher);
2636    return 0;
2637
2638reject:
2639    vnc_write_u32(vs, 1); /* Reject auth */
2640    if (vs->minor >= 8) {
2641        static const char err[] = "Authentication failed";
2642        vnc_write_u32(vs, sizeof(err));
2643        vnc_write(vs, err, sizeof(err));
2644    }
2645    vnc_flush(vs);
2646    vnc_client_error(vs);
2647    qcrypto_cipher_free(cipher);
2648    return 0;
2649}
2650
2651void start_auth_vnc(VncState *vs)
2652{
2653    make_challenge(vs);
2654    /* Send client a 'random' challenge */
2655    vnc_write(vs, vs->challenge, sizeof(vs->challenge));
2656    vnc_flush(vs);
2657
2658    vnc_read_when(vs, protocol_client_auth_vnc, sizeof(vs->challenge));
2659}
2660
2661
2662static int protocol_client_auth(VncState *vs, uint8_t *data, size_t len)
2663{
2664    /* We only advertise 1 auth scheme at a time, so client
2665     * must pick the one we sent. Verify this */
2666    if (data[0] != vs->auth) { /* Reject auth */
2667       trace_vnc_auth_reject(vs, vs->auth, (int)data[0]);
2668       vnc_write_u32(vs, 1);
2669       if (vs->minor >= 8) {
2670           static const char err[] = "Authentication failed";
2671           vnc_write_u32(vs, sizeof(err));
2672           vnc_write(vs, err, sizeof(err));
2673       }
2674       vnc_client_error(vs);
2675    } else { /* Accept requested auth */
2676       trace_vnc_auth_start(vs, vs->auth);
2677       switch (vs->auth) {
2678       case VNC_AUTH_NONE:
2679           if (vs->minor >= 8) {
2680               vnc_write_u32(vs, 0); /* Accept auth completion */
2681               vnc_flush(vs);
2682           }
2683           trace_vnc_auth_pass(vs, vs->auth);
2684           start_client_init(vs);
2685           break;
2686
2687       case VNC_AUTH_VNC:
2688           start_auth_vnc(vs);
2689           break;
2690
2691       case VNC_AUTH_VENCRYPT:
2692           start_auth_vencrypt(vs);
2693           break;
2694
2695#ifdef CONFIG_VNC_SASL
2696       case VNC_AUTH_SASL:
2697           start_auth_sasl(vs);
2698           break;
2699#endif /* CONFIG_VNC_SASL */
2700
2701       default: /* Should not be possible, but just in case */
2702           trace_vnc_auth_fail(vs, vs->auth, "Unhandled auth method", "");
2703           vnc_write_u8(vs, 1);
2704           if (vs->minor >= 8) {
2705               static const char err[] = "Authentication failed";
2706               vnc_write_u32(vs, sizeof(err));
2707               vnc_write(vs, err, sizeof(err));
2708           }
2709           vnc_client_error(vs);
2710       }
2711    }
2712    return 0;
2713}
2714
2715static int protocol_version(VncState *vs, uint8_t *version, size_t len)
2716{
2717    char local[13];
2718
2719    memcpy(local, version, 12);
2720    local[12] = 0;
2721
2722    if (sscanf(local, "RFB %03d.%03d\n", &vs->major, &vs->minor) != 2) {
2723        VNC_DEBUG("Malformed protocol version %s\n", local);
2724        vnc_client_error(vs);
2725        return 0;
2726    }
2727    VNC_DEBUG("Client request protocol version %d.%d\n", vs->major, vs->minor);
2728    if (vs->major != 3 ||
2729        (vs->minor != 3 &&
2730         vs->minor != 4 &&
2731         vs->minor != 5 &&
2732         vs->minor != 7 &&
2733         vs->minor != 8)) {
2734        VNC_DEBUG("Unsupported client version\n");
2735        vnc_write_u32(vs, VNC_AUTH_INVALID);
2736        vnc_flush(vs);
2737        vnc_client_error(vs);
2738        return 0;
2739    }
2740    /* Some broken clients report v3.4 or v3.5, which spec requires to be treated
2741     * as equivalent to v3.3 by servers
2742     */
2743    if (vs->minor == 4 || vs->minor == 5)
2744        vs->minor = 3;
2745
2746    if (vs->minor == 3) {
2747        trace_vnc_auth_start(vs, vs->auth);
2748        if (vs->auth == VNC_AUTH_NONE) {
2749            vnc_write_u32(vs, vs->auth);
2750            vnc_flush(vs);
2751            trace_vnc_auth_pass(vs, vs->auth);
2752            start_client_init(vs);
2753       } else if (vs->auth == VNC_AUTH_VNC) {
2754            VNC_DEBUG("Tell client VNC auth\n");
2755            vnc_write_u32(vs, vs->auth);
2756            vnc_flush(vs);
2757            start_auth_vnc(vs);
2758       } else {
2759            trace_vnc_auth_fail(vs, vs->auth,
2760                                "Unsupported auth method for v3.3", "");
2761            vnc_write_u32(vs, VNC_AUTH_INVALID);
2762            vnc_flush(vs);
2763            vnc_client_error(vs);
2764       }
2765    } else {
2766        vnc_write_u8(vs, 1); /* num auth */
2767        vnc_write_u8(vs, vs->auth);
2768        vnc_read_when(vs, protocol_client_auth, 1);
2769        vnc_flush(vs);
2770    }
2771
2772    return 0;
2773}
2774
2775static VncRectStat *vnc_stat_rect(VncDisplay *vd, int x, int y)
2776{
2777    struct VncSurface *vs = &vd->guest;
2778
2779    return &vs->stats[y / VNC_STAT_RECT][x / VNC_STAT_RECT];
2780}
2781
2782void vnc_sent_lossy_rect(VncState *vs, int x, int y, int w, int h)
2783{
2784    int i, j;
2785
2786    w = (x + w) / VNC_STAT_RECT;
2787    h = (y + h) / VNC_STAT_RECT;
2788    x /= VNC_STAT_RECT;
2789    y /= VNC_STAT_RECT;
2790
2791    for (j = y; j <= h; j++) {
2792        for (i = x; i <= w; i++) {
2793            vs->lossy_rect[j][i] = 1;
2794        }
2795    }
2796}
2797
2798static int vnc_refresh_lossy_rect(VncDisplay *vd, int x, int y)
2799{
2800    VncState *vs;
2801    int sty = y / VNC_STAT_RECT;
2802    int stx = x / VNC_STAT_RECT;
2803    int has_dirty = 0;
2804
2805    y = QEMU_ALIGN_DOWN(y, VNC_STAT_RECT);
2806    x = QEMU_ALIGN_DOWN(x, VNC_STAT_RECT);
2807
2808    QTAILQ_FOREACH(vs, &vd->clients, next) {
2809        int j;
2810
2811        /* kernel send buffers are full -> refresh later */
2812        if (vs->output.offset) {
2813            continue;
2814        }
2815
2816        if (!vs->lossy_rect[sty][stx]) {
2817            continue;
2818        }
2819
2820        vs->lossy_rect[sty][stx] = 0;
2821        for (j = 0; j < VNC_STAT_RECT; ++j) {
2822            bitmap_set(vs->dirty[y + j],
2823                       x / VNC_DIRTY_PIXELS_PER_BIT,
2824                       VNC_STAT_RECT / VNC_DIRTY_PIXELS_PER_BIT);
2825        }
2826        has_dirty++;
2827    }
2828
2829    return has_dirty;
2830}
2831
2832static int vnc_update_stats(VncDisplay *vd,  struct timeval * tv)
2833{
2834    int width = MIN(pixman_image_get_width(vd->guest.fb),
2835                    pixman_image_get_width(vd->server));
2836    int height = MIN(pixman_image_get_height(vd->guest.fb),
2837                     pixman_image_get_height(vd->server));
2838    int x, y;
2839    struct timeval res;
2840    int has_dirty = 0;
2841
2842    for (y = 0; y < height; y += VNC_STAT_RECT) {
2843        for (x = 0; x < width; x += VNC_STAT_RECT) {
2844            VncRectStat *rect = vnc_stat_rect(vd, x, y);
2845
2846            rect->updated = false;
2847        }
2848    }
2849
2850    qemu_timersub(tv, &VNC_REFRESH_STATS, &res);
2851
2852    if (timercmp(&vd->guest.last_freq_check, &res, >)) {
2853        return has_dirty;
2854    }
2855    vd->guest.last_freq_check = *tv;
2856
2857    for (y = 0; y < height; y += VNC_STAT_RECT) {
2858        for (x = 0; x < width; x += VNC_STAT_RECT) {
2859            VncRectStat *rect= vnc_stat_rect(vd, x, y);
2860            int count = ARRAY_SIZE(rect->times);
2861            struct timeval min, max;
2862
2863            if (!timerisset(&rect->times[count - 1])) {
2864                continue ;
2865            }
2866
2867            max = rect->times[(rect->idx + count - 1) % count];
2868            qemu_timersub(tv, &max, &res);
2869
2870            if (timercmp(&res, &VNC_REFRESH_LOSSY, >)) {
2871                rect->freq = 0;
2872                has_dirty += vnc_refresh_lossy_rect(vd, x, y);
2873                memset(rect->times, 0, sizeof (rect->times));
2874                continue ;
2875            }
2876
2877            min = rect->times[rect->idx];
2878            max = rect->times[(rect->idx + count - 1) % count];
2879            qemu_timersub(&max, &min, &res);
2880
2881            rect->freq = res.tv_sec + res.tv_usec / 1000000.;
2882            rect->freq /= count;
2883            rect->freq = 1. / rect->freq;
2884        }
2885    }
2886    return has_dirty;
2887}
2888
2889double vnc_update_freq(VncState *vs, int x, int y, int w, int h)
2890{
2891    int i, j;
2892    double total = 0;
2893    int num = 0;
2894
2895    x =  QEMU_ALIGN_DOWN(x, VNC_STAT_RECT);
2896    y =  QEMU_ALIGN_DOWN(y, VNC_STAT_RECT);
2897
2898    for (j = y; j <= y + h; j += VNC_STAT_RECT) {
2899        for (i = x; i <= x + w; i += VNC_STAT_RECT) {
2900            total += vnc_stat_rect(vs->vd, i, j)->freq;
2901            num++;
2902        }
2903    }
2904
2905    if (num) {
2906        return total / num;
2907    } else {
2908        return 0;
2909    }
2910}
2911
2912static void vnc_rect_updated(VncDisplay *vd, int x, int y, struct timeval * tv)
2913{
2914    VncRectStat *rect;
2915
2916    rect = vnc_stat_rect(vd, x, y);
2917    if (rect->updated) {
2918        return ;
2919    }
2920    rect->times[rect->idx] = *tv;
2921    rect->idx = (rect->idx + 1) % ARRAY_SIZE(rect->times);
2922    rect->updated = true;
2923}
2924
2925static int vnc_refresh_server_surface(VncDisplay *vd)
2926{
2927    int width = MIN(pixman_image_get_width(vd->guest.fb),
2928                    pixman_image_get_width(vd->server));
2929    int height = MIN(pixman_image_get_height(vd->guest.fb),
2930                     pixman_image_get_height(vd->server));
2931    int cmp_bytes, server_stride, line_bytes, guest_ll, guest_stride, y = 0;
2932    uint8_t *guest_row0 = NULL, *server_row0;
2933    VncState *vs;
2934    int has_dirty = 0;
2935    pixman_image_t *tmpbuf = NULL;
2936
2937    struct timeval tv = { 0, 0 };
2938
2939    if (!vd->non_adaptive) {
2940        gettimeofday(&tv, NULL);
2941        has_dirty = vnc_update_stats(vd, &tv);
2942    }
2943
2944    /*
2945     * Walk through the guest dirty map.
2946     * Check and copy modified bits from guest to server surface.
2947     * Update server dirty map.
2948     */
2949    server_row0 = (uint8_t *)pixman_image_get_data(vd->server);
2950    server_stride = guest_stride = guest_ll =
2951        pixman_image_get_stride(vd->server);
2952    cmp_bytes = MIN(VNC_DIRTY_PIXELS_PER_BIT * VNC_SERVER_FB_BYTES,
2953                    server_stride);
2954    if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
2955        int width = pixman_image_get_width(vd->server);
2956        tmpbuf = qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, width);
2957    } else {
2958        int guest_bpp =
2959            PIXMAN_FORMAT_BPP(pixman_image_get_format(vd->guest.fb));
2960        guest_row0 = (uint8_t *)pixman_image_get_data(vd->guest.fb);
2961        guest_stride = pixman_image_get_stride(vd->guest.fb);
2962        guest_ll = pixman_image_get_width(vd->guest.fb) * (DIV_ROUND_UP(guest_bpp, 8));
2963    }
2964    line_bytes = MIN(server_stride, guest_ll);
2965
2966    for (;;) {
2967        int x;
2968        uint8_t *guest_ptr, *server_ptr;
2969        unsigned long offset = find_next_bit((unsigned long *) &vd->guest.dirty,
2970                                             height * VNC_DIRTY_BPL(&vd->guest),
2971                                             y * VNC_DIRTY_BPL(&vd->guest));
2972        if (offset == height * VNC_DIRTY_BPL(&vd->guest)) {
2973            /* no more dirty bits */
2974            break;
2975        }
2976        y = offset / VNC_DIRTY_BPL(&vd->guest);
2977        x = offset % VNC_DIRTY_BPL(&vd->guest);
2978
2979        server_ptr = server_row0 + y * server_stride + x * cmp_bytes;
2980
2981        if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
2982            qemu_pixman_linebuf_fill(tmpbuf, vd->guest.fb, width, 0, y);
2983            guest_ptr = (uint8_t *)pixman_image_get_data(tmpbuf);
2984        } else {
2985            guest_ptr = guest_row0 + y * guest_stride;
2986        }
2987        guest_ptr += x * cmp_bytes;
2988
2989        for (; x < DIV_ROUND_UP(width, VNC_DIRTY_PIXELS_PER_BIT);
2990             x++, guest_ptr += cmp_bytes, server_ptr += cmp_bytes) {
2991            int _cmp_bytes = cmp_bytes;
2992            if (!test_and_clear_bit(x, vd->guest.dirty[y])) {
2993                continue;
2994            }
2995            if ((x + 1) * cmp_bytes > line_bytes) {
2996                _cmp_bytes = line_bytes - x * cmp_bytes;
2997            }
2998            assert(_cmp_bytes >= 0);
2999            if (memcmp(server_ptr, guest_ptr, _cmp_bytes) == 0) {
3000                continue;
3001            }
3002            memcpy(server_ptr, guest_ptr, _cmp_bytes);
3003            if (!vd->non_adaptive) {
3004                vnc_rect_updated(vd, x * VNC_DIRTY_PIXELS_PER_BIT,
3005                                 y, &tv);
3006            }
3007            QTAILQ_FOREACH(vs, &vd->clients, next) {
3008                set_bit(x, vs->dirty[y]);
3009            }
3010            has_dirty++;
3011        }
3012
3013        y++;
3014    }
3015    qemu_pixman_image_unref(tmpbuf);
3016    return has_dirty;
3017}
3018
3019static void vnc_refresh(DisplayChangeListener *dcl)
3020{
3021    VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
3022    VncState *vs, *vn;
3023    int has_dirty, rects = 0;
3024
3025    if (QTAILQ_EMPTY(&vd->clients)) {
3026        update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_MAX);
3027        return;
3028    }
3029
3030    graphic_hw_update(vd->dcl.con);
3031
3032    if (vnc_trylock_display(vd)) {
3033        update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
3034        return;
3035    }
3036
3037    has_dirty = vnc_refresh_server_surface(vd);
3038    vnc_unlock_display(vd);
3039
3040    QTAILQ_FOREACH_SAFE(vs, &vd->clients, next, vn) {
3041        rects += vnc_update_client(vs, has_dirty);
3042        /* vs might be free()ed here */
3043    }
3044
3045    if (has_dirty && rects) {
3046        vd->dcl.update_interval /= 2;
3047        if (vd->dcl.update_interval < VNC_REFRESH_INTERVAL_BASE) {
3048            vd->dcl.update_interval = VNC_REFRESH_INTERVAL_BASE;
3049        }
3050    } else {
3051        vd->dcl.update_interval += VNC_REFRESH_INTERVAL_INC;
3052        if (vd->dcl.update_interval > VNC_REFRESH_INTERVAL_MAX) {
3053            vd->dcl.update_interval = VNC_REFRESH_INTERVAL_MAX;
3054        }
3055    }
3056}
3057
3058static void vnc_connect(VncDisplay *vd, QIOChannelSocket *sioc,
3059                        bool skipauth, bool websocket)
3060{
3061    VncState *vs = g_new0(VncState, 1);
3062    bool first_client = QTAILQ_EMPTY(&vd->clients);
3063    int i;
3064
3065    trace_vnc_client_connect(vs, sioc);
3066    vs->sioc = sioc;
3067    object_ref(OBJECT(vs->sioc));
3068    vs->ioc = QIO_CHANNEL(sioc);
3069    object_ref(OBJECT(vs->ioc));
3070    vs->vd = vd;
3071
3072    buffer_init(&vs->input,          "vnc-input/%p", sioc);
3073    buffer_init(&vs->output,         "vnc-output/%p", sioc);
3074    buffer_init(&vs->jobs_buffer,    "vnc-jobs_buffer/%p", sioc);
3075
3076    buffer_init(&vs->tight.tight,    "vnc-tight/%p", sioc);
3077    buffer_init(&vs->tight.zlib,     "vnc-tight-zlib/%p", sioc);
3078    buffer_init(&vs->tight.gradient, "vnc-tight-gradient/%p", sioc);
3079#ifdef CONFIG_VNC_JPEG
3080    buffer_init(&vs->tight.jpeg,     "vnc-tight-jpeg/%p", sioc);
3081#endif
3082#ifdef CONFIG_VNC_PNG
3083    buffer_init(&vs->tight.png,      "vnc-tight-png/%p", sioc);
3084#endif
3085    buffer_init(&vs->zlib.zlib,      "vnc-zlib/%p", sioc);
3086    buffer_init(&vs->zrle.zrle,      "vnc-zrle/%p", sioc);
3087    buffer_init(&vs->zrle.fb,        "vnc-zrle-fb/%p", sioc);
3088    buffer_init(&vs->zrle.zlib,      "vnc-zrle-zlib/%p", sioc);
3089
3090    if (skipauth) {
3091        vs->auth = VNC_AUTH_NONE;
3092        vs->subauth = VNC_AUTH_INVALID;
3093    } else {
3094        if (websocket) {
3095            vs->auth = vd->ws_auth;
3096            vs->subauth = VNC_AUTH_INVALID;
3097        } else {
3098            vs->auth = vd->auth;
3099            vs->subauth = vd->subauth;
3100        }
3101    }
3102    VNC_DEBUG("Client sioc=%p ws=%d auth=%d subauth=%d\n",
3103              sioc, websocket, vs->auth, vs->subauth);
3104
3105    vs->lossy_rect = g_malloc0(VNC_STAT_ROWS * sizeof (*vs->lossy_rect));
3106    for (i = 0; i < VNC_STAT_ROWS; ++i) {
3107        vs->lossy_rect[i] = g_new0(uint8_t, VNC_STAT_COLS);
3108    }
3109
3110    VNC_DEBUG("New client on socket %p\n", vs->sioc);
3111    update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
3112    qio_channel_set_blocking(vs->ioc, false, NULL);
3113    if (vs->ioc_tag) {
3114        g_source_remove(vs->ioc_tag);
3115    }
3116    if (websocket) {
3117        vs->websocket = 1;
3118        if (vd->tlscreds) {
3119            vs->ioc_tag = qio_channel_add_watch(
3120                vs->ioc, G_IO_IN, vncws_tls_handshake_io, vs, NULL);
3121        } else {
3122            vs->ioc_tag = qio_channel_add_watch(
3123                vs->ioc, G_IO_IN, vncws_handshake_io, vs, NULL);
3124        }
3125    } else {
3126        vs->ioc_tag = qio_channel_add_watch(
3127            vs->ioc, G_IO_IN, vnc_client_io, vs, NULL);
3128    }
3129
3130    vnc_client_cache_addr(vs);
3131    vnc_qmp_event(vs, QAPI_EVENT_VNC_CONNECTED);
3132    vnc_set_share_mode(vs, VNC_SHARE_MODE_CONNECTING);
3133
3134    vs->last_x = -1;
3135    vs->last_y = -1;
3136
3137    vs->as.freq = 44100;
3138    vs->as.nchannels = 2;
3139    vs->as.fmt = AUD_FMT_S16;
3140    vs->as.endianness = 0;
3141
3142    qemu_mutex_init(&vs->output_mutex);
3143    vs->bh = qemu_bh_new(vnc_jobs_bh, vs);
3144
3145    QTAILQ_INSERT_TAIL(&vd->clients, vs, next);
3146    if (first_client) {
3147        vnc_update_server_surface(vd);
3148    }
3149
3150    graphic_hw_update(vd->dcl.con);
3151
3152    if (!vs->websocket) {
3153        vnc_start_protocol(vs);
3154    }
3155
3156    if (vd->num_connecting > vd->connections_limit) {
3157        QTAILQ_FOREACH(vs, &vd->clients, next) {
3158            if (vs->share_mode == VNC_SHARE_MODE_CONNECTING) {
3159                vnc_disconnect_start(vs);
3160                return;
3161            }
3162        }
3163    }
3164}
3165
3166void vnc_start_protocol(VncState *vs)
3167{
3168    vnc_write(vs, "RFB 003.008\n", 12);
3169    vnc_flush(vs);
3170    vnc_read_when(vs, protocol_version, 12);
3171
3172    vs->mouse_mode_notifier.notify = check_pointer_type_change;
3173    qemu_add_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
3174}
3175
3176static void vnc_listen_io(QIONetListener *listener,
3177                          QIOChannelSocket *cioc,
3178                          void *opaque)
3179{
3180    VncDisplay *vd = opaque;
3181    bool isWebsock = listener == vd->wslistener;
3182
3183    qio_channel_set_name(QIO_CHANNEL(cioc),
3184                         isWebsock ? "vnc-ws-server" : "vnc-server");
3185    qio_channel_set_delay(QIO_CHANNEL(cioc), false);
3186    vnc_connect(vd, cioc, false, isWebsock);
3187}
3188
3189static const DisplayChangeListenerOps dcl_ops = {
3190    .dpy_name             = "vnc",
3191    .dpy_refresh          = vnc_refresh,
3192    .dpy_gfx_update       = vnc_dpy_update,
3193    .dpy_gfx_switch       = vnc_dpy_switch,
3194    .dpy_gfx_check_format = qemu_pixman_check_format,
3195    .dpy_mouse_set        = vnc_mouse_set,
3196    .dpy_cursor_define    = vnc_dpy_cursor_define,
3197};
3198
3199void vnc_display_init(const char *id)
3200{
3201    VncDisplay *vd;
3202
3203    if (vnc_display_find(id) != NULL) {
3204        return;
3205    }
3206    vd = g_malloc0(sizeof(*vd));
3207
3208    vd->id = strdup(id);
3209    QTAILQ_INSERT_TAIL(&vnc_displays, vd, next);
3210
3211    QTAILQ_INIT(&vd->clients);
3212    vd->expires = TIME_MAX;
3213
3214    if (keyboard_layout) {
3215        trace_vnc_key_map_init(keyboard_layout);
3216        vd->kbd_layout = init_keyboard_layout(name2keysym, keyboard_layout);
3217    } else {
3218        vd->kbd_layout = init_keyboard_layout(name2keysym, "en-us");
3219    }
3220
3221    if (!vd->kbd_layout) {
3222        exit(1);
3223    }
3224
3225    vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
3226    vd->connections_limit = 32;
3227
3228    qemu_mutex_init(&vd->mutex);
3229    vnc_start_worker_thread();
3230
3231    vd->dcl.ops = &dcl_ops;
3232    register_displaychangelistener(&vd->dcl);
3233}
3234
3235
3236static void vnc_display_close(VncDisplay *vd)
3237{
3238    if (!vd) {
3239        return;
3240    }
3241    vd->is_unix = false;
3242
3243    if (vd->listener) {
3244        qio_net_listener_disconnect(vd->listener);
3245        object_unref(OBJECT(vd->listener));
3246    }
3247    vd->listener = NULL;
3248
3249    if (vd->wslistener) {
3250        qio_net_listener_disconnect(vd->wslistener);
3251        object_unref(OBJECT(vd->wslistener));
3252    }
3253    vd->wslistener = NULL;
3254
3255    vd->auth = VNC_AUTH_INVALID;
3256    vd->subauth = VNC_AUTH_INVALID;
3257    if (vd->tlscreds) {
3258        object_unparent(OBJECT(vd->tlscreds));
3259        vd->tlscreds = NULL;
3260    }
3261    g_free(vd->tlsaclname);
3262    vd->tlsaclname = NULL;
3263    if (vd->lock_key_sync) {
3264        qemu_remove_led_event_handler(vd->led);
3265        vd->led = NULL;
3266    }
3267}
3268
3269int vnc_display_password(const char *id, const char *password)
3270{
3271    VncDisplay *vd = vnc_display_find(id);
3272
3273    if (!vd) {
3274        return -EINVAL;
3275    }
3276    if (vd->auth == VNC_AUTH_NONE) {
3277        error_printf_unless_qmp("If you want use passwords please enable "
3278                                "password auth using '-vnc ${dpy},password'.\n");
3279        return -EINVAL;
3280    }
3281
3282    g_free(vd->password);
3283    vd->password = g_strdup(password);
3284
3285    return 0;
3286}
3287
3288int vnc_display_pw_expire(const char *id, time_t expires)
3289{
3290    VncDisplay *vd = vnc_display_find(id);
3291
3292    if (!vd) {
3293        return -EINVAL;
3294    }
3295
3296    vd->expires = expires;
3297    return 0;
3298}
3299
3300static void vnc_display_print_local_addr(VncDisplay *vd)
3301{
3302    SocketAddress *addr;
3303    Error *err = NULL;
3304
3305    if (!vd->listener || !vd->listener->nsioc) {
3306        return;
3307    }
3308
3309    addr = qio_channel_socket_get_local_address(vd->listener->sioc[0], &err);
3310    if (!addr) {
3311        return;
3312    }
3313
3314    if (addr->type != SOCKET_ADDRESS_TYPE_INET) {
3315        qapi_free_SocketAddress(addr);
3316        return;
3317    }
3318    error_printf_unless_qmp("VNC server running on %s:%s\n",
3319                            addr->u.inet.host,
3320                            addr->u.inet.port);
3321    qapi_free_SocketAddress(addr);
3322}
3323
3324static QemuOptsList qemu_vnc_opts = {
3325    .name = "vnc",
3326    .head = QTAILQ_HEAD_INITIALIZER(qemu_vnc_opts.head),
3327    .implied_opt_name = "vnc",
3328    .desc = {
3329        {
3330            .name = "vnc",
3331            .type = QEMU_OPT_STRING,
3332        },{
3333            .name = "websocket",
3334            .type = QEMU_OPT_STRING,
3335        },{
3336            .name = "tls-creds",
3337            .type = QEMU_OPT_STRING,
3338        },{
3339            /* Deprecated in favour of tls-creds */
3340            .name = "x509",
3341            .type = QEMU_OPT_STRING,
3342        },{
3343            .name = "share",
3344            .type = QEMU_OPT_STRING,
3345        },{
3346            .name = "display",
3347            .type = QEMU_OPT_STRING,
3348        },{
3349            .name = "head",
3350            .type = QEMU_OPT_NUMBER,
3351        },{
3352            .name = "connections",
3353            .type = QEMU_OPT_NUMBER,
3354        },{
3355            .name = "to",
3356            .type = QEMU_OPT_NUMBER,
3357        },{
3358            .name = "ipv4",
3359            .type = QEMU_OPT_BOOL,
3360        },{
3361            .name = "ipv6",
3362            .type = QEMU_OPT_BOOL,
3363        },{
3364            .name = "password",
3365            .type = QEMU_OPT_BOOL,
3366        },{
3367            .name = "reverse",
3368            .type = QEMU_OPT_BOOL,
3369        },{
3370            .name = "lock-key-sync",
3371            .type = QEMU_OPT_BOOL,
3372        },{
3373            .name = "key-delay-ms",
3374            .type = QEMU_OPT_NUMBER,
3375        },{
3376            .name = "sasl",
3377            .type = QEMU_OPT_BOOL,
3378        },{
3379            /* Deprecated in favour of tls-creds */
3380            .name = "tls",
3381            .type = QEMU_OPT_BOOL,
3382        },{
3383            /* Deprecated in favour of tls-creds */
3384            .name = "x509verify",
3385            .type = QEMU_OPT_STRING,
3386        },{
3387            .name = "acl",
3388            .type = QEMU_OPT_BOOL,
3389        },{
3390            .name = "lossy",
3391            .type = QEMU_OPT_BOOL,
3392        },{
3393            .name = "non-adaptive",
3394            .type = QEMU_OPT_BOOL,
3395        },
3396        { /* end of list */ }
3397    },
3398};
3399
3400
3401static int
3402vnc_display_setup_auth(int *auth,
3403                       int *subauth,
3404                       QCryptoTLSCreds *tlscreds,
3405                       bool password,
3406                       bool sasl,
3407                       bool websocket,
3408                       Error **errp)
3409{
3410    /*
3411     * We have a choice of 3 authentication options
3412     *
3413     *   1. none
3414     *   2. vnc
3415     *   3. sasl
3416     *
3417     * The channel can be run in 2 modes
3418     *
3419     *   1. clear
3420     *   2. tls
3421     *
3422     * And TLS can use 2 types of credentials
3423     *
3424     *   1. anon
3425     *   2. x509
3426     *
3427     * We thus have 9 possible logical combinations
3428     *
3429     *   1. clear + none
3430     *   2. clear + vnc
3431     *   3. clear + sasl
3432     *   4. tls + anon + none
3433     *   5. tls + anon + vnc
3434     *   6. tls + anon + sasl
3435     *   7. tls + x509 + none
3436     *   8. tls + x509 + vnc
3437     *   9. tls + x509 + sasl
3438     *
3439     * These need to be mapped into the VNC auth schemes
3440     * in an appropriate manner. In regular VNC, all the
3441     * TLS options get mapped into VNC_AUTH_VENCRYPT
3442     * sub-auth types.
3443     *
3444     * In websockets, the https:// protocol already provides
3445     * TLS support, so there is no need to make use of the
3446     * VeNCrypt extension. Furthermore, websockets browser
3447     * clients could not use VeNCrypt even if they wanted to,
3448     * as they cannot control when the TLS handshake takes
3449     * place. Thus there is no option but to rely on https://,
3450     * meaning combinations 4->6 and 7->9 will be mapped to
3451     * VNC auth schemes in the same way as combos 1->3.
3452     *
3453     * Regardless of fact that we have a different mapping to
3454     * VNC auth mechs for plain VNC vs websockets VNC, the end
3455     * result has the same security characteristics.
3456     */
3457    if (websocket || !tlscreds) {
3458        if (password) {
3459            VNC_DEBUG("Initializing VNC server with password auth\n");
3460            *auth = VNC_AUTH_VNC;
3461        } else if (sasl) {
3462            VNC_DEBUG("Initializing VNC server with SASL auth\n");
3463            *auth = VNC_AUTH_SASL;
3464        } else {
3465            VNC_DEBUG("Initializing VNC server with no auth\n");
3466            *auth = VNC_AUTH_NONE;
3467        }
3468        *subauth = VNC_AUTH_INVALID;
3469    } else {
3470        bool is_x509 = object_dynamic_cast(OBJECT(tlscreds),
3471                                           TYPE_QCRYPTO_TLS_CREDS_X509) != NULL;
3472        bool is_anon = object_dynamic_cast(OBJECT(tlscreds),
3473                                           TYPE_QCRYPTO_TLS_CREDS_ANON) != NULL;
3474
3475        if (!is_x509 && !is_anon) {
3476            error_setg(errp,
3477                       "Unsupported TLS cred type %s",
3478                       object_get_typename(OBJECT(tlscreds)));
3479            return -1;
3480        }
3481        *auth = VNC_AUTH_VENCRYPT;
3482        if (password) {
3483            if (is_x509) {
3484                VNC_DEBUG("Initializing VNC server with x509 password auth\n");
3485                *subauth = VNC_AUTH_VENCRYPT_X509VNC;
3486            } else {
3487                VNC_DEBUG("Initializing VNC server with TLS password auth\n");
3488                *subauth = VNC_AUTH_VENCRYPT_TLSVNC;
3489            }
3490
3491        } else if (sasl) {
3492            if (is_x509) {
3493                VNC_DEBUG("Initializing VNC server with x509 SASL auth\n");
3494                *subauth = VNC_AUTH_VENCRYPT_X509SASL;
3495            } else {
3496                VNC_DEBUG("Initializing VNC server with TLS SASL auth\n");
3497                *subauth = VNC_AUTH_VENCRYPT_TLSSASL;
3498            }
3499        } else {
3500            if (is_x509) {
3501                VNC_DEBUG("Initializing VNC server with x509 no auth\n");
3502                *subauth = VNC_AUTH_VENCRYPT_X509NONE;
3503            } else {
3504                VNC_DEBUG("Initializing VNC server with TLS no auth\n");
3505                *subauth = VNC_AUTH_VENCRYPT_TLSNONE;
3506            }
3507        }
3508    }
3509    return 0;
3510}
3511
3512
3513/*
3514 * Handle back compat with old CLI syntax by creating some
3515 * suitable QCryptoTLSCreds objects
3516 */
3517static QCryptoTLSCreds *
3518vnc_display_create_creds(bool x509,
3519                         bool x509verify,
3520                         const char *dir,
3521                         const char *id,
3522                         Error **errp)
3523{
3524    gchar *credsid = g_strdup_printf("tlsvnc%s", id);
3525    Object *parent = object_get_objects_root();
3526    Object *creds;
3527    Error *err = NULL;
3528
3529    if (x509) {
3530        creds = object_new_with_props(TYPE_QCRYPTO_TLS_CREDS_X509,
3531                                      parent,
3532                                      credsid,
3533                                      &err,
3534                                      "endpoint", "server",
3535                                      "dir", dir,
3536                                      "verify-peer", x509verify ? "yes" : "no",
3537                                      NULL);
3538    } else {
3539        creds = object_new_with_props(TYPE_QCRYPTO_TLS_CREDS_ANON,
3540                                      parent,
3541                                      credsid,
3542                                      &err,
3543                                      "endpoint", "server",
3544                                      NULL);
3545    }
3546
3547    g_free(credsid);
3548
3549    if (err) {
3550        error_propagate(errp, err);
3551        return NULL;
3552    }
3553
3554    return QCRYPTO_TLS_CREDS(creds);
3555}
3556
3557
3558static int vnc_display_get_address(const char *addrstr,
3559                                   bool websocket,
3560                                   bool reverse,
3561                                   int displaynum,
3562                                   int to,
3563                                   bool has_ipv4,
3564                                   bool has_ipv6,
3565                                   bool ipv4,
3566                                   bool ipv6,
3567                                   SocketAddress **retaddr,
3568                                   Error **errp)
3569{
3570    int ret = -1;
3571    SocketAddress *addr = NULL;
3572
3573    addr = g_new0(SocketAddress, 1);
3574
3575    if (strncmp(addrstr, "unix:", 5) == 0) {
3576        addr->type = SOCKET_ADDRESS_TYPE_UNIX;
3577        addr->u.q_unix.path = g_strdup(addrstr + 5);
3578
3579        if (websocket) {
3580            error_setg(errp, "UNIX sockets not supported with websock");
3581            goto cleanup;
3582        }
3583
3584        if (to) {
3585            error_setg(errp, "Port range not support with UNIX socket");
3586            goto cleanup;
3587        }
3588        ret = 0;
3589    } else {
3590        const char *port;
3591        size_t hostlen;
3592        unsigned long long baseport = 0;
3593        InetSocketAddress *inet;
3594
3595        port = strrchr(addrstr, ':');
3596        if (!port) {
3597            if (websocket) {
3598                hostlen = 0;
3599                port = addrstr;
3600            } else {
3601                error_setg(errp, "no vnc port specified");
3602                goto cleanup;
3603            }
3604        } else {
3605            hostlen = port - addrstr;
3606            port++;
3607            if (*port == '\0') {
3608                error_setg(errp, "vnc port cannot be empty");
3609                goto cleanup;
3610            }
3611        }
3612
3613        addr->type = SOCKET_ADDRESS_TYPE_INET;
3614        inet = &addr->u.inet;
3615        if (addrstr[0] == '[' && addrstr[hostlen - 1] == ']') {
3616            inet->host = g_strndup(addrstr + 1, hostlen - 2);
3617        } else {
3618            inet->host = g_strndup(addrstr, hostlen);
3619        }
3620        /* plain VNC port is just an offset, for websocket
3621         * port is absolute */
3622        if (websocket) {
3623            if (g_str_equal(addrstr, "") ||
3624                g_str_equal(addrstr, "on")) {
3625                if (displaynum == -1) {
3626                    error_setg(errp, "explicit websocket port is required");
3627                    goto cleanup;
3628                }
3629                inet->port = g_strdup_printf(
3630                    "%d", displaynum + 5700);
3631                if (to) {
3632                    inet->has_to = true;
3633                    inet->to = to + 5700;
3634                }
3635            } else {
3636                inet->port = g_strdup(port);
3637            }
3638        } else {
3639            int offset = reverse ? 0 : 5900;
3640            if (parse_uint_full(port, &baseport, 10) < 0) {
3641                error_setg(errp, "can't convert to a number: %s", port);
3642                goto cleanup;
3643            }
3644            if (baseport > 65535 ||
3645                baseport + offset > 65535) {
3646                error_setg(errp, "port %s out of range", port);
3647                goto cleanup;
3648            }
3649            inet->port = g_strdup_printf(
3650                "%d", (int)baseport + offset);
3651
3652            if (to) {
3653                inet->has_to = true;
3654                inet->to = to + offset;
3655            }
3656        }
3657
3658        inet->ipv4 = ipv4;
3659        inet->has_ipv4 = has_ipv4;
3660        inet->ipv6 = ipv6;
3661        inet->has_ipv6 = has_ipv6;
3662
3663        ret = baseport;
3664    }
3665
3666    *retaddr = addr;
3667
3668 cleanup:
3669    if (ret < 0) {
3670        qapi_free_SocketAddress(addr);
3671    }
3672    return ret;
3673}
3674
3675static void vnc_free_addresses(SocketAddress ***retsaddr,
3676                               size_t *retnsaddr)
3677{
3678    size_t i;
3679
3680    for (i = 0; i < *retnsaddr; i++) {
3681        qapi_free_SocketAddress((*retsaddr)[i]);
3682    }
3683    g_free(*retsaddr);
3684
3685    *retsaddr = NULL;
3686    *retnsaddr = 0;
3687}
3688
3689static int vnc_display_get_addresses(QemuOpts *opts,
3690                                     bool reverse,
3691                                     SocketAddress ***retsaddr,
3692                                     size_t *retnsaddr,
3693                                     SocketAddress ***retwsaddr,
3694                                     size_t *retnwsaddr,
3695                                     Error **errp)
3696{
3697    SocketAddress *saddr = NULL;
3698    SocketAddress *wsaddr = NULL;
3699    QemuOptsIter addriter;
3700    const char *addr;
3701    int to = qemu_opt_get_number(opts, "to", 0);
3702    bool has_ipv4 = qemu_opt_get(opts, "ipv4");
3703    bool has_ipv6 = qemu_opt_get(opts, "ipv6");
3704    bool ipv4 = qemu_opt_get_bool(opts, "ipv4", false);
3705    bool ipv6 = qemu_opt_get_bool(opts, "ipv6", false);
3706    int displaynum = -1;
3707    int ret = -1;
3708
3709    *retsaddr = NULL;
3710    *retnsaddr = 0;
3711    *retwsaddr = NULL;
3712    *retnwsaddr = 0;
3713
3714    addr = qemu_opt_get(opts, "vnc");
3715    if (addr == NULL || g_str_equal(addr, "none")) {
3716        ret = 0;
3717        goto cleanup;
3718    }
3719    if (qemu_opt_get(opts, "websocket") &&
3720        !qcrypto_hash_supports(QCRYPTO_HASH_ALG_SHA1)) {
3721        error_setg(errp,
3722                   "SHA1 hash support is required for websockets");
3723        goto cleanup;
3724    }
3725
3726    qemu_opt_iter_init(&addriter, opts, "vnc");
3727    while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3728        int rv;
3729        rv = vnc_display_get_address(addr, false, reverse, 0, to,
3730                                     has_ipv4, has_ipv6,
3731                                     ipv4, ipv6,
3732                                     &saddr, errp);
3733        if (rv < 0) {
3734            goto cleanup;
3735        }
3736        /* Historical compat - first listen address can be used
3737         * to set the default websocket port
3738         */
3739        if (displaynum == -1) {
3740            displaynum = rv;
3741        }
3742        *retsaddr = g_renew(SocketAddress *, *retsaddr, *retnsaddr + 1);
3743        (*retsaddr)[(*retnsaddr)++] = saddr;
3744    }
3745
3746    /* If we had multiple primary displays, we don't do defaults
3747     * for websocket, and require explicit config instead. */
3748    if (*retnsaddr > 1) {
3749        displaynum = -1;
3750    }
3751
3752    qemu_opt_iter_init(&addriter, opts, "websocket");
3753    while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3754        if (vnc_display_get_address(addr, true, reverse, displaynum, to,
3755                                    has_ipv4, has_ipv6,
3756                                    ipv4, ipv6,
3757                                    &wsaddr, errp) < 0) {
3758            goto cleanup;
3759        }
3760
3761        /* Historical compat - if only a single listen address was
3762         * provided, then this is used to set the default listen
3763         * address for websocket too
3764         */
3765        if (*retnsaddr == 1 &&
3766            (*retsaddr)[0]->type == SOCKET_ADDRESS_TYPE_INET &&
3767            wsaddr->type == SOCKET_ADDRESS_TYPE_INET &&
3768            g_str_equal(wsaddr->u.inet.host, "") &&
3769            !g_str_equal((*retsaddr)[0]->u.inet.host, "")) {
3770            g_free(wsaddr->u.inet.host);
3771            wsaddr->u.inet.host = g_strdup((*retsaddr)[0]->u.inet.host);
3772        }
3773
3774        *retwsaddr = g_renew(SocketAddress *, *retwsaddr, *retnwsaddr + 1);
3775        (*retwsaddr)[(*retnwsaddr)++] = wsaddr;
3776    }
3777
3778    ret = 0;
3779 cleanup:
3780    if (ret < 0) {
3781        vnc_free_addresses(retsaddr, retnsaddr);
3782        vnc_free_addresses(retwsaddr, retnwsaddr);
3783    }
3784    return ret;
3785}
3786
3787static int vnc_display_connect(VncDisplay *vd,
3788                               SocketAddress **saddr,
3789                               size_t nsaddr,
3790                               SocketAddress **wsaddr,
3791                               size_t nwsaddr,
3792                               Error **errp)
3793{
3794    /* connect to viewer */
3795    QIOChannelSocket *sioc = NULL;
3796    if (nwsaddr != 0) {
3797        error_setg(errp, "Cannot use websockets in reverse mode");
3798        return -1;
3799    }
3800    if (nsaddr != 1) {
3801        error_setg(errp, "Expected a single address in reverse mode");
3802        return -1;
3803    }
3804    /* TODO SOCKET_ADDRESS_TYPE_FD when fd has AF_UNIX */
3805    vd->is_unix = saddr[0]->type == SOCKET_ADDRESS_TYPE_UNIX;
3806    sioc = qio_channel_socket_new();
3807    qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-reverse");
3808    if (qio_channel_socket_connect_sync(sioc, saddr[0], errp) < 0) {
3809        return -1;
3810    }
3811    vnc_connect(vd, sioc, false, false);
3812    object_unref(OBJECT(sioc));
3813    return 0;
3814}
3815
3816
3817static int vnc_display_listen(VncDisplay *vd,
3818                              SocketAddress **saddr,
3819                              size_t nsaddr,
3820                              SocketAddress **wsaddr,
3821                              size_t nwsaddr,
3822                              Error **errp)
3823{
3824    size_t i;
3825
3826    if (nsaddr) {
3827        vd->listener = qio_net_listener_new();
3828        qio_net_listener_set_name(vd->listener, "vnc-listen");
3829        for (i = 0; i < nsaddr; i++) {
3830            if (qio_net_listener_open_sync(vd->listener,
3831                                           saddr[i],
3832                                           errp) < 0)  {
3833                return -1;
3834            }
3835        }
3836
3837        qio_net_listener_set_client_func(vd->listener,
3838                                         vnc_listen_io, vd, NULL);
3839    }
3840
3841    if (nwsaddr) {
3842        vd->wslistener = qio_net_listener_new();
3843        qio_net_listener_set_name(vd->wslistener, "vnc-ws-listen");
3844        for (i = 0; i < nwsaddr; i++) {
3845            if (qio_net_listener_open_sync(vd->wslistener,
3846                                           wsaddr[i],
3847                                           errp) < 0)  {
3848                return -1;
3849            }
3850        }
3851
3852        qio_net_listener_set_client_func(vd->wslistener,
3853                                         vnc_listen_io, vd, NULL);
3854    }
3855
3856    return 0;
3857}
3858
3859
3860void vnc_display_open(const char *id, Error **errp)
3861{
3862    VncDisplay *vd = vnc_display_find(id);
3863    QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
3864    SocketAddress **saddr = NULL, **wsaddr = NULL;
3865    size_t nsaddr, nwsaddr;
3866    const char *share, *device_id;
3867    QemuConsole *con;
3868    bool password = false;
3869    bool reverse = false;
3870    const char *credid;
3871    bool sasl = false;
3872#ifdef CONFIG_VNC_SASL
3873    int saslErr;
3874#endif
3875    int acl = 0;
3876    int lock_key_sync = 1;
3877    int key_delay_ms;
3878
3879    if (!vd) {
3880        error_setg(errp, "VNC display not active");
3881        return;
3882    }
3883    vnc_display_close(vd);
3884
3885    if (!opts) {
3886        return;
3887    }
3888
3889    reverse = qemu_opt_get_bool(opts, "reverse", false);
3890    if (vnc_display_get_addresses(opts, reverse, &saddr, &nsaddr,
3891                                  &wsaddr, &nwsaddr, errp) < 0) {
3892        goto fail;
3893    }
3894
3895    password = qemu_opt_get_bool(opts, "password", false);
3896    if (password) {
3897        if (fips_get_state()) {
3898            error_setg(errp,
3899                       "VNC password auth disabled due to FIPS mode, "
3900                       "consider using the VeNCrypt or SASL authentication "
3901                       "methods as an alternative");
3902            goto fail;
3903        }
3904        if (!qcrypto_cipher_supports(
3905                QCRYPTO_CIPHER_ALG_DES_RFB, QCRYPTO_CIPHER_MODE_ECB)) {
3906            error_setg(errp,
3907                       "Cipher backend does not support DES RFB algorithm");
3908            goto fail;
3909        }
3910    }
3911
3912    lock_key_sync = qemu_opt_get_bool(opts, "lock-key-sync", true);
3913    key_delay_ms = qemu_opt_get_number(opts, "key-delay-ms", 10);
3914    sasl = qemu_opt_get_bool(opts, "sasl", false);
3915#ifndef CONFIG_VNC_SASL
3916    if (sasl) {
3917        error_setg(errp, "VNC SASL auth requires cyrus-sasl support");
3918        goto fail;
3919    }
3920#endif /* CONFIG_VNC_SASL */
3921    credid = qemu_opt_get(opts, "tls-creds");
3922    if (credid) {
3923        Object *creds;
3924        if (qemu_opt_get(opts, "tls") ||
3925            qemu_opt_get(opts, "x509") ||
3926            qemu_opt_get(opts, "x509verify")) {
3927            error_setg(errp,
3928                       "'tls-creds' parameter is mutually exclusive with "
3929                       "'tls', 'x509' and 'x509verify' parameters");
3930            goto fail;
3931        }
3932
3933        creds = object_resolve_path_component(
3934            object_get_objects_root(), credid);
3935        if (!creds) {
3936            error_setg(errp, "No TLS credentials with id '%s'",
3937                       credid);
3938            goto fail;
3939        }
3940        vd->tlscreds = (QCryptoTLSCreds *)
3941            object_dynamic_cast(creds,
3942                                TYPE_QCRYPTO_TLS_CREDS);
3943        if (!vd->tlscreds) {
3944            error_setg(errp, "Object with id '%s' is not TLS credentials",
3945                       credid);
3946            goto fail;
3947        }
3948        object_ref(OBJECT(vd->tlscreds));
3949
3950        if (vd->tlscreds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_SERVER) {
3951            error_setg(errp,
3952                       "Expecting TLS credentials with a server endpoint");
3953            goto fail;
3954        }
3955    } else {
3956        const char *path;
3957        bool tls = false, x509 = false, x509verify = false;
3958        tls  = qemu_opt_get_bool(opts, "tls", false);
3959        if (tls) {
3960            path = qemu_opt_get(opts, "x509");
3961
3962            if (path) {
3963                x509 = true;
3964            } else {
3965                path = qemu_opt_get(opts, "x509verify");
3966                if (path) {
3967                    x509 = true;
3968                    x509verify = true;
3969                }
3970            }
3971            vd->tlscreds = vnc_display_create_creds(x509,
3972                                                    x509verify,
3973                                                    path,
3974                                                    vd->id,
3975                                                    errp);
3976            if (!vd->tlscreds) {
3977                goto fail;
3978            }
3979        }
3980    }
3981    acl = qemu_opt_get_bool(opts, "acl", false);
3982
3983    share = qemu_opt_get(opts, "share");
3984    if (share) {
3985        if (strcmp(share, "ignore") == 0) {
3986            vd->share_policy = VNC_SHARE_POLICY_IGNORE;
3987        } else if (strcmp(share, "allow-exclusive") == 0) {
3988            vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
3989        } else if (strcmp(share, "force-shared") == 0) {
3990            vd->share_policy = VNC_SHARE_POLICY_FORCE_SHARED;
3991        } else {
3992            error_setg(errp, "unknown vnc share= option");
3993            goto fail;
3994        }
3995    } else {
3996        vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
3997    }
3998    vd->connections_limit = qemu_opt_get_number(opts, "connections", 32);
3999
4000#ifdef CONFIG_VNC_JPEG
4001    vd->lossy = qemu_opt_get_bool(opts, "lossy", false);
4002#endif
4003    vd->non_adaptive = qemu_opt_get_bool(opts, "non-adaptive", false);
4004    /* adaptive updates are only used with tight encoding and
4005     * if lossy updates are enabled so we can disable all the
4006     * calculations otherwise */
4007    if (!vd->lossy) {
4008        vd->non_adaptive = true;
4009    }
4010
4011    if (acl) {
4012        if (strcmp(vd->id, "default") == 0) {
4013            vd->tlsaclname = g_strdup("vnc.x509dname");
4014        } else {
4015            vd->tlsaclname = g_strdup_printf("vnc.%s.x509dname", vd->id);
4016        }
4017        qemu_acl_init(vd->tlsaclname);
4018    }
4019#ifdef CONFIG_VNC_SASL
4020    if (acl && sasl) {
4021        char *aclname;
4022
4023        if (strcmp(vd->id, "default") == 0) {
4024            aclname = g_strdup("vnc.username");
4025        } else {
4026            aclname = g_strdup_printf("vnc.%s.username", vd->id);
4027        }
4028        vd->sasl.acl = qemu_acl_init(aclname);
4029        g_free(aclname);
4030    }
4031#endif
4032
4033    if (vnc_display_setup_auth(&vd->auth, &vd->subauth,
4034                               vd->tlscreds, password,
4035                               sasl, false, errp) < 0) {
4036        goto fail;
4037    }
4038    trace_vnc_auth_init(vd, 0, vd->auth, vd->subauth);
4039
4040    if (vnc_display_setup_auth(&vd->ws_auth, &vd->ws_subauth,
4041                               vd->tlscreds, password,
4042                               sasl, true, errp) < 0) {
4043        goto fail;
4044    }
4045    trace_vnc_auth_init(vd, 1, vd->ws_auth, vd->ws_subauth);
4046
4047#ifdef CONFIG_VNC_SASL
4048    if ((saslErr = sasl_server_init(NULL, "qemu")) != SASL_OK) {
4049        error_setg(errp, "Failed to initialize SASL auth: %s",
4050                   sasl_errstring(saslErr, NULL, NULL));
4051        goto fail;
4052    }
4053#endif
4054    vd->lock_key_sync = lock_key_sync;
4055    if (lock_key_sync) {
4056        vd->led = qemu_add_led_event_handler(kbd_leds, vd);
4057    }
4058    vd->ledstate = 0;
4059    vd->key_delay_ms = key_delay_ms;
4060
4061    device_id = qemu_opt_get(opts, "display");
4062    if (device_id) {
4063        int head = qemu_opt_get_number(opts, "head", 0);
4064        Error *err = NULL;
4065
4066        con = qemu_console_lookup_by_device_name(device_id, head, &err);
4067        if (err) {
4068            error_propagate(errp, err);
4069            goto fail;
4070        }
4071    } else {
4072        con = NULL;
4073    }
4074
4075    if (con != vd->dcl.con) {
4076        unregister_displaychangelistener(&vd->dcl);
4077        vd->dcl.con = con;
4078        register_displaychangelistener(&vd->dcl);
4079    }
4080
4081    if (saddr == NULL) {
4082        goto cleanup;
4083    }
4084
4085    if (reverse) {
4086        if (vnc_display_connect(vd, saddr, nsaddr, wsaddr, nwsaddr, errp) < 0) {
4087            goto fail;
4088        }
4089    } else {
4090        if (vnc_display_listen(vd, saddr, nsaddr, wsaddr, nwsaddr, errp) < 0) {
4091            goto fail;
4092        }
4093    }
4094
4095    if (qemu_opt_get(opts, "to")) {
4096        vnc_display_print_local_addr(vd);
4097    }
4098
4099 cleanup:
4100    vnc_free_addresses(&saddr, &nsaddr);
4101    vnc_free_addresses(&wsaddr, &nwsaddr);
4102    return;
4103
4104fail:
4105    vnc_display_close(vd);
4106    goto cleanup;
4107}
4108
4109void vnc_display_add_client(const char *id, int csock, bool skipauth)
4110{
4111    VncDisplay *vd = vnc_display_find(id);
4112    QIOChannelSocket *sioc;
4113
4114    if (!vd) {
4115        return;
4116    }
4117
4118    sioc = qio_channel_socket_new_fd(csock, NULL);
4119    if (sioc) {
4120        qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-server");
4121        vnc_connect(vd, sioc, skipauth, false);
4122        object_unref(OBJECT(sioc));
4123    }
4124}
4125
4126static void vnc_auto_assign_id(QemuOptsList *olist, QemuOpts *opts)
4127{
4128    int i = 2;
4129    char *id;
4130
4131    id = g_strdup("default");
4132    while (qemu_opts_find(olist, id)) {
4133        g_free(id);
4134        id = g_strdup_printf("vnc%d", i++);
4135    }
4136    qemu_opts_set_id(opts, id);
4137}
4138
4139QemuOpts *vnc_parse(const char *str, Error **errp)
4140{
4141    QemuOptsList *olist = qemu_find_opts("vnc");
4142    QemuOpts *opts = qemu_opts_parse(olist, str, true, errp);
4143    const char *id;
4144
4145    if (!opts) {
4146        return NULL;
4147    }
4148
4149    id = qemu_opts_id(opts);
4150    if (!id) {
4151        /* auto-assign id if not present */
4152        vnc_auto_assign_id(olist, opts);
4153    }
4154    return opts;
4155}
4156
4157int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
4158{
4159    Error *local_err = NULL;
4160    char *id = (char *)qemu_opts_id(opts);
4161
4162    assert(id);
4163    vnc_display_init(id);
4164    vnc_display_open(id, &local_err);
4165    if (local_err != NULL) {
4166        error_reportf_err(local_err, "Failed to start VNC server: ");
4167        exit(1);
4168    }
4169    return 0;
4170}
4171
4172static void vnc_register_config(void)
4173{
4174    qemu_add_opts(&qemu_vnc_opts);
4175}
4176opts_init(vnc_register_config);
4177