]> xenbits.xensource.com Git - libvirt.git/commitdiff
event: filter global events by domain:getattr ACL [CVE-2014-0028]
authorEric Blake <eblake@redhat.com>
Wed, 8 Jan 2014 20:34:48 +0000 (13:34 -0700)
committerEric Blake <eblake@redhat.com>
Wed, 15 Jan 2014 20:55:21 +0000 (13:55 -0700)
Ever since ACL filtering was added in commit 7639736 (v1.1.1), a
user could still use event registration to obtain access to a
domain that they could not normally access via virDomainLookup*
or virConnectListAllDomains and friends.  We already have the
framework in the RPC generator for creating the filter, and
previous cleanup patches got us to the point that we can now
wire the filter through the entire object event stack.

Furthermore, whether or not domain:getattr is honored, use of
global events is a form of obtaining a list of networks, which
is covered by connect:search_domains added in a93cd08 (v1.1.0).
Ideally, we'd have a way to enforce connect:search_domains when
doing global registrations while omitting that check on a
per-domain registration.  But this patch just unconditionally
requires connect:search_domains, even when no list could be
obtained, based on the following observations:
1. Administrators are unlikely to grant domain:getattr for one
or all domains while still denying connect:search_domains - a
user that is able to manage domains will want to be able to
manage them efficiently, but efficient management includes being
able to list the domains they can access.  The idea of denying
connect:search_domains while still granting access to individual
domains is therefore not adding any real security, but just
serves as a layer of obscurity to annoy the end user.
2. In the current implementation, domain events are filtered
on the client; the server has no idea if a domain filter was
requested, and must therefore assume that all domain event
requests are global.  Even if we fix the RPC protocol to
allow for server-side filtering for newer client/server combos,
making the connect:serach_domains ACL check conditional on
whether the domain argument was NULL won't benefit older clients.
Therefore, we choose to document that connect:search_domains
is a pre-requisite to any domain event management.

Network events need the same treatment, with the obvious
change of using connect:search_networks and network:getattr.

* src/access/viraccessperm.h
(VIR_ACCESS_PERM_CONNECT_SEARCH_DOMAINS)
(VIR_ACCESS_PERM_CONNECT_SEARCH_NETWORKS): Document additional
effect of the permission.
* src/conf/domain_event.h (virDomainEventStateRegister)
(virDomainEventStateRegisterID): Add new parameter.
* src/conf/network_event.h (virNetworkEventStateRegisterID):
Likewise.
* src/conf/object_event_private.h (virObjectEventStateRegisterID):
Likewise.
* src/conf/object_event.c (_virObjectEventCallback): Track a filter.
(virObjectEventDispatchMatchCallback): Use filter.
(virObjectEventCallbackListAddID): Register filter.
* src/conf/domain_event.c (virDomainEventFilter): New function.
(virDomainEventStateRegister, virDomainEventStateRegisterID):
Adjust callers.
* src/conf/network_event.c (virNetworkEventFilter): New function.
(virNetworkEventStateRegisterID): Adjust caller.
* src/remote/remote_protocol.x
(REMOTE_PROC_CONNECT_DOMAIN_EVENT_REGISTER)
(REMOTE_PROC_CONNECT_DOMAIN_EVENT_REGISTER_ANY)
(REMOTE_PROC_CONNECT_NETWORK_EVENT_REGISTER_ANY): Generate a
filter, and require connect:search_domains instead of weaker
connect:read.
* src/test/test_driver.c (testConnectDomainEventRegister)
(testConnectDomainEventRegisterAny)
(testConnectNetworkEventRegisterAny): Update callers.
* src/remote/remote_driver.c (remoteConnectDomainEventRegister)
(remoteConnectDomainEventRegisterAny): Likewise.
* src/xen/xen_driver.c (xenUnifiedConnectDomainEventRegister)
(xenUnifiedConnectDomainEventRegisterAny): Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainGetXMLDesc): Likewise.
* src/libxl/libxl_driver.c (libxlConnectDomainEventRegister)
(libxlConnectDomainEventRegisterAny): Likewise.
* src/qemu/qemu_driver.c (qemuConnectDomainEventRegister)
(qemuConnectDomainEventRegisterAny): Likewise.
* src/uml/uml_driver.c (umlConnectDomainEventRegister)
(umlConnectDomainEventRegisterAny): Likewise.
* src/network/bridge_driver.c
(networkConnectNetworkEventRegisterAny): Likewise.
* src/lxc/lxc_driver.c (lxcConnectDomainEventRegister)
(lxcConnectDomainEventRegisterAny): Likewise.

