Beispiel #1
0
/*
 * Read schema definition from file
 * We only care for
 *  attributetypes
 *  objectclasses
 *  ditcontentrules
 *  attributeindices
 */
DWORD
VmDirReadSchemaFile(
    PCSTR               pszSchemaFilePath,
    PVMDIR_STRING_LIST* ppAtStrList,
    PVMDIR_STRING_LIST* ppOcStrList,
    PVMDIR_STRING_LIST* ppCrStrList,
    PVMDIR_STRING_LIST* ppIdxStrList
    )
{
    DWORD dwError = 0;
    CHAR  pbuf[1024] = {0};
    FILE* fp = NULL;

    PVMDIR_STRING_LIST  pAtStrList = NULL;
    PVMDIR_STRING_LIST  pOcStrList = NULL;
    PVMDIR_STRING_LIST  pCrStrList = NULL;
    PVMDIR_STRING_LIST  pIdxStrList = NULL;

    if (!pszSchemaFilePath || !ppAtStrList || !ppOcStrList || !ppCrStrList || !ppIdxStrList)
    {
        BAIL_WITH_VMDIR_ERROR(dwError, VMDIR_ERROR_INVALID_PARAMETER);
    }

    dwError = VmDirStringListInitialize(&pAtStrList, 2048);
    BAIL_ON_VMDIR_ERROR(dwError);

    dwError = VmDirStringListInitialize(&pOcStrList, 512);
    BAIL_ON_VMDIR_ERROR(dwError);

    dwError = VmDirStringListInitialize(&pCrStrList, 512);
    BAIL_ON_VMDIR_ERROR(dwError);

    dwError = VmDirStringListInitialize(&pIdxStrList, 16);
    BAIL_ON_VMDIR_ERROR(dwError);

#ifndef _WIN32
    fp = fopen(pszSchemaFilePath, "r");
#else
    if (fopen_s(&fp, pszSchemaFilePath, "r") != 0)
    {
        fp = NULL;
    }
#endif
    if (NULL == fp)
    {
        dwError = errno;
        VMDIR_LOG_ERROR(VMDIR_LOG_MASK_ALL,
                "Open schema file (%s) failed. Error (%d)",
                pszSchemaFilePath, dwError);
        BAIL_ON_VMDIR_ERROR(dwError);
    }

    while (fgets(pbuf, sizeof(pbuf), fp) != NULL)
    {
        PSTR pszTag = NULL;

        if ((pbuf[0] == '\n')    ||
            (pbuf[0] == '#')     ||
            (pbuf[0] != ' ' && (pszTag = VmDirStringChrA(pbuf, ':')) == NULL))
        {
            continue;
        }

        if (IS_ATTRIBUTETYPES_TAG(pbuf))
        {
            dwError = _VmDirReadOneDefFromFile(fp, pAtStrList);
            BAIL_ON_VMDIR_ERROR(dwError);
        }
        else if (IS_OBJECTCLASSES_TAG(pbuf))
        {
            dwError = _VmDirReadOneDefFromFile(fp, pOcStrList);
            BAIL_ON_VMDIR_ERROR(dwError);
        }
        else if (IS_CONTENTRULES_TAG(pbuf))
        {
            dwError = _VmDirReadOneDefFromFile(fp, pCrStrList);
            BAIL_ON_VMDIR_ERROR(dwError);
        }
        else if (IS_ATTRIBUTEINDICES_TAG(pbuf))
        {
            dwError = _VmDirReadOneDefFromFile(fp, pIdxStrList);
            BAIL_ON_VMDIR_ERROR(dwError);
        }
        else
        {
            continue;
        }
    }

    *ppAtStrList = pAtStrList;
    *ppOcStrList = pOcStrList;
    *ppCrStrList = pCrStrList;
    *ppIdxStrList = pIdxStrList;

cleanup:
    if (fp)
    {
        fclose(fp);
    }
    return dwError;

error:
    VmDirStringListFree(pAtStrList);
    VmDirStringListFree(pOcStrList);
    VmDirStringListFree(pCrStrList);
    VmDirStringListFree(pIdxStrList);
    goto cleanup;
}
Beispiel #2
0
/*
 * This function is only for testing purpose.
 * It call load and verify to validate schema definition integrity.
 */
