DWORD ADUParseAndGetGPTVersion( PSTR pszFilePath, PDWORD pdwGPTVersion ) { DWORD dwError = MAC_AD_ERROR_SUCCESS; PSTR pszValue = NULL; PCFGSECTION pSectionList = NULL; dwError = LWParseConfigFile(pszFilePath, &pSectionList, FALSE); BAIL_ON_MAC_ERROR(dwError); dwError = LWGetConfigValueBySectionName(pSectionList, "General", "Version", &pszValue); if (dwError == MAC_AD_ERROR_SUCCESS) { if (!pszValue) { dwError = MAC_AD_ERROR_NO_SUCH_ATTRIBUTE; } else { *pdwGPTVersion = atoi(pszValue); } } cleanup: if (pSectionList) { LWFreeConfigSectionList(pSectionList); } LW_SAFE_FREE_STRING(pszValue); return dwError; error: if (pdwGPTVersion) *pdwGPTVersion = 0; goto cleanup; }
DWORD ADUParseAndSetGPTVersion( PSTR pszFilePath, DWORD dwGPTVersion ) { DWORD dwError = MAC_AD_ERROR_SUCCESS; char szValue[256]; PCFGSECTION pSectionList = NULL; memset(szValue, 0, sizeof(szValue)); sprintf(szValue, "%d", dwGPTVersion); dwError = LWParseConfigFile(pszFilePath, &pSectionList, FALSE); BAIL_ON_MAC_ERROR(dwError); dwError = LWSetConfigValueBySectionName(pSectionList, "General", "Version", szValue); BAIL_ON_MAC_ERROR(dwError); dwError = LWSaveConfigSectionList(pszFilePath, pSectionList); BAIL_ON_MAC_ERROR(dwError); cleanup: if (pSectionList) { LWFreeConfigSectionList(pSectionList); } return dwError; error: goto cleanup; }
DWORD LWParseConfigFile( PCSTR pszFilePath, PCFGSECTION* ppCfgSectionList, BOOLEAN bWindowsDoubleByteFormat ) { DWORD dwError = 0; PCFGSECTION pSectionList = NULL; PCFGSECTION pSection = NULL; PNVPAIR pNVPair = NULL; FILE* fp = NULL; CHAR staticBuffer[1024+1]; PSTR szBuf = NULL; DWORD dwLen = 0; PSTR pszTmp = NULL; PSTR pszName = NULL; PSTR pszValue = NULL; DWORD dwSignature = 0; /*DWORD nRead = 0;*/ BOOLEAN bEOF = FALSE; if ((fp = fopen(pszFilePath, "r")) == NULL) { dwError = errno; goto error; } if (fcntl(fileno(fp), F_SETFD, FD_CLOEXEC) < 0) { dwError = errno; BAIL_ON_MAC_ERROR(dwError); } if (bWindowsDoubleByteFormat) { dwError = ParseHeader(fp, &dwSignature); BAIL_ON_MAC_ERROR(dwError); if (dwSignature != 0xFEFF) { dwError = MAC_AD_ERROR_INVALID_TAG; BAIL_ON_MAC_ERROR(dwError); } } while (!bEOF) { LW_SAFE_FREE_STRING(szBuf); if (bWindowsDoubleByteFormat) { staticBuffer[0] = '\0'; dwError = ReadNextDoubleByteLine(fp, staticBuffer, 1024, &bEOF); BAIL_ON_MAC_ERROR(dwError); dwError = LwAllocateString(staticBuffer, &szBuf); BAIL_ON_MAC_ERROR(dwError); } else { dwError = ReadNextLine(fp, &szBuf, &bEOF); BAIL_ON_MAC_ERROR(dwError); } LwStripWhitespace(szBuf, TRUE, TRUE); if (!(dwLen=strlen(szBuf))) continue; /* Skip comments for now */ if (szBuf[0] == '#' || szBuf[0] == ';') continue; if (szBuf[0] == '[' && szBuf[dwLen-1] == ']') { if (pSection) { pSection->pNext = pSectionList; pSectionList = pSection; pSection = NULL; } dwError = LwAllocateMemory(sizeof(CFGSECTION), (PVOID*)&pSection); BAIL_ON_MAC_ERROR(dwError); szBuf[dwLen-1] = '\0'; dwError = LwAllocateString(szBuf+1, &pSection->pszName); BAIL_ON_MAC_ERROR(dwError); LwStripWhitespace(pSection->pszName, TRUE, TRUE); } else { if (!pSection) { dwError = MAC_AD_ERROR_NO_SUCH_ATTRIBUTE; BAIL_ON_MAC_ERROR(dwError); } if ((pszTmp = strchr(szBuf, '=')) == NULL) { continue; } if (pszTmp == szBuf) { dwError = MAC_AD_ERROR_INVALID_TAG; BAIL_ON_MAC_ERROR(dwError); } dwError = LwAllocateMemory(pszTmp-szBuf+1, (PVOID*)&pszName); BAIL_ON_MAC_ERROR(dwError); strncpy(pszName, szBuf, pszTmp-szBuf); pszTmp++; while (*pszTmp != '\0' && isspace((int)*pszTmp)) pszTmp++; if (*pszTmp != '\0') { dwError = LwAllocateString(pszTmp, &pszValue); BAIL_ON_MAC_ERROR(dwError); } dwError = LwAllocateMemory(sizeof(NVPAIR), (PVOID*)&pNVPair); BAIL_ON_MAC_ERROR(dwError); LwStripWhitespace(pszName, TRUE, TRUE); LwStripWhitespace(pszValue, TRUE, TRUE); pNVPair->pszName = pszName; pszName = NULL; pNVPair->pszValue = pszValue; pszValue = NULL; pNVPair->pNext = pSection->pNVPairList; pSection->pNVPairList = pNVPair; pNVPair = NULL; } } if (pSection) { pSection->pNext = pSectionList; pSectionList = pSection; pSection = NULL; } pSectionList = ReverseSectionsAndNVPairs(pSectionList); *ppCfgSectionList = pSectionList; fclose(fp); fp = NULL; cleanup: LW_SAFE_FREE_STRING(szBuf); if (fp) { fclose(fp); } LW_SAFE_FREE_STRING(pszName); LW_SAFE_FREE_STRING(pszValue); return dwError; error: *ppCfgSectionList = NULL; if (pSectionList) { LWFreeConfigSectionList(pSectionList); } if (pSection) { LWFreeSection(pSection); } if (pNVPair) { LWFreeNVPair(pNVPair); } goto cleanup; }
DWORD CacheUserAttributes( uid_t uid, PGPUSER_AD_ATTRS pUserADAttrs ) { DWORD dwError = MAC_AD_ERROR_SUCCESS; PSTR pszFileDir = NULL; PSTR pszFilePath = NULL; PCFGSECTION pUserSettingsList = NULL; PCFGSECTION pADSection_Name = NULL; PCFGSECTION pADSection_EMail = NULL; PCFGSECTION pADSection_Phone = NULL; PCFGSECTION pADSection_Address = NULL; PCFGSECTION pADSection_Work = NULL; PCFGSECTION pADSection_Network = NULL; BOOLEAN bDirExists = FALSE; LOG("Saving user attributes to user logon cache [uid: %ld, display name: %s]", (long)uid, pUserADAttrs->pszDisplayName ? pUserADAttrs->pszDisplayName : "<null>"); dwError = LwAllocateStringPrintf(&pszFileDir, "/var/lib/pbis/lwedsplugin/user-cache/%ld", (long) uid); BAIL_ON_MAC_ERROR(dwError); dwError = LwAllocateStringPrintf(&pszFilePath, "/var/lib/pbis/lwedsplugin/user-cache/%ld/ad-user-attrs", (long) uid); BAIL_ON_MAC_ERROR(dwError); dwError = LwCheckFileTypeExists(pszFileDir, LWFILE_DIRECTORY, &bDirExists); BAIL_ON_MAC_ERROR(dwError); if (bDirExists == FALSE) { dwError = LwCreateDirectory(pszFileDir, S_IRUSR|S_IRGRP|S_IROTH); BAIL_ON_MAC_ERROR(dwError); } dwError = LWCreateConfigSection(&pUserSettingsList, &pADSection_Name, "User AD Name Attributes"); BAIL_ON_MAC_ERROR(dwError); dwError = LWCreateConfigSection(&pADSection_EMail, &pADSection_EMail, "User AD EMail Attributes"); BAIL_ON_MAC_ERROR(dwError); dwError = LWCreateConfigSection(&pADSection_Phone, &pADSection_Phone, "User AD Phone Attributes"); BAIL_ON_MAC_ERROR(dwError); dwError = LWCreateConfigSection(&pADSection_Address, &pADSection_Address, "User AD Address Attributes"); BAIL_ON_MAC_ERROR(dwError); dwError = LWCreateConfigSection(&pADSection_Work, &pADSection_Work, "User AD Work Attributes"); BAIL_ON_MAC_ERROR(dwError); dwError = LWCreateConfigSection(&pADSection_Network, &pADSection_Network, "User AD Network Settings Attributes"); BAIL_ON_MAC_ERROR(dwError); pADSection_Name->pNext = pADSection_EMail; pADSection_EMail->pNext = pADSection_Phone; pADSection_Phone->pNext = pADSection_Address; pADSection_Address->pNext = pADSection_Work; pADSection_Work->pNext = pADSection_Network; if (pUserADAttrs->pszDisplayName) { dwError = LWSetConfigValueBySection(pUserSettingsList, "displayName", pUserADAttrs->pszDisplayName); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszFirstName) { dwError = LWSetConfigValueBySection(pADSection_Name, "givenName", pUserADAttrs->pszFirstName); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszLastName) { dwError = LWSetConfigValueBySection(pADSection_Name, "sn", pUserADAttrs->pszLastName); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszADDomain) { dwError = LWSetConfigValueBySection(pADSection_Name, "userDomain", pUserADAttrs->pszADDomain); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszKerberosPrincipal) { dwError = LWSetConfigValueBySection(pADSection_Name, "userPrincipalName", pUserADAttrs->pszKerberosPrincipal); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszEMailAddress) { dwError = LWSetConfigValueBySection(pADSection_EMail, "mail", pUserADAttrs->pszEMailAddress); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszMSExchHomeServerName) { dwError = LWSetConfigValueBySection(pADSection_EMail, "msExchHomeServerName", pUserADAttrs->pszMSExchHomeServerName); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszMSExchHomeMDB) { dwError = LWSetConfigValueBySection(pADSection_EMail, "homeMDB", pUserADAttrs->pszMSExchHomeMDB); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszTelephoneNumber) { dwError = LWSetConfigValueBySection(pADSection_Phone, "telephoneNumber", pUserADAttrs->pszTelephoneNumber); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszFaxTelephoneNumber) { dwError = LWSetConfigValueBySection(pADSection_Phone, "facsimileTelephoneNumber", pUserADAttrs->pszFaxTelephoneNumber); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszMobileTelephoneNumber) { dwError = LWSetConfigValueBySection(pADSection_Phone, "mobile", pUserADAttrs->pszMobileTelephoneNumber); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszStreetAddress) { dwError = LWSetConfigValueBySection(pADSection_Address, "streetAddress", pUserADAttrs->pszStreetAddress); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszPostOfficeBox) { dwError = LWSetConfigValueBySection(pADSection_Address, "postOfficeBox", pUserADAttrs->pszPostOfficeBox); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszCity) { dwError = LWSetConfigValueBySection(pADSection_Address, "l", pUserADAttrs->pszCity); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszState) { dwError = LWSetConfigValueBySection(pADSection_Address, "st", pUserADAttrs->pszState); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszPostalCode) { dwError = LWSetConfigValueBySection(pADSection_Address, "postalCode", pUserADAttrs->pszPostalCode); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszCountry) { dwError = LWSetConfigValueBySection(pADSection_Address, "co", pUserADAttrs->pszCountry); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszTitle) { dwError = LWSetConfigValueBySection(pADSection_Work, "title", pUserADAttrs->pszTitle); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszCompany) { dwError = LWSetConfigValueBySection(pADSection_Work, "company", pUserADAttrs->pszCompany); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszDepartment) { dwError = LWSetConfigValueBySection(pADSection_Work, "department", pUserADAttrs->pszDepartment); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszHomeDirectory) { dwError = LWSetConfigValueBySection(pADSection_Network, "homeDirectory", pUserADAttrs->pszHomeDirectory); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszHomeDrive) { dwError = LWSetConfigValueBySection(pADSection_Network, "homeDrive", pUserADAttrs->pszHomeDrive); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszPasswordLastSet) { dwError = LWSetConfigValueBySection(pADSection_Network, "pwdLastSet", pUserADAttrs->pszPasswordLastSet); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszUserAccountControl) { dwError = LWSetConfigValueBySection(pADSection_Network, "userAccountControl", pUserADAttrs->pszUserAccountControl); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszMaxMinutesUntilChangePassword) { dwError = LWSetConfigValueBySection(pADSection_Network, "maxPwdAge", pUserADAttrs->pszMaxMinutesUntilChangePassword); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszMinMinutesUntilChangePassword) { dwError = LWSetConfigValueBySection(pADSection_Network, "minPwdAge", pUserADAttrs->pszMinMinutesUntilChangePassword); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszMaxFailedLoginAttempts) { dwError = LWSetConfigValueBySection(pADSection_Network, "lockoutThreshhold", pUserADAttrs->pszMaxFailedLoginAttempts); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszAllowedPasswordHistory) { dwError = LWSetConfigValueBySection(pADSection_Network, "pwdHistoryLength", pUserADAttrs->pszAllowedPasswordHistory); BAIL_ON_MAC_ERROR(dwError); } if (pUserADAttrs->pszMinCharsAllowedInPassword) { dwError = LWSetConfigValueBySection(pADSection_Network, "minPwdLength", pUserADAttrs->pszMinCharsAllowedInPassword); BAIL_ON_MAC_ERROR(dwError); } dwError = LWSaveConfigSectionList(pszFilePath, pUserSettingsList); BAIL_ON_MAC_ERROR(dwError); error: LW_SAFE_FREE_STRING(pszFilePath); LW_SAFE_FREE_STRING(pszFileDir); LWFreeConfigSectionList(pUserSettingsList); pUserSettingsList = NULL; return dwError; }