attempting to get nt5 wksta to join domain.
authorLuke Leighton <lkcl@samba.org>
Tue, 16 Nov 1999 21:14:53 +0000 (21:14 +0000)
committerLuke Leighton <lkcl@samba.org>
Tue, 16 Nov 1999 21:14:53 +0000 (21:14 +0000)
1) had to fix samr "create user" and "set user info" (level 23).

2) had to fix netlogon enum trust domains

3) registry key needed \\ in it not \.

source/include/proto.h
source/include/rpc_netlogon.h
source/passdb/sampassdb.c
source/rpc_parse/parse_misc.c
source/rpc_parse/parse_net.c
source/rpc_parse/parse_samr.c
source/rpc_server/srv_netlog.c
source/rpc_server/srv_reg.c
source/rpc_server/srv_samr.c

index 1d6f6d269d66e71fe7707ff5afbc11c99438b222..f9a83e4d9484636a981221f6b83f3f782084fba2 100644 (file)
@@ -2283,6 +2283,7 @@ BOOL init_buffer5(BUFFER5 **str);
 BOOL clear_buffer5(BUFFER5 **str);
 BOOL make_buffer5(BUFFER5 *str, char *buf, int len);
 BOOL smb_io_buffer5(char *desc, BUFFER5 *buf5, prs_struct *ps, int depth);
+BOOL make_buffer2_multi(BUFFER2 *str, char *const* const buf, uint32 num);
 BOOL make_buffer2(BUFFER2 *str, const char *buf, int len);
 BOOL smb_io_buffer2(char *desc,  BUFFER2 *buf2, uint32 buffer, prs_struct *ps, int depth);
 BOOL make_buf_unistr2(UNISTR2 *str, uint32 *ptr, const char *buf);
index 08f4699636fa0c57050294dbc9e83e87b5c82dd0..6842fd6e07235facbb4b913ef203903c3bad70f3 100644 (file)
@@ -192,7 +192,7 @@ typedef struct net_q_trust_dom_info
 /* NET_R_TRUST_DOM_LIST - response to LSA Trusted Domains */
 typedef struct net_r_trust_dom_info
 {
-       UNISTR2 uni_trust_dom_name[MAX_TRUST_DOMS];
+       BUFFER2 uni_trust_dom_name;
 
        uint32 status; /* return code */
 
index 14d0677ac9b0419c9bf490738b4845c59e4effa5..bca5bfa45f34dc72609198c7518f8a50d2a92c09 100644 (file)
@@ -349,12 +349,12 @@ 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)
+static void select_name(fstring *string, char **name, const UNISTR2 *from)
 {
        if (from->buffer != 0)
        {
-               unistr2_to_ascii(string, from, sizeof(string));
-               *name = string;
+               unistr2_to_ascii(*string, from, sizeof(*string));
+               *name = *string;
        }
 }
 
@@ -376,18 +376,41 @@ void copy_id23_to_sam_passwd(struct sam_passwd *to, const SAM_USER_INFO_23 *from
 
        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 );
+       to->logon_time = from->logon_time;
+       to->logoff_time = from->logoff_time;
+       to->kickoff_time = from->kickoff_time;
+       to->pass_last_set_time = from->pass_last_set_time;
+       to->pass_can_change_time = from->pass_can_change_time;
+       to->pass_must_change_time = from->pass_must_change_time;
+
+       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 );
+
+       to->unix_uid = (uid_t)-1;
+       to->unix_gid = (gid_t)-1;
+       to->user_rid = from->user_rid;
+       to->group_rid = from->group_rid;
+
+       to->smb_passwd = NULL;
+       to->smb_nt_passwd = NULL;
+
+       to->acct_ctrl = from->acb_info;
+       to->unknown_3 = from->unknown_3;
+
+       to->logon_divs = from->logon_divs;
+       to->hours_len = from->logon_hrs.len;
+       memcpy(to->hours, from->logon_hrs.hours, MAX_HOURS_LEN);
+
+       to->unknown_5 = from->unknown_5;
+       to->unknown_6 = from->unknown_6;
 }
 
 
