Example #1
0
/*
 * VerifyErrorConditions
 * 
 * Check for proper operation with deliberate errors.
 */
static
DWORD
VerifyErrorConditions(
    HANDLE hLsaConnection
    )
{
    PCSTR pszTestDescription = 
        "LsaEnumUsers returns error given invalid parameters.";
    PCSTR pszTestAPIs = 
        "LsaBeginEnumUsers,"
        "LsaEnumUsers,"
        "LsaFreeUserInfoList,"
        "LsaEndEnumUsers";
    char szTestMsg[128] = { 0 };


    HANDLE hResume = NULL;

    DWORD dwError = LW_ERROR_SUCCESS;
    DWORD dwLocalError = LW_ERROR_SUCCESS;


    /* Case : LsaBeginEnumUsers: Call LsaBeginEnumUsers and then LsaEndEnumUsers. */
    dwLocalError = LsaBeginEnumUsers(
                        hLsaConnection,
                        0,  /* UserInfoLevel. */
                        10, /* Max users to return. */
                        0,  /* Flags. */
                        &hResume);
    BAIL_ON_TEST_BROKE(dwLocalError);
    if ( hResume != (HANDLE)NULL) 
    {
        LsaEndEnumUsers(hLsaConnection, hResume);
        hResume = NULL;
    }

cleanup:
    if ( hResume != (HANDLE)NULL) 
    {
        LsaEndEnumUsers(hLsaConnection, hResume);
        hResume = NULL;
    }
    LWT_LOG_TEST(szTestMsg);
    return dwError;

error:
    goto cleanup;
}
Example #2
0
VOID
LsaNssClearEnumUsersState(
    HANDLE hLsaConnection,
    PLSA_ENUMUSERS_STATE pState
    )
{
    if (pState->ppUserInfoList)
    {
        LsaFreeUserInfoList(
            pState->dwUserInfoLevel,
            pState->ppUserInfoList,
            pState->dwNumUsers
            );
        pState->ppUserInfoList = (HANDLE)NULL;
    }

    if (hLsaConnection && pState->hResume != (HANDLE)NULL)
    {
        LsaEndEnumUsers(hLsaConnection, pState->hResume);
        pState->hResume = (HANDLE)NULL;
    }

    memset(pState, 0, sizeof(LSA_ENUMUSERS_STATE));
}
Example #3
0
/*
* API for checking invalid error
*
*/
static
DWORD
CheckAPIForInvalidData(
    HANDLE hLsaConnection,
    PLWTFAILDATA pLwtFailData
    )
{
    DWORD dwError = LW_ERROR_SUCCESS;
    HANDLE hResume = (HANDLE)NULL;
    DWORD dwBatchLimit = 10;
    char szTestMsg[256] = { 0 };
    
    PCSTR pszTestDescription = 
        "Verify LsaEnumUsers parametre for invalid Level and Max Entries";
    PCSTR pszTestAPIs = 
        "LsaBeginEnumUsers";
    

    if (pLwtFailData->Field == LWTMAXUSER_INVALID)
    {
        dwError = LsaBeginEnumUsers(
            hLsaConnection,
            pLwtFailData->dwLevel,
            pLwtFailData->dwMaxEntries,     
            0,
            &hResume);

        if (dwError != pLwtFailData->dwErrorCode)
        {
            dwError = LW_ERROR_TEST_FAILED;
            snprintf(
                szTestMsg,
                sizeof(szTestMsg),
                "Invalid Error Code %lu returned for invalid  max userentry %lu for user name %s",
                (unsigned long)dwError,
                (unsigned long)pLwtFailData->dwMaxEntries,
                pLwtFailData->pszUserName);

            LWT_LOG_TEST(szTestMsg);

        }
    }
    if (pLwtFailData->Field == LWTUSERINFOLEVEL_INVALID)
    {
        dwError = LsaBeginEnumUsers(
            hLsaConnection,
            pLwtFailData->dwLevel,
            dwBatchLimit,
            0,
            &hResume);

        if (dwError != pLwtFailData->dwErrorCode)
        {
            dwError = LW_ERROR_TEST_FAILED;
            snprintf(
                szTestMsg,
                sizeof(szTestMsg),
                "Invalid Error Code %lu returned for invalid group info level %lu",
                (unsigned long)dwError,
                (unsigned long)pLwtFailData->dwLevel);
            
            LWT_LOG_TEST(szTestMsg);
        }
    }
    if (hResume)
    {
        LsaEndEnumUsers(hLsaConnection, hResume);
    }
    return dwError;
}
Example #4
0
/*
 * CheckLsaEnumUsers
 * 
 * Check LSA_USER_INFO_* list from LsaEnumUsers has expected user.
 * 
 */
