예제 #1
0
void VerifyOneUsersPromise (const char *puser, const User *u, PromiseResult *result, enum cfopaction action,
                            EvalContext *ctx, const Attributes *a, const Promise *pp)
{
    assert(u != NULL);
    bool res;

    struct passwd *passwd_info;
    passwd_info = GetPwEntry(puser);
    if (!passwd_info && errno != 0)
    {
        Log(LOG_LEVEL_ERR, "Could not get information from user database.");
        return;
    }

    if (u->policy == USER_STATE_PRESENT || u->policy == USER_STATE_LOCKED)
    {
        if (passwd_info)
        {
            uint32_t cmap = 0;
            if (VerifyIfUserNeedsModifs (puser, u, passwd_info, &cmap))
            {
                res = DoModifyUser (puser, u, passwd_info, cmap, action);
                if (res)
                {
                    *result = PROMISE_RESULT_CHANGE;
                }
                else
                {
                    *result = PROMISE_RESULT_FAIL;
                }
            }
            else
            {
                *result = PROMISE_RESULT_NOOP;
            }
        }
        else
        {
            res = DoCreateUser (puser, u, action, ctx, a, pp);
            if (res)
            {
                *result = PROMISE_RESULT_CHANGE;
            }
            else
            {
                *result = PROMISE_RESULT_FAIL;
            }
        }
    }
    else if (u->policy == USER_STATE_ABSENT)
    {
        if (passwd_info)
        {
            res = DoRemoveUser (puser, action);
            if (res)
            {
                *result = PROMISE_RESULT_CHANGE;
            }
            else
            {
                *result = PROMISE_RESULT_FAIL;
            }
        }
        else
        {
            *result = PROMISE_RESULT_NOOP;
        }
    }
}
예제 #2
0
void VerifyOneUsersPromise (const char *puser, User u, PromiseResult *result, enum cfopaction action,
                            EvalContext *ctx, const Attributes *a, const Promise *pp)
{
    bool res;

    struct passwd *passwd_info;
    errno = 0;
    passwd_info = getpwnam(puser);
    // Apparently POSIX is ambiguous here. All the values below mean "not found".
    if (!passwd_info && errno != 0 && errno != ENOENT && errno != EBADF && errno != ESRCH
        && errno != EWOULDBLOCK && errno != EPERM)
    {
        Log(LOG_LEVEL_ERR, "Could not get information from user database. (getpwnam: '%s')", GetErrorStr());
        return;
    }

    if (u.policy == USER_STATE_PRESENT || u.policy == USER_STATE_LOCKED)
    {
        if (passwd_info)
        {
            uint32_t cmap = 0;
            if (VerifyIfUserNeedsModifs (puser, u, passwd_info, &cmap))
            {
                res = DoModifyUser (puser, u, passwd_info, cmap, action);
                if (res)
                {
                    *result = PROMISE_RESULT_CHANGE;
                }
                else
                {
                    *result = PROMISE_RESULT_FAIL;
                }
            }
            else
            {
                *result = PROMISE_RESULT_NOOP;
            }
        }
        else
        {
            res = DoCreateUser (puser, u, action, ctx, a, pp);
            if (res)
            {
                *result = PROMISE_RESULT_CHANGE;
            }
            else
            {
                *result = PROMISE_RESULT_FAIL;
            }
        }
    }
    else if (u.policy == USER_STATE_ABSENT)
    {
        if (passwd_info)
        {
            res = DoRemoveUser (puser, action);
            if (res)
            {
                *result = PROMISE_RESULT_CHANGE;
            }
            else
            {
                *result = PROMISE_RESULT_FAIL;
            }
        }
        else
        {
            *result = PROMISE_RESULT_NOOP;
        }
    }
}