summaryrefslogtreecommitdiffstats
path: root/src/account/LMI_AccountProvider.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/account/LMI_AccountProvider.c')
-rw-r--r--src/account/LMI_AccountProvider.c99
1 files changed, 36 insertions, 63 deletions
diff --git a/src/account/LMI_AccountProvider.c b/src/account/LMI_AccountProvider.c
index fa2e316..ca9758a 100644
--- a/src/account/LMI_AccountProvider.c
+++ b/src/account/LMI_AccountProvider.c
@@ -285,8 +285,6 @@ static CMPIStatus LMI_AccountModifyInstance(
struct lu_ent *lue = NULL;
struct lu_error *error = NULL;
GValue val;
- GValueArray *groups = NULL;
- guint i = 0;
long last_change;
date_time_prop expiration, warning, inactive_password, inactive_account;
@@ -305,10 +303,8 @@ static CMPIStatus LMI_AccountModifyInstance(
char userlock[USERNAME_LEN_MAX] = {0};
/* -1 for NULL char */
strncpy(userlock, la.Name.chars, sizeof(userlock) - 1);
- lmi_debug("Getting lock for user: %s", userlock);
- if (get_user_lock(userlock) == 0) {
- KReturn2(_cb, ERR_FAILED, "Unable to obtain lock.");
- }
+ lmi_debug("Getting giant lock for user: %s", userlock);
+ get_giant_lock();
pwdlockres = lckpwdf();
if (pwdlockres != 0)
warn("Cannot acquire passwd file lock\n");
@@ -316,10 +312,11 @@ static CMPIStatus LMI_AccountModifyInstance(
luc = lu_start(NULL, lu_user, NULL, NULL, lu_prompt_console_quiet, NULL, &error);
if (!luc)
{
- const int ret = release_user_lock(userlock);
- lmi_debug("Releasing lock for user: %s. Result: %d", userlock, ret);
if (pwdlockres == 0)
ulckpwdf();
+ lmi_debug("Releasing giant lock for user: %s", userlock);
+ release_giant_lock();
+ lmi_debug("Giant lock released for user %s", userlock);
KReturn2(_cb, ERR_FAILED,
"Unable to initialize libuser: %s\n", lu_strerror(error));
}
@@ -333,23 +330,6 @@ static CMPIStatus LMI_AccountModifyInstance(
goto fail;
}
- /* get list of groups and lock them. userlock variable is our stored username */
- groups = lu_groups_enumerate_by_user (luc, userlock, &error);
- if (groups == NULL)
- {
- rc = CMPI_RC_ERR_NOT_FOUND;
- asprintf(&errmsg, "Get groups for user %s failed with: %s",
- userlock, lu_strerror(error));
- goto fail;
- }
-
- for (i = 0; i < groups->n_values; ++i) {
- GValue *group_val = g_value_array_get_nth (groups, i);
- const gchar *const group_str = g_value_get_string(group_val);
- const int ret = get_group_lock((const char *const) group_str);
- lmi_debug("Getting lock for group: %s. Result: %d", group_str, ret);
- }
-
data = ci->ft->getProperty(ci, "UserPassword", NULL);
ar = data.value.array;
if (ar && (arsize = ar->ft->getSize(ar, NULL) > 0))
@@ -427,20 +407,13 @@ static CMPIStatus LMI_AccountModifyInstance(
last_change = aux_lu_get_long(lue, LU_SHADOWLASTCHANGE);
#define FAIL(msg) \
- for (i = 0; (groups != NULL) && (i < groups->n_values); ++i) { \
- GValue *group_val = g_value_array_get_nth (groups, i); \
- const gchar *const group_str = g_value_get_string(group_val); \
- const int ret = release_group_lock((const char *const) group_str); \
- lmi_debug("Releasing lock for group: %s. Result: %d", group_str, ret); \
- } \
- g_value_array_free (groups); \
- groups = NULL; \
- const int ret = release_user_lock(userlock); \
- lmi_debug("Releasing lock for user: %s. Result: %d", userlock, ret); \
lu_end(luc); \
lu_ent_free(lue); \
if (pwdlockres == 0) \
ulckpwdf(); \
+ lmi_debug("Releasing lock for user: %s", userlock); \
+ release_giant_lock(); \
+ lmi_debug("Giant lock released for user %s", userlock); \
KReturn2(_cb, ERR_FAILED, msg);
GETDATEVALUE("PasswordExpiration", expiration);
if (!expiration.null && !expiration.interval)
@@ -529,20 +502,14 @@ static CMPIStatus LMI_AccountModifyInstance(
}
fail:
- for (i = 0; (groups != NULL) && (i < groups->n_values); ++i) {
- GValue *group_val = g_value_array_get_nth (groups, i);
- const gchar *const group_str = g_value_get_string(group_val);
- const int ret = release_group_lock((const char *const) group_str);
- lmi_debug("Releasing lock for group: %s. Result: %d", group_str, ret);
- }
- g_value_array_free (groups);
- groups = NULL;
- const int ret = release_user_lock(userlock);
- lmi_debug("Releasing lock for user: %s. Result: %d", userlock, ret);
- lu_ent_free(lue);
- lu_end(luc);
if (pwdlockres == 0)
ulckpwdf();
+ lmi_debug("Releasing giant lock for user: %s", userlock);
+ release_giant_lock ();
+ lmi_debug("Giant lock released for user %s", userlock);
+
+ lu_ent_free(lue);
+ lu_end(luc);
if (errmsg) {
CMPIString *errstr = CMNewString(_cb, errmsg, NULL);
@@ -581,22 +548,20 @@ static CMPIrc delete_user(
char userlock[USERNAME_LEN_MAX] = {0};
/* -1 for NULL char */
strncpy(userlock, username, sizeof(userlock) - 1);
- lmi_debug("Getting lock for user: %s. Result: %d", userlock);
- if (get_user_lock(userlock) == 0) {
- asprintf(&errormsg, "Unable to obtain lock.");
- return CMPI_RC_ERR_FAILED;
- }
+ lmi_debug("Getting giant lock for user: %s", userlock);
+ get_giant_lock();
pwdlockres = lckpwdf();
if (pwdlockres != 0)
warn("Cannot acquire passwd file lock\n");
luc = lu_start(NULL, 0, NULL, NULL, lu_prompt_console_quiet, NULL, &error);
if (!luc) {
- const int ret = release_user_lock(userlock);
- lmi_debug("Releasing lock for user: %s. Result: %d", userlock, ret);
if (pwdlockres == 0)
ulckpwdf();
asprintf(&errormsg, "Unable to initialize libuser: %s\n", lu_strerror(error));
+ lmi_debug("Releasing giant lock for user: %s", userlock);
+ release_giant_lock();
+ lmi_debug("Giant lock released for user %s", userlock);
return CMPI_RC_ERR_FAILED;
}
@@ -673,16 +638,14 @@ static CMPIrc delete_user(
}
clean:
- /* Because C specification... */
- {
- const int ret = release_user_lock(userlock);
- lmi_debug("Releasing lock for user: %s. Result: %d", userlock, ret);
- }
+ if (pwdlockres == 0)
+ ulckpwdf();
+ lmi_debug("Releasing giant lock for user: %s", userlock);
+ release_giant_lock();
+ lmi_debug("Giant lock released for user %s", userlock);
lu_ent_free(lue);
lu_ent_free(lueg);
lu_end(luc);
- if (pwdlockres == 0)
- ulckpwdf();
return rc;
}
@@ -795,6 +758,12 @@ KUint32 LMI_Account_ChangePassword(
goto clean;
}
+ char userlock[USERNAME_LEN_MAX] = {0};
+ /* -1 for NULL char */
+ strncpy(userlock, self->Name.chars, sizeof(userlock) - 1);
+ lmi_debug("Getting giant lock for user: %s", userlock);
+ get_giant_lock();
+
pwdlockres = lckpwdf();
if (pwdlockres != 0)
warn("Cannot acquire passwd file lock\n");
@@ -825,11 +794,15 @@ KUint32 LMI_Account_ChangePassword(
}
clean:
+ if (pwdlockres == 0)
+ ulckpwdf();
+ lmi_debug("Releasing giant lock for user: %s", userlock);
+ release_giant_lock();
+ lmi_debug("Giant lock released for user %s", userlock);
+
free(errmsg);
if(luc) lu_end(luc);
if(lue) lu_ent_free(lue);
- if (pwdlockres == 0)
- ulckpwdf();
return result;
}