1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2024-12-26 03:21:44 +03:00

Add ACL checks into the storage driver

Insert calls to the ACL checking APIs in all storage driver
entrypoints.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2013-04-23 11:56:22 +01:00
parent f5e007c353
commit c930410beb
2 changed files with 154 additions and 5 deletions

View File

@ -1281,7 +1281,9 @@ endif
# Needed to keep automake quiet about conditionals
libvirt_driver_storage_impl_la_SOURCES =
libvirt_driver_storage_impl_la_CFLAGS = \
-I$(top_srcdir)/src/conf $(AM_CFLAGS)
-I$(top_srcdir)/src/access \
-I$(top_srcdir)/src/conf \
$(AM_CFLAGS)
libvirt_driver_storage_impl_la_LDFLAGS = $(AM_LDFLAGS)
libvirt_driver_storage_impl_la_LIBADD =
libvirt_driver_storage_impl_la_LIBADD += $(SECDRIVER_LIBS)

View File

@ -48,6 +48,7 @@
#include "fdstream.h"
#include "configmake.h"
#include "virstring.h"
#include "viraccessapicheck.h"
#define VIR_FROM_THIS VIR_FROM_STORAGE
@ -248,6 +249,9 @@ storagePoolLookupByUUID(virConnectPtr conn,
goto cleanup;
}
if (virStoragePoolLookupByUUIDEnsureACL(conn, pool->def) < 0)
goto cleanup;
ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
NULL, NULL);
@ -274,6 +278,9 @@ storagePoolLookupByName(virConnectPtr conn,
goto cleanup;
}
if (virStoragePoolLookupByNameEnsureACL(conn, pool->def) < 0)
goto cleanup;
ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid,
NULL, NULL);
@ -285,7 +292,30 @@ cleanup:
static virStoragePoolPtr
storagePoolLookupByVolume(virStorageVolPtr vol) {
return storagePoolLookupByName(vol->conn, vol->pool);
virStorageDriverStatePtr driver = vol->conn->storagePrivateData;
virStoragePoolObjPtr pool;
virStoragePoolPtr ret = NULL;
storageDriverLock(driver);
pool = virStoragePoolObjFindByName(&driver->pools, vol->pool);
storageDriverUnlock(driver);
if (!pool) {
virReportError(VIR_ERR_NO_STORAGE_POOL,
_("no storage pool with matching name '%s'"), vol->pool);
goto cleanup;
}
if (virStoragePoolLookupByVolumeEnsureACL(vol->conn, pool->def) < 0)
goto cleanup;
ret = virGetStoragePool(vol->conn, pool->def->name, pool->def->uuid,
NULL, NULL);
cleanup:
if (pool)
virStoragePoolObjUnlock(pool);
return ret;
}
static virDrvOpenStatus
@ -313,6 +343,9 @@ storageConnectNumOfStoragePools(virConnectPtr conn) {
virStorageDriverStatePtr driver = conn->storagePrivateData;
unsigned int i, nactive = 0;
if (virConnectNumOfStoragePoolsEnsureACL(conn) < 0)
return -1;
storageDriverLock(driver);
for (i = 0; i < driver->pools.count; i++) {
virStoragePoolObjLock(driver->pools.objs[i]);
@ -332,6 +365,9 @@ storageConnectListStoragePools(virConnectPtr conn,
virStorageDriverStatePtr driver = conn->storagePrivateData;
int got = 0, i;
if (virConnectListStoragePoolsEnsureACL(conn) < 0)
return -1;
storageDriverLock(driver);
for (i = 0; i < driver->pools.count && got < nnames; i++) {
virStoragePoolObjLock(driver->pools.objs[i]);
@ -360,6 +396,9 @@ storageConnectNumOfDefinedStoragePools(virConnectPtr conn) {
virStorageDriverStatePtr driver = conn->storagePrivateData;
unsigned int i, nactive = 0;
if (virConnectNumOfDefinedStoragePoolsEnsureACL(conn) < 0)
return -1;
storageDriverLock(driver);
for (i = 0; i < driver->pools.count; i++) {
virStoragePoolObjLock(driver->pools.objs[i]);
@ -379,6 +418,9 @@ storageConnectListDefinedStoragePools(virConnectPtr conn,
virStorageDriverStatePtr driver = conn->storagePrivateData;
int got = 0, i;
if (virConnectListDefinedStoragePoolsEnsureACL(conn) < 0)
return -1;
storageDriverLock(driver);
for (i = 0; i < driver->pools.count && got < nnames; i++) {
virStoragePoolObjLock(driver->pools.objs[i]);
@ -415,6 +457,9 @@ storageConnectFindStoragePoolSources(virConnectPtr conn,
virStorageBackendPtr backend;
char *ret = NULL;
if (virConnectFindStoragePoolSourcesEnsureACL(conn) < 0)
return NULL;
backend_type = virStoragePoolTypeFromString(type);
if (backend_type < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
@ -453,6 +498,10 @@ static int storagePoolIsActive(virStoragePoolPtr pool)
virReportError(VIR_ERR_NO_STORAGE_POOL, NULL);
goto cleanup;
}
if (virStoragePoolIsActiveEnsureACL(pool->conn, obj->def) < 0)
goto cleanup;
ret = virStoragePoolObjIsActive(obj);
cleanup:
@ -474,6 +523,10 @@ static int storagePoolIsPersistent(virStoragePoolPtr pool)
virReportError(VIR_ERR_NO_STORAGE_POOL, NULL);
goto cleanup;
}
if (virStoragePoolIsPersistentEnsureACL(pool->conn, obj->def) < 0)
goto cleanup;
ret = obj->configFile ? 1 : 0;
cleanup:
@ -500,6 +553,9 @@ storagePoolCreateXML(virConnectPtr conn,
if (!(def = virStoragePoolDefParseString(xml)))
goto cleanup;
if (virStoragePoolCreateXMLEnsureACL(conn, def) < 0)
goto cleanup;
if (virStoragePoolObjIsDuplicate(&driver->pools, def, 1) < 0)
goto cleanup;
@ -557,6 +613,9 @@ storagePoolDefineXML(virConnectPtr conn,
if (!(def = virStoragePoolDefParseString(xml)))
goto cleanup;
if (virStoragePoolDefineXMLEnsureACL(conn, def) < 0)
goto cleanup;
if (virStoragePoolObjIsDuplicate(&driver->pools, def, 0) < 0)
goto cleanup;
@ -602,6 +661,9 @@ storagePoolUndefine(virStoragePoolPtr obj) {
goto cleanup;
}
if (virStoragePoolUndefineEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if (virStoragePoolObjIsActive(pool)) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("storage pool '%s' is still active"),
@ -661,6 +723,9 @@ storagePoolCreate(virStoragePoolPtr obj,
goto cleanup;
}
if (virStoragePoolCreateEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
@ -708,6 +773,9 @@ storagePoolBuild(virStoragePoolPtr obj,
goto cleanup;
}
if (virStoragePoolBuildEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
@ -746,6 +814,9 @@ storagePoolDestroy(virStoragePoolPtr obj) {
goto cleanup;
}
if (virStoragePoolDestroyEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
@ -806,6 +877,9 @@ storagePoolDelete(virStoragePoolPtr obj,
goto cleanup;
}
if (virStoragePoolDeleteEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
@ -860,6 +934,9 @@ storagePoolRefresh(virStoragePoolPtr obj,
goto cleanup;
}
if (virStoragePoolRefreshEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
@ -916,6 +993,9 @@ storagePoolGetInfo(virStoragePoolPtr obj,
goto cleanup;
}
if (virStoragePoolGetInfoEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if (virStorageBackendForType(pool->def->type) == NULL)
goto cleanup;
@ -956,6 +1036,9 @@ storagePoolGetXMLDesc(virStoragePoolPtr obj,
goto cleanup;
}
if (virStoragePoolGetXMLDescEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if ((flags & VIR_STORAGE_XML_INACTIVE) && pool->newDef)
def = pool->newDef;
else
@ -986,6 +1069,9 @@ storagePoolGetAutostart(virStoragePoolPtr obj,
goto cleanup;
}
if (virStoragePoolGetAutostartEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if (!pool->configFile) {
*autostart = 0;
} else {
@ -1015,6 +1101,9 @@ storagePoolSetAutostart(virStoragePoolPtr obj,
goto cleanup;
}
if (virStoragePoolSetAutostartEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if (!pool->configFile) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("pool has no config file"));
@ -1075,6 +1164,9 @@ storagePoolNumOfVolumes(virStoragePoolPtr obj) {
goto cleanup;
}
if (virStoragePoolNumOfVolumesEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if (!virStoragePoolObjIsActive(pool)) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("storage pool '%s' is not active"), pool->def->name);
@ -1108,6 +1200,9 @@ storagePoolListVolumes(virStoragePoolPtr obj,
goto cleanup;
}
if (virStoragePoolListVolumesEnsureACL(obj->conn, pool->def) < 0)
goto cleanup;
if (!virStoragePoolObjIsActive(pool)) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("storage pool '%s' is not active"), pool->def->name);
@ -1157,6 +1252,9 @@ storagePoolListAllVolumes(virStoragePoolPtr pool,
goto cleanup;
}
if (virStoragePoolListAllVolumesEnsureACL(pool->conn, obj->def) < 0)
goto cleanup;
if (!virStoragePoolObjIsActive(obj)) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("storage pool '%s' is not active"), obj->def->name);
@ -1235,6 +1333,9 @@ storageVolLookupByName(virStoragePoolPtr obj,
goto cleanup;
}
if (virStorageVolLookupByNameEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
ret = virGetStorageVol(obj->conn, pool->def->name, vol->name, vol->key,
NULL, NULL);
@ -1259,21 +1360,27 @@ storageVolLookupByKey(virConnectPtr conn,
virStorageVolDefPtr vol =
virStorageVolDefFindByKey(driver->pools.objs[i], key);
if (vol)
if (vol) {
if (virStorageVolLookupByKeyEnsureACL(conn, driver->pools.objs[i]->def, vol) < 0)
goto cleanup;
ret = virGetStorageVol(conn,
driver->pools.objs[i]->def->name,
vol->name,
vol->key,
NULL, NULL);
goto cleanup;
}
}
virStoragePoolObjUnlock(driver->pools.objs[i]);
}
storageDriverUnlock(driver);
if (!ret)
virReportError(VIR_ERR_NO_STORAGE_VOL,
_("no storage vol with matching key %s"), key);
cleanup:
storageDriverUnlock(driver);
return ret;
}
@ -1313,12 +1420,17 @@ storageVolLookupByPath(virConnectPtr conn,
stable_path);
VIR_FREE(stable_path);
if (vol)
if (vol) {
if (virStorageVolLookupByPathEnsureACL(conn, driver->pools.objs[i]->def, vol) < 0)
goto cleanup;
ret = virGetStorageVol(conn,
driver->pools.objs[i]->def->name,
vol->name,
vol->key,
NULL, NULL);
goto cleanup;
}
}
virStoragePoolObjUnlock(driver->pools.objs[i]);
}
@ -1327,6 +1439,7 @@ storageVolLookupByPath(virConnectPtr conn,
virReportError(VIR_ERR_NO_STORAGE_VOL,
_("no storage vol with matching path %s"), path);
cleanup:
VIR_FREE(cleanpath);
storageDriverUnlock(driver);
return ret;
@ -1370,6 +1483,9 @@ storageVolCreateXML(virStoragePoolPtr obj,
if (voldef == NULL)
goto cleanup;
if (virStorageVolCreateXMLEnsureACL(obj->conn, pool->def, voldef) < 0)
goto cleanup;
if (virStorageVolDefFindByName(pool, voldef->name)) {
virReportError(VIR_ERR_NO_STORAGE_VOL,
_("storage vol '%s' already exists"), voldef->name);
@ -1521,6 +1637,9 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj,
if (newvol == NULL)
goto cleanup;
if (virStorageVolCreateXMLFromEnsureACL(obj->conn, pool->def, newvol) < 0)
goto cleanup;
if (virStorageVolDefFindByName(pool, newvol->name)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("storage volume name '%s' already in use."),
@ -1662,6 +1781,9 @@ storageVolDownload(virStorageVolPtr obj,
goto out;
}
if (virStorageVolDownloadEnsureACL(obj->conn, pool->def, vol) < 0)
goto out;
if (vol->building) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("volume '%s' is still being allocated."),
@ -1725,6 +1847,9 @@ storageVolUpload(virStorageVolPtr obj,
goto out;
}
if (virStorageVolUploadEnsureACL(obj->conn, pool->def, vol) < 0)
goto out;
if (vol->building) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("volume '%s' is still being allocated."),
@ -1794,6 +1919,9 @@ storageVolResize(virStorageVolPtr obj,
goto out;
}
if (virStorageVolResizeEnsureACL(obj->conn, pool->def, vol) < 0)
goto out;
if (vol->building) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("volume '%s' is still being allocated."),
@ -2094,6 +2222,9 @@ storageVolWipePattern(virStorageVolPtr obj,
goto out;
}
if (virStorageVolWipePatternEnsureACL(obj->conn, pool->def, vol) < 0)
goto out;
if (vol->building) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("volume '%s' is still being allocated."),
@ -2162,6 +2293,9 @@ storageVolDelete(virStorageVolPtr obj,
goto cleanup;
}
if (virStorageVolDeleteEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
if (vol->building) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("volume '%s' is still being allocated."),
@ -2241,6 +2375,9 @@ storageVolGetInfo(virStorageVolPtr obj,
goto cleanup;
}
if (virStorageVolGetInfoEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
@ -2298,6 +2435,9 @@ storageVolGetXMLDesc(virStorageVolPtr obj,
goto cleanup;
}
if (virStorageVolGetXMLDescEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
goto cleanup;
@ -2346,6 +2486,9 @@ storageVolGetPath(virStorageVolPtr obj) {
goto cleanup;
}
if (virStorageVolGetPathEnsureACL(obj->conn, pool->def, vol) < 0)
goto cleanup;
ignore_value(VIR_STRDUP(ret, vol->target.path));
cleanup:
@ -2364,10 +2507,14 @@ storageConnectListAllStoragePools(virConnectPtr conn,
virCheckFlags(VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ALL, -1);
if (virConnectListAllStoragePoolsEnsureACL(conn) < 0)
goto cleanup;
storageDriverLock(driver);
ret = virStoragePoolList(conn, driver->pools, pools, flags);
storageDriverUnlock(driver);
cleanup:
return ret;
}