8702
*-----------------------------------------------------------------------------
8704
* VixToolsAddAuthPrincipal --
8706
* Calls to VGAuth to add a new principal.
8712
* VGAuth IdProvider store is updated.
8714
*-----------------------------------------------------------------------------
8718
VixToolsAddAuthPrincipal(VixCommandRequestHeader *requestMsg) // IN
8720
VixError err = VIX_OK;
8722
void *userToken = NULL;
8723
VGAuthContext *ctx = NULL;
8724
VixMsgAddAuthPrincipalRequest *req;
8725
const char *userName;
8726
const char *pemCert;
8727
const char *principalName;
8728
const char *principalComment;
8729
VGAuthSubjectInfo si;
8730
VMAutomationRequestParser parser;
8731
Bool impersonatingVMWareUser = FALSE;
8733
Debug(">%s\n", __FUNCTION__);
8735
err = VMAutomationRequestParserInit(&parser, requestMsg, sizeof *req);
8736
if (VIX_OK != err) {
8740
req = (VixMsgAddAuthPrincipalRequest *) requestMsg;
8741
err = VMAutomationRequestParserGetOptionalString(&parser, req->userNameLen,
8743
if (VIX_OK != err) {
8747
if (NULL == userName || 0 == *userName) {
8748
err = VIX_E_INVALID_ARG;
8752
err = VMAutomationRequestParserGetOptionalString(&parser, req->pemCertLen,
8754
if (VIX_OK != err) {
8758
if (NULL == pemCert || 0 == *pemCert) {
8759
err = VIX_E_INVALID_ARG;
8763
if ((req->principalType != VIX_GUEST_AUTH_PRINCIPAL_TYPE_NAMED) &&
8764
(req->principalType != VIX_GUEST_AUTH_PRINCIPAL_TYPE_ANY)) {
8765
err = VIX_E_INVALID_ARG;
8769
err = VMAutomationRequestParserGetOptionalString(&parser, req->principalNameLen,
8771
if (VIX_OK != err) {
8775
if ((req->principalType == VIX_GUEST_AUTH_PRINCIPAL_TYPE_NAMED) &&
8776
(NULL == principalName || 0 == *principalName)) {
8777
err = VIX_E_INVALID_ARG;
8781
err = VMAutomationRequestParserGetOptionalString(&parser, req->principalCommentLen,
8783
if (VIX_OK != err) {
8787
err = VixToolsImpersonateUser((VixCommandRequestHeader *) requestMsg,
8789
if (VIX_OK != err) {
8792
impersonatingVMWareUser = TRUE;
8794
vgErr = TheVGAuthContext(&ctx);
8795
if (VGAUTH_FAILED(vgErr)) {
8796
err = VixToolsTranslateVGAuthError(vgErr);
8800
si.subject.type = (req->principalType == VIX_GUEST_AUTH_PRINCIPAL_TYPE_NAMED) ?
8801
VGAUTH_SUBJECT_NAMED : VGAUTH_SUBJECT_ANY;
8802
si.subject.val.name = (char *) principalName;
8803
si.comment = (char *) principalComment;
8805
vgErr = VGAuth_AddSubject(ctx, userName, req->addMapping, pemCert, &si,
8807
if (VGAUTH_FAILED(vgErr)) {
8808
err = VixToolsTranslateVGAuthError(vgErr);
8812
if (impersonatingVMWareUser) {
8813
VixToolsUnimpersonateUser(userToken);
8815
VixToolsLogoutUser(userToken);
8817
Debug("<%s\n", __FUNCTION__);
8824
*-----------------------------------------------------------------------------
8826
* VixToolsRemoveAuthPrincipal --
8828
* Calls to VGAuth to remove a principal.
8834
* VGAuth IdProvider store is updated.
8836
*-----------------------------------------------------------------------------
8840
VixToolsRemoveAuthPrincipal(VixCommandRequestHeader *requestMsg) // IN
8842
VixError err = VIX_OK;
8844
void *userToken = NULL;
8845
VGAuthContext *ctx = NULL;
8846
VixMsgRemoveAuthPrincipalRequest *req;
8847
const char *userName;
8848
const char *pemCert;
8849
const char *principalName;
8851
VMAutomationRequestParser parser;
8852
Bool impersonatingVMWareUser = FALSE;
8854
Debug(">%s\n", __FUNCTION__);
8856
err = VMAutomationRequestParserInit(&parser, requestMsg, sizeof *req);
8857
if (VIX_OK != err) {
8861
req = (VixMsgRemoveAuthPrincipalRequest *) requestMsg;
8862
err = VMAutomationRequestParserGetOptionalString(&parser, req->userNameLen,
8864
if (VIX_OK != err) {
8868
if (NULL == userName || 0 == *userName) {
8869
err = VIX_E_INVALID_ARG;
8873
err = VMAutomationRequestParserGetOptionalString(&parser, req->pemCertLen,
8875
if (VIX_OK != err) {
8879
if (NULL == pemCert || 0 == *pemCert) {
8880
err = VIX_E_INVALID_ARG;
8884
if ((req->principalType != VIX_GUEST_AUTH_PRINCIPAL_TYPE_NONE) &&
8885
(req->principalType != VIX_GUEST_AUTH_PRINCIPAL_TYPE_NAMED) &&
8886
(req->principalType != VIX_GUEST_AUTH_PRINCIPAL_TYPE_ANY)) {
8887
err = VIX_E_INVALID_ARG;
8891
err = VMAutomationRequestParserGetOptionalString(&parser, req->principalNameLen,
8893
if (VIX_OK != err) {
8897
if ((req->principalType == VIX_GUEST_AUTH_PRINCIPAL_TYPE_NAMED) &&
8898
(NULL == principalName || 0 == *principalName)) {
8899
err = VIX_E_INVALID_ARG;
8903
err = VixToolsImpersonateUser((VixCommandRequestHeader *) requestMsg,
8905
if (VIX_OK != err) {
8908
impersonatingVMWareUser = TRUE;
8910
vgErr = TheVGAuthContext(&ctx);
8911
if (VGAUTH_FAILED(vgErr)) {
8912
err = VixToolsTranslateVGAuthError(vgErr);
8916
if (VIX_GUEST_AUTH_PRINCIPAL_TYPE_NONE == req->principalType) {
8917
vgErr = VGAuth_RemoveCert(ctx, userName, pemCert, 0, NULL);
8919
subj.type = (req->principalType == VIX_GUEST_AUTH_PRINCIPAL_TYPE_NAMED) ?
8920
VGAUTH_SUBJECT_NAMED : VGAUTH_SUBJECT_ANY;
8921
subj.val.name = (char *) principalName;
8923
vgErr = VGAuth_RemoveSubject(ctx, userName, pemCert, &subj, 0, NULL);
8925
if (VGAUTH_FAILED(vgErr)) {
8926
err = VixToolsTranslateVGAuthError(vgErr);
8930
if (impersonatingVMWareUser) {
8931
VixToolsUnimpersonateUser(userToken);
8933
VixToolsLogoutUser(userToken);
8935
Debug("<%s\n", __FUNCTION__);
8942
*-----------------------------------------------------------------------------
8944
* VixToolsListAuthPrincipals --
8946
* Calls to VGAuth to list principals.
8952
* VGAuth IdProvider store is updated.
8954
*-----------------------------------------------------------------------------
8958
VixToolsListAuthPrincipals(VixCommandRequestHeader *requestMsg, // IN
8959
size_t maxBufferSize, // IN
8960
char **result) // OUT
8962
VixError err = VIX_OK;
8964
void *userToken = NULL;
8965
VGAuthContext *ctx = NULL;
8966
VixMsgListAuthPrincipalsRequest *req;
8967
const char *userName;
8968
VMAutomationRequestParser parser;
8969
Bool impersonatingVMWareUser = FALSE;
8973
VGAuthIdProvider *idList = NULL;
8974
static char resultBuffer[GUESTMSG_MAX_IN_SIZE];
8977
char *tmpBuf = NULL;
8978
char *tmpBuf2 = NULL;
8981
char *escapedStr = NULL;
8982
char *escapedStr2 = NULL;
8984
Debug(">%s\n", __FUNCTION__);
8986
ASSERT(maxBufferSize <= GUESTMSG_MAX_IN_SIZE);
8990
destPtr = resultBuffer;
8993
err = VMAutomationRequestParserInit(&parser, requestMsg, sizeof *req);
8994
if (VIX_OK != err) {
8998
req = (VixMsgListAuthPrincipalsRequest *) requestMsg;
8999
err = VMAutomationRequestParserGetOptionalString(&parser, req->userNameLen,
9001
if (VIX_OK != err) {
9005
if (NULL == userName || 0 == *userName) {
9006
err = VIX_E_INVALID_ARG;
9010
err = VixToolsImpersonateUser((VixCommandRequestHeader *) requestMsg,
9012
if (VIX_OK != err) {
9015
impersonatingVMWareUser = TRUE;
9017
vgErr = TheVGAuthContext(&ctx);
9018
if (VGAUTH_FAILED(vgErr)) {
9019
err = VixToolsTranslateVGAuthError(vgErr);
9023
vgErr = VGAuth_QueryIdProviders(ctx, userName, 0, NULL, &num, &idList);
9024
if (VGAUTH_FAILED(vgErr)) {
9025
err = VixToolsTranslateVGAuthError(vgErr);
9029
endDestPtr = resultBuffer + maxBufferSize;
9030
destPtr += Str_Sprintf(destPtr, endDestPtr - destPtr, "%s",
9031
VIX_XML_ESCAPED_TAG);
9032
for (i = 0; i < num; i++) {
9033
escapedStr = VixToolsEscapeXMLString(idList[i].pemCert);
9034
if (escapedStr == NULL) {
9035
err = VIX_E_OUT_OF_MEMORY;
9038
tmpBuf2 = Str_Asprintf(NULL, "<record><pemCert>%s</pemCert>",
9042
if (tmpBuf2 == NULL) {
9043
err = VIX_E_OUT_OF_MEMORY;
9046
for (j = 0; j < idList->numInfos; j++) {
9047
if (idList[i].infos[j].comment) {
9048
escapedStr = VixToolsEscapeXMLString(idList[i].infos[j].comment);
9049
if (escapedStr == NULL) {
9050
err = VIX_E_OUT_OF_MEMORY;
9054
if (idList[i].infos[j].subject.type == VGAUTH_SUBJECT_NAMED) {
9055
escapedStr2 = VixToolsEscapeXMLString(idList[i].infos[j].subject.val.name);
9056
if (escapedStr2 == NULL) {
9057
err = VIX_E_OUT_OF_MEMORY;
9061
tmpBuf = Str_Asprintf(NULL,
9066
"<comment>%s</comment>"
9069
(idList[i].infos[j].subject.type == VGAUTH_SUBJECT_NAMED)
9070
? VIX_GUEST_AUTH_PRINCIPAL_TYPE_NAMED :
9071
VIX_GUEST_AUTH_PRINCIPAL_TYPE_ANY,
9072
escapedStr2 ? escapedStr2 : "",
9073
escapedStr ? escapedStr : "");
9074
if (tmpBuf == NULL) {
9075
err = VIX_E_OUT_OF_MEMORY;
9085
recordBuf = Str_Asprintf(&recordSize,
9089
tmpBuf = tmpBuf2 = NULL;
9090
if (recordBuf == NULL) {
9091
err = VIX_E_OUT_OF_MEMORY;
9094
if ((destPtr + recordSize) < endDestPtr) {
9095
destPtr += Str_Sprintf(destPtr, endDestPtr - destPtr,
9100
Log("%s: ListAuth list results too large, truncating", __FUNCTION__);
9105
*result = resultBuffer;
9112
VGAuth_FreeIdProviderList(num, idList);
9113
if (impersonatingVMWareUser) {
9114
VixToolsUnimpersonateUser(userToken);
9116
VixToolsLogoutUser(userToken);
9119
Debug("<%s\n", __FUNCTION__);
9126
*-----------------------------------------------------------------------------
9128
* VixToolsListMappedPrincipals --
9130
* Calls to VGAuth to list mapped principals.
9136
* VGAuth IdProvider store is updated.
9138
*-----------------------------------------------------------------------------
9142
VixToolsListMappedPrincipals(VixCommandRequestHeader *requestMsg, // IN
9143
size_t maxBufferSize, // IN
9144
char **result) // OUT
9146
VixError err = VIX_OK;
9148
void *userToken = NULL;
9149
VGAuthContext *ctx = NULL;
9150
VixMsgListMappedPrincipalsRequest *req;
9151
VMAutomationRequestParser parser;
9152
Bool impersonatingVMWareUser = FALSE;
9156
VGAuthMappedIdentity *miList = NULL;
9157
static char resultBuffer[GUESTMSG_MAX_IN_SIZE];
9160
char *tmpBuf = NULL;
9161
char *tmpBuf2 = NULL;
9163
char *escapedStr = NULL;
9164
char *escapedStr2 = NULL;
9167
Debug(">%s\n", __FUNCTION__);
9169
ASSERT(maxBufferSize <= GUESTMSG_MAX_IN_SIZE);
9172
destPtr = resultBuffer;
9175
err = VMAutomationRequestParserInit(&parser, requestMsg, sizeof *req);
9176
if (VIX_OK != err) {
9180
req = (VixMsgListMappedPrincipalsRequest *) requestMsg;
9181
err = VixToolsImpersonateUser((VixCommandRequestHeader *) requestMsg,
9183
if (VIX_OK != err) {
9186
impersonatingVMWareUser = TRUE;
9188
vgErr = TheVGAuthContext(&ctx);
9189
if (vgErr != VGAUTH_E_OK) {
9190
err = VixToolsTranslateVGAuthError(vgErr);
9194
vgErr = VGAuth_QueryMappedIdentities(ctx, 0, NULL, &num, &miList);
9195
if (VGAUTH_FAILED(vgErr)) {
9196
err = VixToolsTranslateVGAuthError(vgErr);
9200
endDestPtr = resultBuffer + maxBufferSize;
9201
destPtr += Str_Sprintf(destPtr, endDestPtr - destPtr, "%s",
9202
VIX_XML_ESCAPED_TAG);
9203
for (i = 0; i < num; i++) {
9204
escapedStr = VixToolsEscapeXMLString(miList[i].pemCert);
9205
if (escapedStr == NULL) {
9206
err = VIX_E_OUT_OF_MEMORY;
9209
escapedStr2 = VixToolsEscapeXMLString(miList[i].userName);
9210
if (escapedStr2 == NULL) {
9211
err = VIX_E_OUT_OF_MEMORY;
9214
tmpBuf2 = Str_Asprintf(NULL, "<record><pemCert>%s</pemCert>"
9215
"<userName>%s</userName>",
9218
if (tmpBuf2 == NULL) {
9219
err = VIX_E_OUT_OF_MEMORY;
9222
for (j = 0; j < miList->numSubjects; j++) {
9223
if (miList[i].subjects[j].type == VGAUTH_SUBJECT_NAMED) {
9224
escapedStr = VixToolsEscapeXMLString(miList[i].subjects[j].val.name);
9225
if (escapedStr == NULL) {
9226
err = VIX_E_OUT_OF_MEMORY;
9230
tmpBuf = Str_Asprintf(NULL,
9237
(miList[i].subjects[j].type == VGAUTH_SUBJECT_NAMED)
9238
? VIX_GUEST_AUTH_PRINCIPAL_TYPE_NAMED :
9239
VIX_GUEST_AUTH_PRINCIPAL_TYPE_ANY,
9240
escapedStr ? escapedStr : "");
9241
if (tmpBuf == NULL) {
9242
err = VIX_E_OUT_OF_MEMORY;
9250
recordBuf = Str_Asprintf(&recordSize,
9254
if (recordBuf == NULL) {
9255
err = VIX_E_OUT_OF_MEMORY;
9258
tmpBuf = tmpBuf2 = NULL;
9259
if ((destPtr + recordSize) < endDestPtr) {
9260
destPtr += Str_Sprintf(destPtr, endDestPtr - destPtr,
9265
Log("%s: ListMapped results too large, truncating", __FUNCTION__);
9270
*result = resultBuffer;
9277
VGAuth_FreeMappedIdentityList(num, miList);
9278
if (impersonatingVMWareUser) {
9279
VixToolsUnimpersonateUser(userToken);
9281
VixToolsLogoutUser(userToken);
9283
Debug("<%s\n", __FUNCTION__);
9287
#endif // SUPPORT_VGAUTH
9291
*-----------------------------------------------------------------------------
9293
* VixToolsCreateRegKey --
9295
* Calls the function to create a new Windows Registry Key.
9301
* May affect applications reading the key.
9303
*-----------------------------------------------------------------------------
9307
VixToolsCreateRegKey(VixCommandRequestHeader *requestMsg) // IN
9310
return VixToolsCreateRegKeyImpl(requestMsg);
9312
return VIX_E_OP_NOT_SUPPORTED_ON_GUEST;
9318
*-----------------------------------------------------------------------------
9320
* VixToolsListRegKeys --
9322
* Calls the function to list all subkeys for a given Windows Registry Key.
9330
*-----------------------------------------------------------------------------
9334
VixToolsListRegKeys(VixCommandRequestHeader *requestMsg, // IN
9335
size_t maxBufferSize, // IN
9336
void *eventQueue, // IN
9337
char **result) // OUT
9340
return VixToolsListRegKeysImpl(requestMsg, maxBufferSize, eventQueue, result);
9342
return VIX_E_OP_NOT_SUPPORTED_ON_GUEST;
9348
*-----------------------------------------------------------------------------
9350
* VixToolsDeleteRegKey --
9352
* Calls the function to delete a Windows Registry Key.
9358
* May affect applications reading the key.
9360
*-----------------------------------------------------------------------------
9364
VixToolsDeleteRegKey(VixCommandRequestHeader *requestMsg) // IN
9367
return VixToolsDeleteRegKeyImpl(requestMsg);
9369
return VIX_E_OP_NOT_SUPPORTED_ON_GUEST;
9375
*-----------------------------------------------------------------------------
9377
* VixToolsSetRegValue --
9379
* Calls the function to set/create a Windows Registry Value for a given Key.
9385
* May affect applications reading the key.
9387
*-----------------------------------------------------------------------------
9391
VixToolsSetRegValue(VixCommandRequestHeader *requestMsg) // IN
9394
return VixToolsSetRegValueImpl(requestMsg);
9396
return VIX_E_OP_NOT_SUPPORTED_ON_GUEST;
9402
*-----------------------------------------------------------------------------
9404
* VixToolsListRegValues --
9406
* Calls the function to list all values for a given Windows Registry Key.
9414
*-----------------------------------------------------------------------------
9418
VixToolsListRegValues(VixCommandRequestHeader *requestMsg, // IN
9419
size_t maxBufferSize, // IN
9420
void *eventQueue, // IN
9421
char **result) // OUT
9424
return VixToolsListRegValuesImpl(requestMsg, maxBufferSize, eventQueue, result);
9426
return VIX_E_OP_NOT_SUPPORTED_ON_GUEST;
9432
*-----------------------------------------------------------------------------
9434
* VixToolsDeleteRegValue --
9436
* Calls the function to delete a Windows Registry Value for a given Key.
9442
* May affect applications reading the key.
9444
*-----------------------------------------------------------------------------
9448
VixToolsDeleteRegValue(VixCommandRequestHeader *requestMsg) // IN
9451
return VixToolsDeleteRegValueImpl(requestMsg);
9453
return VIX_E_OP_NOT_SUPPORTED_ON_GUEST;
8336
9459
*-----------------------------------------------------------------------------
9433
10704
return strlen(str);
10710
*-----------------------------------------------------------------------------
10712
* GuestAuthEnabled --
10714
* Returns whether we use the guest auth library.
10717
* TRUE if we do. FALSE otherwise.
10722
*-----------------------------------------------------------------------------
10726
GuestAuthEnabled(void)
10729
return gSupportVGAuth;
10737
*-----------------------------------------------------------------------------
10739
* GuestAuthPasswordAuthenticateImpersonate
10741
* Do name-password authentication and impersonation using
10742
* the GuestAuth library.
10745
* VIX_OK if successful.Other VixError code otherwise.
10748
* Current process impersonates.
10750
*-----------------------------------------------------------------------------
10754
GuestAuthPasswordAuthenticateImpersonate(
10755
char const *obfuscatedNamePassword, // IN
10756
void **userToken) // OUT
10762
VGAuthContext *ctx = NULL;
10764
VGAuthUserHandle *newHandle = NULL;
10766
err = VixMsg_DeObfuscateNamePassword(obfuscatedNamePassword,
10769
if (err != VIX_OK) {
10773
err = VIX_E_INVALID_LOGIN_CREDENTIALS;
10775
vgErr = TheVGAuthContext(&ctx);
10776
if (VGAUTH_FAILED(vgErr)) {
10777
err = VixToolsTranslateVGAuthError(vgErr);
10781
vgErr = VGAuth_ValidateUsernamePassword(ctx, username, password,
10784
if (VGAUTH_FAILED(vgErr)) {
10785
err = VixToolsTranslateVGAuthError(vgErr);
10789
vgErr = VGAuth_Impersonate(ctx, newHandle, 0, NULL);
10790
if (VGAUTH_FAILED(vgErr)) {
10791
err = VixToolsTranslateVGAuthError(vgErr);
10795
*userToken = VGAUTH_GENERIC_USER_TOKEN;
10802
VGAuth_UserHandleFree(newHandle);
10807
return VIX_E_NOT_SUPPORTED;
10813
*-----------------------------------------------------------------------------
10815
* GuestAuthSAMLAuthenticateAndImpersonate
10817
* Do SAML bearer token authentication and impersonation using
10818
* the GuestAuth library.
10821
* VIX_OK if successful. Other VixError code otherwise.
10824
* Current process impersonates.
10826
*-----------------------------------------------------------------------------
10830
GuestAuthSAMLAuthenticateAndImpersonate(
10831
char const *obfuscatedNamePassword, // IN
10832
void **userToken) // OUT
10838
VGAuthContext *ctx = NULL;
10840
VGAuthUserHandle *newHandle = NULL;
10842
Debug(">%s\n", __FUNCTION__);
10843
err = VixMsg_DeObfuscateNamePassword(obfuscatedNamePassword,
10846
if (err != VIX_OK) {
10850
err = VIX_E_INVALID_LOGIN_CREDENTIALS;
10852
vgErr = TheVGAuthContext(&ctx);
10853
if (VGAUTH_FAILED(vgErr)) {
10854
err = VixToolsTranslateVGAuthError(vgErr);
10858
vgErr = VGAuth_ValidateSamlBearerToken(ctx,
10864
if (VGAUTH_FAILED(vgErr)) {
10865
err = VixToolsTranslateVGAuthError(vgErr);
10869
vgErr = VGAuth_Impersonate(ctx, newHandle, 0, NULL);
10870
if (VGAUTH_FAILED(vgErr)) {
10871
err = VixToolsTranslateVGAuthError(vgErr);
10875
*userToken = VGAUTH_GENERIC_USER_TOKEN;
10882
VGAuth_UserHandleFree(newHandle);
10885
Debug("<%s\n", __FUNCTION__);
10889
return VIX_E_NOT_SUPPORTED;
10895
*-----------------------------------------------------------------------------
10897
* GuestAuthUnimpersonate
10899
* End the current impersonation using the VGAuth library.
10905
* Current process un-impersonates.
10907
*-----------------------------------------------------------------------------
10911
GuestAuthUnimpersonate(void)
10914
VGAuthContext *ctx;
10915
VGAuthError vgErr = TheVGAuthContext(&ctx);
10916
ASSERT(vgErr == VGAUTH_E_OK);
10918
vgErr = VGAuth_EndImpersonation(ctx);
10919
ASSERT(vgErr == VGAUTH_E_OK);
10928
*-----------------------------------------------------------------------------
10930
* QueryVGAuthConfig
10932
* Check the tools configuration to see if VGAuth should be used.
10935
* TRUE if vgauth should be used, FALSE if not.
10940
*-----------------------------------------------------------------------------
10944
QueryVGAuthConfig(GKeyFile *confDictRef) // IN
10946
gboolean useVGAuth;
10947
gboolean retVal = USE_VGAUTH_DEFAULT;
10948
GError *gErr = NULL;
10950
if (confDictRef != NULL) {
10951
useVGAuth = g_key_file_get_boolean(confDictRef,
10952
VIX_TOOLS_CONFIG_API_GROUPNAME,
10953
VIXTOOLS_CONFIG_USE_VGAUTH_NAME,
10957
* g_key_file_get_boolean() will return FALSE and set an error
10958
* if the value isn't in config, so use the default in that
10961
if (!useVGAuth && (NULL != gErr)) {
10962
g_error_free(gErr);
10963
retVal = USE_VGAUTH_DEFAULT;
10965
retVal = useVGAuth;
10969
Debug("%s: vgauth usage is: %d\n", __FUNCTION__, retVal);
10976
*-----------------------------------------------------------------------------
10980
* Get the global VGAuthContext object.
10981
* Lazily create the global VGAuthContext when needed.
10982
* Creating the global context may also cause the VGAuth Service to
10986
* VGAUTH_E_OK if successful, the global context object is returned in
10987
* the OUT parameter ctx.
10992
*-----------------------------------------------------------------------------
10996
TheVGAuthContext(VGAuthContext **ctx) // OUT
10998
static VGAuthContext *vgaCtx = NULL;
10999
VGAuthError vgaCode = VGAUTH_E_OK;
11002
* XXX This needs to handle errors better -- if the service gets
11003
* reset, the context will point to junk and anything using it will
11006
* Maybe add a no-op API here to poke it? Or make the underlying
11007
* VGAuth code smarter.
11009
if (vgaCtx == NULL) {
11010
vgaCode = VGAuth_Init(VMTOOLSD_APP_NAME, 0, NULL, &vgaCtx);