SSOERROR SSOKeyValuePairNew( PSSO_KEY_VALUE_PAIR* pp, PCSTRING pszKey, PCSTRING pszValue) { SSOERROR e = SSOERROR_NONE; PSSO_KEY_VALUE_PAIR p = NULL; ASSERT_NOT_NULL(pp); ASSERT_NOT_NULL(pszKey); ASSERT_NOT_NULL(pszValue); e = SSOMemoryAllocate(sizeof(SSO_KEY_VALUE_PAIR), (void**) &p); BAIL_ON_ERROR(e); e = SSOStringAllocate(pszKey, &p->pszKey); BAIL_ON_ERROR(e); e = SSOStringAllocate(pszValue, &p->pszValue); BAIL_ON_ERROR(e); *pp = p; error: if (e != SSOERROR_NONE) { SSOKeyValuePairDelete(p); } return e; }
SSOERROR SSOCdcGetAffinitizedHost( PCSSO_CDC pCdc, PCSTRING domainName, int cdcFlags, PSTRING* ppszAffinitizedHost) { SSOERROR e = SSOERROR_NONE; DWORD dwError = 0; PVMAFD_SERVER pServer = NULL; PCDC_DC_INFO_A pDCInfo = NULL; PSTRING pszAffinitizedHost = NULL; if (pCdc == NULL || ppszAffinitizedHost == NULL) { e = SSOERROR_INVALID_ARGUMENT; BAIL_ON_ERROR(e); } dwError = (*(DWORD (*)(PCSTR, PCSTR, PCSTR, PVMAFD_SERVER*))pCdc->pVmAfdOpenServer)(NULL, NULL, NULL, &pServer); if (dwError != 0) { e = SSOERROR_VMAFD_CALL_FAILURE; BAIL_ON_ERROR(e); } dwError = (*(DWORD (*)(PVMAFD_SERVER, PCSTR, GUID_A, PCSTR, DWORD, PCDC_DC_INFO_A*))pCdc->pCdcGetDCName)(pServer, domainName, NULL, NULL, cdcFlags, &pDCInfo); if (dwError != 0) { e = SSOERROR_VMAFD_CALL_FAILURE; BAIL_ON_ERROR(e); } e = SSOStringAllocate(pDCInfo->pszDCName, &pszAffinitizedHost); BAIL_ON_ERROR(e); *ppszAffinitizedHost = pszAffinitizedHost; error: if (e != SSOERROR_NONE) { SSOStringFree(pszAffinitizedHost); } // cleanup if (pServer != NULL) { (*(VOID (*)(PVMAFD_SERVER))pCdc->pVmAfdCloseServer)(pServer); } if (pDCInfo != NULL) { (*(VOID (*)(PCDC_DC_INFO_A))pCdc->pCdcFreeDomainControllerInfo)(pDCInfo); } return e; }
SSOERROR SSOStringAllocateFromInt( int i, PSTRING* ppsz /* OUT */) { char pszBuffer[20]; // 20 is more than enough to fit the largest unsigned 64 bit integer ASSERT_NOT_NULL(ppsz); sprintf(pszBuffer, "%d", i); return SSOStringAllocate(pszBuffer, ppsz); }
// make sure you call OidcClientGlobalInit once per process before calling this // on success, pp will be non-null, when done, OidcClientDelete it // psztlsCAPath: NULL means skip tls validation, otherwise LIGHTWAVE_TLS_CA_PATH will work on lightwave client and server SSOERROR OidcClientBuild( POIDC_CLIENT* pp, PCSTRING pszServer, // OPT: null means use HA to get affinitized host int portNumber, PCSTRING pszTenant, PCSTRING pszClientID /* OPT */, PCSTRING pszTlsCAPath /* OPT, see comment above */) { SSOERROR e = SSOERROR_NONE; POIDC_CLIENT p = NULL; POIDC_SERVER_METADATA pServerMetadata = NULL; BAIL_ON_NULL_ARGUMENT(pp); BAIL_ON_NULL_ARGUMENT(pszTenant); e = SSOMemoryAllocate(sizeof(OIDC_CLIENT), (void**) &p); BAIL_ON_ERROR(e); if (NULL == pszServer) { e = SSOCdcNew(&p->pClientDCCache); BAIL_ON_ERROR(e); e = SSOCdcGetAffinitizedHost( p->pClientDCCache, NULL, // PCSTRING domainName 0, // int cdcFlags, &p->pszServer); BAIL_ON_ERROR(e); } else { e = SSOStringAllocate(pszServer, &p->pszServer); BAIL_ON_ERROR(e); } if (pszClientID != NULL) { e = SSOStringAllocate(pszClientID, &p->pszClientID); BAIL_ON_ERROR(e); } if (pszTlsCAPath != NULL) { e = SSOStringAllocate(pszTlsCAPath, &p->pszTlsCAPath); BAIL_ON_ERROR(e); } e = OidcServerMetadataAcquire(&pServerMetadata, p->pszServer, portNumber, pszTenant, p->pszTlsCAPath); BAIL_ON_ERROR(e); e = SSOStringAllocate(OidcServerMetadataGetTokenEndpointUrl(pServerMetadata), &p->pszTokenEndpointUrl); BAIL_ON_ERROR(e); e = SSOStringAllocate(OidcServerMetadataGetSigningCertificatePEM(pServerMetadata), &p->pszSigningCertificatePEM); BAIL_ON_ERROR(e); *pp = p; error: if (e != SSOERROR_NONE) { OidcClientDelete(p); } OidcServerMetadataDelete(pServerMetadata); return e; }
SSOERROR SSOStringReplace( PCSTRING pszInput, PCSTRING pszFind, PCSTRING pszReplace, PSTRING* ppsz /* OUT */) { SSOERROR e = SSOERROR_NONE; PSTRING psz = NULL; PSTRING pszPrefix = NULL; PSTRING pszSuffix = NULL; PSTRING pszPrefixPlusReplace = NULL; char* pszLocation = strstr(pszInput, pszFind); ASSERT_NOT_NULL(pszInput); ASSERT_NOT_NULL(pszFind); ASSERT_NOT_NULL(pszReplace); ASSERT_NOT_NULL(ppsz); if (pszLocation != NULL) { size_t inputLength = strlen(pszInput); size_t findLength = strlen(pszFind); size_t locationLength = strlen(pszLocation); size_t prefixLength = inputLength - locationLength; size_t suffixLength = locationLength - findLength; if (prefixLength > 0) { e = SSOStringAllocateSubstring(pszInput, 0, prefixLength - 1, &pszPrefix); BAIL_ON_ERROR(e); } else { e = SSOStringAllocate("", &pszPrefix); BAIL_ON_ERROR(e); } if (suffixLength > 0) { e = SSOStringAllocateSubstring(pszInput, inputLength - suffixLength, inputLength - 1, &pszSuffix); BAIL_ON_ERROR(e); } else { e = SSOStringAllocate("", &pszSuffix); BAIL_ON_ERROR(e); } e = SSOStringConcatenate(pszPrefix, pszReplace, &pszPrefixPlusReplace); BAIL_ON_ERROR(e); e = SSOStringConcatenate(pszPrefixPlusReplace, pszSuffix, &psz); BAIL_ON_ERROR(e); } else { // not found, return a copy of the input e = SSOStringAllocate(pszInput, &psz); BAIL_ON_ERROR(e); } *ppsz = psz; error: if (e != SSOERROR_NONE) { SSOStringFree(psz); } SSOStringFree(pszPrefix); SSOStringFree(pszSuffix); SSOStringFree(pszPrefixPlusReplace); return e; }