DWORD
CheckLsaEnumUsers(
    HANDLE hLsaConnection,
    PCSTR pszUser,
    DWORD dwUserInfoLevel,
    DWORD dwMaxNumUsers
    )
{
    DWORD dwError = LW_ERROR_SUCCESS;
    DWORD dwLocalError = LW_ERROR_SUCCESS;
    DWORD dwNumUsers = 0;
    HANDLE hResume = NULL;
    PVOID  *ppUserInfoList = NULL;
    /* Set to true if we ever return more users than we should.
     * Used to avoid repeating messages uselessly.
     */
    BOOL bViolated_dwMaxNumUsers = 0;

    char szTestMsg[128] = { 0 };
    PCSTR pszTestDescription = 
        "LsaEnumUsers retrieved LSA_USER_INFO_* list containing expected user.";
    PCSTR pszTestAPIs = 
        "LsaBeginEnumUsers,"
        "LsaEnumUsers,"
        "LsaFreeUserInfoList,"
        "LsaEndEnumUsers";

    snprintf(
        szTestMsg,
        sizeof(szTestMsg),
        "Looking for %s, lists of max length %lu, dwUserInfoLevel = %lu.",
        pszUser,
        (unsigned long)dwMaxNumUsers,
        (unsigned long)dwUserInfoLevel);


    /* Only one flag right now: LSA_FIND_FLAGS_NSS */
    dwLocalError = LsaBeginEnumUsers(
                        hLsaConnection,
                        dwUserInfoLevel,
                        dwMaxNumUsers,
                        0, /* Flags */
                        &hResume);
    BAIL_ON_TEST_BROKE(dwLocalError);

    do
    {
        dwNumUsers = 0;
        dwLocalError = LsaEnumUsers(
                        hLsaConnection,
                        hResume,
                        &dwNumUsers,
                        (PVOID**) &ppUserInfoList);
        BAIL_ON_TEST_BROKE(dwLocalError);

        /* Avoid testing/reporting problem more than once. */
        if ( ! bViolated_dwMaxNumUsers )
        {
            if ( dwNumUsers > dwMaxNumUsers )
            {
                char buf[64];

                bViolated_dwMaxNumUsers = 1;

                snprintf(
                    buf,
                    sizeof(buf),
                    "Violation: returned %lu users.",
                    (unsigned long)dwNumUsers);

                Lwt_strcat(
                    szTestMsg,
                    sizeof(szTestMsg),
                    buf);

                dwError = LW_ERROR_TEST_FAILED;
            }
        }

        if (  CheckForUserInUserInfoList(
                    dwUserInfoLevel,
                    ppUserInfoList, 
                    dwNumUsers,
                    pszUser) == LW_ERROR_SUCCESS )
        {
             /* Found user, good, time to leave. */
            goto cleanup;
        }

        LsaFreeUserInfoList(dwUserInfoLevel, ppUserInfoList, dwNumUsers);
        ppUserInfoList = NULL;

    } while ( dwNumUsers > 0 );

    /* If we are here, a user was missing. */
    dwError = LW_ERROR_TEST_FAILED;

cleanup:
    if ( ppUserInfoList )
    { 
        LsaFreeUserInfoList(dwUserInfoLevel, ppUserInfoList, dwNumUsers);
        ppUserInfoList = NULL;
        dwNumUsers = 0;
    }

    if ( hResume != (HANDLE)NULL) 
    {
        LsaEndEnumUsers(hLsaConnection, hResume);
        hResume = NULL;
    }
    LWT_LOG_TEST(szTestMsg);
    return dwError;

error:
    goto cleanup;
}
Example #5
0
int
enum_users_main(
    int argc,
    char* argv[]
    )
{
    DWORD dwError = 0;
    DWORD dwUserInfoLevel = 0;
    DWORD dwBatchSize = 10;
    HANDLE hLsaConnection = (HANDLE)NULL;
    HANDLE hResume = (HANDLE)NULL;
    PVOID* ppUserInfoList = NULL;
    DWORD  dwNumUsersFound = 0;
    DWORD  dwTotalUsersFound = 0;
    size_t dwErrorBufferSize = 0;
    BOOLEAN bPrintOrigError = TRUE;
    BOOLEAN bCheckUserInList = FALSE;

    dwError = ParseArgs(argc, argv, &dwUserInfoLevel, &dwBatchSize, &bCheckUserInList);
    BAIL_ON_LSA_ERROR(dwError);

    dwError = LsaOpenServer(&hLsaConnection);
    BAIL_ON_LSA_ERROR(dwError);

    dwError = LsaBeginEnumUsers(
                    hLsaConnection,
                    dwUserInfoLevel,
                    dwBatchSize,
                    0,
                    &hResume);
    BAIL_ON_LSA_ERROR(dwError);

    do
    {
        DWORD iUser = 0;

        if (ppUserInfoList) {
           LsaFreeUserInfoList(dwUserInfoLevel, ppUserInfoList, dwNumUsersFound);
           ppUserInfoList = NULL;
        }

        dwError = LsaEnumUsers(
                    hLsaConnection,
                    hResume,
                    &dwNumUsersFound,
                    &ppUserInfoList);
        BAIL_ON_LSA_ERROR(dwError);

        if (!dwNumUsersFound) {
            break;
        }

        dwTotalUsersFound+=dwNumUsersFound;

        for (iUser = 0; iUser < dwNumUsersFound; iUser++)
        {
            BOOLEAN bAllowedLogon = TRUE;
            PVOID pUserInfo = *(ppUserInfoList + iUser);

            if (bCheckUserInList)
            {
                dwError = LsaCheckUserInList(
                                          hLsaConnection,
                                          ((PLSA_USER_INFO_0)pUserInfo)->pszName,
                                          NULL);
                if (dwError)
                {
                    bAllowedLogon = FALSE;
                }
            }

            switch(dwUserInfoLevel)
            {
                case 0:
                    PrintUserInfo_0((PLSA_USER_INFO_0)pUserInfo,
                                    bCheckUserInList,
                                    bAllowedLogon);
                    break;
                case 1:
                    PrintUserInfo_1((PLSA_USER_INFO_1)pUserInfo,
                                    bCheckUserInList,
                                    bAllowedLogon);
                    break;
                case 2:
                    PrintUserInfo_2((PLSA_USER_INFO_2)pUserInfo,
                                    bCheckUserInList,
                                    bAllowedLogon);
                    break;
                default:

                    fprintf(stderr,
                            "Error: Invalid user info level %u\n",
                            dwUserInfoLevel);
                    break;
            }
        }
    } while (dwNumUsersFound);

    fprintf(stdout, "TotalNumUsersFound: %u\n", dwTotalUsersFound);

cleanup:

    if (ppUserInfoList) {
       LsaFreeUserInfoList(dwUserInfoLevel, ppUserInfoList, dwNumUsersFound);
    }

    if ((hResume != (HANDLE)NULL) &&
        (hLsaConnection != (HANDLE)NULL)) {
        LsaEndEnumUsers(hLsaConnection, hResume);
    }

    if (hLsaConnection != (HANDLE)NULL) {
        LsaCloseServer(hLsaConnection);
    }

    return (dwError);

error:

    dwError = MapErrorCode(dwError);

    dwErrorBufferSize = LwGetErrorString(dwError, NULL, 0);

    if (dwErrorBufferSize > 0)
    {
        DWORD dwError2 = 0;
        PSTR   pszErrorBuffer = NULL;

        dwError2 = LwAllocateMemory(
                    dwErrorBufferSize,
                    (PVOID*)&pszErrorBuffer);

        if (!dwError2)
        {
            DWORD dwLen = LwGetErrorString(dwError, pszErrorBuffer, dwErrorBufferSize);

            if ((dwLen == dwErrorBufferSize) && !LW_IS_NULL_OR_EMPTY_STR(pszErrorBuffer))
            {
                fprintf(stderr, "Failed to enumerate users.  Error code %u (%s).\n"
                        "%s\n",
                        dwError, LW_PRINTF_STRING(LwWin32ExtErrorToName(dwError)),
                        pszErrorBuffer);
                bPrintOrigError = FALSE;
            }

            if (dwError == ERROR_INVALID_DATA)
            {
                fprintf(stderr, "The users list has changed while enumerating. "
                        "Try again.\n");
            }
        }

        LW_SAFE_FREE_STRING(pszErrorBuffer);
    }

    if (bPrintOrigError)
    {
        fprintf(stderr, "Failed to enumerate users.  Error code %u (%s).\n",
                dwError, LW_PRINTF_STRING(LwWin32ExtErrorToName(dwError)));
    }

    goto cleanup;
}
Example #6
0
static
DWORD
EnumerateUsers(
    HANDLE  hLsaConnection,
    BOOLEAN bPrintKeys,
    BOOLEAN bIndexById
    )
{
    DWORD  dwError = 0;
    DWORD  dwUserInfoLevel = 2;
    DWORD  dwBatchSize = 100;
    DWORD  dwNumUsersFound = 0;
    PVOID* ppUserInfoList = NULL;
    HANDLE hResume = (HANDLE)NULL;

    dwError = LsaBeginEnumUsers(
                    hLsaConnection,
                    dwUserInfoLevel,
                    dwBatchSize,
                    0,
                    &hResume);
    BAIL_ON_LSA_ERROR(dwError);

    do
    {
        DWORD iUser = 0;

        if (ppUserInfoList) {
           LsaFreeUserInfoList(dwUserInfoLevel, ppUserInfoList, dwNumUsersFound);
           ppUserInfoList = NULL;
        }

        dwError = LsaEnumUsers(
                    hLsaConnection,
                    hResume,
                    &dwNumUsersFound,
                    &ppUserInfoList);
        BAIL_ON_LSA_ERROR(dwError);

        if (!dwNumUsersFound) {
            break;
        }

        for (iUser = 0; iUser < dwNumUsersFound; iUser++)
        {
            PLSA_USER_INFO_2 pUserInfo = (PLSA_USER_INFO_2)*(ppUserInfoList + iUser);

            PrintUserInfo_2(pUserInfo, bPrintKeys, bIndexById);
        }

    } while (dwNumUsersFound);

cleanup:

    if (ppUserInfoList) {
       LsaFreeUserInfoList(dwUserInfoLevel, ppUserInfoList, dwNumUsersFound);
    }

    if ((hResume != (HANDLE)NULL) &&
        (hLsaConnection != (HANDLE)NULL)) {
        LsaEndEnumUsers(hLsaConnection, hResume);
    }

    return dwError;

error:

    goto cleanup;
}