Пример #1
0
static
DWORD
VmDnsCliListRecord(
    PVM_DNS_CLI_CONTEXT pContext
    )
{
    DWORD dwError = 0;
    PVMDNS_RECORD_ARRAY pRecordArray = NULL;

    dwError = VmDnsListRecordsA(pContext->pServerContext,
                                pContext->pszZone,
                                &pRecordArray);
    BAIL_ON_VMDNS_ERROR(dwError);

    VmDnsCliPrintRecordArray(pRecordArray);

cleanup:
    VmDnsFreeRecordArray(pRecordArray);
    return dwError;

error:
    goto cleanup;
}
Пример #2
0
static
DWORD
VmDnsCliQueryRecord(
    PVM_DNS_CLI_CONTEXT pContext
    )
{
    DWORD dwError = 0;
    PVMDNS_RECORD_ARRAY pRecordArray = NULL;

    if (IsNullOrEmptyString(pContext->pszZone) ||
        IsNullOrEmptyString(pContext->record.pszName) ||
        pContext->record.dwType == VMDNS_RR_TYPE_NONE)
    {
        fprintf(
            stderr,
            "Zone, record name and type are required for querying record.\n");
        dwError = ERROR_INVALID_PARAMETER;
        BAIL_ON_VMDNS_ERROR(dwError);
    }

    dwError = VmDnsQueryRecordsA(pContext->pServerContext,
                                pContext->pszZone,
                                pContext->record.pszName,
                                pContext->record.dwType,
                                0, // Options - Reserved
                                &pRecordArray);
    BAIL_ON_VMDNS_ERROR(dwError);

    VmDnsCliPrintRecordArray(pRecordArray);

cleanup:
    VmDnsFreeRecordArray(pRecordArray);
    return dwError;

error:
    goto cleanup;
}
Пример #3
0
static
DWORD
VmDnsCliDelRecord(
    PVM_DNS_CLI_CONTEXT pContext
    )
{
    DWORD dwError = 0;
    DWORD idx = 0;
    PVMDNS_RECORD_ARRAY pRecordArray = NULL;
    BOOL bFound = FALSE;
    PSTR pszTargetFQDN = NULL;

    if (pContext->record.dwType == VMDNS_RR_TYPE_SOA)
    {
        fprintf(stdout, "SOA record cannot be deleted.\n");
        dwError = ERROR_INVALID_PARAMETER;
        BAIL_ON_VMDNS_ERROR(dwError);
    }

    dwError = VmDnsCliValidateAndCompleteRecord(pContext);
    BAIL_ON_VMDNS_ERROR(dwError);

    if (pContext->record.dwType == VMDNS_RR_TYPE_SRV)
    {
        dwError = VmDnsMakeFQDN(pContext->record.Data.SRV.pNameTarget,
                        pContext->pszZone,
                        &pszTargetFQDN);
        BAIL_ON_VMDNS_ERROR(dwError);

        if (pszTargetFQDN)
        {
            VMDNS_SAFE_FREE_STRINGA(pContext->record.Data.SRV.pNameTarget);
            pContext->record.Data.SRV.pNameTarget = pszTargetFQDN;
            pszTargetFQDN = NULL;
        }
    }
    if (pContext->record.dwType == VMDNS_RR_TYPE_NS)
    {
        dwError = VmDnsMakeFQDN(pContext->record.Data.NS.pNameHost,
                                pContext->pszZone,
                                &pszTargetFQDN);
        BAIL_ON_VMDNS_ERROR(dwError);
        if (pszTargetFQDN)
        {
            VMDNS_SAFE_FREE_STRINGA(pContext->record.Data.NS.pNameHost);
            pContext->record.Data.NS.pNameHost = pszTargetFQDN;
            pszTargetFQDN = NULL;
        }
        DWORD dwNameLen = strlen(pContext->record.pszName);
        if (pContext->record.pszName[dwNameLen -1] != '.')
        {
            VmDnsAllocateStringPrintfA(&pszTargetFQDN,
                                       "%s.",
                                       pContext->record.pszName);
            VMDNS_SAFE_FREE_STRINGA(pContext->record.pszName);
            pContext->record.pszName = pszTargetFQDN;
            pszTargetFQDN = NULL;
        }
    }
    if (pContext->record.dwType == VMDNS_RR_TYPE_PTR)
    {
        dwError = VmDnsMakeFQDN(
                pContext->record.pszName,
                pContext->pszZone,
                &pszTargetFQDN);
        BAIL_ON_VMDNS_ERROR(dwError);

        if (pszTargetFQDN)
        {
            VMDNS_SAFE_FREE_STRINGA(pContext->record.pszName);
            pContext->record.pszName = pszTargetFQDN;
            pszTargetFQDN = NULL;
        }
    }
    else
    {
        VmDnsTrimDomainNameSuffix(pContext->record.pszName, pContext->pszZone);

        dwError = VmDnsMakeFQDN(
                    pContext->record.pszName,
                    pContext->pszZone,
                    &pszTargetFQDN);
        BAIL_ON_VMDNS_ERROR(dwError);

        if (pszTargetFQDN)
        {
            VMDNS_SAFE_FREE_STRINGA(pContext->record.pszName);
            pContext->record.pszName = pszTargetFQDN;
            pszTargetFQDN = NULL;
        }
    }
    dwError = VmDnsQueryRecordsA(
                    pContext->pServerContext,
                    pContext->pszZone,
                    pContext->record.pszName,
                    pContext->record.dwType,
                    0,
                    &pRecordArray);
    BAIL_ON_VMDNS_ERROR(dwError);
    for (; idx < pRecordArray->dwCount; ++idx)
    {

        if (VmDnsMatchRecord(&pRecordArray->Records[idx],
                             &pContext->record))
        {
            dwError = VmDnsDeleteRecordA(
                            pContext->pServerContext,
                            pContext->pszZone,
                            &pRecordArray->Records[idx]
                            );
            BAIL_ON_VMDNS_ERROR(dwError);
            bFound = TRUE;
        }
    }

error:
    if (!bFound)
    {
        fprintf(stderr, "Error: no matching record found.\n");
    }
    VMDNS_SAFE_FREE_STRINGA(pszTargetFQDN);
    VmDnsFreeRecordArray(pRecordArray);
    return dwError;
}
Пример #4
0
static
DWORD
CdcGetDomainControllers(
      PWSTR** ppszDomainControllers,
      PDWORD pdwCount
      )
{
      DWORD dwError       = 0;
      DWORD dwIndex       = 0;
      PWSTR pwszDomain    = NULL;
      PSTR  pszDomain     = NULL;
      PSTR  pszDCName     = NULL;

      PWSTR pwszAccount   = NULL;
      PSTR  pszAccount    = NULL;
      PWSTR pwszPassword  = NULL;
      PSTR  pszPassword   = NULL;
      PWSTR pwszAccountDN = NULL;
      PSTR  pszAccountDN  = NULL;
      PVMDNS_SERVER_CONTEXT pConnection  = NULL;
      PVMDNS_RECORD_ARRAY   pRecordArray = NULL;
      PWSTR* pszDomainControllers        = NULL;
      PCDC_DC_INFO_W pAffinitizedDC      = NULL;

      if (!ppszDomainControllers || !pdwCount)
      {
          dwError = ERROR_INVALID_PARAMETER;
          BAIL_ON_VMAFD_ERROR(dwError);
      }

      dwError = VmAfSrvGetMachineAccountInfo(
                            &pwszAccount,
                            &pwszPassword,
                            &pwszAccountDN,
                            NULL
                            );
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmAfdAllocateStringAFromW(
                                   pwszAccount,
                                   &pszAccount
                                   );
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmAfdAllocateStringAFromW(
                                  pwszPassword,
                                  &pszPassword
                                  );
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmAfSrvGetDomainName(&pwszDomain);
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmAfdAllocateStringAFromW(
                                pwszDomain,
                                &pszDomain
                                );
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = CdcSrvGetDCName(pwszDomain,&pAffinitizedDC);
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmAfdAllocateStringAFromW(
                                pAffinitizedDC->pszDCName,
                                &pszDCName
                                );
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmDnsOpenServerA(
                          pszDCName,
                          pszAccount,
                          pszDomain,
                          pszPassword,
                          0,
                          NULL,
                          &pConnection);
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmDnsQueryRecordsA(
                          pConnection,
                          pszDomain,
                          "_ldap._tcp",
                          VMDNS_RR_TYPE_SRV,
                          0,
                          &pRecordArray);
      BAIL_ON_VMAFD_ERROR(dwError);

      if (pRecordArray->dwCount)
      {
          dwError = VmAfdAllocateMemory(
                            sizeof(PWSTR)*pRecordArray->dwCount,
                            (PVOID *)&pszDomainControllers
                            );
          BAIL_ON_VMAFD_ERROR(dwError);
      }

      for (; dwIndex < pRecordArray->dwCount; dwIndex++)
      {
          dwError = VmAfdAllocateStringWFromA(
                                  pRecordArray->Records[dwIndex].Data.SRV.pNameTarget,
                                  &pszDomainControllers[dwIndex]
                                  );
          BAIL_ON_VMAFD_ERROR(dwError);

          dwError = VmAfdTrimFQDNTrailingDot(pszDomainControllers[dwIndex]);
          BAIL_ON_VMAFD_ERROR(dwError);
      }

      dwIndex = 0;

      *ppszDomainControllers = pszDomainControllers;
      *pdwCount = pRecordArray->dwCount;

cleanup:
      VMAFD_SAFE_FREE_MEMORY(pwszDomain);
      VMAFD_SAFE_FREE_MEMORY(pszDomain);
      VMAFD_SAFE_FREE_MEMORY(pszDCName);
      VMAFD_SAFE_FREE_MEMORY(pwszAccount);
      VMAFD_SAFE_FREE_MEMORY(pszAccount);
      VMAFD_SAFE_FREE_MEMORY(pwszPassword);
      VMAFD_SAFE_FREE_MEMORY(pszPassword);
      VMAFD_SAFE_FREE_MEMORY(pwszAccountDN);
      VMAFD_SAFE_FREE_MEMORY(pszAccountDN);

      if (pAffinitizedDC)
      {
          VmAfdFreeDomainControllerInfoW(pAffinitizedDC);
      }
      if (pRecordArray)
      {
          VmDnsFreeRecordArray(pRecordArray);
      }
      if (pConnection)
      {
          VmDnsCloseServer(pConnection);
      }

      return dwError;

error:

      if (ppszDomainControllers)
      {
          *ppszDomainControllers = NULL;
      }
      if (pszDomainControllers)
      {
          VmAfdFreeStringArrayW(pszDomainControllers,pRecordArray->dwCount);
      }

      goto cleanup;
}