r17448: Define macros to set fields in api function modifying user account.
authorRafal Szczesniak <mimir@samba.org>
Mon, 7 Aug 2006 20:29:18 +0000 (20:29 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:15:26 +0000 (14:15 -0500)
rafal
(This used to be commit 8d9330c490470127f192949efa9201225136edb1)

source4/libnet/libnet_user.c
source4/libnet/libnet_user.h

index d30dc48dd508ab8d8fa48f7dba60863a92020224..947fc3dcb3e1f8e74cd00e485f7fc852a82ac7b4 100644 (file)
@@ -543,41 +543,38 @@ static NTSTATUS set_user_changes(TALLOC_CTX *mem_ctx, struct usermod_change *mod
        user = &info->out.info.info21;
        mod->fields = 0;        /* reset flag field before setting individual flags */
 
-       /*
-        * account name change
-        */
-       if (r->in.account_name != NULL &&
-           !strequal_w(user->account_name.string, r->in.account_name)) {
+       /* account name change */
+       SET_FIELD_LSA_STRING(r->in, user, mod, account_name, USERMOD_FIELD_ACCOUNT_NAME);
 
-               mod->account_name = talloc_strdup(mem_ctx, r->in.account_name);
-               if (mod->account_name == NULL) return NT_STATUS_NO_MEMORY;
+       /* full name change */
+       SET_FIELD_LSA_STRING(r->in, user, mod, full_name, USERMOD_FIELD_FULL_NAME);
 
-               mod->fields |= USERMOD_FIELD_ACCOUNT_NAME;
-       }
+       /* description change */
+       SET_FIELD_LSA_STRING(r->in, user, mod, comment, USERMOD_FIELD_DESCRIPTION);
 
-       /*
-        * full name change
-        */
-       if (r->in.full_name != NULL &&
-           !strequal_w(user->full_name.string, r->in.full_name)) {
-               
-               mod->full_name = talloc_strdup(mem_ctx, r->in.full_name);
-               if (mod->full_name == NULL) return NT_STATUS_NO_MEMORY;
+       /* comment change */
+       SET_FIELD_LSA_STRING(r->in, user, mod, comment, USERMOD_FIELD_COMMENT);
 
-               mod->fields |= USERMOD_FIELD_FULL_NAME;
-       }
+       /* home directory change */
+       SET_FIELD_LSA_STRING(r->in, user, mod, home_directory, USERMOD_FIELD_HOME_DIRECTORY);
 
-       /*
-        * description change
-        */
-       if (r->in.description != NULL &&
-           !strequal_w(user->description.string, r->in.description)) {
+       /* home drive change */
+       SET_FIELD_LSA_STRING(r->in, user, mod, home_drive, USERMOD_FIELD_HOME_DRIVE);
 
-               mod->description = talloc_strdup(mem_ctx, r->in.description);
-               if (mod->description == NULL) return NT_STATUS_NO_MEMORY;
+       /* logon script change */
+       SET_FIELD_LSA_STRING(r->in, user, mod, logon_script, USERMOD_FIELD_LOGON_SCRIPT);
 
-               mod->fields |= USERMOD_FIELD_DESCRIPTION;
-       }
+       /* profile path change */
+       SET_FIELD_LSA_STRING(r->in, user, mod, profile_path, USERMOD_FIELD_PROFILE_PATH);
+
+       /* allow password change time */
+       SET_FIELD_NTTIME(r->in, user, mod, allow_password_change, USERMOD_FIELD_ALLOW_PASS_CHG);
+
+       /* force password change time */
+       SET_FIELD_NTTIME(r->in, user, mod, force_password_change, USERMOD_FIELD_FORCE_PASS_CHG);
+
+       /* account expiry change */
+       SET_FIELD_NTTIME(r->in, user, mod, acct_expiry, USERMOD_FIELD_ACCT_EXPIRY);
 
        return NT_STATUS_OK;
 }
index d2f1c438c77c935e6cc4bc77bd64a5c98089ff40..cd5325b58efbcaa34b5f1e79d0c09de73895475a 100644 (file)
@@ -49,15 +49,40 @@ struct libnet_ModifyUser {
                const char *account_name;
                const char *full_name;
                const char *description;
+               const char *home_directory;
+               const char *home_drive;
                const char *comment;
                const char *logon_script;
                const char *profile_path;
                struct timeval *acct_expiry;
                struct timeval *allow_password_change;
                struct timeval *force_password_change;
+               struct timeval *last_logon;
+               struct timeval *last_logoff;
+               struct timeval *last_password_change;
                uint32_t acct_flags;
        } in;
        struct {
                const char *error_string;
        } out;
 };
+
+
+#define SET_FIELD_LSA_STRING(new, current, mod, field, flag) \
+       if (new.field != NULL && \
+           !strequal_w(current->field.string, new.field)) { \
+               \
+               mod->field = talloc_strdup(mem_ctx, new.field); \
+               if (mod->field == NULL) return NT_STATUS_NO_MEMORY; \
+               \
+               mod->fields |= flag; \
+       }
+
+#define SET_FIELD_NTTIME(new, current, mod, field, flag) \
+       if (new.field != 0) { \
+               NTTIME newval = timeval_to_nttime(new.field); \
+               if (newval != current->field) { \
+                       mod->field   = talloc_memdup(mem_ctx, new.field, sizeof(*new.field)); \
+                       mod->fields |= flag; \
+               } \
+       }