75
74
int sockTimer; /* Timer to be fired upon cached data,
76
75
* so we jump out from poll() immediately */
78
virIdentityPtr identity;
78
80
/* Count of messages in the 'tx' queue,
79
81
* and the server worker pool queue
80
82
* ie RPC calls in progress. Does not count
463
464
_("Missing nrequests_client_max field in JSON state document"));
466
if (virJSONValueObjectHasKey(object, "identity") &&
467
(!(identity = virJSONValueObjectGetString(object, "identity")))) {
468
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
469
_("Missing identity field in JSON state document"));
473
468
if (!(child = virJSONValueObjectGet(object, "sock"))) {
474
469
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
494
489
virObjectUnref(sock);
497
virNetServerClientSetIdentity(client, identity) < 0)
501
492
if (!(child = virJSONValueObjectGet(object, "privateData"))) {
502
493
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
536
527
if (virJSONValueObjectAppendNumberUint(object, "nrequests_max", client->nrequests_max) < 0)
539
if (client->identity &&
540
virJSONValueObjectAppendString(object, "identity", client->identity) < 0)
543
530
if (!(child = virNetSocketPreExecRestart(client->sock)))
625
bool virNetServerClientIsLocal(virNetServerClientPtr client)
628
virObjectLock(client);
630
local = virNetSocketIsLocal(client->sock);
631
virObjectUnlock(client);
620
636
int virNetServerClientGetUNIXIdentity(virNetServerClientPtr client,
621
637
uid_t *uid, gid_t *gid, pid_t *pid)
648
static virIdentityPtr
649
virNetServerClientCreateIdentity(virNetServerClientPtr client)
651
char *processid = NULL;
652
char *username = NULL;
653
char *groupname = NULL;
655
char *saslname = NULL;
657
char *x509dname = NULL;
658
char *seccontext = NULL;
659
virIdentityPtr ret = NULL;
661
if (client->sock && virNetSocketIsLocal(client->sock)) {
665
if (virNetSocketGetUNIXIdentity(client->sock, &uid, &gid, &pid) < 0)
668
if (!(username = virGetUserName(uid)))
670
if (!(groupname = virGetGroupName(gid)))
672
if (virAsprintf(&processid, "%lld",
673
(long long)pid) < 0) {
681
const char *identity = virNetSASLSessionGetIdentity(client->sasl);
683
!(saslname = strdup(identity))) {
692
const char *identity = virNetTLSSessionGetX509DName(client->tls);
694
!(x509dname = strdup(identity))) {
702
virNetSocketGetSecurityContext(client->sock, &seccontext) < 0)
705
if (!(ret = virIdentityNew()))
709
virIdentitySetAttr(ret,
710
VIR_IDENTITY_ATTR_UNIX_USER_NAME,
714
virIdentitySetAttr(ret,
715
VIR_IDENTITY_ATTR_UNIX_GROUP_NAME,
719
virIdentitySetAttr(ret,
720
VIR_IDENTITY_ATTR_UNIX_PROCESS_ID,
725
virIdentitySetAttr(ret,
726
VIR_IDENTITY_ATTR_SASL_USER_NAME,
731
virIdentitySetAttr(ret,
732
VIR_IDENTITY_ATTR_X509_DISTINGUISHED_NAME,
736
virIdentitySetAttr(ret,
737
VIR_IDENTITY_ATTR_SECURITY_CONTEXT,
745
VIR_FREE(seccontext);
759
virIdentityPtr virNetServerClientGetIdentity(virNetServerClientPtr client)
761
virIdentityPtr ret = NULL;
762
virObjectLock(client);
763
if (!client->identity)
764
client->identity = virNetServerClientCreateIdentity(client);
765
if (client->identity)
766
ret = virObjectRef(client->identity);
767
virObjectUnlock(client);
772
int virNetServerClientGetSecurityContext(virNetServerClientPtr client,
777
virObjectLock(client);
779
ret = virNetSocketGetSecurityContext(client->sock, context);
780
virObjectUnlock(client);
631
785
bool virNetServerClientIsSecure(virNetServerClientPtr client)
633
787
bool secure = false;
660
814
client->sasl = virObjectRef(sasl);
661
815
virObjectUnlock(client);
819
virNetSASLSessionPtr virNetServerClientGetSASLSession(virNetServerClientPtr client)
821
virNetSASLSessionPtr sasl;
822
virObjectLock(client);
824
virObjectUnlock(client);
666
int virNetServerClientSetIdentity(virNetServerClientPtr client,
667
const char *identity)
670
virObjectLock(client);
671
if (!(client->identity = strdup(identity))) {
678
virObjectUnlock(client);
682
const char *virNetServerClientGetIdentity(virNetServerClientPtr client)
684
const char *identity;
685
virObjectLock(client);
686
identity = client->identity;
687
virObjectUnlock(client);
692
830
void *virNetServerClientGetPrivateData(virNetServerClientPtr client)
740
878
virNetServerClientPtr client = obj;
880
PROBE(RPC_SERVER_CLIENT_DISPOSE,
881
"client=%p", client);
883
virObjectUnref(client->identity);
742
885
if (client->privateData &&
743
886
client->privateDataFreeFunc)
744
887
client->privateDataFreeFunc(client->privateData);
746
VIR_FREE(client->identity);
748
890
virObjectUnref(client->sasl);