提交 bbaa4e1c 编写于 作者: D Daniel P. Berrange

Add access control filtering of network objects

Ensure that all APIs which list network objects filter
them against the access control system.
Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
上级 4d39952e
...@@ -4289,10 +4289,11 @@ virNetworkMatch(virNetworkObjPtr netobj, ...@@ -4289,10 +4289,11 @@ virNetworkMatch(virNetworkObjPtr netobj,
#undef MATCH #undef MATCH
int int
virNetworkList(virConnectPtr conn, virNetworkObjListExport(virConnectPtr conn,
virNetworkObjList netobjs, virNetworkObjList netobjs,
virNetworkPtr **nets, virNetworkPtr **nets,
unsigned int flags) virNetworkObjListFilter filter,
unsigned int flags)
{ {
virNetworkPtr *tmp_nets = NULL; virNetworkPtr *tmp_nets = NULL;
virNetworkPtr net = NULL; virNetworkPtr net = NULL;
...@@ -4310,7 +4311,8 @@ virNetworkList(virConnectPtr conn, ...@@ -4310,7 +4311,8 @@ virNetworkList(virConnectPtr conn,
for (i = 0; i < netobjs.count; i++) { for (i = 0; i < netobjs.count; i++) {
virNetworkObjPtr netobj = netobjs.objs[i]; virNetworkObjPtr netobj = netobjs.objs[i];
virNetworkObjLock(netobj); virNetworkObjLock(netobj);
if (virNetworkMatch(netobj, flags)) { if ((!filter || filter(conn, netobj->def)) &&
virNetworkMatch(netobj, flags)) {
if (nets) { if (nets) {
if (!(net = virGetNetwork(conn, if (!(net = virGetNetwork(conn,
netobj->def->name, netobj->def->name,
......
...@@ -296,6 +296,10 @@ void virNetworkDefFree(virNetworkDefPtr def); ...@@ -296,6 +296,10 @@ void virNetworkDefFree(virNetworkDefPtr def);
void virNetworkObjFree(virNetworkObjPtr net); void virNetworkObjFree(virNetworkObjPtr net);
void virNetworkObjListFree(virNetworkObjListPtr vms); void virNetworkObjListFree(virNetworkObjListPtr vms);
typedef bool (*virNetworkObjListFilter)(virConnectPtr conn,
virNetworkDefPtr def);
virNetworkObjPtr virNetworkAssignDef(virNetworkObjListPtr nets, virNetworkObjPtr virNetworkAssignDef(virNetworkObjListPtr nets,
const virNetworkDefPtr def, const virNetworkDefPtr def,
bool live); bool live);
...@@ -417,9 +421,10 @@ VIR_ENUM_DECL(virNetworkForward) ...@@ -417,9 +421,10 @@ VIR_ENUM_DECL(virNetworkForward)
VIR_CONNECT_LIST_NETWORKS_FILTERS_PERSISTENT | \ VIR_CONNECT_LIST_NETWORKS_FILTERS_PERSISTENT | \
VIR_CONNECT_LIST_NETWORKS_FILTERS_AUTOSTART) VIR_CONNECT_LIST_NETWORKS_FILTERS_AUTOSTART)
int virNetworkList(virConnectPtr conn, int virNetworkObjListExport(virConnectPtr conn,
virNetworkObjList netobjs, virNetworkObjList netobjs,
virNetworkPtr **nets, virNetworkPtr **nets,
unsigned int flags); virNetworkObjListFilter filter,
unsigned int flags);
#endif /* __NETWORK_CONF_H__ */ #endif /* __NETWORK_CONF_H__ */
...@@ -495,13 +495,13 @@ virNetworkFindByUUID; ...@@ -495,13 +495,13 @@ virNetworkFindByUUID;
virNetworkForwardTypeToString; virNetworkForwardTypeToString;
virNetworkIpDefNetmask; virNetworkIpDefNetmask;
virNetworkIpDefPrefix; virNetworkIpDefPrefix;
virNetworkList;
virNetworkLoadAllConfigs; virNetworkLoadAllConfigs;
virNetworkLoadAllState; virNetworkLoadAllState;
virNetworkObjAssignDef; virNetworkObjAssignDef;
virNetworkObjFree; virNetworkObjFree;
virNetworkObjGetPersistentDef; virNetworkObjGetPersistentDef;
virNetworkObjIsDuplicate; virNetworkObjIsDuplicate;
virNetworkObjListExport;
virNetworkObjListFree; virNetworkObjListFree;
virNetworkObjLock; virNetworkObjLock;
virNetworkObjReplacePersistentDef; virNetworkObjReplacePersistentDef;
......
...@@ -2844,10 +2844,12 @@ static int networkConnectNumOfNetworks(virConnectPtr conn) { ...@@ -2844,10 +2844,12 @@ static int networkConnectNumOfNetworks(virConnectPtr conn) {
networkDriverLock(driver); networkDriverLock(driver);
for (i = 0; i < driver->networks.count; i++) { for (i = 0; i < driver->networks.count; i++) {
virNetworkObjLock(driver->networks.objs[i]); virNetworkObjPtr obj = driver->networks.objs[i];
if (virNetworkObjIsActive(driver->networks.objs[i])) virNetworkObjLock(obj);
if (virConnectNumOfNetworksCheckACL(conn, obj->def) &&
virNetworkObjIsActive(obj))
nactive++; nactive++;
virNetworkObjUnlock(driver->networks.objs[i]); virNetworkObjUnlock(obj);
} }
networkDriverUnlock(driver); networkDriverUnlock(driver);
...@@ -2863,15 +2865,17 @@ static int networkConnectListNetworks(virConnectPtr conn, char **const names, in ...@@ -2863,15 +2865,17 @@ static int networkConnectListNetworks(virConnectPtr conn, char **const names, in
networkDriverLock(driver); networkDriverLock(driver);
for (i = 0; i < driver->networks.count && got < nnames; i++) { for (i = 0; i < driver->networks.count && got < nnames; i++) {
virNetworkObjLock(driver->networks.objs[i]); virNetworkObjPtr obj = driver->networks.objs[i];
if (virNetworkObjIsActive(driver->networks.objs[i])) { virNetworkObjLock(obj);
if (VIR_STRDUP(names[got], driver->networks.objs[i]->def->name) < 0) { if (virConnectListNetworksCheckACL(conn, obj->def) &&
virNetworkObjUnlock(driver->networks.objs[i]); virNetworkObjIsActive(obj)) {
if (VIR_STRDUP(names[got], obj->def->name) < 0) {
virNetworkObjUnlock(obj);
goto cleanup; goto cleanup;
} }
got++; got++;
} }
virNetworkObjUnlock(driver->networks.objs[i]); virNetworkObjUnlock(obj);
} }
networkDriverUnlock(driver); networkDriverUnlock(driver);
...@@ -2893,10 +2897,12 @@ static int networkConnectNumOfDefinedNetworks(virConnectPtr conn) { ...@@ -2893,10 +2897,12 @@ static int networkConnectNumOfDefinedNetworks(virConnectPtr conn) {
networkDriverLock(driver); networkDriverLock(driver);
for (i = 0; i < driver->networks.count; i++) { for (i = 0; i < driver->networks.count; i++) {
virNetworkObjLock(driver->networks.objs[i]); virNetworkObjPtr obj = driver->networks.objs[i];
if (!virNetworkObjIsActive(driver->networks.objs[i])) virNetworkObjLock(obj);
if (virConnectNumOfDefinedNetworksCheckACL(conn, obj->def) &&
!virNetworkObjIsActive(obj))
ninactive++; ninactive++;
virNetworkObjUnlock(driver->networks.objs[i]); virNetworkObjUnlock(obj);
} }
networkDriverUnlock(driver); networkDriverUnlock(driver);
...@@ -2912,15 +2918,17 @@ static int networkConnectListDefinedNetworks(virConnectPtr conn, char **const na ...@@ -2912,15 +2918,17 @@ static int networkConnectListDefinedNetworks(virConnectPtr conn, char **const na
networkDriverLock(driver); networkDriverLock(driver);
for (i = 0; i < driver->networks.count && got < nnames; i++) { for (i = 0; i < driver->networks.count && got < nnames; i++) {
virNetworkObjLock(driver->networks.objs[i]); virNetworkObjPtr obj = driver->networks.objs[i];
if (!virNetworkObjIsActive(driver->networks.objs[i])) { virNetworkObjLock(obj);
if (VIR_STRDUP(names[got], driver->networks.objs[i]->def->name) < 0) { if (virConnectListDefinedNetworksCheckACL(conn, obj->def) &&
virNetworkObjUnlock(driver->networks.objs[i]); !virNetworkObjIsActive(obj)) {
if (VIR_STRDUP(names[got], obj->def->name) < 0) {
virNetworkObjUnlock(obj);
goto cleanup; goto cleanup;
} }
got++; got++;
} }
virNetworkObjUnlock(driver->networks.objs[i]); virNetworkObjUnlock(obj);
} }
networkDriverUnlock(driver); networkDriverUnlock(driver);
return got; return got;
...@@ -2946,7 +2954,9 @@ networkConnectListAllNetworks(virConnectPtr conn, ...@@ -2946,7 +2954,9 @@ networkConnectListAllNetworks(virConnectPtr conn,
goto cleanup; goto cleanup;
networkDriverLock(driver); networkDriverLock(driver);
ret = virNetworkList(conn, driver->networks, nets, flags); ret = virNetworkObjListExport(conn, driver->networks, nets,
virConnectListAllNetworksCheckACL,
flags);
networkDriverUnlock(driver); networkDriverUnlock(driver);
cleanup: cleanup:
......
...@@ -463,7 +463,7 @@ static int parallelsConnectListAllNetworks(virConnectPtr conn, ...@@ -463,7 +463,7 @@ static int parallelsConnectListAllNetworks(virConnectPtr conn,
virCheckFlags(VIR_CONNECT_LIST_NETWORKS_FILTERS_ALL, -1); virCheckFlags(VIR_CONNECT_LIST_NETWORKS_FILTERS_ALL, -1);
parallelsDriverLock(privconn); parallelsDriverLock(privconn);
ret = virNetworkList(conn, privconn->networks, nets, flags); ret = virNetworkObjListExport(conn, privconn->networks, nets, NULL, flags);
parallelsDriverUnlock(privconn); parallelsDriverUnlock(privconn);
return ret; return ret;
......
...@@ -3092,7 +3092,7 @@ testConnectListAllNetworks(virConnectPtr conn, ...@@ -3092,7 +3092,7 @@ testConnectListAllNetworks(virConnectPtr conn,
virCheckFlags(VIR_CONNECT_LIST_NETWORKS_FILTERS_ALL, -1); virCheckFlags(VIR_CONNECT_LIST_NETWORKS_FILTERS_ALL, -1);
testDriverLock(privconn); testDriverLock(privconn);
ret = virNetworkList(conn, privconn->networks, nets, flags); ret = virNetworkObjListExport(conn, privconn->networks, nets, NULL, flags);
testDriverUnlock(privconn); testDriverUnlock(privconn);
return ret; return ret;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册