summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/passdb/sampassdb.c42
-rw-r--r--source3/rpc_server/srv_samr.c32
3 files changed, 68 insertions, 7 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index caf53667c8..94d76b9e9f 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -1516,6 +1516,7 @@ struct sam_passwd *getsam21pwntnam(const char *name);
struct sam_passwd *getsam21pwrid(uint32 rid);
void pwdb_init_sam(struct sam_passwd *user);
struct sam_disp_info *pwdb_sam_to_dispinfo(struct sam_passwd *user);
+void copy_id23_to_sam_passwd(struct sam_passwd *to, const SAM_USER_INFO_23 *from);
void copy_sam_passwd(struct sam_passwd *to, const struct sam_passwd *from);
struct smb_passwd *pwdb_sam_to_smb(struct sam_passwd *user);
struct sam_passwd *pwdb_smb_to_sam(struct smb_passwd *user);
diff --git a/source3/passdb/sampassdb.c b/source3/passdb/sampassdb.c
index 13474eda78..e8a92d778d 100644
--- a/source3/passdb/sampassdb.c
+++ b/source3/passdb/sampassdb.c
@@ -342,6 +342,48 @@ struct sam_disp_info *pwdb_sam_to_dispinfo(struct sam_passwd *user)
return &disp_info;
}
+static void select_name(fstring string, char **name, const UNISTR2 *from)
+{
+ if (from->buffer != 0)
+ {
+ unistr2_to_ascii(string, from, sizeof(string));
+ *name = string;
+ }
+}
+
+/*************************************************************
+ copies a sam passwd.
+ **************************************************************/
+void copy_id23_to_sam_passwd(struct sam_passwd *to, const SAM_USER_INFO_23 *from)
+{
+ static fstring nt_name;
+ static fstring full_name;
+ static fstring home_dir;
+ static fstring dir_drive;
+ static fstring logon_script;
+ static fstring profile_path;
+ static fstring acct_desc;
+ static fstring workstations;
+ static fstring unknown_str;
+ static fstring munged_dial;
+
+ if (from == NULL || to == NULL) return;
+
+ memcpy(to, from, sizeof(*from));
+
+ select_name(nt_name , &to->nt_name , &from->uni_user_name );
+ select_name(full_name , &to->full_name , &from->uni_full_name );
+ select_name(home_dir , &to->home_dir , &from->uni_home_dir );
+ select_name(dir_drive , &to->dir_drive , &from->uni_dir_drive );
+ select_name(logon_script, &to->logon_script, &from->uni_logon_script);
+ select_name(profile_path, &to->profile_path, &from->uni_profile_path);
+ select_name(acct_desc , &to->acct_desc , &from->uni_acct_desc );
+ select_name(workstations, &to->workstations, &from->uni_workstations);
+ select_name(unknown_str , &to->unknown_str , &from->uni_unknown_str );
+ select_name(munged_dial , &to->munged_dial , &from->uni_munged_dial );
+}
+
+
/*************************************************************
copies a sam passwd.
**************************************************************/
diff --git a/source3/rpc_server/srv_samr.c b/source3/rpc_server/srv_samr.c
index 15b2159383..63aa0dc914 100644
--- a/source3/rpc_server/srv_samr.c
+++ b/source3/rpc_server/srv_samr.c
@@ -1984,20 +1984,38 @@ static BOOL set_user_info_24(SAM_USER_INFO_24 *id24, uint32 rid)
********************************************************************/
static BOOL set_user_info_23(SAM_USER_INFO_23 *id23, uint32 rid)
{
- static struct sam_passwd *pwd;
- fstring new_pw;
+ struct sam_passwd *pwd = getsam21pwrid(rid);
+ struct sam_passwd new_pwd;
+ static uchar nt_hash[16];
+ static uchar lm_hash[16];
+ pstring new_pw;
+
+ if (pwd == NULL)
+ {
+ return False;
+ }
+
+ pwdb_init_sam(&new_pwd);
+ copy_sam_passwd(&new_pwd, pwd);
+#if 0
+ copy_id23_to_sam_passwd(&new_pwd, id23);
+#endif
+
if (!decode_pw_buffer(id23->pass, new_pw, sizeof(new_pw), True))
{
return False;
}
+
#ifdef DEBUG_PASSWORD
DEBUG(0,("New Password: %s\n", new_pw));
#endif
-#if 0
- return mod_sam21pwd_entry(&pwd, True);
-#else
- return True;
-#endif
+
+ nt_lm_owf_gen(new_pw, nt_hash, lm_hash);
+
+ new_pwd.smb_passwd = lm_hash;
+ new_pwd.smb_nt_passwd = nt_hash;
+
+ return mod_sam21pwd_entry(&new_pwd, True);
}
/*******************************************************************