예제 #1
0
DWORD
VmAfdCheckAclContext(
    PVM_AFD_CONNECTION_CONTEXT pConnectionContext,
    PSTR pszSddlAcl,
    BOOL *pbIsAllowed
    )
{
    DWORD dwError = 0;
    BOOL bIsAllowed = FALSE;

    BAIL_ON_VMAFD_INVALID_POINTER(pConnectionContext, dwError);

    dwError = gIPCVtable.pfnCheckAclContext(
                  pConnectionContext,
                  pszSddlAcl,
                  &bIsAllowed
              );
    BAIL_ON_VMAFD_ERROR(dwError);

    *pbIsAllowed = bIsAllowed;

cleanup:
    return dwError;

error:
    goto cleanup;
}
예제 #2
0
static
DWORD
VmAfdBuildTokenGroups(
    gid_t *pGidList,
    DWORD dwGidListLen,
    PTOKEN_GROUPS *ppTokenGroups)
{
    DWORD dwError = 0;
    PTOKEN_GROUPS pTokenGroups = NULL;
    unsigned int i = 0;

    BAIL_ON_VMAFD_INVALID_POINTER(pGidList, dwError);
    BAIL_ON_VMAFD_INVALID_POINTER(ppTokenGroups, dwError);

    dwError = VmAfdAllocateMemory(
                  sizeof(TOKEN_GROUPS) + (sizeof(SID_AND_ATTRIBUTES) * dwGidListLen),
                  (PVOID*)&pTokenGroups);
    BAIL_ON_VMAFD_ERROR(dwError);

    for (i = 0; i < dwGidListLen; i++)
    {
        dwError = VmAfdAllocateSidFromGid(
                      pGidList[i],
                      &pTokenGroups->Groups[i].Sid);
        BAIL_ON_VMAFD_ERROR(dwError);

        pTokenGroups->Groups[i].Attributes = SE_GROUP_ENABLED;
    }
    pTokenGroups->GroupCount = dwGidListLen;

    *ppTokenGroups = pTokenGroups;

cleanup:
    return dwError;

error:
    VmAfdFreeTokenGroups(pTokenGroups);
    goto cleanup;
}
예제 #3
0
DWORD
VmAfdGeneratePtrNameFromIp(
        PCSTR pszIPAddress,
        PSTR* ppszPtrName
    )
{
    DWORD dwError = 0;
    DWORD dwAddr = 0;
    PSTR pszPtrName = NULL;
    BYTE* pByte = NULL;
    DWORD ret = 0;
    int af = AF_INET;
    unsigned char buf[sizeof(struct in6_addr)];

    BAIL_ON_VMAFD_EMPTY_STRING(pszIPAddress, dwError);
    BAIL_ON_VMAFD_INVALID_POINTER(ppszPtrName, dwError);

    if (VmAfdStringChrA(pszIPAddress, ':'))
    {
        af = AF_INET6;
    }

    ret = inet_pton(af, pszIPAddress, buf);
    if (ret <= 0)
    {
        dwError = ERROR_INVALID_PARAMETER;
        BAIL_ON_VMAFD_ERROR(dwError);
    }

    if (af == AF_INET)
    {
        dwAddr = ((struct in_addr*)buf)->s_addr;

        // See RFC 1035 for name format
        // In short, record name is octets in reverse order appened with "in-addr.arpa".
        // Example: 11.1.193.128.in-addr.arpa
        dwError = VmAfdAllocateStringPrintf(
                    &pszPtrName,
                    "%d.%d.%d.%d%s.",
                    (dwAddr & 0xFF000000) >> 24,
                    (dwAddr & 0xFF0000) >> 16,
                    (dwAddr & 0xFF00) >> 8,
                    (dwAddr & 0xFF),
                    PTR_NAME_SUFFIX_IP4
                    );
        BAIL_ON_VMAFD_ERROR(dwError);
    }
예제 #4
0
static
DWORD
VmAfdConfigGetString(
    PCSTR    pszSubKey,      /* IN     */
    PCSTR    pszValueName,   /* IN     */
    PSTR*    ppszValue      /*    OUT */
)
{
    DWORD dwError = 0;
    PVMAF_CFG_CONNECTION pConnection = NULL;
    PVMAF_CFG_KEY pRootKey = NULL;
    PVMAF_CFG_KEY pParamsKey = NULL;
    PSTR  pszValue = NULL;

    BAIL_ON_VMAFD_INVALID_POINTER(ppszValue, dwError);

    dwError = VmAfConfigOpenConnection(&pConnection);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = VmAfConfigOpenRootKey(
                  pConnection,
                  "HKEY_LOCAL_MACHINE",
                  0,
                  KEY_READ,
                  &pRootKey);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = VmAfConfigOpenKey(
                  pConnection,
                  pRootKey,
                  pszSubKey,
                  0,
                  KEY_READ,
                  &pParamsKey);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = VmAfConfigReadStringValue(
                  pParamsKey,
                  NULL,
                  pszValueName,
                  &pszValue);
    BAIL_ON_VMAFD_ERROR(dwError);

    *ppszValue = pszValue;

cleanup:

    if (pParamsKey)
    {
        VmAfConfigCloseKey(pParamsKey);
    }
    if (pRootKey)
    {
        VmAfConfigCloseKey(pRootKey);
    }
    if (pConnection)
    {
        VmAfConfigCloseConnection(pConnection);
    }

    return dwError;

error:

    if (ppszValue)
    {
        *ppszValue = NULL;
    }

    goto cleanup;
}
예제 #5
0
static
DWORD
VmAfdGetGroupList(
    uid_t userId,
    gid_t *pPrimaryGid,
    gid_t **ppGidList,
    DWORD *pdwGidListLen)
{
    DWORD dwError = 0;
    int iStatus = 0;
    gid_t *pGidList = NULL;
    int iGidListLen = 0;
    struct passwd pwd = { 0 };
    struct passwd *pResult = NULL;
    size_t bufsize = 0;
    char* pBuffer = NULL;

    BAIL_ON_VMAFD_INVALID_POINTER(ppGidList, dwError);

    bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
    if (bufsize == -1)
    {
        bufsize = MAX_GWTPWR_BUF_LENGTH;
    }

    dwError = VmAfdAllocateMemory(
                    bufsize,
                    (PVOID*)&pBuffer);
    BAIL_ON_VMAFD_ERROR(dwError);

    iStatus = getpwuid_r(userId, &pwd, pBuffer, bufsize, &pResult);
    if (!pResult)
    {
        dwError = LwErrnoToWin32Error(iStatus);
        BAIL_ON_VMAFD_ERROR(dwError);
    }

    iGidListLen = 0;
    iStatus = getgrouplist(
                  pwd.pw_name,
                  pwd.pw_gid,
                  NULL,
                  &iGidListLen);
    if (iStatus == -1 && iGidListLen > 0)
    {
        dwError = VmAfdAllocateMemory(
                      iGidListLen * sizeof(gid_t),
                      (PVOID *)&pGidList);
        BAIL_ON_VMAFD_ERROR(dwError);

        iStatus = getgrouplist(
                      pwd.pw_name,
                      pwd.pw_gid,
                      pGidList,
                      &iGidListLen);
        if (iStatus == -1)
        {
            dwError = LwErrnoToWin32Error(iStatus);
            BAIL_ON_VMAFD_ERROR(dwError);
        }
    }

    *pPrimaryGid = pwd.pw_gid;
    *ppGidList = pGidList;
    *pdwGidListLen = iGidListLen;

cleanup:
    VMAFD_SAFE_FREE_MEMORY(pBuffer);
    return dwError;

error:
    VMAFD_SAFE_FREE_MEMORY(pGidList);
    goto cleanup;
}
예제 #6
0
DWORD
VmAfdRegGetInteger(
    PCSTR    pszValueName,   /* IN     */
    PDWORD   pdwValue        /*    OUT */
    )
{
    DWORD dwError = 0;
    PVMAF_CFG_CONNECTION pConnection = NULL;
    PVMAF_CFG_KEY pRootKey = NULL;
    PVMAF_CFG_KEY pParamsKey = NULL;
    PCSTR pszSubKey = VMAFD_CONFIG_PARAMETER_KEY_PATH;
    DWORD dwValue = 0;

    BAIL_ON_VMAFD_INVALID_POINTER(pdwValue, dwError);

    dwError = VmAfConfigOpenConnection(&pConnection);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = VmAfConfigOpenRootKey(
                    pConnection,
                    "HKEY_LOCAL_MACHINE",
                    0,
                    KEY_READ,
                    &pRootKey);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = VmAfConfigOpenKey(
                    pConnection,
                    pRootKey,
                    pszSubKey,
                    0,
                    KEY_READ,
                    &pParamsKey);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = VmAfConfigReadDWORDValue(
                    pParamsKey,
                    NULL,
                    pszValueName,
                    &dwValue);
    BAIL_ON_VMAFD_ERROR(dwError);

    *pdwValue = dwValue;

cleanup:

    if (pParamsKey)
    {
        VmAfConfigCloseKey(pParamsKey);
    }
    if (pRootKey)
    {
        VmAfConfigCloseKey(pRootKey);
    }
    if (pConnection)
    {
        VmAfConfigCloseConnection(pConnection);
    }

    return dwError;

error:

    goto cleanup;
}