summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/include/proto.h2
-rw-r--r--source3/include/rpc_samr.h8
-rw-r--r--source3/rpc_parse/parse_samr.c49
-rw-r--r--source3/rpc_server/srv_samr.c30
4 files changed, 89 insertions, 0 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 8e8e7e292a..96385144a6 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -2476,6 +2476,8 @@ void make_sam_user_info11(SAM_USER_INFO_11 *usr,
uint32 rid_group,
uint16 acct_ctrl);
void sam_io_user_info11(char *desc, SAM_USER_INFO_11 *usr, prs_struct *ps, int depth);
+void make_sam_user_info_24(SAM_USER_INFO_24 *usr,
+ char newpass[516]);
void make_sam_user_info23(SAM_USER_INFO_23 *usr,
NTTIME *logon_time, /* all zeros */
diff --git a/source3/include/rpc_samr.h b/source3/include/rpc_samr.h
index 92125f9f2c..9a62bd4b97 100644
--- a/source3/include/rpc_samr.h
+++ b/source3/include/rpc_samr.h
@@ -200,6 +200,13 @@ typedef struct sam_user_info_23
} SAM_USER_INFO_23;
+/* SAM_USER_INFO_24 */
+typedef struct sam_user_info_24
+{
+ uint8 pass[516];
+
+} SAM_USER_INFO_24;
+
/* SAM_USER_INFO_21 */
typedef struct sam_user_info_21
@@ -1116,6 +1123,7 @@ typedef struct q_samr_set_user_info
union
{
SAM_USER_INFO_23 *id23; /* auth-level 0x17 */
+ SAM_USER_INFO_24 *id24; /* auth-level 0x18 */
void* id; /* to make typecasting easy */
} info;
diff --git a/source3/rpc_parse/parse_samr.c b/source3/rpc_parse/parse_samr.c
index f724535a8c..09c881a812 100644
--- a/source3/rpc_parse/parse_samr.c
+++ b/source3/rpc_parse/parse_samr.c
@@ -4106,6 +4106,37 @@ void sam_io_user_info11(char *desc, SAM_USER_INFO_11 *usr, prs_struct *ps, int
}
/*************************************************************************
+ make_sam_user_infoa
+
+ unknown_3 = 0x09f8 27fa
+ unknown_5 = 0x0001 0000
+ unknown_6 = 0x0000 04ec
+
+ *************************************************************************/
+void make_sam_user_info_24(SAM_USER_INFO_24 *usr,
+ char newpass[516])
+{
+ memcpy(usr->pass, newpass, sizeof(usr->pass));
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+static void sam_io_user_info_24(char *desc, SAM_USER_INFO_24 *usr, prs_struct *ps, int depth)
+{
+ if (usr == NULL) return;
+
+ prs_debug(ps, depth, desc, "lsa_io_user_info");
+ depth++;
+
+ prs_align(ps);
+
+ prs_uint8s (False, "password", ps, depth, usr->pass, sizeof(usr->pass));
+ prs_align(ps);
+}
+
+
+/*************************************************************************
make_sam_user_info23
unknown_3 = 0x09f8 27fa
@@ -4606,6 +4637,13 @@ void make_samr_q_set_userinfo(SAMR_Q_SET_USERINFO *q_u,
switch (switch_value)
{
+ case 0x18:
+ {
+ q_u->info.id24 = (SAM_USER_INFO_24*)info;
+
+ break;
+ }
+
case 0x17:
{
q_u->info.id23 = (SAM_USER_INFO_23*)info;
@@ -4648,6 +4686,17 @@ void samr_io_q_set_userinfo(char *desc, SAMR_Q_SET_USERINFO *q_u, prs_struct *ps
{
break;
}
+ case 24:
+ {
+ q_u->info.id = Realloc(NULL, sizeof(*q_u->info.id24));
+ if (q_u->info.id == NULL)
+ {
+ DEBUG(2,("samr_io_q_query_userinfo: info pointer not initialised\n"));
+ return;
+ }
+ sam_io_user_info_24("", q_u->info.id24, ps, depth);
+ break;
+ }
case 23:
{
q_u->info.id = Realloc(NULL, sizeof(*q_u->info.id23));
diff --git a/source3/rpc_server/srv_samr.c b/source3/rpc_server/srv_samr.c
index 2437163f2b..b0fc64a2e7 100644
--- a/source3/rpc_server/srv_samr.c
+++ b/source3/rpc_server/srv_samr.c
@@ -1944,6 +1944,27 @@ static void samr_reply_query_userinfo(SAMR_Q_QUERY_USERINFO *q_u,
}
/*******************************************************************
+ set_user_info_24
+ ********************************************************************/
+static BOOL set_user_info_24(SAM_USER_INFO_24 *id24, uint32 rid)
+{
+ static struct sam_passwd *pwd;
+ fstring new_pw;
+ if (!decode_pw_buffer(id24->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
+}
+
+/*******************************************************************
set_user_info_23
********************************************************************/
static BOOL set_user_info_23(SAM_USER_INFO_23 *id23, uint32 rid)
@@ -2007,6 +2028,15 @@ static void samr_reply_set_userinfo(SAMR_Q_SET_USERINFO *q_u,
{
switch (q_u->switch_value)
{
+ case 24:
+ {
+ SAM_USER_INFO_24 *id24 = q_u->info.id24;
+ nt_lm_owf_gen("test", nt_pwd, lm_pwd);
+ SamOEMhash(id24->pass, user_sess_key, True);
+ status = set_user_info_24(id24, rid) ? 0 : (0xC0000000 | NT_STATUS_ACCESS_DENIED);
+ break;
+ }
+
case 23:
{
SAM_USER_INFO_23 *id23 = q_u->info.id23;