Signed-off-by: Eric Blake <eblake@redhat.com>
17 files changed:
src/access/viraccessperm.h
src/conf/domain_event.c
src/conf/domain_event.h
src/conf/network_event.c
src/conf/network_event.h
src/conf/object_event.c
src/conf/object_event_private.h
src/libxl/libxl_driver.c
src/lxc/lxc_driver.c
src/network/bridge_driver.c
src/qemu/qemu_driver.c
src/remote/remote_driver.c
src/remote/remote_protocol.x
src/test/test_driver.c
src/uml/uml_driver.c
src/vbox/vbox_tmpl.c
src/xen/xen_driver.c

index fdc461b640c1dc1791fc8854dc6774a24f97ebbd..6d14f058c30227b40180137a3de4abeb4248046d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * viraccessperm.h: access control permissions
  *
- * Copyright (C) 2012-2013 Red Hat, Inc.
+ * Copyright (C) 2012-2014 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -47,14 +47,14 @@ typedef enum {
 
     /**
      * @desc: List domains
-     * @message: Listing domains requires authorization
+     * @message: Listing domains or using domain events requires authorization
      * @anonymous: 1
      */
     VIR_ACCESS_PERM_CONNECT_SEARCH_DOMAINS,
 
     /**
      * @desc: List networks
-     * @message: Listing networks requires authorization
+     * @message: Listing networks or using network events requires authorization
      * @anonymous: 1
      */
     VIR_ACCESS_PERM_CONNECT_SEARCH_NETWORKS,
index b934cc768f07c738cc78c21bf69ad2f3945e63c1..f56aed37b91a843fa8c9ee1f608d925fa0135876 100644 (file)
@@ -360,6 +360,30 @@ virDomainEventDeviceRemovedDispose(void *obj)
 }
 
 