DWORD
UnitTestSchemaInstanceInit(
    PSTR*    ppszDescs,
    DWORD    dwDescsSize,
    PVDIR_SCHEMA_INSTANCE*    ppSchema
    )
{
    DWORD    dwError = 0;
    DWORD    dwCnt = 0;
    DWORD    dwIdx = 0;

    USHORT   dwATSize = 0;
    USHORT   dwOCSize = 0;
    USHORT   dwCRSize = 0;
    USHORT   dwSRSize = 0;
    USHORT   dwNFSize = 0;

    PVDIR_SCHEMA_INSTANCE pSchema = NULL;
    PSTR    pszTmp = NULL;

    qsort(ppszDescs, dwDescsSize, sizeof(*ppszDescs), schemaInitPPSTRCmp);

    for (dwCnt=0; dwCnt < dwDescsSize; dwCnt++)
    {
        if (IS_ATTRIBUTETYPES_TAG(ppszDescs[dwCnt]))
        {
            dwATSize++;
        }
        else if (IS_OBJECTCLASSES_TAG(ppszDescs[dwCnt]))
        {
            dwOCSize++;
        }
        else if (IS_CONTENTRULES_TAG(ppszDescs[dwCnt]))
        {
            dwCRSize++;
        }
        else if (IS_STRUCTURERULES_TAG(ppszDescs[dwCnt]))
        {
            dwSRSize++;
        }
        else if (IS_NAMEFORM_TAG(ppszDescs[dwCnt]))
        {
            dwNFSize++;
        }
    }

    dwError = VdirSchemaInstanceAllocate(&pSchema, dwATSize, dwOCSize, dwCRSize, dwSRSize, dwNFSize);
    BAIL_ON_VMDIR_ERROR(dwError);

    for (dwCnt=0, dwIdx = 0; dwCnt < dwDescsSize; dwCnt++)
    {
        if (IS_ATTRIBUTETYPES_TAG(ppszDescs[dwCnt]))
        {
            dwError = VmDirSchemaParseStrToATDesc(
                    ppszDescs[dwCnt],
                    pSchema->ats.pATSortName+dwIdx);
            BAIL_ON_VMDIR_ERROR(dwError);
            dwIdx++;
        }
    }

    for (dwCnt=0, dwIdx = 0; dwCnt < dwDescsSize ; dwCnt++)
    {
        if (IS_OBJECTCLASSES_TAG(ppszDescs[dwCnt]))
        {
            dwError = VmDirSchemaParseStrToOCDesc(
                    ppszDescs[dwCnt],
                    pSchema->ocs.pOCSortName+dwIdx);
            BAIL_ON_VMDIR_ERROR(dwError);
            dwIdx++;
        }
    }

    for (dwCnt=0, dwIdx = 0; dwCnt < dwDescsSize ; dwCnt++)
    {
        if (IS_CONTENTRULES_TAG(ppszDescs[dwCnt]))
        {
            dwError = VmDirSchemaParseStrToContentDesc(
                    ppszDescs[dwCnt],
                    pSchema->contentRules.pContentSortName+dwIdx);
            BAIL_ON_VMDIR_ERROR(dwError);
            dwIdx++;
        }
    }

    for (dwCnt=0, dwIdx = 0; dwCnt < dwDescsSize ; dwCnt++)
    {
        if (IS_STRUCTURERULES_TAG(ppszDescs[dwCnt]))
        {
            dwError = VmDirSchemaParseStrToStructureDesc(
                    ppszDescs[dwCnt],
                    pSchema->structureRules.pStructureSortRuleID+dwIdx);
            BAIL_ON_VMDIR_ERROR(dwError);
            dwIdx++;
        }
    }

    for (dwCnt=0, dwIdx = 0; dwCnt < dwDescsSize ; dwCnt++)
    {
        if (IS_NAMEFORM_TAG(ppszDescs[dwCnt]))
        {
            dwError = VmDirSchemaParseStrToNameformDesc(    ppszDescs[dwCnt],
                                                            pSchema->nameForms.pNameFormSortName + dwIdx);
            BAIL_ON_VMDIR_ERROR(dwError);
            dwIdx++;
        }
    }

#ifdef LDAP_DEBUG
    for (dwCnt = 0; dwCnt < dwOCSize; dwCnt ++)
    {
        VMDIR_SAFE_FREE_MEMORY(pszTmp);
        VdirSchemaVerifyOCDescPrint(
                pSchema->ocs.pOCSortName+dwCnt,
                &pszTmp);
        printf("%s\n", VDIR_SAFE_STRING(pszTmp));
    }
    for (dwCnt = 0; dwCnt < dwATSize; dwCnt ++)
    {
        VMDIR_SAFE_FREE_MEMORY(pszTmp);
        VdirSchemaVerifyATDescPrint(
                pSchema->ats.pATSortName+dwCnt,
                &pszTmp);
        printf("%s\n", VDIR_SAFE_STRING(pszTmp));
    }
#endif

    dwError = VmDirSchemaLoadInstance(pSchema);
    BAIL_ON_VMDIR_ERROR(dwError);

    if (! VmDirSchemaVerifyIntegrity(pSchema))
    {
        dwError = ERROR_INVALID_SCHEMA;
        BAIL_ON_VMDIR_ERROR(dwError);
    }

    *ppSchema = pSchema;

cleanup:

    VMDIR_SAFE_FREE_MEMORY(pszTmp);

    return dwError;

error:

    if (pSchema)
    {
        VdirSchemaInstanceFree(pSchema);
    }

    *ppSchema = NULL;

    goto cleanup;
}