Blame SOURCES/libvirt-access-Modify-the-VIR_ERR_ACCESS_DENIED-to-include-driverName.patch

9c6c51
From 85750b0466aa3719d3d2447abaab2e87db92f552 Mon Sep 17 00:00:00 2001
9c6c51
Message-Id: <85750b0466aa3719d3d2447abaab2e87db92f552@dist-git>
9c6c51
From: John Ferlan <jferlan@redhat.com>
9c6c51
Date: Mon, 5 Nov 2018 07:48:37 -0500
9c6c51
Subject: [PATCH] access: Modify the VIR_ERR_ACCESS_DENIED to include
9c6c51
 driverName
9c6c51
9c6c51
https://bugzilla.redhat.com/show_bug.cgi?id=1631608 (RHEL 8.0)
9c6c51
https://bugzilla.redhat.com/show_bug.cgi?id=1631606 (RHEL 7.7)
9c6c51
9c6c51
Changes made to manage and utilize a secondary connection
9c6c51
driver to APIs outside the scope of the primary connection
9c6c51
driver have resulted in some confusion processing polkit rules
9c6c51
since the simple "access denied" error message doesn't provide
9c6c51
enough of a clue when combined with the "authentication failed:
9c6c51
access denied by policy" as to which connection driver refused
9c6c51
or failed the ACL check.
9c6c51
9c6c51
In order to provide some context, let's modify the existing
9c6c51
"access denied" error returne from the various vir*EnsureACL
9c6c51
API's to provide the connection driver name that is causing
9c6c51
the failure. This should provide the context for writing the
9c6c51
polkit rules that would allow access via the driver.
9c6c51
9c6c51
Signed-off-by: John Ferlan <jferlan@redhat.com>
9c6c51
ACKed-by: Michal Privoznik <mprivozn@redhat.com>
9c6c51
(cherry picked from commit ccc72d5cbdd85f66cb737134b3be40aac1df03ef)
9c6c51
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
9c6c51
---
9c6c51
 src/access/viraccessmanager.c | 25 +++++++++++++------------
9c6c51
 src/rpc/gendispatch.pl        |  2 +-
9c6c51
 src/util/virerror.c           |  4 ++--
9c6c51
 3 files changed, 16 insertions(+), 15 deletions(-)
9c6c51
9c6c51
diff --git a/src/access/viraccessmanager.c b/src/access/viraccessmanager.c
9c6c51
index e7b5bf38da..1dfff32b9d 100644
9c6c51
--- a/src/access/viraccessmanager.c
9c6c51
+++ b/src/access/viraccessmanager.c
9c6c51
@@ -196,11 +196,12 @@ static void virAccessManagerDispose(void *object)
9c6c51
  * should the admin need to debug things
9c6c51
  */
9c6c51
 static int