+/**
+ * virDomainEventFilter:
+ * @conn: pointer to the connection
+ * @event: the event to check
+ * @opaque: opaque data holding ACL filter to use
+ *
+ * Internal function to run ACL filtering before dispatching an event
+ */
+static bool
+virDomainEventFilter(virConnectPtr conn, virObjectEventPtr event, void *opaque)
+{
+    virDomainDef dom;
+    virDomainObjListFilter filter = opaque;
+
+    /* For now, we just create a virDomainDef with enough contents to
+     * satisfy what viraccessdriverpolkit.c references.  This is a bit
+     * fragile, but I don't know of anything better.  */
+    dom.name = event->meta.name;
+    memcpy(dom.uuid, event->meta.uuid, VIR_UUID_BUFLEN);
+
+    return (filter)(conn, &dom);
+}
+
+
 static void *
 virDomainEventNew(virClassPtr klass,
                   int eventID,
@@ -1265,6 +1289,7 @@ cleanup:
  * virDomainEventStateRegister:
  * @conn: connection to associate with callback
  * @state: object event state
+ * @filter: optional ACL filter to limit which events can be sent
  * @callback: the callback to add
  * @opaque: data blob to pass to @callback
  * @freecb: callback to free @opaque
@@ -1277,6 +1302,7 @@ cleanup:
 int
 virDomainEventStateRegister(virConnectPtr conn,
                             virObjectEventStatePtr state,
+                            virDomainObjListFilter filter,
                             virConnectDomainEventCallback callback,
                             void *opaque,
                             virFreeCallback freecb)
@@ -1285,7 +1311,8 @@ virDomainEventStateRegister(virConnectPtr conn,
         return -1;
 
     return virObjectEventStateRegisterID(conn, state, NULL,
-                                         virDomainEventClass,
+                                         filter ? virDomainEventFilter : NULL,
+                                         filter, virDomainEventClass,
                                          VIR_DOMAIN_EVENT_ID_LIFECYCLE,
                                          VIR_OBJECT_EVENT_CALLBACK(callback),
                                          opaque, freecb, NULL, false);
@@ -1296,6 +1323,7 @@ virDomainEventStateRegister(virConnectPtr conn,
  * virDomainEventStateRegisterID:
  * @conn: connection to associate with callback
  * @state: object event state
+ * @filter: optional ACL filter to limit which events can be sent
  * @dom: optional domain for filtering the event
  * @eventID: ID of the event type to register for
  * @cb: function to invoke when event fires
@@ -1312,6 +1340,7 @@ virDomainEventStateRegister(virConnectPtr conn,
 int
 virDomainEventStateRegisterID(virConnectPtr conn,
                               virObjectEventStatePtr state,
+                              virDomainObjListFilter filter,
                               virDomainPtr dom,
                               int eventID,
                               virConnectDomainEventGenericCallback cb,
@@ -1323,7 +1352,8 @@ virDomainEventStateRegisterID(virConnectPtr conn,
         return -1;
 
     return virObjectEventStateRegisterID(conn, state, dom ? dom->uuid : NULL,
-                                         virDomainEventClass, eventID,
+                                         filter ? virDomainEventFilter : NULL,
+                                         filter, virDomainEventClass, eventID,
                                          VIR_OBJECT_EVENT_CALLBACK(cb),
                                          opaque, freecb, callbackID, false);
 }
index b2ea580e677dc01acdb4fcc68ecd65d59f7e0e4d..b39d5cda34ce4cbc83d86a40756c1a32c4f68470 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * domain_event.h: domain event queue processing helpers
  *
- * Copyright (C) 2012 Red Hat, Inc.
+ * Copyright (C) 2012-2014 Red Hat, Inc.
  * Copyright (C) 2008 VirtualIron
  * Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
  *
@@ -177,20 +177,24 @@ virDomainEventDeviceRemovedNewFromDom(virDomainPtr dom,
 int
 virDomainEventStateRegister(virConnectPtr conn,
                             virObjectEventStatePtr state,
+                            virDomainObjListFilter filter,
                             virConnectDomainEventCallback callback,
                             void *opaque,
                             virFreeCallback freecb)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4);
+
 int
 virDomainEventStateRegisterID(virConnectPtr conn,
                               virObjectEventStatePtr state,
+                              virDomainObjListFilter filter,
                               virDomainPtr dom,
                               int eventID,
                               virConnectDomainEventGenericCallback cb,
                               void *opaque,
                               virFreeCallback freecb,
                               int *callbackID)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(5);
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(6);
+
 int
 virDomainEventStateDeregister(virConnectPtr conn,
                               virObjectEventStatePtr state,
index a0b60a0de0fa94b636a288a44a1096beb2737ea8..f27b7e9e9875f9736ae6cedeec4eba3b4a677ea4 100644 (file)
@@ -121,10 +121,36 @@ cleanup:
 }
 
 
+/**
+ * virNetworkEventFilter:
+ * @conn: pointer to the connection
+ * @event: the event to check
+ * @opaque: opaque data holding ACL filter to use
+ *
+ * Internal function to run ACL filtering before dispatching an event
+ */
+static bool
+virNetworkEventFilter(virConnectPtr conn, virObjectEventPtr event,
+                      void *opaque)
+{
+    virNetworkDef net;
+    virNetworkObjListFilter filter = opaque;
+
+    /* For now, we just create a virNetworkDef with enough contents to
+     * satisfy what viraccessdriverpolkit.c references.  This is a bit
+     * fragile, but I don't know of anything better.  */
+    net.name = event->meta.name;
+    memcpy(net.uuid, event->meta.uuid, VIR_UUID_BUFLEN);
+
+    return (filter)(conn, &net);
+}
+
+
 /**
  * virNetworkEventStateRegisterID:
  * @conn: connection to associate with callback
  * @state: object event state
+ * @filter: optional ACL filter to limit which events can be sent
  * @net: network to filter on or NULL for all networks
  * @eventID: ID of the event type to register for
  * @cb: function to invoke when event occurs
@@ -141,6 +167,7 @@ cleanup:
 int
 virNetworkEventStateRegisterID(virConnectPtr conn,
                                virObjectEventStatePtr state,
+                               virNetworkObjListFilter filter,
                                virNetworkPtr net,
                                int eventID,
                                virConnectNetworkEventGenericCallback cb,
@@ -152,7 +179,8 @@ virNetworkEventStateRegisterID(virConnectPtr conn,
         return -1;
 
     return virObjectEventStateRegisterID(conn, state, net ? net->uuid : NULL,
-                                         virNetworkEventClass, eventID,
+                                         filter ? virNetworkEventFilter : NULL,
+                                         filter, virNetworkEventClass, eventID,
                                          VIR_OBJECT_EVENT_CALLBACK(cb),
                                          opaque, freecb, callbackID, false);
 }
@@ -190,6 +218,7 @@ virNetworkEventStateRegisterClient(virConnectPtr conn,
         return -1;
 
     return virObjectEventStateRegisterID(conn, state, net ? net->uuid : NULL,
+                                         NULL, NULL,
                                          virNetworkEventClass, eventID,
                                          VIR_OBJECT_EVENT_CALLBACK(cb),
                                          opaque, freecb, callbackID, true);
index 51bd949beeae5d949b82538b7a643e1d3df4f2b1..0812752e6dd9f4a90cbbbf75f842b19fe38eab54 100644 (file)
@@ -24,6 +24,7 @@
 #include "internal.h"
 #include "object_event.h"
 #include "object_event_private.h"
+#include "network_conf.h"
 
 #ifndef __NETWORK_EVENT_H__
 # define __NETWORK_EVENT_H__
 int
 virNetworkEventStateRegisterID(virConnectPtr conn,
                                virObjectEventStatePtr state,
+                               virNetworkObjListFilter filter,
                                virNetworkPtr net,
                                int eventID,
                                virConnectNetworkEventGenericCallback cb,
                                void *opaque,
                                virFreeCallback freecb,
                                int *callbackID)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(5)
-    ATTRIBUTE_NONNULL(8);
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(6)
+    ATTRIBUTE_NONNULL(9);
 
 int
 virNetworkEventStateRegisterClient(virConnectPtr conn,
index fa6af5c5559a965ef15dc9fe1ffb543a376b4def..aff49566145e9456b4d81479aa89381c30b7aa88 100644 (file)
@@ -69,6 +69,8 @@ struct _virObjectEventCallback {
     int remoteID;
     bool uuid_filter;
     unsigned char uuid[VIR_UUID_BUFLEN];
+    virObjectEventCallbackFilter filter;
+    void *filter_opaque;
     virConnectObjectEventGenericCallback cb;
     void *opaque;
     virFreeCallback freecb;
@@ -350,7 +352,9 @@ virObjectEventCallbackLookup(virConnectPtr conn,
  * virObjectEventCallbackListAddID:
  * @conn: pointer to the connection
  * @cbList: the list
- * @uuid: the uuid of the object to filter on
+ * @uuid: the optional uuid of the object to filter on
+ * @filter: optional last-ditch filter callback
+ * @filter_opaque: opaque data to pass to @filter
  * @klass: the base event class
  * @eventID: the event ID
  * @callback: the callback to add
@@ -365,6 +369,8 @@ static int
 virObjectEventCallbackListAddID(virConnectPtr conn,
                                 virObjectEventCallbackListPtr cbList,
                                 unsigned char uuid[VIR_UUID_BUFLEN],
+                                virObjectEventCallbackFilter filter,
+                                void *filter_opaque,
                                 virClassPtr klass,
                                 int eventID,
                                 virConnectObjectEventGenericCallback callback,
@@ -377,9 +383,10 @@ virObjectEventCallbackListAddID(virConnectPtr conn,
     int ret = -1;
     int remoteID = -1;
 
-    VIR_DEBUG("conn=%p cblist=%p uuid=%p "
+    VIR_DEBUG("conn=%p cblist=%p uuid=%p filter=%p filter_opaque=%p "
               "klass=%p eventID=%d callback=%p opaque=%p",
-              conn, cbList, uuid, klass, eventID, callback, opaque);
+              conn, cbList, uuid, filter, filter_opaque,
+              klass, eventID, callback, opaque);
 
     /* Check incoming */
     if (!cbList) {
@@ -414,6 +421,8 @@ virObjectEventCallbackListAddID(virConnectPtr conn,
         event->uuid_filter = true;
         memcpy(event->uuid, uuid, VIR_UUID_BUFLEN);
     }
+    event->filter = filter;
+    event->filter_opaque = filter_opaque;
 
     if (callbackID)
         *callbackID = event->callbackID;
@@ -675,6 +684,9 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event,
     if (cb->remoteID != event->remoteID)
         return false;
 
+    if (cb->filter && !(cb->filter)(cb->conn, event, cb->filter_opaque))
+        return false;
+
     if (cb->uuid_filter) {
         /* Deliberately ignoring 'id' for matching, since that
          * will cause problems when a domain switches between
@@ -848,6 +860,8 @@ int
 virObjectEventStateRegisterID(virConnectPtr conn,
                               virObjectEventStatePtr state,
                               unsigned char *uuid,
+                              virObjectEventCallbackFilter filter,
+                              void *filter_opaque,
                               virClassPtr klass,
                               int eventID,
                               virConnectObjectEventGenericCallback cb,
@@ -872,7 +886,8 @@ virObjectEventStateRegisterID(virConnectPtr conn,
     }
 
     ret = virObjectEventCallbackListAddID(conn, state->callbacks,
-                                          uuid, klass, eventID,
+                                          uuid, filter, filter_opaque,
+                                          klass, eventID,
                                           cb, opaque, freecb,
                                           callbackID, serverFilter);
 
index 445d7261f11ac47b0f06ee980f92b098e39079af..8e265f94bcdd7ddc703aba2bc419f9bca5379b95 100644 (file)
@@ -52,6 +52,20 @@ struct _virObjectEvent {
     virObjectEventDispatchFunc dispatch;
 };
 
+/**
+ * virObjectEventCallbackFilter:
+ * @conn: the connection pointer
+ * @event: the event about to be dispatched
+ * @opaque: opaque data registered with the filter
+ *
+ * Callback to do final filtering for a reason not tracked directly by
+ * virObjectEventStateRegisterID().  Return false if @event must not
+ * be sent to @conn.
+ */
+typedef bool (*virObjectEventCallbackFilter)(virConnectPtr conn,
+                                             virObjectEventPtr event,
+                                             void *opaque);
+
 virClassPtr
 virClassForObjectEvent(void);
 
@@ -59,6 +73,8 @@ int
 virObjectEventStateRegisterID(virConnectPtr conn,
                               virObjectEventStatePtr state,
                               unsigned char *uuid,
+                              virObjectEventCallbackFilter filter,
+                              void *filter_opaque,
                               virClassPtr klass,
                               int eventID,
                               virConnectObjectEventGenericCallback cb,
@@ -66,8 +82,8 @@ virObjectEventStateRegisterID(virConnectPtr conn,
                               virFreeCallback freecb,
                               int *callbackID,
                               bool remoteFilter)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4)
-    ATTRIBUTE_NONNULL(6);
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(6)
+    ATTRIBUTE_NONNULL(8);
 
 int
 virObjectEventStateCallbackID(virConnectPtr conn,
index 61e35165f89110b46c693256f2393bd9af3d830e..4115fffe3c374ad419245bf4904821453a2e537f 100644 (file)
@@ -3654,6 +3654,7 @@ libxlConnectDomainEventRegister(virConnectPtr conn,
 
     if (virDomainEventStateRegister(conn,
                                     driver->domainEventState,
+                                    virConnectDomainEventRegisterCheckACL,
                                     callback, opaque, freecb) < 0)
         return -1;
 
@@ -4259,6 +4260,7 @@ libxlConnectDomainEventRegisterAny(virConnectPtr conn, virDomainPtr dom, int eve
 
     if (virDomainEventStateRegisterID(conn,
                                       driver->domainEventState,
+                                      virConnectDomainEventRegisterAnyCheckACL,
                                       dom, eventID, callback, opaque,
                                       freecb, &ret) < 0)
         ret = -1;
index 7e56a595394ebc9d82f81b7cc7f9687870079776..5ae4b6562a30bb0e0162b1065942632111048dc1 100644 (file)
@@ -1293,6 +1293,7 @@ lxcConnectDomainEventRegister(virConnectPtr conn,
 
     if (virDomainEventStateRegister(conn,
                                     driver->domainEventState,
+                                    virConnectDomainEventRegisterCheckACL,
                                     callback, opaque, freecb) < 0)
         return -1;
 
@@ -1334,6 +1335,7 @@ lxcConnectDomainEventRegisterAny(virConnectPtr conn,
 
     if (virDomainEventStateRegisterID(conn,
                                       driver->domainEventState,
+                                      virConnectDomainEventRegisterAnyCheckACL,
                                       dom, eventID,
                                       callback, opaque, freecb, &ret) < 0)
         ret = -1;
index 95e4b658d78f1479a862d4b34d08ece8ea521cab..0b43a67e8cb33f24e10dd82bb4638a47d78ecd4f 100644 (file)
@@ -2310,6 +2310,7 @@ networkConnectNetworkEventRegisterAny(virConnectPtr conn,
         goto cleanup;
 
     if (virNetworkEventStateRegisterID(conn, driver->networkEventState,
+                                       virConnectNetworkEventRegisterAnyCheckACL,
                                        net, eventID, callback,
                                        opaque, freecb, &ret) < 0)
         ret = -1;
index 1949abee94ecbd5eedfbd38cf13d783cb3485ae7..ebb77dca08c91b18fe4ce096c6abdb710ca551c0 100644 (file)
@@ -9959,6 +9959,7 @@ qemuConnectDomainEventRegister(virConnectPtr conn,
 
     if (virDomainEventStateRegister(conn,
                                     driver->domainEventState,
+                                    virConnectDomainEventRegisterCheckACL,
                                     callback, opaque, freecb) < 0)
         goto cleanup;
 
@@ -10007,6 +10008,7 @@ qemuConnectDomainEventRegisterAny(virConnectPtr conn,
 
     if (virDomainEventStateRegisterID(conn,
                                       driver->domainEventState,
+                                      virConnectDomainEventRegisterAnyCheckACL,
                                       dom, eventID,
                                       callback, opaque, freecb, &ret) < 0)
         ret = -1;
index 18eb454f58285ce08a42aa824011bd0024bb6a68..ca86e3c0290c9fb1c654b5662b05c2c0c906ff83 100644 (file)
@@ -4427,7 +4427,7 @@ remoteConnectDomainEventRegister(virConnectPtr conn,
 
     remoteDriverLock(priv);
 
-    if ((count = virDomainEventStateRegister(conn, priv->eventState,
+    if ((count = virDomainEventStateRegister(conn, priv->eventState, NULL,
                                              callback, opaque, freecb)) < 0)
          goto done;
 
@@ -5245,7 +5245,7 @@ remoteConnectDomainEventRegisterAny(virConnectPtr conn,
 
     remoteDriverLock(priv);
 
-    if ((count = virDomainEventStateRegisterID(conn, priv->eventState,
+    if ((count = virDomainEventStateRegisterID(conn, priv->eventState, NULL,
                                                dom, eventID,
                                                callback, opaque, freecb,
                                                &callbackID)) < 0)
index ae27a7721f6114a10f5d137115b3e0ce6a544447..f94a38a63a3db9c3d9bee814be6b2272d0be87d0 100644 (file)
@@ -1955,7 +1955,7 @@ struct remote_node_device_destroy_args {
 
 /*
  * Events Register/Deregister:
- * It would seem rpcgen does not like both args, and ret
+ * It would seem rpcgen does not like both args and ret
  * to be null. It will not generate the prototype otherwise.
  * Pass back a redundant boolean to force prototype generation.
  */
@@ -3642,7 +3642,8 @@ enum remote_procedure {
     /**
      * @generate: none
      * @priority: high
-     * @acl: connect:read
+     * @acl: connect:search_domains
+     * @aclfilter: domain:getattr
      */
     REMOTE_PROC_CONNECT_DOMAIN_EVENT_REGISTER = 105,
 
@@ -4074,7 +4075,8 @@ enum remote_procedure {
     /**
      * @generate: none
      * @priority: high
-     * @acl: connect:read
+     * @acl: connect:search_domains
+     * @aclfilter: domain:getattr
      */
     REMOTE_PROC_CONNECT_DOMAIN_EVENT_REGISTER_ANY = 167,
 
@@ -5045,7 +5047,8 @@ enum remote_procedure {
     /**
      * @generate: none
      * @priority: high
-     * @acl: connect:read
+     * @acl: connect:search_networks
+     * @aclfilter: network:getattr
      */
     REMOTE_PROC_CONNECT_NETWORK_EVENT_REGISTER_ANY = 313,
 
index b724f82b05abbc1007b1fc5ef21c798226c0a828..4c277bdd3a44b5708416329b5df7914a9fa91beb 100644 (file)
@@ -6145,7 +6145,7 @@ testConnectDomainEventRegister(virConnectPtr conn,
     int ret = 0;
 
     testDriverLock(driver);
-    if (virDomainEventStateRegister(conn, driver->eventState,
+    if (virDomainEventStateRegister(conn, driver->eventState, NULL,
                                     callback, opaque, freecb) < 0)
         ret = -1;
     testDriverUnlock(driver);
@@ -6183,7 +6183,7 @@ testConnectDomainEventRegisterAny(virConnectPtr conn,
     int ret;
 
     testDriverLock(driver);
-    if (virDomainEventStateRegisterID(conn, driver->eventState,
+    if (virDomainEventStateRegisterID(conn, driver->eventState, NULL,
                                       dom, eventID,
                                       callback, opaque, freecb, &ret) < 0)
         ret = -1;
@@ -6221,7 +6221,7 @@ testConnectNetworkEventRegisterAny(virConnectPtr conn,
     int ret;
 
     testDriverLock(driver);
-    if (virNetworkEventStateRegisterID(conn, driver->eventState,
+    if (virNetworkEventStateRegisterID(conn, driver->eventState, NULL,
                                        net, eventID, callback,
                                        opaque, freecb, &ret) < 0)
         ret = -1;
index ad29ebfb77bf4f3fac0a65c3a8c408400c5b5dfb..31ebf4ab6e1b69046b6d0ffb213f60cd5bc88629 100644 (file)
@@ -2618,6 +2618,7 @@ umlConnectDomainEventRegister(virConnectPtr conn,
     umlDriverLock(driver);
     if (virDomainEventStateRegister(conn,
                                     driver->domainEventState,
+                                    virConnectDomainEventRegisterCheckACL,
                                     callback, opaque, freecb) < 0)
         ret = -1;
     umlDriverUnlock(driver);
@@ -2662,6 +2663,7 @@ umlConnectDomainEventRegisterAny(virConnectPtr conn,
     umlDriverLock(driver);
     if (virDomainEventStateRegisterID(conn,
                                       driver->domainEventState,
+                                      virConnectDomainEventRegisterAnyCheckACL,
                                       dom, eventID,
                                       callback, opaque, freecb, &ret) < 0)
         ret = -1;
index 0fcaf8e70d9b1fed66c8e3beb62d99ee2a73d862..241eb5e4726c045eaf0c5a06677a867a649ae906 100644 (file)
@@ -7328,7 +7328,7 @@ vboxConnectDomainEventRegister(virConnectPtr conn,
              * later you can iterate over them
              */
 
-            ret = virDomainEventStateRegister(conn, data->domainEvents,
+            ret = virDomainEventStateRegister(conn, data->domainEvents, NULL,
                                               callback, opaque, freecb);
             VIR_DEBUG("virObjectEventStateRegister (ret = %d) (conn: %p, "
                       "callback: %p, opaque: %p, "
@@ -7425,7 +7425,7 @@ static int vboxConnectDomainEventRegisterAny(virConnectPtr conn,
              * later you can iterate over them
              */
 
-            if (virDomainEventStateRegisterID(conn, data->domainEvents,
+            if (virDomainEventStateRegisterID(conn, data->domainEvents, NULL,
                                               dom, eventID,
                                               callback, opaque, freecb, &ret) < 0)
                 ret = -1;
index c45d10f950cf536525e94aa00646b7d4f03044c1..7a57624b65481f53375b840d612f82ed55cd0c59 100644 (file)
@@ -2323,6 +2323,7 @@ xenUnifiedConnectDomainEventRegister(virConnectPtr conn,
     }
 
     if (virDomainEventStateRegister(conn, priv->domainEvents,
+                                    virConnectDomainEventRegisterCheckACL,
                                     callback, opaque, freefunc) < 0)
         ret = -1;
 
@@ -2382,6 +2383,7 @@ xenUnifiedConnectDomainEventRegisterAny(virConnectPtr conn,
     }
 
     if (virDomainEventStateRegisterID(conn, priv->domainEvents,
+                                      virConnectDomainEventRegisterAnyCheckACL,
                                       dom, eventID,
                                       callback, opaque, freefunc, &ret) < 0)
         ret = -1;