1
0
mirror of https://github.com/samba-team/samba.git synced 2025-07-30 19:42:05 +03:00

r18655: add more fields and better handle the error case where fields

setting routine don't know how to do that (and user info level
is invalid).

rafal
(This used to be commit a7564931a7)
This commit is contained in:
Rafal Szczesniak
2006-09-19 00:23:55 +00:00
committed by Gerald (Jerry) Carter
parent cd9057a0bb
commit 602b604599

View File

@ -612,6 +612,39 @@ static uint32_t usermod_setfields(struct usermod_state *s, uint16_t *level,
return s->change.fields;
}
} else if (s->change.fields & USERMOD_FIELD_LAST_LOGON) {
*level = 3;
if (s->stage == USERMOD_QUERY) {
i->info3.last_logon = timeval_to_nttime(s->change.last_logon);
s->change.fields ^= USERMOD_FIELD_LAST_LOGON;
} else {
s->stage = USERMOD_QUERY;
return s->change.fields;
}
} else if (s->change.fields & USERMOD_FIELD_LAST_LOGOFF) {
*level = 3;
if (s->stage == USERMOD_QUERY) {
i->info3.last_logoff = timeval_to_nttime(s->change.last_logoff);
s->change.fields ^= USERMOD_FIELD_LAST_LOGOFF;
} else {
s->stage = USERMOD_QUERY;
return s->change.fields;
}
} else if (s->change.fields & USERMOD_FIELD_LAST_PASS_CHG) {
*level = 3;
if (s->stage == USERMOD_QUERY) {
i->info3.last_password_change = timeval_to_nttime(s->change.last_password_change);
s->change.fields ^= USERMOD_FIELD_LAST_PASS_CHG;
} else {
s->stage = USERMOD_QUERY;
return s->change.fields;
}
} else if (s->change.fields & USERMOD_FIELD_LOGON_SCRIPT) {
*level = 11;
i->info11.logon_script.string = s->change.logon_script;
@ -624,6 +657,28 @@ static uint32_t usermod_setfields(struct usermod_state *s, uint16_t *level,
s->change.fields ^= USERMOD_FIELD_PROFILE_PATH;
} else if (s->change.fields & USERMOD_FIELD_HOME_DIRECTORY) {
*level = 3;
if (s->stage == USERMOD_QUERY) {
i->info3.home_directory.string = s->change.home_directory;
s->change.fields ^= USERMOD_FIELD_HOME_DIRECTORY;
} else {
s->stage = USERMOD_QUERY;
return s->change.fields;
}
} else if (s->change.fields & USERMOD_FIELD_HOME_DRIVE) {
*level = 3;
if (s->stage == USERMOD_QUERY) {
i->info3.home_drive.string = s->change.home_drive;
s->change.fields ^= USERMOD_FIELD_HOME_DRIVE;
} else {
s->stage = USERMOD_QUERY;
return s->change.fields;
}
} else if (s->change.fields & USERMOD_FIELD_ACCT_EXPIRY) {
*level = 17;
i->info17.acct_expiry = timeval_to_nttime(s->change.acct_expiry);
@ -638,7 +693,7 @@ static uint32_t usermod_setfields(struct usermod_state *s, uint16_t *level,
}
}
/* We're going to be back here again soon unless all fields have been set */
/* We're going to be here back again soon unless all fields have been set */
if (s->change.fields) {
s->stage = USERMOD_OPEN;
} else {
@ -656,7 +711,9 @@ static NTSTATUS usermod_open(struct composite_context *c,
struct usermod_state *s)
{
union samr_UserInfo *i = &s->info;
uint16_t level;
/* set the level to invalid value, so that unless setfields routine
gives it a valid value we report the error correctly */
uint16_t level = 27;
c->status = dcerpc_ndr_request_recv(s->req);
NT_STATUS_NOT_OK_RETURN(c->status);
@ -664,6 +721,13 @@ static NTSTATUS usermod_open(struct composite_context *c,
/* prepare UserInfo level and data based on bitmask field */
s->change.fields = usermod_setfields(s, &level, i);
if (level > 26) {
/* apparently there's a field that the setfields routine
does not know how to set */
c->state = COMPOSITE_STATE_ERROR;
return NT_STATUS_INVALID_PARAMETER;
}
/* If some specific level is used to set user account data and the change
itself does not cover all fields then we need to query the user info
first, right before changing the data. Otherwise we could set required