index 9f224c120bf42e2adeddd3ffd47e274eeadd2721..2f2c68648ab5871f605bfec0e4c97682e3a2c613 100644 (file)
@@ -669,6 +669,36 @@ BOOL smb_io_buffer5(char *desc, BUFFER5 *buf5, prs_struct *ps, int depth)
        return True;
 }
 
+/*******************************************************************
+creates a BUFFER2 structure.
+********************************************************************/
+BOOL make_buffer2_multi(BUFFER2 *str, char *const* const buf, uint32 num)
+{
+       int i;
+       char *dest = (char*)str->buffer;
+       size_t max_len = sizeof(str->buffer)-1;
+
+       ZERO_STRUCTP(str);
+
+       str->buf_max_len = 0;
+       str->undoc       = 0;
+
+       for (i = 0; i < num && max_len > 0; i++)
+       {
+               size_t len = buf[i] != NULL ? strlen(buf[i]) : 0;
+
+               str->buf_max_len += len * 2;
+               str->buf_len     += len * 2;
+
+               ascii_to_unibuf(dest, buf[i], max_len);
+       
+               dest += len * 2 + 2;
+               max_len -= len * 2 + 2;
+       }
+
+       return True;
+}
+
 /*******************************************************************
 creates a BUFFER2 structure.
 ********************************************************************/
