DWORD LWSaveConfigSectionList( PCSTR pszConfigFilePath, PCFGSECTION pSectionList ) { DWORD dwError = 0; /*PNVPAIR pNVPair = NULL;*/ FILE* fp = NULL; PSTR pszTmpPath = NULL; BOOLEAN bRemoveFile = FALSE; dwError = LwAllocateMemory(strlen(pszConfigFilePath)+strlen(".macadutil")+1, (PVOID*)&pszTmpPath); BAIL_ON_MAC_ERROR(dwError); sprintf(pszTmpPath, "%s.macadutil", pszConfigFilePath); if ((fp = fopen(pszTmpPath, "w")) == NULL) { dwError = errno; BAIL_ON_MAC_ERROR(dwError); } if (fcntl(fileno(fp), F_SETFD, FD_CLOEXEC) < 0) { dwError = errno; BAIL_ON_MAC_ERROR(dwError); } bRemoveFile = TRUE; dwError = LWSaveConfigSectionListToFile(fp, pSectionList); BAIL_ON_MAC_ERROR(dwError); fclose(fp); fp = NULL; dwError = LwMoveFile(pszTmpPath, pszConfigFilePath); BAIL_ON_MAC_ERROR(dwError); bRemoveFile = FALSE; cleanup: if (bRemoveFile) { LwRemoveFile(pszTmpPath); } if (fp) { fclose(fp); } LW_SAFE_FREE_STRING(pszTmpPath); return dwError; error: goto cleanup; }
DWORD LwKrb5InitializeCredentials( IN PCSTR pszUserPrincipalName, IN PCSTR pszPassword, IN PCSTR pszCachePath, OUT OPTIONAL PDWORD pdwGoodUntilTime ) { DWORD dwError = LW_ERROR_SUCCESS; DWORD dwGoodUntilTime = 0; PSTR pszTempCachePath = NULL; if (!pszCachePath) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_LW_ERROR(dwError); } if (!strncmp(pszCachePath, "FILE:", sizeof("FILE:") - 1)) { dwError = LwAllocateStringPrintf(&pszTempCachePath, "%s.new", pszCachePath); BAIL_ON_LW_ERROR(dwError); } dwError = LwKrb5GetTgt( pszUserPrincipalName, pszPassword, pszTempCachePath ? pszTempCachePath : pszCachePath, &dwGoodUntilTime); BAIL_ON_LW_ERROR(dwError); if (pszTempCachePath) { dwError = LwMoveFile(pszTempCachePath + sizeof("FILE:") - 1, pszCachePath + sizeof("FILE:") - 1); BAIL_ON_LW_ERROR(dwError); } error: if (dwError) { dwGoodUntilTime = 0; } LW_SAFE_FREE_STRING(pszTempCachePath); if (pdwGoodUntilTime) { *pdwGoodUntilTime = dwGoodUntilTime; } return dwError; }
DWORD LwKrb5MoveCCacheToUserPath( krb5_context ctx, PCSTR pszNewCacheName, uid_t uid, gid_t gid ) { DWORD dwError = LW_ERROR_SUCCESS; PSTR pszCachePath = NULL; PCSTR pszCachePathReal = NULL; dwError = LwKrb5GetUserCachePath( uid, KRB5_File_Cache, &pszCachePath); BAIL_ON_LW_ERROR(dwError); if (strncasecmp(pszCachePath, "FILE:", sizeof("FILE:")-1)) { dwError = LW_ERROR_INTERNAL; BAIL_ON_LW_ERROR(dwError); } else { pszCachePathReal = pszCachePath + sizeof("FILE:") - 1; } dwError = LwMoveFile(pszNewCacheName, pszCachePathReal); BAIL_ON_LW_ERROR(dwError); /* Let the user read and write to their cache file (before this, only * root was allowed to read and write the file). */ dwError = LwChangeOwner(pszCachePathReal, uid, gid); BAIL_ON_LW_ERROR(dwError); cleanup: LW_SAFE_FREE_STRING(pszCachePath); return dwError; error: goto cleanup; }