9c6c51
-virAccessManagerSanitizeError(int ret)
9c6c51
+virAccessManagerSanitizeError(int ret,
9c6c51
+                              const char *driverName)
9c6c51
 {
9c6c51
     if (ret < 0) {
9c6c51
         virResetLastError();
9c6c51
-        virAccessError(VIR_ERR_ACCESS_DENIED, NULL);
9c6c51
+        virAccessError(VIR_ERR_ACCESS_DENIED, driverName, NULL);
9c6c51
     }
9c6c51
 
9c6c51
     return ret;
9c6c51
@@ -217,7 +218,7 @@ int virAccessManagerCheckConnect(virAccessManagerPtr manager,
9c6c51
     if (manager->drv->checkConnect)
9c6c51
         ret = manager->drv->checkConnect(manager, driverName, perm);
9c6c51
 
9c6c51
-    return virAccessManagerSanitizeError(ret);
9c6c51
+    return virAccessManagerSanitizeError(ret, driverName);
9c6c51
 }
9c6c51
 
9c6c51
 
9c6c51
@@ -233,7 +234,7 @@ int virAccessManagerCheckDomain(virAccessManagerPtr manager,
9c6c51
     if (manager->drv->checkDomain)
9c6c51
         ret = manager->drv->checkDomain(manager, driverName, domain, perm);
9c6c51
 
9c6c51
-    return virAccessManagerSanitizeError(ret);
9c6c51
+    return virAccessManagerSanitizeError(ret, driverName);
9c6c51
 }
9c6c51
 
9c6c51
 int virAccessManagerCheckInterface(virAccessManagerPtr manager,
9c6c51
@@ -248,7 +249,7 @@ int virAccessManagerCheckInterface(virAccessManagerPtr manager,
9c6c51
     if (manager->drv->checkInterface)
9c6c51
         ret = manager->drv->checkInterface(manager, driverName, iface, perm);
9c6c51
 
9c6c51
-    return virAccessManagerSanitizeError(ret);
9c6c51
+    return virAccessManagerSanitizeError(ret, driverName);
9c6c51
 }
9c6c51
 
9c6c51
 int virAccessManagerCheckNetwork(virAccessManagerPtr manager,
9c6c51
@@ -263,7 +264,7 @@ int virAccessManagerCheckNetwork(virAccessManagerPtr manager,
9c6c51
     if (manager->drv->checkNetwork)
9c6c51
         ret = manager->drv->checkNetwork(manager, driverName, network, perm);
9c6c51
 
9c6c51
-    return virAccessManagerSanitizeError(ret);
9c6c51
+    return virAccessManagerSanitizeError(ret, driverName);
9c6c51
 }
9c6c51
 
9c6c51
 int virAccessManagerCheckNodeDevice(virAccessManagerPtr manager,
9c6c51
@@ -278,7 +279,7 @@ int virAccessManagerCheckNodeDevice(virAccessManagerPtr manager,
9c6c51
     if (manager->drv->checkNodeDevice)
9c6c51
         ret = manager->drv->checkNodeDevice(manager, driverName, nodedev, perm);
9c6c51
 
9c6c51
-    return virAccessManagerSanitizeError(ret);
9c6c51
+    return virAccessManagerSanitizeError(ret, driverName);
9c6c51
 }
9c6c51
 
9c6c51
 int virAccessManagerCheckNWFilter(virAccessManagerPtr manager,
9c6c51
@@ -293,7 +294,7 @@ int virAccessManagerCheckNWFilter(virAccessManagerPtr manager,
9c6c51
     if (manager->drv->checkNWFilter)
9c6c51
         ret = manager->drv->checkNWFilter(manager, driverName, nwfilter, perm);
9c6c51
 
9c6c51
-    return virAccessManagerSanitizeError(ret);
9c6c51
+    return virAccessManagerSanitizeError(ret, driverName);
9c6c51
 }
9c6c51
 
9c6c51
 int virAccessManagerCheckNWFilterBinding(virAccessManagerPtr manager,
9c6c51
@@ -308,7 +309,7 @@ int virAccessManagerCheckNWFilterBinding(virAccessManagerPtr manager,
9c6c51
     if (manager->drv->checkNWFilterBinding)
9c6c51
         ret = manager->drv->checkNWFilterBinding(manager, driverName, binding, perm);
9c6c51
 
9c6c51
-    return virAccessManagerSanitizeError(ret);
9c6c51
+    return virAccessManagerSanitizeError(ret, driverName);
9c6c51
 }
9c6c51
 
9c6c51
 int virAccessManagerCheckSecret(virAccessManagerPtr manager,
9c6c51
@@ -323,7 +324,7 @@ int virAccessManagerCheckSecret(virAccessManagerPtr manager,
9c6c51
     if (manager->drv->checkSecret)
9c6c51
         ret = manager->drv->checkSecret(manager, driverName, secret, perm);
9c6c51
 
9c6c51
-    return virAccessManagerSanitizeError(ret);
9c6c51
+    return virAccessManagerSanitizeError(ret, driverName);
9c6c51
 }
9c6c51
 
9c6c51
 int virAccessManagerCheckStoragePool(virAccessManagerPtr manager,
9c6c51
@@ -338,7 +339,7 @@ int virAccessManagerCheckStoragePool(virAccessManagerPtr manager,
9c6c51
     if (manager->drv->checkStoragePool)
9c6c51
         ret = manager->drv->checkStoragePool(manager, driverName, pool, perm);
9c6c51
 
9c6c51
-    return virAccessManagerSanitizeError(ret);
9c6c51
+    return virAccessManagerSanitizeError(ret, driverName);
9c6c51
 }
9c6c51
 
9c6c51
 int virAccessManagerCheckStorageVol(virAccessManagerPtr manager,
9c6c51
@@ -354,5 +355,5 @@ int virAccessManagerCheckStorageVol(virAccessManagerPtr manager,
9c6c51
     if (manager->drv->checkStorageVol)
9c6c51
         ret = manager->drv->checkStorageVol(manager, driverName, pool, vol, perm);
9c6c51
 
9c6c51
-    return virAccessManagerSanitizeError(ret);
9c6c51
+    return virAccessManagerSanitizeError(ret, driverName);
9c6c51
 }
9c6c51
diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
9c6c51
index 0c4648c0fb..f599002056 100755
9c6c51
--- a/src/rpc/gendispatch.pl
9c6c51
+++ b/src/rpc/gendispatch.pl
9c6c51
@@ -2199,7 +2199,7 @@ elsif ($mode eq "client") {
9c6c51
                     print "        virObjectUnref(mgr);\n";
9c6c51
                     if ($action eq "Ensure") {
9c6c51
                         print "        if (rv == 0)\n";
9c6c51
-                        print "            virReportError(VIR_ERR_ACCESS_DENIED, NULL);\n";
9c6c51
+                        print "            virReportError(VIR_ERR_ACCESS_DENIED, conn->driver->name, NULL);\n";
9c6c51
                         print "        return $fail;\n";
9c6c51
                     } else {
9c6c51
                         print "        virResetLastError();\n";
9c6c51
diff --git a/src/util/virerror.c b/src/util/virerror.c
9c6c51
index f198f27957..5f50fa0349 100644
9c6c51
--- a/src/util/virerror.c
9c6c51
+++ b/src/util/virerror.c
9c6c51
@@ -1439,9 +1439,9 @@ virErrorMsg(virErrorNumber error, const char *info)
9c6c51
             break;
9c6c51
         case VIR_ERR_ACCESS_DENIED:
9c6c51
             if (info == NULL)
9c6c51
-                errmsg = _("access denied");
9c6c51
+                errmsg = _("access denied from '%s'");
9c6c51
             else
9c6c51
-                errmsg = _("access denied: %s");
9c6c51
+                errmsg = _("access denied from '%s': %s");
9c6c51
             break;
9c6c51
         case VIR_ERR_DBUS_SERVICE:
9c6c51
             if (info == NULL)
9c6c51
-- 
9c6c51
2.19.1
9c6c51