index b21f612c8a8735c22220526fea79d3ccdfbd8880..c6e366bbbec6849dec3c1f6990a778edb0541467 100644 (file)
@@ -296,28 +296,18 @@ makes an NET_R_TRUST_DOM_LIST structure.
 BOOL make_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t,
                        uint32 num_doms, char **dom_name)
 {
-       uint32 i = 0;
-
        if (r_t == NULL) return False;
 
        DEBUG(5,("make_r_trust_dom\n"));
 
-       for (i = 0; i < MAX_TRUST_DOMS; i++)
-       {
-               r_t->uni_trust_dom_name[i].uni_str_len = 0;
-               r_t->uni_trust_dom_name[i].uni_max_len = 0;
-       }
-       if (num_doms > MAX_TRUST_DOMS) num_doms = MAX_TRUST_DOMS;
-
-       for (i = 0; i < num_doms; i++)
+       make_buffer2_multi(&r_t->uni_trust_dom_name,
+                       dom_name, num_doms);
+       if (num_doms == 0)
        {
-               fstring domain_name;
-               fstrcpy(domain_name, dom_name[i]);
-               strupper(domain_name);
-               make_unistr2(&(r_t->uni_trust_dom_name[i]), domain_name, strlen(domain_name)+1);
-               /* the use of UNISTR2 here is non-standard. */
-               r_t->uni_trust_dom_name[i].undoc = 0x1;
+               r_t->uni_trust_dom_name.buf_max_len = 0x2;
+               r_t->uni_trust_dom_name.buf_len = 0x2;
        }
+       r_t->uni_trust_dom_name.undoc = 0x1;
        
        r_t->status = 0;
 
@@ -329,17 +319,13 @@ reads or writes an NET_R_TRUST_DOM_LIST structure.
 ********************************************************************/
 BOOL net_io_r_trust_dom(char *desc,  NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth)
 {
-       uint32 i;
        if (r_t == NULL) return False;
 
        prs_debug(ps, depth, desc, "net_io_r_trust_dom");
        depth++;
 
-       for (i = 0; i < MAX_TRUST_DOMS; i++)
-       {
-               if (r_t->uni_trust_dom_name[i].uni_str_len == 0) break;
-               smb_io_unistr2("", &(r_t->uni_trust_dom_name[i]), True, ps, depth);
-       }
+       smb_io_buffer2("", &r_t->uni_trust_dom_name, True, ps, depth);
+       prs_align(ps);
 
        prs_uint32("status", ps, depth, &(r_t->status));
 
index 90ae3e8feefb70d37350373949cd0ebc7eb79002..9ea66bbf4b3bdb649549279c41d76f1879f5576b 100644 (file)
@@ -250,7 +250,7 @@ BOOL make_samr_r_unknown_2c(SAMR_R_UNKNOWN_2C *q_u, uint32 status)
 
        DEBUG(5,("samr_make_r_unknown_2c\n"));
 
-       q_u->unknown_0 = 0x00160000;
+       q_u->unknown_0 = 0x00150000;
        q_u->unknown_1 = 0x00000000;
        q_u->status    = status;
 
@@ -5716,6 +5716,7 @@ BOOL samr_io_q_set_userinfo(char *desc, SAMR_Q_SET_USERINFO *q_u, prs_struct *ps
 
        if (!ps->io)
        {
+               /* writing */
                free_samr_q_set_userinfo(q_u);
        }
 
index 09678e3eaf4a8fd59cb207362dee42bba1d31e35..5e9ae35094272b864d3fc985a4906b43a8225d28 100644 (file)
@@ -102,7 +102,7 @@ static void net_reply_trust_dom_list(NET_Q_TRUST_DOM_LIST *q_t, prs_struct *rdat
        /* store the response in the SMB stream */
        net_io_r_trust_dom("", &r_t, rdata, 0);
 
-       DEBUG(6,("net_reply_trust_dom_listlogon_ctrl2: %d\n", __LINE__));
+       DEBUG(6,("net_reply_trust_dom_list: %d\n", __LINE__));
 
 }
 
index 0ba6774900794f25cb02159d7a4432ed987a5b50..fcc22a792abd5173d2f5665312b432b54cb21d26 100644 (file)
@@ -143,7 +143,7 @@ static void reg_reply_open_entry(REG_Q_OPEN_ENTRY *q_u,
                DEBUG(5,("reg_open_entry: %s\n", name));
                /* lkcl XXXX do a check on the name, here */
                if (!strequal(name, "SYSTEM\\CurrentControlSet\\Control\\ProductOptions") ||
-                   !strequal(name, "SYSTEM\\CurrentControlSet\\Services\\NETLOGON\Parameters"))
+                   !strequal(name, "SYSTEM\\CurrentControlSet\\Services\\NETLOGON\\Parameters"))
                {
                        status = 0xC000000 | NT_STATUS_ACCESS_DENIED;
                }
index c3464380ed95b1a8c807df816e51b41d3459bda5..ff2f1bbb8cc1232107202976286a49ebea545ef5 100644 (file)
@@ -2090,6 +2090,11 @@ static BOOL set_user_info_23(SAM_USER_INFO_23 *id23, uint32 rid)
        static uchar lm_hash[16];
        pstring new_pw;
 
+       if (id23 == NULL)
+       {
+               DEBUG(5, ("set_user_info_23: NULL id23\n"));
+               return False;
+       }
        if (pwd == NULL)
        {
                return False;
@@ -2155,6 +2160,12 @@ static void samr_reply_set_userinfo(SAMR_Q_SET_USERINFO *q_u,
        DEBUG(5,("samr_reply_set_userinfo: rid:0x%x\n", rid));
 
        /* ok!  user info levels (there are lots: see MSDEV help), off we go... */
+       if (status == 0x0 && q_u->info.id == NULL)
+       {
+               DEBUG(5,("samr_reply_set_userinfo: NULL info level\n"));
+               status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS;
+       }
+
        if (status == 0x0)
        {
                switch (q_u->switch_value)
@@ -2170,7 +2181,13 @@ static void samr_reply_set_userinfo(SAMR_Q_SET_USERINFO *q_u,
                        case 23:
                        {
                                SAM_USER_INFO_23 *id23 = q_u->info.id23;
-                               SamOEMhash(id23->pass, user_sess_key, True);
+                               SamOEMhash(id23->pass, user_sess_key, 1);
+#if DEBUG_PASSWORD
+                               DEBUG(100,("pass buff:\n"));
+                               dump_data(100, id23->pass, sizeof(id23->pass));
+#endif
+                               dbgflush();
+
                                status = set_user_info_23(id23, rid) ? 0 : (0xC0000000 | NT_STATUS_ACCESS_DENIED);
                                break;
                        }
@@ -2663,7 +2680,7 @@ static void samr_reply_create_user(SAMR_Q_CREATE_USER *q_u,
                pstring msg_str;
 
                if (!local_password_change(user_name, True,
-                         q_u->acb_info, 0xffff,
+                         q_u->acb_info | ACB_DISABLED, 0xffff,
                          NULL,
                          err_str, sizeof(err_str),
                          msg_str, sizeof(msg_str)))