int rv = -1;
int auth = virNetServerClientGetAuth(client);
uid_t callerUid;
+ gid_t callerGid;
pid_t callerPid;
/* If the client is root then we want to bypass the
* some piece of polkit isn't present/running
*/
if (auth == VIR_NET_SERVER_SERVICE_AUTH_POLKIT) {
- if (virNetServerClientGetLocalIdentity(client, &callerUid, &callerPid) < 0) {
+ if (virNetServerClientGetLocalIdentity(client, &callerUid, &callerGid, &callerPid) < 0) {
/* Don't do anything on error - it'll be validated at next
* phase of auth anyway */
virResetLastError();
remote_auth_polkit_ret *ret)
{
pid_t callerPid = -1;
+ gid_t callerGid = -1;
uid_t callerUid = -1;
const char *action;
int status = -1;
goto authfail;
}
- if (virNetServerClientGetLocalIdentity(client, &callerUid, &callerPid) < 0) {
+ if (virNetServerClientGetLocalIdentity(client, &callerUid, &callerGid, &callerPid) < 0) {
goto authfail;
}
remote_auth_polkit_ret *ret)
{
pid_t callerPid;
+ gid_t callerGid;
uid_t callerUid;
PolKitCaller *pkcaller = NULL;
PolKitAction *pkaction = NULL;
goto authfail;
}
- if (virNetServerClientGetLocalIdentity(client, &callerUid, &callerPid) < 0) {
+ if (virNetServerClientGetLocalIdentity(client, &callerUid, &callerGid, &callerPid) < 0) {
VIR_ERROR(_("cannot get peer socket identity"));
goto authfail;
}
}
int virNetServerClientGetLocalIdentity(virNetServerClientPtr client,
- uid_t *uid, pid_t *pid)
+ uid_t *uid, gid_t *gid, pid_t *pid)
{
int ret = -1;
virNetServerClientLock(client);
if (client->sock)
- ret = virNetSocketGetLocalIdentity(client->sock, uid, pid);
+ ret = virNetSocketGetLocalIdentity(client->sock, uid, gid, pid);
virNetServerClientUnlock(client);
return ret;
}
const char *virNetServerClientGetIdentity(virNetServerClientPtr client);
int virNetServerClientGetLocalIdentity(virNetServerClientPtr client,
- uid_t *uid, pid_t *pid);
+ uid_t *uid, gid_t *gid, pid_t *pid);
void virNetServerClientRef(virNetServerClientPtr client);
#ifdef SO_PEERCRED
int virNetSocketGetLocalIdentity(virNetSocketPtr sock,
uid_t *uid,
+ gid_t *gid,
pid_t *pid)
{
struct ucred cr;
*pid = cr.pid;
*uid = cr.uid;
+ *gid = cr.gid;
virMutexUnlock(&sock->lock);
return 0;
#else
int virNetSocketGetLocalIdentity(virNetSocketPtr sock ATTRIBUTE_UNUSED,
uid_t *uid ATTRIBUTE_UNUSED,
+ gid_t *gid ATTRIBUTE_UNUSED,
pid_t *pid ATTRIBUTE_UNUSED)
{
/* XXX Many more OS support UNIX socket credentials we could port to. See dbus ....*/
int virNetSocketGetLocalIdentity(virNetSocketPtr sock,
uid_t *uid,
+ gid_t *gid,
pid_t *pid);
int virNetSocketSetBlocking(virNetSocketPtr sock,