• This patch makes the vnc server code skip screen refreshes in case
    there is data in the output buffer.  This reduces the refresh rate to
    throttle the bandwidth needed in case the network link is saturated.
    
    Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6862 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »
  • Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6861 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »
  • This patch killes the old_data hack in the qemu server and replaces
    it with a clean separation of the guest-visible display surface and
    the vnc server display surface.  Both guest and server surface have
    their own dirty bitmap for tracking screen updates.
    
    Workflow is this:
    
    (1) The guest writes to the guest surface.  With shared buffers being
        active the guest writes are directly visible to the vnc server code.
        Note that this may happen in parallel to the vnc server code running
        (today only in xenfb, once we have vcpu threads in qemu also for
        other display adapters).
    
    (2) vnc_update() callback tags the specified area in the guest dirty
        map.
    
    (3) vnc_update_client() will first walk through the guest dirty map.  It
        will compare guest and server surface for all regions tagged dirty
        and in case the screen content really did change the server surface
        and dirty map are updated.
        Note: old code used old_data in a simliar way, so this does *not*
        introduce an extra memcpy.
    
    (4) Then vnc_update_cient() will send the updates to the vnc client
        using the server surface and dirty map.
        Note: old code used the guest-visible surface instead, causing
        screen corruption in case of guest screen updates running in
        parallel.
    
    The separate dirty bitmap also has the nice effect that forced screen
    updates can be done cleanly by simply tagging the area in both guest and
    server dirty map.  The old, hackish way was memset(old_data, 42, size)
    to trick the code checking for screen changes.
    
    Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6860 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »



  • Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6727 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »
  • This patch introduces a generic internal API for access control lists
    to be used by network servers in QEMU. It adds support for checking
    these ACL in the VNC server, in two places. The first ACL is for the
    SASL authentication mechanism, checking the SASL username. This ACL
    is called 'vnc.username'. The second is for the TLS authentication
    mechanism, when x509 client certificates are turned on, checking against
    the Distinguished Name of the client. This ACL is called 'vnc.x509dname'
    
    The internal API provides for an ACL with the following characteristics
    
     - A unique name, eg  vnc.username, and vnc.x509dname.
     - A default policy, allow or deny
     - An ordered series of match rules, with allow or deny policy
    
    If none of the match rules apply, then the default policy is
    used.
    
    There is a monitor API to manipulate the ACLs, which I'll describe via
    examples
    
      (qemu) acl show vnc.username
      policy: allow
      (qemu) acl policy vnc.username denya
      acl: policy set to 'deny'
      (qemu) acl allow vnc.username fred
      acl: added rule at position 1
      (qemu) acl allow vnc.username bob
      acl: added rule at position 2
      (qemu) acl allow vnc.username joe 1
      acl: added rule at position 1
      (qemu) acl show vnc.username
      policy: deny
      0: allow fred
      1: allow joe
      2: allow bob
    
    
      (qemu) acl show vnc.x509dname
      policy: allow
      (qemu) acl policy vnc.x509dname deny
      acl: policy set to 'deny'
      (qemu) acl allow vnc.x509dname C=GB,O=ACME,L=London,CN=*
      acl: added rule at position 1
      (qemu) acl allow vnc.x509dname C=GB,O=ACME,L=Boston,CN=bob
      acl: added rule at position 2
      (qemu) acl show vnc.x509dname
      policy: deny
      0: allow C=GB,O=ACME,L=London,CN=*
      1: allow C=GB,O=ACME,L=Boston,CN=bob
    
    By default the VNC server will not use any ACLs, allowing access to
    the server if the user successfully authenticates. To enable use of
    ACLs to restrict user access, the ',acl' flag should be given when
    starting QEMU. The initial ACL activated will be a 'deny all' policy
    and should be customized using monitor commands.
    
    eg enable SASL auth and ACLs
    
        qemu ....  -vnc localhost:1,sasl,acl
    
    The next patch will provide a way to load a pre-defined ACL when
    starting up
    
    
     Makefile        |    6 +
     b/acl.c         |  185 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     b/acl.h         |   74 ++++++++++++++++++++++
     configure       |   18 +++++
     monitor.c       |   95 ++++++++++++++++++++++++++++
     qemu-doc.texi   |   49 ++++++++++++++
     vnc-auth-sasl.c |   16 +++-
     vnc-auth-sasl.h |    7 ++
     vnc-tls.c       |   19 +++++
     vnc-tls.h       |    3 
     vnc.c           |   21 ++++++
     vnc.h           |    3 
     12 files changed, 491 insertions(+), 5 deletions(-)
    
       Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6726 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »
  • This patch extends the 'info vnc' monitor output to include information
    about the VNC client authentication credentials.
    
    For clients authenticated using SASL, this will output the username.
    
    For clients authenticated using x509 certificates, this will output
    the x509 distinguished name.
    
    Auth can be stacked, so both username & x509 dname may be shown.
    
        Server:
             address: 0.0.0.0:5902
                auth: vencrypt+x509+sasl
        Client:
             address: 10.33.6.67:38621
          x509 dname: C=GB,O=ACME,L=London,ST=London,CN=localhost
            username: admin
        Client:
             address: 10.33.6.63:38620
          x509 dname: C=GB,O=ACME,L=London,ST=London,CN=localhost
            username: admin
    
    
    
     vnc-tls.c |   17 +++++++++++++++++
     vnc-tls.h |    3 +++
     vnc.c     |   19 +++++++++++++++++--
     3 files changed, 37 insertions(+), 2 deletions(-)
    
       Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6725 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »
  • This patch adds the new SASL authentication protocol to the VNC server.
    
    It is enabled by setting the 'sasl' flag when launching VNC. SASL can
    optionally provide encryption via its SSF layer, if a suitable mechanism
    is configured (eg, GSSAPI/Kerberos, or Digest-MD5).  If an SSF layer is
    not available, then it should be combined with the x509 VNC authentication
    protocol which provides encryption.
    
    eg, if using GSSAPI
    
       qemu -vnc localhost:1,sasl
    
    eg if using  TLS/x509 for encryption
    
       qemu -vnc localhost:1,sasl,tls,x509
    
    
    By default the Cyrus SASL library will look for its configuration in
    the file /etc/sasl2/qemu.conf.  For non-root users, this can be overridden
    by setting the SASL_CONF_PATH environment variable, eg to make it look in
    $HOME/.sasl2.  NB unprivileged users may not have access to the full range
    of SASL mechanisms, since some of them require some administrative privileges
    to configure. The patch includes an example SASL configuration file which
    illustrates config for GSSAPI and Digest-MD5, though it should be noted that
    the latter is not really considered secure any more.
    
    Most of the SASL authentication code is located in a separate source file,
    vnc-auth-sasl.c.  The main vnc.c file only contains minimal integration
    glue, specifically parsing of command line flags / setup, and calls to
    start the SASL auth process, to do encoding/decoding for data.
    
    There are several possible stacks for reading & writing of data, depending
    on the combo of VNC authentication methods in use
    
     - Clear.    read/write straight to socket
     - TLS.      read/write via GNUTLS helpers
     - SASL.     encode/decode via SASL SSF layer, then read/write to socket
     - SASL+TLS. encode/decode via SASL SSF layer, then read/write via GNUTLS
    
    Hence, the vnc_client_read & vnc_client_write methods have been refactored
    a little.
    
       vnc_client_read:  main entry point for reading, calls either
    
           - vnc_client_read_plain   reading, with no intermediate decoding
           - vnc_client_read_sasl    reading, with SASL SSF decoding
    
       These two methods, then call vnc_client_read_buf(). This decides
       whether to write to the socket directly or write via GNUTLS.
    
    The situation is the same for writing data. More extensive comments
    have been added in the code / patch. The vnc_client_read_sasl and
    vnc_client_write_sasl method implementations live in the separate
    vnc-auth-sasl.c file.
    
    The state required for the SASL auth mechanism is kept in a separate
    VncStateSASL struct, defined in vnc-auth-sasl.h and included in the
    main VncState.
    
    The configure script probes for SASL and automatically enables it
    if found, unless --disable-vnc-sasl was given to override it.
    
    
     Makefile            |    7 
     Makefile.target     |    5 
     b/qemu.sasl         |   34 ++
     b/vnc-auth-sasl.c   |  626 ++++++++++++++++++++++++++++++++++++++++++++++++++++
     b/vnc-auth-sasl.h   |   67 +++++
     configure           |   34 ++
     qemu-doc.texi       |   97 ++++++++
     vnc-auth-vencrypt.c |   12 
     vnc.c               |  249 ++++++++++++++++++--
     vnc.h               |   31 ++
     10 files changed, 1129 insertions(+), 33 deletions(-)
    
       Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6724 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »
  • This patch refactors the existing TLS code to make the main VNC code
    more managable. The code moves to two new files
    
     - vnc-tls.c: generic helpers for TLS handshake & credential setup
     - vnc-auth-vencrypt.c: the actual VNC TLS authentication mechanism.
    
    The reason for this split is that there are other TLS based auth
    mechanisms which we may like to use in the future. These can all
    share the same vnc-tls.c routines. In addition this will facilitate
    anyone who may want to port the vnc-tls.c file to allow for choice
    of GNUTLS & NSS for impl.
    
    The TLS state is moved out of the VncState struct, and into a separate
    VncStateTLS struct, defined in vnc-tls.h. This is then referenced from
    the main VncState. End size of the struct is the same, but it keeps
    things a little more managable.
    
    The vnc.h file gains a bunch more function prototypes, for functions
    in vnc.c that were previously static, but now need to be accessed
    from the separate auth code files.
    
    The only TLS related code still in the main vl.c is the command line
    argument handling / setup, and the low level I/O routines calling
    gnutls_send/recv.
    
    
     Makefile              |   11 
     b/vnc-auth-vencrypt.c |  167 ++++++++++++++
     b/vnc-auth-vencrypt.h |   33 ++
     b/vnc-tls.c           |  414 +++++++++++++++++++++++++++++++++++
     b/vnc-tls.h           |   70 ++++++
     vnc.c                 |  581 +++-----------------------------------------------
     vnc.h                 |   76 ++++--
     7 files changed, 780 insertions(+), 572 deletions(-)
    
       Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6723 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse File »
  • This patch moves the definitions of VncState and VncDisplay structs
    out into a vnc.h header file. This is to allow the code for TLS
    and SASL auth mechanisms to be moved out of the main vnc.c file.
    
    
     vnc.c |  109 ------------------------------------------------
     vnc.h |  149 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
     2 files changed, 148 insertions(+), 110 deletions(-)
    
       Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6722 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse File »
  • Each of the graphical frontends #include a .c file, for keymap code
    resulting in duplicated definitions & duplicated compiled code. A
    couple of small changes allowed this to be sanitized, so instead of
    doing a #include "keymaps.c", duplicating all code, we can have a
    shared keymaps.h file, and only compile code once. This allows the
    next patch to move the VncState struct out into a header file without
    causing clashing definitions.
    
    
     Makefile      |    9 +++++---
     b/keymaps.h   |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     curses.c      |    3 --
     curses_keys.h |    9 +++-----
     keymaps.c     |   45 ++++++++++++++++---------------------------
     sdl.c         |    3 --
     sdl_keysym.h  |    7 ++----
     vnc.c         |    5 +---
     vnc_keysym.h  |    7 ++----
     9 files changed, 97 insertions(+), 51 deletions(-)
    
       Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6721 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »
  • The current 'info vnc' monitor output just displays the VNC server address
    as provided by the -vnc command line flag. This isn't particularly useful
    since it doesn't tell you what VNC is actually listening on. eg, if you
    use '-vnc :1' it is useful to know whether this translated to '0.0.0.0:5901'
    or chose IPv6 ':::5901'.  It is also useful to know the address of the
    client that is currently connected. It is also useful to know the active
    authentication (if any).
    
    This patch tweaks the monitor output to look like:
    
       (qemu) info vnc
        Server:
             address: 0.0.0.0:5902
                auth: vencrypt+x509
        Client: none
    
    And when 2 clients are connected
    
       (qemu) info vnc
        Server:
             address: 0.0.0.0:5902
                auth: vencrypt+x509
        Client:
             address: 10.33.6.67:38621
        Client:
             address: 10.33.6.63:38620
    
    More data will be added to this later in the patch series...
    
    The 'addr_to_string' helper method in this patch is overly generic
    for the needs of this patch alone. This is because it will be re-used
    by the later SASL patches in this series, where the flexibility is
    important.
    
    
     vnc.c |  137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
     1 file changed, 127 insertions(+), 10 deletions(-)
    
       Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6720 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »
  • This patch was previously posted here:
    
      http://lists.gnu.org/archive/html/qemu-devel/2009-02/msg00820.html
    
    In the case where the TLS handshake does *not* block on I/O, QEMU
    sends the next 'start sub-auth' message twice. This seriously confuses
    the VNC client :-) Fortunately the chances of the handshake not blocking
    are close to zero for a TCP socket, which is why it has not been noticed
    thus far. Even with both client & server on localhost, I can only hit the
    bug 1 time in 20.
    
    NB, the diff context here is not too informative. If you look at the
    full code you'll see that a few lines early we called vnc_start_tls()
    which called vnc_continue_handshake() which called the method
    start_auth_vencrypt_subauth(). Hence, fixing the bug, just involves
    removing the 2nd bogus call to start_auth_vencrypt_subauth() as per
    this patch.
    
    
     vnc.c |    8 --------
     1 file changed, 8 deletions(-)
    
       Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6719 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »

  • Refactor the monitor API and prepare it for decoupled terminals:
    term_print functions are renamed to monitor_* and all monitor services
    gain a new parameter (mon) that will once refer to the monitor instance
    the output is supposed to appear on. However, the argument remains
    unused for now. All monitor command callbacks are also extended by a mon
    parameter so that command handlers are able to pass an appropriate
    reference to monitor output services.
    
    For the case that monitor outputs so far happen without clearly
    identifiable context, the global variable cur_mon is introduced that
    shall once provide a pointer either to the current active monitor (while
    processing commands) or to the default one. On the mid or long term,
    those use case will be obsoleted so that this variable can be removed
    again.
    
    Due to the broad usage of the monitor interface, this patch mostly deals
    with converting users of the monitor API. A few of them are already
    extended to pass 'mon' from the command handler further down to internal
    functions that invoke monitor_printf.
    
    At this chance, monitor-related prototypes are moved from console.h to
    a new monitor.h. The same is done for the readline API.
    
    Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6711 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »

  • Change structure associated with a display from VncState to a new structure
    VncDisplay. Remove client specific fields from VncDisplay. Remove display
    specific fields from VncState. Maintain a linked list of VncStates per
    VncDisplay structure, update as necessary. When updates/resizes/copies come in
    from the hardware, dispatch to all clients. 
    
    Signed-off-by: Brian Kress <kressb@moose.net>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6621 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »




  • this patch fixes a bug and improves the generic pixel conversion
    function in vnc.c.
    The bug is that when a new vnc client connects we need to reset the flag
    has_WMVi but currently we don't.
    The generic pixel conversion function is vnc_convert_pixel and currently
    is not very efficient since uses the division and multiplication
    operators.
    To make it more efficient I changed to use bit shift operators instead.
    
    Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6441 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »

  • This patch exploits the new DisplaySurface and PixelFormat structures in
    vnc, making the code easier to read allowing further improvements.
    
    Compared to the last version I fixed a bug that prevented the hextile
    encoding from working properly.
    
    Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6337 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse Code »
  • This patch changes the DisplayState interface adding support for
    multiple frontends at the same time (sdl and vnc) and implements most
    of the benefit of the shared_buf patch without the added complexity.
    
    Currently DisplayState is managed by sdl (or vnc) and sdl (or vnc) is
    also responsible for allocating the data and setting the depth.
    Vga.c (or another backend) will do any necessary conversion.
    
    The idea is to change it so that is vga.c (or another backend) together
    with console.c that fully manage the DisplayState interface allocating
    data and setting the depth (either 16 or 32 bit, if the guest uses a
    different resolution or is in text mode, vga.c (or another backend) is
    in charge of doing the conversion seamlessly).
    
    The other idea is that DisplayState supports *multiple* frontends
    like sdl and vnc; each of them can register some callbacks to be called
    when a display event occurs.
    
    The interesting changes are:
    
    - the new structures and related functions in console.h and console.c
    
    in particular the following functions are very helpful to manage a
    DisplaySurface:
    
    qemu_create_displaysurface
    qemu_resize_displaysurface
    qemu_create_displaysurface_from
    qemu_free_displaysurface
    
    - console_select and qemu_console_resize in console.c
    this two functions manage multiple consoles on a single host display
    
    - moving code around in hw/vga.c
    as for the shared_buf patch this is necessary to be able to handle a dynamic
    DisplaySurface bpp
    
    - changes to vga_draw_graphic in hw/vga.c
    this is the place where the DisplaySurface buffer is shared with the
    videoram, when possible;
    
    
    Compared to the last version the only changes are:
    
    - do not remove support to dpy_copy in cirrus_vga
    - change the name of the displaysurface handling functions
    
    Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
    Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
    
    
    
    git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6336 c046a42c-6fe2-441c-8c8c-71466251a162
    aliguori authored
     
    Browse File »