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; } } }
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; } } }